Типы урона 26.1.2
Узнайте, как добавлять пользовательские типы урона.
Типы урона определяют типы повреждений, которые могут получить сущности. Начиная с Minecraft 1.19.4, создание новых типов урона стало управляться данными, то есть они создаются с использованием файлов JSON.
Создание типа урона
Давайте создадим собственный тип повреждений под названием Tater. Начнем с создания JSON-файла для вашего индивидуального типа урона. Этот файл будет помещён в директорию вашего мода: data, в подпапку с названием damage_type.
text
resources/data/example-mod/damage_type/tater.jsonОн имеет следующую структуру:
json
{
"exhaustion": 0.1,
"message_id": "tater",
"scaling": "when_caused_by_living_non_player"
}1
2
3
4
5
2
3
4
5
Этот пользовательский тип урона увеличивает истощение голодом на 0,1 каждый раз, когда игрок получает урон, когда урон наносится живым, неигровым источником (например, блоком). Кроме того, количество нанесенного урона будет масштабироваться в зависимости от сложности мира
INFO
Все возможные ключи и значения можно найти на Minecraft Wiki.
Доступ к типам урона через код
Когда нам понадобится получить доступ к нашему пользовательскому типу урона через код, мы будем использовать его ResourceKey для создания экземпляра DamageSource.
Получить ResourceKey можно следующим образом:
java
public static final ResourceKey<DamageType> TATER_DAMAGE = ResourceKey.create(Registries.DAMAGE_TYPE, Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, "tater"));1
Использование типов урона
Чтобы продемонстрировать использование пользовательских типов урона, мы будем использовать пользовательский блок под названием Tater Block. Давайте сделаем так, что когда живое существо наступает на Tater Block, оно наносит Tater урон.
Вы можете переопределить метод stepOn, чтобы наносить этот урон.
Начнем с создания DamageSource нашего пользовательского типа урона.
java
DamageSource damageSource = new DamageSource(
level.registryAccess()
.lookupOrThrow(Registries.DAMAGE_TYPE)
.get(ExampleModDamageTypes.TATER_DAMAGE.identifier()).orElseThrow());1
2
3
4
2
3
4
Затем вызываем метод entity.hurtServer(), передавая текущий игровой мир, источник DamageSource и количество урона.
java
entity.hurtServer(serverLevel, damageSource, 5.0f);1
Полная реализация блока:
java
public class TaterBlock extends Block {
public TaterBlock(Properties settings) {
super(settings);
}
@Override
public void stepOn(Level level, BlockPos pos, BlockState state, Entity entity) {
if (entity instanceof LivingEntity && level instanceof ServerLevel serverLevel) {
DamageSource damageSource = new DamageSource(
level.registryAccess()
.lookupOrThrow(Registries.DAMAGE_TYPE)
.get(ExampleModDamageTypes.TATER_DAMAGE.identifier()).orElseThrow());
entity.hurtServer(serverLevel, damageSource, 5.0f);
}
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Теперь, когда живое существо наступит на наш блок, оно получит 5 единиц урона (2,5 сердца) с использованием нашего типа урона.
Пользовательское сообщение о смерти
Вы можете определить сообщение о смерти для типа урона в формате death.attack.message_id в файле en_us.json.
json
{
"death.attack.tater": "%1$s died from Tater damage!"
}1
2
3
2
3
После смерти от нашего типа урона вы увидите следующее сообщение о смерти:

Теги типа урона
Некоторые виды урона могут игнорировать броню, эффекты мобов и т. п. Теги используются для управления этими свойствами типов урона.
Существующие теги типов урона можно найти в data/minecraft/tags/damage_type.
INFO
Полный список тегов типов урона см. на Minecraft Wiki.
Давайте добавим наш тип урона Tater к тегу типа урона bypasses_armor.
Чтобы добавить наш тип урона к одному из этих тегов, мы создаем JSON-файл в пространстве имен minecraft.
text
data/minecraft/tags/damage_type/bypasses_armor.jsonСо следующим содержанием:
json
{
"values": [
"example-mod:tater"
]
}1
2
3
4
5
2
3
4
5
Убедитесь, что ваш тег не заменяет существующий тег, установив ключ replace в значение false.


