package miscperipherals.core;
import java.util.LinkedList;
import java.util.List;
import miscperipherals.peripheral.PeripheralChunkLoader;
import miscperipherals.util.Util;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ChunkCoordinates;
import net.minecraft.world.ChunkCoordIntPair;
import net.minecraft.world.World;
import net.minecraftforge.common.ForgeChunkManager;
import net.minecraftforge.common.ForgeChunkManager.OrderedLoadingCallback;
import net.minecraftforge.common.ForgeChunkManager.Ticket;
import dan200.turtle.api.ITurtleAccess;
public class ChunkLoadingCallback implements OrderedLoadingCallback {
@Override
public void ticketsLoaded(List<Ticket> tickets, World world) {
for (Ticket ticket : tickets) {
int x = ticket.getModData().getInteger("turtleX");
int y = ticket.getModData().getInteger("turtleY");
int z = ticket.getModData().getInteger("turtleZ");
TileEntity te = world.getBlockTileEntity(x, y, z);
if (te instanceof ITurtleAccess) {
ForgeChunkManager.forceChunk(ticket, new ChunkCoordIntPair(x >> 4, z >> 4));
PeripheralChunkLoader loader = Util.getPeripheral((ITurtleAccess)te, PeripheralChunkLoader.class);
if (loader != null) loader.ticketCreated = true;
}
}
}
@Override
public List<Ticket> ticketsLoaded(List<Ticket> tickets, World world, int maxTicketCount) {
List<Ticket> ret = new LinkedList<Ticket>();
List<ChunkCoordinates> known = new LinkedList<ChunkCoordinates>();
for (Ticket ticket : tickets) {
int x = ticket.getModData().getInteger("turtleX");
int y = ticket.getModData().getInteger("turtleY");
int z = ticket.getModData().getInteger("turtleZ");
ChunkCoordinates coords = new ChunkCoordinates(x, y, z);
if (known.contains(coords)) continue;
else known.add(coords);
TileEntity te = world.getBlockTileEntity(x, y, z);
if (te instanceof ITurtleAccess && Util.getPeripheral((ITurtleAccess)te, PeripheralChunkLoader.class) != null) {
ret.add(ticket);
}
}
int removed = tickets.size() - known.size();
if (removed > 0) MiscPeripherals.log.info("Removed "+removed+" bugged duplicate chunk loading tickets from world "+world.provider.dimensionId);
return ret;
}
}