Add "local" chat channels with proximity-based messaging
Introduced a "local" channel type to restrict chat visibility based on player proximity, configurable via `LOCAL_DISTANCE`. Added channel spy functionality to monitor "local" messages. Updated constructors and configuration to support this new feature.
This commit is contained in:
@@ -22,7 +22,9 @@ import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
@@ -188,9 +190,9 @@ public class ChatHandler {
|
||||
component = modifiableString.component();
|
||||
|
||||
if (channel.isProxy()) {
|
||||
sendChatChannelMessage(player, channel.getChannelName(), "chatchannel", component);
|
||||
sendChatChannelMessage(player, channel.getChannelName(), "chatchannel", component, message);
|
||||
} else {
|
||||
sendChatChannelMessage(channel, player.getUniqueId(), component);
|
||||
sendChatChannelMessage(channel, player.getUniqueId(), component, message);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -243,7 +245,7 @@ public class ChatHandler {
|
||||
// }
|
||||
}
|
||||
|
||||
private void sendChatChannelMessage(CustomChannel chatChannel, UUID uuid, Component component) {
|
||||
private void sendChatChannelMessage(CustomChannel chatChannel, UUID uuid, Component component, String message) {
|
||||
Player player = Bukkit.getPlayer(uuid);
|
||||
if (player == null) {
|
||||
ALogger.warn("Failed to send chat message from non existent player");
|
||||
@@ -264,7 +266,28 @@ public class ChatHandler {
|
||||
stream = stream.filter(receiver -> !ChatUserManager.getChatUser(receiver.getUniqueId()).getIgnoredPlayers().contains(uuid)
|
||||
|| receiver.hasPermission("chat.ignorebypass"));
|
||||
}
|
||||
stream.forEach(p -> p.sendMessage(component));
|
||||
if (chatChannel.isLocal()) {
|
||||
Location location = player.getLocation();
|
||||
stream = stream.filter(receiver -> {
|
||||
Player receiverPlayer = Bukkit.getPlayer(receiver.getUniqueId());
|
||||
if (receiverPlayer == null)
|
||||
return false;
|
||||
if (!location.getWorld().getUID().equals(receiverPlayer.getLocation().getWorld().getUID()))
|
||||
return false;
|
||||
return !(receiverPlayer.getLocation().distance(location) > Config.LOCAL_DISTANCE);
|
||||
});
|
||||
}
|
||||
List<? extends Player> recipientPlayers = stream.toList();
|
||||
recipientPlayers.forEach(p -> p.sendMessage(component));
|
||||
|
||||
List<UUID> recipientUUIDs = recipientPlayers.stream().map(Entity::getUniqueId).toList();
|
||||
Bukkit.getServer().getOnlinePlayers().stream()
|
||||
.filter(onlinePlayer -> onlinePlayer.hasPermission(Config.SPYPERMISSION))
|
||||
.filter(onlinePlayer -> !recipientUUIDs.contains(onlinePlayer.getUniqueId()))
|
||||
.forEach(onlinePlayer -> onlinePlayer.sendRichMessage(Config.CHANNEL_SPY,
|
||||
Placeholder.component("sender", player.name()),
|
||||
Placeholder.parsed("channel", chatChannel.getChannelName()),
|
||||
Placeholder.parsed("message", message)));
|
||||
}
|
||||
|
||||
private void sendPluginMessage(Player player, String channel, Component component) {
|
||||
@@ -284,7 +307,7 @@ public class ChatHandler {
|
||||
player.sendPluginMessage(plugin, Config.MESSAGECHANNEL, out.toByteArray());
|
||||
}
|
||||
|
||||
public void sendChatChannelMessage(Player player, String chatChannelName, String channel, Component component) {
|
||||
public void sendChatChannelMessage(Player player, String chatChannelName, String channel, Component component, String ignored) {
|
||||
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
||||
out.writeUTF(channel);
|
||||
out.writeUTF(chatChannelName);
|
||||
|
||||
Reference in New Issue
Block a user