Пользовательские эффекты чар 26.1.2
Узнайте, как создавать эффекты чар.
Начиная с версии 1.21, пользовательские чары в Minecraft используют подход, "управляемый данными". Это упрощает добавление простых чар, таких как увеличение урона от атаки, но усложняет создание сложных. Этот процесс включает в себя разбиение чар на компоненты эффекта.
Компонент эффекта содержит код, определяющий специальные эффекты чар. Minecraft поддерживает различные эффекты по умолчанию, такие как повреждение предметов, отбрасывание и опыт.
TIP
Обязательно проверьте, удовлетворяют ли эффекты Minecraft по умолчанию вашим потребностям, посетив страницу компонентов эффектов зачарования Minecraft Wiki. В этом руководстве предполагается, что вы понимаете, как настраивать «простые» чары, управляемые данными, и основное внимание уделяется созданию пользовательских эффектов чар, которые не поддерживаются по умолчанию.
Пользовательские эффекты чар
Начните с создания папки enchantment, а внутри неё создайте папку effect. Внутри этого мы создадим запись LightningEnchantmentEffect.
Далее мы можем создать конструктор и переопределить методы интерфейса EnchantmentEntityEffect. Мы также создадим переменную CODEC для кодирования и декодирования нашего эффекта; вы можете прочитать больше о кодеках здесь.
Большая часть нашего кода будет передана в событие apply(), которое вызывается, когда выполняются критерии для работы вашего зачарования. Позже мы настроим этот Эффект, чтобы он вызывался при ударе по объекту, а сейчас давайте напишем простой код для поражения цели молнией.
java
public record LightningEnchantmentEffect(LevelBasedValue amount) implements EnchantmentEntityEffect {
public static final MapCodec<LightningEnchantmentEffect> CODEC = RecordCodecBuilder.mapCodec(instance ->
instance.group(
LevelBasedValue.CODEC.fieldOf("amount").forGetter(LightningEnchantmentEffect::amount)
).apply(instance, LightningEnchantmentEffect::new)
);
@Override
public void apply(ServerLevel serverLevel, int level, EnchantedItemInUse context, Entity target, Vec3 pos) {
if (target instanceof LivingEntity victim) {
if (context.owner() != null && context.owner() instanceof Player player) {
float numStrikes = this.amount.calculate(level);
for (float i = 0; i < numStrikes; i++) {
BlockPos position = victim.blockPosition();
EntityType.LIGHTNING_BOLT.spawn(serverLevel, position, EntitySpawnReason.TRIGGERED);
}
}
}
}
@Override
public MapCodec<? extends EnchantmentEntityEffect> codec() {
return CODEC;
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Здесь переменная amount указывает значение, масштабированное до уровня зачарования. Мы можем использовать это, чтобы изменить эффективность зачарования в зависимости от уровня. В приведенном выше коде мы используем уровень чар, чтобы определить, сколько ударов молнии будет вызвано.
Регистрация эффекта зачарования
Как и любой другой компонент вашего мода, нам придется добавить этот EnchantmentEffect в реестр Minecraft. Для этого добавьте класс ModEnchantmentEffects (или назовите его как хотите) и вспомогательный метод для регистрации чар. Обязательно вызовите registerModEnchantmentEffects() в вашем основном классе, который содержит метод onInitialize().
java
public class ModEnchantmentEffects {
public static MapCodec<LightningEnchantmentEffect> LIGHTNING_EFFECT = register("lightning_effect", LightningEnchantmentEffect.CODEC);
private static <T extends EnchantmentEntityEffect> MapCodec<T> register(String id, MapCodec<T> codec) {
return Registry.register(BuiltInRegistries.ENCHANTMENT_ENTITY_EFFECT_TYPE, Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, id), codec);
}
public static void registerModEnchantmentEffects() {
ExampleMod.LOGGER.info("Registering EnchantmentEffects for" + ExampleMod.MOD_ID);
}
}1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
Создание зачарования
Теперь у нас есть эффект зачарования! Последний шаг — создать чары, которые будут применять наш собственный эффект. Сделать это можно через систему зачарований на основе данных, просто добавив JSON-файл в папку resources.
Создайте JSON-файл в папке data/example-mod/enchantment. Имя этого файла будет совпадать с идентификатором вашего зачарования: thundering.json превратится в example-mod:thundering.
INFO
Более подробную информацию о формате файла можно найти на странице Minecraft Wiki — Описание зачарований.
Чтобы быстро создать зачарование, вы можете воспользоваться генератором Misode.
В этом примере мы воспользуемся следующим описанием зачарования, чтобы добавить зачарование thundering с использованием нашего пользовательского эффекта lightning_effect:
json
{
"anvil_cost": 5,
"description": {
"translate": "enchantment.example-mod.thundering"
},
"effects": {
"minecraft:post_attack": [
{
"affected": "victim",
"effect": {
"type": "example-mod:lightning_effect",
"amount": {
"type": "minecraft:linear",
"base": 0.4,
"per_level_above_first": 0.2
}
},
"enchanted": "attacker"
}
]
},
"max_cost": {
"base": 1,
"per_level_above_first": 15
},
"max_level": 3,
"min_cost": {
"base": 1,
"per_level_above_first": 10
},
"slots": [
"hand"
],
"supported_items": "#minecraft:enchantable/weapon",
"weight": 10
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Вам также следует добавить переводы в файл en_us.json, чтобы дать вашему зачарованию читаемое имя:
json
"enchantment.example-mod.thundering": "Thundering",1
Теперь у вас должен быть рабочий эффект зачарования! Проверьте это, зачаровав оружие чарами и ударив моба. Пример приведен в следующем видео:


