mirror of
https://github.com/PaperMC/Waterfall.git
synced 2024-12-28 03:27:37 +01:00
11122 lines
528 KiB
Diff
11122 lines
528 KiB
Diff
From 0a9c85a009d2615d08941c87d2bd01033e8d4273 Mon Sep 17 00:00:00 2001
|
|
From: Juan Cruz Linsalata <LinsaFTW@users.noreply.github.com>
|
|
Date: Sat, 15 Aug 2020 15:19:22 -0300
|
|
Subject: [PATCH] FlameCord Initial Patch
|
|
|
|
|
|
diff --git a/api/.factorypath b/api/.factorypath
|
|
new file mode 100644
|
|
index 00000000..7a4b5ae4
|
|
--- /dev/null
|
|
+++ b/api/.factorypath
|
|
@@ -0,0 +1,17 @@
|
|
+<factorypath>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/gson/gson/2.8.0/gson-2.8.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/md-5/brigadier/1.0.16-SNAPSHOT/brigadier-1.0.16-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec/4.1.51.Final/netty-codec-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/sf/trove4j/core/3.1.0/core-3.1.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/se/llbit/jo-nbt/1.3.0/jo-nbt-1.3.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport-native-unix-common/4.1.51.Final/netty-transport-native-unix-common-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-common/4.1.51.Final/netty-common-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-buffer/4.1.51.Final/netty-buffer-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport/4.1.51.Final/netty-transport-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver/4.1.51.Final/netty-resolver-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/yaml/snakeyaml/1.25/snakeyaml-1.25.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/guava/guava/21.0/guava-21.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/findbugs/findbugs-annotations/3.0.1/findbugs-annotations-3.0.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.10/lombok-1.18.10.jar" enabled="true" runInBatchMode="false"/>
|
|
+</factorypath>
|
|
diff --git a/api/pom.xml b/api/pom.xml
|
|
index d3016c10..365457d6 100644
|
|
--- a/api/pom.xml
|
|
+++ b/api/pom.xml
|
|
@@ -1,6 +1,5 @@
|
|
-
|
|
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
+<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
<modelVersion>4.0.0</modelVersion>
|
|
|
|
<parent>
|
|
diff --git a/api/src/main/java/net/md_5/bungee/api/event/AsyncEvent.java b/api/src/main/java/net/md_5/bungee/api/event/AsyncEvent.java
|
|
index cf85ca06..da5082ed 100644
|
|
--- a/api/src/main/java/net/md_5/bungee/api/event/AsyncEvent.java
|
|
+++ b/api/src/main/java/net/md_5/bungee/api/event/AsyncEvent.java
|
|
@@ -1,10 +1,12 @@
|
|
package net.md_5.bungee.api.event;
|
|
|
|
-import com.google.common.base.Preconditions;
|
|
import java.util.Map;
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
+
|
|
+import com.google.common.base.Preconditions;
|
|
+
|
|
import lombok.AccessLevel;
|
|
import lombok.Data;
|
|
import lombok.EqualsAndHashCode;
|
|
@@ -23,8 +25,7 @@ import net.md_5.bungee.api.plugin.Plugin;
|
|
@Getter(AccessLevel.NONE)
|
|
@ToString(callSuper = true)
|
|
@EqualsAndHashCode(callSuper = true)
|
|
-public class AsyncEvent<T> extends Event
|
|
-{
|
|
+public class AsyncEvent<T> extends Event {
|
|
|
|
private final Callback<T> done;
|
|
private final Map<Plugin, AtomicInteger> intents = new ConcurrentHashMap<>();
|
|
@@ -33,61 +34,59 @@ public class AsyncEvent<T> extends Event
|
|
|
|
@Override
|
|
@SuppressWarnings("unchecked")
|
|
- public void postCall()
|
|
- {
|
|
- if ( latch.get() == 0 )
|
|
- {
|
|
- done.done( (T) this, null );
|
|
+ public void postCall() {
|
|
+ if (latch.get() == 0) {
|
|
+ done.done((T) this, null);
|
|
}
|
|
- fired.set( true );
|
|
+ fired.set(true);
|
|
}
|
|
|
|
/**
|
|
* Register an intent that this plugin will continue to perform work on a
|
|
* background task, and wishes to let the event proceed once the registered
|
|
* background task has completed. Multiple intents can be registered by a
|
|
- * plugin, but the plugin must complete the same amount of intents for the
|
|
- * event to proceed.
|
|
+ * plugin, but the plugin must complete the same amount of intents for the event
|
|
+ * to proceed.
|
|
*
|
|
* @param plugin the plugin registering this intent
|
|
*/
|
|
- public void registerIntent(Plugin plugin)
|
|
- {
|
|
- Preconditions.checkState( !fired.get(), "Event %s has already been fired", this );
|
|
+ public void registerIntent(Plugin plugin) {
|
|
+ Preconditions.checkState(!fired.get(), "Event %s has already been fired", this);
|
|
|
|
- AtomicInteger intentCount = intents.get( plugin );
|
|
- if ( intentCount == null )
|
|
- {
|
|
- intents.put( plugin, new AtomicInteger( 1 ) );
|
|
- } else
|
|
- {
|
|
+ AtomicInteger intentCount = intents.get(plugin);
|
|
+ if (intentCount == null) {
|
|
+ intents.put(plugin, new AtomicInteger(1));
|
|
+ } else {
|
|
intentCount.incrementAndGet();
|
|
}
|
|
latch.incrementAndGet();
|
|
}
|
|
|
|
/**
|
|
- * Notifies this event that this plugin has completed an intent and wishes
|
|
- * to let the event proceed once all intents have been completed.
|
|
+ * Notifies this event that this plugin has completed an intent and wishes to
|
|
+ * let the event proceed once all intents have been completed.
|
|
*
|
|
* @param plugin a plugin which has an intent registered for this event
|
|
*/
|
|
@SuppressWarnings("unchecked")
|
|
- public void completeIntent(Plugin plugin)
|
|
- {
|
|
- AtomicInteger intentCount = intents.get( plugin );
|
|
- Preconditions.checkState( intentCount != null && intentCount.get() > 0, "Plugin %s has not registered intents for event %s", plugin, this );
|
|
+ public void completeIntent(Plugin plugin) {
|
|
+ AtomicInteger intentCount = intents.get(plugin);
|
|
+ Preconditions.checkState(intentCount != null && intentCount.get() > 0,
|
|
+ "Plugin %s has not registered intents for event %s", plugin, this);
|
|
|
|
intentCount.decrementAndGet();
|
|
- if ( fired.get() )
|
|
- {
|
|
- if ( latch.decrementAndGet() == 0 )
|
|
- {
|
|
- done.done( (T) this, null );
|
|
+ if (fired.get()) {
|
|
+ if (latch.decrementAndGet() == 0) {
|
|
+ done.done((T) this, null);
|
|
}
|
|
- } else
|
|
- {
|
|
+ } else {
|
|
latch.decrementAndGet();
|
|
}
|
|
}
|
|
+
|
|
+ // FlameCord start - Added getDone() by request
|
|
+ public Callback<T> getDone() {
|
|
+ return this.done;
|
|
+ }
|
|
+ // FlameCord end - Added getDone() by request
|
|
}
|
|
diff --git a/bootstrap/.factorypath b/bootstrap/.factorypath
|
|
new file mode 100644
|
|
index 00000000..c6fe9856
|
|
--- /dev/null
|
|
+++ b/bootstrap/.factorypath
|
|
@@ -0,0 +1,37 @@
|
|
+<factorypath>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec-haproxy/4.1.51.Final/netty-codec-haproxy-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-buffer/4.1.51.Final/netty-buffer-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport/4.1.51.Final/netty-transport-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec/4.1.51.Final/netty-codec-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec-http/4.1.51.Final/netty-codec-http-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-common/4.1.51.Final/netty-common-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver-dns/4.1.51.Final/netty-resolver-dns-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver/4.1.51.Final/netty-resolver-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec-dns/4.1.51.Final/netty-codec-dns-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-handler/4.1.51.Final/netty-handler-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport-native-epoll/4.1.51.Final/netty-transport-native-epoll-4.1.51.Final-linux-x86_64.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport-native-unix-common/4.1.51.Final/netty-transport-native-unix-common-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/gson/gson/2.8.0/gson-2.8.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/yaml/snakeyaml/1.25/snakeyaml-1.25.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-core/2.12.0/log4j-core-2.12.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-api/2.12.0/log4j-api-2.12.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-iostreams/2.12.0/log4j-iostreams-2.12.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-jul/2.12.0/log4j-jul-2.12.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-slf4j-impl/2.12.0/log4j-slf4j-impl-2.12.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/lmax/disruptor/3.4.2/disruptor-3.4.2.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/java/dev/jna/jna/4.4.0/jna-4.4.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/md-5/brigadier/1.0.16-SNAPSHOT/brigadier-1.0.16-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/sf/trove4j/core/3.1.0/core-3.1.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/se/llbit/jo-nbt/1.3.0/jo-nbt-1.3.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/sf/jopt-simple/jopt-simple/5.0.4/jopt-simple-5.0.4.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/mysql/mysql-connector-java/5.1.48/mysql-connector-java-5.1.48.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/minecrell/terminalconsoleappender/1.2.0/terminalconsoleappender-1.2.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/jline/jline-reader/3.12.1/jline-reader-3.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/jline/jline-terminal-jansi/3.12.1/jline-terminal-jansi-3.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/fusesource/jansi/jansi/1.18/jansi-1.18.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/jline/jline-terminal/3.12.1/jline-terminal-3.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/guava/guava/21.0/guava-21.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/findbugs/findbugs-annotations/3.0.1/findbugs-annotations-3.0.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.10/lombok-1.18.10.jar" enabled="true" runInBatchMode="false"/>
|
|
+</factorypath>
|
|
diff --git a/bootstrap/pom.xml b/bootstrap/pom.xml
|
|
index 078c5b1a..ec4202db 100644
|
|
--- a/bootstrap/pom.xml
|
|
+++ b/bootstrap/pom.xml
|
|
@@ -1,6 +1,5 @@
|
|
-
|
|
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
+<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
<modelVersion>4.0.0</modelVersion>
|
|
|
|
<parent>
|
|
diff --git a/chat/.factorypath b/chat/.factorypath
|
|
new file mode 100644
|
|
index 00000000..ed4e646c
|
|
--- /dev/null
|
|
+++ b/chat/.factorypath
|
|
@@ -0,0 +1,6 @@
|
|
+<factorypath>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/gson/gson/2.8.0/gson-2.8.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/guava/guava/21.0/guava-21.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/findbugs/findbugs-annotations/3.0.1/findbugs-annotations-3.0.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.10/lombok-1.18.10.jar" enabled="true" runInBatchMode="false"/>
|
|
+</factorypath>
|
|
diff --git a/chat/pom.xml b/chat/pom.xml
|
|
index 29094871..863832b5 100644
|
|
--- a/chat/pom.xml
|
|
+++ b/chat/pom.xml
|
|
@@ -1,6 +1,5 @@
|
|
-
|
|
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
+<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
<modelVersion>4.0.0</modelVersion>
|
|
|
|
<parent>
|
|
diff --git a/config/.factorypath b/config/.factorypath
|
|
new file mode 100644
|
|
index 00000000..6e60b565
|
|
--- /dev/null
|
|
+++ b/config/.factorypath
|
|
@@ -0,0 +1,7 @@
|
|
+<factorypath>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/gson/gson/2.8.0/gson-2.8.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/yaml/snakeyaml/1.25/snakeyaml-1.25.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/guava/guava/21.0/guava-21.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/findbugs/findbugs-annotations/3.0.1/findbugs-annotations-3.0.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.10/lombok-1.18.10.jar" enabled="true" runInBatchMode="false"/>
|
|
+</factorypath>
|
|
diff --git a/config/pom.xml b/config/pom.xml
|
|
index 18f0a14e..f6d6d160 100644
|
|
--- a/config/pom.xml
|
|
+++ b/config/pom.xml
|
|
@@ -1,6 +1,5 @@
|
|
-
|
|
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
+<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
<modelVersion>4.0.0</modelVersion>
|
|
|
|
<parent>
|
|
diff --git a/event/.factorypath b/event/.factorypath
|
|
new file mode 100644
|
|
index 00000000..f398f41e
|
|
--- /dev/null
|
|
+++ b/event/.factorypath
|
|
@@ -0,0 +1,5 @@
|
|
+<factorypath>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/guava/guava/21.0/guava-21.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/findbugs/findbugs-annotations/3.0.1/findbugs-annotations-3.0.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.10/lombok-1.18.10.jar" enabled="true" runInBatchMode="false"/>
|
|
+</factorypath>
|
|
diff --git a/event/pom.xml b/event/pom.xml
|
|
index 592bef24..91e739bc 100644
|
|
--- a/event/pom.xml
|
|
+++ b/event/pom.xml
|
|
@@ -1,6 +1,5 @@
|
|
-
|
|
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
+<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
<modelVersion>4.0.0</modelVersion>
|
|
|
|
<parent>
|
|
diff --git a/flamecord/.factorypath b/flamecord/.factorypath
|
|
new file mode 100644
|
|
index 00000000..f398f41e
|
|
--- /dev/null
|
|
+++ b/flamecord/.factorypath
|
|
@@ -0,0 +1,5 @@
|
|
+<factorypath>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/guava/guava/21.0/guava-21.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/findbugs/findbugs-annotations/3.0.1/findbugs-annotations-3.0.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.10/lombok-1.18.10.jar" enabled="true" runInBatchMode="false"/>
|
|
+</factorypath>
|
|
diff --git a/flamecord/pom.xml b/flamecord/pom.xml
|
|
new file mode 100644
|
|
index 00000000..939f1c2d
|
|
--- /dev/null
|
|
+++ b/flamecord/pom.xml
|
|
@@ -0,0 +1,44 @@
|
|
+<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
+ <modelVersion>4.0.0</modelVersion>
|
|
+
|
|
+ <parent>
|
|
+ <groupId>io.github.waterfallmc</groupId>
|
|
+ <artifactId>travertine-parent</artifactId>
|
|
+ <version>1.16-R0.4-SNAPSHOT</version>
|
|
+ <relativePath>../pom.xml</relativePath>
|
|
+ </parent>
|
|
+
|
|
+ <groupId>dev._2lstudios.flamecord</groupId>
|
|
+ <artifactId>travertine-flamecord</artifactId>
|
|
+ <version>1.16-R0.4-SNAPSHOT</version>
|
|
+ <packaging>jar</packaging>
|
|
+
|
|
+ <name>Travertine-FlameCord</name>
|
|
+ <description>FlameCord contains security essentials and new configuration options</description>
|
|
+
|
|
+ <dependencies>
|
|
+ <dependency>
|
|
+ <groupId>io.github.waterfallmc</groupId>
|
|
+ <artifactId>travertine-config</artifactId>
|
|
+ <version>${project.version}</version>
|
|
+ <scope>compile</scope>
|
|
+ </dependency>
|
|
+ <dependency>
|
|
+ <groupId>io.github.waterfallmc</groupId>
|
|
+ <artifactId>travertine-chat</artifactId>
|
|
+ <version>${project.version}</version>
|
|
+ <scope>compile</scope>
|
|
+ </dependency>
|
|
+ </dependencies>
|
|
+
|
|
+ <build>
|
|
+ <finalName>${project.name}</finalName>
|
|
+ <resources>
|
|
+ <resource>
|
|
+ <filtering>true</filtering>
|
|
+ <directory>${basedir}/src/main/resources</directory>
|
|
+ </resource>
|
|
+ </resources>
|
|
+ </build>
|
|
+</project>
|
|
diff --git a/flamecord/src/main/java/dev/_2lstudios/flamecord/FlameCord.java b/flamecord/src/main/java/dev/_2lstudios/flamecord/FlameCord.java
|
|
new file mode 100644
|
|
index 00000000..3a7f56ee
|
|
--- /dev/null
|
|
+++ b/flamecord/src/main/java/dev/_2lstudios/flamecord/FlameCord.java
|
|
@@ -0,0 +1,57 @@
|
|
+package dev._2lstudios.flamecord;
|
|
+
|
|
+import java.util.logging.Logger;
|
|
+
|
|
+import dev._2lstudios.flamecord.configuration.FlameCordConfiguration;
|
|
+import dev._2lstudios.flamecord.configuration.MessagesConfiguration;
|
|
+import dev._2lstudios.flamecord.configuration.ModulesConfiguration;
|
|
+import dev._2lstudios.flamecord.firewall.FirewallManager;
|
|
+import lombok.Getter;
|
|
+import net.md_5.bungee.config.ConfigurationProvider;
|
|
+import net.md_5.bungee.config.YamlConfiguration;
|
|
+
|
|
+public class FlameCord {
|
|
+ @Getter
|
|
+ private static FlameCord instance;
|
|
+ @Getter
|
|
+ private final FirewallManager firewallManager;
|
|
+ @Getter
|
|
+ private final FlameCordConfiguration flameCordConfiguration;
|
|
+ @Getter
|
|
+ private final ModulesConfiguration modulesConfiguration;
|
|
+ @Getter
|
|
+ private final MessagesConfiguration messagesConfiguration;
|
|
+ private final Thread thread;
|
|
+
|
|
+ public static void renew(final Logger logger) {
|
|
+ if (FlameCord.instance != null) {
|
|
+ FlameCord.instance.thread.interrupt();
|
|
+ }
|
|
+
|
|
+ FlameCord.instance = new FlameCord(logger);
|
|
+ }
|
|
+
|
|
+ private FlameCord(final Logger logger) {
|
|
+ final ConfigurationProvider configurationProvider = YamlConfiguration.getProvider(YamlConfiguration.class);
|
|
+
|
|
+ this.flameCordConfiguration = new FlameCordConfiguration(configurationProvider);
|
|
+ this.firewallManager = new FirewallManager(logger, flameCordConfiguration.getFirewallSeconds());
|
|
+ this.modulesConfiguration = new ModulesConfiguration(configurationProvider);
|
|
+ this.messagesConfiguration = new MessagesConfiguration(logger, configurationProvider);
|
|
+ this.thread = new Thread() {
|
|
+ @Override
|
|
+ public void run() {
|
|
+ try {
|
|
+ for (;;) {
|
|
+ firewallManager.tick();
|
|
+
|
|
+ sleep(1000L);
|
|
+ }
|
|
+ } catch (final Exception e) {
|
|
+ }
|
|
+ }
|
|
+ };
|
|
+
|
|
+ this.thread.start();
|
|
+ }
|
|
+}
|
|
\ No newline at end of file
|
|
diff --git a/flamecord/src/main/java/dev/_2lstudios/flamecord/configuration/FlameCordConfiguration.java b/flamecord/src/main/java/dev/_2lstudios/flamecord/configuration/FlameCordConfiguration.java
|
|
new file mode 100644
|
|
index 00000000..b7268e1d
|
|
--- /dev/null
|
|
+++ b/flamecord/src/main/java/dev/_2lstudios/flamecord/configuration/FlameCordConfiguration.java
|
|
@@ -0,0 +1,81 @@
|
|
+package dev._2lstudios.flamecord.configuration;
|
|
+
|
|
+import java.io.File;
|
|
+import java.io.IOException;
|
|
+import java.util.ArrayList;
|
|
+import java.util.Arrays;
|
|
+import java.util.Collection;
|
|
+import java.util.HashSet;
|
|
+
|
|
+import lombok.Getter;
|
|
+import net.md_5.bungee.config.Configuration;
|
|
+import net.md_5.bungee.config.ConfigurationProvider;
|
|
+
|
|
+public class FlameCordConfiguration {
|
|
+ @Getter
|
|
+ private boolean loggerInitialhandler = false, loggerExceptions = false, loggerDump = false, firewallNotify = true,
|
|
+ firewallEnabled = true;
|
|
+ @Getter
|
|
+ private int firewallSeconds = 60;
|
|
+ @Getter
|
|
+ private Collection<String> firewallNames = new HashSet<>(Arrays.asList(new String[] { "mcspam" }));
|
|
+
|
|
+ public FlameCordConfiguration(final ConfigurationProvider configurationProvider) {
|
|
+ try {
|
|
+ final String fileName = "./flamecord.yml";
|
|
+ final File configurationFile = new File(fileName);
|
|
+ final Configuration configuration;
|
|
+ final boolean configurationExists = configurationFile.exists();
|
|
+
|
|
+ if (!configurationExists) {
|
|
+ configuration = new Configuration();
|
|
+ } else {
|
|
+ configuration = configurationProvider.load(configurationFile);
|
|
+ }
|
|
+
|
|
+ this.loggerInitialhandler = setIfUnexistant("logger.initialhandler", this.loggerInitialhandler,
|
|
+ configuration);
|
|
+ this.loggerExceptions = setIfUnexistant("logger.exceptions", this.loggerExceptions, configuration);
|
|
+ this.loggerDump = setIfUnexistant("logger.dump", this.loggerDump, configuration);
|
|
+ this.firewallEnabled = setIfUnexistant("firewall.enabled", this.firewallEnabled, configuration);
|
|
+ this.firewallNotify = setIfUnexistant("firewall.notify", this.firewallNotify, configuration);
|
|
+ this.firewallSeconds = setIfUnexistant("firewall.seconds", this.firewallSeconds, configuration);
|
|
+ this.firewallNames = setIfUnexistant("firewall.names", this.firewallNames, configuration);
|
|
+
|
|
+ if (!configurationExists) {
|
|
+ configurationProvider.save(configuration, configurationFile);
|
|
+ }
|
|
+ } catch (final IOException e) {
|
|
+ e.printStackTrace();
|
|
+ }
|
|
+ }
|
|
+
|
|
+ private int setIfUnexistant(final String arg1, final int arg2, final Configuration configuration) {
|
|
+ return (int) setIfUnexistant(arg1, (Object) arg2, configuration);
|
|
+ }
|
|
+
|
|
+ private boolean setIfUnexistant(final String arg1, final boolean arg2, final Configuration configuration) {
|
|
+ return (boolean) setIfUnexistant(arg1, (Object) arg2, configuration);
|
|
+ }
|
|
+
|
|
+ private Object setIfUnexistant(final String arg1, final Object arg2, final Configuration configuration) {
|
|
+ if (!configuration.contains(arg1)) {
|
|
+ configuration.set(arg1, arg2);
|
|
+
|
|
+ return arg2;
|
|
+ } else {
|
|
+ return configuration.get(arg1);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ private Collection<String> setIfUnexistant(final String arg1, final Collection<String> arg2,
|
|
+ final Configuration configuration) {
|
|
+ if (!configuration.contains(arg1)) {
|
|
+ configuration.set(arg1, new ArrayList<>(arg2));
|
|
+
|
|
+ return arg2;
|
|
+ } else {
|
|
+ return new HashSet<>(configuration.getStringList(arg1));
|
|
+ }
|
|
+ }
|
|
+}
|
|
diff --git a/flamecord/src/main/java/dev/_2lstudios/flamecord/configuration/MessagesConfiguration.java b/flamecord/src/main/java/dev/_2lstudios/flamecord/configuration/MessagesConfiguration.java
|
|
new file mode 100644
|
|
index 00000000..c88077ad
|
|
--- /dev/null
|
|
+++ b/flamecord/src/main/java/dev/_2lstudios/flamecord/configuration/MessagesConfiguration.java
|
|
@@ -0,0 +1,129 @@
|
|
+package dev._2lstudios.flamecord.configuration;
|
|
+
|
|
+import java.io.File;
|
|
+import java.io.IOException;
|
|
+import java.text.MessageFormat;
|
|
+import java.util.HashMap;
|
|
+import java.util.Map;
|
|
+import java.util.logging.Logger;
|
|
+
|
|
+import net.md_5.bungee.api.ChatColor;
|
|
+import net.md_5.bungee.config.Configuration;
|
|
+import net.md_5.bungee.config.ConfigurationProvider;
|
|
+
|
|
+public class MessagesConfiguration {
|
|
+ private final Logger logger;
|
|
+ private final Map<String, String> messages = new HashMap<>();
|
|
+
|
|
+ public MessagesConfiguration(final Logger logger, final ConfigurationProvider configurationProvider) {
|
|
+ this.logger = logger;
|
|
+
|
|
+ try {
|
|
+ final String fileName = "./messages.yml";
|
|
+ final File configurationFile = new File(fileName);
|
|
+ final Configuration configuration;
|
|
+ final boolean configurationExists = configurationFile.exists();
|
|
+
|
|
+ if (!configurationExists) {
|
|
+ configuration = new Configuration();
|
|
+ } else {
|
|
+ configuration = configurationProvider.load(configurationFile);
|
|
+ }
|
|
+
|
|
+ // BungeeCord
|
|
+ setIfUnexistant("alert", "&8[&4Alert&8]&r ", configuration);
|
|
+ setIfUnexistant("already_connected", "&cYou are already connected to this server!", configuration);
|
|
+ setIfUnexistant("already_connected_proxy", "&cYou are already connected to this proxy!", configuration);
|
|
+ setIfUnexistant("already_connecting", "&cAlready connecting to this server!", configuration);
|
|
+ setIfUnexistant("command_list", "&a[{0}] &e({1}): &r{2}", configuration);
|
|
+ setIfUnexistant("connect_kick", "&cKicked whilst connecting to {0}: {1}", configuration);
|
|
+ setIfUnexistant("current_server", "&6You are currently connected to {0}.", configuration);
|
|
+ setIfUnexistant("fallback_kick",
|
|
+ "&cCould not connect to a default or fallback server, please try again later: {0}", configuration);
|
|
+ setIfUnexistant("fallback_lobby",
|
|
+ "&cCould not connect to target server, you have been moved to a fallback server.", configuration);
|
|
+ setIfUnexistant("lost_connection", "[Proxy] Lost connection to server.", configuration);
|
|
+ setIfUnexistant("mojang_fail", "Error occurred while contacting login servers, are they down?",
|
|
+ configuration);
|
|
+ setIfUnexistant("no_permission", "&cYou do not have permission to execute this command!", configuration);
|
|
+ setIfUnexistant("no_server", "&cThe specified server does not exist.", configuration);
|
|
+ setIfUnexistant("no_server_permission", "&cYou don't have permission to access this server.",
|
|
+ configuration);
|
|
+ setIfUnexistant("outdated_client", "Outdated client! Please use {0}", configuration);
|
|
+ setIfUnexistant("outdated_server", "Outdated server! I'm still on {0}", configuration);
|
|
+ setIfUnexistant("proxy_full", "Server is full!", configuration);
|
|
+ setIfUnexistant("restart", "[Proxy] Proxy restarting.", configuration);
|
|
+ setIfUnexistant("server_kick", "[Kicked] ", configuration);
|
|
+ setIfUnexistant("server_list", "&6You may connect to the following servers at this time: ", configuration);
|
|
+ setIfUnexistant("server_went_down",
|
|
+ "&cThe server you were previously on went down, you have been connected to a fallback server",
|
|
+ configuration);
|
|
+ setIfUnexistant("total_players", "Total players online: {0}", configuration);
|
|
+ setIfUnexistant("name_too_long", "Cannot have username longer than 16 characters", configuration);
|
|
+ setIfUnexistant("name_invalid", "Username contains invalid characters.", configuration);
|
|
+ setIfUnexistant("ping_cannot_connect", "&c[Bungee] Can't connect to server.", configuration);
|
|
+ setIfUnexistant("offline_mode_player", "Not authenticated with Minecraft.net", configuration);
|
|
+ setIfUnexistant("message_needed", "&cYou must supply a message.", configuration);
|
|
+ setIfUnexistant("error_occurred_player",
|
|
+ "&cAn error occurred while parsing your message. (Hover for details)", configuration);
|
|
+ setIfUnexistant("error_occurred_console", "&cAn error occurred while parsing your message: {0}",
|
|
+ configuration);
|
|
+ setIfUnexistant("click_to_connect", "Click to connect to the server", configuration);
|
|
+ setIfUnexistant("username_needed", "&cPlease follow this command by a user name.", configuration);
|
|
+ setIfUnexistant("user_not_online", "&cThat user is not online.", configuration);
|
|
+ setIfUnexistant("user_online_at", "&a{0} &ris online at {1}", configuration);
|
|
+ setIfUnexistant("send_cmd_usage",
|
|
+ "&cNot enough arguments, usage: /send <server|player|all|current> <target>", configuration);
|
|
+ setIfUnexistant("player_only", "&cOnly in game players can use this command", configuration);
|
|
+ setIfUnexistant("successfully_summoned", "&aSuccessfully summoned player(s)", configuration);
|
|
+ setIfUnexistant("you_got_summoned", "&6Summoned to {0} by {1}", configuration);
|
|
+ setIfUnexistant("command_perms_groups", "&6You have the following groups: {0}", configuration);
|
|
+ setIfUnexistant("command_perms_permission", "&9- {0}", configuration);
|
|
+ setIfUnexistant("command_ip", "&9IP of {0} is {1}", configuration);
|
|
+
|
|
+ // FlameCord
|
|
+ setIfUnexistant("firewall_added", "&e{0}&c had been firewalled from the proxy!", configuration);
|
|
+ setIfUnexistant("firewall_blocked", "&e{0}&c is firewalled from the proxy, request blocked!",
|
|
+ configuration);
|
|
+ setIfUnexistant("firewall_info",
|
|
+ "&aThere are&b {0} &aaddresses firewalled!\n&aThe firewall will clear in &b{1} &aseconds!",
|
|
+ configuration);
|
|
+ setIfUnexistant("firewall_cleared", "&b{0}&a addresses had been automatically removed from the firewall!",
|
|
+ configuration);
|
|
+ setIfUnexistant("flamecord_reload", "&aAll files had been successfully reloaded!", configuration);
|
|
+ setIfUnexistant("flamecord_help",
|
|
+ "&aFlameCord&b {0}&a by&b LinsaFTW&a &&b Sammwy&r\n&e /flamecord reload&7 >&b Reloads FlameCord files!\n&e /flamecord firewall&7 >&b Shows information about the Firewall!\n&e /flamecord help&7 >&b Shows this message!",
|
|
+ configuration);
|
|
+ setIfUnexistant("flamecord_nopermission", "&cYou don't have permission to do this!", configuration);
|
|
+
|
|
+ if (!configurationExists) {
|
|
+ configurationProvider.save(configuration, configurationFile);
|
|
+ }
|
|
+
|
|
+ for (final String key : configuration.getKeys()) {
|
|
+ final Object value = configuration.get(key);
|
|
+
|
|
+ if (value instanceof String) {
|
|
+ this.messages.put(key, ChatColor.translateAlternateColorCodes('&', (String) value));
|
|
+ }
|
|
+ }
|
|
+ } catch (final IOException e) {
|
|
+ e.printStackTrace();
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public String getTranslation(final String name, final Object... args) {
|
|
+ if (!messages.containsKey(name)) {
|
|
+ logger.warning("[FlameCord] Tried to get translation '" + name
|
|
+ + "' from messages.yml file but wasn't found. Please try resetting this file or report to a developer.");
|
|
+ }
|
|
+
|
|
+ return MessageFormat.format(messages.getOrDefault(name, "<translation '" + name + "' missing>"), args);
|
|
+ }
|
|
+
|
|
+ private void setIfUnexistant(final String arg1, final Object arg2, final Configuration configuration) {
|
|
+ if (!configuration.contains(arg1)) {
|
|
+ configuration.set(arg1, arg2);
|
|
+ }
|
|
+ }
|
|
+}
|
|
\ No newline at end of file
|
|
diff --git a/flamecord/src/main/java/dev/_2lstudios/flamecord/configuration/ModulesConfiguration.java b/flamecord/src/main/java/dev/_2lstudios/flamecord/configuration/ModulesConfiguration.java
|
|
new file mode 100644
|
|
index 00000000..e82c4844
|
|
--- /dev/null
|
|
+++ b/flamecord/src/main/java/dev/_2lstudios/flamecord/configuration/ModulesConfiguration.java
|
|
@@ -0,0 +1,94 @@
|
|
+package dev._2lstudios.flamecord.configuration;
|
|
+
|
|
+import java.io.File;
|
|
+import java.io.IOException;
|
|
+
|
|
+import net.md_5.bungee.config.Configuration;
|
|
+import net.md_5.bungee.config.ConfigurationProvider;
|
|
+
|
|
+public class ModulesConfiguration {
|
|
+ // Reconnect Module
|
|
+ public boolean reconnectEnabled = false;
|
|
+
|
|
+ // Alert Module
|
|
+ public boolean alertEnabled = true;
|
|
+
|
|
+ // Find Module
|
|
+ public boolean findEnabled = true;
|
|
+
|
|
+ // IP Module
|
|
+ public boolean ipEnabled = true;
|
|
+
|
|
+ // List Module
|
|
+ public boolean listEnabled = true;
|
|
+
|
|
+ // Perms Module
|
|
+ public boolean permsEnabled = true;
|
|
+
|
|
+ // Reload Module
|
|
+ public boolean reloadEnabled = true;
|
|
+
|
|
+ // Send Module
|
|
+ public boolean sendEnabled = true;
|
|
+
|
|
+ // Server
|
|
+ public boolean serverEnabled = true;
|
|
+
|
|
+ public ModulesConfiguration(final ConfigurationProvider configurationProvider) {
|
|
+ try {
|
|
+ final String fileName = "./modules.yml";
|
|
+ final File configurationFile = new File(fileName);
|
|
+ final Configuration configuration;
|
|
+ final boolean configurationExists = configurationFile.exists();
|
|
+
|
|
+ if (!configurationExists) {
|
|
+ configuration = new Configuration();
|
|
+ } else {
|
|
+ configuration = configurationProvider.load(configurationFile);
|
|
+ }
|
|
+
|
|
+ this.alertEnabled = setIfUnexistant("alert.enabled", this.alertEnabled, configuration);
|
|
+
|
|
+ this.findEnabled = setIfUnexistant("find.enabled", this.findEnabled, configuration);
|
|
+
|
|
+ this.ipEnabled = setIfUnexistant("ip.enabled", this.ipEnabled, configuration);
|
|
+
|
|
+ this.listEnabled = setIfUnexistant("list.enabled", this.listEnabled, configuration);
|
|
+
|
|
+ this.permsEnabled = setIfUnexistant("perms.enabled", this.permsEnabled, configuration);
|
|
+
|
|
+ this.reloadEnabled = setIfUnexistant("reload.enabled", this.reloadEnabled, configuration);
|
|
+
|
|
+ this.sendEnabled = setIfUnexistant("send.enabled", this.sendEnabled, configuration);
|
|
+
|
|
+ this.serverEnabled = setIfUnexistant("server.enabled", this.serverEnabled, configuration);
|
|
+
|
|
+ this.reconnectEnabled = setIfUnexistant("reconnect.enabled", this.reconnectEnabled,
|
|
+ configuration);
|
|
+
|
|
+ if (!configurationExists) {
|
|
+ configurationProvider.save(configuration, configurationFile);
|
|
+ }
|
|
+ } catch (final IOException e) {
|
|
+ e.printStackTrace();
|
|
+ }
|
|
+ }
|
|
+
|
|
+ private String setIfUnexistant(final String arg1, final String arg2, final Configuration configuration) {
|
|
+ return (String) setIfUnexistant(arg1, (Object) arg2, configuration);
|
|
+ }
|
|
+
|
|
+ private boolean setIfUnexistant(final String arg1, final boolean arg2, final Configuration configuration) {
|
|
+ return (boolean) setIfUnexistant(arg1, (Object) arg2, configuration);
|
|
+ }
|
|
+
|
|
+ private Object setIfUnexistant(final String arg1, final Object arg2, final Configuration configuration) {
|
|
+ if (!configuration.contains(arg1)) {
|
|
+ configuration.set(arg1, arg2);
|
|
+
|
|
+ return arg2;
|
|
+ } else {
|
|
+ return configuration.get(arg1);
|
|
+ }
|
|
+ }
|
|
+}
|
|
diff --git a/flamecord/src/main/java/dev/_2lstudios/flamecord/firewall/FirewallException.java b/flamecord/src/main/java/dev/_2lstudios/flamecord/firewall/FirewallException.java
|
|
new file mode 100644
|
|
index 00000000..aca06844
|
|
--- /dev/null
|
|
+++ b/flamecord/src/main/java/dev/_2lstudios/flamecord/firewall/FirewallException.java
|
|
@@ -0,0 +1,19 @@
|
|
+package dev._2lstudios.flamecord.firewall;
|
|
+
|
|
+import java.net.SocketAddress;
|
|
+
|
|
+public class FirewallException extends Exception {
|
|
+ private static final long serialVersionUID = 1L;
|
|
+
|
|
+ public FirewallException(final SocketAddress address) {
|
|
+ super("The address " + address + " is blocked from the server!");
|
|
+ }
|
|
+
|
|
+ public FirewallException(final String string) {
|
|
+ super(string);
|
|
+ }
|
|
+
|
|
+ public FirewallException(final String string, final Throwable throwable) {
|
|
+ super(string, throwable);
|
|
+ }
|
|
+}
|
|
\ No newline at end of file
|
|
diff --git a/flamecord/src/main/java/dev/_2lstudios/flamecord/firewall/FirewallManager.java b/flamecord/src/main/java/dev/_2lstudios/flamecord/firewall/FirewallManager.java
|
|
new file mode 100644
|
|
index 00000000..a90c8426
|
|
--- /dev/null
|
|
+++ b/flamecord/src/main/java/dev/_2lstudios/flamecord/firewall/FirewallManager.java
|
|
@@ -0,0 +1,101 @@
|
|
+package dev._2lstudios.flamecord.firewall;
|
|
+
|
|
+import java.net.InetSocketAddress;
|
|
+import java.net.SocketAddress;
|
|
+import java.util.Collection;
|
|
+import java.util.HashSet;
|
|
+import java.util.logging.Logger;
|
|
+
|
|
+import dev._2lstudios.flamecord.FlameCord;
|
|
+import dev._2lstudios.flamecord.configuration.FlameCordConfiguration;
|
|
+import lombok.Getter;
|
|
+
|
|
+public class FirewallManager {
|
|
+ private final Logger logger;
|
|
+ private final Collection<String> firewalled;
|
|
+ private final int defaultSeconds;
|
|
+ @Getter
|
|
+ private int seconds;
|
|
+
|
|
+ public FirewallManager(final Logger logger, final int defaultSeconds) {
|
|
+ this.logger = logger;
|
|
+ this.firewalled = new HashSet<>();
|
|
+ this.defaultSeconds = defaultSeconds;
|
|
+ this.seconds = defaultSeconds;
|
|
+ }
|
|
+
|
|
+ public void addFirewalled(final SocketAddress address) {
|
|
+ if (FlameCord.getInstance().getFlameCordConfiguration().isFirewallEnabled()) {
|
|
+ final InetSocketAddress iNetSocketAddress = (InetSocketAddress) address;
|
|
+ final String hostString = iNetSocketAddress.getHostString();
|
|
+
|
|
+ if (!this.firewalled.contains(hostString)) {
|
|
+ this.firewalled.add(hostString);
|
|
+ logAdded(address);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public void logAdded(final SocketAddress address) {
|
|
+ final FlameCord flameCord = FlameCord.getInstance();
|
|
+ final FlameCordConfiguration flameCordConfiguration = flameCord.getFlameCordConfiguration();
|
|
+
|
|
+ if (flameCordConfiguration.isFirewallNotify()) {
|
|
+ final InetSocketAddress iNetSocketAddress = (InetSocketAddress) address;
|
|
+ final String hostString = iNetSocketAddress.getHostString();
|
|
+
|
|
+ this.logger.info(flameCord.getMessagesConfiguration().getTranslation("firewall_added", hostString));
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public void logBlocked(final SocketAddress address) {
|
|
+ final FlameCord flameCord = FlameCord.getInstance();
|
|
+ final FlameCordConfiguration flameCordConfiguration = flameCord.getFlameCordConfiguration();
|
|
+
|
|
+ if (flameCordConfiguration.isFirewallNotify()) {
|
|
+ final InetSocketAddress iNetSocketAddress = (InetSocketAddress) address;
|
|
+ final String hostString = iNetSocketAddress.getHostString();
|
|
+
|
|
+ this.logger.info(flameCord.getMessagesConfiguration().getTranslation("firewall_blocked", hostString));
|
|
+ }
|
|
+ }
|
|
+
|
|
+ public Collection<String> getFirewalled() {
|
|
+ return this.firewalled;
|
|
+ }
|
|
+
|
|
+ public boolean isFirewalled(final SocketAddress address) {
|
|
+ final InetSocketAddress iNetSocketAddress = (InetSocketAddress) address;
|
|
+
|
|
+ return this.firewalled.contains(iNetSocketAddress.getHostString());
|
|
+ }
|
|
+
|
|
+ public boolean isFirewalled(final String name) {
|
|
+ final String nameLowerCase = name.toLowerCase();
|
|
+
|
|
+ for (final String string : FlameCord.getInstance().getFlameCordConfiguration().getFirewallNames()) {
|
|
+ if (nameLowerCase.contains(string)) {
|
|
+ return true;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ public void tick() {
|
|
+ if (--seconds <= 0) {
|
|
+ final FlameCord flameCord = FlameCord.getInstance();
|
|
+ final int size = this.firewalled.size();
|
|
+
|
|
+ if (size > 0) {
|
|
+ if (flameCord.getFlameCordConfiguration().isFirewallNotify()) {
|
|
+ this.logger.info(flameCord.getMessagesConfiguration().getTranslation("firewall_cleared", size));
|
|
+ }
|
|
+
|
|
+ this.firewalled.clear();
|
|
+ }
|
|
+
|
|
+ this.seconds = defaultSeconds;
|
|
+ }
|
|
+ }
|
|
+}
|
|
\ No newline at end of file
|
|
diff --git a/log/.factorypath b/log/.factorypath
|
|
new file mode 100644
|
|
index 00000000..542d5259
|
|
--- /dev/null
|
|
+++ b/log/.factorypath
|
|
@@ -0,0 +1,7 @@
|
|
+<factorypath>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/jline/jline/2.12.1/jline-2.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/gson/gson/2.8.0/gson-2.8.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/guava/guava/21.0/guava-21.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/findbugs/findbugs-annotations/3.0.1/findbugs-annotations-3.0.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.10/lombok-1.18.10.jar" enabled="true" runInBatchMode="false"/>
|
|
+</factorypath>
|
|
diff --git a/log/pom.xml b/log/pom.xml
|
|
index 3ef8acf2..e0177785 100644
|
|
--- a/log/pom.xml
|
|
+++ b/log/pom.xml
|
|
@@ -1,6 +1,5 @@
|
|
-
|
|
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
+<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
<modelVersion>4.0.0</modelVersion>
|
|
|
|
<parent>
|
|
diff --git a/log4j/.factorypath b/log4j/.factorypath
|
|
new file mode 100644
|
|
index 00000000..f08118bd
|
|
--- /dev/null
|
|
+++ b/log4j/.factorypath
|
|
@@ -0,0 +1,18 @@
|
|
+<factorypath>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-core/2.12.0/log4j-core-2.12.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-api/2.12.0/log4j-api-2.12.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-iostreams/2.12.0/log4j-iostreams-2.12.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-jul/2.12.0/log4j-jul-2.12.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-slf4j-impl/2.12.0/log4j-slf4j-impl-2.12.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/lmax/disruptor/3.4.2/disruptor-3.4.2.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/minecrell/terminalconsoleappender/1.0.0/terminalconsoleappender-1.0.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/jline/jline-reader/3.5.1/jline-reader-3.5.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/jline/jline-terminal/3.5.1/jline-terminal-3.5.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/jline/jline-terminal-jna/3.5.1/jline-terminal-jna-3.5.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/java/dev/jna/jna/4.4.0/jna-4.4.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/gson/gson/2.8.0/gson-2.8.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/guava/guava/21.0/guava-21.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/findbugs/findbugs-annotations/3.0.1/findbugs-annotations-3.0.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.10/lombok-1.18.10.jar" enabled="true" runInBatchMode="false"/>
|
|
+</factorypath>
|
|
diff --git a/log4j/pom.xml b/log4j/pom.xml
|
|
index ca18158f..bf76e567 100644
|
|
--- a/log4j/pom.xml
|
|
+++ b/log4j/pom.xml
|
|
@@ -1,5 +1,5 @@
|
|
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
+<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
<modelVersion>4.0.0</modelVersion>
|
|
|
|
<parent>
|
|
diff --git a/log4j/src/main/java/io/github/waterfallmc/waterfall/log4j/Log4JLogHandler.java b/log4j/src/main/java/io/github/waterfallmc/waterfall/log4j/Log4JLogHandler.java
|
|
index 63f66d3c..721cbb5e 100644
|
|
--- a/log4j/src/main/java/io/github/waterfallmc/waterfall/log4j/Log4JLogHandler.java
|
|
+++ b/log4j/src/main/java/io/github/waterfallmc/waterfall/log4j/Log4JLogHandler.java
|
|
@@ -16,9 +16,11 @@ import java.util.logging.LogRecord;
|
|
/**
|
|
* A {@link Handler} that forwards all log messages to the Log4J logger.
|
|
*
|
|
- * <p>We don't use Log4J's custom JUL LogManager currently, because it breaks
|
|
+ * <p>
|
|
+ * We don't use Log4J's custom JUL LogManager currently, because it breaks
|
|
* adding custom handlers to JUL loggers. Some plugins may depend on that
|
|
- * functionality...</p>
|
|
+ * functionality...
|
|
+ * </p>
|
|
*/
|
|
class Log4JLogHandler extends Handler {
|
|
|
|
diff --git a/log4j/src/main/resources/log4j2-bungee.xml b/log4j/src/main/resources/log4j2-bungee.xml
|
|
index 6e9c09c5..42059c2a 100644
|
|
--- a/log4j/src/main/resources/log4j2-bungee.xml
|
|
+++ b/log4j/src/main/resources/log4j2-bungee.xml
|
|
@@ -1,20 +1,21 @@
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!-- Log4j configuration that replicates the old BungeeCord logging setup -->
|
|
+<!-- FlameCord start - Fixed incorrect console format -->
|
|
<Configuration status="warn">
|
|
<Appenders>
|
|
<TerminalConsole name="TerminalConsole">
|
|
<PatternLayout>
|
|
- <LoggerNamePatternSelector defaultPattern="%highlightError{%d{HH:mm:ss} [%level] [%logger] %minecraftFormatting{%msg}%n%ex}">
|
|
+ <LoggerNamePatternSelector defaultPattern="%highlightError{[%d{HH:mm:ss}] [%level] [%logger]: %minecraftFormatting{%msg}%n%xEx}">
|
|
<!-- Log root and BungeeCord loggers without prefix -->
|
|
- <PatternMatch key=",BungeeCord" pattern="%highlightError{%d{HH:mm:ss} [%level] %minecraftFormatting{%msg}%n%ex}" />
|
|
+ <PatternMatch key=",BungeeCord" pattern="%highlightError{[%d{HH:mm:ss}] [%level]: %minecraftFormatting{%msg}%n%xEx}" />
|
|
</LoggerNamePatternSelector>
|
|
</PatternLayout>
|
|
</TerminalConsole>
|
|
<RollingRandomAccessFile name="File" fileName="proxy.log.0" filePattern="proxy.log.%i" immediateFlush="false">
|
|
<PatternLayout>
|
|
- <LoggerNamePatternSelector defaultPattern="%d{HH:mm:ss} [%level] [%logger] %minecraftFormatting{%msg}{strip}%n%ex">
|
|
+ <LoggerNamePatternSelector defaultPattern="[%d{HH:mm:ss}] [%t/%level] [%logger]: %minecraftFormatting{%msg}{strip}%n">
|
|
<!-- Log root and BungeeCord loggers without prefix -->
|
|
- <PatternMatch key=",BungeeCord" pattern="%d{HH:mm:ss} [%level] %minecraftFormatting{%msg}{strip}%n%ex" />
|
|
+ <PatternMatch key=",BungeeCord" pattern="[%d{HH:mm:ss}] [%t/%level]: %minecraftFormatting{%msg}{strip}%n" />
|
|
</LoggerNamePatternSelector>
|
|
</PatternLayout>
|
|
<Policies>
|
|
diff --git a/log4j/src/main/resources/log4j2.xml b/log4j/src/main/resources/log4j2.xml
|
|
index 3b3525f0..89352ebe 100644
|
|
--- a/log4j/src/main/resources/log4j2.xml
|
|
+++ b/log4j/src/main/resources/log4j2.xml
|
|
@@ -3,9 +3,9 @@
|
|
<Appenders>
|
|
<TerminalConsole name="TerminalConsole">
|
|
<PatternLayout>
|
|
- <LoggerNamePatternSelector defaultPattern="%highlightError{[%d{HH:mm:ss} %level] [%logger]: %minecraftFormatting{%msg}%n%xEx}">
|
|
+ <LoggerNamePatternSelector defaultPattern="%highlightError{[%d{HH:mm:ss}] [%level] [%logger]: %minecraftFormatting{%msg}%n%xEx}">
|
|
<!-- Log root and BungeeCord loggers without prefix -->
|
|
- <PatternMatch key=",BungeeCord" pattern="%highlightError{[%d{HH:mm:ss} %level]: %minecraftFormatting{%msg}%n%xEx}" />
|
|
+ <PatternMatch key=",BungeeCord" pattern="%highlightError{[%d{HH:mm:ss}] [%level]: %minecraftFormatting{%msg}%n%xEx}" />
|
|
</LoggerNamePatternSelector>
|
|
</PatternLayout>
|
|
</TerminalConsole>
|
|
diff --git a/module/cmd-alert/.factorypath b/module/cmd-alert/.factorypath
|
|
new file mode 100644
|
|
index 00000000..7a4b5ae4
|
|
--- /dev/null
|
|
+++ b/module/cmd-alert/.factorypath
|
|
@@ -0,0 +1,17 @@
|
|
+<factorypath>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/gson/gson/2.8.0/gson-2.8.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/md-5/brigadier/1.0.16-SNAPSHOT/brigadier-1.0.16-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec/4.1.51.Final/netty-codec-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/sf/trove4j/core/3.1.0/core-3.1.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/se/llbit/jo-nbt/1.3.0/jo-nbt-1.3.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport-native-unix-common/4.1.51.Final/netty-transport-native-unix-common-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-common/4.1.51.Final/netty-common-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-buffer/4.1.51.Final/netty-buffer-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport/4.1.51.Final/netty-transport-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver/4.1.51.Final/netty-resolver-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/yaml/snakeyaml/1.25/snakeyaml-1.25.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/guava/guava/21.0/guava-21.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/findbugs/findbugs-annotations/3.0.1/findbugs-annotations-3.0.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.10/lombok-1.18.10.jar" enabled="true" runInBatchMode="false"/>
|
|
+</factorypath>
|
|
diff --git a/module/cmd-alert/pom.xml b/module/cmd-alert/pom.xml
|
|
index 83bc7a7d..f45742c6 100644
|
|
--- a/module/cmd-alert/pom.xml
|
|
+++ b/module/cmd-alert/pom.xml
|
|
@@ -1,6 +1,5 @@
|
|
-
|
|
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
+<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
<modelVersion>4.0.0</modelVersion>
|
|
|
|
<parent>
|
|
diff --git a/module/cmd-find/.factorypath b/module/cmd-find/.factorypath
|
|
new file mode 100644
|
|
index 00000000..7a4b5ae4
|
|
--- /dev/null
|
|
+++ b/module/cmd-find/.factorypath
|
|
@@ -0,0 +1,17 @@
|
|
+<factorypath>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/gson/gson/2.8.0/gson-2.8.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/md-5/brigadier/1.0.16-SNAPSHOT/brigadier-1.0.16-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec/4.1.51.Final/netty-codec-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/sf/trove4j/core/3.1.0/core-3.1.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/se/llbit/jo-nbt/1.3.0/jo-nbt-1.3.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport-native-unix-common/4.1.51.Final/netty-transport-native-unix-common-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-common/4.1.51.Final/netty-common-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-buffer/4.1.51.Final/netty-buffer-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport/4.1.51.Final/netty-transport-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver/4.1.51.Final/netty-resolver-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/yaml/snakeyaml/1.25/snakeyaml-1.25.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/guava/guava/21.0/guava-21.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/findbugs/findbugs-annotations/3.0.1/findbugs-annotations-3.0.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.10/lombok-1.18.10.jar" enabled="true" runInBatchMode="false"/>
|
|
+</factorypath>
|
|
diff --git a/module/cmd-find/pom.xml b/module/cmd-find/pom.xml
|
|
index 42fb0a11..b717fb3b 100644
|
|
--- a/module/cmd-find/pom.xml
|
|
+++ b/module/cmd-find/pom.xml
|
|
@@ -1,6 +1,5 @@
|
|
-
|
|
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
+<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
<modelVersion>4.0.0</modelVersion>
|
|
|
|
<parent>
|
|
diff --git a/module/cmd-list/.factorypath b/module/cmd-list/.factorypath
|
|
new file mode 100644
|
|
index 00000000..7a4b5ae4
|
|
--- /dev/null
|
|
+++ b/module/cmd-list/.factorypath
|
|
@@ -0,0 +1,17 @@
|
|
+<factorypath>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/gson/gson/2.8.0/gson-2.8.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/md-5/brigadier/1.0.16-SNAPSHOT/brigadier-1.0.16-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec/4.1.51.Final/netty-codec-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/sf/trove4j/core/3.1.0/core-3.1.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/se/llbit/jo-nbt/1.3.0/jo-nbt-1.3.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport-native-unix-common/4.1.51.Final/netty-transport-native-unix-common-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-common/4.1.51.Final/netty-common-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-buffer/4.1.51.Final/netty-buffer-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport/4.1.51.Final/netty-transport-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver/4.1.51.Final/netty-resolver-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/yaml/snakeyaml/1.25/snakeyaml-1.25.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/guava/guava/21.0/guava-21.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/findbugs/findbugs-annotations/3.0.1/findbugs-annotations-3.0.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.10/lombok-1.18.10.jar" enabled="true" runInBatchMode="false"/>
|
|
+</factorypath>
|
|
diff --git a/module/cmd-list/pom.xml b/module/cmd-list/pom.xml
|
|
index cc2e55f9..9f3cf2f1 100644
|
|
--- a/module/cmd-list/pom.xml
|
|
+++ b/module/cmd-list/pom.xml
|
|
@@ -1,6 +1,5 @@
|
|
-
|
|
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
+<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
<modelVersion>4.0.0</modelVersion>
|
|
|
|
<parent>
|
|
diff --git a/module/cmd-send/.factorypath b/module/cmd-send/.factorypath
|
|
new file mode 100644
|
|
index 00000000..7a4b5ae4
|
|
--- /dev/null
|
|
+++ b/module/cmd-send/.factorypath
|
|
@@ -0,0 +1,17 @@
|
|
+<factorypath>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/gson/gson/2.8.0/gson-2.8.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/md-5/brigadier/1.0.16-SNAPSHOT/brigadier-1.0.16-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec/4.1.51.Final/netty-codec-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/sf/trove4j/core/3.1.0/core-3.1.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/se/llbit/jo-nbt/1.3.0/jo-nbt-1.3.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport-native-unix-common/4.1.51.Final/netty-transport-native-unix-common-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-common/4.1.51.Final/netty-common-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-buffer/4.1.51.Final/netty-buffer-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport/4.1.51.Final/netty-transport-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver/4.1.51.Final/netty-resolver-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/yaml/snakeyaml/1.25/snakeyaml-1.25.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/guava/guava/21.0/guava-21.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/findbugs/findbugs-annotations/3.0.1/findbugs-annotations-3.0.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.10/lombok-1.18.10.jar" enabled="true" runInBatchMode="false"/>
|
|
+</factorypath>
|
|
diff --git a/module/cmd-send/pom.xml b/module/cmd-send/pom.xml
|
|
index af82bb2c..7b5dae7a 100644
|
|
--- a/module/cmd-send/pom.xml
|
|
+++ b/module/cmd-send/pom.xml
|
|
@@ -1,6 +1,5 @@
|
|
-
|
|
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
+<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
<modelVersion>4.0.0</modelVersion>
|
|
|
|
<parent>
|
|
diff --git a/module/cmd-server/.factorypath b/module/cmd-server/.factorypath
|
|
new file mode 100644
|
|
index 00000000..7a4b5ae4
|
|
--- /dev/null
|
|
+++ b/module/cmd-server/.factorypath
|
|
@@ -0,0 +1,17 @@
|
|
+<factorypath>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/gson/gson/2.8.0/gson-2.8.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/md-5/brigadier/1.0.16-SNAPSHOT/brigadier-1.0.16-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec/4.1.51.Final/netty-codec-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/sf/trove4j/core/3.1.0/core-3.1.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/se/llbit/jo-nbt/1.3.0/jo-nbt-1.3.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport-native-unix-common/4.1.51.Final/netty-transport-native-unix-common-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-common/4.1.51.Final/netty-common-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-buffer/4.1.51.Final/netty-buffer-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport/4.1.51.Final/netty-transport-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver/4.1.51.Final/netty-resolver-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/yaml/snakeyaml/1.25/snakeyaml-1.25.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/guava/guava/21.0/guava-21.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/findbugs/findbugs-annotations/3.0.1/findbugs-annotations-3.0.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.10/lombok-1.18.10.jar" enabled="true" runInBatchMode="false"/>
|
|
+</factorypath>
|
|
diff --git a/module/cmd-server/pom.xml b/module/cmd-server/pom.xml
|
|
index 8d96679e..474e7eb4 100644
|
|
--- a/module/cmd-server/pom.xml
|
|
+++ b/module/cmd-server/pom.xml
|
|
@@ -1,6 +1,5 @@
|
|
-
|
|
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
+<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
<modelVersion>4.0.0</modelVersion>
|
|
|
|
<parent>
|
|
diff --git a/module/pom.xml b/module/pom.xml
|
|
index ca1f7487..51b58ada 100644
|
|
--- a/module/pom.xml
|
|
+++ b/module/pom.xml
|
|
@@ -1,6 +1,5 @@
|
|
-
|
|
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
+<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
<modelVersion>4.0.0</modelVersion>
|
|
|
|
<parent>
|
|
diff --git a/module/reconnect-yaml/.factorypath b/module/reconnect-yaml/.factorypath
|
|
new file mode 100644
|
|
index 00000000..7a4b5ae4
|
|
--- /dev/null
|
|
+++ b/module/reconnect-yaml/.factorypath
|
|
@@ -0,0 +1,17 @@
|
|
+<factorypath>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/gson/gson/2.8.0/gson-2.8.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/md-5/brigadier/1.0.16-SNAPSHOT/brigadier-1.0.16-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec/4.1.51.Final/netty-codec-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/sf/trove4j/core/3.1.0/core-3.1.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/se/llbit/jo-nbt/1.3.0/jo-nbt-1.3.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport-native-unix-common/4.1.51.Final/netty-transport-native-unix-common-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-common/4.1.51.Final/netty-common-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-buffer/4.1.51.Final/netty-buffer-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport/4.1.51.Final/netty-transport-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver/4.1.51.Final/netty-resolver-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/yaml/snakeyaml/1.25/snakeyaml-1.25.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/guava/guava/21.0/guava-21.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/findbugs/findbugs-annotations/3.0.1/findbugs-annotations-3.0.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.10/lombok-1.18.10.jar" enabled="true" runInBatchMode="false"/>
|
|
+</factorypath>
|
|
diff --git a/module/reconnect-yaml/pom.xml b/module/reconnect-yaml/pom.xml
|
|
index e6ee3cd8..23e319da 100644
|
|
--- a/module/reconnect-yaml/pom.xml
|
|
+++ b/module/reconnect-yaml/pom.xml
|
|
@@ -1,6 +1,5 @@
|
|
-
|
|
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
+<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
<modelVersion>4.0.0</modelVersion>
|
|
|
|
<parent>
|
|
diff --git a/native/.factorypath b/native/.factorypath
|
|
new file mode 100644
|
|
index 00000000..0b31e14c
|
|
--- /dev/null
|
|
+++ b/native/.factorypath
|
|
@@ -0,0 +1,9 @@
|
|
+<factorypath>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport/4.1.51.Final/netty-transport-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-common/4.1.51.Final/netty-common-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-buffer/4.1.51.Final/netty-buffer-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver/4.1.51.Final/netty-resolver-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/guava/guava/21.0/guava-21.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/findbugs/findbugs-annotations/3.0.1/findbugs-annotations-3.0.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.10/lombok-1.18.10.jar" enabled="true" runInBatchMode="false"/>
|
|
+</factorypath>
|
|
diff --git a/native/pom.xml b/native/pom.xml
|
|
index 28d1a02c..3aa9efa9 100644
|
|
--- a/native/pom.xml
|
|
+++ b/native/pom.xml
|
|
@@ -1,6 +1,5 @@
|
|
-
|
|
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
+<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
<modelVersion>4.0.0</modelVersion>
|
|
|
|
<parent>
|
|
diff --git a/pom.xml b/pom.xml
|
|
index 94e4aca2..7f0152ab 100644
|
|
--- a/pom.xml
|
|
+++ b/pom.xml
|
|
@@ -1,6 +1,5 @@
|
|
-
|
|
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
+<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
<modelVersion>4.0.0</modelVersion>
|
|
|
|
<parent>
|
|
@@ -47,6 +46,14 @@
|
|
<developer>
|
|
<id>fuzzybot</id>
|
|
</developer>
|
|
+ <!-- FlameCord start - Developers -->
|
|
+ <developer>
|
|
+ <id>LinsaFTW</id>
|
|
+ </developer>
|
|
+ <developer>
|
|
+ <id>Sammwy</id>
|
|
+ </developer>
|
|
+ <!-- FlameCord end - Developers -->
|
|
</developers>
|
|
|
|
<modules>
|
|
@@ -62,6 +69,8 @@
|
|
<module>proxy</module>
|
|
<module>query</module>
|
|
<module>native</module>
|
|
+ <!-- FlameCord - Add our module -->
|
|
+ <module>flamecord</module>
|
|
</modules>
|
|
|
|
<scm>
|
|
@@ -91,7 +100,7 @@
|
|
|
|
<properties>
|
|
<build.number>unknown</build.number>
|
|
- <netty.version>4.1.49.Final</netty.version>
|
|
+ <netty.version>4.1.51.Final</netty.version>
|
|
<maven.compiler.source>1.8</maven.compiler.source>
|
|
<maven.compiler.target>1.8</maven.compiler.target>
|
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
|
diff --git a/protocol/.factorypath b/protocol/.factorypath
|
|
new file mode 100644
|
|
index 00000000..739c34b9
|
|
--- /dev/null
|
|
+++ b/protocol/.factorypath
|
|
@@ -0,0 +1,14 @@
|
|
+<factorypath>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/md-5/brigadier/1.0.16-SNAPSHOT/brigadier-1.0.16-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/gson/gson/2.8.0/gson-2.8.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec/4.1.51.Final/netty-codec-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-common/4.1.51.Final/netty-common-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-buffer/4.1.51.Final/netty-buffer-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport/4.1.51.Final/netty-transport-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver/4.1.51.Final/netty-resolver-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/sf/trove4j/core/3.1.0/core-3.1.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/se/llbit/jo-nbt/1.3.0/jo-nbt-1.3.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/guava/guava/21.0/guava-21.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/findbugs/findbugs-annotations/3.0.1/findbugs-annotations-3.0.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.10/lombok-1.18.10.jar" enabled="true" runInBatchMode="false"/>
|
|
+</factorypath>
|
|
diff --git a/protocol/pom.xml b/protocol/pom.xml
|
|
index ba3ffe3d..bdb8b8c8 100644
|
|
--- a/protocol/pom.xml
|
|
+++ b/protocol/pom.xml
|
|
@@ -1,6 +1,5 @@
|
|
-
|
|
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
+<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
<modelVersion>4.0.0</modelVersion>
|
|
|
|
<parent>
|
|
@@ -46,6 +45,14 @@
|
|
<version>${project.version}</version>
|
|
<scope>compile</scope>
|
|
</dependency>
|
|
+ <!-- FlameCord start - Imports -->
|
|
+ <dependency>
|
|
+ <groupId>dev._2lstudios.flamecord</groupId>
|
|
+ <artifactId>travertine-flamecord</artifactId>
|
|
+ <version>${project.version}</version>
|
|
+ <scope>compile</scope>
|
|
+ </dependency>
|
|
+ <!-- FlameCord end - Imports -->
|
|
<dependency>
|
|
<groupId>io.netty</groupId>
|
|
<artifactId>netty-codec</artifactId>
|
|
diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/DefinedPacket.java b/protocol/src/main/java/net/md_5/bungee/protocol/DefinedPacket.java
|
|
index 6ba7ae70..e7a5682b 100644
|
|
--- a/protocol/src/main/java/net/md_5/bungee/protocol/DefinedPacket.java
|
|
+++ b/protocol/src/main/java/net/md_5/bungee/protocol/DefinedPacket.java
|
|
@@ -11,151 +11,140 @@ import java.io.IOException;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.UUID;
|
|
+
|
|
+import com.google.common.base.Charsets;
|
|
+
|
|
+import io.netty.buffer.ByteBuf;
|
|
import lombok.RequiredArgsConstructor;
|
|
import se.llbit.nbt.NamedTag;
|
|
import se.llbit.nbt.Tag;
|
|
|
|
@RequiredArgsConstructor
|
|
-public abstract class DefinedPacket
|
|
-{
|
|
+public abstract class DefinedPacket {
|
|
|
|
private static final boolean PROCESS_TRACES = Boolean.getBoolean("waterfall.bad-packet-traces");
|
|
- private static final BadPacketException OVERSIZED_VAR_INT_EXCEPTION = new BadPacketException( "VarInt too big" );
|
|
- private static final BadPacketException NO_MORE_BYTES_EXCEPTION = new BadPacketException("No more bytes reading varint");
|
|
- public static void writeString(String s, ByteBuf buf)
|
|
- {
|
|
- if ( s.length() > Short.MAX_VALUE )
|
|
- {
|
|
- throw new OverflowPacketException( String.format( "Cannot send string longer than Short.MAX_VALUE (got %s characters)", s.length() ) );
|
|
+ private static final BadPacketException OVERSIZED_VAR_INT_EXCEPTION = new BadPacketException("VarInt too big");
|
|
+ private static final BadPacketException NO_MORE_BYTES_EXCEPTION = new BadPacketException(
|
|
+ "No more bytes reading varint");
|
|
+
|
|
+ public static void writeString(String s, ByteBuf buf) {
|
|
+ if (s.length() > Short.MAX_VALUE) {
|
|
+ throw new OverflowPacketException(
|
|
+ String.format("Cannot send string longer than Short.MAX_VALUE (got %s characters)", s.length()));
|
|
}
|
|
|
|
- byte[] b = s.getBytes( Charsets.UTF_8 );
|
|
- writeVarInt( b.length, buf );
|
|
- buf.writeBytes( b );
|
|
+ byte[] b = s.getBytes(Charsets.UTF_8);
|
|
+ writeVarInt(b.length, buf);
|
|
+ buf.writeBytes(b);
|
|
}
|
|
|
|
- public static String readString(ByteBuf buf)
|
|
- {
|
|
- int len = readVarInt( buf );
|
|
- if ( len > Short.MAX_VALUE )
|
|
- {
|
|
- throw new OverflowPacketException( String.format( "Cannot receive string longer than Short.MAX_VALUE (got %s characters)", len ) );
|
|
+ public static String readString(ByteBuf buf) {
|
|
+ int len = readVarInt(buf);
|
|
+ if (len > Short.MAX_VALUE) {
|
|
+ throw new OverflowPacketException(
|
|
+ String.format("Cannot receive string longer than Short.MAX_VALUE (got %s characters)", len));
|
|
}
|
|
|
|
- byte[] b = new byte[ len ];
|
|
- buf.readBytes( b );
|
|
+ byte[] b = new byte[len];
|
|
+ buf.readBytes(b);
|
|
|
|
- return new String( b, Charsets.UTF_8 );
|
|
+ return new String(b, Charsets.UTF_8);
|
|
}
|
|
|
|
// Waterfall start
|
|
- public static void writeString(String s, final int maxLength, ByteBuf buf)
|
|
- {
|
|
- if ( s.length() > maxLength )
|
|
- {
|
|
- throw new OverflowPacketException( String.format( "Cannot send string longer than %s (got %s characters)", maxLength, s.length() ) );
|
|
+ public static void writeString(String s, final int maxLength, ByteBuf buf) {
|
|
+ if (s.length() > maxLength) {
|
|
+ throw new OverflowPacketException(
|
|
+ String.format("Cannot send string longer than %s (got %s characters)", maxLength, s.length()));
|
|
}
|
|
|
|
- byte[] b = s.getBytes( Charsets.UTF_8 );
|
|
- writeVarInt( b.length, buf );
|
|
- buf.writeBytes( b );
|
|
+ byte[] b = s.getBytes(Charsets.UTF_8);
|
|
+ writeVarInt(b.length, buf);
|
|
+ buf.writeBytes(b);
|
|
}
|
|
|
|
- public static String readString(ByteBuf buf, final int maxLength)
|
|
- {
|
|
- int len = readVarInt( buf );
|
|
- if ( len > maxLength )
|
|
- {
|
|
- throw new OverflowPacketException( String.format( "Cannot receive string longer than %s (got %s characters)", maxLength, len ) );
|
|
+ public static String readString(ByteBuf buf, final int maxLength) {
|
|
+ int len = readVarInt(buf);
|
|
+ if (len > maxLength) {
|
|
+ throw new OverflowPacketException(
|
|
+ String.format("Cannot receive string longer than %s (got %s characters)", maxLength, len));
|
|
}
|
|
|
|
- byte[] b = new byte[ len ];
|
|
- buf.readBytes( b );
|
|
+ byte[] b = new byte[len];
|
|
+ buf.readBytes(b);
|
|
|
|
- return new String( b, Charsets.UTF_8 );
|
|
+ return new String(b, Charsets.UTF_8);
|
|
}
|
|
// Waterfall end
|
|
|
|
- public static void writeArray(byte[] b, ByteBuf buf)
|
|
- {
|
|
- if ( b.length > Short.MAX_VALUE )
|
|
- {
|
|
- throw new OverflowPacketException( String.format( "Cannot send byte array longer than Short.MAX_VALUE (got %s bytes)", b.length ) );
|
|
+ public static void writeArray(byte[] b, ByteBuf buf) {
|
|
+ if (b.length > Short.MAX_VALUE) {
|
|
+ throw new OverflowPacketException(
|
|
+ String.format("Cannot send byte array longer than Short.MAX_VALUE (got %s bytes)", b.length));
|
|
}
|
|
- writeVarInt( b.length, buf );
|
|
- buf.writeBytes( b );
|
|
+ writeVarInt(b.length, buf);
|
|
+ buf.writeBytes(b);
|
|
}
|
|
|
|
- public static byte[] toArray(ByteBuf buf)
|
|
- {
|
|
- byte[] ret = new byte[ buf.readableBytes() ];
|
|
- buf.readBytes( ret );
|
|
+ public static byte[] toArray(ByteBuf buf) {
|
|
+ byte[] ret = new byte[buf.readableBytes()];
|
|
+ buf.readBytes(ret);
|
|
|
|
return ret;
|
|
}
|
|
|
|
- public static byte[] readArray(ByteBuf buf)
|
|
- {
|
|
- return readArray( buf, buf.readableBytes() );
|
|
+ public static byte[] readArray(ByteBuf buf) {
|
|
+ return readArray(buf, buf.readableBytes());
|
|
}
|
|
|
|
- public static byte[] readArray(ByteBuf buf, int limit)
|
|
- {
|
|
- int len = readVarInt( buf );
|
|
- if ( len > limit )
|
|
- {
|
|
- throw new OverflowPacketException( String.format( "Cannot receive byte array longer than %s (got %s bytes)", limit, len ) );
|
|
+ public static byte[] readArray(ByteBuf buf, int limit) {
|
|
+ int len = readVarInt(buf);
|
|
+ if (len > limit) {
|
|
+ throw new OverflowPacketException(
|
|
+ String.format("Cannot receive byte array longer than %s (got %s bytes)", limit, len));
|
|
}
|
|
- byte[] ret = new byte[ len ];
|
|
- buf.readBytes( ret );
|
|
+ byte[] ret = new byte[len];
|
|
+ buf.readBytes(ret);
|
|
return ret;
|
|
}
|
|
|
|
- public static int[] readVarIntArray(ByteBuf buf)
|
|
- {
|
|
- int len = readVarInt( buf );
|
|
- int[] ret = new int[ len ];
|
|
+ public static int[] readVarIntArray(ByteBuf buf) {
|
|
+ int len = readVarInt(buf);
|
|
+ int[] ret = new int[len];
|
|
|
|
- for ( int i = 0; i < len; i++ )
|
|
- {
|
|
- ret[i] = readVarInt( buf );
|
|
+ for (int i = 0; i < len; i++) {
|
|
+ ret[i] = readVarInt(buf);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
- public static void writeStringArray(List<String> s, ByteBuf buf)
|
|
- {
|
|
- writeVarInt( s.size(), buf );
|
|
- for ( String str : s )
|
|
- {
|
|
- writeString( str, buf );
|
|
+ public static void writeStringArray(List<String> s, ByteBuf buf) {
|
|
+ writeVarInt(s.size(), buf);
|
|
+ for (String str : s) {
|
|
+ writeString(str, buf);
|
|
}
|
|
}
|
|
|
|
- public static List<String> readStringArray(ByteBuf buf)
|
|
- {
|
|
- int len = readVarInt( buf );
|
|
- List<String> ret = new ArrayList<>( len );
|
|
- for ( int i = 0; i < len; i++ )
|
|
- {
|
|
- ret.add( readString( buf ) );
|
|
+ public static List<String> readStringArray(ByteBuf buf) {
|
|
+ int len = readVarInt(buf);
|
|
+ List<String> ret = new ArrayList<>(len);
|
|
+ for (int i = 0; i < len; i++) {
|
|
+ ret.add(readString(buf));
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
- public static int readVarInt(ByteBuf input)
|
|
- {
|
|
- return readVarInt( input, 5 );
|
|
+ public static int readVarInt(ByteBuf input) {
|
|
+ return readVarInt(input, 5);
|
|
}
|
|
|
|
- public static int readVarInt(ByteBuf input, int maxBytes)
|
|
- {
|
|
+ public static int readVarInt(ByteBuf input, int maxBytes) {
|
|
int out = 0;
|
|
int bytes = 0;
|
|
byte in;
|
|
- while ( true )
|
|
- {
|
|
+
|
|
+ while (true) {
|
|
// Waterfall start
|
|
if (input.readableBytes() == 0) {
|
|
throw PROCESS_TRACES ? new BadPacketException("No more bytes reading varint") : NO_MORE_BYTES_EXCEPTION;
|
|
@@ -163,15 +152,13 @@ public abstract class DefinedPacket
|
|
// Waterfall end
|
|
in = input.readByte();
|
|
|
|
- out |= ( in & 0x7F ) << ( bytes++ * 7 );
|
|
+ out |= (in & 0x7F) << (bytes++ * 7);
|
|
|
|
- if ( bytes > maxBytes )
|
|
- {
|
|
- throw PROCESS_TRACES ? new BadPacketException( "VarInt too big" ) : OVERSIZED_VAR_INT_EXCEPTION;
|
|
+ if (bytes > maxBytes) {
|
|
+ throw PROCESS_TRACES ? new BadPacketException("VarInt too big") : OVERSIZED_VAR_INT_EXCEPTION;
|
|
}
|
|
|
|
- if ( ( in & 0x80 ) != 0x80 )
|
|
- {
|
|
+ if ((in & 0x80) != 0x80) {
|
|
break;
|
|
}
|
|
}
|
|
@@ -179,112 +166,91 @@ public abstract class DefinedPacket
|
|
return out;
|
|
}
|
|
|
|
- public static void writeVarInt(int value, ByteBuf output)
|
|
- {
|
|
+ public static void writeVarInt(int value, ByteBuf output) {
|
|
int part;
|
|
- while ( true )
|
|
- {
|
|
+ while (true) {
|
|
part = value & 0x7F;
|
|
|
|
value >>>= 7;
|
|
- if ( value != 0 )
|
|
- {
|
|
+ if (value != 0) {
|
|
part |= 0x80;
|
|
}
|
|
|
|
- output.writeByte( part );
|
|
+ output.writeByte(part);
|
|
|
|
- if ( value == 0 )
|
|
- {
|
|
+ if (value == 0) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
- public static int readVarShort(ByteBuf buf)
|
|
- {
|
|
+ public static int readVarShort(ByteBuf buf) {
|
|
int low = buf.readUnsignedShort();
|
|
int high = 0;
|
|
- if ( ( low & 0x8000 ) != 0 )
|
|
- {
|
|
+ if ((low & 0x8000) != 0) {
|
|
low = low & 0x7FFF;
|
|
high = buf.readUnsignedByte();
|
|
}
|
|
- return ( ( high & 0xFF ) << 15 ) | low;
|
|
+ return ((high & 0xFF) << 15) | low;
|
|
}
|
|
|
|
- public static void writeVarShort(ByteBuf buf, int toWrite)
|
|
- {
|
|
+ public static void writeVarShort(ByteBuf buf, int toWrite) {
|
|
int low = toWrite & 0x7FFF;
|
|
- int high = ( toWrite & 0x7F8000 ) >> 15;
|
|
- if ( high != 0 )
|
|
- {
|
|
+ int high = (toWrite & 0x7F8000) >> 15;
|
|
+ if (high != 0) {
|
|
low = low | 0x8000;
|
|
}
|
|
- buf.writeShort( low );
|
|
- if ( high != 0 )
|
|
- {
|
|
- buf.writeByte( high );
|
|
+ buf.writeShort(low);
|
|
+ if (high != 0) {
|
|
+ buf.writeByte(high);
|
|
}
|
|
}
|
|
|
|
- public static void writeUUID(UUID value, ByteBuf output)
|
|
- {
|
|
- output.writeLong( value.getMostSignificantBits() );
|
|
- output.writeLong( value.getLeastSignificantBits() );
|
|
+ public static void writeUUID(UUID value, ByteBuf output) {
|
|
+ output.writeLong(value.getMostSignificantBits());
|
|
+ output.writeLong(value.getLeastSignificantBits());
|
|
}
|
|
|
|
- public static UUID readUUID(ByteBuf input)
|
|
- {
|
|
- return new UUID( input.readLong(), input.readLong() );
|
|
+ public static UUID readUUID(ByteBuf input) {
|
|
+ return new UUID(input.readLong(), input.readLong());
|
|
}
|
|
|
|
- public static Tag readTag(ByteBuf input)
|
|
- {
|
|
- Tag tag = NamedTag.read( new DataInputStream( new ByteBufInputStream( input ) ) );
|
|
- Preconditions.checkArgument( !tag.isError(), "Error reading tag: %s", tag.error() );
|
|
+ public static Tag readTag(ByteBuf input) {
|
|
+ Tag tag = NamedTag.read(new DataInputStream(new ByteBufInputStream(input)));
|
|
+ Preconditions.checkArgument(!tag.isError(), "Error reading tag: %s", tag.error());
|
|
return tag;
|
|
}
|
|
|
|
- public static void writeTag(Tag tag, ByteBuf output)
|
|
- {
|
|
- try
|
|
- {
|
|
- tag.write( new DataOutputStream( new ByteBufOutputStream( output ) ) );
|
|
- } catch ( IOException ex )
|
|
- {
|
|
- throw new RuntimeException( "Exception writing tag", ex );
|
|
+ public static void writeTag(Tag tag, ByteBuf output) {
|
|
+ try {
|
|
+ tag.write(new DataOutputStream(new ByteBufOutputStream(output)));
|
|
+ } catch (IOException ex) {
|
|
+ throw new RuntimeException("Exception writing tag", ex);
|
|
}
|
|
}
|
|
|
|
- public void read(ByteBuf buf)
|
|
- {
|
|
- throw new UnsupportedOperationException( "Packet must implement read method" );
|
|
+ public void read(ByteBuf buf) {
|
|
+ throw new UnsupportedOperationException("Packet must implement read method");
|
|
}
|
|
|
|
- public void read(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion)
|
|
- {
|
|
- read( buf );
|
|
+ public void read(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion) {
|
|
+ read(buf);
|
|
}
|
|
|
|
- public void read0(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion)
|
|
- {
|
|
- read( buf, direction, protocolVersion );
|
|
+ public void read0(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion) {
|
|
+ read(buf, direction, protocolVersion);
|
|
}
|
|
|
|
- public void write(ByteBuf buf)
|
|
- {
|
|
- throw new UnsupportedOperationException( "Packet must implement write method" );
|
|
+ public void write(ByteBuf buf) {
|
|
+ throw new UnsupportedOperationException("Packet must implement write method");
|
|
}
|
|
|
|
- public void write(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion)
|
|
- {
|
|
- write( buf );
|
|
+ public void write(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion) {
|
|
+ write(buf);
|
|
}
|
|
|
|
- public void write0(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion)
|
|
- {
|
|
- write( buf, direction, protocolVersion );
|
|
+ public void write0(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion) {
|
|
+ write(buf, direction, protocolVersion);
|
|
}
|
|
|
|
public abstract void handle(AbstractPacketHandler handler) throws Exception;
|
|
diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/LegacyDecoder.java b/protocol/src/main/java/net/md_5/bungee/protocol/LegacyDecoder.java
|
|
index 5518bf26..b70f236b 100644
|
|
--- a/protocol/src/main/java/net/md_5/bungee/protocol/LegacyDecoder.java
|
|
+++ b/protocol/src/main/java/net/md_5/bungee/protocol/LegacyDecoder.java
|
|
@@ -1,46 +1,42 @@
|
|
package net.md_5.bungee.protocol;
|
|
|
|
+import java.util.List;
|
|
+
|
|
import io.netty.buffer.ByteBuf;
|
|
import io.netty.buffer.Unpooled;
|
|
import io.netty.channel.ChannelHandlerContext;
|
|
import io.netty.handler.codec.ByteToMessageDecoder;
|
|
-import java.util.List;
|
|
import net.md_5.bungee.protocol.packet.LegacyHandshake;
|
|
import net.md_5.bungee.protocol.packet.LegacyPing;
|
|
|
|
-public class LegacyDecoder extends ByteToMessageDecoder
|
|
-{
|
|
+public class LegacyDecoder extends ByteToMessageDecoder {
|
|
|
|
@Override
|
|
- protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception
|
|
- {
|
|
+ protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
|
|
// See check in Varint21FrameDecoder for more details
|
|
- if ( !ctx.channel().isActive() )
|
|
- {
|
|
- in.skipBytes( in.readableBytes() );
|
|
+ if (!ctx.channel().isActive()) {
|
|
+ in.skipBytes(in.readableBytes());
|
|
return;
|
|
}
|
|
|
|
- if ( !in.isReadable() )
|
|
- {
|
|
+ if (!in.isReadable()) {
|
|
return;
|
|
}
|
|
|
|
in.markReaderIndex();
|
|
short packetID = in.readUnsignedByte();
|
|
|
|
- if ( packetID == 0xFE )
|
|
- {
|
|
- out.add( new PacketWrapper( new LegacyPing( in.isReadable() && in.readUnsignedByte() == 0x01 ), Unpooled.EMPTY_BUFFER ) );
|
|
+ if (packetID == 0xFE) {
|
|
+ out.add(new PacketWrapper(new LegacyPing(in.isReadable() && in.readUnsignedByte() == 0x01),
|
|
+ Unpooled.EMPTY_BUFFER));
|
|
return;
|
|
- } else if ( packetID == 0x02 && in.isReadable() )
|
|
- {
|
|
- in.skipBytes( in.readableBytes() );
|
|
- out.add( new PacketWrapper( new LegacyHandshake(), Unpooled.EMPTY_BUFFER ) );
|
|
+ } else if (packetID == 0x02 && in.isReadable()) {
|
|
+ in.skipBytes(in.readableBytes());
|
|
+ out.add(new PacketWrapper(new LegacyHandshake(), Unpooled.EMPTY_BUFFER));
|
|
return;
|
|
}
|
|
|
|
in.resetReaderIndex();
|
|
- ctx.pipeline().remove( this );
|
|
+ ctx.pipeline().remove(this);
|
|
}
|
|
}
|
|
diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftDecoder.java b/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftDecoder.java
|
|
index ec932e92..c0f36ff3 100644
|
|
--- a/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftDecoder.java
|
|
+++ b/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftDecoder.java
|
|
@@ -1,5 +1,8 @@
|
|
package net.md_5.bungee.protocol;
|
|
|
|
+import java.util.List;
|
|
+
|
|
+import dev._2lstudios.flamecord.FlameCord;
|
|
import io.netty.buffer.ByteBuf;
|
|
import io.netty.buffer.ByteBufUtil;
|
|
import io.netty.channel.ChannelHandlerContext;
|
|
@@ -8,11 +11,8 @@ import io.netty.handler.codec.MessageToMessageDecoder;
|
|
import lombok.AllArgsConstructor;
|
|
import lombok.Setter;
|
|
|
|
-import java.util.List;
|
|
-
|
|
@AllArgsConstructor
|
|
-public class MinecraftDecoder extends MessageToMessageDecoder<ByteBuf>
|
|
-{
|
|
+public class MinecraftDecoder extends MessageToMessageDecoder<ByteBuf> {
|
|
|
|
@Setter
|
|
private Protocol protocol;
|
|
@@ -29,46 +29,51 @@ public class MinecraftDecoder extends MessageToMessageDecoder<ByteBuf>
|
|
}
|
|
|
|
@Override
|
|
- protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception
|
|
- {
|
|
- // See Varint21FrameDecoder for the general reasoning. We add this here as ByteToMessageDecoder#handlerRemoved()
|
|
- // will fire any cumulated data through the pipeline, so we want to try and stop it here.
|
|
- if ( !ctx.channel().isActive() )
|
|
- {
|
|
+ protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
|
|
+ // FlameCord - Apply astei patches
|
|
+ // See Varint21FrameDecoder for the general reasoning. We add this here as
|
|
+ // ByteToMessageDecoder#handlerRemoved()
|
|
+ // will fire any cumulated data through the pipeline, so we want to try and stop
|
|
+ // it here.
|
|
+ if (!ctx.channel().isActive()) {
|
|
return;
|
|
}
|
|
|
|
- Protocol.DirectionData prot = ( server ) ? protocol.TO_SERVER : protocol.TO_CLIENT;
|
|
+ Protocol.DirectionData prot = (server) ? protocol.TO_SERVER : protocol.TO_CLIENT;
|
|
+
|
|
+ // FlameCord - Check size before decoding
|
|
+ if (prot == protocol.TO_SERVER && in.readableBytes() > 2097152) {
|
|
+ throw new DecoderException("Error decoding packet with too big size");
|
|
+ }
|
|
+
|
|
ByteBuf slice = in.copy(); // Can't slice this one due to EntityMap :(
|
|
|
|
Object packetTypeInfo = null;
|
|
- try
|
|
- {
|
|
+ try {
|
|
// Waterfall start
|
|
if (in.readableBytes() == 0) {
|
|
return;
|
|
}
|
|
// Waterfall end
|
|
|
|
- int packetId = DefinedPacket.readVarInt( in );
|
|
+ int packetId = DefinedPacket.readVarInt(in);
|
|
+
|
|
packetTypeInfo = packetId;
|
|
|
|
- DefinedPacket packet = prot.createPacket( packetId, protocolVersion, supportsForge );
|
|
- if ( packet != null )
|
|
- {
|
|
+ DefinedPacket packet = prot.createPacket(packetId, protocolVersion, supportsForge);
|
|
+ if (packet != null) {
|
|
packetTypeInfo = packet.getClass();
|
|
- packet.read0( in, prot.getDirection(), protocolVersion );
|
|
+ packet.read0(in, prot.getDirection(), protocolVersion);
|
|
|
|
- if ( in.isReadable() )
|
|
- {
|
|
- throw new BadPacketException( "Did not read all bytes from packet " + packet.getClass() + " " + packetId + " Protocol " + protocol + " Direction " + prot.getDirection() );
|
|
+ if (in.isReadable()) {
|
|
+ throw new BadPacketException("Did not read all bytes from packet " + packet.getClass() + " "
|
|
+ + packetId + " Protocol " + protocol + " Direction " + prot.getDirection());
|
|
}
|
|
- } else
|
|
- {
|
|
- in.skipBytes( in.readableBytes() );
|
|
+ } else {
|
|
+ in.skipBytes(in.readableBytes());
|
|
}
|
|
|
|
- out.add( new PacketWrapper( packet, slice ) );
|
|
+ out.add(new PacketWrapper(packet, slice));
|
|
slice = null;
|
|
} catch (BadPacketException | IndexOutOfBoundsException e) {
|
|
final String packetTypeStr;
|
|
@@ -79,11 +84,18 @@ public class MinecraftDecoder extends MessageToMessageDecoder<ByteBuf>
|
|
} else {
|
|
packetTypeStr = "unknown";
|
|
}
|
|
- throw new FastDecoderException("Error decoding packet " + packetTypeStr + " with contents:\n" + ByteBufUtil.prettyHexDump(slice), e); // Waterfall
|
|
- } finally
|
|
- {
|
|
- if ( slice != null )
|
|
- {
|
|
+ // FlameCord - Toggle dumping packet info
|
|
+ // throw new FastDecoderException("Error decoding packet " + packetTypeStr + "
|
|
+ // with contents:\n" + ByteBufUtil.prettyHexDump(slice), e); // Waterfall
|
|
+ if (FlameCord.getInstance().getFlameCordConfiguration().isLoggerDump()) {
|
|
+ throw new DecoderException("Error decoding packet " + packetTypeStr + " with contents:\n"
|
|
+ + ByteBufUtil.prettyHexDump(slice) + " Direction " + prot.getDirection(), e);
|
|
+ } else {
|
|
+ throw new DecoderException(
|
|
+ "Error decoding packet " + packetTypeStr + " Direction " + prot.getDirection(), e);
|
|
+ }
|
|
+ } finally {
|
|
+ if (slice != null) {
|
|
slice.release();
|
|
}
|
|
}
|
|
diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftEncoder.java b/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftEncoder.java
|
|
index 9aac7ca9..009af589 100644
|
|
--- a/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftEncoder.java
|
|
+++ b/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftEncoder.java
|
|
@@ -7,8 +7,7 @@ import lombok.AllArgsConstructor;
|
|
import lombok.Setter;
|
|
|
|
@AllArgsConstructor
|
|
-public class MinecraftEncoder extends MessageToByteEncoder<DefinedPacket>
|
|
-{
|
|
+public class MinecraftEncoder extends MessageToByteEncoder<DefinedPacket> {
|
|
|
|
@Setter
|
|
private Protocol protocol;
|
|
@@ -17,10 +16,9 @@ public class MinecraftEncoder extends MessageToByteEncoder<DefinedPacket>
|
|
private int protocolVersion;
|
|
|
|
@Override
|
|
- protected void encode(ChannelHandlerContext ctx, DefinedPacket msg, ByteBuf out) throws Exception
|
|
- {
|
|
- Protocol.DirectionData prot = ( server ) ? protocol.TO_CLIENT : protocol.TO_SERVER;
|
|
- DefinedPacket.writeVarInt( prot.getId( msg.getClass(), protocolVersion ), out );
|
|
- msg.write0( out, prot.getDirection(), protocolVersion );
|
|
+ protected void encode(ChannelHandlerContext ctx, DefinedPacket msg, ByteBuf out) throws Exception {
|
|
+ Protocol.DirectionData prot = (server) ? protocol.TO_CLIENT : protocol.TO_SERVER;
|
|
+ DefinedPacket.writeVarInt(prot.getId(msg.getClass(), protocolVersion), out);
|
|
+ msg.write0(out, prot.getDirection(), protocolVersion);
|
|
}
|
|
}
|
|
diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/Protocol.java b/protocol/src/main/java/net/md_5/bungee/protocol/Protocol.java
|
|
index 1feee418..b17d8c92 100644
|
|
--- a/protocol/src/main/java/net/md_5/bungee/protocol/Protocol.java
|
|
+++ b/protocol/src/main/java/net/md_5/bungee/protocol/Protocol.java
|
|
@@ -1,12 +1,14 @@
|
|
package net.md_5.bungee.protocol;
|
|
|
|
+import java.lang.reflect.Constructor;
|
|
+
|
|
import com.google.common.base.Preconditions;
|
|
import com.google.common.collect.Iterables;
|
|
+
|
|
import gnu.trove.map.TIntObjectMap;
|
|
import gnu.trove.map.TObjectIntMap;
|
|
import gnu.trove.map.hash.TIntObjectHashMap;
|
|
import gnu.trove.map.hash.TObjectIntHashMap;
|
|
-import java.lang.reflect.Constructor;
|
|
import lombok.Data;
|
|
import lombok.Getter;
|
|
import net.md_5.bungee.protocol.packet.BossBar;
|
|
@@ -15,10 +17,10 @@ import net.md_5.bungee.protocol.packet.ClientSettings;
|
|
import net.md_5.bungee.protocol.packet.Commands;
|
|
import net.md_5.bungee.protocol.packet.EncryptionRequest;
|
|
import net.md_5.bungee.protocol.packet.EncryptionResponse;
|
|
-import net.md_5.bungee.protocol.packet.EntityStatus;
|
|
-import net.md_5.bungee.protocol.packet.GameState;
|
|
import net.md_5.bungee.protocol.packet.EntityEffect;
|
|
import net.md_5.bungee.protocol.packet.EntityRemoveEffect;
|
|
+import net.md_5.bungee.protocol.packet.EntityStatus;
|
|
+import net.md_5.bungee.protocol.packet.GameState;
|
|
import net.md_5.bungee.protocol.packet.Handshake;
|
|
import net.md_5.bungee.protocol.packet.KeepAlive;
|
|
import net.md_5.bungee.protocol.packet.Kick;
|
|
@@ -44,578 +46,506 @@ import net.md_5.bungee.protocol.packet.Team;
|
|
import net.md_5.bungee.protocol.packet.Title;
|
|
import net.md_5.bungee.protocol.packet.ViewDistance;
|
|
|
|
-public enum Protocol
|
|
-{
|
|
+public enum Protocol {
|
|
|
|
- // Undef
|
|
- HANDSHAKE
|
|
- {
|
|
+ // Undef
|
|
+ HANDSHAKE {
|
|
|
|
- {
|
|
- TO_SERVER.registerPacket(
|
|
- Handshake.class,
|
|
- Handshake::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x00 ) // Travertine
|
|
- );
|
|
- }
|
|
- },
|
|
- // 0
|
|
- GAME
|
|
- {
|
|
-
|
|
- {
|
|
- TO_CLIENT.registerPacket(
|
|
- KeepAlive.class,
|
|
- KeepAlive::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x00 ), // Travertine
|
|
- map( ProtocolConstants.MINECRAFT_1_9, 0x1F ),
|
|
- map( ProtocolConstants.MINECRAFT_1_13, 0x21 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_14, 0x20 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_15, 0x21 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16, 0x20 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16_2, 0x1F )
|
|
- );
|
|
- TO_CLIENT.registerPacket(
|
|
- Login.class,
|
|
- Login::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x01 ), // Travertine
|
|
- map( ProtocolConstants.MINECRAFT_1_9, 0x23 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_13, 0x25 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_15, 0x26 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16, 0x25 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16_2, 0x24 )
|
|
- );
|
|
- TO_CLIENT.registerPacket(
|
|
- Chat.class,
|
|
- Chat::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x02 ), // Travertine
|
|
- map( ProtocolConstants.MINECRAFT_1_9, 0x0F ),
|
|
- map( ProtocolConstants.MINECRAFT_1_13, 0x0E ),
|
|
- map( ProtocolConstants.MINECRAFT_1_15, 0x0F ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16, 0x0E )
|
|
- );
|
|
- TO_CLIENT.registerPacket(
|
|
- Respawn.class,
|
|
- Respawn::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x07 ), // Travertine
|
|
- map( ProtocolConstants.MINECRAFT_1_9, 0x33 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_12, 0x34 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_12_1, 0x35 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_13, 0x38 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_14, 0x3A ),
|
|
- map( ProtocolConstants.MINECRAFT_1_15, 0x3B ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16, 0x3A ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16_2, 0x39 )
|
|
- );
|
|
- TO_CLIENT.registerPacket(
|
|
- BossBar.class,
|
|
- BossBar::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_9, 0x0C ),
|
|
- map( ProtocolConstants.MINECRAFT_1_15, 0x0D ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16, 0x0C )
|
|
- );
|
|
- // Waterfall start
|
|
- TO_CLIENT.registerPacket(
|
|
- EntityEffect.class,
|
|
- EntityEffect::new, // Waterfall - speed up packet construction
|
|
- map(ProtocolConstants.MINECRAFT_1_7_2, 0x1D), // Travertine
|
|
- map(ProtocolConstants.MINECRAFT_1_9, 0x4C),
|
|
- map(ProtocolConstants.MINECRAFT_1_9_4, 0x4B),
|
|
- map(ProtocolConstants.MINECRAFT_1_12, 0x4E),
|
|
- map(ProtocolConstants.MINECRAFT_1_12_1, 0x4F),
|
|
- map(ProtocolConstants.MINECRAFT_1_13, 0x53),
|
|
- map(ProtocolConstants.MINECRAFT_1_14, 0x59),
|
|
- map(ProtocolConstants.MINECRAFT_1_15, 0x5A),
|
|
- map(ProtocolConstants.MINECRAFT_1_16, 0x59)
|
|
- );
|
|
- TO_CLIENT.registerPacket(
|
|
- EntityRemoveEffect.class,
|
|
- EntityRemoveEffect::new, // Waterfall - speed up packet construction
|
|
- map(ProtocolConstants.MINECRAFT_1_7_2, 0x1E), // Travertine
|
|
- map(ProtocolConstants.MINECRAFT_1_9, 0x31),
|
|
- map(ProtocolConstants.MINECRAFT_1_12, 0x32),
|
|
- map(ProtocolConstants.MINECRAFT_1_12_1, 0x33),
|
|
- map(ProtocolConstants.MINECRAFT_1_13, 0x36),
|
|
- map(ProtocolConstants.MINECRAFT_1_14, 0x38),
|
|
- map(ProtocolConstants.MINECRAFT_1_15, 0x39),
|
|
- map(ProtocolConstants.MINECRAFT_1_16, 0x38),
|
|
- map(ProtocolConstants.MINECRAFT_1_16_2, 0x37)
|
|
- );
|
|
- // Waterfall end
|
|
- TO_CLIENT.registerPacket(
|
|
- PlayerListItem.class, // PlayerInfo
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x38 ), // Travertine
|
|
- map( ProtocolConstants.MINECRAFT_1_9, 0x2D ),
|
|
- map( ProtocolConstants.MINECRAFT_1_12_1, 0x2E ),
|
|
- map( ProtocolConstants.MINECRAFT_1_13, 0x30 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_14, 0x33 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_15, 0x34 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16, 0x33 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16_2, 0x32 )
|
|
- );
|
|
- TO_CLIENT.registerPacket(
|
|
- TabCompleteResponse.class,
|
|
- TabCompleteResponse::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x3A ), // Travertine
|
|
- map( ProtocolConstants.MINECRAFT_1_9, 0x0E ),
|
|
- map( ProtocolConstants.MINECRAFT_1_13, 0x10 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_15, 0x11 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16, 0x10 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16_2, 0x0F )
|
|
- );
|
|
- TO_CLIENT.registerPacket(
|
|
- ScoreboardObjective.class,
|
|
- ScoreboardObjective::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x3B ), // Travertine
|
|
- map( ProtocolConstants.MINECRAFT_1_9, 0x3F ),
|
|
- map( ProtocolConstants.MINECRAFT_1_12, 0x41 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_12_1, 0x42 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_13, 0x45 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_14, 0x49 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_15, 0x4A )
|
|
- );
|
|
- TO_CLIENT.registerPacket(
|
|
- ScoreboardScore.class,
|
|
- ScoreboardScore::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x3C ), // Travertine
|
|
- map( ProtocolConstants.MINECRAFT_1_9, 0x42 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_12, 0x44 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_12_1, 0x45 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_13, 0x48 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_14, 0x4C ),
|
|
- map( ProtocolConstants.MINECRAFT_1_15, 0x4D )
|
|
- );
|
|
- TO_CLIENT.registerPacket(
|
|
- ScoreboardDisplay.class,
|
|
- ScoreboardDisplay::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x3D ), // Travertine
|
|
- map( ProtocolConstants.MINECRAFT_1_9, 0x38 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_12, 0x3A ),
|
|
- map( ProtocolConstants.MINECRAFT_1_12_1, 0x3B ),
|
|
- map( ProtocolConstants.MINECRAFT_1_13, 0x3E ),
|
|
- map( ProtocolConstants.MINECRAFT_1_14, 0x42 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_15, 0x43 )
|
|
- );
|
|
- TO_CLIENT.registerPacket(
|
|
- Team.class,
|
|
- Team::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x3E ), // Travertine
|
|
- map( ProtocolConstants.MINECRAFT_1_9, 0x41 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_12, 0x43 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_12_1, 0x44 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_13, 0x47 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_14, 0x4B ),
|
|
- map( ProtocolConstants.MINECRAFT_1_15, 0x4C )
|
|
- );
|
|
- TO_CLIENT.registerPacket(
|
|
- PluginMessage.class,
|
|
- PluginMessage::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x3F ), // Travertine
|
|
- map( ProtocolConstants.MINECRAFT_1_9, 0x18 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_13, 0x19 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_14, 0x18 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_15, 0x19 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16, 0x18 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16_2, 0x17 )
|
|
- );
|
|
- TO_CLIENT.registerPacket(
|
|
- Kick.class,
|
|
- Kick::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x40 ), // Travertine
|
|
- map( ProtocolConstants.MINECRAFT_1_9, 0x1A ),
|
|
- map( ProtocolConstants.MINECRAFT_1_13, 0x1B ),
|
|
- map( ProtocolConstants.MINECRAFT_1_14, 0x1A ),
|
|
- map( ProtocolConstants.MINECRAFT_1_15, 0x1B ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16, 0x1A ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16_2, 0x19 )
|
|
- );
|
|
- TO_CLIENT.registerPacket(
|
|
- Title.class,
|
|
- Title::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x45 ), // Travertine
|
|
- map( ProtocolConstants.MINECRAFT_1_12, 0x47 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_12_1, 0x48 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_13, 0x4B ),
|
|
- map( ProtocolConstants.MINECRAFT_1_14, 0x4F ),
|
|
- map( ProtocolConstants.MINECRAFT_1_15, 0x50 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16, 0x4F )
|
|
- );
|
|
- TO_CLIENT.registerPacket(
|
|
- PlayerListHeaderFooter.class,
|
|
- PlayerListHeaderFooter::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x47 ), // Travertine
|
|
- map( ProtocolConstants.MINECRAFT_1_9, 0x48 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_9_4, 0x47 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_12, 0x49 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_12_1, 0x4A ),
|
|
- map( ProtocolConstants.MINECRAFT_1_13, 0x4E ),
|
|
- map( ProtocolConstants.MINECRAFT_1_14, 0x53 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_15, 0x54 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16, 0x53 )
|
|
- );
|
|
- TO_CLIENT.registerPacket(
|
|
- EntityStatus.class,
|
|
- EntityStatus::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x1A ), // Travertine
|
|
- map( ProtocolConstants.MINECRAFT_1_9, 0x1B ),
|
|
- map( ProtocolConstants.MINECRAFT_1_13, 0x1C ),
|
|
- map( ProtocolConstants.MINECRAFT_1_14, 0x1B ),
|
|
- map( ProtocolConstants.MINECRAFT_1_15, 0x1C ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16, 0x1B ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16_2, 0x1A )
|
|
- );
|
|
- TO_CLIENT.registerPacket(
|
|
- Commands.class,
|
|
- Commands::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_13, 0x11 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_15, 0x12 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16, 0x11 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16_2, 0x10 )
|
|
- );
|
|
- TO_CLIENT.registerPacket(
|
|
- GameState.class,
|
|
- GameState::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_15, 0x1F ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16, 0x1E ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16_2, 0x1D )
|
|
- );
|
|
- TO_CLIENT.registerPacket(
|
|
- ViewDistance.class,
|
|
- ViewDistance::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_14, 0x41 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_15, 0x42 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16, 0x41 )
|
|
- );
|
|
-
|
|
- TO_SERVER.registerPacket(
|
|
- KeepAlive.class,
|
|
- KeepAlive::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x00 ), // Travertine
|
|
- map( ProtocolConstants.MINECRAFT_1_9, 0x0B ),
|
|
- map( ProtocolConstants.MINECRAFT_1_12, 0x0C ),
|
|
- map( ProtocolConstants.MINECRAFT_1_12_1, 0x0B ),
|
|
- map( ProtocolConstants.MINECRAFT_1_13, 0x0E ),
|
|
- map( ProtocolConstants.MINECRAFT_1_14, 0x0F ),
|
|
- map( ProtocolConstants.MINECRAFT_1_16, 0x10 )
|
|
- );
|
|
- TO_SERVER.registerPacket(
|
|
- Chat.class,
|
|
- Chat::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x01 ), // Travertine
|
|
- map( ProtocolConstants.MINECRAFT_1_9, 0x02 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_12, 0x03 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_12_1, 0x02 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_14, 0x03 )
|
|
- );
|
|
- TO_SERVER.registerPacket(
|
|
- TabCompleteRequest.class,
|
|
- TabCompleteRequest::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x14 ), // Travertine
|
|
- map( ProtocolConstants.MINECRAFT_1_9, 0x01 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_12, 0x02 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_12_1, 0x01 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_13, 0x05 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_14, 0x06 )
|
|
- );
|
|
- TO_SERVER.registerPacket(
|
|
- ClientSettings.class,
|
|
- ClientSettings::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x15 ), // Travertine
|
|
- map( ProtocolConstants.MINECRAFT_1_9, 0x04 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_12, 0x05 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_12_1, 0x04 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_14, 0x05 )
|
|
- );
|
|
- TO_SERVER.registerPacket(
|
|
- PluginMessage.class,
|
|
- PluginMessage::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x17 ), // Travertine
|
|
- map( ProtocolConstants.MINECRAFT_1_9, 0x09 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_12, 0x0A ),
|
|
- map( ProtocolConstants.MINECRAFT_1_12_1, 0x09 ),
|
|
- map( ProtocolConstants.MINECRAFT_1_13, 0x0A ),
|
|
- map( ProtocolConstants.MINECRAFT_1_14, 0x0B )
|
|
- );
|
|
- }
|
|
- },
|
|
- // 1
|
|
- STATUS
|
|
- {
|
|
-
|
|
- {
|
|
- TO_CLIENT.registerPacket(
|
|
- StatusResponse.class,
|
|
- StatusResponse::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x00 ) // Travertine
|
|
- );
|
|
- TO_CLIENT.registerPacket(
|
|
- PingPacket.class,
|
|
- PingPacket::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x01 ) // Travertine
|
|
- );
|
|
-
|
|
- TO_SERVER.registerPacket(
|
|
- StatusRequest.class,
|
|
- StatusRequest::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x00 ) // Travertine
|
|
- );
|
|
- TO_SERVER.registerPacket(
|
|
- PingPacket.class,
|
|
- PingPacket::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x01 ) // Travertine
|
|
- );
|
|
- }
|
|
- },
|
|
- //2
|
|
- LOGIN
|
|
- {
|
|
-
|
|
- {
|
|
- TO_CLIENT.registerPacket(
|
|
- Kick.class,
|
|
- Kick::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x00 ) // Travertine
|
|
- );
|
|
- TO_CLIENT.registerPacket(
|
|
- EncryptionRequest.class,
|
|
- EncryptionRequest::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x01 ) // Travertine
|
|
- );
|
|
- TO_CLIENT.registerPacket(
|
|
- LoginSuccess.class,
|
|
- LoginSuccess::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x02 ) // Travertine
|
|
- );
|
|
- TO_CLIENT.registerPacket(
|
|
- SetCompression.class,
|
|
- SetCompression::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x03 ) // Travertine
|
|
- );
|
|
- TO_CLIENT.registerPacket(
|
|
- LoginPayloadRequest.class,
|
|
- LoginPayloadRequest::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_13, 0x04 )
|
|
- );
|
|
-
|
|
- TO_SERVER.registerPacket(
|
|
- LoginRequest.class,
|
|
- LoginRequest::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x00 ) // Travertine
|
|
- );
|
|
- TO_SERVER.registerPacket(
|
|
- EncryptionResponse.class,
|
|
- EncryptionResponse::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_7_2, 0x01 ) // Travertine
|
|
- );
|
|
- TO_SERVER.registerPacket(
|
|
- LoginPayloadResponse.class,
|
|
- LoginPayloadResponse::new, // Waterfall - speed up packet construction
|
|
- map( ProtocolConstants.MINECRAFT_1_13, 0x02 )
|
|
- );
|
|
- }
|
|
- };
|
|
- /*========================================================================*/
|
|
- public static final int MAX_PACKET_ID = 0xFF;
|
|
- /*========================================================================*/
|
|
- final DirectionData TO_SERVER = new DirectionData( this, ProtocolConstants.Direction.TO_SERVER );
|
|
- final DirectionData TO_CLIENT = new DirectionData( this, ProtocolConstants.Direction.TO_CLIENT );
|
|
-
|
|
- public static void main(String[] args)
|
|
- {
|
|
- for ( int version : ProtocolConstants.SUPPORTED_VERSION_IDS )
|
|
- {
|
|
- dump( version );
|
|
+ {
|
|
+ TO_SERVER.registerPacket(Handshake.class, Handshake::new, // Waterfall - speed up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x00) // Travertine
|
|
+ );
|
|
+ }
|
|
+ },
|
|
+ // 0
|
|
+ GAME {
|
|
+
|
|
+ {
|
|
+ TO_CLIENT.registerPacket(KeepAlive.class, KeepAlive::new, // Waterfall - speed up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x00), // Travertine
|
|
+ map(ProtocolConstants.MINECRAFT_1_9, 0x1F),
|
|
+ map(ProtocolConstants.MINECRAFT_1_13, 0x21),
|
|
+ map(ProtocolConstants.MINECRAFT_1_14, 0x20),
|
|
+ map(ProtocolConstants.MINECRAFT_1_15, 0x21),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16, 0x20),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16_2, 0x1F));
|
|
+ TO_CLIENT.registerPacket(Login.class, Login::new, // Waterfall - speed up packet construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x01), // Travertine
|
|
+ map(ProtocolConstants.MINECRAFT_1_9, 0x23),
|
|
+ map(ProtocolConstants.MINECRAFT_1_13, 0x25),
|
|
+ map(ProtocolConstants.MINECRAFT_1_15, 0x26),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16, 0x25),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16_2, 0x24));
|
|
+ TO_CLIENT.registerPacket(Chat.class, Chat::new, // Waterfall - speed up packet construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x02), // Travertine
|
|
+ map(ProtocolConstants.MINECRAFT_1_9, 0x0F),
|
|
+ map(ProtocolConstants.MINECRAFT_1_13, 0x0E),
|
|
+ map(ProtocolConstants.MINECRAFT_1_15, 0x0F),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16, 0x0E));
|
|
+ TO_CLIENT.registerPacket(Respawn.class, Respawn::new, // Waterfall - speed up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x07), // Travertine
|
|
+ map(ProtocolConstants.MINECRAFT_1_9, 0x33),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12, 0x34),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12_1, 0x35),
|
|
+ map(ProtocolConstants.MINECRAFT_1_13, 0x38),
|
|
+ map(ProtocolConstants.MINECRAFT_1_14, 0x3A),
|
|
+ map(ProtocolConstants.MINECRAFT_1_15, 0x3B),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16, 0x3A),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16_2, 0x39));
|
|
+ TO_CLIENT.registerPacket(BossBar.class, BossBar::new, // Waterfall - speed up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_9, 0x0C),
|
|
+ map(ProtocolConstants.MINECRAFT_1_15, 0x0D),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16, 0x0C));
|
|
+ // Waterfall start
|
|
+ TO_CLIENT.registerPacket(EntityEffect.class, EntityEffect::new, // Waterfall - speed up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x1D), // Travertine
|
|
+ map(ProtocolConstants.MINECRAFT_1_9, 0x4C),
|
|
+ map(ProtocolConstants.MINECRAFT_1_9_4, 0x4B),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12, 0x4E),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12_1, 0x4F),
|
|
+ map(ProtocolConstants.MINECRAFT_1_13, 0x53),
|
|
+ map(ProtocolConstants.MINECRAFT_1_14, 0x59),
|
|
+ map(ProtocolConstants.MINECRAFT_1_15, 0x5A),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16, 0x59));
|
|
+ TO_CLIENT.registerPacket(EntityRemoveEffect.class, EntityRemoveEffect::new, // Waterfall - speed
|
|
+ // up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x1E), // Travertine
|
|
+ map(ProtocolConstants.MINECRAFT_1_9, 0x31),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12, 0x32),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12_1, 0x33),
|
|
+ map(ProtocolConstants.MINECRAFT_1_13, 0x36),
|
|
+ map(ProtocolConstants.MINECRAFT_1_14, 0x38),
|
|
+ map(ProtocolConstants.MINECRAFT_1_15, 0x39),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16, 0x38),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16_2, 0x37));
|
|
+ // Waterfall end
|
|
+ TO_CLIENT.registerPacket(PlayerListItem.class, // PlayerInfo
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x38), // Travertine
|
|
+ map(ProtocolConstants.MINECRAFT_1_9, 0x2D),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12_1, 0x2E),
|
|
+ map(ProtocolConstants.MINECRAFT_1_13, 0x30),
|
|
+ map(ProtocolConstants.MINECRAFT_1_14, 0x33),
|
|
+ map(ProtocolConstants.MINECRAFT_1_15, 0x34),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16, 0x33),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16_2, 0x32));
|
|
+ TO_CLIENT.registerPacket(TabCompleteResponse.class, TabCompleteResponse::new, // Waterfall -
|
|
+ // speed up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x3A), // Travertine
|
|
+ map(ProtocolConstants.MINECRAFT_1_9, 0x0E),
|
|
+ map(ProtocolConstants.MINECRAFT_1_13, 0x10),
|
|
+ map(ProtocolConstants.MINECRAFT_1_15, 0x11),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16, 0x10),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16_2, 0x0F));
|
|
+ TO_CLIENT.registerPacket(ScoreboardObjective.class, ScoreboardObjective::new, // Waterfall -
|
|
+ // speed up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x3B), // Travertine
|
|
+ map(ProtocolConstants.MINECRAFT_1_9, 0x3F),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12, 0x41),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12_1, 0x42),
|
|
+ map(ProtocolConstants.MINECRAFT_1_13, 0x45),
|
|
+ map(ProtocolConstants.MINECRAFT_1_14, 0x49),
|
|
+ map(ProtocolConstants.MINECRAFT_1_15, 0x4A));
|
|
+ TO_CLIENT.registerPacket(ScoreboardScore.class, ScoreboardScore::new, // Waterfall - speed up
|
|
+ // packet construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x3C), // Travertine
|
|
+ map(ProtocolConstants.MINECRAFT_1_9, 0x42),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12, 0x44),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12_1, 0x45),
|
|
+ map(ProtocolConstants.MINECRAFT_1_13, 0x48),
|
|
+ map(ProtocolConstants.MINECRAFT_1_14, 0x4C),
|
|
+ map(ProtocolConstants.MINECRAFT_1_15, 0x4D));
|
|
+ TO_CLIENT.registerPacket(ScoreboardDisplay.class, ScoreboardDisplay::new, // Waterfall - speed
|
|
+ // up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x3D), // Travertine
|
|
+ map(ProtocolConstants.MINECRAFT_1_9, 0x38),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12, 0x3A),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12_1, 0x3B),
|
|
+ map(ProtocolConstants.MINECRAFT_1_13, 0x3E),
|
|
+ map(ProtocolConstants.MINECRAFT_1_14, 0x42),
|
|
+ map(ProtocolConstants.MINECRAFT_1_15, 0x43));
|
|
+ TO_CLIENT.registerPacket(Team.class, Team::new, // Waterfall - speed up packet construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x3E), // Travertine
|
|
+ map(ProtocolConstants.MINECRAFT_1_9, 0x41),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12, 0x43),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12_1, 0x44),
|
|
+ map(ProtocolConstants.MINECRAFT_1_13, 0x47),
|
|
+ map(ProtocolConstants.MINECRAFT_1_14, 0x4B),
|
|
+ map(ProtocolConstants.MINECRAFT_1_15, 0x4C));
|
|
+ TO_CLIENT.registerPacket(PluginMessage.class, PluginMessage::new, // Waterfall - speed up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x3F), // Travertine
|
|
+ map(ProtocolConstants.MINECRAFT_1_9, 0x18),
|
|
+ map(ProtocolConstants.MINECRAFT_1_13, 0x19),
|
|
+ map(ProtocolConstants.MINECRAFT_1_14, 0x18),
|
|
+ map(ProtocolConstants.MINECRAFT_1_15, 0x19),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16, 0x18),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16_2, 0x17));
|
|
+ TO_CLIENT.registerPacket(Kick.class, Kick::new, // Waterfall - speed up packet construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x40), // Travertine
|
|
+ map(ProtocolConstants.MINECRAFT_1_9, 0x1A),
|
|
+ map(ProtocolConstants.MINECRAFT_1_13, 0x1B),
|
|
+ map(ProtocolConstants.MINECRAFT_1_14, 0x1A),
|
|
+ map(ProtocolConstants.MINECRAFT_1_15, 0x1B),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16, 0x1A),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16_2, 0x19));
|
|
+ TO_CLIENT.registerPacket(Title.class, Title::new, // Waterfall - speed up packet construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x45), // Travertine
|
|
+ map(ProtocolConstants.MINECRAFT_1_12, 0x47),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12_1, 0x48),
|
|
+ map(ProtocolConstants.MINECRAFT_1_13, 0x4B),
|
|
+ map(ProtocolConstants.MINECRAFT_1_14, 0x4F),
|
|
+ map(ProtocolConstants.MINECRAFT_1_15, 0x50),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16, 0x4F));
|
|
+ TO_CLIENT.registerPacket(PlayerListHeaderFooter.class, PlayerListHeaderFooter::new, // Waterfall
|
|
+ // - speed
|
|
+ // up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x47), // Travertine
|
|
+ map(ProtocolConstants.MINECRAFT_1_9, 0x48),
|
|
+ map(ProtocolConstants.MINECRAFT_1_9_4, 0x47),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12, 0x49),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12_1, 0x4A),
|
|
+ map(ProtocolConstants.MINECRAFT_1_13, 0x4E),
|
|
+ map(ProtocolConstants.MINECRAFT_1_14, 0x53),
|
|
+ map(ProtocolConstants.MINECRAFT_1_15, 0x54),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16, 0x53));
|
|
+ TO_CLIENT.registerPacket(EntityStatus.class, EntityStatus::new, // Waterfall - speed up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x1A), // Travertine
|
|
+ map(ProtocolConstants.MINECRAFT_1_9, 0x1B),
|
|
+ map(ProtocolConstants.MINECRAFT_1_13, 0x1C),
|
|
+ map(ProtocolConstants.MINECRAFT_1_14, 0x1B),
|
|
+ map(ProtocolConstants.MINECRAFT_1_15, 0x1C),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16, 0x1B),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16_2, 0x1A));
|
|
+ TO_CLIENT.registerPacket(Commands.class, Commands::new, // Waterfall - speed up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_13, 0x11),
|
|
+ map(ProtocolConstants.MINECRAFT_1_15, 0x12),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16, 0x11),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16_2, 0x10));
|
|
+ TO_CLIENT.registerPacket(GameState.class, GameState::new, // Waterfall - speed up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_15, 0x1F),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16, 0x1E),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16_2, 0x1D));
|
|
+ TO_CLIENT.registerPacket(ViewDistance.class, ViewDistance::new, // Waterfall - speed up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_14, 0x41),
|
|
+ map(ProtocolConstants.MINECRAFT_1_15, 0x42),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16, 0x41));
|
|
+
|
|
+ TO_SERVER.registerPacket(KeepAlive.class, KeepAlive::new, // Waterfall - speed up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x00), // Travertine
|
|
+ map(ProtocolConstants.MINECRAFT_1_9, 0x0B),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12, 0x0C),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12_1, 0x0B),
|
|
+ map(ProtocolConstants.MINECRAFT_1_13, 0x0E),
|
|
+ map(ProtocolConstants.MINECRAFT_1_14, 0x0F),
|
|
+ map(ProtocolConstants.MINECRAFT_1_16, 0x10));
|
|
+ TO_SERVER.registerPacket(Chat.class, Chat::new, // Waterfall - speed up packet construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x01), // Travertine
|
|
+ map(ProtocolConstants.MINECRAFT_1_9, 0x02),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12, 0x03),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12_1, 0x02),
|
|
+ map(ProtocolConstants.MINECRAFT_1_14, 0x03));
|
|
+ TO_SERVER.registerPacket(TabCompleteRequest.class, TabCompleteRequest::new, // Waterfall - speed
|
|
+ // up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x14), // Travertine
|
|
+ map(ProtocolConstants.MINECRAFT_1_9, 0x01),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12, 0x02),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12_1, 0x01),
|
|
+ map(ProtocolConstants.MINECRAFT_1_13, 0x05),
|
|
+ map(ProtocolConstants.MINECRAFT_1_14, 0x06));
|
|
+ TO_SERVER.registerPacket(ClientSettings.class, ClientSettings::new, // Waterfall - speed up
|
|
+ // packet construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x15), // Travertine
|
|
+ map(ProtocolConstants.MINECRAFT_1_9, 0x04),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12, 0x05),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12_1, 0x04),
|
|
+ map(ProtocolConstants.MINECRAFT_1_14, 0x05));
|
|
+ TO_SERVER.registerPacket(PluginMessage.class, PluginMessage::new, // Waterfall - speed up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x17), // Travertine
|
|
+ map(ProtocolConstants.MINECRAFT_1_9, 0x09),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12, 0x0A),
|
|
+ map(ProtocolConstants.MINECRAFT_1_12_1, 0x09),
|
|
+ map(ProtocolConstants.MINECRAFT_1_13, 0x0A),
|
|
+ map(ProtocolConstants.MINECRAFT_1_14, 0x0B));
|
|
+ }
|
|
+ },
|
|
+ // 1
|
|
+ STATUS {
|
|
+
|
|
+ {
|
|
+ TO_CLIENT.registerPacket(StatusResponse.class, StatusResponse::new, // Waterfall - speed up
|
|
+ // packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x00) // Travertine
|
|
+ );
|
|
+ TO_CLIENT.registerPacket(PingPacket.class, PingPacket::new, // Waterfall - speed up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x01) // Travertine
|
|
+ );
|
|
+
|
|
+ TO_SERVER.registerPacket(StatusRequest.class, StatusRequest::new, // Waterfall - speed up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x00) // Travertine
|
|
+ );
|
|
+ TO_SERVER.registerPacket(PingPacket.class, PingPacket::new, // Waterfall - speed up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x01) // Travertine
|
|
+ );
|
|
+ }
|
|
+ },
|
|
+ // 2
|
|
+ LOGIN {
|
|
+
|
|
+ {
|
|
+ TO_CLIENT.registerPacket(Kick.class, Kick::new, // Waterfall - speed up packet construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x00) // Travertine
|
|
+ );
|
|
+ TO_CLIENT.registerPacket(EncryptionRequest.class, EncryptionRequest::new, // Waterfall - speed
|
|
+ // up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x01) // Travertine
|
|
+ );
|
|
+ TO_CLIENT.registerPacket(LoginSuccess.class, LoginSuccess::new, // Waterfall - speed up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x02) // Travertine
|
|
+ );
|
|
+ TO_CLIENT.registerPacket(SetCompression.class, SetCompression::new, // Waterfall - speed up
|
|
+ // packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x03) // Travertine
|
|
+ );
|
|
+ TO_CLIENT.registerPacket(LoginPayloadRequest.class, LoginPayloadRequest::new, // Waterfall -
|
|
+ // speed up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_13, 0x04));
|
|
+
|
|
+ TO_SERVER.registerPacket(LoginRequest.class, LoginRequest::new, // Waterfall - speed up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x00) // Travertine
|
|
+ );
|
|
+ TO_SERVER.registerPacket(EncryptionResponse.class, EncryptionResponse::new, // Waterfall - speed
|
|
+ // up packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_7_2, 0x01) // Travertine
|
|
+ );
|
|
+ TO_SERVER.registerPacket(LoginPayloadResponse.class, LoginPayloadResponse::new, // Waterfall -
|
|
+ // speed up
|
|
+ // packet
|
|
+ // construction
|
|
+ map(ProtocolConstants.MINECRAFT_1_13, 0x02));
|
|
+ }
|
|
+ };
|
|
+
|
|
+ /* ======================================================================== */
|
|
+ public static final int MAX_PACKET_ID = 0xFF;
|
|
+ /* ======================================================================== */
|
|
+ final DirectionData TO_SERVER = new DirectionData(this, ProtocolConstants.Direction.TO_SERVER);
|
|
+ final DirectionData TO_CLIENT = new DirectionData(this, ProtocolConstants.Direction.TO_CLIENT);
|
|
+
|
|
+ public static void main(String[] args) {
|
|
+ for (int version : ProtocolConstants.SUPPORTED_VERSION_IDS) {
|
|
+ dump(version);
|
|
+ }
|
|
}
|
|
- }
|
|
|
|
- private static void dump(int version)
|
|
- {
|
|
- for ( Protocol protocol : Protocol.values() )
|
|
- {
|
|
- dump( version, protocol );
|
|
+ private static void dump(int version) {
|
|
+ for (Protocol protocol : Protocol.values()) {
|
|
+ dump(version, protocol);
|
|
+ }
|
|
}
|
|
- }
|
|
-
|
|
- private static void dump(int version, Protocol protocol)
|
|
- {
|
|
- dump( version, protocol.TO_CLIENT );
|
|
- dump( version, protocol.TO_SERVER );
|
|
- }
|
|
-
|
|
- private static void dump(int version, DirectionData data)
|
|
- {
|
|
- for ( int id = 0; id < MAX_PACKET_ID; id++ )
|
|
- {
|
|
- DefinedPacket packet = data.createPacket( id, version );
|
|
- if ( packet != null )
|
|
- {
|
|
- System.out.println( version + " " + data.protocolPhase + " " + data.direction + " " + id + " " + packet.getClass().getSimpleName() );
|
|
- }
|
|
+
|
|
+ private static void dump(int version, Protocol protocol) {
|
|
+ dump(version, protocol.TO_CLIENT);
|
|
+ dump(version, protocol.TO_SERVER);
|
|
}
|
|
- }
|
|
-
|
|
- @Data
|
|
- private static class ProtocolData
|
|
- {
|
|
-
|
|
- private final int protocolVersion;
|
|
- private final TObjectIntMap<Class<? extends DefinedPacket>> packetMap = new TObjectIntHashMap<>( MAX_PACKET_ID );
|
|
- private final java.util.function.Supplier<? extends DefinedPacket>[] packetConstructors = new java.util.function.Supplier[ MAX_PACKET_ID ]; // Waterfall - speed up packet construction
|
|
- }
|
|
-
|
|
- @Data
|
|
- private static class ProtocolMapping
|
|
- {
|
|
-
|
|
- private final int protocolVersion;
|
|
- private final int packetID;
|
|
- }
|
|
-
|
|
- // Helper method
|
|
- private static ProtocolMapping map(int protocol, int id)
|
|
- {
|
|
- return new ProtocolMapping( protocol, id );
|
|
- }
|
|
-
|
|
- static final class DirectionData
|
|
- {
|
|
-
|
|
- private final TIntObjectMap<ProtocolData> protocols = new TIntObjectHashMap<>();
|
|
- //
|
|
- private final Protocol protocolPhase;
|
|
- @Getter
|
|
- private final ProtocolConstants.Direction direction;
|
|
-
|
|
- public DirectionData(Protocol protocolPhase, ProtocolConstants.Direction direction)
|
|
- {
|
|
- this.protocolPhase = protocolPhase;
|
|
- this.direction = direction;
|
|
-
|
|
- for ( int protocol : ProtocolConstants.SUPPORTED_VERSION_IDS )
|
|
- {
|
|
- protocols.put( protocol, new ProtocolData( protocol ) );
|
|
- }
|
|
+
|
|
+ private static void dump(int version, DirectionData data) {
|
|
+ for (int id = 0; id < MAX_PACKET_ID; id++) {
|
|
+ DefinedPacket packet = data.createPacket(id, version);
|
|
+ if (packet != null) {
|
|
+ System.out.println(version + " " + data.protocolPhase + " " + data.direction + " " + id
|
|
+ + " " + packet.getClass().getSimpleName());
|
|
+ }
|
|
+ }
|
|
}
|
|
|
|
- private ProtocolData getProtocolData(int version)
|
|
- {
|
|
- ProtocolData protocol = protocols.get( version );
|
|
- if ( protocol == null && ( protocolPhase != Protocol.GAME ) )
|
|
- {
|
|
- protocol = Iterables.getFirst( protocols.valueCollection(), null );
|
|
- }
|
|
- return protocol;
|
|
+ @Data
|
|
+ private static class ProtocolData {
|
|
+
|
|
+ private final int protocolVersion;
|
|
+ private final TObjectIntMap<Class<? extends DefinedPacket>> packetMap = new TObjectIntHashMap<>(
|
|
+ MAX_PACKET_ID);
|
|
+ private final java.util.function.Supplier<? extends DefinedPacket>[] packetConstructors = new java.util.function.Supplier[MAX_PACKET_ID]; // Waterfall
|
|
+ // -
|
|
+ // speed
|
|
+ // up
|
|
+ // packet
|
|
+ // construction
|
|
}
|
|
|
|
- public boolean hasPacket(int i, boolean supportsForge) {
|
|
- return supportsForge || i >= 0 && i <= MAX_PACKET_ID;
|
|
+ @Data
|
|
+ private static class ProtocolMapping {
|
|
+
|
|
+ private final int protocolVersion;
|
|
+ private final int packetID;
|
|
}
|
|
|
|
- public final DefinedPacket createPacket(int id, int version)
|
|
- {
|
|
- return createPacket(id, version, true);
|
|
+ // Helper method
|
|
+ private static ProtocolMapping map(int protocol, int id) {
|
|
+ return new ProtocolMapping(protocol, id);
|
|
}
|
|
|
|
- public final DefinedPacket createPacket(int id, int version, boolean supportsForge)
|
|
- {
|
|
- ProtocolData protocolData = getProtocolData( version );
|
|
- if ( protocolData == null )
|
|
- {
|
|
- throw new BadPacketException( "Unsupported protocol version " + version );
|
|
- }
|
|
- if ( !hasPacket(id, supportsForge) )
|
|
- {
|
|
- if ( ProtocolConstants.isBeforeOrEq( version, ProtocolConstants.MINECRAFT_1_7_6 ) ) {
|
|
- return null;
|
|
- } else {
|
|
- throw new BadPacketException( "Packet with id " + id + " outside of range " );
|
|
+ static final class DirectionData {
|
|
+
|
|
+ private final TIntObjectMap<ProtocolData> protocols = new TIntObjectHashMap<>();
|
|
+ //
|
|
+ private final Protocol protocolPhase;
|
|
+ @Getter
|
|
+ private final ProtocolConstants.Direction direction;
|
|
+
|
|
+ public DirectionData(Protocol protocolPhase, ProtocolConstants.Direction direction) {
|
|
+ this.protocolPhase = protocolPhase;
|
|
+ this.direction = direction;
|
|
+
|
|
+ for (int protocol : ProtocolConstants.SUPPORTED_VERSION_IDS) {
|
|
+ protocols.put(protocol, new ProtocolData(protocol));
|
|
+ }
|
|
}
|
|
- }
|
|
-
|
|
- java.util.function.Supplier<? extends DefinedPacket> constructor = protocolData.packetConstructors[id]; // Waterfall - speed up packet construction
|
|
- try
|
|
- {
|
|
- return ( constructor == null ) ? null : constructor.get(); // Waterfall - speed up packet construction
|
|
- } catch ( Exception ex ) // Waterfall - speed up packet construction
|
|
- {
|
|
- throw new BadPacketException( "Could not construct packet with id " + id, ex );
|
|
- }
|
|
- }
|
|
|
|
- private <P extends DefinedPacket> void registerPacket(Class<P> packetClass, java.util.function.Supplier<P> constructor, ProtocolMapping... mappings) // Waterfall - speed up packet construction
|
|
- {
|
|
- // Waterfall start - speed up packet construction
|
|
- /*
|
|
- try
|
|
- {
|
|
- Constructor<? extends DefinedPacket> constructor = packetClass.getDeclaredConstructor();
|
|
- */ // Waterfall end
|
|
-
|
|
- int mappingIndex = 0;
|
|
- ProtocolMapping mapping = mappings[mappingIndex];
|
|
- for ( int protocol : ProtocolConstants.SUPPORTED_VERSION_IDS )
|
|
- {
|
|
- if ( protocol < mapping.protocolVersion )
|
|
- {
|
|
- // This is a new packet, skip it till we reach the next protocol
|
|
- continue;
|
|
- }
|
|
-
|
|
- if ( mapping.protocolVersion < protocol && mappingIndex + 1 < mappings.length )
|
|
- {
|
|
- // Mapping is non current, but the next one may be ok
|
|
- ProtocolMapping nextMapping = mappings[mappingIndex + 1];
|
|
- if ( nextMapping.protocolVersion == protocol )
|
|
- {
|
|
- Preconditions.checkState( nextMapping.packetID != mapping.packetID, "Duplicate packet mapping (%s, %s)", mapping.protocolVersion, nextMapping.protocolVersion );
|
|
+ private ProtocolData getProtocolData(int version) {
|
|
+ ProtocolData protocol = protocols.get(version);
|
|
+ if (protocol == null && (protocolPhase != Protocol.GAME)) {
|
|
+ protocol = Iterables.getFirst(protocols.valueCollection(), null);
|
|
+ }
|
|
+ return protocol;
|
|
+ }
|
|
|
|
- mapping = nextMapping;
|
|
- mappingIndex++;
|
|
+ public boolean hasPacket(int i, boolean supportsForge) {
|
|
+ return supportsForge || i >= 0 && i <= MAX_PACKET_ID;
|
|
+ }
|
|
+
|
|
+ public final DefinedPacket createPacket(int id, int version) {
|
|
+ return createPacket(id, version, true);
|
|
+ }
|
|
+
|
|
+ public final DefinedPacket createPacket(int id, int version, boolean supportsForge) {
|
|
+ ProtocolData protocolData = getProtocolData(version);
|
|
+ if (protocolData == null) {
|
|
+ throw new BadPacketException("Unsupported protocol version " + version);
|
|
+ }
|
|
+ if (!hasPacket(id, supportsForge)) {
|
|
+ if (ProtocolConstants.isBeforeOrEq(version, ProtocolConstants.MINECRAFT_1_7_6)) {
|
|
+ return null;
|
|
+ } else {
|
|
+ throw new BadPacketException("Packet with id " + id + " outside of range ");
|
|
+ }
|
|
}
|
|
- }
|
|
|
|
- ProtocolData data = protocols.get( protocol );
|
|
- data.packetMap.put( packetClass, mapping.packetID );
|
|
- data.packetConstructors[mapping.packetID] = constructor;
|
|
+ java.util.function.Supplier<? extends DefinedPacket> constructor = protocolData.packetConstructors[id]; // Waterfall
|
|
+ // -
|
|
+ // speed
|
|
+ // up
|
|
+ // packet
|
|
+ // construction
|
|
+ try {
|
|
+ return (constructor == null) ? null : constructor.get(); // Waterfall - speed up packet
|
|
+ // construction
|
|
+ } catch (Exception ex) // Waterfall - speed up packet construction
|
|
+ {
|
|
+ throw new BadPacketException("Could not construct packet with id " + id, ex);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ private <P extends DefinedPacket> void registerPacket(Class<P> packetClass,
|
|
+ java.util.function.Supplier<P> constructor, ProtocolMapping... mappings) // Waterfall -
|
|
+ // speed up
|
|
+ // packet
|
|
+ // construction
|
|
+ {
|
|
+ // Waterfall start - speed up packet construction
|
|
+ /*
|
|
+ * try { Constructor<? extends DefinedPacket> constructor =
|
|
+ * packetClass.getDeclaredConstructor();
|
|
+ */ // Waterfall end
|
|
+
|
|
+ int mappingIndex = 0;
|
|
+ ProtocolMapping mapping = mappings[mappingIndex];
|
|
+ for (int protocol : ProtocolConstants.SUPPORTED_VERSION_IDS) {
|
|
+ if (protocol < mapping.protocolVersion) {
|
|
+ // This is a new packet, skip it till we reach the next protocol
|
|
+ continue;
|
|
+ }
|
|
+
|
|
+ if (mapping.protocolVersion < protocol && mappingIndex + 1 < mappings.length) {
|
|
+ // Mapping is non current, but the next one may be ok
|
|
+ ProtocolMapping nextMapping = mappings[mappingIndex + 1];
|
|
+ if (nextMapping.protocolVersion == protocol) {
|
|
+ Preconditions.checkState(nextMapping.packetID != mapping.packetID,
|
|
+ "Duplicate packet mapping (%s, %s)",
|
|
+ mapping.protocolVersion, nextMapping.protocolVersion);
|
|
+
|
|
+ mapping = nextMapping;
|
|
+ mappingIndex++;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ ProtocolData data = protocols.get(protocol);
|
|
+ data.packetMap.put(packetClass, mapping.packetID);
|
|
+ data.packetConstructors[mapping.packetID] = constructor;
|
|
+ }
|
|
+ // Waterfall start - speed up packet construction
|
|
+ /*
|
|
+ * } catch ( NoSuchMethodException ex ) { throw new BadPacketException(
|
|
+ * "No NoArgsConstructor for packet class " + packetClass ); }
|
|
+ */ // Waterfall end
|
|
}
|
|
- // Waterfall start - speed up packet construction
|
|
- /*
|
|
- } catch ( NoSuchMethodException ex )
|
|
- {
|
|
- throw new BadPacketException( "No NoArgsConstructor for packet class " + packetClass );
|
|
- }
|
|
- */ // Waterfall end
|
|
- }
|
|
- // Waterfall start - speed up packet construction (backwards compat)
|
|
- private <P extends DefinedPacket> void registerPacket(Class<P> packetClass, ProtocolMapping... mappings) {
|
|
- java.util.function.Supplier<P> packetSupplier;
|
|
- try {
|
|
- Constructor<? extends DefinedPacket> constructor = packetClass.getDeclaredConstructor();
|
|
- packetSupplier = () -> {
|
|
- try {
|
|
- return (P) constructor.newInstance();
|
|
- } catch (Exception e) {
|
|
- throw new RuntimeException(e);
|
|
- }
|
|
- };
|
|
- } catch (ReflectiveOperationException e) {
|
|
- throw new BadPacketException( "No NoArgsConstructor for packet class " + packetClass );
|
|
- }
|
|
- registerPacket(packetClass, packetSupplier, mappings);
|
|
- }
|
|
- // Waterfall end
|
|
|
|
- final int getId(Class<? extends DefinedPacket> packet, int version)
|
|
- {
|
|
+ // Waterfall start - speed up packet construction (backwards compat)
|
|
+ private <P extends DefinedPacket> void registerPacket(Class<P> packetClass,
|
|
+ ProtocolMapping... mappings) {
|
|
+ java.util.function.Supplier<P> packetSupplier;
|
|
+ try {
|
|
+ Constructor<? extends DefinedPacket> constructor = packetClass.getDeclaredConstructor();
|
|
+ packetSupplier = () -> {
|
|
+ try {
|
|
+ return (P) constructor.newInstance();
|
|
+ } catch (Exception e) {
|
|
+ throw new RuntimeException(e);
|
|
+ }
|
|
+ };
|
|
+ } catch (ReflectiveOperationException e) {
|
|
+ throw new BadPacketException("No NoArgsConstructor for packet class " + packetClass);
|
|
+ }
|
|
+ registerPacket(packetClass, packetSupplier, mappings);
|
|
+ }
|
|
+ // Waterfall end
|
|
|
|
- ProtocolData protocolData = getProtocolData( version );
|
|
- if ( protocolData == null )
|
|
- {
|
|
- throw new BadPacketException( "Unsupported protocol version" );
|
|
- }
|
|
- Preconditions.checkArgument( protocolData.packetMap.containsKey( packet ), "Cannot get ID for packet %s in phase %s with direction %s", packet, protocolPhase, direction );
|
|
+ final int getId(Class<? extends DefinedPacket> packet, int version) {
|
|
+ ProtocolData protocolData = getProtocolData(version);
|
|
+ if (protocolData == null) {
|
|
+ throw new BadPacketException("Unsupported protocol version");
|
|
+ }
|
|
+ Preconditions.checkArgument(protocolData.packetMap.containsKey(packet),
|
|
+ "Cannot get ID for packet %s in phase %s with direction %s", packet,
|
|
+ protocolPhase, direction);
|
|
|
|
- return protocolData.packetMap.get( packet );
|
|
+ return protocolData.packetMap.get(packet);
|
|
+ }
|
|
}
|
|
- }
|
|
}
|
|
diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/Varint21FrameDecoder.java b/protocol/src/main/java/net/md_5/bungee/protocol/Varint21FrameDecoder.java
|
|
index a07e25b1..279799cd 100644
|
|
--- a/protocol/src/main/java/net/md_5/bungee/protocol/Varint21FrameDecoder.java
|
|
+++ b/protocol/src/main/java/net/md_5/bungee/protocol/Varint21FrameDecoder.java
|
|
@@ -1,64 +1,60 @@
|
|
package net.md_5.bungee.protocol;
|
|
|
|
+import java.util.List;
|
|
+import java.util.concurrent.atomic.AtomicLong;
|
|
+
|
|
import io.netty.buffer.ByteBuf;
|
|
-import io.netty.buffer.Unpooled;
|
|
import io.netty.channel.ChannelHandlerContext;
|
|
import io.netty.handler.codec.ByteToMessageDecoder;
|
|
import io.netty.handler.codec.CorruptedFrameException;
|
|
-import java.util.List;
|
|
-import java.util.concurrent.atomic.AtomicLong;
|
|
|
|
-public class Varint21FrameDecoder extends ByteToMessageDecoder
|
|
-{
|
|
+public class Varint21FrameDecoder extends ByteToMessageDecoder {
|
|
|
|
private AtomicLong lastEmptyPacket = new AtomicLong(0); // Travertine
|
|
private static boolean DIRECT_WARNING;
|
|
|
|
@Override
|
|
- protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception
|
|
- {
|
|
- // If we decode an invalid packet and an exception is thrown (thus triggering a close of the connection),
|
|
- // the Netty ByteToMessageDecoder will continue to frame more packets and potentially call fireChannelRead()
|
|
- // on them, likely with more invalid packets. Therefore, check if the connection is no longer active and if so
|
|
+ protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
|
|
+ // If we decode an invalid packet and an exception is thrown (thus triggering a
|
|
+ // close of the connection),
|
|
+ // the Netty ByteToMessageDecoder will continue to frame more packets and
|
|
+ // potentially call fireChannelRead()
|
|
+ // on them, likely with more invalid packets. Therefore, check if the connection
|
|
+ // is no longer active and if so
|
|
// sliently discard the packet.
|
|
- if ( !ctx.channel().isActive() )
|
|
- {
|
|
- in.skipBytes( in.readableBytes() );
|
|
+ if (!ctx.channel().isActive()) {
|
|
+ in.skipBytes(in.readableBytes());
|
|
return;
|
|
}
|
|
|
|
in.markReaderIndex();
|
|
|
|
- for ( int i = 0; i < 3; i++ ) // Waterfall
|
|
+ for (int i = 0; i < 3; i++) // Waterfall
|
|
{
|
|
- if ( !in.isReadable() )
|
|
- {
|
|
+ if (!in.isReadable()) {
|
|
in.resetReaderIndex();
|
|
return;
|
|
}
|
|
|
|
// Waterfall start
|
|
byte read = in.readByte();
|
|
- if ( read >= 0 )
|
|
- {
|
|
+ if (read >= 0) {
|
|
in.resetReaderIndex();
|
|
- int length = DefinedPacket.readVarInt( in );
|
|
+ int length = DefinedPacket.readVarInt(in);
|
|
// Waterfall end
|
|
- if ( false && length == 0) // Waterfall - ignore
|
|
+ if (false && length == 0) // Waterfall - ignore
|
|
{
|
|
// Travertine start - vanilla 1.7 client sometimes sends empty packets.
|
|
long currentTime = System.currentTimeMillis();
|
|
long lastEmptyPacket = this.lastEmptyPacket.getAndSet(currentTime);
|
|
|
|
- if (currentTime - lastEmptyPacket < 50L)
|
|
- {
|
|
- throw new CorruptedFrameException( "Too many empty packets" );
|
|
+ if (currentTime - lastEmptyPacket < 50L) {
|
|
+ throw new CorruptedFrameException("Too many empty packets");
|
|
}
|
|
// Travertine end
|
|
}
|
|
|
|
- if ( in.readableBytes() < length )
|
|
- {
|
|
+ if (in.readableBytes() < length) {
|
|
in.resetReaderIndex();
|
|
return;
|
|
// Waterfall start
|
|
@@ -70,6 +66,6 @@ public class Varint21FrameDecoder extends ByteToMessageDecoder
|
|
}
|
|
}
|
|
|
|
- throw new CorruptedFrameException( "length wider than 21-bit" );
|
|
+ throw new CorruptedFrameException("length wider than 21-bit");
|
|
}
|
|
}
|
|
diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/Varint21LengthFieldPrepender.java b/protocol/src/main/java/net/md_5/bungee/protocol/Varint21LengthFieldPrepender.java
|
|
index d4c3df44..ee80e1e9 100644
|
|
--- a/protocol/src/main/java/net/md_5/bungee/protocol/Varint21LengthFieldPrepender.java
|
|
+++ b/protocol/src/main/java/net/md_5/bungee/protocol/Varint21LengthFieldPrepender.java
|
|
@@ -6,36 +6,29 @@ import io.netty.channel.ChannelHandlerContext;
|
|
import io.netty.handler.codec.MessageToByteEncoder;
|
|
|
|
@ChannelHandler.Sharable
|
|
-public class Varint21LengthFieldPrepender extends MessageToByteEncoder<ByteBuf>
|
|
-{
|
|
+public class Varint21LengthFieldPrepender extends MessageToByteEncoder<ByteBuf> {
|
|
|
|
@Override
|
|
- protected void encode(ChannelHandlerContext ctx, ByteBuf msg, ByteBuf out) throws Exception
|
|
- {
|
|
+ protected void encode(ChannelHandlerContext ctx, ByteBuf msg, ByteBuf out) throws Exception {
|
|
int bodyLen = msg.readableBytes();
|
|
- int headerLen = varintSize( bodyLen );
|
|
- out.ensureWritable( headerLen + bodyLen );
|
|
+ int headerLen = varintSize(bodyLen);
|
|
+ out.ensureWritable(headerLen + bodyLen);
|
|
|
|
- DefinedPacket.writeVarInt( bodyLen, out );
|
|
- out.writeBytes( msg );
|
|
+ DefinedPacket.writeVarInt(bodyLen, out);
|
|
+ out.writeBytes(msg);
|
|
}
|
|
|
|
- private static int varintSize(int paramInt)
|
|
- {
|
|
- if ( ( paramInt & 0xFFFFFF80 ) == 0 )
|
|
- {
|
|
+ private static int varintSize(int paramInt) {
|
|
+ if ((paramInt & 0xFFFFFF80) == 0) {
|
|
return 1;
|
|
}
|
|
- if ( ( paramInt & 0xFFFFC000 ) == 0 )
|
|
- {
|
|
+ if ((paramInt & 0xFFFFC000) == 0) {
|
|
return 2;
|
|
}
|
|
- if ( ( paramInt & 0xFFE00000 ) == 0 )
|
|
- {
|
|
+ if ((paramInt & 0xFFE00000) == 0) {
|
|
return 3;
|
|
}
|
|
- if ( ( paramInt & 0xF0000000 ) == 0 )
|
|
- {
|
|
+ if ((paramInt & 0xF0000000) == 0) {
|
|
return 4;
|
|
}
|
|
return 5;
|
|
diff --git a/proxy/.factorypath b/proxy/.factorypath
|
|
new file mode 100644
|
|
index 00000000..c6fe9856
|
|
--- /dev/null
|
|
+++ b/proxy/.factorypath
|
|
@@ -0,0 +1,37 @@
|
|
+<factorypath>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec-haproxy/4.1.51.Final/netty-codec-haproxy-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-buffer/4.1.51.Final/netty-buffer-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport/4.1.51.Final/netty-transport-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec/4.1.51.Final/netty-codec-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec-http/4.1.51.Final/netty-codec-http-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-common/4.1.51.Final/netty-common-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver-dns/4.1.51.Final/netty-resolver-dns-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver/4.1.51.Final/netty-resolver-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec-dns/4.1.51.Final/netty-codec-dns-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-handler/4.1.51.Final/netty-handler-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport-native-epoll/4.1.51.Final/netty-transport-native-epoll-4.1.51.Final-linux-x86_64.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport-native-unix-common/4.1.51.Final/netty-transport-native-unix-common-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/gson/gson/2.8.0/gson-2.8.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/yaml/snakeyaml/1.25/snakeyaml-1.25.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-core/2.12.0/log4j-core-2.12.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-api/2.12.0/log4j-api-2.12.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-iostreams/2.12.0/log4j-iostreams-2.12.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-jul/2.12.0/log4j-jul-2.12.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/apache/logging/log4j/log4j-slf4j-impl/2.12.0/log4j-slf4j-impl-2.12.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/lmax/disruptor/3.4.2/disruptor-3.4.2.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/java/dev/jna/jna/4.4.0/jna-4.4.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/md-5/brigadier/1.0.16-SNAPSHOT/brigadier-1.0.16-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/sf/trove4j/core/3.1.0/core-3.1.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/se/llbit/jo-nbt/1.3.0/jo-nbt-1.3.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/sf/jopt-simple/jopt-simple/5.0.4/jopt-simple-5.0.4.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/mysql/mysql-connector-java/5.1.48/mysql-connector-java-5.1.48.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/minecrell/terminalconsoleappender/1.2.0/terminalconsoleappender-1.2.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/jline/jline-reader/3.12.1/jline-reader-3.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/jline/jline-terminal-jansi/3.12.1/jline-terminal-jansi-3.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/fusesource/jansi/jansi/1.18/jansi-1.18.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/jline/jline-terminal/3.12.1/jline-terminal-3.12.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/guava/guava/21.0/guava-21.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/findbugs/findbugs-annotations/3.0.1/findbugs-annotations-3.0.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.10/lombok-1.18.10.jar" enabled="true" runInBatchMode="false"/>
|
|
+</factorypath>
|
|
diff --git a/proxy/pom.xml b/proxy/pom.xml
|
|
index 4bda0d62..40d7f5c9 100644
|
|
--- a/proxy/pom.xml
|
|
+++ b/proxy/pom.xml
|
|
@@ -1,6 +1,5 @@
|
|
-
|
|
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
+<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
<modelVersion>4.0.0</modelVersion>
|
|
|
|
<parent>
|
|
@@ -87,6 +86,50 @@
|
|
<version>${project.version}</version>
|
|
<scope>compile</scope>
|
|
</dependency>
|
|
+ <!-- FlameCord start - Imports -->
|
|
+ <dependency>
|
|
+ <groupId>dev._2lstudios.flamecord</groupId>
|
|
+ <artifactId>travertine-flamecord</artifactId>
|
|
+ <version>${project.version}</version>
|
|
+ <scope>compile</scope>
|
|
+ </dependency>
|
|
+ <dependency>
|
|
+ <groupId>io.github.waterfallmc</groupId>
|
|
+ <artifactId>travertine-module-cmd-alert</artifactId>
|
|
+ <version>${project.version}</version>
|
|
+ <scope>compile</scope>
|
|
+ </dependency>
|
|
+ <dependency>
|
|
+ <groupId>io.github.waterfallmc</groupId>
|
|
+ <artifactId>travertine-module-cmd-find</artifactId>
|
|
+ <version>${project.version}</version>
|
|
+ <scope>compile</scope>
|
|
+ </dependency>
|
|
+ <dependency>
|
|
+ <groupId>io.github.waterfallmc</groupId>
|
|
+ <artifactId>travertine-module-cmd-list</artifactId>
|
|
+ <version>${project.version}</version>
|
|
+ <scope>compile</scope>
|
|
+ </dependency>
|
|
+ <dependency>
|
|
+ <groupId>io.github.waterfallmc</groupId>
|
|
+ <artifactId>travertine-module-cmd-send</artifactId>
|
|
+ <version>${project.version}</version>
|
|
+ <scope>compile</scope>
|
|
+ </dependency>
|
|
+ <dependency>
|
|
+ <groupId>io.github.waterfallmc</groupId>
|
|
+ <artifactId>travertine-module-cmd-server</artifactId>
|
|
+ <version>${project.version}</version>
|
|
+ <scope>compile</scope>
|
|
+ </dependency>
|
|
+ <dependency>
|
|
+ <groupId>io.github.waterfallmc</groupId>
|
|
+ <artifactId>travertine-module-reconnect-yaml</artifactId>
|
|
+ <version>${project.version}</version>
|
|
+ <scope>compile</scope>
|
|
+ </dependency>
|
|
+ <!-- FlameCord end - Imports -->
|
|
<dependency>
|
|
<groupId>net.sf.jopt-simple</groupId>
|
|
<artifactId>jopt-simple</artifactId>
|
|
diff --git a/proxy/src/main/java/io/github/waterfallmc/waterfall/conf/WaterfallConfiguration.java b/proxy/src/main/java/io/github/waterfallmc/waterfall/conf/WaterfallConfiguration.java
|
|
index e860214f..9f008a31 100644
|
|
--- a/proxy/src/main/java/io/github/waterfallmc/waterfall/conf/WaterfallConfiguration.java
|
|
+++ b/proxy/src/main/java/io/github/waterfallmc/waterfall/conf/WaterfallConfiguration.java
|
|
@@ -1,12 +1,11 @@
|
|
package io.github.waterfallmc.waterfall.conf;
|
|
|
|
-import com.google.common.base.Joiner;
|
|
+import java.io.File;
|
|
+
|
|
import net.md_5.bungee.conf.Configuration;
|
|
import net.md_5.bungee.conf.YamlConfig;
|
|
import net.md_5.bungee.protocol.ProtocolConstants;
|
|
|
|
-import java.io.File;
|
|
-
|
|
public class WaterfallConfiguration extends Configuration {
|
|
|
|
/**
|
|
@@ -50,7 +49,9 @@ public class WaterfallConfiguration extends Configuration {
|
|
YamlConfig config = new YamlConfig(new File("waterfall.yml"));
|
|
config.load(false); // Load, but no permissions
|
|
logInitialHandlerConnections = config.getBoolean( "log_initial_handler_connections", logInitialHandlerConnections );
|
|
- gameVersion = config.getString("game_version", "").isEmpty() ? Joiner.on(", ").join(ProtocolConstants.SUPPORTED_VERSIONS) : config.getString("game_version", "");
|
|
+ // FlameCord - Make the version look better
|
|
+ //gameVersion = config.getString("game_version", "").isEmpty() ? Joiner.on(", ").join(ProtocolConstants.SUPPORTED_VERSIONS) : config.getString("game_version", "");
|
|
+ gameVersion = config.getString("game_version", "").isEmpty() ? ProtocolConstants.SUPPORTED_VERSIONS.get(0) + "-" + ProtocolConstants.SUPPORTED_VERSIONS.get(ProtocolConstants.SUPPORTED_VERSIONS.size() - 1) : config.getString("game_version", "");
|
|
useNettyDnsResolver = config.getBoolean("use_netty_dns_resolver", useNettyDnsResolver);
|
|
// Throttling options
|
|
tabThrottle = config.getInt("throttling.tab_complete", tabThrottle);
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java
|
|
index a17ed68e..7a70948d 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java
|
|
@@ -1,33 +1,10 @@
|
|
package net.md_5.bungee;
|
|
|
|
-import com.google.common.base.Charsets;
|
|
-import com.google.common.base.Preconditions;
|
|
-import com.google.common.base.Predicate;
|
|
-import com.google.common.collect.Iterables;
|
|
-import com.google.common.collect.Lists;
|
|
-import com.google.common.collect.Sets;
|
|
-import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
|
-import com.google.gson.Gson;
|
|
-import com.google.gson.GsonBuilder;
|
|
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
|
-import io.github.waterfallmc.waterfall.conf.WaterfallConfiguration;
|
|
-import io.github.waterfallmc.waterfall.event.ProxyExceptionEvent;
|
|
-import io.github.waterfallmc.waterfall.exception.ProxyPluginEnableDisableException;
|
|
-import io.netty.bootstrap.ServerBootstrap;
|
|
-import io.netty.channel.Channel;
|
|
-import io.netty.channel.ChannelException;
|
|
-import io.netty.channel.ChannelFuture;
|
|
-import io.netty.channel.ChannelFutureListener;
|
|
-import io.netty.channel.ChannelOption;
|
|
-import io.netty.channel.EventLoopGroup;
|
|
-import io.netty.util.ResourceLeakDetector;
|
|
import java.io.File;
|
|
import java.io.FileReader;
|
|
import java.io.IOException;
|
|
-import java.io.PrintStream;
|
|
import java.net.InetSocketAddress;
|
|
import java.net.SocketAddress;
|
|
-import java.text.MessageFormat;
|
|
import java.util.ArrayList;
|
|
import java.util.Collection;
|
|
import java.util.Collections;
|
|
@@ -48,6 +25,33 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
|
|
import java.util.logging.Handler;
|
|
import java.util.logging.Level;
|
|
import java.util.logging.Logger;
|
|
+
|
|
+import com.google.common.base.Charsets;
|
|
+import com.google.common.base.Preconditions;
|
|
+import com.google.common.base.Predicate;
|
|
+import com.google.common.collect.Iterables;
|
|
+import com.google.common.collect.Lists;
|
|
+import com.google.common.collect.Sets;
|
|
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
|
+import com.google.gson.Gson;
|
|
+import com.google.gson.GsonBuilder;
|
|
+
|
|
+import dev._2lstudios.flamecord.FlameCord;
|
|
+import dev._2lstudios.flamecord.configuration.MessagesConfiguration;
|
|
+import dev._2lstudios.flamecord.configuration.ModulesConfiguration;
|
|
+import dev._2lstudios.flamecord.firewall.FirewallManager;
|
|
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
|
+import io.github.waterfallmc.waterfall.conf.WaterfallConfiguration;
|
|
+import io.github.waterfallmc.waterfall.event.ProxyExceptionEvent;
|
|
+import io.github.waterfallmc.waterfall.exception.ProxyPluginEnableDisableException;
|
|
+import io.netty.bootstrap.ServerBootstrap;
|
|
+import io.netty.channel.Channel;
|
|
+import io.netty.channel.ChannelException;
|
|
+import io.netty.channel.ChannelFuture;
|
|
+import io.netty.channel.ChannelFutureListener;
|
|
+import io.netty.channel.ChannelOption;
|
|
+import io.netty.channel.EventLoopGroup;
|
|
+import io.netty.util.ResourceLeakDetector;
|
|
import lombok.Getter;
|
|
import lombok.Setter;
|
|
import lombok.Synchronized;
|
|
@@ -67,6 +71,7 @@ import net.md_5.bungee.api.config.ConfigurationAdapter;
|
|
import net.md_5.bungee.api.config.ListenerInfo;
|
|
import net.md_5.bungee.api.config.ServerInfo;
|
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
|
+import net.md_5.bungee.api.plugin.Command;
|
|
import net.md_5.bungee.api.plugin.Plugin;
|
|
import net.md_5.bungee.api.plugin.PluginManager;
|
|
import net.md_5.bungee.chat.ComponentSerializer;
|
|
@@ -86,6 +91,12 @@ import net.md_5.bungee.conf.Configuration;
|
|
import net.md_5.bungee.conf.YamlConfig;
|
|
import net.md_5.bungee.forge.ForgeConstants;
|
|
import net.md_5.bungee.module.ModuleManager;
|
|
+import net.md_5.bungee.module.cmd.alert.CommandAlert;
|
|
+import net.md_5.bungee.module.cmd.find.CommandFind;
|
|
+import net.md_5.bungee.module.cmd.list.CommandList;
|
|
+import net.md_5.bungee.module.cmd.send.CommandSend;
|
|
+import net.md_5.bungee.module.cmd.server.CommandServer;
|
|
+import net.md_5.bungee.module.reconnect.yaml.YamlReconnectHandler;
|
|
import net.md_5.bungee.netty.PipelineUtils;
|
|
import net.md_5.bungee.protocol.DefinedPacket;
|
|
import net.md_5.bungee.protocol.ProtocolConstants;
|
|
@@ -97,8 +108,7 @@ import net.md_5.bungee.util.CaseInsensitiveMap;
|
|
/**
|
|
* Main BungeeCord proxy class.
|
|
*/
|
|
-public class BungeeCord extends ProxyServer
|
|
-{
|
|
+public class BungeeCord extends ProxyServer {
|
|
|
|
/**
|
|
* Current operation state.
|
|
@@ -118,8 +128,9 @@ public class BungeeCord extends ProxyServer
|
|
/**
|
|
* locations.yml save thread.
|
|
*/
|
|
- private final Timer saveThread = new Timer( "Reconnect Saver" );
|
|
- // private final Timer metricsThread = new Timer( "Metrics Thread" ); // Waterfall: Disable Metrics
|
|
+ private final Timer saveThread = new Timer("Reconnect Saver");
|
|
+ // private final Timer metricsThread = new Timer( "Metrics Thread" ); //
|
|
+ // Waterfall: Disable Metrics
|
|
/**
|
|
* Server socket listener.
|
|
*/
|
|
@@ -133,8 +144,8 @@ public class BungeeCord extends ProxyServer
|
|
private final Map<UUID, UserConnection> connectionsByUUID = new HashMap<>();
|
|
private final ReadWriteLock connectionLock = new ReentrantReadWriteLock();
|
|
/**
|
|
- * Lock to protect the shutdown process from being triggered simultaneously
|
|
- * from multiple sources.
|
|
+ * Lock to protect the shutdown process from being triggered simultaneously from
|
|
+ * multiple sources.
|
|
*/
|
|
private final ReentrantLock shutdownLock = new ReentrantLock();
|
|
/**
|
|
@@ -150,33 +161,31 @@ public class BungeeCord extends ProxyServer
|
|
private ConfigurationAdapter configurationAdapter = new YamlConfig();
|
|
private final Collection<String> pluginChannels = new HashSet<>();
|
|
@Getter
|
|
- private final File pluginsFolder = new File( "plugins" );
|
|
+ private final File pluginsFolder = new File("plugins");
|
|
@Getter
|
|
private final BungeeScheduler scheduler = new BungeeScheduler();
|
|
// Waterfall start - Remove ConsoleReader for JLine 3 update
|
|
/*
|
|
- @Getter
|
|
- private final ConsoleReader consoleReader;
|
|
- */
|
|
+ * @Getter private final ConsoleReader consoleReader;
|
|
+ */
|
|
// Waterfall end
|
|
@Getter
|
|
private final Logger logger;
|
|
- public final Gson gson = new GsonBuilder()
|
|
- .registerTypeAdapter( BaseComponent.class, new ComponentSerializer() )
|
|
- .registerTypeAdapter( TextComponent.class, new TextComponentSerializer() )
|
|
- .registerTypeAdapter( TranslatableComponent.class, new TranslatableComponentSerializer() )
|
|
- .registerTypeAdapter( KeybindComponent.class, new KeybindComponentSerializer() )
|
|
- .registerTypeAdapter( ScoreComponent.class, new ScoreComponentSerializer() )
|
|
- .registerTypeAdapter( SelectorComponent.class, new SelectorComponentSerializer() )
|
|
- .registerTypeAdapter( ServerPing.PlayerInfo.class, new PlayerInfoSerializer() )
|
|
- .registerTypeAdapter( Favicon.class, Favicon.getFaviconTypeAdapter() ).create();
|
|
+ public final Gson gson = new GsonBuilder().registerTypeAdapter(BaseComponent.class, new ComponentSerializer())
|
|
+ .registerTypeAdapter(TextComponent.class, new TextComponentSerializer())
|
|
+ .registerTypeAdapter(TranslatableComponent.class, new TranslatableComponentSerializer())
|
|
+ .registerTypeAdapter(KeybindComponent.class, new KeybindComponentSerializer())
|
|
+ .registerTypeAdapter(ScoreComponent.class, new ScoreComponentSerializer())
|
|
+ .registerTypeAdapter(SelectorComponent.class, new SelectorComponentSerializer())
|
|
+ .registerTypeAdapter(ServerPing.PlayerInfo.class, new PlayerInfoSerializer())
|
|
+ .registerTypeAdapter(Favicon.class, Favicon.getFaviconTypeAdapter()).create();
|
|
// Travertine start
|
|
- public final Gson gsonLegacy = new GsonBuilder()
|
|
- .registerTypeAdapter( BaseComponent.class, new ComponentSerializer() )
|
|
- .registerTypeAdapter( TextComponent.class, new TextComponentSerializer() )
|
|
- .registerTypeAdapter( TranslatableComponent.class, new TranslatableComponentSerializer() )
|
|
- .registerTypeAdapter( ServerPing.PlayerInfo.class, new PlayerInfoSerializer( ProtocolConstants.MINECRAFT_1_7_2 ) )
|
|
- .registerTypeAdapter( Favicon.class, Favicon.getFaviconTypeAdapter() ).create();
|
|
+ public final Gson gsonLegacy = new GsonBuilder().registerTypeAdapter(BaseComponent.class, new ComponentSerializer())
|
|
+ .registerTypeAdapter(TextComponent.class, new TextComponentSerializer())
|
|
+ .registerTypeAdapter(TranslatableComponent.class, new TranslatableComponentSerializer())
|
|
+ .registerTypeAdapter(ServerPing.PlayerInfo.class,
|
|
+ new PlayerInfoSerializer(ProtocolConstants.MINECRAFT_1_7_2))
|
|
+ .registerTypeAdapter(Favicon.class, Favicon.getFaviconTypeAdapter()).create();
|
|
// Travertine end
|
|
@Getter
|
|
private ConnectionThrottle connectionThrottle;
|
|
@@ -184,241 +193,227 @@ public class BungeeCord extends ProxyServer
|
|
|
|
{
|
|
// TODO: Proper fallback when we interface the manager
|
|
- registerChannel( "BungeeCord" );
|
|
+ registerChannel("BungeeCord");
|
|
}
|
|
|
|
- public static BungeeCord getInstance()
|
|
- {
|
|
+ public static BungeeCord getInstance() {
|
|
return (BungeeCord) ProxyServer.getInstance();
|
|
}
|
|
|
|
@SuppressFBWarnings("DM_DEFAULT_ENCODING")
|
|
- public BungeeCord() throws IOException
|
|
- {
|
|
- // Java uses ! to indicate a resource inside of a jar/zip/other container. Running Bungee from within a directory that has a ! will cause this to muck up.
|
|
- Preconditions.checkState( new File( "." ).getAbsolutePath().indexOf( '!' ) == -1, "Cannot use Travertine in directory with ! in path." );
|
|
-
|
|
- try
|
|
- {
|
|
- baseBundle = ResourceBundle.getBundle( "messages" );
|
|
- } catch ( MissingResourceException ex )
|
|
- {
|
|
- baseBundle = ResourceBundle.getBundle( "messages", Locale.ENGLISH );
|
|
+ public BungeeCord() throws IOException {
|
|
+ // Java uses ! to indicate a resource inside of a jar/zip/other container.
|
|
+ // Running Bungee from within a directory that has a ! will cause this to muck
|
|
+ // up.
|
|
+ Preconditions.checkState(new File(".").getAbsolutePath().indexOf('!') == -1,
|
|
+ "Cannot use Travertine in directory with ! in path.");
|
|
+
|
|
+ try {
|
|
+ baseBundle = ResourceBundle.getBundle("messages");
|
|
+ } catch (MissingResourceException ex) {
|
|
+ baseBundle = ResourceBundle.getBundle("messages", Locale.ENGLISH);
|
|
}
|
|
reloadMessages();
|
|
|
|
- // This is a workaround for quite possibly the weirdest bug I have ever encountered in my life!
|
|
- // When jansi attempts to extract its natives, by default it tries to extract a specific version,
|
|
- // using the loading class's implementation version. Normally this works completely fine,
|
|
- // however when on Windows certain characters such as - and : can trigger special behaviour.
|
|
- // Furthermore this behaviour only occurs in specific combinations due to the parsing done by jansi.
|
|
- // For example test-test works fine, but test-test-test does not! In order to avoid this all together but
|
|
- // still keep our versions the same as they were, we set the override property to the essentially garbage version
|
|
- // BungeeCord. This version is only used when extracting the libraries to their temp folder.
|
|
- System.setProperty( "library.jansi.version", "BungeeCord" );
|
|
+ // This is a workaround for quite possibly the weirdest bug I have ever
|
|
+ // encountered in my life!
|
|
+ // When jansi attempts to extract its natives, by default it tries to extract a
|
|
+ // specific version,
|
|
+ // using the loading class's implementation version. Normally this works
|
|
+ // completely fine,
|
|
+ // however when on Windows certain characters such as - and : can trigger
|
|
+ // special behaviour.
|
|
+ // Furthermore this behaviour only occurs in specific combinations due to the
|
|
+ // parsing done by jansi.
|
|
+ // For example test-test works fine, but test-test-test does not! In order to
|
|
+ // avoid this all together but
|
|
+ // still keep our versions the same as they were, we set the override property
|
|
+ // to the essentially garbage version
|
|
+ // BungeeCord. This version is only used when extracting the libraries to their
|
|
+ // temp folder.
|
|
+ System.setProperty("library.jansi.version", "BungeeCord");
|
|
|
|
// Waterfall start - Use TerminalConsoleAppender and Log4J
|
|
/*
|
|
- AnsiConsole.systemInstall();
|
|
- consoleReader = new ConsoleReader();
|
|
- consoleReader.setExpandEvents( false );
|
|
- consoleReader.addCompleter( new ConsoleCommandCompleter( this ) );
|
|
-
|
|
- logger = new BungeeLogger( "BungeeCord", "proxy.log", consoleReader );
|
|
- System.setErr( new PrintStream( new LoggingOutputStream( logger, Level.SEVERE ), true ) );
|
|
- System.setOut( new PrintStream( new LoggingOutputStream( logger, Level.INFO ), true ) );
|
|
- */
|
|
+ * AnsiConsole.systemInstall(); consoleReader = new ConsoleReader();
|
|
+ * consoleReader.setExpandEvents( false ); consoleReader.addCompleter( new
|
|
+ * ConsoleCommandCompleter( this ) );
|
|
+ *
|
|
+ * logger = new BungeeLogger( "BungeeCord", "proxy.log", consoleReader );
|
|
+ * System.setErr( new PrintStream( new LoggingOutputStream( logger, Level.SEVERE
|
|
+ * ), true ) ); System.setOut( new PrintStream( new LoggingOutputStream( logger,
|
|
+ * Level.INFO ), true ) );
|
|
+ */
|
|
logger = io.github.waterfallmc.waterfall.log4j.WaterfallLogger.create();
|
|
// Waterfall end
|
|
|
|
- pluginManager = new PluginManager( this );
|
|
- getPluginManager().registerCommand( null, new CommandReload() );
|
|
- getPluginManager().registerCommand( null, new CommandEnd() );
|
|
- getPluginManager().registerCommand( null, new CommandIP() );
|
|
- getPluginManager().registerCommand( null, new CommandBungee() );
|
|
- getPluginManager().registerCommand( null, new CommandPerms() );
|
|
-
|
|
- if ( !Boolean.getBoolean( "net.md_5.bungee.native.disable" ) )
|
|
- {
|
|
- if ( EncryptionUtil.nativeFactory.load() )
|
|
- {
|
|
- logger.info( "Using mbed TLS based native cipher." );
|
|
- } else
|
|
- {
|
|
- logger.info( "Using standard Java JCE cipher." );
|
|
+ pluginManager = new PluginManager(this);
|
|
+ // FlameCord - Use own module system
|
|
+ // getPluginManager().registerCommand( null, new CommandReload() );
|
|
+ // getPluginManager().registerCommand( null, new CommandEnd() );
|
|
+ // getPluginManager().registerCommand( null, new CommandIP() );
|
|
+ // getPluginManager().registerCommand( null, new CommandBungee() );
|
|
+ // getPluginManager().registerCommand( null, new CommandPerms() );
|
|
+
|
|
+ if (!Boolean.getBoolean("net.md_5.bungee.native.disable")) {
|
|
+ if (EncryptionUtil.nativeFactory.load()) {
|
|
+ logger.info("Using mbed TLS based native cipher.");
|
|
+ } else {
|
|
+ logger.info("Using standard Java JCE cipher.");
|
|
}
|
|
- if ( CompressFactory.zlib.load() )
|
|
- {
|
|
- logger.info( "Using zlib based native compressor." );
|
|
- } else
|
|
- {
|
|
- logger.info( "Using standard Java compressor." );
|
|
+ if (CompressFactory.zlib.load()) {
|
|
+ logger.info("Using zlib based native compressor.");
|
|
+ } else {
|
|
+ logger.info("Using standard Java compressor.");
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
- * Start this proxy instance by loading the configuration, plugins and
|
|
- * starting the connect thread.
|
|
+ * Start this proxy instance by loading the configuration, plugins and starting
|
|
+ * the connect thread.
|
|
*
|
|
* @throws Exception any critical errors encountered
|
|
*/
|
|
@SuppressFBWarnings("RV_RETURN_VALUE_IGNORED_BAD_PRACTICE")
|
|
- public void start() throws Exception
|
|
- {
|
|
- System.setProperty( "io.netty.selectorAutoRebuildThreshold", "0" ); // Seems to cause Bungee to stop accepting connections
|
|
- if ( System.getProperty( "io.netty.leakDetectionLevel" ) == null )
|
|
- {
|
|
- ResourceLeakDetector.setLevel( ResourceLeakDetector.Level.DISABLED ); // Eats performance
|
|
+ public void start() throws Exception {
|
|
+ System.setProperty("io.netty.selectorAutoRebuildThreshold", "0"); // Seems to cause Bungee to stop accepting
|
|
+ // connections
|
|
+ if (System.getProperty("io.netty.leakDetectionLevel") == null) {
|
|
+ ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.DISABLED); // Eats performance
|
|
}
|
|
|
|
- bossEventLoopGroup = PipelineUtils.newEventLoopGroup( 0, new ThreadFactoryBuilder().setNameFormat( "Netty Boss IO Thread #%1$d" ).build() );
|
|
- workerEventLoopGroup = PipelineUtils.newEventLoopGroup( 0, new ThreadFactoryBuilder().setNameFormat( "Netty Worker IO Thread #%1$d" ).build() );
|
|
+ bossEventLoopGroup = PipelineUtils.newEventLoopGroup(0,
|
|
+ new ThreadFactoryBuilder().setNameFormat("Netty Boss IO Thread #%1$d").build());
|
|
+ workerEventLoopGroup = PipelineUtils.newEventLoopGroup(0,
|
|
+ new ThreadFactoryBuilder().setNameFormat("Netty Worker IO Thread #%1$d").build());
|
|
|
|
- File moduleDirectory = new File( "modules" );
|
|
- moduleManager.load( this, moduleDirectory );
|
|
- pluginManager.detectPlugins( moduleDirectory );
|
|
+ // FlameCord - Use own module system and reload FlameCord
|
|
+ /*
|
|
+ * File moduleDirectory = new File( "modules" ); moduleManager.load( this,
|
|
+ * moduleDirectory ); pluginManager.detectPlugins( moduleDirectory );
|
|
+ */
|
|
+ FlameCord.renew(logger);
|
|
+ registerModules();
|
|
|
|
pluginsFolder.mkdir();
|
|
- pluginManager.detectPlugins( pluginsFolder );
|
|
+ pluginManager.detectPlugins(pluginsFolder);
|
|
|
|
pluginManager.loadPlugins();
|
|
config.load();
|
|
|
|
- if ( config.isForgeSupport() )
|
|
- {
|
|
- registerChannel( ForgeConstants.FML_TAG );
|
|
- registerChannel( ForgeConstants.FML_HANDSHAKE_TAG );
|
|
- registerChannel( ForgeConstants.FORGE_REGISTER );
|
|
+ if (config.isForgeSupport()) {
|
|
+ registerChannel(ForgeConstants.FML_TAG);
|
|
+ registerChannel(ForgeConstants.FML_HANDSHAKE_TAG);
|
|
+ registerChannel(ForgeConstants.FORGE_REGISTER);
|
|
}
|
|
|
|
isRunning = true;
|
|
|
|
pluginManager.enablePlugins();
|
|
|
|
- if ( config.getThrottle() > 0 )
|
|
- {
|
|
- connectionThrottle = new ConnectionThrottle( config.getThrottle(), config.getThrottleLimit() );
|
|
+ if (config.getThrottle() > 0) {
|
|
+ connectionThrottle = new ConnectionThrottle(config.getThrottle(), config.getThrottleLimit());
|
|
}
|
|
startListeners();
|
|
|
|
- saveThread.scheduleAtFixedRate( new TimerTask()
|
|
- {
|
|
+ saveThread.scheduleAtFixedRate(new TimerTask() {
|
|
@Override
|
|
- public void run()
|
|
- {
|
|
- if ( getReconnectHandler() != null )
|
|
- {
|
|
+ public void run() {
|
|
+ if (getReconnectHandler() != null) {
|
|
getReconnectHandler().save();
|
|
}
|
|
}
|
|
- }, 0, TimeUnit.MINUTES.toMillis( 5 ) );
|
|
- //metricsThread.scheduleAtFixedRate( new Metrics(), 0, TimeUnit.MINUTES.toMillis( Metrics.PING_INTERVAL ) ); // Waterfall: Disable Metrics
|
|
+ }, 0, TimeUnit.MINUTES.toMillis(5));
|
|
+ // metricsThread.scheduleAtFixedRate( new Metrics(), 0,
|
|
+ // TimeUnit.MINUTES.toMillis( Metrics.PING_INTERVAL ) ); // Waterfall: Disable
|
|
+ // Metrics
|
|
|
|
- Runtime.getRuntime().addShutdownHook( new Thread()
|
|
- {
|
|
+ Runtime.getRuntime().addShutdownHook(new Thread() {
|
|
@Override
|
|
- public void run()
|
|
- {
|
|
- independentThreadStop( getTranslation( "restart" ), false );
|
|
+ public void run() {
|
|
+ independentThreadStop(getTranslation("restart"), false);
|
|
}
|
|
- } );
|
|
+ });
|
|
}
|
|
|
|
- public void startListeners()
|
|
- {
|
|
- for ( final ListenerInfo info : config.getListeners() )
|
|
- {
|
|
- if ( info.isProxyProtocol() )
|
|
- {
|
|
- getLogger().log( Level.WARNING, "Using PROXY protocol for listener {0}, please ensure this listener is adequately firewalled.", info.getSocketAddress() );
|
|
-
|
|
- if ( connectionThrottle != null )
|
|
- {
|
|
+ public void startListeners() {
|
|
+ for (final ListenerInfo info : config.getListeners()) {
|
|
+ if (info.isProxyProtocol()) {
|
|
+ logger.log(Level.WARNING,
|
|
+ "Using PROXY protocol for listener {0}, please ensure this listener is adequately firewalled.",
|
|
+ info.getSocketAddress());
|
|
+
|
|
+ if (connectionThrottle != null) {
|
|
connectionThrottle = null;
|
|
- getLogger().log( Level.WARNING, "Since PROXY protocol is in use, internal connection throttle has been disabled." );
|
|
+ logger.log(Level.WARNING,
|
|
+ "Since PROXY protocol is in use, internal connection throttle has been disabled.");
|
|
}
|
|
}
|
|
|
|
- ChannelFutureListener listener = new ChannelFutureListener()
|
|
- {
|
|
+ ChannelFutureListener listener = new ChannelFutureListener() {
|
|
@Override
|
|
- public void operationComplete(ChannelFuture future) throws Exception
|
|
- {
|
|
- if ( future.isSuccess() )
|
|
- {
|
|
- listeners.add( future.channel() );
|
|
- getLogger().log( Level.INFO, "Listening on {0}", info.getSocketAddress() );
|
|
- } else
|
|
- {
|
|
- getLogger().log( Level.WARNING, "Could not bind to host " + info.getSocketAddress(), future.cause() );
|
|
+ public void operationComplete(ChannelFuture future) throws Exception {
|
|
+ if (future.isSuccess()) {
|
|
+ listeners.add(future.channel());
|
|
+ logger.log(Level.INFO, "Listening on {0}", info.getSocketAddress());
|
|
+ } else {
|
|
+ logger.log(Level.WARNING, "Could not bind to host " + info.getSocketAddress(), future.cause());
|
|
}
|
|
}
|
|
};
|
|
- new ServerBootstrap()
|
|
- .channel( PipelineUtils.getServerChannel( info.getSocketAddress() ) )
|
|
- .option( ChannelOption.SO_REUSEADDR, true ) // TODO: Move this elsewhere!
|
|
- .childAttr( PipelineUtils.LISTENER, info )
|
|
- .childHandler( PipelineUtils.SERVER_CHILD )
|
|
- .group( bossEventLoopGroup, workerEventLoopGroup )
|
|
- .localAddress( info.getSocketAddress() )
|
|
- .bind().addListener( listener );
|
|
-
|
|
- if ( info.isQueryEnabled() )
|
|
- {
|
|
- Preconditions.checkArgument( info.getSocketAddress() instanceof InetSocketAddress, "Can only create query listener on UDP address" );
|
|
-
|
|
- ChannelFutureListener bindListener = new ChannelFutureListener()
|
|
- {
|
|
+ new ServerBootstrap().channel(PipelineUtils.getServerChannel(info.getSocketAddress()))
|
|
+ .option(ChannelOption.SO_REUSEADDR, true) // TODO: Move this elsewhere!
|
|
+ .childAttr(PipelineUtils.LISTENER, info).childHandler(PipelineUtils.SERVER_CHILD)
|
|
+ .group(bossEventLoopGroup, workerEventLoopGroup).localAddress(info.getSocketAddress()).bind()
|
|
+ .addListener(listener);
|
|
+
|
|
+ if (info.isQueryEnabled()) {
|
|
+ Preconditions.checkArgument(info.getSocketAddress() instanceof InetSocketAddress,
|
|
+ "Can only create query listener on UDP address");
|
|
+
|
|
+ ChannelFutureListener bindListener = new ChannelFutureListener() {
|
|
@Override
|
|
- public void operationComplete(ChannelFuture future) throws Exception
|
|
- {
|
|
- if ( future.isSuccess() )
|
|
- {
|
|
- listeners.add( future.channel() );
|
|
- getLogger().log( Level.INFO, "Started query on {0}", future.channel().localAddress() );
|
|
- } else
|
|
- {
|
|
- getLogger().log( Level.WARNING, "Could not bind to host " + info.getSocketAddress(), future.cause() );
|
|
+ public void operationComplete(ChannelFuture future) throws Exception {
|
|
+ if (future.isSuccess()) {
|
|
+ listeners.add(future.channel());
|
|
+ logger.log(Level.INFO, "Started query on {0}", future.channel().localAddress());
|
|
+ } else {
|
|
+ logger.log(Level.WARNING, "Could not bind to host " + info.getSocketAddress(),
|
|
+ future.cause());
|
|
}
|
|
}
|
|
};
|
|
- new RemoteQuery( this, info ).start( PipelineUtils.getDatagramChannel(), new InetSocketAddress( info.getHost().getAddress(), info.getQueryPort() ), workerEventLoopGroup, bindListener );
|
|
+ new RemoteQuery(this, info).start(PipelineUtils.getDatagramChannel(),
|
|
+ new InetSocketAddress(info.getHost().getAddress(), info.getQueryPort()), workerEventLoopGroup,
|
|
+ bindListener);
|
|
}
|
|
}
|
|
}
|
|
|
|
- public void stopListeners()
|
|
- {
|
|
- for ( Channel listener : listeners )
|
|
- {
|
|
- getLogger().log( Level.INFO, "Closing listener {0}", listener );
|
|
- try
|
|
- {
|
|
+ public void stopListeners() {
|
|
+ for (Channel listener : listeners) {
|
|
+ logger.log(Level.INFO, "Closing listener {0}", listener);
|
|
+ try {
|
|
listener.close().syncUninterruptibly();
|
|
- } catch ( ChannelException ex )
|
|
- {
|
|
- getLogger().severe( "Could not close listen thread" );
|
|
+ } catch (ChannelException ex) {
|
|
+ logger.severe("Could not close listen thread");
|
|
}
|
|
}
|
|
listeners.clear();
|
|
}
|
|
|
|
@Override
|
|
- public void stop()
|
|
- {
|
|
- stop( getTranslation( "restart" ) );
|
|
+ public void stop() {
|
|
+ stop(getTranslation("restart"));
|
|
}
|
|
|
|
@Override
|
|
- public void stop(final String reason)
|
|
- {
|
|
- new Thread( "Shutdown Thread" )
|
|
- {
|
|
+ public void stop(final String reason) {
|
|
+ new Thread("Shutdown Thread") {
|
|
@Override
|
|
- public void run()
|
|
- {
|
|
- independentThreadStop( reason, true );
|
|
+ public void run() {
|
|
+ independentThreadStop(reason, true);
|
|
}
|
|
}.start();
|
|
}
|
|
@@ -426,15 +421,14 @@ public class BungeeCord extends ProxyServer
|
|
// This must be run on a separate thread to avoid deadlock!
|
|
@SuppressFBWarnings("DM_EXIT")
|
|
@SuppressWarnings("TooBroadCatch")
|
|
- private void independentThreadStop(final String reason, boolean callSystemExit)
|
|
- {
|
|
+ private void independentThreadStop(final String reason, boolean callSystemExit) {
|
|
// Acquire the shutdown lock
|
|
- // This needs to actually block here, otherwise running 'end' and then ctrl+c will cause the thread to terminate prematurely
|
|
+ // This needs to actually block here, otherwise running 'end' and then ctrl+c
|
|
+ // will cause the thread to terminate prematurely
|
|
shutdownLock.lock();
|
|
|
|
// Acquired the shutdown lock
|
|
- if ( !isRunning )
|
|
- {
|
|
+ if (!isRunning) {
|
|
// Server is already shutting down - nothing to do
|
|
shutdownLock.unlock();
|
|
return;
|
|
@@ -442,84 +436,75 @@ public class BungeeCord extends ProxyServer
|
|
isRunning = false;
|
|
|
|
stopListeners();
|
|
- getLogger().info( "Closing pending connections" );
|
|
+ getLogger().info("Closing pending connections");
|
|
|
|
connectionLock.readLock().lock();
|
|
- try
|
|
- {
|
|
- getLogger().log( Level.INFO, "Disconnecting {0} connections", connections.size() );
|
|
- for ( UserConnection user : connections.values() )
|
|
- {
|
|
- user.disconnect( reason );
|
|
+ try {
|
|
+ getLogger().log(Level.INFO, "Disconnecting {0} connections", connections.size());
|
|
+ for (UserConnection user : connections.values()) {
|
|
+ user.disconnect(reason);
|
|
}
|
|
- } finally
|
|
- {
|
|
+ } finally {
|
|
connectionLock.readLock().unlock();
|
|
}
|
|
|
|
- try
|
|
- {
|
|
- Thread.sleep( 500 );
|
|
- } catch ( InterruptedException ex )
|
|
- {
|
|
+ try {
|
|
+ Thread.sleep(500);
|
|
+ } catch (InterruptedException ex) {
|
|
}
|
|
|
|
- if ( reconnectHandler != null )
|
|
- {
|
|
- getLogger().info( "Saving reconnect locations" );
|
|
+ if (reconnectHandler != null) {
|
|
+ getLogger().info("Saving reconnect locations");
|
|
reconnectHandler.save();
|
|
reconnectHandler.close();
|
|
}
|
|
saveThread.cancel();
|
|
- //metricsThread.cancel(); // Waterfall: Disable Metrics
|
|
+ // metricsThread.cancel(); // Waterfall: Disable Metrics
|
|
|
|
- getLogger().info( "Disabling plugins" );
|
|
- for ( Plugin plugin : Lists.reverse( new ArrayList<>( pluginManager.getPlugins() ) ) )
|
|
- {
|
|
- try
|
|
- {
|
|
+ getLogger().info("Disabling plugins");
|
|
+ for (Plugin plugin : Lists.reverse(new ArrayList<>(pluginManager.getPlugins()))) {
|
|
+ try {
|
|
plugin.onDisable();
|
|
- for ( Handler handler : plugin.getLogger().getHandlers() )
|
|
- {
|
|
+ for (Handler handler : plugin.getLogger().getHandlers()) {
|
|
handler.close();
|
|
}
|
|
- } catch ( Throwable t )
|
|
- {
|
|
+ } catch (Throwable t) {
|
|
// Waterfall start - throw exception event
|
|
String msg = "Exception disabling plugin " + plugin.getDescription().getName();
|
|
- getLogger().log( Level.SEVERE, msg, t );
|
|
- pluginManager.callEvent( new ProxyExceptionEvent( new ProxyPluginEnableDisableException( msg, t, plugin) ) );
|
|
+ getLogger().log(Level.SEVERE, msg, t);
|
|
+ pluginManager.callEvent(new ProxyExceptionEvent(new ProxyPluginEnableDisableException(msg, t, plugin)));
|
|
// Waterfall end
|
|
}
|
|
- getScheduler().cancel( plugin );
|
|
+ getScheduler().cancel(plugin);
|
|
plugin.getExecutorService().shutdownNow();
|
|
}
|
|
|
|
- getLogger().info( "Closing IO threads" );
|
|
- bossEventLoopGroup.shutdownGracefully();
|
|
- workerEventLoopGroup.shutdownGracefully();
|
|
- while (true) {
|
|
- try {
|
|
- bossEventLoopGroup.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
|
|
- workerEventLoopGroup.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
|
|
- break;
|
|
- } catch (InterruptedException ignored) {}
|
|
+ logger.info("Closing IO threads");
|
|
+ bossEventLoopGroup.shutdownGracefully();
|
|
+ workerEventLoopGroup.shutdownGracefully();
|
|
+ while (true) {
|
|
+ try {
|
|
+ bossEventLoopGroup.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
|
|
+ workerEventLoopGroup.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
|
|
+ break;
|
|
+ } catch (InterruptedException ignored) {
|
|
+ }
|
|
}
|
|
|
|
- getLogger().info( "Thank you and goodbye" );
|
|
+ getLogger().info("Thank you and goodbye");
|
|
// Need to close loggers after last message!
|
|
- for ( Handler handler : getLogger().getHandlers() )
|
|
- {
|
|
+ for (Handler handler : getLogger().getHandlers()) {
|
|
handler.close();
|
|
}
|
|
|
|
- // Unlock the thread before optionally calling system exit, which might invoke this function again.
|
|
- // If that happens, the system will obtain the lock, and then see that isRunning == false and return without doing anything.
|
|
+ // Unlock the thread before optionally calling system exit, which might invoke
|
|
+ // this function again.
|
|
+ // If that happens, the system will obtain the lock, and then see that isRunning
|
|
+ // == false and return without doing anything.
|
|
shutdownLock.unlock();
|
|
|
|
- if ( callSystemExit )
|
|
- {
|
|
- System.exit( 0 );
|
|
+ if (callSystemExit) {
|
|
+ System.exit(0);
|
|
}
|
|
}
|
|
|
|
@@ -528,291 +513,341 @@ public class BungeeCord extends ProxyServer
|
|
*
|
|
* @param packet the packet to send
|
|
*/
|
|
- public void broadcast(DefinedPacket packet)
|
|
- {
|
|
+ public void broadcast(DefinedPacket packet) {
|
|
connectionLock.readLock().lock();
|
|
- try
|
|
- {
|
|
- for ( UserConnection con : connections.values() )
|
|
- {
|
|
- con.unsafe().sendPacket( packet );
|
|
+ try {
|
|
+ for (UserConnection con : connections.values()) {
|
|
+ con.unsafe().sendPacket(packet);
|
|
}
|
|
- } finally
|
|
- {
|
|
+ } finally {
|
|
connectionLock.readLock().unlock();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public String getName()
|
|
- {
|
|
- return "Travertine";
|
|
+ public String getName() {
|
|
+ // FlameCord - Use our own version name
|
|
+ // return "Travertine";
|
|
+ return "FlameCord";
|
|
}
|
|
|
|
@Override
|
|
- public String getVersion()
|
|
- {
|
|
- return ( BungeeCord.class.getPackage().getImplementationVersion() == null ) ? "unknown" : BungeeCord.class.getPackage().getImplementationVersion();
|
|
- }
|
|
-
|
|
- public void reloadMessages()
|
|
- {
|
|
- File file = new File( "messages.properties" );
|
|
- if ( file.isFile() )
|
|
- {
|
|
- try ( FileReader rd = new FileReader( file ) )
|
|
- {
|
|
- customBundle = new PropertyResourceBundle( rd );
|
|
- } catch ( IOException ex )
|
|
- {
|
|
- getLogger().log( Level.SEVERE, "Could not load custom messages.properties", ex );
|
|
+ public String getVersion() {
|
|
+ // FlameCord - Use our own version string
|
|
+ /*
|
|
+ * return (BungeeCord.class.getPackage().getImplementationVersion() == null) ?
|
|
+ * "unknown" : BungeeCord.class.getPackage().getImplementationVersion();
|
|
+ */
|
|
+ return "0.3.9";
|
|
+ }
|
|
+
|
|
+ public void reloadMessages() {
|
|
+ File file = new File("messages.properties");
|
|
+ if (file.isFile()) {
|
|
+ try (FileReader rd = new FileReader(file)) {
|
|
+ customBundle = new PropertyResourceBundle(rd);
|
|
+ } catch (IOException ex) {
|
|
+ getLogger().log(Level.SEVERE, "Could not load custom messages.properties", ex);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public String getTranslation(String name, Object... args)
|
|
- {
|
|
- String translation = "<translation '" + name + "' missing>";
|
|
- try
|
|
- {
|
|
- final String string = customBundle != null && customBundle.containsKey( name ) ? customBundle.getString( name ) : baseBundle.getString( name );
|
|
-
|
|
- translation = ( args.length == 0 ) ? string : MessageFormat.format( string, args );
|
|
- } catch ( MissingResourceException ex )
|
|
- {
|
|
- }
|
|
- return translation;
|
|
+ public String getTranslation(String name, Object... args) {
|
|
+ // FlameCord - Use our own translation system
|
|
+ /*
|
|
+ * String translation = "<translation '" + name + "' missing>"; try { final
|
|
+ * String string = customBundle != null && customBundle.containsKey(name) ?
|
|
+ * customBundle.getString(name) : baseBundle.getString(name);
|
|
+ *
|
|
+ * translation = (args.length == 0) ? string : MessageFormat.format(string,
|
|
+ * args); } catch (MissingResourceException ex) { } return translation;
|
|
+ */
|
|
+ return FlameCord.getInstance().getMessagesConfiguration().getTranslation(name, args);
|
|
}
|
|
|
|
@Override
|
|
@SuppressWarnings("unchecked")
|
|
- public Collection<ProxiedPlayer> getPlayers()
|
|
- {
|
|
+ public Collection<ProxiedPlayer> getPlayers() {
|
|
connectionLock.readLock().lock();
|
|
- try
|
|
- {
|
|
- return Collections.unmodifiableCollection( new HashSet( connections.values() ) );
|
|
- } finally
|
|
- {
|
|
+ try {
|
|
+ return Collections.unmodifiableCollection(new HashSet(connections.values()));
|
|
+ } finally {
|
|
connectionLock.readLock().unlock();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public int getOnlineCount()
|
|
- {
|
|
+ public int getOnlineCount() {
|
|
return connections.size();
|
|
}
|
|
|
|
@Override
|
|
- public ProxiedPlayer getPlayer(String name)
|
|
- {
|
|
+ public ProxiedPlayer getPlayer(String name) {
|
|
connectionLock.readLock().lock();
|
|
- try
|
|
- {
|
|
- return connections.get( name );
|
|
- } finally
|
|
- {
|
|
+ try {
|
|
+ return connections.get(name);
|
|
+ } finally {
|
|
connectionLock.readLock().unlock();
|
|
}
|
|
}
|
|
|
|
- public UserConnection getPlayerByOfflineUUID(UUID name)
|
|
- {
|
|
+ public UserConnection getPlayerByOfflineUUID(UUID name) {
|
|
connectionLock.readLock().lock();
|
|
- try
|
|
- {
|
|
- return connectionsByOfflineUUID.get( name );
|
|
- } finally
|
|
- {
|
|
+ try {
|
|
+ return connectionsByOfflineUUID.get(name);
|
|
+ } finally {
|
|
connectionLock.readLock().unlock();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public ProxiedPlayer getPlayer(UUID uuid)
|
|
- {
|
|
+ public ProxiedPlayer getPlayer(UUID uuid) {
|
|
connectionLock.readLock().lock();
|
|
- try
|
|
- {
|
|
- return connectionsByUUID.get( uuid );
|
|
- } finally
|
|
- {
|
|
+ try {
|
|
+ return connectionsByUUID.get(uuid);
|
|
+ } finally {
|
|
connectionLock.readLock().unlock();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public Map<String, ServerInfo> getServers()
|
|
- {
|
|
+ public Map<String, ServerInfo> getServers() {
|
|
return config.getServers();
|
|
}
|
|
|
|
// Waterfall start
|
|
@Override
|
|
- public Map<String, ServerInfo> getServersCopy()
|
|
- {
|
|
+ public Map<String, ServerInfo> getServersCopy() {
|
|
return config.getServersCopy();
|
|
}
|
|
// Waterfall end
|
|
|
|
@Override
|
|
- public ServerInfo getServerInfo(String name)
|
|
- {
|
|
- return config.getServerInfo( name ); // Waterfall
|
|
+ public ServerInfo getServerInfo(String name) {
|
|
+ return config.getServerInfo(name); // Waterfall
|
|
}
|
|
|
|
@Override
|
|
@Synchronized("pluginChannels")
|
|
- public void registerChannel(String channel)
|
|
- {
|
|
- pluginChannels.add( channel );
|
|
+ public void registerChannel(String channel) {
|
|
+ pluginChannels.add(channel);
|
|
}
|
|
|
|
@Override
|
|
@Synchronized("pluginChannels")
|
|
- public void unregisterChannel(String channel)
|
|
- {
|
|
- pluginChannels.remove( channel );
|
|
+ public void unregisterChannel(String channel) {
|
|
+ pluginChannels.remove(channel);
|
|
}
|
|
|
|
@Override
|
|
@Synchronized("pluginChannels")
|
|
- public Collection<String> getChannels()
|
|
- {
|
|
- return Collections.unmodifiableCollection( pluginChannels );
|
|
+ public Collection<String> getChannels() {
|
|
+ return Collections.unmodifiableCollection(pluginChannels);
|
|
}
|
|
|
|
- public PluginMessage registerChannels(int protocolVersion)
|
|
- {
|
|
- if ( protocolVersion >= ProtocolConstants.MINECRAFT_1_13 )
|
|
- {
|
|
- return new PluginMessage( "minecraft:register", Util.format( Iterables.transform( pluginChannels, PluginMessage.MODERNISE ), "\00" ).getBytes( Charsets.UTF_8 ), false );
|
|
+ public PluginMessage registerChannels(int protocolVersion) {
|
|
+ if (protocolVersion >= ProtocolConstants.MINECRAFT_1_13) {
|
|
+ return new PluginMessage("minecraft:register",
|
|
+ Util.format(Iterables.transform(pluginChannels, PluginMessage.MODERNISE), "\00")
|
|
+ .getBytes(Charsets.UTF_8),
|
|
+ false);
|
|
}
|
|
|
|
- return new PluginMessage( "REGISTER", Util.format( pluginChannels, "\00" ).getBytes( Charsets.UTF_8 ), false );
|
|
+ return new PluginMessage("REGISTER", Util.format(pluginChannels, "\00").getBytes(Charsets.UTF_8), false);
|
|
}
|
|
|
|
@Override
|
|
- public int getProtocolVersion()
|
|
- {
|
|
- return ProtocolConstants.SUPPORTED_VERSION_IDS.get( ProtocolConstants.SUPPORTED_VERSION_IDS.size() - 1 );
|
|
+ public int getProtocolVersion() {
|
|
+ return ProtocolConstants.SUPPORTED_VERSION_IDS.get(ProtocolConstants.SUPPORTED_VERSION_IDS.size() - 1);
|
|
}
|
|
|
|
@Override
|
|
- public String getGameVersion()
|
|
- {
|
|
+ public String getGameVersion() {
|
|
return getConfig().getGameVersion(); // Waterfall
|
|
}
|
|
|
|
@Override
|
|
- public ServerInfo constructServerInfo(String name, InetSocketAddress address, String motd, boolean restricted)
|
|
- {
|
|
- return constructServerInfo( name, (SocketAddress) address, motd, restricted );
|
|
+ public ServerInfo constructServerInfo(String name, InetSocketAddress address, String motd, boolean restricted) {
|
|
+ return constructServerInfo(name, (SocketAddress) address, motd, restricted);
|
|
}
|
|
|
|
@Override
|
|
- public ServerInfo constructServerInfo(String name, SocketAddress address, String motd, boolean restricted)
|
|
- {
|
|
- return new BungeeServerInfo( name, address, motd, restricted );
|
|
+ public ServerInfo constructServerInfo(String name, SocketAddress address, String motd, boolean restricted) {
|
|
+ return new BungeeServerInfo(name, address, motd, restricted);
|
|
}
|
|
|
|
@Override
|
|
- public CommandSender getConsole()
|
|
- {
|
|
+ public CommandSender getConsole() {
|
|
return ConsoleCommandSender.getInstance();
|
|
}
|
|
|
|
@Override
|
|
- public void broadcast(String message)
|
|
- {
|
|
- broadcast( TextComponent.fromLegacyText( message ) );
|
|
+ public void broadcast(String message) {
|
|
+ broadcast(TextComponent.fromLegacyText(message));
|
|
}
|
|
|
|
@Override
|
|
- public void broadcast(BaseComponent... message)
|
|
- {
|
|
- getConsole().sendMessage( BaseComponent.toLegacyText( message ) );
|
|
- for ( ProxiedPlayer player : getPlayers() )
|
|
- {
|
|
- player.sendMessage( message );
|
|
+ public void broadcast(BaseComponent... message) {
|
|
+ getConsole().sendMessage(BaseComponent.toLegacyText(message));
|
|
+ for (ProxiedPlayer player : getPlayers()) {
|
|
+ player.sendMessage(message);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void broadcast(BaseComponent message)
|
|
- {
|
|
- getConsole().sendMessage( message.toLegacyText() );
|
|
- for ( ProxiedPlayer player : getPlayers() )
|
|
- {
|
|
- player.sendMessage( message );
|
|
+ public void broadcast(BaseComponent message) {
|
|
+ getConsole().sendMessage(message.toLegacyText());
|
|
+ for (ProxiedPlayer player : getPlayers()) {
|
|
+ player.sendMessage(message);
|
|
}
|
|
}
|
|
|
|
- public void addConnection(UserConnection con)
|
|
- {
|
|
+ public void addConnection(UserConnection con) {
|
|
connectionLock.writeLock().lock();
|
|
- try
|
|
- {
|
|
- connections.put( con.getName(), con );
|
|
- connectionsByUUID.put( con.getUniqueId(), con );
|
|
- connectionsByOfflineUUID.put( con.getPendingConnection().getOfflineId(), con );
|
|
- } finally
|
|
- {
|
|
+ try {
|
|
+ connections.put(con.getName(), con);
|
|
+ connectionsByUUID.put(con.getUniqueId(), con);
|
|
+ connectionsByOfflineUUID.put(con.getPendingConnection().getOfflineId(), con);
|
|
+ } finally {
|
|
connectionLock.writeLock().unlock();
|
|
}
|
|
}
|
|
|
|
- public void removeConnection(UserConnection con)
|
|
- {
|
|
+ public void removeConnection(UserConnection con) {
|
|
connectionLock.writeLock().lock();
|
|
- try
|
|
- {
|
|
+ try {
|
|
// TODO See #1218
|
|
- if ( connections.get( con.getName() ) == con )
|
|
- {
|
|
- connections.remove( con.getName() );
|
|
- connectionsByUUID.remove( con.getUniqueId() );
|
|
- connectionsByOfflineUUID.remove( con.getPendingConnection().getOfflineId() );
|
|
+ if (connections.get(con.getName()) == con) {
|
|
+ connections.remove(con.getName());
|
|
+ connectionsByUUID.remove(con.getUniqueId());
|
|
+ connectionsByOfflineUUID.remove(con.getPendingConnection().getOfflineId());
|
|
}
|
|
- } finally
|
|
- {
|
|
+ } finally {
|
|
connectionLock.writeLock().unlock();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public Collection<String> getDisabledCommands()
|
|
- {
|
|
+ public Collection<String> getDisabledCommands() {
|
|
return config.getDisabledCommands();
|
|
}
|
|
|
|
@Override
|
|
- public Collection<ProxiedPlayer> matchPlayer(final String partialName)
|
|
- {
|
|
- Preconditions.checkNotNull( partialName, "partialName" );
|
|
+ public Collection<ProxiedPlayer> matchPlayer(final String partialName) {
|
|
+ Preconditions.checkNotNull(partialName, "partialName");
|
|
|
|
- ProxiedPlayer exactMatch = getPlayer( partialName );
|
|
- if ( exactMatch != null )
|
|
- {
|
|
- return Collections.singleton( exactMatch );
|
|
+ ProxiedPlayer exactMatch = getPlayer(partialName);
|
|
+ if (exactMatch != null) {
|
|
+ return Collections.singleton(exactMatch);
|
|
}
|
|
|
|
- return Sets.newHashSet( Iterables.filter( getPlayers(), new Predicate<ProxiedPlayer>()
|
|
- {
|
|
+ return Sets.newHashSet(Iterables.filter(getPlayers(), new Predicate<ProxiedPlayer>() {
|
|
|
|
@Override
|
|
- public boolean apply(ProxiedPlayer input)
|
|
- {
|
|
- return ( input == null ) ? false : input.getName().toLowerCase( Locale.ROOT ).startsWith( partialName.toLowerCase( Locale.ROOT ) );
|
|
+ public boolean apply(ProxiedPlayer input) {
|
|
+ return (input == null) ? false
|
|
+ : input.getName().toLowerCase(Locale.ROOT).startsWith(partialName.toLowerCase(Locale.ROOT));
|
|
}
|
|
- } ) );
|
|
+ }));
|
|
}
|
|
|
|
@Override
|
|
- public Title createTitle()
|
|
- {
|
|
+ public Title createTitle() {
|
|
return new BungeeTitle();
|
|
}
|
|
+
|
|
+ // FlameCord - Method to simplify module registering
|
|
+ public void registerModules() {
|
|
+ final PluginManager pluginManager = getPluginManager();
|
|
+ final ModulesConfiguration modulesConfiguration = FlameCord.getInstance().getModulesConfiguration();
|
|
+
|
|
+ // Bungeecord Commands
|
|
+ pluginManager.registerCommand(null, new CommandEnd());
|
|
+ pluginManager.registerCommand(null, new CommandBungee());
|
|
+
|
|
+ if (modulesConfiguration.reloadEnabled) {
|
|
+ pluginManager.registerCommand(null, new CommandReload());
|
|
+ }
|
|
+ if (modulesConfiguration.ipEnabled) {
|
|
+ pluginManager.registerCommand(null, new CommandIP());
|
|
+ }
|
|
+ if (modulesConfiguration.permsEnabled) {
|
|
+ pluginManager.registerCommand(null, new CommandPerms());
|
|
+ }
|
|
+
|
|
+ // Modules Commands
|
|
+ if (modulesConfiguration.alertEnabled) {
|
|
+ pluginManager.registerCommand(null, new CommandAlert());
|
|
+ }
|
|
+ if (modulesConfiguration.findEnabled) {
|
|
+ pluginManager.registerCommand(null, new CommandFind());
|
|
+ }
|
|
+ if (modulesConfiguration.listEnabled) {
|
|
+ pluginManager.registerCommand(null, new CommandList());
|
|
+ }
|
|
+ if (modulesConfiguration.sendEnabled) {
|
|
+ pluginManager.registerCommand(null, new CommandSend());
|
|
+ }
|
|
+ if (modulesConfiguration.serverEnabled) {
|
|
+ pluginManager.registerCommand(null, new CommandServer());
|
|
+ }
|
|
+
|
|
+ try {
|
|
+ if (modulesConfiguration.reconnectEnabled) {
|
|
+ for (ListenerInfo info : getConfig().getListeners()) {
|
|
+ if (!info.isForceDefault() && getReconnectHandler() == null) {
|
|
+ setReconnectHandler(new YamlReconnectHandler());
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ } catch (final Exception exception) {
|
|
+ logger.warning("Reconnect module is not able to work on FlameCord!");
|
|
+ }
|
|
+
|
|
+ // Flamecord - Commands (Had to make it like this because of netty limitations)
|
|
+ pluginManager.registerCommand(null, new Command("flamecord") {
|
|
+ @Override
|
|
+ public void execute(final CommandSender sender, final String[] args) {
|
|
+ final FlameCord flameCord = FlameCord.getInstance();
|
|
+ final MessagesConfiguration messagesConfiguration = flameCord.getMessagesConfiguration();
|
|
+
|
|
+ if (sender.hasPermission("flamecord.usage")) {
|
|
+ if (args.length > 0) {
|
|
+ final String arg0 = args[0];
|
|
+
|
|
+ switch (arg0) {
|
|
+ case "firewall": {
|
|
+ final FirewallManager firewallManager = flameCord.getFirewallManager();
|
|
+ final int amount = firewallManager.getFirewalled().size(),
|
|
+ seconds = firewallManager.getSeconds();
|
|
+
|
|
+ sender.sendMessage(TextComponent.fromLegacyText(
|
|
+ messagesConfiguration.getTranslation("firewall_info", amount, seconds)));
|
|
+ break;
|
|
+ }
|
|
+ case "reload": {
|
|
+ FlameCord.renew(logger);
|
|
+ sender.sendMessage(TextComponent
|
|
+ .fromLegacyText(messagesConfiguration.getTranslation("flamecord_reload")));
|
|
+ break;
|
|
+ }
|
|
+ default: {
|
|
+ sender.sendMessage(TextComponent.fromLegacyText(
|
|
+ messagesConfiguration.getTranslation("flamecord_help", getVersion())));
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ } else {
|
|
+ sender.sendMessage(TextComponent
|
|
+ .fromLegacyText(messagesConfiguration.getTranslation("flamecord_help", getVersion())));
|
|
+ }
|
|
+ } else {
|
|
+ sender.sendMessage(TextComponent
|
|
+ .fromLegacyText(messagesConfiguration.getTranslation("flamecord_nopermission")));
|
|
+ }
|
|
+ }
|
|
+ });
|
|
+ }
|
|
}
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeCordLauncher.java b/proxy/src/main/java/net/md_5/bungee/BungeeCordLauncher.java
|
|
index ad9a6d0c..a2b585b3 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/BungeeCordLauncher.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/BungeeCordLauncher.java
|
|
@@ -1,80 +1,70 @@
|
|
package net.md_5.bungee;
|
|
|
|
import java.security.Security;
|
|
-import java.text.SimpleDateFormat;
|
|
import java.util.Arrays;
|
|
-import java.util.Calendar;
|
|
-import java.util.Date;
|
|
-import java.util.concurrent.TimeUnit;
|
|
+
|
|
import joptsimple.OptionParser;
|
|
import joptsimple.OptionSet;
|
|
-import net.md_5.bungee.api.ChatColor;
|
|
import net.md_5.bungee.api.ProxyServer;
|
|
-import net.md_5.bungee.api.chat.ComponentBuilder;
|
|
-import net.md_5.bungee.command.ConsoleCommandSender;
|
|
|
|
-public class BungeeCordLauncher
|
|
-{
|
|
+public class BungeeCordLauncher {
|
|
|
|
- public static void main(String[] args) throws Exception
|
|
- {
|
|
- Security.setProperty( "networkaddress.cache.ttl", "30" );
|
|
- Security.setProperty( "networkaddress.cache.negative.ttl", "10" );
|
|
+ public static void main(String[] args) throws Exception {
|
|
+ Security.setProperty("networkaddress.cache.ttl", "30");
|
|
+ Security.setProperty("networkaddress.cache.negative.ttl", "10");
|
|
|
|
OptionParser parser = new OptionParser();
|
|
parser.allowsUnrecognizedOptions();
|
|
- parser.acceptsAll( Arrays.asList( "help" ), "Show the help" );
|
|
- parser.acceptsAll( Arrays.asList( "v", "version" ), "Print version and exit" );
|
|
- parser.acceptsAll( Arrays.asList( "noconsole" ), "Disable console input" );
|
|
+ parser.acceptsAll(Arrays.asList("help"), "Show the help");
|
|
+ parser.acceptsAll(Arrays.asList("v", "version"), "Print version and exit");
|
|
+ parser.acceptsAll(Arrays.asList("noconsole"), "Disable console input");
|
|
|
|
- OptionSet options = parser.parse( args );
|
|
+ OptionSet options = parser.parse(args);
|
|
|
|
- if ( options.has( "help" ) )
|
|
- {
|
|
- parser.printHelpOn( System.out );
|
|
+ if (options.has("help")) {
|
|
+ parser.printHelpOn(System.out);
|
|
return;
|
|
}
|
|
- if ( options.has( "version" ) )
|
|
- {
|
|
- System.out.println( BungeeCord.class.getPackage().getImplementationVersion() );
|
|
+ if (options.has("version")) {
|
|
+ System.out.println(BungeeCord.class.getPackage().getImplementationVersion());
|
|
return;
|
|
}
|
|
|
|
- if ( BungeeCord.class.getPackage().getSpecificationVersion() != null && System.getProperty( "IReallyKnowWhatIAmDoingISwear" ) == null )
|
|
- {
|
|
- Date buildDate = new SimpleDateFormat( "yyyyMMdd" ).parse( BungeeCord.class.getPackage().getSpecificationVersion() );
|
|
-
|
|
- Calendar deadline = Calendar.getInstance();
|
|
- deadline.add( Calendar.WEEK_OF_YEAR, -8 );
|
|
- if ( buildDate.before( deadline.getTime() ) )
|
|
- {
|
|
- System.err.println( "*** Hey! This build is potentially outdated :( ***" );
|
|
- System.err.println( "*** Please check for a new build from https://papermc.io/ci/job/Travertine/ ***" );
|
|
- System.err.println( "*** Should this build be outdated, you will get NO support for it. ***" );
|
|
- System.err.println( "*** Server will start in 10 seconds ***" );
|
|
- Thread.sleep( TimeUnit.SECONDS.toMillis( 10 ) );
|
|
- }
|
|
- }
|
|
+ // FlameCord start - Disable update checker
|
|
+ /*
|
|
+ * if ( BungeeCord.class.getPackage().getSpecificationVersion() != null &&
|
|
+ * System.getProperty( "IReallyKnowWhatIAmDoingISwear" ) == null ) { Date
|
|
+ * buildDate = new SimpleDateFormat( "yyyyMMdd" ).parse(
|
|
+ * BungeeCord.class.getPackage().getSpecificationVersion() );
|
|
+ *
|
|
+ * Calendar deadline = Calendar.getInstance(); deadline.add(
|
|
+ * Calendar.WEEK_OF_YEAR, -8 ); if ( buildDate.before( deadline.getTime() ) ) {
|
|
+ * System.err.println( "*** Hey! This build is potentially outdated :( ***" );
|
|
+ * System.err.println(
|
|
+ * "*** Please check for a new build from https://papermc.io/ci/job/Travertine/ ***"
|
|
+ * ); System.err.println(
|
|
+ * "*** Should this build be outdated, you will get NO support for it. ***" );
|
|
+ * System.err.println( "*** Server will start in 10 seconds ***" );
|
|
+ * Thread.sleep( TimeUnit.SECONDS.toMillis( 10 ) ); } }
|
|
+ */
|
|
|
|
BungeeCord bungee = new BungeeCord();
|
|
- ProxyServer.setInstance( bungee );
|
|
- bungee.getLogger().info( "Enabled Travertine version " + bungee.getVersion() );
|
|
+ ProxyServer.setInstance(bungee);
|
|
+ // FlameCord start - Renamed enabled message
|
|
+ bungee.getLogger().info("Enabled FlameCord version " + bungee.getVersion());
|
|
bungee.start();
|
|
|
|
- if ( !options.has( "noconsole" ) )
|
|
- {
|
|
+ if (!options.has("noconsole")) {
|
|
// Waterfall start - Use TerminalConsoleAppender
|
|
new io.github.waterfallmc.waterfall.console.WaterfallConsole().start();
|
|
/*
|
|
- String line;
|
|
- while ( bungee.isRunning && ( line = bungee.getConsoleReader().readLine( ">" ) ) != null )
|
|
- {
|
|
- if ( !bungee.getPluginManager().dispatchCommand( ConsoleCommandSender.getInstance(), line ) )
|
|
- {
|
|
- bungee.getConsole().sendMessage( new ComponentBuilder( "Command not found" ).color( ChatColor.RED ).create() );
|
|
- }
|
|
- }
|
|
- */
|
|
+ * String line; while ( bungee.isRunning && ( line =
|
|
+ * bungee.getConsoleReader().readLine( ">" ) ) != null ) { if (
|
|
+ * !bungee.getPluginManager().dispatchCommand(
|
|
+ * ConsoleCommandSender.getInstance(), line ) ) {
|
|
+ * bungee.getConsole().sendMessage( new ComponentBuilder( "Command not found"
|
|
+ * ).color( ChatColor.RED ).create() ); } }
|
|
+ */
|
|
// Waterfall end
|
|
}
|
|
}
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeServerInfo.java b/proxy/src/main/java/net/md_5/bungee/BungeeServerInfo.java
|
|
index 7b002089..145bf328 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/BungeeServerInfo.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/BungeeServerInfo.java
|
|
@@ -1,10 +1,5 @@
|
|
package net.md_5.bungee;
|
|
|
|
-import com.google.common.base.Preconditions;
|
|
-import io.netty.bootstrap.Bootstrap;
|
|
-import io.netty.channel.ChannelFuture;
|
|
-import io.netty.channel.ChannelFutureListener;
|
|
-import io.netty.channel.ChannelOption;
|
|
import java.net.InetSocketAddress;
|
|
import java.net.SocketAddress;
|
|
import java.util.ArrayList;
|
|
@@ -14,6 +9,13 @@ import java.util.HashSet;
|
|
import java.util.LinkedList;
|
|
import java.util.Objects;
|
|
import java.util.Queue;
|
|
+
|
|
+import com.google.common.base.Preconditions;
|
|
+
|
|
+import io.netty.bootstrap.Bootstrap;
|
|
+import io.netty.channel.ChannelFuture;
|
|
+import io.netty.channel.ChannelFutureListener;
|
|
+import io.netty.channel.ChannelOption;
|
|
import lombok.Getter;
|
|
import lombok.RequiredArgsConstructor;
|
|
import lombok.Synchronized;
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/PlayerInfoSerializer.java b/proxy/src/main/java/net/md_5/bungee/PlayerInfoSerializer.java
|
|
index 299a216c..0ce9b03b 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/PlayerInfoSerializer.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/PlayerInfoSerializer.java
|
|
@@ -12,51 +12,45 @@ import java.util.UUID;
|
|
import net.md_5.bungee.api.ServerPing;
|
|
import net.md_5.bungee.protocol.ProtocolConstants;
|
|
|
|
-public class PlayerInfoSerializer implements JsonSerializer<ServerPing.PlayerInfo>, JsonDeserializer<ServerPing.PlayerInfo>
|
|
-{
|
|
+public class PlayerInfoSerializer
|
|
+ implements JsonSerializer<ServerPing.PlayerInfo>, JsonDeserializer<ServerPing.PlayerInfo> {
|
|
|
|
// Travertine start
|
|
private final int protocol;
|
|
|
|
- public PlayerInfoSerializer()
|
|
- {
|
|
+ public PlayerInfoSerializer() {
|
|
this.protocol = ProtocolConstants.MINECRAFT_1_7_6;
|
|
}
|
|
|
|
- public PlayerInfoSerializer(int protocol)
|
|
- {
|
|
+ public PlayerInfoSerializer(int protocol) {
|
|
this.protocol = protocol;
|
|
}
|
|
// Travertine end
|
|
|
|
@Override
|
|
- public ServerPing.PlayerInfo deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException
|
|
- {
|
|
+ public ServerPing.PlayerInfo deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
|
|
+ throws JsonParseException {
|
|
JsonObject js = json.getAsJsonObject();
|
|
- ServerPing.PlayerInfo info = new ServerPing.PlayerInfo( js.get( "name" ).getAsString(), (UUID) null );
|
|
- String id = js.get( "id" ).getAsString();
|
|
- if ( ProtocolConstants.isBeforeOrEq( protocol, ProtocolConstants.MINECRAFT_1_7_2 ) || !id.contains( "-" ) ) // Travertine
|
|
+ ServerPing.PlayerInfo info = new ServerPing.PlayerInfo(js.get("name").getAsString(), (UUID) null);
|
|
+ String id = js.get("id").getAsString();
|
|
+ if (ProtocolConstants.isBeforeOrEq(protocol, ProtocolConstants.MINECRAFT_1_7_2) || !id.contains("-")) // Travertine
|
|
{
|
|
- info.setId( id );
|
|
- } else
|
|
- {
|
|
- info.setUniqueId( UUID.fromString( id ) );
|
|
+ info.setId(id);
|
|
+ } else {
|
|
+ info.setUniqueId(UUID.fromString(id));
|
|
}
|
|
return info;
|
|
}
|
|
|
|
@Override
|
|
- public JsonElement serialize(ServerPing.PlayerInfo src, Type typeOfSrc, JsonSerializationContext context)
|
|
- {
|
|
+ public JsonElement serialize(ServerPing.PlayerInfo src, Type typeOfSrc, JsonSerializationContext context) {
|
|
JsonObject out = new JsonObject();
|
|
- out.addProperty( "name", src.getName() );
|
|
+ out.addProperty("name", src.getName());
|
|
// Travertine start
|
|
- if ( ProtocolConstants.isBeforeOrEq( protocol, ProtocolConstants.MINECRAFT_1_7_2 ) )
|
|
- {
|
|
- out.addProperty( "id", src.getId() );
|
|
- } else
|
|
- {
|
|
- out.addProperty( "id", src.getUniqueId().toString() );
|
|
+ if (ProtocolConstants.isBeforeOrEq(protocol, ProtocolConstants.MINECRAFT_1_7_2)) {
|
|
+ out.addProperty("id", src.getId());
|
|
+ } else {
|
|
+ out.addProperty("id", src.getUniqueId().toString());
|
|
}
|
|
// Travertine end
|
|
return out;
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/ServerConnector.java b/proxy/src/main/java/net/md_5/bungee/ServerConnector.java
|
|
index c12085e1..a80d56cf 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/ServerConnector.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/ServerConnector.java
|
|
@@ -1,15 +1,18 @@
|
|
package net.md_5.bungee;
|
|
|
|
-import com.google.common.base.Preconditions;
|
|
-import io.netty.buffer.ByteBuf;
|
|
-import io.netty.buffer.ByteBufAllocator;
|
|
import java.net.InetSocketAddress;
|
|
-import java.util.Locale;
|
|
-import java.util.Arrays; // Waterfall
|
|
import java.nio.charset.StandardCharsets; // Travertine
|
|
+import java.util.Arrays; // Waterfall
|
|
+import java.util.Locale;
|
|
import java.util.Queue;
|
|
import java.util.Set;
|
|
import java.util.UUID;
|
|
+
|
|
+import com.google.common.base.Preconditions;
|
|
+
|
|
+import dev._2lstudios.flamecord.FlameCord;
|
|
+import io.netty.buffer.ByteBuf;
|
|
+import io.netty.buffer.ByteBufAllocator;
|
|
import lombok.Getter;
|
|
import lombok.RequiredArgsConstructor;
|
|
import net.md_5.bungee.api.ChatColor;
|
|
@@ -34,6 +37,7 @@ import net.md_5.bungee.netty.ChannelWrapper;
|
|
import net.md_5.bungee.netty.HandlerBoss;
|
|
import net.md_5.bungee.netty.PacketHandler;
|
|
import net.md_5.bungee.netty.PipelineUtils;
|
|
+import net.md_5.bungee.protocol.BadPacketException;
|
|
import net.md_5.bungee.protocol.DefinedPacket;
|
|
import net.md_5.bungee.protocol.MinecraftDecoder;
|
|
import net.md_5.bungee.protocol.PacketWrapper;
|
|
@@ -57,8 +61,7 @@ import net.md_5.bungee.util.BufUtil;
|
|
import net.md_5.bungee.util.QuietException;
|
|
|
|
@RequiredArgsConstructor
|
|
-public class ServerConnector extends PacketHandler
|
|
-{
|
|
+public class ServerConnector extends PacketHandler {
|
|
|
|
private final ProxyServer bungee;
|
|
private ChannelWrapper ch;
|
|
@@ -69,63 +72,58 @@ public class ServerConnector extends PacketHandler
|
|
private ForgeServerHandler handshakeHandler;
|
|
private boolean obsolete;
|
|
|
|
- private enum State
|
|
- {
|
|
+ private enum State {
|
|
|
|
LOGIN_SUCCESS, ENCRYPT_RESPONSE, LOGIN, FINISHED;
|
|
}
|
|
|
|
@Override
|
|
- public void exception(Throwable t) throws Exception
|
|
- {
|
|
- if ( obsolete )
|
|
- {
|
|
+ public void exception(Throwable t) throws Exception {
|
|
+ if (obsolete) {
|
|
return;
|
|
}
|
|
|
|
- String message = "Exception Connecting:" + Util.exception( t );
|
|
- if ( user.getServer() == null )
|
|
- {
|
|
- user.disconnect( message );
|
|
- } else
|
|
- {
|
|
- user.sendMessage( ChatColor.RED + message );
|
|
+ String message = "Exception Connecting:" + Util.exception(t);
|
|
+ if (user.getServer() == null) {
|
|
+ user.disconnect(message);
|
|
+ } else {
|
|
+ user.sendMessage(ChatColor.RED + message);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void connected(ChannelWrapper channel) throws Exception
|
|
- {
|
|
+ public void connected(ChannelWrapper channel) throws Exception {
|
|
this.ch = channel;
|
|
|
|
- this.handshakeHandler = new ForgeServerHandler( user, ch, target );
|
|
+ this.handshakeHandler = new ForgeServerHandler(user, ch, target);
|
|
Handshake originalHandshake = user.getPendingConnection().getHandshake();
|
|
- Handshake copiedHandshake = new Handshake( originalHandshake.getProtocolVersion(), originalHandshake.getHost(), originalHandshake.getPort(), 2 );
|
|
+ Handshake copiedHandshake = new Handshake(originalHandshake.getProtocolVersion(), originalHandshake.getHost(),
|
|
+ originalHandshake.getPort(), 2);
|
|
|
|
- if ( BungeeCord.getInstance().config.isIpForward() && user.getSocketAddress() instanceof InetSocketAddress )
|
|
- {
|
|
- String newHost = copiedHandshake.getHost() + "\00" + user.getAddress().getHostString() + "\00" + user.getUUID();
|
|
+ if (BungeeCord.getInstance().config.isIpForward() && user.getSocketAddress() instanceof InetSocketAddress) {
|
|
+ String newHost = copiedHandshake.getHost() + "\00" + user.getAddress().getHostString() + "\00"
|
|
+ + user.getUUID();
|
|
|
|
LoginResult profile = user.getPendingConnection().getLoginProfile();
|
|
|
|
// Handle properties.
|
|
LoginResult.Property[] properties = new LoginResult.Property[0];
|
|
|
|
- if ( profile != null && profile.getProperties() != null && profile.getProperties().length > 0 )
|
|
- {
|
|
+ if (profile != null && profile.getProperties() != null && profile.getProperties().length > 0) {
|
|
properties = profile.getProperties();
|
|
}
|
|
|
|
- if ( user.getForgeClientHandler().isFmlTokenInHandshake() )
|
|
- {
|
|
+ if (user.getForgeClientHandler().isFmlTokenInHandshake()) {
|
|
// Get the current properties and copy them into a slightly bigger array.
|
|
- LoginResult.Property[] newp = Arrays.copyOf( properties, properties.length + 2 );
|
|
+ LoginResult.Property[] newp = Arrays.copyOf(properties, properties.length + 2);
|
|
|
|
// Add a new profile property that specifies that this user is a Forge user.
|
|
- newp[newp.length - 2] = new LoginResult.Property( ForgeConstants.FML_LOGIN_PROFILE, "true", null );
|
|
+ newp[newp.length - 2] = new LoginResult.Property(ForgeConstants.FML_LOGIN_PROFILE, "true", null);
|
|
|
|
- // If we do not perform the replacement, then the IP Forwarding code in Spigot et. al. will try to split on this prematurely.
|
|
- newp[newp.length - 1] = new LoginResult.Property( ForgeConstants.EXTRA_DATA, user.getExtraDataInHandshake().replaceAll( "\0", "\1"), "" );
|
|
+ // If we do not perform the replacement, then the IP Forwarding code in Spigot
|
|
+ // et. al. will try to split on this prematurely.
|
|
+ newp[newp.length - 1] = new LoginResult.Property(ForgeConstants.EXTRA_DATA,
|
|
+ user.getExtraDataInHandshake().replaceAll("\0", "\1"), "");
|
|
|
|
// All done.
|
|
properties = newp;
|
|
@@ -136,57 +134,60 @@ public class ServerConnector extends PacketHandler
|
|
newHost += "\00" + BungeeCord.getInstance().gson.toJson(properties);
|
|
}
|
|
|
|
- copiedHandshake.setHost( newHost );
|
|
- } else if ( !user.getExtraDataInHandshake().isEmpty() )
|
|
- {
|
|
+ copiedHandshake.setHost(newHost);
|
|
+ } else if (!user.getExtraDataInHandshake().isEmpty()) {
|
|
// Restore the extra data
|
|
- copiedHandshake.setHost( copiedHandshake.getHost() + user.getExtraDataInHandshake() );
|
|
+ copiedHandshake.setHost(copiedHandshake.getHost() + user.getExtraDataInHandshake());
|
|
}
|
|
|
|
- channel.write( copiedHandshake );
|
|
+ channel.write(copiedHandshake);
|
|
|
|
- channel.setProtocol( Protocol.LOGIN );
|
|
- channel.write( new LoginRequest( user.getName() ) );
|
|
+ channel.setProtocol(Protocol.LOGIN);
|
|
+ channel.write(new LoginRequest(user.getName()));
|
|
}
|
|
|
|
@Override
|
|
- public void disconnected(ChannelWrapper channel) throws Exception
|
|
- {
|
|
- user.getPendingConnects().remove( target );
|
|
+ public void disconnected(ChannelWrapper channel) throws Exception {
|
|
+ user.getPendingConnects().remove(target);
|
|
}
|
|
|
|
@Override
|
|
- public void handle(PacketWrapper packet) throws Exception
|
|
- {
|
|
- if ( packet.packet == null )
|
|
- {
|
|
- throw new QuietException( "Unexpected packet received during server login process!\n" + BufUtil.dump( packet.buf, 16 ) );
|
|
+ public void handle(final PacketWrapper packet) throws Exception {
|
|
+ if (packet.packet == null) {
|
|
+ // FlameCord - Toggle Dumping packet info
|
|
+ if (FlameCord.getInstance().getFlameCordConfiguration().isLoggerDump()) {
|
|
+ // FlameCord - Change from QuietException to BadPacketException
|
|
+ throw new BadPacketException(
|
|
+ "Unexpected packet received during server connector process!\n" + BufUtil.dump(packet.buf, 16));
|
|
+ } else {
|
|
+ // FlameCord - Change from QuietException to BadPacketException
|
|
+ throw new BadPacketException("Unexpected packet received during connector process!");
|
|
+ }
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void handle(LoginSuccess loginSuccess) throws Exception
|
|
- {
|
|
- Preconditions.checkState( thisState == State.LOGIN_SUCCESS, "Not expecting LOGIN_SUCCESS" );
|
|
- ch.setProtocol( Protocol.GAME );
|
|
+ public void handle(LoginSuccess loginSuccess) throws Exception {
|
|
+ Preconditions.checkState(thisState == State.LOGIN_SUCCESS, "Not expecting LOGIN_SUCCESS");
|
|
+ ch.setProtocol(Protocol.GAME);
|
|
thisState = State.LOGIN;
|
|
|
|
// Only reset the Forge client when:
|
|
// 1) The user is switching servers (so has a current server)
|
|
// 2) The handshake is complete
|
|
// 3) The user is currently on a modded server (if we are on a vanilla server,
|
|
- // we may be heading for another vanilla server, so we don't need to reset.)
|
|
+ // we may be heading for another vanilla server, so we don't need to reset.)
|
|
//
|
|
// user.getServer() gets the user's CURRENT server, not the one we are trying
|
|
// to connect to.
|
|
//
|
|
// We will reset the connection later if the current server is vanilla, and
|
|
- // we need to switch to a modded connection. However, we always need to reset the
|
|
+ // we need to switch to a modded connection. However, we always need to reset
|
|
+ // the
|
|
// connection when we have a modded server regardless of where we go - doing it
|
|
// here makes sense.
|
|
- if ( user.getServer() != null && user.getForgeClientHandler().isHandshakeComplete()
|
|
- && user.getServer().isForgeServer() )
|
|
- {
|
|
+ if (user.getServer() != null && user.getForgeClientHandler().isHandshakeComplete()
|
|
+ && user.getServer().isForgeServer()) {
|
|
user.getForgeClientHandler().resetHandshake();
|
|
}
|
|
|
|
@@ -194,197 +195,217 @@ public class ServerConnector extends PacketHandler
|
|
}
|
|
|
|
@Override
|
|
- public void handle(SetCompression setCompression) throws Exception
|
|
- {
|
|
- ch.setCompressionThreshold( setCompression.getThreshold() );
|
|
+ public void handle(SetCompression setCompression) throws Exception {
|
|
+ ch.setCompressionThreshold(setCompression.getThreshold());
|
|
}
|
|
|
|
@Override
|
|
- public void handle(Login login) throws Exception
|
|
- {
|
|
- Preconditions.checkState( thisState == State.LOGIN, "Not expecting LOGIN" );
|
|
+ public void handle(Login login) throws Exception {
|
|
+ Preconditions.checkState(thisState == State.LOGIN, "Not expecting LOGIN");
|
|
|
|
- ServerConnection server = new ServerConnection( ch, target );
|
|
- ServerConnectedEvent event = new ServerConnectedEvent( user, server );
|
|
+ ServerConnection server = new ServerConnection(ch, target);
|
|
+ ServerConnectedEvent event = new ServerConnectedEvent(user, server);
|
|
|
|
if (server.isForgeServer() && user.isForgeUser()) {
|
|
- ((MinecraftDecoder) server.getCh().getHandle().pipeline().get(PipelineUtils.PACKET_DECODER)).setSupportsForge(true);
|
|
- ((MinecraftDecoder) user.getCh().getHandle().pipeline().get(PipelineUtils.PACKET_DECODER)).setSupportsForge(true);
|
|
+ ((MinecraftDecoder) server.getCh().getHandle().pipeline().get(PipelineUtils.PACKET_DECODER))
|
|
+ .setSupportsForge(true);
|
|
+ ((MinecraftDecoder) user.getCh().getHandle().pipeline().get(PipelineUtils.PACKET_DECODER))
|
|
+ .setSupportsForge(true);
|
|
}
|
|
|
|
- bungee.getPluginManager().callEvent( event );
|
|
+ bungee.getPluginManager().callEvent(event);
|
|
|
|
- ch.write( BungeeCord.getInstance().registerChannels( user.getPendingConnection().getVersion() ) );
|
|
+ ch.write(BungeeCord.getInstance().registerChannels(user.getPendingConnection().getVersion()));
|
|
Queue<DefinedPacket> packetQueue = target.getPacketQueue();
|
|
- synchronized ( packetQueue )
|
|
- {
|
|
- while ( !packetQueue.isEmpty() )
|
|
- {
|
|
- ch.write( packetQueue.poll() );
|
|
- }
|
|
+ // FlameCord - Remove the usage of synchronized
|
|
+ // synchronized (packetQueue) {
|
|
+ while (!packetQueue.isEmpty()) {
|
|
+ ch.write(packetQueue.poll());
|
|
}
|
|
+ // }
|
|
|
|
- for ( PluginMessage message : user.getPendingConnection().getRelayMessages() )
|
|
- {
|
|
- ch.write( message );
|
|
+ for (PluginMessage message : user.getPendingConnection().getRelayMessages()) {
|
|
+ ch.write(message);
|
|
}
|
|
|
|
- if (!user.isDisableEntityMetadataRewrite() && user.getSettings() != null )
|
|
- {
|
|
- ch.write( user.getSettings() );
|
|
+ if (!user.isDisableEntityMetadataRewrite() && user.getSettings() != null) {
|
|
+ ch.write(user.getSettings());
|
|
}
|
|
|
|
- if ( user.getForgeClientHandler().getClientModList() == null && !user.getForgeClientHandler().isHandshakeComplete() ) // Vanilla
|
|
+ if (user.getForgeClientHandler().getClientModList() == null
|
|
+ && !user.getForgeClientHandler().isHandshakeComplete()) // Vanilla
|
|
{
|
|
user.getForgeClientHandler().setHandshakeComplete();
|
|
}
|
|
|
|
- if ( user.getServer() == null || !( login.getDimension() instanceof Integer ) )
|
|
- {
|
|
+ if (user.getServer() == null || !(login.getDimension() instanceof Integer)) {
|
|
// Once again, first connection
|
|
- user.setClientEntityId( login.getEntityId() );
|
|
- user.setServerEntityId( login.getEntityId() );
|
|
+ user.setClientEntityId(login.getEntityId());
|
|
+ user.setServerEntityId(login.getEntityId());
|
|
|
|
// Set tab list size, TODO: what shall we do about packet mutability
|
|
- Login modLogin = new Login( login.getEntityId(), login.isHardcore(), login.getGameMode(), login.getPreviousGameMode(), login.getWorldNames(), login.getDimensions(), login.getDimension(), login.getWorldName(), login.getSeed(), login.getDifficulty(),
|
|
- (byte) user.getPendingConnection().getListener().getTabListSize(), login.getLevelType(), login.getViewDistance(), login.isReducedDebugInfo(), login.isNormalRespawn(), login.isDebug(), login.isFlat() );
|
|
+ Login modLogin = new Login(login.getEntityId(), login.isHardcore(), login.getGameMode(),
|
|
+ login.getPreviousGameMode(), login.getWorldNames(), login.getDimensions(), login.getDimension(),
|
|
+ login.getWorldName(), login.getSeed(), login.getDifficulty(),
|
|
+ (byte) user.getPendingConnection().getListener().getTabListSize(), login.getLevelType(),
|
|
+ login.getViewDistance(), login.isReducedDebugInfo(), login.isNormalRespawn(), login.isDebug(),
|
|
+ login.isFlat());
|
|
|
|
- user.unsafe().sendPacket( modLogin );
|
|
+ user.unsafe().sendPacket(modLogin);
|
|
|
|
- if ( user.getServer() != null )
|
|
- {
|
|
- user.getServer().setObsolete( true );
|
|
+ if (user.getServer() != null) {
|
|
+ user.getServer().setObsolete(true);
|
|
user.getTabListHandler().onServerChange();
|
|
|
|
user.getServerSentScoreboard().clear();
|
|
|
|
- for ( UUID bossbar : user.getSentBossBars() )
|
|
- {
|
|
+ for (UUID bossbar : user.getSentBossBars()) {
|
|
// Send remove bossbar packet
|
|
- user.unsafe().sendPacket( new net.md_5.bungee.protocol.packet.BossBar( bossbar, 1 ) );
|
|
+ user.unsafe().sendPacket(new net.md_5.bungee.protocol.packet.BossBar(bossbar, 1));
|
|
}
|
|
user.getSentBossBars().clear();
|
|
|
|
- user.unsafe().sendPacket( new Respawn( login.getDimension(), login.getWorldName(), login.getSeed(), login.getDifficulty(), login.getGameMode(), login.getPreviousGameMode(), login.getLevelType(), login.isDebug(), login.isFlat(), false ) );
|
|
- user.getServer().disconnect( "Quitting" );
|
|
- } else
|
|
- {
|
|
+ user.unsafe()
|
|
+ .sendPacket(new Respawn(login.getDimension(), login.getWorldName(), login.getSeed(),
|
|
+ login.getDifficulty(), login.getGameMode(), login.getPreviousGameMode(),
|
|
+ login.getLevelType(), login.isDebug(), login.isFlat(), false));
|
|
+ user.getServer().disconnect("Quitting");
|
|
+ } else {
|
|
// Travertine start
|
|
String brandString = bungee.getName() + " (" + bungee.getVersion() + ")";
|
|
|
|
- if ( ProtocolConstants.isBeforeOrEq( user.getPendingConnection().getVersion(), ProtocolConstants.MINECRAFT_1_7_6 ) )
|
|
- {
|
|
- user.unsafe().sendPacket( new PluginMessage( "MC|Brand", brandString.getBytes( StandardCharsets.UTF_8 ), handshakeHandler.isServerForge() ) );
|
|
- } else
|
|
- {
|
|
+ if (ProtocolConstants.isBeforeOrEq(user.getPendingConnection().getVersion(),
|
|
+ ProtocolConstants.MINECRAFT_1_7_6)) {
|
|
+ user.unsafe().sendPacket(new PluginMessage("MC|Brand", brandString.getBytes(StandardCharsets.UTF_8),
|
|
+ handshakeHandler.isServerForge()));
|
|
+ } else {
|
|
ByteBuf brand = ByteBufAllocator.DEFAULT.heapBuffer();
|
|
DefinedPacket.writeString(brandString, brand);
|
|
- user.unsafe().sendPacket( new PluginMessage( user.getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_13 ? "minecraft:brand" : "MC|Brand", brand, handshakeHandler.isServerForge() ) );
|
|
+ user.unsafe()
|
|
+ .sendPacket(new PluginMessage(
|
|
+ user.getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_13
|
|
+ ? "minecraft:brand"
|
|
+ : "MC|Brand",
|
|
+ brand, handshakeHandler.isServerForge()));
|
|
brand.release();
|
|
}
|
|
// Travertine end
|
|
}
|
|
|
|
- user.setDimension( login.getDimension() );
|
|
- } else
|
|
- {
|
|
- user.getServer().setObsolete( true );
|
|
+ user.setDimension(login.getDimension());
|
|
+ } else {
|
|
+ user.getServer().setObsolete(true);
|
|
user.getTabListHandler().onServerChange();
|
|
|
|
Scoreboard serverScoreboard = user.getServerSentScoreboard();
|
|
- if ( !user.isDisableEntityMetadataRewrite() ) { // Waterfall
|
|
- for ( Objective objective : serverScoreboard.getObjectives() )
|
|
- {
|
|
- user.unsafe().sendPacket( new ScoreboardObjective( objective.getName(), objective.getValue(), objective.getType() == null ? null : ScoreboardObjective.HealthDisplay.fromString(objective.getType()), (byte) 1 ) ); // Travertine - 1.7
|
|
- }
|
|
- for ( Score score : serverScoreboard.getScores() )
|
|
- {
|
|
- user.unsafe().sendPacket( new ScoreboardScore( score.getItemName(), (byte) 1, score.getScoreName(), score.getValue() ) );
|
|
- }
|
|
- for ( Team team : serverScoreboard.getTeams() )
|
|
- {
|
|
- user.unsafe().sendPacket( new net.md_5.bungee.protocol.packet.Team( team.getName() ) );
|
|
- }
|
|
+ if (!user.isDisableEntityMetadataRewrite()) { // Waterfall
|
|
+ for (Objective objective : serverScoreboard.getObjectives()) {
|
|
+ user.unsafe()
|
|
+ .sendPacket(new ScoreboardObjective(objective.getName(), objective.getValue(),
|
|
+ objective.getType() == null ? null
|
|
+ : ScoreboardObjective.HealthDisplay.fromString(objective.getType()),
|
|
+ (byte) 1)); // Travertine - 1.7
|
|
+ }
|
|
+ for (Score score : serverScoreboard.getScores()) {
|
|
+ user.unsafe().sendPacket(
|
|
+ new ScoreboardScore(score.getItemName(), (byte) 1, score.getScoreName(), score.getValue()));
|
|
+ }
|
|
+ for (Team team : serverScoreboard.getTeams()) {
|
|
+ user.unsafe().sendPacket(new net.md_5.bungee.protocol.packet.Team(team.getName()));
|
|
+ }
|
|
} // Waterfall
|
|
serverScoreboard.clear();
|
|
|
|
- for ( UUID bossbar : user.getSentBossBars() )
|
|
- {
|
|
+ for (UUID bossbar : user.getSentBossBars()) {
|
|
// Send remove bossbar packet
|
|
- user.unsafe().sendPacket( new net.md_5.bungee.protocol.packet.BossBar( bossbar, 1 ) );
|
|
+ user.unsafe().sendPacket(new net.md_5.bungee.protocol.packet.BossBar(bossbar, 1));
|
|
}
|
|
user.getSentBossBars().clear();
|
|
|
|
// Update debug info from login packet
|
|
- user.unsafe().sendPacket( new EntityStatus( user.getClientEntityId(), login.isReducedDebugInfo() ? EntityStatus.DEBUG_INFO_REDUCED : EntityStatus.DEBUG_INFO_NORMAL ) );
|
|
+ user.unsafe().sendPacket(new EntityStatus(user.getClientEntityId(),
|
|
+ login.isReducedDebugInfo() ? EntityStatus.DEBUG_INFO_REDUCED : EntityStatus.DEBUG_INFO_NORMAL));
|
|
// And immediate respawn
|
|
- if ( user.getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_15 )
|
|
- {
|
|
- user.unsafe().sendPacket( new GameState( GameState.IMMEDIATE_RESPAWN, login.isNormalRespawn() ? 0 : 1 ) );
|
|
+ if (user.getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_15) {
|
|
+ user.unsafe().sendPacket(new GameState(GameState.IMMEDIATE_RESPAWN, login.isNormalRespawn() ? 0 : 1));
|
|
}
|
|
|
|
- user.setDimensionChange( true );
|
|
- if ( !user.isDisableEntityMetadataRewrite() && login.getDimension() == user.getDimension() ) // Waterfall - defer
|
|
+ user.setDimensionChange(true);
|
|
+ if (!user.isDisableEntityMetadataRewrite() && login.getDimension() == user.getDimension()) // Waterfall -
|
|
+ // defer
|
|
{
|
|
- user.unsafe().sendPacket( new Respawn( (Integer) login.getDimension() >= 0 ? -1 : 0, login.getWorldName(), login.getSeed(), login.getDifficulty(), login.getGameMode(), login.getPreviousGameMode(), login.getLevelType(), login.isDebug(), login.isFlat(), false ) );
|
|
+ user.unsafe().sendPacket(new Respawn((Integer) login.getDimension() >= 0 ? -1 : 0, login.getWorldName(),
|
|
+ login.getSeed(), login.getDifficulty(), login.getGameMode(), login.getPreviousGameMode(),
|
|
+ login.getLevelType(), login.isDebug(), login.isFlat(), false));
|
|
}
|
|
|
|
- user.setServerEntityId( login.getEntityId() );
|
|
+ user.setServerEntityId(login.getEntityId());
|
|
|
|
// Waterfall start
|
|
- if ( user.isDisableEntityMetadataRewrite() ) {
|
|
+ if (user.isDisableEntityMetadataRewrite()) {
|
|
// Ensure that we maintain consistency
|
|
- user.setClientEntityId( login.getEntityId() );
|
|
+ user.setClientEntityId(login.getEntityId());
|
|
|
|
// Only send if we are not in the same dimension
|
|
- if ( login.getDimension() != user.getDimension() ) // Waterfall - defer
|
|
+ if (login.getDimension() != user.getDimension()) // Waterfall - defer
|
|
{
|
|
- user.unsafe().sendPacket( new Respawn( (Integer) user.getDimension() >= 0 ? -1 : 0, login.getWorldName(), login.getSeed(), login.getDifficulty(), login.getGameMode(), login.getPreviousGameMode(), login.getLevelType(), login.isDebug(), login.isFlat(), false ) );
|
|
+ user.unsafe().sendPacket(new Respawn((Integer) user.getDimension() >= 0 ? -1 : 0,
|
|
+ login.getWorldName(), login.getSeed(), login.getDifficulty(), login.getGameMode(),
|
|
+ login.getPreviousGameMode(), login.getLevelType(), login.isDebug(), login.isFlat(), false));
|
|
}
|
|
|
|
- Login modLogin = new Login( login.getEntityId(), login.isHardcore(), login.getGameMode(), login.getPreviousGameMode(), login.getWorldNames(), login.getDimensions(), login.getDimension(), login.getWorldName(), login.getSeed(), login.getDifficulty(),
|
|
- (byte) user.getPendingConnection().getListener().getTabListSize(), login.getLevelType(), login.getViewDistance(), login.isReducedDebugInfo(), login.isNormalRespawn(), login.isDebug(), login.isFlat() );
|
|
+ Login modLogin = new Login(login.getEntityId(), login.isHardcore(), login.getGameMode(),
|
|
+ login.getPreviousGameMode(), login.getWorldNames(), login.getDimensions(), login.getDimension(),
|
|
+ login.getWorldName(), login.getSeed(), login.getDifficulty(),
|
|
+ (byte) user.getPendingConnection().getListener().getTabListSize(), login.getLevelType(),
|
|
+ login.getViewDistance(), login.isReducedDebugInfo(), login.isNormalRespawn(), login.isDebug(),
|
|
+ login.isFlat());
|
|
user.unsafe().sendPacket(modLogin);
|
|
|
|
// Only send if we're in the same dimension
|
|
- if ( login.getDimension() == user.getDimension() ) // Waterfall - defer
|
|
+ if (login.getDimension() == user.getDimension()) // Waterfall - defer
|
|
{
|
|
- user.unsafe().sendPacket( new Respawn( (Integer) login.getDimension() >= 0 ? -1 : 0, login.getWorldName(), login.getSeed(), login.getDifficulty(), login.getGameMode(), login.getPreviousGameMode(), login.getLevelType(), login.isDebug(), login.isFlat(), false ) );
|
|
+ user.unsafe().sendPacket(new Respawn((Integer) login.getDimension() >= 0 ? -1 : 0,
|
|
+ login.getWorldName(), login.getSeed(), login.getDifficulty(), login.getGameMode(),
|
|
+ login.getPreviousGameMode(), login.getLevelType(), login.isDebug(), login.isFlat(), false));
|
|
}
|
|
}
|
|
// Waterfall end
|
|
- user.unsafe().sendPacket( new Respawn( login.getDimension(), login.getWorldName(), login.getSeed(), login.getDifficulty(), login.getGameMode(), login.getPreviousGameMode(), login.getLevelType(), login.isDebug(), login.isFlat(), false ) );
|
|
- if ( user.getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_14 )
|
|
- {
|
|
- user.unsafe().sendPacket( new ViewDistance( login.getViewDistance() ) );
|
|
+ user.unsafe()
|
|
+ .sendPacket(new Respawn(login.getDimension(), login.getWorldName(), login.getSeed(),
|
|
+ login.getDifficulty(), login.getGameMode(), login.getPreviousGameMode(),
|
|
+ login.getLevelType(), login.isDebug(), login.isFlat(), false));
|
|
+ if (user.getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_14) {
|
|
+ user.unsafe().sendPacket(new ViewDistance(login.getViewDistance()));
|
|
}
|
|
- user.setDimension( login.getDimension() );
|
|
+ user.setDimension(login.getDimension());
|
|
|
|
// Remove from old servers
|
|
- user.getServer().disconnect( "Quitting" );
|
|
+ // FlameCord - Remove "Quitting" reason
|
|
+ user.getServer().disconnect();
|
|
}
|
|
|
|
// TODO: Fix this?
|
|
- if ( !user.isActive() )
|
|
- {
|
|
- server.disconnect( "Quitting" );
|
|
+ if (!user.isActive()) {
|
|
+ // FlameCord - Remove "Quitting" reason
|
|
+ server.disconnect();
|
|
// Silly server admins see stack trace and die
|
|
- bungee.getLogger().warning( "No client connected for pending server!" );
|
|
+ bungee.getLogger().warning("No client connected for pending server!");
|
|
return;
|
|
}
|
|
|
|
// Add to new server
|
|
// TODO: Move this to the connected() method of DownstreamBridge
|
|
- target.addPlayer( user );
|
|
- user.getPendingConnects().remove( target );
|
|
- user.setServerJoinQueue( null );
|
|
- user.setDimensionChange( false );
|
|
+ target.addPlayer(user);
|
|
+ user.getPendingConnects().remove(target);
|
|
+ user.setServerJoinQueue(null);
|
|
+ user.setDimensionChange(false);
|
|
|
|
- ServerInfo from = ( user.getServer() == null ) ? null : user.getServer().getInfo();
|
|
- user.setServer( server );
|
|
- ch.getHandle().pipeline().get( HandlerBoss.class ).setHandler( new DownstreamBridge( bungee, user, server ) );
|
|
+ ServerInfo from = (user.getServer() == null) ? null : user.getServer().getInfo();
|
|
+ user.setServer(server);
|
|
+ ch.getHandle().pipeline().get(HandlerBoss.class).setHandler(new DownstreamBridge(bungee, user, server));
|
|
|
|
- bungee.getPluginManager().callEvent( new ServerSwitchEvent( user, from ) );
|
|
+ bungee.getPluginManager().callEvent(new ServerSwitchEvent(user, from));
|
|
|
|
thisState = State.FINISHED;
|
|
|
|
@@ -392,59 +413,49 @@ public class ServerConnector extends PacketHandler
|
|
}
|
|
|
|
@Override
|
|
- public void handle(EncryptionRequest encryptionRequest) throws Exception
|
|
- {
|
|
- throw new QuietException( "Server is online mode!" );
|
|
+ public void handle(EncryptionRequest encryptionRequest) throws Exception {
|
|
+ throw new QuietException("Server is online mode!");
|
|
}
|
|
|
|
@Override
|
|
- public void handle(Kick kick) throws Exception
|
|
- {
|
|
- ServerInfo def = user.updateAndGetNextServer( target );
|
|
- ServerKickEvent event = new ServerKickEvent( user, target, ComponentSerializer.parse( kick.getMessage() ), def, ServerKickEvent.State.CONNECTING, ServerKickEvent.Cause.SERVER ); // Waterfall
|
|
- if ( event.getKickReason().toLowerCase( Locale.ROOT ).contains( "outdated" ) && def != null )
|
|
- {
|
|
+ public void handle(Kick kick) throws Exception {
|
|
+ ServerInfo def = user.updateAndGetNextServer(target);
|
|
+ ServerKickEvent event = new ServerKickEvent(user, target, ComponentSerializer.parse(kick.getMessage()), def,
|
|
+ ServerKickEvent.State.CONNECTING, ServerKickEvent.Cause.SERVER); // Waterfall
|
|
+ if (event.getKickReason().toLowerCase(Locale.ROOT).contains("outdated") && def != null) {
|
|
// Pre cancel the event if we are going to try another server
|
|
- event.setCancelled( true );
|
|
+ event.setCancelled(true);
|
|
}
|
|
- bungee.getPluginManager().callEvent( event );
|
|
- if ( event.isCancelled() && event.getCancelServer() != null )
|
|
- {
|
|
+ bungee.getPluginManager().callEvent(event);
|
|
+ if (event.isCancelled() && event.getCancelServer() != null) {
|
|
obsolete = true;
|
|
- user.connect( event.getCancelServer(), ServerConnectEvent.Reason.KICK_REDIRECT );
|
|
+ user.connect(event.getCancelServer(), ServerConnectEvent.Reason.KICK_REDIRECT);
|
|
throw CancelSendSignal.INSTANCE;
|
|
}
|
|
|
|
- String message = bungee.getTranslation( "connect_kick", target.getName(), event.getKickReason() );
|
|
- if ( user.isDimensionChange() )
|
|
- {
|
|
- user.disconnect( message );
|
|
- } else
|
|
- {
|
|
- user.sendMessage( message );
|
|
+ String message = bungee.getTranslation("connect_kick", target.getName(), event.getKickReason());
|
|
+ if (user.isDimensionChange()) {
|
|
+ user.disconnect(message);
|
|
+ } else {
|
|
+ user.sendMessage(message);
|
|
}
|
|
|
|
throw CancelSendSignal.INSTANCE;
|
|
}
|
|
|
|
@Override
|
|
- public void handle(PluginMessage pluginMessage) throws Exception
|
|
- {
|
|
- if ( BungeeCord.getInstance().config.isForgeSupport() )
|
|
- {
|
|
- if ( pluginMessage.getTag().equals( ForgeConstants.FML_REGISTER ) )
|
|
- {
|
|
- Set<String> channels = ForgeUtils.readRegisteredChannels( pluginMessage );
|
|
+ public void handle(PluginMessage pluginMessage) throws Exception {
|
|
+ if (BungeeCord.getInstance().config.isForgeSupport()) {
|
|
+ if (pluginMessage.getTag().equals(ForgeConstants.FML_REGISTER)) {
|
|
+ Set<String> channels = ForgeUtils.readRegisteredChannels(pluginMessage);
|
|
boolean isForgeServer = false;
|
|
- for ( String channel : channels )
|
|
- {
|
|
- if ( channel.equals( ForgeConstants.FML_HANDSHAKE_TAG ) )
|
|
- {
|
|
+ for (String channel : channels) {
|
|
+ if (channel.equals(ForgeConstants.FML_HANDSHAKE_TAG)) {
|
|
// If we have a completed handshake and we have been asked to register a FML|HS
|
|
- // packet, let's send the reset packet now. Then, we can continue the message sending.
|
|
+ // packet, let's send the reset packet now. Then, we can continue the message
|
|
+ // sending.
|
|
// The handshake will not be complete if we reset this earlier.
|
|
- if ( user.getServer() != null && user.getForgeClientHandler().isHandshakeComplete() )
|
|
- {
|
|
+ if (user.getServer() != null && user.getForgeClientHandler().isHandshakeComplete()) {
|
|
user.getForgeClientHandler().resetHandshake();
|
|
}
|
|
|
|
@@ -453,21 +464,19 @@ public class ServerConnector extends PacketHandler
|
|
}
|
|
}
|
|
|
|
- if ( isForgeServer && !this.handshakeHandler.isServerForge() )
|
|
- {
|
|
+ if (isForgeServer && !this.handshakeHandler.isServerForge()) {
|
|
// We now set the server-side handshake handler for the client to this.
|
|
handshakeHandler.setServerAsForgeServer();
|
|
- user.setForgeServerHandler( handshakeHandler );
|
|
+ user.setForgeServerHandler(handshakeHandler);
|
|
}
|
|
}
|
|
|
|
- if ( pluginMessage.getTag().equals( ForgeConstants.FML_HANDSHAKE_TAG ) || pluginMessage.getTag().equals( ForgeConstants.FORGE_REGISTER ) )
|
|
- {
|
|
- this.handshakeHandler.handle( pluginMessage );
|
|
+ if (pluginMessage.getTag().equals(ForgeConstants.FML_HANDSHAKE_TAG)
|
|
+ || pluginMessage.getTag().equals(ForgeConstants.FORGE_REGISTER)) {
|
|
+ this.handshakeHandler.handle(pluginMessage);
|
|
|
|
// Travertine start
|
|
- if ( user.getForgeClientHandler().checkUserOutdated() )
|
|
- {
|
|
+ if (user.getForgeClientHandler().checkUserOutdated()) {
|
|
ch.close();
|
|
user.getPendingConnects().remove(target);
|
|
}
|
|
@@ -478,14 +487,14 @@ public class ServerConnector extends PacketHandler
|
|
}
|
|
}
|
|
|
|
- // We have to forward these to the user, especially with Forge as stuff might break
|
|
+ // We have to forward these to the user, especially with Forge as stuff might
|
|
+ // break
|
|
// This includes any REGISTER messages we intercepted earlier.
|
|
- user.unsafe().sendPacket( pluginMessage );
|
|
+ user.unsafe().sendPacket(pluginMessage);
|
|
}
|
|
|
|
@Override
|
|
- public String toString()
|
|
- {
|
|
+ public String toString() {
|
|
return "[" + user.getName() + "|" + user.getAddress() + "] <-> ServerConnector [" + target.getName() + "]";
|
|
}
|
|
}
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/UserConnection.java b/proxy/src/main/java/net/md_5/bungee/UserConnection.java
|
|
index 8c2a743a..f0015076 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java
|
|
@@ -1,16 +1,5 @@
|
|
package net.md_5.bungee;
|
|
|
|
-import com.google.common.base.Preconditions;
|
|
-import com.google.common.collect.HashMultimap;
|
|
-import com.google.common.collect.ImmutableMap;
|
|
-import com.google.common.collect.Multimap;
|
|
-import io.netty.bootstrap.Bootstrap;
|
|
-import io.netty.channel.Channel;
|
|
-import io.netty.channel.ChannelFuture;
|
|
-import io.netty.channel.ChannelFutureListener;
|
|
-import io.netty.channel.ChannelInitializer;
|
|
-import io.netty.channel.ChannelOption;
|
|
-import io.netty.util.internal.PlatformDependent;
|
|
import java.net.InetSocketAddress;
|
|
import java.net.SocketAddress;
|
|
import java.util.Collection;
|
|
@@ -23,6 +12,19 @@ import java.util.Objects;
|
|
import java.util.Queue;
|
|
import java.util.UUID;
|
|
import java.util.logging.Level;
|
|
+
|
|
+import com.google.common.base.Preconditions;
|
|
+import com.google.common.collect.HashMultimap;
|
|
+import com.google.common.collect.ImmutableMap;
|
|
+import com.google.common.collect.Multimap;
|
|
+
|
|
+import io.netty.bootstrap.Bootstrap;
|
|
+import io.netty.channel.Channel;
|
|
+import io.netty.channel.ChannelFuture;
|
|
+import io.netty.channel.ChannelFutureListener;
|
|
+import io.netty.channel.ChannelInitializer;
|
|
+import io.netty.channel.ChannelOption;
|
|
+import io.netty.util.internal.PlatformDependent;
|
|
import lombok.Getter;
|
|
import lombok.NonNull;
|
|
import lombok.RequiredArgsConstructor;
|
|
@@ -35,6 +37,7 @@ import net.md_5.bungee.api.SkinConfiguration;
|
|
import net.md_5.bungee.api.Title;
|
|
import net.md_5.bungee.api.chat.BaseComponent;
|
|
import net.md_5.bungee.api.chat.TextComponent;
|
|
+import net.md_5.bungee.api.config.ListenerInfo;
|
|
import net.md_5.bungee.api.config.ServerInfo;
|
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
|
import net.md_5.bungee.api.event.PermissionCheckEvent;
|
|
@@ -65,12 +68,12 @@ import net.md_5.bungee.tab.ServerUnique;
|
|
import net.md_5.bungee.tab.TabList;
|
|
import net.md_5.bungee.util.CaseInsensitiveSet;
|
|
import net.md_5.bungee.util.ChatComponentTransformer;
|
|
+import net.md_5.bungee.util.QuietException;
|
|
|
|
@RequiredArgsConstructor
|
|
-public final class UserConnection implements ProxiedPlayer
|
|
-{
|
|
+public final class UserConnection implements ProxiedPlayer {
|
|
|
|
- /*========================================================================*/
|
|
+ /* ======================================================================== */
|
|
@NonNull
|
|
private final ProxyServer bungee;
|
|
@NonNull
|
|
@@ -81,7 +84,7 @@ public final class UserConnection implements ProxiedPlayer
|
|
private final String name;
|
|
@Getter
|
|
private final InitialHandler pendingConnection;
|
|
- /*========================================================================*/
|
|
+ /* ======================================================================== */
|
|
@Getter
|
|
@Setter
|
|
private ServerConnection server;
|
|
@@ -93,7 +96,7 @@ public final class UserConnection implements ProxiedPlayer
|
|
private boolean dimensionChange = true;
|
|
@Getter
|
|
private final Collection<ServerInfo> pendingConnects = new HashSet<>();
|
|
- /*========================================================================*/
|
|
+ /* ======================================================================== */
|
|
@Getter
|
|
@Setter
|
|
private int ping = 100;
|
|
@@ -110,10 +113,10 @@ public final class UserConnection implements ProxiedPlayer
|
|
// Used for trying multiple servers in order
|
|
@Setter
|
|
private Queue<String> serverJoinQueue;
|
|
- /*========================================================================*/
|
|
+ /* ======================================================================== */
|
|
private final Collection<String> groups = new CaseInsensitiveSet();
|
|
private final Collection<String> permissions = new CaseInsensitiveSet();
|
|
- /*========================================================================*/
|
|
+ /* ======================================================================== */
|
|
@Getter
|
|
@Setter
|
|
private int clientEntityId;
|
|
@@ -130,122 +133,104 @@ public final class UserConnection implements ProxiedPlayer
|
|
@Getter
|
|
private final Multimap<Integer, Integer> potions = HashMultimap.create();
|
|
// Waterfall end
|
|
- /*========================================================================*/
|
|
+ /* ======================================================================== */
|
|
@Getter
|
|
private String displayName;
|
|
@Getter
|
|
private EntityMap entityRewrite;
|
|
private Locale locale;
|
|
- /*========================================================================*/
|
|
+ /* ======================================================================== */
|
|
@Getter
|
|
@Setter
|
|
private ForgeClientHandler forgeClientHandler;
|
|
@Getter
|
|
@Setter
|
|
private ForgeServerHandler forgeServerHandler;
|
|
- /*========================================================================*/
|
|
- private final Unsafe unsafe = new Unsafe()
|
|
- {
|
|
+ /* ======================================================================== */
|
|
+ private final Unsafe unsafe = new Unsafe() {
|
|
@Override
|
|
- public void sendPacket(DefinedPacket packet)
|
|
- {
|
|
- ch.write( packet );
|
|
+ public void sendPacket(DefinedPacket packet) {
|
|
+ ch.write(packet);
|
|
}
|
|
};
|
|
|
|
- public void init()
|
|
- {
|
|
- this.entityRewrite = EntityMap.getEntityMap( getPendingConnection().getVersion() );
|
|
+ public void init() {
|
|
+ this.entityRewrite = EntityMap.getEntityMap(getPendingConnection().getVersion());
|
|
|
|
this.displayName = name;
|
|
|
|
- tabListHandler = new ServerUnique( this );
|
|
+ tabListHandler = new ServerUnique(this);
|
|
|
|
- Collection<String> g = bungee.getConfigurationAdapter().getGroups( name );
|
|
- g.addAll( bungee.getConfigurationAdapter().getGroups( getUniqueId().toString() ) );
|
|
- for ( String s : g )
|
|
- {
|
|
- addGroups( s );
|
|
+ Collection<String> g = bungee.getConfigurationAdapter().getGroups(name);
|
|
+ g.addAll(bungee.getConfigurationAdapter().getGroups(getUniqueId().toString()));
|
|
+ for (String s : g) {
|
|
+ addGroups(s);
|
|
}
|
|
|
|
- forgeClientHandler = new ForgeClientHandler( this );
|
|
+ forgeClientHandler = new ForgeClientHandler(this);
|
|
|
|
// No-config FML handshake marker.
|
|
// Set whether the connection has a 1.8 FML marker in the handshake.
|
|
- if (this.getPendingConnection().getExtraDataInHandshake().contains( ForgeConstants.FML_HANDSHAKE_TOKEN ))
|
|
- {
|
|
- forgeClientHandler.setFmlTokenInHandshake( true );
|
|
+ if (this.getPendingConnection().getExtraDataInHandshake().contains(ForgeConstants.FML_HANDSHAKE_TOKEN)) {
|
|
+ forgeClientHandler.setFmlTokenInHandshake(true);
|
|
}
|
|
}
|
|
|
|
- public void sendPacket(PacketWrapper packet)
|
|
- {
|
|
- ch.write( packet );
|
|
+ public void sendPacket(PacketWrapper packet) {
|
|
+ ch.write(packet);
|
|
}
|
|
|
|
@Deprecated
|
|
- public boolean isActive()
|
|
- {
|
|
+ public boolean isActive() {
|
|
return !ch.isClosed();
|
|
}
|
|
|
|
@Override
|
|
- public void setDisplayName(String name)
|
|
- {
|
|
- Preconditions.checkNotNull( name, "displayName" );
|
|
- Preconditions.checkArgument( name.length() <= 16, "Display name cannot be longer than 16 characters" ); // Travertine
|
|
+ public void setDisplayName(String name) {
|
|
+ Preconditions.checkNotNull(name, "displayName");
|
|
+ Preconditions.checkArgument(name.length() <= 16, "Display name cannot be longer than 16 characters"); // Travertine
|
|
displayName = name;
|
|
}
|
|
|
|
@Override
|
|
- public void connect(ServerInfo target)
|
|
- {
|
|
- connect( target, null, ServerConnectEvent.Reason.PLUGIN );
|
|
+ public void connect(ServerInfo target) {
|
|
+ connect(target, null, ServerConnectEvent.Reason.PLUGIN);
|
|
}
|
|
|
|
@Override
|
|
- public void connect(ServerInfo target, ServerConnectEvent.Reason reason)
|
|
- {
|
|
- connect( target, null, false, reason );
|
|
+ public void connect(ServerInfo target, ServerConnectEvent.Reason reason) {
|
|
+ connect(target, null, false, reason);
|
|
}
|
|
|
|
@Override
|
|
- public void connect(ServerInfo target, Callback<Boolean> callback)
|
|
- {
|
|
- connect( target, callback, false, ServerConnectEvent.Reason.PLUGIN );
|
|
+ public void connect(ServerInfo target, Callback<Boolean> callback) {
|
|
+ connect(target, callback, false, ServerConnectEvent.Reason.PLUGIN);
|
|
}
|
|
|
|
@Override
|
|
- public void connect(ServerInfo target, Callback<Boolean> callback, ServerConnectEvent.Reason reason)
|
|
- {
|
|
- connect( target, callback, false, reason );
|
|
+ public void connect(ServerInfo target, Callback<Boolean> callback, ServerConnectEvent.Reason reason) {
|
|
+ connect(target, callback, false, reason);
|
|
}
|
|
|
|
@Deprecated
|
|
- public void connectNow(ServerInfo target)
|
|
- {
|
|
- connectNow( target, ServerConnectEvent.Reason.UNKNOWN );
|
|
+ public void connectNow(ServerInfo target) {
|
|
+ connectNow(target, ServerConnectEvent.Reason.UNKNOWN);
|
|
}
|
|
|
|
- public void connectNow(ServerInfo target, ServerConnectEvent.Reason reason)
|
|
- {
|
|
+ public void connectNow(ServerInfo target, ServerConnectEvent.Reason reason) {
|
|
dimensionChange = true;
|
|
- connect( target, reason );
|
|
+ connect(target, reason);
|
|
}
|
|
|
|
- public ServerInfo updateAndGetNextServer(ServerInfo currentTarget)
|
|
- {
|
|
- if ( serverJoinQueue == null )
|
|
- {
|
|
- serverJoinQueue = new LinkedList<>( getPendingConnection().getListener().getServerPriority() );
|
|
+ public ServerInfo updateAndGetNextServer(ServerInfo currentTarget) {
|
|
+ if (serverJoinQueue == null) {
|
|
+ serverJoinQueue = new LinkedList<>(getPendingConnection().getListener().getServerPriority());
|
|
}
|
|
|
|
ServerInfo next = null;
|
|
- while ( !serverJoinQueue.isEmpty() )
|
|
- {
|
|
- ServerInfo candidate = ProxyServer.getInstance().getServerInfo( serverJoinQueue.remove() );
|
|
- if ( !Objects.equals( currentTarget, candidate ) )
|
|
- {
|
|
+ while (!serverJoinQueue.isEmpty()) {
|
|
+ ServerInfo candidate = ProxyServer.getInstance().getServerInfo(serverJoinQueue.remove());
|
|
+ if (!Objects.equals(currentTarget, candidate)) {
|
|
next = candidate;
|
|
break;
|
|
}
|
|
@@ -254,389 +239,346 @@ public final class UserConnection implements ProxiedPlayer
|
|
return next;
|
|
}
|
|
|
|
- public void connect(ServerInfo info, final Callback<Boolean> callback, final boolean retry)
|
|
- {
|
|
- connect( info, callback, retry, ServerConnectEvent.Reason.PLUGIN );
|
|
+ public void connect(ServerInfo info, final Callback<Boolean> callback, final boolean retry) {
|
|
+ connect(info, callback, retry, ServerConnectEvent.Reason.PLUGIN);
|
|
}
|
|
|
|
- public void connect(ServerInfo info, final Callback<Boolean> callback, final boolean retry, ServerConnectEvent.Reason reason)
|
|
- {
|
|
+ public void connect(ServerInfo info, final Callback<Boolean> callback, final boolean retry,
|
|
+ ServerConnectEvent.Reason reason) {
|
|
// Waterfall start
|
|
connect(info, callback, retry, reason, bungee.getConfig().getServerConnectTimeout());
|
|
}
|
|
+
|
|
public void connect(ServerInfo info, final Callback<Boolean> callback, final boolean retry, int timeout) {
|
|
connect(info, callback, retry, ServerConnectEvent.Reason.PLUGIN, timeout);
|
|
}
|
|
|
|
- public void connect(ServerInfo info, final Callback<Boolean> callback, final boolean retry, ServerConnectEvent.Reason reason, final int timeout)
|
|
- {
|
|
+ public void connect(ServerInfo info, final Callback<Boolean> callback, final boolean retry,
|
|
+ ServerConnectEvent.Reason reason, final int timeout) {
|
|
// Waterfall end
|
|
- Preconditions.checkNotNull( info, "info" );
|
|
+ Preconditions.checkNotNull(info, "info");
|
|
|
|
- ServerConnectRequest.Builder builder = ServerConnectRequest.builder().retry( retry ).reason( reason ).target( info );
|
|
+ ServerConnectRequest.Builder builder = ServerConnectRequest.builder().retry(retry).reason(reason).target(info);
|
|
builder.connectTimeout(timeout); // Waterfall
|
|
- if ( callback != null )
|
|
- {
|
|
- // Convert the Callback<Boolean> to be compatible with Callback<Result> from ServerConnectRequest.
|
|
- builder.callback( new Callback<ServerConnectRequest.Result>()
|
|
- {
|
|
+ if (callback != null) {
|
|
+ // Convert the Callback<Boolean> to be compatible with Callback<Result> from
|
|
+ // ServerConnectRequest.
|
|
+ builder.callback(new Callback<ServerConnectRequest.Result>() {
|
|
@Override
|
|
- public void done(ServerConnectRequest.Result result, Throwable error)
|
|
- {
|
|
- callback.done( ( result == ServerConnectRequest.Result.SUCCESS ) ? Boolean.TRUE : Boolean.FALSE, error );
|
|
+ public void done(ServerConnectRequest.Result result, Throwable error) {
|
|
+ callback.done((result == ServerConnectRequest.Result.SUCCESS) ? Boolean.TRUE : Boolean.FALSE,
|
|
+ error);
|
|
}
|
|
- } );
|
|
+ });
|
|
}
|
|
|
|
- connect( builder.build() );
|
|
+ connect(builder.build());
|
|
}
|
|
|
|
@Override
|
|
- public void connect(final ServerConnectRequest request)
|
|
- {
|
|
- Preconditions.checkNotNull( request, "request" );
|
|
+ public void connect(final ServerConnectRequest request) {
|
|
+ Preconditions.checkNotNull(request, "request");
|
|
|
|
final Callback<ServerConnectRequest.Result> callback = request.getCallback();
|
|
- ServerConnectEvent event = new ServerConnectEvent( this, request.getTarget(), request.getReason(), request );
|
|
- if ( bungee.getPluginManager().callEvent( event ).isCancelled() )
|
|
- {
|
|
- if ( callback != null )
|
|
- {
|
|
- callback.done( ServerConnectRequest.Result.EVENT_CANCEL, null );
|
|
+ ServerConnectEvent event = new ServerConnectEvent(this, request.getTarget(), request.getReason(), request);
|
|
+ if (bungee.getPluginManager().callEvent(event).isCancelled()) {
|
|
+ if (callback != null) {
|
|
+ callback.done(ServerConnectRequest.Result.EVENT_CANCEL, null);
|
|
}
|
|
|
|
- if ( getServer() == null && !ch.isClosing() )
|
|
- {
|
|
- throw new IllegalStateException( "Cancelled ServerConnectEvent with no server or disconnect." );
|
|
+ if (getServer() == null && !ch.isClosing()) {
|
|
+ // FlameCord - Change IllegalStateException to QuietException
|
|
+ // throw new IllegalStateException("Cancelled ServerConnectEvent with no server
|
|
+ // or disconnect.");
|
|
+ throw new QuietException("A plugin cancelled ServerConnectEvent with no server or disconnect.");
|
|
}
|
|
return;
|
|
}
|
|
|
|
final BungeeServerInfo target = (BungeeServerInfo) event.getTarget(); // Update in case the event changed target
|
|
|
|
- if ( getServer() != null && Objects.equals( getServer().getInfo(), target ) )
|
|
- {
|
|
- if ( callback != null )
|
|
- {
|
|
- callback.done( ServerConnectRequest.Result.ALREADY_CONNECTED, null );
|
|
+ if (getServer() != null && Objects.equals(getServer().getInfo(), target)) {
|
|
+ if (callback != null) {
|
|
+ callback.done(ServerConnectRequest.Result.ALREADY_CONNECTED, null);
|
|
}
|
|
|
|
- sendMessage( bungee.getTranslation( "already_connected" ) );
|
|
+ sendMessage(bungee.getTranslation("already_connected"));
|
|
return;
|
|
}
|
|
- if ( pendingConnects.contains( target ) )
|
|
- {
|
|
- if ( callback != null )
|
|
- {
|
|
- callback.done( ServerConnectRequest.Result.ALREADY_CONNECTING, null );
|
|
+ if (pendingConnects.contains(target)) {
|
|
+ if (callback != null) {
|
|
+ callback.done(ServerConnectRequest.Result.ALREADY_CONNECTING, null);
|
|
}
|
|
|
|
- sendMessage( bungee.getTranslation( "already_connecting" ) );
|
|
+ sendMessage(bungee.getTranslation("already_connecting"));
|
|
return;
|
|
}
|
|
|
|
- pendingConnects.add( target );
|
|
+ pendingConnects.add(target);
|
|
|
|
- ChannelInitializer initializer = new ChannelInitializer()
|
|
- {
|
|
+ ChannelInitializer initializer = new ChannelInitializer() {
|
|
@Override
|
|
- protected void initChannel(Channel ch) throws Exception
|
|
- {
|
|
- PipelineUtils.BASE.initChannel( ch );
|
|
- ch.pipeline().addAfter( PipelineUtils.FRAME_DECODER, PipelineUtils.PACKET_DECODER, new MinecraftDecoder( Protocol.HANDSHAKE, false, getPendingConnection().getVersion() ) );
|
|
- ch.pipeline().addAfter( PipelineUtils.FRAME_PREPENDER, PipelineUtils.PACKET_ENCODER, new MinecraftEncoder( Protocol.HANDSHAKE, false, getPendingConnection().getVersion() ) );
|
|
- ch.pipeline().get( HandlerBoss.class ).setHandler( new ServerConnector( bungee, UserConnection.this, target ) );
|
|
+ protected void initChannel(Channel ch) throws Exception {
|
|
+ PipelineUtils.BASE.initChannel(ch);
|
|
+ ch.pipeline().addAfter(PipelineUtils.FRAME_DECODER, PipelineUtils.PACKET_DECODER,
|
|
+ new MinecraftDecoder(Protocol.HANDSHAKE, false, getPendingConnection().getVersion()));
|
|
+ ch.pipeline().addAfter(PipelineUtils.FRAME_PREPENDER, PipelineUtils.PACKET_ENCODER,
|
|
+ new MinecraftEncoder(Protocol.HANDSHAKE, false, getPendingConnection().getVersion()));
|
|
+ ch.pipeline().get(HandlerBoss.class)
|
|
+ .setHandler(new ServerConnector(bungee, UserConnection.this, target));
|
|
}
|
|
};
|
|
- ChannelFutureListener listener = new ChannelFutureListener()
|
|
- {
|
|
+ ChannelFutureListener listener = new ChannelFutureListener() {
|
|
@Override
|
|
@SuppressWarnings("ThrowableResultIgnored")
|
|
- public void operationComplete(ChannelFuture future) throws Exception
|
|
- {
|
|
- if ( callback != null )
|
|
- {
|
|
- callback.done( ( future.isSuccess() ) ? ServerConnectRequest.Result.SUCCESS : ServerConnectRequest.Result.FAIL, future.cause() );
|
|
+ public void operationComplete(ChannelFuture future) throws Exception {
|
|
+ if (callback != null) {
|
|
+ callback.done((future.isSuccess()) ? ServerConnectRequest.Result.SUCCESS
|
|
+ : ServerConnectRequest.Result.FAIL, future.cause());
|
|
}
|
|
|
|
- if ( !future.isSuccess() )
|
|
- {
|
|
+ if (!future.isSuccess()) {
|
|
future.channel().close();
|
|
- pendingConnects.remove( target );
|
|
-
|
|
- ServerInfo def = updateAndGetNextServer( target );
|
|
- if ( request.isRetry() && def != null && ( getServer() == null || def != getServer().getInfo() ) )
|
|
- {
|
|
- sendMessage( bungee.getTranslation( "fallback_lobby" ) );
|
|
- connect( def, null, true, ServerConnectEvent.Reason.LOBBY_FALLBACK, request.getConnectTimeout() ); // Waterfall
|
|
- } else if ( dimensionChange )
|
|
- {
|
|
- disconnect( bungee.getTranslation( "fallback_kick", future.cause().getClass().getName() ) );
|
|
- } else
|
|
- {
|
|
- sendMessage( bungee.getTranslation( "fallback_kick", future.cause().getClass().getName() ) );
|
|
+ pendingConnects.remove(target);
|
|
+
|
|
+ ServerInfo def = updateAndGetNextServer(target);
|
|
+ if (request.isRetry() && def != null && (getServer() == null || def != getServer().getInfo())) {
|
|
+ sendMessage(bungee.getTranslation("fallback_lobby"));
|
|
+ connect(def, null, true, ServerConnectEvent.Reason.LOBBY_FALLBACK, request.getConnectTimeout()); // Waterfall
|
|
+ } else if (dimensionChange) {
|
|
+ disconnect(bungee.getTranslation("fallback_kick", future.cause().getClass().getName()));
|
|
+ } else {
|
|
+ sendMessage(bungee.getTranslation("fallback_kick", future.cause().getClass().getName()));
|
|
}
|
|
}
|
|
}
|
|
};
|
|
- Bootstrap b = new Bootstrap()
|
|
- .channel( PipelineUtils.getChannel( target.getAddress() ) )
|
|
- .group( ch.getHandle().eventLoop() )
|
|
- .handler( initializer )
|
|
- .option( ChannelOption.CONNECT_TIMEOUT_MILLIS, request.getConnectTimeout() )
|
|
- .remoteAddress( target.getAddress() );
|
|
- // Windows is bugged, multi homed users will just have to live with random connecting IPs
|
|
- if ( getPendingConnection().getListener().isSetLocalAddress() && !PlatformDependent.isWindows() && getPendingConnection().getListener().getSocketAddress() instanceof InetSocketAddress )
|
|
- {
|
|
- b.localAddress( getPendingConnection().getListener().getHost().getHostString(), 0 );
|
|
+ Bootstrap b = new Bootstrap().channel(PipelineUtils.getChannel(target.getAddress()))
|
|
+ .group(ch.getHandle().eventLoop()).handler(initializer)
|
|
+ .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, request.getConnectTimeout())
|
|
+ .remoteAddress(target.getAddress());
|
|
+ // Windows is bugged, multi homed users will just have to live with random
|
|
+ // connecting IPs
|
|
+ // FlameCord - Use listenerInfo
|
|
+ final ListenerInfo listenerInfo = getPendingConnection().getListener();
|
|
+
|
|
+ if (listenerInfo.isSetLocalAddress() && !PlatformDependent.isWindows()
|
|
+ && listenerInfo.getSocketAddress() instanceof InetSocketAddress) {
|
|
+ b.localAddress(listenerInfo.getHost().getHostString(), 0);
|
|
}
|
|
- b.connect().addListener( listener );
|
|
+ b.connect().addListener(listener);
|
|
}
|
|
|
|
@Override
|
|
- public void disconnect(String reason)
|
|
- {
|
|
- disconnect0( TextComponent.fromLegacyText( reason ) );
|
|
+ public void disconnect(String reason) {
|
|
+ disconnect0(TextComponent.fromLegacyText(reason));
|
|
}
|
|
|
|
@Override
|
|
- public void disconnect(BaseComponent... reason)
|
|
- {
|
|
- disconnect0( reason );
|
|
+ public void disconnect(BaseComponent... reason) {
|
|
+ disconnect0(reason);
|
|
}
|
|
|
|
@Override
|
|
- public void disconnect(BaseComponent reason)
|
|
- {
|
|
- disconnect0( reason );
|
|
+ public void disconnect(BaseComponent reason) {
|
|
+ disconnect0(reason);
|
|
}
|
|
|
|
- public void disconnect0(final BaseComponent... reason)
|
|
- {
|
|
- if ( !ch.isClosing() )
|
|
- {
|
|
- bungee.getLogger().log( Level.INFO, "[{0}] disconnected with: {1}", new Object[]
|
|
- {
|
|
- getName(), BaseComponent.toLegacyText( reason )
|
|
- } );
|
|
+ public void disconnect0(final BaseComponent... reason) {
|
|
+ if (!ch.isClosing()) {
|
|
+ bungee.getLogger().log(Level.INFO, "[{0}] disconnected with: {1}",
|
|
+ new Object[] { getName(), BaseComponent.toLegacyText(reason) });
|
|
|
|
- ch.close( new Kick( ComponentSerializer.toString( reason ) ) );
|
|
+ ch.close(new Kick(ComponentSerializer.toString(reason)));
|
|
|
|
- if ( server != null )
|
|
- {
|
|
- server.setObsolete( true );
|
|
- server.disconnect( "Quitting" );
|
|
+ if (server != null) {
|
|
+ server.setObsolete(true);
|
|
+ // FlameCord - Remove "Quitting" reason
|
|
+ server.disconnect();
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void chat(String message)
|
|
- {
|
|
- Preconditions.checkState( server != null, "Not connected to server" );
|
|
- server.getCh().write( new Chat( message ) );
|
|
+ public void chat(String message) {
|
|
+ Preconditions.checkState(server != null, "Not connected to server");
|
|
+ server.getCh().write(new Chat(message));
|
|
}
|
|
|
|
@Override
|
|
- public void sendMessage(String message)
|
|
- {
|
|
- sendMessage( TextComponent.fromLegacyText( message ) );
|
|
+ public void sendMessage(String message) {
|
|
+ sendMessage(TextComponent.fromLegacyText(message));
|
|
}
|
|
|
|
@Override
|
|
- public void sendMessages(String... messages)
|
|
- {
|
|
- for ( String message : messages )
|
|
- {
|
|
- sendMessage( message );
|
|
+ public void sendMessages(String... messages) {
|
|
+ for (String message : messages) {
|
|
+ sendMessage(message);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void sendMessage(BaseComponent... message)
|
|
- {
|
|
- sendMessage( ChatMessageType.SYSTEM, message );
|
|
+ public void sendMessage(BaseComponent... message) {
|
|
+ sendMessage(ChatMessageType.SYSTEM, message);
|
|
}
|
|
|
|
@Override
|
|
- public void sendMessage(BaseComponent message)
|
|
- {
|
|
- sendMessage( ChatMessageType.SYSTEM, message );
|
|
+ public void sendMessage(BaseComponent message) {
|
|
+ sendMessage(ChatMessageType.SYSTEM, message);
|
|
}
|
|
|
|
- private void sendMessage(ChatMessageType position, String message)
|
|
- {
|
|
- unsafe().sendPacket( new Chat( message, (byte) position.ordinal() ) );
|
|
+ private void sendMessage(ChatMessageType position, String message) {
|
|
+ unsafe().sendPacket(new Chat(message, (byte) position.ordinal()));
|
|
}
|
|
|
|
@Override
|
|
- public void sendMessage(ChatMessageType position, BaseComponent... message)
|
|
- {
|
|
+ public void sendMessage(ChatMessageType position, BaseComponent... message) {
|
|
// transform score components
|
|
- message = ChatComponentTransformer.getInstance().transform( this, true, message );
|
|
+ message = ChatComponentTransformer.getInstance().transform(this, true, message);
|
|
|
|
- // Action bar doesn't display the new JSON formattings, legacy works - send it using this for now
|
|
- if ( position == ChatMessageType.ACTION_BAR && getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_8 ) // Travertine
|
|
+ // Action bar doesn't display the new JSON formattings, legacy works - send it
|
|
+ // using this for now
|
|
+ if (position == ChatMessageType.ACTION_BAR
|
|
+ && getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_8) // Travertine
|
|
{
|
|
- // Versions older than 1.11 cannot send the Action bar with the new JSON formattings
|
|
- // Fix by converting to a legacy message, see https://bugs.mojang.com/browse/MC-119145
|
|
- if ( getPendingConnection().getVersion() <= ProtocolConstants.MINECRAFT_1_10 )
|
|
- {
|
|
- sendMessage( position, ComponentSerializer.toString( new TextComponent( BaseComponent.toLegacyText( message ) ) ) );
|
|
- } else
|
|
- {
|
|
+ // Versions older than 1.11 cannot send the Action bar with the new JSON
|
|
+ // formattings
|
|
+ // Fix by converting to a legacy message, see
|
|
+ // https://bugs.mojang.com/browse/MC-119145
|
|
+ if (getPendingConnection().getVersion() <= ProtocolConstants.MINECRAFT_1_10) {
|
|
+ sendMessage(position,
|
|
+ ComponentSerializer.toString(new TextComponent(BaseComponent.toLegacyText(message))));
|
|
+ } else {
|
|
net.md_5.bungee.protocol.packet.Title title = new net.md_5.bungee.protocol.packet.Title();
|
|
- title.setAction( net.md_5.bungee.protocol.packet.Title.Action.ACTIONBAR );
|
|
- title.setText( ComponentSerializer.toString( message ) );
|
|
- unsafe.sendPacket( title );
|
|
+ title.setAction(net.md_5.bungee.protocol.packet.Title.Action.ACTIONBAR);
|
|
+ title.setText(ComponentSerializer.toString(message));
|
|
+ unsafe.sendPacket(title);
|
|
}
|
|
- } else
|
|
- {
|
|
- sendMessage( position, ComponentSerializer.toString( message ) );
|
|
+ } else {
|
|
+ sendMessage(position, ComponentSerializer.toString(message));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void sendMessage(ChatMessageType position, BaseComponent message)
|
|
- {
|
|
- message = ChatComponentTransformer.getInstance().transform( this, true, message )[0];
|
|
+ public void sendMessage(ChatMessageType position, BaseComponent message) {
|
|
+ message = ChatComponentTransformer.getInstance().transform(this, true, message)[0];
|
|
|
|
- // Action bar doesn't display the new JSON formattings, legacy works - send it using this for now
|
|
- if ( position == ChatMessageType.ACTION_BAR && getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_8 ) // Travertine
|
|
+ // Action bar doesn't display the new JSON formattings, legacy works - send it
|
|
+ // using this for now
|
|
+ if (position == ChatMessageType.ACTION_BAR
|
|
+ && getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_8) // Travertine
|
|
{
|
|
- sendMessage( position, ComponentSerializer.toString( new TextComponent( BaseComponent.toLegacyText( message ) ) ) );
|
|
- } else
|
|
- {
|
|
- sendMessage( position, ComponentSerializer.toString( message ) );
|
|
+ sendMessage(position, ComponentSerializer.toString(new TextComponent(BaseComponent.toLegacyText(message))));
|
|
+ } else {
|
|
+ sendMessage(position, ComponentSerializer.toString(message));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void sendData(String channel, byte[] data)
|
|
- {
|
|
- unsafe().sendPacket( new PluginMessage( channel, data, forgeClientHandler.isForgeUser() ) );
|
|
+ public void sendData(String channel, byte[] data) {
|
|
+ unsafe().sendPacket(new PluginMessage(channel, data, forgeClientHandler.isForgeUser()));
|
|
}
|
|
|
|
@Override
|
|
- public InetSocketAddress getAddress()
|
|
- {
|
|
+ public InetSocketAddress getAddress() {
|
|
return (InetSocketAddress) getSocketAddress();
|
|
}
|
|
|
|
@Override
|
|
- public SocketAddress getSocketAddress()
|
|
- {
|
|
+ public SocketAddress getSocketAddress() {
|
|
return ch.getRemoteAddress();
|
|
}
|
|
|
|
@Override
|
|
- public Collection<String> getGroups()
|
|
- {
|
|
- return Collections.unmodifiableCollection( groups );
|
|
+ public Collection<String> getGroups() {
|
|
+ return Collections.unmodifiableCollection(groups);
|
|
}
|
|
|
|
@Override
|
|
- public void addGroups(String... groups)
|
|
- {
|
|
- for ( String group : groups )
|
|
- {
|
|
- this.groups.add( group );
|
|
- for ( String permission : bungee.getConfigurationAdapter().getPermissions( group ) )
|
|
- {
|
|
- setPermission( permission, true );
|
|
+ public void addGroups(String... groups) {
|
|
+ for (String group : groups) {
|
|
+ this.groups.add(group);
|
|
+ for (String permission : bungee.getConfigurationAdapter().getPermissions(group)) {
|
|
+ setPermission(permission, true);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void removeGroups(String... groups)
|
|
- {
|
|
- for ( String group : groups )
|
|
- {
|
|
- this.groups.remove( group );
|
|
- for ( String permission : bungee.getConfigurationAdapter().getPermissions( group ) )
|
|
- {
|
|
- setPermission( permission, false );
|
|
+ public void removeGroups(String... groups) {
|
|
+ for (String group : groups) {
|
|
+ this.groups.remove(group);
|
|
+ for (String permission : bungee.getConfigurationAdapter().getPermissions(group)) {
|
|
+ setPermission(permission, false);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public boolean hasPermission(String permission)
|
|
- {
|
|
- return bungee.getPluginManager().callEvent( new PermissionCheckEvent( this, permission, permissions.contains( permission ) ) ).hasPermission();
|
|
+ public boolean hasPermission(String permission) {
|
|
+ return bungee.getPluginManager()
|
|
+ .callEvent(new PermissionCheckEvent(this, permission, permissions.contains(permission)))
|
|
+ .hasPermission();
|
|
}
|
|
|
|
@Override
|
|
- public void setPermission(String permission, boolean value)
|
|
- {
|
|
- if ( value )
|
|
- {
|
|
- permissions.add( permission );
|
|
- } else
|
|
- {
|
|
- permissions.remove( permission );
|
|
+ public void setPermission(String permission, boolean value) {
|
|
+ if (value) {
|
|
+ permissions.add(permission);
|
|
+ } else {
|
|
+ permissions.remove(permission);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public Collection<String> getPermissions()
|
|
- {
|
|
- return Collections.unmodifiableCollection( permissions );
|
|
+ public Collection<String> getPermissions() {
|
|
+ return Collections.unmodifiableCollection(permissions);
|
|
}
|
|
|
|
@Override
|
|
- public String toString()
|
|
- {
|
|
+ public String toString() {
|
|
return name;
|
|
}
|
|
|
|
@Override
|
|
- public Unsafe unsafe()
|
|
- {
|
|
+ public Unsafe unsafe() {
|
|
return unsafe;
|
|
}
|
|
|
|
@Override
|
|
- public String getUUID()
|
|
- {
|
|
+ public String getUUID() {
|
|
return getPendingConnection().getUUID();
|
|
}
|
|
|
|
@Override
|
|
- public UUID getUniqueId()
|
|
- {
|
|
+ public UUID getUniqueId() {
|
|
return getPendingConnection().getUniqueId();
|
|
}
|
|
|
|
- public void setSettings(ClientSettings settings)
|
|
- {
|
|
+ public void setSettings(ClientSettings settings) {
|
|
this.settings = settings;
|
|
this.locale = null;
|
|
}
|
|
|
|
@Override
|
|
- public Locale getLocale()
|
|
- {
|
|
- return ( locale == null && settings != null ) ? locale = Locale.forLanguageTag( settings.getLocale().replace( '_', '-' ) ) : locale;
|
|
+ public Locale getLocale() {
|
|
+ return (locale == null && settings != null)
|
|
+ ? locale = Locale.forLanguageTag(settings.getLocale().replace('_', '-'))
|
|
+ : locale;
|
|
}
|
|
|
|
@Override
|
|
- public byte getViewDistance()
|
|
- {
|
|
- return ( settings != null ) ? settings.getViewDistance() : 10;
|
|
+ public byte getViewDistance() {
|
|
+ return (settings != null) ? settings.getViewDistance() : 10;
|
|
}
|
|
|
|
@Override
|
|
- public ProxiedPlayer.ChatMode getChatMode()
|
|
- {
|
|
- if ( settings == null )
|
|
- {
|
|
+ public ProxiedPlayer.ChatMode getChatMode() {
|
|
+ if (settings == null) {
|
|
return ProxiedPlayer.ChatMode.SHOWN;
|
|
}
|
|
|
|
- switch ( settings.getChatFlags() )
|
|
- {
|
|
+ switch (settings.getChatFlags()) {
|
|
default:
|
|
case 0:
|
|
return ProxiedPlayer.ChatMode.SHOWN;
|
|
@@ -648,106 +590,93 @@ public final class UserConnection implements ProxiedPlayer
|
|
}
|
|
|
|
@Override
|
|
- public boolean hasChatColors()
|
|
- {
|
|
+ public boolean hasChatColors() {
|
|
return settings == null || settings.isChatColours();
|
|
}
|
|
|
|
@Override
|
|
- public SkinConfiguration getSkinParts()
|
|
- {
|
|
- return ( settings != null ) ? new PlayerSkinConfiguration( settings.getSkinParts() ) : PlayerSkinConfiguration.SKIN_SHOW_ALL;
|
|
+ public SkinConfiguration getSkinParts() {
|
|
+ return (settings != null) ? new PlayerSkinConfiguration(settings.getSkinParts())
|
|
+ : PlayerSkinConfiguration.SKIN_SHOW_ALL;
|
|
}
|
|
|
|
@Override
|
|
- public ProxiedPlayer.MainHand getMainHand()
|
|
- {
|
|
- return ( settings == null || settings.getMainHand() == 1 ) ? ProxiedPlayer.MainHand.RIGHT : ProxiedPlayer.MainHand.LEFT;
|
|
+ public ProxiedPlayer.MainHand getMainHand() {
|
|
+ return (settings == null || settings.getMainHand() == 1) ? ProxiedPlayer.MainHand.RIGHT
|
|
+ : ProxiedPlayer.MainHand.LEFT;
|
|
}
|
|
|
|
@Override
|
|
- public boolean isForgeUser()
|
|
- {
|
|
+ public boolean isForgeUser() {
|
|
return forgeClientHandler.isForgeUser();
|
|
}
|
|
|
|
@Override
|
|
- public Map<String, String> getModList()
|
|
- {
|
|
- if ( forgeClientHandler.getClientModList() == null )
|
|
- {
|
|
+ public Map<String, String> getModList() {
|
|
+ if (forgeClientHandler.getClientModList() == null) {
|
|
// Return an empty map, rather than a null, if the client hasn't got any mods,
|
|
// or is yet to complete a handshake.
|
|
return ImmutableMap.of();
|
|
}
|
|
|
|
- return ImmutableMap.copyOf( forgeClientHandler.getClientModList() );
|
|
+ return ImmutableMap.copyOf(forgeClientHandler.getClientModList());
|
|
}
|
|
|
|
@Override
|
|
- public void setTabHeader(BaseComponent header, BaseComponent footer)
|
|
- {
|
|
- if ( ProtocolConstants.isBeforeOrEq( pendingConnection.getVersion(), ProtocolConstants.MINECRAFT_1_7_6 ) ) return; // Travertine
|
|
- header = ChatComponentTransformer.getInstance().transform( this, true, header )[0];
|
|
- footer = ChatComponentTransformer.getInstance().transform( this, true, footer )[0];
|
|
+ public void setTabHeader(BaseComponent header, BaseComponent footer) {
|
|
+ if (ProtocolConstants.isBeforeOrEq(pendingConnection.getVersion(), ProtocolConstants.MINECRAFT_1_7_6))
|
|
+ return; // Travertine
|
|
+ header = ChatComponentTransformer.getInstance().transform(this, true, header)[0];
|
|
+ footer = ChatComponentTransformer.getInstance().transform(this, true, footer)[0];
|
|
|
|
- unsafe().sendPacket( new PlayerListHeaderFooter(
|
|
- ComponentSerializer.toString( header ),
|
|
- ComponentSerializer.toString( footer )
|
|
- ) );
|
|
+ unsafe().sendPacket(
|
|
+ new PlayerListHeaderFooter(ComponentSerializer.toString(header), ComponentSerializer.toString(footer)));
|
|
}
|
|
|
|
@Override
|
|
- public void setTabHeader(BaseComponent[] header, BaseComponent[] footer)
|
|
- {
|
|
- if ( ProtocolConstants.isBeforeOrEq( pendingConnection.getVersion(), ProtocolConstants.MINECRAFT_1_7_6 ) ) return; // Travertine
|
|
- header = ChatComponentTransformer.getInstance().transform( this, true, header );
|
|
- footer = ChatComponentTransformer.getInstance().transform( this, true, footer );
|
|
+ public void setTabHeader(BaseComponent[] header, BaseComponent[] footer) {
|
|
+ if (ProtocolConstants.isBeforeOrEq(pendingConnection.getVersion(), ProtocolConstants.MINECRAFT_1_7_6))
|
|
+ return; // Travertine
|
|
+ header = ChatComponentTransformer.getInstance().transform(this, true, header);
|
|
+ footer = ChatComponentTransformer.getInstance().transform(this, true, footer);
|
|
|
|
- unsafe().sendPacket( new PlayerListHeaderFooter(
|
|
- ComponentSerializer.toString( header ),
|
|
- ComponentSerializer.toString( footer )
|
|
- ) );
|
|
+ unsafe().sendPacket(
|
|
+ new PlayerListHeaderFooter(ComponentSerializer.toString(header), ComponentSerializer.toString(footer)));
|
|
}
|
|
|
|
@Override
|
|
- public void resetTabHeader()
|
|
- {
|
|
- // Mojang did not add a way to remove the header / footer completely, we can only set it to empty
|
|
- setTabHeader( (BaseComponent) null, null );
|
|
+ public void resetTabHeader() {
|
|
+ // Mojang did not add a way to remove the header / footer completely, we can
|
|
+ // only set it to empty
|
|
+ setTabHeader((BaseComponent) null, null);
|
|
}
|
|
|
|
@Override
|
|
- public void sendTitle(Title title)
|
|
- {
|
|
- title.send( this );
|
|
+ public void sendTitle(Title title) {
|
|
+ title.send(this);
|
|
}
|
|
|
|
- public String getExtraDataInHandshake()
|
|
- {
|
|
+ public String getExtraDataInHandshake() {
|
|
return this.getPendingConnection().getExtraDataInHandshake();
|
|
}
|
|
|
|
- public void setCompressionThreshold(int compressionThreshold)
|
|
- {
|
|
- if ( ProtocolConstants.isBeforeOrEq( pendingConnection.getVersion(), ProtocolConstants.MINECRAFT_1_7_6 ) ) return; // Travertine
|
|
- if ( !ch.isClosing() && this.compressionThreshold == -1 && compressionThreshold >= 0 )
|
|
- {
|
|
+ public void setCompressionThreshold(int compressionThreshold) {
|
|
+ if (ProtocolConstants.isBeforeOrEq(pendingConnection.getVersion(), ProtocolConstants.MINECRAFT_1_7_6))
|
|
+ return; // Travertine
|
|
+ if (!ch.isClosing() && this.compressionThreshold == -1 && compressionThreshold >= 0) {
|
|
this.compressionThreshold = compressionThreshold;
|
|
- unsafe.sendPacket( new SetCompression( compressionThreshold ) );
|
|
- ch.setCompressionThreshold( compressionThreshold );
|
|
+ unsafe.sendPacket(new SetCompression(compressionThreshold));
|
|
+ ch.setCompressionThreshold(compressionThreshold);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public boolean isConnected()
|
|
- {
|
|
+ public boolean isConnected() {
|
|
return !ch.isClosed();
|
|
}
|
|
|
|
@Override
|
|
- public Scoreboard getScoreboard()
|
|
- {
|
|
+ public Scoreboard getScoreboard() {
|
|
return serverSentScoreboard;
|
|
}
|
|
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/command/CommandBungee.java b/proxy/src/main/java/net/md_5/bungee/command/CommandBungee.java
|
|
index 4e2c6129..9a8a70dd 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/command/CommandBungee.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/command/CommandBungee.java
|
|
@@ -3,19 +3,22 @@ package net.md_5.bungee.command;
|
|
import net.md_5.bungee.api.ChatColor;
|
|
import net.md_5.bungee.api.CommandSender;
|
|
import net.md_5.bungee.api.ProxyServer;
|
|
+import net.md_5.bungee.api.chat.TextComponent;
|
|
import net.md_5.bungee.api.plugin.Command;
|
|
|
|
-public class CommandBungee extends Command
|
|
-{
|
|
+public class CommandBungee extends Command {
|
|
|
|
- public CommandBungee()
|
|
- {
|
|
- super( "bungee" );
|
|
+ public CommandBungee() {
|
|
+ super("bungee");
|
|
}
|
|
|
|
@Override
|
|
- public void execute(CommandSender sender, String[] args)
|
|
- {
|
|
- sender.sendMessage( ChatColor.BLUE + "This server is running Travertine version " + ProxyServer.getInstance().getVersion() + " by md_5" );
|
|
+ public void execute(CommandSender sender, String[] args) {
|
|
+ final ProxyServer proxyServer = ProxyServer.getInstance();
|
|
+ final String name = proxyServer.getName(), version = proxyServer.getVersion();
|
|
+
|
|
+ sender.sendMessage(TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', "&cRunning &f"
|
|
+ + name + "&c version &e" + version
|
|
+ + "&c by 2LS &b(@Sammwy_ and @LinsaFTW)\n&9Forked from Travertine by PaperMC and contributors.")));
|
|
}
|
|
}
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/conf/YamlConfig.java b/proxy/src/main/java/net/md_5/bungee/conf/YamlConfig.java
|
|
index d4fad294..5454efad 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/conf/YamlConfig.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/conf/YamlConfig.java
|
|
@@ -1,7 +1,5 @@
|
|
package net.md_5.bungee.conf;
|
|
|
|
-import com.google.common.base.Charsets;
|
|
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
|
import java.io.File;
|
|
import java.io.FileInputStream;
|
|
import java.io.FileOutputStream;
|
|
@@ -21,7 +19,16 @@ import java.util.List;
|
|
import java.util.Locale;
|
|
import java.util.Map;
|
|
import java.util.logging.Level;
|
|
+
|
|
+import com.google.common.base.Charsets;
|
|
+
|
|
+import org.yaml.snakeyaml.DumperOptions;
|
|
+import org.yaml.snakeyaml.Yaml;
|
|
+import org.yaml.snakeyaml.error.YAMLException;
|
|
+
|
|
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
|
import lombok.RequiredArgsConstructor;
|
|
+import net.md_5.bungee.BungeeCord;
|
|
import net.md_5.bungee.Util;
|
|
import net.md_5.bungee.api.ChatColor;
|
|
import net.md_5.bungee.api.ProxyServer;
|
|
@@ -29,22 +36,18 @@ import net.md_5.bungee.api.config.ConfigurationAdapter;
|
|
import net.md_5.bungee.api.config.ListenerInfo;
|
|
import net.md_5.bungee.api.config.ServerInfo;
|
|
import net.md_5.bungee.util.CaseInsensitiveMap;
|
|
-import org.yaml.snakeyaml.DumperOptions;
|
|
-import org.yaml.snakeyaml.Yaml;
|
|
-import org.yaml.snakeyaml.error.YAMLException;
|
|
|
|
-public class YamlConfig implements ConfigurationAdapter
|
|
-{
|
|
+public class YamlConfig implements ConfigurationAdapter {
|
|
|
|
/**
|
|
* The default tab list options available for picking.
|
|
*/
|
|
@RequiredArgsConstructor
|
|
- private enum DefaultTabList
|
|
- {
|
|
+ private enum DefaultTabList {
|
|
|
|
GLOBAL(), GLOBAL_PING(), SERVER();
|
|
}
|
|
+
|
|
private final Yaml yaml;
|
|
private Map<String, Object> config;
|
|
private final File file;
|
|
@@ -53,185 +56,155 @@ public class YamlConfig implements ConfigurationAdapter
|
|
this(new File("config.yml"));
|
|
}
|
|
|
|
- public YamlConfig(File file)
|
|
- {
|
|
+ public YamlConfig(File file) {
|
|
this.file = file;
|
|
DumperOptions options = new DumperOptions();
|
|
- options.setDefaultFlowStyle( DumperOptions.FlowStyle.BLOCK );
|
|
- yaml = new Yaml( options );
|
|
+ options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
|
|
+ yaml = new Yaml(options);
|
|
}
|
|
|
|
@Override
|
|
- public void load()
|
|
- {
|
|
+ public void load() {
|
|
load(true);
|
|
}
|
|
|
|
- public void load(boolean doPermissions)
|
|
- {
|
|
- try
|
|
- {
|
|
+ public void load(boolean doPermissions) {
|
|
+ try {
|
|
file.createNewFile();
|
|
|
|
- try ( InputStream is = new FileInputStream( file ) )
|
|
- {
|
|
- try
|
|
- {
|
|
- config = (Map) yaml.load( is );
|
|
- } catch ( YAMLException ex )
|
|
- {
|
|
- throw new RuntimeException( "Invalid configuration encountered - this is a configuration error and NOT a bug! Please attempt to fix the error or see https://www.spigotmc.org/ for help.", ex );
|
|
+ try (InputStream is = new FileInputStream(file)) {
|
|
+ try {
|
|
+ config = (Map) yaml.load(is);
|
|
+ } catch (YAMLException ex) {
|
|
+ throw new RuntimeException(
|
|
+ "Invalid configuration encountered - this is a configuration error and NOT a bug! Please attempt to fix the error or see https://www.spigotmc.org/ for help.",
|
|
+ ex);
|
|
}
|
|
}
|
|
|
|
- if ( config == null )
|
|
- {
|
|
+ if (config == null) {
|
|
config = new CaseInsensitiveMap<>();
|
|
- } else
|
|
- {
|
|
- config = new CaseInsensitiveMap<>( config );
|
|
+ } else {
|
|
+ config = new CaseInsensitiveMap<>(config);
|
|
}
|
|
- } catch ( IOException ex )
|
|
- {
|
|
- throw new RuntimeException( "Could not load configuration!", ex );
|
|
+ } catch (IOException ex) {
|
|
+ throw new RuntimeException("Could not load configuration!", ex);
|
|
}
|
|
|
|
- if(!doPermissions) return; // Waterfall
|
|
- Map<String, Object> permissions = get( "permissions", null );
|
|
- if ( permissions == null )
|
|
- {
|
|
- set( "permissions.default", Arrays.asList( new String[]
|
|
- {
|
|
- "bungeecord.command.server", "bungeecord.command.list"
|
|
- } ) );
|
|
- set( "permissions.admin", Arrays.asList( new String[]
|
|
- {
|
|
- "bungeecord.command.alert", "bungeecord.command.end", "bungeecord.command.ip", "bungeecord.command.reload"
|
|
- } ) );
|
|
+ if (!doPermissions)
|
|
+ return; // Waterfall
|
|
+ Map<String, Object> permissions = get("permissions", null);
|
|
+ if (permissions == null) {
|
|
+ set("permissions.default",
|
|
+ Arrays.asList(new String[] { "bungeecord.command.server", "bungeecord.command.list" }));
|
|
+ set("permissions.admin", Arrays.asList(new String[] { "bungeecord.command.alert", "bungeecord.command.end",
|
|
+ "bungeecord.command.ip", "bungeecord.command.reload" }));
|
|
}
|
|
|
|
- Map<String, Object> groups = get( "groups", null );
|
|
- if ( groups == null )
|
|
- {
|
|
- set( "groups.md_5", Collections.singletonList( "admin" ) );
|
|
+ Map<String, Object> groups = get("groups", null);
|
|
+ if (groups == null) {
|
|
+ set("groups.md_5", Collections.singletonList("admin"));
|
|
}
|
|
}
|
|
|
|
- private <T> T get(String path, T def)
|
|
- {
|
|
- return get( path, def, config );
|
|
+ private <T> T get(String path, T def) {
|
|
+ return get(path, def, config);
|
|
}
|
|
|
|
@SuppressWarnings("unchecked")
|
|
- private <T> T get(String path, T def, Map submap)
|
|
- {
|
|
- int index = path.indexOf( '.' );
|
|
- if ( index == -1 )
|
|
- {
|
|
- Object val = submap.get( path );
|
|
- if ( val == null && def != null )
|
|
- {
|
|
+ private <T> T get(String path, T def, Map submap) {
|
|
+ int index = path.indexOf('.');
|
|
+ if (index == -1) {
|
|
+ Object val = submap.get(path);
|
|
+ if (val == null && def != null) {
|
|
val = def;
|
|
- submap.put( path, def );
|
|
+ submap.put(path, def);
|
|
save();
|
|
}
|
|
return (T) val;
|
|
- } else
|
|
- {
|
|
- String first = path.substring( 0, index );
|
|
- String second = path.substring( index + 1, path.length() );
|
|
- Map sub = (Map) submap.get( first );
|
|
- if ( sub == null )
|
|
- {
|
|
+ } else {
|
|
+ String first = path.substring(0, index);
|
|
+ String second = path.substring(index + 1, path.length());
|
|
+ Map sub = (Map) submap.get(first);
|
|
+ if (sub == null) {
|
|
sub = new LinkedHashMap();
|
|
- submap.put( first, sub );
|
|
+ submap.put(first, sub);
|
|
}
|
|
- return get( second, def, sub );
|
|
+ return get(second, def, sub);
|
|
}
|
|
}
|
|
|
|
- private void set(String path, Object val)
|
|
- {
|
|
- set( path, val, config );
|
|
+ private void set(String path, Object val) {
|
|
+ set(path, val, config);
|
|
}
|
|
|
|
@SuppressWarnings("unchecked")
|
|
- private void set(String path, Object val, Map submap)
|
|
- {
|
|
- int index = path.indexOf( '.' );
|
|
- if ( index == -1 )
|
|
- {
|
|
- if ( val == null )
|
|
- {
|
|
- submap.remove( path );
|
|
- } else
|
|
- {
|
|
- submap.put( path, val );
|
|
+ private void set(String path, Object val, Map submap) {
|
|
+ int index = path.indexOf('.');
|
|
+ if (index == -1) {
|
|
+ if (val == null) {
|
|
+ submap.remove(path);
|
|
+ } else {
|
|
+ submap.put(path, val);
|
|
}
|
|
save();
|
|
- } else
|
|
- {
|
|
- String first = path.substring( 0, index );
|
|
- String second = path.substring( index + 1, path.length() );
|
|
- Map sub = (Map) submap.get( first );
|
|
- if ( sub == null )
|
|
- {
|
|
+ } else {
|
|
+ String first = path.substring(0, index);
|
|
+ String second = path.substring(index + 1, path.length());
|
|
+ Map sub = (Map) submap.get(first);
|
|
+ if (sub == null) {
|
|
sub = new LinkedHashMap();
|
|
- submap.put( first, sub );
|
|
+ submap.put(first, sub);
|
|
}
|
|
- set( second, val, sub );
|
|
+ set(second, val, sub);
|
|
}
|
|
}
|
|
|
|
- private void save()
|
|
- {
|
|
- try
|
|
- {
|
|
- try ( Writer wr = new OutputStreamWriter( new FileOutputStream( file ), Charsets.UTF_8 ) )
|
|
- {
|
|
- yaml.dump( config, wr );
|
|
+ private void save() {
|
|
+ try {
|
|
+ try (Writer wr = new OutputStreamWriter(new FileOutputStream(file), Charsets.UTF_8)) {
|
|
+ yaml.dump(config, wr);
|
|
}
|
|
- } catch ( IOException ex )
|
|
- {
|
|
- ProxyServer.getInstance().getLogger().log( Level.WARNING, "Could not save config", ex );
|
|
+ } catch (IOException ex) {
|
|
+ ProxyServer.getInstance().getLogger().log(Level.WARNING, "Could not save config", ex);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public int getInt(String path, int def)
|
|
- {
|
|
- return get( path, def );
|
|
+ public int getInt(String path, int def) {
|
|
+ return get(path, def);
|
|
}
|
|
|
|
@Override
|
|
- public String getString(String path, String def)
|
|
- {
|
|
- return get( path, def );
|
|
+ public String getString(String path, String def) {
|
|
+ return get(path, def);
|
|
}
|
|
|
|
@Override
|
|
- public boolean getBoolean(String path, boolean def)
|
|
- {
|
|
- return get( path, def );
|
|
+ public boolean getBoolean(String path, boolean def) {
|
|
+ return get(path, def);
|
|
}
|
|
|
|
@Override
|
|
@SuppressWarnings("unchecked")
|
|
- public Map<String, ServerInfo> getServers()
|
|
- {
|
|
- Map<String, Map<String, Object>> base = get( "servers", (Map) Collections.singletonMap( "lobby", new HashMap<>() ) );
|
|
+ public Map<String, ServerInfo> getServers() {
|
|
+ Map<String, Map<String, Object>> base = get("servers",
|
|
+ (Map) Collections.singletonMap("lobby", new HashMap<>()));
|
|
Map<String, ServerInfo> ret = new HashMap<>();
|
|
|
|
- for ( Map.Entry<String, Map<String, Object>> entry : base.entrySet() )
|
|
- {
|
|
+ for (Map.Entry<String, Map<String, Object>> entry : base.entrySet()) {
|
|
Map<String, Object> val = entry.getValue();
|
|
String name = entry.getKey();
|
|
- String addr = get( "address", "localhost:25565", val );
|
|
- String motd = ChatColor.translateAlternateColorCodes( '&', get( "motd", "&1Just another Travertine - Forced Host", val ) );
|
|
- boolean restricted = get( "restricted", false, val );
|
|
- SocketAddress address = Util.getAddr( addr );
|
|
- ServerInfo info = ProxyServer.getInstance().constructServerInfo( name, address, motd, restricted );
|
|
- ret.put( name, info );
|
|
+ String addr = get("address", "localhost:25565", val);
|
|
+ // FlameCord - Use getName() instead of Travertine
|
|
+ // String motd = ChatColor.translateAlternateColorCodes( '&', get( "motd",
|
|
+ // "&1Just another Travertine - Forced Host", val ) );
|
|
+ String motd = ChatColor.translateAlternateColorCodes('&',
|
|
+ get("motd", "&1Just another " + BungeeCord.getInstance().getName() + " - Forced Host", val));
|
|
+ boolean restricted = get("restricted", false, val);
|
|
+ SocketAddress address = Util.getAddr(addr);
|
|
+ ServerInfo info = ProxyServer.getInstance().constructServerInfo(name, address, motd, restricted);
|
|
+ ret.put(name, info);
|
|
}
|
|
|
|
return ret;
|
|
@@ -240,67 +213,62 @@ public class YamlConfig implements ConfigurationAdapter
|
|
@Override
|
|
@SuppressWarnings("unchecked")
|
|
@SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE")
|
|
- public Collection<ListenerInfo> getListeners()
|
|
- {
|
|
- Collection<Map<String, Object>> base = get( "listeners", (Collection) Arrays.asList( new Map[]
|
|
- {
|
|
- new HashMap()
|
|
- } ) );
|
|
+ public Collection<ListenerInfo> getListeners() {
|
|
+ Collection<Map<String, Object>> base = get("listeners",
|
|
+ (Collection) Arrays.asList(new Map[] { new HashMap() }));
|
|
Map<String, String> forcedDef = new HashMap<>();
|
|
- forcedDef.put( "pvp.md-5.net", "pvp" );
|
|
+ forcedDef.put("pvp.md-5.net", "pvp");
|
|
|
|
Collection<ListenerInfo> ret = new HashSet<>();
|
|
|
|
- for ( Map<String, Object> val : base )
|
|
- {
|
|
- String motd = get( "motd", "&1Another Bungee server", val );
|
|
- motd = ChatColor.translateAlternateColorCodes( '&', motd );
|
|
-
|
|
- int maxPlayers = get( "max_players", 1, val );
|
|
- boolean forceDefault = get( "force_default_server", false, val );
|
|
- String host = get( "host", "0.0.0.0:25577", val );
|
|
- int tabListSize = get( "tab_size", 60, val );
|
|
- SocketAddress address = Util.getAddr( host );
|
|
- Map<String, String> forced = new CaseInsensitiveMap<>( get( "forced_hosts", forcedDef, val ) );
|
|
- String tabListName = get( "tab_list", "GLOBAL_PING", val );
|
|
- DefaultTabList value = DefaultTabList.valueOf( tabListName.toUpperCase( Locale.ROOT ) );
|
|
- if ( value == null )
|
|
- {
|
|
+ for (Map<String, Object> val : base) {
|
|
+ // FlameCord - Use getName() instead of Bungee
|
|
+ // String motd = get( "motd", "&1Another Bungee server", val );
|
|
+ String motd = get("motd", "&1Another " + BungeeCord.getInstance().getName() + " server", val);
|
|
+ motd = ChatColor.translateAlternateColorCodes('&', motd);
|
|
+
|
|
+ int maxPlayers = get("max_players", 1, val);
|
|
+ boolean forceDefault = get("force_default_server", false, val);
|
|
+ String host = get("host", "0.0.0.0:25577", val);
|
|
+ int tabListSize = get("tab_size", 60, val);
|
|
+ SocketAddress address = Util.getAddr(host);
|
|
+ Map<String, String> forced = new CaseInsensitiveMap<>(get("forced_hosts", forcedDef, val));
|
|
+ String tabListName = get("tab_list", "GLOBAL_PING", val);
|
|
+ DefaultTabList value = DefaultTabList.valueOf(tabListName.toUpperCase(Locale.ROOT));
|
|
+ if (value == null) {
|
|
value = DefaultTabList.GLOBAL_PING;
|
|
}
|
|
- boolean setLocalAddress = get( "bind_local_address", true, val );
|
|
- boolean pingPassthrough = get( "ping_passthrough", false, val );
|
|
+ boolean setLocalAddress = get("bind_local_address", true, val);
|
|
+ boolean pingPassthrough = get("ping_passthrough", false, val);
|
|
|
|
- boolean query = get( "query_enabled", false, val );
|
|
- int queryPort = get( "query_port", 25577, val );
|
|
+ boolean query = get("query_enabled", false, val);
|
|
+ int queryPort = get("query_port", 25577, val);
|
|
|
|
- boolean proxyProtocol = get( "proxy_protocol", false, val );
|
|
- List<String> serverPriority = new ArrayList<>( get( "priorities", Collections.EMPTY_LIST, val ) );
|
|
+ boolean proxyProtocol = get("proxy_protocol", false, val);
|
|
+ List<String> serverPriority = new ArrayList<>(get("priorities", Collections.EMPTY_LIST, val));
|
|
|
|
// Default server list migration
|
|
// TODO: Remove from submap
|
|
- String defaultServer = get( "default_server", null, val );
|
|
- String fallbackServer = get( "fallback_server", null, val );
|
|
- if ( defaultServer != null )
|
|
- {
|
|
- serverPriority.add( defaultServer );
|
|
- set( "default_server", null, val );
|
|
+ String defaultServer = get("default_server", null, val);
|
|
+ String fallbackServer = get("fallback_server", null, val);
|
|
+ if (defaultServer != null) {
|
|
+ serverPriority.add(defaultServer);
|
|
+ set("default_server", null, val);
|
|
}
|
|
- if ( fallbackServer != null )
|
|
- {
|
|
- serverPriority.add( fallbackServer );
|
|
- set( "fallback_server", null, val );
|
|
+ if (fallbackServer != null) {
|
|
+ serverPriority.add(fallbackServer);
|
|
+ set("fallback_server", null, val);
|
|
}
|
|
|
|
// Add defaults if required
|
|
- if ( serverPriority.isEmpty() )
|
|
- {
|
|
- serverPriority.add( "lobby" );
|
|
+ if (serverPriority.isEmpty()) {
|
|
+ serverPriority.add("lobby");
|
|
}
|
|
- set( "priorities", serverPriority, val );
|
|
+ set("priorities", serverPriority, val);
|
|
|
|
- ListenerInfo info = new ListenerInfo( address, motd, maxPlayers, tabListSize, serverPriority, forceDefault, forced, value.toString(), setLocalAddress, pingPassthrough, queryPort, query, proxyProtocol );
|
|
- ret.add( info );
|
|
+ ListenerInfo info = new ListenerInfo(address, motd, maxPlayers, tabListSize, serverPriority, forceDefault,
|
|
+ forced, value.toString(), setLocalAddress, pingPassthrough, queryPort, query, proxyProtocol);
|
|
+ ret.add(info);
|
|
}
|
|
|
|
return ret;
|
|
@@ -308,25 +276,22 @@ public class YamlConfig implements ConfigurationAdapter
|
|
|
|
@Override
|
|
@SuppressWarnings("unchecked")
|
|
- public Collection<String> getGroups(String player)
|
|
- {
|
|
- Collection<String> groups = get( "groups." + player, null );
|
|
- Collection<String> ret = ( groups == null ) ? new HashSet<String>() : new HashSet<>( groups );
|
|
- ret.add( "default" );
|
|
+ public Collection<String> getGroups(String player) {
|
|
+ Collection<String> groups = get("groups." + player, null);
|
|
+ Collection<String> ret = (groups == null) ? new HashSet<String>() : new HashSet<>(groups);
|
|
+ ret.add("default");
|
|
return ret;
|
|
}
|
|
|
|
@Override
|
|
- public Collection<?> getList(String path, Collection<?> def)
|
|
- {
|
|
- return get( path, def );
|
|
+ public Collection<?> getList(String path, Collection<?> def) {
|
|
+ return get(path, def);
|
|
}
|
|
|
|
@Override
|
|
@SuppressWarnings("unchecked")
|
|
- public Collection<String> getPermissions(String group)
|
|
- {
|
|
- Collection<String> permissions = get( "permissions." + group, null );
|
|
- return ( permissions == null ) ? Collections.EMPTY_SET : permissions;
|
|
+ public Collection<String> getPermissions(String group) {
|
|
+ Collection<String> permissions = get("permissions." + group, null);
|
|
+ return (permissions == null) ? Collections.EMPTY_SET : permissions;
|
|
}
|
|
}
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java b/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java
|
|
index 585afa36..b162d05f 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java
|
|
@@ -71,198 +71,179 @@ import net.md_5.bungee.protocol.packet.TabCompleteResponse;
|
|
import net.md_5.bungee.tab.TabList;
|
|
|
|
@RequiredArgsConstructor
|
|
-public class DownstreamBridge extends PacketHandler
|
|
-{
|
|
+public class DownstreamBridge extends PacketHandler {
|
|
|
|
private final ProxyServer bungee;
|
|
private final UserConnection con;
|
|
private final ServerConnection server;
|
|
|
|
@Override
|
|
- public void exception(Throwable t) throws Exception
|
|
- {
|
|
- if ( server.isObsolete() )
|
|
- {
|
|
+ public void exception(Throwable t) throws Exception {
|
|
+ if (server.isObsolete()) {
|
|
// do not perform any actions if the user has already moved
|
|
return;
|
|
}
|
|
|
|
// Waterfall start
|
|
- ServerInfo def = con.updateAndGetNextServer( server.getInfo() );
|
|
- ServerKickEvent event = bungee.getPluginManager().callEvent( new ServerKickEvent( con, server.getInfo(), TextComponent.fromLegacyText( bungee.getTranslation( "server_went_down" ) ), def, ServerKickEvent.State.CONNECTED, ServerKickEvent.Cause.EXCEPTION ) );
|
|
- if ( event.isCancelled() && event.getCancelServer() != null )
|
|
- {
|
|
- server.setObsolete( true );
|
|
- con.connectNow( event.getCancelServer(), ServerConnectEvent.Reason.SERVER_DOWN_REDIRECT );
|
|
- }
|
|
- else
|
|
- {
|
|
- con.disconnect0( event.getKickReasonComponent() );
|
|
+ ServerInfo def = con.updateAndGetNextServer(server.getInfo());
|
|
+ ServerKickEvent event = bungee.getPluginManager()
|
|
+ .callEvent(new ServerKickEvent(con, server.getInfo(),
|
|
+ TextComponent.fromLegacyText(bungee.getTranslation("server_went_down")), def,
|
|
+ ServerKickEvent.State.CONNECTED, ServerKickEvent.Cause.EXCEPTION));
|
|
+ if (event.isCancelled() && event.getCancelServer() != null) {
|
|
+ server.setObsolete(true);
|
|
+ con.connectNow(event.getCancelServer(), ServerConnectEvent.Reason.SERVER_DOWN_REDIRECT);
|
|
+ } else {
|
|
+ con.disconnect0(event.getKickReasonComponent());
|
|
}
|
|
// Waterfall end
|
|
}
|
|
|
|
@Override
|
|
- public void disconnected(ChannelWrapper channel) throws Exception
|
|
- {
|
|
+ public void disconnected(ChannelWrapper channel) throws Exception {
|
|
// We lost connection to the server
|
|
- server.getInfo().removePlayer( con );
|
|
- if ( bungee.getReconnectHandler() != null )
|
|
- {
|
|
- bungee.getReconnectHandler().setServer( con );
|
|
+ server.getInfo().removePlayer(con);
|
|
+ if (bungee.getReconnectHandler() != null) {
|
|
+ bungee.getReconnectHandler().setServer(con);
|
|
}
|
|
|
|
- if ( !server.isObsolete() )
|
|
- {
|
|
+ if (!server.isObsolete()) {
|
|
// Waterfall start
|
|
- ServerInfo def = con.updateAndGetNextServer( server.getInfo() );
|
|
- ServerKickEvent event = bungee.getPluginManager().callEvent( new ServerKickEvent( con, server.getInfo(), TextComponent.fromLegacyText( bungee.getTranslation( "lost_connection" ) ), def, ServerKickEvent.State.CONNECTED, ServerKickEvent.Cause.LOST_CONNECTION ) );
|
|
- if ( event.isCancelled() && event.getCancelServer() != null )
|
|
- {
|
|
- server.setObsolete( true );
|
|
- con.connectNow( event.getCancelServer() );
|
|
- }
|
|
- else
|
|
- {
|
|
- con.disconnect0( event.getKickReasonComponent() );
|
|
+ ServerInfo def = con.updateAndGetNextServer(server.getInfo());
|
|
+ ServerKickEvent event = bungee.getPluginManager()
|
|
+ .callEvent(new ServerKickEvent(con, server.getInfo(),
|
|
+ TextComponent.fromLegacyText(bungee.getTranslation("lost_connection")), def,
|
|
+ ServerKickEvent.State.CONNECTED, ServerKickEvent.Cause.LOST_CONNECTION));
|
|
+ if (event.isCancelled() && event.getCancelServer() != null) {
|
|
+ server.setObsolete(true);
|
|
+ con.connectNow(event.getCancelServer());
|
|
+ } else {
|
|
+ con.disconnect0(event.getKickReasonComponent());
|
|
}
|
|
// Waterfall end
|
|
}
|
|
|
|
- ServerDisconnectEvent serverDisconnectEvent = new ServerDisconnectEvent( con, server.getInfo() );
|
|
- bungee.getPluginManager().callEvent( serverDisconnectEvent );
|
|
+ ServerDisconnectEvent serverDisconnectEvent = new ServerDisconnectEvent(con, server.getInfo());
|
|
+ bungee.getPluginManager().callEvent(serverDisconnectEvent);
|
|
}
|
|
|
|
@Override
|
|
- public boolean shouldHandle(PacketWrapper packet) throws Exception
|
|
- {
|
|
+ public boolean shouldHandle(PacketWrapper packet) throws Exception {
|
|
return !server.isObsolete();
|
|
}
|
|
|
|
@Override
|
|
- public void handle(PacketWrapper packet) throws Exception
|
|
- {
|
|
+ public void handle(PacketWrapper packet) throws Exception {
|
|
EntityMap rewrite = con.getEntityRewrite();
|
|
- if ( rewrite != null )
|
|
- {
|
|
- rewrite.rewriteClientbound( packet.buf, con.getServerEntityId(), con.getClientEntityId(), con.getPendingConnection().getVersion() );
|
|
+ if (rewrite != null) {
|
|
+ rewrite.rewriteClientbound(packet.buf, con.getServerEntityId(), con.getClientEntityId(),
|
|
+ con.getPendingConnection().getVersion());
|
|
}
|
|
- con.sendPacket( packet );
|
|
+ con.sendPacket(packet);
|
|
}
|
|
|
|
@Override
|
|
- public void handle(KeepAlive alive) throws Exception
|
|
- {
|
|
+ public void handle(KeepAlive alive) throws Exception {
|
|
int timeout = bungee.getConfig().getTimeout();
|
|
- if ( timeout <= 0 || server.getKeepAlives().size() < timeout / 50 ) // Some people disable timeout, otherwise allow a theoretical maximum of 1 keepalive per tick
|
|
+ if (timeout <= 0 || server.getKeepAlives().size() < timeout / 50) // Some people disable timeout, otherwise
|
|
+ // allow a theoretical maximum of 1 keepalive
|
|
+ // per tick
|
|
{
|
|
- server.getKeepAlives().add( new KeepAliveData( alive.getRandomId(), System.currentTimeMillis() ) );
|
|
+ server.getKeepAlives().add(new KeepAliveData(alive.getRandomId(), System.currentTimeMillis()));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void handle(PlayerListItem playerList) throws Exception
|
|
- {
|
|
- con.getTabListHandler().onUpdate( TabList.rewrite( playerList ) );
|
|
+ public void handle(PlayerListItem playerList) throws Exception {
|
|
+ con.getTabListHandler().onUpdate(TabList.rewrite(playerList));
|
|
throw CancelSendSignal.INSTANCE; // Always throw because of profile rewriting
|
|
}
|
|
|
|
@Override
|
|
- public void handle(ScoreboardObjective objective) throws Exception
|
|
- {
|
|
+ public void handle(ScoreboardObjective objective) throws Exception {
|
|
Scoreboard serverScoreboard = con.getServerSentScoreboard();
|
|
- switch ( objective.getAction() )
|
|
- {
|
|
+ switch (objective.getAction()) {
|
|
case 0:
|
|
- serverScoreboard.addObjective( new Objective( objective.getName(), objective.getValue(), objective.getType() != null ? objective.getType().toString() : null) ); // Travertine - 1.7 protocol support
|
|
+ serverScoreboard.addObjective(new Objective(objective.getName(), objective.getValue(),
|
|
+ objective.getType() != null ? objective.getType().toString() : null)); // Travertine - 1.7
|
|
+ // protocol support
|
|
break;
|
|
case 1:
|
|
- serverScoreboard.removeObjective( objective.getName() );
|
|
+ serverScoreboard.removeObjective(objective.getName());
|
|
break;
|
|
case 2:
|
|
- Objective oldObjective = serverScoreboard.getObjective( objective.getName() );
|
|
- if ( oldObjective != null )
|
|
- {
|
|
- oldObjective.setValue( objective.getValue() );
|
|
- oldObjective.setType( objective.getType() != null ? objective.getType().toString() : null ); // Travertine - 1.7 protocol support
|
|
+ Objective oldObjective = serverScoreboard.getObjective(objective.getName());
|
|
+ if (oldObjective != null) {
|
|
+ oldObjective.setValue(objective.getValue());
|
|
+ oldObjective.setType(objective.getType() != null ? objective.getType().toString() : null); // Travertine
|
|
+ // - 1.7
|
|
+ // protocol
|
|
+ // support
|
|
}
|
|
break;
|
|
default:
|
|
- throw new IllegalArgumentException( "Unknown objective action: " + objective.getAction() );
|
|
+ throw new IllegalArgumentException("Unknown objective action: " + objective.getAction());
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void handle(ScoreboardScore score) throws Exception
|
|
- {
|
|
+ public void handle(ScoreboardScore score) throws Exception {
|
|
Scoreboard serverScoreboard = con.getServerSentScoreboard();
|
|
- switch ( score.getAction() )
|
|
- {
|
|
+ switch (score.getAction()) {
|
|
case 0:
|
|
- Score s = new Score( score.getItemName(), score.getScoreName(), score.getValue() );
|
|
- serverScoreboard.removeScore( score.getItemName() );
|
|
- serverScoreboard.addScore( s );
|
|
+ Score s = new Score(score.getItemName(), score.getScoreName(), score.getValue());
|
|
+ serverScoreboard.removeScore(score.getItemName());
|
|
+ serverScoreboard.addScore(s);
|
|
break;
|
|
case 1:
|
|
- serverScoreboard.removeScore( score.getItemName() );
|
|
+ serverScoreboard.removeScore(score.getItemName());
|
|
break;
|
|
default:
|
|
- throw new IllegalArgumentException( "Unknown scoreboard action: " + score.getAction() );
|
|
+ throw new IllegalArgumentException("Unknown scoreboard action: " + score.getAction());
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void handle(ScoreboardDisplay displayScoreboard) throws Exception
|
|
- {
|
|
+ public void handle(ScoreboardDisplay displayScoreboard) throws Exception {
|
|
Scoreboard serverScoreboard = con.getServerSentScoreboard();
|
|
- serverScoreboard.setName( displayScoreboard.getName() );
|
|
- serverScoreboard.setPosition( Position.values()[displayScoreboard.getPosition()] );
|
|
+ serverScoreboard.setName(displayScoreboard.getName());
|
|
+ serverScoreboard.setPosition(Position.values()[displayScoreboard.getPosition()]);
|
|
}
|
|
|
|
@Override
|
|
- public void handle(net.md_5.bungee.protocol.packet.Team team) throws Exception
|
|
- {
|
|
+ public void handle(net.md_5.bungee.protocol.packet.Team team) throws Exception {
|
|
Scoreboard serverScoreboard = con.getServerSentScoreboard();
|
|
// Remove team and move on
|
|
- if ( team.getMode() == 1 )
|
|
- {
|
|
- serverScoreboard.removeTeam( team.getName() );
|
|
+ if (team.getMode() == 1) {
|
|
+ serverScoreboard.removeTeam(team.getName());
|
|
return;
|
|
}
|
|
|
|
// Create or get old team
|
|
Team t;
|
|
- if ( team.getMode() == 0 )
|
|
- {
|
|
- t = new Team( team.getName() );
|
|
- serverScoreboard.addTeam( t );
|
|
- } else
|
|
- {
|
|
- t = serverScoreboard.getTeam( team.getName() );
|
|
+ if (team.getMode() == 0) {
|
|
+ t = new Team(team.getName());
|
|
+ serverScoreboard.addTeam(t);
|
|
+ } else {
|
|
+ t = serverScoreboard.getTeam(team.getName());
|
|
}
|
|
|
|
- if ( t != null )
|
|
- {
|
|
- if ( team.getMode() == 0 || team.getMode() == 2 )
|
|
- {
|
|
- t.setDisplayName( team.getDisplayName() );
|
|
- t.setPrefix( team.getPrefix() );
|
|
- t.setSuffix( team.getSuffix() );
|
|
- t.setFriendlyFire( team.getFriendlyFire() );
|
|
- t.setNameTagVisibility( team.getNameTagVisibility() );
|
|
- t.setCollisionRule( team.getCollisionRule() );
|
|
- t.setColor( team.getColor() );
|
|
+ if (t != null) {
|
|
+ if (team.getMode() == 0 || team.getMode() == 2) {
|
|
+ t.setDisplayName(team.getDisplayName());
|
|
+ t.setPrefix(team.getPrefix());
|
|
+ t.setSuffix(team.getSuffix());
|
|
+ t.setFriendlyFire(team.getFriendlyFire());
|
|
+ t.setNameTagVisibility(team.getNameTagVisibility());
|
|
+ t.setCollisionRule(team.getCollisionRule());
|
|
+ t.setColor(team.getColor());
|
|
}
|
|
- if ( team.getPlayers() != null )
|
|
- {
|
|
- for ( String s : team.getPlayers() )
|
|
- {
|
|
- if ( team.getMode() == 0 || team.getMode() == 3 )
|
|
- {
|
|
- t.addPlayer( s );
|
|
- } else if ( team.getMode() == 4 )
|
|
- {
|
|
- t.removePlayer( s );
|
|
+ if (team.getPlayers() != null) {
|
|
+ for (String s : team.getPlayers()) {
|
|
+ if (team.getMode() == 0 || team.getMode() == 3) {
|
|
+ t.addPlayer(s);
|
|
+ } else if (team.getMode() == 4) {
|
|
+ t.removePlayer(s);
|
|
}
|
|
}
|
|
}
|
|
@@ -270,278 +251,229 @@ public class DownstreamBridge extends PacketHandler
|
|
}
|
|
|
|
@Override
|
|
- public void handle(PluginMessage pluginMessage) throws Exception
|
|
- {
|
|
- PluginMessageEvent event = new PluginMessageEvent( server, con, pluginMessage.getTag(), pluginMessage.getData().clone() );
|
|
+ public void handle(PluginMessage pluginMessage) throws Exception {
|
|
+ PluginMessageEvent event = new PluginMessageEvent(server, con, pluginMessage.getTag(),
|
|
+ pluginMessage.getData().clone());
|
|
|
|
- if ( bungee.getPluginManager().callEvent( event ).isCancelled() )
|
|
- {
|
|
+ if (bungee.getPluginManager().callEvent(event).isCancelled()) {
|
|
throw CancelSendSignal.INSTANCE;
|
|
}
|
|
|
|
- if ( pluginMessage.getTag().equals( con.getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_13 ? "minecraft:brand" : "MC|Brand" ) )
|
|
- {
|
|
+ if (pluginMessage.getTag()
|
|
+ .equals(con.getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_13 ? "minecraft:brand"
|
|
+ : "MC|Brand")) {
|
|
// Travertine start
|
|
- if ( ProtocolConstants.isAfterOrEq( con.getPendingConnection().getVersion(), ProtocolConstants.MINECRAFT_1_8 ) )
|
|
- {
|
|
- try
|
|
- {
|
|
+ if (ProtocolConstants.isAfterOrEq(con.getPendingConnection().getVersion(),
|
|
+ ProtocolConstants.MINECRAFT_1_8)) {
|
|
+ try {
|
|
ByteBuf brand = Unpooled.wrappedBuffer(pluginMessage.getData());
|
|
String serverBrand = DefinedPacket.readString(brand);
|
|
brand.release();
|
|
brand = ByteBufAllocator.DEFAULT.heapBuffer();
|
|
- DefinedPacket.writeString(bungee.getName() + " <- " + serverBrand, brand ); // Waterfall
|
|
+ DefinedPacket.writeString(bungee.getName() + " <- " + serverBrand, brand); // Waterfall
|
|
pluginMessage.setData(brand);
|
|
brand.release();
|
|
- } catch (Exception ProtocolHacksSuck)
|
|
- {
|
|
+ } catch (Exception ProtocolHacksSuck) {
|
|
return;
|
|
}
|
|
- } else
|
|
- {
|
|
- String serverBrand = new String( pluginMessage.getData(), StandardCharsets.UTF_8);
|
|
- pluginMessage.setData( ( bungee.getName() + " <- " + serverBrand ).getBytes(StandardCharsets.UTF_8) ); // Travertine
|
|
+ } else {
|
|
+ String serverBrand = new String(pluginMessage.getData(), StandardCharsets.UTF_8);
|
|
+ pluginMessage.setData((bungee.getName() + " <- " + serverBrand).getBytes(StandardCharsets.UTF_8)); // Travertine
|
|
}
|
|
// Travertine end
|
|
// changes in the packet are ignored so we need to send it manually
|
|
- con.unsafe().sendPacket( pluginMessage );
|
|
+ con.unsafe().sendPacket(pluginMessage);
|
|
throw CancelSendSignal.INSTANCE;
|
|
}
|
|
|
|
- if ( pluginMessage.getTag().equals( "BungeeCord" ) )
|
|
- {
|
|
+ if (pluginMessage.getTag().equals("BungeeCord")) {
|
|
DataInput in = pluginMessage.getStream();
|
|
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
|
String subChannel = in.readUTF();
|
|
|
|
- if ( subChannel.equals( "ForwardToPlayer" ) )
|
|
- {
|
|
- ProxiedPlayer target = bungee.getPlayer( in.readUTF() );
|
|
- if ( target != null )
|
|
- {
|
|
+ if (subChannel.equals("ForwardToPlayer")) {
|
|
+ ProxiedPlayer target = bungee.getPlayer(in.readUTF());
|
|
+ if (target != null) {
|
|
// Read data from server
|
|
String channel = in.readUTF();
|
|
short len = in.readShort();
|
|
- byte[] data = new byte[ len ];
|
|
- in.readFully( data );
|
|
+ byte[] data = new byte[len];
|
|
+ in.readFully(data);
|
|
|
|
// Prepare new data to send
|
|
- out.writeUTF( channel );
|
|
- out.writeShort( data.length );
|
|
- out.write( data );
|
|
+ out.writeUTF(channel);
|
|
+ out.writeShort(data.length);
|
|
+ out.write(data);
|
|
byte[] payload = out.toByteArray();
|
|
|
|
- target.getServer().sendData( "BungeeCord", payload );
|
|
+ target.getServer().sendData("BungeeCord", payload);
|
|
}
|
|
|
|
// Null out stream, important as we don't want to send to ourselves
|
|
out = null;
|
|
}
|
|
- if ( subChannel.equals( "Forward" ) )
|
|
- {
|
|
+ if (subChannel.equals("Forward")) {
|
|
// Read data from server
|
|
String target = in.readUTF();
|
|
String channel = in.readUTF();
|
|
short len = in.readShort();
|
|
- byte[] data = new byte[ len ];
|
|
- in.readFully( data );
|
|
+ byte[] data = new byte[len];
|
|
+ in.readFully(data);
|
|
|
|
// Prepare new data to send
|
|
- out.writeUTF( channel );
|
|
- out.writeShort( data.length );
|
|
- out.write( data );
|
|
+ out.writeUTF(channel);
|
|
+ out.writeShort(data.length);
|
|
+ out.write(data);
|
|
byte[] payload = out.toByteArray();
|
|
|
|
// Null out stream, important as we don't want to send to ourselves
|
|
out = null;
|
|
|
|
- if ( target.equals( "ALL" ) )
|
|
- {
|
|
- for ( ServerInfo server : bungee.getServers().values() )
|
|
- {
|
|
- if ( server != this.server.getInfo() )
|
|
- {
|
|
- server.sendData( "BungeeCord", payload );
|
|
+ if (target.equals("ALL")) {
|
|
+ for (ServerInfo server : bungee.getServers().values()) {
|
|
+ if (server != this.server.getInfo()) {
|
|
+ server.sendData("BungeeCord", payload);
|
|
}
|
|
}
|
|
- } else if ( target.equals( "ONLINE" ) )
|
|
- {
|
|
- for ( ServerInfo server : bungee.getServers().values() )
|
|
- {
|
|
- if ( server != this.server.getInfo() )
|
|
- {
|
|
- server.sendData( "BungeeCord", payload, false );
|
|
+ } else if (target.equals("ONLINE")) {
|
|
+ for (ServerInfo server : bungee.getServers().values()) {
|
|
+ if (server != this.server.getInfo()) {
|
|
+ server.sendData("BungeeCord", payload, false);
|
|
}
|
|
}
|
|
- } else
|
|
- {
|
|
- ServerInfo server = bungee.getServerInfo( target );
|
|
- if ( server != null )
|
|
- {
|
|
- server.sendData( "BungeeCord", payload );
|
|
+ } else {
|
|
+ ServerInfo server = bungee.getServerInfo(target);
|
|
+ if (server != null) {
|
|
+ server.sendData("BungeeCord", payload);
|
|
}
|
|
}
|
|
}
|
|
- if ( subChannel.equals( "Connect" ) )
|
|
- {
|
|
- ServerInfo server = bungee.getServerInfo( in.readUTF() );
|
|
- if ( server != null )
|
|
- {
|
|
- con.connect( server, ServerConnectEvent.Reason.PLUGIN_MESSAGE );
|
|
+ if (subChannel.equals("Connect")) {
|
|
+ ServerInfo server = bungee.getServerInfo(in.readUTF());
|
|
+ if (server != null) {
|
|
+ con.connect(server, ServerConnectEvent.Reason.PLUGIN_MESSAGE);
|
|
}
|
|
}
|
|
- if ( subChannel.equals( "ConnectOther" ) )
|
|
- {
|
|
- ProxiedPlayer player = bungee.getPlayer( in.readUTF() );
|
|
- if ( player != null )
|
|
- {
|
|
- ServerInfo server = bungee.getServerInfo( in.readUTF() );
|
|
- if ( server != null )
|
|
- {
|
|
- player.connect( server );
|
|
+ if (subChannel.equals("ConnectOther")) {
|
|
+ ProxiedPlayer player = bungee.getPlayer(in.readUTF());
|
|
+ if (player != null) {
|
|
+ ServerInfo server = bungee.getServerInfo(in.readUTF());
|
|
+ if (server != null) {
|
|
+ player.connect(server);
|
|
}
|
|
}
|
|
}
|
|
- if ( subChannel.equals( "IP" ) )
|
|
- {
|
|
- out.writeUTF( "IP" );
|
|
- if ( con.getSocketAddress() instanceof InetSocketAddress )
|
|
- {
|
|
- out.writeUTF( con.getAddress().getHostString() );
|
|
- out.writeInt( con.getAddress().getPort() );
|
|
- } else
|
|
- {
|
|
- out.writeUTF( "unix://" + ( (DomainSocketAddress) con.getSocketAddress() ).path() );
|
|
- out.writeInt( 0 );
|
|
+ if (subChannel.equals("IP")) {
|
|
+ out.writeUTF("IP");
|
|
+ if (con.getSocketAddress() instanceof InetSocketAddress) {
|
|
+ out.writeUTF(con.getAddress().getHostString());
|
|
+ out.writeInt(con.getAddress().getPort());
|
|
+ } else {
|
|
+ out.writeUTF("unix://" + ((DomainSocketAddress) con.getSocketAddress()).path());
|
|
+ out.writeInt(0);
|
|
}
|
|
}
|
|
- if ( subChannel.equals( "PlayerCount" ) )
|
|
- {
|
|
+ if (subChannel.equals("PlayerCount")) {
|
|
String target = in.readUTF();
|
|
- out.writeUTF( "PlayerCount" );
|
|
- if ( target.equals( "ALL" ) )
|
|
- {
|
|
- out.writeUTF( "ALL" );
|
|
- out.writeInt( bungee.getOnlineCount() );
|
|
- } else
|
|
- {
|
|
- ServerInfo server = bungee.getServerInfo( target );
|
|
- if ( server != null )
|
|
- {
|
|
- out.writeUTF( server.getName() );
|
|
- out.writeInt( server.getPlayers().size() );
|
|
+ out.writeUTF("PlayerCount");
|
|
+ if (target.equals("ALL")) {
|
|
+ out.writeUTF("ALL");
|
|
+ out.writeInt(bungee.getOnlineCount());
|
|
+ } else {
|
|
+ ServerInfo server = bungee.getServerInfo(target);
|
|
+ if (server != null) {
|
|
+ out.writeUTF(server.getName());
|
|
+ out.writeInt(server.getPlayers().size());
|
|
}
|
|
}
|
|
}
|
|
- if ( subChannel.equals( "PlayerList" ) )
|
|
- {
|
|
+ if (subChannel.equals("PlayerList")) {
|
|
String target = in.readUTF();
|
|
- out.writeUTF( "PlayerList" );
|
|
- if ( target.equals( "ALL" ) )
|
|
- {
|
|
- out.writeUTF( "ALL" );
|
|
- out.writeUTF( Util.csv( bungee.getPlayers() ) );
|
|
- } else
|
|
- {
|
|
- ServerInfo server = bungee.getServerInfo( target );
|
|
- if ( server != null )
|
|
- {
|
|
- out.writeUTF( server.getName() );
|
|
- out.writeUTF( Util.csv( server.getPlayers() ) );
|
|
+ out.writeUTF("PlayerList");
|
|
+ if (target.equals("ALL")) {
|
|
+ out.writeUTF("ALL");
|
|
+ out.writeUTF(Util.csv(bungee.getPlayers()));
|
|
+ } else {
|
|
+ ServerInfo server = bungee.getServerInfo(target);
|
|
+ if (server != null) {
|
|
+ out.writeUTF(server.getName());
|
|
+ out.writeUTF(Util.csv(server.getPlayers()));
|
|
}
|
|
}
|
|
}
|
|
- if ( subChannel.equals( "GetServers" ) )
|
|
- {
|
|
- out.writeUTF( "GetServers" );
|
|
- out.writeUTF( Util.csv( bungee.getServers().keySet() ) );
|
|
+ if (subChannel.equals("GetServers")) {
|
|
+ out.writeUTF("GetServers");
|
|
+ out.writeUTF(Util.csv(bungee.getServers().keySet()));
|
|
}
|
|
- if ( subChannel.equals( "Message" ) )
|
|
- {
|
|
+ if (subChannel.equals("Message")) {
|
|
String target = in.readUTF();
|
|
String message = in.readUTF();
|
|
- if ( target.equals( "ALL" ) )
|
|
- {
|
|
- for ( ProxiedPlayer player : bungee.getPlayers() )
|
|
- {
|
|
- player.sendMessage( message );
|
|
+ if (target.equals("ALL")) {
|
|
+ for (ProxiedPlayer player : bungee.getPlayers()) {
|
|
+ player.sendMessage(message);
|
|
}
|
|
- } else
|
|
- {
|
|
- ProxiedPlayer player = bungee.getPlayer( target );
|
|
- if ( player != null )
|
|
- {
|
|
- player.sendMessage( message );
|
|
+ } else {
|
|
+ ProxiedPlayer player = bungee.getPlayer(target);
|
|
+ if (player != null) {
|
|
+ player.sendMessage(message);
|
|
}
|
|
}
|
|
}
|
|
- if ( subChannel.equals( "MessageRaw" ) )
|
|
- {
|
|
+ if (subChannel.equals("MessageRaw")) {
|
|
String target = in.readUTF();
|
|
- BaseComponent[] message = ComponentSerializer.parse( in.readUTF() );
|
|
- if ( target.equals( "ALL" ) )
|
|
- {
|
|
- for ( ProxiedPlayer player : bungee.getPlayers() )
|
|
- {
|
|
- player.sendMessage( message );
|
|
+ BaseComponent[] message = ComponentSerializer.parse(in.readUTF());
|
|
+ if (target.equals("ALL")) {
|
|
+ for (ProxiedPlayer player : bungee.getPlayers()) {
|
|
+ player.sendMessage(message);
|
|
}
|
|
- } else
|
|
- {
|
|
- ProxiedPlayer player = bungee.getPlayer( target );
|
|
- if ( player != null )
|
|
- {
|
|
- player.sendMessage( message );
|
|
+ } else {
|
|
+ ProxiedPlayer player = bungee.getPlayer(target);
|
|
+ if (player != null) {
|
|
+ player.sendMessage(message);
|
|
}
|
|
}
|
|
}
|
|
- if ( subChannel.equals( "GetServer" ) )
|
|
- {
|
|
- out.writeUTF( "GetServer" );
|
|
- out.writeUTF( server.getInfo().getName() );
|
|
+ if (subChannel.equals("GetServer")) {
|
|
+ out.writeUTF("GetServer");
|
|
+ out.writeUTF(server.getInfo().getName());
|
|
}
|
|
- if ( subChannel.equals( "UUID" ) )
|
|
- {
|
|
- out.writeUTF( "UUID" );
|
|
- out.writeUTF( con.getUUID() );
|
|
+ if (subChannel.equals("UUID")) {
|
|
+ out.writeUTF("UUID");
|
|
+ out.writeUTF(con.getUUID());
|
|
}
|
|
- if ( subChannel.equals( "UUIDOther" ) )
|
|
- {
|
|
- ProxiedPlayer player = bungee.getPlayer( in.readUTF() );
|
|
- if ( player != null )
|
|
- {
|
|
- out.writeUTF( "UUIDOther" );
|
|
- out.writeUTF( player.getName() );
|
|
- out.writeUTF( player.getUUID() );
|
|
+ if (subChannel.equals("UUIDOther")) {
|
|
+ ProxiedPlayer player = bungee.getPlayer(in.readUTF());
|
|
+ if (player != null) {
|
|
+ out.writeUTF("UUIDOther");
|
|
+ out.writeUTF(player.getName());
|
|
+ out.writeUTF(player.getUUID());
|
|
}
|
|
}
|
|
- if ( subChannel.equals( "ServerIP" ) )
|
|
- {
|
|
- ServerInfo info = bungee.getServerInfo( in.readUTF() );
|
|
- if ( info != null && !info.getAddress().isUnresolved() )
|
|
- {
|
|
- out.writeUTF( "ServerIP" );
|
|
- out.writeUTF( info.getName() );
|
|
- out.writeUTF( info.getAddress().getAddress().getHostAddress() );
|
|
- out.writeShort( info.getAddress().getPort() );
|
|
+ if (subChannel.equals("ServerIP")) {
|
|
+ // FlameCord start - Changed "info.getAddress().getAddress()" to address
|
|
+ final ServerInfo info = bungee.getServerInfo(in.readUTF());
|
|
+ final InetSocketAddress address = info.getAddress();
|
|
+ if (info != null && !address.isUnresolved()) {
|
|
+ out.writeUTF("ServerIP");
|
|
+ out.writeUTF(info.getName());
|
|
+ out.writeUTF(address.getHostString());
|
|
+ out.writeShort(address.getPort());
|
|
}
|
|
}
|
|
- if ( subChannel.equals( "KickPlayer" ) )
|
|
- {
|
|
- ProxiedPlayer player = bungee.getPlayer( in.readUTF() );
|
|
- if ( player != null )
|
|
- {
|
|
+ if (subChannel.equals("KickPlayer")) {
|
|
+ ProxiedPlayer player = bungee.getPlayer(in.readUTF());
|
|
+ if (player != null) {
|
|
String kickReason = in.readUTF();
|
|
- player.disconnect( new TextComponent( kickReason ) );
|
|
+ player.disconnect(new TextComponent(kickReason));
|
|
}
|
|
}
|
|
|
|
- // Check we haven't set out to null, and we have written data, if so reply back back along the BungeeCord channel
|
|
- if ( out != null )
|
|
- {
|
|
+ // Check we haven't set out to null, and we have written data, if so reply back
|
|
+ // back along the BungeeCord channel
|
|
+ if (out != null) {
|
|
byte[] b = out.toByteArray();
|
|
- if ( b.length != 0 )
|
|
- {
|
|
- server.sendData( "BungeeCord", b );
|
|
+ if (b.length != 0) {
|
|
+ server.sendData("BungeeCord", b);
|
|
}
|
|
}
|
|
|
|
@@ -550,100 +482,89 @@ public class DownstreamBridge extends PacketHandler
|
|
}
|
|
|
|
@Override
|
|
- public void handle(Kick kick) throws Exception
|
|
- {
|
|
- ServerInfo def = con.updateAndGetNextServer( server.getInfo() );
|
|
- if ( Objects.equals( server.getInfo(), def ) )
|
|
- {
|
|
+ public void handle(Kick kick) throws Exception {
|
|
+ ServerInfo def = con.updateAndGetNextServer(server.getInfo());
|
|
+ if (Objects.equals(server.getInfo(), def)) {
|
|
def = null;
|
|
}
|
|
- ServerKickEvent event = bungee.getPluginManager().callEvent( new ServerKickEvent( con, server.getInfo(), ComponentSerializer.parse( kick.getMessage() ), def, ServerKickEvent.State.CONNECTED, ServerKickEvent.Cause.SERVER ) ); // Waterfall
|
|
- if ( event.isCancelled() && event.getCancelServer() != null )
|
|
- {
|
|
- con.connectNow( event.getCancelServer(), ServerConnectEvent.Reason.KICK_REDIRECT );
|
|
- } else
|
|
- {
|
|
- con.disconnect0( event.getKickReasonComponent() ); // TODO: Prefix our own stuff.
|
|
+ ServerKickEvent event = bungee.getPluginManager()
|
|
+ .callEvent(new ServerKickEvent(con, server.getInfo(), ComponentSerializer.parse(kick.getMessage()), def,
|
|
+ ServerKickEvent.State.CONNECTED, ServerKickEvent.Cause.SERVER)); // Waterfall
|
|
+ if (event.isCancelled() && event.getCancelServer() != null) {
|
|
+ con.connectNow(event.getCancelServer(), ServerConnectEvent.Reason.KICK_REDIRECT);
|
|
+ } else {
|
|
+ con.disconnect0(event.getKickReasonComponent()); // TODO: Prefix our own stuff.
|
|
}
|
|
- server.setObsolete( true );
|
|
+ server.setObsolete(true);
|
|
throw CancelSendSignal.INSTANCE;
|
|
}
|
|
|
|
@Override
|
|
- public void handle(SetCompression setCompression) throws Exception
|
|
- {
|
|
- server.getCh().setCompressionThreshold( setCompression.getThreshold() );
|
|
+ public void handle(SetCompression setCompression) throws Exception {
|
|
+ server.getCh().setCompressionThreshold(setCompression.getThreshold());
|
|
}
|
|
|
|
@Override
|
|
- public void handle(TabCompleteResponse tabCompleteResponse) throws Exception
|
|
- {
|
|
+ public void handle(TabCompleteResponse tabCompleteResponse) throws Exception {
|
|
List<String> commands = tabCompleteResponse.getCommands();
|
|
- if ( commands == null )
|
|
- {
|
|
- commands = Lists.transform( tabCompleteResponse.getSuggestions().getList(), new Function<Suggestion, String>()
|
|
- {
|
|
- @Override
|
|
- public String apply(Suggestion input)
|
|
- {
|
|
- return input.getText();
|
|
- }
|
|
- } );
|
|
+ if (commands == null) {
|
|
+ commands = Lists.transform(tabCompleteResponse.getSuggestions().getList(),
|
|
+ new Function<Suggestion, String>() {
|
|
+ @Override
|
|
+ public String apply(Suggestion input) {
|
|
+ return input.getText();
|
|
+ }
|
|
+ });
|
|
}
|
|
|
|
- TabCompleteResponseEvent tabCompleteResponseEvent = new TabCompleteResponseEvent( server, con, new ArrayList<>( commands ) );
|
|
- if ( !bungee.getPluginManager().callEvent( tabCompleteResponseEvent ).isCancelled() )
|
|
- {
|
|
+ TabCompleteResponseEvent tabCompleteResponseEvent = new TabCompleteResponseEvent(server, con,
|
|
+ new ArrayList<>(commands));
|
|
+ if (!bungee.getPluginManager().callEvent(tabCompleteResponseEvent).isCancelled()) {
|
|
// Take action only if modified
|
|
- if ( !commands.equals( tabCompleteResponseEvent.getSuggestions() ) )
|
|
- {
|
|
- if ( tabCompleteResponse.getCommands() != null )
|
|
- {
|
|
+ if (!commands.equals(tabCompleteResponseEvent.getSuggestions())) {
|
|
+ if (tabCompleteResponse.getCommands() != null) {
|
|
// Classic style
|
|
- tabCompleteResponse.setCommands( tabCompleteResponseEvent.getSuggestions() );
|
|
- } else
|
|
- {
|
|
+ tabCompleteResponse.setCommands(tabCompleteResponseEvent.getSuggestions());
|
|
+ } else {
|
|
// Brigadier style
|
|
final StringRange range = tabCompleteResponse.getSuggestions().getRange();
|
|
- tabCompleteResponse.setSuggestions( new Suggestions( range, Lists.transform( tabCompleteResponseEvent.getSuggestions(), new Function<String, Suggestion>()
|
|
- {
|
|
- @Override
|
|
- public Suggestion apply(String input)
|
|
- {
|
|
- return new Suggestion( range, input );
|
|
- }
|
|
- } ) ) );
|
|
+ tabCompleteResponse.setSuggestions(new Suggestions(range, Lists
|
|
+ .transform(tabCompleteResponseEvent.getSuggestions(), new Function<String, Suggestion>() {
|
|
+ @Override
|
|
+ public Suggestion apply(String input) {
|
|
+ return new Suggestion(range, input);
|
|
+ }
|
|
+ })));
|
|
}
|
|
}
|
|
|
|
- con.unsafe().sendPacket( tabCompleteResponse );
|
|
+ con.unsafe().sendPacket(tabCompleteResponse);
|
|
}
|
|
|
|
throw CancelSendSignal.INSTANCE;
|
|
}
|
|
|
|
@Override
|
|
- public void handle(BossBar bossBar)
|
|
- {
|
|
- switch ( bossBar.getAction() )
|
|
- {
|
|
+ public void handle(BossBar bossBar) {
|
|
+ switch (bossBar.getAction()) {
|
|
// Handle add bossbar
|
|
case 0:
|
|
- con.getSentBossBars().add( bossBar.getUuid() );
|
|
+ con.getSentBossBars().add(bossBar.getUuid());
|
|
break;
|
|
// Handle remove bossbar
|
|
case 1:
|
|
- con.getSentBossBars().remove( bossBar.getUuid() );
|
|
+ con.getSentBossBars().remove(bossBar.getUuid());
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Waterfall start
|
|
@Override
|
|
- public void handle(EntityEffect entityEffect) throws Exception
|
|
- {
|
|
- if (con.isDisableEntityMetadataRewrite()) return; // Waterfall
|
|
- // Don't send any potions when switching between servers (which involves a handshake), which can trigger a race
|
|
+ public void handle(EntityEffect entityEffect) throws Exception {
|
|
+ if (con.isDisableEntityMetadataRewrite())
|
|
+ return; // Waterfall
|
|
+ // Don't send any potions when switching between servers (which involves a
|
|
+ // handshake), which can trigger a race
|
|
// condition on the client.
|
|
if (this.con.getForgeClientHandler().isForgeUser() && !this.con.getForgeClientHandler().isHandshakeComplete()) {
|
|
throw CancelSendSignal.INSTANCE;
|
|
@@ -652,9 +573,9 @@ public class DownstreamBridge extends PacketHandler
|
|
}
|
|
|
|
@Override
|
|
- public void handle(EntityRemoveEffect removeEffect) throws Exception
|
|
- {
|
|
- if (con.isDisableEntityMetadataRewrite()) return; // Waterfall
|
|
+ public void handle(EntityRemoveEffect removeEffect) throws Exception {
|
|
+ if (con.isDisableEntityMetadataRewrite())
|
|
+ return; // Waterfall
|
|
con.getPotions().remove(rewriteEntityId(removeEffect.getEntityId()), removeEffect.getEffectId());
|
|
}
|
|
|
|
@@ -667,56 +588,52 @@ public class DownstreamBridge extends PacketHandler
|
|
// Waterfall end
|
|
|
|
@Override
|
|
- public void handle(Respawn respawn)
|
|
- {
|
|
- con.setDimension( respawn.getDimension() );
|
|
+ public void handle(Respawn respawn) {
|
|
+ con.setDimension(respawn.getDimension());
|
|
}
|
|
|
|
@Override
|
|
- public void handle(Commands commands) throws Exception
|
|
- {
|
|
+ public void handle(Commands commands) throws Exception {
|
|
boolean modified = false;
|
|
|
|
// Waterfall start
|
|
Map<String, Command> commandMap = new HashMap<>();
|
|
- for ( Map.Entry<String, Command> commandEntry : bungee.getPluginManager().getCommands() ) {
|
|
- if ( !bungee.getDisabledCommands().contains( commandEntry.getKey() )
|
|
- && commands.getRoot().getChild( commandEntry.getKey() ) == null
|
|
- && commandEntry.getValue().hasPermission( this.con ) ) {
|
|
+ for (Map.Entry<String, Command> commandEntry : bungee.getPluginManager().getCommands()) {
|
|
+ if (!bungee.getDisabledCommands().contains(commandEntry.getKey())
|
|
+ && commands.getRoot().getChild(commandEntry.getKey()) == null
|
|
+ && commandEntry.getValue().hasPermission(this.con)) {
|
|
|
|
- commandMap.put( commandEntry.getKey(), commandEntry.getValue() );
|
|
+ commandMap.put(commandEntry.getKey(), commandEntry.getValue());
|
|
}
|
|
}
|
|
|
|
- ProxyDefineCommandsEvent event = new ProxyDefineCommandsEvent( this.server, this.con, commandMap );
|
|
- bungee.getPluginManager().callEvent( event );
|
|
+ ProxyDefineCommandsEvent event = new ProxyDefineCommandsEvent(this.server, this.con, commandMap);
|
|
+ bungee.getPluginManager().callEvent(event);
|
|
|
|
- for ( Map.Entry<String, Command> command : event.getCommands().entrySet() )
|
|
- {
|
|
- //noinspection ConstantConditions
|
|
- if ( true ) // Moved up
|
|
+ for (Map.Entry<String, Command> command : event.getCommands().entrySet()) {
|
|
+ // noinspection ConstantConditions
|
|
+ if (true) // Moved up
|
|
// Waterfall end
|
|
{
|
|
- LiteralCommandNode dummy = LiteralArgumentBuilder.literal( command.getKey() )
|
|
- .then( RequiredArgumentBuilder.argument( "args", StringArgumentType.greedyString() )
|
|
- .suggests( Commands.SuggestionRegistry.ASK_SERVER ) )
|
|
+ LiteralCommandNode dummy = LiteralArgumentBuilder.literal(command.getKey())
|
|
+ .then(RequiredArgumentBuilder.argument("args", StringArgumentType.greedyString())
|
|
+ .suggests(Commands.SuggestionRegistry.ASK_SERVER))
|
|
.build();
|
|
- commands.getRoot().addChild( dummy );
|
|
+ commands.getRoot().addChild(dummy);
|
|
|
|
modified = true;
|
|
}
|
|
}
|
|
|
|
- if ( modified )
|
|
- {
|
|
- con.unsafe().sendPacket( commands );
|
|
+ if (modified) {
|
|
+ con.unsafe().sendPacket(commands);
|
|
throw CancelSendSignal.INSTANCE;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public String toString()
|
|
- {
|
|
- return "[" + con.getAddress() + "|" + con.getName() + "] <-> DownstreamBridge <-> [" + server.getInfo().getName() + "]";
|
|
+ public String toString() {
|
|
+ return "[" + con.getAddress() + "|" + con.getName() + "] <-> DownstreamBridge <-> ["
|
|
+ + server.getInfo().getName() + "]";
|
|
}
|
|
}
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java b/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java
|
|
index 13deb6c9..4adb858b 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java
|
|
@@ -1,8 +1,5 @@
|
|
package net.md_5.bungee.connection;
|
|
|
|
-import com.google.common.base.Charsets;
|
|
-import com.google.common.base.Preconditions;
|
|
-import com.google.gson.Gson;
|
|
import java.math.BigInteger;
|
|
import java.net.InetSocketAddress;
|
|
import java.net.SocketAddress;
|
|
@@ -11,18 +8,22 @@ import java.security.MessageDigest;
|
|
import java.util.List;
|
|
import java.util.UUID;
|
|
import java.util.logging.Level;
|
|
+
|
|
import javax.crypto.SecretKey;
|
|
|
|
import com.google.common.base.Charsets;
|
|
import com.google.common.base.Preconditions;
|
|
import com.google.gson.Gson;
|
|
-
|
|
import com.google.gson.JsonElement;
|
|
import com.google.gson.JsonObject;
|
|
+
|
|
+import dev._2lstudios.flamecord.FlameCord;
|
|
+import dev._2lstudios.flamecord.firewall.FirewallException;
|
|
import lombok.Getter;
|
|
import lombok.RequiredArgsConstructor;
|
|
import net.md_5.bungee.BungeeCord;
|
|
import net.md_5.bungee.BungeeServerInfo;
|
|
+import net.md_5.bungee.ConnectionThrottle;
|
|
import net.md_5.bungee.EncryptionUtil;
|
|
import net.md_5.bungee.UserConnection;
|
|
import net.md_5.bungee.Util;
|
|
@@ -31,6 +32,7 @@ import net.md_5.bungee.api.Callback;
|
|
import net.md_5.bungee.api.ChatColor;
|
|
import net.md_5.bungee.api.Favicon;
|
|
import net.md_5.bungee.api.ServerPing;
|
|
+import net.md_5.bungee.api.ServerPing.Players;
|
|
import net.md_5.bungee.api.chat.BaseComponent;
|
|
import net.md_5.bungee.api.chat.TextComponent;
|
|
import net.md_5.bungee.api.config.ListenerInfo;
|
|
@@ -52,6 +54,7 @@ import net.md_5.bungee.netty.PacketHandler;
|
|
import net.md_5.bungee.netty.PipelineUtils;
|
|
import net.md_5.bungee.netty.cipher.CipherDecoder;
|
|
import net.md_5.bungee.netty.cipher.CipherEncoder;
|
|
+import net.md_5.bungee.protocol.BadPacketException;
|
|
import net.md_5.bungee.protocol.DefinedPacket;
|
|
import net.md_5.bungee.protocol.PacketWrapper;
|
|
import net.md_5.bungee.protocol.Protocol;
|
|
@@ -71,13 +74,12 @@ import net.md_5.bungee.protocol.packet.StatusRequest;
|
|
import net.md_5.bungee.protocol.packet.StatusResponse;
|
|
import net.md_5.bungee.util.BoundedArrayList;
|
|
import net.md_5.bungee.util.BufUtil;
|
|
-import net.md_5.bungee.util.QuietException;
|
|
|
|
@RequiredArgsConstructor
|
|
-public class InitialHandler extends PacketHandler implements PendingConnection
|
|
-{
|
|
+public class InitialHandler extends PacketHandler implements PendingConnection {
|
|
|
|
- private static final String MOJANG_AUTH_URL = System.getProperty("waterfall.auth.url", "https://sessionserver.mojang.com/session/minecraft/hasJoined?username=%s&serverId=%s%s");
|
|
+ private static final String MOJANG_AUTH_URL = System.getProperty("waterfall.auth.url",
|
|
+ "https://sessionserver.mojang.com/session/minecraft/hasJoined?username=%s&serverId=%s%s");
|
|
|
|
private final BungeeCord bungee;
|
|
private ChannelWrapper ch;
|
|
@@ -89,14 +91,12 @@ public class InitialHandler extends PacketHandler implements PendingConnection
|
|
private LoginRequest loginRequest;
|
|
private EncryptionRequest request;
|
|
@Getter
|
|
- private final List<PluginMessage> relayMessages = new BoundedArrayList<>( 128 );
|
|
+ private final List<PluginMessage> relayMessages = new BoundedArrayList<>(128);
|
|
private State thisState = State.HANDSHAKE;
|
|
- private final Unsafe unsafe = new Unsafe()
|
|
- {
|
|
+ private final Unsafe unsafe = new Unsafe() {
|
|
@Override
|
|
- public void sendPacket(DefinedPacket packet)
|
|
- {
|
|
- ch.write( packet );
|
|
+ public void sendPacket(final DefinedPacket packet) {
|
|
+ ch.write(packet);
|
|
}
|
|
};
|
|
@Getter
|
|
@@ -116,581 +116,561 @@ public class InitialHandler extends PacketHandler implements PendingConnection
|
|
private String extraDataInHandshake = "";
|
|
|
|
@Override
|
|
- public boolean shouldHandle(PacketWrapper packet) throws Exception
|
|
- {
|
|
+ public boolean shouldHandle(final PacketWrapper packet) throws Exception {
|
|
return !ch.isClosing();
|
|
}
|
|
|
|
- private enum State
|
|
- {
|
|
-
|
|
+ private enum State {
|
|
HANDSHAKE, STATUS, PING, USERNAME, ENCRYPT, FINISHED;
|
|
}
|
|
|
|
- private boolean canSendKickMessage()
|
|
- {
|
|
+ private boolean canSendKickMessage() {
|
|
return thisState == State.USERNAME || thisState == State.ENCRYPT || thisState == State.FINISHED;
|
|
}
|
|
|
|
@Override
|
|
- public void connected(ChannelWrapper channel) throws Exception
|
|
- {
|
|
+ public void connected(final ChannelWrapper channel) throws Exception {
|
|
this.ch = channel;
|
|
}
|
|
|
|
@Override
|
|
- public void exception(Throwable t) throws Exception
|
|
- {
|
|
- if ( canSendKickMessage() )
|
|
- {
|
|
- disconnect( ChatColor.RED + Util.exception( t ) );
|
|
- } else
|
|
- {
|
|
+ public void exception(final Throwable t) throws Exception {
|
|
+ if (canSendKickMessage()) {
|
|
+ disconnect(ChatColor.RED + Util.exception(t));
|
|
+ } else {
|
|
ch.close();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void handle(PacketWrapper packet) throws Exception
|
|
- {
|
|
- if ( packet.packet == null )
|
|
- {
|
|
- throw new QuietException( "Unexpected packet received during login process! " + BufUtil.dump( packet.buf, 16 ) );
|
|
+ public void handle(final PacketWrapper packet) throws Exception {
|
|
+ if (packet.packet == null) {
|
|
+ // FlameCord - Toggle Dumping packet info
|
|
+ if (FlameCord.getInstance().getFlameCordConfiguration().isLoggerDump()) {
|
|
+ // FlameCord - Change from QuietException to BadPacketException
|
|
+ throw new BadPacketException(
|
|
+ "Unexpected packet received during server login process!\n" + BufUtil.dump(packet.buf, 16));
|
|
+ } else {
|
|
+ // FlameCord - Change from QuietException to BadPacketException
|
|
+ throw new BadPacketException("Unexpected packet received during login process!");
|
|
+ }
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void handle(PluginMessage pluginMessage) throws Exception
|
|
- {
|
|
+ public void handle(final PluginMessage pluginMessage) throws Exception {
|
|
// TODO: Unregister?
|
|
- if ( PluginMessage.SHOULD_RELAY.apply( pluginMessage ) )
|
|
- {
|
|
- relayMessages.add( pluginMessage );
|
|
+ if (PluginMessage.SHOULD_RELAY.apply(pluginMessage)) {
|
|
+ relayMessages.add(pluginMessage);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void handle(LegacyHandshake legacyHandshake) throws Exception
|
|
- {
|
|
+ public void handle(final LegacyHandshake legacyHandshake) throws Exception {
|
|
this.legacy = true;
|
|
- ch.close( bungee.getTranslation( "outdated_client", bungee.getGameVersion() ) );
|
|
+ ch.close(bungee.getTranslation("outdated_client", bungee.getGameVersion()));
|
|
}
|
|
|
|
@Override
|
|
- public void handle(LegacyPing ping) throws Exception
|
|
- {
|
|
+ public void handle(final LegacyPing ping) throws Exception {
|
|
this.legacy = true;
|
|
final boolean v1_5 = ping.isV1_5();
|
|
|
|
- ServerPing legacy = new ServerPing( new ServerPing.Protocol( bungee.getName() + " " + bungee.getGameVersion(), bungee.getProtocolVersion() ),
|
|
- new ServerPing.Players( listener.getMaxPlayers(), bungee.getOnlineCount(), null ),
|
|
- new TextComponent( TextComponent.fromLegacyText( listener.getMotd() ) ), (Favicon) null );
|
|
+ final ServerPing legacy = new ServerPing(
|
|
+ new ServerPing.Protocol(bungee.getName() + " " + bungee.getGameVersion(), bungee.getProtocolVersion()),
|
|
+ new ServerPing.Players(listener.getMaxPlayers(), bungee.getOnlineCount(), null),
|
|
+ new TextComponent(TextComponent.fromLegacyText(listener.getMotd())), (Favicon) null);
|
|
|
|
- Callback<ProxyPingEvent> callback = new Callback<ProxyPingEvent>()
|
|
- {
|
|
+ final Callback<ProxyPingEvent> callback = new Callback<ProxyPingEvent>() {
|
|
@Override
|
|
- public void done(ProxyPingEvent result, Throwable error)
|
|
- {
|
|
- if ( ch.isClosed() )
|
|
- {
|
|
+ public void done(final ProxyPingEvent result, final Throwable error) {
|
|
+ if (ch.isClosed()) {
|
|
return;
|
|
}
|
|
|
|
- ServerPing legacy = result.getResponse();
|
|
- String kickMessage;
|
|
-
|
|
- if ( v1_5 )
|
|
- {
|
|
- kickMessage = ChatColor.DARK_BLUE
|
|
- + "\00" + 127
|
|
- + '\00' + legacy.getVersion().getName()
|
|
- + '\00' + getFirstLine( legacy.getDescription() )
|
|
- + '\00' + legacy.getPlayers().getOnline()
|
|
- + '\00' + legacy.getPlayers().getMax();
|
|
- } else
|
|
- {
|
|
- // Clients <= 1.3 don't support colored motds because the color char is used as delimiter
|
|
- kickMessage = ChatColor.stripColor( getFirstLine( legacy.getDescription() ) )
|
|
- + '\u00a7' + legacy.getPlayers().getOnline()
|
|
- + '\u00a7' + legacy.getPlayers().getMax();
|
|
+ final ServerPing legacy = result.getResponse();
|
|
+
|
|
+ // FlameCord start - Checking if legacy != null before doing anything
|
|
+ if (legacy != null) {
|
|
+ final Players players = legacy.getPlayers();
|
|
+
|
|
+ if (v1_5) {
|
|
+ ch.close(ChatColor.DARK_BLUE + "\00" + 127 + '\00' + legacy.getVersion().getName() + '\00'
|
|
+ + getFirstLine(legacy.getDescription()) + '\00' + players.getOnline() + '\00'
|
|
+ + players.getMax());
|
|
+ } else {
|
|
+ // Clients <= 1.3 don't support colored motds because the color char is used as
|
|
+ // delimiter
|
|
+ ch.close(ChatColor.stripColor(getFirstLine(legacy.getDescription())) + '\u00a7'
|
|
+ + legacy.getPlayers().getOnline() + '\u00a7' + legacy.getPlayers().getMax());
|
|
+ }
|
|
+ } else {
|
|
+ ch.close();
|
|
}
|
|
-
|
|
- ch.close( kickMessage );
|
|
+ // FlameCord end - Checking if legacy != null before doing anything
|
|
}
|
|
};
|
|
|
|
- bungee.getPluginManager().callEvent( new ProxyPingEvent( this, legacy, callback ) );
|
|
+ bungee.getPluginManager().callEvent(new ProxyPingEvent(this, legacy, callback));
|
|
}
|
|
|
|
- private static String getFirstLine(String str)
|
|
- {
|
|
- int pos = str.indexOf( '\n' );
|
|
- return pos == -1 ? str : str.substring( 0, pos );
|
|
+ private static String getFirstLine(final String str) {
|
|
+ final int pos = str.indexOf('\n');
|
|
+ return pos == -1 ? str : str.substring(0, pos);
|
|
}
|
|
|
|
- private ServerPing getPingInfo(String motd, int protocol)
|
|
- {
|
|
- return new ServerPing(
|
|
- new ServerPing.Protocol( bungee.getName() + " " + bungee.getGameVersion(), protocol ),
|
|
- new ServerPing.Players( listener.getMaxPlayers(), bungee.getOnlineCount(), null ),
|
|
- motd, BungeeCord.getInstance().config.getFaviconObject()
|
|
- );
|
|
+ private ServerPing getPingInfo(final String motd, final int protocol) {
|
|
+ return new ServerPing(new ServerPing.Protocol(bungee.getName() + " " + bungee.getGameVersion(), protocol),
|
|
+ new ServerPing.Players(listener.getMaxPlayers(), bungee.getOnlineCount(), null), motd,
|
|
+ BungeeCord.getInstance().config.getFaviconObject());
|
|
}
|
|
|
|
@Override
|
|
- public void handle(StatusRequest statusRequest) throws Exception
|
|
- {
|
|
- Preconditions.checkState( thisState == State.STATUS, "Not expecting STATUS" );
|
|
+ public void handle(final StatusRequest statusRequest) throws Exception {
|
|
+ Preconditions.checkState(thisState == State.STATUS, "Not expecting STATUS");
|
|
|
|
- ServerInfo forced = AbstractReconnectHandler.getForcedHost( this );
|
|
- final String motd = ( forced != null ) ? forced.getMotd() : listener.getMotd();
|
|
- final int protocol = ( ProtocolConstants.SUPPORTED_VERSION_IDS.contains( handshake.getProtocolVersion() ) ) ? handshake.getProtocolVersion() : bungee.getProtocolVersion();
|
|
+ final ServerInfo forced = AbstractReconnectHandler.getForcedHost(this);
|
|
+ final String motd = (forced != null) ? forced.getMotd() : listener.getMotd();
|
|
+ final int protocol = (ProtocolConstants.SUPPORTED_VERSION_IDS.contains(handshake.getProtocolVersion()))
|
|
+ ? handshake.getProtocolVersion()
|
|
+ : bungee.getProtocolVersion();
|
|
|
|
- Callback<ServerPing> pingBack = new Callback<ServerPing>()
|
|
- {
|
|
+ final Callback<ServerPing> pingBack = new Callback<ServerPing>() {
|
|
@Override
|
|
- public void done(ServerPing result, Throwable error)
|
|
- {
|
|
- if ( error != null )
|
|
- {
|
|
- result = getPingInfo( bungee.getTranslation( "ping_cannot_connect" ), protocol );
|
|
- bungee.getLogger().log( Level.WARNING, "Error pinging remote server", error );
|
|
+ public void done(ServerPing result, final Throwable error) {
|
|
+ if (error != null) {
|
|
+ result = getPingInfo(bungee.getTranslation("ping_cannot_connect"), protocol);
|
|
+ bungee.getLogger().log(Level.WARNING, "Error pinging remote server", error);
|
|
}
|
|
|
|
- Callback<ProxyPingEvent> callback = new Callback<ProxyPingEvent>()
|
|
- {
|
|
+ final Callback<ProxyPingEvent> callback = new Callback<ProxyPingEvent>() {
|
|
@Override
|
|
- public void done(ProxyPingEvent pingResult, Throwable error)
|
|
- {
|
|
- Gson gson = handshake.getProtocolVersion() == ProtocolConstants.MINECRAFT_1_7_2 ? BungeeCord.getInstance().gsonLegacy : BungeeCord.getInstance().gson; // Travertine
|
|
- if ( bungee.getConnectionThrottle() != null )
|
|
- {
|
|
- bungee.getConnectionThrottle().unthrottle( getSocketAddress() );
|
|
+ public void done(final ProxyPingEvent pingResult, final Throwable error) {
|
|
+ // FlameCord - Use connectionThrottle variable
|
|
+ final ConnectionThrottle connectionThrottle = bungee.getConnectionThrottle();
|
|
+ final Gson gson = handshake.getProtocolVersion() == ProtocolConstants.MINECRAFT_1_7_2
|
|
+ ? bungee.gsonLegacy
|
|
+ : bungee.gson; // Travertine
|
|
+
|
|
+ if (connectionThrottle != null) {
|
|
+ connectionThrottle.unthrottle(getSocketAddress());
|
|
}
|
|
+
|
|
// Travertine start
|
|
- if ( ProtocolConstants.isBeforeOrEq( handshake.getProtocolVersion() , ProtocolConstants.MINECRAFT_1_8 ) )
|
|
- {
|
|
- // Minecraft < 1.9 doesn't send string server descriptions as chat components. Older 1.7
|
|
- // clients even crash when encountering a chat component instead of a string. To be on the
|
|
+ if (ProtocolConstants.isBeforeOrEq(handshake.getProtocolVersion(),
|
|
+ ProtocolConstants.MINECRAFT_1_8)) {
|
|
+ // Minecraft < 1.9 doesn't send string server descriptions as chat components.
|
|
+ // Older 1.7
|
|
+ // clients even crash when encountering a chat component instead of a string. To
|
|
+ // be on the
|
|
// safe side, always send legacy descriptions for < 1.9 clients.
|
|
- JsonElement element = gson.toJsonTree(pingResult.getResponse());
|
|
+ // FlameCord start - Return if the response is null
|
|
+ final ServerPing response = pingResult.getResponse();
|
|
+ if (response == null) {
|
|
+ return;
|
|
+ }
|
|
+ // FlameCord end - Return if the response is null
|
|
+ final JsonElement element = gson.toJsonTree(response);
|
|
Preconditions.checkArgument(element.isJsonObject(), "Response is not a JSON object");
|
|
- JsonObject object = element.getAsJsonObject();
|
|
+ final JsonObject object = element.getAsJsonObject();
|
|
object.addProperty("description", pingResult.getResponse().getDescription());
|
|
|
|
unsafe.sendPacket(new StatusResponse(gson.toJson(element)));
|
|
- } else
|
|
- {
|
|
- unsafe.sendPacket( new StatusResponse( gson.toJson( pingResult.getResponse() ) ) );
|
|
+ } else {
|
|
+ unsafe.sendPacket(new StatusResponse(gson.toJson(pingResult.getResponse())));
|
|
}
|
|
// Travertine end
|
|
}
|
|
};
|
|
|
|
- bungee.getPluginManager().callEvent( new ProxyPingEvent( InitialHandler.this, result, callback ) );
|
|
+ bungee.getPluginManager().callEvent(new ProxyPingEvent(InitialHandler.this, result, callback));
|
|
}
|
|
};
|
|
|
|
- if ( forced != null && listener.isPingPassthrough() )
|
|
- {
|
|
- ( (BungeeServerInfo) forced ).ping( pingBack, handshake.getProtocolVersion() );
|
|
- } else
|
|
- {
|
|
- pingBack.done( getPingInfo( motd, protocol ), null );
|
|
+ if (forced != null && listener.isPingPassthrough()) {
|
|
+ ((BungeeServerInfo) forced).ping(pingBack, handshake.getProtocolVersion());
|
|
+ } else {
|
|
+ pingBack.done(getPingInfo(motd, protocol), null);
|
|
}
|
|
|
|
thisState = State.PING;
|
|
}
|
|
|
|
- private static final boolean ACCEPT_INVALID_PACKETS = Boolean.parseBoolean(System.getProperty("waterfall.acceptInvalidPackets", "false"));
|
|
+ private static final boolean ACCEPT_INVALID_PACKETS = Boolean
|
|
+ .parseBoolean(System.getProperty("waterfall.acceptInvalidPackets", "false"));
|
|
|
|
@Override
|
|
- public void handle(PingPacket ping) throws Exception
|
|
- {
|
|
- if (!ACCEPT_INVALID_PACKETS) {
|
|
- Preconditions.checkState(thisState == State.PING, "Not expecting PING");
|
|
- }
|
|
- unsafe.sendPacket( ping );
|
|
- disconnect( "" );
|
|
+ public void handle(final PingPacket ping) throws Exception {
|
|
+ // FlameCord - Never accept invalid packets
|
|
+ // if (!ACCEPT_INVALID_PACKETS) {
|
|
+ Preconditions.checkState(thisState == State.PING, "Not expecting PING");
|
|
+ // }
|
|
+ unsafe.sendPacket(ping);
|
|
+ // FlameCord start - Close instead of disconnect
|
|
+ // disconnect("");
|
|
+ ch.close();
|
|
}
|
|
|
|
@Override
|
|
- public void handle(Handshake handshake) throws Exception
|
|
- {
|
|
- Preconditions.checkState( thisState == State.HANDSHAKE, "Not expecting HANDSHAKE" );
|
|
+ public void handle(final Handshake handshake) throws Exception {
|
|
+ Preconditions.checkState(thisState == State.HANDSHAKE, "Not expecting HANDSHAKE");
|
|
this.handshake = handshake;
|
|
- ch.setVersion( handshake.getProtocolVersion() );
|
|
-
|
|
- // Starting with FML 1.8, a "\0FML\0" token is appended to the handshake. This interferes
|
|
- // with Bungee's IP forwarding, so we detect it, and remove it from the host string, for now.
|
|
- // We know FML appends \00FML\00. However, we need to also consider that other systems might
|
|
- // add their own data to the end of the string. So, we just take everything from the \0 character
|
|
- // and save it for later.
|
|
- if ( handshake.getHost().contains( "\0" ) )
|
|
- {
|
|
- String[] split = handshake.getHost().split( "\0", 2 );
|
|
- handshake.setHost( split[0] );
|
|
+ ch.setVersion(handshake.getProtocolVersion());
|
|
+
|
|
+ // Starting with FML 1.8, a "\0FML\0" token is appended to the handshake. This
|
|
+ // interferes
|
|
+ // with Bungee's IP forwarding, so we detect it, and remove it from the host
|
|
+ // string, for now.
|
|
+ // We know FML appends \00FML\00. However, we need to also consider that other
|
|
+ // systems might
|
|
+ // add their own data to the end of the string. So, we just take everything from
|
|
+ // the \0 character
|
|
+ // and save it for later
|
|
+ // FlameCord start - Changed "handshake.getHost()" to host
|
|
+ String host = handshake.getHost();
|
|
+
|
|
+ if (host.contains("\0")) {
|
|
+ final String[] split = host.split("\0", 2);
|
|
+ handshake.setHost(host = split[0]);
|
|
extraDataInHandshake = "\0" + split[1];
|
|
}
|
|
|
|
// SRV records can end with a . depending on DNS / client.
|
|
- if ( handshake.getHost().endsWith( "." ) )
|
|
- {
|
|
- handshake.setHost( handshake.getHost().substring( 0, handshake.getHost().length() - 1 ) );
|
|
+ if (host.endsWith(".")) {
|
|
+ handshake.setHost(host = host.substring(0, host.length() - 1));
|
|
}
|
|
|
|
- this.virtualHost = InetSocketAddress.createUnresolved( handshake.getHost(), handshake.getPort() );
|
|
-
|
|
- bungee.getPluginManager().callEvent( new PlayerHandshakeEvent( InitialHandler.this, handshake ) );
|
|
+ this.virtualHost = InetSocketAddress.createUnresolved(host, handshake.getPort());
|
|
+ // FlameCord end - Changed "handshake.getHost()" to host
|
|
+ bungee.getPluginManager().callEvent(new PlayerHandshakeEvent(InitialHandler.this, handshake));
|
|
|
|
- switch ( handshake.getRequestedProtocol() )
|
|
- {
|
|
+ switch (handshake.getRequestedProtocol()) {
|
|
case 1:
|
|
// Ping
|
|
- if ( bungee.getConfig().isLogPings() )
|
|
- {
|
|
- bungee.getLogger().log( Level.INFO, "{0} has pinged", this );
|
|
+ // FlameCord - Added isLoggerInitialhandler option
|
|
+ if (FlameCord.getInstance().getFlameCordConfiguration().isLoggerInitialhandler()
|
|
+ && bungee.getConfig().isLogPings()) {
|
|
+ bungee.getLogger().log(Level.INFO, "{0} has pinged", this);
|
|
}
|
|
thisState = State.STATUS;
|
|
- ch.setProtocol( Protocol.STATUS );
|
|
+ ch.setProtocol(Protocol.STATUS);
|
|
break;
|
|
case 2:
|
|
// Login
|
|
- if (BungeeCord.getInstance().getConfig().isLogInitialHandlerConnections() ) // Waterfall
|
|
+ // FlameCord - Added isLoggerInitialhandler option
|
|
+ if (FlameCord.getInstance().getFlameCordConfiguration().isLoggerInitialhandler()
|
|
+ && BungeeCord.getInstance().getConfig().isLogInitialHandlerConnections()) // Waterfall
|
|
{
|
|
- bungee.getLogger().log( Level.INFO, "{0} has connected", this );
|
|
+ bungee.getLogger().log(Level.INFO, "{0} has connected", this);
|
|
}
|
|
thisState = State.USERNAME;
|
|
- ch.setProtocol( Protocol.LOGIN );
|
|
+ ch.setProtocol(Protocol.LOGIN);
|
|
|
|
- if ( !ProtocolConstants.SUPPORTED_VERSION_IDS.contains( handshake.getProtocolVersion() ) )
|
|
- {
|
|
- if ( handshake.getProtocolVersion() > bungee.getProtocolVersion() )
|
|
- {
|
|
- disconnect( bungee.getTranslation( "outdated_server", bungee.getGameVersion() ) );
|
|
- } else
|
|
- {
|
|
- disconnect( bungee.getTranslation( "outdated_client", bungee.getGameVersion() ) );
|
|
+ if (!ProtocolConstants.SUPPORTED_VERSION_IDS.contains(handshake.getProtocolVersion())) {
|
|
+ if (handshake.getProtocolVersion() > bungee.getProtocolVersion()) {
|
|
+ disconnect(bungee.getTranslation("outdated_server", bungee.getGameVersion()));
|
|
+ } else {
|
|
+ disconnect(bungee.getTranslation("outdated_client", bungee.getGameVersion()));
|
|
}
|
|
return;
|
|
}
|
|
break;
|
|
default:
|
|
- throw new QuietException( "Cannot request protocol " + handshake.getRequestedProtocol() );
|
|
+ // FlameCord - Change from QuietException to BadPacketException
|
|
+ throw new BadPacketException("Cannot request protocol " + handshake.getRequestedProtocol());
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void handle(LoginRequest loginRequest) throws Exception
|
|
- {
|
|
- Preconditions.checkState( thisState == State.USERNAME, "Not expecting USERNAME" );
|
|
+ public void handle(final LoginRequest loginRequest) throws Exception {
|
|
+ Preconditions.checkState(thisState == State.USERNAME, "Not expecting USERNAME");
|
|
this.loginRequest = loginRequest;
|
|
|
|
- if ( getName().contains( "." ) )
|
|
- {
|
|
- disconnect( bungee.getTranslation( "name_invalid" ) );
|
|
+ // FlameCord - Use getName() only once
|
|
+ final String name = getName();
|
|
+
|
|
+ if (FlameCord.getInstance().getFirewallManager().isFirewalled(name)) {
|
|
+ throw new FirewallException(ch.getRemoteAddress());
|
|
+ }
|
|
+
|
|
+ if (name.contains(".")) {
|
|
+ disconnect(bungee.getTranslation("name_invalid"));
|
|
return;
|
|
}
|
|
|
|
- if ( getName().length() > 16 )
|
|
- {
|
|
- disconnect( bungee.getTranslation( "name_too_long" ) );
|
|
+ if (name.length() > 16) {
|
|
+ disconnect(bungee.getTranslation("name_too_long"));
|
|
return;
|
|
}
|
|
|
|
- int limit = BungeeCord.getInstance().config.getPlayerLimit();
|
|
- if ( limit > 0 && bungee.getOnlineCount() > limit )
|
|
- {
|
|
- disconnect( bungee.getTranslation( "proxy_full" ) );
|
|
+ final int limit = bungee.config.getPlayerLimit();
|
|
+ if (limit > 0 && bungee.getOnlineCount() > limit) {
|
|
+ disconnect(bungee.getTranslation("proxy_full"));
|
|
return;
|
|
}
|
|
|
|
// If offline mode and they are already on, don't allow connect
|
|
// We can just check by UUID here as names are based on UUID
|
|
- if ( !isOnlineMode() && bungee.getPlayer( getUniqueId() ) != null )
|
|
- {
|
|
- disconnect( bungee.getTranslation( "already_connected_proxy" ) );
|
|
+ if (!isOnlineMode() && bungee.getPlayer(getUniqueId()) != null) {
|
|
+ disconnect(bungee.getTranslation("already_connected_proxy"));
|
|
return;
|
|
}
|
|
|
|
- Callback<PreLoginEvent> callback = new Callback<PreLoginEvent>()
|
|
- {
|
|
+ final Callback<PreLoginEvent> callback = new Callback<PreLoginEvent>() {
|
|
|
|
@Override
|
|
- public void done(PreLoginEvent result, Throwable error)
|
|
- {
|
|
- if ( result.isCancelled() )
|
|
- {
|
|
- disconnect( result.getCancelReasonComponents() );
|
|
+ public void done(final PreLoginEvent result, final Throwable error) {
|
|
+ if (result.isCancelled()) {
|
|
+ disconnect(result.getCancelReasonComponents());
|
|
return;
|
|
}
|
|
- if ( ch.isClosed() )
|
|
- {
|
|
+ if (ch.isClosed()) {
|
|
return;
|
|
}
|
|
- if ( onlineMode )
|
|
- {
|
|
- unsafe().sendPacket( request = EncryptionUtil.encryptRequest() );
|
|
- } else
|
|
- {
|
|
+ if (isOnlineMode()) {
|
|
+ unsafe().sendPacket(request = EncryptionUtil.encryptRequest());
|
|
+ // FlameCord - Change state different way to fix encryption
|
|
+ thisState = State.ENCRYPT;
|
|
+ } else {
|
|
finish();
|
|
}
|
|
- thisState = State.ENCRYPT;
|
|
+ // FlameCord - Change state different way to fix encryption
|
|
+ // thisState = State.ENCRYPT;
|
|
}
|
|
};
|
|
|
|
// fire pre login event
|
|
- bungee.getPluginManager().callEvent( new PreLoginEvent( InitialHandler.this, callback ) );
|
|
+ bungee.getPluginManager().callEvent(new PreLoginEvent(InitialHandler.this, callback));
|
|
}
|
|
|
|
@Override
|
|
- public void handle(final EncryptionResponse encryptResponse) throws Exception
|
|
- {
|
|
- Preconditions.checkState( thisState == State.ENCRYPT, "Not expecting ENCRYPT" );
|
|
-
|
|
- SecretKey sharedKey = EncryptionUtil.getSecret( encryptResponse, request );
|
|
- BungeeCipher decrypt = EncryptionUtil.getCipher( false, sharedKey );
|
|
- ch.addBefore( PipelineUtils.FRAME_DECODER, PipelineUtils.DECRYPT_HANDLER, new CipherDecoder( decrypt ) );
|
|
- BungeeCipher encrypt = EncryptionUtil.getCipher( true, sharedKey );
|
|
- ch.addBefore( PipelineUtils.FRAME_PREPENDER, PipelineUtils.ENCRYPT_HANDLER, new CipherEncoder( encrypt ) );
|
|
-
|
|
- String encName = URLEncoder.encode( InitialHandler.this.getName(), "UTF-8" );
|
|
-
|
|
- MessageDigest sha = MessageDigest.getInstance( "SHA-1" );
|
|
- for ( byte[] bit : new byte[][]
|
|
- {
|
|
- request.getServerId().getBytes( "ISO_8859_1" ), sharedKey.getEncoded(), EncryptionUtil.keys.getPublic().getEncoded()
|
|
- } )
|
|
- {
|
|
- sha.update( bit );
|
|
+ public void handle(final EncryptionResponse encryptResponse) throws Exception {
|
|
+ Preconditions.checkState(thisState == State.ENCRYPT, "Not expecting ENCRYPT");
|
|
+ // FlameCord - Move state declaration
|
|
+ thisState = State.FINISHED;
|
|
+
|
|
+ final SecretKey sharedKey = EncryptionUtil.getSecret(encryptResponse, request);
|
|
+ final BungeeCipher decrypt = EncryptionUtil.getCipher(false, sharedKey);
|
|
+ ch.addBefore(PipelineUtils.FRAME_DECODER, PipelineUtils.DECRYPT_HANDLER, new CipherDecoder(decrypt));
|
|
+ final BungeeCipher encrypt = EncryptionUtil.getCipher(true, sharedKey);
|
|
+ ch.addBefore(PipelineUtils.FRAME_PREPENDER, PipelineUtils.ENCRYPT_HANDLER, new CipherEncoder(encrypt));
|
|
+
|
|
+ final String encName = URLEncoder.encode(InitialHandler.this.getName(), "UTF-8");
|
|
+
|
|
+ final MessageDigest sha = MessageDigest.getInstance("SHA-1");
|
|
+ for (final byte[] bit : new byte[][] { request.getServerId().getBytes("ISO_8859_1"), sharedKey.getEncoded(),
|
|
+ EncryptionUtil.keys.getPublic().getEncoded() }) {
|
|
+ sha.update(bit);
|
|
}
|
|
- String encodedHash = URLEncoder.encode( new BigInteger( sha.digest() ).toString( 16 ), "UTF-8" );
|
|
+ final String encodedHash = URLEncoder.encode(new BigInteger(sha.digest()).toString(16), "UTF-8");
|
|
|
|
- String preventProxy = ( BungeeCord.getInstance().config.isPreventProxyConnections() && getSocketAddress() instanceof InetSocketAddress ) ? "&ip=" + URLEncoder.encode( getAddress().getAddress().getHostAddress(), "UTF-8" ) : "";
|
|
- String authURL = String.format( MOJANG_AUTH_URL, encName, encodedHash, preventProxy );
|
|
+ String preventProxy = (BungeeCord.getInstance().config.isPreventProxyConnections()
|
|
+ && getSocketAddress() instanceof InetSocketAddress)
|
|
+ ? "&ip=" + URLEncoder.encode(getAddress().getAddress().getHostAddress(), "UTF-8")
|
|
+ : "";
|
|
+ String authURL = String.format(MOJANG_AUTH_URL, encName, encodedHash, preventProxy);
|
|
|
|
- Callback<String> handler = new Callback<String>()
|
|
- {
|
|
+ final Callback<String> handler = new Callback<String>() {
|
|
@Override
|
|
- public void done(String result, Throwable error)
|
|
- {
|
|
- if ( error == null )
|
|
- {
|
|
- LoginResult obj = BungeeCord.getInstance().gson.fromJson( result, LoginResult.class );
|
|
- if ( obj != null && obj.getId() != null )
|
|
- {
|
|
+ public void done(final String result, final Throwable error) {
|
|
+ if (error == null) {
|
|
+ final LoginResult obj = BungeeCord.getInstance().gson.fromJson(result, LoginResult.class);
|
|
+ if (obj != null && obj.getId() != null) {
|
|
loginProfile = obj;
|
|
name = obj.getName();
|
|
- uniqueId = Util.getUUID( obj.getId() );
|
|
+ // FlameCord - Don't declare uuid unless it's null
|
|
+ if (uniqueId == null) {
|
|
+ uniqueId = Util.getUUID(obj.getId());
|
|
+ }
|
|
finish();
|
|
return;
|
|
}
|
|
- disconnect( bungee.getTranslation( "offline_mode_player" ) );
|
|
- } else
|
|
- {
|
|
- disconnect( bungee.getTranslation( "mojang_fail" ) );
|
|
- bungee.getLogger().log( Level.SEVERE, "Error authenticating " + getName() + " with minecraft.net", error );
|
|
+ disconnect(bungee.getTranslation("offline_mode_player"));
|
|
+ } else {
|
|
+ disconnect(bungee.getTranslation("mojang_fail"));
|
|
+ bungee.getLogger().log(Level.SEVERE, "Error authenticating " + getName() + " with minecraft.net",
|
|
+ error);
|
|
}
|
|
}
|
|
};
|
|
|
|
- HttpClient.get( authURL, ch.getHandle().eventLoop(), handler );
|
|
+ HttpClient.get(authURL, ch.getHandle().eventLoop(), handler);
|
|
}
|
|
|
|
- private void finish()
|
|
- {
|
|
- if ( isOnlineMode() )
|
|
- {
|
|
+ private void finish() {
|
|
+ // FlameCord - Change state different way to fix encryption
|
|
+ thisState = State.FINISHED;
|
|
+
|
|
+ if (isOnlineMode()) {
|
|
// Check for multiple connections
|
|
// We have to check for the old name first
|
|
- ProxiedPlayer oldName = bungee.getPlayer( getName() );
|
|
- if ( oldName != null )
|
|
- {
|
|
+ final ProxiedPlayer oldName = bungee.getPlayer(getName());
|
|
+ if (oldName != null) {
|
|
// TODO See #1218
|
|
- oldName.disconnect( bungee.getTranslation( "already_connected_proxy" ) );
|
|
+ oldName.disconnect(bungee.getTranslation("already_connected_proxy"));
|
|
}
|
|
// And then also for their old UUID
|
|
- ProxiedPlayer oldID = bungee.getPlayer( getUniqueId() );
|
|
- if ( oldID != null )
|
|
- {
|
|
+ final ProxiedPlayer oldID = bungee.getPlayer(getUniqueId());
|
|
+ if (oldID != null) {
|
|
// TODO See #1218
|
|
- oldID.disconnect( bungee.getTranslation( "already_connected_proxy" ) );
|
|
+ oldID.disconnect(bungee.getTranslation("already_connected_proxy"));
|
|
}
|
|
- } else
|
|
- {
|
|
+ } else {
|
|
// In offline mode the existing user stays and we kick the new one
|
|
- ProxiedPlayer oldName = bungee.getPlayer( getName() );
|
|
- if ( oldName != null )
|
|
- {
|
|
+ final ProxiedPlayer oldName = bungee.getPlayer(getName());
|
|
+ if (oldName != null) {
|
|
// TODO See #1218
|
|
- disconnect( bungee.getTranslation( "already_connected_proxy" ) );
|
|
+ disconnect(bungee.getTranslation("already_connected_proxy"));
|
|
return;
|
|
}
|
|
|
|
}
|
|
|
|
- offlineId = UUID.nameUUIDFromBytes( ( "OfflinePlayer:" + getName() ).getBytes( Charsets.UTF_8 ) );
|
|
- if ( uniqueId == null )
|
|
- {
|
|
+ offlineId = UUID.nameUUIDFromBytes(("OfflinePlayer:" + getName()).getBytes(Charsets.UTF_8));
|
|
+ if (uniqueId == null) {
|
|
uniqueId = offlineId;
|
|
}
|
|
|
|
- Callback<LoginEvent> complete = new Callback<LoginEvent>()
|
|
- {
|
|
+ final Callback<LoginEvent> complete = new Callback<LoginEvent>() {
|
|
@Override
|
|
- public void done(LoginEvent result, Throwable error)
|
|
- {
|
|
- if ( result.isCancelled() )
|
|
- {
|
|
- disconnect( result.getCancelReasonComponents() );
|
|
+ public void done(final LoginEvent result, final Throwable error) {
|
|
+ if (result.isCancelled()) {
|
|
+ disconnect(result.getCancelReasonComponents());
|
|
return;
|
|
}
|
|
- if ( ch.isClosed() )
|
|
- {
|
|
+ if (ch.isClosed()) {
|
|
return;
|
|
}
|
|
|
|
- ch.getHandle().eventLoop().execute( new Runnable()
|
|
- {
|
|
+ ch.getHandle().eventLoop().execute(new Runnable() {
|
|
@Override
|
|
- public void run()
|
|
- {
|
|
- if ( !ch.isClosing() )
|
|
- {
|
|
- UserConnection userCon = new UserConnection( bungee, ch, getName(), InitialHandler.this );
|
|
- userCon.setCompressionThreshold( BungeeCord.getInstance().config.getCompressionThreshold() );
|
|
+ public void run() {
|
|
+ if (!ch.isClosing()) {
|
|
+ final UserConnection userCon = new UserConnection(bungee, ch, getName(),
|
|
+ InitialHandler.this);
|
|
+ userCon.setCompressionThreshold(BungeeCord.getInstance().config.getCompressionThreshold());
|
|
userCon.init();
|
|
|
|
- unsafe.sendPacket( new LoginSuccess( getUniqueId(), getName() ) );
|
|
- ch.setProtocol( Protocol.GAME );
|
|
+ unsafe.sendPacket(new LoginSuccess(getUniqueId(), getName()));
|
|
+ ch.setProtocol(Protocol.GAME);
|
|
|
|
- ch.getHandle().pipeline().get( HandlerBoss.class ).setHandler( new UpstreamBridge( bungee, userCon ) );
|
|
- bungee.getPluginManager().callEvent( new PostLoginEvent( userCon ) );
|
|
+ ch.getHandle().pipeline().get(HandlerBoss.class)
|
|
+ .setHandler(new UpstreamBridge(bungee, userCon));
|
|
+ bungee.getPluginManager().callEvent(new PostLoginEvent(userCon));
|
|
ServerInfo server;
|
|
- if ( bungee.getReconnectHandler() != null )
|
|
- {
|
|
- server = bungee.getReconnectHandler().getServer( userCon );
|
|
- } else
|
|
- {
|
|
- server = AbstractReconnectHandler.getForcedHost( InitialHandler.this );
|
|
+ if (bungee.getReconnectHandler() != null) {
|
|
+ server = bungee.getReconnectHandler().getServer(userCon);
|
|
+ } else {
|
|
+ server = AbstractReconnectHandler.getForcedHost(InitialHandler.this);
|
|
}
|
|
- if ( server == null )
|
|
- {
|
|
- server = bungee.getServerInfo( listener.getDefaultServer() );
|
|
+ if (server == null) {
|
|
+ server = bungee.getServerInfo(listener.getDefaultServer());
|
|
}
|
|
|
|
- userCon.connect( server, null, true, ServerConnectEvent.Reason.JOIN_PROXY );
|
|
+ userCon.connect(server, null, true, ServerConnectEvent.Reason.JOIN_PROXY);
|
|
|
|
- thisState = State.FINISHED;
|
|
+ // FlameCord - Move state declaration
|
|
+ // thisState = State.FINISHED;
|
|
}
|
|
}
|
|
- } );
|
|
+ });
|
|
}
|
|
};
|
|
|
|
// fire login event
|
|
- bungee.getPluginManager().callEvent( new LoginEvent( InitialHandler.this, complete, this.getLoginProfile() ) ); // Waterfall: Parse LoginResult object to new constructor of LoginEvent
|
|
+ bungee.getPluginManager().callEvent(new LoginEvent(InitialHandler.this, complete, this.getLoginProfile())); // Waterfall:
|
|
+ // Parse
|
|
+ // LoginResult
|
|
+ // object
|
|
+ // to
|
|
+ // new
|
|
+ // constructor
|
|
+ // of
|
|
+ // LoginEvent
|
|
}
|
|
|
|
@Override
|
|
- public void handle(LoginPayloadResponse response) throws Exception
|
|
- {
|
|
- disconnect( "Unexpected custom LoginPayloadResponse" );
|
|
+ public void handle(final LoginPayloadResponse response) throws Exception {
|
|
+ disconnect("Unexpected custom LoginPayloadResponse");
|
|
}
|
|
|
|
@Override
|
|
- public void disconnect(String reason)
|
|
- {
|
|
- if ( canSendKickMessage() )
|
|
- {
|
|
- disconnect( TextComponent.fromLegacyText( reason ) );
|
|
- } else
|
|
- {
|
|
+ public void disconnect(final String reason) {
|
|
+ if (canSendKickMessage()) {
|
|
+ disconnect(TextComponent.fromLegacyText(reason));
|
|
+ } else {
|
|
ch.close();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void disconnect(final BaseComponent... reason)
|
|
- {
|
|
- if ( canSendKickMessage() )
|
|
- {
|
|
- ch.delayedClose( new Kick( ComponentSerializer.toString( reason ) ) );
|
|
- } else
|
|
- {
|
|
+ public void disconnect(final BaseComponent... reason) {
|
|
+ if (canSendKickMessage()) {
|
|
+ // FlameCord start - Changed delayed close to just close
|
|
+ ch.close(new Kick(ComponentSerializer.toString(reason)));
|
|
+ } else {
|
|
ch.close();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void disconnect(BaseComponent reason)
|
|
- {
|
|
- disconnect( new BaseComponent[]
|
|
- {
|
|
- reason
|
|
- } );
|
|
+ public void disconnect(final BaseComponent reason) {
|
|
+ disconnect(new BaseComponent[] { reason });
|
|
}
|
|
|
|
@Override
|
|
- public String getName()
|
|
- {
|
|
- return ( name != null ) ? name : ( loginRequest == null ) ? null : loginRequest.getData();
|
|
+ public String getName() {
|
|
+ return (name != null) ? name : (loginRequest == null) ? null : loginRequest.getData();
|
|
}
|
|
|
|
@Override
|
|
- public int getVersion()
|
|
- {
|
|
- return ( handshake == null ) ? -1 : handshake.getProtocolVersion();
|
|
+ public int getVersion() {
|
|
+ return (handshake == null) ? -1 : handshake.getProtocolVersion();
|
|
}
|
|
|
|
@Override
|
|
- public InetSocketAddress getAddress()
|
|
- {
|
|
+ public InetSocketAddress getAddress() {
|
|
return (InetSocketAddress) getSocketAddress();
|
|
}
|
|
|
|
@Override
|
|
- public SocketAddress getSocketAddress()
|
|
- {
|
|
+ public SocketAddress getSocketAddress() {
|
|
return ch.getRemoteAddress();
|
|
}
|
|
|
|
@Override
|
|
- public Unsafe unsafe()
|
|
- {
|
|
+ public Unsafe unsafe() {
|
|
return unsafe;
|
|
}
|
|
|
|
@Override
|
|
- public void setOnlineMode(boolean onlineMode)
|
|
- {
|
|
- Preconditions.checkState( thisState == State.USERNAME, "Can only set online mode status whilst state is username" );
|
|
+ public void setOnlineMode(final boolean onlineMode) {
|
|
+ Preconditions.checkState(thisState == State.USERNAME,
|
|
+ "Can only set online mode status whilst state is username");
|
|
this.onlineMode = onlineMode;
|
|
}
|
|
|
|
@Override
|
|
- public void setUniqueId(UUID uuid)
|
|
- {
|
|
- Preconditions.checkState( thisState == State.USERNAME, "Can only set uuid while state is username" );
|
|
- Preconditions.checkState( !onlineMode, "Can only set uuid when online mode is false" );
|
|
+ public void setUniqueId(final UUID uuid) {
|
|
+ Preconditions.checkState(thisState == State.USERNAME, "Can only set uuid while state is username");
|
|
+ // FlameCord - Allow custom uuids
|
|
+ // Preconditions.checkState(!onlineMode, "Can only set uuid when online mode is
|
|
+ // false");
|
|
this.uniqueId = uuid;
|
|
}
|
|
|
|
@Override
|
|
- public String getUUID()
|
|
- {
|
|
- return io.github.waterfallmc.waterfall.utils.UUIDUtils.undash( uniqueId.toString() ); // Waterfall
|
|
+ public String getUUID() {
|
|
+ return io.github.waterfallmc.waterfall.utils.UUIDUtils.undash(uniqueId.toString()); // Waterfall
|
|
}
|
|
|
|
@Override
|
|
- public String toString()
|
|
- {
|
|
- return "[" + getSocketAddress() + ( getName() != null ? "|" + getName() : "" ) + "] <-> InitialHandler";
|
|
+ public String toString() {
|
|
+ return "[" + getSocketAddress() + (getName() != null ? "|" + getName() : "") + "] <-> InitialHandler";
|
|
}
|
|
|
|
@Override
|
|
- public boolean isConnected()
|
|
- {
|
|
+ public boolean isConnected() {
|
|
return !ch.isClosed();
|
|
}
|
|
}
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/connection/PingHandler.java b/proxy/src/main/java/net/md_5/bungee/connection/PingHandler.java
|
|
index 6cd71071..2b69b46e 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/connection/PingHandler.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/connection/PingHandler.java
|
|
@@ -1,6 +1,8 @@
|
|
package net.md_5.bungee.connection;
|
|
|
|
import com.google.gson.Gson;
|
|
+
|
|
+import dev._2lstudios.flamecord.FlameCord;
|
|
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
|
import lombok.RequiredArgsConstructor;
|
|
import net.md_5.bungee.BungeeCord;
|
|
@@ -12,6 +14,7 @@ import net.md_5.bungee.api.config.ServerInfo;
|
|
import net.md_5.bungee.netty.ChannelWrapper;
|
|
import net.md_5.bungee.netty.PacketHandler;
|
|
import net.md_5.bungee.netty.PipelineUtils;
|
|
+import net.md_5.bungee.protocol.BadPacketException;
|
|
import net.md_5.bungee.protocol.MinecraftDecoder;
|
|
import net.md_5.bungee.protocol.MinecraftEncoder;
|
|
import net.md_5.bungee.protocol.PacketWrapper;
|
|
@@ -21,11 +24,9 @@ import net.md_5.bungee.protocol.packet.Handshake;
|
|
import net.md_5.bungee.protocol.packet.StatusRequest;
|
|
import net.md_5.bungee.protocol.packet.StatusResponse;
|
|
import net.md_5.bungee.util.BufUtil;
|
|
-import net.md_5.bungee.util.QuietException;
|
|
|
|
@RequiredArgsConstructor
|
|
-public class PingHandler extends PacketHandler
|
|
-{
|
|
+public class PingHandler extends PacketHandler {
|
|
|
|
private final ServerInfo target;
|
|
private final Callback<ServerPing> callback;
|
|
@@ -33,49 +34,53 @@ public class PingHandler extends PacketHandler
|
|
private ChannelWrapper channel;
|
|
|
|
@Override
|
|
- public void connected(ChannelWrapper channel) throws Exception
|
|
- {
|
|
+ public void connected(ChannelWrapper channel) throws Exception {
|
|
this.channel = channel;
|
|
- MinecraftEncoder encoder = new MinecraftEncoder( Protocol.HANDSHAKE, false, protocol );
|
|
+ MinecraftEncoder encoder = new MinecraftEncoder(Protocol.HANDSHAKE, false, protocol);
|
|
|
|
- channel.getHandle().pipeline().addAfter( PipelineUtils.FRAME_DECODER, PipelineUtils.PACKET_DECODER, new MinecraftDecoder( Protocol.STATUS, false, ProxyServer.getInstance().getProtocolVersion() ) );
|
|
- channel.getHandle().pipeline().addAfter( PipelineUtils.FRAME_PREPENDER, PipelineUtils.PACKET_ENCODER, encoder );
|
|
+ channel.getHandle().pipeline().addAfter(PipelineUtils.FRAME_DECODER, PipelineUtils.PACKET_DECODER,
|
|
+ new MinecraftDecoder(Protocol.STATUS, false, ProxyServer.getInstance().getProtocolVersion()));
|
|
+ channel.getHandle().pipeline().addAfter(PipelineUtils.FRAME_PREPENDER, PipelineUtils.PACKET_ENCODER, encoder);
|
|
|
|
- channel.write( new Handshake( protocol, target.getAddress().getHostString(), target.getAddress().getPort(), 1 ) );
|
|
+ channel.write(new Handshake(protocol, target.getAddress().getHostString(), target.getAddress().getPort(), 1));
|
|
|
|
- encoder.setProtocol( Protocol.STATUS );
|
|
- channel.write( new StatusRequest() );
|
|
+ encoder.setProtocol(Protocol.STATUS);
|
|
+ channel.write(new StatusRequest());
|
|
}
|
|
|
|
@Override
|
|
- public void exception(Throwable t) throws Exception
|
|
- {
|
|
- callback.done( null, t );
|
|
+ public void exception(Throwable t) throws Exception {
|
|
+ callback.done(null, t);
|
|
}
|
|
|
|
@Override
|
|
- public void handle(PacketWrapper packet) throws Exception
|
|
- {
|
|
- if ( packet.packet == null )
|
|
- {
|
|
- throw new QuietException( "Unexpected packet received during ping process! " + BufUtil.dump( packet.buf, 16 ) );
|
|
+ public void handle(PacketWrapper packet) throws Exception {
|
|
+ if (packet.packet == null) {
|
|
+ // FlameCord - Toggle Dumping packet info
|
|
+ if (FlameCord.getInstance().getFlameCordConfiguration().isLoggerDump()) {
|
|
+ // FlameCord - Change from QuietException to BadPacketException
|
|
+ throw new BadPacketException(
|
|
+ "Unexpected packet received during server ping process!\n" + BufUtil.dump(packet.buf, 16));
|
|
+ } else {
|
|
+ // FlameCord - Change from QuietException to BadPacketException
|
|
+ throw new BadPacketException("Unexpected packet received during ping process!");
|
|
+ }
|
|
}
|
|
}
|
|
|
|
@Override
|
|
@SuppressFBWarnings("UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR")
|
|
- public void handle(StatusResponse statusResponse) throws Exception
|
|
- {
|
|
- Gson gson = protocol == ProtocolConstants.MINECRAFT_1_7_2 ? BungeeCord.getInstance().gsonLegacy : BungeeCord.getInstance().gson; // Travertine
|
|
- ServerPing serverPing = gson.fromJson( statusResponse.getResponse(), ServerPing.class );
|
|
- ( (BungeeServerInfo) target ).cachePing( serverPing );
|
|
- callback.done( serverPing, null );
|
|
+ public void handle(StatusResponse statusResponse) throws Exception {
|
|
+ Gson gson = protocol == ProtocolConstants.MINECRAFT_1_7_2 ? BungeeCord.getInstance().gsonLegacy
|
|
+ : BungeeCord.getInstance().gson; // Travertine
|
|
+ ServerPing serverPing = gson.fromJson(statusResponse.getResponse(), ServerPing.class);
|
|
+ ((BungeeServerInfo) target).cachePing(serverPing);
|
|
+ callback.done(serverPing, null);
|
|
channel.close();
|
|
}
|
|
|
|
@Override
|
|
- public String toString()
|
|
- {
|
|
+ public String toString() {
|
|
return "[Ping Handler] -> " + target.getName();
|
|
}
|
|
}
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java b/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java
|
|
index ad3bdee5..5f83df32 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java
|
|
@@ -34,151 +34,131 @@ import net.md_5.bungee.protocol.packet.PluginMessage;
|
|
import net.md_5.bungee.protocol.packet.TabCompleteRequest;
|
|
import net.md_5.bungee.protocol.packet.TabCompleteResponse;
|
|
|
|
-public class UpstreamBridge extends PacketHandler
|
|
-{
|
|
+public class UpstreamBridge extends PacketHandler {
|
|
|
|
private final ProxyServer bungee;
|
|
private final UserConnection con;
|
|
|
|
private long lastTabCompletion = -1;
|
|
|
|
- public UpstreamBridge(ProxyServer bungee, UserConnection con)
|
|
- {
|
|
+ public UpstreamBridge(ProxyServer bungee, UserConnection con) {
|
|
this.bungee = bungee;
|
|
this.con = con;
|
|
|
|
- BungeeCord.getInstance().addConnection( con );
|
|
+ BungeeCord.getInstance().addConnection(con);
|
|
con.getTabListHandler().onConnect();
|
|
- con.unsafe().sendPacket( BungeeCord.getInstance().registerChannels( con.getPendingConnection().getVersion() ) );
|
|
+ con.unsafe().sendPacket(BungeeCord.getInstance().registerChannels(con.getPendingConnection().getVersion()));
|
|
}
|
|
|
|
@Override
|
|
- public void exception(Throwable t) throws Exception
|
|
- {
|
|
- con.disconnect( Util.exception( t ) );
|
|
+ public void exception(Throwable t) throws Exception {
|
|
+ con.disconnect(Util.exception(t));
|
|
}
|
|
|
|
@Override
|
|
- public void disconnected(ChannelWrapper channel) throws Exception
|
|
- {
|
|
+ public void disconnected(ChannelWrapper channel) throws Exception {
|
|
// We lost connection to the client
|
|
- PlayerDisconnectEvent event = new PlayerDisconnectEvent( con );
|
|
- bungee.getPluginManager().callEvent( event );
|
|
+ PlayerDisconnectEvent event = new PlayerDisconnectEvent(con);
|
|
+ bungee.getPluginManager().callEvent(event);
|
|
con.getTabListHandler().onDisconnect();
|
|
- BungeeCord.getInstance().removeConnection( con );
|
|
+ BungeeCord.getInstance().removeConnection(con);
|
|
|
|
- if ( con.getServer() != null )
|
|
- {
|
|
+ if (con.getServer() != null) {
|
|
// Manually remove from everyone's tab list
|
|
// since the packet from the server arrives
|
|
// too late
|
|
// TODO: This should only done with server_unique
|
|
- // tab list (which is the only one supported
|
|
- // currently)
|
|
+ // tab list (which is the only one supported
|
|
+ // currently)
|
|
PlayerListItem packet = new PlayerListItem();
|
|
- packet.setAction( PlayerListItem.Action.REMOVE_PLAYER );
|
|
+ packet.setAction(PlayerListItem.Action.REMOVE_PLAYER);
|
|
PlayerListItem.Item item = new PlayerListItem.Item();
|
|
- item.setUuid( con.getUniqueId() );
|
|
- packet.setItems( new PlayerListItem.Item[]
|
|
- {
|
|
- item
|
|
- } );
|
|
- for ( ProxiedPlayer player : con.getServer().getInfo().getPlayers() )
|
|
- {
|
|
+ item.setUuid(con.getUniqueId());
|
|
+ packet.setItems(new PlayerListItem.Item[] { item });
|
|
+ for (ProxiedPlayer player : con.getServer().getInfo().getPlayers()) {
|
|
// Travertine start
|
|
- if ( ProtocolConstants.isAfterOrEq( player.getPendingConnection().getVersion(), ProtocolConstants.MINECRAFT_1_8 ) )
|
|
- {
|
|
- player.unsafe().sendPacket( packet );
|
|
+ if (ProtocolConstants.isAfterOrEq(player.getPendingConnection().getVersion(),
|
|
+ ProtocolConstants.MINECRAFT_1_8)) {
|
|
+ player.unsafe().sendPacket(packet);
|
|
}
|
|
// Travertine end
|
|
}
|
|
- con.getServer().disconnect( "Quitting" );
|
|
+
|
|
+ // FlameCord - Remove "Quitting" reason
|
|
+ con.getServer().disconnect();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void writabilityChanged(ChannelWrapper channel) throws Exception
|
|
- {
|
|
- if ( con.getServer() != null )
|
|
- {
|
|
+ public void writabilityChanged(ChannelWrapper channel) throws Exception {
|
|
+ if (con.getServer() != null) {
|
|
Channel server = con.getServer().getCh().getHandle();
|
|
- if ( channel.getHandle().isWritable() )
|
|
- {
|
|
- server.config().setAutoRead( true );
|
|
- } else
|
|
- {
|
|
- server.config().setAutoRead( false );
|
|
+ if (channel.getHandle().isWritable()) {
|
|
+ server.config().setAutoRead(true);
|
|
+ } else {
|
|
+ server.config().setAutoRead(false);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public boolean shouldHandle(PacketWrapper packet) throws Exception
|
|
- {
|
|
+ public boolean shouldHandle(PacketWrapper packet) throws Exception {
|
|
return con.getServer() != null || packet.packet instanceof PluginMessage;
|
|
}
|
|
|
|
@Override
|
|
- public void handle(PacketWrapper packet) throws Exception
|
|
- {
|
|
- if ( con.getServer() != null )
|
|
- {
|
|
+ public void handle(PacketWrapper packet) throws Exception {
|
|
+ if (con.getServer() != null) {
|
|
EntityMap rewrite = con.getEntityRewrite();
|
|
- if ( rewrite != null )
|
|
- {
|
|
- rewrite.rewriteServerbound( packet.buf, con.getClientEntityId(), con.getServerEntityId(), con.getPendingConnection().getVersion() );
|
|
+ if (rewrite != null) {
|
|
+ rewrite.rewriteServerbound(packet.buf, con.getClientEntityId(), con.getServerEntityId(),
|
|
+ con.getPendingConnection().getVersion());
|
|
}
|
|
- con.getServer().getCh().write( packet );
|
|
+ con.getServer().getCh().write(packet);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void handle(KeepAlive alive) throws Exception
|
|
- {
|
|
+ public void handle(KeepAlive alive) throws Exception {
|
|
KeepAliveData keepAliveData = con.getServer().getKeepAlives().peek();
|
|
-
|
|
- if ( keepAliveData != null && alive.getRandomId() == keepAliveData.getId() )
|
|
- {
|
|
- Preconditions.checkState( keepAliveData == con.getServer().getKeepAlives().poll(), "keepalive queue mismatch" );
|
|
- int newPing = (int) ( System.currentTimeMillis() - keepAliveData.getTime() );
|
|
- con.getTabListHandler().onPingChange( newPing );
|
|
- con.setPing( newPing );
|
|
- } else
|
|
- {
|
|
+ if (keepAliveData != null && alive.getRandomId() == keepAliveData.getId()) {
|
|
+ Preconditions.checkState(keepAliveData == con.getServer().getKeepAlives().poll(),
|
|
+ "keepalive queue mismatch");
|
|
+ int newPing = (int) (System.currentTimeMillis() - keepAliveData.getTime());
|
|
+ con.getTabListHandler().onPingChange(newPing);
|
|
+ con.setPing(newPing);
|
|
+ } else {
|
|
throw CancelSendSignal.INSTANCE;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void handle(Chat chat) throws Exception
|
|
- {
|
|
- int maxLength = ( con.getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_11 ) ? 256 : 100;
|
|
- Preconditions.checkArgument( chat.getMessage().length() <= maxLength, "Chat message too long" ); // Mojang limit, check on updates
|
|
+ public void handle(Chat chat) throws Exception {
|
|
+ int maxLength = (con.getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_11) ? 256 : 100;
|
|
+ Preconditions.checkArgument(chat.getMessage().length() <= maxLength, "Chat message too long"); // Mojang limit,
|
|
+ // check on
|
|
+ // updates
|
|
Preconditions.checkArgument(!StringUtil.isBlank(chat.getMessage()), "Chat message is empty");
|
|
|
|
- ChatEvent chatEvent = new ChatEvent( con, con.getServer(), chat.getMessage() );
|
|
- if ( !bungee.getPluginManager().callEvent( chatEvent ).isCancelled() )
|
|
- {
|
|
- chat.setMessage( chatEvent.getMessage() );
|
|
- if ( !chatEvent.isCommand() || !bungee.getPluginManager().dispatchCommand( con, chat.getMessage().substring( 1 ) ) )
|
|
- {
|
|
- con.getServer().unsafe().sendPacket( chat );
|
|
+ ChatEvent chatEvent = new ChatEvent(con, con.getServer(), chat.getMessage());
|
|
+ if (!bungee.getPluginManager().callEvent(chatEvent).isCancelled()) {
|
|
+ chat.setMessage(chatEvent.getMessage());
|
|
+ if (!chatEvent.isCommand()
|
|
+ || !bungee.getPluginManager().dispatchCommand(con, chat.getMessage().substring(1))) {
|
|
+ con.getServer().unsafe().sendPacket(chat);
|
|
}
|
|
}
|
|
throw CancelSendSignal.INSTANCE;
|
|
}
|
|
|
|
@Override
|
|
- public void handle(TabCompleteRequest tabComplete) throws Exception
|
|
- {
|
|
+ public void handle(TabCompleteRequest tabComplete) throws Exception {
|
|
// Waterfall start - tab limiter
|
|
- if ( bungee.getConfig().getTabThrottle() > 0 &&
|
|
- ( con.getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_13
|
|
- && !bungee.getConfig().isDisableModernTabLimiter()))
|
|
- {
|
|
+ if (bungee.getConfig().getTabThrottle() > 0
|
|
+ && (con.getPendingConnection().getVersion() >= ProtocolConstants.MINECRAFT_1_13
|
|
+ && !bungee.getConfig().isDisableModernTabLimiter())) {
|
|
long now = System.currentTimeMillis();
|
|
- if ( lastTabCompletion > 0 && (now - lastTabCompletion) <= bungee.getConfig().getTabThrottle() )
|
|
- {
|
|
+ if (lastTabCompletion > 0 && (now - lastTabCompletion) <= bungee.getConfig().getTabThrottle()) {
|
|
throw CancelSendSignal.INSTANCE;
|
|
}
|
|
lastTabCompletion = now;
|
|
@@ -187,102 +167,93 @@ public class UpstreamBridge extends PacketHandler
|
|
// Waterfall end - tab limiter
|
|
List<String> suggestions = new ArrayList<>();
|
|
|
|
- if ( tabComplete.getCursor().startsWith( "/" ) )
|
|
- {
|
|
- bungee.getPluginManager().dispatchCommand( con, tabComplete.getCursor().substring( 1 ), suggestions );
|
|
+ if (tabComplete.getCursor().startsWith("/")) {
|
|
+ bungee.getPluginManager().dispatchCommand(con, tabComplete.getCursor().substring(1), suggestions);
|
|
}
|
|
|
|
- TabCompleteEvent tabCompleteEvent = new TabCompleteEvent( con, con.getServer(), tabComplete.getCursor(), suggestions );
|
|
- bungee.getPluginManager().callEvent( tabCompleteEvent );
|
|
+ TabCompleteEvent tabCompleteEvent = new TabCompleteEvent(con, con.getServer(), tabComplete.getCursor(),
|
|
+ suggestions);
|
|
+ bungee.getPluginManager().callEvent(tabCompleteEvent);
|
|
|
|
- if ( tabCompleteEvent.isCancelled() )
|
|
- {
|
|
+ if (tabCompleteEvent.isCancelled()) {
|
|
throw CancelSendSignal.INSTANCE;
|
|
}
|
|
|
|
List<String> results = tabCompleteEvent.getSuggestions();
|
|
- if ( !results.isEmpty() )
|
|
- {
|
|
- // Unclear how to handle 1.13 commands at this point. Because we don't inject into the command packets we are unlikely to get this far unless
|
|
+ if (!results.isEmpty()) {
|
|
+ // Unclear how to handle 1.13 commands at this point. Because we don't inject
|
|
+ // into the command packets we are unlikely to get this far unless
|
|
// Bungee plugins are adding results for commands they don't own anyway
|
|
- if ( con.getPendingConnection().getVersion() < ProtocolConstants.MINECRAFT_1_13 )
|
|
- {
|
|
- con.unsafe().sendPacket( new TabCompleteResponse( results ) );
|
|
- } else
|
|
- {
|
|
- int start = tabComplete.getCursor().lastIndexOf( ' ' ) + 1;
|
|
+ if (con.getPendingConnection().getVersion() < ProtocolConstants.MINECRAFT_1_13) {
|
|
+ con.unsafe().sendPacket(new TabCompleteResponse(results));
|
|
+ } else {
|
|
+ int start = tabComplete.getCursor().lastIndexOf(' ') + 1;
|
|
int end = tabComplete.getCursor().length();
|
|
- StringRange range = StringRange.between( start, end );
|
|
+ StringRange range = StringRange.between(start, end);
|
|
|
|
List<Suggestion> brigadier = new LinkedList<>();
|
|
- for ( String s : results )
|
|
- {
|
|
- brigadier.add( new Suggestion( range, s ) );
|
|
+ for (String s : results) {
|
|
+ brigadier.add(new Suggestion(range, s));
|
|
}
|
|
|
|
- con.unsafe().sendPacket( new TabCompleteResponse( tabComplete.getTransactionId(), new Suggestions( range, brigadier ) ) );
|
|
+ con.unsafe().sendPacket(
|
|
+ new TabCompleteResponse(tabComplete.getTransactionId(), new Suggestions(range, brigadier)));
|
|
}
|
|
throw CancelSendSignal.INSTANCE;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void handle(ClientSettings settings) throws Exception
|
|
- {
|
|
- con.setSettings( settings );
|
|
+ public void handle(ClientSettings settings) throws Exception {
|
|
+ con.setSettings(settings);
|
|
|
|
- SettingsChangedEvent settingsEvent = new SettingsChangedEvent( con );
|
|
- bungee.getPluginManager().callEvent( settingsEvent );
|
|
+ SettingsChangedEvent settingsEvent = new SettingsChangedEvent(con);
|
|
+ bungee.getPluginManager().callEvent(settingsEvent);
|
|
}
|
|
|
|
@Override
|
|
- public void handle(PluginMessage pluginMessage) throws Exception
|
|
- {
|
|
- if ( pluginMessage.getTag().equals( "BungeeCord" ) )
|
|
- {
|
|
+ public void handle(PluginMessage pluginMessage) throws Exception {
|
|
+ if (pluginMessage.getTag().equals("BungeeCord")) {
|
|
throw CancelSendSignal.INSTANCE;
|
|
}
|
|
|
|
- if ( BungeeCord.getInstance().config.isForgeSupport() )
|
|
- {
|
|
+ if (BungeeCord.getInstance().config.isForgeSupport()) {
|
|
// Hack around Forge race conditions
|
|
- if ( pluginMessage.getTag().equals( "FML" ) && pluginMessage.getStream().readUnsignedByte() == 1 )
|
|
- {
|
|
+ if (pluginMessage.getTag().equals("FML") && pluginMessage.getStream().readUnsignedByte() == 1) {
|
|
throw CancelSendSignal.INSTANCE;
|
|
}
|
|
|
|
// We handle forge handshake messages if forge support is enabled.
|
|
- if ( pluginMessage.getTag().equals( ForgeConstants.FML_HANDSHAKE_TAG ) )
|
|
- {
|
|
+ if (pluginMessage.getTag().equals(ForgeConstants.FML_HANDSHAKE_TAG)) {
|
|
// Let our forge client handler deal with this packet.
|
|
- con.getForgeClientHandler().handle( pluginMessage );
|
|
+ con.getForgeClientHandler().handle(pluginMessage);
|
|
throw CancelSendSignal.INSTANCE;
|
|
}
|
|
|
|
- if ( con.getServer() != null && !con.getServer().isForgeServer() && pluginMessage.getData().length > Short.MAX_VALUE )
|
|
- {
|
|
- // Drop the packet if the server is not a Forge server and the message was > 32kiB (as suggested by @jk-5)
|
|
- // Do this AFTER the mod list, so we get that even if the intial server isn't modded.
|
|
+ if (con.getServer() != null && !con.getServer().isForgeServer()
|
|
+ && pluginMessage.getData().length > Short.MAX_VALUE) {
|
|
+ // Drop the packet if the server is not a Forge server and the message was >
|
|
+ // 32kiB (as suggested by @jk-5)
|
|
+ // Do this AFTER the mod list, so we get that even if the intial server isn't
|
|
+ // modded.
|
|
throw CancelSendSignal.INSTANCE;
|
|
}
|
|
}
|
|
|
|
- PluginMessageEvent event = new PluginMessageEvent( con, con.getServer(), pluginMessage.getTag(), pluginMessage.getData().clone() );
|
|
- if ( bungee.getPluginManager().callEvent( event ).isCancelled() )
|
|
- {
|
|
+ PluginMessageEvent event = new PluginMessageEvent(con, con.getServer(), pluginMessage.getTag(),
|
|
+ pluginMessage.getData().clone());
|
|
+ if (bungee.getPluginManager().callEvent(event).isCancelled()) {
|
|
throw CancelSendSignal.INSTANCE;
|
|
}
|
|
|
|
// TODO: Unregister as well?
|
|
- if ( PluginMessage.SHOULD_RELAY.apply( pluginMessage ) )
|
|
- {
|
|
- con.getPendingConnection().getRelayMessages().add( pluginMessage );
|
|
+ if (PluginMessage.SHOULD_RELAY.apply(pluginMessage)) {
|
|
+ con.getPendingConnection().getRelayMessages().add(pluginMessage);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public String toString()
|
|
- {
|
|
+ public String toString() {
|
|
return "[" + con.getAddress() + "|" + con.getName() + "] -> UpstreamBridge";
|
|
}
|
|
}
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/http/HttpClient.java b/proxy/src/main/java/net/md_5/bungee/http/HttpClient.java
|
|
index 37337429..1cdf979c 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/http/HttpClient.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/http/HttpClient.java
|
|
@@ -23,33 +23,30 @@ import net.md_5.bungee.api.Callback;
|
|
import net.md_5.bungee.netty.PipelineUtils;
|
|
|
|
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
|
-public class HttpClient
|
|
-{
|
|
+public class HttpClient {
|
|
|
|
public static final int TIMEOUT = 5000;
|
|
- private static final Cache<String, InetAddress> addressCache = CacheBuilder.newBuilder().expireAfterWrite( 1, TimeUnit.MINUTES ).build();
|
|
+ private static final Cache<String, InetAddress> addressCache = CacheBuilder.newBuilder()
|
|
+ .expireAfterWrite(1, TimeUnit.MINUTES).build();
|
|
// Waterfall Start - optionally use async resolver from Netty
|
|
- private static final io.netty.resolver.dns.DnsAddressResolverGroup dnsResolverGroup =
|
|
- new io.netty.resolver.dns.DnsAddressResolverGroup(PipelineUtils.getDatagramChannel(), io.netty.resolver.dns.DefaultDnsServerAddressStreamProvider.INSTANCE);
|
|
+ private static final io.netty.resolver.dns.DnsAddressResolverGroup dnsResolverGroup = new io.netty.resolver.dns.DnsAddressResolverGroup(
|
|
+ PipelineUtils.getDatagramChannel(), io.netty.resolver.dns.DefaultDnsServerAddressStreamProvider.INSTANCE);
|
|
// Waterfall End
|
|
|
|
@SuppressWarnings("UnusedAssignment")
|
|
- public static void get(String url, EventLoop eventLoop, final Callback<String> callback)
|
|
- {
|
|
- Preconditions.checkNotNull( url, "url" );
|
|
- Preconditions.checkNotNull( eventLoop, "eventLoop" );
|
|
- Preconditions.checkNotNull( callback, "callBack" );
|
|
+ public static void get(String url, EventLoop eventLoop, final Callback<String> callback) {
|
|
+ Preconditions.checkNotNull(url, "url");
|
|
+ Preconditions.checkNotNull(eventLoop, "eventLoop");
|
|
+ Preconditions.checkNotNull(callback, "callBack");
|
|
|
|
- final URI uri = URI.create( url );
|
|
+ final URI uri = URI.create(url);
|
|
|
|
- Preconditions.checkNotNull( uri.getScheme(), "scheme" );
|
|
- Preconditions.checkNotNull( uri.getHost(), "host" );
|
|
- boolean ssl = uri.getScheme().equals( "https" );
|
|
+ Preconditions.checkNotNull(uri.getScheme(), "scheme");
|
|
+ Preconditions.checkNotNull(uri.getHost(), "host");
|
|
+ boolean ssl = uri.getScheme().equals("https");
|
|
int port = uri.getPort();
|
|
- if ( port == -1 )
|
|
- {
|
|
- switch ( uri.getScheme() )
|
|
- {
|
|
+ if (port == -1) {
|
|
+ switch (uri.getScheme()) {
|
|
case "http":
|
|
port = 80;
|
|
break;
|
|
@@ -57,81 +54,82 @@ public class HttpClient
|
|
port = 443;
|
|
break;
|
|
default:
|
|
- throw new IllegalArgumentException( "Unknown scheme " + uri.getScheme() );
|
|
+ throw new IllegalArgumentException("Unknown scheme " + uri.getScheme());
|
|
}
|
|
}
|
|
|
|
// Waterfall Start - Move address creation to implementation method
|
|
- //InetAddress inetHost = addressCache.getIfPresent( uri.getHost() );
|
|
- //if ( inetHost == null )
|
|
- //{
|
|
- // try
|
|
- // {
|
|
- // inetHost = InetAddress.getByName( uri.getHost() );
|
|
- // } catch ( UnknownHostException ex )
|
|
- // {
|
|
- // callback.done( null, ex );
|
|
- // return;
|
|
- // }
|
|
- // addressCache.put( uri.getHost(), inetHost );
|
|
- //}
|
|
+ // InetAddress inetHost = addressCache.getIfPresent( uri.getHost() );
|
|
+ // if ( inetHost == null )
|
|
+ // {
|
|
+ // try
|
|
+ // {
|
|
+ // inetHost = InetAddress.getByName( uri.getHost() );
|
|
+ // } catch ( UnknownHostException ex )
|
|
+ // {
|
|
+ // callback.done( null, ex );
|
|
+ // return;
|
|
+ // }
|
|
+ // addressCache.put( uri.getHost(), inetHost );
|
|
+ // }
|
|
// Waterfall End
|
|
|
|
- ChannelFutureListener future = new ChannelFutureListener()
|
|
- {
|
|
+ ChannelFutureListener future = new ChannelFutureListener() {
|
|
@Override
|
|
- public void operationComplete(ChannelFuture future) throws Exception
|
|
- {
|
|
- if ( future.isSuccess() )
|
|
- {
|
|
- String path = uri.getRawPath() + ( ( uri.getRawQuery() == null ) ? "" : "?" + uri.getRawQuery() );
|
|
+ public void operationComplete(ChannelFuture future) throws Exception {
|
|
+ if (future.isSuccess()) {
|
|
+ String path = uri.getRawPath() + ((uri.getRawQuery() == null) ? "" : "?" + uri.getRawQuery());
|
|
|
|
- HttpRequest request = new DefaultHttpRequest( HttpVersion.HTTP_1_1, HttpMethod.GET, path );
|
|
- request.headers().set( HttpHeaderNames.HOST, uri.getHost() );
|
|
+ HttpRequest request = new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, path);
|
|
+ request.headers().set(HttpHeaderNames.HOST, uri.getHost());
|
|
|
|
- future.channel().writeAndFlush( request );
|
|
- } else
|
|
- {
|
|
- addressCache.invalidate( uri.getHost() );
|
|
- callback.done( null, future.cause() );
|
|
+ future.channel().writeAndFlush(request);
|
|
+ } else {
|
|
+ addressCache.invalidate(uri.getHost());
|
|
+ callback.done(null, future.cause());
|
|
}
|
|
}
|
|
};
|
|
|
|
-
|
|
// Waterfall Start - Optionally use Netty's async DNS Resolver
|
|
if (net.md_5.bungee.api.ProxyServer.getInstance().getConfig().isUseNettyDnsResolver()) {
|
|
getWithNettyResolver(eventLoop, uri, port, future, callback, ssl);
|
|
} else {
|
|
getWithDefaultResolver(eventLoop, uri, port, future, callback, ssl);
|
|
}
|
|
- //new Bootstrap().channel( PipelineUtils.getChannel() ).group( eventLoop ).handler( new HttpInitializer( callback, ssl, uri.getHost(), port ) ).
|
|
- // option( ChannelOption.CONNECT_TIMEOUT_MILLIS, TIMEOUT ).remoteAddress( inetHost, port ).connect().addListener( future );
|
|
+ // new Bootstrap().channel( PipelineUtils.getChannel() ).group( eventLoop
|
|
+ // ).handler( new HttpInitializer( callback, ssl, uri.getHost(), port ) ).
|
|
+ // option( ChannelOption.CONNECT_TIMEOUT_MILLIS, TIMEOUT ).remoteAddress(
|
|
+ // inetHost, port ).connect().addListener( future );
|
|
}
|
|
|
|
- private static void getWithNettyResolver(EventLoop eventLoop, URI uri, int port, ChannelFutureListener future, Callback<String> callback, boolean ssl) {
|
|
+ private static void getWithNettyResolver(EventLoop eventLoop, URI uri, int port, ChannelFutureListener future,
|
|
+ Callback<String> callback, boolean ssl) {
|
|
java.net.InetSocketAddress address = java.net.InetSocketAddress.createUnresolved(uri.getHost(), port);
|
|
- new Bootstrap().channel( PipelineUtils.getChannel( null ) ).group( eventLoop ).handler( new HttpInitializer( callback, ssl, uri.getHost(), port ) ).
|
|
- option( ChannelOption.CONNECT_TIMEOUT_MILLIS, TIMEOUT ).resolver(dnsResolverGroup).remoteAddress( address ).connect().addListener( future );
|
|
+ new Bootstrap().channel(PipelineUtils.getChannel(null)).group(eventLoop)
|
|
+ .handler(new HttpInitializer(callback, ssl, uri.getHost(), port))
|
|
+ .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, TIMEOUT).resolver(dnsResolverGroup).remoteAddress(address)
|
|
+ .connect().addListener(future);
|
|
}
|
|
|
|
- private static void getWithDefaultResolver(EventLoop eventLoop, URI uri, int port, ChannelFutureListener future, Callback<String> callback, boolean ssl) {
|
|
- // This is identical to the Bungee implementation of #get other than the absence of the ChannelFutureListener creation
|
|
- InetAddress inetHost = addressCache.getIfPresent( uri.getHost() );
|
|
- if ( inetHost == null )
|
|
- {
|
|
- try
|
|
- {
|
|
- inetHost = InetAddress.getByName( uri.getHost() );
|
|
- } catch ( UnknownHostException ex )
|
|
- {
|
|
- callback.done( null, ex );
|
|
+ private static void getWithDefaultResolver(EventLoop eventLoop, URI uri, int port, ChannelFutureListener future,
|
|
+ Callback<String> callback, boolean ssl) {
|
|
+ // This is identical to the Bungee implementation of #get other than the absence
|
|
+ // of the ChannelFutureListener creation
|
|
+ InetAddress inetHost = addressCache.getIfPresent(uri.getHost());
|
|
+ if (inetHost == null) {
|
|
+ try {
|
|
+ inetHost = InetAddress.getByName(uri.getHost());
|
|
+ } catch (UnknownHostException ex) {
|
|
+ callback.done(null, ex);
|
|
return;
|
|
}
|
|
- addressCache.put( uri.getHost(), inetHost );
|
|
+ addressCache.put(uri.getHost(), inetHost);
|
|
}
|
|
- new Bootstrap().channel( PipelineUtils.getChannel( null ) ).group( eventLoop ).handler( new HttpInitializer( callback, ssl, uri.getHost(), port ) ).
|
|
- option( ChannelOption.CONNECT_TIMEOUT_MILLIS, TIMEOUT ).remoteAddress( inetHost, port ).connect().addListener( future );
|
|
+ new Bootstrap().channel(PipelineUtils.getChannel(null)).group(eventLoop)
|
|
+ .handler(new HttpInitializer(callback, ssl, uri.getHost(), port))
|
|
+ .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, TIMEOUT).remoteAddress(inetHost, port).connect()
|
|
+ .addListener(future);
|
|
}
|
|
// Waterfall End
|
|
}
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/http/HttpHandler.java b/proxy/src/main/java/net/md_5/bungee/http/HttpHandler.java
|
|
index b91981e6..f877c11d 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/http/HttpHandler.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/http/HttpHandler.java
|
|
@@ -12,63 +12,50 @@ import lombok.RequiredArgsConstructor;
|
|
import net.md_5.bungee.api.Callback;
|
|
|
|
@RequiredArgsConstructor
|
|
-public class HttpHandler extends SimpleChannelInboundHandler<HttpObject>
|
|
-{
|
|
+public class HttpHandler extends SimpleChannelInboundHandler<HttpObject> {
|
|
|
|
private final Callback<String> callback;
|
|
private final StringBuilder buffer = new StringBuilder(640);
|
|
|
|
@Override
|
|
- public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception
|
|
- {
|
|
- try
|
|
- {
|
|
- callback.done( null, cause );
|
|
- } finally
|
|
- {
|
|
- ctx.channel().close();
|
|
+ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
|
|
+ try {
|
|
+ callback.done(null, cause);
|
|
+ } finally {
|
|
+ ctx.close();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception
|
|
- {
|
|
- if ( msg instanceof HttpResponse )
|
|
- {
|
|
+ protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception {
|
|
+ if (msg instanceof HttpResponse) {
|
|
HttpResponse response = (HttpResponse) msg;
|
|
int responseCode = response.status().code();
|
|
|
|
- if ( responseCode == HttpResponseStatus.NO_CONTENT.code() )
|
|
- {
|
|
- done( ctx );
|
|
+ if (responseCode == HttpResponseStatus.NO_CONTENT.code()) {
|
|
+ done(ctx);
|
|
return;
|
|
}
|
|
|
|
- if ( responseCode != HttpResponseStatus.OK.code() )
|
|
- {
|
|
- throw new IllegalStateException( "Expected HTTP response 200 OK, got " + response.status() );
|
|
+ if (responseCode != HttpResponseStatus.OK.code()) {
|
|
+ throw new IllegalStateException("Expected HTTP response 200 OK, got " + response.status());
|
|
}
|
|
}
|
|
- if ( msg instanceof HttpContent )
|
|
- {
|
|
+ if (msg instanceof HttpContent) {
|
|
HttpContent content = (HttpContent) msg;
|
|
- buffer.append( content.content().toString( Charset.forName( "UTF-8" ) ) );
|
|
+ buffer.append(content.content().toString(Charset.forName("UTF-8")));
|
|
|
|
- if ( msg instanceof LastHttpContent )
|
|
- {
|
|
- done( ctx );
|
|
+ if (msg instanceof LastHttpContent) {
|
|
+ done(ctx);
|
|
}
|
|
}
|
|
}
|
|
|
|
- private void done(ChannelHandlerContext ctx)
|
|
- {
|
|
- try
|
|
- {
|
|
- callback.done( buffer.toString(), null );
|
|
- } finally
|
|
- {
|
|
- ctx.channel().close();
|
|
+ private void done(ChannelHandlerContext ctx) {
|
|
+ try {
|
|
+ callback.done(buffer.toString(), null);
|
|
+ } finally {
|
|
+ ctx.close();
|
|
}
|
|
}
|
|
}
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/module/ModuleManager.java b/proxy/src/main/java/net/md_5/bungee/module/ModuleManager.java
|
|
index 8c5cc949..de83bb2c 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/module/ModuleManager.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/module/ModuleManager.java
|
|
@@ -21,131 +21,109 @@ import net.md_5.bungee.util.CaseInsensitiveMap;
|
|
import org.yaml.snakeyaml.DumperOptions;
|
|
import org.yaml.snakeyaml.Yaml;
|
|
|
|
-public class ModuleManager
|
|
-{
|
|
+public class ModuleManager {
|
|
|
|
private final Map<String, ModuleSource> knownSources = new HashMap<>();
|
|
|
|
- public ModuleManager()
|
|
- {
|
|
- knownSources.put( "jenkins", new JenkinsModuleSource() );
|
|
+ public ModuleManager() {
|
|
+ knownSources.put("jenkins", new JenkinsModuleSource());
|
|
}
|
|
|
|
- @SuppressFBWarnings(
|
|
- {
|
|
- "SF_SWITCH_FALLTHROUGH", "SF_SWITCH_NO_DEFAULT"
|
|
- })
|
|
- public void load(ProxyServer proxy, File moduleDirectory) throws Exception
|
|
- {
|
|
+ @SuppressFBWarnings({ "SF_SWITCH_FALLTHROUGH", "SF_SWITCH_NO_DEFAULT" })
|
|
+ public void load(ProxyServer proxy, File moduleDirectory) throws Exception {
|
|
moduleDirectory.mkdir();
|
|
|
|
- ModuleVersion bungeeVersion = ModuleVersion.parse( proxy.getVersion() );
|
|
- if ( bungeeVersion == null )
|
|
- {
|
|
- proxy.getLogger().warning( "Couldn't detect bungee version. Custom build?" ); // Waterfall - Use logger
|
|
+ ModuleVersion bungeeVersion = ModuleVersion.parse(proxy.getVersion());
|
|
+ if (bungeeVersion == null) {
|
|
+ proxy.getLogger().warning("Couldn't detect bungee version. Custom build?"); // Waterfall - Use logger
|
|
return;
|
|
}
|
|
|
|
List<ModuleSpec> modules = new ArrayList<>();
|
|
- File configFile = new File( "modules.yml" );
|
|
+ File configFile = new File("modules.yml");
|
|
// Start Yaml
|
|
DumperOptions options = new DumperOptions();
|
|
- options.setDefaultFlowStyle( DumperOptions.FlowStyle.BLOCK );
|
|
- Yaml yaml = new Yaml( options );
|
|
+ options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
|
|
+ Yaml yaml = new Yaml(options);
|
|
|
|
Map<String, Object> config;
|
|
|
|
configFile.createNewFile();
|
|
- try ( InputStream is = new FileInputStream( configFile ) )
|
|
- {
|
|
- config = (Map) yaml.load( is );
|
|
+ try (InputStream is = new FileInputStream(configFile)) {
|
|
+ config = (Map) yaml.load(is);
|
|
}
|
|
|
|
- if ( config == null )
|
|
- {
|
|
+ if (config == null) {
|
|
config = new CaseInsensitiveMap<>();
|
|
- } else
|
|
- {
|
|
- config = new CaseInsensitiveMap<>( config );
|
|
+ } else {
|
|
+ config = new CaseInsensitiveMap<>(config);
|
|
}
|
|
// End yaml
|
|
|
|
List<String> defaults = new ArrayList<>();
|
|
- Object readModules = config.get( "modules" );
|
|
- if ( readModules != null )
|
|
- {
|
|
- defaults.addAll( (Collection) readModules );
|
|
+ Object readModules = config.get("modules");
|
|
+ if (readModules != null) {
|
|
+ defaults.addAll((Collection) readModules);
|
|
}
|
|
- int version = ( config.containsKey( "version" ) ) ? (int) config.get( "version" ) : 0;
|
|
- switch ( version )
|
|
- {
|
|
+ int version = (config.containsKey("version")) ? (int) config.get("version") : 0;
|
|
+ switch (version) {
|
|
case 0:
|
|
- defaults.add( "jenkins://cmd_alert" );
|
|
- defaults.add( "jenkins://cmd_find" );
|
|
- defaults.add( "jenkins://cmd_list" );
|
|
- defaults.add( "jenkins://cmd_send" );
|
|
- defaults.add( "jenkins://cmd_server" );
|
|
+ defaults.add("jenkins://cmd_alert");
|
|
+ defaults.add("jenkins://cmd_find");
|
|
+ defaults.add("jenkins://cmd_list");
|
|
+ defaults.add("jenkins://cmd_send");
|
|
+ defaults.add("jenkins://cmd_server");
|
|
case 1:
|
|
- defaults.add( "jenkins://reconnect_yaml" );
|
|
+ defaults.add("jenkins://reconnect_yaml");
|
|
}
|
|
- config.put( "modules", defaults );
|
|
- config.put( "version", 2 );
|
|
+ config.put("modules", defaults);
|
|
+ config.put("version", 2);
|
|
|
|
- try ( FileWriter wr = new FileWriter( configFile ) )
|
|
- {
|
|
- yaml.dump( config, wr );
|
|
+ try (FileWriter wr = new FileWriter(configFile)) {
|
|
+ yaml.dump(config, wr);
|
|
}
|
|
|
|
- for ( String s : (List<String>) config.get( "modules" ) )
|
|
- {
|
|
- URI uri = new URI( s );
|
|
+ for (String s : (List<String>) config.get("modules")) {
|
|
+ URI uri = new URI(s);
|
|
|
|
- ModuleSource source = knownSources.get( uri.getScheme() );
|
|
- if ( source == null )
|
|
- {
|
|
- System.out.println( "Unknown module source: " + s );
|
|
+ ModuleSource source = knownSources.get(uri.getScheme());
|
|
+ if (source == null) {
|
|
+ System.out.println("Unknown module source: " + s);
|
|
continue;
|
|
}
|
|
String name = uri.getAuthority();
|
|
- if ( name == null )
|
|
- {
|
|
- System.out.println( "Unknown module host: " + s );
|
|
+ if (name == null) {
|
|
+ System.out.println("Unknown module host: " + s);
|
|
continue;
|
|
}
|
|
|
|
- ModuleSpec spec = new ModuleSpec( name, new File( moduleDirectory, name + ".jar" ), source );
|
|
- modules.add( spec );
|
|
- System.out.println( "Discovered module: " + spec );
|
|
+ ModuleSpec spec = new ModuleSpec(name, new File(moduleDirectory, name + ".jar"), source);
|
|
+ modules.add(spec);
|
|
+ System.out.println("Discovered module: " + spec);
|
|
}
|
|
|
|
- for ( ModuleSpec module : modules )
|
|
- {
|
|
- ModuleVersion moduleVersion = ( module.getFile().exists() ) ? getVersion( module.getFile() ) : null;
|
|
+ for (ModuleSpec module : modules) {
|
|
+ ModuleVersion moduleVersion = (module.getFile().exists()) ? getVersion(module.getFile()) : null;
|
|
|
|
- if ( !bungeeVersion.equals( moduleVersion ) )
|
|
- {
|
|
- System.out.println( "Attempting to update plugin from " + moduleVersion + " to " + bungeeVersion );
|
|
- module.getProvider().retrieve( module, bungeeVersion );
|
|
+ if (!bungeeVersion.equals(moduleVersion)) {
|
|
+ System.out.println("Attempting to update plugin from " + moduleVersion + " to " + bungeeVersion);
|
|
+ module.getProvider().retrieve(module, bungeeVersion);
|
|
}
|
|
}
|
|
}
|
|
|
|
@SuppressFBWarnings("REC_CATCH_EXCEPTION")
|
|
- private ModuleVersion getVersion(File file)
|
|
- {
|
|
- try ( JarFile jar = new JarFile( file ) )
|
|
- {
|
|
- JarEntry pdf = jar.getJarEntry( "plugin.yml" );
|
|
- Preconditions.checkNotNull( pdf, "Plugin must have a plugin.yml" );
|
|
-
|
|
- try ( InputStream in = jar.getInputStream( pdf ) )
|
|
- {
|
|
- PluginDescription desc = new Yaml().loadAs( in, PluginDescription.class );
|
|
- return ModuleVersion.parse( desc.getVersion() );
|
|
+ private ModuleVersion getVersion(File file) {
|
|
+ try (JarFile jar = new JarFile(file)) {
|
|
+ JarEntry pdf = jar.getJarEntry("plugin.yml");
|
|
+ Preconditions.checkNotNull(pdf, "Plugin must have a plugin.yml");
|
|
+
|
|
+ try (InputStream in = jar.getInputStream(pdf)) {
|
|
+ PluginDescription desc = new Yaml().loadAs(in, PluginDescription.class);
|
|
+ return ModuleVersion.parse(desc.getVersion());
|
|
}
|
|
- } catch ( Exception ex )
|
|
- {
|
|
- ProxyServer.getInstance().getLogger().log( Level.WARNING, "Could not check module from file " + file, ex );
|
|
+ } catch (Exception ex) {
|
|
+ ProxyServer.getInstance().getLogger().log(Level.WARNING, "Could not check module from file " + file, ex);
|
|
}
|
|
|
|
return null;
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java b/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java
|
|
index 6dc5633f..f1e0f606 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java
|
|
@@ -5,6 +5,8 @@ import io.netty.channel.Channel;
|
|
import io.netty.channel.ChannelFutureListener;
|
|
import io.netty.channel.ChannelHandler;
|
|
import io.netty.channel.ChannelHandlerContext;
|
|
+import io.netty.channel.ChannelPipeline;
|
|
+
|
|
import java.net.SocketAddress;
|
|
import java.util.concurrent.TimeUnit;
|
|
import lombok.Getter;
|
|
@@ -17,8 +19,7 @@ import net.md_5.bungee.protocol.PacketWrapper;
|
|
import net.md_5.bungee.protocol.Protocol;
|
|
import net.md_5.bungee.protocol.packet.Kick;
|
|
|
|
-public class ChannelWrapper
|
|
-{
|
|
+public class ChannelWrapper {
|
|
|
|
private final Channel ch;
|
|
@Getter
|
|
@@ -29,120 +30,110 @@ public class ChannelWrapper
|
|
@Getter
|
|
private volatile boolean closing;
|
|
|
|
- public ChannelWrapper(ChannelHandlerContext ctx)
|
|
- {
|
|
+ public ChannelWrapper(ChannelHandlerContext ctx) {
|
|
this.ch = ctx.channel();
|
|
- this.remoteAddress = ( this.ch.remoteAddress() == null ) ? this.ch.parent().localAddress() : this.ch.remoteAddress();
|
|
+ this.remoteAddress = (this.ch.remoteAddress() == null) ? this.ch.parent().localAddress()
|
|
+ : this.ch.remoteAddress();
|
|
}
|
|
|
|
- public void setProtocol(Protocol protocol)
|
|
- {
|
|
- ch.pipeline().get( MinecraftDecoder.class ).setProtocol( protocol );
|
|
- ch.pipeline().get( MinecraftEncoder.class ).setProtocol( protocol );
|
|
+ public void setProtocol(Protocol protocol) {
|
|
+ // FlameCord - Create pipeline object to reduce redundancy
|
|
+ final ChannelPipeline pipeline = ch.pipeline();
|
|
+
|
|
+ pipeline.get(MinecraftDecoder.class).setProtocol(protocol);
|
|
+ pipeline.get(MinecraftEncoder.class).setProtocol(protocol);
|
|
}
|
|
|
|
- public void setVersion(int protocol)
|
|
- {
|
|
- ch.pipeline().get( MinecraftDecoder.class ).setProtocolVersion( protocol );
|
|
- ch.pipeline().get( MinecraftEncoder.class ).setProtocolVersion( protocol );
|
|
+ public void setVersion(int protocol) {
|
|
+ // FlameCord - Create pipeline object to reduce redundancy
|
|
+ final ChannelPipeline pipeline = ch.pipeline();
|
|
+
|
|
+ pipeline.get(MinecraftDecoder.class).setProtocolVersion(protocol);
|
|
+ pipeline.get(MinecraftEncoder.class).setProtocolVersion(protocol);
|
|
}
|
|
|
|
- public void write(Object packet)
|
|
- {
|
|
- if ( !closed )
|
|
- {
|
|
- if ( packet instanceof PacketWrapper )
|
|
- {
|
|
- ( (PacketWrapper) packet ).setReleased( true );
|
|
- ch.writeAndFlush( ( (PacketWrapper) packet ).buf, ch.voidPromise() );
|
|
- } else
|
|
- {
|
|
- ch.writeAndFlush( packet, ch.voidPromise() );
|
|
+ public void write(Object packet) {
|
|
+ if (!closed) {
|
|
+ if (packet instanceof PacketWrapper) {
|
|
+ ((PacketWrapper) packet).setReleased(true);
|
|
+ ch.writeAndFlush(((PacketWrapper) packet).buf, ch.voidPromise());
|
|
+ } else {
|
|
+ ch.writeAndFlush(packet, ch.voidPromise());
|
|
}
|
|
}
|
|
}
|
|
|
|
- public void markClosed()
|
|
- {
|
|
+ public void markClosed() {
|
|
closed = closing = true;
|
|
}
|
|
|
|
- public void close()
|
|
- {
|
|
- close( null );
|
|
+ public void close() {
|
|
+ close(null);
|
|
}
|
|
|
|
- public void close(Object packet)
|
|
- {
|
|
- if ( !closed )
|
|
- {
|
|
+ public void close(Object packet) {
|
|
+ if (!closed) {
|
|
closed = closing = true;
|
|
|
|
- if ( packet != null && ch.isActive() )
|
|
- {
|
|
- ch.writeAndFlush( packet ).addListeners( ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE, ChannelFutureListener.CLOSE );
|
|
- } else
|
|
- {
|
|
- ch.flush();
|
|
+ if (packet != null && ch.isActive()) {
|
|
+ ch.writeAndFlush(packet).addListeners(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE,
|
|
+ ChannelFutureListener.CLOSE);
|
|
+ } else {
|
|
+ // FlameCord - Disable flushing as it's not really necessary
|
|
+ // ch.flush();
|
|
ch.close();
|
|
}
|
|
}
|
|
}
|
|
|
|
- public void delayedClose(final Kick kick)
|
|
- {
|
|
- if ( !closing )
|
|
- {
|
|
- closing = true;
|
|
-
|
|
- // Minecraft client can take some time to switch protocols.
|
|
- // Sending the wrong disconnect packet whilst a protocol switch is in progress will crash it.
|
|
- // Delay 250ms to ensure that the protocol switch (if any) has definitely taken place.
|
|
- ch.eventLoop().schedule( new Runnable()
|
|
- {
|
|
-
|
|
- @Override
|
|
- public void run()
|
|
- {
|
|
- close( kick );
|
|
- }
|
|
- }, 250, TimeUnit.MILLISECONDS );
|
|
- }
|
|
+ public void delayedClose(final Kick kick) {
|
|
+ // FlameCord - "Disable" delayed close
|
|
+ close(kick);
|
|
+ /*
|
|
+ * if (!closing) { closing = true;
|
|
+ *
|
|
+ * // Minecraft client can take some time to switch protocols. // Sending the
|
|
+ * wrong disconnect packet whilst a protocol switch is in progress // will crash
|
|
+ * it. // Delay 250ms to ensure that the protocol switch (if any) has definitely
|
|
+ * taken // place. ch.eventLoop().schedule(new Runnable() {
|
|
+ *
|
|
+ * @Override public void run() { close(kick); } }, 250, TimeUnit.MILLISECONDS);
|
|
+ * }
|
|
+ */
|
|
}
|
|
|
|
- public void addBefore(String baseName, String name, ChannelHandler handler)
|
|
- {
|
|
- Preconditions.checkState( ch.eventLoop().inEventLoop(), "cannot add handler outside of event loop" );
|
|
- ch.pipeline().flush();
|
|
- ch.pipeline().addBefore( baseName, name, handler );
|
|
+ public void addBefore(String baseName, String name, ChannelHandler handler) {
|
|
+ // FlameCord - Create pipeline object to reduce redundancy
|
|
+ final ChannelPipeline pipeline = ch.pipeline();
|
|
+
|
|
+ Preconditions.checkState(ch.eventLoop().inEventLoop(), "cannot add handler outside of event loop");
|
|
+ // FlameCord - Dont flush if not necessary
|
|
+ // pipeline.flush();
|
|
+ pipeline.addBefore(baseName, name, handler);
|
|
}
|
|
|
|
- public Channel getHandle()
|
|
- {
|
|
+ public Channel getHandle() {
|
|
return ch;
|
|
}
|
|
|
|
- public void setCompressionThreshold(int compressionThreshold)
|
|
- {
|
|
- if ( ch.pipeline().get( PacketCompressor.class ) == null && compressionThreshold != -1 )
|
|
- {
|
|
- addBefore( PipelineUtils.PACKET_ENCODER, "compress", new PacketCompressor() );
|
|
+ public void setCompressionThreshold(int compressionThreshold) {
|
|
+ // FlameCord - Create pipeline object to reduce redundancy
|
|
+ final ChannelPipeline pipeline = ch.pipeline();
|
|
+
|
|
+ if (pipeline.get(PacketCompressor.class) == null && compressionThreshold != -1) {
|
|
+ addBefore(PipelineUtils.PACKET_ENCODER, "compress", new PacketCompressor());
|
|
}
|
|
- if ( compressionThreshold != -1 )
|
|
- {
|
|
- ch.pipeline().get( PacketCompressor.class ).setThreshold( compressionThreshold );
|
|
- } else
|
|
- {
|
|
- ch.pipeline().remove( "compress" );
|
|
+ if (compressionThreshold != -1) {
|
|
+ pipeline.get(PacketCompressor.class).setThreshold(compressionThreshold);
|
|
+ } else {
|
|
+ pipeline.remove("compress");
|
|
}
|
|
|
|
- if ( ch.pipeline().get( PacketDecompressor.class ) == null && compressionThreshold != -1 )
|
|
- {
|
|
- addBefore( PipelineUtils.PACKET_DECODER, "decompress", new PacketDecompressor(compressionThreshold) );
|
|
+ if (pipeline.get(PacketDecompressor.class) == null && compressionThreshold != -1) {
|
|
+ addBefore(PipelineUtils.PACKET_DECODER, "decompress", new PacketDecompressor(compressionThreshold));
|
|
}
|
|
- if ( compressionThreshold == -1 )
|
|
- {
|
|
- ch.pipeline().remove( "decompress" );
|
|
+ if (compressionThreshold == -1) {
|
|
+ pipeline.remove("decompress");
|
|
}
|
|
}
|
|
}
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/netty/HandlerBoss.java b/proxy/src/main/java/net/md_5/bungee/netty/HandlerBoss.java
|
|
index 989bfd87..687bf518 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/netty/HandlerBoss.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/netty/HandlerBoss.java
|
|
@@ -1,15 +1,22 @@
|
|
package net.md_5.bungee.netty;
|
|
|
|
+import java.io.IOException;
|
|
+import java.net.InetSocketAddress;
|
|
+import java.net.SocketAddress;
|
|
+import java.util.logging.Level;
|
|
+import java.util.logging.Logger;
|
|
+
|
|
import com.google.common.base.Preconditions;
|
|
+
|
|
+import dev._2lstudios.flamecord.FlameCord;
|
|
+import dev._2lstudios.flamecord.firewall.FirewallException;
|
|
+import io.netty.channel.Channel;
|
|
import io.netty.channel.ChannelHandlerContext;
|
|
import io.netty.channel.ChannelInboundHandlerAdapter;
|
|
import io.netty.handler.codec.CorruptedFrameException;
|
|
import io.netty.handler.codec.DecoderException;
|
|
import io.netty.handler.codec.haproxy.HAProxyMessage;
|
|
import io.netty.handler.timeout.ReadTimeoutException;
|
|
-import java.io.IOException;
|
|
-import java.net.InetSocketAddress;
|
|
-import java.util.logging.Level;
|
|
import net.md_5.bungee.api.ProxyServer;
|
|
import net.md_5.bungee.connection.CancelSendSignal;
|
|
import net.md_5.bungee.connection.InitialHandler;
|
|
@@ -24,164 +31,178 @@ import net.md_5.bungee.util.QuietException;
|
|
* channels to maintain simple states, and only call the required, adapted
|
|
* methods when the channel is connected.
|
|
*/
|
|
-public class HandlerBoss extends ChannelInboundHandlerAdapter
|
|
-{
|
|
+public class HandlerBoss extends ChannelInboundHandlerAdapter {
|
|
|
|
private ChannelWrapper channel;
|
|
private PacketHandler handler;
|
|
|
|
- public void setHandler(PacketHandler handler)
|
|
- {
|
|
- Preconditions.checkArgument( handler != null, "handler" );
|
|
+ public void setHandler(final PacketHandler handler) {
|
|
+ Preconditions.checkArgument(handler != null, "handler");
|
|
this.handler = handler;
|
|
}
|
|
|
|
@Override
|
|
- public void channelActive(ChannelHandlerContext ctx) throws Exception
|
|
- {
|
|
- if ( handler != null )
|
|
- {
|
|
- channel = new ChannelWrapper( ctx );
|
|
- handler.connected( channel );
|
|
-
|
|
- if ( !( handler instanceof InitialHandler || handler instanceof PingHandler ) )
|
|
- {
|
|
- ProxyServer.getInstance().getLogger().log( Level.INFO, "{0} has connected", handler );
|
|
+ public void channelActive(final ChannelHandlerContext ctx) throws Exception {
|
|
+ // FlameCord start - Firewall system
|
|
+ final SocketAddress remoteAddress = ctx.channel().remoteAddress();
|
|
+
|
|
+ if (remoteAddress != null && FlameCord.getInstance().getFirewallManager().isFirewalled(remoteAddress)) {
|
|
+ throw new FirewallException(remoteAddress);
|
|
+ }
|
|
+ // FlameCord end - Firewall system
|
|
+
|
|
+ if (handler != null) {
|
|
+ channel = new ChannelWrapper(ctx);
|
|
+ handler.connected(channel);
|
|
+ // FlameCord - Added isLoggerInitialhandler option
|
|
+ if (FlameCord.getInstance().getFlameCordConfiguration().isLoggerInitialhandler()
|
|
+ && !(handler instanceof InitialHandler || handler instanceof PingHandler)) {
|
|
+ ProxyServer.getInstance().getLogger().log(Level.INFO, "{0} has connected", handler);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void channelInactive(ChannelHandlerContext ctx) throws Exception
|
|
- {
|
|
- if ( handler != null )
|
|
- {
|
|
+ public void channelInactive(final ChannelHandlerContext ctx) throws Exception {
|
|
+ if (handler != null) {
|
|
channel.markClosed();
|
|
- handler.disconnected( channel );
|
|
-
|
|
- if ( !( handler instanceof InitialHandler || handler instanceof PingHandler ) )
|
|
- {
|
|
- ProxyServer.getInstance().getLogger().log( Level.INFO, "{0} has disconnected", handler );
|
|
+ handler.disconnected(channel);
|
|
+ // FlameCord - Added isLoggerInitialhandler option
|
|
+ if (FlameCord.getInstance().getFlameCordConfiguration().isLoggerInitialhandler()
|
|
+ && !(handler instanceof InitialHandler || handler instanceof PingHandler)) {
|
|
+ ProxyServer.getInstance().getLogger().log(Level.INFO, "{0} has disconnected", handler);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void channelWritabilityChanged(ChannelHandlerContext ctx) throws Exception
|
|
- {
|
|
- if ( handler != null )
|
|
- {
|
|
- handler.writabilityChanged( channel );
|
|
+ public void channelWritabilityChanged(final ChannelHandlerContext ctx) throws Exception {
|
|
+ if (handler != null) {
|
|
+ handler.writabilityChanged(channel);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception
|
|
- {
|
|
- if ( msg instanceof HAProxyMessage )
|
|
- {
|
|
- HAProxyMessage proxy = (HAProxyMessage) msg;
|
|
- InetSocketAddress newAddress = new InetSocketAddress( proxy.sourceAddress(), proxy.sourcePort() );
|
|
-
|
|
- ProxyServer.getInstance().getLogger().log( Level.FINE, "Set remote address via PROXY {0} -> {1}", new Object[]
|
|
- {
|
|
- channel.getRemoteAddress(), newAddress
|
|
- } );
|
|
-
|
|
- channel.setRemoteAddress( newAddress );
|
|
+ public void channelRead(final ChannelHandlerContext ctx, final Object msg) throws Exception {
|
|
+ // FlameCord - Apply astei patches
|
|
+ if (!ctx.channel().isActive()) {
|
|
return;
|
|
}
|
|
|
|
- if ( handler != null )
|
|
- {
|
|
- PacketWrapper packet = (PacketWrapper) msg;
|
|
- boolean sendPacket = handler.shouldHandle( packet );
|
|
- try
|
|
- {
|
|
- if ( sendPacket && packet.packet != null )
|
|
- {
|
|
- try
|
|
- {
|
|
- packet.packet.handle( handler );
|
|
- } catch ( CancelSendSignal ex )
|
|
- {
|
|
+ // FlameCord start - Firewall system
|
|
+ final SocketAddress remoteAddress = ctx.channel().remoteAddress();
|
|
+
|
|
+ if (remoteAddress != null && FlameCord.getInstance().getFirewallManager().isFirewalled(remoteAddress)) {
|
|
+ throw new FirewallException(remoteAddress);
|
|
+ }
|
|
+ // FlameCord end - Firewall system
|
|
+
|
|
+ if (msg instanceof HAProxyMessage) {
|
|
+ final HAProxyMessage proxy = (HAProxyMessage) msg;
|
|
+ final InetSocketAddress newAddress = new InetSocketAddress(proxy.sourceAddress(), proxy.sourcePort());
|
|
+
|
|
+ ProxyServer.getInstance().getLogger().log(Level.FINE, "Set remote address via PROXY {0} -> {1}",
|
|
+ new Object[] { channel.getRemoteAddress(), newAddress });
|
|
+
|
|
+ channel.setRemoteAddress(newAddress);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ if (handler != null) {
|
|
+ final PacketWrapper packet = (PacketWrapper) msg;
|
|
+ boolean sendPacket = handler.shouldHandle(packet);
|
|
+ try {
|
|
+ if (sendPacket && packet.packet != null) {
|
|
+ try {
|
|
+ packet.packet.handle(handler);
|
|
+ } catch (final CancelSendSignal ex) {
|
|
sendPacket = false;
|
|
}
|
|
}
|
|
- if ( sendPacket )
|
|
- {
|
|
- handler.handle( packet );
|
|
+ if (sendPacket) {
|
|
+ handler.handle(packet);
|
|
}
|
|
- } finally
|
|
- {
|
|
+ } finally {
|
|
packet.trySingleRelease();
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception
|
|
- {
|
|
- if ( ctx.channel().isActive() )
|
|
- {
|
|
- boolean logExceptions = !( handler instanceof PingHandler );
|
|
-
|
|
- if ( logExceptions )
|
|
- {
|
|
- if ( cause instanceof ReadTimeoutException )
|
|
- {
|
|
- ProxyServer.getInstance().getLogger().log( Level.WARNING, "{0} - read timed out", handler );
|
|
- } else if ( cause instanceof DecoderException )
|
|
- {
|
|
- if ( cause instanceof CorruptedFrameException )
|
|
- {
|
|
- ProxyServer.getInstance().getLogger().log( Level.WARNING, "{0} - corrupted frame: {1}", new Object[]
|
|
- {
|
|
- handler, cause.getMessage()
|
|
- } );
|
|
- } else if ( cause.getCause() instanceof BadPacketException )
|
|
- {
|
|
- ProxyServer.getInstance().getLogger().log( Level.WARNING, "{0} - bad packet ID, are mods in use!? {1}", new Object[]
|
|
- {
|
|
- handler, cause.getCause().getMessage()
|
|
- } );
|
|
- } else if ( cause.getCause() instanceof OverflowPacketException )
|
|
- {
|
|
- ProxyServer.getInstance().getLogger().log( Level.WARNING, "{0} - overflow in packet detected! {1}", new Object[]
|
|
- {
|
|
- handler, cause.getCause().getMessage()
|
|
- } );
|
|
+ public void exceptionCaught(final ChannelHandlerContext ctx, final Throwable cause) throws Exception {
|
|
+ final Channel channel = ctx.channel();
|
|
+
|
|
+ if (channel.isActive()) {
|
|
+ // FlameCord - Changed "ProxyServer.getInstance().getLogger()" to logger
|
|
+ final FlameCord flameCord = FlameCord.getInstance();
|
|
+ final Logger logger = ProxyServer.getInstance().getLogger();
|
|
+ final boolean logExceptions = flameCord.getFlameCordConfiguration().isLoggerExceptions();
|
|
+ // FlameCord - Show exceptions even if pinghandler
|
|
+ // && !(handler instanceof PingHandler);
|
|
+
|
|
+ // FlameCord - Firewall system
|
|
+ if (cause instanceof DecoderException || cause instanceof IllegalStateException
|
|
+ || cause instanceof BadPacketException) {
|
|
+ final SocketAddress remoteAddress = channel.remoteAddress();
|
|
+
|
|
+ if (remoteAddress != null) {
|
|
+ final Throwable causeCause = cause.getCause();
|
|
+
|
|
+ if (causeCause == null || !causeCause.getMessage().contains("TO_CLIENT")) {
|
|
+ flameCord.getFirewallManager().addFirewalled(remoteAddress);
|
|
}
|
|
- } else if ( cause instanceof IOException || ( cause instanceof IllegalStateException && handler instanceof InitialHandler ) )
|
|
- {
|
|
- ProxyServer.getInstance().getLogger().log( Level.WARNING, "{0} - {1}: {2}", new Object[]
|
|
- {
|
|
- handler, cause.getClass().getSimpleName(), cause.getMessage()
|
|
- } );
|
|
- } else if ( cause instanceof QuietException )
|
|
- {
|
|
- ProxyServer.getInstance().getLogger().log( Level.SEVERE, "{0} - encountered exception: {1}", new Object[]
|
|
- {
|
|
- handler, cause
|
|
- } );
|
|
- } else
|
|
- {
|
|
- ProxyServer.getInstance().getLogger().log( Level.SEVERE, handler + " - encountered exception", cause );
|
|
}
|
|
}
|
|
|
|
- if ( handler != null )
|
|
- {
|
|
- try
|
|
- {
|
|
- handler.exception( cause );
|
|
- } catch ( Exception ex )
|
|
- {
|
|
- ProxyServer.getInstance().getLogger().log( Level.SEVERE, handler + " - exception processing exception", ex );
|
|
+ if (logExceptions) {
|
|
+ if (cause instanceof ReadTimeoutException) {
|
|
+ logger.log(Level.WARNING, "{0} - read timed out", handler);
|
|
+ } else if (cause instanceof DecoderException) {
|
|
+ final Throwable causeCause = cause.getCause();
|
|
+
|
|
+ if (cause instanceof CorruptedFrameException) {
|
|
+ logger.log(Level.WARNING, "{0} - corrupted frame: {1}",
|
|
+ new Object[] { handler, cause.getMessage() });
|
|
+ } else if (causeCause instanceof BadPacketException) {
|
|
+ logger.log(Level.WARNING, "{0} - bad packet ID, are mods in use!? {1}",
|
|
+ new Object[] { handler, causeCause.getMessage() });
|
|
+ } else if (causeCause instanceof OverflowPacketException) {
|
|
+ logger.log(Level.WARNING, "{0} - overflow in packet detected! {1}",
|
|
+ new Object[] { handler, causeCause.getMessage() });
|
|
+ }
|
|
+ } else if (cause instanceof IOException
|
|
+ || (cause instanceof IllegalStateException && handler instanceof InitialHandler)) {
|
|
+ logger.log(Level.WARNING, "{0} - {1}: {2}",
|
|
+ new Object[] { handler, cause.getClass().getSimpleName(), cause.getMessage() });
|
|
+ } else if (cause instanceof QuietException) {
|
|
+ logger.log(Level.SEVERE, "{0} - encountered exception: {1}", new Object[] { handler, cause });
|
|
+ // FlameCord - Check that cause is not FirewallException (We will handle it
|
|
+ // later)
|
|
+ } else if (!(cause instanceof FirewallException)) {
|
|
+ logger.log(Level.SEVERE, handler + " - encountered exception", cause);
|
|
}
|
|
}
|
|
|
|
- ctx.close();
|
|
+ // FlameCord - Handle FirewallException
|
|
+ if (cause instanceof FirewallException) {
|
|
+ flameCord.getFirewallManager().logBlocked(channel.remoteAddress());
|
|
+ }
|
|
+
|
|
+ if (handler != null) {
|
|
+ try {
|
|
+ handler.exception(cause);
|
|
+ } catch (final Exception ex) {
|
|
+ if (logExceptions) {
|
|
+ logger.log(Level.SEVERE, handler + " - exception processing exception", ex);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ // FlameCord - Move ctx.close() outside just in case
|
|
+ // ctx.close();
|
|
}
|
|
+
|
|
+ // FlameCord - Move ctx.close() outside just in case
|
|
+ ctx.close();
|
|
}
|
|
}
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/netty/PipelineUtils.java b/proxy/src/main/java/net/md_5/bungee/netty/PipelineUtils.java
|
|
index 9a39f69e..5bbd0434 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/netty/PipelineUtils.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/netty/PipelineUtils.java
|
|
@@ -1,10 +1,19 @@
|
|
package net.md_5.bungee.netty;
|
|
|
|
+import java.net.SocketAddress;
|
|
+import java.util.concurrent.ThreadFactory;
|
|
+import java.util.concurrent.TimeUnit;
|
|
+import java.util.logging.Level;
|
|
+
|
|
import com.google.common.base.Preconditions;
|
|
+
|
|
+import dev._2lstudios.flamecord.FlameCord;
|
|
+import dev._2lstudios.flamecord.firewall.FirewallException;
|
|
import io.github.waterfallmc.waterfall.event.ConnectionInitEvent;
|
|
import io.netty.buffer.PooledByteBufAllocator;
|
|
import io.netty.channel.Channel;
|
|
import io.netty.channel.ChannelException;
|
|
+import io.netty.channel.ChannelHandlerContext;
|
|
import io.netty.channel.ChannelInitializer;
|
|
import io.netty.channel.ChannelOption;
|
|
import io.netty.channel.EventLoopGroup;
|
|
@@ -27,12 +36,9 @@ import io.netty.handler.codec.haproxy.HAProxyMessageDecoder;
|
|
import io.netty.handler.timeout.ReadTimeoutHandler;
|
|
import io.netty.util.AttributeKey;
|
|
import io.netty.util.internal.PlatformDependent;
|
|
-import java.net.SocketAddress;
|
|
-import java.util.concurrent.ThreadFactory;
|
|
-import java.util.concurrent.TimeUnit;
|
|
-import java.util.logging.Level;
|
|
import net.md_5.bungee.BungeeCord;
|
|
import net.md_5.bungee.BungeeServerInfo;
|
|
+import net.md_5.bungee.ConnectionThrottle;
|
|
import net.md_5.bungee.UserConnection;
|
|
import net.md_5.bungee.Util;
|
|
import net.md_5.bungee.api.ProxyServer;
|
|
@@ -47,61 +53,76 @@ import net.md_5.bungee.protocol.Protocol;
|
|
import net.md_5.bungee.protocol.Varint21FrameDecoder;
|
|
import net.md_5.bungee.protocol.Varint21LengthFieldPrepender;
|
|
|
|
-public class PipelineUtils
|
|
-{
|
|
+public class PipelineUtils {
|
|
|
|
public static final AttributeKey<ListenerInfo> LISTENER = AttributeKey.newInstance("ListerInfo");
|
|
public static final AttributeKey<UserConnection> USER = AttributeKey.newInstance("User");
|
|
public static final AttributeKey<BungeeServerInfo> TARGET = AttributeKey.newInstance("Target");
|
|
- public static final ChannelInitializer<Channel> SERVER_CHILD = new ChannelInitializer<Channel>()
|
|
- {
|
|
+ public static final ChannelInitializer<Channel> SERVER_CHILD = new ChannelInitializer<Channel>() {
|
|
@Override
|
|
- protected void initChannel(Channel ch) throws Exception
|
|
- {
|
|
- SocketAddress remoteAddress = ( ch.remoteAddress() == null ) ? ch.parent().localAddress() : ch.remoteAddress();
|
|
+ protected void initChannel(final Channel ch) throws Exception {
|
|
+ final SocketAddress remoteAddress = (ch.remoteAddress() == null) ? ch.parent().localAddress()
|
|
+ : ch.remoteAddress();
|
|
|
|
- if ( BungeeCord.getInstance().getConnectionThrottle() != null && BungeeCord.getInstance().getConnectionThrottle().throttle( remoteAddress ) )
|
|
- {
|
|
- ch.close();
|
|
- return;
|
|
+ // FlameCord start - Firewall system
|
|
+ if (remoteAddress != null && FlameCord.getInstance().getFirewallManager().isFirewalled(remoteAddress)) {
|
|
+ throw new FirewallException(remoteAddress);
|
|
}
|
|
- ListenerInfo listener = ch.attr( LISTENER ).get();
|
|
+ // FlameCord end - Firewall system
|
|
+ // FlameCord - Use connectionThrottle
|
|
+ final ConnectionThrottle connectionThrottle = BungeeCord.getInstance().getConnectionThrottle();
|
|
|
|
- if ( BungeeCord.getInstance().getPluginManager().callEvent( new ClientConnectEvent( remoteAddress, listener ) ).isCancelled() )
|
|
- {
|
|
+ if (connectionThrottle != null && connectionThrottle.throttle(remoteAddress)) {
|
|
ch.close();
|
|
return;
|
|
}
|
|
+ final ListenerInfo listener = ch.attr(LISTENER).get();
|
|
|
|
- ConnectionInitEvent connectionInitEvent = new ConnectionInitEvent(ch.remoteAddress(), listener, (result, throwable) -> { // Waterfall
|
|
-
|
|
- if (result.isCancelled()) {
|
|
+ if (BungeeCord.getInstance().getPluginManager().callEvent(new ClientConnectEvent(remoteAddress, listener))
|
|
+ .isCancelled()) {
|
|
ch.close();
|
|
return;
|
|
}
|
|
|
|
-
|
|
- try {
|
|
- BASE.initChannel( ch );
|
|
- } catch (Exception e) {
|
|
- e.printStackTrace();
|
|
- ch.close();
|
|
- return;
|
|
- }
|
|
- ch.pipeline().addBefore( FRAME_DECODER, LEGACY_DECODER, new LegacyDecoder() );
|
|
- ch.pipeline().addAfter( FRAME_DECODER, PACKET_DECODER, new MinecraftDecoder( Protocol.HANDSHAKE, true, ProxyServer.getInstance().getProtocolVersion() ) );
|
|
- ch.pipeline().addAfter( FRAME_PREPENDER, PACKET_ENCODER, new MinecraftEncoder( Protocol.HANDSHAKE, true, ProxyServer.getInstance().getProtocolVersion() ) );
|
|
- ch.pipeline().addBefore( FRAME_PREPENDER, LEGACY_KICKER, legacyKicker );
|
|
- ch.pipeline().get( HandlerBoss.class ).setHandler( new InitialHandler( BungeeCord.getInstance(), listener ) );
|
|
-
|
|
- if ( listener.isProxyProtocol() )
|
|
- {
|
|
- ch.pipeline().addFirst( new HAProxyMessageDecoder() );
|
|
- }
|
|
- }); // Waterfall
|
|
+ final ConnectionInitEvent connectionInitEvent = new ConnectionInitEvent(ch.remoteAddress(), listener,
|
|
+ (result, throwable) -> { // Waterfall
|
|
+
|
|
+ if (result.isCancelled()) {
|
|
+ ch.close();
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ try {
|
|
+ BASE.initChannel(ch);
|
|
+ } catch (final Exception e) {
|
|
+ e.printStackTrace();
|
|
+ ch.close();
|
|
+ return;
|
|
+ }
|
|
+ // FlameCord - Use protocolVersion
|
|
+ final int protocolVersion = ProxyServer.getInstance().getProtocolVersion();
|
|
+ ch.pipeline().addBefore(FRAME_DECODER, LEGACY_DECODER, new LegacyDecoder());
|
|
+ ch.pipeline().addAfter(FRAME_DECODER, PACKET_DECODER,
|
|
+ new MinecraftDecoder(Protocol.HANDSHAKE, true, protocolVersion));
|
|
+ ch.pipeline().addAfter(FRAME_PREPENDER, PACKET_ENCODER,
|
|
+ new MinecraftEncoder(Protocol.HANDSHAKE, true, protocolVersion));
|
|
+ ch.pipeline().addBefore(FRAME_PREPENDER, LEGACY_KICKER, legacyKicker);
|
|
+ ch.pipeline().get(HandlerBoss.class)
|
|
+ .setHandler(new InitialHandler(BungeeCord.getInstance(), listener));
|
|
+
|
|
+ if (listener.isProxyProtocol()) {
|
|
+ ch.pipeline().addFirst(new HAProxyMessageDecoder());
|
|
+ }
|
|
+ }); // Waterfall
|
|
|
|
BungeeCord.getInstance().getPluginManager().callEvent(connectionInitEvent);
|
|
}
|
|
+
|
|
+ // FlameCord - Catch exceptions
|
|
+ @Override
|
|
+ public void exceptionCaught(final ChannelHandlerContext ctx, final Throwable cause) throws Exception {
|
|
+ ctx.close();
|
|
+ }
|
|
};
|
|
public static final Base BASE = new Base();
|
|
private static final KickStringWriter legacyKicker = new KickStringWriter();
|
|
@@ -119,32 +140,26 @@ public class PipelineUtils
|
|
|
|
private static boolean epoll;
|
|
|
|
- static
|
|
- {
|
|
- if ( !PlatformDependent.isWindows() && Boolean.parseBoolean( System.getProperty( "bungee.epoll", "true" ) ) )
|
|
- {
|
|
- ProxyServer.getInstance().getLogger().info( "Not on Windows, attempting to use enhanced EpollEventLoop" );
|
|
-
|
|
- if ( epoll = Epoll.isAvailable() )
|
|
- {
|
|
- ProxyServer.getInstance().getLogger().info( "Epoll is working, utilising it!" );
|
|
- } else
|
|
- {
|
|
- ProxyServer.getInstance().getLogger().log( Level.WARNING, "Epoll is not working, falling back to NIO: {0}", Util.exception( Epoll.unavailabilityCause() ) );
|
|
+ static {
|
|
+ if (!PlatformDependent.isWindows() && Boolean.parseBoolean(System.getProperty("bungee.epoll", "true"))) {
|
|
+ ProxyServer.getInstance().getLogger().info("Not on Windows, attempting to use enhanced EpollEventLoop");
|
|
+
|
|
+ if (epoll = Epoll.isAvailable()) {
|
|
+ ProxyServer.getInstance().getLogger().info("Epoll is working, utilising it!");
|
|
+ } else {
|
|
+ ProxyServer.getInstance().getLogger().log(Level.WARNING,
|
|
+ "Epoll is not working, falling back to NIO: {0}", Util.exception(Epoll.unavailabilityCause()));
|
|
}
|
|
}
|
|
}
|
|
|
|
- public static EventLoopGroup newEventLoopGroup(int threads, ThreadFactory factory)
|
|
- {
|
|
- return epoll ? new EpollEventLoopGroup( threads, factory ) : new NioEventLoopGroup( threads, factory );
|
|
+ public static EventLoopGroup newEventLoopGroup(final int threads, final ThreadFactory factory) {
|
|
+ return epoll ? new EpollEventLoopGroup(threads, factory) : new NioEventLoopGroup(threads, factory);
|
|
}
|
|
|
|
- public static Class<? extends ServerChannel> getServerChannel(SocketAddress address)
|
|
- {
|
|
- if ( address instanceof DomainSocketAddress )
|
|
- {
|
|
- Preconditions.checkState( epoll, "Epoll required to have UNIX sockets" );
|
|
+ public static Class<? extends ServerChannel> getServerChannel(final SocketAddress address) {
|
|
+ if (address instanceof DomainSocketAddress) {
|
|
+ Preconditions.checkState(epoll, "Epoll required to have UNIX sockets");
|
|
|
|
return EpollServerDomainSocketChannel.class;
|
|
}
|
|
@@ -152,11 +167,9 @@ public class PipelineUtils
|
|
return epoll ? EpollServerSocketChannel.class : NioServerSocketChannel.class;
|
|
}
|
|
|
|
- public static Class<? extends Channel> getChannel(SocketAddress address)
|
|
- {
|
|
- if ( address instanceof DomainSocketAddress )
|
|
- {
|
|
- Preconditions.checkState( epoll, "Epoll required to have UNIX sockets" );
|
|
+ public static Class<? extends Channel> getChannel(final SocketAddress address) {
|
|
+ if (address instanceof DomainSocketAddress) {
|
|
+ Preconditions.checkState(epoll, "Epoll required to have UNIX sockets");
|
|
|
|
return EpollDomainSocketChannel.class;
|
|
}
|
|
@@ -164,37 +177,32 @@ public class PipelineUtils
|
|
return epoll ? EpollSocketChannel.class : NioSocketChannel.class;
|
|
}
|
|
|
|
- public static Class<? extends DatagramChannel> getDatagramChannel()
|
|
- {
|
|
+ public static Class<? extends DatagramChannel> getDatagramChannel() {
|
|
return epoll ? EpollDatagramChannel.class : NioDatagramChannel.class;
|
|
}
|
|
|
|
- private static final int LOW_MARK = Integer.getInteger( "net.md_5.bungee.low_mark", 2 << 18 ); // 0.5 mb
|
|
- private static final int HIGH_MARK = Integer.getInteger( "net.md_5.bungee.high_mark", 2 << 20 ); // 2 mb
|
|
- private static final WriteBufferWaterMark MARK = new WriteBufferWaterMark( LOW_MARK, HIGH_MARK );
|
|
-
|
|
- public static final class Base extends ChannelInitializer<Channel>
|
|
- {
|
|
+ private static final int LOW_MARK = Integer.getInteger("net.md_5.bungee.low_mark", 2 << 18); // 0.5 mb
|
|
+ private static final int HIGH_MARK = Integer.getInteger("net.md_5.bungee.high_mark", 2 << 20); // 2 mb
|
|
+ private static final WriteBufferWaterMark MARK = new WriteBufferWaterMark(LOW_MARK, HIGH_MARK);
|
|
|
|
+ public static final class Base extends ChannelInitializer<Channel> {
|
|
@Override
|
|
- public void initChannel(Channel ch) throws Exception
|
|
- {
|
|
- try
|
|
- {
|
|
- ch.config().setOption( ChannelOption.IP_TOS, 0x18 );
|
|
- } catch ( ChannelException ex )
|
|
- {
|
|
+ public void initChannel(final Channel ch) throws Exception {
|
|
+ try {
|
|
+ ch.config().setOption(ChannelOption.IP_TOS, 0x18);
|
|
+ } catch (final ChannelException ex) {
|
|
// IP_TOS is not supported (Windows XP / Windows Server 2003)
|
|
}
|
|
- ch.config().setOption( ChannelOption.TCP_NODELAY, true );
|
|
- ch.config().setAllocator( PooledByteBufAllocator.DEFAULT );
|
|
- ch.config().setWriteBufferWaterMark( MARK );
|
|
+ ch.config().setOption(ChannelOption.TCP_NODELAY, true);
|
|
+ ch.config().setAllocator(PooledByteBufAllocator.DEFAULT);
|
|
+ ch.config().setWriteBufferWaterMark(MARK);
|
|
|
|
- ch.pipeline().addLast( TIMEOUT_HANDLER, new ReadTimeoutHandler( BungeeCord.getInstance().config.getTimeout(), TimeUnit.MILLISECONDS ) );
|
|
- ch.pipeline().addLast( FRAME_DECODER, new Varint21FrameDecoder() );
|
|
- ch.pipeline().addLast( FRAME_PREPENDER, framePrepender );
|
|
+ ch.pipeline().addLast(TIMEOUT_HANDLER,
|
|
+ new ReadTimeoutHandler(BungeeCord.getInstance().config.getTimeout(), TimeUnit.MILLISECONDS));
|
|
+ ch.pipeline().addLast(FRAME_DECODER, new Varint21FrameDecoder());
|
|
+ ch.pipeline().addLast(FRAME_PREPENDER, framePrepender);
|
|
|
|
- ch.pipeline().addLast( BOSS_HANDLER, new HandlerBoss() );
|
|
+ ch.pipeline().addLast(BOSS_HANDLER, new HandlerBoss());
|
|
}
|
|
}
|
|
}
|
|
diff --git a/proxy/src/main/java/net/md_5/bungee/scheduler/BungeeScheduler.java b/proxy/src/main/java/net/md_5/bungee/scheduler/BungeeScheduler.java
|
|
index fd0dabcf..c0e28d91 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/scheduler/BungeeScheduler.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/scheduler/BungeeScheduler.java
|
|
@@ -16,98 +16,83 @@ import net.md_5.bungee.api.plugin.Plugin;
|
|
import net.md_5.bungee.api.scheduler.ScheduledTask;
|
|
import net.md_5.bungee.api.scheduler.TaskScheduler;
|
|
|
|
-public class BungeeScheduler implements TaskScheduler
|
|
-{
|
|
+public class BungeeScheduler implements TaskScheduler {
|
|
|
|
private final Object lock = new Object();
|
|
private final AtomicInteger taskCounter = new AtomicInteger();
|
|
- private final TIntObjectMap<BungeeTask> tasks = TCollections.synchronizedMap( new TIntObjectHashMap<BungeeTask>() );
|
|
- private final Multimap<Plugin, BungeeTask> tasksByPlugin = Multimaps.synchronizedMultimap( HashMultimap.<Plugin, BungeeTask>create() );
|
|
+ private final TIntObjectMap<BungeeTask> tasks = TCollections.synchronizedMap(new TIntObjectHashMap<BungeeTask>());
|
|
+ private final Multimap<Plugin, BungeeTask> tasksByPlugin = Multimaps
|
|
+ .synchronizedMultimap(HashMultimap.<Plugin, BungeeTask>create());
|
|
//
|
|
- private final Unsafe unsafe = new Unsafe()
|
|
- {
|
|
+ private final Unsafe unsafe = new Unsafe() {
|
|
|
|
@Override
|
|
- public ExecutorService getExecutorService(Plugin plugin)
|
|
- {
|
|
+ public ExecutorService getExecutorService(Plugin plugin) {
|
|
return plugin.getExecutorService();
|
|
}
|
|
};
|
|
|
|
@Override
|
|
- public void cancel(int id)
|
|
- {
|
|
- BungeeTask task = tasks.get( id );
|
|
- Preconditions.checkArgument( task != null, "No task with id %s", id );
|
|
+ public void cancel(int id) {
|
|
+ BungeeTask task = tasks.get(id);
|
|
+ Preconditions.checkArgument(task != null, "No task with id %s", id);
|
|
|
|
task.cancel();
|
|
}
|
|
|
|
- void cancel0(BungeeTask task)
|
|
- {
|
|
- synchronized ( lock )
|
|
- {
|
|
- tasks.remove( task.getId() );
|
|
- tasksByPlugin.values().remove( task );
|
|
+ void cancel0(BungeeTask task) {
|
|
+ synchronized (lock) {
|
|
+ tasks.remove(task.getId());
|
|
+ tasksByPlugin.values().remove(task);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
- public void cancel(ScheduledTask task)
|
|
- {
|
|
+ public void cancel(ScheduledTask task) {
|
|
task.cancel();
|
|
}
|
|
|
|
@Override
|
|
- public int cancel(Plugin plugin)
|
|
- {
|
|
+ public int cancel(Plugin plugin) {
|
|
Set<ScheduledTask> toRemove = new HashSet<>();
|
|
- synchronized ( lock )
|
|
- {
|
|
- for ( ScheduledTask task : tasksByPlugin.get( plugin ) )
|
|
- {
|
|
- toRemove.add( task );
|
|
+ synchronized (lock) {
|
|
+ for (ScheduledTask task : tasksByPlugin.get(plugin)) {
|
|
+ toRemove.add(task);
|
|
}
|
|
}
|
|
- for ( ScheduledTask task : toRemove )
|
|
- {
|
|
- cancel( task );
|
|
+ for (ScheduledTask task : toRemove) {
|
|
+ cancel(task);
|
|
}
|
|
return toRemove.size();
|
|
}
|
|
|
|
@Override
|
|
- public ScheduledTask runAsync(Plugin owner, Runnable task)
|
|
- {
|
|
- return schedule( owner, task, 0, TimeUnit.MILLISECONDS );
|
|
+ public ScheduledTask runAsync(Plugin owner, Runnable task) {
|
|
+ return schedule(owner, task, 0, TimeUnit.MILLISECONDS);
|
|
}
|
|
|
|
@Override
|
|
- public ScheduledTask schedule(Plugin owner, Runnable task, long delay, TimeUnit unit)
|
|
- {
|
|
- return schedule( owner, task, delay, 0, unit );
|
|
+ public ScheduledTask schedule(Plugin owner, Runnable task, long delay, TimeUnit unit) {
|
|
+ return schedule(owner, task, delay, 0, unit);
|
|
}
|
|
|
|
@Override
|
|
- public ScheduledTask schedule(Plugin owner, Runnable task, long delay, long period, TimeUnit unit)
|
|
- {
|
|
- Preconditions.checkNotNull( owner, "owner" );
|
|
- Preconditions.checkNotNull( task, "task" );
|
|
- BungeeTask prepared = new BungeeTask( this, taskCounter.getAndIncrement(), owner, task, delay, period, unit );
|
|
+ public ScheduledTask schedule(Plugin owner, Runnable task, long delay, long period, TimeUnit unit) {
|
|
+ Preconditions.checkNotNull(owner, "owner");
|
|
+ Preconditions.checkNotNull(task, "task");
|
|
+ BungeeTask prepared = new BungeeTask(this, taskCounter.getAndIncrement(), owner, task, delay, period, unit);
|
|
|
|
- synchronized ( lock )
|
|
- {
|
|
- tasks.put( prepared.getId(), prepared );
|
|
- tasksByPlugin.put( owner, prepared );
|
|
+ synchronized (lock) {
|
|
+ tasks.put(prepared.getId(), prepared);
|
|
+ tasksByPlugin.put(owner, prepared);
|
|
}
|
|
|
|
- owner.getExecutorService().execute( prepared );
|
|
+ owner.getExecutorService().execute(prepared);
|
|
return prepared;
|
|
}
|
|
|
|
@Override
|
|
- public Unsafe unsafe()
|
|
- {
|
|
+ public Unsafe unsafe() {
|
|
return unsafe;
|
|
}
|
|
}
|
|
diff --git a/proxy/src/test/java/net/md_5/bungee/scheduler/SchedulerTest.java b/proxy/src/test/java/net/md_5/bungee/scheduler/SchedulerTest.java
|
|
index 25ac3729..b2e1d809 100644
|
|
--- a/proxy/src/test/java/net/md_5/bungee/scheduler/SchedulerTest.java
|
|
+++ b/proxy/src/test/java/net/md_5/bungee/scheduler/SchedulerTest.java
|
|
@@ -9,78 +9,69 @@ import net.md_5.bungee.api.scheduler.TaskScheduler;
|
|
import org.junit.Assert;
|
|
import org.junit.Test;
|
|
|
|
-public class SchedulerTest
|
|
-{
|
|
+public class SchedulerTest {
|
|
|
|
@Test
|
|
- public void testRun() throws InterruptedException
|
|
- {
|
|
+ public void testRun() throws InterruptedException {
|
|
TaskScheduler scheduler = new BungeeScheduler();
|
|
|
|
- final CountDownLatch latch = new CountDownLatch( 1 );
|
|
+ final CountDownLatch latch = new CountDownLatch(1);
|
|
|
|
- scheduler.runAsync( DummyPlugin.INSTANCE, new Runnable()
|
|
- {
|
|
+ scheduler.runAsync(DummyPlugin.INSTANCE, new Runnable() {
|
|
|
|
@Override
|
|
- public void run()
|
|
- {
|
|
+ public void run() {
|
|
latch.countDown();
|
|
}
|
|
- } );
|
|
+ });
|
|
|
|
- latch.await( 5, TimeUnit.SECONDS );
|
|
+ latch.await(5, TimeUnit.SECONDS);
|
|
|
|
- Assert.assertEquals( 0, latch.getCount() );
|
|
+ Assert.assertEquals(0, latch.getCount());
|
|
}
|
|
|
|
@Test
|
|
- public void testCancel() throws InterruptedException
|
|
- {
|
|
+ public void testCancel() throws InterruptedException {
|
|
TaskScheduler scheduler = new BungeeScheduler();
|
|
AtomicBoolean b = new AtomicBoolean();
|
|
|
|
- ScheduledTask task = setup( scheduler, b );
|
|
- scheduler.cancel( task.getId() );
|
|
- Thread.sleep( 250 );
|
|
- Assert.assertFalse( b.get() );
|
|
+ ScheduledTask task = setup(scheduler, b);
|
|
+ scheduler.cancel(task.getId());
|
|
+ Thread.sleep(250);
|
|
+ Assert.assertFalse(b.get());
|
|
|
|
- task = setup( scheduler, b );
|
|
- scheduler.cancel( task );
|
|
- Thread.sleep( 250 );
|
|
- Assert.assertFalse( b.get() );
|
|
+ task = setup(scheduler, b);
|
|
+ scheduler.cancel(task);
|
|
+ Thread.sleep(250);
|
|
+ Assert.assertFalse(b.get());
|
|
|
|
- task = setup( scheduler, b );
|
|
- scheduler.cancel( task.getOwner() );
|
|
- Thread.sleep( 250 );
|
|
- Assert.assertFalse( b.get() );
|
|
+ task = setup(scheduler, b);
|
|
+ scheduler.cancel(task.getOwner());
|
|
+ Thread.sleep(250);
|
|
+ Assert.assertFalse(b.get());
|
|
}
|
|
|
|
@Test
|
|
- public void testScheduleAndRepeat() throws InterruptedException
|
|
- {
|
|
+ public void testScheduleAndRepeat() throws InterruptedException {
|
|
TaskScheduler scheduler = new BungeeScheduler();
|
|
AtomicBoolean b = new AtomicBoolean();
|
|
|
|
- setup( scheduler, b );
|
|
- Thread.sleep( 250 );
|
|
- Assert.assertTrue( b.get() );
|
|
+ setup(scheduler, b);
|
|
+ Thread.sleep(250);
|
|
+ Assert.assertTrue(b.get());
|
|
|
|
- b.set( false );
|
|
- Thread.sleep( 250 );
|
|
- Assert.assertTrue( b.get() );
|
|
+ b.set(false);
|
|
+ Thread.sleep(250);
|
|
+ Assert.assertTrue(b.get());
|
|
}
|
|
|
|
- private ScheduledTask setup(TaskScheduler scheduler, final AtomicBoolean hasRun)
|
|
- {
|
|
- return scheduler.schedule( DummyPlugin.INSTANCE, new Runnable()
|
|
- {
|
|
+ private ScheduledTask setup(TaskScheduler scheduler, final AtomicBoolean hasRun) {
|
|
+ return scheduler.schedule(DummyPlugin.INSTANCE, new Runnable() {
|
|
|
|
@Override
|
|
- public void run()
|
|
- {
|
|
- hasRun.set( true );
|
|
+ public void run() {
|
|
+ hasRun.set(true);
|
|
}
|
|
- }, 100, 100, TimeUnit.MILLISECONDS );
|
|
+ }, 100, 100, TimeUnit.MILLISECONDS);
|
|
}
|
|
}
|
|
diff --git a/query/.factorypath b/query/.factorypath
|
|
new file mode 100644
|
|
index 00000000..ec9b7ffd
|
|
--- /dev/null
|
|
+++ b/query/.factorypath
|
|
@@ -0,0 +1,17 @@
|
|
+<factorypath>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport/4.1.51.Final/netty-transport-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-common/4.1.51.Final/netty-common-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-buffer/4.1.51.Final/netty-buffer-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-resolver/4.1.51.Final/netty-resolver-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/gson/gson/2.8.0/gson-2.8.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/md-5/brigadier/1.0.16-SNAPSHOT/brigadier-1.0.16-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-codec/4.1.51.Final/netty-codec-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/net/sf/trove4j/core/3.1.0/core-3.1.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/se/llbit/jo-nbt/1.3.0/jo-nbt-1.3.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/io/netty/netty-transport-native-unix-common/4.1.51.Final/netty-transport-native-unix-common-4.1.51.Final.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/yaml/snakeyaml/1.25/snakeyaml-1.25.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/guava/guava/21.0/guava-21.0.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/com/google/code/findbugs/findbugs-annotations/3.0.1/findbugs-annotations-3.0.1.jar" enabled="true" runInBatchMode="false"/>
|
|
+ <factorypathentry kind="VARJAR" id="M2_REPO/org/projectlombok/lombok/1.18.10/lombok-1.18.10.jar" enabled="true" runInBatchMode="false"/>
|
|
+</factorypath>
|
|
diff --git a/query/pom.xml b/query/pom.xml
|
|
index 0f2ea00b..d52240f5 100644
|
|
--- a/query/pom.xml
|
|
+++ b/query/pom.xml
|
|
@@ -1,6 +1,5 @@
|
|
-
|
|
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
+<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
<modelVersion>4.0.0</modelVersion>
|
|
|
|
<parent>
|
|
diff --git a/query/src/main/java/net/md_5/bungee/query/QueryHandler.java b/query/src/main/java/net/md_5/bungee/query/QueryHandler.java
|
|
index 0c1ecfb8..1e8169d0 100644
|
|
--- a/query/src/main/java/net/md_5/bungee/query/QueryHandler.java
|
|
+++ b/query/src/main/java/net/md_5/bungee/query/QueryHandler.java
|
|
@@ -24,161 +24,146 @@ import net.md_5.bungee.api.config.ListenerInfo;
|
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
|
|
|
@RequiredArgsConstructor
|
|
-public class QueryHandler extends SimpleChannelInboundHandler<DatagramPacket>
|
|
-{
|
|
+public class QueryHandler extends SimpleChannelInboundHandler<DatagramPacket> {
|
|
|
|
private final ProxyServer bungee;
|
|
private final ListenerInfo listener;
|
|
- /*========================================================================*/
|
|
+ /* ======================================================================== */
|
|
private final Random random = new Random();
|
|
- private final Cache<InetAddress, QuerySession> sessions = CacheBuilder.newBuilder().expireAfterWrite( 30, TimeUnit.SECONDS ).build();
|
|
- private static io.github.waterfallmc.waterfall.utils.FastException cachedNoSessionException = new io.github.waterfallmc.waterfall.utils.FastException("No Session!");
|
|
+ private final Cache<InetAddress, QuerySession> sessions = CacheBuilder.newBuilder()
|
|
+ .expireAfterWrite(30, TimeUnit.SECONDS).build();
|
|
+ private static io.github.waterfallmc.waterfall.utils.FastException cachedNoSessionException = new io.github.waterfallmc.waterfall.utils.FastException(
|
|
+ "No Session!");
|
|
|
|
- private void writeShort(ByteBuf buf, int s)
|
|
- {
|
|
- buf.writeShortLE( s );
|
|
+ private void writeShort(ByteBuf buf, int s) {
|
|
+ buf.writeShortLE(s);
|
|
}
|
|
|
|
- private void writeNumber(ByteBuf buf, int i)
|
|
- {
|
|
- writeString( buf, Integer.toString( i ) );
|
|
+ private void writeNumber(ByteBuf buf, int i) {
|
|
+ writeString(buf, Integer.toString(i));
|
|
}
|
|
|
|
- private void writeString(ByteBuf buf, String s)
|
|
- {
|
|
- for ( char c : s.toCharArray() )
|
|
- {
|
|
- buf.writeByte( c );
|
|
+ private void writeString(ByteBuf buf, String s) {
|
|
+ for (char c : s.toCharArray()) {
|
|
+ buf.writeByte(c);
|
|
}
|
|
- buf.writeByte( 0x00 );
|
|
+ buf.writeByte(0x00);
|
|
}
|
|
|
|
@Override
|
|
- protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) throws Exception
|
|
- {
|
|
- try
|
|
- {
|
|
- handleMessage( ctx, msg );
|
|
- } catch ( Throwable t )
|
|
- {
|
|
- bungee.getLogger().log( Level.WARNING, "Error whilst handling query packet from " + msg.sender(), t );
|
|
+ protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) throws Exception {
|
|
+ try {
|
|
+ handleMessage(ctx, msg);
|
|
+ } catch (Throwable t) {
|
|
+ bungee.getLogger().log(Level.WARNING, "Error whilst handling query packet from " + msg.sender(), t);
|
|
}
|
|
}
|
|
|
|
- private void handleMessage(ChannelHandlerContext ctx, DatagramPacket msg)
|
|
- {
|
|
+ private void handleMessage(ChannelHandlerContext ctx, DatagramPacket msg) {
|
|
ByteBuf in = msg.content();
|
|
- if ( in.readUnsignedByte() != 0xFE || in.readUnsignedByte() != 0xFD )
|
|
- {
|
|
- bungee.getLogger().log( Level.WARNING, "Query - Incorrect magic!: {0}", msg.sender() );
|
|
+ if (in.readUnsignedByte() != 0xFE || in.readUnsignedByte() != 0xFD) {
|
|
+ // FlameCord - Close on Incorrect Magic
|
|
+ bungee.getLogger().log(Level.WARNING, "Query - Incorrect magic!: {0}", msg.sender());
|
|
+ ctx.close();
|
|
return;
|
|
}
|
|
|
|
ByteBuf out = ctx.alloc().buffer();
|
|
- AddressedEnvelope response = new DatagramPacket( out, msg.sender() );
|
|
+ AddressedEnvelope response = new DatagramPacket(out, msg.sender());
|
|
|
|
byte type = in.readByte();
|
|
int sessionId = in.readInt();
|
|
|
|
- if ( type == 0x09 )
|
|
- {
|
|
- out.writeByte( 0x09 );
|
|
- out.writeInt( sessionId );
|
|
+ if (type == 0x09) {
|
|
+ out.writeByte(0x09);
|
|
+ out.writeInt(sessionId);
|
|
|
|
int challengeToken = random.nextInt();
|
|
- sessions.put( msg.sender().getAddress(), new QuerySession( challengeToken, System.currentTimeMillis() ) );
|
|
+ sessions.put(msg.sender().getAddress(), new QuerySession(challengeToken, System.currentTimeMillis()));
|
|
|
|
- writeNumber( out, challengeToken );
|
|
+ writeNumber(out, challengeToken);
|
|
}
|
|
|
|
- if ( type == 0x00 )
|
|
- {
|
|
+ if (type == 0x00) {
|
|
int challengeToken = in.readInt();
|
|
- QuerySession session = sessions.getIfPresent( msg.sender().getAddress() );
|
|
- if ( session == null || session.getToken() != challengeToken )
|
|
- {
|
|
+ QuerySession session = sessions.getIfPresent(msg.sender().getAddress());
|
|
+ if (session == null || session.getToken() != challengeToken) {
|
|
throw cachedNoSessionException; // Waterfall
|
|
}
|
|
|
|
// Waterfall start
|
|
- List<String> players = bungee.getPlayers().stream().map(ProxiedPlayer::getName).collect(Collectors.toList());
|
|
+ List<String> players = bungee.getPlayers().stream().map(ProxiedPlayer::getName)
|
|
+ .collect(Collectors.toList());
|
|
|
|
- ProxyQueryEvent event = new ProxyQueryEvent(listener, new QueryResult(listener.getMotd(), "SMP", "Waterfall_Proxy",
|
|
- bungee.getOnlineCount(), listener.getMaxPlayers(), listener.getHost().getPort(),
|
|
- listener.getHost().getHostString(), "MINECRAFT", players, bungee.getGameVersion()));
|
|
+ ProxyQueryEvent event = new ProxyQueryEvent(listener,
|
|
+ new QueryResult(listener.getMotd(), "SMP", "Waterfall_Proxy", bungee.getOnlineCount(),
|
|
+ listener.getMaxPlayers(), listener.getHost().getPort(), listener.getHost().getHostString(),
|
|
+ "MINECRAFT", players, bungee.getGameVersion()));
|
|
QueryResult result = bungee.getPluginManager().callEvent(event).getResult();
|
|
// Waterfall end
|
|
|
|
- out.writeByte( 0x00 );
|
|
- out.writeInt( sessionId );
|
|
+ out.writeByte(0x00);
|
|
+ out.writeInt(sessionId);
|
|
|
|
- if ( in.readableBytes() == 0 )
|
|
- {
|
|
+ if (in.readableBytes() == 0) {
|
|
// Short response
|
|
// Waterfall start
|
|
- writeString( out, result.getMotd() ); // MOTD
|
|
- writeString( out, result.getGameType() ); // Game Type
|
|
- writeString( out, result.getWorldName() ); // World Name
|
|
- writeNumber( out, result.getOnlinePlayers() ); // Online Count
|
|
- writeNumber( out, result.getMaxPlayers() ); // Max Players
|
|
- writeShort( out, result.getPort() ); // Port
|
|
- writeString( out, result.getAddress() ); // IP
|
|
+ writeString(out, result.getMotd()); // MOTD
|
|
+ writeString(out, result.getGameType()); // Game Type
|
|
+ writeString(out, result.getWorldName()); // World Name
|
|
+ writeNumber(out, result.getOnlinePlayers()); // Online Count
|
|
+ writeNumber(out, result.getMaxPlayers()); // Max Players
|
|
+ writeShort(out, result.getPort()); // Port
|
|
+ writeString(out, result.getAddress()); // IP
|
|
// Waterfall end
|
|
- } else if ( in.readableBytes() == 4 )
|
|
- {
|
|
+ } else if (in.readableBytes() == 4) {
|
|
// Long Response
|
|
- out.writeBytes( new byte[]
|
|
- {
|
|
- 0x73, 0x70, 0x6C, 0x69, 0x74, 0x6E, 0x75, 0x6D, 0x00, (byte) 0x80, 0x00
|
|
- } );
|
|
+ out.writeBytes(new byte[] { 0x73, 0x70, 0x6C, 0x69, 0x74, 0x6E, 0x75, 0x6D, 0x00, (byte) 0x80, 0x00 });
|
|
Map<String, String> data = new LinkedHashMap<>();
|
|
|
|
// Waterfall start
|
|
- data.put( "hostname", result.getMotd() );
|
|
- data.put( "gametype", result.getGameType() );
|
|
+ data.put("hostname", result.getMotd());
|
|
+ data.put("gametype", result.getGameType());
|
|
// Start Extra Info
|
|
- data.put( "game_id", result.getGameId() );
|
|
- data.put( "version", result.getVersion() );
|
|
- data.put( "plugins", "" ); // TODO: Allow population?
|
|
+ data.put("game_id", result.getGameId());
|
|
+ data.put("version", result.getVersion());
|
|
+ data.put("plugins", ""); // TODO: Allow population?
|
|
// End Extra Info
|
|
- data.put( "map", result.getWorldName() );
|
|
- data.put( "numplayers", Integer.toString( result.getOnlinePlayers() ) );
|
|
- data.put( "maxplayers", Integer.toString( result.getMaxPlayers() ) );
|
|
- data.put( "hostport", Integer.toString( result.getPort() ) );
|
|
- data.put( "hostip", result.getAddress() );
|
|
+ data.put("map", result.getWorldName());
|
|
+ data.put("numplayers", Integer.toString(result.getOnlinePlayers()));
|
|
+ data.put("maxplayers", Integer.toString(result.getMaxPlayers()));
|
|
+ data.put("hostport", Integer.toString(result.getPort()));
|
|
+ data.put("hostip", result.getAddress());
|
|
// Waterfall end
|
|
|
|
- for ( Map.Entry<String, String> entry : data.entrySet() )
|
|
- {
|
|
- writeString( out, entry.getKey() );
|
|
- writeString( out, entry.getValue() );
|
|
+ for (Map.Entry<String, String> entry : data.entrySet()) {
|
|
+ writeString(out, entry.getKey());
|
|
+ writeString(out, entry.getValue());
|
|
}
|
|
- out.writeByte( 0x00 ); // Null
|
|
+ out.writeByte(0x00); // Null
|
|
|
|
// Padding
|
|
- writeString( out, "\01player_\00" );
|
|
+ writeString(out, "\01player_\00");
|
|
// Player List
|
|
result.getPlayers().stream().forEach(p -> writeString(out, p)); // Waterfall
|
|
- out.writeByte( 0x00 ); // Null
|
|
- } else
|
|
- {
|
|
+ out.writeByte(0x00); // Null
|
|
+ } else {
|
|
// Error!
|
|
- throw new IllegalStateException( "Invalid data request packet" );
|
|
+ throw new IllegalStateException("Invalid data request packet");
|
|
}
|
|
}
|
|
|
|
- ctx.writeAndFlush( response );
|
|
+ ctx.writeAndFlush(response);
|
|
}
|
|
|
|
@Override
|
|
- public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception
|
|
- {
|
|
- bungee.getLogger().log( Level.WARNING, "Error whilst handling query packet from " + ctx.channel().remoteAddress(), cause );
|
|
+ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
|
|
+ bungee.getLogger().log(Level.WARNING,
|
|
+ "Error whilst handling query packet from " + ctx.channel().remoteAddress(), cause);
|
|
}
|
|
|
|
@Data
|
|
- private static class QuerySession
|
|
- {
|
|
+ private static class QuerySession {
|
|
|
|
private final int token;
|
|
private final long time;
|
|
--
|
|
2.27.0.windows.1
|
|
|