diff --git a/src/main/java/de/shiewk/smoderation/paper/command/VanishCommand.java b/src/main/java/de/shiewk/smoderation/paper/command/VanishCommand.java index 44b1d0f..dc72f7a 100644 --- a/src/main/java/de/shiewk/smoderation/paper/command/VanishCommand.java +++ b/src/main/java/de/shiewk/smoderation/paper/command/VanishCommand.java @@ -14,6 +14,7 @@ import it.unimi.dsi.fastutil.objects.ObjectArrayList; import it.unimi.dsi.fastutil.objects.ObjectListIterator; import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; +import org.bukkit.NamespacedKey; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -27,6 +28,8 @@ import static net.kyori.adventure.text.Component.text; public final class VanishCommand implements CommandProvider { + public static final NamespacedKey KEY_VANISHED = new NamespacedKey("smoderation", "vanished"); + @Override public LiteralCommandNode getCommandNode() { return literal("vanish") @@ -118,6 +121,28 @@ public final class VanishCommand implements CommandProvider { } } + public static boolean toggleVanishSilent(Player player, boolean force){ + final boolean newStatus = !isVanished(player); + VanishToggleEvent event = new VanishToggleEvent(player, newStatus); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled() && !force){ + return false; + } + if (newStatus){ + vanishedPlayers.add(player); + player.setVisibleByDefault(false); + for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { + if (onlinePlayer.hasPermission("smod.vanish.see")){ + onlinePlayer.showEntity(PLUGIN, player); + } + } + } else { + vanishedPlayers.remove(player); + player.setVisibleByDefault(true); + } + return true; + } + public static boolean isVanished(Player player){ return vanishedPlayers.contains(player); } diff --git a/src/main/java/de/shiewk/smoderation/paper/listener/VanishListener.java b/src/main/java/de/shiewk/smoderation/paper/listener/VanishListener.java index 1ad2030..3a95b4f 100644 --- a/src/main/java/de/shiewk/smoderation/paper/listener/VanishListener.java +++ b/src/main/java/de/shiewk/smoderation/paper/listener/VanishListener.java @@ -2,7 +2,10 @@ package de.shiewk.smoderation.paper.listener; import de.shiewk.smoderation.paper.SModerationPaper; import de.shiewk.smoderation.paper.command.VanishCommand; +import net.kyori.adventure.key.Key; +import net.kyori.adventure.sound.Sound; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextDecoration; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -11,16 +14,27 @@ import org.bukkit.event.Listener; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.persistence.PersistentDataType; import static de.shiewk.smoderation.paper.SModerationPaper.SECONDARY_COLOR; import static net.kyori.adventure.text.Component.text; public class VanishListener implements Listener { - @EventHandler public void onPlayerQuit(PlayerQuitEvent event){ + public static final Component PREFIX = text("[VANISH] ").color(SECONDARY_COLOR); + + @EventHandler(priority = EventPriority.HIGH) public void onPlayerQuit(PlayerQuitEvent event){ final Player player = event.getPlayer(); if (VanishCommand.isVanished(player)){ - VanishCommand.toggleVanish(player); + player.getPersistentDataContainer().set(VanishCommand.KEY_VANISHED, PersistentDataType.BOOLEAN, true); + VanishCommand.toggleVanishSilent(player, true); + Component message = event.quitMessage(); + event.quitMessage(null); + if (message != null){ + broadcast(message.color(null)); + } + } else { + player.getPersistentDataContainer().remove(VanishCommand.KEY_VANISHED); } for (Player vanishedPlayer : VanishCommand.getVanishedPlayers()) { // to clean up visibility status @@ -29,9 +43,33 @@ public class VanishListener implements Listener { } @EventHandler(priority = EventPriority.MONITOR) public void onPlayerJoin(PlayerJoinEvent event){ + final Player player = event.getPlayer(); + if (player.getPersistentDataContainer().has(VanishCommand.KEY_VANISHED)){ + boolean state = VanishCommand.toggleVanishSilent(player, false); + if (state){ + Component message = event.joinMessage(); + event.joinMessage(null); + if (message != null){ + broadcast(message.color(null)); + } + Bukkit.getScheduler().scheduleSyncDelayedTask(SModerationPaper.PLUGIN, () -> { + player.sendMessage(SModerationPaper.CHAT_PREFIX + .decorate(TextDecoration.BOLD) + .append( + text("You are still vanished!") + )); + player.playSound(Sound.sound( + Key.key("minecraft", "block.beacon.power_select"), + Sound.Source.MASTER, + 1f, + 1f + ), player); + }, 20); + } else { + player.getPersistentDataContainer().remove(VanishCommand.KEY_VANISHED); + } + } Bukkit.getScheduler().scheduleSyncDelayedTask(SModerationPaper.PLUGIN, () -> { - final Player player = event.getPlayer().getPlayer(); - assert player != null; if (player.hasPermission("smod.vanish.see")){ for (Player vanishedPlayer : VanishCommand.getVanishedPlayers()) { // to show visible vanished players @@ -47,10 +85,16 @@ public class VanishListener implements Listener { final Component message = event.deathMessage(); if (VanishCommand.isVanished(event.getPlayer()) && message != null){ event.deathMessage(null); - for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { - if (onlinePlayer.hasPermission("smod.vanish.see")){ - onlinePlayer.sendMessage(text("[VANISH] ").color(SECONDARY_COLOR).append(message)); - } + broadcast(message); + } + } + + private static void broadcast(Component message) { + Component result = PREFIX.append(message); + SModerationPaper.LOGGER.info(result); + for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { + if (onlinePlayer.hasPermission("smod.vanish.see")){ + onlinePlayer.sendMessage(result); } } }