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: a6ff84ad Revert Nibble patch, causing issues still f1a8eb7f Use a finalizer for light packet instead of onPacketDone 03c9bb05 Optimize NibbleArray to use pooled buffers d0a528b1 Move delayed init down later in tick, improve accuracy of startup time
201 lines
8.0 KiB
Diff
201 lines
8.0 KiB
Diff
From eff9e802ad2abe60b19c5ba3418bb47e0e310cd5 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 6ca410444..46101cdbe 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>
|
|
@@ -156,6 +162,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 e06c0bb39..28fefa0ca 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
|
|
|