Skip to content
This repository was archived by the owner on Apr 20, 2026. It is now read-only.

Commit 987a4e8

Browse files
author
burdo
committed
add join/leave/advancement/death messages
1 parent 09214ba commit 987a4e8

2 files changed

Lines changed: 113 additions & 36 deletions

File tree

run/spigot/server.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#Minecraft server properties
2-
#Wed Dec 24 23:00:17 CET 2025
2+
#Thu Dec 25 14:02:46 CET 2025
33
accepts-transfers=false
44
allow-flight=false
55
allow-nether=true

src/main/java/com/ampznetwork/chatmod/lite/ChatModLite.java

Lines changed: 112 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,19 @@
2828
import org.bukkit.Bukkit;
2929
import org.bukkit.ChatColor;
3030
import org.bukkit.OfflinePlayer;
31+
import org.bukkit.advancement.Advancement;
3132
import org.bukkit.command.Command;
3233
import org.bukkit.command.CommandSender;
3334
import org.bukkit.entity.Player;
3435
import org.bukkit.event.EventHandler;
3536
import org.bukkit.event.EventPriority;
3637
import org.bukkit.event.Listener;
38+
import org.bukkit.event.entity.PlayerDeathEvent;
3739
import org.bukkit.event.player.AsyncPlayerChatEvent;
40+
import org.bukkit.event.player.PlayerAdvancementDoneEvent;
3841
import org.bukkit.event.player.PlayerJoinEvent;
42+
import org.bukkit.event.player.PlayerKickEvent;
43+
import org.bukkit.event.player.PlayerQuitEvent;
3944
import org.bukkit.plugin.java.JavaPlugin;
4045
import org.comroid.api.java.SoftDepend;
4146
import org.comroid.api.net.Rabbit;
@@ -257,8 +262,6 @@ public void dispatch(PlayerJoinEvent event) {
257262
var player = event.getPlayer();
258263
var id = player.getUniqueId();
259264

260-
if (channels.isEmpty() || channels.stream().anyMatch(chl -> chl.getPlayerIDs().contains(id))) return;
261-
262265
// join init channel
263266
var first = channels.getFirst();
264267
first.getPlayerIDs().add(id);
@@ -274,6 +277,61 @@ public void dispatch(PlayerJoinEvent event) {
274277
channel.getName()));
275278
})
276279
.forEach(channel -> channel.getSpyIDs().add(id));
280+
281+
// send join message
282+
var message = createJoinMessage(player);
283+
var packet = new ChatMessagePacketImpl(PacketType.JOIN,
284+
serverName,
285+
first.getName(),
286+
message,
287+
List.of(serverName));
288+
outbound(first, packet);
289+
}
290+
291+
@EventHandler(priority = EventPriority.MONITOR)
292+
public void dispatch(PlayerQuitEvent event) {
293+
var player = event.getPlayer();
294+
var first = channels.getFirst();
295+
296+
playerLeave(player, first);
297+
}
298+
299+
@EventHandler(priority = EventPriority.MONITOR)
300+
public void dispatch(PlayerKickEvent event) {
301+
var player = event.getPlayer();
302+
var first = channels.getFirst();
303+
304+
playerLeave(player, first);
305+
}
306+
307+
@EventHandler(priority = EventPriority.MONITOR)
308+
public void dispatch(PlayerAdvancementDoneEvent event) {
309+
var player = event.getPlayer();
310+
var first = channels.getFirst();
311+
312+
// send leave message
313+
var message = createAdvancementMessage(player, event.getAdvancement());
314+
var packet = new ChatMessagePacketImpl(PacketType.OTHER,
315+
serverName,
316+
first.getName(),
317+
message,
318+
List.of(serverName));
319+
outbound(first, packet);
320+
}
321+
322+
@EventHandler(priority = EventPriority.MONITOR)
323+
public void dispatch(PlayerDeathEvent event) {
324+
var player = event.getEntity();
325+
var first = channels.getFirst();
326+
327+
// send leave message
328+
var message = createDeathMessage(player, event.getDeathMessage());
329+
var packet = new ChatMessagePacketImpl(PacketType.OTHER,
330+
serverName,
331+
first.getName(),
332+
message,
333+
List.of(serverName));
334+
outbound(first, packet);
277335
}
278336

279337
@EventHandler(priority = EventPriority.HIGH)
@@ -306,7 +364,7 @@ public void dispatch(AsyncPlayerChatEvent event) {
306364
serverName,
307365
channel.getName(),
308366
message,
309-
new ArrayList<>());
367+
List.of());
310368
outbound(channel, packet);
311369
} else {
312370
getLogger().warning("Player %s has no access to channel %s".formatted(playerName, channel.getName()));
@@ -318,34 +376,19 @@ public void dispatch(AsyncPlayerChatEvent event) {
318376
}
319377
}
320378

