ПЕРЕДУМОВИ
Спершу переконайтеся, що ви виконали процес налаштування datagen.
Налаштування
Перед реалізацією генератора створіть пакет enchantment в основному вихідному наборі та додайте до нього клас ModEnchantments. Потім додайте метод key до цього нового класу.
java
private static ResourceKey<Enchantment> key(String path) {
Identifier id = Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, path);
return ResourceKey.create(Registries.ENCHANTMENT, id);
}1
2
3
4
2
3
4
Використовуйте цей метод, аби створити ResourceKey для свого зачарування.
java
public static final ResourceKey<Enchantment> THUNDERING = key("thundering");1
Тепер ми готові додати генератор. У пакеті datagen створіть клас, який розширює FabricDynamicRegistryProvider. До цього щойно створеного класу додайте конструктор, який відповідає super, і реалізуйте методи configure і getName.
java
public class ExampleModEnchantmentGenerator extends FabricDynamicRegistryProvider {
public ExampleModEnchantmentGenerator(FabricDataOutput output, CompletableFuture<HolderLookup.Provider> registriesFuture) {
super(output, registriesFuture);
}
@Override
protected void configure(HolderLookup.Provider registries, Entries entries) {
entries.addAll(registries.lookupOrThrow(Registries.ENCHANTMENT)); // Add all bootstrapped enchantments for the current mod id
}
@Override
public String getName() {
return "Enchantments";
}
}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
Потім додайте допоміжний метод register до новоствореного класу.
java
private static void register(BootstrapContext<Enchantment> context, ResourceKey<Enchantment> key, Enchantment.Builder builder) {
context.register(key, builder.build(key.identifier()));
}1
2
3
2
3
Тепер додайте метод bootstrap. Тут ми будемо реєструвати зачарування, які хочемо додати до гри.
java
public static void bootstrap(BootstrapContext<Enchantment> context) {
// ...
}1
2
3
2
3
У вашій DataGeneratorEntrypoint перевизначте метод buildRegistry і зареєструйте наш початковий метод.
java
@Override
public void buildRegistry(RegistrySetBuilder registryBuilder) {
registryBuilder.add(Registries.ENCHANTMENT, ExampleModEnchantmentGenerator::bootstrap);
}1
2
3
4
2
3
4
Нарешті переконайтеся, що ваш новий генератор зареєстровано в методі onInitializeDataGenerator.
java
pack.addProvider(ExampleModEnchantmentGenerator::new);1
Створення зачарування
Щоб створити визначення для нашого спеціального зачарування, ми використаємо метод register у нашому класі генератора.
Зареєструйте своє зачарування в методі bootstrap генератора, використовуючи зачарування, зареєстроване в ModEnchantments.
У цьому прикладі ми будемо використовувати ефект зачарування, створений у власних ефектах зачарування, але ви також можете використовувати стандартні ефекти зачарування.
java
register(context, ModEnchantments.THUNDERING,
Enchantment.enchantment(
Enchantment.definition(
context.lookup(Registries.ITEM).getOrThrow(ItemTags.WEAPON_ENCHANTABLE), // The items this enchantment can be applied to
10, // The weight / probability of our enchantment being available in the enchanting table
3, // The max level of the enchantment
Enchantment.dynamicCost(1, 10), // The base minimum cost of the enchantment, and the additional cost for every level
Enchantment.dynamicCost(1, 15), // Same as the other dynamic cost, but for the maximum instead
5, // The cost to apply the enchantment in an anvil, in levels
EquipmentSlotGroup.HAND // The slot types in which this enchantment will be able to apply its effects
)
)
.withEffect(
EnchantmentEffectComponents.POST_ATTACK, // The type of effect to be applied
EnchantmentTarget.ATTACKER, // The target to be checked for the enchantment
EnchantmentTarget.VICTIM, // The target to apply the enchantment effect to
new LightningEnchantmentEffect(LevelBasedValue.perLevel(0.4f, 0.2f))
)
);1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Тепер просто запустіть генерацію даних, і ваше нове зачарування стане доступним у грі!
Умови ефекту
Більшість типів ефектів зачарування є умовними. Додаючи ці ефекти, можна передати умови виклику withEffect.
INFO
Щоб отримати огляд доступних типів умов та їх використання, перегляньте клас Enchantments.
java
.withEffect(
// ...
LootItemEntityPropertyCondition.hasProperties(
LootContext.EntityTarget.ATTACKER,
EntityPredicate.Builder.entity().flags(
EntityFlagsPredicate.Builder.flags().setIsFlying(false)
)
)
)1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Кілька ефектів
withEffect можна об'єднати, щоб додати кілька ефектів зачарування до одного зачарування. Однак цей метод вимагає від вас вказати умови ефекту для кожного ефекту.
Щоб натомість поділитися визначеними умовами та цілями між кількома ефектами, можна використати AllOf, щоб об’єднати їх в один ефект.
java
AllOf.entityEffects(
new ApplyEntityImpulse(new Vec3(0, 0.2, -1), new Vec3(1, 1, 1), LevelBasedValue.perLevel(0.7f, 0.2f)),
new PlaySoundEffect(List.of(SoundEvents.LUNGE_1), ConstantFloat.of(5), ConstantFloat.of(1))
),1
2
3
4
2
3
4
Зауважте, що спосіб використання залежить від типу ефекту, який додається. Наприклад, EnchantmentValueEffect вимагає натомість AnyOf.valueEffects. Різні типи ефектів все ще потребують додаткових викликів withEffect.
Стіл зачарування
Хоча ми вказали вагу зачарування (або ймовірність) у нашому визначенні зачарування, воно не показуватиметься в столі зачарувань усталено. Аби нашими зачаруванням могли торгувати селяни та з’являтися в столі зачарування, нам потрібно додати їх до теґу non_treasure.
Для цього ми можемо створити постачальник теґів. Створіть клас, який розширює FabricTagProvider<Enchantment> в пакеті datagen. Потім запровадьте конструктор із Registries.ENCHANTMENT як параметр registryKey до super і створіть метод addTags.
java
public class ExampleModEnchantmentTagProvider extends FabricTagProvider<Enchantment> {
public ExampleModEnchantmentTagProvider(FabricDataOutput output, CompletableFuture<HolderLookup.Provider> registriesFuture) {
super(output, Registries.ENCHANTMENT, registriesFuture);
}
@Override
protected void addTags(HolderLookup.Provider wrapperLookup) {
// ...
}1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
Тепер ми можемо додати наше зачарування до EnchantmentTags.NON_TREASURE, викликавши конструктор із методу addTags.
java
builder(EnchantmentTags.NON_TREASURE).add(ModEnchantments.THUNDERING);1
Прокляття
Прокляття також реалізуються за допомогою теґів. Ми можемо використати постачальник теґів із розділу стола зачарування.
У методі addTags просто додайте своє зачарування до теґу CURSE, щоб позначити його як прокляття.
java
builder(EnchantmentTags.CURSE).add(ModEnchantments.REPULSION_CURSE);1

