Use exact entity type
This commit is contained in:
parent
cc0019055c
commit
5a1ba73ec6
@ -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
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user