diff --git a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_10_R1/EntityNMSArmorStand.java b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_10_R1/EntityNMSArmorStand.java index a551565d..1a91efa5 100644 --- a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_10_R1/EntityNMSArmorStand.java +++ b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_10_R1/EntityNMSArmorStand.java @@ -19,6 +19,7 @@ import org.bukkit.craftbukkit.v1_10_R1.entity.CraftEntity; import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorStand; import com.gmail.filoghost.holographicdisplays.object.line.CraftHologramLine; +import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils; import com.gmail.filoghost.holographicdisplays.util.Utils; public class EntityNMSArmorStand extends EntityArmorStand implements NMSArmorStand { @@ -126,9 +127,8 @@ public class EntityNMSArmorStand extends EntityArmorStand implements NMSArmorSta @Override public int getId() { - - StackTraceElement[] elements = Thread.currentThread().getStackTrace(); - if (elements.length > 2 && elements[2] != null && elements[2].getFileName().equals("EntityTrackerEntry.java") && 158 < elements[2].getLineNumber() && elements[2].getLineNumber() < 168) { + StackTraceElement element = ReflectionUtils.getStackTraceElement(2); + if (element.getFileName().equals("EntityTrackerEntry.java") && 158 < element.getLineNumber() && element.getLineNumber() < 168) { // Then this method is being called when creating a new movement packet, we return a fake ID! return -1; } diff --git a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_11_R1/EntityNMSArmorStand.java b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_11_R1/EntityNMSArmorStand.java index 467ab253..95980e80 100644 --- a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_11_R1/EntityNMSArmorStand.java +++ b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_11_R1/EntityNMSArmorStand.java @@ -4,6 +4,7 @@ import org.bukkit.craftbukkit.v1_11_R1.entity.CraftEntity; import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorStand; import com.gmail.filoghost.holographicdisplays.object.line.CraftHologramLine; +import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils; import com.gmail.filoghost.holographicdisplays.util.Utils; import net.minecraft.server.v1_11_R1.AxisAlignedBB; @@ -135,9 +136,8 @@ public class EntityNMSArmorStand extends EntityArmorStand implements NMSArmorSta @Override public int getId() { - - StackTraceElement[] elements = Thread.currentThread().getStackTrace(); - if (elements.length > 2 && elements[2] != null && elements[2].getFileName().equals("EntityTrackerEntry.java") && 158 < elements[2].getLineNumber() && elements[2].getLineNumber() < 168) { + StackTraceElement element = ReflectionUtils.getStackTraceElement(2); + if (element.getFileName().equals("EntityTrackerEntry.java") && 158 < element.getLineNumber() && element.getLineNumber() < 168) { // Then this method is being called when creating a new movement packet, we return a fake ID! return -1; } diff --git a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R1/EntityNMSItem.java b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R1/EntityNMSItem.java index 042deba1..63480f2e 100644 --- a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R1/EntityNMSItem.java +++ b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R1/EntityNMSItem.java @@ -52,8 +52,8 @@ public class EntityNMSItem extends EntityItem implements NMSItem { @Override public ItemStack getItemStack() { // Dirty method to check if the icon is being picked up - StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace(); - if (stacktrace.length > 2 && stacktrace[2].getClassName().contains("EntityInsentient")) { + StackTraceElement element = ReflectionUtils.getStackTraceElement(2); + if (element.getClassName().contains("EntityInsentient")) { return null; // Try to pickup this, dear entity ignoring the pickupDelay! } diff --git a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R1/EntityNMSWitherSkull.java b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R1/EntityNMSWitherSkull.java index 62ac7549..687b9dd5 100644 --- a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R1/EntityNMSWitherSkull.java +++ b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R1/EntityNMSWitherSkull.java @@ -4,6 +4,7 @@ import org.bukkit.craftbukkit.v1_7_R1.entity.CraftEntity; import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSWitherSkull; import com.gmail.filoghost.holographicdisplays.object.line.CraftHologramLine; +import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils; import com.gmail.filoghost.holographicdisplays.util.Utils; import net.minecraft.server.v1_7_R1.EntityWitherSkull; @@ -70,9 +71,8 @@ public class EntityNMSWitherSkull extends EntityWitherSkull implements NMSWither @Override public int getId() { - - StackTraceElement[] elements = Thread.currentThread().getStackTrace(); - if (elements.length > 2 && elements[2] != null && elements[2].getFileName().equals("EntityTrackerEntry.java") && elements[2].getLineNumber() > 134 && elements[2].getLineNumber() < 144) { + StackTraceElement element = ReflectionUtils.getStackTraceElement(2); + if (element.getFileName().equals("EntityTrackerEntry.java") && element.getLineNumber() > 134 && element.getLineNumber() < 144) { // Then this method is being called when creating a new packet, we return a fake ID! return -1; } diff --git a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R2/EntityNMSItem.java b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R2/EntityNMSItem.java index 1a575841..2980cdb1 100644 --- a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R2/EntityNMSItem.java +++ b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R2/EntityNMSItem.java @@ -52,8 +52,8 @@ public class EntityNMSItem extends EntityItem implements NMSItem { @Override public ItemStack getItemStack() { // Dirty method to check if the icon is being picked up - StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace(); - if (stacktrace.length > 2 && stacktrace[2].getClassName().contains("EntityInsentient")) { + StackTraceElement element = ReflectionUtils.getStackTraceElement(2); + if (element.getClassName().contains("EntityInsentient")) { return null; // Try to pickup this, dear entity ignoring the pickupDelay! } diff --git a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R2/EntityNMSWitherSkull.java b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R2/EntityNMSWitherSkull.java index 9456dfa4..8d199f2a 100644 --- a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R2/EntityNMSWitherSkull.java +++ b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R2/EntityNMSWitherSkull.java @@ -11,6 +11,7 @@ import org.bukkit.craftbukkit.v1_7_R2.entity.CraftEntity; import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSWitherSkull; import com.gmail.filoghost.holographicdisplays.object.line.CraftHologramLine; +import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils; import com.gmail.filoghost.holographicdisplays.util.Utils; public class EntityNMSWitherSkull extends EntityWitherSkull implements NMSWitherSkull { @@ -72,9 +73,8 @@ public class EntityNMSWitherSkull extends EntityWitherSkull implements NMSWither @Override public int getId() { - - StackTraceElement[] elements = Thread.currentThread().getStackTrace(); - if (elements.length > 2 && elements[2] != null && elements[2].getFileName().equals("EntityTrackerEntry.java") && elements[2].getLineNumber() > 134 && elements[2].getLineNumber() < 144) { + StackTraceElement element = ReflectionUtils.getStackTraceElement(2); + if (element.getFileName().equals("EntityTrackerEntry.java") && element.getLineNumber() > 134 && element.getLineNumber() < 144) { // Then this method is being called when creating a new packet, we return a fake ID! return -1; } diff --git a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R3/EntityNMSItem.java b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R3/EntityNMSItem.java index 9aaf6fa0..76264e14 100644 --- a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R3/EntityNMSItem.java +++ b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R3/EntityNMSItem.java @@ -52,8 +52,8 @@ public class EntityNMSItem extends EntityItem implements NMSItem { @Override public ItemStack getItemStack() { // Dirty method to check if the icon is being picked up - StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace(); - if (stacktrace.length > 2 && stacktrace[2].getClassName().contains("EntityInsentient")) { + StackTraceElement element = ReflectionUtils.getStackTraceElement(2); + if (element.getClassName().contains("EntityInsentient")) { return null; // Try to pickup this, dear entity ignoring the pickupDelay! } diff --git a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R3/EntityNMSWitherSkull.java b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R3/EntityNMSWitherSkull.java index 6f9fea2b..fb453704 100644 --- a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R3/EntityNMSWitherSkull.java +++ b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R3/EntityNMSWitherSkull.java @@ -4,6 +4,7 @@ import org.bukkit.craftbukkit.v1_7_R3.entity.CraftEntity; import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSWitherSkull; import com.gmail.filoghost.holographicdisplays.object.line.CraftHologramLine; +import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils; import com.gmail.filoghost.holographicdisplays.util.Utils; import net.minecraft.server.v1_7_R3.EntityWitherSkull; @@ -70,9 +71,8 @@ public class EntityNMSWitherSkull extends EntityWitherSkull implements NMSWither @Override public int getId() { - - StackTraceElement[] elements = Thread.currentThread().getStackTrace(); - if (elements.length > 2 && elements[2] != null && elements[2].getFileName().equals("EntityTrackerEntry.java") && elements[2].getLineNumber() > 134 && elements[2].getLineNumber() < 144) { + StackTraceElement element = ReflectionUtils.getStackTraceElement(2); + if (element.getFileName().equals("EntityTrackerEntry.java") && element.getLineNumber() > 134 && element.getLineNumber() < 144) { // Then this method is being called when creating a new packet, we return a fake ID! return -1; } diff --git a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R4/EntityNMSItem.java b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R4/EntityNMSItem.java index e04861b6..8c10ac41 100644 --- a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R4/EntityNMSItem.java +++ b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R4/EntityNMSItem.java @@ -48,8 +48,8 @@ public class EntityNMSItem extends EntityItem implements NMSItem { @Override public ItemStack getItemStack() { // Dirty method to check if the icon is being picked up - StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace(); - if (stacktrace.length > 2 && stacktrace[2].getClassName().contains("EntityInsentient")) { + StackTraceElement element = ReflectionUtils.getStackTraceElement(2); + if (element.getClassName().contains("EntityInsentient")) { return null; // Try to pickup this, dear entity ignoring the pickupDelay! } diff --git a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R4/EntityNMSWitherSkull.java b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R4/EntityNMSWitherSkull.java index 75e1d0b4..2ca907d0 100644 --- a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R4/EntityNMSWitherSkull.java +++ b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_7_R4/EntityNMSWitherSkull.java @@ -4,6 +4,7 @@ import org.bukkit.craftbukkit.v1_7_R4.entity.CraftEntity; import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSWitherSkull; import com.gmail.filoghost.holographicdisplays.object.line.CraftHologramLine; +import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils; import com.gmail.filoghost.holographicdisplays.util.Utils; import net.minecraft.server.v1_7_R4.EntityWitherSkull; @@ -69,9 +70,8 @@ public class EntityNMSWitherSkull extends EntityWitherSkull implements NMSWither @Override public int getId() { - - StackTraceElement[] elements = Thread.currentThread().getStackTrace(); - if (elements.length > 2 && elements[2] != null && elements[2].getFileName().equals("EntityTrackerEntry.java") && elements[2].getLineNumber() > 134 && elements[2].getLineNumber() < 144) { + StackTraceElement element = ReflectionUtils.getStackTraceElement(2); + if (element.getFileName().equals("EntityTrackerEntry.java") && element.getLineNumber() > 134 && element.getLineNumber() < 144) { // Then this method is being called when creating a new packet, we return a fake ID! return -1; } diff --git a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_8_R1/EntityNMSArmorStand.java b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_8_R1/EntityNMSArmorStand.java index 79930ba8..bb233ad1 100644 --- a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_8_R1/EntityNMSArmorStand.java +++ b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_8_R1/EntityNMSArmorStand.java @@ -112,9 +112,8 @@ public class EntityNMSArmorStand extends EntityArmorStand implements NMSArmorSta @Override public int getId() { - - StackTraceElement[] elements = Thread.currentThread().getStackTrace(); - if (elements.length > 2 && elements[2] != null && elements[2].getFileName().equals("EntityTrackerEntry.java") && elements[2].getLineNumber() > 137 && elements[2].getLineNumber() < 147) { + StackTraceElement element = ReflectionUtils.getStackTraceElement(2); + if (element.getFileName().equals("EntityTrackerEntry.java") && element.getLineNumber() > 137 && element.getLineNumber() < 147) { // Then this method is being called when creating a new packet, we return a fake ID! return -1; } diff --git a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_8_R2/EntityNMSArmorStand.java b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_8_R2/EntityNMSArmorStand.java index 8788cf0c..45c52cfd 100644 --- a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_8_R2/EntityNMSArmorStand.java +++ b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_8_R2/EntityNMSArmorStand.java @@ -112,9 +112,8 @@ public class EntityNMSArmorStand extends EntityArmorStand implements NMSArmorSta @Override public int getId() { - - StackTraceElement[] elements = Thread.currentThread().getStackTrace(); - if (elements.length > 2 && elements[2] != null && elements[2].getFileName().equals("EntityTrackerEntry.java") && elements[2].getLineNumber() > 137 && elements[2].getLineNumber() < 147) { + StackTraceElement element = ReflectionUtils.getStackTraceElement(2); + if (element.getFileName().equals("EntityTrackerEntry.java") && element.getLineNumber() > 137 && element.getLineNumber() < 147) { // Then this method is being called when creating a new packet, we return a fake ID! return -1; } diff --git a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_8_R3/EntityNMSArmorStand.java b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_8_R3/EntityNMSArmorStand.java index 087067f1..67db445c 100644 --- a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_8_R3/EntityNMSArmorStand.java +++ b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_8_R3/EntityNMSArmorStand.java @@ -112,9 +112,8 @@ public class EntityNMSArmorStand extends EntityArmorStand implements NMSArmorSta @Override public int getId() { - - StackTraceElement[] elements = Thread.currentThread().getStackTrace(); - if (elements.length > 2 && elements[2] != null && elements[2].getFileName().equals("EntityTrackerEntry.java") && elements[2].getLineNumber() > 137 && elements[2].getLineNumber() < 147) { + StackTraceElement element = ReflectionUtils.getStackTraceElement(2); + if (element.getFileName().equals("EntityTrackerEntry.java") && element.getLineNumber() > 137 && element.getLineNumber() < 147) { // Then this method is being called when creating a new packet, we return a fake ID! return -1; } diff --git a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_9_R1/EntityNMSArmorStand.java b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_9_R1/EntityNMSArmorStand.java index 9c77ce38..90ef08de 100644 --- a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_9_R1/EntityNMSArmorStand.java +++ b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_9_R1/EntityNMSArmorStand.java @@ -131,9 +131,8 @@ public class EntityNMSArmorStand extends EntityArmorStand implements NMSArmorSta @Override public int getId() { - - StackTraceElement[] elements = Thread.currentThread().getStackTrace(); - if (elements.length > 2 && elements[2] != null && elements[2].getFileName().equals("EntityTrackerEntry.java") && elements[2].getLineNumber() > 142 && elements[2].getLineNumber() < 152) { + StackTraceElement element = ReflectionUtils.getStackTraceElement(2); + if (element.getFileName().equals("EntityTrackerEntry.java") && element.getLineNumber() > 142 && element.getLineNumber() < 152) { // Then this method is being called when creating a new packet, we return a fake ID! return -1; } diff --git a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_9_R2/EntityNMSArmorStand.java b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_9_R2/EntityNMSArmorStand.java index 72e4f5a7..6d3af99e 100644 --- a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_9_R2/EntityNMSArmorStand.java +++ b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/nms/v1_9_R2/EntityNMSArmorStand.java @@ -19,6 +19,7 @@ import org.bukkit.craftbukkit.v1_9_R2.entity.CraftEntity; import com.gmail.filoghost.holographicdisplays.nms.interfaces.entity.NMSArmorStand; import com.gmail.filoghost.holographicdisplays.object.line.CraftHologramLine; +import com.gmail.filoghost.holographicdisplays.util.ReflectionUtils; import com.gmail.filoghost.holographicdisplays.util.Utils; public class EntityNMSArmorStand extends EntityArmorStand implements NMSArmorStand { @@ -126,9 +127,8 @@ public class EntityNMSArmorStand extends EntityArmorStand implements NMSArmorSta @Override public int getId() { - - StackTraceElement[] elements = Thread.currentThread().getStackTrace(); - if (elements.length > 2 && elements[2] != null && elements[2].getFileName().equals("EntityTrackerEntry.java") && elements[2].getLineNumber() > 142 && elements[2].getLineNumber() < 152) { + StackTraceElement element = ReflectionUtils.getStackTraceElement(2); + if (element.getFileName().equals("EntityTrackerEntry.java") && element.getLineNumber() > 142 && element.getLineNumber() < 152) { // Then this method is being called when creating a new packet, we return a fake ID! return -1; } diff --git a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/util/ReflectionUtils.java b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/util/ReflectionUtils.java index bf2c6c1b..1bccd1e1 100644 --- a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/util/ReflectionUtils.java +++ b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/util/ReflectionUtils.java @@ -1,9 +1,12 @@ package com.gmail.filoghost.holographicdisplays.util; import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.util.Map; public class ReflectionUtils { + + private static Method getStackTraceElementMethod; @SuppressWarnings({ "rawtypes", "unchecked" }) public static void putInPrivateStaticMap(Class clazz, String fieldName, Object key, Object value) throws Exception { @@ -24,4 +27,22 @@ public class ReflectionUtils { field.setAccessible(true); return field.get(handle); } + + /** + * If you only need one stack trace element this is faster than Throwable.getStackTrace()[element], + * it doesn't generate the full stack trace. + */ + public static StackTraceElement getStackTraceElement(int index) { + try { + if (getStackTraceElementMethod == null) { + getStackTraceElementMethod = Throwable.class.getDeclaredMethod("getStackTraceElement", int.class); + getStackTraceElementMethod.setAccessible(true); + } + + return (StackTraceElement) getStackTraceElementMethod.invoke(new Throwable(), index); + } catch (Exception e) { + // Fallback + return new Throwable().getStackTrace()[index]; + } + } }