package crazypants.enderio.conduit;
import java.util.ArrayList;
import java.util.IdentityHashMap;
import java.util.List;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent;
import cpw.mods.fml.common.gameevent.TickEvent.Phase;
public class ConduitNetworkTickHandler {
public static final ConduitNetworkTickHandler instance = new ConduitNetworkTickHandler();
public static interface TickListener {
public void tickStart(TickEvent.ServerTickEvent evt);
public void tickEnd(TickEvent.ServerTickEvent evt);
}
private final List<TickListener> listeners = new ArrayList<TickListener>();
private final IdentityHashMap<AbstractConduitNetwork<?,?>, Boolean> networks =
new IdentityHashMap<AbstractConduitNetwork<?, ?>, Boolean>();
public void addListener(TickListener listener) {
listeners.add(listener);
}
public void removeListener(TickListener listener) {
listeners.remove(listener);
}
public void registerNetwork(AbstractConduitNetwork<?,?> cn) {
networks.put(cn, Boolean.TRUE);
}
public void unregisterNetwork(AbstractConduitNetwork<?,?> cn) {
networks.remove(cn);
}
@SubscribeEvent
public void onServerTick(TickEvent.ServerTickEvent event) {
if(event.phase == Phase.START) {
tickStart(event);
} else {
tickEnd(event);
}
}
public void tickStart(TickEvent.ServerTickEvent event) {
for (TickListener h : listeners) {
h.tickStart(event);
}
}
public void tickEnd(TickEvent.ServerTickEvent event) {
for (TickListener h : listeners) {
h.tickEnd(event);
}
listeners.clear();
for(AbstractConduitNetwork<?,?> cn : networks.keySet()) {
cn.doNetworkTick();
}
}
}