From b6c298cec3c7b05622bf309c1d9c6bb86ade01c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Thu, 19 Jun 2025 01:18:14 +0200 Subject: [PATCH] unlimited admin access --- .../chatMessages/ChatMessagesListener.java | 4 ++ .../joinProtection/JoinProtection.java | 2 + .../playTimer/PlayTimerCommand.java | 19 ++++----- .../appliances/metaGameplay/teams/Teams.java | 17 +++++--- .../adminInvisibility/AdminInvisibility.java | 39 +++++++++++++++++++ .../OnAdminJoinListener.java | 12 ++++++ 6 files changed, 77 insertions(+), 16 deletions(-) create mode 100644 varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/adminInvisibility/AdminInvisibility.java create mode 100644 varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/adminInvisibility/OnAdminJoinListener.java diff --git a/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/chatMessages/ChatMessagesListener.java b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/chatMessages/ChatMessagesListener.java index 6d3f6d1..561c5bf 100644 --- a/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/chatMessages/ChatMessagesListener.java +++ b/common/src/main/java/eu/mhsl/craftattack/spawn/common/appliances/metaGameplay/chatMessages/ChatMessagesListener.java @@ -30,7 +30,9 @@ class ChatMessagesListener extends ApplianceListener { @EventHandler(priority = EventPriority.HIGH) public void onPlayerJoin(PlayerJoinEvent event) { + boolean wasHidden = event.joinMessage() == null; event.joinMessage(null); + if(wasHidden) return; IteratorUtil.onlinePlayers(player -> { if(!Settings.instance().getSetting(player, Settings.Key.ShowJoinAndLeaveMessages, Boolean.class)) return; player.sendMessage( @@ -43,7 +45,9 @@ class ChatMessagesListener extends ApplianceListener { @EventHandler public void onPlayerLeave(PlayerQuitEvent event) { + boolean wasHidden = event.quitMessage() == null; event.quitMessage(null); + if(wasHidden) return; IteratorUtil.onlinePlayers(player -> { if(!Settings.instance().getSetting(player, Settings.Key.ShowJoinAndLeaveMessages, Boolean.class)) return; player.sendMessage( diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/joinProtection/JoinProtection.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/joinProtection/JoinProtection.java index 8cdd56c..621f812 100644 --- a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/joinProtection/JoinProtection.java +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/joinProtection/JoinProtection.java @@ -27,6 +27,8 @@ public class JoinProtection extends Appliance { private final Map protectedPlayers = new HashMap<>(); public void addProtection(Player player) { + if(player.isOp()) return; + this.protectedPlayers.put(player.getUniqueId(), new Options()); PotionEffect resistance = new PotionEffect(PotionEffectType.RESISTANCE, Ticks.TICKS_PER_SECOND * resistanceDuration, 1); PotionEffect blindness = new PotionEffect(PotionEffectType.DARKNESS, Ticks.TICKS_PER_SECOND * 3, 1); diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/playTimer/PlayTimerCommand.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/playTimer/PlayTimerCommand.java index 5ddda49..9757190 100644 --- a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/playTimer/PlayTimerCommand.java +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/playTimer/PlayTimerCommand.java @@ -13,7 +13,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; -import java.util.NoSuchElementException; import java.util.stream.Stream; public class PlayTimerCommand extends ApplianceCommand { @@ -33,20 +32,18 @@ public class PlayTimerCommand extends ApplianceCommand { VaroTeam team = switch (mode) { case "user" -> { OfflinePlayer player = Bukkit.getOfflinePlayer(identifier); - try { - yield teamAppliance.getTeamFromPlayer(player.getUniqueId()); - } catch(NoSuchElementException e) { - throw new Error("Dieser Spieler konnte keinem Team zugeordnet werden!"); - } + yield teamAppliance.getTeamFromPlayer(player.getUniqueId()); } - case "team" -> { - VaroTeam targetTeam = teamAppliance.findTeamByName(identifier); - if (targetTeam == null) throw new Error("Team nicht gefunden."); - yield targetTeam; + case "team" -> teamAppliance.findTeamByName(identifier); + case "incallbyone" -> { + this.getAppliance().incrementAll(); + throw new Error("Incremented all Teams by one!"); } default -> throw new Error("Ungültiger Modus: " + mode + ". Erlaubt: user | team"); }; + if(team == null) throw new Error("Team nicht gefunden."); + switch (action) { case "get" -> { int ticketCount = this.getAppliance().getTickets(team); @@ -67,7 +64,7 @@ public class PlayTimerCommand extends ApplianceCommand { List teams = Main.instance().getAppliance(Teams.class).getAllTeams(); return switch (args.length) { - case 1 -> Stream.of("user", "team") + case 1 -> Stream.of("user", "team", "incAllByOne") .filter(opt -> opt.startsWith(args[0].toLowerCase())) .toList(); diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/Teams.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/Teams.java index d2b71e6..3cf6c7a 100644 --- a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/Teams.java +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/metaGameplay/teams/Teams.java @@ -12,6 +12,7 @@ import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.util.Ticks; import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; import org.bukkit.event.Listener; import org.jetbrains.annotations.NotNull; @@ -65,15 +66,18 @@ public class Teams extends Appliance implements DisplayName.Prefixed, DisplayNam } public boolean canLogin(UUID playerId) { + OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(playerId); + if(offlinePlayer.isOp()) return true; + return this.teams.stream() .anyMatch(varoTeam -> varoTeam.hasMember(playerId) && !Objects.requireNonNull(varoTeam.getMemberById(playerId)).isDead); } - public VaroTeam getTeamFromPlayer(UUID playerId) { + public @Nullable VaroTeam getTeamFromPlayer(UUID playerId) { return this.teams.stream() .filter(varoTeam -> varoTeam.hasMember(playerId)) .findFirst() - .orElseThrow(); + .orElse(null); } public List getAllTeams() { @@ -81,6 +85,8 @@ public class Teams extends Appliance implements DisplayName.Prefixed, DisplayNam } public void enforceTeamJoin(Player joinedPlayer) { + if(joinedPlayer.isOp()) return; + DisconnectInfo teamNotCompleteInfo = new DisconnectInfo( "Teampartner nicht beigetreten", "Deine Verbindung wurde getrennt, da dein Teampartner keine Verbindung zum Server hergestellt hat!", @@ -96,6 +102,7 @@ public class Teams extends Appliance implements DisplayName.Prefixed, DisplayNam ); VaroTeam team = this.getTeamFromPlayer(joinedPlayer.getUniqueId()); + if(team == null) throw new IllegalStateException("Player must be in a Team"); PlayTimer playTimer = Main.instance().getAppliance(PlayTimer.class); boolean isAllowed = playTimer.tryConsumeTicket(team); @@ -150,7 +157,7 @@ public class Teams extends Appliance implements DisplayName.Prefixed, DisplayNam leftPlayer.getUniqueId() ); VaroTeam team = this.getTeamFromPlayer(leftPlayer.getUniqueId()); - team.kickTeam(disconnectInfo); + if(team != null) team.kickTeam(disconnectInfo); } @Override @@ -162,8 +169,8 @@ public class Teams extends Appliance implements DisplayName.Prefixed, DisplayNam public @Nullable Component getNamePrefix(Player player) { VaroTeam team = this.getTeamFromPlayer(player.getUniqueId()); return Component.text( - String.format("[%s]", team.name), - TextColor.fromCSSHexString(team.color) + String.format("[%s]", team != null ? team.name : "?"), + TextColor.fromCSSHexString(team != null ? team.color : "#ffffff") ); } diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/adminInvisibility/AdminInvisibility.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/adminInvisibility/AdminInvisibility.java new file mode 100644 index 0000000..5886844 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/adminInvisibility/AdminInvisibility.java @@ -0,0 +1,39 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.tooling.adminInvisibility; + +import eu.mhsl.craftattack.spawn.core.Main; +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import net.kyori.adventure.text.Component; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class AdminInvisibility extends Appliance { + public void updateVisibility(PlayerJoinEvent event) { + Player target = event.getPlayer(); + boolean shouldBeHidden = target.isOp(); + for (Player viewer : Bukkit.getOnlinePlayers()) { + if (viewer.equals(target)) continue; + + if (shouldBeHidden) { + viewer.hidePlayer(Main.instance(), target); + } else { + viewer.showPlayer(Main.instance(), target); + } + } + + if(shouldBeHidden) { + target.playerListName(Component.empty()); + event.joinMessage(null); + } + } + + + @Override + protected @NotNull List listeners() { + return List.of(new OnAdminJoinListener()); + } +} diff --git a/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/adminInvisibility/OnAdminJoinListener.java b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/adminInvisibility/OnAdminJoinListener.java new file mode 100644 index 0000000..885f859 --- /dev/null +++ b/varo/src/main/java/eu/mhsl/craftattack/spawn/varo/appliances/tooling/adminInvisibility/OnAdminJoinListener.java @@ -0,0 +1,12 @@ +package eu.mhsl.craftattack.spawn.varo.appliances.tooling.adminInvisibility; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerJoinEvent; + +class OnAdminJoinListener extends ApplianceListener { + @EventHandler + public void onJoin(PlayerJoinEvent event) { + this.getAppliance().updateVisibility(event); + } +}