From 2405c5e6205f87a16dc8d3c3929625a2f54105b7 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Tue, 8 Apr 2025 21:31:47 +0200 Subject: [PATCH 1/3] Fix spectator handling --- .../de/steamwar/fightsystem/FightSystem.java | 1 + .../de/steamwar/fightsystem/fight/Fight.java | 34 ------ .../steamwar/fightsystem/fight/FightTeam.java | 10 +- .../fightsystem/listener/LeaveableArena.java | 2 +- .../fightsystem/listener/Permanent.java | 6 +- .../fightsystem/listener/Spectator.java | 102 ++++++++++++++++++ .../fightsystem/listener/TeamArea.java | 44 ++------ 7 files changed, 118 insertions(+), 81 deletions(-) create mode 100644 FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/Spectator.java diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java index 23e2bb0c..b32a41b9 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java @@ -97,6 +97,7 @@ public class FightSystem extends JavaPlugin { new PrepareSchem(); new TestJoin(); new NormalJoin(); + new Spectator(); new RunningWorldInteraction(); new PersonalKitCreator(); new ArrowStopper(); diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java index 5b8f62f9..1f205122 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java @@ -104,40 +104,6 @@ public class Fight { return null; } - @SuppressWarnings("deprecation") - public static void setPlayerGamemode(Player player, GameMode gameMode) { - player.setGameMode(gameMode); - - if(gameMode == GameMode.SPECTATOR) { - for(Player currentPlayer : Bukkit.getServer().getOnlinePlayers()) { - if(currentPlayer.getUniqueId() != player.getUniqueId() && currentPlayer.getGameMode() == GameMode.SPECTATOR) { - currentPlayer.hidePlayer(player); - player.hidePlayer(currentPlayer); - } - } - - if(Config.test() || Config.isReferee(player)) - return; - - Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), () -> { - if(!player.isOnline()) - return; - pseudoSpectator(player, true); - }, 1); - }else if(gameMode == GameMode.SURVIVAL) { - for(Player currentPlayer : Bukkit.getServer().getOnlinePlayers()) { - if(currentPlayer.getUniqueId() != player.getUniqueId() && currentPlayer.getGameMode() == GameMode.SPECTATOR) { - currentPlayer.showPlayer(player); - player.showPlayer(currentPlayer); - } - } - } - } - - public static void pseudoSpectator(Player player, boolean enable) { - TinyProtocol.instance.sendPacket(player, ProtocolWrapper.impl.playerInfoPacketConstructor(ProtocolWrapper.PlayerInfoAction.GAMEMODE, new GameProfile(player.getUniqueId(), player.getName()), enable ? GameMode.CREATIVE : GameMode.SPECTATOR)); - } - public static boolean publicOnly() { if (Config.OnlyPublicSchematics) { return true; diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java index 3c834fd1..0cb68f71 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/fight/FightTeam.java @@ -282,9 +282,9 @@ public class FightTeam { FightSystem.getHullHider().updatePlayer(player); if(FightState.Spectate.contains(FightState.getFightState())) { - Fight.setPlayerGamemode(player, GameMode.SPECTATOR); + player.setGameMode(GameMode.SPECTATOR); } else { - Fight.setPlayerGamemode(player, GameMode.SURVIVAL); + player.setGameMode(GameMode.SURVIVAL); (FightState.ingame() ? fightPlayer.getKit() : memberKit).loadToPlayer(player); } }); @@ -317,7 +317,7 @@ public class FightTeam { entity.teleport(Config.SpecSpawn); fightPlayer.ifPlayer(player -> { - Fight.setPlayerGamemode(player, GameMode.SPECTATOR); + player.setGameMode(GameMode.SPECTATOR); player.getInventory().clear(); if(player.isOnline()){ @@ -517,14 +517,14 @@ public class FightTeam { @Override public void enable() { players.values().forEach(fightPlayer -> { - fightPlayer.ifPlayer(player -> Fight.setPlayerGamemode(player, GameMode.SPECTATOR)); + fightPlayer.ifPlayer(player -> player.setGameMode(GameMode.SPECTATOR)); fightPlayer.getEntity().teleport(FightTeam.this.spawn); }); } @Override public void disable() { - players.values().forEach(fightPlayer -> fightPlayer.ifPlayer(player -> Fight.setPlayerGamemode(player, GameMode.SURVIVAL))); + players.values().forEach(fightPlayer -> fightPlayer.ifPlayer(player -> player.setGameMode(GameMode.SURVIVAL))); } } } diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/LeaveableArena.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/LeaveableArena.java index 9d0bb4e2..36a5a189 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/LeaveableArena.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/LeaveableArena.java @@ -84,6 +84,6 @@ public class LeaveableArena implements Listener { private void markInArena(Player player) { spectatorsInArena.put(player, player.getGameMode()); - Fight.setPlayerGamemode(player, GameMode.SPECTATOR); + player.setGameMode(GameMode.SPECTATOR); } } diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/Permanent.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/Permanent.java index 2f3138ec..4976463c 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/Permanent.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/Permanent.java @@ -74,7 +74,7 @@ public class Permanent implements Listener { public void handlePlayerRespawn(PlayerRespawnEvent event){ Player player = event.getPlayer(); if(Fight.fighting(player)) { - Fight.setPlayerGamemode(player, GameMode.SPECTATOR); + player.setGameMode(GameMode.SPECTATOR); FightTeam team = Fight.getPlayerTeam(player); event.setRespawnLocation(team == null ? Config.SpecSpawn : team.getSpawn()); @@ -98,11 +98,11 @@ public class Permanent implements Listener { FightPlayer fp = Fight.getFightPlayer(player); if (!Config.ArenaLeaveable && fp == null) { - Fight.setPlayerGamemode(player, GameMode.SPECTATOR); + player.setGameMode(GameMode.SPECTATOR); spectatorTeam.addEntry(player.getName()); player.teleport(Config.SpecSpawn); } else if(fp != null && !fp.isLiving()) { - Fight.setPlayerGamemode(player, GameMode.SPECTATOR); + player.setGameMode(GameMode.SPECTATOR); player.teleport(fp.getTeam().getSpawn()); } } diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/Spectator.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/Spectator.java new file mode 100644 index 00000000..cdd034a1 --- /dev/null +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/Spectator.java @@ -0,0 +1,102 @@ +/* + * 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.fightsystem.listener; + +import java.util.HashSet; +import java.util.Set; + +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerGameModeChangeEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import com.comphenix.tinyprotocol.TinyProtocol; +import com.mojang.authlib.GameProfile; + +import de.steamwar.core.ProtocolWrapper; +import de.steamwar.fightsystem.ArenaMode; +import de.steamwar.fightsystem.Config; +import de.steamwar.fightsystem.fight.Fight; +import de.steamwar.fightsystem.fight.FightPlayer; +import de.steamwar.fightsystem.states.FightState; +import de.steamwar.fightsystem.states.StateDependentListener; +import de.steamwar.fightsystem.states.StateDependentTask; + + +public class Spectator implements Listener { + + private final Set pseudoSpectator = new HashSet<>(); + + public Spectator() { + new StateDependentListener(ArenaMode.All, FightState.All, this); + new StateDependentTask(ArenaMode.AntiTest, FightState.All, this::pseudoSpectatorCheck, 1, 1); + } + + @EventHandler + @SuppressWarnings("deprecation") + public void onGameModeChange(PlayerGameModeChangeEvent e) { + Player player = e.getPlayer(); + + if (e.getNewGameMode() == GameMode.SPECTATOR) { + for(Player currentPlayer : Bukkit.getServer().getOnlinePlayers()) { + if(currentPlayer.getUniqueId() != player.getUniqueId()) + currentPlayer.hidePlayer(player); + } + } else { + for(Player currentPlayer : Bukkit.getServer().getOnlinePlayers()) { + if(currentPlayer.getUniqueId() != player.getUniqueId()) + currentPlayer.showPlayer(player); + } + } + } + + @EventHandler + public void playerQuit(PlayerQuitEvent e) { + pseudoSpectator.remove(e.getPlayer()); + } + + private void pseudoSpectatorCheck() { + for (Player player : Bukkit.getOnlinePlayers()) { + if (player.getGameMode() != GameMode.SPECTATOR) { + pseudoSpectator.remove(player); + continue; + } + + if (Config.isReferee(player)) + continue; + + FightPlayer fightPlayer = Fight.getFightPlayer(player); + if (fightPlayer == null || !fightPlayer.getTeam().getExtendRegion().playerInRegion(player.getLocation())) { + if (pseudoSpectator.add(player)) + pseudoSpectator(player, true); + } else { + if (pseudoSpectator.remove(player)) + pseudoSpectator(player, false); + } + } + } + + private static void pseudoSpectator(Player player, boolean enable) { + TinyProtocol.instance.sendPacket(player, ProtocolWrapper.impl.playerInfoPacketConstructor(ProtocolWrapper.PlayerInfoAction.GAMEMODE, new GameProfile(player.getUniqueId(), player.getName()), enable ? GameMode.CREATIVE : GameMode.SPECTATOR)); + } +} diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/TeamArea.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/TeamArea.java index 2720b25c..2f888452 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/TeamArea.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/TeamArea.java @@ -19,9 +19,14 @@ package de.steamwar.fightsystem.listener; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + import de.steamwar.fightsystem.ArenaMode; import de.steamwar.fightsystem.Config; -import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.events.BoardingEvent; import de.steamwar.fightsystem.events.TeamDeathEvent; import de.steamwar.fightsystem.events.TeamLeaveEvent; @@ -32,23 +37,12 @@ import de.steamwar.fightsystem.fight.FightTeam; import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.states.OneShotStateDependent; import de.steamwar.fightsystem.states.StateDependentListener; -import de.steamwar.fightsystem.states.StateDependentTask; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerQuitEvent; - -import java.util.HashSet; -import java.util.Set; public class TeamArea implements Listener { private final FightTeam team; private final Border spectatorBorder; private final Border bordingBorder; - private final Set realSpectator = new HashSet<>(); public TeamArea(FightTeam team) { this.team = team; @@ -56,7 +50,6 @@ public class TeamArea implements Listener { this.bordingBorder = new Border(team.getExtendRegion().to2d(), true, 1, "NO_ENTERN", team.getName() + ".boardingBorder"); new StateDependentListener(ArenaMode.AntiTest, FightState.All, this); - new StateDependentTask(ArenaMode.AntiTest, FightState.TeamFix, this::realSpectatorCheck, 1, 1); new OneShotStateDependent(ArenaMode.AntiTest, FightState.Spectate, () -> Fight.teams().forEach(t -> t.getPlayers().forEach(this::teamSpectator))); } @@ -114,30 +107,5 @@ public class TeamArea implements Listener { Player player = e.getPlayer(); spectatorBorder.removePlayer(player); bordingBorder.removePlayer(player); - realSpectator.remove(player); - } - - private void realSpectatorCheck() { - for(FightPlayer fightPlayer : team.getPlayers()) { - if(fightPlayer.isLiving()) - continue; - - fightPlayer.ifPlayer(player -> { - boolean inRegion = team.getExtendRegion().playerInRegion(player.getLocation()); - if(inRegion && !realSpectator.contains(player)) { - realSpectator.add(player); - - //Later to prevent race condition with Fight.setSpecatator() during respawn - Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), () -> { - if(!player.isOnline()) - return; - Fight.pseudoSpectator(player, false); - }, 2); - }else if(!inRegion && realSpectator.contains(player)) { - Fight.pseudoSpectator(player, true); - realSpectator.remove(player); - } - }); - } } } From f2d8c9c02b8809cf5bd37ac20b1a4b426af3a079 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Tue, 8 Apr 2025 21:34:41 +0200 Subject: [PATCH 2/3] Only AntiTest --- .../src/de/steamwar/fightsystem/listener/Spectator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/Spectator.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/Spectator.java index cdd034a1..405f2b0d 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/Spectator.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/Spectator.java @@ -48,7 +48,7 @@ public class Spectator implements Listener { private final Set pseudoSpectator = new HashSet<>(); public Spectator() { - new StateDependentListener(ArenaMode.All, FightState.All, this); + new StateDependentListener(ArenaMode.AntiTest, FightState.All, this); new StateDependentTask(ArenaMode.AntiTest, FightState.All, this::pseudoSpectatorCheck, 1, 1); } From cf4ac95c2f4d55c3caf47babea81ce695581a3fe Mon Sep 17 00:00:00 2001 From: Lixfel Date: Wed, 9 Apr 2025 21:04:28 +0200 Subject: [PATCH 3/3] Bugfix after testing --- .../fightsystem/listener/Spectator.java | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/Spectator.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/Spectator.java index 405f2b0d..399970ca 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/Spectator.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/Spectator.java @@ -26,8 +26,10 @@ import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerGameModeChangeEvent; +import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import com.comphenix.tinyprotocol.TinyProtocol; @@ -52,20 +54,30 @@ public class Spectator implements Listener { new StateDependentTask(ArenaMode.AntiTest, FightState.All, this::pseudoSpectatorCheck, 1, 1); } - @EventHandler - @SuppressWarnings("deprecation") - public void onGameModeChange(PlayerGameModeChangeEvent e) { + @EventHandler(priority = EventPriority.MONITOR) + public void handlePlayerJoin(PlayerJoinEvent e) { Player player = e.getPlayer(); - if (e.getNewGameMode() == GameMode.SPECTATOR) { - for(Player currentPlayer : Bukkit.getServer().getOnlinePlayers()) { - if(currentPlayer.getUniqueId() != player.getUniqueId()) - currentPlayer.hidePlayer(player); + if(player.getGameMode() == GameMode.SPECTATOR) + gameModeChange(player, GameMode.SPECTATOR); + } + + @EventHandler + public void onGameModeChange(PlayerGameModeChangeEvent e) { + gameModeChange(e.getPlayer(), e.getNewGameMode()); + } + + @SuppressWarnings("deprecation") + private void gameModeChange(Player player, GameMode gameMode) { + if (gameMode == GameMode.SPECTATOR) { + for(Player p : Bukkit.getServer().getOnlinePlayers()) { + if(p.getUniqueId() != player.getUniqueId()) + p.hidePlayer(player); } } else { - for(Player currentPlayer : Bukkit.getServer().getOnlinePlayers()) { - if(currentPlayer.getUniqueId() != player.getUniqueId()) - currentPlayer.showPlayer(player); + for(Player p : Bukkit.getServer().getOnlinePlayers()) { + if(p.getUniqueId() != player.getUniqueId()) + p.showPlayer(player); } } }