Simplify reflection handling

This commit is contained in:
filoghost 2018-08-21 16:39:39 +02:00
parent 4237707b62
commit df5d3f9c26
39 changed files with 285 additions and 133 deletions

View File

@ -4,8 +4,8 @@ import org.bukkit.craftbukkit.v1_10_R1.entity.CraftEntity;
import com.gmail.filoghost.holographicdisplays.api.line.HologramLine;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorStand;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.Utils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectionUtils;
import net.minecraft.server.v1_10_R1.AxisAlignedBB;
import net.minecraft.server.v1_10_R1.DamageSource;

View File

@ -10,8 +10,8 @@ import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBa
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSItem;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ItemUtils;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.Utils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_10_R1.Blocks;
import net.minecraft.server.v1_10_R1.DamageSource;
@ -29,6 +29,8 @@ import net.minecraft.server.v1_10_R1.AxisAlignedBB;
public class EntityNMSItem extends EntityItem implements NMSItem {
private static final ReflectField<Entity> VEHICLE_FIELD = new ReflectField<Entity>(Entity.class, "au");
private boolean lockTick;
private ItemLine parentPiece;
private ItemPickupManager itemPickupManager;
@ -249,11 +251,11 @@ public class EntityNMSItem extends EntityItem implements NMSItem {
try {
if (super.bB() != null) {
Entity oldVehicle = super.bB();
ReflectionUtils.setPrivateField(Entity.class, this, "au", null);
VEHICLE_FIELD.set(this, null);
oldVehicle.passengers.remove(this);
}
ReflectionUtils.setPrivateField(Entity.class, this, "au", entity);
VEHICLE_FIELD.set(this, entity);
entity.passengers.clear();
entity.passengers.add(this);

View File

@ -8,8 +8,8 @@ import com.gmail.filoghost.holographicdisplays.api.line.HologramLine;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSSlime;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.Utils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_10_R1.AxisAlignedBB;
import net.minecraft.server.v1_10_R1.DamageSource;
@ -23,6 +23,8 @@ import net.minecraft.server.v1_10_R1.SoundEffect;
import net.minecraft.server.v1_10_R1.World;
public class EntityNMSSlime extends EntitySlime implements NMSSlime {
private static final ReflectField<Entity> VEHICLE_FIELD = new ReflectField<Entity>(Entity.class, "au");
private boolean lockTick;
private HologramLine parentPiece;
@ -214,11 +216,11 @@ public class EntityNMSSlime extends EntitySlime implements NMSSlime {
try {
if (super.bB() != null) {
Entity oldVehicle = super.bB();
ReflectionUtils.setPrivateField(Entity.class, this, "au", null);
VEHICLE_FIELD.set(this, null);
oldVehicle.passengers.remove(this);
}
ReflectionUtils.setPrivateField(Entity.class, this, "au", entity);
VEHICLE_FIELD.set(this, entity);
entity.passengers.clear();
entity.passengers.add(this);

View File

@ -1,6 +1,7 @@
package com.gmail.filoghost.holographicdisplays.nms.v1_10_R1;
import java.lang.reflect.Method;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
@ -18,8 +19,9 @@ import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorSta
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSItem;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.Validator;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_10_R1.Entity;
import net.minecraft.server.v1_10_R1.EntityTypes;
import net.minecraft.server.v1_10_R1.MathHelper;
@ -27,6 +29,9 @@ import net.minecraft.server.v1_10_R1.World;
import net.minecraft.server.v1_10_R1.WorldServer;
public class NmsManagerImpl implements NMSManager {
private static final ReflectField<Map<Class<?>, String>> ENTITY_NAMES_BY_CLASS_FIELD = new ReflectField<Map<Class<?>, String>>(EntityTypes.class, "d");
private static final ReflectField<Map<Class<?>, Integer>> ENTITY_IDS_BY_CLASS_FIELD = new ReflectField<Map<Class<?>, Integer>>(EntityTypes.class, "f");
private Method validateEntityMethod;
@ -41,8 +46,8 @@ public class NmsManagerImpl implements NMSManager {
}
public void registerCustomEntity(Class<?> entityClass, String name, int id) throws Exception {
ReflectionUtils.putInPrivateStaticMap(EntityTypes.class, "d", entityClass, name);
ReflectionUtils.putInPrivateStaticMap(EntityTypes.class, "f", entityClass, Integer.valueOf(id));
ENTITY_NAMES_BY_CLASS_FIELD.getStatic().put(entityClass, name);
ENTITY_IDS_BY_CLASS_FIELD.getStatic().put(entityClass, Integer.valueOf(id));
}
@Override

View File

@ -4,8 +4,8 @@ import org.bukkit.craftbukkit.v1_11_R1.entity.CraftEntity;
import com.gmail.filoghost.holographicdisplays.api.line.HologramLine;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorStand;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.Utils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectionUtils;
import net.minecraft.server.v1_11_R1.AxisAlignedBB;
import net.minecraft.server.v1_11_R1.DamageSource;

View File

@ -10,7 +10,7 @@ import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBa
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSItem;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ItemUtils;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_11_R1.Blocks;
import net.minecraft.server.v1_11_R1.DamageSource;
@ -27,6 +27,8 @@ import net.minecraft.server.v1_11_R1.AxisAlignedBB;
public class EntityNMSItem extends EntityItem implements NMSItem {
private static final ReflectField<Entity> VEHICLE_FIELD = new ReflectField<Entity>(Entity.class, "au");
private boolean lockTick;
private ItemLine parentPiece;
private ItemPickupManager itemPickupManager;
@ -225,11 +227,11 @@ public class EntityNMSItem extends EntityItem implements NMSItem {
try {
if (super.bB() != null) {
Entity oldVehicle = super.bB();
ReflectionUtils.setPrivateField(Entity.class, this, "au", null);
VEHICLE_FIELD.set(this, null);
oldVehicle.passengers.remove(this);
}
ReflectionUtils.setPrivateField(Entity.class, this, "au", entity);
VEHICLE_FIELD.set(this, entity);
entity.passengers.clear();
entity.passengers.add(this);

View File

@ -8,7 +8,7 @@ import com.gmail.filoghost.holographicdisplays.api.line.HologramLine;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSSlime;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_11_R1.AxisAlignedBB;
import net.minecraft.server.v1_11_R1.DamageSource;
@ -21,6 +21,8 @@ import net.minecraft.server.v1_11_R1.SoundEffect;
import net.minecraft.server.v1_11_R1.World;
public class EntityNMSSlime extends EntitySlime implements NMSSlime {
private static final ReflectField<Entity> VEHICLE_FIELD = new ReflectField<Entity>(Entity.class, "au");
private boolean lockTick;
private HologramLine parentPiece;
@ -199,11 +201,11 @@ public class EntityNMSSlime extends EntitySlime implements NMSSlime {
try {
if (super.bB() != null) {
Entity oldVehicle = super.bB();
ReflectionUtils.setPrivateField(Entity.class, this, "au", null);
VEHICLE_FIELD.set(this, null);
oldVehicle.passengers.remove(this);
}
ReflectionUtils.setPrivateField(Entity.class, this, "au", entity);
VEHICLE_FIELD.set(this, entity);
entity.passengers.clear();
entity.passengers.add(this);

View File

@ -1,7 +1,6 @@
package com.gmail.filoghost.holographicdisplays.nms.v1_11_R1;
import java.lang.reflect.Method;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.craftbukkit.v1_11_R1.CraftChunk;
@ -18,8 +17,9 @@ import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorSta
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSItem;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.Validator;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_11_R1.Entity;
import net.minecraft.server.v1_11_R1.EntityTypes;
import net.minecraft.server.v1_11_R1.MathHelper;
@ -29,6 +29,9 @@ import net.minecraft.server.v1_11_R1.World;
import net.minecraft.server.v1_11_R1.WorldServer;
public class NmsManagerImpl implements NMSManager {
private static final ReflectField<RegistryID<Class<? extends Entity>>> REGISTRY_ID_FIELD = new ReflectField<RegistryID<Class<? extends Entity>>>(RegistryMaterials.class, "a");
private static final ReflectField<Object[]> ID_TO_CLASS_MAP_FIELD = new ReflectField<Object[]>(RegistryID.class, "d");
private Method validateEntityMethod;
@ -40,11 +43,10 @@ public class NmsManagerImpl implements NMSManager {
registerCustomEntity(EntityNMSSlime.class, 55);
}
@SuppressWarnings("unchecked")
public void registerCustomEntity(Class<? extends Entity> entityClass, int id) throws Exception {
// Use reflection to get the RegistryID of entities.
RegistryID<Class<? extends Entity>> registryID = (RegistryID<Class<? extends Entity>>) ReflectionUtils.getPrivateField(RegistryMaterials.class, EntityTypes.b, "a");
Object[] idToClassMap = (Object[]) ReflectionUtils.getPrivateField(RegistryID.class, registryID, "d");
RegistryID<Class<? extends Entity>> registryID = REGISTRY_ID_FIELD.get(EntityTypes.b);
Object[] idToClassMap = ID_TO_CLASS_MAP_FIELD.get(registryID);
// Save the the ID -> entity class mapping before the registration.
Object oldValue = idToClassMap[id];

View File

@ -4,8 +4,8 @@ import org.bukkit.craftbukkit.v1_12_R1.entity.CraftEntity;
import com.gmail.filoghost.holographicdisplays.api.line.HologramLine;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorStand;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.Utils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectionUtils;
import net.minecraft.server.v1_12_R1.AxisAlignedBB;
import net.minecraft.server.v1_12_R1.DamageSource;

View File

@ -10,7 +10,7 @@ import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBa
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSItem;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ItemUtils;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_12_R1.Blocks;
import net.minecraft.server.v1_12_R1.DamageSource;
@ -27,6 +27,8 @@ import net.minecraft.server.v1_12_R1.AxisAlignedBB;
public class EntityNMSItem extends EntityItem implements NMSItem {
private static final ReflectField<Entity> VEHICLE_FIELD = new ReflectField<Entity>(Entity.class, "au");
private boolean lockTick;
private ItemLine parentPiece;
private ItemPickupManager itemPickupManager;
@ -225,11 +227,11 @@ public class EntityNMSItem extends EntityItem implements NMSItem {
try {
if (super.bJ() != null) {
Entity oldVehicle = super.bJ();
ReflectionUtils.setPrivateField(Entity.class, this, "au", null);
VEHICLE_FIELD.set(this, null);
oldVehicle.passengers.remove(this);
}
ReflectionUtils.setPrivateField(Entity.class, this, "au", entity);
VEHICLE_FIELD.set(this, entity);
entity.passengers.clear();
entity.passengers.add(this);

View File

@ -8,7 +8,7 @@ import com.gmail.filoghost.holographicdisplays.api.line.HologramLine;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSSlime;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_12_R1.AxisAlignedBB;
import net.minecraft.server.v1_12_R1.DamageSource;
@ -21,6 +21,8 @@ import net.minecraft.server.v1_12_R1.SoundEffect;
import net.minecraft.server.v1_12_R1.World;
public class EntityNMSSlime extends EntitySlime implements NMSSlime {
private static final ReflectField<Entity> VEHICLE_FIELD = new ReflectField<Entity>(Entity.class, "au");
private boolean lockTick;
private HologramLine parentPiece;
@ -199,11 +201,11 @@ public class EntityNMSSlime extends EntitySlime implements NMSSlime {
try {
if (super.bJ() != null) {
Entity oldVehicle = super.bJ();
ReflectionUtils.setPrivateField(Entity.class, this, "au", null);
VEHICLE_FIELD.set(this, null);
oldVehicle.passengers.remove(this);
}
ReflectionUtils.setPrivateField(Entity.class, this, "au", entity);
VEHICLE_FIELD.set(this, entity);
entity.passengers.clear();
entity.passengers.add(this);

View File

@ -18,8 +18,9 @@ import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorSta
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSItem;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.Validator;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_12_R1.Entity;
import net.minecraft.server.v1_12_R1.EntityTypes;
import net.minecraft.server.v1_12_R1.MathHelper;
@ -29,6 +30,9 @@ import net.minecraft.server.v1_12_R1.World;
import net.minecraft.server.v1_12_R1.WorldServer;
public class NmsManagerImpl implements NMSManager {
private static final ReflectField<RegistryID<Class<? extends Entity>>> REGISTRY_ID_FIELD = new ReflectField<RegistryID<Class<? extends Entity>>>(RegistryMaterials.class, "a");
private static final ReflectField<Object[]> ID_TO_CLASS_MAP_FIELD = new ReflectField<Object[]>(RegistryID.class, "d");
private Method validateEntityMethod;
@ -40,11 +44,10 @@ public class NmsManagerImpl implements NMSManager {
registerCustomEntity(EntityNMSSlime.class, 55);
}
@SuppressWarnings("unchecked")
public void registerCustomEntity(Class<? extends Entity> entityClass, int id) throws Exception {
// Use reflection to get the RegistryID of entities.
RegistryID<Class<? extends Entity>> registryID = (RegistryID<Class<? extends Entity>>) ReflectionUtils.getPrivateField(RegistryMaterials.class, EntityTypes.b, "a");
Object[] idToClassMap = (Object[]) ReflectionUtils.getPrivateField(RegistryID.class, registryID, "d");
RegistryID<Class<? extends Entity>> registryID = REGISTRY_ID_FIELD.get(EntityTypes.b);
Object[] idToClassMap = ID_TO_CLASS_MAP_FIELD.get(registryID);
// Save the the ID -> entity class mapping before the registration.
Object oldValue = idToClassMap[id];

View File

@ -5,8 +5,8 @@ import org.bukkit.craftbukkit.v1_13_R1.util.CraftChatMessage;
import com.gmail.filoghost.holographicdisplays.api.line.HologramLine;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorStand;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.Utils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectionUtils;
import net.minecraft.server.v1_13_R1.AxisAlignedBB;
import net.minecraft.server.v1_13_R1.DamageSource;

View File

@ -10,7 +10,7 @@ import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBa
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSItem;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ItemUtils;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_13_R1.AxisAlignedBB;
import net.minecraft.server.v1_13_R1.Blocks;
@ -27,6 +27,8 @@ import net.minecraft.server.v1_13_R1.World;
public class EntityNMSItem extends EntityItem implements NMSItem {
private static final ReflectField<Entity> VEHICLE_FIELD = new ReflectField<Entity>(Entity.class, "ax");
private boolean lockTick;
private ItemLine parentPiece;
private ItemPickupManager itemPickupManager;
@ -225,11 +227,11 @@ public class EntityNMSItem extends EntityItem implements NMSItem {
try {
if (super.getVehicle() != null) {
Entity oldVehicle = super.getVehicle();
ReflectionUtils.setPrivateField(Entity.class, this, "ax", null);
VEHICLE_FIELD.set(this, null);
oldVehicle.passengers.remove(this);
}
ReflectionUtils.setPrivateField(Entity.class, this, "ax", entity);
VEHICLE_FIELD.set(this, entity);
entity.passengers.clear();
entity.passengers.add(this);

View File

@ -8,7 +8,7 @@ import com.gmail.filoghost.holographicdisplays.api.line.HologramLine;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSSlime;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_13_R1.AxisAlignedBB;
import net.minecraft.server.v1_13_R1.DamageSource;
@ -22,6 +22,8 @@ import net.minecraft.server.v1_13_R1.SoundEffect;
import net.minecraft.server.v1_13_R1.World;
public class EntityNMSSlime extends EntitySlime implements NMSSlime {
private static final ReflectField<Entity> VEHICLE_FIELD = new ReflectField<Entity>(Entity.class, "ax");
private boolean lockTick;
private HologramLine parentPiece;
@ -200,11 +202,11 @@ public class EntityNMSSlime extends EntitySlime implements NMSSlime {
try {
if (super.getVehicle() != null) {
Entity oldVehicle = super.getVehicle();
ReflectionUtils.setPrivateField(Entity.class, this, "ax", null);
VEHICLE_FIELD.set(this, null);
oldVehicle.passengers.remove(this);
}
ReflectionUtils.setPrivateField(Entity.class, this, "ax", entity);
VEHICLE_FIELD.set(this, entity);
entity.passengers.clear();
entity.passengers.add(this);

View File

@ -19,8 +19,9 @@ import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorSta
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSItem;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.Validator;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_13_R1.Entity;
import net.minecraft.server.v1_13_R1.EntityTypes;
import net.minecraft.server.v1_13_R1.MathHelper;
@ -30,6 +31,9 @@ import net.minecraft.server.v1_13_R1.World;
import net.minecraft.server.v1_13_R1.WorldServer;
public class NmsManagerImpl implements NMSManager {
private static final ReflectField<RegistryID<EntityTypes<?>>> REGISTRY_ID_FIELD = new ReflectField<RegistryID<EntityTypes<?>>>(RegistryMaterials.class, "a");
private static final ReflectField<Object[]> ID_TO_CLASS_MAP_FIELD = new ReflectField<Object[]>(RegistryID.class, "d");
private Method validateEntityMethod;
@ -41,11 +45,10 @@ public class NmsManagerImpl implements NMSManager {
registerCustomEntity(EntityNMSSlime.class, 55);
}
@SuppressWarnings("unchecked")
public void registerCustomEntity(Class<? extends Entity> entityClass, int id) throws Exception {
// Use reflection to get the RegistryID of entities.
RegistryID<EntityTypes<?>> registryID = (RegistryID<EntityTypes<?>>) ReflectionUtils.getPrivateField(RegistryMaterials.class, EntityTypes.REGISTRY, "a");
Object[] idToClassMap = (Object[]) ReflectionUtils.getPrivateField(RegistryID.class, registryID, "d");
RegistryID<EntityTypes<?>> registryID = REGISTRY_ID_FIELD.get(EntityTypes.REGISTRY);
Object[] idToClassMap = ID_TO_CLASS_MAP_FIELD.get(registryID);
// Save the the ID -> EntityTypes mapping before the registration.
Object oldValue = idToClassMap[id];

View File

@ -4,8 +4,9 @@ import org.bukkit.craftbukkit.v1_8_R1.entity.CraftEntity;
import com.gmail.filoghost.holographicdisplays.api.line.HologramLine;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorStand;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.Utils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectionUtils;
import net.minecraft.server.v1_8_R1.AxisAlignedBB;
import net.minecraft.server.v1_8_R1.DamageSource;
@ -21,6 +22,8 @@ import net.minecraft.server.v1_8_R1.World;
public class EntityNMSArmorStand extends EntityArmorStand implements NMSArmorStand {
private static final ReflectField<Integer> DISABLED_SLOTS_FIELD = new ReflectField<Integer>(EntityArmorStand.class, "bg");
private boolean lockTick;
private HologramLine parentPiece;
@ -34,7 +37,7 @@ public class EntityNMSArmorStand extends EntityArmorStand implements NMSArmorSta
// There is no "Marker" tag in v1_8_R1
this.parentPiece = parentPiece;
try {
ReflectionUtils.setPrivateField(EntityArmorStand.class, this, "bg", Integer.MAX_VALUE);
DISABLED_SLOTS_FIELD.set(this, Integer.MAX_VALUE);
} catch (Exception e) {
// There's still the overridden method.
}

View File

@ -10,7 +10,7 @@ import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBa
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSItem;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ItemUtils;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_8_R1.AxisAlignedBB;
import net.minecraft.server.v1_8_R1.Blocks;
@ -27,6 +27,9 @@ import net.minecraft.server.v1_8_R1.World;
public class EntityNMSItem extends EntityItem implements NMSItem {
private static final ReflectField<Double> RIDER_PITCH_DELTA = new ReflectField<Double>(Entity.class, "ap");
private static final ReflectField<Double> RIDER_YAW_DELTA = new ReflectField<Double>(Entity.class, "aq");
private boolean lockTick;
private ItemLine parentPiece;
private ItemPickupManager itemPickupManager;
@ -208,8 +211,8 @@ public class EntityNMSItem extends EntityItem implements NMSItem {
Entity entity = (Entity) vehicleBase;
try {
ReflectionUtils.setPrivateField(Entity.class, this, "ap", (double) 0.0);
ReflectionUtils.setPrivateField(Entity.class, this, "aq", (double) 0.0);
RIDER_PITCH_DELTA.set(this, 0.0);
RIDER_YAW_DELTA.set(this, 0.0);
} catch (Exception ex) {
DebugHandler.handleDebugException(ex);
}

View File

@ -8,7 +8,7 @@ import com.gmail.filoghost.holographicdisplays.api.line.HologramLine;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSSlime;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_8_R1.AxisAlignedBB;
import net.minecraft.server.v1_8_R1.DamageSource;
@ -20,6 +20,9 @@ import net.minecraft.server.v1_8_R1.NBTTagCompound;
import net.minecraft.server.v1_8_R1.World;
public class EntityNMSSlime extends EntitySlime implements NMSSlime {
private static final ReflectField<Double> RIDER_PITCH_DELTA = new ReflectField<Double>(Entity.class, "ap");
private static final ReflectField<Double> RIDER_YAW_DELTA = new ReflectField<Double>(Entity.class, "aq");
private boolean lockTick;
private HologramLine parentPiece;
@ -175,8 +178,8 @@ public class EntityNMSSlime extends EntitySlime implements NMSSlime {
Entity entity = (Entity) vehicleBase;
try {
ReflectionUtils.setPrivateField(Entity.class, this, "ap", (double) 0.0);
ReflectionUtils.setPrivateField(Entity.class, this, "aq", (double) 0.0);
RIDER_PITCH_DELTA.set(this, 0.0);
RIDER_YAW_DELTA.set(this, 0.0);
} catch (Exception ex) {
DebugHandler.handleDebugException(ex);
}

View File

@ -1,6 +1,7 @@
package com.gmail.filoghost.holographicdisplays.nms.v1_8_R1;
import java.lang.reflect.Method;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
@ -18,8 +19,9 @@ import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorSta
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSItem;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.Validator;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_8_R1.Entity;
import net.minecraft.server.v1_8_R1.EntityTypes;
import net.minecraft.server.v1_8_R1.MathHelper;
@ -27,6 +29,9 @@ import net.minecraft.server.v1_8_R1.World;
import net.minecraft.server.v1_8_R1.WorldServer;
public class NmsManagerImpl implements NMSManager {
private static final ReflectField<Map<Class<?>, String>> ENTITY_NAMES_BY_CLASS_FIELD = new ReflectField<Map<Class<?>, String>>(EntityTypes.class, "d");
private static final ReflectField<Map<Class<?>, Integer>> ENTITY_IDS_BY_CLASS_FIELD = new ReflectField<Map<Class<?>, Integer>>(EntityTypes.class, "f");
private Method validateEntityMethod;
@ -41,8 +46,8 @@ public class NmsManagerImpl implements NMSManager {
}
public void registerCustomEntity(Class<?> entityClass, String name, int id) throws Exception {
ReflectionUtils.putInPrivateStaticMap(EntityTypes.class, "d", entityClass, name);
ReflectionUtils.putInPrivateStaticMap(EntityTypes.class, "f", entityClass, Integer.valueOf(id));
ENTITY_NAMES_BY_CLASS_FIELD.getStatic().put(entityClass, name);
ENTITY_IDS_BY_CLASS_FIELD.getStatic().put(entityClass, Integer.valueOf(id));
}
@Override

View File

@ -4,8 +4,11 @@ import org.bukkit.craftbukkit.v1_8_R2.entity.CraftEntity;
import com.gmail.filoghost.holographicdisplays.api.line.HologramLine;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorStand;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.Utils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectMethod;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectionUtils;
import net.minecraft.server.v1_8_R2.AxisAlignedBB;
import net.minecraft.server.v1_8_R2.DamageSource;
@ -20,6 +23,9 @@ import net.minecraft.server.v1_8_R2.Vec3D;
import net.minecraft.server.v1_8_R2.World;
public class EntityNMSArmorStand extends EntityArmorStand implements NMSArmorStand {
private static final ReflectField<Integer> DISABLED_SLOTS_FIELD = new ReflectField<Integer>(EntityArmorStand.class, "bi");
private static final ReflectMethod<Void> SET_MARKER_METHOD = new ReflectMethod<Void>(EntityArmorStand.class, "n", boolean.class);
private boolean lockTick;
private HologramLine parentPiece;
@ -32,14 +38,14 @@ public class EntityNMSArmorStand extends EntityArmorStand implements NMSArmorSta
setGravity(true);
setBasePlate(true);
try {
ReflectionUtils.callPrivateMethod(EntityArmorStand.class, this, "n", new Class[]{ boolean.class }, new Object[]{ true }); // n() = setMarker()
SET_MARKER_METHOD.invoke(this, true);
} catch (Exception e) {
e.printStackTrace();
// It will still work.
DebugHandler.handleDebugException(e);
// It will still work, but the offset will be wrong.
}
this.parentPiece = parentPiece;
try {
ReflectionUtils.setPrivateField(EntityArmorStand.class, this, "bi", Integer.MAX_VALUE);
DISABLED_SLOTS_FIELD.set(this, Integer.MAX_VALUE);
} catch (Exception e) {
// There's still the overridden method.
}

View File

@ -10,7 +10,7 @@ import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBa
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSItem;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ItemUtils;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_8_R2.AxisAlignedBB;
import net.minecraft.server.v1_8_R2.Blocks;
@ -27,6 +27,9 @@ import net.minecraft.server.v1_8_R2.World;
public class EntityNMSItem extends EntityItem implements NMSItem {
private static final ReflectField<Double> RIDER_PITCH_DELTA = new ReflectField<Double>(Entity.class, "ar");
private static final ReflectField<Double> RIDER_YAW_DELTA = new ReflectField<Double>(Entity.class, "as");
private boolean lockTick;
private ItemLine parentPiece;
private ItemPickupManager itemPickupManager;
@ -208,8 +211,8 @@ public class EntityNMSItem extends EntityItem implements NMSItem {
Entity entity = (Entity) vehicleBase;
try {
ReflectionUtils.setPrivateField(Entity.class, this, "ar", 0.0);
ReflectionUtils.setPrivateField(Entity.class, this, "as", 0.0);
RIDER_PITCH_DELTA.set(this, 0.0);
RIDER_YAW_DELTA.set(this, 0.0);
} catch (Exception ex) {
DebugHandler.handleDebugException(ex);
}

View File

@ -8,7 +8,7 @@ import com.gmail.filoghost.holographicdisplays.api.line.HologramLine;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSSlime;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_8_R2.AxisAlignedBB;
import net.minecraft.server.v1_8_R2.DamageSource;
@ -20,6 +20,9 @@ import net.minecraft.server.v1_8_R2.NBTTagCompound;
import net.minecraft.server.v1_8_R2.World;
public class EntityNMSSlime extends EntitySlime implements NMSSlime {
private static final ReflectField<Double> RIDER_PITCH_DELTA = new ReflectField<Double>(Entity.class, "ar");
private static final ReflectField<Double> RIDER_YAW_DELTA = new ReflectField<Double>(Entity.class, "as");
private boolean lockTick;
private HologramLine parentPiece;
@ -175,8 +178,8 @@ public class EntityNMSSlime extends EntitySlime implements NMSSlime {
Entity entity = (Entity) vehicleBase;
try {
ReflectionUtils.setPrivateField(Entity.class, this, "ar", 0.0);
ReflectionUtils.setPrivateField(Entity.class, this, "as", 0.0);
RIDER_PITCH_DELTA.set(this, 0.0);
RIDER_YAW_DELTA.set(this, 0.0);
} catch (Exception ex) {
DebugHandler.handleDebugException(ex);
}

View File

@ -1,6 +1,7 @@
package com.gmail.filoghost.holographicdisplays.nms.v1_8_R2;
import java.lang.reflect.Method;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
@ -18,8 +19,9 @@ import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorSta
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSItem;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.Validator;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_8_R2.Entity;
import net.minecraft.server.v1_8_R2.EntityTypes;
import net.minecraft.server.v1_8_R2.MathHelper;
@ -27,6 +29,9 @@ import net.minecraft.server.v1_8_R2.World;
import net.minecraft.server.v1_8_R2.WorldServer;
public class NmsManagerImpl implements NMSManager {
private static final ReflectField<Map<Class<?>, String>> ENTITY_NAMES_BY_CLASS_FIELD = new ReflectField<Map<Class<?>, String>>(EntityTypes.class, "d");
private static final ReflectField<Map<Class<?>, Integer>> ENTITY_IDS_BY_CLASS_FIELD = new ReflectField<Map<Class<?>, Integer>>(EntityTypes.class, "f");
private Method validateEntityMethod;
@ -41,8 +46,8 @@ public class NmsManagerImpl implements NMSManager {
}
public void registerCustomEntity(Class<?> entityClass, String name, int id) throws Exception {
ReflectionUtils.putInPrivateStaticMap(EntityTypes.class, "d", entityClass, name);
ReflectionUtils.putInPrivateStaticMap(EntityTypes.class, "f", entityClass, Integer.valueOf(id));
ENTITY_NAMES_BY_CLASS_FIELD.getStatic().put(entityClass, name);
ENTITY_IDS_BY_CLASS_FIELD.getStatic().put(entityClass, Integer.valueOf(id));
}
@Override

View File

@ -4,8 +4,11 @@ import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity;
import com.gmail.filoghost.holographicdisplays.api.line.HologramLine;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorStand;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.Utils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectMethod;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectionUtils;
import net.minecraft.server.v1_8_R3.AxisAlignedBB;
import net.minecraft.server.v1_8_R3.DamageSource;
@ -20,6 +23,9 @@ import net.minecraft.server.v1_8_R3.Vec3D;
import net.minecraft.server.v1_8_R3.World;
public class EntityNMSArmorStand extends EntityArmorStand implements NMSArmorStand {
private static final ReflectField<Integer> DISABLED_SLOTS_FIELD = new ReflectField<Integer>(EntityArmorStand.class, "bi");
private static final ReflectMethod<Void> SET_MARKER_METHOD = new ReflectMethod<Void>(EntityArmorStand.class, "n", boolean.class);
private boolean lockTick;
private HologramLine parentPiece;
@ -32,14 +38,14 @@ public class EntityNMSArmorStand extends EntityArmorStand implements NMSArmorSta
setGravity(true);
setBasePlate(true);
try {
ReflectionUtils.callPrivateMethod(EntityArmorStand.class, this, "n", new Class[]{ boolean.class }, new Object[]{ true }); // n() = setMarker()
SET_MARKER_METHOD.invoke(this, true);
} catch (Exception e) {
e.printStackTrace();
// It will still work.
DebugHandler.handleDebugException(e);
// It will still work, but the offset will be wrong.
}
this.parentPiece = parentPiece;
try {
ReflectionUtils.setPrivateField(EntityArmorStand.class, this, "bi", Integer.MAX_VALUE);
DISABLED_SLOTS_FIELD.set(this, Integer.MAX_VALUE);
} catch (Exception e) {
// There's still the overridden method.
}

View File

@ -10,7 +10,7 @@ import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBa
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSItem;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ItemUtils;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_8_R3.AxisAlignedBB;
import net.minecraft.server.v1_8_R3.Blocks;
@ -27,6 +27,9 @@ import net.minecraft.server.v1_8_R3.World;
public class EntityNMSItem extends EntityItem implements NMSItem {
private static final ReflectField<Double> RIDER_PITCH_DELTA = new ReflectField<Double>(Entity.class, "ar");
private static final ReflectField<Double> RIDER_YAW_DELTA = new ReflectField<Double>(Entity.class, "as");
private boolean lockTick;
private ItemLine parentPiece;
private ItemPickupManager itemPickupManager;
@ -208,8 +211,8 @@ public class EntityNMSItem extends EntityItem implements NMSItem {
Entity entity = (Entity) vehicleBase;
try {
ReflectionUtils.setPrivateField(Entity.class, this, "ar", 0.0);
ReflectionUtils.setPrivateField(Entity.class, this, "as", 0.0);
RIDER_PITCH_DELTA.set(this, 0.0);
RIDER_YAW_DELTA.set(this, 0.0);
} catch (Exception ex) {
DebugHandler.handleDebugException(ex);
}

View File

@ -8,7 +8,7 @@ import com.gmail.filoghost.holographicdisplays.api.line.HologramLine;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSSlime;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_8_R3.AxisAlignedBB;
import net.minecraft.server.v1_8_R3.DamageSource;
@ -20,6 +20,9 @@ import net.minecraft.server.v1_8_R3.NBTTagCompound;
import net.minecraft.server.v1_8_R3.World;
public class EntityNMSSlime extends EntitySlime implements NMSSlime {
private static final ReflectField<Double> RIDER_PITCH_DELTA = new ReflectField<Double>(Entity.class, "ar");
private static final ReflectField<Double> RIDER_YAW_DELTA = new ReflectField<Double>(Entity.class, "as");
private boolean lockTick;
private HologramLine parentPiece;
@ -175,8 +178,8 @@ public class EntityNMSSlime extends EntitySlime implements NMSSlime {
Entity entity = (Entity) vehicleBase;
try {
ReflectionUtils.setPrivateField(Entity.class, this, "ar", (double) 0.0);
ReflectionUtils.setPrivateField(Entity.class, this, "as", (double) 0.0);
RIDER_PITCH_DELTA.set(this, 0.0);
RIDER_YAW_DELTA.set(this, 0.0);
} catch (Exception ex) {
DebugHandler.handleDebugException(ex);
}

View File

@ -1,6 +1,7 @@
package com.gmail.filoghost.holographicdisplays.nms.v1_8_R3;
import java.lang.reflect.Method;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
@ -18,8 +19,9 @@ import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorSta
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSItem;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.Validator;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_8_R3.Entity;
import net.minecraft.server.v1_8_R3.EntityTypes;
import net.minecraft.server.v1_8_R3.MathHelper;
@ -27,6 +29,9 @@ import net.minecraft.server.v1_8_R3.World;
import net.minecraft.server.v1_8_R3.WorldServer;
public class NmsManagerImpl implements NMSManager {
private static final ReflectField<Map<Class<?>, String>> ENTITY_NAMES_BY_CLASS_FIELD = new ReflectField<Map<Class<?>, String>>(EntityTypes.class, "d");
private static final ReflectField<Map<Class<?>, Integer>> ENTITY_IDS_BY_CLASS_FIELD = new ReflectField<Map<Class<?>, Integer>>(EntityTypes.class, "f");
private Method validateEntityMethod;
@ -41,8 +46,8 @@ public class NmsManagerImpl implements NMSManager {
}
public void registerCustomEntity(Class<?> entityClass, String name, int id) throws Exception {
ReflectionUtils.putInPrivateStaticMap(EntityTypes.class, "d", entityClass, name);
ReflectionUtils.putInPrivateStaticMap(EntityTypes.class, "f", entityClass, Integer.valueOf(id));
ENTITY_NAMES_BY_CLASS_FIELD.getStatic().put(entityClass, name);
ENTITY_IDS_BY_CLASS_FIELD.getStatic().put(entityClass, Integer.valueOf(id));
}
@Override

View File

@ -4,8 +4,9 @@ import org.bukkit.craftbukkit.v1_9_R1.entity.CraftEntity;
import com.gmail.filoghost.holographicdisplays.api.line.HologramLine;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorStand;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.Utils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectionUtils;
import net.minecraft.server.v1_9_R1.AxisAlignedBB;
import net.minecraft.server.v1_9_R1.DamageSource;
@ -23,6 +24,8 @@ import net.minecraft.server.v1_9_R1.Vec3D;
import net.minecraft.server.v1_9_R1.World;
public class EntityNMSArmorStand extends EntityArmorStand implements NMSArmorStand {
private static final ReflectField<Integer> DISABLED_SLOTS_FIELD = new ReflectField<Integer>(EntityArmorStand.class, "bz");
private boolean lockTick;
private HologramLine parentPiece;
@ -37,7 +40,7 @@ public class EntityNMSArmorStand extends EntityArmorStand implements NMSArmorSta
super.setMarker(true);
this.parentPiece = parentPiece;
try {
ReflectionUtils.setPrivateField(EntityArmorStand.class, this, "bz", Integer.MAX_VALUE);
DISABLED_SLOTS_FIELD.set(this, Integer.MAX_VALUE);
} catch (Exception e) {
// There's still the overridden method.
}

View File

@ -10,8 +10,8 @@ import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBa
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSItem;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ItemUtils;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.Utils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_9_R1.AxisAlignedBB;
import net.minecraft.server.v1_9_R1.Blocks;
@ -29,6 +29,8 @@ import net.minecraft.server.v1_9_R1.World;
public class EntityNMSItem extends EntityItem implements NMSItem {
private static final ReflectField<Entity> VEHICLE_FIELD = new ReflectField<Entity>(Entity.class, "as");
private boolean lockTick;
private ItemLine parentPiece;
private ItemPickupManager itemPickupManager;
@ -248,11 +250,11 @@ public class EntityNMSItem extends EntityItem implements NMSItem {
try {
if (super.by() != null) {
Entity oldVehicle = super.by();
ReflectionUtils.setPrivateField(Entity.class, this, "as", null);
VEHICLE_FIELD.set(this, null);
oldVehicle.passengers.remove(this);
}
ReflectionUtils.setPrivateField(Entity.class, this, "as", entity);
VEHICLE_FIELD.set(this, entity);
entity.passengers.clear();
entity.passengers.add(this);

View File

@ -8,8 +8,8 @@ import com.gmail.filoghost.holographicdisplays.api.line.HologramLine;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSSlime;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.Utils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_9_R1.AxisAlignedBB;
import net.minecraft.server.v1_9_R1.DamageSource;
@ -23,6 +23,8 @@ import net.minecraft.server.v1_9_R1.SoundEffect;
import net.minecraft.server.v1_9_R1.World;
public class EntityNMSSlime extends EntitySlime implements NMSSlime {
private static final ReflectField<Entity> VEHICLE_FIELD = new ReflectField<Entity>(Entity.class, "as");
private boolean lockTick;
private HologramLine parentPiece;
@ -212,11 +214,11 @@ public class EntityNMSSlime extends EntitySlime implements NMSSlime {
try {
if (super.by() != null) {
Entity oldVehicle = super.by();
ReflectionUtils.setPrivateField(Entity.class, this, "as", null);
VEHICLE_FIELD.set(this, null);
oldVehicle.passengers.remove(this);
}
ReflectionUtils.setPrivateField(Entity.class, this, "as", entity);
VEHICLE_FIELD.set(this, entity);
entity.passengers.clear();
entity.passengers.add(this);

View File

@ -1,6 +1,7 @@
package com.gmail.filoghost.holographicdisplays.nms.v1_9_R1;
import java.lang.reflect.Method;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
@ -17,8 +18,8 @@ import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorSta
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSItem;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.Validator;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_9_R1.Entity;
import net.minecraft.server.v1_9_R1.EntityTypes;
@ -27,6 +28,9 @@ import net.minecraft.server.v1_9_R1.World;
import net.minecraft.server.v1_9_R1.WorldServer;
public class NmsManagerImpl implements NMSManager {
private static final ReflectField<Map<Class<?>, String>> ENTITY_NAMES_BY_CLASS_FIELD = new ReflectField<Map<Class<?>, String>>(EntityTypes.class, "d");
private static final ReflectField<Map<Class<?>, Integer>> ENTITY_IDS_BY_CLASS_FIELD = new ReflectField<Map<Class<?>, Integer>>(EntityTypes.class, "f");
private Method validateEntityMethod;
@ -41,8 +45,8 @@ public class NmsManagerImpl implements NMSManager {
}
public void registerCustomEntity(Class<?> entityClass, String name, int id) throws Exception {
ReflectionUtils.putInPrivateStaticMap(EntityTypes.class, "d", entityClass, name);
ReflectionUtils.putInPrivateStaticMap(EntityTypes.class, "f", entityClass, Integer.valueOf(id));
ENTITY_NAMES_BY_CLASS_FIELD.getStatic().put(entityClass, name);
ENTITY_IDS_BY_CLASS_FIELD.getStatic().put(entityClass, Integer.valueOf(id));
}
@Override

View File

@ -4,8 +4,8 @@ import org.bukkit.craftbukkit.v1_9_R2.entity.CraftEntity;
import com.gmail.filoghost.holographicdisplays.api.line.HologramLine;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorStand;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.Utils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectionUtils;
import net.minecraft.server.v1_9_R2.AxisAlignedBB;
import net.minecraft.server.v1_9_R2.DamageSource;

View File

@ -10,8 +10,8 @@ import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBa
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSItem;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ItemUtils;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.Utils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_9_R2.AxisAlignedBB;
import net.minecraft.server.v1_9_R2.Blocks;
@ -29,6 +29,8 @@ import net.minecraft.server.v1_9_R2.World;
public class EntityNMSItem extends EntityItem implements NMSItem {
private static final ReflectField<Entity> VEHICLE_FIELD = new ReflectField<Entity>(Entity.class, "at");
private boolean lockTick;
private ItemLine parentPiece;
private ItemPickupManager itemPickupManager;
@ -249,11 +251,11 @@ public class EntityNMSItem extends EntityItem implements NMSItem {
try {
if (super.bz() != null) {
Entity oldVehicle = super.bz();
ReflectionUtils.setPrivateField(Entity.class, this, "at", null);
VEHICLE_FIELD.set(this, null);
oldVehicle.passengers.remove(this);
}
ReflectionUtils.setPrivateField(Entity.class, this, "at", entity);
VEHICLE_FIELD.set(this, entity);
entity.passengers.clear();
entity.passengers.add(this);

View File

@ -8,8 +8,8 @@ import com.gmail.filoghost.holographicdisplays.api.line.HologramLine;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSSlime;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.Utils;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_9_R2.AxisAlignedBB;
import net.minecraft.server.v1_9_R2.DamageSource;
@ -23,6 +23,8 @@ import net.minecraft.server.v1_9_R2.SoundEffect;
import net.minecraft.server.v1_9_R2.World;
public class EntityNMSSlime extends EntitySlime implements NMSSlime {
private static final ReflectField<Entity> VEHICLE_FIELD = new ReflectField<Entity>(Entity.class, "at");
private boolean lockTick;
private HologramLine parentPiece;
@ -213,11 +215,11 @@ public class EntityNMSSlime extends EntitySlime implements NMSSlime {
try {
if (super.bz() != null) {
Entity oldVehicle = super.bz();
ReflectionUtils.setPrivateField(Entity.class, this, "at", null);
VEHICLE_FIELD.set(this, null);
oldVehicle.passengers.remove(this);
}
ReflectionUtils.setPrivateField(Entity.class, this, "at", entity);
VEHICLE_FIELD.set(this, entity);
entity.passengers.clear();
entity.passengers.add(this);

View File

@ -1,6 +1,7 @@
package com.gmail.filoghost.holographicdisplays.nms.v1_9_R2;
import java.lang.reflect.Method;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
@ -18,8 +19,9 @@ import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorSta
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSEntityBase;
import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSItem;
import com.gmail.filoghost.holographicdisplays.util.DebugHandler;
import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils;
import com.gmail.filoghost.holographicdisplays.util.Validator;
import com.gmail.filoghost.holographicdisplays.util.reflection.ReflectField;
import net.minecraft.server.v1_9_R2.Entity;
import net.minecraft.server.v1_9_R2.EntityTypes;
import net.minecraft.server.v1_9_R2.MathHelper;
@ -28,6 +30,9 @@ import net.minecraft.server.v1_9_R2.WorldServer;
public class NmsManagerImpl implements NMSManager {
private static final ReflectField<Map<Class<?>, String>> ENTITY_NAMES_BY_CLASS_FIELD = new ReflectField<Map<Class<?>, String>>(EntityTypes.class, "d");
private static final ReflectField<Map<Class<?>, Integer>> ENTITY_IDS_BY_CLASS_FIELD = new ReflectField<Map<Class<?>, Integer>>(EntityTypes.class, "f");
private Method validateEntityMethod;
@Override
@ -41,8 +46,8 @@ public class NmsManagerImpl implements NMSManager {
}
public void registerCustomEntity(Class<?> entityClass, String name, int id) throws Exception {
ReflectionUtils.putInPrivateStaticMap(EntityTypes.class, "d", entityClass, name);
ReflectionUtils.putInPrivateStaticMap(EntityTypes.class, "f", entityClass, Integer.valueOf(id));
ENTITY_NAMES_BY_CLASS_FIELD.getStatic().put(entityClass, name);
ENTITY_IDS_BY_CLASS_FIELD.getStatic().put(entityClass, Integer.valueOf(id));
}
@Override

View File

@ -0,0 +1,45 @@
package com.gmail.filoghost.holographicdisplays.util.reflection;
import java.lang.reflect.Field;
@SuppressWarnings("unchecked")
public class ReflectField<T> {
private final Class<?> clazz;
private final String name;
private Field field;
public ReflectField(Class<?> clazz, String name) {
this.clazz = clazz;
this.name = name;
}
private void init() throws Exception {
if (field == null) {
field = clazz.getDeclaredField(name);
field.setAccessible(true);
}
}
public T get(Object instance) throws Exception {
init();
return (T) field.get(instance);
}
public T getStatic() throws Exception {
init();
return (T) field.get(null);
}
public void set(Object instance, T value) throws Exception {
init();
field.set(instance, value);
}
public void setStatic(T value) throws Exception {
init();
field.set(null, value);
}
}

View File

@ -0,0 +1,37 @@
package com.gmail.filoghost.holographicdisplays.util.reflection;
import java.lang.reflect.Method;
@SuppressWarnings("unchecked")
public class ReflectMethod<T> {
private final Class<?> clazz;
private final String name;
private final Class<?>[] parameterTypes;
private Method method;
public ReflectMethod(Class<?> clazz, String name, Class<?>... parameterTypes) {
this.clazz = clazz;
this.name = name;
this.parameterTypes = parameterTypes;
}
private void init() throws Exception {
if (method == null) {
method = clazz.getDeclaredMethod(name, parameterTypes);
method.setAccessible(true);
}
}
public T invoke(Object instance, Object... args) throws Exception {
init();
return (T) method.invoke(instance, args);
}
public T invokeStatic(Object... args) throws Exception {
init();
return (T) method.invoke(null, args);
}
}

View File

@ -1,45 +1,18 @@
package com.gmail.filoghost.holographicdisplays.util;
package com.gmail.filoghost.holographicdisplays.util.reflection;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.logging.Level;
import org.bukkit.Bukkit;
public class ReflectionUtils {
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void putInPrivateStaticMap(Class<?> clazz, String fieldName, Object key, Object value) throws Exception {
Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true);
Map map = (Map) field.get(null);
map.put(key, value);
}
public static void setPrivateField(Class<?> clazz, Object handle, String fieldName, Object value) throws Exception {
Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(handle, value);
}
public static Object getPrivateField(Class<?> clazz, Object handle, String fieldName) throws Exception {
Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true);
return field.get(handle);
}
public static Object callPrivateMethod(Class<?> clazz, Object handle, String methodName, Class<?>[] parameterTypes, Object[] args) throws Exception {
Method method = clazz.getDeclaredMethod(methodName, parameterTypes);
method.setAccessible(true);
return method.invoke(handle, args);
}
private static Method getStackTraceElementMethod;
private static Method getStackTraceDepthMethod;
private static boolean stackTraceErrorPrinted;
/**
* If you only need one stack trace element this is faster than Throwable.getStackTrace()[element],
* it doesn't generate the full stack trace.