From 3685d339803494fa17b4844015bf85f117cb8b8e Mon Sep 17 00:00:00 2001 From: fullwall Date: Sat, 23 Apr 2022 13:42:48 +0800 Subject: [PATCH] Add /npc bossbar --track and fix equipment caching logic --- .../citizensnpcs/commands/NPCCommands.java | 15 +++++--- .../net/citizensnpcs/trait/HologramTrait.java | 10 +++++ .../trait/versioned/BossBarTrait.java | 38 +++++++++++++++++++ .../nms/v1_10_R1/entity/EntityHumanNPC.java | 9 +++-- .../nms/v1_10_R1/trait/Commands.java | 5 ++- .../nms/v1_11_R1/entity/EntityHumanNPC.java | 9 +++-- .../nms/v1_11_R1/trait/Commands.java | 5 ++- .../nms/v1_12_R1/entity/EntityHumanNPC.java | 9 +++-- .../nms/v1_12_R1/trait/Commands.java | 5 ++- .../nms/v1_13_R2/entity/EntityHumanNPC.java | 9 +++-- .../nms/v1_13_R2/trait/Commands.java | 5 ++- .../nms/v1_14_R1/entity/EntityHumanNPC.java | 9 +++-- .../nms/v1_14_R1/trait/Commands.java | 5 ++- .../nms/v1_15_R1/entity/EntityHumanNPC.java | 9 +++-- .../nms/v1_15_R1/trait/Commands.java | 5 ++- .../nms/v1_16_R3/entity/EntityHumanNPC.java | 9 +++-- .../nms/v1_16_R3/trait/Commands.java | 5 ++- .../nms/v1_17_R1/entity/EntityHumanNPC.java | 9 +++-- .../nms/v1_17_R1/trait/Commands.java | 5 ++- .../nms/v1_18_R2/entity/EntityHumanNPC.java | 11 +++--- .../nms/v1_18_R2/trait/Commands.java | 5 ++- .../nms/v1_8_R3/entity/EntityHumanNPC.java | 9 +++-- 22 files changed, 144 insertions(+), 56 deletions(-) diff --git a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java index f42688191..dccb41260 100644 --- a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java +++ b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java @@ -165,16 +165,17 @@ public class NPCCommands { Messaging.sendTr(sender, trait.toggle() ? Messages.AGE_LOCKED : Messages.AGE_UNLOCKED); } if (args.argsLength() <= 1) { - if (!toggleLock) + if (!toggleLock) { trait.describe(sender); + } return; } int age = 0; try { age = args.getInteger(1); - if (age > 0) { + if (age > 0) throw new CommandException(Messages.INVALID_AGE); - } + Messaging.sendTr(sender, Messages.AGE_SET_NORMAL, npc.getName(), age); } catch (NumberFormatException ex) { if (args.getString(1).equalsIgnoreCase("baby")) { @@ -535,12 +536,14 @@ public class NPCCommands { Messaging.sendErrorTr(sender, Messages.NPC_NAME_TOO_LONG, nameLength); name = name.substring(0, nameLength); } + if (name.length() == 0) throw new CommandException(); if (!sender.hasPermission("citizens.npc.create.*") && !sender.hasPermission("citizens.npc.createall") && !sender.hasPermission("citizens.npc.create." + type.name().toLowerCase().replace("_", ""))) throw new NoPermissionsException(); + NPCRegistry registry = CitizensAPI.getNPCRegistry(); if (args.hasValueFlag("registry")) { registry = CitizensAPI.getNamedNPCRegistry(args.getFlag("registry")); @@ -554,14 +557,14 @@ public class NPCCommands { } npc = registry.createNPC(type, name); - String msg = "You created [[" + npc.getName() + "]] (ID [[" + npc.getId() + "]])"; + String msg = "Created [[" + npc.getName() + "]] (ID [[" + npc.getId() + "]])"; int age = 0; if (args.hasFlag('b')) { - if (!Ageable.class.isAssignableFrom(type.getEntityClass())) + if (!Ageable.class.isAssignableFrom(type.getEntityClass())) { Messaging.sendErrorTr(sender, Messages.MOBTYPE_CANNOT_BE_AGED, type.name().toLowerCase().replace("_", "-")); - else { + } else { age = -24000; msg += " as a baby"; } diff --git a/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java b/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java index 5ecd3390f..e0206f27d 100644 --- a/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java +++ b/main/src/main/java/net/citizensnpcs/trait/HologramTrait.java @@ -197,9 +197,11 @@ public class HologramTrait extends Trait { onDespawn(); return; } + if (currentLoc == null) { currentLoc = npc.getStoredLocation(); } + boolean nameplateVisible = Boolean .parseBoolean(npc.data(). get(NPC.Metadata.NAMEPLATE_VISIBLE, true).toString()); if (npc.requiresNameHologram()) { @@ -210,6 +212,7 @@ public class HologramTrait extends Trait { nameNPC = createHologram(npc.getFullName(), 0); } } + boolean update = currentLoc.getWorld() != npc.getStoredLocation().getWorld() || currentLoc.distance(npc.getStoredLocation()) >= 0.001 || lastNameplateVisible != nameplateVisible || Math.abs(lastEntityHeight - getEntityHeight()) >= 0.05; @@ -219,28 +222,34 @@ public class HologramTrait extends Trait { currentLoc = npc.getStoredLocation(); lastEntityHeight = getEntityHeight(); } + if (nameNPC != null && nameNPC.isSpawned()) { if (update) { nameNPC.teleport(currentLoc.clone().add(0, getEntityHeight(), 0), TeleportCause.PLUGIN); } nameNPC.setName(npc.getFullName()); } + for (int i = 0; i < lineHolograms.size(); i++) { NPC hologramNPC = lineHolograms.get(i); if (!hologramNPC.isSpawned()) continue; + if (update) { hologramNPC.teleport(currentLoc.clone().add(0, getEntityHeight() + getHeight(i), 0), TeleportCause.PLUGIN); } + if (i >= lines.size()) { Messaging.severe("More hologram NPCs than lines for ID", npc.getId(), "lines", lines); break; } + String text = lines.get(i); if (ITEM_MATCHER.matcher(text).matches()) { text = null; } + if (text != null && !ChatColor.stripColor(Colorizer.parseColors(text)).isEmpty()) { hologramNPC.setName(Placeholders.replace(text, null, npc)); hologramNPC.data().set(NPC.Metadata.NAMEPLATE_VISIBLE, true); @@ -280,6 +289,7 @@ public class HologramTrait extends Trait { return; } } + onDespawn(); onSpawn(); } diff --git a/main/src/main/java/net/citizensnpcs/trait/versioned/BossBarTrait.java b/main/src/main/java/net/citizensnpcs/trait/versioned/BossBarTrait.java index f4399fd61..217940a05 100644 --- a/main/src/main/java/net/citizensnpcs/trait/versioned/BossBarTrait.java +++ b/main/src/main/java/net/citizensnpcs/trait/versioned/BossBarTrait.java @@ -4,12 +4,14 @@ import java.util.Collection; import java.util.List; import org.bukkit.Bukkit; +import org.bukkit.attribute.Attribute; import org.bukkit.boss.BarColor; import org.bukkit.boss.BarFlag; import org.bukkit.boss.BarStyle; import org.bukkit.boss.BossBar; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import com.google.common.collect.Lists; @@ -18,6 +20,7 @@ import net.citizensnpcs.Settings.Setting; import net.citizensnpcs.api.persistence.Persist; import net.citizensnpcs.api.trait.Trait; import net.citizensnpcs.api.trait.TraitName; +import net.citizensnpcs.api.util.Placeholders; import net.citizensnpcs.util.NMS; @TraitName("bossbar") @@ -31,6 +34,8 @@ public class BossBarTrait extends Trait { private BarStyle style = BarStyle.SOLID; @Persist("title") private String title = ""; + @Persist("track") + private String track; @Persist("visible") private boolean visible = true; @@ -64,6 +69,10 @@ public class BossBarTrait extends Trait { return title; } + public String getTrackingVariable() { + return track; + } + private boolean isBoss(Entity entity) { boolean isBoss = entity.getType() == EntityType.ENDER_DRAGON || entity.getType() == EntityType.WITHER || entity.getType() == EntityType.GUARDIAN; @@ -94,6 +103,29 @@ public class BossBarTrait extends Trait { if (bar == null) { return; } + if (track != null && !track.isEmpty() && npc.getEntity() instanceof LivingEntity) { + LivingEntity entity = (LivingEntity) npc.getEntity(); + if (track.equalsIgnoreCase("health")) { + double maxHealth = entity.getMaxHealth(); + if (SUPPORT_ATTRIBUTES) { + try { + maxHealth = entity.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue(); + } catch (Throwable t) { + SUPPORT_ATTRIBUTES = false; + } + } + bar.setProgress(entity.getHealth() / maxHealth); + } else { + String replaced = Placeholders.replace(track, + npc.getEntity() instanceof Player ? (Player) npc.getEntity() : null); + if (!track.equals(replaced)) { + try { + bar.setProgress(Double.parseDouble(replaced)); + } catch (NumberFormatException ex) { + } + } + } + } bar.setStyle(style); bar.setVisible(visible); if (color != null) { @@ -139,7 +171,13 @@ public class BossBarTrait extends Trait { this.title = title; } + public void setTrackVariable(String variable) { + this.track = variable; + } + public void setVisible(boolean visible) { this.visible = visible; } + + private static boolean SUPPORT_ATTRIBUTES = true; } diff --git a/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/entity/EntityHumanNPC.java b/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/entity/EntityHumanNPC.java index d3ff3c4fb..75300af78 100644 --- a/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/entity/EntityHumanNPC.java +++ b/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/entity/EntityHumanNPC.java @@ -410,7 +410,10 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable } private void updatePackets(boolean navigating) { - updateCounter++; + if (updateCounter++ <= npc.data(). get(NPC.Metadata.PACKET_UPDATE_DELAY, + Setting.PACKET_UPDATE_DELAY.asInt())) + return; + updateCounter = 0; boolean itemChanged = false; for (EnumItemSlot slot : EnumItemSlot.values()) { ItemStack equipment = getEquipment(slot); @@ -421,10 +424,8 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable } equipmentCache.put(slot, equipment); } - if (updateCounter++ <= npc.data(). get(NPC.Metadata.PACKET_UPDATE_DELAY, - Setting.PACKET_UPDATE_DELAY.asInt()) && !itemChanged) + if (!itemChanged) return; - updateCounter = 0; Location current = getBukkitEntity().getLocation(packetLocationCache); Packet[] packets = new Packet[EnumItemSlot.values().length]; int i = 0; diff --git a/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/trait/Commands.java b/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/trait/Commands.java index 1098108b9..bbeca50d2 100644 --- a/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/trait/Commands.java +++ b/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/trait/Commands.java @@ -30,7 +30,7 @@ import net.citizensnpcs.util.Util; public class Commands { @Command( aliases = { "npc" }, - usage = "bossbar --style [style] --color [color] --title [title] --visible [visible] --flags [flags]", + usage = "bossbar --style [style] --color [color] --title [title] --visible [visible] --flags [flags] --track [health | placeholder]", desc = "Edit bossbar properties", modifiers = { "bossbar" }, min = 1, @@ -50,6 +50,9 @@ public class Commands { trait.setColor(color); } } + if (args.hasValueFlag("track")) { + trait.setTrackVariable(args.getFlag("track")); + } if (args.hasValueFlag("title")) { trait.setTitle(Colorizer.parseColors(args.getFlag("title"))); } diff --git a/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/entity/EntityHumanNPC.java b/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/entity/EntityHumanNPC.java index 3c82fe93a..c2900e301 100644 --- a/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/entity/EntityHumanNPC.java +++ b/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/entity/EntityHumanNPC.java @@ -416,7 +416,10 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable } private void updatePackets(boolean navigating) { - updateCounter++; + if (updateCounter++ <= npc.data(). get(NPC.Metadata.PACKET_UPDATE_DELAY, + Setting.PACKET_UPDATE_DELAY.asInt())) + return; + updateCounter = 0; boolean itemChanged = false; for (EnumItemSlot slot : EnumItemSlot.values()) { ItemStack equipment = getEquipment(slot); @@ -427,11 +430,9 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable } equipmentCache.put(slot, equipment); } - if (updateCounter++ <= npc.data(). get(NPC.Metadata.PACKET_UPDATE_DELAY, - Setting.PACKET_UPDATE_DELAY.asInt()) && !itemChanged) + if (!itemChanged) return; - updateCounter = 0; Location current = getBukkitEntity().getLocation(packetLocationCache); Packet[] packets = new Packet[EnumItemSlot.values().length]; int i = 0; diff --git a/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/trait/Commands.java b/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/trait/Commands.java index d4f8399ac..752225c35 100644 --- a/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/trait/Commands.java +++ b/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/trait/Commands.java @@ -33,7 +33,7 @@ import net.citizensnpcs.util.Util; public class Commands { @Command( aliases = { "npc" }, - usage = "bossbar --style [style] --color [color] --title [title] --visible [visible] --flags [flags]", + usage = "bossbar --style [style] --color [color] --title [title] --visible [visible] --flags [flags] --track [health | placeholder]", desc = "Edit bossbar properties", modifiers = { "bossbar" }, min = 1, @@ -53,6 +53,9 @@ public class Commands { trait.setColor(color); } } + if (args.hasValueFlag("track")) { + trait.setTrackVariable(args.getFlag("track")); + } if (args.hasValueFlag("title")) { trait.setTitle(Colorizer.parseColors(args.getFlag("title"))); } diff --git a/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/entity/EntityHumanNPC.java b/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/entity/EntityHumanNPC.java index 8dc5228da..bee7f275b 100644 --- a/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/entity/EntityHumanNPC.java +++ b/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/entity/EntityHumanNPC.java @@ -442,7 +442,10 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable } private void updatePackets(boolean navigating) { - updateCounter++; + if (updateCounter++ <= npc.data(). get(NPC.Metadata.PACKET_UPDATE_DELAY, + Setting.PACKET_UPDATE_DELAY.asInt())) + return; + updateCounter = 0; boolean itemChanged = false; for (EnumItemSlot slot : EnumItemSlot.values()) { ItemStack equipment = getEquipment(slot); @@ -453,11 +456,9 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable } equipmentCache.put(slot, equipment); } - if (updateCounter++ <= npc.data(). get(NPC.Metadata.PACKET_UPDATE_DELAY, - Setting.PACKET_UPDATE_DELAY.asInt()) && !itemChanged) + if (!itemChanged) return; - updateCounter = 0; Location current = getBukkitEntity().getLocation(packetLocationCache); Packet[] packets = new Packet[EnumItemSlot.values().length]; int i = 0; diff --git a/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/trait/Commands.java b/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/trait/Commands.java index 887f47971..12df06916 100644 --- a/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/trait/Commands.java +++ b/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/trait/Commands.java @@ -35,7 +35,7 @@ import net.citizensnpcs.util.Util; public class Commands { @Command( aliases = { "npc" }, - usage = "bossbar --style [style] --color [color] --title [title] --visible [visible] --flags [flags]", + usage = "bossbar --style [style] --color [color] --title [title] --visible [visible] --flags [flags] --track [health | placeholder]", desc = "Edit bossbar properties", modifiers = { "bossbar" }, min = 1, @@ -55,6 +55,9 @@ public class Commands { trait.setColor(color); } } + if (args.hasValueFlag("track")) { + trait.setTrackVariable(args.getFlag("track")); + } if (args.hasValueFlag("title")) { trait.setTitle(Colorizer.parseColors(args.getFlag("title"))); } diff --git a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/entity/EntityHumanNPC.java b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/entity/EntityHumanNPC.java index 926a2b4f6..456c1a93d 100644 --- a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/entity/EntityHumanNPC.java +++ b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/entity/EntityHumanNPC.java @@ -434,7 +434,10 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable } private void updatePackets(boolean navigating) { - updateCounter++; + if (updateCounter++ <= npc.data(). get(NPC.Metadata.PACKET_UPDATE_DELAY, + Setting.PACKET_UPDATE_DELAY.asInt())) + return; + updateCounter = 0; boolean itemChanged = false; for (EnumItemSlot slot : EnumItemSlot.values()) { ItemStack equipment = getEquipment(slot); @@ -445,11 +448,9 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable } equipmentCache.put(slot, equipment); } - if (updateCounter++ <= npc.data(). get(NPC.Metadata.PACKET_UPDATE_DELAY, - Setting.PACKET_UPDATE_DELAY.asInt()) && !itemChanged) + if (!itemChanged) return; - updateCounter = 0; Location current = getBukkitEntity().getLocation(packetLocationCache); Packet[] packets = new Packet[EnumItemSlot.values().length]; int i = 0; diff --git a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/trait/Commands.java b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/trait/Commands.java index fccf15fe0..bb9141b38 100644 --- a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/trait/Commands.java +++ b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/trait/Commands.java @@ -39,7 +39,7 @@ import net.citizensnpcs.util.Util; public class Commands { @Command( aliases = { "npc" }, - usage = "bossbar --style [style] --color [color] --title [title] --visible [visible] --flags [flags]", + usage = "bossbar --style [style] --color [color] --title [title] --visible [visible] --flags [flags] --track [health | placeholder]", desc = "Edit bossbar properties", modifiers = { "bossbar" }, min = 1, @@ -59,6 +59,9 @@ public class Commands { trait.setColor(color); } } + if (args.hasValueFlag("track")) { + trait.setTrackVariable(args.getFlag("track")); + } if (args.hasValueFlag("title")) { trait.setTitle(Colorizer.parseColors(args.getFlag("title"))); } diff --git a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/entity/EntityHumanNPC.java b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/entity/EntityHumanNPC.java index a700ad426..2e7a8f345 100644 --- a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/entity/EntityHumanNPC.java +++ b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/entity/EntityHumanNPC.java @@ -438,7 +438,10 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable } private void updatePackets(boolean navigating) { - updateCounter++; + if (updateCounter++ <= npc.data(). get(NPC.Metadata.PACKET_UPDATE_DELAY, + Setting.PACKET_UPDATE_DELAY.asInt())) + return; + updateCounter = 0; boolean itemChanged = false; for (EnumItemSlot slot : EnumItemSlot.values()) { ItemStack equipment = getEquipment(slot); @@ -449,11 +452,9 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable } equipmentCache.put(slot, equipment); } - if (updateCounter++ <= npc.data(). get(NPC.Metadata.PACKET_UPDATE_DELAY, - Setting.PACKET_UPDATE_DELAY.asInt()) && !itemChanged) + if (!itemChanged) return; - updateCounter = 0; Location current = getBukkitEntity().getLocation(packetLocationCache); Packet[] packets = new Packet[EnumItemSlot.values().length]; int i = 0; diff --git a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/trait/Commands.java b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/trait/Commands.java index 80b4fbb15..cc835edea 100644 --- a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/trait/Commands.java +++ b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/trait/Commands.java @@ -52,7 +52,7 @@ import net.citizensnpcs.util.Util; public class Commands { @Command( aliases = { "npc" }, - usage = "bossbar --style [style] --color [color] --title [title] --visible [visible] --flags [flags]", + usage = "bossbar --style [style] --color [color] --title [title] --visible [visible] --flags [flags] --track [health | placeholder]", desc = "Edit bossbar properties", modifiers = { "bossbar" }, min = 1, @@ -72,6 +72,9 @@ public class Commands { trait.setColor(color); } } + if (args.hasValueFlag("track")) { + trait.setTrackVariable(args.getFlag("track")); + } if (args.hasValueFlag("title")) { trait.setTitle(Colorizer.parseColors(args.getFlag("title"))); } diff --git a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/EntityHumanNPC.java b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/EntityHumanNPC.java index 59bc96ae0..4594fbcfa 100644 --- a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/EntityHumanNPC.java +++ b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/EntityHumanNPC.java @@ -449,7 +449,10 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable } private void updatePackets(boolean navigating) { - updateCounter++; + if (updateCounter++ <= npc.data(). get(NPC.Metadata.PACKET_UPDATE_DELAY, + Setting.PACKET_UPDATE_DELAY.asInt())) + return; + updateCounter = 0; boolean itemChanged = false; for (EnumItemSlot slot : EnumItemSlot.values()) { ItemStack equipment = getEquipment(slot); @@ -460,10 +463,8 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable } equipmentCache.put(slot, equipment); } - if (updateCounter++ <= npc.data(). get(NPC.Metadata.PACKET_UPDATE_DELAY, - Setting.PACKET_UPDATE_DELAY.asInt()) && !itemChanged) + if (!itemChanged) return; - updateCounter = 0; Location current = getBukkitEntity().getLocation(packetLocationCache); Packet[] packets = new Packet[EnumItemSlot.values().length]; int i = 0; diff --git a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/trait/Commands.java b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/trait/Commands.java index 25e812f73..7ffa6ed16 100644 --- a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/trait/Commands.java +++ b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/trait/Commands.java @@ -91,7 +91,7 @@ public class Commands { @Command( aliases = { "npc" }, - usage = "bossbar --style [style] --color [color] --title [title] --visible [visible] --flags [flags]", + usage = "bossbar --style [style] --color [color] --title [title] --visible [visible] --flags [flags] --track [health | placeholder]", desc = "Edit bossbar properties", modifiers = { "bossbar" }, min = 1, @@ -111,6 +111,9 @@ public class Commands { trait.setColor(color); } } + if (args.hasValueFlag("track")) { + trait.setTrackVariable(args.getFlag("track")); + } if (args.hasValueFlag("title")) { trait.setTitle(Colorizer.parseColors(args.getFlag("title"))); } diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/EntityHumanNPC.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/EntityHumanNPC.java index 52d2617a5..303cfe327 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/EntityHumanNPC.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/EntityHumanNPC.java @@ -479,7 +479,10 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable } private void updatePackets(boolean navigating) { - updateCounter++; + if (updateCounter++ <= npc.data(). get(NPC.Metadata.PACKET_UPDATE_DELAY, + Setting.PACKET_UPDATE_DELAY.asInt())) + return; + updateCounter = 0; boolean itemChanged = false; for (EnumItemSlot slot : EnumItemSlot.values()) { ItemStack equipment = getEquipment(slot); @@ -490,11 +493,9 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable } equipmentCache.put(slot, equipment); } - if (updateCounter++ <= npc.data(). get(NPC.Metadata.PACKET_UPDATE_DELAY, - Setting.PACKET_UPDATE_DELAY.asInt()) && !itemChanged) + if (!itemChanged) return; - updateCounter = 0; Location current = getBukkitEntity().getLocation(packetLocationCache); Packet[] packets = new Packet[1]; List> vals = Lists.newArrayList(); diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/trait/Commands.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/trait/Commands.java index bfb0894c9..04ab60c55 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/trait/Commands.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/trait/Commands.java @@ -91,7 +91,7 @@ public class Commands { @Command( aliases = { "npc" }, - usage = "bossbar --style [style] --color [color] --title [title] --visible [visible] --flags [flags]", + usage = "bossbar --style [style] --color [color] --title [title] --visible [visible] --flags [flags] --track [health | placeholder]", desc = "Edit bossbar properties", modifiers = { "bossbar" }, min = 1, @@ -111,6 +111,9 @@ public class Commands { trait.setColor(color); } } + if (args.hasValueFlag("track")) { + trait.setTrackVariable(args.getFlag("track")); + } if (args.hasValueFlag("title")) { trait.setTitle(Colorizer.parseColors(args.getFlag("title"))); } diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/EntityHumanNPC.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/EntityHumanNPC.java index cd1f88eaf..0d7d10234 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/EntityHumanNPC.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/EntityHumanNPC.java @@ -489,7 +489,10 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable } private void updatePackets(boolean navigating) { - updateCounter++; + if (updateCounter++ <= npc.data(). get(NPC.Metadata.PACKET_UPDATE_DELAY, + Setting.PACKET_UPDATE_DELAY.asInt())) + return; + updateCounter = 0; boolean itemChanged = false; for (EquipmentSlot slot : EquipmentSlot.values()) { ItemStack equipment = getItemBySlot(slot); @@ -500,11 +503,9 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable } equipmentCache.put(slot, equipment); } - if (updateCounter++ <= npc.data(). get(NPC.Metadata.PACKET_UPDATE_DELAY, - Setting.PACKET_UPDATE_DELAY.asInt()) && !itemChanged) + if (!itemChanged) return; - updateCounter = 0; Location current = getBukkitEntity().getLocation(packetLocationCache); List> vals = Lists.newArrayList(); for (EquipmentSlot slot : EquipmentSlot.values()) { diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/trait/Commands.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/trait/Commands.java index 656504808..4e19d2f8b 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/trait/Commands.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/trait/Commands.java @@ -127,7 +127,7 @@ public class Commands { @Command( aliases = { "npc" }, - usage = "bossbar --style [style] --color [color] --title [title] --visible [visible] --flags [flags]", + usage = "bossbar --style [style] --color [color] --title [title] --visible [visible] --flags [flags] --track [health | placeholder]", desc = "Edit bossbar properties", modifiers = { "bossbar" }, min = 1, @@ -147,6 +147,9 @@ public class Commands { trait.setColor(color); } } + if (args.hasValueFlag("track")) { + trait.setTrackVariable(args.getFlag("track")); + } if (args.hasValueFlag("title")) { trait.setTitle(Colorizer.parseColors(args.getFlag("title"))); } diff --git a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/entity/EntityHumanNPC.java b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/entity/EntityHumanNPC.java index 9a618cb82..38d084762 100644 --- a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/entity/EntityHumanNPC.java +++ b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/entity/EntityHumanNPC.java @@ -488,22 +488,23 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable } private void updatePackets(boolean navigating) { - updateCounter++; + if (updateCounter++ <= npc.data(). get(NPC.Metadata.PACKET_UPDATE_DELAY, + Setting.PACKET_UPDATE_DELAY.asInt())) + return; + updateCounter = 0; boolean itemChanged = false; for (EquipmentSlot slot : EquipmentSlot.values()) { ItemStack equipment = getItemBySlot(slot); ItemStack cache = equipmentCache.get(slot); if (!(cache == null && equipment == null) && (cache == null ^ equipment == null || !ItemStack.isSame(cache, equipment))) { + System.out.println("item changed " + cache + " " + equipment); itemChanged = true; } equipmentCache.put(slot, equipment); } - if (updateCounter++ <= npc.data(). get(NPC.Metadata.PACKET_UPDATE_DELAY, - Setting.PACKET_UPDATE_DELAY.asInt()) && !itemChanged) + if (!itemChanged) return; - - updateCounter = 0; Location current = getBukkitEntity().getLocation(packetLocationCache); List> vals = Lists.newArrayList(); for (EquipmentSlot slot : EquipmentSlot.values()) { diff --git a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/trait/Commands.java b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/trait/Commands.java index f8b47856a..ab90e79da 100644 --- a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/trait/Commands.java +++ b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/trait/Commands.java @@ -127,7 +127,7 @@ public class Commands { @Command( aliases = { "npc" }, - usage = "bossbar --style [style] --color [color] --title [title] --visible [visible] --flags [flags]", + usage = "bossbar --style [style] --color [color] --title [title] --visible [visible] --flags [flags] --track [health | placeholder]", desc = "Edit bossbar properties", modifiers = { "bossbar" }, min = 1, @@ -147,6 +147,9 @@ public class Commands { trait.setColor(color); } } + if (args.hasValueFlag("track")) { + trait.setTrackVariable(args.getFlag("track")); + } if (args.hasValueFlag("title")) { trait.setTitle(Colorizer.parseColors(args.getFlag("title"))); } diff --git a/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/entity/EntityHumanNPC.java b/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/entity/EntityHumanNPC.java index b4dacde2a..8524a79a7 100644 --- a/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/entity/EntityHumanNPC.java +++ b/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/entity/EntityHumanNPC.java @@ -399,7 +399,10 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable } private void updatePackets(boolean navigating) { - updateCounter++; + if (updateCounter++ <= npc.data(). get(NPC.Metadata.PACKET_UPDATE_DELAY, + Setting.PACKET_UPDATE_DELAY.asInt())) + return; + updateCounter = 0; boolean itemChanged = false; for (int slot = 0; slot < this.inventory.armor.length; slot++) { ItemStack equipment = getEquipment(slot); @@ -410,10 +413,8 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable } equipmentCache.put(slot, equipment); } - if (updateCounter++ <= npc.data(). get(NPC.Metadata.PACKET_UPDATE_DELAY, - Setting.PACKET_UPDATE_DELAY.asInt()) && !itemChanged) + if (!itemChanged) return; - updateCounter = 0; Location current = getBukkitEntity().getLocation(packetLocationCache); Packet[] packets = new Packet[this.inventory.armor.length]; for (int i = 0; i < this.inventory.armor.length; i++) {