diff --git a/src/main/java/org/modernbeta/admintoolbox/managers/admin/AdminManager.java b/src/main/java/org/modernbeta/admintoolbox/managers/admin/AdminManager.java index d10f0c1..849baca 100644 --- a/src/main/java/org/modernbeta/admintoolbox/managers/admin/AdminManager.java +++ b/src/main/java/org/modernbeta/admintoolbox/managers/admin/AdminManager.java @@ -1,6 +1,7 @@ package org.modernbeta.admintoolbox.managers.admin; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.Bukkit; @@ -24,6 +25,7 @@ import org.bukkit.inventory.ItemStack; import org.modernbeta.admintoolbox.AdminToolboxPlugin; import org.modernbeta.admintoolbox.managers.admin.AdminState.TeleportHistory; +import org.modernbeta.admintoolbox.utils.LocationUtils; import javax.annotation.Nullable; import java.util.Map; @@ -275,15 +277,44 @@ void onAdminJoin(PlayerJoinEvent joinEvent) { /** * Prevent players in admin mode from using the spectator teleport menu unless they have * permission to teleport to players directly. + * + *
+ * PlayerTeleportEvent does not fire on Folia servers.
+ * See PaperMC/Folia#105
*/
@EventHandler
void onAdminTeleport(PlayerTeleportEvent teleportEvent) {
Player player = teleportEvent.getPlayer();
if (!isActiveAdmin(player)) return;
if (teleportEvent.getCause() != PlayerTeleportEvent.TeleportCause.SPECTATE) return;
- if (player.hasPermission(TARGET_PLAYER_PERMISSION))
- // allow if admin can spectate players directly, allow it
+ if (player.hasPermission(TARGET_PLAYER_PERMISSION)) {
+ // allow if admin can spectate players directly, broadcast and allow it
+ Location dest = teleportEvent.getTo();
+
+ Bukkit.getRegionScheduler().run(plugin, dest, (task) -> {
+ dest.getNearbyPlayers(0.5).stream()
+ .filter((nearbyPlayer) -> !nearbyPlayer.getUniqueId().equals(player.getUniqueId()))
+ .findFirst()
+ .ifPresentOrElse((target) -> {
+ plugin.getAdminAudience().sendMessage(Component.text()
+ .color(NamedTextColor.GOLD)
+ .append(Component.text(player.getName()))
+ .append(Component.text(" is spectating at "))
+ .append(Component.text(target.getName()))
+ .build());
+ }, () -> {
+ plugin.getAdminAudience().sendMessage(Component.text()
+ .color(NamedTextColor.GOLD)
+ .append(Component.text(player.getName()))
+ .append(Component.text(" is spectating at "))
+ .append(Component.text(
+ LocationUtils.prettifyCoordinates(teleportEvent.getTo()))
+ )
+ .build());
+ });
+ });
return;
+ }
player.sendRichMessage("