2
0
RedstoneFuture 2 жил өмнө
parent
commit
3509bd1b10

+ 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 getGame().getPlayer(player).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;
+
+        getGame().getPlayer(player).setPlayerInteractEventCancel(true);
+        Bukkit.getScheduler().runTaskLater(MissileWars.getInstance(), () -> getGame().getPlayer(player).setPlayerInteractEventCancel(false), 20);
+    }
 }

+ 11 - 2
missilewars-plugin/src/main/java/de/butzlabben/missilewars/listener/GameListener.java

@@ -48,6 +48,7 @@ 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;
@@ -207,9 +208,11 @@ public class GameListener extends GameBoundListener {
             if (!(projectile.getShooter() instanceof Player)) return;
 
             shooter = (Player) projectile.getShooter();
+
         } else if (event.getDamager() instanceof Player) {
 
             shooter = (Player) event.getDamager();
+
         } else return;
 
         Team team = getGame().getPlayer(shooter).getTeam();
@@ -314,7 +317,13 @@ public class GameListener extends GameBoundListener {
         if (player.getGameMode() == GameMode.CREATIVE) return;
 
         if (player.getGameMode() == GameMode.SPECTATOR) event.setCancelled(true);
-        if (event.getClickedInventory().getType() != InventoryType.PLAYER) event.setCancelled(true);
-        if (event.getSlotType() != InventoryType.SlotType.CONTAINER) event.setCancelled(true);
+
+        Inventory clickedInventory = event.getClickedInventory();
+        if (clickedInventory != null) {
+            if (clickedInventory.getType() != InventoryType.PLAYER) event.setCancelled(true);
+        }
+
+        if ((event.getSlotType() != InventoryType.SlotType.CONTAINER) &&
+                (event.getSlotType() != InventoryType.SlotType.QUICKBAR)) event.setCancelled(true);
     }
 }

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

@@ -60,20 +60,27 @@ public class LobbyListener extends GameBoundListener {
 
         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 switch
-
+            // team switch:
             if (!player.hasPermission("mw.change")) return;
 
+            String displayName = event.getItem().getItemMeta().getDisplayName();
+
+            // same team:
+            if (displayName.equals(getGame().getPlayer(player).getTeam().getFullname())) return;
+
+            // time to late:
             if (getGame().getTimer().getSeconds() < 10) {
                 player.sendMessage(MessageConfig.getMessage("change_team_not_now"));
                 return;
             }
 
-            String displayName = event.getItem().getItemMeta().getDisplayName();
-
             if (displayName.equals(getGame().getTeam1().getFullname())) {
                 player.performCommand("mw change 1");
             } else {
@@ -82,7 +89,7 @@ public class LobbyListener extends GameBoundListener {
             getGame().getScoreboardManager().updateScoreboard();
 
         } else if (event.getItem().getType() == Material.NETHER_STAR) {
-            // vote inventors
+            // vote inventory:
             VoteInventory inventory = new VoteInventory(getGame().getLobby().getArenas());
             player.openInventory(inventory.getInventory(player));
         }

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