--- front: https://nie.res.netease.com/r/pic/20211104/69055361-2e7a-452f-8b1a-f23e1262a03a.jpg hard: 进阶 time: 30分钟 --- # 挑战:自定义水上坐骑 在本节中,我们一起来进行一个挑战,一起来自定义一个水上坐骑。在前面,我们已经制作出了一个非常完善的水鸭实体。目前,我们只需要为这个水鸭实体增加一些允许骑乘的相关组件即可完成挑战。 ## 考查实体行为定义 我们先考查实体既有的定义文件。我们可以发现,实体中事实上已经有了一个可骑乘组件`minecraft:rideable`。它位于`minecraft:teal_adult`组件组中,内容为: ```json "minecraft:rideable": { "family_types": [ "zombie" ], "seat_count": 1, "seats": { "position": [ 0, 0.4, 0 ] } } ``` 我们可以很容易看出,这个组件是用于生成僵尸骑手的。我们只需要对其进行改变即可将其变为同时是用于玩家作为骑手的组件。 ## 修改组件 我们通过查阅文档、参考其他实体的用法或查看编辑器中该组件的说明,可以轻易将其进行改造: ```json "minecraft:rideable": { "family_types": [ "zombie", "player" ], "interact_text": "action.interact.mount", "seat_count": 1, "seats": { "position": [ 0, 0.4, 0 ] } } ``` 我们可以通过在`family_types`字段中添加族的类型,然后通过`interact_text`来添加一个携带UI的交互按钮文本。这样,我们的水鸭便可以在玩家与其交互时将玩家设为其骑手,从而实现玩家骑乘在水鸭上的功能。 ## 添加组件 但是,这并不意味着挑战便到此结束。因为目前我们的玩家还无法控制水鸭。我们骑在目前的水鸭上就好比没有萝卜钓竿就骑在猪上一样,无法控制方向,任凭其乱窜。我们需要添加一个控制组件。非常幸运的是,我们恰有一个可以通过方向键或方向按钮来控制实体移动的组件`minecraft:input_ground_controlled`。我们将其加在同样的位置。 ```json "minecraft:rideable": { "family_types": [ "zombie", "player" ], "interact_text": "action.interact.mount", "seat_count": 1, "seats": { "position": [ 0, 0.4, 0 ] } }, "minecraft:input_ground_controlled": {} ``` 这样,我们的水鸭便成为了一个可骑乘可控制同时具备游泳能力的实体了。 ![](./images/8.8_in-game.png) 完整的行为包定义代码如下: ```json { "format_version": "1.16.0", "minecraft:entity": { "description": { "identifier": "tutorial_demo:teal", "runtime_identifier": "minecraft:chicken", "is_spawnable": true, "is_summonable": true, "is_experimental": false }, "component_groups": { "minecraft:teal_baby": { "minecraft:is_baby": {}, "minecraft:scale": { "value": 0.5 }, "minecraft:ageable": { "duration": 1200, "feed_items": ["wheat_seeds", "beetroot_seeds", "melon_seeds", "pumpkin_seeds"], "grow_up": { "event": "minecraft:ageable_grow_up", "target": "self" } }, "minecraft:behavior.follow_parent": { "priority": 5, "speed_multiplier": 1.1 } }, "minecraft:teal_adult": { "minecraft:experience_reward": { "on_bred": "Math.Random(1,7)", "on_death": "query.last_hit_by_player?Math.Random(1,3):0" }, "minecraft:loot": { "table": "loot_tables/entities/chicken.json" }, "minecraft:breedable": { "require_tame": false, "breeds_with": { "mate_type": "tutorial_demo:teal", "baby_type": "tutorial_demo:teal", "breed_event": { "event": "minecraft:entity_born", "target": "baby" } }, "breed_items": ["wheat_seeds", "beetroot_seeds", "melon_seeds", "pumpkin_seeds"] }, "minecraft:behavior.breed": { "priority": 3, "speed_multiplier": 1 }, "minecraft:rideable": { "family_types": [ "zombie", "player" ], "interact_text": "action.interact.mount", "seat_count": 1, "seats": { "position": [ 0, 0.4, 0 ] } }, "minecraft:input_ground_controlled": {}, "minecraft:spawn_entity": { "entities": { "min_wait_time": 300, "max_wait_time": 600, "spawn_sound": "plop", "spawn_item": "egg", "filters": { "test": "rider_count", "subject": "self", "operator": "==", "value": 0 } } } } }, "components": { "minecraft:type_family": { "family": ["chicken", "mob"] }, "minecraft:breathable": { "total_supply": 15, "suffocate_time": 0 }, "minecraft:collision_box": { "width": 0.6, "height": 0.8 }, "minecraft:nameable": {}, "minecraft:health": { "value": 4, "max": 4 }, "minecraft:hurt_on_condition": { "damage_conditions": [ { "filters": { "test": "in_lava", "subject": "self", "operator": "==", "value": true }, "cause": "lava", "damage_per_tick": 4 } ] }, "minecraft:movement": { "value": 0.25 }, "minecraft:damage_sensor": { "triggers": { "cause": "fall", "deals_damage": false } }, "minecraft:leashable": { "soft_distance": 4, "hard_distance": 6, "max_distance": 10 }, "minecraft:balloonable": { "mass": 0.5 }, "minecraft:navigation.walk": { "can_path_over_water": true, "can_sink": false, "avoid_damage_blocks": true }, "minecraft:movement.basic": {}, "minecraft:jump.static": {}, "minecraft:can_climb": {}, "minecraft:despawn": { "despawn_from_distance": {} }, "minecraft:behavior.rise_to_liquid_level": { "priority": 0, "liquid_y_offset": -0.5, "rise_delta": 0.01, "sink_delta": 0.01 }, "minecraft:behavior.panic": { "priority": 1, "speed_multiplier": 1.5 }, "minecraft:behavior.mount_pathing": { "priority": 2, "speed_multiplier": 1.5, "target_dist": 0, "track_target": true }, "minecraft:behavior.tempt": { "priority": 4, "speed_multiplier": 1, "items": ["wheat_seeds", "beetroot_seeds", "melon_seeds", "pumpkin_seeds"] }, "minecraft:behavior.random_stroll": { "priority": 6, "speed_multiplier": 1 }, "minecraft:behavior.look_at_player": { "priority": 7, "look_distance": 6, "probability": 0.02 }, "minecraft:behavior.random_look_around": { "priority": 8 }, "minecraft:physics": {}, "minecraft:pushable": { "is_pushable": true, "is_pushable_by_piston": true }, "minecraft:conditional_bandwidth_optimization": {} }, "events": { "from_egg": { "add": { "component_groups": ["minecraft:teal_baby"] } }, "minecraft:entity_spawned": { "randomize": [ { "weight": 95, "trigger": "minecraft:spawn_adult" }, { "weight": 5, "add": { "component_groups": ["minecraft:teal_baby"] } } ] }, "minecraft:entity_born": { "remove": {}, "add": { "component_groups": ["minecraft:teal_baby"] } }, "minecraft:ageable_grow_up": { "remove": { "component_groups": ["minecraft:teal_baby"] }, "add": { "component_groups": ["minecraft:teal_adult"] } }, "minecraft:spawn_adult": { "add": { "component_groups": ["minecraft:teal_adult"] } } } } } ```