186 lines
4.6 KiB
Lua
186 lines
4.6 KiB
Lua
GM.NotifyFadeTime = 8
|
|
|
|
local DefaultFont = "ZSHUDFontSmallest"
|
|
local DefaultFontEntity = "ZSHUDFontSmallest"
|
|
|
|
local PANEL = {}
|
|
|
|
function PANEL:Init()
|
|
self:DockPadding(8, 2, 8, 2)
|
|
end
|
|
|
|
local matGrad = Material("VGUI/gradient-r")
|
|
function PANEL:Paint()
|
|
surface.SetMaterial(matGrad)
|
|
surface.SetDrawColor(0, 0, 0, 180)
|
|
|
|
local align = self:GetParent():GetAlign()
|
|
if align == RIGHT then
|
|
surface.DrawTexturedRect(self:GetWide() * 0.25, 0, self:GetWide(), self:GetTall())
|
|
elseif align == CENTER then
|
|
surface.DrawTexturedRect(self:GetWide() * 0.25, 0, self:GetWide() * 0.25, self:GetTall())
|
|
surface.DrawTexturedRectRotated(self:GetWide() * 0.625, self:GetTall() / 2, self:GetWide() * 0.25, self:GetTall(), 180)
|
|
else
|
|
surface.DrawTexturedRectRotated(self:GetWide() * 0.25, self:GetTall() / 2, self:GetWide() / 2, self:GetTall(), 180)
|
|
end
|
|
end
|
|
|
|
function PANEL:AddLabel(text, col, font, extramargin)
|
|
local label = vgui.Create("DLabel", self)
|
|
label:SetText(text)
|
|
label:SetFont(font or DefaultFont)
|
|
label:SetTextColor(col or color_white)
|
|
label:SizeToContents()
|
|
if extramargin then
|
|
label:SetContentAlignment(7)
|
|
label:DockMargin(0, label:GetTall() * 0.2, 0, 0)
|
|
else
|
|
label:SetContentAlignment(4)
|
|
end
|
|
label:Dock(LEFT)
|
|
end
|
|
|
|
function PANEL:AddImage(mat, col)
|
|
local img = vgui.Create("DImage", self)
|
|
img:SetImage(mat)
|
|
if col then
|
|
img:SetImageColor(col)
|
|
end
|
|
img:SizeToContents()
|
|
local height = img:GetTall()
|
|
if height > self:GetTall() then
|
|
img:SetSize(self:GetTall() / height * img:GetWide(), self:GetTall())
|
|
end
|
|
img:DockMargin(0, (self:GetTall() - img:GetTall()) / 2, 0, 0)
|
|
img:Dock(LEFT)
|
|
end
|
|
|
|
function PANEL:AddKillIcon(class)
|
|
local icondata = killicon.GetIcon(class)
|
|
|
|
if icondata then
|
|
self:AddImage(icondata[1], icondata[2])
|
|
else
|
|
local fontdata = killicon.GetFont(class) or killicon.GetFont("default")
|
|
if fontdata then
|
|
self:AddLabel(fontdata[2], fontdata[3], fontdata[1], true)
|
|
end
|
|
end
|
|
end
|
|
|
|
function PANEL:SetNotification(...)
|
|
local args = {...}
|
|
|
|
local defaultcol = color_white
|
|
local defaultfont
|
|
for k, v in ipairs(args) do
|
|
local vtype = type(v)
|
|
|
|
if vtype == "table" then
|
|
if v.r and v.g and v.b then
|
|
defaultcol = v
|
|
elseif v.font then
|
|
if v.font == "" then
|
|
defaultfont = nil
|
|
else
|
|
local th = draw.GetFontHeight(v.font)
|
|
if tw then
|
|
defaultfont = v.font
|
|
end
|
|
end
|
|
elseif v.killicon then
|
|
self:AddKillIcon(v.killicon)
|
|
if v.headshot then
|
|
self:AddKillIcon("headshot")
|
|
end
|
|
elseif v.image then
|
|
self:AddImage(v.image, v.color)
|
|
end
|
|
elseif vtype == "Player" then
|
|
local avatar = vgui.Create("AvatarImage", self)
|
|
local size = self:GetTall() >= 32 and 32 or 16
|
|
avatar:SetSize(size, size)
|
|
if v:IsValid() then
|
|
avatar:SetPlayer(v, size)
|
|
end
|
|
avatar:SetAlpha(220)
|
|
avatar:Dock(LEFT)
|
|
avatar:DockMargin(0, (self:GetTall() - avatar:GetTall()) / 2, 0, 0)
|
|
|
|
if v:IsValid() then
|
|
self:AddLabel(" "..v:Name(), team.GetColor(v:Team()), DefaultFontEntity)
|
|
else
|
|
self:AddLabel(" ?", team.GetColor(TEAM_UNASSIGNED), DefaultFontEntity)
|
|
end
|
|
elseif vtype == "Entity" then
|
|
self:AddLabel("["..(v:IsValid() and v:GetClass() or "?").."]", COLOR_RED, DefaultFontEntity)
|
|
else
|
|
local text = tostring(v)
|
|
|
|
self:AddLabel(text, defaultcol, defaultfont)
|
|
end
|
|
end
|
|
end
|
|
|
|
vgui.Register("DEXNotification", PANEL, "Panel")
|
|
|
|
local PANEL = {}
|
|
|
|
AccessorFunc(PANEL, "m_Align", "Align", FORCE_NUMBER)
|
|
AccessorFunc(PANEL, "m_MessageHeight", "MessageHeight", FORCE_NUMBER)
|
|
|
|
function PANEL:Init()
|
|
self:SetAlign(LEFT)
|
|
self:SetMessageHeight(32)
|
|
self:ParentToHUD()
|
|
self:InvalidateLayout()
|
|
end
|
|
|
|
function PANEL:PerformLayout()
|
|
end
|
|
|
|
function PANEL:Paint()
|
|
end
|
|
|
|
function PANEL:AddNotification(...)
|
|
local notif = vgui.Create("DEXNotification", self)
|
|
notif:SetTall(BetterScreenScale() * self:GetMessageHeight())
|
|
notif:SetNotification(...)
|
|
local w = 0
|
|
for _, p in pairs(notif:GetChildren()) do
|
|
w = w + p:GetWide()
|
|
end
|
|
if self:GetAlign() == RIGHT then
|
|
notif:DockPadding(self:GetWide() - w - 32, 0, 8, 0)
|
|
elseif self:GetAlign() == CENTER then
|
|
notif:DockPadding((self:GetWide() - w) / 2, 0, 0, 0)
|
|
else
|
|
notif:DockPadding(8, 0, 8, 0)
|
|
end
|
|
|
|
notif:Dock(TOP)
|
|
|
|
notif:SetAlpha(1)
|
|
notif:AlphaTo(255, 0.5)
|
|
notif:AlphaTo(1, 1, GAMEMODE.NotifyFadeTime - 1)
|
|
|
|
notif.DieTime = CurTime() + GAMEMODE.NotifyFadeTime
|
|
|
|
return notif
|
|
end
|
|
|
|
function PANEL:Think()
|
|
local time = CurTime()
|
|
|
|
for i, pan in pairs(self:GetChildren()) do
|
|
if pan.DieTime and time >= pan.DieTime then
|
|
pan:Remove()
|
|
local dummy = vgui.Create("Panel", self)
|
|
dummy:SetTall(0)
|
|
dummy:Dock(TOP)
|
|
dummy:Remove()
|
|
end
|
|
end
|
|
end
|
|
|
|
vgui.Register("DEXNotificationsList", PANEL, "Panel")
|