本篇教程由作者设定未经允许禁止转载。

示例版本为forge1.19.2;

包含很多基础常用的格式方法,并简单展示了如何将这些方法复合运用。

代码环境默认使用VSC及ProbeJS。

完整实例

KJS6#基础进阶实例-第1张图片

*仅供参考学习,代码逻辑性是次要的,有些时候会省去繁杂的漏洞处理环节。

部分简述

Internal.Entity.persistentData: Internal.CompoundTag

在nbt以 KubeJSPersistentData:{...} 的形式存在,属于nbt的一部分,但nbt不能自由添加新的键值,当有数据储存需求时可在persistentData中操作;persistentData平常可以当做Object快速处理,比如 entity.persistentData['Abc']=123 ,当然更推荐用自带的标准方法(见下图,展示部分),方便处理不同类型的值。

KJS6#基础进阶实例-第2张图片KJS6#基础进阶实例-第3张图片

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也会产生实际影响,测试于单人游戏

KJS6#基础进阶实例-第4张图片KJS6#基础进阶实例-第5张图片

schedule延时相关

20tick相当于1秒;

Internal.ScheduledEvent.reschedule() 能够重新执行整段延时代码,可加入条件限制:1秒后玩家未处于落地状态则执行新的相同延时;

*延时代码会在关闭存档后丢失,比如代码执行了移除玩家手中物品,延时5秒后返还,此时退出再重新进入存档,延时并不会继续执行。需要谨慎使用此功能。

KJS6#基础进阶实例-第6张图片

文本相关

文本字符串string可以用+号连接,有些时候可以写成String[]形式,比如server.tell('1'+'2')和server.tell(['1','2'])输出的内容都是'12';

Text比纯文本字符串有更自由的操作空间,比如server.tell(Text.green('aaa').hover('sss').clickCopy('ddd'))是下图的效果,聊天栏里会显示绿色的aaa消息,鼠标悬浮显示sss,点击会复制ddd

KJS6#基础进阶实例-第7张图片数字相关

num++并不会在当前位置立即更新值,++num会立即自增,在很多情况下能以此简化代码
KJS6#基础进阶实例-第8张图片

client_scripts相关

ItemEvents.tooltip事件对tooptip的处理并不彻底,比较明显的是有些tooltip无法remove,推荐使用forge事件的"net.minecraftforge.event.entity.player.ItemTooltipEvent"进行更全面的操作。

同样是移除'药水'和'Minecraft',只有ForgeEvents的能完全符合预期:

KJS6#基础进阶实例-第9张图片KJS6#基础进阶实例-第10张图片KJS6#基础进阶实例-第11张图片KJS6#基础进阶实例-第12张图片