Sakarwei 发表于 2024-10-26 13:41:20

利用ScriptAPI为MCBE Addon 加入新的药水(实现使用物品后执行指令)

本帖最后由 Sakarwei 于 2024-10-26 13:49 编辑

前言:这里介绍的是加入新的药水,不是药水效果。

不知道有多少人想要添加自定义药水,然后就根据[网易我的世界的Addon教程开发加入的,或者参考金苹果制作加入。
彼链接:https://mc.163.com/dev/mcmanual/mc-dev/mconline/15-玩法组件教程【新版】/8-自定义物品/2-制作一个新药水.html


但是这样做的话有很多缺点,比如说:

[*]o 格式版本落后,适配麻烦,或导致插件包资源混乱。
[*]o 不可以要求使用后转化成为玻璃瓶,导致玩家喝下药水的时候把玻璃瓶子一并吃掉,浪费玻璃资源。(虽然可再生,但是玻璃再生途径非常有限)
[*]o (似乎)不能调整物品细分分类,创造模式菜单下不能和原版的药水在一起。

今天我想告诉大家:Minecraft 加入自定义药水,其实有更好的打开策——
利用 Script API 编写物品使用事件并通过执行指令赋予玩家药水效果。

注:Js 和 Json 非字符串内的“//”后的内容是注释,删除、修改和保留都不影响代码解析和执行。
〇、启用 SAPI。

行为包侧 manifest.json 需要补充配置
"modules": [
      // 其它成分省略
      {
                "type": "script",
                "language": "javascript",
                "uuid": "53616b61-1302-2024-1358-0241026551d7",
                "entry": "scripts/start.js", // 文件名可以修改
                "version":
      }
]
"capabilities": ["script_eval"],
"dependencies":[
                // 其它成分省略
                {"module_name": "@minecraft/server","version": "1.8.0"} // 标注甲
      ]标注甲:
version 可以适当改动。版本号越高,要求版本越新。
其中,含“alpha”“beta”字样的版本号,需要打开“测试版API”才能玩耍,并且后续 SAPI 更新后的版本可能不能正常运行
其余版本不需要打开“测试版API”,后续更新也不必针对适配。

一、加入物品
(请加入物品部分参见其它教程)
在物品 JSON 中还需要加入部分调整:components 内 标注
"minecraft:use_animation": "drink",
"minecraft:food": {
// 此处部分内容省略,可根据其它教程补全
      "using_converts_to": "glass_bottle" // 规定使用后转化成原版的玻璃瓶
}
二、编写 JS 部分
// 导入 Minecraft SAPI
import * as Minecraft from '@minecraft/server';
Minecraft.world.afterEvents.itemCompleteUse.subscribe(event=>{ // 这行之需要写一次,有什么要加,可参照下文格式加在这个花括号内。
      if (event.itemStack.typeId == "【物品ID】"){event.source.runCommand(`【执行指令】`);} // 每一个物品加一行这个
      // 指令以玩家身份执行。为了赋予玩家药水效果,我们要执行的指令是: effect @s 【效果ID】 【时间】 ……
      // 其余类似,其余略。这里其实还可以有更多的花样,见演示包 bp/scripts/start.js 。
})
三、材质贴图、翻译、……(略,请见其它教程)
四、打包测试

演示展示:

成功加入药水并正确归类:(堆叠数量忘记调整了)


饮用后,药水转化成玻璃瓶,并正确赋予药水效果:




其它说明:
o 使用附件演示组建时,注意确认行为包和资源包是否加载。只有二者都正确加载了才能正确运行。
o 附件演示组建还加入了一个“可疑的糖果”,食用后随即赋予一个列表内的药水效果。
o 本来我想改代码高亮的,但是因为论坛 code 和代码高亮的样式代码冲突,没搞。

方琉璃 发表于 2024-10-26 21:00:11

很好的教程呢[贴吧_大拇指]
不过ScriptAPI的Entity类提供了添加状态效果的方法,我更喜欢这么写:

if (event.itemStack.typeId === "【物品ID】"){
event.source.addEffect(状态ID,持续时间,{
amplifier: 效果等级,
showParticles: 是否展示粒子
});
}

[贴吧_滑稽]

YanRan233 发表于 2024-10-26 21:12:04

感谢楼主教程[哔哩_脱单]

奶糖也不是很甜 发表于 2024-10-29 11:38:50

大佬强大[哔哩_脱单]
页: [1]
查看完整版本: 利用ScriptAPI为MCBE Addon 加入新的药水(实现使用物品后执行指令)