From 9d58d8f3770f594683e9d2aef0cc758010e7797a Mon Sep 17 00:00:00 2001 From: adrian Date: Thu, 1 Jan 2026 00:12:14 -0300 Subject: [PATCH] Added support for Ender Chest item lookup. --- .../io/github/adrianvic/itemeconomy/Main.java | 95 +++++++++++++++---- .../adrianvic/itemeconomy/VaultLayer.java | 17 ++-- 2 files changed, 83 insertions(+), 29 deletions(-) diff --git a/src/main/java/io/github/adrianvic/itemeconomy/Main.java b/src/main/java/io/github/adrianvic/itemeconomy/Main.java index 63b19f9..219be38 100644 --- a/src/main/java/io/github/adrianvic/itemeconomy/Main.java +++ b/src/main/java/io/github/adrianvic/itemeconomy/Main.java @@ -1,13 +1,12 @@ package io.github.adrianvic.itemeconomy; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; +import java.util.*; + import net.milkbowl.vault.economy.Economy; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.ServicePriority; import org.bukkit.plugin.java.JavaPlugin; @@ -22,29 +21,87 @@ public class Main extends JavaPlugin { super.onDisable(); } - public static List getInventory(Player player) { - return Arrays.stream(player.getInventory().getContents()).map((o) -> { + public enum InventoryID { + INVENTORY, + ENDER_CHEST + } + + public static List getInventory(Player player, InventoryID inventory) { + Inventory inv = player.getInventory(); + + switch (inventory) { + case INVENTORY -> { + inv = player.getInventory(); + } + case ENDER_CHEST -> { + inv = player.getEnderChest(); + } + } + + return Arrays.stream(inv.getContents()).map((o) -> { return o == null ? new ItemStack(Material.AIR) : o; }).toList(); } - public static boolean removeItems(Player player, Material type, int amount) { - if (player.getInventory().all(type).values().stream().mapToInt(ItemStack::getAmount).sum() < amount) { - return false; - } else { - player.getInventory().removeItem(new ItemStack[]{new ItemStack(type, amount)}); - return true; - } + public static List getInventory(Player player) { + return getInventory(player, InventoryID.INVENTORY); } + public static double getBalance(Player player, InventoryID inventory) { + return (double)getInventory(player, inventory).stream().filter(Objects::nonNull).filter((i) -> { + return i.getType().equals(Config.ITEM); + }).mapToInt(ItemStack::getAmount).sum(); + } + + public static double getBalance(Player player) { + Double total = 0.0D; + + for (InventoryID id : InventoryID.values()) { + total += getBalance(player, id); + } + + return total; + } + + public static double getBalance(String player) { + return getBalance(Bukkit.getPlayer(player)); + } + + public static boolean removeItems(Player player, Material type, int amount) { + int remaining = amount; + + remaining = removeFrom(player.getInventory(), type, remaining); + if (remaining > 0) { + remaining = removeFrom(player.getEnderChest(), type, remaining); + } + + return remaining == 0; + } + + private static int removeFrom(Inventory inv, Material type, int amount) { + if (amount <= 0) return 0; + + for (ItemStack stack : inv.all(type).values()) { + int take = Math.min(stack.getAmount(), amount); + stack.setAmount(stack.getAmount() - take); + amount -= take; + if (amount == 0) break; + } + + return amount; + } + + public static void addItems(Player player, Material type, int amount) { - HashMap nope = player.getInventory().addItem(new ItemStack[]{new ItemStack(type, amount)}); - Iterator var4 = nope.values().iterator(); + HashMap invOverflow = player.getInventory().addItem(new ItemStack(type, amount)); + HashMap echestOverflow = player.getEnderChest().addItem(new ItemStack(type, invOverflow.values() + .stream() + .mapToInt(ItemStack::getAmount) + .sum())); - while(var4.hasNext()) { - ItemStack v = (ItemStack)var4.next(); - player.getWorld().dropItemNaturally(player.getLocation(), v); + + for (ItemStack overflow : echestOverflow.values()){ + player.getWorld().dropItemNaturally(player.getLocation(), overflow); } - } } diff --git a/src/main/java/io/github/adrianvic/itemeconomy/VaultLayer.java b/src/main/java/io/github/adrianvic/itemeconomy/VaultLayer.java index cc1260d..665dc8c 100644 --- a/src/main/java/io/github/adrianvic/itemeconomy/VaultLayer.java +++ b/src/main/java/io/github/adrianvic/itemeconomy/VaultLayer.java @@ -16,7 +16,7 @@ public class VaultLayer implements Economy { } public String getName() { - return "ItemEconomy"; + return "ItemEconomy II"; } public boolean hasBankSupport() { @@ -44,14 +44,11 @@ public class VaultLayer implements Economy { } public double getBalance(String playerName) { - Player player = Bukkit.getPlayer(playerName); - return player != null ? (double)Main.getInventory(player).stream().filter(Objects::nonNull).filter((i) -> { - return i.getType().equals(Config.ITEM); - }).mapToInt(ItemStack::getAmount).sum() : 0.0D; + return Main.getBalance(playerName); } public boolean has(String playerName, double amount) { - return this.getBalance(playerName) >= amount; + return Main.getBalance(playerName) >= amount; } public EconomyResponse withdrawPlayer(String playerName, double amount) { @@ -60,13 +57,13 @@ public class VaultLayer implements Economy { } else if (amount < 0.0D) { return this.depositPlayer(playerName, -amount); } else if (!this.has(playerName, amount)) { - return new EconomyResponse(amount, this.getBalance(playerName), ResponseType.FAILURE, "Недостаточно средств"); + return new EconomyResponse(amount, this.getBalance(playerName), ResponseType.FAILURE, "Insufficient founds."); } else { Player player; if ((player = Bukkit.getPlayer(playerName)) == null) { - return new EconomyResponse(amount, this.getBalance(playerName), ResponseType.FAILURE, "Игрок офлайн"); + return new EconomyResponse(amount, this.getBalance(playerName), ResponseType.FAILURE, "This player is offline."); } else { - return !Main.removeItems(player, Config.ITEM, (int)amount) ? new EconomyResponse(amount, this.getBalance(playerName), ResponseType.FAILURE, "Недостаточно средств") : new EconomyResponse(amount, this.getBalance(playerName), ResponseType.SUCCESS, (String)null); + return !Main.removeItems(player, Config.ITEM, (int)amount) ? new EconomyResponse(amount, this.getBalance(playerName), ResponseType.FAILURE, "Insufficient founds.") : new EconomyResponse(amount, this.getBalance(playerName), ResponseType.SUCCESS, (String)null); } } } @@ -79,7 +76,7 @@ public class VaultLayer implements Economy { } else { Player player; if ((player = Bukkit.getPlayer(playerName)) == null) { - return new EconomyResponse(amount, this.getBalance(playerName), ResponseType.FAILURE, "Игрок офлайн"); + return new EconomyResponse(amount, this.getBalance(playerName), ResponseType.FAILURE, "This player is offline."); } else { Main.addItems(player, Config.ITEM, (int)amount); return new EconomyResponse(amount, this.getBalance(playerName), ResponseType.SUCCESS, (String)null);