From 61400aa00ce70d3a115472a05d266b679a53e0dd Mon Sep 17 00:00:00 2001 From: md_5 Date: Wed, 18 Dec 2013 13:32:30 +1100 Subject: [PATCH] Fire PreLogin Events in Offline Mode --- ...Fire-PreLogin-Events-in-Offline-Mode.patch | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 CraftBukkit-Patches/0079-Fire-PreLogin-Events-in-Offline-Mode.patch diff --git a/CraftBukkit-Patches/0079-Fire-PreLogin-Events-in-Offline-Mode.patch b/CraftBukkit-Patches/0079-Fire-PreLogin-Events-in-Offline-Mode.patch new file mode 100644 index 0000000000..e45e86be50 --- /dev/null +++ b/CraftBukkit-Patches/0079-Fire-PreLogin-Events-in-Offline-Mode.patch @@ -0,0 +1,130 @@ +From 563e6959f1d86d5fc2fc8da3f88e7d25396c334f Mon Sep 17 00:00:00 2001 +From: md_5 +Date: Wed, 18 Dec 2013 13:32:10 +1100 +Subject: [PATCH] Fire PreLogin Events in Offline Mode + + +diff --git a/src/main/java/net/minecraft/server/LoginListener.java b/src/main/java/net/minecraft/server/LoginListener.java +index aa06e92..fa80b74 100644 +--- a/src/main/java/net/minecraft/server/LoginListener.java ++++ b/src/main/java/net/minecraft/server/LoginListener.java +@@ -108,7 +108,7 @@ public class LoginListener implements PacketLoginInListener { + this.g = EnumProtocolState.KEY; + this.networkManager.handle(new PacketLoginOutEncryptionBegin(this.j, this.server.I().getPublic(), this.e), new GenericFutureListener[0]); + } else { +- this.g = EnumProtocolState.READY_TO_ACCEPT; ++ (new ThreadPlayerLookupUUID(this, "User Authenticator #" + b.incrementAndGet())).start(); // Spigot + } + } + +diff --git a/src/main/java/net/minecraft/server/ThreadPlayerLookupUUID.java b/src/main/java/net/minecraft/server/ThreadPlayerLookupUUID.java +index cc96775..ea8c269 100644 +--- a/src/main/java/net/minecraft/server/ThreadPlayerLookupUUID.java ++++ b/src/main/java/net/minecraft/server/ThreadPlayerLookupUUID.java +@@ -22,47 +22,21 @@ class ThreadPlayerLookupUUID extends Thread { + + public void run() { + try { ++ // Spigot Start ++ if ( !LoginListener.b( this.a ).getOnlineMode() ) ++ { ++ fireLoginEvents(); ++ LoginListener.a(this.a, EnumProtocolState.READY_TO_ACCEPT); ++ return; ++ } ++ // Spigot End + String s = (new BigInteger(MinecraftEncryption.a(LoginListener.a(this.a), LoginListener.b(this.a).I().getPublic(), LoginListener.c(this.a)))).toString(16); + + LoginListener.a(this.a, LoginListener.b(this.a).as().hasJoinedServer(new GameProfile((String) null, LoginListener.d(this.a).getName()), s)); + if (LoginListener.d(this.a) != null) { +- // CraftBukkit start +- if (!this.a.networkManager.d()) { +- return; +- } +- +- String playerName = LoginListener.d(this.a).getName(); +- java.net.InetAddress address = ((java.net.InetSocketAddress) a.networkManager.getSocketAddress()).getAddress(); +- final org.bukkit.craftbukkit.CraftServer server = LoginListener.b(this.a).server; +- +- AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(playerName, address); +- server.getPluginManager().callEvent(asyncEvent); +- +- if (PlayerPreLoginEvent.getHandlerList().getRegisteredListeners().length != 0) { +- final PlayerPreLoginEvent event = new PlayerPreLoginEvent(playerName, address); +- if (asyncEvent.getResult() != PlayerPreLoginEvent.Result.ALLOWED) { +- event.disallow(asyncEvent.getResult(), asyncEvent.getKickMessage()); +- } +- Waitable waitable = new Waitable() { +- @Override +- protected PlayerPreLoginEvent.Result evaluate() { +- server.getPluginManager().callEvent(event); +- return event.getResult(); +- }}; +- +- LoginListener.b(this.a).processQueue.add(waitable); +- if (waitable.get() != PlayerPreLoginEvent.Result.ALLOWED) { +- this.a.disconnect(event.getKickMessage()); +- return; +- } +- } else { +- if (asyncEvent.getLoginResult() != AsyncPlayerPreLoginEvent.Result.ALLOWED) { +- this.a.disconnect(asyncEvent.getKickMessage()); +- return; +- } +- } +- // CraftBukkit end +- ++ // Spigot Start ++ fireLoginEvents(); ++ // Spigot End + LoginListener.e().info("UUID of player " + LoginListener.d(this.a).getName() + " is " + LoginListener.d(this.a).getId()); + LoginListener.a(this.a, EnumProtocolState.READY_TO_ACCEPT); + } else { +@@ -79,4 +53,44 @@ class ThreadPlayerLookupUUID extends Thread { + // CraftBukkit end + } + } ++ ++ private void fireLoginEvents() throws Exception ++ { ++ // CraftBukkit start ++ if (!this.a.networkManager.d()) { ++ return; ++ } ++ ++ String playerName = LoginListener.d(this.a).getName(); ++ java.net.InetAddress address = ((java.net.InetSocketAddress) a.networkManager.getSocketAddress()).getAddress(); ++ final org.bukkit.craftbukkit.CraftServer server = LoginListener.b(this.a).server; ++ ++ AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(playerName, address); ++ server.getPluginManager().callEvent(asyncEvent); ++ ++ if (PlayerPreLoginEvent.getHandlerList().getRegisteredListeners().length != 0) { ++ final PlayerPreLoginEvent event = new PlayerPreLoginEvent(playerName, address); ++ if (asyncEvent.getResult() != PlayerPreLoginEvent.Result.ALLOWED) { ++ event.disallow(asyncEvent.getResult(), asyncEvent.getKickMessage()); ++ } ++ Waitable waitable = new Waitable() { ++ @Override ++ protected PlayerPreLoginEvent.Result evaluate() { ++ server.getPluginManager().callEvent(event); ++ return event.getResult(); ++ }}; ++ ++ LoginListener.b(this.a).processQueue.add(waitable); ++ if (waitable.get() != PlayerPreLoginEvent.Result.ALLOWED) { ++ this.a.disconnect(event.getKickMessage()); ++ return; ++ } ++ } else { ++ if (asyncEvent.getLoginResult() != AsyncPlayerPreLoginEvent.Result.ALLOWED) { ++ this.a.disconnect(asyncEvent.getKickMessage()); ++ return; ++ } ++ } ++ // CraftBukkit end ++ } + } +-- +1.8.3.2 +