local g = require("scripts.libs.gradient") ---@class ColoredText ---@field text string ---@field color string ---@param name string ---@param gradient Gradient ---@param count number number of gradients to be present in the span ---@param phase_shift number shift of the gradient ---@returns string local function render_gradient_name(name, gradient, count, phase_shift) local string_width = client.getTextWidth(name) / count; local string_width_chars = {}; for i = 1, #name do string_width_chars[i] = client.getTextWidth(name:sub(i, i)) end ---@type ColoredText[] local result = {} local acc = 0; for i = 1, #name do local offset = acc + string_width_chars[i]; local color = gradient:at((offset / string_width) + phase_shift); acc = offset result[i] = { text = name:sub(i, i), color = color:toHex(true, false) } end return toJson(result) end ---@param name string ---@param gradient Gradient ---@param nameplates Nameplate | Nameplate[] where to use the animated name ---@param count number number of gradients to be present in the span ---@param phase_shift_rate number how fast to shift the gradient ---@returns fun():void # function to unregister local function animate_gradient_name(name, gradient, nameplates, count, phase_shift_rate) if type(nameplates) ~= "table" then nameplates = {nameplates} end local phase_shift = 0; local function render() if client.isPaused() then return end phase_shift = phase_shift + phase_shift_rate local result = render_gradient_name(name, gradient, count, phase_shift) for _, nameplate in pairs(nameplates) do nameplate:setText(result) end end events.render:register(render) return function () events.render:remove(render) end end ---@param name string ---@param gradient Gradient ---@param nameplates Nameplate | Nameplate[] where to use the static name ---@param count number number of gradients to be present in the span ---@param phase_shift number shift of the gradient local function static_gradient_name(name, gradient, nameplates, count, phase_shift) if type(nameplates) ~= "table" then nameplates = {nameplates} end local result = render_gradient_name(name, gradient, count, phase_shift); for _, nameplate in pairs(nameplates) do nameplate:setText(result) end end local name = "reidlab!" local gradient_count = 1 local gradient = g.SimpleGradientBuilder.new() :add({ "#d87b5a", "#e0ab91" }) :reflect(false) :build() animate_gradient_name(name, gradient, { nameplate.ENTITY, nameplate.LIST }, gradient_count, 0.005) static_gradient_name(name, gradient, { nameplate.CHAT }, gradient_count, 0)