package com.forgeessentials.util;
import java.util.HashMap;
import java.util.List;
import net.minecraft.world.ChunkCoordIntPair;
import net.minecraft.world.World;
import net.minecraftforge.common.ForgeChunkManager;
import net.minecraftforge.common.ForgeChunkManager.LoadingCallback;
import net.minecraftforge.common.ForgeChunkManager.Ticket;
import com.forgeessentials.core.ForgeEssentials;
import com.forgeessentials.util.output.LoggingHandler;
public class FEChunkLoader implements LoadingCallback
{
static FEChunkLoader instance;
HashMap<Integer, Ticket> map = new HashMap<Integer, Ticket>();
public static FEChunkLoader instance()
{
return instance;
}
public FEChunkLoader()
{
instance = this;
}
public boolean forceLoadWorld(World world)
{
if (map.containsKey(world.provider.dimensionId))
{
LoggingHandler.felog.debug(world.provider.dimensionId + " was already loaded. add 1 to count.");
Ticket ticket = map.get(world.provider.dimensionId);
ticket.getModData().setInteger("count", ticket.getModData().getInteger("count") + 1);
return true;
}
else
{
Ticket ticket = ForgeChunkManager.requestTicket(ForgeEssentials.instance, world, ForgeChunkManager.Type.NORMAL);
if (ticket == null)
{
LoggingHandler.felog.debug("Ticket was null ?");
return false;
}
else
{
LoggingHandler.felog.debug("Force loaded " + world.provider.dimensionId);
ForgeChunkManager.forceChunk(ticket, new ChunkCoordIntPair(0, 0));
ticket.getModData().setInteger("count", 1);
map.put(world.provider.dimensionId, ticket);
return true;
}
}
}
public boolean unforceLoadWorld(World world)
{
if (map.containsKey(world.provider.dimensionId))
{
Ticket ticket = map.get(world.provider.dimensionId);
ticket.getModData().setInteger("count", ticket.getModData().getInteger("count") - 1);
if (ticket.getModData().getInteger("count") == 0)
{
LoggingHandler.felog.debug(world.provider.dimensionId + " was removed fron the force loaded list.");
ForgeChunkManager.unforceChunk(ticket, new ChunkCoordIntPair(0, 0));
ForgeChunkManager.releaseTicket(ticket);
map.remove(world.provider.dimensionId);
return true;
}
else
{
LoggingHandler.felog.debug(world.provider.dimensionId + " is still force loaded. " + ticket.getModData().getInteger("count") + " requests remain.");
return false;
}
}
else
{
LoggingHandler.felog.debug(world.provider.dimensionId + " was not force loaded.");
return false;
}
}
@Override
public void ticketsLoaded(List<Ticket> tickets, World world)
{
// We don't care about reloading the chunks at load right now. The filler needs to be restarted manually.
for (Ticket ticket : tickets)
{
ForgeChunkManager.releaseTicket(ticket);
}
}
}