diff --git a/.examples/backpacks/miner.yml b/.examples/backpacks/miner.yml index 0cf8deb..d68cdea 100644 --- a/.examples/backpacks/miner.yml +++ b/.examples/backpacks/miner.yml @@ -21,6 +21,5 @@ items: "DIAMOND": original: true #只允许无任何特殊属性的物品被收入 slot: 5 - limit: 500 price: 10 name: "&b&l钻石" \ No newline at end of file diff --git a/README.md b/README.md index edd14f9..9b4fb7a 100644 --- a/README.md +++ b/README.md @@ -101,6 +101,9 @@ # %UltraBackpack_remain_<背包ID>_<物品ID>% - 得到对应背包内对应物品的剩余可售出数量 - $剩余可售出数量 = $每日售出限制 - $今日售出数量 + +# %UltraBackpack_capacity_<背包ID>% +- 得到对应背包的容量 ``` diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/Main.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/Main.java index c12e47e..32cf3f7 100644 --- a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/Main.java +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/Main.java @@ -4,6 +4,7 @@ import cc.carm.plugin.ultrabackpack.api.UltraBackpackAPI; import cc.carm.plugin.ultrabackpack.api.util.ColorParser; import cc.carm.plugin.ultrabackpack.api.util.MessageUtil; import cc.carm.plugin.ultrabackpack.configuration.PluginConfig; +import cc.carm.plugin.ultrabackpack.hooker.UBExpansion; import cc.carm.plugin.ultrabackpack.listener.CollectListener; import cc.carm.plugin.ultrabackpack.listener.UserListener; import cc.carm.plugin.ultrabackpack.manager.BackpackManager; @@ -84,7 +85,7 @@ public class Main extends JavaPlugin { if (MessageUtil.hasPlaceholderAPI()) { log("注册变量..."); - + new UBExpansion(this).register(); } else { log("检测到未安装PlaceholderAPI,跳过变量注册。"); } diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/backpack/BackpackConfiguration.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/backpack/BackpackConfiguration.java index 14dc7b4..3477eee 100644 --- a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/backpack/BackpackConfiguration.java +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/backpack/BackpackConfiguration.java @@ -34,8 +34,7 @@ public class BackpackConfiguration { public @NotNull String getName() { return this.name; } - - + public @NotNull GUIConfiguration getGUIConfiguration() { return this.guiConfiguration; } diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/hooker/UBExpansion.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/hooker/UBExpansion.java index 77afdf5..d9c5077 100644 --- a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/hooker/UBExpansion.java +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/hooker/UBExpansion.java @@ -3,7 +3,6 @@ package cc.carm.plugin.ultrabackpack.hooker; import cc.carm.plugin.ultrabackpack.Main; import me.clip.placeholderapi.expansion.PlaceholderExpansion; import org.bukkit.entity.Player; -import org.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.NotNull; import java.util.Arrays; @@ -12,14 +11,17 @@ import java.util.List; public class UBExpansion extends PlaceholderExpansion { private static final List PLACEHOLDERS = Arrays.asList( - "%UltraBackpack_%", - "%UltraBackpack_%" + "%UltraBackpack_amount__%", + "%UltraBackpack_sold__%", + "%UltraBackpack_price__%", + "%UltraBackpack_remain__%", + "%UltraBackpack_capacity_%" ); - JavaPlugin plugin; + Main main; - public UBExpansion(JavaPlugin plugin) { - this.plugin = plugin; + public UBExpansion(Main main) { + this.main = main; } @Override @@ -34,17 +36,17 @@ public class UBExpansion extends PlaceholderExpansion { @Override public @NotNull String getAuthor() { - return plugin.getDescription().getAuthors().toString(); + return main.getDescription().getAuthors().toString(); } @Override public @NotNull String getIdentifier() { - return plugin.getDescription().getName(); + return main.getDescription().getName(); } @Override public @NotNull String getVersion() { - return plugin.getDescription().getVersion(); + return main.getDescription().getVersion(); } @Override @@ -75,14 +77,14 @@ public class UBExpansion extends PlaceholderExpansion { Integer sold = Main.getUserManager().getData(player).getItemSold(args[2], args[3]); if (sold == null) return "背包或物品不存在"; - Integer limit = Main.getBackpackManager().getItemLimit(args[2], args[3]); + Integer limit = Main.getBackpackManager().getItemSellLimit(args[2], args[3]); if (limit == null) return "背包或物品不存在"; return Integer.toString(limit - sold); } case "limit": { if (args.length < 3) return "参数不足"; - Integer limit = Main.getBackpackManager().getItemLimit(args[2], args[3]); + Integer limit = Main.getBackpackManager().getItemSellLimit(args[2], args[3]); if (limit == null) return "背包或物品不存在"; else return limit.toString(); } diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/listener/CollectListener.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/listener/CollectListener.java index c5c8f81..c9f6a47 100644 --- a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/listener/CollectListener.java +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/listener/CollectListener.java @@ -1,8 +1,12 @@ package cc.carm.plugin.ultrabackpack.listener; +import cc.carm.plugin.ultrabackpack.Main; import cc.carm.plugin.ultrabackpack.configuration.PluginConfig; +import org.bukkit.Location; +import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.entity.EntityDeathEvent; @@ -14,34 +18,61 @@ import java.util.UUID; public class CollectListener implements Listener { - @EventHandler + @EventHandler(priority = EventPriority.HIGH) public void onBreak(BlockBreakEvent event) { - if (!PluginConfig.Collect.BREAK.get()) return; - Player player = event.getPlayer(); + if (event.isCancelled() || !event.isDropItems() || !PluginConfig.Collect.BREAK.get()) return; - Collection drops = event.getBlock().getDrops(); + Player player = event.getPlayer(); + if (!Main.getUserManager().isCollectEnabled(player)) return; + + Location location = event.getBlock().getLocation(); + World world = event.getBlock().getWorld(); + + Collection drops; + if (player.getItemInUse() == null) { + drops = event.getBlock().getDrops(); + } else { + drops = event.getBlock().getDrops(player.getItemInUse(), player.getPlayer()); + } + + if (drops.isEmpty()) return; + event.setDropItems(false); + + Collection finalDrops = Main.getBackpackManager().collectItem(player, drops); + finalDrops.forEach(finalDrop -> world.dropItemNaturally(location, finalDrop)); } - @EventHandler - public void onBreak(EntityDeathEvent event) { + @EventHandler(priority = EventPriority.HIGH) + public void onDeath(EntityDeathEvent event) { if (!PluginConfig.Collect.KILL.get()) return; + Player player = event.getEntity().getKiller(); if (player == null) return; + if (!Main.getUserManager().isCollectEnabled(player)) return; - Collection drops = event.getDrops(); + Collection finalDrops = Main.getBackpackManager().collectItem(player, event.getDrops()); + event.getDrops().clear(); + event.getDrops().addAll(finalDrops); } + @EventHandler(priority = EventPriority.HIGH) public void onPickup(EntityPickupItemEvent event) { - if (!PluginConfig.Collect.PICKUP.get()) return; + if (event.isCancelled() || !PluginConfig.Collect.PICKUP.get()) return; if (!(event.getEntity() instanceof Player)) return; - Player player = (Player) event.getEntity(); + Player player = (Player) event.getEntity(); + if (!Main.getUserManager().isCollectEnabled(player)) return; + + // 自己扔出去的东西不计入背包 UUID thrower = event.getItem().getThrower(); if (thrower != null && thrower.equals(player.getUniqueId())) return; ItemStack item = event.getItem().getItemStack(); - + if (Main.getBackpackManager().collectItem(player, item)) { + event.setCancelled(true); + event.getItem().remove(); + } } diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/manager/BackpackManager.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/manager/BackpackManager.java index 743dd74..fa3eb8e 100644 --- a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/manager/BackpackManager.java +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/manager/BackpackManager.java @@ -1,12 +1,18 @@ package cc.carm.plugin.ultrabackpack.manager; +import cc.carm.plugin.ultrabackpack.Main; import cc.carm.plugin.ultrabackpack.configuration.backpack.BackpackConfiguration; import cc.carm.plugin.ultrabackpack.configuration.backpack.BackpackItem; +import cc.carm.plugin.ultrabackpack.data.UserData; import com.google.common.collect.HashMultimap; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.HashMap; +import java.util.*; +import java.util.stream.Collectors; public class BackpackManager { @@ -40,6 +46,52 @@ public class BackpackManager { return getBackpacks().get(backpackID); } + public Set getItemBackpacks(ItemStack itemStack) { + return getItemBackpacks(itemStack.getType(), itemStack.getDurability()); + } + + public @Nullable Set getItemBackpacks(Material material, int data) { + return Optional.ofNullable(itemMap.get(getItemTypeID(material, data))) + .map(set -> set.stream().map(this::getBackpack).collect(Collectors.toSet())) + .orElse(null); + } + + public Set getPlayerUsableBackpack(Player player, ItemStack itemStack) { + String typeID = getItemTypeID(itemStack); + return getItemBackpacks(itemStack).stream().filter(configuration -> { + int currentAmount = Optional.ofNullable(Main.getUserManager().getData(player) + .getItemAmount(configuration.getIdentifier(), typeID)).orElse(0); + int backpackCapacity = configuration.getCapacity().getPlayerCapacity(player); + return currentAmount + itemStack.getAmount() <= backpackCapacity; + }).collect(Collectors.toSet()); + } + + public @NotNull String getItemTypeID(Material material, int data) { + return material.name() + ":" + data; + } + + public @NotNull String getItemTypeID(ItemStack itemStack) { + return getItemTypeID(itemStack.getType(), itemStack.getDurability()); + } + + public Collection collectItem(Player player, Collection items) { + if (!Main.getUserManager().isCollectEnabled(player)) return new ArrayList<>(); + else return items.stream().filter(item -> collectItem(player, item)).collect(Collectors.toList()); + } + + public boolean collectItem(Player player, ItemStack item) { + if (!Main.getUserManager().isCollectEnabled(player)) return false; + Set usableBackpacks = getPlayerUsableBackpack(player, item); + if (usableBackpacks.size() < 1) return false; + BackpackConfiguration configuration = usableBackpacks.stream().findFirst().orElse(null); + + String typeID = getItemTypeID(item); + UserData data = Main.getUserManager().getData(player); + int itemAmount = item.getAmount(); + data.addItemAmount(configuration.getIdentifier(), typeID, itemAmount); + return true; + } + /** * 获得某背包配置中的某件物品单价,最低为0。 * @@ -62,7 +114,7 @@ public class BackpackManager { * @param itemTypeID 物品ID * @return 若为空,则该背包或该物品不存在。 */ - public @Nullable Integer getItemLimit(@NotNull String backpackID, @NotNull String itemTypeID) { + public @Nullable Integer getItemSellLimit(@NotNull String backpackID, @NotNull String itemTypeID) { BackpackConfiguration configuration = getBackpack(backpackID); if (configuration == null) return null; BackpackItem item = configuration.getItems().get(itemTypeID); @@ -70,5 +122,18 @@ public class BackpackManager { return item.getLimit(); } + /** + * 获得某背包配置中的某件物品每日售出限制,最低为0。 + * + * @param backpack 背包 + * @param itemTypeID 物品ID + * @return 若为空,则该背包或该物品不存在。 + */ + public @Nullable Integer getItemSellLimit(@NotNull BackpackConfiguration backpack, @NotNull String itemTypeID) { + BackpackItem item = backpack.getItems().get(itemTypeID); + if (item == null) return null; + return item.getLimit(); + } + } diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/manager/UserManager.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/manager/UserManager.java index c65a84d..7dacf3e 100644 --- a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/manager/UserManager.java +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/manager/UserManager.java @@ -39,5 +39,11 @@ public class UserManager implements UBUserManager { return new UserData(userUUID, Main.getStorage(), new HashMap<>(), new Date(System.currentTimeMillis())); } } - + + + public boolean isCollectEnabled(Player player) { + return player.hasPermission("UltraBackpack.use") && + player.hasPermission("UltraBackpack.auto") && + player.hasPermission("UltraBackpack.auto.enable"); + } }