diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/asm/ArclightImplementer.java b/arclight-common/src/main/java/io/izzel/arclight/common/asm/ArclightImplementer.java index 5aaf2acc..e4203009 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/asm/ArclightImplementer.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/asm/ArclightImplementer.java @@ -42,6 +42,7 @@ public class ArclightImplementer implements ILaunchPluginService { this.implementers.put("inventory", new InventoryImplementer()); this.implementers.put("switch", SwitchTableFixer.INSTANCE); this.implementers.put("async", AsyncCatcher.INSTANCE); + this.implementers.put("entitytype", EntityTypePatcher.INSTANCE); } @Override diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/asm/EntityTypePatcher.java b/arclight-common/src/main/java/io/izzel/arclight/common/asm/EntityTypePatcher.java new file mode 100644 index 00000000..e0eab4c6 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/asm/EntityTypePatcher.java @@ -0,0 +1,21 @@ +package io.izzel.arclight.common.asm; + +import cpw.mods.modlauncher.serviceapi.ILaunchPluginService; +import io.izzel.arclight.api.ArclightVersion; +import org.objectweb.asm.tree.ClassNode; + +public class EntityTypePatcher implements Implementer { + + public static final EntityTypePatcher INSTANCE = new EntityTypePatcher(); + + private final String entityPackage = "org/bukkit/craftbukkit/" + ArclightVersion.current().packageName() + "/entity"; + + @Override + public boolean processClass(ClassNode node, ILaunchPluginService.ITransformerLoader transformerLoader) { + if (node.name.startsWith(entityPackage) && !node.name.endsWith("CraftEntity")) { + return node.methods.removeIf(methodNode -> methodNode.name.equals("getType") + && methodNode.desc.equals("()Lorg/bukkit/entity/EntityType;")); + } + return false; + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftAbstractVillagerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftAbstractVillagerMixin.java index 7b1a3b3d..7c45c885 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftAbstractVillagerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftAbstractVillagerMixin.java @@ -6,7 +6,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; @Mixin(value = CraftAbstractVillager.class, remap = false) -public class CraftAbstractVillagerMixin extends CraftEntityMixin { +public abstract class CraftAbstractVillagerMixin extends CraftEntityMixin { /** * @author IzzelAliz diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftEntityMixin.java index 5db9f887..acb2cbcf 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/bukkit/CraftEntityMixin.java @@ -10,6 +10,7 @@ import io.izzel.arclight.common.mod.server.entity.ArclightModMinecartContainer; import io.izzel.arclight.common.mod.server.entity.ArclightModMob; import io.izzel.arclight.common.mod.server.entity.ArclightModProjectile; import io.izzel.arclight.common.mod.server.entity.ArclightModRaider; +import io.izzel.arclight.common.mod.util.ResourceLocationUtil; import net.minecraft.entity.AgeableEntity; import net.minecraft.entity.Entity; import net.minecraft.entity.FlyingEntity; @@ -23,24 +24,47 @@ import net.minecraft.entity.passive.TameableEntity; import net.minecraft.entity.passive.horse.AbstractChestedHorseEntity; import net.minecraft.entity.passive.horse.AbstractHorseEntity; import net.minecraft.entity.projectile.ProjectileEntity; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.registries.ForgeRegistries; import org.bukkit.craftbukkit.v.CraftServer; import org.bukkit.craftbukkit.v.entity.CraftAgeable; import org.bukkit.craftbukkit.v.entity.CraftEntity; import org.bukkit.craftbukkit.v.entity.CraftFlying; import org.bukkit.craftbukkit.v.entity.CraftGolem; import org.bukkit.craftbukkit.v.entity.CraftTameableAnimal; +import org.bukkit.entity.EntityType; +import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import java.util.Locale; +import java.util.Objects; + @Mixin(value = CraftEntity.class, remap = false) -public class CraftEntityMixin { +public abstract class CraftEntityMixin implements org.bukkit.entity.Entity { @Shadow protected Entity entity; + private EntityType arclight$type; + + @Override + public @NotNull EntityType getType() { + if (this.arclight$type == null) { + ResourceLocation location = ForgeRegistries.ENTITIES.getKey(entity.getType()); + if (location == null) throw new IllegalArgumentException("Unregistered entity type " + entity.getType()); + if (location.getNamespace().equals("minecraft")) { + this.arclight$type = Objects.requireNonNull(EntityType.fromName(location.getPath().toUpperCase(Locale.ROOT))); + } else { + this.arclight$type = EntityType.valueOf(ResourceLocationUtil.standardize(location)); + } + } + return this.arclight$type; + } + @Inject(method = "getEntity", cancellable = true, at = @At("HEAD")) private static void arclight$fakePlayer(CraftServer server, Entity entity, CallbackInfoReturnable cir) { if (entity instanceof FakePlayer) {