JavaScript 装饰物件相关
NTE 支持通过 JavaScript 控制装饰物件的渲染。但只能选择完全用 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。 |
接下来列出您可以进行的所有渲染控制操作,和可以获取到的所有关于方块的信息。
EyeCandyScriptContext
调用以下函数可以控制渲染。每次 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
类型的会被显示出来,其他的会被转为字符串显示)。
BlockEyeCandy
属性 说明 block.getWorldPos(): BlockPos
获取方块坐标,返回的是原版的 BlockPos 类型。 block.getWorldPosVector3f(): Vector3f
获取方块坐标,返回的是 Vector3f。