Starfall-chips/libs/NotificationLib.txt
2025-06-26 09:35:00 +03:00

111 lines
3.2 KiB
Text

--@name NotificationLib
--@shared
--@superuser
if SERVER then
function notify(player,type,text,delay,custom)
net.start("Notify")
net.writeTable({type,text,delay,custom})
net.send(player)
end
end
if CLIENT then
local notifications = {}
local types = {
["error"]={
color=Color(255,0,0),
sound="buttons/button18.wav"
},
["message"]={
color=Color(0,255,255),
sound="garrysmod/content_downloaded.wav"
},
["hint"]={
color=Color(255,255,0),
sound="garrysmod/content_downloaded.wav"
},
}
local screenX,screenY = render.getGameResolution()
function notify(type, text, delay, custom)
local data = {
text = text,
created_at = timer.curtime(),
delay = delay,
anim_start = timer.curtime(),
alpha = 0
}
if custom then
data.color = custom.color
data.sound = custom.sound
else
data.color = types[type].color
data.sound = types[type].sound
end
table.insert(notifications, data)
player():emitSound(data.sound)
end
net.receive("Notify", function()
local data = net.readTable()
notify(data[1],data[2],data[3],data[4])
end)
local font = render.createFont("Arial",24)
local def_font = render.createFont("Arial",16,800)
function math.easeOutElastic(t)
local p = 1
return math.pow(2, -10 * t) * math.sin((t - p / 4) * (2 * math.pi) / p) + 1
end
hook.add("DrawHud", "NotifyDraw", function()
local cur = timer.curtime()
for i, n in ipairs(notifications) do
n.target_y = 100 + (i - 1) * 70
if not n.y then n.y = n.target_y end
local dy = n.target_y - n.y
n.y = n.y + dy * math.min(0.2 * timer.frametime() * 60, 1)
end
for i, n in ipairs(notifications) do
local life = cur - n.created_at
local exit = math.clamp((n.delay - life) / 0.5, 0, 1)
local appear = math.clamp(life / 0.4, 0, 1)
local ease = math.easeOutElastic(appear)
local fade = math.min(appear, exit)
n.alpha = 255 * fade
local size = render.getTextSize(n.text) + 5
local baseX = 0
local offsetX = - (1 - ease) * (size + 80)
local y = n.y or (100 + (i - 1) * 70)
render.setColor(Color(5, 0, 0, 240 * fade))
render.drawRect(baseX + offsetX, y, size + 40, 60)
local c = n.color
render.setColor(Color(c[1], c[2], c[3], 100 * fade))
render.drawRect(baseX + offsetX + size + 20, y, 20, 60)
render.setFont(font)
render.setColor(Color(255, 255, 255, n.alpha))
render.drawSimpleText(baseX + offsetX + 10, y + 30, n.text, 0, 1)
end
for i = #notifications, 1, -1 do
if cur - notifications[i].created_at > notifications[i].delay then
table.remove(notifications, i)
end
end
end)
end