forked from SteamWar/SteamWar
Merge pull request 'Fix spectator handling' (#38) from spectator-improvements into main
Reviewed-on: SteamWar/SteamWar#38 Reviewed-by: Chaoscaot <max@chaoscaot.de>
This commit is contained in:
@@ -97,6 +97,7 @@ public class FightSystem extends JavaPlugin {
|
|||||||
new PrepareSchem();
|
new PrepareSchem();
|
||||||
new TestJoin();
|
new TestJoin();
|
||||||
new NormalJoin();
|
new NormalJoin();
|
||||||
|
new Spectator();
|
||||||
new RunningWorldInteraction();
|
new RunningWorldInteraction();
|
||||||
new PersonalKitCreator();
|
new PersonalKitCreator();
|
||||||
new ArrowStopper();
|
new ArrowStopper();
|
||||||
|
|||||||
@@ -104,40 +104,6 @@ public class Fight {
|
|||||||
return null;
|
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() {
|
public static boolean publicOnly() {
|
||||||
if (Config.OnlyPublicSchematics) {
|
if (Config.OnlyPublicSchematics) {
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -282,9 +282,9 @@ public class FightTeam {
|
|||||||
FightSystem.getHullHider().updatePlayer(player);
|
FightSystem.getHullHider().updatePlayer(player);
|
||||||
|
|
||||||
if(FightState.Spectate.contains(FightState.getFightState())) {
|
if(FightState.Spectate.contains(FightState.getFightState())) {
|
||||||
Fight.setPlayerGamemode(player, GameMode.SPECTATOR);
|
player.setGameMode(GameMode.SPECTATOR);
|
||||||
} else {
|
} else {
|
||||||
Fight.setPlayerGamemode(player, GameMode.SURVIVAL);
|
player.setGameMode(GameMode.SURVIVAL);
|
||||||
(FightState.ingame() ? fightPlayer.getKit() : memberKit).loadToPlayer(player);
|
(FightState.ingame() ? fightPlayer.getKit() : memberKit).loadToPlayer(player);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -317,7 +317,7 @@ public class FightTeam {
|
|||||||
entity.teleport(Config.SpecSpawn);
|
entity.teleport(Config.SpecSpawn);
|
||||||
|
|
||||||
fightPlayer.ifPlayer(player -> {
|
fightPlayer.ifPlayer(player -> {
|
||||||
Fight.setPlayerGamemode(player, GameMode.SPECTATOR);
|
player.setGameMode(GameMode.SPECTATOR);
|
||||||
player.getInventory().clear();
|
player.getInventory().clear();
|
||||||
|
|
||||||
if(player.isOnline()){
|
if(player.isOnline()){
|
||||||
@@ -517,14 +517,14 @@ public class FightTeam {
|
|||||||
@Override
|
@Override
|
||||||
public void enable() {
|
public void enable() {
|
||||||
players.values().forEach(fightPlayer -> {
|
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);
|
fightPlayer.getEntity().teleport(FightTeam.this.spawn);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void disable() {
|
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)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -84,6 +84,6 @@ public class LeaveableArena implements Listener {
|
|||||||
|
|
||||||
private void markInArena(Player player) {
|
private void markInArena(Player player) {
|
||||||
spectatorsInArena.put(player, player.getGameMode());
|
spectatorsInArena.put(player, player.getGameMode());
|
||||||
Fight.setPlayerGamemode(player, GameMode.SPECTATOR);
|
player.setGameMode(GameMode.SPECTATOR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ public class Permanent implements Listener {
|
|||||||
public void handlePlayerRespawn(PlayerRespawnEvent event){
|
public void handlePlayerRespawn(PlayerRespawnEvent event){
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
if(Fight.fighting(player)) {
|
if(Fight.fighting(player)) {
|
||||||
Fight.setPlayerGamemode(player, GameMode.SPECTATOR);
|
player.setGameMode(GameMode.SPECTATOR);
|
||||||
|
|
||||||
FightTeam team = Fight.getPlayerTeam(player);
|
FightTeam team = Fight.getPlayerTeam(player);
|
||||||
event.setRespawnLocation(team == null ? Config.SpecSpawn : team.getSpawn());
|
event.setRespawnLocation(team == null ? Config.SpecSpawn : team.getSpawn());
|
||||||
@@ -98,11 +98,11 @@ public class Permanent implements Listener {
|
|||||||
FightPlayer fp = Fight.getFightPlayer(player);
|
FightPlayer fp = Fight.getFightPlayer(player);
|
||||||
|
|
||||||
if (!Config.ArenaLeaveable && fp == null) {
|
if (!Config.ArenaLeaveable && fp == null) {
|
||||||
Fight.setPlayerGamemode(player, GameMode.SPECTATOR);
|
player.setGameMode(GameMode.SPECTATOR);
|
||||||
spectatorTeam.addEntry(player.getName());
|
spectatorTeam.addEntry(player.getName());
|
||||||
player.teleport(Config.SpecSpawn);
|
player.teleport(Config.SpecSpawn);
|
||||||
} else if(fp != null && !fp.isLiving()) {
|
} else if(fp != null && !fp.isLiving()) {
|
||||||
Fight.setPlayerGamemode(player, GameMode.SPECTATOR);
|
player.setGameMode(GameMode.SPECTATOR);
|
||||||
player.teleport(fp.getTeam().getSpawn());
|
player.teleport(fp.getTeam().getSpawn());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
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<Player> 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));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,9 +19,14 @@
|
|||||||
|
|
||||||
package de.steamwar.fightsystem.listener;
|
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.ArenaMode;
|
||||||
import de.steamwar.fightsystem.Config;
|
import de.steamwar.fightsystem.Config;
|
||||||
import de.steamwar.fightsystem.FightSystem;
|
|
||||||
import de.steamwar.fightsystem.events.BoardingEvent;
|
import de.steamwar.fightsystem.events.BoardingEvent;
|
||||||
import de.steamwar.fightsystem.events.TeamDeathEvent;
|
import de.steamwar.fightsystem.events.TeamDeathEvent;
|
||||||
import de.steamwar.fightsystem.events.TeamLeaveEvent;
|
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.FightState;
|
||||||
import de.steamwar.fightsystem.states.OneShotStateDependent;
|
import de.steamwar.fightsystem.states.OneShotStateDependent;
|
||||||
import de.steamwar.fightsystem.states.StateDependentListener;
|
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 {
|
public class TeamArea implements Listener {
|
||||||
|
|
||||||
private final FightTeam team;
|
private final FightTeam team;
|
||||||
private final Border spectatorBorder;
|
private final Border spectatorBorder;
|
||||||
private final Border bordingBorder;
|
private final Border bordingBorder;
|
||||||
private final Set<Player> realSpectator = new HashSet<>();
|
|
||||||
|
|
||||||
public TeamArea(FightTeam team) {
|
public TeamArea(FightTeam team) {
|
||||||
this.team = 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");
|
this.bordingBorder = new Border(team.getExtendRegion().to2d(), true, 1, "NO_ENTERN", team.getName() + ".boardingBorder");
|
||||||
|
|
||||||
new StateDependentListener(ArenaMode.AntiTest, FightState.All, this);
|
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)));
|
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();
|
Player player = e.getPlayer();
|
||||||
spectatorBorder.removePlayer(player);
|
spectatorBorder.removePlayer(player);
|
||||||
bordingBorder.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);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user