package net.minecraft.client.multiplayer;
import com.google.common.collect.Lists;
import java.util.Iterator;
import java.util.List;
import net.minecraft.entity.EnumCreatureType;
import net.minecraft.util.BlockPos;
import net.minecraft.util.IProgressUpdate;
import net.minecraft.util.LongHashMap;
import net.minecraft.world.ChunkCoordIntPair;
import net.minecraft.world.World;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.EmptyChunk;
import net.minecraft.world.chunk.IChunkProvider;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class ChunkProviderClient implements IChunkProvider
{
private static final Logger logger = LogManager.getLogger();
/**
* The completely empty chunk used by ChunkProviderClient when chunkMapping doesn't contain the requested
* coordinates.
*/
private Chunk blankChunk;
/**
* The mapping between ChunkCoordinates and Chunks that ChunkProviderClient maintains.
*/
private LongHashMap chunkMapping = new LongHashMap();
/**
* This may have been intended to be an iterable version of all currently loaded chunks (MultiplayerChunkCache),
* with identical contents to chunkMapping's values. However it is never actually added to.
*/
private List chunkListing = Lists.newArrayList();
/** Reference to the World object. */
private World worldObj;
private static final String __OBFID = "CL_00000880";
public ChunkProviderClient(World worldIn)
{
this.blankChunk = new EmptyChunk(worldIn, 0, 0);
this.worldObj = worldIn;
}
/**
* Checks to see if a chunk exists at x, y
*/
public boolean chunkExists(int p_73149_1_, int p_73149_2_)
{
return true;
}
/**
* Unload chunk from ChunkProviderClient's hashmap. Called in response to a Packet50PreChunk with its mode field set
* to false
*/
public void unloadChunk(int p_73234_1_, int p_73234_2_)
{
Chunk var3 = this.provideChunk(p_73234_1_, p_73234_2_);
if (!var3.isEmpty())
{
var3.onChunkUnload();
}
this.chunkMapping.remove(ChunkCoordIntPair.chunkXZ2Int(p_73234_1_, p_73234_2_));
this.chunkListing.remove(var3);
}
/**
* loads or generates the chunk at the chunk location specified
*/
public Chunk loadChunk(int p_73158_1_, int p_73158_2_)
{
Chunk var3 = new Chunk(this.worldObj, p_73158_1_, p_73158_2_);
this.chunkMapping.add(ChunkCoordIntPair.chunkXZ2Int(p_73158_1_, p_73158_2_), var3);
this.chunkListing.add(var3);
var3.func_177417_c(true);
return var3;
}
/**
* Will return back a chunk, if it doesn't exist and its not a MP client it will generates all the blocks for the
* specified chunk from the map seed and chunk seed
*/
public Chunk provideChunk(int p_73154_1_, int p_73154_2_)
{
Chunk var3 = (Chunk)this.chunkMapping.getValueByKey(ChunkCoordIntPair.chunkXZ2Int(p_73154_1_, p_73154_2_));
return var3 == null ? this.blankChunk : var3;
}
/**
* Two modes of operation: if passed true, save all Chunks in one go. If passed false, save up to two chunks.
* Return true if all chunks have been saved.
*/
public boolean saveChunks(boolean p_73151_1_, IProgressUpdate p_73151_2_)
{
return true;
}
/**
* Save extra data not associated with any Chunk. Not saved during autosave, only during world unload. Currently
* unimplemented.
*/
public void saveExtraData() {}
/**
* Unloads chunks that are marked to be unloaded. This is not guaranteed to unload every such chunk.
*/
public boolean unloadQueuedChunks()
{
long var1 = System.currentTimeMillis();
Iterator var3 = this.chunkListing.iterator();
while (var3.hasNext())
{
Chunk var4 = (Chunk)var3.next();
var4.func_150804_b(System.currentTimeMillis() - var1 > 5L);
}
if (System.currentTimeMillis() - var1 > 100L)
{
logger.info("Warning: Clientside chunk ticking took {} ms", new Object[] {Long.valueOf(System.currentTimeMillis() - var1)});
}
return false;
}
/**
* Returns if the IChunkProvider supports saving.
*/
public boolean canSave()
{
return false;
}
/**
* Populates chunk with ores etc etc
*/
public void populate(IChunkProvider p_73153_1_, int p_73153_2_, int p_73153_3_) {}
public boolean func_177460_a(IChunkProvider p_177460_1_, Chunk p_177460_2_, int p_177460_3_, int p_177460_4_)
{
return false;
}
/**
* Converts the instance data to a readable string.
*/
public String makeString()
{
return "MultiplayerChunkCache: " + this.chunkMapping.getNumHashElements() + ", " + this.chunkListing.size();
}
public List func_177458_a(EnumCreatureType p_177458_1_, BlockPos p_177458_2_)
{
return null;
}
public BlockPos func_180513_a(World worldIn, String p_180513_2_, BlockPos p_180513_3_)
{
return null;
}
public int getLoadedChunkCount()
{
return this.chunkListing.size();
}
public void func_180514_a(Chunk p_180514_1_, int p_180514_2_, int p_180514_3_) {}
public Chunk func_177459_a(BlockPos p_177459_1_)
{
return this.provideChunk(p_177459_1_.getX() >> 4, p_177459_1_.getZ() >> 4);
}
}