mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-17 16:37:43 +01:00
Upstream has released updates that appears to apply and compile correctly Paper Changes: 8ce3dd5f [CI-SKIP] Fix Mojang API Brigadier dep - THIS IS NOT A NEW BUILD 00d760a5 Fix build due to spigot changing the build timestamp process 842e040c Updated Upstream (Bukkit/CraftBukkit/Spigot) c03260a2 Add getter and setter for villager's numberOfRestocksToday (#3231) fe366fbe null check tracker for entity metadata update - Fixes #3070 fdf41b74 Implement Brigadier Mojang API e0ea2e0e Entity Activation Range 2.0! Major improvements to restoring behavior 10396d28 Fix Tracking Range mismatch on Vehicle/Passenger checks
201 lines
8.0 KiB
Diff
201 lines
8.0 KiB
Diff
From 1486feb57f39fb72713ab88f489a41494c80239d 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 cdb556405..760a4bc46 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>
|
|
@@ -149,6 +155,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 fe474e4eb..18fdaf53e 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 7a7c9213d..971466e2a 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 a05c85be0..1822c896f 100644
|
|
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
|
|
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
|
|
@@ -148,6 +148,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
|
|
|