package mods.eln.node; import mods.eln.misc.Coordonate; import mods.eln.misc.Utils; import mods.eln.node.transparent.TransparentNode; import mods.eln.node.transparent.TransparentNodeElement; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.WorldSavedData; import java.util.*; public class NodeManager extends WorldSavedData { public static NodeManager instance = null; private HashMap<Coordonate, NodeBase> nodesMap; private ArrayList<NodeBase> nodes; public HashMap<Coordonate, NodeBase> getNodeArray() { return nodesMap; } public ArrayList<NodeBase> getNodes() { return nodes; } public static final HashMap<String, Class> UUIDToClass = new HashMap<String, Class>(); public static void registerUuid(String uuid, Class classType) { UUIDToClass.put(uuid, classType); } Collection<NodeBase> getNodeList() { return nodesMap.values(); } // private ArrayList<Node> nodeArray = new ArrayList<Node>(); public NodeManager(String par1Str) { super(par1Str); nodesMap = new HashMap<Coordonate, NodeBase>(); nodes = new ArrayList<NodeBase>(); instance = this; } public void addNode(NodeBase node) { // nodeArray.add(node); if (node.coordonate == null) { Utils.println("Null coordonate addnode"); while (true) ; } NodeBase old = nodesMap.put(node.coordonate, node); if (old != null) { nodes.remove(old); } nodes.add(node); Utils.println("NodeManager has " + nodesMap.size() + "node"); // nodeArray.put(new NodeIdentifier(node), node); } public void removeNode(NodeBase node) { if (node == null) return; nodesMap.remove(node.coordonate); nodes.remove(node); Utils.println("NodeManager has " + nodesMap.size() + "node"); } public void removeCoordonate(Coordonate c) { // nodeArray.remove(node); NodeBase n = nodesMap.remove(c); if (n != null) nodes.remove(n); Utils.println("NodeManager has " + nodesMap.size() + "node"); } @Override public boolean isDirty() { return true; } @Override public void readFromNBT(NBTTagCompound nbt) { int i = 0; i++; /* * for(Object o : Utils.getTags(nbt)) { NBTTagCompound tag = (NBTTagCompound) o; Class nodeClass = UUIDToClass.get(tag.getString("tag")); try { NodeBase node = (NodeBase) nodeClass.getConstructor().newInstance(); node.readFromNBT(tag); addNode(node); node.initializeFromNBT(); * * } catch (Exception e) { e.printStackTrace(); } * * } * * * * for(NodeBase node : nodes){ node.globalBoot(); } */ } @Override public void writeToNBT(NBTTagCompound nbt) { /* * int nodeCounter = 0; for(NodeBase node : nodesmap.values()) { try { if(node.mustBeSaved() == false) continue; NBTTagCompound nbtNode = new NBTTagCompound(); nbtNode.setString("tag", node.getNodeUuid()); node.writeToNBT(nbtNode); nbt.setTag("n" + nodeCounter++, nbtNode); } catch (Exception e) { e.printStackTrace(); } * * } */ } public NodeBase getNodeFromCoordonate(Coordonate nodeCoordonate) { int idx = 0; idx++; // for(Node node : nodeArray) { // if(nodeCoordonate.equals(node.coordonate)) return node; } return nodesMap.get(nodeCoordonate); // return null; } public TransparentNodeElement getTransparentNodeFromCoordinate(Coordonate coord) { NodeBase base = getNodeFromCoordonate(coord); if (base instanceof TransparentNode) { TransparentNode n = (TransparentNode) base; return n.element; } return null; } Random rand = new Random(); public NodeBase getRandomNode() { if (nodes.isEmpty()) return null; return nodes.get(rand.nextInt(nodes.size())); } public void loadFromNbt(NBTTagCompound nbt) { List<NodeBase> addedNode = new ArrayList<NodeBase>(); for (Object o : Utils.getTags(nbt)) { NBTTagCompound tag = (NBTTagCompound) o; Class nodeClass = UUIDToClass.get(tag.getString("tag")); try { NodeBase node = (NodeBase) nodeClass.getConstructor().newInstance(); node.readFromNBT(tag); addNode(node); addedNode.add(node); node.initializeFromNBT(); } catch (Exception e) { e.printStackTrace(); } } for (NodeBase n : addedNode) { n.globalBoot(); } } public void saveToNbt(NBTTagCompound nbt, int dim) { int nodeCounter = 0; List<NodeBase> nodesCopy = new ArrayList<NodeBase>(); nodesCopy.addAll(nodes); for (NodeBase node : nodesCopy) { try { if (node.mustBeSaved() == false) continue; if (dim != Integer.MIN_VALUE && node.coordonate.dimention != dim) continue; NBTTagCompound nbtNode = new NBTTagCompound(); nbtNode.setString("tag", node.getNodeUuid()); node.writeToNBT(nbtNode); nbt.setTag("n" + nodeCounter++, nbtNode); } catch (Exception e) { e.printStackTrace(); } } } public void clear() { nodes.clear(); nodesMap.clear(); } public void unload(int dimensionId) { Iterator<NodeBase> i = nodes.iterator(); while (i.hasNext()) { NodeBase n = i.next(); if (n.coordonate.dimention == dimensionId) { n.unload(); i.remove(); nodesMap.remove(n.coordonate); } } } }