首页 / JS 脚本手册 / 客户端、声音、粒子

客户端、声音、粒子

与游戏客户端交互:线程调度、相机、天气、声音、粒子。

线程调度

脚本跑在独立线程,需要主线程的操作必须转交:

方法说明
MinecraftClient.execute(fn)在主线程执行
MinecraftClient.recordRenderCall(fn)在渲染阶段执行
MinecraftClient.isOnRenderThreadOrInit()当前是否已在渲染线程

世界与相机

方法返回说明
getCameraPos()Vector3f相机位置
getCameraDistance(from)float到相机的距离
getCameraEntity()WrappedEntity相机所在实体
getPlayer()WrappedEntity本地玩家
getLevel()ClientLevel客户端世界
worldIsRaining()boolean是否下雨
worldIsRainingAt(pos)boolean指定位置是否下雨
worldDayTime()long世界时间
getStationAt(pos)Station取该位置所属车站
getLightColor(pos)int该位置的光照
packLightTexture(block, sky)int打包光照值

用相机距离做分级渲染:

var d = MinecraftClient.getCameraDistance(train.getCarWorldPosition(0));
if (d > 64) return;             // 太远,不画
var detail = d < 16;             // 近了才画细节

提示与界面

方法说明
displayMessage(text, actionBar)显示消息,actionBar 为 true 时显示在快捷栏上方
narrate(text)朗读文本,辅助功能
setScreen(screen)打开界面
getPresentScreen()取当前界面
reloadResourcePacks()重载资源包
markRendererAllChanged()标记渲染器全部需要更新

声音

方法说明
SoundHelper.play(sound, pos, source, volume, pitch)在指定位置播放
SoundHelper.play(sound, pos, volume, pitch)同上,省略音源分类
SoundHelper.play(soundInstance)播放已构造的实例
SoundHelper.play(soundInstance, delay)延迟播放
SoundHelper.stop()停止全部
SoundHelper.stop(sound)停止指定
SoundHelper.getSoundSource(name)按名取音源分类

需要循环或跟随的声音用 TickableSound 构造实例后交给 play()

报站这类「一次性」声音,触发条件用 train.justOpening() 而不是 isDoorOpen() —— 后者在整个开门期间都为真,会每帧重播。

粒子

方法说明
ParticleHelper.addParticle(particle, pos, speed)发射粒子
ParticleHelper.addParticle(particle, overrideLimiter, pos, speed)可绕过数量限制
ParticleHelper.getParticleType(name)按名取粒子类型
Resources.getParticleTypeId(id)取粒子类型 ID

其他全局对象

全局名说明
ClientConfigRTE 客户端配置,可读取当前开关状态
ConfigResponder构造可交互的车辆配置项
MTRClientDataMTR 客户端数据的兼容封装
MTRClientData4MTR 4 原生客户端数据
IBlock方块工具
IDrawingMTR 绘制工具
UtilitiesClientMTR 客户端辅助工具