From 1a41b4bd0dfd192907095a33faa6e78a47736440 Mon Sep 17 00:00:00 2001 From: filoghost Date: Fri, 19 May 2017 20:01:21 +0200 Subject: [PATCH] Fixes #58 --- .../nms/v1_10_R1/EntityNMSArmorStand.java | 2 +- .../nms/v1_11_R1/EntityNMSArmorStand.java | 2 +- .../nms/v1_7_R1/EntityNMSItem.java | 2 +- .../nms/v1_7_R1/EntityNMSWitherSkull.java | 2 +- .../nms/v1_7_R2/EntityNMSItem.java | 2 +- .../nms/v1_7_R2/EntityNMSWitherSkull.java | 2 +- .../nms/v1_7_R3/EntityNMSItem.java | 2 +- .../nms/v1_7_R3/EntityNMSWitherSkull.java | 2 +- .../nms/v1_7_R4/EntityNMSItem.java | 2 +- .../nms/v1_7_R4/EntityNMSWitherSkull.java | 2 +- .../nms/v1_8_R1/EntityNMSArmorStand.java | 2 +- .../nms/v1_8_R2/EntityNMSArmorStand.java | 2 +- .../nms/v1_8_R3/EntityNMSArmorStand.java | 2 +- .../nms/v1_9_R1/EntityNMSArmorStand.java | 2 +- .../nms/v1_9_R2/EntityNMSArmorStand.java | 2 +- .../util/ReflectionUtils.java | 32 +++++++++++++++---- 16 files changed, 41 insertions(+), 21 deletions(-) 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 1a91efa5..722b5b74 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 @@ -128,7 +128,7 @@ public class EntityNMSArmorStand extends EntityArmorStand implements NMSArmorSta @Override public int getId() { StackTraceElement element = ReflectionUtils.getStackTraceElement(2); - if (element.getFileName().equals("EntityTrackerEntry.java") && 158 < element.getLineNumber() && element.getLineNumber() < 168) { + if (element != null && element.getFileName() != null && 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 95980e80..cebf9514 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 @@ -137,7 +137,7 @@ public class EntityNMSArmorStand extends EntityArmorStand implements NMSArmorSta @Override public int getId() { StackTraceElement element = ReflectionUtils.getStackTraceElement(2); - if (element.getFileName().equals("EntityTrackerEntry.java") && 158 < element.getLineNumber() && element.getLineNumber() < 168) { + if (element != null && element.getFileName() != null && 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 63480f2e..0dae7aea 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 @@ -53,7 +53,7 @@ public class EntityNMSItem extends EntityItem implements NMSItem { public ItemStack getItemStack() { // Dirty method to check if the icon is being picked up StackTraceElement element = ReflectionUtils.getStackTraceElement(2); - if (element.getClassName().contains("EntityInsentient")) { + if (element != null && element.getFileName() != null && 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 687b9dd5..3f6b65ad 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 @@ -72,7 +72,7 @@ public class EntityNMSWitherSkull extends EntityWitherSkull implements NMSWither @Override public int getId() { StackTraceElement element = ReflectionUtils.getStackTraceElement(2); - if (element.getFileName().equals("EntityTrackerEntry.java") && element.getLineNumber() > 134 && element.getLineNumber() < 144) { + if (element != null && element.getFileName() != null && 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 2980cdb1..07207e07 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 @@ -53,7 +53,7 @@ public class EntityNMSItem extends EntityItem implements NMSItem { public ItemStack getItemStack() { // Dirty method to check if the icon is being picked up StackTraceElement element = ReflectionUtils.getStackTraceElement(2); - if (element.getClassName().contains("EntityInsentient")) { + if (element != null && element.getFileName() != null && 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 8d199f2a..34810c5d 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 @@ -74,7 +74,7 @@ public class EntityNMSWitherSkull extends EntityWitherSkull implements NMSWither @Override public int getId() { StackTraceElement element = ReflectionUtils.getStackTraceElement(2); - if (element.getFileName().equals("EntityTrackerEntry.java") && element.getLineNumber() > 134 && element.getLineNumber() < 144) { + if (element != null && element.getFileName() != null && 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 76264e14..6618aa77 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 @@ -53,7 +53,7 @@ public class EntityNMSItem extends EntityItem implements NMSItem { public ItemStack getItemStack() { // Dirty method to check if the icon is being picked up StackTraceElement element = ReflectionUtils.getStackTraceElement(2); - if (element.getClassName().contains("EntityInsentient")) { + if (element != null && element.getFileName() != null && 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 fb453704..e31632d6 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 @@ -72,7 +72,7 @@ public class EntityNMSWitherSkull extends EntityWitherSkull implements NMSWither @Override public int getId() { StackTraceElement element = ReflectionUtils.getStackTraceElement(2); - if (element.getFileName().equals("EntityTrackerEntry.java") && element.getLineNumber() > 134 && element.getLineNumber() < 144) { + if (element != null && element.getFileName() != null && 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 8c10ac41..ceee91c2 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 @@ -49,7 +49,7 @@ public class EntityNMSItem extends EntityItem implements NMSItem { public ItemStack getItemStack() { // Dirty method to check if the icon is being picked up StackTraceElement element = ReflectionUtils.getStackTraceElement(2); - if (element.getClassName().contains("EntityInsentient")) { + if (element != null && element.getFileName() != null && 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 2ca907d0..02098653 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 @@ -71,7 +71,7 @@ public class EntityNMSWitherSkull extends EntityWitherSkull implements NMSWither @Override public int getId() { StackTraceElement element = ReflectionUtils.getStackTraceElement(2); - if (element.getFileName().equals("EntityTrackerEntry.java") && element.getLineNumber() > 134 && element.getLineNumber() < 144) { + if (element != null && element.getFileName() != null && 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 bb233ad1..709269c7 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 @@ -113,7 +113,7 @@ public class EntityNMSArmorStand extends EntityArmorStand implements NMSArmorSta @Override public int getId() { StackTraceElement element = ReflectionUtils.getStackTraceElement(2); - if (element.getFileName().equals("EntityTrackerEntry.java") && element.getLineNumber() > 137 && element.getLineNumber() < 147) { + if (element != null && element.getFileName() != null && 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 45c52cfd..ceec74d0 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 @@ -113,7 +113,7 @@ public class EntityNMSArmorStand extends EntityArmorStand implements NMSArmorSta @Override public int getId() { StackTraceElement element = ReflectionUtils.getStackTraceElement(2); - if (element.getFileName().equals("EntityTrackerEntry.java") && element.getLineNumber() > 137 && element.getLineNumber() < 147) { + if (element != null && element.getFileName() != null && 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 67db445c..e0feacbc 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 @@ -113,7 +113,7 @@ public class EntityNMSArmorStand extends EntityArmorStand implements NMSArmorSta @Override public int getId() { StackTraceElement element = ReflectionUtils.getStackTraceElement(2); - if (element.getFileName().equals("EntityTrackerEntry.java") && element.getLineNumber() > 137 && element.getLineNumber() < 147) { + if (element != null && element.getFileName() != null && 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 90ef08de..9bdc65f6 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 @@ -132,7 +132,7 @@ public class EntityNMSArmorStand extends EntityArmorStand implements NMSArmorSta @Override public int getId() { StackTraceElement element = ReflectionUtils.getStackTraceElement(2); - if (element.getFileName().equals("EntityTrackerEntry.java") && element.getLineNumber() > 142 && element.getLineNumber() < 152) { + if (element != null && element.getFileName() != null && 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 6d3af99e..a67e9087 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 @@ -128,7 +128,7 @@ public class EntityNMSArmorStand extends EntityArmorStand implements NMSArmorSta @Override public int getId() { StackTraceElement element = ReflectionUtils.getStackTraceElement(2); - if (element.getFileName().equals("EntityTrackerEntry.java") && element.getLineNumber() > 142 && element.getLineNumber() < 152) { + if (element != null && element.getFileName() != null && 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 1bccd1e1..ed5aff9a 100644 --- a/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/util/ReflectionUtils.java +++ b/HolographicDisplays/Plugin/com/gmail/filoghost/holographicdisplays/util/ReflectionUtils.java @@ -3,10 +3,11 @@ package com.gmail.filoghost.holographicdisplays.util; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Map; +import java.util.logging.Level; + +import com.gmail.filoghost.holographicdisplays.HolographicDisplays; public class ReflectionUtils { - - private static Method getStackTraceElementMethod; @SuppressWarnings({ "rawtypes", "unchecked" }) public static void putInPrivateStaticMap(Class clazz, String fieldName, Object key, Object value) throws Exception { @@ -28,6 +29,11 @@ public class ReflectionUtils { return field.get(handle); } + 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. @@ -38,11 +44,25 @@ public class ReflectionUtils { getStackTraceElementMethod = Throwable.class.getDeclaredMethod("getStackTraceElement", int.class); getStackTraceElementMethod.setAccessible(true); } + if (getStackTraceDepthMethod == null) { + getStackTraceDepthMethod = Throwable.class.getDeclaredMethod("getStackTraceDepth"); + getStackTraceDepthMethod.setAccessible(true); + } - return (StackTraceElement) getStackTraceElementMethod.invoke(new Throwable(), index); - } catch (Exception e) { - // Fallback - return new Throwable().getStackTrace()[index]; + Throwable dummyThrowable = new Throwable(); + int depth = (Integer) getStackTraceDepthMethod.invoke(dummyThrowable); + + if (index < depth) { + return (StackTraceElement) getStackTraceElementMethod.invoke(new Throwable(), index); + } else { + return null; + } + } catch (Throwable t) { + if (!stackTraceErrorPrinted) { + HolographicDisplays.getInstance().getLogger().log(Level.WARNING, "Unable to get a stacktrace element, please inform the developer. You will only see this error once to avoid spam.", t); + stackTraceErrorPrinted = true; + } + return null; } } }