From 5003f0c36769c863b1c3562afa517ede5cb9e83e Mon Sep 17 00:00:00 2001 From: fullwall Date: Wed, 19 Jul 2023 23:53:43 +0800 Subject: [PATCH] Fix hologram, cancel EntityTameEvent for protected NPCs --- .../main/java/net/citizensnpcs/Citizens.java | 2 +- .../main/java/net/citizensnpcs/EventListen.java | 9 +++++++++ .../net/citizensnpcs/commands/NPCCommands.java | 4 ++-- .../net/citizensnpcs/trait/CommandTrait.java | 16 ++++++++-------- .../net/citizensnpcs/trait/HologramTrait.java | 17 +++++++++++++---- .../java/net/citizensnpcs/trait/MountTrait.java | 2 +- .../trait/versioned/SpellcasterTrait.java | 4 ++++ .../trait/waypoint/GuidedWaypointProvider.java | 2 +- 8 files changed, 39 insertions(+), 17 deletions(-) diff --git a/main/src/main/java/net/citizensnpcs/Citizens.java b/main/src/main/java/net/citizensnpcs/Citizens.java index 96c270ff1..821d221b3 100644 --- a/main/src/main/java/net/citizensnpcs/Citizens.java +++ b/main/src/main/java/net/citizensnpcs/Citizens.java @@ -301,7 +301,7 @@ public class Citizens extends JavaPlugin implements CitizensPlugin { lib.addMavenCentral(); lib.setLogLevel(LogLevel.WARN); // Unfortunately, transitive dependency management is not supported in this library. - lib.loadLibrary(Library.builder().groupId("ch{}ethz{}globis{}phtree").artifactId("phtree").version("2.5.0") + lib.loadLibrary(Library.builder().groupId("ch{}ethz{}globis{}phtree").artifactId("phtree").version("2.6.2") .relocate("ch{}ethz{}globis{}phtree", "clib{}phtree").build()); lib.loadLibrary(Library.builder().groupId("net{}sf{}trove4j").artifactId("trove4j").version("3.0.3") .relocate("gnu{}trove", "clib{}trove").build()); diff --git a/main/src/main/java/net/citizensnpcs/EventListen.java b/main/src/main/java/net/citizensnpcs/EventListen.java index 677206719..8885ada41 100644 --- a/main/src/main/java/net/citizensnpcs/EventListen.java +++ b/main/src/main/java/net/citizensnpcs/EventListen.java @@ -32,6 +32,7 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntityPortalEvent; +import org.bukkit.event.entity.EntityTameEvent; import org.bukkit.event.entity.EntityTargetEvent; import org.bukkit.event.entity.EntityTransformEvent; import org.bukkit.event.entity.ItemDespawnEvent; @@ -361,6 +362,14 @@ public class EventListen implements Listener { } } + @EventHandler(ignoreCancelled = true) + public void onEntityTame(EntityTameEvent event) { + NPC npc = CitizensAPI.getNPCRegistry().getNPC(event.getEntity()); + if (npc == null || !npc.isProtected()) + return; + event.setCancelled(true); + } + @EventHandler public void onEntityTarget(EntityTargetEvent event) { NPC npc = CitizensAPI.getNPCRegistry().getNPC(event.getTarget()); diff --git a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java index c93539a31..cad6c0eb3 100644 --- a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java +++ b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java @@ -1477,8 +1477,8 @@ public class NPCCommands { .enablePageSwitcher('/' + args.getRawCommand() + " --page $page"); for (int i = 0; i < npcs.size(); i++) { String id = npcs.get(i).getUniqueId().toString(); - String line = StringHelper.wrap(id) + " " + npcs.get(i).getName() + " ([[tp]]) ([[summon]]) ( 0) { - for (String permission : temporaryPermissions) { - attachment.setPermission(permission, true); + PermissionAttachment attachment = player.addAttachment(CitizensAPI.getPlugin()); + if (attachment != null) { + for (String permission : temporaryPermissions) { + attachment.setPermission(permission, true); + } + command.run(npc, player); + attachment.remove(); + return; } } command.run(npc, player); - attachment.remove(); }; if (command.delay <= 0) { runnable.run(); @@ -582,7 +585,6 @@ public class CommandTrait extends Trait { } private static class NPCCommand { - String bungeeServer; String command; int cooldown; double cost; @@ -611,8 +613,6 @@ public class CommandTrait extends Trait { this.n = n; this.delay = delay; this.globalCooldown = globalCooldown; - List split = Splitter.on(' ').omitEmptyStrings().trimResults().limit(2).splitToList(command); - this.bungeeServer = split.size() == 2 && split.get(0).equalsIgnoreCase("server") ? split.get(1) : null; this.cost = cost; this.experienceCost = experienceCost; this.itemCost = itemCost; diff --git a/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java b/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java index 9c787e4d3..bb4276978 100644 --- a/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java +++ b/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java @@ -8,6 +8,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; @@ -95,6 +96,7 @@ public class HologramTrait extends Trait { lines.clear(); } + @SuppressWarnings("deprecation") private NPC createHologram(String line, double heightOffset) { NPC hologramNPC = null; if (useTextDisplay) { @@ -123,16 +125,23 @@ public class HologramTrait extends Trait { if (itemMatcher.matches()) { Material item = SpigotUtil.isUsing1_13API() ? Material.matchMaterial(itemMatcher.group(1), false) : Material.matchMaterial(itemMatcher.group(1)); - final NPC itemNPC = registry.createNPCUsingItem(EntityType.DROPPED_ITEM, "", new ItemStack(item, 1)); + ItemStack itemStack = new ItemStack(item, 1); + final NPC itemNPC = registry.createNPCUsingItem(EntityType.DROPPED_ITEM, "", itemStack); itemNPC.data().setPersistent(NPC.Metadata.NAMEPLATE_VISIBLE, false); if (itemMatcher.group(2) != null) { - itemNPC.getOrAddTrait(ScoreboardTrait.class) - .setColor(Util.matchEnum(ChatColor.values(), itemMatcher.group(2).substring(1))); + if (itemMatcher.group(2).charAt(1) == '{') { + Bukkit.getUnsafe().modifyItemStack(itemStack, itemMatcher.group(2).substring(1)); + itemNPC.setItemProvider(() -> itemStack); + } else { + itemNPC.getOrAddTrait(ScoreboardTrait.class) + .setColor(Util.matchEnum(ChatColor.values(), itemMatcher.group(2).substring(1))); + } } itemNPC.getOrAddTrait(MountTrait.class).setMountedOn(hologramNPC.getUniqueId()); itemNPC.spawn(currentLoc); + final NPC hn = hologramNPC; itemNPC.addRunnable(() -> { - if (!itemNPC.isSpawned() || !itemNPC.getEntity().isInsideVehicle()) { + if (!itemNPC.isSpawned() || !hn.isSpawned()) { itemNPC.destroy(); } }); diff --git a/main/src/main/java/net/citizensnpcs/trait/MountTrait.java b/main/src/main/java/net/citizensnpcs/trait/MountTrait.java index 78f2bb029..e58613193 100644 --- a/main/src/main/java/net/citizensnpcs/trait/MountTrait.java +++ b/main/src/main/java/net/citizensnpcs/trait/MountTrait.java @@ -28,7 +28,7 @@ public class MountTrait extends Trait { public void checkMounted() { if (uuid == null || uuid.equals(currentMount)) return; - NPC other = CitizensAPI.getNPCRegistry().getByUniqueId(uuid); + NPC other = CitizensAPI.getNPCRegistry().getByUniqueIdGlobal(uuid); if (other != null && other.isSpawned()) { NMS.mount(other.getEntity(), npc.getEntity()); currentMount = uuid; diff --git a/main/src/main/java/net/citizensnpcs/trait/versioned/SpellcasterTrait.java b/main/src/main/java/net/citizensnpcs/trait/versioned/SpellcasterTrait.java index 1a33d6960..b9548ec04 100644 --- a/main/src/main/java/net/citizensnpcs/trait/versioned/SpellcasterTrait.java +++ b/main/src/main/java/net/citizensnpcs/trait/versioned/SpellcasterTrait.java @@ -27,6 +27,10 @@ public class SpellcasterTrait extends Trait { super("spellcastertrait"); } + public Spell getSpell() { + return spell; + } + @Override public void run() { if (!npc.isSpawned() || !(npc.getEntity() instanceof Spellcaster)) diff --git a/main/src/main/java/net/citizensnpcs/trait/waypoint/GuidedWaypointProvider.java b/main/src/main/java/net/citizensnpcs/trait/waypoint/GuidedWaypointProvider.java index 672fba8ae..3818522b6 100644 --- a/main/src/main/java/net/citizensnpcs/trait/waypoint/GuidedWaypointProvider.java +++ b/main/src/main/java/net/citizensnpcs/trait/waypoint/GuidedWaypointProvider.java @@ -387,7 +387,7 @@ public class GuidedWaypointProvider implements EnumerableWaypointProvider { @Override public Plan buildPlan() { - return new GuidedPlan(this. getParents()); + return new GuidedPlan(this. orderedPath()); } public double distance(Waypoint dest) {