diff --git a/build.gradle b/build.gradle index 65537c06..00f6c842 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ allprojects { apply plugin: 'java' group = 'us.dynmap' - version = '3.0-RC1' + version = '3.0-RC2' } diff --git a/bukkit-helper-113-1/.gitignore b/bukkit-helper-113-1/.gitignore deleted file mode 100644 index 5d644ec0..00000000 --- a/bukkit-helper-113-1/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/target/ -/build/ -/bin/ -/.classpath diff --git a/bukkit-helper-113-1/build.gradle b/bukkit-helper-113-1/build.gradle deleted file mode 100644 index f2d148c7..00000000 --- a/bukkit-helper-113-1/build.gradle +++ /dev/null @@ -1,10 +0,0 @@ - -description = 'bukkit-helper-1.13.1' - -dependencies { - compile project(':bukkit-helper') - compile project(':dynmap-api') - compile project(path: ':DynmapCore', configuration: 'shadow') - compile group: 'org.bukkit', name: 'bukkit', version:'1.13.1-R0.1-SNAPSHOT' - compile group: 'org.bukkit', name: 'craftbukkit', version:'1.13.1-R0.1-SNAPSHOT' -} diff --git a/bukkit-helper-113-1/src/main/java/org/dynmap/bukkit/helper/v113_1/BukkitVersionHelperSpigot113_1.java b/bukkit-helper-113-1/src/main/java/org/dynmap/bukkit/helper/v113_1/BukkitVersionHelperSpigot113_1.java deleted file mode 100644 index 32c198c6..00000000 --- a/bukkit-helper-113-1/src/main/java/org/dynmap/bukkit/helper/v113_1/BukkitVersionHelperSpigot113_1.java +++ /dev/null @@ -1,193 +0,0 @@ -package org.dynmap.bukkit.helper.v113_1; - -import java.lang.reflect.Field; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.IdentityHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.bukkit.Bukkit; -import org.bukkit.Chunk; -import org.bukkit.ChunkSnapshot; -import org.bukkit.Location; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.WorldBorder; -import org.dynmap.DynmapChunk; -import org.dynmap.Log; -import org.dynmap.bukkit.helper.BukkitVersionHelper; -import org.dynmap.bukkit.helper.BukkitVersionHelperCB; -import org.dynmap.bukkit.helper.BukkitWorld; -import org.dynmap.bukkit.helper.v113_1.MapChunkCache113_1; -import org.dynmap.hdmap.HDBlockModels; -import org.dynmap.renderer.DynmapBlockState; -import org.dynmap.utils.MapChunkCache; -import org.dynmap.utils.Polygon; -import org.dynmap.common.BiomeMap; - -import net.minecraft.server.v1_13_R2.BiomeBase; -import net.minecraft.server.v1_13_R2.Block; -import net.minecraft.server.v1_13_R2.BlockFluids; -import net.minecraft.server.v1_13_R2.BlockLogAbstract; -import net.minecraft.server.v1_13_R2.IBlockData; -import net.minecraft.server.v1_13_R2.IBlockState; -import net.minecraft.server.v1_13_R2.IRegistry; -import net.minecraft.server.v1_13_R2.Material; - -/** - * Helper for isolation of bukkit version specific issues - */ -public class BukkitVersionHelperSpigot113_1 extends BukkitVersionHelperCB { - - /** CraftChunkSnapshot */ - protected Class datapalettearray; - private Field blockid_field; - - @Override - protected boolean isBlockIdNeeded() { - return false; - } - - public BukkitVersionHelperSpigot113_1() { - datapalettearray = getNMSClass("[Lnet.minecraft.server.DataPaletteBlock;"); - blockid_field = getPrivateField(craftchunksnapshot, new String[] { "blockids" }, datapalettearray); - } - - @Override - public Object[] getBlockIDFieldFromSnapshot(ChunkSnapshot css) { - try { - return (Object[]) blockid_field.get(css); - } catch (IllegalArgumentException e) { - } catch (IllegalAccessException e) { - } - return null; - } - @Override - public void unloadChunkNoSave(World w, Chunk c, int cx, int cz) { - w.unloadChunk(cx, cz, false, false); - } - - private String stripBlockString(String bname) { - int idx = bname.indexOf('{'); - if (idx >= 0) bname = bname.substring(idx+1); - idx = bname.indexOf('}'); - if (idx >= 0) bname = bname.substring(0, idx); - return bname; - } - /** - * Get block short name list - */ - @Override - public String[] getBlockNames() { - int cnt = Block.REGISTRY_ID.a(); - String[] names = new String[cnt]; - for (int i = 0; i < cnt; i++) { - IBlockData bd = Block.getByCombinedId(i); - names[i] = IRegistry.BLOCK.getKey(bd.getBlock()).toString(); - Log.info(i + ": blk=" + names[i] + ", bd=" + bd.toString()); - } - return names; - } - /** Get ID from biomebase */ - @Override - public int getBiomeBaseID(Object bb) { - return IRegistry.BIOME.a((BiomeBase)bb); - } - - public static IdentityHashMap dataToState; - - /** - * Initialize block states (org.dynmap.blockstate.DynmapBlockState) - */ - @Override - public void initializeBlockStates() { - dataToState = new IdentityHashMap(); - HashMap lastBlockState = new HashMap(); - - int cnt = Block.REGISTRY_ID.a(); - // Loop through block data states - for (int i = 0; i < cnt; i++) { - IBlockData bd = Block.getByCombinedId(i); - String bname = IRegistry.BLOCK.getKey(bd.getBlock()).toString(); - DynmapBlockState lastbs = lastBlockState.get(bname); // See if we have seen this one - int idx = 0; - if (lastbs != null) { // Yes - idx = lastbs.getStateCount(); // Get number of states so far, since this is next - } - // Build state name - String sb = ""; - String fname = bd.toString(); - int off1 = fname.indexOf('['); - if (off1 >= 0) { - int off2 = fname.indexOf(']'); - sb = fname.substring(off1+1, off2); - } - Material mat = bd.getMaterial(); - DynmapBlockState bs = new DynmapBlockState(lastbs, idx, bname, sb, mat.toString()); - if ((!bd.s().e()) && ((bd.getBlock() instanceof BlockFluids) == false)) { // Test if fluid type for block is not empty - bs.setWaterlogged(); - } - if (mat == Material.AIR) { - bs.setAir(); - } - if (mat == Material.LEAVES) { - bs.setLeaves(); - } - if (bd.getBlock() instanceof BlockLogAbstract) { - bs.setLog(); - } - if (mat.isSolid()) { - bs.setSolid(); - } - dataToState.put(bd, bs); - lastBlockState.put(bname, (lastbs == null) ? bs : lastbs); - Log.verboseinfo(i + ": blk=" + bname + ", idx=" + idx + ", state=" + sb + ", waterlogged=" + bs.isWaterlogged()); - } - } - /** - * Create chunk cache for given chunks of given world - * @param dw - world - * @param chunks - chunk list - * @return cache - */ - @Override - public MapChunkCache getChunkCache(BukkitWorld dw, List chunks) { - MapChunkCache113_1 c = new MapChunkCache113_1(); - c.setChunks(dw, chunks); - return c; - } - - /** - * Get biome base water multiplier - */ - @Override - public int getBiomeBaseWaterMult(Object bb) { - return ((BiomeBase)bb).n(); - } - - @Override - public Polygon getWorldBorder(World world) { - Polygon p = null; - WorldBorder wb = world.getWorldBorder(); - if (wb != null) { - Location c = wb.getCenter(); - double size = wb.getSize(); - if ((size > 1) && (size < 1E7)) { - size = size / 2; - p = new Polygon(); - p.addVertex(c.getX()-size, c.getZ()-size); - p.addVertex(c.getX()+size, c.getZ()-size); - p.addVertex(c.getX()+size, c.getZ()+size); - p.addVertex(c.getX()-size, c.getZ()+size); - } - } - return p; - } - -} diff --git a/bukkit-helper-113-1/src/main/java/org/dynmap/bukkit/helper/v113_1/MapChunkCache113_1.java b/bukkit-helper-113-1/src/main/java/org/dynmap/bukkit/helper/v113_1/MapChunkCache113_1.java deleted file mode 100644 index 9332d2fc..00000000 --- a/bukkit-helper-113-1/src/main/java/org/dynmap/bukkit/helper/v113_1/MapChunkCache113_1.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.dynmap.bukkit.helper.v113_1; - -import org.bukkit.block.Biome; -import org.bukkit.ChunkSnapshot; -import org.dynmap.bukkit.helper.AbstractMapChunkCache; -import org.dynmap.bukkit.helper.BukkitVersionHelper; -import org.dynmap.renderer.DynmapBlockState; - -import net.minecraft.server.v1_13_R2.DataPaletteBlock; - -/** - * Container for managing chunks - dependent upon using chunk snapshots, since rendering is off server thread - */ -public class MapChunkCache113_1 extends AbstractMapChunkCache { - - public static class WrappedSnapshot implements Snapshot { - private final ChunkSnapshot ss; - private final DataPaletteBlock[] blockids; - private final int sectionmask; - public WrappedSnapshot(ChunkSnapshot ss) { - this.ss = ss; - blockids = (DataPaletteBlock[]) BukkitVersionHelper.helper.getBlockIDFieldFromSnapshot(ss); - int mask = 0; - for (int i = 0; i < blockids.length; i++) { - if (ss.isSectionEmpty(i)) - mask |= (1 << i); - } - sectionmask = mask; - } - @Override - public final DynmapBlockState getBlockType(int x, int y, int z) { - if ((sectionmask & (1 << (y >> 4))) != 0) - return DynmapBlockState.AIR; - return BukkitVersionHelperSpigot113_1.dataToState.getOrDefault(blockids[y >> 4].a(x & 0xF, y & 0xF, z & 0xF), DynmapBlockState.AIR); - } - @Override - public final int getBlockSkyLight(int x, int y, int z) { - return ss.getBlockSkyLight(x, y, z); - } - @Override - public final int getBlockEmittedLight(int x, int y, int z) { - return ss.getBlockEmittedLight(x, y, z); - } - @Override - public final int getHighestBlockYAt(int x, int z) { - return ss.getHighestBlockYAt(x, z); - } - @Override - public final Biome getBiome(int x, int z) { - return ss.getBiome(x, z); - } - @Override - public final boolean isSectionEmpty(int sy) { - return (sectionmask & (1 << sy)) != 0; - } - @Override - public final Object[] getBiomeBaseFromSnapshot() { - return BukkitVersionHelper.helper.getBiomeBaseFromSnapshot(ss); - } - } - - @Override - public Snapshot wrapChunkSnapshot(ChunkSnapshot css) { - return new WrappedSnapshot(css); - } -} diff --git a/bukkit-helper-113/.gitignore b/bukkit-helper-113/.gitignore deleted file mode 100644 index 5d644ec0..00000000 --- a/bukkit-helper-113/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/target/ -/build/ -/bin/ -/.classpath diff --git a/bukkit-helper-113/.project b/bukkit-helper-113/.project deleted file mode 100644 index 77e7670f..00000000 --- a/bukkit-helper-113/.project +++ /dev/null @@ -1,29 +0,0 @@ - - - bukkit-helper-113 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.buildship.core.gradleprojectbuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - org.eclipse.buildship.core.gradleprojectnature - - diff --git a/bukkit-helper-113/.settings/org.eclipse.buildship.core.prefs b/bukkit-helper-113/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index a7b84d92..00000000 --- a/bukkit-helper-113/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,2 +0,0 @@ -connection.project.dir=.. -eclipse.preferences.version=1 diff --git a/bukkit-helper-113/.settings/org.eclipse.core.resources.prefs b/bukkit-helper-113/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 8bc0e1c8..00000000 --- a/bukkit-helper-113/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,5 +0,0 @@ -eclipse.preferences.version=1 -encoding//src/main/java=UTF-8 -encoding//src/test/java=UTF-8 -encoding//src/test/resources=UTF-8 -encoding/=UTF-8 diff --git a/bukkit-helper-113/.settings/org.eclipse.jdt.core.prefs b/bukkit-helper-113/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index d59e09c9..00000000 --- a/bukkit-helper-113/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,5 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/bukkit-helper-113/.settings/org.eclipse.m2e.core.prefs b/bukkit-helper-113/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index 14b697b7..00000000 --- a/bukkit-helper-113/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 diff --git a/bukkit-helper-113/bin/.gitignore b/bukkit-helper-113/bin/.gitignore deleted file mode 100644 index 5d644ec0..00000000 --- a/bukkit-helper-113/bin/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/target/ -/build/ -/bin/ -/.classpath diff --git a/bukkit-helper-113/build.gradle b/bukkit-helper-113/build.gradle deleted file mode 100644 index 897857e0..00000000 --- a/bukkit-helper-113/build.gradle +++ /dev/null @@ -1,10 +0,0 @@ - -description = 'bukkit-helper-1.13' - -dependencies { - compile project(':bukkit-helper') - compile project(':dynmap-api') - compile project(path: ':DynmapCore', configuration: 'shadow') - compile group: 'org.bukkit', name: 'bukkit', version:'1.13-R0.1-SNAPSHOT' - compile group: 'org.bukkit', name: 'craftbukkit', version:'1.13-R0.1-SNAPSHOT' -} diff --git a/bukkit-helper-113/src/main/java/org/dynmap/bukkit/helper/v113/BukkitVersionHelperSpigot113.java b/bukkit-helper-113/src/main/java/org/dynmap/bukkit/helper/v113/BukkitVersionHelperSpigot113.java deleted file mode 100644 index bb5cae28..00000000 --- a/bukkit-helper-113/src/main/java/org/dynmap/bukkit/helper/v113/BukkitVersionHelperSpigot113.java +++ /dev/null @@ -1,187 +0,0 @@ -package org.dynmap.bukkit.helper.v113; - -import java.lang.reflect.Field; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.IdentityHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.bukkit.Bukkit; -import org.bukkit.Chunk; -import org.bukkit.ChunkSnapshot; -import org.bukkit.Location; -import org.bukkit.Server; -import org.bukkit.World; -import org.bukkit.WorldBorder; -import org.dynmap.DynmapChunk; -import org.dynmap.Log; -import org.dynmap.bukkit.helper.BukkitVersionHelper; -import org.dynmap.bukkit.helper.BukkitVersionHelperCB; -import org.dynmap.bukkit.helper.BukkitWorld; -import org.dynmap.hdmap.HDBlockModels; -import org.dynmap.renderer.DynmapBlockState; -import org.dynmap.utils.MapChunkCache; -import org.dynmap.utils.Polygon; -import org.dynmap.bukkit.helper.v113.MapChunkCache113; -import org.dynmap.common.BiomeMap; - -import net.minecraft.server.v1_13_R1.BiomeBase; -import net.minecraft.server.v1_13_R1.Block; -import net.minecraft.server.v1_13_R1.BlockFluids; -import net.minecraft.server.v1_13_R1.BlockLogAbstract; -import net.minecraft.server.v1_13_R1.IBlockData; -import net.minecraft.server.v1_13_R1.IBlockState; -import net.minecraft.server.v1_13_R1.Material; - -/** - * Helper for isolation of bukkit version specific issues - */ -public class BukkitVersionHelperSpigot113 extends BukkitVersionHelperCB { - - /** CraftChunkSnapshot */ - protected Class datapalettearray; - private Field blockid_field; - - @Override - protected boolean isBlockIdNeeded() { - return false; - } - - public BukkitVersionHelperSpigot113() { - datapalettearray = getNMSClass("[Lnet.minecraft.server.DataPaletteBlock;"); - blockid_field = getPrivateField(craftchunksnapshot, new String[] { "blockids" }, datapalettearray); - } - - @Override - public Object[] getBlockIDFieldFromSnapshot(ChunkSnapshot css) { - try { - return (Object[]) blockid_field.get(css); - } catch (IllegalArgumentException e) { - } catch (IllegalAccessException e) { - } - return null; - } - @Override - public void unloadChunkNoSave(World w, Chunk c, int cx, int cz) { - w.unloadChunk(cx, cz, false, false); - } - - private String stripBlockString(String bname) { - int idx = bname.indexOf('{'); - if (idx >= 0) bname = bname.substring(idx+1); - idx = bname.indexOf('}'); - if (idx >= 0) bname = bname.substring(0, idx); - return bname; - } - /** - * Get block short name list - */ - @Override - public String[] getBlockNames() { - int cnt = Block.REGISTRY_ID.a(); - String[] names = new String[cnt]; - for (int i = 0; i < cnt; i++) { - IBlockData bd = Block.getByCombinedId(i); - names[i] = Block.REGISTRY.b(bd.getBlock()).b(); - Log.info(i + ": blk=" + names[i] + ", bd=" + bd.toString()); - } - return names; - } - - public static IdentityHashMap dataToState; - - /** - * Initialize block states (org.dynmap.blockstate.DynmapBlockState) - */ - @Override - public void initializeBlockStates() { - dataToState = new IdentityHashMap(); - HashMap lastBlockState = new HashMap(); - - int cnt = Block.REGISTRY_ID.a(); - // Loop through block data states - for (int i = 0; i < cnt; i++) { - IBlockData bd = Block.getByCombinedId(i); - String bname = Block.REGISTRY.b(bd.getBlock()).toString(); - DynmapBlockState lastbs = lastBlockState.get(bname); // See if we have seen this one - int idx = 0; - if (lastbs != null) { // Yes - idx = lastbs.getStateCount(); // Get number of states so far, since this is next - } - // Build state name - String sb = ""; - String fname = bd.toString(); - int off1 = fname.indexOf('['); - if (off1 >= 0) { - int off2 = fname.indexOf(']'); - sb = fname.substring(off1+1, off2); - } - Material mat = bd.getMaterial(); - DynmapBlockState bs = new DynmapBlockState(lastbs, idx, bname, sb, mat.toString()); - if ((!bd.s().e()) && ((bd.getBlock() instanceof BlockFluids) == false)) { // Test if fluid type for block is not empty - bs.setWaterlogged(); - } - if (mat == Material.AIR) { - bs.setAir(); - } - if (mat == Material.LEAVES) { - bs.setLeaves(); - } - if (bd.getBlock() instanceof BlockLogAbstract) { - bs.setLog(); - } - if (mat.isSolid()) { - bs.setSolid(); - } - dataToState.put(bd, bs); - lastBlockState.put(bname, (lastbs == null) ? bs : lastbs); - Log.verboseinfo(i + ": blk=" + bname + ", idx=" + idx + ", state=" + sb + ", waterlogged=" + bs.isWaterlogged()); - } - } - /** - * Create chunk cache for given chunks of given world - * @param dw - world - * @param chunks - chunk list - * @return cache - */ - @Override - public MapChunkCache getChunkCache(BukkitWorld dw, List chunks) { - MapChunkCache113 c = new MapChunkCache113(); - c.setChunks(dw, chunks); - return c; - } - - /** - * Get biome base water multiplier - */ - @Override - public int getBiomeBaseWaterMult(Object bb) { - return ((BiomeBase)bb).n(); - } - - @Override - public Polygon getWorldBorder(World world) { - Polygon p = null; - WorldBorder wb = world.getWorldBorder(); - if (wb != null) { - Location c = wb.getCenter(); - double size = wb.getSize(); - if ((size > 1) && (size < 1E7)) { - size = size / 2; - p = new Polygon(); - p.addVertex(c.getX()-size, c.getZ()-size); - p.addVertex(c.getX()+size, c.getZ()-size); - p.addVertex(c.getX()+size, c.getZ()+size); - p.addVertex(c.getX()-size, c.getZ()+size); - } - } - return p; - } - -} diff --git a/bukkit-helper-113/src/main/java/org/dynmap/bukkit/helper/v113/MapChunkCache113.java b/bukkit-helper-113/src/main/java/org/dynmap/bukkit/helper/v113/MapChunkCache113.java deleted file mode 100644 index 3570b2ff..00000000 --- a/bukkit-helper-113/src/main/java/org/dynmap/bukkit/helper/v113/MapChunkCache113.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.dynmap.bukkit.helper.v113; - -import org.bukkit.block.Biome; -import org.bukkit.ChunkSnapshot; -import org.dynmap.bukkit.helper.AbstractMapChunkCache; -import org.dynmap.bukkit.helper.BukkitVersionHelper; -import org.dynmap.renderer.DynmapBlockState; - -import net.minecraft.server.v1_13_R1.DataPaletteBlock; - -/** - * Container for managing chunks - dependent upon using chunk snapshots, since rendering is off server thread - */ -public class MapChunkCache113 extends AbstractMapChunkCache { - - public static class WrappedSnapshot implements Snapshot { - private final ChunkSnapshot ss; - private final DataPaletteBlock[] blockids; - private final int sectionmask; - public WrappedSnapshot(ChunkSnapshot ss) { - this.ss = ss; - blockids = (DataPaletteBlock[]) BukkitVersionHelper.helper.getBlockIDFieldFromSnapshot(ss); - int mask = 0; - for (int i = 0; i < blockids.length; i++) { - if (ss.isSectionEmpty(i)) - mask |= (1 << i); - } - sectionmask = mask; - } - @Override - public final DynmapBlockState getBlockType(int x, int y, int z) { - if ((sectionmask & (1 << (y >> 4))) != 0) - return DynmapBlockState.AIR; - return BukkitVersionHelperSpigot113.dataToState.getOrDefault(blockids[y >> 4].a(x & 0xF, y & 0xF, z & 0xF), DynmapBlockState.AIR); - } - @Override - public final int getBlockSkyLight(int x, int y, int z) { - return ss.getBlockSkyLight(x, y, z); - } - @Override - public final int getBlockEmittedLight(int x, int y, int z) { - return ss.getBlockEmittedLight(x, y, z); - } - @Override - public final int getHighestBlockYAt(int x, int z) { - return ss.getHighestBlockYAt(x, z); - } - @Override - public final Biome getBiome(int x, int z) { - return ss.getBiome(x, z); - } - @Override - public final boolean isSectionEmpty(int sy) { - return (sectionmask & (1 << sy)) != 0; - } - @Override - public final Object[] getBiomeBaseFromSnapshot() { - return BukkitVersionHelper.helper.getBiomeBaseFromSnapshot(ss); - } - } - - @Override - public Snapshot wrapChunkSnapshot(ChunkSnapshot css) { - return new WrappedSnapshot(css); - } -} diff --git a/bukkit-helper-114/.gitignore b/bukkit-helper-114/.gitignore deleted file mode 100644 index 5d644ec0..00000000 --- a/bukkit-helper-114/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/target/ -/build/ -/bin/ -/.classpath diff --git a/bukkit-helper-114/build.gradle b/bukkit-helper-114/build.gradle deleted file mode 100644 index 2e3993a9..00000000 --- a/bukkit-helper-114/build.gradle +++ /dev/null @@ -1,10 +0,0 @@ - -description = 'bukkit-helper-1.14' - -dependencies { - compile project(':bukkit-helper') - compile project(':dynmap-api') - compile project(path: ':DynmapCore', configuration: 'shadow') - compile group: 'org.bukkit', name: 'bukkit', version:'1.14-R0.1-SNAPSHOT' - compile group: 'org.bukkit', name: 'craftbukkit', version:'1.14-R0.1-SNAPSHOT' -} diff --git a/bukkit-helper-114/src/main/java/org/dynmap/bukkit/helper/v114/BukkitVersionHelperSpigot114.java b/bukkit-helper-114/src/main/java/org/dynmap/bukkit/helper/v114/BukkitVersionHelperSpigot114.java deleted file mode 100644 index 6ca77374..00000000 --- a/bukkit-helper-114/src/main/java/org/dynmap/bukkit/helper/v114/BukkitVersionHelperSpigot114.java +++ /dev/null @@ -1,207 +0,0 @@ -package org.dynmap.bukkit.helper.v114; - -import java.lang.reflect.Field; - -import java.util.HashMap; -import java.util.IdentityHashMap; -import java.util.List; -import org.bukkit.Chunk; -import org.bukkit.ChunkSnapshot; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.WorldBorder; -import org.dynmap.DynmapChunk; -import org.dynmap.Log; -import org.dynmap.bukkit.helper.BukkitVersionHelperCB; -import org.dynmap.bukkit.helper.BukkitWorld; -import org.dynmap.bukkit.helper.v114.MapChunkCache114; -import org.dynmap.renderer.DynmapBlockState; -import org.dynmap.utils.MapChunkCache; -import org.dynmap.utils.Polygon; - -import net.minecraft.server.v1_14_R1.BiomeBase; -import net.minecraft.server.v1_14_R1.Block; -import net.minecraft.server.v1_14_R1.BlockFluids; -import net.minecraft.server.v1_14_R1.BlockLogAbstract; -import net.minecraft.server.v1_14_R1.IBlockData; -import net.minecraft.server.v1_14_R1.IRegistry; -import net.minecraft.server.v1_14_R1.Material; - -/** - * Helper for isolation of bukkit version specific issues - */ -public class BukkitVersionHelperSpigot114 extends BukkitVersionHelperCB { - - /** CraftChunkSnapshot */ - protected Class datapalettearray; - private Field blockid_field; - - @Override - protected boolean isBlockIdNeeded() { - return false; - } - - @Override - protected boolean isBiomeBaseListNeeded() { - return false; - } - - public BukkitVersionHelperSpigot114() { - datapalettearray = getNMSClass("[Lnet.minecraft.server.DataPaletteBlock;"); - blockid_field = getPrivateField(craftchunksnapshot, new String[] { "blockids" }, datapalettearray); - } - - @Override - public Object[] getBlockIDFieldFromSnapshot(ChunkSnapshot css) { - try { - return (Object[]) blockid_field.get(css); - } catch (IllegalArgumentException e) { - } catch (IllegalAccessException e) { - } - return null; - } - @Override - public void unloadChunkNoSave(World w, Chunk c, int cx, int cz) { - w.unloadChunk(cx, cz, false); - } - - /** - * Get block short name list - */ - @Override - public String[] getBlockNames() { - int cnt = Block.REGISTRY_ID.a(); - String[] names = new String[cnt]; - for (int i = 0; i < cnt; i++) { - IBlockData bd = Block.getByCombinedId(i); - names[i] = IRegistry.BLOCK.getKey(bd.getBlock()).toString(); - Log.info(i + ": blk=" + names[i] + ", bd=" + bd.toString()); - } - return names; - } - - /** - * Get list of defined biomebase objects - */ - @Override - public Object[] getBiomeBaseList() { - if (biomelist == null) { - biomelist = new Object[1024]; - for (int i = 0; i < 1024; i++) { - biomelist[i] = IRegistry.BIOME.fromId(i); - if (biomelist[i] != null) - Log.info("biome[" + i + "]=" + biomelist[i].toString()); - } - } - return biomelist; - } - - /** Get ID from biomebase */ - @Override - public int getBiomeBaseID(Object bb) { - return IRegistry.BIOME.a((BiomeBase)bb); - } - - public static IdentityHashMap dataToState; - - /** - * Initialize block states (org.dynmap.blockstate.DynmapBlockState) - */ - @Override - public void initializeBlockStates() { - dataToState = new IdentityHashMap(); - HashMap lastBlockState = new HashMap(); - - int cnt = Block.REGISTRY_ID.a(); - // Loop through block data states - for (int i = 0; i < cnt; i++) { - IBlockData bd = Block.getByCombinedId(i); - String bname = IRegistry.BLOCK.getKey(bd.getBlock()).toString(); - DynmapBlockState lastbs = lastBlockState.get(bname); // See if we have seen this one - int idx = 0; - if (lastbs != null) { // Yes - idx = lastbs.getStateCount(); // Get number of states so far, since this is next - } - // Build state name - String sb = ""; - String fname = bd.toString(); - int off1 = fname.indexOf('['); - if (off1 >= 0) { - int off2 = fname.indexOf(']'); - sb = fname.substring(off1+1, off2); - } - Material mat = bd.getMaterial(); - DynmapBlockState bs = new DynmapBlockState(lastbs, idx, bname, sb, mat.toString()); - if ((!bd.p().isEmpty()) && ((bd.getBlock() instanceof BlockFluids) == false)) { // Test if fluid type for block is not empty - bs.setWaterlogged(); - } - if (mat == Material.AIR) { - bs.setAir(); - } - if (mat == Material.LEAVES) { - bs.setLeaves(); - } - if (bd.getBlock() instanceof BlockLogAbstract) { - bs.setLog(); - } - if (mat.isSolid()) { - bs.setSolid(); - } - dataToState.put(bd, bs); - lastBlockState.put(bname, (lastbs == null) ? bs : lastbs); - Log.verboseinfo(i + ": blk=" + bname + ", idx=" + idx + ", state=" + sb + ", waterlogged=" + bs.isWaterlogged()); - } - } - /** - * Create chunk cache for given chunks of given world - * @param dw - world - * @param chunks - chunk list - * @return cache - */ - @Override - public MapChunkCache getChunkCache(BukkitWorld dw, List chunks) { - MapChunkCache114 c = new MapChunkCache114(); - c.setChunks(dw, chunks); - return c; - } - - /** - * Get biome base water multiplier - */ - @Override - public int getBiomeBaseWaterMult(Object bb) { - return ((BiomeBase)bb).m(); - } - - /** Get temperature from biomebase */ - @Override - public float getBiomeBaseTemperature(Object bb) { - return ((BiomeBase)bb).getTemperature(); - } - - /** Get humidity from biomebase */ - @Override - public float getBiomeBaseHumidity(Object bb) { - return ((BiomeBase)bb).getHumidity(); - } - - @Override - public Polygon getWorldBorder(World world) { - Polygon p = null; - WorldBorder wb = world.getWorldBorder(); - if (wb != null) { - Location c = wb.getCenter(); - double size = wb.getSize(); - if ((size > 1) && (size < 1E7)) { - size = size / 2; - p = new Polygon(); - p.addVertex(c.getX()-size, c.getZ()-size); - p.addVertex(c.getX()+size, c.getZ()-size); - p.addVertex(c.getX()+size, c.getZ()+size); - p.addVertex(c.getX()-size, c.getZ()+size); - } - } - return p; - } - -} diff --git a/bukkit-helper-114/src/main/java/org/dynmap/bukkit/helper/v114/MapChunkCache114.java b/bukkit-helper-114/src/main/java/org/dynmap/bukkit/helper/v114/MapChunkCache114.java deleted file mode 100644 index b085bb77..00000000 --- a/bukkit-helper-114/src/main/java/org/dynmap/bukkit/helper/v114/MapChunkCache114.java +++ /dev/null @@ -1,460 +0,0 @@ -package org.dynmap.bukkit.helper.v114; - -import org.bukkit.block.Biome; -import org.bukkit.craftbukkit.v1_14_R1.CraftWorld; - -import java.io.IOException; -import java.util.Arrays; - -import org.bukkit.ChunkSnapshot; -import org.bukkit.World; -import org.dynmap.DynmapChunk; -import org.dynmap.DynmapCore; -import org.dynmap.bukkit.helper.AbstractMapChunkCache; -import org.dynmap.bukkit.helper.BukkitVersionHelper; -import org.dynmap.bukkit.helper.SnapshotCache; -import org.dynmap.bukkit.helper.SnapshotCache.SnapshotRec; -import org.dynmap.renderer.DynmapBlockState; -import org.dynmap.utils.DynIntHashMap; -import org.dynmap.utils.VisibilityLimit; - -import net.minecraft.server.v1_14_R1.Chunk; -import net.minecraft.server.v1_14_R1.ChunkCoordIntPair; -import net.minecraft.server.v1_14_R1.ChunkRegionLoader; -import net.minecraft.server.v1_14_R1.ChunkStatus; -import net.minecraft.server.v1_14_R1.DataBits; -import net.minecraft.server.v1_14_R1.NBTTagCompound; -import net.minecraft.server.v1_14_R1.NBTTagList; - -/** - * Container for managing chunks - dependent upon using chunk snapshots, since rendering is off server thread - */ -public class MapChunkCache114 extends AbstractMapChunkCache { - - public static class NBTSnapshot implements Snapshot { - private static interface Section { - public DynmapBlockState getBlockType(int x, int y, int z); - public int getBlockSkyLight(int x, int y, int z); - public int getBlockEmittedLight(int x, int y, int z); - public boolean isEmpty(); - } - private final int x, z; - private final Section[] section; - private final int[] hmap; // Height map - private final int[] biome; - private final Object[] biomebase; - private final long captureFulltime; - private final int sectionCnt; - private final long inhabitedTicks; - - private static final int BLOCKS_PER_SECTION = 16 * 16 * 16; - private static final int COLUMNS_PER_CHUNK = 16 * 16; - private static final byte[] emptyData = new byte[BLOCKS_PER_SECTION / 2]; - private static final byte[] fullData = new byte[BLOCKS_PER_SECTION / 2]; - - static - { - Arrays.fill(fullData, (byte)0xFF); - } - - private static class EmptySection implements Section { - @Override - public DynmapBlockState getBlockType(int x, int y, int z) { - return DynmapBlockState.AIR; - } - @Override - public int getBlockSkyLight(int x, int y, int z) { - return 15; - } - @Override - public int getBlockEmittedLight(int x, int y, int z) { - return 0; - } - @Override - public boolean isEmpty() { - return true; - } - } - - private static final EmptySection empty_section = new EmptySection(); - - private static class StdSection implements Section { - DynmapBlockState[] states; - byte[] skylight; - byte[] emitlight; - - public StdSection() { - states = new DynmapBlockState[BLOCKS_PER_SECTION]; - Arrays.fill(states, DynmapBlockState.AIR); - skylight = fullData; - emitlight = emptyData; - } - @Override - public DynmapBlockState getBlockType(int x, int y, int z) { - return states[((y & 0xF) << 8) | (z << 4) | x]; - } - @Override - public int getBlockSkyLight(int x, int y, int z) { - int off = ((y & 0xF) << 7) | (z << 3) | (x >> 1); - return (skylight[off] >> (4 * (x & 1))) & 0xF; - } - @Override - public int getBlockEmittedLight(int x, int y, int z) - { - int off = ((y & 0xF) << 7) | (z << 3) | (x >> 1); - return (emitlight[off] >> (4 * (x & 1))) & 0xF; - } - @Override - public boolean isEmpty() { - return false; - } - } - /** - * Construct empty chunk snapshot - * - * @param x - * @param z - */ - public NBTSnapshot(int worldheight, int x, int z, long captime, long inhabitedTime) - { - this.x = x; - this.z = z; - this.captureFulltime = captime; - this.biome = new int[COLUMNS_PER_CHUNK]; - this.biomebase = new Object[COLUMNS_PER_CHUNK]; - this.sectionCnt = worldheight / 16; - /* Allocate arrays indexed by section */ - this.section = new Section[this.sectionCnt]; - - /* Fill with empty data */ - for (int i = 0; i < this.sectionCnt; i++) { - this.section[i] = empty_section; - } - - /* Create empty height map */ - this.hmap = new int[16 * 16]; - - this.inhabitedTicks = inhabitedTime; - } - - public NBTSnapshot(NBTTagCompound nbt, int worldheight) { - this.x = nbt.getInt("xPos"); - this.z = nbt.getInt("zPos"); - this.captureFulltime = 0; - this.hmap = nbt.getIntArray("HeightMap"); - this.sectionCnt = worldheight / 16; - if (nbt.hasKey("InhabitedTime")) { - this.inhabitedTicks = nbt.getLong("InhabitedTime"); - } - else { - this.inhabitedTicks = 0; - } - /* Allocate arrays indexed by section */ - this.section = new Section[this.sectionCnt]; - /* Fill with empty data */ - for (int i = 0; i < this.sectionCnt; i++) { - this.section[i] = empty_section; - } - /* Get sections */ - NBTTagList sect = nbt.getList("Sections", 10); - for (int i = 0; i < sect.size(); i++) { - NBTTagCompound sec = sect.getCompound(i); - int secnum = sec.getByte("Y"); - if (secnum >= this.sectionCnt) { - //Log.info("Section " + (int) secnum + " above world height " + worldheight); - continue; - } - if (secnum < 0) - continue; - //System.out.println("section(" + secnum + ")=" + sec.asString()); - // Create normal section to initialize - StdSection cursect = new StdSection(); - this.section[secnum] = cursect; - DynmapBlockState[] states = cursect.states; - DynmapBlockState[] palette = null; - // If we've got palette and block states list, process non-empty section - if (sec.hasKeyOfType("Palette", 9) && sec.hasKeyOfType("BlockStates", 12)) { - NBTTagList plist = sec.getList("Palette", 10); - long[] statelist = sec.getLongArray("BlockStates"); - palette = new DynmapBlockState[plist.size()]; - for (int pi = 0; pi < plist.size(); pi++) { - NBTTagCompound tc = plist.getCompound(pi); - String pname = tc.getString("Name"); - if (tc.hasKey("Properties")) { - StringBuilder statestr = new StringBuilder(); - NBTTagCompound prop = tc.getCompound("Properties"); - for (String pid : prop.getKeys()) { - if (statestr.length() > 0) statestr.append(','); - statestr.append(pid).append('=').append(prop.get(pid).asString()); - } - palette[pi] = DynmapBlockState.getStateByNameAndState(pname, statestr.toString()); - } - if (palette[pi] == null) { - palette[pi] = DynmapBlockState.getBaseStateByName(pname); - } - if (palette[pi] == null) { - palette[pi] = DynmapBlockState.AIR; - } - } - int bitsperblock = (statelist.length * 64) / 4096; - DataBits db = new DataBits(bitsperblock, 4096, statelist); - if (bitsperblock > 8) { // Not palette - for (int j = 0; j < 4096; j++) { - states[j] = DynmapBlockState.getStateByGlobalIndex(db.a(j)); - } - } - else { - for (int j = 0; j < 4096; j++) { - int v = db.a(j); - states[j] = (v < palette.length) ? palette[v] : DynmapBlockState.AIR; - } - } - } - if (sec.hasKey("BlockLight")) { - cursect.emitlight = sec.getByteArray("BlockLight"); - } - if (sec.hasKey("SkyLight")) { - cursect.skylight = sec.getByteArray("SkyLight"); - } - } - /* Get biome data */ - this.biome = new int[COLUMNS_PER_CHUNK]; - this.biomebase = new Object[COLUMNS_PER_CHUNK]; - Object[] bbl = BukkitVersionHelper.helper.getBiomeBaseList(); - if (nbt.hasKey("Biomes")) { - int[] bb = nbt.getIntArray("Biomes"); - if (bb != null) { - for (int i = 0; i < bb.length; i++) { - int bv = bb[i]; - if (bv < 0) bv = 0; - this.biome[i] = bv; - this.biomebase[i] = bbl[bv]; - } - } - } - } - - public int getX() - { - return x; - } - - public int getZ() - { - return z; - } - - public DynmapBlockState getBlockType(int x, int y, int z) - { - return section[y >> 4].getBlockType(x, y, z); - } - - public int getBlockSkyLight(int x, int y, int z) - { - return section[y >> 4].getBlockSkyLight(x, y, z); - } - - public int getBlockEmittedLight(int x, int y, int z) - { - return section[y >> 4].getBlockEmittedLight(x, y, z); - } - - public int getHighestBlockYAt(int x, int z) - { - return hmap[z << 4 | x]; - } - - public final long getCaptureFullTime() - { - return captureFulltime; - } - - public boolean isSectionEmpty(int sy) - { - return section[sy].isEmpty(); - } - - public long getInhabitedTicks() { - return inhabitedTicks; - } - - @Override - public Biome getBiome(int x, int z) { - return AbstractMapChunkCache.getBiomeByID(biome[z << 4 | x]); - } - - @Override - public Object[] getBiomeBaseFromSnapshot() { - return this.biomebase; - } - } - - private NBTTagCompound fetchLoadedChunkNBT(World w, int x, int z) { - CraftWorld cw = (CraftWorld) w; - NBTTagCompound nbt = null; - if (cw.isChunkLoaded(x, z)) { - Chunk c = cw.getHandle().getChunkAt(x, z); - if ((c != null) && c.loaded) { - nbt = ChunkRegionLoader.saveChunk(cw.getHandle(), c); - } - } - if (nbt != null) { - nbt = nbt.getCompound("Level"); - if (nbt != null) { - String stat = nbt.getString("Status"); - if ((stat == null) || (stat.equals("full") == false)) { - nbt = null; - } - } - } - return nbt; - } - - private NBTTagCompound loadChunkNBT(World w, int x, int z) { - CraftWorld cw = (CraftWorld) w; - NBTTagCompound nbt = null; - ChunkCoordIntPair cc = new ChunkCoordIntPair(x, z); - try { - nbt = cw.getHandle().getChunkProvider().playerChunkMap.read(cc); - } catch (IOException iox) { - } - if (nbt != null) { - nbt = nbt.getCompound("Level"); - if (nbt != null) { - String stat = nbt.getString("Status"); - ChunkStatus cs = ChunkStatus.a(stat); - if ((stat == null) || (!cs.b(ChunkStatus.LIGHT))) { - nbt = null; - if ((stat == null) || stat.equals("") && DynmapCore.migrateChunks()) { - Chunk c = cw.getHandle().getChunkAt(x, z); - if (c != null) { - nbt = fetchLoadedChunkNBT(w, x, z); - cw.getHandle().unloadChunk(c); - } - } - } - } - } - return nbt; - } - - @Override - public Snapshot wrapChunkSnapshot(ChunkSnapshot css) { - // TODO Auto-generated method stub - return null; - } - - // Load chunk snapshots - @Override - public int loadChunks(int max_to_load) { - if(dw.isLoaded() == false) - return 0; - int cnt = 0; - if(iterator == null) - iterator = chunks.listIterator(); - - DynmapCore.setIgnoreChunkLoads(true); - // Load the required chunks. - while((cnt < max_to_load) && iterator.hasNext()) { - long startTime = System.nanoTime(); - DynmapChunk chunk = iterator.next(); - boolean vis = true; - if(visible_limits != null) { - vis = false; - for(VisibilityLimit limit : visible_limits) { - if (limit.doIntersectChunk(chunk.x, chunk.z)) { - vis = true; - break; - } - } - } - if(vis && (hidden_limits != null)) { - for(VisibilityLimit limit : hidden_limits) { - if (limit.doIntersectChunk(chunk.x, chunk.z)) { - vis = false; - break; - } - } - } - /* Check if cached chunk snapshot found */ - Snapshot ss = null; - long inhabited_ticks = 0; - DynIntHashMap tileData = null; - int idx = (chunk.x-x_min) + (chunk.z - z_min)*x_dim; - SnapshotRec ssr = SnapshotCache.sscache.getSnapshot(dw.getName(), chunk.x, chunk.z, blockdata, biome, biomeraw, highesty); - if(ssr != null) { - inhabited_ticks = ssr.inhabitedTicks; - if(!vis) { - if(hidestyle == HiddenChunkStyle.FILL_STONE_PLAIN) - ss = STONE; - else if(hidestyle == HiddenChunkStyle.FILL_OCEAN) - ss = OCEAN; - else - ss = EMPTY; - } - else { - ss = ssr.ss; - } - snaparray[idx] = ss; - snaptile[idx] = ssr.tileData; - inhabitedTicks[idx] = inhabited_ticks; - - endChunkLoad(startTime, ChunkStats.CACHED_SNAPSHOT_HIT); - continue; - } - // Fetch NTB for chunk if loaded - NBTTagCompound nbt = fetchLoadedChunkNBT(w, chunk.x, chunk.z); - boolean did_load = false; - if (nbt == null) { - // Load NTB for chunk, if it exists - nbt = loadChunkNBT(w, chunk.x, chunk.z); - did_load = true; - } - if (nbt != null) { - NBTSnapshot nss = new NBTSnapshot(nbt, w.getMaxHeight()); - ss = nss; - inhabited_ticks = nss.getInhabitedTicks(); - if(!vis) { - if(hidestyle == HiddenChunkStyle.FILL_STONE_PLAIN) - ss = STONE; - else if(hidestyle == HiddenChunkStyle.FILL_OCEAN) - ss = OCEAN; - else - ss = EMPTY; - } - } - else { - ss = EMPTY; - } - ssr = new SnapshotRec(); - ssr.ss = ss; - ssr.inhabitedTicks = inhabited_ticks; - ssr.tileData = tileData; - SnapshotCache.sscache.putSnapshot(dw.getName(), chunk.x, chunk.z, ssr, blockdata, biome, biomeraw, highesty); - snaparray[idx] = ss; - snaptile[idx] = ssr.tileData; - inhabitedTicks[idx] = inhabited_ticks; - if (nbt == null) - endChunkLoad(startTime, ChunkStats.UNGENERATED_CHUNKS); - else if (did_load) - endChunkLoad(startTime, ChunkStats.UNLOADED_CHUNKS); - else - endChunkLoad(startTime, ChunkStats.LOADED_CHUNKS); - cnt++; - } - DynmapCore.setIgnoreChunkLoads(false); - - if(iterator.hasNext() == false) { /* If we're done */ - isempty = true; - /* Fill missing chunks with empty dummy chunk */ - for(int i = 0; i < snaparray.length; i++) { - if(snaparray[i] == null) - snaparray[i] = EMPTY; - else if(snaparray[i] != EMPTY) - isempty = false; - } - } - - return cnt; - } -}