diff --git a/pom.xml b/pom.xml
index 60b0179..6cb3b0b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,7 +14,7 @@
cc.carm.plugin
ultradepository
jar
- 1.1.4
+ 1.1.5
UltraDepository
超级仓库插件,支持设定不同物品的存储仓库。
diff --git a/src/main/java/cc/carm/plugin/ultradepository/configuration/depository/DepositoryCapacity.java b/src/main/java/cc/carm/plugin/ultradepository/configuration/depository/DepositoryCapacity.java
index ce81895..95dcff5 100644
--- a/src/main/java/cc/carm/plugin/ultradepository/configuration/depository/DepositoryCapacity.java
+++ b/src/main/java/cc/carm/plugin/ultradepository/configuration/depository/DepositoryCapacity.java
@@ -3,7 +3,6 @@ package cc.carm.plugin.ultradepository.configuration.depository;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
-import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -45,9 +44,8 @@ public class DepositoryCapacity {
public int getPlayerCapacity(Player player) {
return getPermissions().entrySet().stream()
.filter(entry -> player.hasPermission(entry.getKey()))
- .map(Map.Entry::getValue)
- .min(Comparator.comparingInt(Integer::intValue))
- .orElse(defaultCapacity);
+ .mapToInt(Map.Entry::getValue)
+ .max().orElse(defaultCapacity);
}
}
diff --git a/src/main/java/cc/carm/plugin/ultradepository/listener/CollectListener.java b/src/main/java/cc/carm/plugin/ultradepository/listener/CollectListener.java
index 00be5d8..8475286 100644
--- a/src/main/java/cc/carm/plugin/ultradepository/listener/CollectListener.java
+++ b/src/main/java/cc/carm/plugin/ultradepository/listener/CollectListener.java
@@ -2,8 +2,6 @@ package cc.carm.plugin.ultradepository.listener;
import cc.carm.plugin.ultradepository.Main;
import cc.carm.plugin.ultradepository.configuration.PluginConfig;
-import org.bukkit.Material;
-import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@@ -26,9 +24,7 @@ public class CollectListener implements Listener {
Player player = event.getPlayer();
if (!Main.getUserManager().isCollectEnabled(player)) return;
- if (event.getBlock().getType() == Material.CHEST || event.getBlock().getType() == Material.TRAPPED_CHEST) {
- return;
- }
+ if (event.getBlock().getType().isOccluding()) return;
List- droppedItems = event.getItems();
if (droppedItems.isEmpty()) return;
diff --git a/src/main/java/cc/carm/plugin/ultradepository/manager/DepositoryManager.java b/src/main/java/cc/carm/plugin/ultradepository/manager/DepositoryManager.java
index 9fbaf7e..8ed0696 100644
--- a/src/main/java/cc/carm/plugin/ultradepository/manager/DepositoryManager.java
+++ b/src/main/java/cc/carm/plugin/ultradepository/manager/DepositoryManager.java
@@ -7,7 +7,6 @@ import cc.carm.plugin.ultradepository.configuration.depository.Depository;
import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem;
import cc.carm.plugin.ultradepository.data.UserData;
import com.google.common.collect.HashMultimap;
-import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
@@ -112,12 +111,10 @@ public class DepositoryManager {
}
public Set getPlayerUsableDepository(Player player, ItemStack itemStack) {
- String typeID = getItemTypeID(itemStack);
return getItemDepositories(itemStack).stream().filter(configuration -> {
- int currentAmount = Optional.ofNullable(Main.getUserManager().getData(player)
- .getItemAmount(configuration.getIdentifier(), typeID)).orElse(0);
- int depositoryCapacity = configuration.getCapacity().getPlayerCapacity(player);
- return currentAmount + itemStack.getAmount() <= depositoryCapacity;
+ int used = Main.getUserManager().getData(player).getDepositoryData(configuration).getUsedCapacity();
+ int max = configuration.getCapacity().getPlayerCapacity(player);
+ return used + itemStack.getAmount() <= max;
}).collect(Collectors.toSet());
}
diff --git a/src/main/java/cc/carm/plugin/ultradepository/ui/DepositoryGUI.java b/src/main/java/cc/carm/plugin/ultradepository/ui/DepositoryGUI.java
index ef126aa..670c89e 100644
--- a/src/main/java/cc/carm/plugin/ultradepository/ui/DepositoryGUI.java
+++ b/src/main/java/cc/carm/plugin/ultradepository/ui/DepositoryGUI.java
@@ -65,18 +65,13 @@ public class DepositoryGUI extends GUI {
}
if (type == ClickType.LEFT) {
- player.closeInventory();
- if (itemData.getAmount() >= 1) {
- if (remain >= 1) {
- SellItemGUI.open(player, userData, itemData, depository, item);
- } else {
- PluginMessages.ITEM_SOLD_LIMIT.send(player, new Object[]{remain, item.getLimit()});
- }
+ if (remain >= 1) {
+ SellItemGUI.open(player, userData, itemData, depository, item);
} else {
- PluginMessages.NO_ENOUGH_ITEM.send(player);
+ PluginMessages.ITEM_SOLD_LIMIT.send(player, new Object[]{remain, item.getLimit()});
}
} else if (type == ClickType.RIGHT) {
- player.closeInventory();
+
if (hasEmptySlot(player)) {
int pickupAmount = Math.min(itemData.getAmount(), item.getMaterial().getMaxStackSize());
userData.removeItemAmount(item.getDepository().getIdentifier(), item.getTypeID(), pickupAmount);
@@ -84,8 +79,11 @@ public class DepositoryGUI extends GUI {
PluginMessages.PICKUP.send(player, new Object[]{
item.getName(), pickupAmount
});
+ setupItems(); //刷新GUI
+ updateView();
} else {
PluginMessages.NO_SPACE.send(player);
+ player.closeInventory();
}
}
}
@@ -99,6 +97,7 @@ public class DepositoryGUI extends GUI {
}
public static void open(@NotNull Player player, @NotNull Depository depository) {
+ player.closeInventory();
DepositoryGUI gui = new DepositoryGUI(player, depository);
gui.openGUI(player);
}
diff --git a/src/main/java/cc/carm/plugin/ultradepository/ui/SellItemGUI.java b/src/main/java/cc/carm/plugin/ultradepository/ui/SellItemGUI.java
index 8b730e3..0b1dd53 100644
--- a/src/main/java/cc/carm/plugin/ultradepository/ui/SellItemGUI.java
+++ b/src/main/java/cc/carm/plugin/ultradepository/ui/SellItemGUI.java
@@ -2,6 +2,7 @@ package cc.carm.plugin.ultradepository.ui;
import cc.carm.plugin.ultradepository.Main;
import cc.carm.plugin.ultradepository.configuration.PluginConfig;
+import cc.carm.plugin.ultradepository.configuration.PluginMessages;
import cc.carm.plugin.ultradepository.configuration.depository.Depository;
import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem;
import cc.carm.plugin.ultradepository.data.DepositoryItemData;
@@ -177,7 +178,12 @@ public class SellItemGUI extends GUI {
public static void open(Player player, UserData userData, DepositoryItemData itemData,
Depository configuration, DepositoryItem item) {
- if (!Main.getEconomyManager().isInitialized()) return;
+ player.closeInventory();
+ if (!Main.getEconomyManager().isInitialized()) {
+ PluginMessages.NO_ECONOMY.send(player);
+ return;
+ }
+
SellItemGUI gui = new SellItemGUI(player, userData, itemData, configuration, item);
gui.openGUI(player);
}
diff --git a/src/main/java/cc/carm/plugin/ultradepository/util/gui/GUI.java b/src/main/java/cc/carm/plugin/ultradepository/util/gui/GUI.java
index 2b30f14..69dc79d 100644
--- a/src/main/java/cc/carm/plugin/ultradepository/util/gui/GUI.java
+++ b/src/main/java/cc/carm/plugin/ultradepository/util/gui/GUI.java
@@ -6,16 +6,18 @@ import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryDragEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
-import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.stream.IntStream;
public class GUI {
@@ -26,13 +28,13 @@ public class GUI {
public GUIItem[] items;
public Inventory inv;
- boolean cancelOnTarget = true;
- boolean cancelOnSelf = true;
- boolean cancelOnOuter = true;
+ boolean setCancelledIfClickOnTarget = true;
+ boolean setCancelledIfClickOnSelf = true;
+ boolean setCancelledIfClickOnOuter = true;
Map flags;
- public GUIListener listener;
+ public Listener listener;
public GUI(GUIType type, String name) {
this.type = type;
@@ -71,18 +73,10 @@ public class GUI {
}
}
- /**
- * 批量添加GUI Item
- *
- * @param item 物品
- * @param index 对应格
- */
public void setItem(GUIItem item, int... index) {
- Arrays.stream(index).forEach(i -> setItem(i, item));
- }
-
- public void setItem(GUIItem item, int start, int end) {
- IntStream.rangeClosed(start, end).forEach(i -> setItem(i, item));
+ for (int i : index) {
+ setItem(i, item);
+ }
}
public GUIItem getItem(int index) {
@@ -95,18 +89,14 @@ public class GUI {
public void updateView() {
if (this.inv != null) {
List viewers = this.inv.getViewers();
- IntStream.range(0, this.items.length).forEach(index -> {
- GUIItem item = items[index];
- if (item == null) {
+ for (int index = 0; index < this.items.length; index++) {
+ if (items[index] == null) {
inv.setItem(index, new ItemStack(Material.AIR));
} else {
inv.setItem(index, items[index].display);
}
- });
-
- for (HumanEntity p : viewers) {
- ((Player) p).updateInventory();
}
+ viewers.forEach(p -> ((Player) p).updateInventory());
}
}
@@ -117,7 +107,7 @@ public class GUI {
* @param b 是否取消
*/
public void setCancelledIfClickOnTarget(boolean b) {
- this.cancelOnTarget = b;
+ this.setCancelledIfClickOnTarget = b;
}
/**
@@ -127,7 +117,7 @@ public class GUI {
* @param b 是否取消
*/
public void setCancelledIfClickOnSelf(boolean b) {
- this.cancelOnSelf = b;
+ this.setCancelledIfClickOnSelf = b;
}
/**
@@ -137,7 +127,7 @@ public class GUI {
* @param b 是否取消
*/
public void setCancelledIfClickOnOuter(boolean b) {
- this.cancelOnOuter = b;
+ this.setCancelledIfClickOnOuter = b;
}
public void addFlag(String flag, Object obj) {
@@ -182,14 +172,78 @@ public class GUI {
this.inv = inv;
player.openInventory(inv);
- if (listener == null) {
- Main.regListener(listener = new GUIListener(this, player));
- }
+ if (listener == null)
+ Bukkit.getPluginManager().registerEvents(listener = new Listener() {
+ @EventHandler
+ public void onInventoryClickEvent(InventoryClickEvent event) {
+ if (!(event.getWhoClicked() instanceof Player)) return;
+ Player player = (Player) event.getWhoClicked();
+ if (!hasOpenedGUI(player)) return;
+
+ rawClickListener(event);
+ if (event.getSlot() != -999) {
+ try {
+ if (getOpenedGUI(player) == GUI.this
+ && event.getClickedInventory() != null
+ && event.getClickedInventory().equals(GUI.this.inv)
+ && GUI.this.items[event.getSlot()] != null) {
+ GUI.this.items[event.getSlot()].realRawClickAction(event);
+ }
+ } catch (ArrayIndexOutOfBoundsException e) {
+ System.err.print("err cause by GUI(" + GUI.this + "), name=" + name);
+ e.printStackTrace();
+ return;
+ }
+ } else if (setCancelledIfClickOnOuter) {
+ event.setCancelled(true);
+ }
+
+ if (getOpenedGUI(player) == GUI.this
+ && event.getClickedInventory() != null) {
+ if (event.getClickedInventory().equals(GUI.this.inv)) {
+ if (setCancelledIfClickOnTarget) event.setCancelled(true);
+
+ if (event.getSlot() != -999 && GUI.this.items[event.getSlot()] != null) {
+ GUIItem clickedItem = GUI.this.items[event.getSlot()];
+ if (clickedItem.isActionActive()) {
+ clickedItem.onClick(event.getClick());
+ clickedItem.rawClickAction(event);
+ clickedItem.actions.forEach(action -> action.run(event.getClick(), player));
+ }
+ clickedItem.actionsIgnoreActive.forEach(action -> action.run(event.getClick(), player));
+ }
+ } else if (event.getClickedInventory().equals(player.getInventory()) && setCancelledIfClickOnSelf) {
+ event.setCancelled(true);
+ }
+ }
+ }
+
+ @EventHandler
+ public void onDrag(InventoryDragEvent e) {
+ if (!(e.getWhoClicked() instanceof Player)) return;
+ if (e.getInventory().equals(inv)
+ || e.getInventory().equals(e.getWhoClicked().getInventory())) {
+ GUI.this.onDrag(e);
+ }
+ }
+
+ @EventHandler
+ public void onInventoryCloseEvent(InventoryCloseEvent event) {
+ if (!(event.getPlayer() instanceof Player)) return;
+ if (!event.getInventory().equals(inv)) return;
+
+ HandlerList.unregisterAll(this);
+ listener = null;
+ removeOpenedGUI((Player) event.getPlayer());
+ onClose();
+
+ }
+ }, Main.getInstance());
}
/**
- * 拖动GUI内物品时执行的代码
+ * 拖动GUI内物品是执行的代码
*
* @param event InventoryDragEvent
*/
diff --git a/src/main/java/cc/carm/plugin/ultradepository/util/gui/GUIListener.java b/src/main/java/cc/carm/plugin/ultradepository/util/gui/GUIListener.java
deleted file mode 100644
index 1794227..0000000
--- a/src/main/java/cc/carm/plugin/ultradepository/util/gui/GUIListener.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package cc.carm.plugin.ultradepository.util.gui;
-
-import cc.carm.plugin.ultradepository.Main;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.HandlerList;
-import org.bukkit.event.Listener;
-import org.bukkit.event.inventory.InventoryClickEvent;
-import org.bukkit.event.inventory.InventoryCloseEvent;
-import org.bukkit.event.inventory.InventoryDragEvent;
-import org.bukkit.event.inventory.InventoryOpenEvent;
-
-public class GUIListener implements Listener {
-
- final GUI currentGUI;
- final Player player;
-
- public GUIListener(GUI gui, Player player) {
- this.currentGUI = gui;
- this.player = player;
- }
-
- public GUI getCurrentGUI() {
- return currentGUI;
- }
-
- @EventHandler
- public void onInventoryClickEvent(InventoryClickEvent event) {
- if (!(event.getWhoClicked() instanceof Player)) return;
- getCurrentGUI().rawClickListener(event);
-
- Player p = (Player) event.getWhoClicked();
- if (event.getSlot() != -999) {
- try {
- if (GUI.getOpenedGUI(p) == getCurrentGUI()
- && event.getClickedInventory() != null
- && event.getClickedInventory().equals(getCurrentGUI().inv)
- && getCurrentGUI().items[event.getSlot()] != null) {
- getCurrentGUI().items[event.getSlot()].realRawClickAction(event);
- }
- } catch (ArrayIndexOutOfBoundsException e) {
- Main.error("error cause by GUI(" + getCurrentGUI() + "), name=" + getCurrentGUI().name);
- e.printStackTrace();
- return;
- }
- } else if (getCurrentGUI().cancelOnOuter) {
- event.setCancelled(true);
- }
-
- if (GUI.hasOpenedGUI(p)
- && GUI.getOpenedGUI(p) == getCurrentGUI()
- && event.getClickedInventory() != null) {
-
- if (event.getClickedInventory().equals(getCurrentGUI().inv)) {
- if (getCurrentGUI().cancelOnTarget) event.setCancelled(true);
-
- if (event.getSlot() != -999 && getCurrentGUI().items[event.getSlot()] != null) {
-
- GUIItem item = getCurrentGUI().items[event.getSlot()];
-
- if (item.isActionActive()) {
- item.onClick(event.getClick());
- item.rawClickAction(event);
- item.actions.forEach(action -> action.run(event.getClick(), player));
- }
-
- item.actionsIgnoreActive.forEach(action -> action.run(event.getClick(), player));
-
- }
- } else if (event.getClickedInventory().equals(p.getInventory()) && getCurrentGUI().cancelOnSelf) {
- event.setCancelled(true);
- }
- }
- }
-
- @EventHandler
- public void onDrag(InventoryDragEvent e) {
- if (!(e.getWhoClicked() instanceof Player)) return;
- Player p = (Player) e.getWhoClicked();
- if (e.getInventory().equals(getCurrentGUI().inv) || e.getInventory().equals(p.getInventory())) {
- getCurrentGUI().onDrag(e);
- }
-
- }
-
- @EventHandler
- public void onInventoryCloseEvent(InventoryCloseEvent event) {
- Player p = (Player) event.getPlayer();
- if (event.getInventory().equals(getCurrentGUI().inv)) {
- HandlerList.unregisterAll(this);
- getCurrentGUI().listener = null;
- getCurrentGUI().onClose();
- GUI.removeOpenedGUI(p);
- }
- }
-
- @EventHandler
- public void onOpen(InventoryOpenEvent event) {
- Player p = (Player) event.getPlayer();
- //开启新界面后 结束旧界面
- if (!event.getInventory().equals(getCurrentGUI().inv)) {
- HandlerList.unregisterAll(this);
- getCurrentGUI().listener = null;
- getCurrentGUI().onClose();
- GUI.removeOpenedGUI(p);
- }
- }
-
-}