From a7d9c0658177b835cd11f1e515c0acf79c15c04d Mon Sep 17 00:00:00 2001 From: fullwall Date: Thu, 30 Jan 2025 00:48:38 +0800 Subject: [PATCH] Fix bug with ClickRedirectTrait and Holograms --- .../java/net/citizensnpcs/EventListen.java | 6 ++-- .../citizensnpcs/commands/AdminCommands.java | 1 + .../citizensnpcs/commands/NPCCommands.java | 8 ++--- .../npc/ai/AStarNavigationStrategy.java | 2 +- .../trait/ClickRedirectTrait.java | 29 +++++++++++-------- .../net/citizensnpcs/trait/HologramTrait.java | 24 +++++++-------- .../citizensnpcs/trait/ScoreboardTrait.java | 2 +- 7 files changed, 39 insertions(+), 33 deletions(-) diff --git a/main/src/main/java/net/citizensnpcs/EventListen.java b/main/src/main/java/net/citizensnpcs/EventListen.java index 10cc739b6..5ed08ba2d 100644 --- a/main/src/main/java/net/citizensnpcs/EventListen.java +++ b/main/src/main/java/net/citizensnpcs/EventListen.java @@ -375,7 +375,7 @@ public class EventListen implements Listener { Player damager = (Player) damageEvent.getDamager(); if (npc.hasTrait(ClickRedirectTrait.class)) { - npc = npc.getTraitNullable(ClickRedirectTrait.class).getRedirectNPC(); + npc = npc.getTraitNullable(ClickRedirectTrait.class).getRedirectToNPC(); if (npc == null) return; } @@ -586,7 +586,7 @@ public class EventListen implements Listener { } ClickRedirectTrait crt = npc.getTraitNullable(ClickRedirectTrait.class); if (crt != null) { - npc = crt.getRedirectNPC(); + npc = crt.getRedirectToNPC(); } pf = npc.getTraitNullable(PlayerFilter.class); if (pf != null) { @@ -648,7 +648,7 @@ public class EventListen implements Listener { return; ClickRedirectTrait crt = npc.getTraitNullable(ClickRedirectTrait.class); - if (crt != null && (npc = crt.getRedirectNPC()) == null) + if (crt != null && (npc = crt.getRedirectToNPC()) == null) return; Player player = event.getPlayer(); diff --git a/main/src/main/java/net/citizensnpcs/commands/AdminCommands.java b/main/src/main/java/net/citizensnpcs/commands/AdminCommands.java index c34627587..fc18b4fd8 100644 --- a/main/src/main/java/net/citizensnpcs/commands/AdminCommands.java +++ b/main/src/main/java/net/citizensnpcs/commands/AdminCommands.java @@ -32,6 +32,7 @@ public class AdminCommands { Messaging.send(sender, " -- Author: fullwall"); Messaging.send(sender, " -- Website Support"); + } @Command( diff --git a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java index 142b1f876..462bc95c5 100644 --- a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java +++ b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java @@ -787,9 +787,9 @@ public class NPCCommands { Bukkit.getPluginManager().callEvent(event); if (event.isCancelled()) { event.getNPC().destroy(); - String reason = "Couldn't create NPC."; + String reason = "Couldn't create NPC"; if (!event.getCancelReason().isEmpty()) { - reason += " Reason: " + event.getCancelReason(); + reason += ": [[" + event.getCancelReason(); } throw new CommandException(reason); } @@ -2871,7 +2871,7 @@ public class NPCCommands { if (res != null && registry.isNPC(res.getHitEntity())) { NPC hit = registry.getNPC(res.getHitEntity()); if (hit.hasTrait(ClickRedirectTrait.class)) { - hit = hit.getTraitNullable(ClickRedirectTrait.class).getRedirectNPC(); + hit = hit.getTraitNullable(ClickRedirectTrait.class).getRedirectToNPC(); } callback.run(hit); return; @@ -2883,7 +2883,7 @@ public class NPCCommands { o2.getEntity().getLocation().distanceSquared(location))); for (NPC test : search) { if (test.hasTrait(ClickRedirectTrait.class)) { - test = test.getTraitNullable(ClickRedirectTrait.class).getRedirectNPC(); + test = test.getTraitNullable(ClickRedirectTrait.class).getRedirectToNPC(); } callback.run(test); break; diff --git a/main/src/main/java/net/citizensnpcs/npc/ai/AStarNavigationStrategy.java b/main/src/main/java/net/citizensnpcs/npc/ai/AStarNavigationStrategy.java index 59026df94..398d028a3 100644 --- a/main/src/main/java/net/citizensnpcs/npc/ai/AStarNavigationStrategy.java +++ b/main/src/main/java/net/citizensnpcs/npc/ai/AStarNavigationStrategy.java @@ -96,7 +96,7 @@ public class AStarNavigationStrategy extends AbstractPathStrategy { Location loc = npc.getEntity().getLocation(); Location dest = Util.getCenterLocation(vector.toLocation(loc.getWorld()).getBlock()); /* Proper door movement - gets stuck on corners at times - + Block block = loc.getWorld().getBlockAt(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ()); if (MinecraftBlockExaminer.isDoor(block.getType())) { Door door = (Door) block.getState().getData(); diff --git a/main/src/main/java/net/citizensnpcs/trait/ClickRedirectTrait.java b/main/src/main/java/net/citizensnpcs/trait/ClickRedirectTrait.java index 49fae855a..cd83295bb 100644 --- a/main/src/main/java/net/citizensnpcs/trait/ClickRedirectTrait.java +++ b/main/src/main/java/net/citizensnpcs/trait/ClickRedirectTrait.java @@ -17,32 +17,37 @@ import net.citizensnpcs.api.util.DataKey; */ @TraitName("clickredirecttrait") public class ClickRedirectTrait extends Trait { - private NPC redirectNPC; + private NPC redirectTo; public ClickRedirectTrait() { super("clickredirecttrait"); } - public ClickRedirectTrait(NPC npc) { + public ClickRedirectTrait(NPC redirectTo) { this(); - redirectNPC = npc; - if (redirectNPC != null && redirectNPC.hasTrait(PlayerFilter.class)) { - redirectNPC.getOrAddTrait(PlayerFilter.class).addChildNPC(npc); - } + this.redirectTo = redirectTo; } - public NPC getRedirectNPC() { - return redirectNPC; + public NPC getRedirectToNPC() { + return redirectTo; + } + + @Override + public void linkToNPC(NPC npc) { + super.linkToNPC(npc); + if (redirectTo != null && redirectTo.hasTrait(PlayerFilter.class)) { + redirectTo.getOrAddTrait(PlayerFilter.class).addChildNPC(npc); + } } @Override public void load(DataKey key) { - redirectNPC = CitizensAPI.getNPCRegistry().getByUniqueIdGlobal(UUID.fromString(key.getString("uuid"))); + redirectTo = CitizensAPI.getNPCRegistry().getByUniqueIdGlobal(UUID.fromString(key.getString("uuid"))); } @EventHandler public void onTraitAdd(NPCAddTraitEvent event) { - if (event.getNPC() == redirectNPC && event.getTrait() instanceof PlayerFilter) { + if (event.getNPC() == redirectTo && event.getTrait() instanceof PlayerFilter) { ((PlayerFilter) event.getTrait()).addChildNPC(npc); } } @@ -50,8 +55,8 @@ public class ClickRedirectTrait extends Trait { @Override public void save(DataKey key) { key.removeKey("uuid"); - if (redirectNPC == null) + if (redirectTo == null) return; - key.setString("uuid", redirectNPC.getUniqueId().toString()); + key.setString("uuid", redirectTo.getUniqueId().toString()); } } diff --git a/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java b/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java index 8d18cfdb9..dc7f1e5b2 100644 --- a/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java +++ b/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java @@ -454,7 +454,7 @@ public class HologramTrait extends Trait { private boolean rendered; @Override - protected NPC createNPC(Entity base, String name, Vector3d offset) { + protected NPC createNPC(NPC base, String name, Vector3d offset) { NPC npc = registry().createNPC(EntityType.AREA_EFFECT_CLOUD, name); rendered = false; return npc; @@ -476,9 +476,9 @@ public class HologramTrait extends Trait { public static class ArmorstandRenderer extends SingleEntityHologramRenderer { @Override - protected NPC createNPC(Entity base, String name, Vector3d offset) { + protected NPC createNPC(NPC base, String name, Vector3d offset) { NPC npc = registry().createNPC(EntityType.ARMOR_STAND, name); - npc.getOrAddTrait(ArmorStandTrait.class).setAsHelperEntityWithName(npc); + npc.getOrAddTrait(ArmorStandTrait.class).setAsHelperEntityWithName(base); return npc; } @@ -491,9 +491,9 @@ public class HologramTrait extends Trait { public static class ArmorstandVehicleRenderer extends SingleEntityHologramRenderer { @Override - protected NPC createNPC(Entity base, String name, Vector3d offset) { + protected NPC createNPC(NPC base, String name, Vector3d offset) { NPC npc = registry().createNPC(EntityType.ARMOR_STAND, name); - npc.getOrAddTrait(ArmorStandTrait.class).setAsHelperEntityWithName(npc); + npc.getOrAddTrait(ArmorStandTrait.class).setAsHelperEntityWithName(base); return npc; } @@ -692,7 +692,7 @@ public class HologramTrait extends Trait { private Vector3d lastOffset; @Override - protected NPC createNPC(Entity base, String name, Vector3d offset) { + protected NPC createNPC(NPC base, String name, Vector3d offset) { lastOffset = new Vector3d(offset); return registry().createNPC(EntityType.INTERACTION, name); } @@ -715,7 +715,7 @@ public class HologramTrait extends Trait { public static class ItemDisplayRenderer extends SingleEntityHologramRenderer { @Override - protected NPC createNPC(Entity base, String name, Vector3d offset) { + protected NPC createNPC(NPC base, String name, Vector3d offset) { Matcher itemMatcher = ITEM_MATCHER.matcher(name); itemMatcher.find(); Material material = SpigotUtil.isUsing1_13API() ? Material.matchMaterial(itemMatcher.group(1), false) @@ -758,7 +758,7 @@ public class HologramTrait extends Trait { private NPC itemNPC; @Override - protected NPC createNPC(Entity base, String name, Vector3d offset) { + protected NPC createNPC(NPC base, String name, Vector3d offset) { NPC mount = registry().createNPC(EntityType.ARMOR_STAND, ""); mount.getOrAddTrait(ArmorStandTrait.class).setAsPointEntity(); Matcher itemMatcher = ITEM_MATCHER.matcher(name); @@ -783,7 +783,7 @@ public class HologramTrait extends Trait { itemNPC.setItemProvider(() -> stack.clone()); } } - itemNPC.spawn(base.getLocation()); + itemNPC.spawn(base.getStoredLocation()); itemNPC.getOrAddTrait(MountTrait.class).setMountedOn(mount.getUniqueId()); return mount; } @@ -827,7 +827,7 @@ public class HologramTrait extends Trait { protected String text; private int viewRange = -1; - protected abstract NPC createNPC(Entity base, String text, Vector3d offset); + protected abstract NPC createNPC(NPC base, String text, Vector3d offset); @Override public void destroy() { @@ -878,7 +878,7 @@ public class HologramTrait extends Trait { } protected void spawnHologram(NPC npc, Vector3d offset) { - hologram = createNPC(npc.getEntity(), Placeholders.replace(text, null, npc), offset); + hologram = createNPC(npc, Placeholders.replace(text, null, npc), offset); if (!hologram.hasTrait(ClickRedirectTrait.class)) { hologram.addTrait(new ClickRedirectTrait(npc)); } @@ -933,7 +933,7 @@ public class HologramTrait extends Trait { } @Override - protected NPC createNPC(Entity base, String name, Vector3d offset) { + protected NPC createNPC(NPC base, String name, Vector3d offset) { NPC hologram = registry().createNPC(EntityType.TEXT_DISPLAY, ""); hologram.data().set(NPC.Metadata.NAMEPLATE_VISIBLE, false); hologram.data().set(NPC.Metadata.TEXT_DISPLAY_COMPONENT, Messaging.minecraftComponentFromRawMessage(name)); diff --git a/main/src/main/java/net/citizensnpcs/trait/ScoreboardTrait.java b/main/src/main/java/net/citizensnpcs/trait/ScoreboardTrait.java index 290b25a39..95d761c1d 100644 --- a/main/src/main/java/net/citizensnpcs/trait/ScoreboardTrait.java +++ b/main/src/main/java/net/citizensnpcs/trait/ScoreboardTrait.java @@ -124,7 +124,7 @@ public class ScoreboardTrait extends Trait { team.removeEntry(name); } }; - if (reason == DespawnReason.REMOVAL) { + if (reason == DespawnReason.REMOVAL || reason == DespawnReason.RELOAD) { cleanup.run(); } else { Bukkit.getScheduler().scheduleSyncDelayedTask(CitizensAPI.getPlugin(), cleanup,