package mods.eln.ghost; import mods.eln.Eln; import mods.eln.misc.Coordonate; import mods.eln.misc.Utils; import mods.eln.node.NodeBase; import mods.eln.node.NodeManager; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import net.minecraft.world.WorldSavedData; import java.util.Hashtable; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; public class GhostManager extends WorldSavedData { public GhostManager(String par1Str) { super(par1Str); } Map<Coordonate, GhostElement> ghostTable = new Hashtable<Coordonate, GhostElement>(); Map<Coordonate, GhostObserver> observerTable = new Hashtable<Coordonate, GhostObserver>(); public void clear() { ghostTable.clear(); observerTable.clear(); } public void init() { } @Override public boolean isDirty() { return true; } /* public void addGhost(GhostElement element) { ghostTable.put(element.elementCoordonate, element); }*/ public GhostElement getGhost(Coordonate coordonate) { return ghostTable.get(coordonate); } public void removeGhost(Coordonate coordonate) { removeGhostNode(coordonate); ghostTable.remove(coordonate); } public void addObserver(GhostObserver observer) { observerTable.put(observer.getGhostObserverCoordonate(), observer); } public GhostObserver getObserver(Coordonate coordonate) { return observerTable.get(coordonate); } public void removeObserver(Coordonate coordonate) { observerTable.remove(coordonate); } public void removeGhostAndBlockWithObserver(Coordonate observerCoordonate) { Iterator<Entry<Coordonate, GhostElement>> iterator = ghostTable.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<Coordonate, GhostElement> entry = iterator.next(); GhostElement element = entry.getValue(); if (element.observatorCoordonate.equals(observerCoordonate)) { iterator.remove(); removeGhostNode(element.elementCoordonate); element.elementCoordonate.world().setBlockToAir(element.elementCoordonate.x, element.elementCoordonate.y, element.elementCoordonate.z); } } } public void removeGhostAndBlockWithObserver(Coordonate observerCoordonate, int uuid) { Iterator<Entry<Coordonate, GhostElement>> iterator = ghostTable.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<Coordonate, GhostElement> entry = iterator.next(); GhostElement element = entry.getValue(); if (element.observatorCoordonate.equals(observerCoordonate) && element.getUUID() == uuid) { iterator.remove(); removeGhostNode(element.elementCoordonate); element.elementCoordonate.world().setBlockToAir(element.elementCoordonate.x, element.elementCoordonate.y, element.elementCoordonate.z); } } } public void removeGhostAndBlockWithObserverAndNotUuid(Coordonate observerCoordonate, int uuid) { Iterator<Entry<Coordonate, GhostElement>> iterator = ghostTable.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<Coordonate, GhostElement> entry = iterator.next(); GhostElement element = entry.getValue(); if (element.observatorCoordonate.equals(observerCoordonate) && element.getUUID() != uuid) { iterator.remove(); removeGhostNode(element.elementCoordonate); element.elementCoordonate.world().setBlockToAir(element.elementCoordonate.x, element.elementCoordonate.y, element.elementCoordonate.z); } } } public void removeGhostNode(Coordonate c) { NodeBase node = NodeManager.instance.getNodeFromCoordonate(c); if (node == null) return; node.onBreakBlock(); } public void removeGhostAndBlock(Coordonate coordonate) { removeGhost(coordonate); coordonate.world().setBlockToAir(coordonate.x, coordonate.y, coordonate.z); //caca1.5.1 } @Override public void readFromNBT(NBTTagCompound nbt) { /*for(NBTTagCompound o : Utils.getTags(nbt)) { NBTTagCompound tag = (NBTTagCompound) o; GhostElement ghost = new GhostElement(); ghost.readFromNBT(tag, ""); ghostTable.put(ghost.elementCoordonate, ghost); }*/ } @Override public void writeToNBT(NBTTagCompound nbt) { /* int nodeCounter = 0; for(GhostElement ghost : ghostTable.values()) { NBTTagCompound nbtGhost = new NBTTagCompound(); ghost.writeToNBT(nbtGhost, ""); nbt.setTag("n" + nodeCounter++, nbtGhost); }*/ } public void loadFromNBT(NBTTagCompound nbt) { for (NBTTagCompound o : Utils.getTags(nbt)) { NBTTagCompound tag = (NBTTagCompound) o; GhostElement ghost = new GhostElement(); ghost.readFromNBT(tag, ""); ghostTable.put(ghost.elementCoordonate, ghost); } } public void saveToNBT(NBTTagCompound nbt, int dim) { int nodeCounter = 0; for (GhostElement ghost : ghostTable.values()) { if (dim != Integer.MIN_VALUE && ghost.elementCoordonate.dimention != dim) continue; NBTTagCompound nbtGhost = new NBTTagCompound(); ghost.writeToNBT(nbtGhost, ""); nbt.setTag("n" + nodeCounter++, nbtGhost); } } public void unload(int dimensionId) { Iterator<GhostElement> i = ghostTable.values().iterator(); while (i.hasNext()) { GhostElement n = i.next(); if (n.elementCoordonate.dimention == dimensionId) { i.remove(); } } } public boolean canCreateGhostAt(World world, int x, int y, int z) { if (!world.getChunkProvider().chunkExists(x >> 4, z >> 4)) { return false; } else if (world.getBlock(x, y, z) != Blocks.air && !world.getBlock(x, y, z).isReplaceable(world, x, y, z)) { return false; } else return true; } public void createGhost(Coordonate coordonate, Coordonate observerCoordonate, int UUID) { createGhost(coordonate, observerCoordonate, UUID, Eln.ghostBlock, GhostBlock.tCube); } public void createGhost(Coordonate coordonate, Coordonate observerCoordonate, int UUID, Block block, int meta) { coordonate.world().setBlockToAir(coordonate.x, coordonate.y, coordonate.z); if (coordonate.world().setBlock(coordonate.x, coordonate.y, coordonate.z, block, meta, 3)) { coordonate = new Coordonate(coordonate); GhostElement element = new GhostElement(coordonate, observerCoordonate, UUID); ghostTable.put(element.elementCoordonate, element); } } }