From a91f0cd2eeab5d265a79a01dd8c5508bbf7eebfc Mon Sep 17 00:00:00 2001 From: fullwall Date: Wed, 26 Oct 2022 12:33:23 +0800 Subject: [PATCH] Fix /npc text remove clickable not working, make /npc shop item action work on material alone for now --- .../net/citizensnpcs/trait/ShopTrait.java | 14 +++++----- .../citizensnpcs/trait/shop/ItemAction.java | 27 +++++++++++++++---- .../net/citizensnpcs/trait/text/Text.java | 4 +-- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/main/src/main/java/net/citizensnpcs/trait/ShopTrait.java b/main/src/main/java/net/citizensnpcs/trait/ShopTrait.java index 845df5a92..e5629d134 100644 --- a/main/src/main/java/net/citizensnpcs/trait/ShopTrait.java +++ b/main/src/main/java/net/citizensnpcs/trait/ShopTrait.java @@ -296,13 +296,13 @@ public class ShopTrait extends Trait { } public void onClick(NPCShop shop, CitizensInventoryClickEvent event) { - if (shop.type != ShopType.COMMAND) { - List take = execute(cost, action -> action.take(event.getWhoClicked())); - if (take == null) - return; - if (execute(result, action -> action.grant(event.getWhoClicked())) == null) { - take.forEach(a -> a.rollback()); - } + if (shop.type == ShopType.COMMAND) + return; + List take = execute(cost, action -> action.take(event.getWhoClicked())); + if (take == null) + return; + if (execute(result, action -> action.grant(event.getWhoClicked())) == null) { + take.forEach(a -> a.rollback()); } } } diff --git a/main/src/main/java/net/citizensnpcs/trait/shop/ItemAction.java b/main/src/main/java/net/citizensnpcs/trait/shop/ItemAction.java index 9ef8f17aa..daa611033 100644 --- a/main/src/main/java/net/citizensnpcs/trait/shop/ItemAction.java +++ b/main/src/main/java/net/citizensnpcs/trait/shop/ItemAction.java @@ -68,9 +68,7 @@ public class ItemAction extends NPCShopAction { .collect(Collectors.toMap(k -> k.getType(), v -> v.getAmount())); boolean contains = true; for (Map.Entry entry : required.entrySet()) { - if (!source.contains(entry.getKey(), entry.getValue())) { - contains = false; - } + contains &= source.contains(entry.getKey(), entry.getValue()); } for (ItemStack item : items) { if (item.hasItemMeta() && !source.contains(item)) { @@ -79,7 +77,26 @@ public class ItemAction extends NPCShopAction { } return contains; }, () -> { - source.removeItem(items.toArray(new ItemStack[items.size()])); + Map required = items.stream() + .collect(Collectors.toMap(k -> k.getType(), v -> v.getAmount())); + ItemStack[] contents = source.getContents(); + for (int i = 0; i < contents.length; i++) { + ItemStack stack = contents[i]; + if (stack == null || stack.getType() == Material.AIR || !required.containsKey(stack.getType())) + continue; + Material type = stack.getType(); + int remaining = required.remove(type); + int taken = stack.getAmount() > remaining ? remaining : stack.getAmount(); + if (stack.getAmount() == taken) { + source.clear(i); + } else { + stack.setAmount(stack.getAmount() - taken); + source.setItem(i, stack); + } + if (remaining - taken > 0) { + required.put(type, remaining - taken); + } + } }, () -> { source.addItem(items.toArray(new ItemStack[items.size()])); }); @@ -105,7 +122,7 @@ public class ItemAction extends NPCShopAction { for (int i = 0; i < 3 * 9; i++) { InventoryMenuSlot slot = ctx.getSlot(i); slot.clear(); - if (i < base.items.size()) { + if (base != null && i < base.items.size()) { slot.setItemStack(base.items.get(i).clone()); } slot.setClickHandler(event -> { diff --git a/main/src/main/java/net/citizensnpcs/trait/text/Text.java b/main/src/main/java/net/citizensnpcs/trait/text/Text.java index a8e68788a..31f02c502 100644 --- a/main/src/main/java/net/citizensnpcs/trait/text/Text.java +++ b/main/src/main/java/net/citizensnpcs/trait/text/Text.java @@ -234,8 +234,8 @@ public class Text extends Trait implements Runnable, Listener, ConversationAband Paginator paginator = new Paginator().header("Current Texts").enablePageSwitcher(); for (int i = 0; i < text.size(); i++) { paginator.addLine(text.get(i) + " (edit) (-)"); + + " >edit) (-)"); } return paginator.sendPage(player, page); }