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: