Skip to content

生成已驯服的实体

本页面镜像自
BedrockWiki

根据原始项目协议授权。本文经过AI翻译处理,如有内容遗漏,可以提交PR进行补充。

在本教程中,您将学习如何通过向特定玩家触发事件来生成预驯服的实体,以及如何投掷在撞击时变形为已驯服实体的物品。

概述

传统方式中,若要让玩家驯服实体,必须通过 minecraft:tameable 强制玩家与实体互动。但我们也可以利用原版弹射物会记录生成者**的特性来实现预驯服实体的生成。

具体实现步骤:

  1. 通过 minecraft:spawn_entity 生成一个中间态弹射物实体
  2. 该实体将立即转换为预驯服的目标实体(本教程以原版狼为例)
  3. minecraft:transformation 组件中将 keep_owner 设置为 true

*: 需要区分 Spawn(生成)Summon(召唤) 的区别。只有通过生成蛋或 minecraft:spawn_entity 组件生成的弹射物才会记录玩家信息,使用 /summon 命令生成的则不会。

player.json

我们需要对玩家行为文件进行微调,添加一个事件来激活组件组用于生成中间态实体。

您可以在 Mojang 提供的原版行为包模板中找到玩家实体的行为文件。

json
{
    "format_version":"1.16.0",
    "minecraft:entity":{
        "description":{
            "identifier":"minecraft:player",
            "is_spawnable":false,
            "is_summonable":false,
            "is_experimental":false
        },
        "component_groups":{ // 组件组定义
            "wiki:spawn_tamed_wolf":{
                "minecraft:spawn_entity":{
                    "entities":{
                        "min_wait_time":0,
                        "max_wait_time":0,
                        "spawn_entity":"wiki:pretamed_wolf",
                        "single_use":true,
                        "num_to_spawn":1
                    }
                }
            }
		},
        ...
		"events":{ // 事件定义
            "wiki:spawn_tamed_wolf":{
                "add":{
                    "component_groups":[
                        "wiki:spawn_tamed_wolf"
                    ]
                }
            }
        }
    }
}

pretamed_wolf.json

创建一个使用 minecraft:arrow 作为运行时标识符(也可选用其他弹射物标识符)的自定义实体,包含空白弹射物组件和用于转换为驯服狼的变形组件。

json
{
	"format_version": "1.16.0",
	"minecraft:entity": {
		"description": {
			"identifier": "wiki:pretamed_wolf",
			"runtime_identifier": "minecraft:arrow",
			"is_spawnable": false,
			"is_summonable": true,
			"is_experimental": false
		},
		"components": { // 组件配置
			"minecraft:projectile": {}, // 弹射物组件
			"minecraft:transformation": { // 变形组件
				"into": "minecraft:wolf<minecraft:on_tame>",
				"keep_owner": true // 保持归属关系
			}
		}
	}
}

现在即可通过命令 /event entity @p wiki:spawn_tamed_wolf 在玩家身边生成驯服的狼。若将 is_spawnable 设为 true 还可通过生成蛋调用!

重要提示

如需生成自定义实体而非原版狼:

  1. 必须为实体添加 minecraft:is_tamed 组件
  2. 未被驯服的实体可能出现预期外的行为

集成物品抛射物(替代方法)

利用 1.16 实验性物品特性 中的 shoot 事件属性,可制作碰撞时转换为已驯服实体的弹射物。

json
{
    "format_version":"1.16.100",
    "minecraft:item":{
        "description":{
            "identifier":"wiki:throwable_pretamed_wolf"
        },
        "components":{ // 物品组件
            "minecraft:on_use":{
                "on_use":{
                    "event":"wiki:on_use" // 使用事件触发
                }
            }
        },
        "events":{ // 事件配置
            "wiki:on_use":{
                "shoot":{
                    "projectile":"wiki:pretamed_wolf" // 发射自定义弹射物
                }
            }
        }
    }
}

同时需修改弹射物实体的转化逻辑以避免即时变形:

json
{
    "minecraft:entity":{
        "description":{
            "identifier":"wiki:pretamed_wolf",
            "runtime_identifier":"minecraft:arrow",
            "is_spawnable":false,
            "is_summonable":true,
            "is_experimental":false
        },
        "component_groups":{ // 组件组定义
            "wiki:transform_to_entity":{
                "minecraft:transformation":{
                    "into":"minecraft:wolf<minecraft:on_tame>",
                    "keep_owner":true
                }
            }
        },
        "components":{ // 组件配置
            "minecraft:projectile":{
                "on_hit":{ // 碰撞触发配置
                    "impact_damage":{
                        "damage":0 // 禁用伤害
                    },
                    "stick_in_ground":{}, // 插入地面
                    "definition_event":{
                        "event_trigger":{
                            "event":"wiki:on_hit" // 碰撞事件触发
                        }
                    }
                }
            }
        },
        "events":{ // 事件响应
            "wiki:on_hit":{
                "add":{
                    "component_groups":[
                        "wiki:transform_to_entity" // 添加变形组件组
                    ]
                }
            }
        }
    }
}

特别感谢 Zarkmend ZAN 发现这一方法 😃