Create NotificationLib.txt
This commit is contained in:
parent
08cf9c2433
commit
08e4e01627
1 changed files with 111 additions and 0 deletions
111
libs/NotificationLib.txt
Normal file
111
libs/NotificationLib.txt
Normal file
|
|
@ -0,0 +1,111 @@
|
|||
--@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
|
||||
Loading…
Add table
Reference in a new issue