321-
/*
322-
@EventHandler(priority = EventPriority.MONITOR)
323-
public void dispatch(PlayerJoinEvent event) {
324-
try {
325-
playerJoin(event.getPlayer().getUniqueId(), createEventDelegate(event, DELEGATE_PROPERTY_JOIN));
326-
} catch (Throwable t) {
327-
mod.getLogger().log(Level.WARNING, "Error in event handler", t);
328-
}
329-
}
330-
331-
@EventHandler(priority = EventPriority.MONITOR)
332-
public void dispatch(PlayerQuitEvent event) {
333-
try {
334-
playerLeave(event.getPlayer().getUniqueId(), createEventDelegate(event, DELEGATE_PROPERTY_QUIT));
335-
} catch (Throwable t) {
336-
mod.getLogger().log(Level.WARNING, "Error in event handler", t);
337-
}
338-
}
379+
private void playerLeave(Player player, Channel channel) {
380+
var id = player.getUniqueId();
381+
for (var each : channels) each.getPlayerIDs().remove(id);
339382

340-
@EventHandler(priority = EventPriority.MONITOR)
341-
public void dispatch(PlayerKickEvent event) {
342-
try {
343-
playerLeave(event.getPlayer().getUniqueId(), createEventDelegate(event, DELEGATE_PROPERTY_KICK));
344-
} catch (Throwable t) {
345-
mod.getLogger().log(Level.WARNING, "Error in event handler", t);
346-
}
347-
}
348-
*/
383+
// send leave message
384+
var message = createLeaveMessage(player);
385+
var packet = new ChatMessagePacketImpl(PacketType.LEAVE,
386+
serverName,
387+
channel.getName(),
388+
message,
389+
List.of(serverName));
390+
outbound(channel, packet);
391+
}
349392

350393
private void execAndRespond(@NotNull CommandSender sender, Supplier<ComponentLike> exec) {
351394
try {
@@ -401,6 +444,8 @@ private void send(ChatMessagePacket packet) {
401444
}
402445

403446
private void localcastPacket(ChatMessagePacket packet) {
447+
if (packet.getRoute().contains(serverName)) return;
448+
404449
var channelOpt = channel(packet.getChannel());
405450
if (channelOpt.isEmpty()) {
406451
getLogger().warning("Received message for nonexistent channel: " + packet.getChannel());
@@ -567,11 +612,7 @@ private Component shout(@NotNull CommandSender sender, String channelName, Strin
567612
var content = new ChatMessageParser().parse(msg);
568613
var basicPlayer = com.ampznetwork.libmod.api.entity.Player.basic(playerId, player.getName());
569614
var message = new ChatMessage(basicPlayer, player.getDisplayName(), msg, content);
570-
var packet = new ChatMessagePacketImpl(PacketType.CHAT,
571-
serverName,
572-
channel.getName(),
573-
message,
574-
new ArrayList<>());
615+
var packet = new ChatMessagePacketImpl(PacketType.CHAT, serverName, channel.getName(), message, List.of());
575616
outbound(channel, packet);
576617
return text("Message shouted: ").append(content);
577618
}
@@ -587,6 +628,42 @@ private Component channelInfoComponent(Channel channel, UUID playerId) {
587628
return text.append(text("\n - Status: ")).append(state.toComponent());
588629
}
589630

631+
private ChatMessage createJoinMessage(Player player) {
632+
var playerName = player.getName();
633+
return new ChatMessage(com.ampznetwork.libmod.api.entity.Player.basic(player.getUniqueId(), playerName),
634+
playerName,
635+
"> ▶️ Joined the game",
636+
text("joined the game", YELLOW));
637+
}
638+
639+
private ChatMessage createLeaveMessage(Player player) {
640+
var playerName = player.getName();
641+
return new ChatMessage(com.ampznetwork.libmod.api.entity.Player.basic(player.getUniqueId(), playerName),
642+
playerName,
643+
"> ⏹️ Left the game",
644+
text("left the game", YELLOW));
645+
}
646+
647+
private ChatMessage createAdvancementMessage(Player player, Advancement advancement) {
648+
var playerName = player.getName();
649+
var display = advancement.getDisplay();
650+
var displayText = display == null
651+
? "> \uD83C\uDFC6 Completed an advancement"
652+
: "> \uD83C\uDFC6 Completed the advancement \"" + display.getTitle() + "\"\n> `" + display.getDescription() + "`";
653+
return new ChatMessage(com.ampznetwork.libmod.api.entity.Player.basic(player.getUniqueId(), playerName),
654+
playerName,
655+
displayText,
656+
text(displayText, YELLOW));
657+
}
658+
659+
private ChatMessage createDeathMessage(Player player, String deathMessage) {
660+
var playerName = player.getName();
661+
return new ChatMessage(com.ampznetwork.libmod.api.entity.Player.basic(player.getUniqueId(), playerName),
662+
playerName,
663+
"> ☠️ " + deathMessage,
664+
text(deathMessage, YELLOW));
665+
}
666+
590667
private boolean hasAccess(UUID id, Channel channel) {
591668
return channel.getPermission() == null || permissionAdapter.checkPermissionOrOp(id,
592669
"chat.channel." + channel.getName());

0 commit comments

Comments
 (0)