Bläddra i källkod

Merge pull request #130 from RedstoneFuture/improvements/misc-restrictions

Adding Team-Spawn Reconstruction, Adding Auto-Teleport for Arena-Crossing
RedstoneFuture 1 år sedan
förälder
incheckning
85e8d4e175

+ 2 - 1
missilewars-plugin/src/main/java/de/butzlabben/missilewars/configuration/Messages.java

@@ -159,7 +159,8 @@ public class Messages {
         TEAM_MOVE_MOVED_SENDER("team.move.moved.sender", "&7You moved %player% in another team."),
         TEAM_MOVE_MOVED_TARGET("team.move.moved.target", "&cYou was moved from %sender% to another team."),
 
-        ARENA_ARENA_LEAVE("arena.arena_leave", "&cYou are not allowed to leave the arena."),
+        ARENA_REACHED_BORDER("arena.reached_border", "&cYou are not allowed to leave the game-arena."),
+        ARENA_LEAVED("arena.leaved", "&cYou overstepped the game-arena border and were teleported back to your team-spawn."),
         ARENA_MISSILE_PLACE_DENY("arena.missile_place_deny", "&cYou are not allowed to place a missile here."),
         ARENA_NOT_HIGHER("arena.not_higher", "&cYou can not go higher."),
         ARENA_KICK_INACTIVITY("arena.kick_inactivity", "&cYou were inactive on MissileWars."),

+ 1 - 1
missilewars-plugin/src/main/java/de/butzlabben/missilewars/configuration/arena/Arena.java

@@ -43,7 +43,7 @@ public class Arena implements Cloneable {
     @SerializedName("game_respawn") private GameRespawnConfiguration respawn = new GameRespawnConfiguration();
     @SerializedName("do_tile_drops") private boolean doTileDrops = false;
     @SerializedName("keep_inventory") private boolean keepInventory = false;
-    @SerializedName("max_height") private int maxHeight = 170;
+    @SerializedName("max_move_height") private int maxMoveHeight = 170;
     @SerializedName("death_height") private int deathHeight = 65;
     @SerializedName("game_duration") private int gameDuration = 30;
     @SerializedName("fireball") private FireballConfiguration fireballConfiguration = new FireballConfiguration();

+ 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);
+    }
+    
 }

+ 46 - 0
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/misc/TeamSpawnProtection.java

@@ -0,0 +1,46 @@
+package de.butzlabben.missilewars.game.misc;
+
+import de.butzlabben.missilewars.game.Team;
+import org.bukkit.Location;
+import org.bukkit.Material;
+import org.bukkit.World;
+
+public class TeamSpawnProtection {
+
+    /**
+     * This method regenerates the team spawn by resetting the ground and 
+     * the area and replacing all previous blocks at this point.
+     * 
+     * @param targetTeam (Team) the target team
+     */
+    public static void regenerateSpawn(Team targetTeam) {
+
+        Location teamSpawn = targetTeam.getSpawn();
+        
+        // floor:
+        fill(teamSpawn, -1, -1, -1, 1, -1, 1, Material.BEDROCK);
+        
+        // AIR area:
+        fill(teamSpawn, -1, 0, -1, 1, 2, 1, Material.AIR);
+        
+    }
+    
+    private static void fill(Location basisPos, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Material material) {
+
+        World targetWorld = basisPos.getWorld();
+        Location targetLoc;
+        
+        if (targetWorld == null) return;
+        
+        for (int x = minX; x <= maxX; x++) {
+            for (int y = minY; y <= maxY; y++) {
+                for (int z = minZ; z <= maxZ; z++) {
+                    
+                    targetLoc = basisPos.clone().add(x, y, z);
+                    targetWorld.getBlockAt(targetLoc).setType(material);
+                }
+            }
+        }
+    }
+    
+}

+ 14 - 0
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/timer/GameTimer.java

@@ -20,6 +20,8 @@ package de.butzlabben.missilewars.game.timer;
 
 import de.butzlabben.missilewars.configuration.Messages;
 import de.butzlabben.missilewars.game.Game;
+import org.bukkit.GameMode;
+import org.bukkit.entity.Player;
 
 /**
  * @author Butzlabben
@@ -68,6 +70,18 @@ public class GameTimer extends Timer {
         if (seconds % 10 == 0) {
             game.getScoreboardManager().updateScoreboard();
         }
+        
+        if (seconds % 4 == 0) {
+            game.getPlayers().values().forEach(mwPlayer -> {
+                if (mwPlayer.getPlayer().getGameMode() != GameMode.SURVIVAL) return;
+                
+                Player player = mwPlayer.getPlayer();
+                if (game.isInGameArea(player.getLocation())) return;
+                
+                player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.ARENA_LEAVED));
+                mwPlayer.getTeam().teleportToTeamSpawn(player);
+            });
+        }
 
         seconds--;
     }

+ 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

+ 10 - 6
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;
@@ -187,7 +188,9 @@ public class GameListener extends GameBoundListener {
         Player player = event.getPlayer();
         Team team = getGame().getPlayer(player).getTeam();
 
-        if (team != null) {
+        if (team.getTeamType() == TeamType.PLAYER) {
+            TeamSpawnProtection.regenerateSpawn(team);
+            
             event.setRespawnLocation(team.getSpawn());
             getGame().getEquipmentManager().sendGameItems(player, true);
             getGame().setPlayerAttributes(player);
@@ -207,10 +210,11 @@ public class GameListener extends GameBoundListener {
         if (!isInGameWorld(event.getEntity().getLocation())) return;
 
         Player player = event.getEntity();
-        Team team = getGame().getPlayer(player).getTeam();
+        MWPlayer mwPlayer = getGame().getPlayer(player);
+        Team team = mwPlayer.getTeam();
 
         // check the death cause for choice the death message
-        if (team != null) {
+        if (team.getTeamType() == TeamType.PLAYER) {
 
             if (player.getLastDamageCause() == null) return;
 
@@ -227,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
@@ -303,7 +307,7 @@ public class GameListener extends GameBoundListener {
         if (player.getGameMode() != GameMode.SURVIVAL) return;
 
         int toY = event.getTo().getBlockY();
-        if (toY > getGame().getArena().getMaxHeight()) {
+        if (toY > getGame().getArena().getMaxMoveHeight()) {
             player.teleport(event.getFrom());
             player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.ARENA_NOT_HIGHER));
         } else if (toY < getGame().getArena().getDeathHeight()) {
@@ -316,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));
         }
     }