171 lines
5.4 KiB
Markdown
171 lines
5.4 KiB
Markdown
---
|
||
front:
|
||
hard: 进阶
|
||
time: 20分钟
|
||
---
|
||
|
||
# 练习2:会攻击侵犯领地的凶狠水鸭
|
||
|
||
|
||
|
||
#### 作者:境界
|
||
|
||
|
||
|
||
凶狠水鸭示例包下载:下载[示例包](https://g79.gdl.netease.com/guidedemo-case7v2.zip)。
|
||
|
||
```
|
||
{
|
||
"format_version": "1.16.0",
|
||
"minecraft:entity": {
|
||
"description": {
|
||
"identifier": "design:green_head_duck",
|
||
"is_spawnable": true,
|
||
"is_summonable": true,
|
||
"is_experimental": false,
|
||
"runtime_identifier": "design:green_head_duck"
|
||
},
|
||
"component_groups": {
|
||
},
|
||
|
||
"components": {
|
||
"minecraft:breathable": {
|
||
"total_supply": 15,
|
||
"suffocate_time": 0
|
||
},
|
||
"minecraft:collision_box": {
|
||
"width": 0.6,
|
||
"height": 1.0
|
||
},
|
||
"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:behavior.rise_to_liquid_level": {
|
||
"priority": 0,
|
||
"liquid_y_offset": -0.5,
|
||
"rise_delta": 0.01,
|
||
"sink_delta": 0.01
|
||
},
|
||
"minecraft:leashable": {
|
||
"soft_distance": 4.0,
|
||
"hard_distance": 6.0,
|
||
"max_distance": 10.0
|
||
},
|
||
"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.panic": {
|
||
"priority": 1,
|
||
"speed_multiplier": 1.5
|
||
},
|
||
"minecraft:behavior.tempt": {
|
||
"priority": 4,
|
||
"speed_multiplier": 1.0,
|
||
"items": [
|
||
"wheat_seeds",
|
||
"beetroot_seeds",
|
||
"melon_seeds",
|
||
"pumpkin_seeds"
|
||
]
|
||
},
|
||
"minecraft:type_family": {
|
||
"family": [ "duck", "mob" ]
|
||
},
|
||
"minecraft:behavior.melee_attack": {
|
||
"priority": 3,
|
||
"speed_multiplier": 1,
|
||
"track_target": false
|
||
},
|
||
"minecraft:behavior.nearest_attackable_target": {
|
||
"priority": 2,
|
||
"reselect_targets": true,
|
||
"must_see": false,
|
||
"entity_types": [
|
||
{
|
||
"filters": {
|
||
"all_of": [
|
||
{ "test": "is_family", "subject": "other", "value": "mob" },
|
||
{ "test": "is_family", "subject": "other", "operator": "not", "value": "duck"}
|
||
]
|
||
},
|
||
"max_dist": 5
|
||
}
|
||
]
|
||
},
|
||
"minecraft:attack": {
|
||
"damage": 1
|
||
},
|
||
"minecraft:behavior.random_stroll": {
|
||
"priority": 6,
|
||
"speed_multiplier": 1.0
|
||
},
|
||
"minecraft:behavior.look_at_player": {
|
||
"priority": 7,
|
||
"look_distance": 6.0,
|
||
"probability": 0.02
|
||
},
|
||
"minecraft:behavior.random_look_around": {
|
||
"priority": 8
|
||
},
|
||
"minecraft:physics": {
|
||
},
|
||
"minecraft:pushable": {
|
||
"is_pushable": true,
|
||
"is_pushable_by_piston": true
|
||
}
|
||
},
|
||
|
||
"events": {
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
|
||
|
||
攻击侵犯领地的行为,可以想象成为靠近水鸭多近会引起水鸭的攻击。因此在设置一个生物拥有近战能力的时候,需要用三个行为进行组合:
|
||
|
||
1)minecraft:attack,它的damage值可以接受一个数组,也可以接受一个整数数值。数组情况下,可以让伤害在数组内由大到小取一个随机伤害,而一个固定数值则代表的是固定伤害。
|
||
|
||
2)minecraft:behavior.nearest_attackable_target,它的entity_types接受一连串的生物目标,我们在目标选择器中,同时将目标设置为mob,但又不是duck,即所有带有mob标签却不带有duck标签的生物。max_dist代表在多远距离内会被当作目标,must_see意为是否必须看到才会当作目标,reselect_targets会在一群目标里不断选择离自己最近的目标。
|
||
|
||
3)minecraft:behavior.melee_attack,它的speed_multiplier接收一个浮点数值,即保持进攻状态时,速度会给予多少的加成,1为100%,则保持原速,1.5则是150%。track_target接收一个布尔值,若设置为true则会不停跟着目标,即使走出攻击范围,false则会在目标离开攻击范围后停止行为。
|
||
|
||
|
||
|
||
特别注意:由于minecraft:type_family组件用来标记生物的家族类型,原版鸡携带的家族标签为"mob“和"chicken",理论上,所有原版的生物都带有这个mob标签,我们将水鸭的标签保留了mob标签,也是为了允许其他原版生物在处理一些需要判断生物标签的行为,如寻找目标的时候,能够将水鸭纳入目标范围内,更加的贴近原版的生态。除此之外,我们将chicken改为duck,一个是强调实体携带duck标签,另一个是为了在自身寻找目标的行为当中,将同为duck标签的实体剔除出目标范围。若保持原来鸡的写法,则会变成需要剔除chicken标签的实体,那样就会包括了鸡这类生物,不符合实际需求。 |