Bläddra i källkod

Cancelling SIGN interaction, Adding interaction bypass for CREATIVE

RedstoneFuture 1 år sedan
förälder
incheckning
376a53bf06

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

@@ -21,14 +21,17 @@ package de.butzlabben.missilewars.listener.game;
 import de.butzlabben.missilewars.MissileWars;
 import de.butzlabben.missilewars.game.Game;
 import de.butzlabben.missilewars.player.MWPlayer;
-import org.bukkit.Bukkit;
-import org.bukkit.Location;
+import org.bukkit.*;
 import org.bukkit.entity.Player;
 import org.bukkit.event.Listener;
 
 public abstract class GameBoundListener implements Listener {
 
     private final Game game;
+    
+    // https://jd.papermc.io/paper/1.20.4/org/bukkit/Tag.html#ALL_SIGNS
+    // https://minecraft.fandom.com/wiki/Tag#all_signs
+    Tag<Material> signMaterials = Bukkit.getTag(Tag.REGISTRY_BLOCKS, new NamespacedKey(NamespacedKey.MINECRAFT, "all_signs"), Material.class);
 
     protected GameBoundListener(Game game) {
         this.game = game;
@@ -71,4 +74,10 @@ public abstract class GameBoundListener implements Listener {
         mwPlayer.setPlayerInteractEventCancel(true);
         Bukkit.getScheduler().runTaskLater(MissileWars.getInstance(), () -> mwPlayer.setPlayerInteractEventCancel(false), 10);
     }
+    
+    protected boolean isSignMaterial(Material material) {
+        if (signMaterials == null) return false;
+        
+        return signMaterials.isTagged(material);
+    }
 }

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

@@ -34,9 +34,7 @@ import de.butzlabben.missilewars.game.schematics.objects.Missile;
 import de.butzlabben.missilewars.listener.ShieldListener;
 import de.butzlabben.missilewars.menus.inventory.TeamSelectionMenu;
 import de.butzlabben.missilewars.player.MWPlayer;
-import org.bukkit.GameMode;
-import org.bukkit.Location;
-import org.bukkit.Material;
+import org.bukkit.*;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.Player;
 import org.bukkit.entity.Projectile;
@@ -77,11 +75,24 @@ public class GameListener extends GameBoundListener {
     @EventHandler
     public void onInteract(PlayerInteractEvent event) {
         if (!isInGameWorld(event.getPlayer().getLocation())) return;
-
+        
+        Player player = event.getPlayer();
+        if (player.getGameMode() == GameMode.CREATIVE) return;
+        
+        // Interaction Cancelling for some objects:
+        if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
+            if (isSignMaterial(event.getClickedBlock().getType())) {
+                event.setCancelled(true);
+                Logger.DEBUG.log("Cancelling of interaction with '#ALL_SIGNS' (Gamemode: " + player.getGameMode().name() + ").");
+                return;
+            }
+        }
+        
+        // Game-Item handling:
+        
         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();
 
         // missile spawn with using of a missile spawn egg