实体事件
实体事件是与组件和组件组并列的行为模块基础要素。它们作为组件组的控制中枢,可以从组件、动画、动画控制器及其他事件中调用。本文将详解如何在当前实体和其他实体中触发事件,以及事件的基本格式。
事件响应机制
通过事件我们可以执行添加/移除组件组等操作,从而在满足特定条件时改变实体行为。之所以称为"事件",是因为它们能在计时器结束、玩家与实体交互或环境变化等情境下被激活。事件触发时会执行所有列出的响应动作。
添加/移除组件组
事件最核心的功能是直接管理组件组。以下名为wiki:ranged_attacker的事件示例,演示了如何添加"attacker"和"ranged"组件组,同时移除"standby"和"melee"组件组:
"wiki:ranged_attacker": {
"add": {
"component_groups": [
"attacker",
"ranged"
]
},
"remove":{
"component_groups": [
"standby",
"melee"
]
}
}TIP
当添加的组件组中包含已有组件时,新添加的组件会覆盖原有组件。
命令队列
将命令加入队列,在当前游戏刻结束时由目标执行:
"wiki:execute_event": {
"queue_command": {
"target": "self", // 可选参数,默认为'self'(作用于当前实体)
"command": "summon pig"
}
}可通过数组形式批量添加命令:
"wiki:execute_event": {
"queue_command": {
"target": "self",
"command": [
"summon pig",
"say 大家欢迎这只猪!"
]
}
}随机化处理
通过权重随机系统添加/移除组件组。牛的生成事件就利用此机制,使95%概率生成成年牛(minecraft:cow_adult),5%概率生成幼崽(minecraft:cow_baby):
"minecraft:entity_spawned": {
"randomize": [
{
"weight": 95,
"add": {
"component_groups": [
"minecraft:cow_adult"
]
}
},
{
"weight": 5,
"add": {
"component_groups": [
"minecraft:cow_baby"
]
}
}
]
}注意:随机化系统每次只会从选项池中选择一个方案执行。
条件序列/过滤器
通过过滤器实现条件判断。僵尸转化为溺尸的事件中,就根据是否为幼年体来添加不同组件组:
"minecraft:convert_to_drowned": {
"sequence": [
{
"filters": {
"test": "has_component",
"operator": "!=",
"value": "minecraft:is_baby"
},
"add": {
"component_groups": [
"minecraft:convert_to_drowned"
]
},
"remove": {
"component_groups": [
"minecraft:start_drowned_transformation"
]
}
},
{
"filters": {
"test":"has_component",
"value":"minecraft:is_baby"
},
"add": {
"component_groups": [
"minecraft:convert_to_baby_drowned"
]
},
"remove": {
"component_groups": [
"minecraft:start_drowned_transformation"
]
}
}
]
}序列中的条目会按顺序逐一评估,符合条件的就会执行。
TIP
序列中的条件判断并非互斥。如上例第一个条目没有过滤器会直接执行,但这不影响后续条目继续检查。
下方是通过序列组合过滤器、随机化和组件组管理的复杂案例:
序列应用实例
当实体被玩家或抛射物击中时,有60%概率无反应,40%概率触发攻击序列。该序列会根据实体生命值(低于半血时增强攻击概率)和玩家距离(远距离时优先远程攻击)动态调整攻击方式。
"wiki:on_hit": {
"randomize":[
// 60%概率无反应
{
"weight": 60
},
// 40%概率触发
{
"weight": 40,
"sequence": [
// 攻击事件前置条件
{
"trigger": "attack_event"
},
// 未受伤状态判断
{
"filters": {
"test": "has_component",
"operator": "!=",
"value": "minecraft:is_sheared"
},
"sequence": [
// 5格内近战判断
{
"filters": {
"test": "distance_to_nearest_player",
"operator": "<=",
"value": 5.0
},
"randomize": [
{
"weight": 10,
"add": {
"component_groups": [
"explode"
]
}
},
{
"weight": 60,
"add": {
"component_groups": [
"attack"
]
}
},
{
"weight": 20,
"add": {
"component_groups": [
"range_attack"
]
}
},
{
"weight": 10
}
]
},
// 5格外远程判断
{
"filters": {
"all_of": [
{
"test": "distance_to_nearest_player",
"operator": ">",
"value": 5.0
},
{
"test": "has_target",
"operator": "equals",
"value": true
}
]
},
"randomize": [
{
"weight": 30,
"add": {
"component_groups": [
"attack"
]
}
},
{
"weight": 60,
"add":{
"component_groups": [
"range_attack"
]
}
},
{
"weight": 10
}
]
}
]
},
// 受伤状态处理
{
"filters": {
"test": "has_component",
"value": "minecraft:is_sheared"
},
"sequence": [
// 强化近战攻击
{
"filters": {
"test": "distance_to_nearest_player",
"operator": "<=",
"value": 5.0
},
"randomize": [
{
"weight": 20,
"add":{
"component_groups": [
"explode"
]
}
},
{
"weight": 60,
"add": {
"component_groups": [
"strong_attack"
]
}
},
{
"weight": 20,
"add": {
"component_groups": [
"strong_range_attack"
]
}
}
]
},
// 强化远程攻击
{
"filters": {
"all_of": [
{
"test": "distance_to_nearest_player",
"operator": ">",
"value": 5.0
},
{
"test": "has_target",
"operator": "equals",
"value": true
}
]
},
"randomize": [
{
"weight": 60,
"add": {
"component_groups": [
"strong_range_attack"
]
}
},
{
"weight": 40,
"randomize": [
{
"weight": 30,
"trigger": "rapid_fire"
},
{
"weight": 70,
"add": {
"component_groups": [
"strong_blast"
]
}
}
]
}
]
}
]
}
]
}
]
}属性设置
通过Molang表达式设置实体属性值:
WARNING
字符串值需用单引号包裹才会被识别为字符串而非Molang变量。
"wiki:change_properties": {
"set_property": {
"wiki:boolean_property_example": false,
"wiki:integer_property_example": "q.property('wiki:integer_property_example') + 1",
"wiki:string_property_example": "'red'"
}
}事件触发
通过过滤器条件向指定目标触发其他事件。例如当玩家与猪交互时,触发玩家实体内的wiki:interacted事件:
"wiki:on_interact": {
"trigger": {
"filters": {
"test": "is_family",
"subject": "self",
"value": "pig"
},
"event": "wiki:interacted",
"target": "other"
}
}TIP
事件会保留原始组件的实体上下文。例如通过minecraft:interact触发的事件可以获取交互玩家信息,但若无上下文支持的目标参数将失效。
结合序列参数可实现多实体事件触发:
"wiki:on_interact": {
"sequence": [
{
"trigger": {
"event": "wiki:interacted",
"target": "other"
}
},
{
"trigger": {
"event": "wiki:interacted_with",
"target": "self"
}
}
]
}事件触发方式
事件可通过五种主要方式激活:
- 组件调用:如僵尸通过环境传感器在水下时触发转化事件
- 动画时间轴:行为动画在10秒标记处触发扑击事件
- 动画控制器:状态切换时通过on_entry触发奔跑事件
- 事件嵌套:如猪灵出生事件中触发幼崽生成事件
- 控制台命令:
/event entity @e[type=pig] wiki:example
跨实体事件调用
唤魔者通过minecraft:behavior.send_event组件,向16格内蓝色绵羊发送"wololo"事件:
"minecraft:behavior.send_event": {
"priority": 3,
"event_choices": [
{
"min_activation_range": 0.0,
"max_activation_range": 16.0,
"cooldown_time": 5.0,
"cast_duration": 3.0,
"particle_color": "#FFB38033",
"weight": 3,
"filters": {
"all_of": [
{
"test": "is_family",
"subject": "other",
"value": "sheep"
},
{
"test": "is_color",
"subject": "other",
"value": "blue"
}
]
},
"start_sound_event": "cast.spell",
"sequence": [
{
"base_delay": 2.0,
"event": "wololo",
"sound_event": "prepare.wololo"
}
]
}
]
}生成实体时也可附加事件,在转化组件末尾添加<事件名>即可:
"minecraft:transformation": {
"into": "minecraft:drowned<minecraft:as_adult>",
"transformation_sound": "convert_to_drowned",
"drop_equipment": true,
"delay": {
"value":15
}
}目标选择机制
卫道士的伤害传感器在死亡时,向击杀者玩家传递"minecraft:gain_bad_omen"事件:
"minecraft:damage_sensor": {
"triggers": {
"on_damage": {
"filters": {
"all_of": [
{
"test": "has_damage",
"value": "fatal"
},
{
"test": "is_family",
"subject": "other",
"value": "player"
}
]
},
"event": "minecraft:gain_bad_omen",
"target": "other"
}
}
}内置事件类型
以下事件会在满足条件时自动触发(常规组件组需手动调用):
minecraft:entity_spawned:实体生成时(用于初始化组件组)minecraft:entity_born:繁殖产生时minecraft:entity_transformed:实体转化时minecraft:on_prime:引信点燃即将爆炸时
牛的实现案例展示了如何确保生成时必定带有成年或幼年状态:
"events": {
"minecraft:entity_spawned": {
"randomize": [
{
"weight": 95,
"add": {
"component_groups": ["minecraft:cow_adult"]
}
},
{
"weight": 5,
"add": {
"component_groups": ["minecraft:cow_baby"]
}
}
]
},
"minecraft:entity_born": {
"add": {
"component_groups": ["minecraft:cow_baby"]
}
},
"minecraft:entity_transformed": {
"add": {
"component_groups": ["minecraft:cow_adult"]
}
}
}






