diff --git a/src/main/java/org/dynmap/bukkit/BukkitVersionHelper.java b/src/main/java/org/dynmap/bukkit/BukkitVersionHelper.java index 0f2f4e84..6c9d13db 100644 --- a/src/main/java/org/dynmap/bukkit/BukkitVersionHelper.java +++ b/src/main/java/org/dynmap/bukkit/BukkitVersionHelper.java @@ -1,5 +1,6 @@ package org.dynmap.bukkit; +import java.util.Arrays; import java.util.Map; import org.bukkit.Bukkit; @@ -47,7 +48,7 @@ public abstract class BukkitVersionHelper { return helper; } - public static DynIntHashMap stateByID = new DynIntHashMap(); + public static DynmapBlockState[] stateByID = new DynmapBlockState[65536]; protected BukkitVersionHelper() { @@ -121,9 +122,9 @@ public abstract class BukkitVersionHelper { */ public abstract void unloadChunkNoSave(World w, Chunk c, int cx, int cz); /** - * Get block short name list + * Get block name list */ - public abstract String[] getBlockShortNames(); + public abstract String[] getBlockNames(); /** * Get biome name list */ @@ -157,21 +158,28 @@ public abstract class BukkitVersionHelper { * Initialize block states (org.dynmap.blockstate.DynmapBlockState) */ public void initializeBlockStates() { - String[] blkname = getBlockShortNames(); + String[] blkname = getBlockNames(); // Keep it simple for now - just assume 16 meta states for each - + Arrays.fill(stateByID, DynmapBlockState.AIR); for (int i = 0; i < blkname.length; i++) { + if (blkname[i] == null) continue; + String bn = blkname[i]; + if (bn.indexOf(':') < 0) { + bn = "minecraft:" + bn; + } // Only do defined names, and not "air" - if ((blkname[i] != null) && (!blkname[i].equals("air"))) { - Log.info("block " + blkname[i]); - DynmapBlockState basebs = new DynmapBlockState(null, 0, "minecraft:" + blkname, "meta=0"); - stateByID.put((i << 4), basebs); + if (!bn.equals(DynmapBlockState.AIR_BLOCK)) { + DynmapBlockState basebs = new DynmapBlockState(null, 0, bn, "meta=0"); + stateByID[i << 4] = basebs; for (int m = 1; m < 16; m++) { - DynmapBlockState bs = new DynmapBlockState(basebs, m, "minecraft:" + blkname, "meta=" + m); - stateByID.put((i << 4) + m, bs); + DynmapBlockState bs = new DynmapBlockState(basebs, m, bn, "meta=" + m); + stateByID[(i << 4) + m] = bs; } } } - stateByID.put(0, DynmapBlockState.AIR); // Include air block; + for (int gidx = 0; gidx < DynmapBlockState.getGlobalIndexMax(); gidx++) { + DynmapBlockState bs = DynmapBlockState.getStateByGlobalIndex(gidx); + Log.info(gidx + ":" + bs.toString() + ", gidx=" + bs.globalStateIndex + ", sidx=" + bs.stateIndex); + } } } diff --git a/src/main/java/org/dynmap/bukkit/BukkitVersionHelperCB.java b/src/main/java/org/dynmap/bukkit/BukkitVersionHelperCB.java index 1f41c2c7..c486ad5f 100644 --- a/src/main/java/org/dynmap/bukkit/BukkitVersionHelperCB.java +++ b/src/main/java/org/dynmap/bukkit/BukkitVersionHelperCB.java @@ -186,18 +186,25 @@ public class BukkitVersionHelperCB extends BukkitVersionHelperGeneric { 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[] getBlockShortNames() { + public String[] getBlockNames() { try { String[] names = new String[4096]; if (blockbyid != null) { Object[] byid = (Object[])blockbyid.get(nmsblock); for (int i = 0; i < names.length; i++) { if (byid[i] != null) { - names[i] = (String)blockname.get(byid[i]); + names[i] = stripBlockString(byid[i].toString()); } } } @@ -205,7 +212,7 @@ public class BukkitVersionHelperCB extends BukkitVersionHelperGeneric { for (int i = 0; i < names.length; i++) { Object blk = blockbyidfunc.invoke(nmsblock, i); if (blk != null) { - names[i] = (String)blockname.get(blk); + names[i] = stripBlockString(blk.toString()); } } } diff --git a/src/main/java/org/dynmap/bukkit/BukkitVersionHelperGlowstone.java b/src/main/java/org/dynmap/bukkit/BukkitVersionHelperGlowstone.java index 8b15753d..a546bad1 100644 --- a/src/main/java/org/dynmap/bukkit/BukkitVersionHelperGlowstone.java +++ b/src/main/java/org/dynmap/bukkit/BukkitVersionHelperGlowstone.java @@ -140,7 +140,7 @@ public class BukkitVersionHelperGlowstone extends BukkitVersionHelper { } @Override - public String[] getBlockShortNames() { + public String[] getBlockNames() { // TODO Auto-generated method stub return null; } diff --git a/src/main/java/org/dynmap/bukkit/DynmapPlugin.java b/src/main/java/org/dynmap/bukkit/DynmapPlugin.java index 6ef6bcd3..c542fa31 100644 --- a/src/main/java/org/dynmap/bukkit/DynmapPlugin.java +++ b/src/main/java/org/dynmap/bukkit/DynmapPlugin.java @@ -545,11 +545,14 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI { @Override public Map getBlockIDMap() { - String[] bsn = helper.getBlockShortNames(); + String[] bsn = helper.getBlockNames(); HashMap map = new HashMap(); for (int i = 0; i < bsn.length; i++) { if (bsn[i] != null) { - map.put(i, "minecraft:" + bsn[i]); + if (bsn[i].indexOf(':') < 0) + map.put(i, "minecraft:" + bsn[i]); + else + map.put(i, bsn[i]); } } return map; diff --git a/src/main/java/org/dynmap/bukkit/NewMapChunkCache.java b/src/main/java/org/dynmap/bukkit/NewMapChunkCache.java index f1a507cd..48970b4c 100644 --- a/src/main/java/org/dynmap/bukkit/NewMapChunkCache.java +++ b/src/main/java/org/dynmap/bukkit/NewMapChunkCache.java @@ -63,7 +63,7 @@ public class NewMapChunkCache extends MapChunkCache { } private static DynmapBlockState getTypeAt(ChunkSnapshot ss, int x, int y, int z) { - return (DynmapBlockState) BukkitVersionHelper.stateByID.get((ss.getBlockTypeId(x, y, z) << 4) | ss.getBlockData(x, y, z)); + return BukkitVersionHelper.stateByID[(ss.getBlockTypeId(x, y, z) << 4) | ss.getBlockData(x, y, z)]; } /**