figura-skin/scripts/nameplate.lua
reidlab d1809b35ee
init (again)
i accidentally [doxxed myself](https://github.com/JannisX11/blockbench/issues/1322), thanks blockbench!
2025-03-15 15:35:15 -07:00

98 lines
2.8 KiB
Lua

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)