mtr-nte:js-eyecandy

JavaScript 装饰物件相关

NTE 支持通过 JavaScript 控制装饰物件的渲染。但只能选择完全用 JavaScript 控制所有部件的渲染,或不使用 JavaScript 控制渲染。(至少现在是这样的)

您可以通过在 assets/mtrsteamloco/eyecandies 文件夹内添加 JSON 文件来添加用JavaScript控制渲染的装饰物件。其写法大致如下:

{
    "key1": {
    "name": "name1",
    "scriptFiles": ["mtrsteamloco:eyecandies/script1.js"]
    },
    "key2": {
    "name": "name2",
    "scriptFiles": ["mtrsteamloco:eyecandies/script2.js", "mtrsteamloco:eyecandies/script3.js", "mtrsteamloco:eyecandies/script4.js"]
    }
}

其中,key 是装饰物件的唯一标识符,name 是装饰物件的名称,scriptFiles 是装饰物件的 JavaScript 文件列表。注意key只能由小写字母或下划线组成,scriptFiles需要有[]包裹,不含有能有“model”项否则会使用model文件不加载scriptFiles。

同一个key的装饰物件共享同一个运行环境(即全局变量等)。

写在函数以外的顶层空间内的代码会在资源包加载时运行,可用于加载模型、贴图等资源。推荐将不需要每次都重新加载的的资源(如模型等)存储在全局变量,避免相同内容每放置新放块都加载一份带来过多内存占用。

您的脚本中应包含以下函数,NTE 会按需调用它们:

function create(ctx, state, block) { ... }
function render(ctx, state, block) { ... }
function dispose(ctx, state, block) { ... }
函数 说明
create 在列车最开始被加载时调用,可用于进行一些初始化的操作,例如创建动态贴图。
render 大致每帧调用一次。用于主要的显示逻辑。代码在单独线程上运行以便不拖低 FPS。如果代码耗时太长,就可能实际上好几帧才运行一次。
dispose 在列车驶出可视范围时调用。可用于释放动态贴图之类的操作。

NTE 调用这几个函数时会使用三个参数,稍后介绍其各自的内容。

参数 (本文中称呼) 说明
第一个 (ctx) 用于向 NTE 输出要如何渲染列车的相关操作。类型是 TrainScriptContext。
第二个 (state) 一个和某一个装饰物件方块关联的 JavaScript 对象。初始值是 {},可随意设置其上的成员,用来存储一些需要每列车都不同的内容。
第三个 (block) 用于获取列车的状态。类型是 BlockEyeCandy.BlockEntityEyeCandy。

接下来列出您可以进行的所有渲染控制操作,和可以获取到的所有关于方块的信息。

调用以下函数可以控制渲染。每次 render 时都需要为想绘制的模型调用相应的函数,

  • EyeCandyScriptContext.drawModel(model: ModelCluster, poseStack: Matrices): void
  • EyeCandyScriptContext.drawModel(model: DynamicModelHolder, poseStack: Matrices): void 要求 NTE 绘制模型。 poseStack:模型放置位置的变换,传入 null 表示就放在中心不变换。
    调用以下函数可以播放声音。只在需要开始播放时调用,重复调用会使多个声音叠加。
  • EyeCandyScriptContext.playSound(sound: ResourceLocation, volume: float, pitch: float): void 播放声音。
    此外,还有一组函数以 辅助开发调试
  • EyeCandyScriptContext.setDebugInfo(key: String, value: Object) 在屏幕左上角输出调试信息。需在设置中开启 “显示JS调试信息” 才会显示。key 为值的名称,value 为内容(GraphicsTexture 类型的会被显示出来,其他的会被转为字符串显示)。
    属性 说明
    block.getWorldPos(): BlockPos 获取方块坐标,返回的是原版的 BlockPos 类型。
    block.getWorldPosVector3f(): Vector3f 获取方块坐标,返回的是 Vector3f。
  • mtr-nte/js-eyecandy.txt
  • 最后更改: 2025/04/20 21:39
  • 127.0.0.1