Начиная с версии 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 world, 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(world, 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 final ResourceKey<Enchantment> THUNDERING = of("thundering");
public static MapCodec<LightningEnchantmentEffect> LIGHTNING_EFFECT = register("lightning_effect", LightningEnchantmentEffect.CODEC);
private static ResourceKey<Enchantment> of(String path) {
ResourceLocation id = ResourceLocation.fromNamespaceAndPath(ExampleMod.MOD_ID, path);
return ResourceKey.create(Registries.ENCHANTMENT, id);
}
private static <T extends EnchantmentEntityEffect> MapCodec<T> register(String id, MapCodec<T> codec) {
return Registry.register(BuiltInRegistries.ENCHANTMENT_ENTITY_EFFECT_TYPE, ResourceLocation.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
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Создание чар
Теперь у нас есть эффект зачарования! Последний шаг — создать чары, которые будут применять наш собственный эффект. Хотя это можно сделать, создав файл JSON, аналогичный файлам в пакетах данных, в этом руководстве показано, как динамически генерировать JSON с помощью инструментов генерации данных Fabric. Для начала создайте класс EnchantmentGenerator.
В этом классе мы сначала зарегистрируем новое зачарование, а затем воспользуемся методом configure() для программного создания нашего JSON.
java
Not Found: /opt/build/repo/reference/latest/src/client/java/com/example/docs/datagen/EnchantmentGenerator.java1
Прежде чем продолжить, вам следует убедиться, что ваш проект настроен для генерации данных; если вы не уверены, просмотрите соответствующую страницу документации.
Наконец, мы должны указать нашему моду добавить наш EnchantmentGenerator в список задач генерации данных. Для этого просто добавьте EnchantmentGenerator внутри метода onInitializeDataGenerator.
java
pack.addProvider(ExampleModEnchantmentGenerator::new);1
Теперь, когда вы запускаете задачу генерации данных вашего мода, JSON-файлы чар будут генерироваться внутри папки generated. Пример можно увидеть ниже:
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.ExampleMod.thundering": "Thundering",1
Теперь у вас должен быть рабочий эффект зачарования! Проверьте это, зачаровав оружие чарами и ударив моба. Пример приведен в следующем видео:

