From 0d02fc806bdb3e18c92b593d4e33b253978d9022 Mon Sep 17 00:00:00 2001 From: Pyrbu Date: Mon, 26 Jun 2023 22:00:23 +0200 Subject: [PATCH] add hologram refreshing --- .../java/lol/pyr/znpcsplus/ZNpcsPlus.java | 5 ++- .../hologram/HoloRefreshDelayCommand.java | 38 +++++++++++++++++++ .../pyr/znpcsplus/hologram/HologramImpl.java | 19 ++++++++++ .../pyr/znpcsplus/hologram/HologramLine.java | 4 ++ .../znpcsplus/storage/yaml/YamlStorage.java | 13 +++++-- .../znpcsplus/tasks/HologramRefreshTask.java | 22 +++++++++++ 6 files changed, 96 insertions(+), 5 deletions(-) create mode 100644 plugin/src/main/java/lol/pyr/znpcsplus/commands/hologram/HoloRefreshDelayCommand.java create mode 100644 plugin/src/main/java/lol/pyr/znpcsplus/tasks/HologramRefreshTask.java diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java index 176bd3d..868e5df 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java @@ -38,6 +38,7 @@ import lol.pyr.znpcsplus.scheduling.SpigotScheduler; import lol.pyr.znpcsplus.scheduling.TaskScheduler; import lol.pyr.znpcsplus.skin.cache.SkinCache; import lol.pyr.znpcsplus.skin.cache.SkinCacheCleanTask; +import lol.pyr.znpcsplus.tasks.HologramRefreshTask; import lol.pyr.znpcsplus.tasks.NpcProcessorTask; import lol.pyr.znpcsplus.updater.UpdateChecker; import lol.pyr.znpcsplus.updater.UpdateNotificationListener; @@ -162,6 +163,7 @@ public class ZNpcsPlus extends JavaPlugin { } scheduler.runDelayedTimerAsync(new NpcProcessorTask(npcRegistry, configManager, propertyRegistry), 60L, 3L); + scheduler.runDelayedTimerAsync(new HologramRefreshTask(npcRegistry), 60L, 20L); scheduler.runDelayedTimerAsync(new SkinCacheCleanTask(skinCache), 1200, 1200); log(ChatColor.WHITE + " * Loading data..."); @@ -294,7 +296,8 @@ public class ZNpcsPlus extends JavaPlugin { .addSubcommand("info", new HoloInfoCommand(npcRegistry)) .addSubcommand("insert", new HoloInsertCommand(npcRegistry, textSerializer)) .addSubcommand("set", new HoloSetCommand(npcRegistry, textSerializer)) - .addSubcommand("offset", new HoloOffsetCommand(npcRegistry))) + .addSubcommand("offset", new HoloOffsetCommand(npcRegistry)) + .addSubcommand("refreshdelay", new HoloRefreshDelayCommand(npcRegistry))) .addSubcommand("action", new MultiCommand(loadHelpMessage("action")) .addSubcommand("add", new ActionAddCommand(npcRegistry, actionRegistry)) .addSubcommand("delete", new ActionDeleteCommand(npcRegistry)) diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/commands/hologram/HoloRefreshDelayCommand.java b/plugin/src/main/java/lol/pyr/znpcsplus/commands/hologram/HoloRefreshDelayCommand.java new file mode 100644 index 0000000..bdf3120 --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/commands/hologram/HoloRefreshDelayCommand.java @@ -0,0 +1,38 @@ +package lol.pyr.znpcsplus.commands.hologram; + +import lol.pyr.director.adventure.command.CommandContext; +import lol.pyr.director.adventure.command.CommandHandler; +import lol.pyr.director.common.command.CommandExecutionException; +import lol.pyr.znpcsplus.hologram.HologramImpl; +import lol.pyr.znpcsplus.npc.NpcEntryImpl; +import lol.pyr.znpcsplus.npc.NpcRegistryImpl; + +import java.util.Collections; +import java.util.List; + +public class HoloRefreshDelayCommand implements CommandHandler { + private final NpcRegistryImpl npcRegistry; + + public HoloRefreshDelayCommand(NpcRegistryImpl npcRegistry) { + this.npcRegistry = npcRegistry; + } + + @Override + public void run(CommandContext context) throws CommandExecutionException { + context.setUsage(context.getLabel() + " holo refreshdelay "); + HologramImpl hologram = context.parse(NpcEntryImpl.class).getNpc().getHologram(); + double delay = context.parse(Double.class); + hologram.setRefreshDelay((long) (delay * 1000)); + context.send("NPC refresh delay set!"); + } + + @Override + public List suggest(CommandContext context) throws CommandExecutionException { + if (context.argSize() == 1) return context.suggestCollection(npcRegistry.getModifiableIds()); + if (context.argSize() == 2) { + HologramImpl hologram = context.suggestionParse(0, NpcEntryImpl.class).getNpc().getHologram(); + return context.suggestLiteral(String.valueOf(((double) hologram.getRefreshDelay()) / 1000)); + } + return Collections.emptyList(); + } +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramImpl.java b/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramImpl.java index 7efebc8..6a83251 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramImpl.java @@ -19,6 +19,8 @@ public class HologramImpl extends Viewable implements Hologram { private final LegacyComponentSerializer textSerializer; private double offset = 0.0; + private long refreshDelay = -1; + private long lastRefresh = System.currentTimeMillis(); private NpcLocation location; private final List lines = new ArrayList<>(); @@ -84,6 +86,23 @@ public class HologramImpl extends Viewable implements Hologram { for (HologramLine line : lines) line.hide(player); } + public long getRefreshDelay() { + return refreshDelay; + } + + public void setRefreshDelay(long refreshDelay) { + this.refreshDelay = refreshDelay; + } + + public boolean shouldRefresh() { + return refreshDelay != -1 && (System.currentTimeMillis() - lastRefresh) > refreshDelay; + } + + public void refresh() { + lastRefresh = System.currentTimeMillis(); + for (HologramLine line : lines) for (Player viewer : getViewers()) line.refreshMeta(viewer); + } + public void setLocation(NpcLocation location) { this.location = location; relocateLines(); diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramLine.java b/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramLine.java index 4140ae6..883bacb 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramLine.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/hologram/HologramLine.java @@ -28,6 +28,10 @@ public class HologramLine implements PropertyHolder { this.text = text; } + public void refreshMeta(Player player) { + armorStand.refreshMeta(player); + } + protected void show(Player player) { armorStand.spawn(player); } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/storage/yaml/YamlStorage.java b/plugin/src/main/java/lol/pyr/znpcsplus/storage/yaml/YamlStorage.java index dcbbcec..56621c1 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/storage/yaml/YamlStorage.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/storage/yaml/YamlStorage.java @@ -3,6 +3,7 @@ package lol.pyr.znpcsplus.storage.yaml; import lol.pyr.znpcsplus.config.ConfigManager; import lol.pyr.znpcsplus.entity.EntityPropertyImpl; import lol.pyr.znpcsplus.entity.EntityPropertyRegistryImpl; +import lol.pyr.znpcsplus.hologram.HologramImpl; import lol.pyr.znpcsplus.hologram.HologramLine; import lol.pyr.znpcsplus.interaction.ActionRegistry; import lol.pyr.znpcsplus.npc.NpcEntryImpl; @@ -61,8 +62,10 @@ public class YamlStorage implements NpcStorage { npc.UNSAFE_setProperty(property, property.deserialize(properties.getString(key))); } } - npc.getHologram().setOffset(config.getDouble("hologram.offset", 0.0)); - for (String line : config.getStringList("hologram.lines")) npc.getHologram().addLineComponent(MiniMessage.miniMessage().deserialize(line)); + HologramImpl hologram = npc.getHologram(); + hologram.setOffset(config.getDouble("hologram.offset", 0.0)); + hologram.setRefreshDelay(config.getLong("hologram.refresh-delay", -1)); + for (String line : config.getStringList("hologram.lines")) hologram.addLineComponent(MiniMessage.miniMessage().deserialize(line)); for (String s : config.getStringList("actions")) npc.addAction(actionRegistry.deserialize(s)); NpcEntryImpl entry = new NpcEntryImpl(config.getString("id"), npc); @@ -96,9 +99,11 @@ public class YamlStorage implements NpcStorage { config.set("properties." + property.getName(), property.serialize(npc)); } - if (npc.getHologram().getOffset() != 0.0) config.set("hologram.offset", npc.getHologram().getOffset()); + HologramImpl hologram = npc.getHologram(); + if (hologram.getOffset() != 0.0) config.set("hologram.offset", hologram.getOffset()); + if (hologram.getRefreshDelay() != -1) config.set("hologram.refresh-delay", hologram.getRefreshDelay()); List lines = new ArrayList<>(npc.getHologram().getLines().size()); - for (HologramLine line : npc.getHologram().getLines()) { + for (HologramLine line : hologram.getLines()) { lines.add(MiniMessage.miniMessage().serialize(line.getText())); } config.set("hologram.lines", lines); diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/tasks/HologramRefreshTask.java b/plugin/src/main/java/lol/pyr/znpcsplus/tasks/HologramRefreshTask.java new file mode 100644 index 0000000..9139f68 --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/tasks/HologramRefreshTask.java @@ -0,0 +1,22 @@ +package lol.pyr.znpcsplus.tasks; + +import lol.pyr.znpcsplus.hologram.HologramImpl; +import lol.pyr.znpcsplus.npc.NpcEntryImpl; +import lol.pyr.znpcsplus.npc.NpcRegistryImpl; +import org.bukkit.scheduler.BukkitRunnable; + +public class HologramRefreshTask extends BukkitRunnable { + private final NpcRegistryImpl npcRegistry; + + public HologramRefreshTask(NpcRegistryImpl npcRegistry) { + this.npcRegistry = npcRegistry; + } + + @Override + public void run() { + for (NpcEntryImpl entry : npcRegistry.getProcessable()) { + HologramImpl hologram = entry.getNpc().getHologram(); + if (hologram.shouldRefresh()) hologram.refresh(); + } + } +}