From 98f4f02f5510b1ee6601637a72bb5e5f626811b4 Mon Sep 17 00:00:00 2001 From: Prototik Date: Wed, 14 Oct 2015 20:31:35 +0700 Subject: [PATCH] Introduced World Save Thread and some refractoring --- .../server/MinecraftServer.java.patch | 118 ++++---- src/main/java/kcauldron/KCauldron.java | 2 + src/main/java/kcauldron/KCauldronCommand.java | 282 +++++++++--------- .../kcauldron/KCauldronWorldSaveThread.java | 57 ++++ .../kcauldron/updater/KCauldronUpdater.java | 3 +- .../kcauldron/updater/KVersionRetriever.java | 3 +- .../network/ThreadPlayerLookupUUID.java | 2 +- .../cauldron/command/CauldronCommand.java | 2 +- .../cauldron/configuration/StringSetting.java | 32 +- .../org/bukkit/craftbukkit/CraftServer.java | 4 +- .../org/bukkit/craftbukkit/CraftWorld.java | 34 +-- .../bukkit/craftbukkit/block/CraftSkull.java | 2 +- .../craftbukkit/entity/CraftEntity.java | 2 +- .../craftbukkit/entity/CraftHumanEntity.java | 4 +- .../craftbukkit/entity/CraftPlayer.java | 4 +- .../craftbukkit/util/CraftChatMessage.java | 6 +- .../bukkit/craftbukkit/util/LongHashSet.java | 98 +++--- .../craftbukkit/util/LongObjectHashMap.java | 58 ++-- .../java/org/spigotmc/RestartCommand.java | 10 +- src/main/java/org/spigotmc/SpigotConfig.java | 2 +- .../java/org/spigotmc/SpigotWorldConfig.java | 6 +- src/main/java/org/spigotmc/TickLimiter.java | 42 +-- 22 files changed, 424 insertions(+), 349 deletions(-) create mode 100644 src/main/java/kcauldron/KCauldronWorldSaveThread.java diff --git a/patches/net/minecraft/server/MinecraftServer.java.patch b/patches/net/minecraft/server/MinecraftServer.java.patch index 7bd29f2..f0a245d 100644 --- a/patches/net/minecraft/server/MinecraftServer.java.patch +++ b/patches/net/minecraft/server/MinecraftServer.java.patch @@ -35,7 +35,7 @@ import org.apache.commons.lang3.Validate; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -@@ -80,18 +86,54 @@ +@@ -80,28 +86,64 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.world.WorldEvent; @@ -93,7 +93,19 @@ private final ServerStatusResponse field_147147_p = new ServerStatusResponse(); private final Random field_147146_q = new Random(); @SideOnly(Side.SERVER) -@@ -135,8 +177,40 @@ + private String hostname; + private int serverPort = -1; + public WorldServer[] worldServers = new WorldServer[0]; +- private ServerConfigurationManager serverConfigManager; ++ public ServerConfigurationManager serverConfigManager; + private boolean serverRunning = true; + private boolean serverStopped; +- private int tickCounter; ++ public int tickCounter; + protected final Proxy serverProxy; + public String currentTask; + public int percentDone; +@@ -135,8 +177,41 @@ private long field_147142_T = 0L; private final GameProfileRepository field_152365_W; private final PlayerProfileCache field_152366_X; @@ -115,6 +127,7 @@ + public final double[] recentTps = new double[ 3 ]; + // Spigot end + // Cauldron start ++ public kcauldron.KCauldronWorldSaveThread saveThread; + public static CauldronConfig cauldronConfig; + public static KCauldronConfig kcauldronConfig; + public static TileEntityConfig tileEntityConfig; @@ -134,7 +147,7 @@ public MinecraftServer(File p_i45281_1_, Proxy p_i45281_2_) { this.field_152366_X = new PlayerProfileCache(this, field_152367_a); -@@ -149,10 +223,70 @@ +@@ -149,10 +224,70 @@ this.field_152364_T = new YggdrasilAuthenticationService(p_i45281_2_, UUID.randomUUID().toString()); this.field_147143_S = this.field_152364_T.createMinecraftSessionService(); this.field_152365_W = this.field_152364_T.createProfileRepository(); @@ -206,7 +219,7 @@ protected void convertMapIfNeeded(String p_71237_1_) { if (this.getActiveAnvilConverter().isOldMapFormat(p_71237_1_)) -@@ -172,6 +306,7 @@ +@@ -172,6 +307,7 @@ MinecraftServer.logger.info("Converting... " + p_73718_1_ + "%"); } } @@ -214,7 +227,7 @@ @SideOnly(Side.CLIENT) public void resetProgressAndMessage(String p_73721_1_) {} @SideOnly(Side.CLIENT) -@@ -195,10 +330,17 @@ +@@ -195,10 +331,17 @@ protected void loadAllWorlds(String p_71247_1_, String p_71247_2_, long p_71247_3_, WorldType p_71247_5_, String p_71247_6_) { @@ -234,7 +247,7 @@ WorldSettings worldsettings; if (worldinfo == null) -@@ -215,11 +357,79 @@ +@@ -215,11 +358,79 @@ { worldsettings.enableBonusChest(); } @@ -317,7 +330,7 @@ world.addWorldAccess(new WorldManager(this, world)); if (!this.isSinglePlayer()) -@@ -227,12 +437,14 @@ +@@ -227,12 +438,14 @@ world.getWorldInfo().setGameType(this.getGameType()); } @@ -335,7 +348,7 @@ } protected void initialWorldChunkLoad() -@@ -244,9 +456,12 @@ +@@ -244,9 +457,12 @@ int i = 0; this.setUserMessage("menu.generatingTerrain"); byte b0 = 0; @@ -348,7 +361,7 @@ long j = getSystemTimeMillis(); for (int k = -192; k <= 192 && this.isServerRunning(); k += 16) -@@ -265,7 +480,8 @@ +@@ -265,7 +481,8 @@ worldserver.theChunkProviderServer.loadChunk(chunkcoordinates.posX + k >> 4, chunkcoordinates.posZ + l >> 4); } } @@ -358,7 +371,7 @@ this.clearCurrentTask(); } -@@ -292,19 +508,17 @@ +@@ -292,19 +509,17 @@ { this.currentTask = null; this.percentDone = 0; @@ -366,7 +379,7 @@ } - protected void saveAllWorlds(boolean p_71267_1_) -+ protected void saveAllWorlds(boolean p_71267_1_) throws MinecraftException // CraftBukkit - added throws ++ public void saveAllWorlds(boolean p_71267_1_) throws MinecraftException // CraftBukkit - added throws { if (!this.worldIsBeingDeleted) { @@ -383,7 +396,7 @@ if (worldserver != null) { -@@ -313,25 +527,41 @@ +@@ -313,25 +528,42 @@ logger.info("Saving chunks for level \'" + worldserver.getWorldInfo().getWorldName() + "\'/" + worldserver.provider.getDimensionName()); } @@ -415,6 +428,7 @@ - public void stopServer() + public void stopServer() throws MinecraftException // CraftBukkit - added throws { ++ if (saveThread != null) saveThread.stopServer(); if (!this.worldIsBeingDeleted && Loader.instance().hasReachedState(LoaderState.SERVER_STARTED) && !serverStopped) // make sure the save is valid and we don't save twice { logger.info("Stopping server"); @@ -430,7 +444,7 @@ if (this.func_147137_ag() != null) { this.func_147137_ag().terminateEndpoints(); -@@ -347,7 +577,14 @@ +@@ -347,7 +579,14 @@ if (this.worldServers != null) { logger.info("Saving worlds"); @@ -446,7 +460,7 @@ for (int i = 0; i < this.worldServers.length; ++i) { -@@ -380,6 +617,13 @@ +@@ -380,6 +619,13 @@ this.serverRunning = false; } @@ -460,7 +474,7 @@ public void run() { try -@@ -392,45 +636,41 @@ +@@ -392,45 +638,41 @@ this.field_147147_p.func_151315_a(new ChatComponentText(this.motd)); this.field_147147_p.func_151321_a(new ServerStatusResponse.MinecraftProtocolVersionIdentifier("1.7.10", 5)); this.func_147138_a(this.field_147147_p); @@ -527,7 +541,7 @@ FMLCommonHandler.instance().handleServerStopping(); FMLCommonHandler.instance().expectServerStopped(); // has to come before finalTick to avoid race conditions } -@@ -448,6 +688,14 @@ +@@ -448,6 +690,14 @@ catch (Throwable throwable1) { logger.error("Encountered an unexpected exception", throwable1); @@ -542,7 +556,7 @@ CrashReport crashreport = null; if (throwable1 instanceof ReportedException) -@@ -477,6 +725,7 @@ +@@ -477,6 +727,7 @@ { try { @@ -550,7 +564,7 @@ this.stopServer(); this.serverStopped = true; } -@@ -486,6 +735,16 @@ +@@ -486,6 +737,16 @@ } finally { @@ -567,7 +581,7 @@ FMLCommonHandler.instance().handleServerStopped(); this.serverStopped = true; this.systemExitNow(); -@@ -532,8 +791,11 @@ +@@ -532,8 +793,11 @@ public void tick() { @@ -579,31 +593,20 @@ ++this.tickCounter; if (this.startProfiling) -@@ -562,12 +824,21 @@ +@@ -562,38 +826,62 @@ this.field_147147_p.func_151318_b().func_151330_a(agameprofile); } - if (this.tickCounter % 900 == 0) -+ if ((this.autosavePeriod > 0) && ((this.tickCounter % this.autosavePeriod) == 0)) // CraftBukkit - { -+ SpigotTimings.worldSaveTimer.startTiming(); // Spigot - this.theProfiler.startSection("save"); - this.serverConfigManager.saveAllPlayerData(); +- { +- this.theProfiler.startSection("save"); +- this.serverConfigManager.saveAllPlayerData(); - this.saveAllWorlds(true); -+ try -+ { -+ this.saveAllWorlds(true); -+ } -+ catch (MinecraftException e) -+ { -+ e.printStackTrace(); -+ } - this.theProfiler.endSection(); -+ SpigotTimings.worldSaveTimer.stopTiming(); // Spigot - } - +- this.theProfiler.endSection(); +- } +- this.theProfiler.startSection("tallying"); -@@ -575,25 +846,57 @@ + this.tickTimeArray[this.tickCounter % 100] = System.nanoTime() - i; this.theProfiler.endSection(); this.theProfiler.startSection("snooper"); @@ -663,7 +666,7 @@ int i; Integer[] ids = DimensionManager.getIDs(this.tickCounter % 200 == 0); -@@ -602,19 +905,22 @@ +@@ -602,19 +890,22 @@ int id = ids[x]; long j = System.nanoTime(); @@ -689,7 +692,7 @@ this.theProfiler.startSection("tick"); FMLCommonHandler.instance().onPreWorldTick(worldserver); -@@ -622,22 +928,46 @@ +@@ -622,22 +913,46 @@ try { @@ -738,7 +741,7 @@ worldserver.addWorldInfoToCrashReport(crashreport); throw new ReportedException(crashreport); } -@@ -645,10 +975,13 @@ +@@ -645,10 +960,13 @@ FMLCommonHandler.instance().onPostWorldTick(worldserver); this.theProfiler.endSection(); this.theProfiler.startSection("tracker"); @@ -753,7 +756,7 @@ worldTickTimes.get(id)[this.tickCounter % 100] = System.nanoTime() - j; } -@@ -656,15 +989,21 @@ +@@ -656,15 +974,21 @@ this.theProfiler.endStartSection("dim_unloading"); DimensionManager.unloadWorlds(worldTickTimes); this.theProfiler.endStartSection("connection"); @@ -775,7 +778,7 @@ this.theProfiler.endSection(); } -@@ -699,6 +1038,13 @@ +@@ -699,6 +1023,13 @@ public WorldServer worldServerForDimension(int p_71218_1_) { @@ -789,7 +792,7 @@ WorldServer ret = DimensionManager.getWorld(p_71218_1_); if (ret == null) { -@@ -784,13 +1130,14 @@ +@@ -784,13 +1115,14 @@ public List getPossibleCompletions(ICommandSender p_71248_1_, String p_71248_2_) { @@ -808,7 +811,7 @@ if (list != null) { -@@ -798,40 +1145,25 @@ +@@ -798,40 +1130,25 @@ while (iterator.hasNext()) { @@ -857,7 +860,7 @@ } public static MinecraftServer getServer() -@@ -1034,7 +1366,7 @@ +@@ -1034,7 +1351,7 @@ public boolean isServerInOnlineMode() { @@ -866,7 +869,7 @@ } public void setOnlineMode(boolean p_71229_1_) -@@ -1124,7 +1456,7 @@ +@@ -1124,7 +1441,7 @@ public NetworkSystem func_147137_ag() { @@ -875,7 +878,7 @@ } @SideOnly(Side.CLIENT) -@@ -1259,8 +1591,11 @@ +@@ -1259,8 +1576,11 @@ { Bootstrap.func_151354_b(); @@ -887,7 +890,7 @@ boolean flag = true; String s = null; String s1 = "."; -@@ -1356,16 +1691,34 @@ +@@ -1356,16 +1676,34 @@ { dedicatedserver.setGuiEnabled(); } @@ -928,7 +931,7 @@ } catch (Exception exception) { -@@ -1400,15 +1753,70 @@ +@@ -1400,15 +1738,70 @@ @SideOnly(Side.SERVER) public String getPlugins() { @@ -1004,7 +1007,7 @@ } @SideOnly(Side.SERVER) -@@ -1455,9 +1863,213 @@ +@@ -1455,9 +1848,226 @@ return this.serverStopped; } @@ -1217,4 +1220,17 @@ + return logger; + } + // CraftBukkit end ++ ++ public void invalidateWorldSaver() { ++ if (saveThread != null) { ++ saveThread.interrupt(); ++ saveThread = null; ++ } ++ if (autosavePeriod > 0) { ++ saveThread = new kcauldron.KCauldronWorldSaveThread(this); ++ saveThread.start(); ++ } else { ++ kcauldron.KLog.get().info("No valid autosave period is setted, assumed plugin-induved world saving!"); ++ } ++ } } diff --git a/src/main/java/kcauldron/KCauldron.java b/src/main/java/kcauldron/KCauldron.java index c6bf1bb..bdf9e05 100644 --- a/src/main/java/kcauldron/KCauldron.java +++ b/src/main/java/kcauldron/KCauldron.java @@ -13,6 +13,8 @@ import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.FMLLog; public class KCauldron { + public static final ThreadGroup sKCauldronThreadGroup = new ThreadGroup("KCauldron"); + private static boolean sManifestParsed = false; private static void parseManifest() { diff --git a/src/main/java/kcauldron/KCauldronCommand.java b/src/main/java/kcauldron/KCauldronCommand.java index f4342a1..e2d3359 100644 --- a/src/main/java/kcauldron/KCauldronCommand.java +++ b/src/main/java/kcauldron/KCauldronCommand.java @@ -26,155 +26,155 @@ import net.minecraft.world.chunk.Chunk; import net.minecraftforge.common.DimensionManager; public class KCauldronCommand extends Command { - public static final String NAME = "kc"; - public static final String CHECK = NAME + ".check"; - public static final String UPDATE = NAME + ".update"; - public static final String TPS = NAME + ".tps"; - public static final String RESTART = NAME + ".restart"; - public static final String DUMP = NAME + ".dump"; + public static final String NAME = "kc"; + public static final String CHECK = NAME + ".check"; + public static final String UPDATE = NAME + ".update"; + public static final String TPS = NAME + ".tps"; + public static final String RESTART = NAME + ".restart"; + public static final String DUMP = NAME + ".dump"; - public KCauldronCommand() { - super(NAME); + public KCauldronCommand() { + super(NAME); - StringBuilder builder = new StringBuilder(); - builder.append(String.format("/%s check - Check to update\n", NAME)); - builder.append(String.format("/%s update [version] - Update to specified or latest version\n", NAME)); - builder.append(String.format("/%s tps - Show tps statistics\n", NAME)); - builder.append(String.format("/%s restart - Restart server\n", NAME)); - builder.append(String.format("/%s dump - Dump statistics into kcauldron.dump file\n", NAME)); - setUsage(builder.toString()); + StringBuilder builder = new StringBuilder(); + builder.append(String.format("/%s check - Check to update\n", NAME)); + builder.append(String.format("/%s update [version] - Update to specified or latest version\n", NAME)); + builder.append(String.format("/%s tps - Show tps statistics\n", NAME)); + builder.append(String.format("/%s restart - Restart server\n", NAME)); + builder.append(String.format("/%s dump - Dump statistics into kcauldron.dump file\n", NAME)); + setUsage(builder.toString()); - setPermission("kc"); - } + setPermission("kc"); + } - public boolean testPermission(CommandSender target, String permission) { - if (testPermissionSilent(target, permission)) { - return true; - } - target.sendMessage(ChatColor.RED - + "I'm sorry, but you do not have permission to perform this command. Please contact the server administrators if you believe that this is in error."); - return false; - } + public boolean testPermission(CommandSender target, String permission) { + if (testPermissionSilent(target, permission)) { + return true; + } + target.sendMessage(ChatColor.RED + + "I'm sorry, but you do not have permission to perform this command. Please contact the server administrators if you believe that this is in error."); + return false; + } - public boolean testPermissionSilent(CommandSender target, String permission) { - if (!super.testPermissionSilent(target)) { - return false; - } - for (String p : permission.split(";")) - if (target.hasPermission(p)) - return true; - return false; - } + public boolean testPermissionSilent(CommandSender target, String permission) { + if (!super.testPermissionSilent(target)) { + return false; + } + for (String p : permission.split(";")) + if (target.hasPermission(p)) + return true; + return false; + } - @Override - public boolean execute(CommandSender sender, String commandLabel, String[] args) { - if (!testPermission(sender)) - return true; - if (args.length == 0) { - sender.sendMessage(ChatColor.YELLOW + "Please specify action"); - sender.sendMessage(ChatColor.AQUA + usageMessage); - return true; - } - String action = args[0]; - if ("check".equals(action)) { - if (!testPermission(sender, CHECK)) - return true; - sender.sendMessage(ChatColor.GREEN + "Initiated version check..."); - KVersionRetriever.startServer(new CommandSenderUpdateCallback(sender), false); - } else if ("update".equals(action)) { - KCauldronUpdater.initUpdate(sender, args.length > 1 ? args[1] : null); - } else if ("tps".equals(action)) { - if (!testPermission(sender, TPS)) - return true; - World currentWorld = null; - if (sender instanceof CraftPlayer) { - currentWorld = ((CraftPlayer) sender).getWorld(); - } - sender.sendMessage(ChatColor.DARK_BLUE + "---------------------------------------"); - final MinecraftServer server = MinecraftServer.getServer(); - for (World world : server.server.getWorlds()) { - if (world instanceof CraftWorld) { - boolean current = currentWorld != null && currentWorld == world; - net.minecraft.world.World mcWorld = ((CraftWorld) world).getHandle(); - String bukkitName = world.getName(); - int dimensionId = mcWorld.provider.dimensionId; - String name = mcWorld.provider.getDimensionName(); - String displayName = name.equals(bukkitName) ? name : String.format("%s | %s", name, bukkitName); + @Override + public boolean execute(CommandSender sender, String commandLabel, String[] args) { + if (!testPermission(sender)) + return true; + if (args.length == 0) { + sender.sendMessage(ChatColor.YELLOW + "Please specify action"); + sender.sendMessage(ChatColor.AQUA + usageMessage); + return true; + } + String action = args[0]; + if ("check".equals(action)) { + if (!testPermission(sender, CHECK)) + return true; + sender.sendMessage(ChatColor.GREEN + "Initiated version check..."); + KVersionRetriever.startServer(new CommandSenderUpdateCallback(sender), false); + } else if ("update".equals(action)) { + KCauldronUpdater.initUpdate(sender, args.length > 1 ? args[1] : null); + } else if ("tps".equals(action)) { + if (!testPermission(sender, TPS)) + return true; + World currentWorld = null; + if (sender instanceof CraftPlayer) { + currentWorld = ((CraftPlayer) sender).getWorld(); + } + sender.sendMessage(ChatColor.DARK_BLUE + "---------------------------------------"); + final MinecraftServer server = MinecraftServer.getServer(); + for (World world : server.server.getWorlds()) { + if (world instanceof CraftWorld) { + boolean current = currentWorld != null && currentWorld == world; + net.minecraft.world.World mcWorld = ((CraftWorld) world).getHandle(); + String bukkitName = world.getName(); + int dimensionId = mcWorld.provider.dimensionId; + String name = mcWorld.provider.getDimensionName(); + String displayName = name.equals(bukkitName) ? name : String.format("%s | %s", name, bukkitName); - double worldTickTime = mean(server.worldTickTimes.get(dimensionId)) * 1.0E-6D; - double worldTPS = Math.min(1000.0 / worldTickTime, 20); + double worldTickTime = mean(server.worldTickTimes.get(dimensionId)) * 1.0E-6D; + double worldTPS = Math.min(1000.0 / worldTickTime, 20); - sender.sendMessage(String.format("%s[%d] %s%s %s- %s%.2fms / %.2ftps", ChatColor.GOLD, dimensionId, - current ? ChatColor.GREEN : ChatColor.YELLOW, displayName, ChatColor.RESET, - ChatColor.DARK_RED, worldTickTime, worldTPS)); - } - } - double meanTickTime = mean(server.tickTimeArray) * 1.0E-6D; - double meanTPS = Math.min(1000.0 / meanTickTime, 20); - sender.sendMessage(String.format("%sOverall - %s%s%.2fms / %.2ftps", ChatColor.BLUE, ChatColor.RESET, - ChatColor.DARK_RED, meanTickTime, meanTPS)); - } else if ("restart".equals(action)) { - if (!testPermission(sender, RESTART)) - return true; - KCauldron.restart(); - } else if ("dump".equals(action)) { - if (!testPermission(sender, DUMP)) - return true; - try { - File outputFile = new File("kcauldron.dump"); - OutputStream os = new FileOutputStream(outputFile); - Writer writer = new OutputStreamWriter(os); - for (WorldServer world : DimensionManager.getWorlds()) { - writer.write(String.format("Stats for %s [%s] with id %d\n", world, - world.provider.getDimensionName(), world.dimension)); - writer.write("Current tick: " + world.worldInfo.getWorldTotalTime() + "\n"); - writer.write("\nEntities: "); - writer.write("count - " + world.loadedEntityList_KC.size() + "\n"); - for (Entity entity : world.loadedEntityList_KC) { - writer.write(String.format(" %s at (%.4f;%.4f;%.4f)\n", entity.getClass().getName(), - entity.posX, entity.posY, entity.posZ)); - } - writer.write("\nTileEntities: "); - writer.write("count - " + world.loadedTileEntityList_KC.size() + "\n"); - for (TileEntity entity : world.loadedTileEntityList_KC) { - writer.write(String.format(" %s at (%d;%d;%d)\n", entity.getClass().getName(), entity.xCoord, - entity.yCoord, entity.zCoord)); - } - writer.write("\nLoaded chunks: "); - writer.write("count - " + world.activeChunkSet_CB.size() + "\n"); - for (long chunkKey : world.activeChunkSet_CB.keys()) { - final int x = WorldServer.keyToX(chunkKey); - final int z = WorldServer.keyToZ(chunkKey); - Chunk chunk = world.chunkProvider.provideChunk(x, z); - if (chunk == null) - continue; - writer.write(String.format("Chunk at (%d;%d)\n", x, z)); - @SuppressWarnings("unchecked") - List updates = world.getPendingBlockUpdates(chunk, false); - writer.write("Pending block updates [" + updates.size() + "]:\n"); - for (NextTickListEntry entry : updates) { - writer.write(String.format("(%d;%d;%d) at %d with priority %d\n", entry.xCoord, - entry.yCoord, entry.zCoord, entry.scheduledTime, entry.priority)); - } - } - writer.write("-------------------------\n"); - } - writer.close(); - sender.sendMessage(ChatColor.RED + "Dump saved!"); - } catch (Exception e) { - e.printStackTrace(); - } - } else { - sender.sendMessage(ChatColor.RED + "Unknown action"); - } - return true; - } + sender.sendMessage(String.format("%s[%d] %s%s %s- %s%.2fms / %.2ftps", ChatColor.GOLD, dimensionId, + current ? ChatColor.GREEN : ChatColor.YELLOW, displayName, ChatColor.RESET, + ChatColor.DARK_RED, worldTickTime, worldTPS)); + } + } + double meanTickTime = mean(server.tickTimeArray) * 1.0E-6D; + double meanTPS = Math.min(1000.0 / meanTickTime, 20); + sender.sendMessage(String.format("%sOverall - %s%s%.2fms / %.2ftps", ChatColor.BLUE, ChatColor.RESET, + ChatColor.DARK_RED, meanTickTime, meanTPS)); + } else if ("restart".equals(action)) { + if (!testPermission(sender, RESTART)) + return true; + KCauldron.restart(); + } else if ("dump".equals(action)) { + if (!testPermission(sender, DUMP)) + return true; + try { + File outputFile = new File("kcauldron.dump"); + OutputStream os = new FileOutputStream(outputFile); + Writer writer = new OutputStreamWriter(os); + for (WorldServer world : DimensionManager.getWorlds()) { + writer.write(String.format("Stats for %s [%s] with id %d\n", world, + world.provider.getDimensionName(), world.dimension)); + writer.write("Current tick: " + world.worldInfo.getWorldTotalTime() + "\n"); + writer.write("\nEntities: "); + writer.write("count - " + world.loadedEntityList_KC.size() + "\n"); + for (Entity entity : world.loadedEntityList_KC) { + writer.write(String.format(" %s at (%.4f;%.4f;%.4f)\n", entity.getClass().getName(), + entity.posX, entity.posY, entity.posZ)); + } + writer.write("\nTileEntities: "); + writer.write("count - " + world.loadedTileEntityList_KC.size() + "\n"); + for (TileEntity entity : world.loadedTileEntityList_KC) { + writer.write(String.format(" %s at (%d;%d;%d)\n", entity.getClass().getName(), entity.xCoord, + entity.yCoord, entity.zCoord)); + } + writer.write("\nLoaded chunks: "); + writer.write("count - " + world.activeChunkSet_CB.size() + "\n"); + for (long chunkKey : world.activeChunkSet_CB.keys()) { + final int x = WorldServer.keyToX(chunkKey); + final int z = WorldServer.keyToZ(chunkKey); + Chunk chunk = world.chunkProvider.provideChunk(x, z); + if (chunk == null) + continue; + writer.write(String.format("Chunk at (%d;%d)\n", x, z)); + @SuppressWarnings("unchecked") + List updates = world.getPendingBlockUpdates(chunk, false); + writer.write("Pending block updates [" + updates.size() + "]:\n"); + for (NextTickListEntry entry : updates) { + writer.write(String.format("(%d;%d;%d) at %d with priority %d\n", entry.xCoord, + entry.yCoord, entry.zCoord, entry.scheduledTime, entry.priority)); + } + } + writer.write("-------------------------\n"); + } + writer.close(); + sender.sendMessage(ChatColor.RED + "Dump saved!"); + } catch (Exception e) { + e.printStackTrace(); + } + } else { + sender.sendMessage(ChatColor.RED + "Unknown action"); + } + return true; + } - private static final long mean(long[] array) { - long r = 0; - for (long i : array) - r += i; - return r / array.length; - } + private static final long mean(long[] array) { + long r = 0; + for (long i : array) + r += i; + return r / array.length; + } } diff --git a/src/main/java/kcauldron/KCauldronWorldSaveThread.java b/src/main/java/kcauldron/KCauldronWorldSaveThread.java new file mode 100644 index 0000000..9440253 --- /dev/null +++ b/src/main/java/kcauldron/KCauldronWorldSaveThread.java @@ -0,0 +1,57 @@ +package kcauldron; + +import org.bukkit.craftbukkit.SpigotTimings; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.MinecraftException; + +public class KCauldronWorldSaveThread extends Thread { + private final MinecraftServer mServer; + private int mLastSaveTick = -1; + private int mNextSaveTick = -1; + + public KCauldronWorldSaveThread(MinecraftServer server) { + super(KCauldron.sKCauldronThreadGroup, "KCauldron World Save"); + mServer = server; + setPriority(Thread.MIN_PRIORITY); + setDaemon(true); + } + + @Override + public void run() { + KLog.get().info("Starting KCauldron World Saver thread..."); + try { + while (!isInterrupted()) { + if (mLastSaveTick < 0) { + mLastSaveTick = mServer.tickCounter; + } + mNextSaveTick = mLastSaveTick + mServer.autosavePeriod; + while (mNextSaveTick > mServer.tickCounter) { + try { + sleep((mNextSaveTick - mServer.tickCounter) * 50); + } catch (InterruptedException e) { + return; + } + } + SpigotTimings.worldSaveTimer.startTiming(); + try { + mServer.serverConfigManager.saveAllPlayerData(); + mServer.saveAllWorlds(true); + } catch (MinecraftException e) { + new RuntimeException("Error occurred during save world", e).printStackTrace(); + } + SpigotTimings.worldSaveTimer.stopTiming(); + mLastSaveTick = mServer.tickCounter; + } + } finally { + KLog.get().info("Stopping KCauldron World Saver thread..."); + } + } + + public void stopServer() { + interrupt(); + while(isAlive()) { + Thread.yield(); + } + } +} diff --git a/src/main/java/kcauldron/updater/KCauldronUpdater.java b/src/main/java/kcauldron/updater/KCauldronUpdater.java index 87eaac7..84bae69 100644 --- a/src/main/java/kcauldron/updater/KCauldronUpdater.java +++ b/src/main/java/kcauldron/updater/KCauldronUpdater.java @@ -86,8 +86,7 @@ public class KCauldronUpdater implements Runnable, IVersionCheckCallback { public KCauldronUpdater(CommandSender sender, String version) { mSender = sender; mVersion = version; - mThread = new Thread(this); - mThread.setName("KCauldron updater"); + mThread = new Thread(KCauldron.sKCauldronThreadGroup, this, "KCauldron updated"); mThread.setPriority(Thread.MIN_PRIORITY); mThread.start(); } diff --git a/src/main/java/kcauldron/updater/KVersionRetriever.java b/src/main/java/kcauldron/updater/KVersionRetriever.java index 54a2baa..d72674b 100644 --- a/src/main/java/kcauldron/updater/KVersionRetriever.java +++ b/src/main/java/kcauldron/updater/KVersionRetriever.java @@ -56,8 +56,7 @@ public class KVersionRetriever implements Runnable, UncaughtExceptionHandler { mUpToDateSupport = upToDateSupport; mGroup = group; mName = name; - mThread = new Thread(this); - mThread.setName("KCauldron version retrievier"); + mThread = new Thread(KCauldron.sKCauldronThreadGroup, this, "KCauldron version retrievier"); mThread.setPriority(Thread.MIN_PRIORITY); mThread.setDaemon(true); mThread.setUncaughtExceptionHandler(this); diff --git a/src/main/java/net/minecraft/server/network/ThreadPlayerLookupUUID.java b/src/main/java/net/minecraft/server/network/ThreadPlayerLookupUUID.java index 5f43d99..16baa9a 100644 --- a/src/main/java/net/minecraft/server/network/ThreadPlayerLookupUUID.java +++ b/src/main/java/net/minecraft/server/network/ThreadPlayerLookupUUID.java @@ -44,7 +44,7 @@ class ThreadPlayerLookupUUID extends Thread String s = (new BigInteger(CryptManager.getServerIdHash(NetHandlerLoginServer.getLoginServerId(this.field_151292_a), this.mcServer.getKeyPair().getPublic(), NetHandlerLoginServer.getSecretKey(this.field_151292_a)))).toString(16); GameProfile profile = this.mcServer.func_147130_as().hasJoinedServer(new GameProfile((UUID)null, gameprofile.getName()), s); if (profile != null) { - NetHandlerLoginServer.processPlayerLoginGameProfile(this.field_151292_a, profile); + NetHandlerLoginServer.processPlayerLoginGameProfile(this.field_151292_a, profile); fireLoginEvents(); // Spigot } else if (this.mcServer.isSinglePlayer()) diff --git a/src/main/java/net/minecraftforge/cauldron/command/CauldronCommand.java b/src/main/java/net/minecraftforge/cauldron/command/CauldronCommand.java index efc4e37..6108051 100644 --- a/src/main/java/net/minecraftforge/cauldron/command/CauldronCommand.java +++ b/src/main/java/net/minecraftforge/cauldron/command/CauldronCommand.java @@ -134,7 +134,7 @@ public class CauldronCommand extends Command sender.sendMessage("Chunk info complete"); } - private boolean getToggle(CommandSender sender, String[] args) + private boolean getToggle(CommandSender sender, String[] args) { try { diff --git a/src/main/java/net/minecraftforge/cauldron/configuration/StringSetting.java b/src/main/java/net/minecraftforge/cauldron/configuration/StringSetting.java index 6ff9d36..c394741 100644 --- a/src/main/java/net/minecraftforge/cauldron/configuration/StringSetting.java +++ b/src/main/java/net/minecraftforge/cauldron/configuration/StringSetting.java @@ -1,23 +1,23 @@ package net.minecraftforge.cauldron.configuration; public class StringSetting extends Setting { - private String value; - private ConfigBase config; + private String value; + private ConfigBase config; - public StringSetting(ConfigBase config, String path, String def, - String description) { - super(path, def, description); - this.value = def; - this.config = config; - } + public StringSetting(ConfigBase config, String path, String def, + String description) { + super(path, def, description); + this.value = def; + this.config = config; + } - @Override - public String getValue() { - return value; - } + @Override + public String getValue() { + return value; + } - @Override - public void setValue(String value) { - config.set(path, this.value = value); - } + @Override + public void setValue(String value) { + config.set(path, this.value = value); + } } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java index e4d3061..f0492d2 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -263,6 +263,7 @@ public final class CraftServer implements Server { waterAnimalSpawn = configuration.getInt("spawn-limits.water-animals"); ambientSpawn = configuration.getInt("spawn-limits.ambient"); console.autosavePeriod = configuration.getInt("ticks-per.autosave"); + console.invalidateWorldSaver(); warningState = WarningState.value(configuration.getString("settings.deprecated-verbose")); loadIcon(); chunkGCEnabled = configuration.getBoolean("chunk-gc.enabled"); // Cauldron @@ -764,6 +765,7 @@ public final class CraftServer implements Server { warningState = WarningState.value(configuration.getString("settings.deprecated-verbose")); printSaveWarning = false; console.autosavePeriod = configuration.getInt("ticks-per.autosave"); + console.invalidateWorldSaver(); chunkGCPeriod = configuration.getInt("chunk-gc.period-in-ticks"); chunkGCLoadThresh = configuration.getInt("chunk-gc.load-threshold"); loadIcon(); @@ -1307,7 +1309,7 @@ public final class CraftServer implements Server { // Spigot start GameProfile profile = null; if (MinecraftServer.getServer().isServerInOnlineMode() || org.spigotmc.SpigotConfig.bungee) { - profile = MinecraftServer.getServer().func_152358_ax().func_152655_a(name); + profile = MinecraftServer.getServer().func_152358_ax().func_152655_a(name); } if (profile == null) { // Make an OfflinePlayer using an offline mode UUID since the name has no profile diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index f5e25c8..6be5a1f 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -88,7 +88,7 @@ public class CraftWorld implements World { } public Block getBlockAt(int x, int y, int z) { - Chunk chunk = getChunkAt(x >> 4, z >> 4); + Chunk chunk = getChunkAt(x >> 4, z >> 4); return chunk == null ? null : chunk.getBlock(x & 0xF, y & 0xFF, z & 0xF); } @@ -125,7 +125,7 @@ public class CraftWorld implements World { } public Chunk getChunkAt(int x, int z) { - net.minecraft.world.chunk.Chunk chunk = this.world.theChunkProviderServer.loadChunk(x, z); + net.minecraft.world.chunk.Chunk chunk = this.world.theChunkProviderServer.loadChunk(x, z); return chunk == null ? null : chunk.bukkitChunk; } @@ -1395,23 +1395,23 @@ public class CraftWorld implements World { final net.minecraft.world.gen.ChunkProviderServer cps = world.theChunkProviderServer; cps.loadedChunkHashMap_KC.forEachValue(new TObjectProcedure() { - @Override - public boolean execute(net.minecraft.world.chunk.Chunk chunk) { - // If in use, skip it - if (isChunkInUse(chunk.xPosition, chunk.zPosition)) { - return true; - } + @Override + public boolean execute(net.minecraft.world.chunk.Chunk chunk) { + // If in use, skip it + if (isChunkInUse(chunk.xPosition, chunk.zPosition)) { + return true; + } - // Already unloading? - if (cps.chunksToUnload.contains(chunk.xPosition, chunk.zPosition)) { - return true; - } + // Already unloading? + if (cps.chunksToUnload.contains(chunk.xPosition, chunk.zPosition)) { + return true; + } - // Add unload request - cps.unloadChunksIfNotNearSpawn(chunk.xPosition, chunk.zPosition); - return true; - } - }); + // Add unload request + cps.unloadChunksIfNotNearSpawn(chunk.xPosition, chunk.zPosition); + return true; + } + }); } // Spigot start diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java b/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java index ae7e4d8..edfa12e 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java @@ -166,7 +166,7 @@ public class CraftSkull extends CraftBlockState implements Skull { } public BlockFace getRotation() { - return getBlockFace(rotation); + return getBlockFace(rotation); } public void setRotation(BlockFace rotation) { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java index 7385be6..9c87aa4 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -416,7 +416,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { // Spigot start net.minecraft.world.WorldServer newWorld = ((CraftWorld) location.getWorld()).getHandle(); if (newWorld != entity.worldObj) { - entity.teleportTo(location, cause.isPortal()); + entity.teleportTo(location, cause.isPortal()); return true; } // Spigot diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java index f790554..d128163 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java @@ -44,7 +44,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { } public PlayerInventory getInventory() { - if (inventory == null) inventory = new CraftInventoryPlayer(((net.minecraft.entity.player.EntityPlayer) entity).inventory); + if (inventory == null) inventory = new CraftInventoryPlayer(((net.minecraft.entity.player.EntityPlayer) entity).inventory); return inventory; } @@ -53,7 +53,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { } public Inventory getEnderChest() { - if (enderChest == null) enderChest = new CraftInventory(((net.minecraft.entity.player.EntityPlayer) entity).getInventoryEnderChest()); + if (enderChest == null) enderChest = new CraftInventory(((net.minecraft.entity.player.EntityPlayer) entity).getInventoryEnderChest()); return enderChest; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index 052aabe..3a1765c 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -82,8 +82,8 @@ public class CraftPlayer extends CraftHumanEntity implements Player { firstPlayed = System.currentTimeMillis(); double maxHealth = entity.getEntityAttribute(SharedMonsterAttributes.maxHealth).getBaseValue(); if (maxHealth != health) { - healthScale = maxHealth; - scaledHealth = true; + healthScale = maxHealth; + scaledHealth = true; } } diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java b/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java index be574ce..e90d539 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java @@ -80,9 +80,9 @@ public final class CraftChatMessage { currentChatComponent = null; break; case 3: - if (match.indexOf("://") < 0) { - match = "http://" + match; - } + if (match.indexOf("://") < 0) { + match = "http://" + match; + } modifier.setChatClickEvent(new net.minecraft.event.ClickEvent(net.minecraft.event.ClickEvent.Action.OPEN_URL, match)); // Should be setChatClickable appendNewComponent(matcher.end(groupId)); modifier.setChatClickEvent((net.minecraft.event.ClickEvent) null); diff --git a/src/main/java/org/bukkit/craftbukkit/util/LongHashSet.java b/src/main/java/org/bukkit/craftbukkit/util/LongHashSet.java index 4277d36..f339c05 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/LongHashSet.java +++ b/src/main/java/org/bukkit/craftbukkit/util/LongHashSet.java @@ -188,7 +188,7 @@ public class LongHashSet implements Set { } } - @Override + @Override public void clear() { elements = 0; for (int ix = 0; ix < values.length; ix++) { @@ -214,9 +214,9 @@ public class LongHashSet implements Set { return result; } - @Override + @Override public Long[] toArray() { - Long[] result = new Long[elements]; + Long[] result = new Long[elements]; long[] values = Java15Compat.Arrays_copyOf(this.values, this.values.length); int pos = 0; @@ -229,10 +229,10 @@ public class LongHashSet implements Set { return result; } - @Override - public T[] toArray(T[] arg0) { - throw new UnsupportedOperationException(); - } + @Override + public T[] toArray(T[] arg0) { + throw new UnsupportedOperationException(); + } public long popFirst() { for (long value : values) { @@ -359,52 +359,52 @@ public class LongHashSet implements Set { } } - @Override - public boolean add(Long value) { - return add(value.longValue()); - } + @Override + public boolean add(Long value) { + return add(value.longValue()); + } - @Override - public boolean addAll(Collection collection) { - boolean result = false; - for (Long value : collection) result |= add(value.longValue()); - return result; - } + @Override + public boolean addAll(Collection collection) { + boolean result = false; + for (Long value : collection) result |= add(value.longValue()); + return result; + } - @Override - public boolean contains(Object o) { - return o instanceof Long ? contains(((Long) o).longValue()) : false; - } + @Override + public boolean contains(Object o) { + return o instanceof Long ? contains(((Long) o).longValue()) : false; + } - @Override - public boolean containsAll(Collection collection) { - for (Object value : collection) if (!contains(value)) return false; - return true; - } + @Override + public boolean containsAll(Collection collection) { + for (Object value : collection) if (!contains(value)) return false; + return true; + } - @Override - public boolean remove(Object o) { - return o instanceof Long ? remove(((Long) o).longValue()) : false; - } + @Override + public boolean remove(Object o) { + return o instanceof Long ? remove(((Long) o).longValue()) : false; + } - @Override - public boolean removeAll(Collection collection) { - boolean result = false; - for (Object value : collection) result |= remove(value); - return result; - } + @Override + public boolean removeAll(Collection collection) { + boolean result = false; + for (Object value : collection) result |= remove(value); + return result; + } - @Override - public boolean retainAll(Collection collection) { - boolean result = false; - Iterator iterator = iterator(); - while(iterator.hasNext()) { - Long l = iterator.next(); - if (!collection.contains(l)) { - iterator.remove(); - result = true; - } - } - return result; - } + @Override + public boolean retainAll(Collection collection) { + boolean result = false; + Iterator iterator = iterator(); + while(iterator.hasNext()) { + Long l = iterator.next(); + if (!collection.contains(l)) { + iterator.remove(); + result = true; + } + } + return result; + } } diff --git a/src/main/java/org/bukkit/craftbukkit/util/LongObjectHashMap.java b/src/main/java/org/bukkit/craftbukkit/util/LongObjectHashMap.java index 7adfb2a..edf748e 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/LongObjectHashMap.java +++ b/src/main/java/org/bukkit/craftbukkit/util/LongObjectHashMap.java @@ -207,7 +207,7 @@ public class LongObjectHashMap implements Cloneable, Serializable { * @return Set of Entry objects */ public Set> entrySet() { - return new EntrySet(); + return new EntrySet(); } public Object clone() throws CloneNotSupportedException { @@ -425,40 +425,40 @@ public class LongObjectHashMap implements Cloneable, Serializable { } private void bind(long key, V value) { - this.key = key; - this.value = value; + this.key = key; + this.value = value; } } private class EntrySet extends AbstractSet> { - @Override - public Iterator> iterator() { - return new Iterator>() { - final Entry entry = new Entry(); - final ValueIterator valueIterator = new ValueIterator(); - - @Override - public boolean hasNext() { - return valueIterator.hasNext(); - } + @Override + public Iterator> iterator() { + return new Iterator>() { + final Entry entry = new Entry(); + final ValueIterator valueIterator = new ValueIterator(); + + @Override + public boolean hasNext() { + return valueIterator.hasNext(); + } - @Override - public LongObjectHashMap.Entry next() { - V value = valueIterator.next(); - entry.bind(valueIterator.prevKey, value); - return entry; - } + @Override + public LongObjectHashMap.Entry next() { + V value = valueIterator.next(); + entry.bind(valueIterator.prevKey, value); + return entry; + } - @Override - public void remove() { - valueIterator.remove(); - } - }; - } + @Override + public void remove() { + valueIterator.remove(); + } + }; + } - @Override - public int size() { - return LongObjectHashMap.this.size; - } + @Override + public int size() { + return LongObjectHashMap.this.size; + } } } diff --git a/src/main/java/org/spigotmc/RestartCommand.java b/src/main/java/org/spigotmc/RestartCommand.java index 9016a52..22cb310 100644 --- a/src/main/java/org/spigotmc/RestartCommand.java +++ b/src/main/java/org/spigotmc/RestartCommand.java @@ -28,7 +28,7 @@ public class RestartCommand extends Command } public static void restart() { - restart(false); + restart(false); } public static void restart(boolean forbidShutdown) @@ -102,10 +102,10 @@ public class RestartCommand extends Command Runtime.getRuntime().addShutdownHook( shutdownHook ); } else { - if (forbidShutdown) { - System.out.println("Attempt to restart server without restart script, decline request"); - return; - } + if (forbidShutdown) { + System.out.println("Attempt to restart server without restart script, decline request"); + return; + } System.out.println( "Startup script '" + SpigotConfig.restartScript + "' does not exist! Stopping server." ); } cpw.mods.fml.common.FMLCommonHandler.instance().exitJava(0, false); diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java index e0a5207..833f5e5 100644 --- a/src/main/java/org/spigotmc/SpigotConfig.java +++ b/src/main/java/org/spigotmc/SpigotConfig.java @@ -271,6 +271,6 @@ public class SpigotConfig public static int fullMatchRate; private static void fullMatchRate() { - fullMatchRate = getInt( "settings.fullMatchRate", 10); + fullMatchRate = getInt( "settings.fullMatchRate", 10); } } diff --git a/src/main/java/org/spigotmc/SpigotWorldConfig.java b/src/main/java/org/spigotmc/SpigotWorldConfig.java index a9ab410..02f4d3f 100644 --- a/src/main/java/org/spigotmc/SpigotWorldConfig.java +++ b/src/main/java/org/spigotmc/SpigotWorldConfig.java @@ -283,8 +283,8 @@ public class SpigotWorldConfig public int entityMaxTickTime; private void maxTickTimes() { - tileMaxTickTime = getInt("max-tick-time.tile", 50); - entityMaxTickTime = getInt("max-tick-time.entity", 50); - log("Tile Max Tick Time: " + tileMaxTickTime + "ms Entity max Tick Time: " + entityMaxTickTime + "ms"); + tileMaxTickTime = getInt("max-tick-time.tile", 50); + entityMaxTickTime = getInt("max-tick-time.entity", 50); + log("Tile Max Tick Time: " + tileMaxTickTime + "ms Entity max Tick Time: " + entityMaxTickTime + "ms"); } } diff --git a/src/main/java/org/spigotmc/TickLimiter.java b/src/main/java/org/spigotmc/TickLimiter.java index f8a95ab..c1d15e3 100644 --- a/src/main/java/org/spigotmc/TickLimiter.java +++ b/src/main/java/org/spigotmc/TickLimiter.java @@ -1,25 +1,25 @@ package org.spigotmc; public class TickLimiter { - private final int maxTime; - private long startTime; - private int tick; - private boolean shouldContinue; - public TickLimiter(int maxTime) { - this.maxTime = maxTime; - } - - public void initTick() { - startTime = System.currentTimeMillis(); - tick = 0; - shouldContinue = true; - } - - public boolean shouldContinue() { - if (++tick >= 300 && shouldContinue) { - tick = 0; - shouldContinue = System.currentTimeMillis() - startTime < maxTime; - } - return shouldContinue; - } + private final int maxTime; + private long startTime; + private int tick; + private boolean shouldContinue; + public TickLimiter(int maxTime) { + this.maxTime = maxTime; + } + + public void initTick() { + startTime = System.currentTimeMillis(); + tick = 0; + shouldContinue = true; + } + + public boolean shouldContinue() { + if (++tick >= 300 && shouldContinue) { + tick = 0; + shouldContinue = System.currentTimeMillis() - startTime < maxTime; + } + return shouldContinue; + } }