1
mirror of https://github.com/CarmJos/UltraDepository.git synced 2024-09-19 19:55:45 +00:00

[v1.1.5] 版本修复

- [F] 修复自动收集时仓库容量不生效的问题。
- [F] 修复GUI在从其他界面中打开时功能失效的问题。
- [U] 支持按组拿取物品时不关闭界面并实时更新物品数量。
This commit is contained in:
Carm Jos 2021-12-31 16:02:17 +08:00
parent c5230c0fbd
commit f98a7ce025
8 changed files with 107 additions and 166 deletions

View File

@ -14,7 +14,7 @@
<groupId>cc.carm.plugin</groupId>
<artifactId>ultradepository</artifactId>
<packaging>jar</packaging>
<version>1.1.4</version>
<version>1.1.5</version>
<name>UltraDepository</name>
<description>超级仓库插件,支持设定不同物品的存储仓库。</description>

View File

@ -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);
}
}

View File

@ -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<Item> droppedItems = event.getItems();
if (droppedItems.isEmpty()) return;

View File

@ -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<Depository> 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());
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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<String, Object> 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<HumanEntity> 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
*/

View File

@ -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);
}
}
}