diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/Permission.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/Permission.java index ecc1df44..1cbb5d9f 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/Permission.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/Permission.java @@ -27,8 +27,6 @@ import de.steamwar.sql.SteamwarUser; import lombok.AllArgsConstructor; import org.bukkit.entity.Player; -import java.util.HashSet; -import java.util.Set; import java.util.function.Predicate; @AllArgsConstructor @@ -39,13 +37,12 @@ public enum Permission { return bauweltMember.isSupervisor(); }), BUILD(bauweltMember -> { - if (isTempOnlySpectator(bauweltMember)) return false; return bauweltMember.isBuild() || SUPERVISOR.permissionPredicate.test(bauweltMember); }), /** * Only used for {@link BauMemberUpdate} */ - REAL_SPECTATOR(bauweltMember -> { + SPECTATOR(bauweltMember -> { return !bauweltMember.isBuild() && !bauweltMember.isSupervisor(); }), /** @@ -55,28 +52,6 @@ public enum Permission { return true; }); - private static final Set TEMP_ONLY_SPECTATOR = new HashSet<>(); - - private static boolean isTempOnlySpectator(BauweltMember bauweltMember) { - return TEMP_ONLY_SPECTATOR.contains(bauweltMember.getMemberID()); - } - - public static boolean isTempOnlySpectator(Player player) { - return TEMP_ONLY_SPECTATOR.contains(SteamwarUser.get(player.getUniqueId()).getId()); - } - - public static void forceOnlySpectator(Player player) { - TEMP_ONLY_SPECTATOR.add(SteamwarUser.get(player.getUniqueId()).getId()); - BauMemberUpdate.baumemberUpdate(); - } - - /** - * Only used by {@link BauMemberUpdate} - */ - public static void removeForceOnlySpectator(Player player) { - TEMP_ONLY_SPECTATOR.remove(SteamwarUser.get(player.getUniqueId()).getId()); - } - private final Predicate permissionPredicate; public boolean hasPermission(BauweltMember bauweltMember) { @@ -86,10 +61,10 @@ public enum Permission { public boolean hasPermission(Player member) { if (SteamwarUser.get(member.getUniqueId()).getId() == BauServer.getInstance().getOwnerID()) { - return this != REAL_SPECTATOR; + return this != SPECTATOR; } BauweltMember bauweltMember = BauweltMember.getBauMember(BauServer.getInstance().getOwner(), member.getUniqueId()); - if (bauweltMember == null) return this == REAL_SPECTATOR; + if (bauweltMember == null) return this == SPECTATOR; return permissionPredicate.test(bauweltMember); } } \ No newline at end of file diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/bau/ForceSpectatorCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/bau/ForceSpectatorCommand.java deleted file mode 100644 index a4e79c2f..00000000 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/bau/ForceSpectatorCommand.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2025 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.steamwar.bausystem.features.bau; - -import de.steamwar.bausystem.Permission; -import de.steamwar.command.PreviousArguments; -import de.steamwar.command.SWCommand; -import de.steamwar.command.TypeMapper; -import de.steamwar.linkage.Linked; -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.Collection; -import java.util.stream.Collectors; - -@Linked -public class ForceSpectatorCommand extends SWCommand { - - public ForceSpectatorCommand() { - super("forcespectator"); - } - - @Register - public void forceSpectator(@Validator("supervisor") Player player, @Mapper("builder") Player other) { - Permission.forceOnlySpectator(other); - } - - @Mapper("builder") - public TypeMapper spectatorMapper() { - return new TypeMapper<>() { - @Override - public Player map(CommandSender commandSender, String[] previousArguments, String s) { - Player player = Bukkit.getPlayer(s); - if (player == null) { - return null; - } - if (Permission.BUILD.hasPermission(player) && !Permission.SUPERVISOR.hasPermission(player)) { - return player; - } - return null; - } - - @Override - public Collection tabCompletes(CommandSender sender, PreviousArguments previousArguments, String s) { - return Bukkit.getOnlinePlayers().stream() - .filter(Permission.BUILD::hasPermission) - .filter(player -> !Permission.SUPERVISOR.hasPermission(player)) - .map(Player::getName) - .collect(Collectors.toList()); - } - }; - } -} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/techhider/TechHiderCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/techhider/TechHiderCommand.java index 7cb18b50..74888bec 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/techhider/TechHiderCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/techhider/TechHiderCommand.java @@ -107,7 +107,7 @@ public class TechHiderCommand extends SWCommand implements Listener, ScoreboardE @Override public Player map(CommandSender commandSender, String[] previousArguments, String s) { Player player = Bukkit.getPlayer(s); - if (player != null && Permission.REAL_SPECTATOR.hasPermission(player)) { + if (player != null && Permission.SPECTATOR.hasPermission(player)) { return player; } return null; @@ -116,7 +116,7 @@ public class TechHiderCommand extends SWCommand implements Listener, ScoreboardE @Override public Collection tabCompletes(CommandSender sender, PreviousArguments previousArguments, String s) { return Bukkit.getOnlinePlayers().stream() - .filter(Permission.REAL_SPECTATOR::hasPermission) + .filter(Permission.SPECTATOR::hasPermission) .map(Player::getName) .collect(Collectors.toList()); } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/BauMemberUpdate.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/BauMemberUpdate.java index a60e2958..1568ba5f 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/BauMemberUpdate.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/BauMemberUpdate.java @@ -59,18 +59,14 @@ public class BauMemberUpdate extends PacketHandler implements Listener { Set newSpectator = new HashSet<>(); Set newBuilder = new HashSet<>(); Bukkit.getOnlinePlayers().forEach(player -> { - if (Permission.REAL_SPECTATOR.hasPermission(player)) { + if (Permission.SPECTATOR.hasPermission(player)) { if (!SPECTATORS.contains(player)) { SPECTATORS.add(player); - Permission.removeForceOnlySpectator(player); newSpectator.add(player); player.addPotionEffect(new PotionEffect(PotionEffectType.GLOWING, -1, 1, false,false, false)); showSpectatorNotice(player); } } else { - if (Permission.SUPERVISOR.hasPermission(player)) { - Permission.removeForceOnlySpectator(player); - } if (SPECTATORS.contains(player)) { SPECTATORS.remove(player); newBuilder.add(player); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/SpectatorListener.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/SpectatorListener.java index 9874c1fd..cfdc6fe3 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/SpectatorListener.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/SpectatorListener.java @@ -49,6 +49,7 @@ import java.util.Set; @Linked public class SpectatorListener implements Listener { + private static final TechHider techHider; private static final Set NO_TECHHIDER = new HashSet<>(); static { @@ -100,10 +101,20 @@ public class SpectatorListener implements Listener { materials.add(Material.WATER); materials.remove(Material.BARRIER); materials.remove(Material.STONE); - TechHider techHider = new TechHider((TechHider.LocationEvaluator) (player, i, i1) -> { - return Permission.BUILD.hasPermission(player) || Permission.isTempOnlySpectator(player) || NO_TECHHIDER.contains(player); + techHider = new TechHider((TechHider.LocationEvaluator) (player, i, i1) -> { + return Permission.BUILD.hasPermission(player) || NO_TECHHIDER.contains(player); }, Material.END_STONE, materials, new HashSet<>()); - techHider.enable(); + } + + private static void enableOrDisableTechhider() { + boolean enable = Bukkit.getOnlinePlayers() + .stream() + .anyMatch(player -> !(Permission.BUILD.hasPermission(player) || NO_TECHHIDER.contains(player))); + if (enable) { + techHider.enable(); + } else { + techHider.disable(); + } } public static void toggleNoTechHider(Player player) { @@ -113,6 +124,7 @@ public class SpectatorListener implements Listener { NO_TECHHIDER.add(player); } resendChunks(player); + enableOrDisableTechhider(); } private static void resendChunks(Player player) { @@ -131,6 +143,7 @@ public class SpectatorListener implements Listener { @EventHandler public void onPlayerJoin(PlayerJoinEvent event) { + enableOrDisableTechhider(); if (BauSystem.DEV_SERVER) return; if (event.getPlayer().getUniqueId().equals(BauServer.getInstance().getOwner())) { return; @@ -152,6 +165,7 @@ public class SpectatorListener implements Listener { @EventHandler public void onBauMemberUpdate(BauMemberUpdateEvent event) { + enableOrDisableTechhider(); if (!anySupervisorOnline(null) && !BauSystem.DEV_SERVER) { Bukkit.getOnlinePlayers().forEach(player -> { player.kickPlayer(""); @@ -161,7 +175,6 @@ public class SpectatorListener implements Listener { event.getChanged().forEach(player -> { NO_TECHHIDER.remove(player); - if (Permission.isTempOnlySpectator(player)) return; resendChunks(player); }); } @@ -169,6 +182,7 @@ public class SpectatorListener implements Listener { @EventHandler public void onPlayerQuit(PlayerQuitEvent event) { NO_TECHHIDER.remove(event.getPlayer()); + Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), SpectatorListener::enableOrDisableTechhider, 1); if (BauSystem.DEV_SERVER) return; if (!anySupervisorOnline(event.getPlayer())) { Bukkit.getOnlinePlayers().forEach(player -> {