From d61604007f78a7c5c975e593fb9588fcb4fa5aa6 Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Sat, 2 Dec 2023 23:23:37 +0800 Subject: [PATCH] Add pose and illager spell registries (#1124) --- .../mixin/bukkit/CraftSpellcasterMixin.java | 40 +++++++++++++++++++ .../mixin/core/world/entity/EntityMixin.java | 3 +- .../common/mod/server/BukkitRegistry.java | 18 +++++++++ .../resources/mixins.arclight.bukkit.json | 1 + .../arclight/boot/asm/EnumDefinalizer.java | 4 +- 5 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftSpellcasterMixin.java diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftSpellcasterMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftSpellcasterMixin.java new file mode 100644 index 00000000..93c30110 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftSpellcasterMixin.java @@ -0,0 +1,40 @@ +package io.izzel.arclight.common.mixin.bukkit; + +import io.izzel.arclight.api.EnumHelper; +import io.izzel.arclight.common.mod.ArclightMod; +import net.minecraft.world.entity.boss.enderdragon.phases.EnderDragonPhase; +import net.minecraft.world.entity.monster.SpellcasterIllager; +import org.bukkit.craftbukkit.v.entity.CraftSpellcaster; +import org.bukkit.entity.EnderDragon; +import org.bukkit.entity.Spellcaster; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; + +import java.util.ArrayList; +import java.util.List; + +@Mixin(CraftSpellcaster.class) +public class CraftSpellcasterMixin { + + /** + * @author IzzelAliz + * @reason + */ + @Overwrite + public static Spellcaster.Spell toBukkitSpell(SpellcasterIllager.IllagerSpell spell) { + try { + return Spellcaster.Spell.valueOf(spell.name()); + } catch (IllegalArgumentException e) { + var newTypes = new ArrayList(); + var forgeCount = SpellcasterIllager.IllagerSpell.values().length; + for (var id = Spellcaster.Spell.values().length; id < forgeCount; id++) { + var name = SpellcasterIllager.IllagerSpell.values()[id].name(); + var newPhase = EnumHelper.makeEnum(Spellcaster.Spell.class, name, id, List.of(), List.of()); + newTypes.add(newPhase); + ArclightMod.LOGGER.debug("Registered {} as illager spell {}", name, newPhase); + } + EnumHelper.addEnums(Spellcaster.Spell.class, newTypes); + return toBukkitSpell(spell); + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/EntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/EntityMixin.java index e8fd5d29..ca7b8b76 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/EntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/EntityMixin.java @@ -11,6 +11,7 @@ import io.izzel.arclight.common.bridge.core.entity.player.ServerPlayerEntityBrid import io.izzel.arclight.common.bridge.core.network.datasync.SynchedEntityDataBridge; import io.izzel.arclight.common.bridge.core.world.TeleporterBridge; import io.izzel.arclight.common.bridge.core.world.WorldBridge; +import io.izzel.arclight.common.mod.server.BukkitRegistry; import io.izzel.arclight.common.mod.util.ArclightCaptures; import net.minecraft.BlockUtil; import net.minecraft.commands.CommandSourceStack; @@ -315,7 +316,7 @@ public abstract class EntityMixin implements InternalEntityBridge, EntityBridge, callbackInfo.cancel(); return; } - EntityPoseChangeEvent event = new EntityPoseChangeEvent(this.internal$getBukkitEntity(), org.bukkit.entity.Pose.values()[poseIn.ordinal()]); + EntityPoseChangeEvent event = new EntityPoseChangeEvent(this.internal$getBukkitEntity(), BukkitRegistry.toBukkitPose(poseIn)); Bukkit.getPluginManager().callEvent(event); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/BukkitRegistry.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/BukkitRegistry.java index f7e16ea9..4c9d23e4 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/BukkitRegistry.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/BukkitRegistry.java @@ -30,6 +30,7 @@ import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.MobCategory; import net.minecraft.world.entity.boss.enderdragon.phases.EnderDragonPhase; +import net.minecraft.world.entity.monster.SpellcasterIllager; import net.minecraft.world.entity.npc.VillagerProfession; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; @@ -60,7 +61,9 @@ import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.EnderDragon; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; +import org.bukkit.entity.Pose; import org.bukkit.entity.SpawnCategory; +import org.bukkit.entity.Spellcaster; import org.bukkit.entity.Villager; import org.bukkit.potion.PotionEffectType; import org.bukkit.potion.PotionType; @@ -473,6 +476,21 @@ public class BukkitRegistry { return ArclightConfig.spec().getCompat().getEntity(location.toString()).orElse(EntityPropertySpec.EMPTY); } + public static Pose toBukkitPose(net.minecraft.world.entity.Pose nms) { + if (Pose.values().length <= nms.ordinal()) { + var newTypes = new ArrayList(); + var forgeCount = net.minecraft.world.entity.Pose.values().length; + for (var id = Pose.values().length; id < forgeCount; id++) { + var name = net.minecraft.world.entity.Pose.values()[id].name(); + var newPhase = EnumHelper.makeEnum(Pose.class, name, id, List.of(), List.of()); + newTypes.add(newPhase); + ArclightMod.LOGGER.debug("Registered {} as pose {}", name, newPhase); + } + EnumHelper.addEnums(Pose.class, newTypes); + } + return org.bukkit.entity.Pose.values()[nms.ordinal()]; + } + private static void putStatic(Class cl, String name, Object o) { try { Unsafe.ensureClassInitialized(cl); diff --git a/arclight-common/src/main/resources/mixins.arclight.bukkit.json b/arclight-common/src/main/resources/mixins.arclight.bukkit.json index e0d9c38c..d4dd9f80 100644 --- a/arclight-common/src/main/resources/mixins.arclight.bukkit.json +++ b/arclight-common/src/main/resources/mixins.arclight.bukkit.json @@ -35,6 +35,7 @@ "CraftSchedulerMixin", "CraftServerMixin", "CraftSpawnCategoryMixin", + "CraftSpellcasterMixin", "CraftVillagerMixin", "CraftWorldMixin", "EntityTypeMixin", diff --git a/arclight-forge/src/main/java/io/izzel/arclight/boot/asm/EnumDefinalizer.java b/arclight-forge/src/main/java/io/izzel/arclight/boot/asm/EnumDefinalizer.java index 5af8711b..b09350b8 100644 --- a/arclight-forge/src/main/java/io/izzel/arclight/boot/asm/EnumDefinalizer.java +++ b/arclight-forge/src/main/java/io/izzel/arclight/boot/asm/EnumDefinalizer.java @@ -22,7 +22,9 @@ public class EnumDefinalizer implements Implementer { "org/bukkit/entity/SpawnCategory", "org/bukkit/entity/EnderDragon$Phase", "org/bukkit/inventory/recipe/CookingBookCategory", - "org/bukkit/Fluid" + "org/bukkit/Fluid", + "org/bukkit/entity/Spellcaster$Spell", + "org/bukkit/entity/Pose" ); @Override