i accidentally [doxxed myself](https://github.com/JannisX11/blockbench/issues/1322), thanks blockbench!
98 lines
2.8 KiB
Lua
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)
|