You can now specify how many letters of the command must be typed before it will be tab completed this will help deter people from just spamming round all the commands to see if there is one incorrectly set up. 0 will tab complete all commands -1 will disable tab complete 1 will mean you have to type the first letter 2 will mean you have to the second letter... etc...
166 lines
6.5 KiB
Diff
166 lines
6.5 KiB
Diff
From 0e4528f834a8111276d33b09e27854def1214491 Mon Sep 17 00:00:00 2001
|
|
From: md_5 <git@md-5.net>
|
|
Date: Sat, 25 Jan 2014 14:08:35 +1100
|
|
Subject: [PATCH] Highly Optimized Tick Loop
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
index 1b7f65e..8ce9dd7 100644
|
|
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
@@ -102,6 +102,12 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IMo
|
|
public java.util.Queue<Runnable> processQueue = new java.util.concurrent.ConcurrentLinkedQueue<Runnable>();
|
|
public int autosavePeriod;
|
|
// CraftBukkit end
|
|
+ // Spigot start
|
|
+ private static final int TPS = 20;
|
|
+ private static final int TICK_TIME = 1000000000 / TPS;
|
|
+ private static final int SAMPLE_INTERVAL = 100;
|
|
+ public final double[] recentTps = new double[ 3 ];
|
|
+ // Spigot end
|
|
|
|
public MinecraftServer(OptionSet options, Proxy proxy) { // CraftBukkit - signature file -> OptionSet
|
|
i = this;
|
|
@@ -422,6 +428,13 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IMo
|
|
this.isRunning = false;
|
|
}
|
|
|
|
+ // Spigot Start
|
|
+ private static double calcTps(double avg, double exp, double tps)
|
|
+ {
|
|
+ return ( avg * exp ) + ( tps * ( 1 - exp ) );
|
|
+ }
|
|
+ // Spigot End
|
|
+
|
|
public void run() {
|
|
try {
|
|
if (this.init()) {
|
|
@@ -432,38 +445,34 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IMo
|
|
this.p.setServerInfo(new ServerPingServerData("1.7.5", 4));
|
|
this.a(this.p);
|
|
|
|
+ // Spigot start
|
|
+ Arrays.fill( recentTps, 20 );
|
|
+ long lastTick = System.nanoTime(), catchupTime = 0, curTime, wait, tickSection = lastTick;
|
|
while (this.isRunning) {
|
|
- long k = aq();
|
|
- long l = k - i;
|
|
-
|
|
- if (l > 2000L && i - this.O >= 15000L) {
|
|
- if (this.server.getWarnOnOverload()) // CraftBukkit - Added option to suppress warning messages
|
|
- h.warn("Can\'t keep up! Did the system time change, or is the server overloaded? Running {}ms behind, skipping {} tick(s)", new Object[] { Long.valueOf(l), Long.valueOf(l / 50L)});
|
|
- l = 2000L;
|
|
- this.O = i;
|
|
- }
|
|
-
|
|
- if (l < 0L) {
|
|
- h.warn("Time ran backwards! Did the system time change?");
|
|
- l = 0L;
|
|
+ curTime = System.nanoTime();
|
|
+ wait = TICK_TIME - (curTime - lastTick) - catchupTime;
|
|
+ if (wait > 0) {
|
|
+ Thread.sleep(wait / 1000000);
|
|
+ catchupTime = 0;
|
|
+ continue;
|
|
+ } else {
|
|
+ catchupTime = Math.min(1000000000, Math.abs(wait));
|
|
}
|
|
|
|
- j += l;
|
|
- i = k;
|
|
- if (this.worlds.get(0).everyoneDeeplySleeping()) { // CraftBukkit
|
|
- this.u();
|
|
- j = 0L;
|
|
- } else {
|
|
- while (j > 50L) {
|
|
- MinecraftServer.currentTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit
|
|
- j -= 50L;
|
|
- this.u();
|
|
- }
|
|
+ if ( MinecraftServer.currentTick++ % SAMPLE_INTERVAL == 0 )
|
|
+ {
|
|
+ double currentTps = 1E9 / ( curTime - tickSection ) * SAMPLE_INTERVAL;
|
|
+ recentTps[0] = calcTps( recentTps[0], 0.92, currentTps ); // 1/exp(5sec/1min)
|
|
+ recentTps[1] = calcTps( recentTps[1], 0.9835, currentTps ); // 1/exp(5sec/5min)
|
|
+ recentTps[2] = calcTps( recentTps[2], 0.9945, currentTps ); // 1/exp(5sec/15min)
|
|
+ tickSection = curTime;
|
|
}
|
|
+ lastTick = curTime;
|
|
|
|
- Thread.sleep(Math.max(1L, 50L - j));
|
|
+ this.u();
|
|
this.N = true;
|
|
}
|
|
+ // Spigot end
|
|
} else {
|
|
this.a((CrashReport) null);
|
|
}
|
|
diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java
|
|
index 54d9117..2baed09 100644
|
|
--- a/src/main/java/org/spigotmc/SpigotConfig.java
|
|
+++ b/src/main/java/org/spigotmc/SpigotConfig.java
|
|
@@ -244,4 +244,9 @@ public class SpigotConfig
|
|
"screen." );
|
|
}
|
|
}
|
|
+
|
|
+ private static void tpsCommand()
|
|
+ {
|
|
+ commands.put( "tps", new TicksPerSecondCommand( "tps" ) );
|
|
+ }
|
|
}
|
|
diff --git a/src/main/java/org/spigotmc/TicksPerSecondCommand.java b/src/main/java/org/spigotmc/TicksPerSecondCommand.java
|
|
new file mode 100644
|
|
index 0000000..2b8343d
|
|
--- /dev/null
|
|
+++ b/src/main/java/org/spigotmc/TicksPerSecondCommand.java
|
|
@@ -0,0 +1,45 @@
|
|
+package org.spigotmc;
|
|
+
|
|
+import com.google.common.base.Joiner;
|
|
+import net.minecraft.server.MinecraftServer;
|
|
+import net.minecraft.util.com.google.common.collect.Iterables;
|
|
+import org.bukkit.ChatColor;
|
|
+import org.bukkit.command.Command;
|
|
+import org.bukkit.command.CommandSender;
|
|
+
|
|
+public class TicksPerSecondCommand extends Command
|
|
+{
|
|
+
|
|
+ public TicksPerSecondCommand(String name)
|
|
+ {
|
|
+ super( name );
|
|
+ this.description = "Gets the current ticks per second for the server";
|
|
+ this.usageMessage = "/tps";
|
|
+ this.setPermission( "bukkit.command.tps" );
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean execute(CommandSender sender, String currentAlias, String[] args)
|
|
+ {
|
|
+ if ( !testPermission( sender ) )
|
|
+ {
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ StringBuilder sb = new StringBuilder( ChatColor.GOLD + "TPS from last 1m, 5m, 15m: " );
|
|
+ for ( double tps : MinecraftServer.getServer().recentTps )
|
|
+ {
|
|
+ sb.append( format( tps ) );
|
|
+ sb.append( ", " );
|
|
+ }
|
|
+ sender.sendMessage( sb.substring( 0, sb.length() - 2 ) );
|
|
+
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ private String format(double tps)
|
|
+ {
|
|
+ return ( ( tps > 18.0 ) ? ChatColor.GREEN : ( tps > 16.0 ) ? ChatColor.YELLOW : ChatColor.RED ).toString()
|
|
+ + ( ( tps > 20.0 ) ? "*" : "" ) + Math.min( Math.round( tps * 100.0 ) / 100.0, 20.0 );
|
|
+ }
|
|
+}
|
|
--
|
|
1.8.3.2
|
|
|