101 lines
2.5 KiB
Lua
101 lines
2.5 KiB
Lua
local IsValid = IsValid
|
|
local Clamp = math.Clamp
|
|
local RealTime = RealTime
|
|
local FrameTime = FrameTime
|
|
local Approach = math.Approach
|
|
|
|
local SetColor = surface.SetDrawColor
|
|
local SetMaterial = surface.SetMaterial
|
|
local DrawOutlinedText = draw.SimpleTextOutlined
|
|
local DrawTexturedRect = surface.DrawTexturedRect
|
|
local DrawRect = surface.DrawRect
|
|
|
|
local DrawHealthBar = SquadMenu.DrawHealthBar
|
|
local matGradient = Material( "vgui/gradient-r" )
|
|
|
|
local COLORS = {
|
|
WHITE = Color( 255, 255, 255, 255 ),
|
|
LOW_HEALTH = Color( 250, 20, 20, 255 ),
|
|
OUTLINE = Color( 0, 0, 0, 255 )
|
|
}
|
|
|
|
local PANEL = {}
|
|
|
|
function PANEL:Init()
|
|
self.avatar = vgui.Create( "AvatarImage", self )
|
|
self:InvalidateLayout()
|
|
self:SetPlayer()
|
|
end
|
|
|
|
function PANEL:SetPlayer( id, name, squad )
|
|
self.squad = squad
|
|
self.playerId = id
|
|
self.validateTimer = 0
|
|
|
|
self.name = SquadMenu.ValidateString( name, "", 20 )
|
|
self.health = 1
|
|
self.armor = 0
|
|
self.alive = true
|
|
|
|
self.healthAnim = 0
|
|
self.armorAnim = 0
|
|
end
|
|
|
|
function PANEL:Think()
|
|
if IsValid( self.ply ) then
|
|
self.health = Clamp( self.ply:Health() / 100, 0, 1 )
|
|
self.armor = Clamp( self.ply:Armor() / 100, 0, 1 )
|
|
self.alive = self.ply:Alive()
|
|
|
|
return
|
|
end
|
|
|
|
-- Keep trying to get the player entity periodically
|
|
if RealTime() < self.validateTimer then return end
|
|
|
|
self.validateTimer = RealTime() + 1
|
|
|
|
local ply = SquadMenu.FindPlayerById( self.playerId )
|
|
|
|
if ply then
|
|
self.ply = ply
|
|
self.name = SquadMenu.ValidateString( ply:Nick(), "", 20 )
|
|
self.avatar:SetPlayer( ply, 64 )
|
|
end
|
|
end
|
|
|
|
function PANEL:Paint( w, h )
|
|
local split = h
|
|
|
|
if self.squad then
|
|
SetColor( self.squad.color:Unpack() )
|
|
DrawRect( w - split, 0, split, h )
|
|
end
|
|
|
|
SetColor( 0, 0, 0, 240 )
|
|
SetMaterial( matGradient )
|
|
DrawTexturedRect( 0, 0, w - split, h )
|
|
|
|
local dt = FrameTime()
|
|
|
|
self.healthAnim = Approach( self.healthAnim, self.health, dt * 2 )
|
|
self.armorAnim = Approach( self.armorAnim, self.armor, dt )
|
|
|
|
if self.alive then
|
|
local barH = h * 0.2
|
|
DrawHealthBar( 2, h - barH - 5, w - split - 6, barH, self.healthAnim, self.armorAnim )
|
|
end
|
|
|
|
DrawOutlinedText( self.name, "SquadMenuInfo", 2, 2 + h * 0.5,
|
|
self.alive and COLORS.WHITE or COLORS.LOW_HEALTH, 0, self.alive and 4 or 1, 1, COLORS.OUTLINE )
|
|
end
|
|
|
|
function PANEL:PerformLayout( w, h )
|
|
local size = h - 4
|
|
|
|
self.avatar:SetSize( size, size )
|
|
self.avatar:SetPos( w - size - 2, 2 )
|
|
end
|
|
|
|
vgui.Register( "Squad_MemberInfo", PANEL, "DPanel" )
|