diff --git a/src/main/java/org/dynmap/bukkit/BukkitVersionHelperCB.java b/src/main/java/org/dynmap/bukkit/BukkitVersionHelperCB.java index 5d560540..10f74112 100644 --- a/src/main/java/org/dynmap/bukkit/BukkitVersionHelperCB.java +++ b/src/main/java/org/dynmap/bukkit/BukkitVersionHelperCB.java @@ -31,6 +31,8 @@ public class BukkitVersionHelperCB extends BukkitVersionHelperGeneric { private Method worldbordermaxx; private Method worldborderminz; private Method worldbordermaxz; + private Method getbiomebyid; + private Method getidbybiome; BukkitVersionHelperCB() { } @@ -63,15 +65,26 @@ public class BukkitVersionHelperCB extends BukkitVersionHelperGeneric { /* Set up biomebase fields */ biomebase = getNMSClass("net.minecraft.server.BiomeBase"); biomebasearray = getNMSClass("[Lnet.minecraft.server.BiomeBase;"); - 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", "ah" }, String.class); - biomebaseid = getField(biomebase, new String[] { "id" }, int.class); + biomebaselist = getPrivateFieldNoFail(biomebase, new String[] { "biomes" }, biomebasearray); + if (biomebaselist == null) { + getbiomebyid = getMethod(biomebase, new String[] { "a" }, new Class[] { int.class} ); + } + biomebasetemp = getPrivateField(biomebase, new String[] { "temperature", "F", "C" }, float.class); + biomebasehumi = getPrivateField(biomebase, new String[] { "humidity", "G", "D" }, float.class); + biomebaseidstring = getPrivateField(biomebase, new String[] { "y", "af", "ah", "z" }, String.class); + biomebaseid = getFieldNoFail(biomebase, new String[] { "id" }, int.class); + if (biomebaseid == null) { + getidbybiome = getMethod(biomebase, new String[] { "a" }, new Class[] { biomebase } ); + } /* n.m.s.World */ nmsworld = getNMSClass("net.minecraft.server.WorldServer"); chunkprovserver = getNMSClass("net.minecraft.server.ChunkProviderServer"); - nmsw_chunkproviderserver = getField(nmsworld, new String[] { "chunkProviderServer" }, chunkprovserver); + nmsw_chunkproviderserver = getPrivateFieldNoFail(nmsworld, new String[] { "chunkProviderServer" }, chunkprovserver); + if (nmsw_chunkproviderserver == null) { + Class nmsworldbase = getNMSClass("net.minecraft.server.World"); + Class nmsichunkprovider = getNMSClass("net.minecraft.server.IChunkProvider"); + nmsw_chunkproviderserver = getPrivateField(nmsworldbase, new String[] { "chunkProvider" }, nmsichunkprovider); + } getworldborder = getMethodNoFail(nmsworld, new String[] { "af" }, nulltypes); longhashset = getOBCClassNoFail("org.bukkit.craftbukkit.util.LongHashSet"); @@ -90,7 +103,7 @@ public class BukkitVersionHelperCB extends BukkitVersionHelperGeneric { /** n.m.s.Chunk */ nmschunk = getNMSClass("net.minecraft.server.Chunk"); nmsc_tileentities = getField(nmschunk, new String[] { "tileEntities" }, Map.class); - nmsc_inhabitedticks = getFieldNoFail(nmschunk, new String[] { "s", "q", "u" }, long.class); + nmsc_inhabitedticks = getFieldNoFail(nmschunk, new String[] { "s", "q", "u", "v" }, long.class); if (nmsc_inhabitedticks == null) { Log.info("inhabitedTicks field not found - inhabited shader not functional"); } @@ -127,7 +140,7 @@ 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_readnbt = getMethod(nms_tileentity, new String[] { "b", "save" }, new Class[] { nbttagcompound }); 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); @@ -268,4 +281,38 @@ public class BukkitVersionHelperCB extends BukkitVersionHelperGeneric { } return p; } + private Object[] biomelist = null; + /** + * Get list of defined biomebase objects + */ + public Object[] getBiomeBaseList() { + if (getbiomebyid != null) { + if (biomelist == null) { + biomelist = new Object[256]; + for (int i = 0; i < 256; i++) { + try { + biomelist[i] = getbiomebyid.invoke(biomebase, i); + } catch (IllegalAccessException x) { + } catch (IllegalArgumentException x) { + } catch (InvocationTargetException x) { + } + } + } + return biomelist; + } + return super.getBiomeBaseList(); + } + /** Get ID from biomebase */ + public int getBiomeBaseID(Object bb) { + if (getidbybiome != null) { + try { + return (Integer) getidbybiome.invoke(biomebase, bb); + } catch (IllegalAccessException e) { + } catch (IllegalArgumentException e) { + } catch (InvocationTargetException e) { + } + } + return super.getBiomeBaseID(bb); + } + } diff --git a/src/main/java/org/dynmap/bukkit/BukkitVersionHelperGeneric.java b/src/main/java/org/dynmap/bukkit/BukkitVersionHelperGeneric.java index 721ea655..0c4ca78d 100644 --- a/src/main/java/org/dynmap/bukkit/BukkitVersionHelperGeneric.java +++ b/src/main/java/org/dynmap/bukkit/BukkitVersionHelperGeneric.java @@ -197,10 +197,22 @@ public abstract class BukkitVersionHelperGeneric extends BukkitVersionHelper { } return null; } + /** + * Get private field + */ + protected Field getPrivateFieldNoFail(Class cls, String[] ids, Class type) { + return getPrivateField(cls, ids, type, true); + } /** * Get private field */ protected Field getPrivateField(Class cls, String[] ids, Class type) { + return getPrivateField(cls, ids, type, false); + } + /** + * Get private field + */ + protected Field getPrivateField(Class cls, String[] ids, Class type, boolean nofail) { if((cls == null) || (type == null)) return null; for(String id : ids) { try { @@ -212,8 +224,10 @@ public abstract class BukkitVersionHelperGeneric extends BukkitVersionHelper { } catch (NoSuchFieldException nsfx) { } } - Log.severe("Unable to find field " + ids[0] + " for " + cls.getName()); - failed = true; + if (!nofail) { + Log.severe("Unable to find field " + ids[0] + " for " + cls.getName()); + failed = true; + } return null; } protected Object getFieldValue(Object obj, Field field, Object def) {