Fix bug with ClickRedirectTrait and Holograms

This commit is contained in:
fullwall 2025-01-30 00:48:38 +08:00
parent 7553d36883
commit a7d9c06581
7 changed files with 39 additions and 33 deletions

View File

@ -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();

View File

@ -32,6 +32,7 @@ public class AdminCommands {
Messaging.send(sender, " <yellow>-- <green>Author: fullwall");
Messaging.send(sender, " <yellow>-- <green><click:open_url:" + plugin.getDescription().getWebsite()
+ "><hover:show_text:Citizens website including wiki><u>Website</hover></click> <click:open_url:https://discord.gg/Q6pZGSR><hover:show_text:Citizens Support Discord><u>Support</hover></click>");
}
@Command(

View File

@ -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;

View File

@ -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();

View File

@ -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());
}
}

View File

@ -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));

View File

@ -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,