Răsfoiți Sursa

Reworking teleport & respawn, adding safe-teleport

RedstoneFuture 1 an în urmă
părinte
comite
6b419009a3

+ 17 - 8
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/Game.java

@@ -33,6 +33,7 @@ import de.butzlabben.missilewars.game.enums.TeamType;
 import de.butzlabben.missilewars.game.equipment.EquipmentManager;
 import de.butzlabben.missilewars.game.misc.MotdManager;
 import de.butzlabben.missilewars.game.misc.ScoreboardManager;
+import de.butzlabben.missilewars.game.misc.TeamSpawnProtection;
 import de.butzlabben.missilewars.game.schematics.SchematicFacing;
 import de.butzlabben.missilewars.game.schematics.objects.Missile;
 import de.butzlabben.missilewars.game.schematics.objects.Shield;
@@ -423,12 +424,15 @@ public class Game {
     }
 
     /**
-     * This method respawns the player after short time.
+     * This method respawns the player after a short time.
      *
-     * @param player the target player
+     * @param mwPlayer the target MissileWars player
      */
-    public void autoRespawnPlayer(Player player) {
-        Bukkit.getScheduler().runTaskLater(MissileWars.getInstance(), () -> player.spigot().respawn(), 20L);
+    public void autoRespawnPlayer(MWPlayer mwPlayer) {
+        Bukkit.getScheduler().runTaskLater(MissileWars.getInstance(), () -> {
+            TeamSpawnProtection.regenerateSpawn(mwPlayer.getTeam());
+            mwPlayer.getPlayer().spigot().respawn();
+            }, 20L);
     }
 
     /**
@@ -717,18 +721,23 @@ public class Game {
     }
 
     public void teleportToFallbackSpawn(Player player) {
-        player.teleport(Config.getFallbackSpawn());
+        teleportSafely(player, Config.getFallbackSpawn());
     }
 
     public void teleportToLobbySpawn(Player player) {
-        player.teleport(lobby.getSpawnPoint());
+        teleportSafely(player, lobby.getSpawnPoint());
     }
 
     public void teleportToArenaSpectatorSpawn(Player player) {
-        player.teleport(arena.getSpectatorSpawn());
+        teleportSafely(player, arena.getSpectatorSpawn());
     }
 
     public void teleportToAfterGameSpawn(Player player) {
-        player.teleport(lobby.getAfterGameSpawn());
+        teleportSafely(player, lobby.getAfterGameSpawn());
+    }
+    
+    public static void teleportSafely(Player player, Location targetLocation) {
+        player.setVelocity(new Vector(0, 0, 0));
+        player.teleport(targetLocation);
     }
 }

+ 2 - 2
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/GameJoinManager.java

@@ -153,7 +153,7 @@ public class GameJoinManager {
             return;
         }
         
-        player.teleport(mwPlayer.getTeam().getSpawn());
+        mwPlayer.getTeam().teleportToTeamSpawn(player);
         player.setGameMode(GameMode.SPECTATOR);
         
         runCountdownIntervall(player, "§e5");
@@ -176,7 +176,7 @@ public class GameJoinManager {
             return;
         }
         
-        player.teleport(mwPlayer.getTeam().getSpawn());
+        mwPlayer.getTeam().teleportToTeamSpawn(player);
         
         if (mwPlayer.getTeam().getTeamType() == TeamType.PLAYER) {
             // normal team-player join:

+ 6 - 1
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/Team.java

@@ -23,6 +23,7 @@ import de.butzlabben.missilewars.configuration.Config;
 import de.butzlabben.missilewars.configuration.Messages;
 import de.butzlabben.missilewars.game.enums.GameResult;
 import de.butzlabben.missilewars.game.enums.TeamType;
+import de.butzlabben.missilewars.game.misc.TeamSpawnProtection;
 import de.butzlabben.missilewars.menus.MenuItem;
 import de.butzlabben.missilewars.player.MWPlayer;
 import de.butzlabben.missilewars.util.MoneyUtil;
@@ -36,7 +37,6 @@ import org.bukkit.Location;
 import org.bukkit.Material;
 import org.bukkit.Sound;
 import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemFlag;
 import org.bukkit.inventory.ItemStack;
 import org.bukkit.inventory.meta.LeatherArmorMeta;
 
@@ -250,4 +250,9 @@ public class Team {
         }
     }
     
+    public void teleportToTeamSpawn(Player player) {
+        TeamSpawnProtection.regenerateSpawn(this);
+        Game.teleportSafely(player, spawn);
+    }
+    
 }

+ 1 - 1
missilewars-plugin/src/main/java/de/butzlabben/missilewars/listener/SignListener.java

@@ -54,7 +54,7 @@ public class SignListener implements Listener {
         Game game = GameManager.getInstance().getGame(sign.getLobby());
         if (game == null) return;
 
-        event.getPlayer().teleport(game.getLobby().getSpawnPoint());
+        game.teleportToLobbySpawn(event.getPlayer());
     }
 
     @EventHandler

+ 3 - 2
missilewars-plugin/src/main/java/de/butzlabben/missilewars/listener/game/EndListener.java

@@ -59,11 +59,12 @@ public class EndListener extends GameBoundListener {
     @EventHandler(priority = EventPriority.HIGH)
     public void onDeath(PlayerDeathEvent event) {
         if (!isInGameWorld(event.getEntity().getLocation())) return;
-
+        
         Player player = event.getEntity();
+        MWPlayer mwPlayer = getGame().getPlayer(player);
 
         event.setDeathMessage(null);
-        if (getGame().getArena().isAutoRespawn()) getGame().autoRespawnPlayer(player);
+        if (getGame().getArena().isAutoRespawn()) getGame().autoRespawnPlayer(mwPlayer);
     }
 
     @EventHandler

+ 4 - 3
missilewars-plugin/src/main/java/de/butzlabben/missilewars/listener/game/GameListener.java

@@ -30,6 +30,7 @@ import de.butzlabben.missilewars.game.enums.JoinIngameBehavior;
 import de.butzlabben.missilewars.game.enums.RejoinIngameBehavior;
 import de.butzlabben.missilewars.game.enums.TeamType;
 import de.butzlabben.missilewars.game.misc.RespawnGoldBlock;
+import de.butzlabben.missilewars.game.misc.TeamSpawnProtection;
 import de.butzlabben.missilewars.game.schematics.objects.Missile;
 import de.butzlabben.missilewars.listener.ShieldListener;
 import de.butzlabben.missilewars.menus.inventory.TeamSelectionMenu;
@@ -188,7 +189,7 @@ public class GameListener extends GameBoundListener {
         Team team = getGame().getPlayer(player).getTeam();
 
         if (team.getTeamType() == TeamType.PLAYER) {
-            TeamSpawnProtection.generateSpawn(team);
+            TeamSpawnProtection.regenerateSpawn(team);
             
             event.setRespawnLocation(team.getSpawn());
             getGame().getEquipmentManager().sendGameItems(player, true);
@@ -230,7 +231,7 @@ public class GameListener extends GameBoundListener {
         }
 
         event.setDeathMessage(null);
-        if (getGame().getArena().isAutoRespawn()) getGame().autoRespawnPlayer(player);
+        if (getGame().getArena().isAutoRespawn()) getGame().autoRespawnPlayer(mwPlayer);
     }
 
     @EventHandler
@@ -319,7 +320,7 @@ public class GameListener extends GameBoundListener {
 
         if (!getGame().isInGameArea(event.getTo())) {
             if (to != null) Game.knockbackEffect(player, from, to);
-            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.ARENA_ARENA_LEAVE));
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.ARENA_REACHED_BORDER));
         }
     }