Files
netease-modsdk-wiki/docs/wiki/entities/village-mechanic.md
2025-03-20 11:52:46 +08:00

357 lines
9.0 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.

---
title: 村庄机制
category: 巧思案例
mentions:
- AeroForta
- MedicalJewel105
- stirante
- SmokeyStack
- SirLich
- Ciosciaa
- ThomasOrs
---
# 村庄机制
<!--@include: @/wiki/bedrock-wiki-mirror.md-->
本文适用于想要为自定义实体实现村庄机制的开发者
## 导航行为
首先从基本导航行为开始。
::: code-group
```json [BP/entities/custom_villager.json#components]
"minecraft:preferred_path":{
"max_fall_blocks":1,
"jump_cost":5,
"default_block_cost":1.5,
"preferred_path_blocks":[
{
"cost":0,
"blocks":[
"grass_path"
]
},
{
"cost":1,
"blocks":[
"cobblestone",
"stone"
]
},
{
"cost":50,
"blocks":[
"bed",
"lectern"
]
}
]
}
```
:::
允许实体进行随机移动。
::: code-group
```json [BP/entities/custom_villager.json#components]
"minecraft:behavior.random_stroll":{
"priority":9,
"speed_multiplier":0.55,
"xz_dist":10,
"y_dist":5
}
```
:::
使实体返回居所范围(在此案例中即村庄边界)。需要下文将解释的`minecraft:dweller`组件。
::: code-group
```json [BP/entities/custom_villager.json#components]
"minecraft:behavior.move_towards_dwelling_restriction": {
"priority": 4,
"speed_multiplier": 1.0
}
```
:::
通过创建巡逻路径让实体在村庄周围移动。铁傀儡使用的机制。
::: code-group
```json [BP/entities/custom_villager.json#components]
"minecraft:behavior.move_through_village": {
"priority": 3,
"speed_multiplier": 0.6,
"only_at_night": true
}
```
:::
允许实体进入建筑物并在下雨时寻找庇护所。需要开门能力。
::: code-group
```json [BP/entities/custom_villager.json#components]
"minecraft:behavior.move_indoors":{
"priority":5
}
```
:::
使实体在日落时留在室内。
::: code-group
```json [BP/entities/custom_villager.json#components]
"minecraft:behavior.restrict_open_door":{
"priority": 5
}
```
:::
需搭配使用:
::: code-group
```json [BP/entities/custom_villager.json#components]
"minecraft:annotation.open_door":{
"priority": 5
}
```
:::
::: code-group
```json [BP/entities/custom_villager.json#components]
"minecraft:navigation.walk":{
"can_pass_doors":true,
"can_open_doors":true
}
```
:::
::: code-group
```json [BP/entities/custom_villager.json#components]
"minecraft:behavior.open_door":{
"priority":6,
"close_door_after":true
}
```
:::
## 核心行为
::: code-group
```json [BP/entities/custom_villager.json#components]
"minecraft:dweller": {
"dwelling_type": "village",
"dweller_role": "inhabitant",
"preferred_profession": "farmer",
"update_interval_base": 60,
"update_interval_variant": 40,
"can_find_poi": true,
"can_migrate": true,
"first_founding_reward": 5
}
```
:::
- `dweller_role: inhabitant`\
允许实体认领床和钟,需搭配`minecraft:behavior.sleep`。
- `preferred_profession: farmer`\
为`minecraft:behavior.work`的可选参数
- `can_find_poi`\
启用后实体可寻找兴趣点。已知兴趣点类型:
```
bed // 床
jobsite // 工作站点
meeting_area // 聚集点
```
- `can_migrate`\
定义实体是否能在不同村庄间迁移
### 睡眠行为
可参考[睡眠实体指南](/wiki/entities/sleeping-entities)实现实体睡眠
### 工作行为
需要设置"dweller_role"为"inhabitant",若未设置"preferred_profession"则实体将移动到最近的工作站点。
::: code-group
```json [空值]
"minecraft:behavior.work": {
"priority": 4,
"active_time": 250,
"speed_multiplier": 0.5,
"goal_cooldown": 200,
"sound_delay_min": 100,
"sound_delay_max": 200,
"can_work_in_rain": false,
"work_in_rain_tolerance": 1000,
"on_arrival": {
"event": "minecraft:resupply_trades",
"target": "self"
}
}
```
:::
### 社交行为
允许实体进行社交活动。
需要设置"dweller_role"为"inhabitant"。
```json
"minecraft:behavior.mingle": {
"priority": 4,
"speed_multiplier": 0.5,
"duration": 30,
"cooldown_time": 10,
"mingle_partner_type": "my:custom_entity",
"mingle_distance": 2.0
}
```
## 日程系统
现在将所有机制整合到"minecraft:scheduler"中。
首先创建简单配置。
将工作行为放入组件组:
::: code-group
```json [空值]
"component_groups":{
"work_schedule":{
"minecraft:behavior.work":{
"priority":4,
"active_time":250,
"speed_multiplier":0.5,
"goal_cooldown":200,
"sound_delay_min":100,
"sound_delay_max":200,
"can_work_in_rain":true,
"work_in_rain_tolerance":1000,
"on_arrival":{
"event":"minecraft:resupply_trades",
"target":"self"
}
}
},
"gather_schedule":{
"minecraft:behavior.mingle":{
"priority": 5,
"speed_multiplier": 0.8,
"cooldown_time":10.0,
"duration": 30.0,
"mingle_dist": 1.5,
"mingle_partner_type": "my:custom_entity"
}
}
}
```
:::
配置工作日程:
::: code-group
```json [空值]
"minecraft:scheduler":{
"min_delay_secs":0,
"max_delay_secs":10,
"scheduled_events":[
{
"filters":{
"all_of":[
{
"test":"hourly_clock_time",
"operator":">=",
"value":0 // 早晨
},
{
"test":"hourly_clock_time",
"operator":"<",
"value":12000 // 傍晚
}
]
},
"event":"work"
},
{
"filters":{
"all_of":[
{
"test":"hourly_clock_time",
"operator":">=",
"value":21000
},
{
"test":"hourly_clock_time",
"operator":"<",
"value":24000
}
]
},
"event":"gather"
}
]
}
```
:::
事件部分配置示例:
::: code-group
```json [空值]
"events":{
"work":{
"remove":{
"component_groups":[
"gather_schedule"
]
},
"add":{
"component_groups":[
"work_schedule"
]
}
},
"gather":{
"remove":{
"component_groups":[
"work_schedule"
]
},
"add":{
"component_groups":[
"gather_schedule"
]
}
}
}
```
:::
进入游戏生成实体后放置床,应可见绿色粒子效果。
## 其他行为
以下行为可供自定义实体使用:
- `minecraft:behavior.move_to_village`\
劫掠者使用该机制来留在村庄
- `minecraft:behavior.stroll_towards_village`\
狐狸使用该机制寻找并前往村庄
- `minecraft:behavior.inspect_bookshelf`\
管理员村民用于查看书架
- `minecraft:behavior.explore_outskirts`\
允许实体在村庄外探索(需搭配日程系统组件组保证返回)
- `minecraft:behavior.defend_village_target`\
用于近战攻击。远程攻击可能误伤具有"inhabitant" role的实体
可用行为对照表:
| 行为名称 | 用途 | 备注 |
| ----------------------------------------- | --------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
| `minecraft:behavior.defend_village_target` | 允许实体攻击伤害村民的敌人 | 建议仅用于近战攻击型实体 |
| `minecraft:behavior.hide` | 村民用于在特定POI隐藏停留 | 当前POI类型文档不完整建议保持`"poi_type": "bed"` |
| `minecraft:behavior.move_to_village` | 劫掠者和女巫用于在村庄范围内随机移动 | - |
| `minecraft:behavior.nap` | 狐狸用于小憩 | 类似睡眠但更灵活,内置感知特定实体自动唤醒系统 |