263 lines
8.7 KiB
Markdown
263 lines
8.7 KiB
Markdown
---
|
||
front:
|
||
hard: 高级
|
||
time: 20分钟
|
||
---
|
||
# 小屋预设课后作业
|
||
|
||
在学习了预设的基础用法后,可以尝试完成以下要求,来熟悉预设的用法。
|
||
|
||
- 在小屋素材内放置箱子方块
|
||
- 为自定义流浪商人添加猪灵似的攻击盗宝贼的行为
|
||
- 使用掉落表为自定义流浪商人添加初始装备
|
||
|
||
## 在素材内放置箱子方块
|
||
|
||
要在素材内放置箱子方块,首先我们需要将原来的`hall.mdl`这个素材,放置到地图中,然后对其进行编辑,再保存成新的一个素材。
|
||
|
||
打开地图编辑器,在素材库中,找到hall这个素材,点击选中,然后在地图中放置。
|
||
|
||

|
||
|
||
然后点击右上角的游戏模式,将编辑器切换到游戏的玩家视角,进入游戏,在房子中放置一个箱子。
|
||
|
||

|
||
|
||
放置完成后,按ESC退出。然后使用选取工具,重新选择这个小屋,并将其保存成素材,命名为`new_hall`,然后将选中的部分删除,将地形恢复原样。
|
||
|
||

|
||
|
||
然后再素材库中找到自定义素材,对刚刚保存的`new_hall`这个素材右键,选择`导入为预设素材`。
|
||
|
||
回到预设编辑器,将素材的`hall`删除,更换为`new_hall`。
|
||
|
||

