diff --git a/.gitignore b/.gitignore
index a140d2bf..ae6d9363 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,3 +24,5 @@
# Mac filesystem dust
/.DS_Store
/dependency-reduced-pom.xml
+
+/.gradle
diff --git a/core/.gitignore b/bukkit/.gitignore
similarity index 100%
rename from core/.gitignore
rename to bukkit/.gitignore
diff --git a/core/pom.xml b/bukkit/pom.xml
similarity index 99%
rename from core/pom.xml
rename to bukkit/pom.xml
index b2b4c5ec..1c05c6b6 100644
--- a/core/pom.xml
+++ b/bukkit/pom.xml
@@ -170,7 +170,7 @@
3.0-SNAPSHOT
us.dynmap
- dynmap-bukkit
+ dynmap-common
3.0-SNAPSHOT
..
diff --git a/core/src/main/assembly/package.xml b/bukkit/src/main/assembly/package.xml
similarity index 100%
rename from core/src/main/assembly/package.xml
rename to bukkit/src/main/assembly/package.xml
diff --git a/core/src/main/java/org/dynmap/bukkit/Armor.java b/bukkit/src/main/java/org/dynmap/bukkit/Armor.java
similarity index 100%
rename from core/src/main/java/org/dynmap/bukkit/Armor.java
rename to bukkit/src/main/java/org/dynmap/bukkit/Armor.java
diff --git a/core/src/main/java/org/dynmap/bukkit/DynmapPlugin.java b/bukkit/src/main/java/org/dynmap/bukkit/DynmapPlugin.java
similarity index 100%
rename from core/src/main/java/org/dynmap/bukkit/DynmapPlugin.java
rename to bukkit/src/main/java/org/dynmap/bukkit/DynmapPlugin.java
diff --git a/core/src/main/java/org/dynmap/bukkit/Helper.java b/bukkit/src/main/java/org/dynmap/bukkit/Helper.java
similarity index 100%
rename from core/src/main/java/org/dynmap/bukkit/Helper.java
rename to bukkit/src/main/java/org/dynmap/bukkit/Helper.java
diff --git a/core/src/main/java/org/dynmap/bukkit/permissions/BukkitPermissions.java b/bukkit/src/main/java/org/dynmap/bukkit/permissions/BukkitPermissions.java
similarity index 100%
rename from core/src/main/java/org/dynmap/bukkit/permissions/BukkitPermissions.java
rename to bukkit/src/main/java/org/dynmap/bukkit/permissions/BukkitPermissions.java
diff --git a/core/src/main/java/org/dynmap/bukkit/permissions/GroupManagerPermissions.java b/bukkit/src/main/java/org/dynmap/bukkit/permissions/GroupManagerPermissions.java
similarity index 100%
rename from core/src/main/java/org/dynmap/bukkit/permissions/GroupManagerPermissions.java
rename to bukkit/src/main/java/org/dynmap/bukkit/permissions/GroupManagerPermissions.java
diff --git a/core/src/main/java/org/dynmap/bukkit/permissions/NijikokunPermissions.java b/bukkit/src/main/java/org/dynmap/bukkit/permissions/NijikokunPermissions.java
similarity index 100%
rename from core/src/main/java/org/dynmap/bukkit/permissions/NijikokunPermissions.java
rename to bukkit/src/main/java/org/dynmap/bukkit/permissions/NijikokunPermissions.java
diff --git a/core/src/main/java/org/dynmap/bukkit/permissions/OpPermissions.java b/bukkit/src/main/java/org/dynmap/bukkit/permissions/OpPermissions.java
similarity index 100%
rename from core/src/main/java/org/dynmap/bukkit/permissions/OpPermissions.java
rename to bukkit/src/main/java/org/dynmap/bukkit/permissions/OpPermissions.java
diff --git a/core/src/main/java/org/dynmap/bukkit/permissions/PEXPermissions.java b/bukkit/src/main/java/org/dynmap/bukkit/permissions/PEXPermissions.java
similarity index 100%
rename from core/src/main/java/org/dynmap/bukkit/permissions/PEXPermissions.java
rename to bukkit/src/main/java/org/dynmap/bukkit/permissions/PEXPermissions.java
diff --git a/core/src/main/java/org/dynmap/bukkit/permissions/PermBukkitPermissions.java b/bukkit/src/main/java/org/dynmap/bukkit/permissions/PermBukkitPermissions.java
similarity index 100%
rename from core/src/main/java/org/dynmap/bukkit/permissions/PermBukkitPermissions.java
rename to bukkit/src/main/java/org/dynmap/bukkit/permissions/PermBukkitPermissions.java
diff --git a/core/src/main/java/org/dynmap/bukkit/permissions/PermissionProvider.java b/bukkit/src/main/java/org/dynmap/bukkit/permissions/PermissionProvider.java
similarity index 100%
rename from core/src/main/java/org/dynmap/bukkit/permissions/PermissionProvider.java
rename to bukkit/src/main/java/org/dynmap/bukkit/permissions/PermissionProvider.java
diff --git a/core/src/main/java/org/dynmap/bukkit/permissions/bPermPermissions.java b/bukkit/src/main/java/org/dynmap/bukkit/permissions/bPermPermissions.java
similarity index 100%
rename from core/src/main/java/org/dynmap/bukkit/permissions/bPermPermissions.java
rename to bukkit/src/main/java/org/dynmap/bukkit/permissions/bPermPermissions.java
diff --git a/core/src/main/resources/configuration.txt b/bukkit/src/main/resources/configuration.txt
similarity index 100%
rename from core/src/main/resources/configuration.txt
rename to bukkit/src/main/resources/configuration.txt
diff --git a/core/src/main/resources/plugin.yml b/bukkit/src/main/resources/plugin.yml
similarity index 100%
rename from core/src/main/resources/plugin.yml
rename to bukkit/src/main/resources/plugin.yml
diff --git a/core/tools/Biomes.ods b/bukkit/tools/Biomes.ods
similarity index 100%
rename from core/tools/Biomes.ods
rename to bukkit/tools/Biomes.ods
diff --git a/core/tools/bukkit_formatting_profile.xml b/bukkit/tools/bukkit_formatting_profile.xml
similarity index 100%
rename from core/tools/bukkit_formatting_profile.xml
rename to bukkit/tools/bukkit_formatting_profile.xml
diff --git a/helper/pom.xml b/helper/pom.xml
index 7501d231..90ee5500 100644
--- a/helper/pom.xml
+++ b/helper/pom.xml
@@ -2,7 +2,7 @@
4.0.0
us.dynmap
- dynmap-bukkit
+ dynmap-common
3.0-SNAPSHOT
..
diff --git a/helper/src/main/java/org/dynmap/bukkit/helper/NewMapChunkCache.java b/helper/src/main/java/org/dynmap/bukkit/helper/NewMapChunkCache.java
deleted file mode 100644
index 56a1a103..00000000
--- a/helper/src/main/java/org/dynmap/bukkit/helper/NewMapChunkCache.java
+++ /dev/null
@@ -1,1040 +0,0 @@
-package org.dynmap.bukkit.helper;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-
-import org.bukkit.World;
-import org.bukkit.Chunk;
-import org.bukkit.block.Biome;
-import org.bukkit.ChunkSnapshot;
-import org.dynmap.DynmapChunk;
-import org.dynmap.DynmapCore;
-import org.dynmap.DynmapWorld;
-import org.dynmap.Log;
-import org.dynmap.bukkit.helper.SnapshotCache.SnapshotRec;
-import org.dynmap.common.BiomeMap;
-import org.dynmap.hdmap.HDBlockModels;
-import org.dynmap.renderer.DynmapBlockState;
-import org.dynmap.renderer.RenderPatchFactory;
-import org.dynmap.utils.DynIntHashMap;
-import org.dynmap.utils.MapChunkCache;
-import org.dynmap.utils.MapIterator;
-import org.dynmap.utils.BlockStep;
-import org.dynmap.utils.VisibilityLimit;
-
-/**
- * Container for managing chunks - dependent upon using chunk snapshots, since rendering is off server thread
- */
-public class NewMapChunkCache extends MapChunkCache {
- private static boolean init = false;
-
- private World w;
- private DynmapWorld dw;
- private int nsect;
- private List chunks;
- private ListIterator iterator;
- private int x_min, x_max, z_min, z_max;
- private int x_dim;
- private boolean biome, biomeraw, highesty, blockdata;
- private HiddenChunkStyle hidestyle = HiddenChunkStyle.FILL_AIR;
- private List visible_limits = null;
- private List hidden_limits = null;
- private boolean isempty = true;
- private int snapcnt;
- private ChunkSnapshot[] snaparray; /* Index = (x-x_min) + ((z-z_min)*x_dim) */
- private DynIntHashMap[] snaptile;
- private byte[][] sameneighborbiomecnt;
- private BiomeMap[][] biomemap;
- private boolean[][] isSectionNotEmpty; /* Indexed by snapshot index, then by section index */
- private long[] inhabitedTicks; /* Index = (x-x_min) + ((z-z_min)*x_dim) */
- private static final BiomeMap[] nullBiomeMap = { BiomeMap.NULL };
-
- private static final BlockStep unstep[] = { BlockStep.X_MINUS, BlockStep.Y_MINUS, BlockStep.Z_MINUS,
- BlockStep.X_PLUS, BlockStep.Y_PLUS, BlockStep.Z_PLUS };
-
- private static BiomeMap[] biome_to_bmap;
-
- private static final int getIndexInChunk(int cx, int cy, int cz) {
- return (cy << 8) | (cz << 4) | cx;
- }
-
- private static DynmapBlockState getTypeAt(ChunkSnapshot ss, int x, int y, int z) {
- return BukkitVersionHelper.stateByID[(ss.getBlockTypeId(x, y, z) << 4) | ss.getBlockData(x, y, z)];
- }
-
- /**
- * Iterator for traversing map chunk cache (base is for non-snapshot)
- */
- public class OurMapIterator implements MapIterator {
- @SuppressWarnings("unused")
- private int x, y, z, chunkindex, bx, bz, off;
- private ChunkSnapshot snap;
- private BlockStep laststep;
- private DynmapBlockState type = null;
- private final int worldheight;
- private final int x_base;
- private final int z_base;
-
- OurMapIterator(int x0, int y0, int z0) {
- x_base = x_min << 4;
- z_base = z_min << 4;
- if(biome)
- biomePrep();
- initialize(x0, y0, z0);
- worldheight = w.getMaxHeight();
- }
-
- @Override
- public final void initialize(int x0, int y0, int z0) {
- this.x = x0;
- this.y = y0;
- this.z = z0;
- this.chunkindex = ((x >> 4) - x_min) + (((z >> 4) - z_min) * x_dim);
- this.bx = x & 0xF;
- this.bz = z & 0xF;
- this.off = bx + (bz << 4);
- if ((chunkindex >= snapcnt) || (chunkindex < 0)) {
- snap = EMPTY;
- }
- else {
- snap = snaparray[chunkindex];
- }
- laststep = BlockStep.Y_MINUS;
- if((y >= 0) && (y < worldheight))
- type = null;
- else
- type = DynmapBlockState.AIR;
- }
-
- @Override
- public final DynmapBlockState getBlockType() {
- if (type == null) {
- type = getTypeAt(snap, bx, y, bz);
- }
- return type;
- }
- @Override
- public int getBlockSkyLight() {
- try {
- return snap.getBlockSkyLight(bx, y, bz);
- } catch (ArrayIndexOutOfBoundsException aioobx) {
- return 15;
- }
- }
- @Override
- public final int getBlockEmittedLight() {
- try {
- return snap.getBlockEmittedLight(bx, y, bz);
- } catch (ArrayIndexOutOfBoundsException aioobx) {
- return 0;
- }
- }
- private void biomePrep() {
- if(sameneighborbiomecnt != null)
- return;
- int x_size = x_dim << 4;
- int z_size = (z_max - z_min + 1) << 4;
- sameneighborbiomecnt = new byte[x_size][];
- biomemap = new BiomeMap[x_size][];
- for(int i = 0; i < x_size; i++) {
- sameneighborbiomecnt[i] = new byte[z_size];
- biomemap[i] = new BiomeMap[z_size];
- }
- ChunkSnapshot last_css = null;
- Object[] biomebase = null;
- for(int i = 0; i < x_size; i++) {
- for(int j = 0; j < z_size; j++) {
- BiomeMap bm;
- if (j == 0) {
- initialize(i + x_base, 64, z_base);
- }
- else {
- stepPosition(BlockStep.Z_PLUS);
- }
- if (last_css != snap) {
- if ((snap instanceof EmptyChunk) || (snap instanceof PlainChunk)) {
- biomebase = nullBiomeMap;
- }
- else {
- biomebase = BukkitVersionHelper.helper.getBiomeBaseFromSnapshot(snap);
- }
- last_css = snap;
- }
- if (biomebase == nullBiomeMap) {
- bm = BiomeMap.NULL;
- }
- else if(biomebase != null) {
- bm = BiomeMap.byBiomeID(BukkitVersionHelper.helper.getBiomeBaseID(biomebase[bz << 4 | bx]));
- }
- else {
- Biome bb = snap.getBiome(bx, bz);
- if(bb == null)
- bm = BiomeMap.NULL;
- else
- bm = biome_to_bmap[bb.ordinal()];
- }
- biomemap[i][j] = bm;
- int cnt = 0;
- if(i > 0) {
- if(bm == biomemap[i-1][j]) { /* Same as one to left */
- cnt++;
- sameneighborbiomecnt[i-1][j]++;
- }
- if((j > 0) && (bm == biomemap[i-1][j-1])) {
- cnt++;
- sameneighborbiomecnt[i-1][j-1]++;
- }
- if((j < (z_size-1)) && (bm == biomemap[i-1][j+1])) {
- cnt++;
- sameneighborbiomecnt[i-1][j+1]++;
- }
- }
- if((j > 0) && (biomemap[i][j] == biomemap[i][j-1])) { /* Same as one to above */
- cnt++;
- sameneighborbiomecnt[i][j-1]++;
- }
- sameneighborbiomecnt[i][j] = (byte)cnt;
- }
- }
- }
- @Override
- public final BiomeMap getBiome() {
- try {
- return biomemap[x - x_base][z - z_base];
- } catch (Exception ex) {
- return BiomeMap.NULL;
- }
- }
- @Override
- public final int getSmoothGrassColorMultiplier(int[] colormap) {
- int mult = 0xFFFFFF;
- try {
- int rx = x - x_base;
- int rz = z - z_base;
- BiomeMap bm = biomemap[rx][rz];
- if(sameneighborbiomecnt[rx][rz] >= (byte)8) { /* All neighbors same? */
- mult = bm.getModifiedGrassMultiplier(colormap[bm.biomeLookup()]);
- }
- else {
- int raccum = 0;
- int gaccum = 0;
- int baccum = 0;
- for(int xoff = -1; xoff < 2; xoff++) {
- for(int zoff = -1; zoff < 2; zoff++) {
- bm = biomemap[rx+xoff][rz+zoff];
- int rmult = bm.getModifiedGrassMultiplier(colormap[bm.biomeLookup()]);
- raccum += (rmult >> 16) & 0xFF;
- gaccum += (rmult >> 8) & 0xFF;
- baccum += rmult & 0xFF;
- }
- }
- mult = ((raccum / 9) << 16) | ((gaccum / 9) << 8) | (baccum / 9);
- }
- } catch (Exception x) {
- mult = 0xFFFFFF;
- }
- return mult;
- }
- @Override
- public final int getSmoothFoliageColorMultiplier(int[] colormap) {
- int mult = 0xFFFFFF;
- try {
- int rx = x - x_base;
- int rz = z - z_base;
- BiomeMap bm = biomemap[rx][rz];
- if(sameneighborbiomecnt[rx][rz] >= (byte)8) { /* All neighbors same? */
- mult = bm.getModifiedFoliageMultiplier(colormap[bm.biomeLookup()]);
- }
- else {
- int raccum = 0;
- int gaccum = 0;
- int baccum = 0;
- for(int xoff = -1; xoff < 2; xoff++) {
- for(int zoff = -1; zoff < 2; zoff++) {
- bm = biomemap[rx+xoff][rz+zoff];
- int rmult = bm.getModifiedFoliageMultiplier(colormap[bm.biomeLookup()]);
- raccum += (rmult >> 16) & 0xFF;
- gaccum += (rmult >> 8) & 0xFF;
- baccum += rmult & 0xFF;
- }
- }
- mult = ((raccum / 9) << 16) | ((gaccum / 9) << 8) | (baccum / 9);
- }
- } catch (Exception x) {
- mult = 0xFFFFFF;
- }
- return mult;
- }
- @Override
- public final int getSmoothColorMultiplier(int[] colormap, int[] swampmap) {
- int mult = 0xFFFFFF;
- try {
- int rx = x - x_base;
- int rz = z - z_base;
- BiomeMap bm = biomemap[rx][rz];
- if(sameneighborbiomecnt[rx][rz] >= (byte)8) { /* All neighbors same? */
- if(bm == BiomeMap.SWAMPLAND) {
- mult = swampmap[bm.biomeLookup()];
- }
- else {
- mult = colormap[bm.biomeLookup()];
- }
- }
- else {
- int raccum = 0;
- int gaccum = 0;
- int baccum = 0;
- for(int xoff = -1; xoff < 2; xoff++) {
- for(int zoff = -1; zoff < 2; zoff++) {
- bm = biomemap[rx+xoff][rz+zoff];
- int rmult;
- if(bm == BiomeMap.SWAMPLAND) {
- rmult = swampmap[bm.biomeLookup()];
- }
- else {
- rmult = colormap[bm.biomeLookup()];
- }
- raccum += (rmult >> 16) & 0xFF;
- gaccum += (rmult >> 8) & 0xFF;
- baccum += rmult & 0xFF;
- }
- }
- mult = ((raccum / 9) << 16) | ((gaccum / 9) << 8) | (baccum / 9);
- }
- } catch (Exception x) {
- mult = 0xFFFFFF;
- }
- return mult;
- }
- @Override
- public final int getSmoothWaterColorMultiplier() {
- try {
- int rx = x - x_base;
- int rz = z - z_base;
- BiomeMap bm = biomemap[rx][rz];
- if(sameneighborbiomecnt[rx][rz] >= (byte)8) { /* All neighbors same? */
- return bm.getWaterColorMult();
- }
- int raccum = 0;
- int gaccum = 0;
- int baccum = 0;
- for(int xoff = -1; xoff < 2; xoff++) {
- for(int zoff = -1; zoff < 2; zoff++) {
- bm = biomemap[rx+xoff][rz+zoff];
- int mult = bm.getWaterColorMult();
- raccum += (mult >> 16) & 0xFF;
- gaccum += (mult >> 8) & 0xFF;
- baccum += mult & 0xFF;
- }
- }
- return ((raccum / 9) << 16) | ((gaccum / 9) << 8) | (baccum / 9);
- } catch (Exception x) {
- return 0xFFFFFF;
- }
- }
- @Override
- public final int getSmoothWaterColorMultiplier(int[] colormap) {
- int mult = 0xFFFFFF;
- try {
- int rx = x - x_base;
- int rz = z - z_base;
- BiomeMap bm = biomemap[rx][rz];
- if(sameneighborbiomecnt[rx][rz] >= (byte)8) { /* All neighbors same? */
- mult = colormap[bm.biomeLookup()];
- }
- else {
- int raccum = 0;
- int gaccum = 0;
- int baccum = 0;
- for(int xoff = -1; xoff < 2; xoff++) {
- for(int zoff = -1; zoff < 2; zoff++) {
- bm = biomemap[rx+xoff][rz+zoff];
- int rmult = colormap[bm.biomeLookup()];
- raccum += (rmult >> 16) & 0xFF;
- gaccum += (rmult >> 8) & 0xFF;
- baccum += rmult & 0xFF;
- }
- }
- mult = ((raccum / 9) << 16) | ((gaccum / 9) << 8) | (baccum / 9);
- }
- } catch (Exception x) {
- mult = 0xFFFFFF;
- }
- return mult;
- }
- /**
- * Step current position in given direction
- */
- @Override
- public final void stepPosition(BlockStep step) {
- type = null;
- switch(step.ordinal()) {
- case 0:
- x++;
- bx++;
- off++;
- if(bx == 16) { /* Next chunk? */
- bx = 0;
- off -= 16;
- chunkindex++;
- if ((chunkindex >= snapcnt) || (chunkindex < 0)) {
- snap = EMPTY;
- }
- else {
- snap = snaparray[chunkindex];
- }
- }
- break;
- case 1:
- y++;
- if(y >= worldheight) {
- type = DynmapBlockState.AIR;
- }
- break;
- case 2:
- z++;
- bz++;
- off+=16;
- if(bz == 16) { /* Next chunk? */
- bz = 0;
- off -= 256;
- chunkindex += x_dim;
- if ((chunkindex >= snapcnt) || (chunkindex < 0)) {
- snap = EMPTY;
- }
- else {
- snap = snaparray[chunkindex];
- }
- }
- break;
- case 3:
- x--;
- bx--;
- off--;
- if(bx == -1) { /* Next chunk? */
- bx = 15;
- off += 16;
- chunkindex--;
- if ((chunkindex >= snapcnt) || (chunkindex < 0)) {
- snap = EMPTY;
- }
- else {
- snap = snaparray[chunkindex];
- }
- }
- break;
- case 4:
- y--;
- if(y < 0) {
- type = DynmapBlockState.AIR;
- }
- break;
- case 5:
- z--;
- bz--;
- off-=16;
- if(bz == -1) { /* Next chunk? */
- bz = 15;
- off += 256;
- chunkindex -= x_dim;
- if ((chunkindex >= snapcnt) || (chunkindex < 0)) {
- snap = EMPTY;
- }
- else {
- snap = snaparray[chunkindex];
- }
- }
- break;
- }
- laststep = step;
- }
- /**
- * Unstep current position to previous position
- */
- @Override
- public BlockStep unstepPosition() {
- BlockStep ls = laststep;
- stepPosition(unstep[ls.ordinal()]);
- return ls;
- }
- /**
- * Unstep current position in oppisite director of given step
- */
- @Override
- public void unstepPosition(BlockStep s) {
- stepPosition(unstep[s.ordinal()]);
- }
- @Override
- public final void setY(int y) {
- if(y > this.y)
- laststep = BlockStep.Y_PLUS;
- else
- laststep = BlockStep.Y_MINUS;
- this.y = y;
- if((y < 0) || (y >= worldheight)) {
- type = DynmapBlockState.AIR;
- }
- else {
- type = null;
- }
- }
- @Override
- public final int getX() {
- return x;
- }
- @Override
- public final int getY() {
- return y;
- }
- @Override
- public final int getZ() {
- return z;
- }
- @Override
- public final DynmapBlockState getBlockTypeAt(BlockStep s) {
- if(s == BlockStep.Y_MINUS) {
- if(y > 0)
- return getTypeAt(snap, bx, y-1, bz);
- }
- else if(s == BlockStep.Y_PLUS) {
- if(y < (worldheight-1))
- return getTypeAt(snap, bx, y+1, bz);
- }
- else {
- BlockStep ls = laststep;
- stepPosition(s);
- DynmapBlockState tid = getTypeAt(snap, bx, y, bz);
- unstepPosition();
- laststep = ls;
- return tid;
- }
- return DynmapBlockState.AIR;
- }
- @Override
- public BlockStep getLastStep() {
- return laststep;
- }
- @Override
- public int getWorldHeight() {
- return worldheight;
- }
- @Override
- public long getBlockKey() {
- return (((chunkindex * worldheight) + y) << 8) | (bx << 4) | bz;
- }
- @Override
- public final boolean isEmptySection() {
- try {
- return !isSectionNotEmpty[chunkindex][y >> 4];
- } catch (Exception x) {
- initSectionData(chunkindex);
- return !isSectionNotEmpty[chunkindex][y >> 4];
- }
- }
- @Override
- public RenderPatchFactory getPatchFactory() {
- return HDBlockModels.getPatchDefinitionFactory();
- }
- @Override
- public Object getBlockTileEntityField(String fieldId) {
- try {
- int idx = getIndexInChunk(bx,y,bz);
- Object[] vals = (Object[])snaptile[chunkindex].get(idx);
- for (int i = 0; i < vals.length; i += 2) {
- if (vals[i].equals(fieldId)) {
- return vals[i+1];
- }
- }
- } catch (Exception x) {
- }
- return null;
- }
- @Override
- public DynmapBlockState getBlockTypeAt(int xoff, int yoff, int zoff) {
- int xx = this.x + xoff;
- int yy = this.y + yoff;
- int zz = this.z + zoff;
- int idx = ((xx >> 4) - x_min) + (((zz >> 4) - z_min) * x_dim);
- try {
- return getTypeAt(snaparray[idx], xx & 0xF, yy, zz & 0xF);
- } catch (Exception x) {
- return DynmapBlockState.AIR;
- }
- }
- @Override
- public Object getBlockTileEntityFieldAt(String fieldId, int xoff,
- int yoff, int zoff) {
- return null;
- }
- @Override
- public long getInhabitedTicks() {
- try {
- return inhabitedTicks[chunkindex];
- } catch (Exception x) {
- return 0;
- }
- }
- }
-
- private class OurEndMapIterator extends OurMapIterator {
-
- OurEndMapIterator(int x0, int y0, int z0) {
- super(x0, y0, z0);
- }
- @Override
- public final int getBlockSkyLight() {
- return 15;
- }
- }
- /**
- * Chunk cache for representing unloaded chunk (or air)
- */
- private static class EmptyChunk implements ChunkSnapshot {
- /* Need these for interface, but not used */
- @Override
- public int getX() { return 0; }
- @Override
- public int getZ() { return 0; }
- @Override
- public String getWorldName() { return ""; }
- @Override
- public long getCaptureFullTime() { return 0; }
- @Override
- public final int getBlockTypeId(int x, int y, int z) {
- return 0;
- }
- @Override
- public final int getBlockData(int x, int y, int z) {
- return 0;
- }
- @Override
- public final int getBlockSkyLight(int x, int y, int z) {
- return 15;
- }
- @Override
- public final int getBlockEmittedLight(int x, int y, int z) {
- return 0;
- }
- @Override
- public final int getHighestBlockYAt(int x, int z) {
- return 0;
- }
- @Override
- public Biome getBiome(int x, int z) {
- return null;
- }
- @Override
- public double getRawBiomeTemperature(int x, int z) {
- return 0.0;
- }
- @Override
- public double getRawBiomeRainfall(int x, int z) {
- return 0.0;
- }
- @Override
- public boolean isSectionEmpty(int sy) {
- return true;
- }
- }
-
- /**
- * Chunk cache for representing generic stone chunk
- */
- private static class PlainChunk implements ChunkSnapshot {
- private int fillid;
- PlainChunk(int fillid) { this.fillid = fillid; }
- /* Need these for interface, but not used */
- @Override
- public int getX() { return 0; }
- @Override
- public int getZ() { return 0; }
- @Override
- public String getWorldName() { return ""; }
- @Override
- public Biome getBiome(int x, int z) { return null; }
- @Override
- public double getRawBiomeTemperature(int x, int z) { return 0.0; }
- @Override
- public double getRawBiomeRainfall(int x, int z) { return 0.0; }
- @Override
- public long getCaptureFullTime() { return 0; }
- @Override
- public final int getBlockTypeId(int x, int y, int z) {
- if(y < 64) return fillid;
- return 0;
- }
- @Override
- public final int getBlockData(int x, int y, int z) {
- return 0;
- }
- @Override
- public final int getBlockSkyLight(int x, int y, int z) {
- if(y < 64)
- return 0;
- return 15;
- }
- @Override
- public final int getBlockEmittedLight(int x, int y, int z) {
- return 0;
- }
- @Override
- public final int getHighestBlockYAt(int x, int z) {
- return 64;
- }
- @Override
- public boolean isSectionEmpty(int sy) {
- return (sy < 4);
- }
- }
-
- private static final EmptyChunk EMPTY = new EmptyChunk();
- private static final PlainChunk STONE = new PlainChunk(1);
- private static final PlainChunk OCEAN = new PlainChunk(9);
-
- /**
- * Construct empty cache
- */
- public NewMapChunkCache() {
- if(!init) {
- init = true;
- }
- }
- public void setChunks(BukkitWorld dw, List chunks) {
- this.dw = dw;
- this.w = dw.getWorld();
- if(this.w == null) {
- this.chunks = new ArrayList();
- }
- nsect = dw.worldheight >> 4;
- this.chunks = chunks;
- /* Compute range */
- if(chunks.size() == 0) {
- this.x_min = 0;
- this.x_max = 0;
- this.z_min = 0;
- this.z_max = 0;
- x_dim = 1;
- }
- else {
- x_min = x_max = chunks.get(0).x;
- z_min = z_max = chunks.get(0).z;
- for(DynmapChunk c : chunks) {
- if(c.x > x_max)
- x_max = c.x;
- if(c.x < x_min)
- x_min = c.x;
- if(c.z > z_max)
- z_max = c.z;
- if(c.z < z_min)
- z_min = c.z;
- }
- x_dim = x_max - x_min + 1;
- }
-
- snapcnt = x_dim * (z_max-z_min+1);
- snaparray = new ChunkSnapshot[snapcnt];
- inhabitedTicks = new long[snapcnt];
- snaptile = new DynIntHashMap[snapcnt];
- isSectionNotEmpty = new boolean[snapcnt][];
- }
-
- public int loadChunks(int max_to_load) {
- if(dw.isLoaded() == false)
- return 0;
- Object queue = BukkitVersionHelper.helper.getUnloadQueue(w);
-
- int cnt = 0;
- if(iterator == null)
- iterator = chunks.listIterator();
-
- DynmapCore.setIgnoreChunkLoads(true);
- //boolean isnormral = w.getEnvironment() == Environment.NORMAL;
- // 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 */
- ChunkSnapshot ss = null;
- long inhabited_ticks = 0;
- DynIntHashMap tileData = null;
- SnapshotRec ssr = SnapshotCache.sscache.getSnapshot(dw.getName(), chunk.x, chunk.z, blockdata, biome, biomeraw, highesty);
- if(ssr != null) {
- ss = ssr.ss;
- 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;
- }
- int idx = (chunk.x-x_min) + (chunk.z - z_min)*x_dim;
- snaparray[idx] = ss;
- snaptile[idx] = ssr.tileData;
- inhabitedTicks[idx] = inhabited_ticks;
-
- endChunkLoad(startTime, ChunkStats.CACHED_SNAPSHOT_HIT);
- continue;
- }
- boolean wasLoaded = w.isChunkLoaded(chunk.x, chunk.z);
- boolean didload = false;
- boolean isunloadpending = false;
- if (queue != null) {
- isunloadpending = BukkitVersionHelper.helper.isInUnloadQueue(queue, chunk.x, chunk.z);
- }
- if (isunloadpending) { /* Workaround: can't be pending if not loaded */
- wasLoaded = true;
- }
- try {
- didload = w.loadChunk(chunk.x, chunk.z, false);
- } catch (Throwable t) { /* Catch chunk error from Bukkit */
- Log.warning("Bukkit error loading chunk " + chunk.x + "," + chunk.z + " on " + w.getName());
- if(!wasLoaded) { /* If wasn't loaded, we loaded it if it now is */
- didload = w.isChunkLoaded(chunk.x, chunk.z);
- }
- }
- /* If it did load, make cache of it */
- if(didload) {
- tileData = new DynIntHashMap();
-
- Chunk c = w.getChunkAt(chunk.x, chunk.z); /* Get the chunk */
- /* Get inhabited ticks count */
- inhabited_ticks = BukkitVersionHelper.helper.getInhabitedTicks(c);
- if(!vis) {
- if(hidestyle == HiddenChunkStyle.FILL_STONE_PLAIN)
- ss = STONE;
- else if(hidestyle == HiddenChunkStyle.FILL_OCEAN)
- ss = OCEAN;
- else
- ss = EMPTY;
- }
- else {
- if(blockdata || highesty) {
- ss = c.getChunkSnapshot(highesty, biome, biomeraw);
- /* Get tile entity data */
- List