Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*
* <p>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<CorePlayer> receivers = switch (type) {
case SWAP -> receiverResolver.getSwapReceivers(to, from);
case FIRST_JOIN -> receiverResolver.getFirstJoinReceivers(from);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public interface CorePlugin {
int runTaskAsyncLater(Runnable task, int timeInMillisecondsLater);

boolean isPluginLoaded(String pluginName);
boolean hasLimbo();

CoreCommandSender getConsole();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
});
Expand Down Expand Up @@ -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);
}

Expand All @@ -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);
}

Expand All @@ -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);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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> player = proxy.getPlayer(uuid);
Expand Down
Loading