diff --git a/src/me/libraryaddict/disguise/LibsDisguises.java b/src/me/libraryaddict/disguise/LibsDisguises.java index a2229de7..2e84f111 100644 --- a/src/me/libraryaddict/disguise/LibsDisguises.java +++ b/src/me/libraryaddict/disguise/LibsDisguises.java @@ -219,6 +219,7 @@ public class LibsDisguises extends JavaPlugin { ((Zombie) bukkitEntity).setBaby(true); disguiseValues.setBabyBox(ReflectionManager.getBoundingBox(bukkitEntity)); } + disguiseValues.setEntitySize(ReflectionManager.getSize(bukkitEntity)); } catch (Exception ex) { System.out.print("[LibsDisguises] Uh oh! Trouble while making values for the disguise " + disguiseType.name() + "!"); diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 7020aa54..14ae8d4b 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -153,9 +153,9 @@ public class DisguiseUtilities { } } if (isDisguiseInUse(disguise)) { - ReflectionManager.setBoundingBox(entity, entityBox, disguiseBox); + ReflectionManager.setBoundingBox(entity, entityBox, disguiseBox, disguiseValues.getEntitySize()); } else { - ReflectionManager.setBoundingBox(entity, disguiseBox, entityBox); + ReflectionManager.setBoundingBox(entity, disguiseBox, entityBox, entityValues.getEntitySize()); } } } diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseValues.java b/src/me/libraryaddict/disguise/utilities/DisguiseValues.java index 8faeb374..c9344acd 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseValues.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseValues.java @@ -45,6 +45,7 @@ public class DisguiseValues { private FakeBoundingBox adultBox; private FakeBoundingBox babyBox; + private float[] entitySize; private int enumEntitySize; private HashMap metaValues = new HashMap(); private Class nmsEntityClass; @@ -63,6 +64,10 @@ public class DisguiseValues { return babyBox; } + public float[] getEntitySize() { + return entitySize; + } + public int getEntitySize(double paramDouble) { double d = paramDouble - (((int) Math.floor(paramDouble)) + 0.5D); @@ -123,6 +128,10 @@ public class DisguiseValues { babyBox = newBox; } + public void setEntitySize(float[] size) { + this.entitySize = size; + } + public void setMetaValue(int no, Object value) { metaValues.put(no, value); } diff --git a/src/me/libraryaddict/disguise/utilities/FakeBoundingBox.java b/src/me/libraryaddict/disguise/utilities/FakeBoundingBox.java index 59bb3e37..5c516af7 100644 --- a/src/me/libraryaddict/disguise/utilities/FakeBoundingBox.java +++ b/src/me/libraryaddict/disguise/utilities/FakeBoundingBox.java @@ -12,15 +12,15 @@ public class FakeBoundingBox { } public double getX() { - return xMod / 2; + return xMod; } public double getY() { - return yMod / 2; + return yMod; } public double getZ() { - return zMod / 2; + return zMod; } } diff --git a/src/me/libraryaddict/disguise/utilities/ReflectionManager.java b/src/me/libraryaddict/disguise/utilities/ReflectionManager.java index 41208b9c..c19bd2f9 100644 --- a/src/me/libraryaddict/disguise/utilities/ReflectionManager.java +++ b/src/me/libraryaddict/disguise/utilities/ReflectionManager.java @@ -9,7 +9,6 @@ import org.bukkit.Bukkit; import org.bukkit.Sound; import org.bukkit.World; import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; public class ReflectionManager { @@ -215,6 +214,18 @@ public class ReflectionManager { return null; } + public static float[] getSize(Entity entity) { + try { + float length = getNmsClass("Entity").getField("length").getFloat(getNmsEntity(entity)); + float width = getNmsClass("Entity").getField("width").getFloat(getNmsEntity(entity)); + float height = getNmsClass("Entity").getField("height").getFloat(getNmsEntity(entity)); + return new float[] { length, width, height }; + } catch (Exception ex) { + ex.printStackTrace(); + } + return null; + } + public static Float getSoundModifier(Object entity) { try { soundMethod.setAccessible(true); @@ -237,7 +248,7 @@ public class ReflectionManager { return after17; } - public static void setBoundingBox(Entity entity, FakeBoundingBox oldBox, FakeBoundingBox newBox) { + public static void setBoundingBox(Entity entity, FakeBoundingBox oldBox, FakeBoundingBox newBox, float[] entitySize) { try { Object boundingBox = getNmsClass("Entity").getField("boundingBox").get(getNmsEntity(entity)); int stage = 0; @@ -247,16 +258,16 @@ public class ReflectionManager { stage++; switch (stage) { case 1: - x = field.getDouble(boundingBox) + oldBox.getX(); - field.setDouble(boundingBox, x - newBox.getX()); + x = field.getDouble(boundingBox); //+ oldBox.getX(); + // field.setDouble(boundingBox, x - newBox.getX()); break; case 2: - y = field.getDouble(boundingBox) + oldBox.getY(); - field.setDouble(boundingBox, y - newBox.getY()); + y = field.getDouble(boundingBox);// + oldBox.getY(); + // field.setDouble(boundingBox, y - newBox.getY()); break; case 3: - z = field.getDouble(boundingBox) + oldBox.getZ(); - field.setDouble(boundingBox, z - newBox.getZ()); + z = field.getDouble(boundingBox); //+ oldBox.getZ(); + // field.setDouble(boundingBox, z - newBox.getZ()); break; case 4: field.setDouble(boundingBox, x + newBox.getX()); @@ -272,10 +283,17 @@ public class ReflectionManager { } } } - if (entity.getType() != EntityType.PLAYER) { - // entity.teleport(entity.getLocation().clone() - // .subtract(oldBox.getX() - newBox.getX(), oldBox.getY() - newBox.getY(), oldBox.getZ() - newBox.getZ())); - } + setSize(entity, entitySize); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + public static void setSize(Entity entity, float[] size) { + try { + getNmsClass("Entity").getField("length").setFloat(getNmsEntity(entity), size[0]); + getNmsClass("Entity").getField("width").setFloat(getNmsEntity(entity), size[1]); + getNmsClass("Entity").getField("height").setFloat(getNmsEntity(entity), size[2]); } catch (Exception ex) { ex.printStackTrace(); }