Add initial support for Spigot/CB 1.9

This commit is contained in:
Mike Primm 2016-03-01 22:40:52 -06:00
parent 20320c578f
commit 94fc53ef91
2 changed files with 71 additions and 10 deletions

View File

@ -31,6 +31,8 @@ public class BukkitVersionHelperCB extends BukkitVersionHelperGeneric {
private Method worldbordermaxx; private Method worldbordermaxx;
private Method worldborderminz; private Method worldborderminz;
private Method worldbordermaxz; private Method worldbordermaxz;
private Method getbiomebyid;
private Method getidbybiome;
BukkitVersionHelperCB() { BukkitVersionHelperCB() {
} }
@ -63,15 +65,26 @@ public class BukkitVersionHelperCB extends BukkitVersionHelperGeneric {
/* Set up biomebase fields */ /* Set up biomebase fields */
biomebase = getNMSClass("net.minecraft.server.BiomeBase"); biomebase = getNMSClass("net.minecraft.server.BiomeBase");
biomebasearray = getNMSClass("[Lnet.minecraft.server.BiomeBase;"); biomebasearray = getNMSClass("[Lnet.minecraft.server.BiomeBase;");
biomebaselist = getPrivateField(biomebase, new String[] { "biomes" }, biomebasearray); biomebaselist = getPrivateFieldNoFail(biomebase, new String[] { "biomes" }, biomebasearray);
biomebasetemp = getField(biomebase, new String[] { "temperature", "F" }, float.class); if (biomebaselist == null) {
biomebasehumi = getField(biomebase, new String[] { "humidity", "G" }, float.class); getbiomebyid = getMethod(biomebase, new String[] { "a" }, new Class[] { int.class} );
biomebaseidstring = getField(biomebase, new String[] { "y", "af", "ah" }, String.class); }
biomebaseid = getField(biomebase, new String[] { "id" }, 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 */ /* n.m.s.World */
nmsworld = getNMSClass("net.minecraft.server.WorldServer"); nmsworld = getNMSClass("net.minecraft.server.WorldServer");
chunkprovserver = getNMSClass("net.minecraft.server.ChunkProviderServer"); 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); getworldborder = getMethodNoFail(nmsworld, new String[] { "af" }, nulltypes);
longhashset = getOBCClassNoFail("org.bukkit.craftbukkit.util.LongHashSet"); longhashset = getOBCClassNoFail("org.bukkit.craftbukkit.util.LongHashSet");
@ -90,7 +103,7 @@ public class BukkitVersionHelperCB extends BukkitVersionHelperGeneric {
/** n.m.s.Chunk */ /** n.m.s.Chunk */
nmschunk = getNMSClass("net.minecraft.server.Chunk"); nmschunk = getNMSClass("net.minecraft.server.Chunk");
nmsc_tileentities = getField(nmschunk, new String[] { "tileEntities" }, Map.class); 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) { if (nmsc_inhabitedticks == null) {
Log.info("inhabitedTicks field not found - inhabited shader not functional"); Log.info("inhabitedTicks field not found - inhabited shader not functional");
} }
@ -127,7 +140,7 @@ public class BukkitVersionHelperCB extends BukkitVersionHelperGeneric {
/** Tile entity */ /** Tile entity */
nms_tileentity = getNMSClass("net.minecraft.server.TileEntity"); 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 nmst_getposition = getMethodNoFail(nms_tileentity, new String[] { "getPosition" }, new Class[0]); // Try 1.8 method
if (nmst_getposition == null) { if (nmst_getposition == null) {
nmst_x = getField(nms_tileentity, new String[] { "x" }, int.class); nmst_x = getField(nms_tileentity, new String[] { "x" }, int.class);
@ -268,4 +281,38 @@ public class BukkitVersionHelperCB extends BukkitVersionHelperGeneric {
} }
return p; 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);
}
} }

View File

@ -197,10 +197,22 @@ public abstract class BukkitVersionHelperGeneric extends BukkitVersionHelper {
} }
return null; return null;
} }
/**
* Get private field
*/
protected Field getPrivateFieldNoFail(Class<?> cls, String[] ids, Class<?> type) {
return getPrivateField(cls, ids, type, true);
}
/** /**
* Get private field * Get private field
*/ */
protected Field getPrivateField(Class<?> cls, String[] ids, Class<?> type) { 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; if((cls == null) || (type == null)) return null;
for(String id : ids) { for(String id : ids) {
try { try {
@ -212,8 +224,10 @@ public abstract class BukkitVersionHelperGeneric extends BukkitVersionHelper {
} catch (NoSuchFieldException nsfx) { } catch (NoSuchFieldException nsfx) {
} }
} }
Log.severe("Unable to find field " + ids[0] + " for " + cls.getName()); if (!nofail) {
failed = true; Log.severe("Unable to find field " + ids[0] + " for " + cls.getName());
failed = true;
}
return null; return null;
} }
protected Object getFieldValue(Object obj, Field field, Object def) { protected Object getFieldValue(Object obj, Field field, Object def) {