Починаючи з версії 1.21, спеціальні зачарування в Minecraft використовують підхід, керований даними. Це полегшує додавання простих зачарувань, як-от збільшення шкоди від атаки, але ускладнює створення складних. Процес передбачає розбиття чар на компоненти ефекту.
Компонент ефекту містить код, який визначає спеціальні ефекти зачарування. Minecraft підтримує різні стандартні ефекти, такі як пошкодження предметів, відкидання та досвід.
TIP
Обов’язково перевірте, чи стандартні ефекти Minecraft задовольняють ваші потреби, відвідавши сторінку компонентів ефектів зачарування Вікі Minecraft. У цьому посібнику передбачається, що ви розумієте, як налаштувати «прості» зачарування, керовані даними, і зосереджено на створенні спеціальних ефектів зачарування, які не підтримуються усталено.
Власні ефекти зачарування
Почніть зі створення теки enchantment, а в ній створіть теку effect. У цьому випадку ми створимо запис LightningEnchantmentEffect.
Далі ми можемо створити конструктор і перевизначити методи інтерфейсу EnchantmentEntityEffect. Ми також створимо змінну CODEC для кодування та декодування нашого ефекту; ви можете прочитати більше про кодеки тут.
Основна частина нашого коду буде передана в подію apply(), яка викликається, коли виконується критерій для роботи вашого зачарування. Пізніше ми налаштуємо цей Effect, щоб він викликався, коли сутність уражена, а поки що напишімо простий код, щоб вразити ціль блискавкою.
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
27
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
Тут змінна 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
12
2
3
4
5
6
7
8
9
10
11
12
Створення зачарування
Тепер у нас є ефект зачарування! Останнім кроком є створення зачарування, яке застосовує наш спеціальний ефект. Ми можемо зробити це за допомогою керованої даними системи зачарування, просто додавши файл JSON до ресурсів нашого мода.
Створіть файл JSON у теці data/example-mod/enchantments. Ім’я цього файлу буде ID зачарування: thundering.json стане example-mod:thundering.
INFO
Щоб дізнатися більше про формат файлу, ознайомтеся з визначеннями зачарувань на Вікі Minecraft.
Аби швидко створити власні зачарування, ви можете скористатися генератором 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 (для української створіть uk_ua.json), щоб надати своєму зачаруванню читабельну назву:
json
"enchantment.example-mod.thundering": "Thundering",1
Тепер у вас повинен бути робочий спеціальний ефект зачарування! Перевірте це, зачарувавши зброю за допомогою чар і вдаривши моба. Приклад наведено в наступному відео:


