Files
netease-modsdk-wiki/docs/wiki/blocks/applying-effects.md
2025-03-20 11:52:46 +08:00

4.2 KiB
Raw Permalink Blame History

title, category, tags, mentions
title category tags mentions
持续效果应用指南 巧思案例
实验性内容
初级难度
MysticChair
SirLich
MedicalJewel105
QuazChick

持续效果应用指南

::: tip 格式要求 & 最低引擎版本 1.20.30 本教程假设您已掌握方块状态的基本概念。建议在开始前先阅读方块基础指南。 :::

::: warning 实验性功能 需要启用 假日创作者功能 来触发事件。 :::

本教程将展示如何在实体持续站立于方块时为其附加状态效果。

设置步骤

我们需要在代码中添加以下组件,首先创建一个用于记录站立状态的布尔值:

::: code-group

"states": {
  "wiki:stood_on": [false, true]
}

:::

接下来添加 minecraft:queued_ticking 组件,当检测到站立状态为 true 时触发效果事件:

::: code-group

"minecraft:queued_ticking": {
  "looping": true,
  "interval_range": [1, 1],
  "on_tick": {
    "event": "wiki:add_effect",
    "target": "self",
    "condition": "q.block_state('wiki:stood_on')"
  }
}

:::

使用 minecraft:on_step_on 事件组件在实体踏上方块时更新状态:

::: code-group

"minecraft:on_step_on": {
  "event": "wiki:step_on"
}

:::

通过 minecraft:on_step_off 事件组件在实体离开时重置状态:

::: code-group

"minecraft:on_step_off": {
  "event": "wiki:step_off"
}

:::

配置事件处理逻辑。首先定义状态更新事件:

::: code-group

"events": {
  "wiki:step_on": {
    "set_block_state": {
      "wiki:stood_on": true
    }
  },
  "wiki:step_off": {
    "set_block_state": {
      "wiki:stood_on": false
    }
  }
}

:::

最后添加效果触发事件:

::: code-group

"wiki:add_effect": {
  "run_command": {
    "command": "effect @e[r=1] wither 2 2"
  }
}

:::

完成!上述代码将在实体持续站立时施加凋零效果。

示例JSON

::: code-group

{
  "format_version": "1.20.30",
  "minecraft:block": {
    "description": {
      "identifier": "wiki:wither_block",
      "menu_category": {
        "category": "nature"
      },
      "states": {
        "wiki:stood_on": [false, true]
      }
    },
    "components": {
      "minecraft:geometry": "geometry.wither_block",
      "minecraft:material_instances": {
        "*": {
          "texture": "wither_block"
        }
      },
      "minecraft:loot": "loot_tables/empty.json",
      "minecraft:on_step_on": {
        "event": "wiki:step_on"
      },
      "minecraft:on_step_off": {
        "event": "wiki:step_off"
      },
      "minecraft:queued_ticking": {
        "looping": true,
        "interval_range": [1, 1],
        "on_tick": {
          "event": "wiki:add_effect",
          "condition": "q.block_state('wiki:stood_on')"
        }
      },
      "minecraft:map_color": "#181818"
    },
    "events": {
      "wiki:step_on": {
        "set_block_state": {
          "wiki:stood_on": true
        }
      },
      "wiki:step_off": {
        "set_block_state": {
          "wiki:stood_on": false
        }
      },
      "wiki:add_effect": {
        "run_command": {
          "command": "effect @e[r=1] wither 2 2"
        }
      }
    }
  }
}

:::

技术说明

关于代码实现的几点说明:

  • :为何使用 run_command 事件响应来触发效果,而不是专用的 add_mob_effect 响应?

  • :当通过 minecraft:queued_ticking 触发时,add_mob_effect 无法获取有效目标,因此必须改用 /effect 命令的目标选择器。

注意当效果时长设置小于2秒时可能出现异常。如果效果会造成持续伤害如中毒伤害会在效果施加时立即生效。这将导致实体受到的伤害频率高于原版机制当实体快速移动时。可通过将命令中的效果时长设为1秒进行对比测试。保持2秒时长可确保伤害间隔符合原版节奏。