🇺🇦 Українська (Ukrainian - Ukraine)
🇺🇦 Українська (Ukrainian - Ukraine)
Зовнішній вигляд
🇺🇦 Українська (Ukrainian - Ukraine)
🇺🇦 Українська (Ukrainian - Ukraine)
Зовнішній вигляд
Ця сторінка написана для версії:
1.21.4
Ця сторінка написана для версії:
1.21.4
Починаючи з версії 1.21, спеціальні зачарування в Minecraft використовують підхід, керований даними. Це полегшує додавання простих зачарувань, як-от збільшення шкоди від атаки, але ускладнює створення складних. Процес передбачає розбиття чар на компоненти ефекту.
Компонент ефекту містить код, який визначає спеціальні ефекти зачарування. Minecraft підтримує різні стандартні ефекти, такі як пошкодження предметів, відкидання та досвід.
TIP
Обов’язково перевірте, чи стандартні ефекти Minecraft задовольняють ваші потреби, відвідавши сторінку компонентів ефектів зачарування Minecraft Wiki. У цьому посібнику передбачається, що ви розумієте, як налаштувати «прості» зачарування, керовані даними, і зосереджено на створенні спеціальних ефектів зачарування, які не підтримуються за замовчуванням.
Почніть зі створення теки enchantment
, а в ній створіть теку effect
. У цьому випадку ми створимо запис LightningEnchantmentEffect
.
Далі ми можемо створити конструктор і перевизначити методи інтерфейсу EnchantmentEntityEffect
. Ми також створимо змінну CODEC
для кодування та декодування нашого ефекту; ви можете прочитати більше про кодеки тут.
Основна частина нашого коду буде передана в подію apply()
, яка викликається, коли виконується критерій для роботи вашого зачарування. Пізніше ми налаштуємо цей Effect
, щоб він викликався, коли сутність уражена, а поки що напишімо простий код, щоб вразити ціль блискавкою.
public record LightningEnchantmentEffect(EnchantmentLevelBasedValue amount) implements EnchantmentEntityEffect {
public static final MapCodec<LightningEnchantmentEffect> CODEC = RecordCodecBuilder.mapCodec(instance ->
instance.group(
EnchantmentLevelBasedValue.CODEC.fieldOf("amount").forGetter(LightningEnchantmentEffect::amount)
).apply(instance, LightningEnchantmentEffect::new)
);
@Override
public void apply(ServerWorld world, int level, EnchantmentEffectContext context, Entity target, Vec3d pos) {
if (target instanceof LivingEntity victim) {
if (context.owner() != null && context.owner() instanceof PlayerEntity player) {
float numStrikes = this.amount.getValue(level);
for (float i = 0; i < numStrikes; i++) {
BlockPos position = victim.getBlockPos();
EntityType.LIGHTNING_BOLT.spawn(world, position, SpawnReason.TRIGGERED);
}
}
}
}
@Override
public MapCodec<? extends EnchantmentEntityEffect> getCodec() {
return CODEC;
}
}
Тут змінна amount
вказує на значення, масштабоване до рівня зачарування. Ми можемо використовувати це, щоб змінити ефективність зачарування залежно від рівня. У коді вище ми використовуємо рівень зачарування, щоб визначити, скільки ударів блискавки породжується.
Як і будь-який інший компонент вашого мода, нам доведеться додати цей EnchantmentEffect
до реєстру Minecraft. Для цього додайте клас ModEnchantmentEffects
(або будь-яку іншу назву) і допоміжний метод для реєстрації зачарування. Обов’язково викликайте registerModEnchantmentEffects()
у вашому головному класі, який містить метод onInitialize()
.
public class ModEnchantmentEffects {
public static final RegistryKey<Enchantment> THUNDERING = of("thundering");
public static MapCodec<LightningEnchantmentEffect> LIGHTNING_EFFECT = register("lightning_effect", LightningEnchantmentEffect.CODEC);
private static RegistryKey<Enchantment> of(String path) {
Identifier id = Identifier.of(FabricDocsReference.MOD_ID, path);
return RegistryKey.of(RegistryKeys.ENCHANTMENT, id);
}
private static <T extends EnchantmentEntityEffect> MapCodec<T> register(String id, MapCodec<T> codec) {
return Registry.register(Registries.ENCHANTMENT_ENTITY_EFFECT_TYPE, Identifier.of(FabricDocsReference.MOD_ID, id), codec);
}
public static void registerModEnchantmentEffects() {
FabricDocsReference.LOGGER.info("Registering EnchantmentEffects for" + FabricDocsReference.MOD_ID);
}
}
Тепер у нас є ефект зачарування! Останнім кроком є створення зачарування, яке застосовує наш спеціальний ефект. Хоча це можна зробити, створивши файл JSON, подібний до файлів у пакетах даних, цей посібник покаже вам, як динамічно генерувати JSON за допомогою інструментів генерації даних Fabric. Для початку створіть клас EnchantmentGenerator
.
У цьому класі ми спочатку зареєструємо нове зачарування, а потім використаємо метод configure() для програмного створення JSON.
public class EnchantmentGenerator extends FabricDynamicRegistryProvider {
public EnchantmentGenerator(FabricDataOutput output, CompletableFuture<RegistryWrapper.WrapperLookup> registriesFuture) {
super(output, registriesFuture);
System.out.println("REGISTERING ENCHANTS");
}
@Override
protected void configure(RegistryWrapper.WrapperLookup registries, Entries entries) {
// Our new enchantment, "Thundering."
register(entries, ModEnchantmentEffects.THUNDERING, Enchantment.builder(
Enchantment.definition(
registries.getOrThrow(RegistryKeys.ITEM).getOrThrow(ItemTags.WEAPON_ENCHANTABLE),
// this is the "weight" or probability of our enchantment showing up in the table
10,
// the maximum level of the enchantment
3,
// base cost for level 1 of the enchantment, and min levels required for something higher
Enchantment.leveledCost(1, 10),
// same fields as above but for max cost
Enchantment.leveledCost(1, 15),
// anvil cost
5,
// valid slots
AttributeModifierSlot.HAND
)
)
.addEffect(
// enchantment occurs POST_ATTACK
EnchantmentEffectComponentTypes.POST_ATTACK,
EnchantmentEffectTarget.ATTACKER,
EnchantmentEffectTarget.VICTIM,
new LightningEnchantmentEffect(EnchantmentLevelBasedValue.linear(0.4f, 0.2f)) // scale the enchantment linearly.
)
);
}
private void register(Entries entries, RegistryKey<Enchantment> key, Enchantment.Builder builder, ResourceCondition... resourceConditions) {
entries.add(key, builder.build(key.getValue()), resourceConditions);
}
@Override
public String getName() {
return "ReferenceDocEnchantmentGenerator";
}
}
Перш ніж продовжити, ви повинні переконатися, що ваш проєкт налаштовано для створення даних; якщо ви не впевнені, перегляньте відповідну сторінку документів.
Нарешті, ми повинні сказати нашому моду додати наш EnchantmentGenerator
до списку завдань генерації даних. Для цього просто додайте EnchantmentGenerator
до цього всередині методу onInitializeDataGenerator
.
Тепер, коли ви запускаєте завдання генерації даних вашого мода, у теці generated
будуть створені JSON-файли зачарувань. Приклад можна побачити нижче:
{
"anvil_cost": 5,
"description": {
"translate": "enchantment.fabric-docs-reference.thundering"
},
"effects": {
"minecraft:post_attack": [
{
"affected": "victim",
"effect": {
"type": "fabric-docs-reference: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
}
Ви також повинні додати переклади до свого файлу en_us.json
(для української створіть uk_ua.json
), щоб надати своєму зачаруванню читабельну назву:
"enchantment.FabricDocsReference.thundering": "Thundering",
Тепер у вас повинен бути робочий спеціальний ефект зачарування! Перевірте це, зачарувавши зброю за допомогою чар і вдаривши мобу. Приклад наведено в наступному відео: