Skip to content

自定义蓄力物品 ​

蓄力物品(Chargeable Item)允许玩家通过长按右键进行蓄力操作,蓄力完成后触发自定义事件。与远程武器不同,蓄力物品不会自动发射抛射物,而是通过事件回调让开发者自行决定蓄力完成后的逻辑。

前置条件

请先阅读 自定义基础物品 了解通用注册流程(步骤 1-6)。format_version 使用 1.10。

概述 ​

蓄力物品适用于需要"蓄力 → 释放"交互模式的物品,比如法杖、技能道具等。核心机制是通过 netease:chargeable 组件定义蓄力参数,配合 minecraft:use_duration 控制最大持续使用时间。

netease:chargeable 组件 ​

字段类型默认值说明
charge_on_drawbooltrue右键按下时是否立即开始蓄力
charge_complete_timefloat1.0蓄力完成所需时间(秒)
charge_complete_eventstring""蓄力完成时触发的事件名

必要搭配

蓄力物品必须配合 minecraft:use_duration 组件使用,该组件的值决定物品最大持续使用时间(单位 tick,20 tick = 1 秒)。建议设为 72000(1 小时),确保不会因超时而中断蓄力。

蓄力流程 ​

右键按下 → 开始蓄力 → 蓄力到达 100% → 触发 charge_complete_event
                    → 右键中途松开    → 触发 ItemReleaseUsingServerEvent

与远程武器的区别 ​

特性蓄力物品远程武器
custom_item_type不要求(或其他类型)ranged_weapon
自动发射抛射物否是
蓄力完成行为触发自定义事件发射抛射物
第三人称动画无特殊动画弓瞄准动画

相关事件 ​

事件说明
ItemStartUsingServerEvent蓄力开始(右键按下)
ItemReleaseUsingServerEvent蓄力释放(右键抬起),参数中包含 useDuration(已蓄力 tick 数)
ItemStopUsingServerEvent使用中断

完整案例:蓄力法球 ​

行为包 ​

behavior_pack/netease_items_beh/charge_orb.json:

json
{
  "format_version": "1.10",
  "minecraft:item": {
    "description": {
      "identifier": "mymod:charge_orb",
      "category": "equipment"
    },
    "components": {
      "minecraft:max_stack_size": 1,
      "minecraft:use_animation": "bow",
      "minecraft:use_duration": 72000,
      "netease:chargeable": {
        "charge_on_draw": true,
        "charge_complete_time": 2.0,
        "charge_complete_event": "mymod:charge_complete"
      },
      "netease:frame_animation": {
        "frame_count": 4,
        "texture_name": "charge_orb_anim",
        "animate_in_toolbar": false
      }
    }
  }
}

资源包 ​

resource_pack/netease_items_res/charge_orb.json:

json
{
  "format_version": "1.10",
  "minecraft:item": {
    "description": {
      "identifier": "mymod:charge_orb",
      "texture": "charge_orb"
    }
  }
}

本地化 ​

item.mymod:charge_orb.name=蓄力法球

服务端脚本 ​

python
import server.extraServerApi as serverApi
ServerSystem = serverApi.GetServerSystemCls()

class ChargeOrbServer(ServerSystem):
    def __init__(self, namespace, systemName):
        super(ChargeOrbServer, self).__init__(namespace, systemName)
        self.ListenForEvent(
            serverApi.GetEngineNamespace(),
            serverApi.GetEngineSystemName(),
            'ItemReleaseUsingServerEvent',
            self, self.OnRelease
        )

    def OnRelease(self, args):
        playerId = args['playerId']
        itemDict = args.get('itemDict', {})
        useDuration = args.get('useDuration', 0)
        if itemDict.get('itemName') == 'mymod:charge_orb':
            # useDuration 为已蓄力的 tick 数(2 秒 = 40 tick)
            chargePercent = min(useDuration / 40.0, 1.0)
            # 根据蓄力百分比决定法球威力
            self.CastSpell(playerId, chargePercent)

    def CastSpell(self, playerId, power):
        # 蓄力越满,爆炸威力越大
        radius = 2.0 + power * 4.0
        msgComp = serverApi.GetEngineCompFactory().CreateMsg(self.levelId)
        msgComp.NotifyOneMessage(
            playerId,
            "法球释放!威力: {:.0%}".format(power),
            "§b"
        )

常见问题 ​

蓄力没有反应 ​

检查是否配置了 minecraft:use_duration 组件。蓄力物品必须有使用持续时间,否则无法进入蓄力状态。

蓄力动画不播放 ​

需要配合 netease:frame_animation 或 minecraft:use_animation 组件。前者提供贴图序列帧效果,后者使用原版动画(bow/eat/drink 等)。

下一步 ​