Files
netease-modsdk-wiki/docs/mconline/60-我的世界创造营教程/玩法组件进阶教程/1-预设编辑器基础/1-小屋预设课后作业.md
2025-03-17 13:24:39 +08:00

263 lines
8.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
front:
hard: 高级
time: 20分钟
---
# 小屋预设课后作业
在学习了预设的基础用法后,可以尝试完成以下要求,来熟悉预设的用法。
- 在小屋素材内放置箱子方块
- 为自定义流浪商人添加猪灵似的攻击盗宝贼的行为
- 使用掉落表为自定义流浪商人添加初始装备
## 在素材内放置箱子方块
要在素材内放置箱子方块,首先我们需要将原来的`hall.mdl`这个素材,放置到地图中,然后对其进行编辑,再保存成新的一个素材。
打开地图编辑器在素材库中找到hall这个素材点击选中然后在地图中放置。
![](./images/14.png)
然后点击右上角的游戏模式,将编辑器切换到游戏的玩家视角,进入游戏,在房子中放置一个箱子。
![](./images/15.png)
放置完成后按ESC退出。然后使用选取工具重新选择这个小屋并将其保存成素材命名为`new_hall`,然后将选中的部分删除,将地形恢复原样。
![](./images/16.png)
然后再素材库中找到自定义素材,对刚刚保存的`new_hall`这个素材右键,选择`导入为预设素材`
回到预设编辑器,将素材的`hall`删除,更换为`new_hall`
![](./images/17.png)
至此,素材内的箱子就放置完成。
## 攻击盗宝贼的行为
进入关卡编辑器找到我们的自定义流浪商人的实体打开它的行为包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`
在掉落池中添加一个钻石剑。
![](./images/18.png)
这样即配置完成,如果想要随机性,也可以再添加多种不同类型的剑。
然后回到自定义流浪商人的实体配置,在行为包组件中搜索装备并新增。
![](./images/19.png)
添加后,在行为包组件中找到装备一栏,点击添加属性,新增`表`这个属性,填入`loot_tables/merchant_weapon.json`,也就是我们刚刚创建的掉落表。
到此为止,要求已经全部完成,保存后就可以点击运行进入游戏测试啦!
> 为什么进入游戏后看不到这个流浪商人手持剑呢?
>
> 因为我们没有给它配置相关的持剑动画,渲染设置,所以这把剑只能够提升它的攻击力,不可显示。