添加了部分来自于BedrockWiki的文章!
This commit is contained in:
396
docs/wiki/3-实体/2-巧思案例/sleeping-entities.md
Normal file
396
docs/wiki/3-实体/2-巧思案例/sleeping-entities.md
Normal file
@@ -0,0 +1,396 @@
|
||||
---
|
||||
title: Sleeping Entities
|
||||
category: Tutorials
|
||||
tags:
|
||||
- intermediate
|
||||
mentions:
|
||||
- MedicalJewel105
|
||||
- SirLich
|
||||
---
|
||||
|
||||
This tutorial will explain how to make entity sleep.
|
||||
|
||||
## Sleeping in beds
|
||||
|
||||
This behavior is inspired from villagers.
|
||||
|
||||
### Features
|
||||
|
||||
- Entity sleeps during the night and wakes up at day time.
|
||||
- Interaction with entity will wake it up and after a while it goes sleeping again.
|
||||
- If entity is hurt, it wakes up.
|
||||
|
||||
### Behavior Pack
|
||||
|
||||
In this section behavior pack components will be discussed.
|
||||
|
||||
#### Components
|
||||
|
||||
Let's start with some basic components that you need to add to your entity.
|
||||
|
||||
<CodeHeader>BP/entities/sleeping_entity.json#components</CodeHeader>
|
||||
|
||||
```json
|
||||
"minecraft:dweller": {
|
||||
"dwelling_type": "village",
|
||||
"dweller_role": "inhabitant",
|
||||
"can_find_poi": true
|
||||
}
|
||||
```
|
||||
|
||||
Undocumented, needed for entity to be able to sleep.
|
||||
|
||||
<CodeHeader>BP/entities/sleeping_entity.json#components</CodeHeader>
|
||||
|
||||
```json
|
||||
"minecraft:environment_sensor": {
|
||||
"triggers": [
|
||||
{
|
||||
"filters": {
|
||||
"test": "is_daytime",
|
||||
"value": false
|
||||
},
|
||||
"event": "sleep"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
This component is required for entity understand when to sleep.
|
||||
It runs event if it isn't day time.
|
||||
|
||||
:::warning
|
||||
You need some basic navigation components for your entity be able to move to bed.
|
||||
:::
|
||||
|
||||
#### Component Groups
|
||||
|
||||
Now you need some component groups for your entity with some components.
|
||||
|
||||
<CodeHeader>BP/entities/sleeping_entity.json#component_groups</CodeHeader>
|
||||
|
||||
```json
|
||||
"sleeping": {
|
||||
"minecraft:behavior.sleep": {
|
||||
"priority": 0,
|
||||
"goal_radius": 1.5,
|
||||
"speed_multiplier": 1.25,
|
||||
"sleep_collider_height": 0.3,
|
||||
"sleep_collider_width": 1,
|
||||
"sleep_y_offset": 0.6,
|
||||
"timeout_cooldown": 10
|
||||
},
|
||||
"minecraft:damage_sensor": {
|
||||
"triggers": {
|
||||
"on_damage": {
|
||||
"event": "wake_up"
|
||||
}
|
||||
}
|
||||
},
|
||||
"minecraft:environment_sensor": {
|
||||
"triggers": [
|
||||
{
|
||||
"filters": {
|
||||
"test": "is_daytime",
|
||||
"value": true
|
||||
},
|
||||
"event": "wake_up"
|
||||
}
|
||||
]
|
||||
},
|
||||
"minecraft:interact": {
|
||||
"interactions": [
|
||||
{
|
||||
"on_interact": {
|
||||
"filters": {
|
||||
"all_of": [
|
||||
{
|
||||
"test": "is_family",
|
||||
"subject": "other",
|
||||
"value": "player"
|
||||
}
|
||||
]
|
||||
},
|
||||
"event": "woken_up"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- `minecraft:behavior.sleep`
|
||||
|
||||
Determines sleep details, priority needs to be at `0` (the biggest weight).
|
||||
|
||||
- `minecraft:damage_sensor``
|
||||
|
||||
Add it if you want your entity wake up if it is being attacked.
|
||||
|
||||
- `minecraft:environment_sensor`
|
||||
|
||||
Runs `wake_up` event when it is day time.
|
||||
|
||||
- `minecraft:interact`
|
||||
|
||||
This makes player to be able wake up entity without hurting it.
|
||||
|
||||
<CodeHeader>BP/entities/sleeping_entity.json#component_groups</CodeHeader>
|
||||
|
||||
```json
|
||||
"sleep_timer": {
|
||||
"minecraft:timer": {
|
||||
"time": 15,
|
||||
"time_down_event": {
|
||||
"event": "sleep_again"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
This component group is required for entity to fall asleep again (with some delay) after it was woken up.
|
||||
|
||||
#### Events
|
||||
|
||||
Here you will find all events that you need.
|
||||
I don't really think it needs explanation.
|
||||
|
||||
<CodeHeader>BP/entities/sleeping_entity.json#events</CodeHeader>
|
||||
|
||||
```json
|
||||
"sleep": {
|
||||
"add": {
|
||||
"component_groups": [
|
||||
"sleeping"
|
||||
]
|
||||
}
|
||||
},
|
||||
"wake_up": {
|
||||
"remove": {
|
||||
"component_groups": [
|
||||
"sleeping"
|
||||
]
|
||||
}
|
||||
},
|
||||
"woken_up": {
|
||||
"remove": {
|
||||
"component_groups": [
|
||||
"sleeping"
|
||||
]
|
||||
},
|
||||
"add": {
|
||||
"component_groups": [
|
||||
"sleep_timer"
|
||||
]
|
||||
}
|
||||
},
|
||||
"sleep_again": {
|
||||
"add": {
|
||||
"component_groups": [
|
||||
"sleeping"
|
||||
]
|
||||
},
|
||||
"remove": {
|
||||
"component_groups": [
|
||||
"sleep_timer"
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Resource Pack
|
||||
|
||||
Don't forget that you need to add sleeping animation and controller for it to your entity!
|
||||
|
||||
#### Animation
|
||||
|
||||
Just copy/paste it.
|
||||
|
||||
<CodeHeader>RP/animations/sleeping_entity.animation.json</CodeHeader>
|
||||
|
||||
```json
|
||||
{
|
||||
"format_version": "1.8.0",
|
||||
"animations": {
|
||||
"animation.sleeping_entity.sleep": {
|
||||
"loop": "hold_on_last_frame",
|
||||
"animation_length": 0.5,
|
||||
"bones": {
|
||||
"body": {
|
||||
"rotation": {
|
||||
"0.0": [0, 0, 0],
|
||||
"0.5": [-90, 0, 0]
|
||||
},
|
||||
"position": [0, 2, -15]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### Animation Controller
|
||||
|
||||
Again just copy/paste it if you need.
|
||||
|
||||
<CodeHeader>RP/animations_controllers/ac.sleeping_entity.sleep.json</CodeHeader>
|
||||
|
||||
```json
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"animation_controllers": {
|
||||
"controller.animation.sleeping_entity.sleep": {
|
||||
"initial_state": "default",
|
||||
"states": {
|
||||
"default": {
|
||||
"transitions": [
|
||||
{
|
||||
"sleep": "q.is_sleeping"
|
||||
}
|
||||
]
|
||||
},
|
||||
"sleep": {
|
||||
"animations": ["sleeping"],
|
||||
"transitions": [
|
||||
{
|
||||
"default": "!q.is_sleeping"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Note that you will need to define animation in client entity like this:
|
||||
|
||||
`"sleeping": "animation.sleeping_entity.sleep"`
|
||||
|
||||
### Result
|
||||
|
||||

|
||||
|
||||
## Taking naps
|
||||
|
||||
This behavior is inspired from foxes.
|
||||
|
||||
### Features
|
||||
|
||||
- Entity sleeps when feels safe, far from mobs or when the weather is not a thunderstorm.
|
||||
- Approaching the entity will make it wake up unless it's a trusted or sneaking player, or it's another entity with the family group `sleeping_entity`.
|
||||
- If entity is hurt, it wakes up.
|
||||
|
||||
### Behavior Pack
|
||||
|
||||
In this section behavior pack components will be discussed.
|
||||
|
||||
#### Components
|
||||
|
||||
For this behavior you will need only one component:
|
||||
|
||||
<CodeHeader>BP/entities/sleeping_entity.json#components</CodeHeader>
|
||||
|
||||
```json
|
||||
"minecraft:behavior.nap": {
|
||||
"priority": 8,
|
||||
"cooldown_min": 2.0,
|
||||
"cooldown_max": 7.0,
|
||||
"mob_detect_dist": 12.0,
|
||||
"mob_detect_height": 6.0,
|
||||
"can_nap_filters": {
|
||||
"all_of": [
|
||||
{
|
||||
"test": "in_water",
|
||||
"subject": "self",
|
||||
"operator": "==",
|
||||
"value": false
|
||||
},
|
||||
{
|
||||
"test": "on_ground",
|
||||
"subject": "self",
|
||||
"operator": "==",
|
||||
"value": true
|
||||
},
|
||||
{
|
||||
"test": "is_underground",
|
||||
"subject": "self",
|
||||
"operator": "==",
|
||||
"value": true
|
||||
},
|
||||
{
|
||||
"test": "weather_at_position",
|
||||
"subject": "self",
|
||||
"operator": "!=",
|
||||
"value": "thunderstorm"
|
||||
}
|
||||
]
|
||||
},
|
||||
"wake_mob_exceptions": {
|
||||
"any_of": [
|
||||
{
|
||||
"test": "trusts",
|
||||
"subject": "other",
|
||||
"operator": "==",
|
||||
"value": true
|
||||
},
|
||||
{
|
||||
"test": "is_family",
|
||||
"subject": "other",
|
||||
"operator": "==",
|
||||
"value": "sleeping_entity"
|
||||
},
|
||||
{
|
||||
"test": "is_sneaking",
|
||||
"subject": "other",
|
||||
"operator": "==",
|
||||
"value": true
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
If you want to also use the trusting mechanic, add:
|
||||
|
||||
<CodeHeader>BP/entities/sleeping_entity.json#components</CodeHeader>
|
||||
|
||||
```json
|
||||
"minecraft:trust": {}
|
||||
```
|
||||
|
||||
### Resource Pack
|
||||
|
||||
In our resource pack you can run an animation when entity starts to sleep.
|
||||
|
||||
<CodeHeader>RP/animations_controllers/ac.sleeping_entity.sleep.json</CodeHeader>
|
||||
|
||||
```json
|
||||
{
|
||||
"format_version": "1.10.0",
|
||||
"animation_controllers": {
|
||||
"controller.animation.sleeping_entity.sleep": {
|
||||
"initial_state": "default",
|
||||
"states": {
|
||||
"default": {
|
||||
"transitions": [
|
||||
{
|
||||
"sleep": "q.is_sleeping"
|
||||
}
|
||||
]
|
||||
},
|
||||
"sleep": {
|
||||
"animations": ["sleeping"],
|
||||
"transitions": [
|
||||
{
|
||||
"default": "!q.is_sleeping"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
The last thing, you will have to create and register a sleeping animation for you entity. If you don't know how to do it check out the [BlockBench page](/guide/blockbench.html#animating).
|
||||
Reference in New Issue
Block a user