package com.bioxx.jmapgen.dungeon; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import com.bioxx.jmapgen.IslandMap; import com.bioxx.tfc2.api.util.Helper; public class Dungeon { String theme = "generic"; public Map<String, IBlockState> blockMap = new HashMap<String, IBlockState>(); private Map <Integer, DungeonChunk> dungeonMap; public RoomPos dungeonStart; public Dungeon(String theme, int x, int y, int z) { this.theme = theme; dungeonMap = new HashMap<Integer, DungeonChunk>(); dungeonStart = new RoomPos(x, y, z); } public void writeToNBT(NBTTagCompound nbt) { nbt.setString("theme", theme); nbt.setInteger("xPos", dungeonStart.getX()); nbt.setInteger("yPos", dungeonStart.getY()); nbt.setInteger("zPos", dungeonStart.getZ()); NBTTagList blockMapTag = new NBTTagList(); Iterator iter = blockMap.keySet().iterator(); while(iter.hasNext()) { String key = (String)iter.next(); IBlockState state = blockMap.get(key); NBTTagCompound blockTag = new NBTTagCompound(); blockTag.setString("Key", key); blockTag.setString("Block", state.getBlock().getRegistryName().toString()); blockTag.setInteger("Meta", state.getBlock().getMetaFromState(state)); blockMapTag.appendTag(blockTag); } nbt.setTag("BlockMap", blockMapTag); NBTTagList chunkMapTag = new NBTTagList(); iter = dungeonMap.keySet().iterator(); while(iter.hasNext()) { int id = (Integer)iter.next(); NBTTagCompound chunknbt = new NBTTagCompound(); chunknbt.setInteger("id", id); dungeonMap.get(id).writeToNBT(chunknbt); chunkMapTag.appendTag(chunknbt); } nbt.setTag("ChunkMap", chunkMapTag); } public void readFromNBT(IslandMap map, NBTTagCompound nbt) { theme = nbt.getString("theme"); this.dungeonStart = new RoomPos(nbt.getInteger("xPos"), nbt.getInteger("yPos"), nbt.getInteger("zPos")); NBTTagList tagList = nbt.getTagList("BlockMap", 10); for(int i = 0; i < tagList.tagCount(); i++) { NBTTagCompound blockTag = tagList.getCompoundTagAt(i); String key = blockTag.getString("Key"); Block b = Block.getBlockFromName(blockTag.getString("Block")); IBlockState state = b.getStateFromMeta(blockTag.getInteger("Meta")); blockMap.put(key, state); } tagList = nbt.getTagList("ChunkMap", 10); for(int i = 0; i < tagList.tagCount(); i++) { NBTTagCompound blockTag = tagList.getCompoundTagAt(i); int id = blockTag.getInteger("id"); DungeonChunk dc = new DungeonChunk(Helper.getXCoord(id), Helper.getYCoord(id)); dc.readFromNBT(blockTag); this.setChunk(dc, dc.chunkX, dc.chunkZ); } } public String getTheme() { return theme; } public void setRoom(DungeonRoom room) { getChunk(room.getPosition().getX(), room.getPosition().getZ()).set(room.getPosition().getY(), room); } public void setRoom(RoomPos pos, DungeonRoom room) { getChunk(pos.getX(), pos.getZ()).set(pos.getY(), room); } public void setRoom(int x, int y, int z, DungeonRoom room) { getChunk(x, z).set(y, room); } public DungeonRoom getRoom(int x, int y, int z) { return getChunk(x, z).get(y); } public DungeonRoom getRoom(RoomPos pos) { return getRoom(pos.getX(), pos.getY(), pos.getZ()); } public DungeonChunk getChunk(int x, int z) { DungeonChunk dc = dungeonMap.get(Helper.combineCoords(x, z)); if(dc == null) { dc = new DungeonChunk(x, z); dungeonMap.put(Helper.combineCoords(x, z), dc); } return dc; } public void setChunk(DungeonChunk dc, int x, int z) { dungeonMap.put(Helper.combineCoords(x, z), dc); } public void resetDungeonMap() { dungeonMap.clear(); } public int getRoomCount() { int count = 0; for(DungeonChunk c : dungeonMap.values()) { Iterator iter = c.getRoomMap().values().iterator(); while(iter.hasNext()) { iter.next(); count++; } } return count; } }