From 5c764b609a5323fcb18abc2275820f5ac775c71a Mon Sep 17 00:00:00 2001
From: EarthCow <56940983+EarthCow@users.noreply.github.com>
Date: Fri, 29 May 2026 22:08:19 -0400
Subject: [PATCH 1/3] Fix leave always being silent
Introduced in f4681e27ad35b0420e3a44b764cb00c3554156a3
---
.../common/MessageHandler.java | 26 +++----------------
.../common/listeners/CorePlayerListener.java | 20 +++++++++++---
2 files changed, 19 insertions(+), 27 deletions(-)
diff --git a/src/main/java/xyz/earthcow/networkjoinmessages/common/MessageHandler.java b/src/main/java/xyz/earthcow/networkjoinmessages/common/MessageHandler.java
index d648b95..9e21e69 100644
--- a/src/main/java/xyz/earthcow/networkjoinmessages/common/MessageHandler.java
+++ b/src/main/java/xyz/earthcow/networkjoinmessages/common/MessageHandler.java
@@ -67,45 +67,25 @@ public void sendMessage(CoreCommandSender sender, String message, @Nullable Core
// --- Broadcast ---
- /** Broadcasts a non-silent message using the player's current server as context. */
- public void broadcastMessage(String text, MessageType type, CorePlayer parseTarget) {
- broadcastMessage(text, type, parseTarget, false);
- }
-
/** Broadcasts a message using the player's current server as both from and to context. */
- public void broadcastMessage(String text, MessageType type, CorePlayer parseTarget, boolean silent) {
- broadcastMessage(text, type, parseTarget.getCurrentServer().getName(), "", parseTarget, silent);
- }
-
- /** Broadcasts a non-silent message with explicit server context. */
- public void broadcastMessage(String text, MessageType type, String from, String to, CorePlayer parseTarget) {
- broadcastMessage(text, type, from, to, parseTarget, false);
+ public void broadcastMessage(String text, MessageType type, CorePlayer parseTarget) {
+ broadcastMessage(text, type, parseTarget.getCurrentServer().getName(), "", parseTarget);
}
/**
* Broadcasts a message to all appropriate recipients.
*
- *
If {@code silent} is true, only the console and permission-holding admins receive it.
- * Otherwise, all players who pass receiver, blacklist, and suppression checks are notified.
- *
* @param text the formatted message template
* @param type the message type (determines receiver list)
* @param from the origin server name
* @param to the destination server name
* @param parseTarget the player to resolve placeholders against (may be null for leave messages)
- * @param silent whether this is a vanished/silent event
*/
public void broadcastMessage(
String text, MessageType type,
String from, String to,
- @NotNull CorePlayer parseTarget,
- boolean silent
+ @Nullable CorePlayer parseTarget
) {
- if (silent) {
- broadcastSilentMessage(text, type, from, to, parseTarget, true);
- return;
- }
-
List receivers = switch (type) {
case SWAP -> receiverResolver.getSwapReceivers(to, from);
case FIRST_JOIN -> receiverResolver.getFirstJoinReceivers(from);
diff --git a/src/main/java/xyz/earthcow/networkjoinmessages/common/listeners/CorePlayerListener.java b/src/main/java/xyz/earthcow/networkjoinmessages/common/listeners/CorePlayerListener.java
index 4e2864f..b1bef1e 100644
--- a/src/main/java/xyz/earthcow/networkjoinmessages/common/listeners/CorePlayerListener.java
+++ b/src/main/java/xyz/earthcow/networkjoinmessages/common/listeners/CorePlayerListener.java
@@ -150,7 +150,11 @@ private void handleJoin(@NotNull CorePlayer player, @NotNull CoreBackendServer s
messageHandler.sendMessage(player, config.getSpoofJoinNotification());
}
- messageHandler.broadcastMessage(message, msgType, player, silent);
+ if (silent) {
+ messageHandler.broadcastSilentMessage(message, msgType, player.getCurrentServer().getName(), "", player, true);
+ } else {
+ messageHandler.broadcastMessage(message, msgType, player);
+ }
fireJoinEvent(player, server, message, silent, firstJoin);
}
@@ -166,7 +170,11 @@ private void handleSwap(@NotNull CorePlayer player, @NotNull CoreBackendServer s
String message = messageFormatter.formatSwapMessage(player, from, to);
boolean silent = silenceChecker.isSilent(player);
- messageHandler.broadcastMessage(message, MessageType.SWAP, from, to, player, silent);
+ if (silent) {
+ messageHandler.broadcastSilentMessage(message, MessageType.SWAP, from, to, player, true);
+ } else {
+ messageHandler.broadcastMessage(message, MessageType.SWAP, from, to, player);
+ }
fireSwapEvent(player, from, to, message, silent);
}
@@ -175,8 +183,12 @@ private void broadcastLeave(@NotNull CorePlayer player) {
boolean silent = silenceChecker.isSilent(player);
String serverName = player.getCurrentServer().getName();
- // Pass player as triggerPlayer but false for isParseTarget as the placeholders are already resolved in cache
- messageHandler.broadcastSilentMessage(message, MessageType.LEAVE, serverName, "", player, false);
+ if (silent) {
+ // Pass player as triggerPlayer but false for isParseTarget as the placeholders are already resolved in cache
+ messageHandler.broadcastSilentMessage(message, MessageType.LEAVE, serverName, "", player, false);
+ } else {
+ messageHandler.broadcastMessage(message, MessageType.LEAVE, serverName, "", null);
+ }
fireLeaveEvent(player, serverName, message, silent);
}
From 9eb2df04e7075c3725130cbee4c91ec7ef161635 Mon Sep 17 00:00:00 2001
From: EarthCow <56940983+EarthCow@users.noreply.github.com>
Date: Fri, 29 May 2026 22:21:47 -0400
Subject: [PATCH 2/3] Ensure limbo plugin exists for fromLimbo
---
.../xyz/earthcow/networkjoinmessages/bungee/BungeeMain.java | 5 +++++
.../networkjoinmessages/common/abstraction/CorePlugin.java | 1 +
.../common/listeners/CorePlayerListener.java | 2 +-
.../earthcow/networkjoinmessages/velocity/VelocityMain.java | 5 +++++
4 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/src/main/java/xyz/earthcow/networkjoinmessages/bungee/BungeeMain.java b/src/main/java/xyz/earthcow/networkjoinmessages/bungee/BungeeMain.java
index 9371155..2398af8 100644
--- a/src/main/java/xyz/earthcow/networkjoinmessages/bungee/BungeeMain.java
+++ b/src/main/java/xyz/earthcow/networkjoinmessages/bungee/BungeeMain.java
@@ -210,4 +210,9 @@ public int runTaskAsyncLater(Runnable task, int timeInMillisecondsLater) {
public boolean isPluginLoaded(String pluginName) {
return getProxy().getPluginManager().getPlugin(pluginName) != null;
}
+
+ @Override
+ public boolean hasLimbo() {
+ return false;
+ }
}
diff --git a/src/main/java/xyz/earthcow/networkjoinmessages/common/abstraction/CorePlugin.java b/src/main/java/xyz/earthcow/networkjoinmessages/common/abstraction/CorePlugin.java
index bd90338..cafe863 100644
--- a/src/main/java/xyz/earthcow/networkjoinmessages/common/abstraction/CorePlugin.java
+++ b/src/main/java/xyz/earthcow/networkjoinmessages/common/abstraction/CorePlugin.java
@@ -32,6 +32,7 @@ public interface CorePlugin {
int runTaskAsyncLater(Runnable task, int timeInMillisecondsLater);
boolean isPluginLoaded(String pluginName);
+ boolean hasLimbo();
CoreCommandSender getConsole();
diff --git a/src/main/java/xyz/earthcow/networkjoinmessages/common/listeners/CorePlayerListener.java b/src/main/java/xyz/earthcow/networkjoinmessages/common/listeners/CorePlayerListener.java
index 4e2864f..f9c1040 100644
--- a/src/main/java/xyz/earthcow/networkjoinmessages/common/listeners/CorePlayerListener.java
+++ b/src/main/java/xyz/earthcow/networkjoinmessages/common/listeners/CorePlayerListener.java
@@ -90,7 +90,7 @@ public void onServerConnected(@NotNull CorePlayer player, @NotNull CoreBackendSe
if (!stateStore.isConnected(player)) {
handleJoin(player, server);
} else {
- boolean fromLimbo = plugin.getServerType() == ServerType.VELOCITY && previousServer == null;
+ boolean fromLimbo = plugin.hasLimbo() && previousServer == null;
handleSwap(player, server, fromLimbo);
}
});
diff --git a/src/main/java/xyz/earthcow/networkjoinmessages/velocity/VelocityMain.java b/src/main/java/xyz/earthcow/networkjoinmessages/velocity/VelocityMain.java
index cad5529..3ea6adb 100644
--- a/src/main/java/xyz/earthcow/networkjoinmessages/velocity/VelocityMain.java
+++ b/src/main/java/xyz/earthcow/networkjoinmessages/velocity/VelocityMain.java
@@ -224,6 +224,11 @@ public boolean isPluginLoaded(String pluginName) {
return proxy.getPluginManager().isLoaded(pluginName.toLowerCase());
}
+ @Override
+ public boolean hasLimbo() {
+ return isLimboAPIAvailable;
+ }
+
@Override
public CorePlayer createPlayer(UUID uuid) {
Optional player = proxy.getPlayer(uuid);
From 8c041dcdbba8ed87cccae166bf6581475f5cda0b Mon Sep 17 00:00:00 2001
From: EarthCow <56940983+EarthCow@users.noreply.github.com>
Date: Fri, 29 May 2026 22:35:38 -0400
Subject: [PATCH 3/3] Bump version
---
gradle.properties | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gradle.properties b/gradle.properties
index 5572fef..e4b6415 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,6 +1,6 @@
# Project metadata
group=xyz.earthcow.networkjoinmessages
-version=3.6.0
+version=3.6.1
description=A plugin handling join, leave and swap messages for proxy servers.
# Plugin.yml metadata