2020-05-06 11:48:49 +02:00
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2018-03-08 16:08:21 +01:00
From: Minecrell <minecrell@minecrell.net>
2017-06-09 19:05:12 +02:00
Date: Fri, 9 Jun 2017 19:03:43 +0200
Subject: [PATCH] Use TerminalConsoleAppender for console improvements
Rewrite console improvements (console colors, tab completion,
persistent input line, ...) using JLine 3.x and TerminalConsoleAppender.
New features:
- Support console colors for Vanilla commands
- Add console colors for warnings and errors
- Server can now be turned off safely using CTRL + C. JLine catches
the signal and the implementation shuts down the server cleanly.
- Support console colors and persistent input line when running in
IntelliJ IDEA
Other changes:
- Server starts 1-2 seconds faster thanks to optimizations in Log4j
configuration
diff --git a/pom.xml b/pom.xml
2020-05-06 11:48:49 +02:00
index 6cc18aa360c20448fca59cf5490d69267c8e2521..01dcaf4f4bbe03a118958e494544d7fc4a92e300 100644
2017-06-09 19:05:12 +02:00
--- a/pom.xml
+++ b/pom.xml
2020-04-27 09:34:45 +02:00
@@ -44,10 +44,27 @@
2017-06-09 19:05:12 +02:00
<scope>compile</scope>
</dependency>
2018-08-26 20:11:49 +02:00
<dependency>
2017-06-09 19:05:12 +02:00
- <groupId>jline</groupId>
- <artifactId>jline</artifactId>
- <version>2.12.1</version>
- <scope>compile</scope>
+ <groupId>net.minecrell</groupId>
+ <artifactId>terminalconsoleappender</artifactId>
2019-07-24 02:25:05 +02:00
+ <version>1.2.0</version>
2017-06-09 19:05:12 +02:00
+ </dependency>
+ <dependency>
2019-07-24 02:25:05 +02:00
+ <groupId>org.jline</groupId>
+ <artifactId>jline-terminal-jansi</artifactId>
+ <version>3.12.1</version>
2017-06-09 19:05:12 +02:00
+ <scope>runtime</scope>
+ </dependency>
+ <!--
+ Required to add the missing Log4j2Plugins.dat file from log4j-core
+ which has been removed by Mojang. Without it, log4j has to classload
+ all its classes to check if they are plugins.
+ Scanning takes about 1-2 seconds so adding this speeds up the server start.
+ -->
+ <dependency>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>log4j-core</artifactId>
+ <version>2.8.1</version>
+ <scope>runtime</scope>
2018-08-26 20:11:49 +02:00
</dependency>
2017-06-09 19:05:12 +02:00
<dependency>
2018-08-26 20:11:49 +02:00
<groupId>org.ow2.asm</groupId>
2020-04-27 09:34:45 +02:00
@@ -246,10 +263,18 @@
2017-06-09 19:05:12 +02:00
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/services/java.sql.Driver</resource>
</transformer>
2020-04-27 09:34:45 +02:00
+ <transformer implementation="com.github.edwgiz.maven_shade_plugin.log4j2_cache_transformer.PluginsCacheFileTransformer" />
2017-06-09 19:05:12 +02:00
</transformers>
</configuration>
</execution>
</executions>
+ <dependencies>
+ <dependency>
+ <groupId>com.github.edwgiz</groupId>
+ <artifactId>maven-shade-plugin.log4j2-cachefile-transformer</artifactId>
2020-04-27 09:34:45 +02:00
+ <version>2.13.1</version>
2017-06-09 19:05:12 +02:00
+ </dependency>
+ </dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
2018-07-17 14:48:52 +02:00
diff --git a/src/main/java/com/destroystokyo/paper/console/PaperConsole.java b/src/main/java/com/destroystokyo/paper/console/PaperConsole.java
new file mode 100644
2020-05-06 11:48:49 +02:00
index 0000000000000000000000000000000000000000..cd6e259239b068f1e1b33f45004cf5d37ac5a1a3
2018-07-17 14:48:52 +02:00
--- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/console/PaperConsole.java
@@ -0,0 +1,40 @@
+package com.destroystokyo.paper.console;
+
+import net.minecraft.server.DedicatedServer;
+import net.minecrell.terminalconsole.SimpleTerminalConsole;
+import org.bukkit.craftbukkit.command.ConsoleCommandCompleter;
+import org.jline.reader.LineReader;
+import org.jline.reader.LineReaderBuilder;
+
+public final class PaperConsole extends SimpleTerminalConsole {
+
+ private final DedicatedServer server;
+
+ public PaperConsole(DedicatedServer server) {
+ this.server = server;
+ }
+
+ @Override
+ protected LineReader buildReader(LineReaderBuilder builder) {
+ return super.buildReader(builder
+ .appName("Paper")
+ .completer(new ConsoleCommandCompleter(this.server))
+ );
+ }
+
+ @Override
+ protected boolean isRunning() {
+ return !this.server.isStopped() && this.server.isRunning();
+ }
+
+ @Override
+ protected void runCommand(String command) {
2018-07-19 21:23:18 +02:00
+ this.server.issueCommand(command, this.server.getServerCommandListener());
2018-07-17 14:48:52 +02:00
+ }
+
+ @Override
+ protected void shutdown() {
2019-05-06 01:24:37 +02:00
+ this.server.safeShutdown(false);
2018-07-17 14:48:52 +02:00
+ }
+
+}
2017-06-09 19:05:12 +02:00
diff --git a/src/main/java/com/destroystokyo/paper/console/TerminalConsoleCommandSender.java b/src/main/java/com/destroystokyo/paper/console/TerminalConsoleCommandSender.java
new file mode 100644
2020-05-06 11:48:49 +02:00
index 0000000000000000000000000000000000000000..685deaa0e5d1ddc13e3a7c0471b1cfcf1710c869
2017-06-09 19:05:12 +02:00
--- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/console/TerminalConsoleCommandSender.java
2017-06-21 10:46:18 +02:00
@@ -0,0 +1,17 @@
2017-06-09 19:05:12 +02:00
+package com.destroystokyo.paper.console;
+
2017-06-21 10:46:18 +02:00
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
2017-06-09 19:05:12 +02:00
+import org.bukkit.craftbukkit.command.CraftConsoleCommandSender;
+
+public class TerminalConsoleCommandSender extends CraftConsoleCommandSender {
+
2017-06-21 10:46:18 +02:00
+ private static final Logger LOGGER = LogManager.getRootLogger();
+
2017-06-09 19:05:12 +02:00
+ @Override
+ public void sendRawMessage(String message) {
2017-06-21 10:46:18 +02:00
+ // TerminalConsoleAppender supports color codes directly in log messages
+ LOGGER.info(message);
2017-06-09 19:05:12 +02:00
+ }
+
+}
diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java
2020-05-06 11:48:49 +02:00
index 4b1f8c53737f998fa57859146d5ddb999cdc8d41..d34f772fae3543cec6a130831b1f3eaa67934944 100644
2017-06-09 19:05:12 +02:00
--- a/src/main/java/net/minecraft/server/DedicatedServer.java
+++ b/src/main/java/net/minecraft/server/DedicatedServer.java
2020-01-24 22:30:15 +01:00
@@ -86,6 +86,9 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer
2017-06-09 19:05:12 +02:00
if (!org.bukkit.craftbukkit.Main.useConsole) {
return;
}
2018-07-17 14:48:52 +02:00
+ // Paper start - Use TerminalConsoleAppender
2020-01-24 22:30:15 +01:00
+ new com.destroystokyo.paper.console.PaperConsole(DedicatedServer.this).start();
2018-07-17 14:48:52 +02:00
+ /*
jline.console.ConsoleReader bufferedreader = reader;
2017-06-09 19:05:12 +02:00
2020-01-28 20:43:57 +01:00
// MC-33041, SPIGOT-5538: if System.in is not valid due to javaw, then return
@@ -125,6 +128,8 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer
2018-07-17 14:48:52 +02:00
DedicatedServer.LOGGER.error("Exception handling console input", ioexception);
}
+ */
+ // Paper end
}
};
2020-01-28 20:43:57 +01:00
@@ -136,6 +141,9 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer
2017-06-09 19:05:12 +02:00
}
2017-06-13 10:10:22 +02:00
global.addHandler(new org.bukkit.craftbukkit.util.ForwardLogHandler());
+ // Paper start - Not needed with TerminalConsoleAppender
+ final org.apache.logging.log4j.Logger logger = LogManager.getRootLogger();
+ /*
final org.apache.logging.log4j.core.Logger logger = ((org.apache.logging.log4j.core.Logger) LogManager.getRootLogger());
for (org.apache.logging.log4j.core.Appender appender : logger.getAppenders().values()) {
if (appender instanceof org.apache.logging.log4j.core.appender.ConsoleAppender) {
2020-01-28 20:43:57 +01:00
@@ -144,6 +152,8 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer
2017-06-13 10:10:22 +02:00
}
2019-04-27 08:26:04 +02:00
new org.bukkit.craftbukkit.util.TerminalConsoleWriterThread(System.out, this.reader).start();
2017-06-13 10:10:22 +02:00
+ */
+ // Paper end
2017-06-09 19:05:12 +02:00
System.setOut(new PrintStream(new LoggerOutputStream(logger, Level.INFO), true));
System.setErr(new PrintStream(new LoggerOutputStream(logger, Level.WARN), true));
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
2020-05-06 11:48:49 +02:00
index 8d6a0890073adbbb39db202f80d4b83cef2ceca9..284793e4bf04cddae3e070a1fa0afdd18001fd2e 100644
2017-06-09 19:05:12 +02:00
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
2019-07-20 06:01:24 +02:00
@@ -57,7 +57,7 @@ import org.apache.commons.lang3.Validate;
2017-06-09 19:05:12 +02:00
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
// CraftBukkit start
-import jline.console.ConsoleReader;
2019-04-27 08:26:04 +02:00
+import joptsimple.OptionSet;
2017-06-09 19:05:12 +02:00
import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.CraftServer;
2019-04-27 08:26:04 +02:00
import org.bukkit.craftbukkit.Main;
2019-12-12 00:43:22 +01:00
@@ -161,7 +161,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
2017-06-09 19:05:12 +02:00
public OptionSet options;
public org.bukkit.command.ConsoleCommandSender console;
public org.bukkit.command.RemoteConsoleCommandSender remoteConsole;
- public ConsoleReader reader;
+ //public ConsoleReader reader; // Paper
public static int currentTick = 0; // Paper - Further improve tick loop
2019-04-27 08:26:04 +02:00
public java.util.Queue<Runnable> processQueue = new java.util.concurrent.ConcurrentLinkedQueue<Runnable>();
public int autosavePeriod;
2019-12-12 00:43:22 +01:00
@@ -212,7 +212,9 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
2019-07-20 06:01:24 +02:00
this.K = s;
2017-06-09 19:05:12 +02:00
// CraftBukkit start
this.options = options;
+ // Paper start - Handled by TerminalConsoleAppender
// Try to see if we're actually running in a terminal, disable jline if not
+ /*
if (System.console() == null && System.getProperty("jline.terminal") == null) {
System.setProperty("jline.terminal", "jline.UnsupportedTerminal");
Main.useJline = false;
2019-12-12 00:43:22 +01:00
@@ -233,6 +235,8 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
2017-06-09 19:05:12 +02:00
LOGGER.warn((String) null, ex);
}
}
+ */
+ // Paper end
Runtime.getRuntime().addShutdownHook(new org.bukkit.craftbukkit.util.ServerShutdownThread(this));
2019-04-27 08:26:04 +02:00
}
// CraftBukkit end
2020-01-22 03:02:07 +01:00
@@ -951,7 +955,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
2019-12-23 03:37:47 +01:00
org.spigotmc.WatchdogThread.doStop(); // Spigot
2017-06-09 19:05:12 +02:00
// CraftBukkit start - Restore terminal to original settings
try {
- reader.getTerminal().restore();
+ net.minecrell.terminalconsole.TerminalConsoleAppender.close(); // Paper - Use TerminalConsoleAppender
} catch (Exception ignored) {
}
// CraftBukkit end
Improve mid tick chunk loading, Fix Oversleep, other improvements
Process loads outside of any canSleep check. Original intent was to
only apply those restrictions to generations but realized I had some
checks higher up the call chain.
Reworked the back off strategy to just run every 1 millisecond per world,
and to apply the per tick limit to generations only.
This guarantees that your chunk will load with at most around 1ms delay.
Additionally, fire midTick processing in a few more places, notably the
oversleep section so we can keep processing loads here too which has
a large up to 50ms window...
Speaking of oversleep, we had a bug in our implementation changes for
Timings that caused oversleep to not sleep the correct amount.
Because we now moved it into the NEXT tick instead of THIS tick, the
value of nextTick had already been increased to +50ms, resulting in
the risk of sleeping more than it should, but, more importantly, this
caused every task that was trying to NOT run during oversleep to actually
run during oversleep.
This is now fixed.
Another small tweak is to the /tps command, to no longer show the star when
TPS is right at 20.
Due to ineffeciencies in the sleep precision, TPS is commonly 20.02.
This causes the star to show up almost constantly, so now only show it if
we actually hit a real "catchup".
This commit also improves the changes to the CallbackExecutor, in that
it now is also recursion safe.
It was possible that the executor could run tasks out of desired order
if the executor task scheduled more executor tasks.
We solve this by ensuring new additions do not enter the currently iterated queue.
Each depth level will have its own queue.
Fixes #3220
2020-04-26 05:47:29 +02:00
@@ -1475,7 +1479,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
2017-06-09 19:05:12 +02:00
2019-04-27 08:26:04 +02:00
@Override
2017-06-09 19:05:12 +02:00
public void sendMessage(IChatBaseComponent ichatbasecomponent) {
2018-07-18 02:08:13 +02:00
- MinecraftServer.LOGGER.info(ichatbasecomponent.getString());
+ MinecraftServer.LOGGER.info(org.bukkit.craftbukkit.util.CraftChatMessage.fromComponent(ichatbasecomponent, net.minecraft.server.EnumChatFormat.WHITE));// Paper - Log message with colors
2017-06-09 19:05:12 +02:00
}
2019-04-27 08:26:04 +02:00
public KeyPair getKeyPair() {
2017-06-09 19:05:12 +02:00
diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java
2020-05-06 11:48:49 +02:00
index 56266a77296bc9a84de1d853a6d739337608b995..77f1ddc8a8d6fa816488de5d8c821bfa59f6c729 100644
2017-06-09 19:05:12 +02:00
--- a/src/main/java/net/minecraft/server/PlayerList.java
+++ b/src/main/java/net/minecraft/server/PlayerList.java
2019-04-27 08:26:04 +02:00
@@ -76,8 +76,7 @@ public abstract class PlayerList {
2017-06-09 19:05:12 +02:00
2019-04-27 08:26:04 +02:00
public PlayerList(MinecraftServer minecraftserver, int i) {
this.cserver = minecraftserver.server = new CraftServer((DedicatedServer) minecraftserver, this);
2017-06-09 19:05:12 +02:00
- minecraftserver.console = org.bukkit.craftbukkit.command.ColouredConsoleSender.getInstance();
- minecraftserver.reader.addCompleter(new org.bukkit.craftbukkit.command.ConsoleCommandCompleter(minecraftserver.server));
+ minecraftserver.console = new com.destroystokyo.paper.console.TerminalConsoleCommandSender(); // Paper
// CraftBukkit end
2019-12-12 00:43:22 +01:00
this.k = new GameProfileBanList(PlayerList.b);
2017-06-09 19:05:12 +02:00
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
2020-05-06 11:48:49 +02:00
index 9eb4acf93c65a1473e385be317e5d93cd4571d41..681a84e5b3e7594a43fac0d47f1df2eef310bf81 100644
2017-06-09 19:05:12 +02:00
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
2020-04-27 09:34:45 +02:00
@@ -42,7 +42,7 @@ import java.util.function.Consumer;
import java.util.logging.Level;
2019-04-27 08:26:04 +02:00
import java.util.logging.Logger;
import javax.imageio.ImageIO;
2017-06-09 19:05:12 +02:00
-import jline.console.ConsoleReader;
2020-04-27 09:34:45 +02:00
+//import jline.console.ConsoleReader; // Paper
2019-04-27 08:26:04 +02:00
import net.minecraft.server.Advancement;
import net.minecraft.server.ArgumentEntity;
import net.minecraft.server.Block;
2020-04-27 09:34:45 +02:00
@@ -1118,9 +1118,13 @@ public final class CraftServer implements Server {
2017-06-09 19:05:12 +02:00
return logger;
}
+ // Paper start - JLine update
+ /*
public ConsoleReader getReader() {
return console.reader;
}
+ */
+ // Paper end
@Override
public PluginCommand getPluginCommand(String name) {
diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java
2020-05-06 11:48:49 +02:00
index afbe711acbd1cbaf307513d4fede44bb17b3caae..fc07fdb590475ccaa09875b8fcbb81adc0db5e66 100644
2017-06-09 19:05:12 +02:00
--- a/src/main/java/org/bukkit/craftbukkit/Main.java
+++ b/src/main/java/org/bukkit/craftbukkit/Main.java
2019-04-27 08:26:04 +02:00
@@ -13,7 +13,7 @@ import java.util.logging.Logger;
2017-06-09 19:05:12 +02:00
import joptsimple.OptionParser;
import joptsimple.OptionSet;
import net.minecraft.server.MinecraftServer;
-import org.fusesource.jansi.AnsiConsole;
+import net.minecrell.terminalconsole.TerminalConsoleAppender; // Paper
public class Main {
public static boolean useJline = true;
2020-01-22 03:02:07 +01:00
@@ -179,6 +179,8 @@ public class Main {
2017-06-09 19:05:12 +02:00
}
try {
+ // Paper start - Handled by TerminalConsoleAppender
+ /*
// This trick bypasses Maven Shade's clever rewriting of our getProperty call when using String literals
2020-04-27 09:34:45 +02:00
String jline_UnsupportedTerminal = new String(new char[]{'j', 'l', 'i', 'n', 'e', '.', 'U', 'n', 's', 'u', 'p', 'p', 'o', 'r', 't', 'e', 'd', 'T', 'e', 'r', 'm', 'i', 'n', 'a', 'l'});
String jline_terminal = new String(new char[]{'j', 'l', 'i', 'n', 'e', '.', 't', 'e', 'r', 'm', 'i', 'n', 'a', 'l'});
@@ -196,9 +198,18 @@ public class Main {
2017-06-09 19:05:12 +02:00
// This ensures the terminal literal will always match the jline implementation
System.setProperty(jline.TerminalFactory.JLINE_TERMINAL, jline.UnsupportedTerminal.class.getName());
}
+ */
2020-04-27 09:34:45 +02:00
+
2017-06-09 19:05:12 +02:00
+ if (options.has("nojline")) {
+ System.setProperty(TerminalConsoleAppender.JLINE_OVERRIDE_PROPERTY, "false");
+ useJline = false;
+ }
+ // Paper end
if (options.has("noconsole")) {
useConsole = false;
+ useJline = false; // Paper
+ System.setProperty(TerminalConsoleAppender.JLINE_OVERRIDE_PROPERTY, "false"); // Paper
}
2020-01-22 03:02:07 +01:00
if (Main.class.getPackage().getImplementationVendor() != null && System.getProperty("IReallyKnowWhatIAmDoingISwear") == null) {
2020-04-27 09:34:45 +02:00
@@ -226,7 +237,7 @@ public class Main {
2019-10-13 23:35:54 +02:00
System.out.println("Unable to read system info");
}
// Paper end
-
+ System.setProperty( "library.jansi.version", "Paper" ); // Paper - set meaningless jansi version to prevent git builds from crashing on Windows
System.out.println("Loading libraries, please wait...");
MinecraftServer.main(options);
} catch (Throwable t) {
2017-06-09 19:05:12 +02:00
diff --git a/src/main/java/org/bukkit/craftbukkit/command/ColouredConsoleSender.java b/src/main/java/org/bukkit/craftbukkit/command/ColouredConsoleSender.java
2020-05-06 11:48:49 +02:00
index e0bd5adc19de0d4ab156bac95d3b4b2a86f89490..aae615c13b36f8e72b12260de8996317912fa917 100644
2017-06-09 19:05:12 +02:00
--- a/src/main/java/org/bukkit/craftbukkit/command/ColouredConsoleSender.java
2020-04-27 09:34:45 +02:00
+++ b/src/main/java/org/bukkit/craftbukkit/command/ColouredConsoleSender.java
@@ -2,15 +2,15 @@ package org.bukkit.craftbukkit.command;
import java.util.EnumMap;
import java.util.Map;
2017-06-09 19:05:12 +02:00
-import jline.Terminal;
2020-04-27 09:34:45 +02:00
+//import jline.Terminal;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.craftbukkit.CraftServer;
2019-04-27 08:26:04 +02:00
-import org.fusesource.jansi.Ansi;
-import org.fusesource.jansi.Ansi.Attribute;
2020-04-27 09:34:45 +02:00
+//import org.fusesource.jansi.Ansi;
+//import org.fusesource.jansi.Ansi.Attribute;
2017-06-09 19:05:12 +02:00
-public class ColouredConsoleSender extends CraftConsoleCommandSender {
2020-04-27 09:34:45 +02:00
+public class ColouredConsoleSender /*extends CraftConsoleCommandSender */{/* // Paper - disable
private final Terminal terminal;
private final Map<ChatColor, String> replacements = new EnumMap<ChatColor, String>(ChatColor.class);
private final ChatColor[] colors = ChatColor.values();
@@ -71,5 +71,5 @@ public class ColouredConsoleSender extends CraftConsoleCommandSender {
} else {
return new ColouredConsoleSender();
}
2017-06-09 19:05:12 +02:00
- }
2020-04-27 09:34:45 +02:00
+ }*/ // Paper
}
2017-06-09 19:05:12 +02:00
diff --git a/src/main/java/org/bukkit/craftbukkit/command/ConsoleCommandCompleter.java b/src/main/java/org/bukkit/craftbukkit/command/ConsoleCommandCompleter.java
2020-05-06 11:48:49 +02:00
index befcc19f9b56df9096b98a23b0020f1db793ea5b..5510266fb114954322823b72e3199f33c4d7a9a7 100644
2017-06-09 19:05:12 +02:00
--- a/src/main/java/org/bukkit/craftbukkit/command/ConsoleCommandCompleter.java
+++ b/src/main/java/org/bukkit/craftbukkit/command/ConsoleCommandCompleter.java
2019-05-06 04:58:04 +02:00
@@ -4,20 +4,31 @@ import java.util.Collections;
2019-04-27 08:26:04 +02:00
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
-import jline.console.completer.Completer;
2017-06-09 19:05:12 +02:00
import org.bukkit.craftbukkit.CraftServer;
import org.bukkit.craftbukkit.util.Waitable;
2019-04-27 08:26:04 +02:00
+
2017-06-09 19:05:12 +02:00
+// Paper start - JLine update
+import net.minecraft.server.DedicatedServer; // Paper
+import org.jline.reader.Candidate;
+import org.jline.reader.Completer;
+import org.jline.reader.LineReader;
+import org.jline.reader.ParsedLine;
+// Paper end
import org.bukkit.event.server.TabCompleteEvent;
public class ConsoleCommandCompleter implements Completer {
- private final CraftServer server;
+ private final DedicatedServer server; // Paper - CraftServer -> DedicatedServer
- public ConsoleCommandCompleter(CraftServer server) {
+ public ConsoleCommandCompleter(DedicatedServer server) { // Paper - CraftServer -> DedicatedServer
this.server = server;
}
+ // Paper start - Change method signature for JLine update
2019-05-06 04:58:04 +02:00
@Override
- public int complete(final String buffer, final int cursor, final List<CharSequence> candidates) {
2017-06-09 19:05:12 +02:00
+ public void complete(LineReader reader, ParsedLine line, List<Candidate> candidates) {
+ final CraftServer server = this.server.server;
+ final String buffer = line.line();
+ // Paper end
Waitable<List<String>> waitable = new Waitable<List<String>>() {
@Override
protected List<String> evaluate() {
2019-05-06 04:58:04 +02:00
@@ -29,25 +40,37 @@ public class ConsoleCommandCompleter implements Completer {
2017-06-09 19:05:12 +02:00
return tabEvent.isCancelled() ? Collections.EMPTY_LIST : tabEvent.getCompletions();
}
};
- this.server.getServer().processQueue.add(waitable);
+ server.getServer().processQueue.add(waitable); // Paper - Remove "this."
try {
List<String> offers = waitable.get();
if (offers == null) {
- return cursor;
+ return; // Paper - Method returns void
2019-04-27 08:26:04 +02:00
+ }
+
2017-06-09 19:05:12 +02:00
+ // Paper start - JLine update
+ for (String completion : offers) {
+ if (completion.isEmpty()) {
+ continue;
+ }
+
+ candidates.add(new Candidate(completion));
2019-04-27 08:26:04 +02:00
}
- candidates.addAll(offers);
2017-06-09 19:05:12 +02:00
+ // Paper end
2019-04-27 08:26:04 +02:00
2017-06-09 19:05:12 +02:00
+ // Paper start - JLine handles cursor now
+ /*
final int lastSpace = buffer.lastIndexOf(' ');
if (lastSpace == -1) {
return cursor - buffer.length();
} else {
return cursor - (buffer.length() - lastSpace - 1);
}
+ */
+ // Paper end
} catch (ExecutionException e) {
- this.server.getLogger().log(Level.WARNING, "Unhandled exception when tab completing", e);
+ server.getLogger().log(Level.WARNING, "Unhandled exception when tab completing", e); // Paper - Remove "this."
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
- return cursor;
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/util/ServerShutdownThread.java b/src/main/java/org/bukkit/craftbukkit/util/ServerShutdownThread.java
2020-05-06 11:48:49 +02:00
index 70f8d42992aa348ef7b2d03d22cdd59d7c73f0fe..449e99d1b673870ed6892f6ab2c715a2db35c35d 100644
2017-06-09 19:05:12 +02:00
--- a/src/main/java/org/bukkit/craftbukkit/util/ServerShutdownThread.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/ServerShutdownThread.java
2019-04-27 08:26:04 +02:00
@@ -17,7 +17,7 @@ public class ServerShutdownThread extends Thread {
server.close();
2017-06-09 19:05:12 +02:00
} finally {
try {
- server.reader.getTerminal().restore();
+ net.minecrell.terminalconsole.TerminalConsoleAppender.close(); // Paper - Use TerminalConsoleAppender
} catch (Exception e) {
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/util/TerminalConsoleWriterThread.java b/src/main/java/org/bukkit/craftbukkit/util/TerminalConsoleWriterThread.java
2020-05-06 11:48:49 +02:00
index 99564fed7ce77e29dbdc591bcfe656af741acf8a..9a2da548b8860b496e396564b2c8f6383f020193 100644
2017-06-09 19:05:12 +02:00
--- a/src/main/java/org/bukkit/craftbukkit/util/TerminalConsoleWriterThread.java
2020-04-27 09:34:45 +02:00
+++ b/src/main/java/org/bukkit/craftbukkit/util/TerminalConsoleWriterThread.java
@@ -5,12 +5,12 @@ import java.io.IOException;
import java.io.OutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
2017-06-09 19:05:12 +02:00
-import jline.console.ConsoleReader;
2020-04-27 09:34:45 +02:00
+//import jline.console.ConsoleReader;
import org.bukkit.craftbukkit.Main;
2017-06-09 19:05:12 +02:00
-import org.fusesource.jansi.Ansi;
-import org.fusesource.jansi.Ansi.Erase;
2020-04-27 09:34:45 +02:00
+//import org.fusesource.jansi.Ansi;
+//import org.fusesource.jansi.Ansi.Erase;
2019-04-27 08:26:04 +02:00
-public class TerminalConsoleWriterThread extends Thread {
2020-04-27 09:34:45 +02:00
+public class TerminalConsoleWriterThread /*extends Thread*/ {/* // Paper - disable
private final ConsoleReader reader;
private final OutputStream output;
@@ -54,5 +54,5 @@ public class TerminalConsoleWriterThread extends Thread {
Logger.getLogger(TerminalConsoleWriterThread.class.getName()).log(Level.SEVERE, null, ex);
}
}
2017-06-09 19:05:12 +02:00
- }
2020-04-27 09:34:45 +02:00
+ }*/
}
2019-07-24 02:25:05 +02:00
diff --git a/src/main/resources/log4j2.component.properties b/src/main/resources/log4j2.component.properties
new file mode 100644
2020-05-06 11:48:49 +02:00
index 0000000000000000000000000000000000000000..0694b21465fb9e4164e71862ff24b62241b191f2
2019-07-24 02:25:05 +02:00
--- /dev/null
+++ b/src/main/resources/log4j2.component.properties
@@ -0,0 +1 @@
+log4j.skipJansi=true
2017-06-09 19:05:12 +02:00
diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml
2020-05-06 11:48:49 +02:00
index 722ca84968cbbbdeffd09939abff0cccd0a84010..620b9490e5f159080e50289d127404a1b56adbef 100644
2017-06-09 19:05:12 +02:00
--- a/src/main/resources/log4j2.xml
+++ b/src/main/resources/log4j2.xml
2020-01-25 00:06:37 +01:00
@@ -1,17 +1,14 @@
2017-06-09 19:05:12 +02:00
<?xml version="1.0" encoding="UTF-8"?>
2020-01-22 03:02:07 +01:00
<Configuration status="WARN" packages="com.mojang.util">
2017-06-09 19:05:12 +02:00
<Appenders>
2020-01-22 03:02:07 +01:00
- <Console name="SysOut" target="SYSTEM_OUT">
2019-04-27 08:26:04 +02:00
- <PatternLayout pattern="[%d{HH:mm:ss}] [%t/%level]: %msg%n" />
2020-01-22 03:02:07 +01:00
- </Console>
<Queue name="ServerGuiConsole">
<PatternLayout pattern="[%d{HH:mm:ss} %level]: %msg%n" />
</Queue>
2020-01-25 00:06:37 +01:00
- <Queue name="TerminalConsole">
- <PatternLayout pattern="[%d{HH:mm:ss}] [%t/%level]: %msg%n" />
- </Queue>
2017-06-09 19:05:12 +02:00
+ <TerminalConsole name="TerminalConsole">
+ <PatternLayout pattern="%highlightError{[%d{HH:mm:ss} %level]: %minecraftFormatting{%msg}%n%xEx}" />
+ </TerminalConsole>
<RollingRandomAccessFile name="File" fileName="logs/latest.log" filePattern="logs/%d{yyyy-MM-dd}-%i.log.gz">
- <PatternLayout pattern="[%d{HH:mm:ss}] [%t/%level]: %msg%n" />
+ <PatternLayout pattern="[%d{HH:mm:ss}] [%t/%level]: %minecraftFormatting{%msg}{strip}%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<OnStartupTriggeringPolicy />
2020-01-25 00:06:37 +01:00
@@ -24,10 +21,9 @@
2017-06-13 10:10:22 +02:00
<filters>
<MarkerFilter marker="NETWORK_PACKETS" onMatch="DENY" onMismatch="NEUTRAL" />
</filters>
2020-01-22 03:02:07 +01:00
- <AppenderRef ref="SysOut" level="info"/>
2017-06-13 10:10:22 +02:00
<AppenderRef ref="File"/>
2020-01-22 03:02:07 +01:00
- <AppenderRef ref="ServerGuiConsole" level="info"/>
2017-06-13 10:10:22 +02:00
<AppenderRef ref="TerminalConsole" level="info"/>
2020-01-22 03:02:07 +01:00
+ <AppenderRef ref="ServerGuiConsole" level="info"/>
2017-06-13 10:10:22 +02:00
</Root>
2020-01-22 03:02:07 +01:00
</Loggers>
</Configuration>