Description
# Stamina Attributes
This API adds a stamina system controlled by entity attributes.
## Default implementation
LivingEntities can have up to **_staminaattributes:max_stamina_** amounts of stamina. Stamina is regenerated by **_staminaattributes:stamina_regeneration_** every **_staminaattributes:stamina_tick_threshold_** ticks.
When stamina is reduced, regeneration is stopped for **_staminaattributes:stamina_regeneration_delay_threshold_** ticks.
When stamina is <= 0, regeneration is stopped for **_staminaattributes:depleted_stamina_regeneration_delay_threshold_** ticks.
**_staminaattributes:reserved_stamina_** describes the percentage amount of maximum stamina that is currently not available.
**_staminaattributes:item_use_stamina_cost_** is the amount of stamina that is reduced when using an item with a stamina cost.
There are two ways to give an item a stamina cost:
1. Items in the "staminaattributes:using_costs_stamina" item tag reduce stamina by **_staminaattributes:item_use_stamina_cost_**
when they are used once. When stamina is < 0 the use action is not performed. In that case the item gets a cooldown,
configured in the server config.
2. Items in the "staminaattributes:continuous_using_costs_stamina" item tag reduce stamina by **_staminaattributes:item_use_stamina_cost_** every tick while they are used. When stamina is < 0, the usage is cancelled. In
that case the item gets a cooldown, configured in the server config.
The different **_staminaattributes:\*\_tick_stamina_cost_** attributes describe the stamina cost for the corresponding activity. This cost is
applied every tick (20x per second). This includes the following activities:
- sprinting
- sneaking
- walking
- swimming
- walking underwater
- walking in water
- climbing
The different **_staminaattributes:\*\_action_stamina_cost_** attributes describe the stamina cost for the corresponding actions. This cost is
applied once every time the action is performed. This includes the following actions:
- jumping
- sprint jumping
- attack blocking
- attacking
- block breaking
Several activities and actions can be configured to require stamina. If stamina is 0 or lower, they can't be performed.
This includes:
- jumping
- sprinting
- swimming
- attacking
- block breaking
- attacking
- attack blocking
Blocks that can be broken instantly by hand (blocks with a "destroyTime" of 0) can be excluded from the stamina
requirement.
### Exhaustion
If a player has 0 or less stamina, they are exhausted, which means that a status effect is applied. This status effect
is defined in the server config.
This feature can be enabled in the server config, but it's disabled by default.
### Default attribute values
- **_staminaattributes:max_stamina_**: 10 (10 for players)
- **_staminaattributes:stamina_regeneration_**: 0 (1 for players)
- **_staminaattributes:stamina_tick_threshold_**: 20
- **_staminaattributes:stamina_regeneration_delay_threshold_**: 20
- **_staminaattributes:depleted_stamina_regeneration_delay_threshold_**: 60
- **_staminaattributes:reserved_stamina_**: 0
- **_staminaattributes:item_use_stamina_cost_**: 0 (0.05 for players)
- **_staminaattributes:sprinting_tick_stamina_cost_**: 0 (0.05 for players)
- **_staminaattributes:sneaking_tick_stamina_cost_**: 0 (0.05 for players)
- **_staminaattributes:walking_tick_stamina_cost_**: 0
- **_staminaattributes:swimming_tick_stamina_cost_**: 0 (0.05 for players)
- **_staminaattributes:walking_underwater_tick_stamina_cost_**: 0 (0.05 for players)
- **_staminaattributes:walking_in_water_tick_stamina_cost_**: 0 (0.05 for players)
- **_staminaattributes:climbing_tick_stamina_cost_**: 0 (0.05 for players)
- **_staminaattributes:jumping_action_stamina_cost_**: 0 (1 for players)
- **_staminaattributes:sprint_jumping_action_stamina_cost_**: 0 (1 for players)
- **_staminaattributes:attack_blocking_action_stamina_cost_**: 0 (1 for players)
- **_staminaattributes:attacking_action_stamina_cost_**: 0 (1 for players)
- **_staminaattributes:block_breaking_action_stamina_cost_**: 0 (1 for players)
All default values for players can be set in the server config.
### Default item tags
"staminaattributes:using_costs_stamina":
```json
{
"values": [
"minecraft:snowball"
]
}
```
"staminaattributes:continuous_using_costs_stamina":
```json
{
"values": [
"minecraft:bow",
"minecraft:crossbow",
"minecraft:shield"
]
}
```
## Customization
The client config allows customizing the HUD element.
## Using the stamina system
### Java
Casting a "LivingEntity" to the "StaminaUsingEntity" interface gives access to all relevant methods.
### Data packs
Stamina Attributes implements several data driven methods to interact with the current stamina value of an entity.
- the "staminaattributes:add_stamina" enchantment effect allows adding a defined amount to the current stamina
- the "staminaattributes:stamina_using_entity" entity sub predicate passes when the current stamina of an entity matches
the defined range
#### Example
This enchantment reduces stamina of the attacker by 2, as long as the attacker has at least 5 stamina:
```json
{
"anvil_cost": 1,
"description": {
"translate": "enchantment.staminaattributes.test"
},
"effects": {
"minecraft:post_attack": [
{
"affected": "attacker",
"effect": {
"type": "staminaattributes:add_stamina",
"amount": {
"type": "minecraft:linear",
"base": -2.0,
"per_level_above_first": -2.0
}
},
"enchanted": "attacker",
"requirements": {
"condition": "minecraft:entity_properties",
"entity": "direct_attacker",
"predicate": {
"type_specific": {
"type": "staminaattributes:stamina_using_entity",
"stamina_amount": {
"min": 5.0
}
}
}
}
}
]
},
"max_cost": {
"base": 25,
"per_level_above_first": 8
},
"max_level": 1,
"min_cost": {
"base": 5,
"per_level_above_first": 8
},
"slots": [
"hand"
],
"supported_items": "#minecraft:swords",
"weight": 5
}
```