Ab der Version 1.21 verwenden benutzerdefinierte Verzauberungen in Minecraft einen "datengesteuerten" Ansatz. Das macht es einfacher, einfache Verzauberungen hinzuzufügen, wie z. B. die Erhöhung des Angriffsschadens, aber schwieriger, komplexe Verzauberungen zu erstellen. Dabei werden die Verzauberungen in Effektkomponenten zerlegt.
Eine Effektkomponente enthält den Code, der die speziellen Effekte einer Verzauberung definiert. Minecraft unterstützt verschiedene Standardeffekte, wie z. B. Schaden, Rückschlag und Erfahrung.
TIP
Überprüfe, ob die Standard-Minecraft-Effekte deinen Bedürfnissen entsprechen, indem du die Seite der Verzauberungseffekt-Komponenten im Minecraft-Wiki besuchst. Dieser Leitfaden setzt voraus, dass du weißt, wie man "einfache" datengesteuerte Verzauberungen konfiguriert und konzentriert sich auf die Erstellung von benutzerdefinierten Verzauberungseffekten, die nicht standardmäßig unterstützt werden.
Benutzerdefinierte Verzauberungseffekte
Starte mit der Erstellung eines Ordners enchantment und erstelle innerhalb dieses Ordners einen Ordner effect. Darin erstellen wir den Record LightningEnchantmentEffect.
Als nächstes können wir einen Konstruktor erstellen und die Methoden des Interfaces EnchantmentEntityEffect überschreiben. Wir werden auch eine CODEC-Variable erstellen, um unseren Effekt zu kodieren und zu dekodieren; Du kannst hier mehr über Codecs lesen.
Der Großteil unseres Codes wird in das Ereignis apply() einfließen, das aufgerufen wird, wenn die Kriterien für die Wirkung der Verzauberung erfüllt sind. Wir werden diesen Effect später so konfigurieren, dass er aufgerufen wird, wenn eine Entität getroffen wird, aber für den Moment wollen wir einfachen Code schreiben, um das Ziel mit einem Blitz zu treffen.
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
Hier gibt die Variable amount einen Wert an, der auf die Stufe der Verzauberung abgestimmt ist. Auf diese Weise können wir die Wirksamkeit der Verzauberung je nach Stufe verändern. Im obigen Code verwenden wir die Stufe der Verzauberung, um zu bestimmen, wie viele Blitze erzeugt werden.
Den Verzauberungseffekt registrieren
Wie jede andere Komponente deines Mods müssen wir auch diesen EnchantmentEffect zur Minecraft-Registry hinzufügen. Füge hierzu eine Klasse ModEnchantmentEffects (oder wie immer du sie nennen willst) und eine Hilfsmethode zur Registrierung der Verzauberung hinzu. Stelle sicher, dass die Methode registerModEnchantmentEffects() in deiner Hauptklasse aufrufen wird, die die Methode onInitialize() enthält.
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
Die Verzauberung erstellen
Jetzt haben wir einen Verzauberungseffekt! Der letzte Schritt besteht darin, eine Verzauberung zu erstellen, die unseren benutzerdefinierten Effekt anwendet. Dies können wir mit dem datengetriebenen Verzauberungssystem erreichen, indem wir einfach eine JSON-Datei zu den Ressourcen unseres Mods hinzufügen.
Erstelle die JSON-Datei in dem Ordner data/example-mod/enchantments. Der Name dieser Datei entspricht der ID der Verzauberung: thundering.json wird zu example-mod:thundering.
INFO
Weitere Informationen zum Dateiformat findest du unter Minecraft Wiki - Enchantment definition.
Um schnell benutzerdefinierte Verzauberungen zu generieren, kannst du den Misode Generator verwenden.
In diesem Beispiel verwenden wir die folgende Verzauberungsdefinition, um die Verzauberung thundering mit unserem benutzerdefinierten lightning_effect hinzuzufügen:
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
Du solltest auch Übersetzungen zu deiner en_us.json Datei hinzufügen, um deiner Verzauberung einen lesbaren Namen zu geben:
json
"enchantment.example-mod.thundering": "Thundering",1
Du solltest jetzt einen funktionierenden, benutzerdefinierten Verzauberungseffekt haben! Teste es, indem du eine Waffe mit der Verzauberung verzauberst und einen Mob triffst. Ein Beispiel wird im folgenden Video gezeigt:


