diff --git a/src/main/java/net/citizensnpcs/api/astar/pathfinder/DoorExaminer.java b/src/main/java/net/citizensnpcs/api/astar/pathfinder/DoorExaminer.java index bd776dc0..430413f4 100644 --- a/src/main/java/net/citizensnpcs/api/astar/pathfinder/DoorExaminer.java +++ b/src/main/java/net/citizensnpcs/api/astar/pathfinder/DoorExaminer.java @@ -90,22 +90,24 @@ private Block getCorrectDoor(Block point) { @Override public void onReached(NPC npc, Block point) { - Location centreDoor = point.getLocation().add(0.5, 0, 0.5); + Location doorCentre = point.getLocation().add(0.5, 0, 0.5); new BukkitRunnable() { @Override public void run() { if (!npc.getNavigator().isNavigating()) { + if (opened && npc.getStoredLocation().distance(doorCentre) <= 1.8) { + close(npc, point); + } cancel(); return; } - double dist = npc.getStoredLocation().distance(centreDoor); - if (dist > 1.8) { + if (npc.getStoredLocation().distance(doorCentre) > 1.8) { close(npc, point); cancel(); } } - }.runTaskTimer(CitizensAPI.getPlugin(), 5, 1); + }.runTaskTimer(CitizensAPI.getPlugin(), 3, 1); } private void open(NPC npc, Block point) { @@ -157,7 +159,8 @@ private void open(NPC npc, Block point) { @Override public void run(NPC npc, Block point, ListIterator path) { - if (!MinecraftBlockExaminer.isDoor(point.getType()) || opened) + if ((!MinecraftBlockExaminer.isDoor(point.getType()) && !MinecraftBlockExaminer.isGate(point.getType())) + || opened) return; if (npc.getStoredLocation().distance(point.getLocation().add(0.5, 0, 0.5)) > 2.5) return; diff --git a/src/main/java/net/citizensnpcs/api/gui/InventoryMenu.java b/src/main/java/net/citizensnpcs/api/gui/InventoryMenu.java index f7f05275..6e3677ba 100644 --- a/src/main/java/net/citizensnpcs/api/gui/InventoryMenu.java +++ b/src/main/java/net/citizensnpcs/api/gui/InventoryMenu.java @@ -9,10 +9,10 @@ import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collection; +import java.util.Deque; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Queue; import java.util.WeakHashMap; import java.util.function.Consumer; @@ -69,8 +69,7 @@ public class InventoryMenu implements Listener, Runnable { private boolean delayViewerChanges; private PageContext page; private int pickupAmount = -1; - private HumanEntity singleViewer; - private final Queue stack = Queues.newArrayDeque(); + private final Deque stack = Queues.newArrayDeque(); private boolean transitioning; private Collection views = Lists.newArrayList(); @@ -103,7 +102,9 @@ public void close() { closingViews = true; runViewerModifier(() -> { for (InventoryView view : views) { - page.page.onClose(view.getPlayer()); + if (page != null) { + page.page.onClose(view.getPlayer()); + } view.close(); } views.clear(); @@ -221,7 +222,6 @@ private void handleClick(InventoryClickEvent event) { switch (event.getAction()) { case COLLECT_TO_CURSOR: event.setCancelled(true); - case NOTHING: case UNKNOWN: case DROP_ONE_CURSOR: case DROP_ALL_CURSOR: @@ -229,6 +229,8 @@ private void handleClick(InventoryClickEvent event) { default: break; } + if (event.getSlot() < 0) + return; InventoryMenuSlot slot = page.ctx.getSlot(event.getSlot()); CitizensInventoryClickEvent ev = new CitizensInventoryClickEvent(event, pickupAmount); slot.onClick(ev); @@ -441,7 +443,7 @@ private void transition(InventoryMenuInfo info, InventoryMenuPage instance, Map< context.putIfAbsent(entry.getKey(), entry.getValue()); } page.ctx.data().clear(); - stack.add(page); + stack.addLast(page); } page = new PageContext(); page.page = instance; @@ -543,9 +545,10 @@ public void transitionBack() { page.page.onClose(view.getPlayer()); } Map data = page.ctx.data(); - page = stack.poll(); + page = stack.pollLast(); if (page != null) { page.ctx.data().putAll(data); + page.page.initialise(page.ctx); } data.clear(); transitionViewersToInventory(page == null ? null : page.ctx.getInventory()); diff --git a/src/main/java/net/citizensnpcs/api/gui/InventoryMenuSlot.java b/src/main/java/net/citizensnpcs/api/gui/InventoryMenuSlot.java index 43562de5..c4e31c4b 100644 --- a/src/main/java/net/citizensnpcs/api/gui/InventoryMenuSlot.java +++ b/src/main/java/net/citizensnpcs/api/gui/InventoryMenuSlot.java @@ -20,6 +20,7 @@ import net.citizensnpcs.api.util.Colorizer; import net.citizensnpcs.api.util.Messaging; +import net.md_5.bungee.api.ChatColor; /** * Represents a single inventory slot in a {@link InventoryMenu}. @@ -45,6 +46,12 @@ public void addClickHandler(Consumer func) { handlers.add(func); } + public void clear() { + handlers.clear(); + actionFilter = null; + setItemStack(null); + } + @Override public boolean equals(Object obj) { if (this == obj) { @@ -100,8 +107,8 @@ void initialise(MenuSlot data) { if (meta != null) { meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); if (!data.lore().equals("EMPTY")) { - meta.setLore( - Arrays.asList(Colorizer.parseColors(Messaging.tryTranslate(data.lore())).split("\\n|\n"))); + meta.setLore(Arrays + .asList(Colorizer.parseColors(Messaging.tryTranslate(data.lore())).split("\\n|\n|
"))); } if (!data.title().equals("EMPTY")) { meta.setDisplayName(Colorizer.parseColors(Messaging.tryTranslate(data.title()))); @@ -118,7 +125,7 @@ void onClick(CitizensInventoryClickEvent event) { event.setCancelled(true); event.setResult(Result.DENY); } - for (Consumer runnable : handlers) { + for (Consumer runnable : Lists.newArrayList(handlers)) { runnable.accept(event); } } @@ -126,7 +133,9 @@ void onClick(CitizensInventoryClickEvent event) { public void setDescription(String description) { ItemStack item = inventory.getItem(index); ItemMeta meta = item.getItemMeta(); - meta.setLore(Arrays.asList(Colorizer.parseColors(description).split("\n"))); + List list = Arrays.asList(Colorizer.parseColors(description).split("\\n|\n|
")); + meta.setDisplayName(ChatColor.RESET + list.get(0)); + meta.setLore(list.subList(1, list.size())); meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); item.setItemMeta(meta); inventory.setItem(index, item); @@ -153,11 +162,18 @@ public void setItemStack(ItemStack stack) { inventory.setItem(index, stack); } - public void setItemStack(ItemStack item, String description) { - ItemMeta meta = item.getItemMeta(); - meta.setLore(Arrays.asList(Colorizer.parseColors(description).split("\n"))); + public void setItemStack(ItemStack stack, String name) { + setItemStack(stack, name, null); + } + + public void setItemStack(ItemStack stack, String name, String description) { + ItemMeta meta = stack.getItemMeta(); + meta.setDisplayName(ChatColor.RESET + Colorizer.parseColors(name)); + if (description != null) { + meta.setLore(Arrays.asList(Colorizer.parseColors(description).split("\n"))); + } meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); - item.setItemMeta(meta); - inventory.setItem(index, item); + stack.setItemMeta(meta); + inventory.setItem(index, stack); } } diff --git a/src/main/java/net/citizensnpcs/api/gui/MenuContext.java b/src/main/java/net/citizensnpcs/api/gui/MenuContext.java index 731662ac..bd63003c 100644 --- a/src/main/java/net/citizensnpcs/api/gui/MenuContext.java +++ b/src/main/java/net/citizensnpcs/api/gui/MenuContext.java @@ -30,6 +30,16 @@ public MenuContext(InventoryMenu menu, InventoryMenuSlot[] slots, Inventory inve this.data.putAll(data); } + public void clearSlots() { + for (int i = 0; i < slots.length; i++) { + InventoryMenuSlot slot = slots[i]; + if (slot != null) { + slot.clear(); + } + slots[i] = null; + } + } + public Map data() { return data; }