package openmods.world;
import com.google.common.collect.Maps;
import com.google.common.collect.Queues;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent.Phase;
import cpw.mods.fml.common.gameevent.TickEvent.WorldTickEvent;
import cpw.mods.fml.relauncher.Side;
import java.util.Map;
import java.util.Queue;
import net.minecraft.world.World;
public class DelayedActionTickHandler {
public static final DelayedActionTickHandler INSTANCE = new DelayedActionTickHandler();
private DelayedActionTickHandler() {}
private Map<Integer, Queue<Runnable>> callbacks = Maps.newHashMap();
private Queue<Runnable> getWorldQueue(int worldId) {
synchronized (callbacks) {
Queue<Runnable> result = callbacks.get(worldId);
if (result == null) {
result = Queues.newConcurrentLinkedQueue();
callbacks.put(worldId, result);
}
return result;
}
}
public void addTickCallback(World world, Runnable callback) {
int worldId = world.provider.dimensionId;
getWorldQueue(worldId).add(callback);
}
@SubscribeEvent
public void onWorldTick(WorldTickEvent evt) {
if (evt.side == Side.SERVER && evt.phase == Phase.END) {
int worldId = evt.world.provider.dimensionId;
Queue<Runnable> callbacks = getWorldQueue(worldId);
Runnable callback;
while ((callback = callbacks.poll()) != null) {
callback.run();
}
}
}
}