55 lines
1.5 KiB
Lua
55 lines
1.5 KiB
Lua
local lines = {}
|
|
local dead_lines = {}
|
|
local nextid = 0
|
|
local timeout = 7
|
|
local fadeout = 1
|
|
local initialized = false
|
|
local max_lines = 15
|
|
local animation_fps = 30
|
|
|
|
local function update_line(line, uptime)
|
|
local diff = uptime - line[2]
|
|
if diff > timeout then
|
|
document[line[1]]:destruct()
|
|
table.insert(dead_lines, table.index(lines, line))
|
|
elseif diff > timeout-fadeout then
|
|
local opacity = (timeout - diff) / fadeout
|
|
document[line[1]].color = {0, 0, 0, opacity * 80}
|
|
document[line[1].."L"].color = {255, 255, 255, opacity * 255}
|
|
end
|
|
end
|
|
|
|
events.on("core:chat", function(message)
|
|
while #lines >= max_lines do
|
|
document[lines[1][1]]:destruct()
|
|
table.remove(lines, 1)
|
|
end
|
|
local current_time = time.uptime()
|
|
local id = 'l'..tostring(nextid)
|
|
document.root:add(gui.template("chat_line", {id=id}))
|
|
document.root:reposition()
|
|
document[id.."L"].text = message
|
|
nextid = nextid + 1
|
|
table.insert(lines, {id, current_time})
|
|
end)
|
|
|
|
function on_open()
|
|
if not initialized then
|
|
initialized = true
|
|
|
|
document.root:setInterval(1/animation_fps * 1000, function ()
|
|
local uptime = time.uptime()
|
|
for _, line in ipairs(lines) do
|
|
update_line(line, uptime)
|
|
end
|
|
if #dead_lines > 0 then
|
|
for i = #dead_lines, 1, -1 do
|
|
local index = dead_lines[i]
|
|
table.remove(lines, i)
|
|
end
|
|
dead_lines = {}
|
|
end
|
|
end)
|
|
end
|
|
end
|