package net.knarcraft.placeholdersigns.runnable; import me.clip.placeholderapi.PlaceholderAPI; import net.knarcraft.knarlib.property.ColorConversion; import net.knarcraft.knarlib.util.ColorHelper; import net.knarcraft.placeholdersigns.PlaceholderSigns; import net.knarcraft.placeholdersigns.container.PlaceholderSign; import net.knarcraft.placeholdersigns.container.QueuedPlaceholderSign; import net.knarcraft.placeholdersigns.handler.PlaceholderSignHandler; import net.knarcraft.placeholdersigns.handler.PlaceholderSignUpdateQueueHandler; import org.bukkit.Location; import org.bukkit.block.Sign; import org.bukkit.block.sign.Side; import org.bukkit.block.sign.SignSide; import org.jetbrains.annotations.NotNull; import java.util.Map; /** * A runnable that updates signs */ public class SignUpdate implements Runnable { private final @NotNull PlaceholderSignHandler signHandler; /** * Instantiates a new sign update runnable * * @param signHandler
The sign handler to get signs from
*/ public SignUpdate(@NotNull PlaceholderSignHandler signHandler) { this.signHandler = signHandler; } @Override public void run() { PlaceholderSigns instance = PlaceholderSigns.getInstance(); PlaceholderSignUpdateQueueHandler queueHandler = instance.getUpdateQueueHandler(); long startTime = System.nanoTime(); long currentTime = System.currentTimeMillis(); while (queueHandler.peekQueue() != null && System.nanoTime() - startTime < 25000000) { PlaceholderSign placeholderSign = instance.getUpdateQueueHandler().pollQueue(); if (placeholderSign == null) { break; } updatePlaceholderSign(placeholderSign, currentTime); } } /** * Updates the contents of a single placeholder sign * * @param placeholderSignThe placeholder sign to update
* @param currentTimeThe current time, used for re-queuing the sign
*/ private void updatePlaceholderSign(@NotNull PlaceholderSign placeholderSign, long currentTime) { PlaceholderSigns instance = PlaceholderSigns.getInstance(); // Ignore signs away from players Location location = placeholderSign.getLocation(); // If no longer a sign, remove if (!(location.getBlock().getState() instanceof Sign sign)) { this.signHandler.unregisterSign(placeholderSign); this.signHandler.save(); return; } // Update placeholders SignSide front = sign.getSide(Side.FRONT); SignSide back = sign.getSide(Side.BACK); MapThe sign's current lines
* @param placeholdersThe sign's original placeholder lines
* @param signSideThe side of the sign to update placeholders for
* @returnTrue if text has been changed, and the sign needs to be updated
*/ private boolean updatePlaceholders(@NotNull String[] lines, @NotNull Map