From b0d9f5541ac8754be77e235edea19240ded02876 Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Fri, 28 Nov 2014 11:08:44 -0600 Subject: [PATCH] Start Spigot 1.8 support (doesn't work yet....) --- .../dynmap/bukkit/BukkitVersionHelperCB.java | 20 ++++++--- .../bukkit/BukkitVersionHelperGeneric.java | 42 +++++++++++++++++-- 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/dynmap/bukkit/BukkitVersionHelperCB.java b/src/main/java/org/dynmap/bukkit/BukkitVersionHelperCB.java index 042dba50..55c72792 100644 --- a/src/main/java/org/dynmap/bukkit/BukkitVersionHelperCB.java +++ b/src/main/java/org/dynmap/bukkit/BukkitVersionHelperCB.java @@ -5,6 +5,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Map; + import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.Server; @@ -58,7 +59,7 @@ public class BukkitVersionHelperCB extends BukkitVersionHelperGeneric { biomebaselist = getPrivateField(biomebase, new String[] { "biomes" }, biomebasearray); biomebasetemp = getField(biomebase, new String[] { "temperature", "F" }, float.class); biomebasehumi = getField(biomebase, new String[] { "humidity", "G" }, float.class); - biomebaseidstring = getField(biomebase, new String[] { "y", "af" }, String.class); + biomebaseidstring = getField(biomebase, new String[] { "y", "af", "ah" }, String.class); biomebaseid = getField(biomebase, new String[] { "id" }, int.class); /* n.m.s.World */ nmsworld = getNMSClass("net.minecraft.server.WorldServer"); @@ -82,7 +83,7 @@ public class BukkitVersionHelperCB extends BukkitVersionHelperGeneric { nmschunk = getNMSClass("net.minecraft.server.Chunk"); nmsc_removeentities = getMethod(nmschunk, new String[] { "removeEntities" }, new Class[0]); nmsc_tileentities = getField(nmschunk, new String[] { "tileEntities" }, Map.class); - nmsc_inhabitedticks = getFieldNoFail(nmschunk, new String[] { "s", "q" }, long.class); + nmsc_inhabitedticks = getFieldNoFail(nmschunk, new String[] { "s", "q", "u" }, long.class); if (nmsc_inhabitedticks == null) { Log.info("inhabitedTicks field not found - inhabited shader not functional"); } @@ -111,9 +112,18 @@ public class BukkitVersionHelperCB extends BukkitVersionHelperGeneric { /** Tile entity */ nms_tileentity = getNMSClass("net.minecraft.server.TileEntity"); nmst_readnbt = getMethod(nms_tileentity, new String[] { "b" }, new Class[] { nbttagcompound }); - nmst_x = getField(nms_tileentity, new String[] { "x" }, int.class); - nmst_y = getField(nms_tileentity, new String[] { "y" }, int.class); - nmst_z = getField(nms_tileentity, new String[] { "z" }, int.class); + nmst_getposition = getMethodNoFail(nms_tileentity, new String[] { "getPosition" }, new Class[0]); // Try 1.8 method + if (nmst_getposition == null) { + nmst_x = getField(nms_tileentity, new String[] { "x" }, int.class); + nmst_y = getField(nms_tileentity, new String[] { "y" }, int.class); + nmst_z = getField(nms_tileentity, new String[] { "z" }, int.class); + } + else { /* BlockPosition */ + nms_blockposition = getNMSClass("net.minecraft.server.BlockPosition"); + nmsbp_getx = getMethod(nms_blockposition, new String[] { "getX" }, new Class[0]); + nmsbp_gety = getMethod(nms_blockposition, new String[] { "getY" }, new Class[0]); + nmsbp_getz = getMethod(nms_blockposition, new String[] { "getZ" }, new Class[0]); + } } @Override public void unloadChunkNoSave(World w, Chunk c, int cx, int cz) { diff --git a/src/main/java/org/dynmap/bukkit/BukkitVersionHelperGeneric.java b/src/main/java/org/dynmap/bukkit/BukkitVersionHelperGeneric.java index c50a3323..9cc7e518 100644 --- a/src/main/java/org/dynmap/bukkit/BukkitVersionHelperGeneric.java +++ b/src/main/java/org/dynmap/bukkit/BukkitVersionHelperGeneric.java @@ -83,6 +83,13 @@ public abstract class BukkitVersionHelperGeneric extends BukkitVersionHelper { protected Field nmst_x; protected Field nmst_y; protected Field nmst_z; + protected Method nmst_getposition; + /** BlockPosition */ + protected Class nms_blockposition; + protected Method nmsbp_getx; + protected Method nmsbp_gety; + protected Method nmsbp_getz; + /** Server */ protected Method server_getonlineplayers; /** Player */ @@ -231,6 +238,17 @@ public abstract class BukkitVersionHelperGeneric extends BukkitVersionHelper { failed = true; return null; } + protected Method getMethodNoFail(Class cls, String[] ids, Class[] args) { + if(cls == null) return null; + for(String id : ids) { + try { + return cls.getMethod(id, args); + } catch (SecurityException e) { + } catch (NoSuchMethodException e) { + } + } + return null; + } private Object callMethod(Object obj, Method meth, Object[] args, Object def) { if((obj == null) || (meth == null)) { return def; @@ -333,19 +351,37 @@ public abstract class BukkitVersionHelperGeneric extends BukkitVersionHelper { * Get X coordinate of tile entity */ public int getTileEntityX(Object te) { - return (Integer)getFieldValue(te, nmst_x, 0); + if (nmst_getposition == null) { + return (Integer)getFieldValue(te, nmst_x, 0); + } + else { + Object pos = callMethod(te, nmst_getposition, nullargs, null); + return (Integer) callMethod(pos, nmsbp_getx, nullargs, null); + } } /** * Get Y coordinate of tile entity */ public int getTileEntityY(Object te) { - return (Integer)getFieldValue(te, nmst_y, 0); + if (nmst_getposition == null) { + return (Integer)getFieldValue(te, nmst_y, 0); + } + else { + Object pos = callMethod(te, nmst_getposition, nullargs, null); + return (Integer) callMethod(pos, nmsbp_gety, nullargs, null); + } } /** * Get Z coordinate of tile entity */ public int getTileEntityZ(Object te) { - return (Integer)getFieldValue(te, nmst_z, 0); + if (nmst_getposition == null) { + return (Integer)getFieldValue(te, nmst_z, 0); + } + else { + Object pos = callMethod(te, nmst_getposition, nullargs, null); + return (Integer) callMethod(pos, nmsbp_getz, nullargs, null); + } } /** * Read tile entity NBT