mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-18 00:47:42 +01:00
Upstream has released updates that appears to apply and compile correctly Paper Changes: b6cf80ee Preload important classes such as Logger and JLine ea1a909c Fix netty version to 50 and restore epoll native support 10502558 Workaround for some hacky environments that mess up things 8b2a437b Fix plugins calling getChunkAtAsync asynchronously c8055836 Update Netty to 4.1.51 64cfcf3e Optimize sending packets to nearby locations (sounds/effects)
201 lines
8.0 KiB
Diff
201 lines
8.0 KiB
Diff
From 3fbe26f37974416a29492fdb5d055a87e68eec9c Mon Sep 17 00:00:00 2001
|
|
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
|
|
Date: Wed, 22 Jan 2020 20:13:40 -0600
|
|
Subject: [PATCH] UPnP Port Forwarding Service
|
|
|
|
---
|
|
pom.xml | 10 ++++
|
|
.../net/minecraft/server/DedicatedServer.java | 25 ++++++++++
|
|
.../net/minecraft/server/MinecraftServer.java | 10 ++++
|
|
.../java/net/pl3x/purpur/PurpurConfig.java | 5 ++
|
|
.../net/pl3x/purpur/gui/info/JInfoPanel.java | 3 ++
|
|
.../pl3x/purpur/gui/info/UPnPComponent.java | 47 +++++++++++++++++++
|
|
6 files changed, 100 insertions(+)
|
|
create mode 100644 src/main/java/net/pl3x/purpur/gui/info/UPnPComponent.java
|
|
|
|
diff --git a/pom.xml b/pom.xml
|
|
index d5709e670..43d6bed36 100644
|
|
--- a/pom.xml
|
|
+++ b/pom.xml
|
|
@@ -56,6 +56,12 @@
|
|
<version>1.7.7.1</version>
|
|
<scope>compile</scope>
|
|
</dependency>
|
|
+ <dependency>
|
|
+ <groupId>com.dosse.upnp</groupId>
|
|
+ <artifactId>UPnP</artifactId>
|
|
+ <version>1.0</version>
|
|
+ <scope>compile</scope>
|
|
+ </dependency>
|
|
<!-- Purpur end -->
|
|
<dependency>
|
|
<groupId>net.minecrell</groupId>
|
|
@@ -167,6 +173,10 @@
|
|
<id>spigotmc-public</id>
|
|
<url>https://hub.spigotmc.org/nexus/content/groups/public/</url>
|
|
</repository>
|
|
+ <repository>
|
|
+ <id>pl3x</id>
|
|
+ <url>https://repo.pl3x.net/</url>
|
|
+ </repository>
|
|
</repositories>
|
|
|
|
<pluginRepositories>
|
|
diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java
|
|
index 73d2b32c5..a522ed5c3 100644
|
|
--- a/src/main/java/net/minecraft/server/DedicatedServer.java
|
|
+++ b/src/main/java/net/minecraft/server/DedicatedServer.java
|
|
@@ -241,6 +241,31 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer
|
|
return false;
|
|
}
|
|
|
|
+ // Purpur start
|
|
+ if (net.pl3x.purpur.PurpurConfig.useUPnP) {
|
|
+ LOGGER.info("[UPnP] Attempting to start UPnP port forwarding service...");
|
|
+ com.dosse.upnp.UPnP.NAME = "Purpur UPnP";
|
|
+ if (com.dosse.upnp.UPnP.isUPnPAvailable()) {
|
|
+ if (com.dosse.upnp.UPnP.isMappedTCP(getPort())) {
|
|
+ upnp = false;
|
|
+ LOGGER.info("[UPnP] Port " + getPort() + " is already open");
|
|
+ } else if (com.dosse.upnp.UPnP.openPortTCP(getPort())) {
|
|
+ upnp = true;
|
|
+ LOGGER.info("[UPnP] Successfully opened port " + getPort());
|
|
+ } else {
|
|
+ upnp = false;
|
|
+ LOGGER.info("[UPnP] Failed to open port " + getPort());
|
|
+ }
|
|
+ if (upnp) {
|
|
+ LOGGER.info("[UPnP] " + com.dosse.upnp.UPnP.getExternalIP() + ":" + getPort());
|
|
+ }
|
|
+ } else {
|
|
+ upnp = false;
|
|
+ LOGGER.error("[UPnP] Service is unavailable");
|
|
+ }
|
|
+ }
|
|
+ // Purpur end
|
|
+
|
|
// CraftBukkit start
|
|
// this.a((PlayerList) (new DedicatedPlayerList(this))); // Spigot - moved up
|
|
server.loadPlugins();
|
|
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
index 303778dcd..03dc148ad 100644
|
|
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
@@ -187,6 +187,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
|
|
public boolean lagging = false; // Purpur
|
|
public final SlackActivityAccountant slackActivityAccountant = new SlackActivityAccountant();
|
|
// Spigot end
|
|
+ protected boolean upnp = false; public boolean isUPnPEnabled() { return upnp; } // Purpur
|
|
|
|
public MinecraftServer(OptionSet options, Proxy proxy, DataFixer datafixer, CommandDispatcher commanddispatcher, YggdrasilAuthenticationService yggdrasilauthenticationservice, MinecraftSessionService minecraftsessionservice, GameProfileRepository gameprofilerepository, UserCache usercache, WorldLoadListenerFactory worldloadlistenerfactory, String s) {
|
|
super("Server");
|
|
@@ -737,6 +738,15 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
|
|
// CraftBukkit end
|
|
MinecraftServer.LOGGER.info("Stopping server");
|
|
MinecraftTimings.stopServer(); // Paper
|
|
+ // Purpur start
|
|
+ if (upnp) {
|
|
+ if (com.dosse.upnp.UPnP.closePortTCP(getPort())) {
|
|
+ LOGGER.info("[UPnP] Port " + getPort() + " closed");
|
|
+ } else {
|
|
+ LOGGER.error("[UPnP] Failed to close port " + getPort());
|
|
+ }
|
|
+ }
|
|
+ // Purpur end
|
|
// CraftBukkit start
|
|
if (this.server != null) {
|
|
this.server.disablePlugins();
|
|
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
|
|
index c3ecd6fc7..fe38b3ce9 100644
|
|
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
|
|
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
|
|
@@ -150,6 +150,11 @@ public class PurpurConfig {
|
|
useAlternateKeepAlive = getBoolean("settings.use-alternate-keepalive", useAlternateKeepAlive);
|
|
}
|
|
|
|
+ public static boolean useUPnP = false;
|
|
+ private static void upnpSettings() {
|
|
+ useUPnP = getBoolean("settings.upnp-port-forwarding", useUPnP);
|
|
+ }
|
|
+
|
|
public static boolean dontSendUselessEntityPackets = false;
|
|
private static void dontSendUselessEntityPackets() {
|
|
dontSendUselessEntityPackets = getBoolean("settings.dont-send-useless-entity-packets", dontSendUselessEntityPackets);
|
|
diff --git a/src/main/java/net/pl3x/purpur/gui/info/JInfoPanel.java b/src/main/java/net/pl3x/purpur/gui/info/JInfoPanel.java
|
|
index c4903c7db..ee4f022fc 100644
|
|
--- a/src/main/java/net/pl3x/purpur/gui/info/JInfoPanel.java
|
|
+++ b/src/main/java/net/pl3x/purpur/gui/info/JInfoPanel.java
|
|
@@ -19,13 +19,16 @@ public class JInfoPanel extends JPanel {
|
|
|
|
ramGraph = new RAMGraph();
|
|
RAMDetails ramDetails = new RAMDetails(server);
|
|
+ UPnPComponent upnpComponent = new UPnPComponent(server);
|
|
|
|
add(ramGraph, "North");
|
|
add(ramDetails, "Center");
|
|
+ add(upnpComponent, "South");
|
|
|
|
timer = new Timer(500, (event) -> {
|
|
ramGraph.update();
|
|
ramDetails.update();
|
|
+ upnpComponent.repaint();
|
|
});
|
|
timer.start();
|
|
}
|
|
diff --git a/src/main/java/net/pl3x/purpur/gui/info/UPnPComponent.java b/src/main/java/net/pl3x/purpur/gui/info/UPnPComponent.java
|
|
new file mode 100644
|
|
index 000000000..b0465d360
|
|
--- /dev/null
|
|
+++ b/src/main/java/net/pl3x/purpur/gui/info/UPnPComponent.java
|
|
@@ -0,0 +1,47 @@
|
|
+package net.pl3x.purpur.gui.info;
|
|
+
|
|
+import net.minecraft.server.MinecraftServer;
|
|
+import net.pl3x.purpur.PurpurConfig;
|
|
+
|
|
+import javax.swing.JTextPane;
|
|
+import javax.swing.border.EmptyBorder;
|
|
+import java.awt.Color;
|
|
+import java.awt.Dimension;
|
|
+import java.awt.Graphics;
|
|
+
|
|
+public class UPnPComponent extends JTextPane {
|
|
+ private final MinecraftServer server;
|
|
+
|
|
+ public UPnPComponent(MinecraftServer server) {
|
|
+ this.server = server;
|
|
+ setBorder(new EmptyBorder(0, 30, 0, 10));
|
|
+ setEditable(false);
|
|
+ setText("UPnP Status");
|
|
+ setOpaque(false);
|
|
+ setHighlighter(null);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public Dimension getPreferredSize() {
|
|
+ return new Dimension(350, 20);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void paint(Graphics graphics) {
|
|
+ super.paint(graphics);
|
|
+ graphics.setColor(server.isUPnPEnabled() ? Color.GREEN : Color.RED);
|
|
+ graphics.fillOval(10, 0, 15, 15);
|
|
+ setToolTipText(getTooltip());
|
|
+ }
|
|
+
|
|
+ private String getTooltip() {
|
|
+ if (!PurpurConfig.useUPnP) {
|
|
+ return "UPnP Disabled";
|
|
+ }
|
|
+ if (server.isUPnPEnabled()) {
|
|
+ return "UPnP Enabled";
|
|
+ } else {
|
|
+ return "UPnP Unavailable";
|
|
+ }
|
|
+ }
|
|
+}
|
|
--
|
|
2.24.0
|
|
|