package com.flansmod.common.teams; import java.util.ArrayList; import com.flansmod.common.FlansMod; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.World; import net.minecraftforge.common.ForgeChunkManager; import net.minecraftforge.common.ForgeChunkManager.Ticket; import net.minecraftforge.common.ForgeChunkManager.Type; public class TeamsMap { public String shortName; public String name; public Ticket chunkLoadingTicket; public ArrayList<ITeamBase> bases = new ArrayList<ITeamBase>(); public int minPlayers = 0, maxPlayers = 1000000; public TeamsMap(World world, String sn, String n) { shortName = sn; name = n; //Ask Forge for a chunk loading ticket chunkLoadingTicket = ForgeChunkManager.requestTicket(FlansMod.INSTANCE, world, Type.NORMAL); if(chunkLoadingTicket == null) { FlansMod.log("Failed to add chunk loading ticket as Flan's Mod has run out"); return; } //We give the ticket some information so that when we receive the ticket later, we can pass it back to this map chunkLoadingTicket.getModData().setString("ShortName", shortName); } public ArrayList<ITeamBase> getBasesPerTeam(int teamID) { ArrayList<ITeamBase> basesForThisTeam = new ArrayList<ITeamBase>(); for(ITeamBase base : bases) { if(base.getOwnerID() == teamID) basesForThisTeam.add(base); } return basesForThisTeam; } public void addBase(ITeamBase base) { bases.add(base); } public void addBaseFirstTime(ITeamBase base) { addBase(base); //Add the chunk this base is in to our chunk loading ticket ForgeChunkManager.forceChunk(chunkLoadingTicket, new ChunkCoordIntPair((int)base.getPosX() >> 4, (int)base.getPosZ() >> 4)); FlansMod.log("Added chunk at " + ((int)base.getPosX() >> 4) + ", " + ((int)base.getPosZ() >> 4) + " to chunk loading ticket for base " + name ); } public void removeBase(ITeamBase base) { if(bases == null) { FlansMod.log("Base array for map " + name + " null"); return; } bases.remove(base); //Remove the chunk from the chunk loading ticket ForgeChunkManager.unforceChunk(chunkLoadingTicket, new ChunkCoordIntPair((int)base.getPosX() >> 4, (int)base.getPosZ() >> 4)); FlansMod.log("Removed chunk at " + ((int)base.getPosX() >> 4) + ", " + ((int)base.getPosZ() >> 4) + " from chunk loading ticket for base " + name ); } public void addObject(ITeamObject object) { } public void addObjectFirstTime(ITeamObject object) { //Add the chunk this object is in to our chunk loading ticket if(object.forceChunkLoading()) ForgeChunkManager.forceChunk(chunkLoadingTicket, new ChunkCoordIntPair((int)object.getPosX() >> 4, (int)object.getPosZ() >> 4)); } public TeamsMap(World world, NBTTagCompound tags) { shortName = tags.getString("ShortName"); name = tags.getString("Name"); minPlayers = tags.getInteger("MinPlayers"); maxPlayers = tags.getInteger("MaxPlayers"); } public void writeToNBT(NBTTagCompound tags) { tags.setString("ShortName", shortName); tags.setString("Name", name); tags.setInteger("MinPlayers", minPlayers); tags.setInteger("MaxPlayers", maxPlayers); } //Called by the chunk loading callback handler. Upon loading a world, the chunk loading positions //for this map are handed to this method and this method loads the required chunks public void forceChunkLoading(Ticket ticket) { for (ChunkCoordIntPair coord : ticket.getChunkList()) { FlansMod.log("Loading chunk at " + coord.chunkXPos + ", " + coord.chunkZPos + " for map : " + name); ForgeChunkManager.forceChunk(ticket, coord); } } public void deleteMap() { ForgeChunkManager.releaseTicket(chunkLoadingTicket); } }