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..399970ca
--- /dev/null
+++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/Spectator.java
@@ -0,0 +1,114 @@
+/*
+ * 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.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;
+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.AntiTest, FightState.All, this);
+ new StateDependentTask(ArenaMode.AntiTest, FightState.All, this::pseudoSpectatorCheck, 1, 1);
+ }
+
+ @EventHandler(priority = EventPriority.MONITOR)
+ public void handlePlayerJoin(PlayerJoinEvent e) {
+ Player player = e.getPlayer();
+
+ 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 p : Bukkit.getServer().getOnlinePlayers()) {
+ if(p.getUniqueId() != player.getUniqueId())
+ p.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);
- }
- });
- }
}
}