From d98b3b98962a6b84b1f3407e637c306d4671be35 Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 17 Jan 2016 19:45:08 -0500 Subject: [PATCH] IntHashMap for ChunkProviderServer It's magical! See #10 --- .../world/gen/ChunkProviderServer.java.patch | 44 +++++++++++++------ 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/patches/net/minecraft/world/gen/ChunkProviderServer.java.patch b/patches/net/minecraft/world/gen/ChunkProviderServer.java.patch index a1c1f03..df0c2d6 100644 --- a/patches/net/minecraft/world/gen/ChunkProviderServer.java.patch +++ b/patches/net/minecraft/world/gen/ChunkProviderServer.java.patch @@ -68,6 +68,7 @@ + public boolean loadChunkOnProvideRequest = MinecraftServer.getServer().cauldronConfig.loadChunkOnRequest.getValue(); // Cauldron - if true, allows mods to force load chunks. to disable, set load-chunk-on-request in cauldron.yml to false + public int initialTick; // Cauldron counter to keep track of when this loader was created + public TLongObjectMap loadedChunkHashMap_KC = new TSynchronizedLongObjectMap(new TLongObjectHashMap()); ++ public ConcurrentHashMap chunkt_KC = new ConcurrentHashMap(); + public List loadedChunks = new ArrayList(); // Cauldron - vanilla compatibility public WorldServer worldObj; private Set loadingChunks = com.google.common.collect.Sets.newHashSet(); @@ -85,7 +86,8 @@ public boolean chunkExists(int p_73149_1_, int p_73149_2_) { - return this.loadedChunkHashMap.containsItem(ChunkCoordIntPair.chunkXZ2Int(p_73149_1_, p_73149_2_)); -+ return this.loadedChunkHashMap_KC.containsKey(LongHash.toLong(p_73149_1_, p_73149_2_)); // CraftBukkit ++ //return this.loadedChunkHashMap_KC.containsKey(LongHash.toLong(p_73149_1_, p_73149_2_)); // CraftBukkit ++ return this.chunkt_KC.containsKey(chunk_hash(p_73149_1_, p_73149_2_)); //KCauldron Replacement for line above } - public List func_152380_a() @@ -93,11 +95,17 @@ { return this.loadedChunks; } - ++ ++ public static int chunk_hash(int x, int y) ++ { ++ return ((x & 0xFFFF) << 16) | (y & 0xFFFF); ++ } ++ public void unloadChunksIfNotNearSpawn(int p_73241_1_, int p_73241_2_) { + // PaperSpigot start - Asynchronous lighting updates -+ Chunk chunk = this.loadedChunkHashMap_KC.get(LongHash.toLong(p_73241_1_, p_73241_2_)); ++ //Chunk chunk = this.loadedChunkHashMap_KC.get(LongHash.toLong(p_73241_1_, p_73241_2_)); ++ Chunk chunk = this.chunkt_KC.get(chunk_hash(p_73241_1_, p_73241_2_)); //KCauldron replacement for line above + if (chunk != null && chunk.worldObj.spigotConfig.useAsyncLighting && (chunk.pendingLightUpdates.get() > 0 || chunk.worldObj.getTotalWorldTime() - chunk.lightUpdateTime < 20)) { + return; + } @@ -114,7 +122,8 @@ { - this.chunksToUnload.add(Long.valueOf(ChunkCoordIntPair.chunkXZ2Int(p_73241_1_, p_73241_2_))); + this.chunksToUnload.add(p_73241_1_, p_73241_2_); -+ Chunk c = this.loadedChunkHashMap_KC.get(LongHash.toLong(p_73241_1_, p_73241_2_)); ++ //Chunk c = this.loadedChunkHashMap_KC.get(LongHash.toLong(p_73241_1_, p_73241_2_)); ++ Chunk c = this.chunkt_KC.get(chunk_hash(p_73241_1_, p_73241_2_)); //KCauldron replacement for line above + + if (c != null) + { @@ -130,7 +139,8 @@ - this.chunksToUnload.add(Long.valueOf(ChunkCoordIntPair.chunkXZ2Int(p_73241_1_, p_73241_2_))); + // CraftBukkit start + this.chunksToUnload.add(p_73241_1_, p_73241_2_); -+ Chunk c = this.loadedChunkHashMap_KC.get(LongHash.toLong(p_73241_1_, p_73241_2_)); ++ //Chunk c = this.loadedChunkHashMap_KC.get(LongHash.toLong(p_73241_1_, p_73241_2_)); ++ Chunk c = this.chunkt_KC.get(chunk_hash(p_73241_1_, p_73241_2_)); //KCauldron replacement for line above + + if (c != null) + { @@ -159,7 +169,8 @@ - this.unloadChunksIfNotNearSpawn(chunk.xPosition, chunk.zPosition); - } + public Chunk getChunkIfLoaded(int x, int z) { -+ return this.loadedChunkHashMap_KC.get(LongHash.toLong(x, z)); ++ //return this.loadedChunkHashMap_KC.get(LongHash.toLong(x, z)); ++ return this.chunkt_KC.get(chunk_hash(x,z)); //KCauldron replacement for line above } public Chunk loadChunk(int p_73158_1_, int p_73158_2_) @@ -171,7 +182,8 @@ - this.chunksToUnload.remove(Long.valueOf(k)); - Chunk chunk = (Chunk)this.loadedChunkHashMap.getValueByKey(k); + this.chunksToUnload.remove(par1, par2); -+ Chunk chunk = (Chunk) this.loadedChunkHashMap_KC.get(LongHash.toLong(par1, par2)); ++ //Chunk chunk = (Chunk) this.loadedChunkHashMap_KC.get(LongHash.toLong(par1, par2)); ++ Chunk chunk = (Chunk) this.chunkt_KC.get(chunk_hash(par1,par2)); //KCauldron replacement for line above + boolean newChunk = false; AnvilChunkLoader loader = null; @@ -193,7 +205,8 @@ - this.chunksToUnload.remove(Long.valueOf(k)); - Chunk chunk = (Chunk)this.loadedChunkHashMap.getValueByKey(k); + this.chunksToUnload.remove(p_73158_1_, p_73158_2_); -+ Chunk chunk = (Chunk) this.loadedChunkHashMap_KC.get(LongHash.toLong(p_73158_1_, p_73158_2_)); ++ //Chunk chunk = (Chunk) this.loadedChunkHashMap_KC.get(LongHash.toLong(p_73241_1_, p_73241_2_)); ++ Chunk chunk = (Chunk) this.chunkt_KC.get(chunk_hash(p_73241_1_, p_73241_2_)); //KCauldron replacement for line above + boolean newChunk = false; // CraftBukkit if (chunk == null) @@ -231,6 +244,7 @@ + this.loadedChunkHashMap_KC.put(LongHash.toLong(p_73158_1_, p_73158_2_), chunk); // CraftBukkit + this.loadedChunks.add(chunk); // Cauldron - vanilla compatibility + loadingChunks.remove(LongHash.toLong(p_73158_1_, p_73158_2_)); // Cauldron - LongHash ++ this.chunkt_KC.put(chunk_hash(p_73158_1_, p_73158_2_), chunk); //KCauldron - IntHash + + if (chunk != null) + { @@ -276,7 +290,8 @@ - Chunk chunk = (Chunk)this.loadedChunkHashMap.getValueByKey(ChunkCoordIntPair.chunkXZ2Int(p_73154_1_, p_73154_2_)); - return chunk == null ? (!this.worldObj.findingSpawnPoint && !this.loadChunkOnProvideRequest ? this.defaultEmptyChunk : this.loadChunk(p_73154_1_, p_73154_2_)) : chunk; + // CraftBukkit start -+ Chunk chunk = (Chunk) this.loadedChunkHashMap_KC.get(LongHash.toLong(p_73154_1_, p_73154_2_)); ++ //Chunk chunk = (Chunk) this.loadedChunkHashMap_KC.get(LongHash.toLong(p_73154_1_, p_73154_2_)); ++ Chunk chunk = (Chunk) this.chunkt_KC.get(chunk_hash(p_73154_1_, p_73154_2_)); //KCauldron replacement for line above + chunk = chunk == null ? (shouldLoadChunk() ? this.loadChunk(p_73154_1_, p_73154_2_) : this.defaultEmptyChunk) : chunk; // Cauldron handle forge server tick events and load the chunk within 5 seconds of the world being loaded (for chunk loaders) + + if (chunk == this.defaultEmptyChunk) @@ -436,7 +451,7 @@ { - if (!this.chunksToUnload.isEmpty()) + long chunkcoordinates = this.chunksToUnload.popFirst(); -+ Chunk chunk = this.loadedChunkHashMap_KC.get(chunkcoordinates); ++ Chunk chunk = this.loadedChunkHashMap_KC.get(chunkcoordinates); //Not using the IntMap for this + + if (chunk == null) { @@ -493,6 +508,7 @@ - this.loadedChunkHashMap.remove(olong.longValue()); + this.loadedChunkHashMap_KC.remove(chunkcoordinates); // CraftBukkit + this.loadedChunks.remove(chunk); // Cauldron - vanilla compatibility ++ this.chunkt_KC.remove(chunk_hash(chunk.xCoord,chunk.zCoord)); //KCauldron - IntHashMap + ForgeChunkManager.putDormantChunk(chunkcoordinates, chunk); + if(this.loadedChunkHashMap_KC.size() == 0 && ForgeChunkManager.getPersistentChunksFor(this.worldObj).size() == 0 && !DimensionManager.shouldLoadSpawn(this.worldObj.provider.dimensionId)){ + DimensionManager.unloadWorld(this.worldObj.provider.dimensionId); @@ -536,9 +552,11 @@ + + public long lastAccessed(int x, int z) + { -+ long chunkHash = LongHash.toLong(x, z); -+ if (!loadedChunkHashMap_KC.containsKey(chunkHash)) return 0; -+ return loadedChunkHashMap_KC.get(chunkHash).lastAccessedTick; ++ //long chunkHash = LongHash.toLong(x, z); ++ //if (!loadedChunkHashMap_KC.containsKey(chunkHash)) return 0; ++ //return loadedChunkHashMap_KC.get(chunkHash).lastAccessedTick; ++ if (!chunkt_KC.containsKey(chunk_hash(x,z))) return 0; ++ return chunkt_KC.get(chunk_hash(x,z)).lastAccessedTick; + } + + private boolean shouldUnloadChunk(Chunk chunk)