diff options
Diffstat (limited to 'src/org/bukkit/craftbukkit/CraftWorld.java')
-rw-r--r-- | src/org/bukkit/craftbukkit/CraftWorld.java | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/src/org/bukkit/craftbukkit/CraftWorld.java b/src/org/bukkit/craftbukkit/CraftWorld.java new file mode 100644 index 00000000..304f3079 --- /dev/null +++ b/src/org/bukkit/craftbukkit/CraftWorld.java @@ -0,0 +1,129 @@ + +package org.bukkit.craftbukkit; + +import java.util.HashMap; +import java.util.Map; +import net.minecraft.server.WorldServer; +import org.bukkit.Block; +import org.bukkit.Chunk; +import org.bukkit.World; + +public class CraftWorld implements World { + private final Map<ChunkCoordinate, Chunk> chunkCache = new HashMap<ChunkCoordinate, Chunk>(); + private final Map<BlockCoordinate, Block> blockCache = new HashMap<BlockCoordinate, Block>(); + private final WorldServer world; + + protected CraftWorld(WorldServer world) { + this.world = world; + } + + public Block getBlockAt(int x, int y, int z) { + BlockCoordinate loc = new BlockCoordinate(x, y, z); + Block block = blockCache.get(loc); + + if (block == null) { + block = new CraftBlock(this, x, y, z, world.a(x, y, z), (byte)world.b(x, y, z)); + blockCache.put(loc, block); + } + + return block; + } + + public Chunk getChunkAt(int x, int z) { + ChunkCoordinate loc = new ChunkCoordinate(x, z); + Chunk chunk = chunkCache.get(loc); + + if (chunk == null) { + chunk = new CraftChunk(x, z); + chunkCache.put(loc, chunk); + } + + return chunk; + } + + public Chunk getChunkAt(Block block) { + return getChunkAt(block.getX() << 4, block.getZ() << 4); + } + + public boolean isChunkLoaded() { + throw new UnsupportedOperationException("Not supported yet."); + } + + private final class ChunkCoordinate { + public final int x; + public final int z; + + public ChunkCoordinate(final int x, final int z) { + this.x = x; + this.z = z; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final ChunkCoordinate other = (ChunkCoordinate) obj; + if (this.x != other.x) { + return false; + } + if (this.z != other.z) { + return false; + } + return true; + } + + @Override + public int hashCode() { + int hash = 5; + hash = 53 * hash + this.x; + hash = 53 * hash + this.z; + return hash; + } + } + + private final class BlockCoordinate { + public final int x; + public final int y; + public final int z; + + public BlockCoordinate(final int x, final int y, final int z) { + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final BlockCoordinate other = (BlockCoordinate) obj; + if (this.x != other.x) { + return false; + } + if (this.y != other.y) { + return false; + } + if (this.z != other.z) { + return false; + } + return true; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 37 * hash + this.x; + hash = 37 * hash + this.y; + hash = 37 * hash + this.z; + return hash; + } + } +} |