diff --git a/src/main/java/net/minecraft/world/ChunkCoordIntPair.java b/src/main/java/net/minecraft/world/ChunkCoordIntPair.java index 8e457ff..1f804ca 100644 --- a/src/main/java/net/minecraft/world/ChunkCoordIntPair.java +++ b/src/main/java/net/minecraft/world/ChunkCoordIntPair.java @@ -1,5 +1,7 @@ package net.minecraft.world; +import org.ultramine.server.chunk.ChunkHash; + public class ChunkCoordIntPair { public final int chunkXPos; @@ -19,10 +21,7 @@ public int hashCode() { - long i = chunkXZ2Int(this.chunkXPos, this.chunkZPos); - int j = (int)i; - int k = (int)(i >> 32); - return j ^ k; + return ChunkHash.chunkToKey(chunkXPos, chunkZPos); } public boolean equals(Object par1Obj) diff --git a/src/main/java/net/minecraft/world/chunk/Chunk.java b/src/main/java/net/minecraft/world/chunk/Chunk.java index 8c33822..23d0e08 100644 --- a/src/main/java/net/minecraft/world/chunk/Chunk.java +++ b/src/main/java/net/minecraft/world/chunk/Chunk.java @@ -1601,6 +1601,11 @@ { if(bindState.canChangeState()) bindState = ChunkBindState.NONE; + updateUnbindTime(); + } + + public void updateUnbindTime() + { unbindTime = ((WorldServer)worldObj).func_73046_m().getTickCounter(); } diff --git a/src/main/java/org/ultramine/server/chunk/ChunkBindState.java b/src/main/java/org/ultramine/server/chunk/ChunkBindState.java index 70388a4..780b086 100644 --- a/src/main/java/org/ultramine/server/chunk/ChunkBindState.java +++ b/src/main/java/org/ultramine/server/chunk/ChunkBindState.java @@ -21,6 +21,12 @@ */ LEAK, /** + * Чанк обнаружен в списке PersistentChunks, созданного форжей для всяких + * чанклоадеров. Не будет выгружен до тех пор, пока не исчезнет из этого + * списка. + */ + FORGE, + /** * Чанку запрещено выгружаться или изменять состояние бинда. Чанк не будет * выгружен никогда. */ @@ -33,11 +39,11 @@ public boolean canChangeState() { - return this != ETERNAL; + return this != ETERNAL && this != FORGE; } - + public boolean isLeak() { - return this == LEAK; + return this == LEAK || this == FORGE; } } diff --git a/src/main/java/org/ultramine/server/chunk/ChunkGC.java b/src/main/java/org/ultramine/server/chunk/ChunkGC.java index 4371e25..4ff232f 100644 --- a/src/main/java/org/ultramine/server/chunk/ChunkGC.java +++ b/src/main/java/org/ultramine/server/chunk/ChunkGC.java @@ -5,9 +5,11 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Set; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.WorldServer; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.gen.ChunkProviderServer; @@ -48,18 +50,29 @@ if(chunkCount > chunkLimit && timePassed > MIN_GC_INTERVAL && unloadQueueSize < MAX_UNLOAD_QUEUE_SIZE && (minChunkDiff == 0 || chunkDiff > minChunkDiff)) { + Set persistentChunks = world.getPersistentChunks().keySet(); Collection all = provider.loadedChunkHashMap.valueCollection(); List unbound = new ArrayList(all.size() - boundChunks); for(Chunk chunk : all) { - if(chunk.getBindState().canUnload()) + ChunkBindState state = chunk.getBindState(); + if(state.canUnload()) { unbound.add(chunk); } - else if(chunk.getBindState().isLeak() && curTime - chunk.getUnbindTime() > _10_MINUTES) + else if(state.isLeak() && curTime - chunk.getUnbindTime() > _10_MINUTES) { - chunk.unbind(); - unbound.add(chunk); + if(persistentChunks.contains(chunk.getChunkCoordIntPair())) + { + if(state != ChunkBindState.FORGE) + chunk.setBindState(ChunkBindState.FORGE); + chunk.updateUnbindTime(); + } + else + { + chunk.unbind(); + unbound.add(chunk); + } } }