2828import org .bukkit .Bukkit ;
2929import org .bukkit .ChatColor ;
3030import org .bukkit .OfflinePlayer ;
31+ import org .bukkit .advancement .Advancement ;
3132import org .bukkit .command .Command ;
3233import org .bukkit .command .CommandSender ;
3334import org .bukkit .entity .Player ;
3435import org .bukkit .event .EventHandler ;
3536import org .bukkit .event .EventPriority ;
3637import org .bukkit .event .Listener ;
38+ import org .bukkit .event .entity .PlayerDeathEvent ;
3739import org .bukkit .event .player .AsyncPlayerChatEvent ;
40+ import org .bukkit .event .player .PlayerAdvancementDoneEvent ;
3841import org .bukkit .event .player .PlayerJoinEvent ;
42+ import org .bukkit .event .player .PlayerKickEvent ;
43+ import org .bukkit .event .player .PlayerQuitEvent ;
3944import org .bukkit .plugin .java .JavaPlugin ;
4045import org .comroid .api .java .SoftDepend ;
4146import 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