diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java index cd7a232..5b8f62f 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java @@ -123,7 +123,7 @@ public class Fight { if(!player.isOnline()) return; pseudoSpectator(player, true); - }, 2); + }, 1); }else if(gameMode == GameMode.SURVIVAL) { for(Player currentPlayer : Bukkit.getServer().getOnlinePlayers()) { if(currentPlayer.getUniqueId() != player.getUniqueId() && currentPlayer.getGameMode() == GameMode.SPECTATOR) { diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/listener/Border.java b/FightSystem_Core/src/de/steamwar/fightsystem/listener/Border.java index 6ae3384..6f8bddd 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/listener/Border.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/listener/Border.java @@ -58,7 +58,10 @@ public class Border { } public void addPlayer(Player player) { - ghostBarriers.computeIfAbsent(player, uuid -> new HashSet<>()); + if(ghostBarriers.containsKey(player)) + return; + + ghostBarriers.put(player, new HashSet<>()); lastLocation.put(player, player.getLocation()); } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/listener/TeamArea.java b/FightSystem_Core/src/de/steamwar/fightsystem/listener/TeamArea.java index 154919c..cf241bd 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/listener/TeamArea.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/listener/TeamArea.java @@ -21,8 +21,10 @@ package de.steamwar.fightsystem.listener; 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; import de.steamwar.fightsystem.events.TeamSpawnEvent; import de.steamwar.fightsystem.fight.Fight; import de.steamwar.fightsystem.fight.FightPlayer; @@ -31,6 +33,7 @@ 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; @@ -75,6 +78,14 @@ public class TeamArea implements Listener { } } + @EventHandler + public void teamLeave(TeamLeaveEvent e) { + FightPlayer fightPlayer = e.getFightPlayer(); + fightPlayer.ifPlayer(spectatorBorder::addPlayer); + if(fightPlayer.getTeam() == team) + fightPlayer.ifPlayer(bordingBorder::removePlayer); + } + @EventHandler public void boarding(BoardingEvent e) { FightPlayer fightPlayer = e.getFightPlayer(); @@ -114,8 +125,14 @@ public class TeamArea implements Listener { fightPlayer.ifPlayer(player -> { boolean inRegion = team.getExtendRegion().playerInRegion(player.getLocation()); if(inRegion && !realSpectator.contains(player)) { - Fight.pseudoSpectator(player, false); 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);