diff --git a/README.MD b/README.MD index 82a681d..66c183f 100644 --- a/README.MD +++ b/README.MD @@ -136,6 +136,10 @@ OpenInv is a [Bukkit plugin](https://dev.bukkit.org/bukkit-plugins/openinv/) whi OpenInv.silent.default Cause SilentContainer to be enabled by default. + + OpenInv.spectate + Allows users in spectate gamemode to edit inventories. + ## For Developers diff --git a/plugin/src/main/java/com/lishid/openinv/listeners/InventoryListener.java b/plugin/src/main/java/com/lishid/openinv/listeners/InventoryListener.java index 40d7b92..33221f2 100644 --- a/plugin/src/main/java/com/lishid/openinv/listeners/InventoryListener.java +++ b/plugin/src/main/java/com/lishid/openinv/listeners/InventoryListener.java @@ -19,6 +19,7 @@ package com.lishid.openinv.listeners; import com.lishid.openinv.IOpenInv; import com.lishid.openinv.util.InventoryAccess; import com.lishid.openinv.util.Permissions; +import org.bukkit.GameMode; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -56,22 +57,37 @@ public class InventoryListener implements Listener { } } - @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + @EventHandler(priority = EventPriority.LOWEST) public void onInventoryClick(InventoryClickEvent event) { onInventoryInteract(event); } - @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + @EventHandler(priority = EventPriority.LOWEST) public void onInventoryDrag(InventoryDragEvent event) { onInventoryInteract(event); } private void onInventoryInteract(InventoryInteractEvent event) { HumanEntity entity = event.getWhoClicked(); + + if (Permissions.SPECTATE.hasPermission(entity) && entity.getGameMode() == GameMode.SPECTATOR) { + event.setCancelled(false); + } + + if (event.isCancelled()) { + return; + } + Inventory inventory = event.getInventory(); - if (InventoryAccess.isPlayerInventory(inventory) && !Permissions.EDITINV.hasPermission(entity) - || InventoryAccess.isEnderChest(inventory) && !Permissions.EDITENDER.hasPermission(entity)) { - event.setCancelled(true); + + if (InventoryAccess.isPlayerInventory(inventory)) { + if (!Permissions.EDITINV.hasPermission(entity)) { + event.setCancelled(true); + } + } else if (InventoryAccess.isEnderChest(inventory)) { + if (!Permissions.EDITENDER.hasPermission(entity)) { + event.setCancelled(true); + } } } diff --git a/plugin/src/main/java/com/lishid/openinv/util/Permissions.java b/plugin/src/main/java/com/lishid/openinv/util/Permissions.java index 97f695d..c1cab7f 100644 --- a/plugin/src/main/java/com/lishid/openinv/util/Permissions.java +++ b/plugin/src/main/java/com/lishid/openinv/util/Permissions.java @@ -35,7 +35,8 @@ public enum Permissions { EDITENDER("editender"), OPENSELF("openself"), OPENONLINE("openonline"), - OPENOFFLINE("openoffline"); + OPENOFFLINE("openoffline"), + SPECTATE("spectate"); private final String permission; diff --git a/plugin/src/main/resources/plugin.yml b/plugin/src/main/resources/plugin.yml index 037e634..ce43adb 100644 --- a/plugin/src/main/resources/plugin.yml +++ b/plugin/src/main/resources/plugin.yml @@ -5,7 +5,7 @@ author: lishid authors: [Jikoo, ShadowRanger] description: > This plugin allows you to open a player's inventory as a chest and interact with it in real time. -api-version: "1.14" +api-version: "1.15" permissions: OpenInv.any.default: @@ -27,6 +27,7 @@ permissions: OpenInv.searchcontainer: true OpenInv.openonline: true OpenInv.openoffline: true + OpenInv.spectate: true OpenInv.openinv: default: op children: