From ad023c3bd591caaa15bd8f92bdb4b7225c086604 Mon Sep 17 00:00:00 2001 From: fullwall Date: Mon, 19 Jun 2023 20:39:50 +0800 Subject: [PATCH] Various bugfixes including for /npc sitting, item action, event listening to push/knockback events --- main/src/main/java/net/citizensnpcs/Citizens.java | 1 - main/src/main/java/net/citizensnpcs/EventListen.java | 4 ++++ .../main/java/net/citizensnpcs/npc/CitizensNPC.java | 2 +- .../src/main/java/net/citizensnpcs/trait/SitTrait.java | 10 ++++++---- .../java/net/citizensnpcs/trait/shop/ItemAction.java | 8 +++++++- 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/main/src/main/java/net/citizensnpcs/Citizens.java b/main/src/main/java/net/citizensnpcs/Citizens.java index 178c88337..96c270ff1 100644 --- a/main/src/main/java/net/citizensnpcs/Citizens.java +++ b/main/src/main/java/net/citizensnpcs/Citizens.java @@ -629,7 +629,6 @@ public class Citizens extends JavaPlugin implements CitizensPlugin { } } - saves.loadInto(npcRegistry); shops.load(); diff --git a/main/src/main/java/net/citizensnpcs/EventListen.java b/main/src/main/java/net/citizensnpcs/EventListen.java index ed3ec53d8..ccfcfad70 100644 --- a/main/src/main/java/net/citizensnpcs/EventListen.java +++ b/main/src/main/java/net/citizensnpcs/EventListen.java @@ -721,6 +721,8 @@ public class EventListen implements Listener { handlers.register(new RegisteredListener(new Listener() { }, (listener, event) -> { try { + if (event.getClass() != kbc) + return; Entity entity = (Entity) getEntity.invoke(event); if (!(entity instanceof NPCHolder)) return; @@ -751,6 +753,8 @@ public class EventListen implements Listener { }, (listener, event) -> { if (NPCPushEvent.getHandlerList().getRegisteredListeners().length == 0) return; + if (event.getClass() != clazz) + return; try { Entity entity = (Entity) getEntity.invoke(event); if (!(entity instanceof NPCHolder)) diff --git a/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java b/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java index 99b798651..78950a980 100644 --- a/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java +++ b/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java @@ -443,7 +443,7 @@ public class CitizensNPC extends AbstractNPC { public void teleport(Location location, TeleportCause reason) { if (!isSpawned()) return; - if (hasTrait(SitTrait.class)) { + if (hasTrait(SitTrait.class) && getOrAddTrait(SitTrait.class).isSitting()) { getOrAddTrait(SitTrait.class).setSitting(location); } Location npcLoc = getEntity().getLocation(CACHE_LOCATION); diff --git a/main/src/main/java/net/citizensnpcs/trait/SitTrait.java b/main/src/main/java/net/citizensnpcs/trait/SitTrait.java index 1729f6eb5..0d4fe4d07 100644 --- a/main/src/main/java/net/citizensnpcs/trait/SitTrait.java +++ b/main/src/main/java/net/citizensnpcs/trait/SitTrait.java @@ -38,6 +38,7 @@ public class SitTrait extends Trait { if (chair != null) { if (chair.getEntity() != null) { chair.getEntity().eject(); + npc.getEntity().teleport(npc.getEntity().getLocation().clone().add(0, 0.3, 0)); } chair.destroy(); chair = null; @@ -56,9 +57,10 @@ public class SitTrait extends Trait { if (SUPPORT_SITTABLE && npc.getEntity() instanceof Sittable) { ((Sittable) npc.getEntity()).setSitting(true); - if (npc.getEntity().getLocation().distance(sittingAt) > 0.05) { + if (npc.getEntity().getLocation().distance(sittingAt) >= 0.03) { npc.teleport(sittingAt, TeleportCause.PLUGIN); } + return; } if (chair == null) { @@ -78,14 +80,14 @@ public class SitTrait extends Trait { NMS.mount(chair.getEntity(), npc.getEntity()); } - if (chair.getStoredLocation() != null && chair.getStoredLocation().distance(sittingAt) > 0.05) { + if (chair.getStoredLocation() != null && chair.getStoredLocation().distance(sittingAt) >= 0.03) { chair.teleport(sittingAt.clone(), TeleportCause.PLUGIN); } } public void setSitting(Location at) { - this.sittingAt = at != null ? at.clone() : null; - if (!isSitting()) { + this.sittingAt = at != null ? at.clone().add(0, -0.3, 0) : null; + if (at == null) { onDespawn(); } } 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 79bdf91b6..36a776efb 100644 --- a/main/src/main/java/net/citizensnpcs/trait/shop/ItemAction.java +++ b/main/src/main/java/net/citizensnpcs/trait/shop/ItemAction.java @@ -122,10 +122,16 @@ public class ItemAction extends NPCShopAction { continue; if (tooDamaged(toMatch)) continue; + toMatch = toMatch.clone(); for (int j = 0; j < items.size(); j++) { if (!matches(items.get(j), toMatch)) continue; - has.set(j, has.get(j) + toMatch.getAmount()); + int remaining = req.get(j); + int taken = toMatch.getAmount() > remaining ? remaining : toMatch.getAmount(); + has.set(j, has.get(j) + taken); + if (toMatch.getAmount() - taken <= 0) + break; + toMatch.setAmount(toMatch.getAmount() - taken); } } return IntStream.range(0, req.size()).map(i -> req.get(i) == 0 ? 0 : has.get(i) / req.get(i)).reduce(Math::min)