客户端、声音、粒子
与游戏客户端交互:线程调度、相机、天气、声音、粒子。
线程调度
脚本跑在独立线程,需要主线程的操作必须转交:
| 方法 | 说明 |
|---|
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 |
其他全局对象
| 全局名 | 说明 |
|---|
ClientConfig | RTE 客户端配置,可读取当前开关状态 |
ConfigResponder | 构造可交互的车辆配置项 |
MTRClientData | MTR 客户端数据的兼容封装 |
MTRClientData4 | MTR 4 原生客户端数据 |
IBlock | 方块工具 |
IDrawing | MTR 绘制工具 |
UtilitiesClient | MTR 客户端辅助工具 |