Use exact entity type

This commit is contained in:
IzzelAliz 2021-01-15 15:23:57 +08:00
parent cc0019055c
commit 5a1ba73ec6
4 changed files with 48 additions and 2 deletions

View File

@ -42,6 +42,7 @@ public class ArclightImplementer implements ILaunchPluginService {
this.implementers.put("inventory", new InventoryImplementer()); this.implementers.put("inventory", new InventoryImplementer());
this.implementers.put("switch", SwitchTableFixer.INSTANCE); this.implementers.put("switch", SwitchTableFixer.INSTANCE);
this.implementers.put("async", AsyncCatcher.INSTANCE); this.implementers.put("async", AsyncCatcher.INSTANCE);
this.implementers.put("entitytype", EntityTypePatcher.INSTANCE);
} }
@Override @Override

View File

@ -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;
}
}

View File

@ -6,7 +6,7 @@ import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Overwrite;
@Mixin(value = CraftAbstractVillager.class, remap = false) @Mixin(value = CraftAbstractVillager.class, remap = false)
public class CraftAbstractVillagerMixin extends CraftEntityMixin { public abstract class CraftAbstractVillagerMixin extends CraftEntityMixin {
/** /**
* @author IzzelAliz * @author IzzelAliz

View File

@ -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.ArclightModMob;
import io.izzel.arclight.common.mod.server.entity.ArclightModProjectile; import io.izzel.arclight.common.mod.server.entity.ArclightModProjectile;
import io.izzel.arclight.common.mod.server.entity.ArclightModRaider; 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.AgeableEntity;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.FlyingEntity; 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.AbstractChestedHorseEntity;
import net.minecraft.entity.passive.horse.AbstractHorseEntity; import net.minecraft.entity.passive.horse.AbstractHorseEntity;
import net.minecraft.entity.projectile.ProjectileEntity; import net.minecraft.entity.projectile.ProjectileEntity;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.common.util.FakePlayer;
import net.minecraftforge.registries.ForgeRegistries;
import org.bukkit.craftbukkit.v.CraftServer; import org.bukkit.craftbukkit.v.CraftServer;
import org.bukkit.craftbukkit.v.entity.CraftAgeable; import org.bukkit.craftbukkit.v.entity.CraftAgeable;
import org.bukkit.craftbukkit.v.entity.CraftEntity; import org.bukkit.craftbukkit.v.entity.CraftEntity;
import org.bukkit.craftbukkit.v.entity.CraftFlying; import org.bukkit.craftbukkit.v.entity.CraftFlying;
import org.bukkit.craftbukkit.v.entity.CraftGolem; import org.bukkit.craftbukkit.v.entity.CraftGolem;
import org.bukkit.craftbukkit.v.entity.CraftTameableAnimal; 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.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.Locale;
import java.util.Objects;
@Mixin(value = CraftEntity.class, remap = false) @Mixin(value = CraftEntity.class, remap = false)
public class CraftEntityMixin { public abstract class CraftEntityMixin implements org.bukkit.entity.Entity {
@Shadow protected 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")) @Inject(method = "getEntity", cancellable = true, at = @At("HEAD"))
private static void arclight$fakePlayer(CraftServer server, Entity entity, CallbackInfoReturnable<CraftEntity> cir) { private static void arclight$fakePlayer(CraftServer server, Entity entity, CallbackInfoReturnable<CraftEntity> cir) {
if (entity instanceof FakePlayer) { if (entity instanceof FakePlayer) {