VORAUSSETZUNGEN
Stelle sicher, dass du den Prozess der Einrichtung des Datengenerators zuerst abgeschlossen hast.
Einrichtung
Bevor du den Generator implementierst, erstelle das Paket enchantment im Hauptquellensatz und füge die Klasse ModEnchantments zu diesem hinzu. Dann füge die Methode key zu dieser neuen Klasse hinzu.
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
Nutze diese Methode, um einen ResourceKey für deine Verzauberung zu erstellen.
java
public static final ResourceKey<Enchantment> THUNDERING = key("thundering");1
Jetzt sind wir bereit, den Generator hinzuzufügen. Erstelle im Paket datagen eine Klasse, die von FabricDynamicRegistryProvider erbt. Füge in diese neu erstellte Klasse einen Konstruktor hinzu, der mit super übereinstimmt, und implementiere die Methoden configure und 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
Füge dann eine Hilfsmethode register zu der neu erstellen Klasse hinzu.
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
Füge jetzt die Methode bootstrap hinzu. Hier werden wir die Verzauberungen registrieren, die wir zum Spiel hinzufügen wollen.
java
public static void bootstrap(BootstrapContext<Enchantment> context) {
// ...
}1
2
3
2
3
Überschreibe in deinem DataGeneratorEntrypoint die Methode buildRegistry und registriere unsere Methode bootstrap.
java
@Override
public void buildRegistry(RegistrySetBuilder registryBuilder) {
registryBuilder.add(Registries.ENCHANTMENT, ExampleModEnchantmentGenerator::bootstrap);
}1
2
3
4
2
3
4
Stelle schließlich sicher, dass dein neuer Generator innerhalb der Methode onInitializeDataGenerator registriert ist.
java
pack.addProvider(ExampleModEnchantmentGenerator::new);1
Die Verzauberung erstellen
Um die Definition für unsere benutzerdefinierte Verzauberung zu erstellen, verwenden wir die Methode register in unserer Generator-Klasse.
Registriere deine Verzauberung in der Methode bootstrap des Generators unter Verwendung der in ModEnchantments registrierten Verzauberung.
In diesem Beispiel verwenden wir den in Benutzerdefinierte Verzauberungseffekte erstellten Verzauberungseffekt, aber du kannst auch die Vanilla Verzauberungseffekte verwenden.
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
Führen nun einfach die Datengenerierung aus, und deine neue Verzauberung wird im Spiel verfügbar sein!
Effektbedingungen
Die meisten Verzauberungseffekte sind bedingte Effekte. Beim Hinzufügen dieser Effekte ist es möglich, Bedingungen an den Aufruf von withEffect zu übergeben.
INFO
Eine Übersicht über die verfügbaren Zustandstypen und deren Verwendung findest du in der Klasse Enchantments (https://mcsrc.dev/#1/1.21.11_unobfuscated/net/minecraft/world/item/enchantment/Enchantments#L126).
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
Mehrere Effekte
withEffect kann verkettet werden, um einer einzelnen Verzauberung mehrere Verzauberungseffekte hinzuzufügen. Bei dieser Methode musst du jedoch die Effektbedingungen für jeden Effekt angeben.
Um stattdessen die definierten Bedingungen und Ziele über mehrere Effekte hinweg zu teilen, kann AllOf verwendet werden, um sie zu einem einzigen Effekt zusammenzufassen.
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
Beachte, dass die zu verwendende Methode vom Typ des hinzugefügten Effekts abhängt. Zum Beispiel benötigt EnchantmentValueEffect stattdessen AnyOf.valueEffects. Unterschiedliche Effekt-Typen erfordern weiterhin zusätzliche Aufrufe von withEffect.
Verzauberungstisch
Obwohl wir das Gewicht der Verzauberung (oder die Wahrscheinlichkeit) in unserer Verzauberungsdefinition angegeben haben, wird es standardmäßig nicht im Zaubertisch angezeigt. Damit unsere Verzauberung von Dorfbewohnern gehandelt werden kann und im Zaubertisch erscheint, müssen wir sie zum Tag non_treasure hinzufügen.
Dazu können wir einen Tag Provider erstellen. Erstelle in dem Paket datagen eine Klasse, die von FabricTagProvider<Enchantment> erbt. Implementiere dann den Konstruktor mit Registries.ENCHANTMENT als Parameter registryKey für super und erstelle die Methode 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
Wir können jetzt unsere Verzauberung zu EnchantmentTags.NON_TREASURE hinzufügen, indem wir den Builder aus der Methode addTags heraus aufrufen.
java
builder(EnchantmentTags.NON_TREASURE).add(ModEnchantments.THUNDERING);1
Flüche
Flüche werden auch mit Tags implementiert. Wir können den Tag Provider aus dem Abschnitt der Zaubertisch verwenden.
Füge in der Methode addTags einfach deine Verzauberung zum Tag CURSE hinzu, um sie als Fluch zu kennzeichnen.
java
builder(EnchantmentTags.CURSE).add(ModEnchantments.REPULSION_CURSE);1

