Browse Source

Merge pull request #31 from RedstoneFuture/Fixes/EventListenerReworkV2

Reworking EventListener v.2
Daniel 2 năm trước cách đây
mục cha
commit
d72bd53115

+ 2 - 2
missilewars-plugin/src/main/java/de/butzlabben/missilewars/cmd/MWCommands.java

@@ -259,11 +259,11 @@ public class MWCommands extends BaseCommand {
      * @param args Argument Array
      * @return (String) all next arguments
      */
-    private String getAllNextArgumentsAsString(CommandArgs args, boolean filterColorCode) {
+    private String getAllNextArgumentsAsString(String[] args, boolean filterColorCode) {
         StringBuilder sb = new StringBuilder();
         String arguments;
 
-        for (int i = 0; i < args.length(); i++) {
+        for (int i = 0; i < args.length; i++) {
             sb.append(" ");
         }
         arguments = sb.toString();

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

@@ -45,12 +45,15 @@ import de.butzlabben.missilewars.wrapper.event.PlayerArenaJoinEvent;
 import de.butzlabben.missilewars.wrapper.game.MissileGameEquipment;
 import de.butzlabben.missilewars.wrapper.game.SpecialGameEquipment;
 import de.butzlabben.missilewars.wrapper.game.Team;
+import de.butzlabben.missilewars.wrapper.missile.Missile;
+import de.butzlabben.missilewars.wrapper.missile.MissileFacing;
 import de.butzlabben.missilewars.wrapper.player.MWPlayer;
 import de.butzlabben.missilewars.wrapper.stats.FightStats;
 import lombok.Getter;
 import lombok.ToString;
 import org.bukkit.*;
 import org.bukkit.enchantments.Enchantment;
+import org.bukkit.entity.Fireball;
 import org.bukkit.entity.Player;
 import org.bukkit.event.HandlerList;
 import org.bukkit.inventory.ItemStack;
@@ -427,8 +430,13 @@ public class Game {
      */
     public void sendGameItems(Player player, boolean isRespawn) {
 
-        // clear inventory
-        player.getInventory().clear();
+        if (isRespawn) {
+            if (getArena().isKeepInventory()) return;
+
+        } else {
+            // clear inventory
+            player.getInventory().clear();
+        }
 
         // send armor
         ItemStack[] armor = getPlayer(player).getTeam().getTeamArmor();
@@ -481,6 +489,53 @@ public class Game {
         Bukkit.getScheduler().runTaskLater(MissileWars.getInstance(), () -> player.spigot().respawn(), 20L);
     }
 
+    /**
+     * This method spawns the missile for the player.
+     *
+     * @param player the executing player
+     */
+    public void spawnMissile(Player player, ItemStack itemStack) {
+
+        // Are missiles only allowed to spawn inside the arena, between the two arena spawn points?
+        boolean isOnlyBetweenSpawnPlaceable = this.arena.getMissileConfiguration().isOnlyBetweenSpawnPlaceable();
+        if (isOnlyBetweenSpawnPlaceable) {
+            if (!this.arena.isInBetween(player.getLocation().toVector(), this.arena.getPlane1(), this.arena.getPlane2())) {
+                player.sendMessage(MessageConfig.getMessage("missile_place_deny"));
+                return;
+            }
+        }
+
+        Missile missile = this.arena.getMissileConfiguration().getMissileFromName(itemStack.getItemMeta().getDisplayName());
+        if (missile == null) {
+            player.sendMessage(MessageConfig.getMessage("invalid_missile"));
+            return;
+        }
+        itemStack.setAmount(itemStack.getAmount() - 1);
+        player.setItemInHand(itemStack);
+        missile.paste(player, MissileFacing.getFacingPlayer(player, this.arena.getMissileConfiguration()), this);
+    }
+
+    /**
+     * This method spawns the fireball for the player.
+     *
+     * @param player the executing player
+     */
+    public void spawnFireball(Player player, ItemStack itemStack) {
+        int amount = itemStack.getAmount();
+        itemStack.setAmount(amount - 1);
+
+        if (amount == 1 && VersionUtil.getVersion() == 8) {
+            player.getInventory().remove(VersionUtil.getFireball());
+        }
+
+        Fireball fb = player.launchProjectile(Fireball.class);
+        fb.setVelocity(player.getLocation().getDirection().multiply(2.5D));
+        VersionUtil.playFireball(player, fb.getLocation());
+        fb.setYield(3F);
+        fb.setIsIncendiary(true);
+        fb.setBounce(false);
+    }
+
     public void setArena(Arena arena) {
         Preconditions.checkNotNull(arena);
         if (this.arena != null) {

+ 5 - 5
missilewars-plugin/src/main/java/de/butzlabben/missilewars/listener/EndListener.java

@@ -77,12 +77,12 @@ public class EndListener extends GameBoundListener {
     }
 
     @EventHandler
-    public void onClick(InventoryClickEvent event) {
+    public void onInventoryClick(InventoryClickEvent event) {
         if (!(event.getWhoClicked() instanceof Player)) return;
 
-        Player p = (Player) event.getWhoClicked();
-        if (isInGameWorld(p.getLocation()))
-            if (p.getGameMode() != GameMode.CREATIVE && !p.isOp())
-                event.setCancelled(true);
+        Player player = (Player) event.getWhoClicked();
+        if (!isInGameWorld(player.getLocation())) return;
+
+        if (player.getGameMode() != GameMode.CREATIVE) event.setCancelled(true);
     }
 }

+ 30 - 0
missilewars-plugin/src/main/java/de/butzlabben/missilewars/listener/GameBoundListener.java

@@ -18,8 +18,12 @@
 
 package de.butzlabben.missilewars.listener;
 
+import de.butzlabben.missilewars.MissileWars;
 import de.butzlabben.missilewars.game.Game;
+import de.butzlabben.missilewars.wrapper.player.MWPlayer;
+import org.bukkit.Bukkit;
 import org.bukkit.Location;
+import org.bukkit.entity.Player;
 import org.bukkit.event.Listener;
 
 public abstract class GameBoundListener implements Listener {
@@ -41,4 +45,30 @@ public abstract class GameBoundListener implements Listener {
     public Game getGame() {
         return game;
     }
+
+    /**
+     * This method gets the interaction protection variable for a player.
+     *
+     * @param player (Player) the target player
+     */
+    protected boolean isInteractDelay(Player player) {
+        MWPlayer mwPlayer = getGame().getPlayer(player);
+        if (mwPlayer == null) return false;
+
+        return mwPlayer.isPlayerInteractEventCancel();
+    }
+
+    /**
+     * This method sets an interaction protection variable for a player for
+     * a short time.
+     *
+     * @param player (Player) the target player
+     */
+    protected void setInteractDelay(Player player) {
+        MWPlayer mwPlayer = getGame().getPlayer(player);
+        if (mwPlayer == null) return;
+
+        mwPlayer.setPlayerInteractEventCancel(true);
+        Bukkit.getScheduler().runTaskLater(MissileWars.getInstance(), () -> mwPlayer.setPlayerInteractEventCancel(false), 20);
+    }
 }

+ 73 - 88
missilewars-plugin/src/main/java/de/butzlabben/missilewars/listener/GameListener.java

@@ -30,14 +30,14 @@ import de.butzlabben.missilewars.wrapper.event.PlayerArenaLeaveEvent;
 import de.butzlabben.missilewars.wrapper.game.RespawnGoldBlock;
 import de.butzlabben.missilewars.wrapper.game.Shield;
 import de.butzlabben.missilewars.wrapper.game.Team;
-import de.butzlabben.missilewars.wrapper.geometry.Plane;
-import de.butzlabben.missilewars.wrapper.missile.Missile;
-import de.butzlabben.missilewars.wrapper.missile.MissileFacing;
 import de.butzlabben.missilewars.wrapper.player.MWPlayer;
 import org.bukkit.Bukkit;
 import org.bukkit.GameMode;
 import org.bukkit.Location;
-import org.bukkit.entity.*;
+import org.bukkit.entity.EntityType;
+import org.bukkit.entity.Player;
+import org.bukkit.entity.Projectile;
+import org.bukkit.entity.Snowball;
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.EventPriority;
 import org.bukkit.event.block.Action;
@@ -48,12 +48,11 @@ import org.bukkit.event.inventory.InventoryType;
 import org.bukkit.event.player.PlayerInteractEvent;
 import org.bukkit.event.player.PlayerMoveEvent;
 import org.bukkit.event.player.PlayerRespawnEvent;
+import org.bukkit.inventory.Inventory;
 import org.bukkit.inventory.ItemStack;
 import org.bukkit.scheduler.BukkitTask;
 import org.bukkit.util.Vector;
 
-import java.util.Objects;
-
 /**
  * @author Butzlabben
  * @since 12.01.2018
@@ -90,87 +89,59 @@ public class GameListener extends GameBoundListener {
     public void onExplode(EntityExplodeEvent event) {
         if (!isInGameWorld(event.getLocation())) return;
 
-        Game game = getGame();
+        if (event.getEntity().getType() != EntityType.FIREBALL) return;
+        if (getGame().getArena().getFireballConfiguration().isDestroysPortal()) return;
 
-        if (event.getEntity().getType() == EntityType.FIREBALL && !game.getArena().getFireballConfiguration().isDestroysPortal())
-            event.blockList().removeIf(b -> b.getType() == VersionUtil.getPortal());
+        event.blockList().removeIf(b -> b.getType() == VersionUtil.getPortal());
     }
 
     @EventHandler
     public void onBlockPhysics(BlockPhysicsEvent event) {
-        Location location = event.getBlock().getLocation();
-        if (!isInGameWorld(location)) return;
+        if (!isInGameWorld(event.getBlock().getLocation())) return;
+
         if (event.getChangedType() != VersionUtil.getPortal()) return;
-        Game game = getGame();
 
-        if (game.getArena().getPlane1().distance(location.toVector()) > game.getArena().getPlane2().distance(location.toVector())) {
-            game.getTeam1().setGameResult(GameResult.WIN);
-            game.getTeam2().setGameResult(GameResult.LOSE);
+        Location location = event.getBlock().getLocation();
+
+        if (getGame().getArena().getPlane1().distance(location.toVector()) > getGame().getArena().getPlane2().distance(location.toVector())) {
+            getGame().getTeam1().setGameResult(GameResult.WIN);
+            getGame().getTeam2().setGameResult(GameResult.LOSE);
         } else {
-            game.getTeam1().setGameResult(GameResult.LOSE);
-            game.getTeam2().setGameResult(GameResult.WIN);
+            getGame().getTeam1().setGameResult(GameResult.LOSE);
+            getGame().getTeam2().setGameResult(GameResult.WIN);
         }
-        game.sendGameResult();
-        game.stopGame();
+        getGame().sendGameResult();
+        getGame().stopGame();
     }
 
     @EventHandler
     public void onInteract(PlayerInteractEvent event) {
         if (!isInGameWorld(event.getPlayer().getLocation())) return;
+
         if (event.getItem() == null) return;
         if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) return;
 
         Player player = event.getPlayer();
         ItemStack itemStack = event.getItem();
-        Game game = getGame();
 
         // missile spawn with using of a missile spawn egg
         if (VersionUtil.isMonsterEgg(itemStack.getType())) {
             event.setCancelled(true);
 
             // Can missiles only be spawned if the item interaction was performed on a block (no air)?
-            boolean isOnlyBlockPlaceable = game.getArena().getMissileConfiguration().isOnlyBlockPlaceable();
+            boolean isOnlyBlockPlaceable = getGame().getArena().getMissileConfiguration().isOnlyBlockPlaceable();
             if (isOnlyBlockPlaceable) {
                 if (event.getAction() != Action.RIGHT_CLICK_BLOCK) return;
             }
 
-            // Are missiles only allowed to spawn inside the arena, between the two arena spawn points?
-            boolean isOnlyBetweenSpawnPlaceable = game.getArena().getMissileConfiguration().isOnlyBetweenSpawnPlaceable();
-            if (isOnlyBetweenSpawnPlaceable) {
-                if (!isInBetween(player.getLocation().toVector(), getGame().getArena().getPlane1(), getGame().getArena().getPlane2())) {
-                    player.sendMessage(MessageConfig.getMessage("missile_place_deny"));
-                    return;
-                }
-            }
-
-            Missile missile = game.getArena().getMissileConfiguration().getMissileFromName(itemStack.getItemMeta().getDisplayName());
-            if (missile == null) {
-                player.sendMessage(MessageConfig.getMessage("invalid_missile"));
-                return;
-            }
-            itemStack.setAmount(itemStack.getAmount() - 1);
-            player.setItemInHand(itemStack);
-            missile.paste(player, MissileFacing.getFacingPlayer(player, game.getArena().getMissileConfiguration()), getGame());
-
+            getGame().spawnMissile(player, itemStack);
             return;
         }
 
-        // shield spawn with using of a missile spawn egg
+        // shield spawn with using of a shield spawn egg
         if (itemStack.getType() == VersionUtil.getFireball()) {
-            int amount = event.getItem().getAmount();
-            event.getItem().setAmount(amount - 1);
-
-            if (amount == 1 && VersionUtil.getVersion() == 8) {
-                player.getInventory().remove(VersionUtil.getFireball());
-            }
-
-            Fireball fb = player.launchProjectile(Fireball.class);
-            fb.setVelocity(player.getLocation().getDirection().multiply(2.5D));
-            VersionUtil.playFireball(player, fb.getLocation());
-            fb.setYield(3F);
-            fb.setIsIncendiary(true);
-            fb.setBounce(false);
 
+            getGame().spawnFireball(player, itemStack);
             return;
         }
     }
@@ -212,37 +183,49 @@ public class GameListener extends GameBoundListener {
     public void onThrow(ProjectileLaunchEvent event) {
         if (!isInGameWorld(event.getEntity().getLocation())) return;
 
-        Game game = getGame();
-        if (event.getEntity() instanceof Snowball) {
-            Snowball ball = (Snowball) event.getEntity();
-            if (ball.getShooter() instanceof Player) {
-                Shield shield = new Shield((Player) ball.getShooter(), game.getArena().getShieldConfiguration());
-                shield.onThrow(event);
-            }
-        }
+        if (!(event.getEntity() instanceof Snowball)) return;
+
+        Snowball snowball = (Snowball) event.getEntity();
+        if (!(snowball.getShooter() instanceof Player)) return;
+
+        Player shooter = (Player) snowball.getShooter();
+        Shield shield = new Shield(shooter, getGame().getArena().getShieldConfiguration());
+        shield.onThrow(event);
     }
 
     @EventHandler
     public void onDamage(EntityDamageByEntityEvent event) {
-        if (!isInGameWorld(event.getEntity().getLocation())) return;
         if (!(event.getEntity() instanceof Player)) return;
-      
-        Player p = (Player) event.getEntity();
+
+        Player player = (Player) event.getEntity();
+        if (!isInGameWorld(player.getLocation())) return;
+
+        Player shooter;
         if (event.getDamager() instanceof Projectile) {
-            Projectile pj = (Projectile) event.getDamager();
-            Player shooter = (Player) pj.getShooter();
-            if (Objects.requireNonNull(getGame().getPlayer(shooter)).getTeam() == Objects.requireNonNull(getGame().getPlayer(p)).getTeam()) {
-                shooter.sendMessage(MessageConfig.getMessage("hurt_teammates"));
-                event.setCancelled(true);
-            }
+            Projectile projectile = (Projectile) event.getDamager();
+
+            if (!(projectile.getShooter() instanceof Player)) return;
+
+            shooter = (Player) projectile.getShooter();
+
+        } else if (event.getDamager() instanceof Player) {
+
+            shooter = (Player) event.getDamager();
+
+        } else {
             return;
         }
-        if (event.getDamager() instanceof Player) {
-            Player d = (Player) event.getDamager();
-            if (Objects.requireNonNull(getGame().getPlayer(d)).getTeam() == Objects.requireNonNull(getGame().getPlayer(p)).getTeam()) {
-                d.sendMessage(MessageConfig.getMessage("hurt_teammates"));
-                event.setCancelled(true);
-            }
+
+        Team team = getGame().getPlayer(shooter).getTeam();
+        if (team == null) return;
+
+        // same player
+        if (shooter == player) return;
+
+        // same team
+        if (team == getGame().getPlayer(player).getTeam()) {
+            shooter.sendMessage(MessageConfig.getMessage("hurt_teammates"));
+            event.setCancelled(true);
         }
     }
 
@@ -257,6 +240,7 @@ public class GameListener extends GameBoundListener {
             event.setRespawnLocation(team.getSpawn());
             getGame().sendGameItems(player, true);
             getGame().setPlayerAttributes(player);
+            getGame().getPlayer(player).getRandomGameEquipment().resetPlayerInterval();
 
             FallProtectionConfiguration fallProtection = getGame().getArena().getFallProtection();
             if (fallProtection.isEnabled()) {
@@ -324,22 +308,23 @@ public class GameListener extends GameBoundListener {
         }
     }
 
-    // TODO - Analyse, Ingame Check and Crop Cancel Analytic
     @EventHandler
     public void onInventoryClick(InventoryClickEvent event) {
         if (!(event.getWhoClicked() instanceof Player)) return;
-        Player p = (Player) event.getWhoClicked();
-        if (!isInGameWorld(p.getLocation())) return;
 
-        if (p.getGameMode() == GameMode.CREATIVE || p.isOp()) return;
-        if (event.getSlotType() != InventoryType.SlotType.ARMOR) return;
-        event.setCancelled(true);
-    }
+        Player player = (Player) event.getWhoClicked();
+        if (!isInGameWorld(player.getLocation())) return;
+
+        if (player.getGameMode() == GameMode.CREATIVE) return;
+
+        if (player.getGameMode() == GameMode.SPECTATOR) event.setCancelled(true);
+
+        Inventory clickedInventory = event.getClickedInventory();
+        if (clickedInventory != null) {
+            if (clickedInventory.getType() != InventoryType.PLAYER) event.setCancelled(true);
+        }
 
-    private boolean isInBetween(Vector point, Plane plane1, Plane plane2) {
-        double distanceBetween = plane1.distanceSquared(plane2.getSupport());
-        double distance1 = plane1.distanceSquared(point);
-        double distance2 = plane2.distanceSquared(point);
-        return distanceBetween > distance1 + distance2;
+        if ((event.getSlotType() != InventoryType.SlotType.CONTAINER) &&
+                (event.getSlotType() != InventoryType.SlotType.QUICKBAR)) event.setCancelled(true);
     }
 }

+ 28 - 15
missilewars-plugin/src/main/java/de/butzlabben/missilewars/listener/LobbyListener.java

@@ -55,34 +55,44 @@ public class LobbyListener extends GameBoundListener {
     public void onInteract(PlayerInteractEvent event) {
         if (!isInLobbyArea(event.getPlayer().getLocation())) return;
 
-        Player p = event.getPlayer();
-        if (p.getGameMode() == GameMode.CREATIVE) return;
+        Player player = event.getPlayer();
+        if (player.getGameMode() == GameMode.CREATIVE) return;
+
         event.setCancelled(true);
+
+        // prevent spam with the event handling
+        if (isInteractDelay(player)) return;
+        setInteractDelay(player);
+
         if (event.getItem() == null) return;
 
         if (VersionUtil.isStainedGlassPane(event.getItem().getType())) {
+            // team change:
+            if (!player.hasPermission("mw.change")) return;
 
-            if (!p.hasPermission("mw.change")) return;
+            String displayName = event.getItem().getItemMeta().getDisplayName();
 
+            // same team:
+            if (displayName.equals(getGame().getPlayer(player).getTeam().getFullname())) return;
+
+            // too late for team change:
             if (getGame().getTimer().getSeconds() < 10) {
-                p.sendMessage(MessageConfig.getMessage("change_team_not_now"));
+                player.sendMessage(MessageConfig.getMessage("change_team_not_now"));
                 return;
             }
 
-            String displayName = event.getItem().getItemMeta().getDisplayName();
             if (displayName.equals(getGame().getTeam1().getFullname())) {
-                p.performCommand("mw change 1");
-                getGame().getScoreboardManager().updateScoreboard();
+                player.performCommand("mw change 1");
             } else {
-                p.performCommand("mw change 2");
-                getGame().getScoreboardManager().updateScoreboard();
+                player.performCommand("mw change 2");
             }
+            getGame().getScoreboardManager().updateScoreboard();
 
         } else if (event.getItem().getType() == Material.NETHER_STAR) {
+            // vote inventory:
             VoteInventory inventory = new VoteInventory(getGame().getLobby().getArenas());
-            p.openInventory(inventory.getInventory(p));
+            player.openInventory(inventory.getInventory(player));
         }
-
     }
 
     @EventHandler
@@ -139,7 +149,10 @@ public class LobbyListener extends GameBoundListener {
 
     @EventHandler
     public void onDamage(EntityDamageEvent event) {
-        if (!isInLobbyArea(event.getEntity().getLocation())) return;
+        if (!(event.getEntity() instanceof Player)) return;
+
+        Player player = (Player) event.getEntity();
+        if (!isInLobbyArea(player.getLocation())) return;
 
         event.setCancelled(true);
     }
@@ -155,9 +168,9 @@ public class LobbyListener extends GameBoundListener {
     public void onInventoryClick(InventoryClickEvent event) {
         if (!(event.getWhoClicked() instanceof Player)) return;
 
-        Player p = (Player) event.getWhoClicked();
-        if (!isInLobbyArea(p.getLocation())) return;
+        Player player = (Player) event.getWhoClicked();
+        if (!isInLobbyArea(player.getLocation())) return;
 
-        if (p.getGameMode() != GameMode.CREATIVE) event.setCancelled(true);
+        if (player.getGameMode() != GameMode.CREATIVE) event.setCancelled(true);
     }
 }

+ 0 - 13
missilewars-plugin/src/main/java/de/butzlabben/missilewars/listener/PlayerListener.java

@@ -41,8 +41,6 @@ import org.bukkit.event.EventPriority;
 import org.bukkit.event.Listener;
 import org.bukkit.event.block.BlockPlaceEvent;
 import org.bukkit.event.entity.FoodLevelChangeEvent;
-import org.bukkit.event.inventory.InventoryClickEvent;
-import org.bukkit.event.inventory.InventoryType;
 import org.bukkit.event.player.*;
 import org.bukkit.event.server.ServerListPingEvent;
 import org.bukkit.util.Vector;
@@ -157,17 +155,6 @@ public class PlayerListener implements Listener {
         MissileWars.getInstance().getSignRepository().getSigns(game).forEach(MWSign::update);
     }
 
-    // cancel anvil interaction to block renaming, and thus changing missiles
-    @EventHandler
-    public void onClick(InventoryClickEvent event) {
-        Game game = getGame(event.getWhoClicked().getLocation());
-        if (game != null) {
-            if (event.getInventory().getType() == InventoryType.ANVIL) {
-                event.setCancelled(true);
-            }
-        }
-    }
-
     // Internal stuff
 
     @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)

+ 25 - 11
missilewars-plugin/src/main/java/de/butzlabben/missilewars/util/PlayerEquipmentRandomizer.java

@@ -54,7 +54,7 @@ public class PlayerEquipmentRandomizer {
         randomizer = new Random();
         maxGameDuration = game.getArena().getGameDuration() * 60;
 
-        setPlayerInterval(getStartInterval() + 1);
+        resetPlayerInterval();
     }
 
     public void tick() {
@@ -68,11 +68,35 @@ public class PlayerEquipmentRandomizer {
         }
     }
 
+    /**
+     * This method resets the countdown for the player equipment
+     * randomizer.
+     */
+    public void resetPlayerInterval() {
+        setPlayerInterval(getStartInterval() + 1);
+    }
+
+    /**
+     * This method sets the countdown for the player equipment
+     * randomizer to a specified value.
+     *
+     * @param playerInterval (Integer) the target interval status
+     */
     private void setPlayerInterval(Integer playerInterval) {
         this.playerInterval = playerInterval;
         mwPlayer.getPlayer().setLevel(playerInterval);
     }
 
+    /**
+     * This method returns the interval after the player receives a new
+     * item at game start.
+     *
+     * @return (int) the interval in seconds
+     */
+    private int getStartInterval() {
+        return arena.getInterval().getStart();
+    }
+
     /**
      * This method gives the player a random item of one of the two
      * game equipment lists. The two lists alternate: after two
@@ -107,16 +131,6 @@ public class PlayerEquipmentRandomizer {
         sendEquipmentCounter++;
     }
 
-    /**
-     * This method returns the interval after the player receives a new
-     * item at game start.
-     *
-     * @return (int) the interval in seconds
-     */
-    private int getStartInterval() {
-        return arena.getInterval().getStart();
-    }
-
     /**
      * This method returns the interval after the player receives a new
      * item during the game. It depends on the current team size and the

+ 7 - 0
missilewars-plugin/src/main/java/de/butzlabben/missilewars/wrapper/abstracts/Arena.java

@@ -72,4 +72,11 @@ public class Arena {
         Vector normal = team1Spawn.toVector().subtract(spawn2);
         return new Plane(spawn2, normal);
     }
+
+    public boolean isInBetween(Vector point, Plane plane1, Plane plane2) {
+        double distanceBetween = plane1.distanceSquared(plane2.getSupport());
+        double distance1 = plane1.distanceSquared(point);
+        double distance2 = plane2.distanceSquared(point);
+        return distanceBetween > distance1 + distance2;
+    }
 }

+ 2 - 1
missilewars-plugin/src/main/java/de/butzlabben/missilewars/wrapper/abstracts/arena/MissileConfiguration.java

@@ -72,8 +72,9 @@ public class MissileConfiguration {
     public Missile getMissileFromName(String name) {
         String filteredName = name.replaceAll("§.", "");
         for (Missile missile : missiles) {
-            if (missile.getSchematicName(false).equalsIgnoreCase(filteredName)) return missile;
+            if (missile.getSchematicName(true).equalsIgnoreCase(filteredName)) return missile;
         }
+        Logger.WARN.log("Missile not found: " + filteredName);
         return null;
     }
 

+ 2 - 1
missilewars-plugin/src/main/java/de/butzlabben/missilewars/wrapper/missile/Missile.java

@@ -18,6 +18,7 @@
 
 package de.butzlabben.missilewars.wrapper.missile;
 
+import com.google.gson.annotations.SerializedName;
 import de.butzlabben.missilewars.Logger;
 import de.butzlabben.missilewars.MissileWars;
 import de.butzlabben.missilewars.game.Game;
@@ -45,7 +46,7 @@ import java.io.File;
 public class Missile {
 
     private final String schematic;
-    private final String displayName;
+    @SerializedName("name") private final String displayName;
     private final EntityType egg;
     private final int down;
     private final int dist;

+ 1 - 0
missilewars-plugin/src/main/java/de/butzlabben/missilewars/wrapper/player/MWPlayer.java

@@ -44,6 +44,7 @@ public class MWPlayer implements Runnable {
     private final Game game;
     @Setter private Team team;
     private PlayerEquipmentRandomizer randomGameEquipment;
+    @Setter private boolean playerInteractEventCancel = false;
 
     public MWPlayer(Player player, Game game) {
         this.uuid = player.getUniqueId();