本篇教程由作者设定未经允许禁止转载。
示例版本为forge1.19.2;
包含很多基础常用的格式方法,并简单展示了如何将这些方法复合运用。
代码环境默认使用VSC及ProbeJS。
完整实例
*仅供参考学习,代码逻辑性是次要的,有些时候会省去繁杂的漏洞处理环节。
部分简述
Internal.Entity.persistentData: Internal.CompoundTag
在nbt以 KubeJSPersistentData:{...} 的形式存在,属于nbt的一部分,但nbt不能自由添加新的键值,当有数据储存需求时可在persistentData中操作;persistentData平常可以当做Object快速处理,比如 entity.persistentData['Abc']=123 ,当然更推荐用自带的标准方法(见下图,展示部分),方便处理不同类型的值。
Internal.ItemStack.getOrCreateTag(): Internal.CompoundTag
与 Internal.ItemStack.nbt: Internal.CompoundTag 不同,Internal.ItemStack.nbt在物品nbt不存在时会得到null值,而getOrCreateTag会尝试给nbt为null的物品添加默认的值{},此时甚至连'/kjs hand'指令都察觉不到nbt的变化,但是日志(见下图)很明显能看到nbt从null变为了{},且游戏中的火把虽然看起来没区别,但已经不能跟正常的火把进行堆叠(某些模组常见bug),因此getOrCreateTag需要慎用。
*即使是client_scripts也会产生实际影响,测试于单人游戏
schedule延时相关
20tick相当于1秒;
Internal.ScheduledEvent.reschedule() 能够重新执行整段延时代码,可加入条件限制:1秒后玩家未处于落地状态则执行新的相同延时;
*延时代码会在关闭存档后丢失,比如代码执行了移除玩家手中物品,延时5秒后返还,此时退出再重新进入存档,延时并不会继续执行。需要谨慎使用此功能。
文本相关
文本字符串string可以用+号连接,有些时候可以写成String[]形式,比如server.tell('1'+'2')和server.tell(['1','2'])输出的内容都是'12';
Text比纯文本字符串有更自由的操作空间,比如server.tell(Text.green('aaa').hover('sss').clickCopy('ddd'))是下图的效果,聊天栏里会显示绿色的aaa消息,鼠标悬浮显示sss,点击会复制ddd
数字相关
num++并不会在当前位置立即更新值,++num会立即自增,在很多情况下能以此简化代码
client_scripts相关
ItemEvents.tooltip事件对tooptip的处理并不彻底,比较明显的是有些tooltip无法remove,推荐使用forge事件的"net.minecraftforge.event.entity.player.ItemTooltipEvent"进行更全面的操作。
同样是移除'药水'和'Minecraft',只有ForgeEvents的能完全符合预期: