Sfoglia il codice sorgente

Merge pull request #109 from RedstoneFuture/fix/inventory-interaction

Cancelling inventory opening
Daniel 1 anno fa
parent
commit
a920cd0461

+ 9 - 0
missilewars-plugin/src/main/java/de/butzlabben/missilewars/listener/game/EndListener.java

@@ -29,6 +29,7 @@ import org.bukkit.event.EventHandler;
 import org.bukkit.event.EventPriority;
 import org.bukkit.event.EventPriority;
 import org.bukkit.event.entity.PlayerDeathEvent;
 import org.bukkit.event.entity.PlayerDeathEvent;
 import org.bukkit.event.inventory.InventoryClickEvent;
 import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.event.inventory.InventoryOpenEvent;
 import org.bukkit.event.player.PlayerRespawnEvent;
 import org.bukkit.event.player.PlayerRespawnEvent;
 
 
 /**
 /**
@@ -58,6 +59,14 @@ public class EndListener extends GameBoundListener {
         if (getGame().getArena().isAutoRespawn()) getGame().autoRespawnPlayer(player);
         if (getGame().getArena().isAutoRespawn()) getGame().autoRespawnPlayer(player);
     }
     }
 
 
+    @EventHandler
+    public void onInventoryOpen(InventoryOpenEvent event) {
+        Player player = (Player) event.getPlayer();
+        if (!isInGameWorld(player.getLocation())) return;
+
+        if (player.getGameMode() != GameMode.CREATIVE) event.setCancelled(true);
+    }
+
     @EventHandler
     @EventHandler
     public void onInventoryClick(InventoryClickEvent event) {
     public void onInventoryClick(InventoryClickEvent event) {
         if (!(event.getWhoClicked() instanceof Player)) return;
         if (!(event.getWhoClicked() instanceof Player)) return;

+ 18 - 6
missilewars-plugin/src/main/java/de/butzlabben/missilewars/listener/game/GameListener.java

@@ -41,12 +41,9 @@ import org.bukkit.event.EventHandler;
 import org.bukkit.event.EventPriority;
 import org.bukkit.event.EventPriority;
 import org.bukkit.event.block.Action;
 import org.bukkit.event.block.Action;
 import org.bukkit.event.block.BlockPhysicsEvent;
 import org.bukkit.event.block.BlockPhysicsEvent;
-import org.bukkit.event.entity.EntityDamageByEntityEvent;
-import org.bukkit.event.entity.EntityDamageEvent;
-import org.bukkit.event.entity.EntityExplodeEvent;
-import org.bukkit.event.entity.PlayerDeathEvent;
-import org.bukkit.event.entity.ProjectileLaunchEvent;
+import org.bukkit.event.entity.*;
 import org.bukkit.event.inventory.InventoryClickEvent;
 import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.event.inventory.InventoryOpenEvent;
 import org.bukkit.event.inventory.InventoryType;
 import org.bukkit.event.inventory.InventoryType;
 import org.bukkit.event.player.PlayerInteractEvent;
 import org.bukkit.event.player.PlayerInteractEvent;
 import org.bukkit.event.player.PlayerMoveEvent;
 import org.bukkit.event.player.PlayerMoveEvent;
@@ -228,15 +225,30 @@ public class GameListener extends GameBoundListener {
         if (getGame().getArena().isAutoRespawn()) getGame().autoRespawnPlayer(player);
         if (getGame().getArena().isAutoRespawn()) getGame().autoRespawnPlayer(player);
     }
     }
 
 
+    @EventHandler
+    public void onInventoryOpen(InventoryOpenEvent event) {
+        Player player = (Player) event.getPlayer();
+        if (!isInGameWorld(player.getLocation())) return;
+
+        if (player.getGameMode() == GameMode.CREATIVE) return;
+        if (player.getGameMode() == GameMode.SPECTATOR) event.setCancelled(true);
+
+        Inventory clickedInventory = event.getInventory();
+        if (clickedInventory.getType() != InventoryType.PLAYER) event.setCancelled(true);
+    }
+
     @EventHandler
     @EventHandler
     public void onInventoryClick(InventoryClickEvent event) {
     public void onInventoryClick(InventoryClickEvent event) {
+
+        // Putting the items inside is not perfectly locked. But it is a second protection.
+        // More checks are possible: https://www.spigotmc.org/threads/531737
+
         if (!(event.getWhoClicked() instanceof Player)) return;
         if (!(event.getWhoClicked() instanceof Player)) return;
 
 
         Player player = (Player) event.getWhoClicked();
         Player player = (Player) event.getWhoClicked();
         if (!isInGameWorld(player.getLocation())) return;
         if (!isInGameWorld(player.getLocation())) return;
 
 
         if (player.getGameMode() == GameMode.CREATIVE) return;
         if (player.getGameMode() == GameMode.CREATIVE) return;
-
         if (player.getGameMode() == GameMode.SPECTATOR) event.setCancelled(true);
         if (player.getGameMode() == GameMode.SPECTATOR) event.setCancelled(true);
 
 
         Inventory clickedInventory = event.getClickedInventory();
         Inventory clickedInventory = event.getClickedInventory();

+ 14 - 0
missilewars-plugin/src/main/java/de/butzlabben/missilewars/listener/game/LobbyListener.java

@@ -31,6 +31,7 @@ import org.bukkit.event.EventHandler;
 import org.bukkit.event.EventPriority;
 import org.bukkit.event.EventPriority;
 import org.bukkit.event.entity.EntityDamageEvent;
 import org.bukkit.event.entity.EntityDamageEvent;
 import org.bukkit.event.inventory.InventoryClickEvent;
 import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.event.inventory.InventoryOpenEvent;
 import org.bukkit.event.player.PlayerInteractEvent;
 import org.bukkit.event.player.PlayerInteractEvent;
 import org.bukkit.event.player.PlayerRespawnEvent;
 import org.bukkit.event.player.PlayerRespawnEvent;
 
 
@@ -96,6 +97,17 @@ public class LobbyListener extends GameBoundListener {
         event.setRespawnLocation(getGame().getLobby().getSpawnPoint());
         event.setRespawnLocation(getGame().getLobby().getSpawnPoint());
     }
     }
 
 
+    @EventHandler
+    public void onInventoryOpen(InventoryOpenEvent event) {
+        Player player = (Player) event.getPlayer();
+        if (!isInLobbyArea(player.getLocation())) return;
+        
+        // handling of vote inventory:
+        if (event.getView().getTitle().equals(Messages.getMessage(false, Messages.MessageEnum.VOTE_GUI))) return;
+
+        if (player.getGameMode() != GameMode.CREATIVE) event.setCancelled(true);
+    }
+
     @EventHandler
     @EventHandler
     public void onInventoryClick(InventoryClickEvent event) {
     public void onInventoryClick(InventoryClickEvent event) {
         if (!(event.getWhoClicked() instanceof Player)) return;
         if (!(event.getWhoClicked() instanceof Player)) return;
@@ -103,6 +115,8 @@ public class LobbyListener extends GameBoundListener {
         Player player = (Player) event.getWhoClicked();
         Player player = (Player) event.getWhoClicked();
         if (!isInLobbyArea(player.getLocation())) return;
         if (!isInLobbyArea(player.getLocation())) return;
 
 
+        // handling of vote inventory: see 'VoteInventory.class'
+        
         if (player.getGameMode() != GameMode.CREATIVE) event.setCancelled(true);
         if (player.getGameMode() != GameMode.CREATIVE) event.setCancelled(true);
     }
     }