diff --git a/src/main/java/net/minecraft/world/gen/ChunkProviderServer.java b/src/main/java/net/minecraft/world/gen/ChunkProviderServer.java index c11eeb7..9beac4d 100644 --- a/src/main/java/net/minecraft/world/gen/ChunkProviderServer.java +++ b/src/main/java/net/minecraft/world/gen/ChunkProviderServer.java @@ -464,6 +464,12 @@ @SideOnly(Side.SERVER) private ChunkGC chunkGC; + @SideOnly(Side.SERVER) + public ChunkGC getChunkGC() + { + return chunkGC; + } + public void loadAsync(int x, int z, IChunkLoadCallback callback) { Chunk chunk = loadedChunkHashMap.get(x, z); diff --git a/src/main/java/org/ultramine/commands/basic/TechCommands.java b/src/main/java/org/ultramine/commands/basic/TechCommands.java index 4c50e99..1c0cfc4 100644 --- a/src/main/java/org/ultramine/commands/basic/TechCommands.java +++ b/src/main/java/org/ultramine/commands/basic/TechCommands.java @@ -401,6 +401,20 @@ ctx.sendMessage("command.javagc.success"); } + @Command( + name = "chunkgc", + group = "technical", + permissions = {"command.chunkgc"}, + syntax = {""} + ) + @SideOnly(Side.SERVER) + public static void chunkgc(CommandContext ctx) + { + for(WorldServer world : ctx.getServer().getMultiWorld().getLoadedWorlds()) + world.theChunkProviderServer.getChunkGC().forceCollect(); + ctx.sendMessage("command.chunkgc.success"); + } + private static WorldGenerator worldgen; @Command( diff --git a/src/main/java/org/ultramine/server/chunk/ChunkGC.java b/src/main/java/org/ultramine/server/chunk/ChunkGC.java index 383086f..e93e911 100644 --- a/src/main/java/org/ultramine/server/chunk/ChunkGC.java +++ b/src/main/java/org/ultramine/server/chunk/ChunkGC.java @@ -50,33 +50,7 @@ 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.isDependent()) - continue; - ChunkBindState state = chunk.getBindState(); - if(state.canUnload()) - { - unbound.add(chunk); - } - else if(state.isLeak() && curTime - chunk.getUnbindTime() > _10_MINUTES) - { - if(persistentChunks.contains(chunk.getChunkCoordIntPair())) - { - if(state != ChunkBindState.FORGE) - chunk.setBindState(ChunkBindState.FORGE); - chunk.updateUnbindTime(); - } - else - { - chunk.unbind(); - unbound.add(chunk); - } - } - } + List unbound = findChunksForUnload(); int unboundLimit = confCacheSize + MAX_CHUNKS_PER_OP + unloadQueueSize; @@ -106,6 +80,51 @@ } } + public void forceCollect() + { + for(Chunk chunk : findChunksForUnload()) + provider.chunksToUnload.add(ChunkHash.chunkToKey(chunk.xPosition, chunk.zPosition)); + lastGCTime = world.func_73046_m().getTickCounter(); + lastChunkCount = provider.loadedChunkHashMap.size() - provider.chunksToUnload.size(); + } + + private List findChunksForUnload() + { + int chunksPerPlayer = (int)Math.pow(world.getViewDistance()*2 + 1, 2); + int boundChunks = world.playerEntities.size()*chunksPerPlayer + world.getPersistentChunks().size(); + int curTime = world.func_73046_m().getTickCounter(); + + Set persistentChunks = world.getPersistentChunks().keySet(); + Collection all = provider.loadedChunkHashMap.valueCollection(); + List unbound = new ArrayList(all.size() - boundChunks); + for(Chunk chunk : all) + { + if(chunk.isDependent()) + continue; + ChunkBindState state = chunk.getBindState(); + if(state.canUnload()) + { + unbound.add(chunk); + } + else if(state.isLeak() && curTime - chunk.getUnbindTime() > _10_MINUTES) + { + if(persistentChunks.contains(chunk.getChunkCoordIntPair())) + { + if(state != ChunkBindState.FORGE) + chunk.setBindState(ChunkBindState.FORGE); + chunk.updateUnbindTime(); + } + else + { + chunk.unbind(); + unbound.add(chunk); + } + } + } + + return unbound; + } + private static class ChunkComparator implements Comparator { private int curTime; diff --git a/src/main/resources/assets/ultramine/lang/en_US.lang b/src/main/resources/assets/ultramine/lang/en_US.lang index 228e77d..e20b44f 100644 --- a/src/main/resources/assets/ultramine/lang/en_US.lang +++ b/src/main/resources/assets/ultramine/lang/en_US.lang @@ -199,6 +199,10 @@ command.javagc.description=Perform system garbage collector command.javagc.success=System GC performed +command.chunkgc.usage=/chunkgc +command.chunkgc.description=Unloads all unused chunks +command.chunkgc.success=Chunk GC performed + command.custmsg.usage=/custmsg command.custmsg.description=Sends custom formatted message to player (support colors, use &) diff --git a/src/main/resources/assets/ultramine/lang/ru_RU.lang b/src/main/resources/assets/ultramine/lang/ru_RU.lang index 7b13568..88c3310 100644 --- a/src/main/resources/assets/ultramine/lang/ru_RU.lang +++ b/src/main/resources/assets/ultramine/lang/ru_RU.lang @@ -199,6 +199,10 @@ command.javagc.description=Инициировать сборку мусора command.javagc.success=Сборка мусора инициирована +command.chunkgc.usage=/chunkgc +command.chunkgc.description=Выгружает все неиспользуемые чанки +command.chunkgc.success=Выгрзка чанков инициирована + command.custmsg.usage=/custmsg <игрок/ALL> <сообщение> command.custmsg.description=Отправляет кастомное сообщение игроку (поддерживает цвета)