From 77adc2f882ccac3797bac50b46d2ed2429bf0520 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sun, 12 Jan 2025 13:04:46 -0800 Subject: [PATCH] UPnP Port Forwarding Co-authored-by: omega24 --- .../server/0209-UPnP-Port-Forwarding.patch | 83 ------------------- purpur-server/build.gradle.kts.patch | 3 +- .../server/MinecraftServer.java.patch | 20 ++++- .../dedicated/DedicatedServer.java.patch | 31 +++++++ .../org/purpurmc/purpur/PurpurConfig.java | 5 ++ 5 files changed, 57 insertions(+), 85 deletions(-) delete mode 100644 patches/server/0209-UPnP-Port-Forwarding.patch diff --git a/patches/server/0209-UPnP-Port-Forwarding.patch b/patches/server/0209-UPnP-Port-Forwarding.patch deleted file mode 100644 index b6354d4ad..000000000 --- a/patches/server/0209-UPnP-Port-Forwarding.patch +++ /dev/null @@ -1,83 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Wed, 22 Jan 2020 20:13:40 -0600 -Subject: [PATCH] UPnP Port Forwarding - - -diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 9219b31a7273b08e7acd1a953c260a5520333922..80a8bd2dc32763f8ee2062c2d1b36188f2532523 100644 ---- a/net/minecraft/server/MinecraftServer.java -+++ b/net/minecraft/server/MinecraftServer.java -@@ -331,6 +331,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop pluginsBlockingSleep = new java.util.HashSet<>(); // Paper - API to allow/disallow tick sleeping - public boolean lagging = false; // Purpur - Lagging threshold -+ protected boolean upnp = false; // Purpur - UPnP Port Forwarding - - public volatile Thread shutdownThread; // Paper - public volatile boolean abnormalExit = false; // Paper -@@ -1057,6 +1058,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop pluginsBlockingSleep = new java.util.HashSet<>(); // Paper - API to allow/disallow tick sleeping + public boolean lagging = false; // Purpur - Lagging threshold public static final long SERVER_INIT = System.nanoTime(); // Paper - Lag compensation ++ protected boolean upnp = false; // Purpur - UPnP Port Forwarding public static S spin(Function threadFunction) { + ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.init(); // Paper - rewrite data converter system +@@ -1001,6 +_,15 @@ + + LOGGER.info("Stopping server"); + Commands.COMMAND_SENDING_POOL.shutdownNow(); // Paper - Perf: Async command map building; Shutdown and don't bother finishing ++ // Purpur start - UPnP Port Forwarding ++ if (upnp) { ++ if (dev.omega24.upnp4j.UPnP4J.close(this.getPort(), dev.omega24.upnp4j.util.Protocol.TCP)) { ++ LOGGER.info("[UPnP] Port {} closed", this.getPort()); ++ } else { ++ LOGGER.error("[UPnP] Failed to close port {}", this.getPort()); ++ } ++ } ++ // Purpur end - UPnP Port Forwarding + // CraftBukkit start + if (this.server != null) { + this.server.spark.disable(); // Paper - spark @@ -1093,6 +_,7 @@ this.safeShutdown(waitForServer, false); } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/dedicated/DedicatedServer.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/dedicated/DedicatedServer.java.patch index c2c617400..bcb20f781 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/dedicated/DedicatedServer.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/dedicated/DedicatedServer.java.patch @@ -16,6 +16,37 @@ com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // Paper - load version history now this.setPvpAllowed(properties.pvp); +@@ -271,6 +_,30 @@ + if (true) throw new IllegalStateException("Failed to bind to port", var10); // Paper - Propagate failed to bind to port error + return false; + } ++ // Purpur start - UPnP Port Forwarding ++ if (org.purpurmc.purpur.PurpurConfig.useUPnP) { ++ LOGGER.info("[UPnP] Attempting to start UPnP port forwarding service..."); ++ if (dev.omega24.upnp4j.UPnP4J.isUPnPAvailable()) { ++ if (dev.omega24.upnp4j.UPnP4J.isOpen(this.getPort(), dev.omega24.upnp4j.util.Protocol.TCP)) { ++ this.upnp = false; ++ LOGGER.info("[UPnP] Port {} is already open", this.getPort()); ++ } else if (dev.omega24.upnp4j.UPnP4J.open(this.getPort(), dev.omega24.upnp4j.util.Protocol.TCP)) { ++ this.upnp = true; ++ LOGGER.info("[UPnP] Successfully opened port {}", this.getPort()); ++ } else { ++ this.upnp = false; ++ LOGGER.info("[UPnP] Failed to open port {}", this.getPort()); ++ } ++ ++ if (upnp) { ++ LOGGER.info("[UPnP] {}:{}", dev.omega24.upnp4j.UPnP4J.getExternalIP(), this.getPort()); ++ } ++ } else { ++ this.upnp = false; ++ LOGGER.error("[UPnP] Service is unavailable"); ++ } ++ } ++ // Purpur end - UPnP Port Forwarding + + // CraftBukkit start + // this.setPlayerList(new DedicatedPlayerList(this, this.registries(), this.playerDataStorage)); // Spigot - moved up @@ -350,6 +_,7 @@ LOGGER.info("JMX monitoring enabled"); } diff --git a/purpur-server/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/purpur-server/src/main/java/org/purpurmc/purpur/PurpurConfig.java index 18d68e604..6a067ef21 100644 --- a/purpur-server/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/purpur-server/src/main/java/org/purpurmc/purpur/PurpurConfig.java @@ -414,4 +414,9 @@ public class PurpurConfig { private static void tpsCatchup() { tpsCatchup = getBoolean("settings.tps-catchup", tpsCatchup); } + + public static boolean useUPnP = false; + private static void networkSettings() { + useUPnP = getBoolean("settings.network.upnp-port-forwarding", useUPnP); + } }