|
||
|
||
至此,素材内的箱子就放置完成。
|
||
|
||
## 攻击盗宝贼的行为
|
||
|
||
进入关卡编辑器,找到我们的自定义流浪商人的实体,打开它的行为包json文件。
|
||
|
||
因为涉及到类似猪灵的攻击盗宝贼的行为,需要用到的行为组件,暂时在关卡编辑器中不可以编辑,所以我们需要手动进行json文件的编辑。
|
||
|
||
在这里我们先将需要用到的一些json组件的具体写法贴出来。
|
||
|
||
`minecraft:block_sensor`可以用来检测周围的方块,是否有破坏之类的事件,在检测到后,触发某个json事件,需要将它放到`components`这个节点下。
|
||
|
||
```json
|
||
"minecraft:block_sensor": {
|
||
"sensor_radius": 16,
|
||
"on_break": [
|
||
{
|
||
"block_list": [
|
||
"minecraft:chest"
|
||
],
|
||
"on_block_broken": "important_block_destroyed_event"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
`component_groups`指的是组件分组,我们可以将一些组件定义在这个节点下,在某个事件被触发后,为实体添加或删除某个组件分组,来实现一些效果。它需要在`minecraft:entity`节点下。
|
||
|
||
比如这里我们定义了一个`take_target_as_response_to_block_break`分组,用来更新这个流浪商人的行为包组件,让它攻击玩家。
|
||
|
||
```json
|
||
"component_groups":{
|
||
"take_target_as_response_to_block_break": {
|
||
"minecraft:behavior.nearest_attackable_target": {
|
||
"priority": 7,
|
||
"entity_types": [
|
||
{
|
||
"filters": {
|
||
"test": "is_family",
|
||
"subject": "other",
|
||
"value": "player"
|
||
},
|
||
"max_dist": 16
|
||
}
|
||
]
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
`events`指的是json事件,可以定义一个事件,在事件被触发时,对事件作出相应,比如添加/删除某个组件分组。它需要在`minecraft:entity`节点下。
|
||
|
||
这里我们定义了一个`important_block_destroyed_event`,会在玩家破坏箱子时被触发,然后给实体添加`take_target_as_response_to_block_break`这个组件分组,让它攻击玩家。
|
||
|
||
```json
|
||
"events": {
|
||
"important_block_destroyed_event": {
|
||
"add": {
|
||
"component_groups": [
|
||
"take_target_as_response_to_block_break"
|
||
]
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
最终配置完成的json文件如下,其中修改的部分进行了注释,可以参考。
|
||
|
||
```json
|
||
{
|
||
"format_version": "1.12.0",
|
||
"minecraft:entity": {
|
||
"components": {
|
||
"minecraft:attack": {
|
||
"damage": 10
|
||
},
|
||
"minecraft:behavior.float": {
|
||
"priority": 0
|
||
},
|
||
"minecraft:behavior.look_at_player": {
|
||
"look_distance": 8,
|
||
"priority": 8,
|
||
"probability": 0.02
|
||
},
|
||
"minecraft:behavior.melee_attack": {
|
||
|
||
},
|
||
"minecraft:behavior.nearest_attackable_target": {
|
||
"entity_types": [
|
||
{
|
||
"filters": {
|
||
"all_of": [
|
||
{
|
||
"subject": "other",
|
||
"test": "is_family",
|
||
"value": "monster"
|
||
}
|
||
]
|
||
},
|
||
"within_default": 10
|
||
}
|
||
],
|
||
"must_see": true,
|
||
"reselect_targets": true
|
||
},
|
||
"minecraft:behavior.open_door": {
|
||
"close_door_after": true,
|
||
"priority": 6
|
||
},
|
||
"minecraft:behavior.random_look_around": {
|
||
"priority": 9
|
||
},
|
||
"minecraft:behavior.restrict_open_door": {
|
||
"priority": 5
|
||
},
|
||
"minecraft:behavior.sleep": {
|
||
|
||
},
|
||
"minecraft:can_climb": {
|
||
|
||
},
|
||
"minecraft:economy_trade_table": {
|
||
"convert_trades_economy": true,
|
||
"display_name": "商人",
|
||
"new_screen": true,
|
||
"table": "trading/trade.json"
|
||
},
|
||
"minecraft:jump.static": {
|
||
|
||
},
|
||
"minecraft:loot": {
|
||
"table": "loot_tables/loot.json"
|
||
},
|
||
"minecraft:movement": {
|
||
"value": 0.5
|
||
},
|
||
"minecraft:movement.basic": {
|
||
|
||
},
|
||
"minecraft:navigation.walk": {
|
||
"avoid_water": true,
|
||
"can_open_doors": true,
|
||
"can_pass_doors": true,
|
||
"can_path_over_water": true
|
||
},
|
||
"minecraft:persistent": {
|
||
|
||
},
|
||
"minecraft:physics": {
|
||
|
||
},
|
||
"minecraft:pushable": {
|
||
"is_pushable": true,
|
||
"is_pushable_by_piston": true
|
||
},
|
||
// 用来检测周围的方块
|
||
"minecraft:block_sensor": {
|
||
"sensor_radius": 16,
|
||
"on_break": [
|
||
{
|
||
"block_list": [
|
||
"minecraft:chest"
|
||
],
|
||
"on_block_broken": "important_block_destroyed_event"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
// 新增的组件分组
|
||
"component_groups":{
|
||
"take_target_as_response_to_block_break": {
|
||
"minecraft:behavior.nearest_attackable_target": {
|
||
"priority": 7,
|
||
"entity_types": [
|
||
{
|
||
"filters": {
|
||
"test": "is_family",
|
||
"subject": "other",
|
||
"value": "player"
|
||
},
|
||
"max_dist": 16
|
||
}
|
||
]
|
||
}
|
||
}
|
||
},
|
||
// 新增的事件定义
|
||
"events": {
|
||
"important_block_destroyed_event": {
|
||
"add": {
|
||
"component_groups": [
|
||
"take_target_as_response_to_block_break"
|
||
]
|
||
}
|
||
}
|
||
},
|
||
"description": {
|
||
"identifier": "afhui:merchant",
|
||
"is_experimental": false,
|
||
"is_spawnable": true,
|
||
"is_summonable": true
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
## 使用掉落表配置初始装备
|
||
|
||
首先使用资源管理,新建一个掉落表,命名为`merchant_weapon`
|
||
|
||
在掉落池中添加一个钻石剑。
|
||
|
||

|
||
|
||
这样即配置完成,如果想要随机性,也可以再添加多种不同类型的剑。
|
||
|
||
然后回到自定义流浪商人的实体配置,在行为包组件中搜索装备并新增。
|
||
|
||

|
||
|
||
添加后,在行为包组件中找到装备一栏,点击添加属性,新增`表`这个属性,填入`loot_tables/merchant_weapon.json`,也就是我们刚刚创建的掉落表。
|
||
|
||
到此为止,要求已经全部完成,保存后就可以点击运行进入游戏测试啦!
|
||
|
||
> 为什么进入游戏后看不到这个流浪商人手持剑呢?
|
||
>
|
||
> 因为我们没有给它配置相关的持剑动画,渲染设置,所以这把剑只能够提升它的攻击力,不可显示。
|