package li.cil.oc.common.asm.template; import li.cil.oc.api.Network; import li.cil.oc.api.network.Environment; import li.cil.oc.api.network.Node; import li.cil.oc.api.network.Visibility; import li.cil.oc.common.asm.SimpleComponentTickHandler; import li.cil.oc.util.SideTracker; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import java.util.HashMap; import java.util.Map; // This class contains actual implementations of methods injected into tile // entities marked as simple components using the SimpleComponent interface. // They are called from the template methods, to keep the injected methods // minimal, instruction wise, and avoid weird dependencies making the injection // unnecessarily complicated. public final class StaticSimpleEnvironment { private StaticSimpleEnvironment() { } private static final Map<Environment, Node> nodes = new HashMap<Environment, Node>(); public static Node node(final SimpleComponentImpl self) { // Save ourselves the lookup time in the hash map and avoid mixing in // client side tile entities into the map when in single player. if (SideTracker.isClient()) { return null; } if (!nodes.containsKey(self)) { final String name = self.getComponentName(); nodes.put(self, Network. newNode(self, Visibility.Network). withComponent(name). create()); } return nodes.get(self); } public static void validate(final SimpleComponentImpl self) { self.validate_OpenComputers(); SimpleComponentTickHandler.schedule((TileEntity) self); } public static void invalidate(final SimpleComponentImpl self) { self.invalidate_OpenComputers(); final Node node = node(self); if (node != null) { node.remove(); nodes.remove(self); } } public static void onChunkUnload(final SimpleComponentImpl self) { self.onChunkUnload_OpenComputers(); final Node node = node(self); if (node != null) { node.remove(); nodes.remove(self); } } public static void readFromNBT(final SimpleComponentImpl self, NBTTagCompound nbt) { self.readFromNBT_OpenComputers(nbt); final Node node = node(self); if (node != null) { node.load(nbt.getCompoundTag("oc:node")); } } public static void writeToNBT(final SimpleComponentImpl self, NBTTagCompound nbt) { self.writeToNBT_OpenComputers(nbt); final Node node = node(self); if (node != null) { final NBTTagCompound nodeNbt = new NBTTagCompound(); node.save(nodeNbt); nbt.setTag("oc:node", nodeNbt); } } }