ph-enhanced/gamemodes/fretta/gamemode/cl_hud.lua
2019-05-28 09:16:53 +02:00

291 lines
8.7 KiB
Lua

local hudScreen = nil
local Alive = false
local Class = nil
local Team = 0
local WaitingToRespawn = false
local InRound = false
local RoundResult = 0
local RoundWinner = nil
local IsObserver = false
local ObserveMode = 0
local ObserveTarget = NULL
local InVote = false
function GM:AddHUDItem( item, pos, parent )
hudScreen:AddItem( item, parent, pos )
end
function GM:HUDNeedsUpdate()
if ( !IsValid( LocalPlayer() ) ) then return false end
if ( Class != LocalPlayer():GetNWString( "Class", "Default" ) ) then return true end
if ( Alive != LocalPlayer():Alive() ) then return true end
if ( Team != LocalPlayer():Team() ) then return true end
if ( WaitingToRespawn != ( (LocalPlayer():GetNWFloat( "RespawnTime", 0 ) > CurTime()) && LocalPlayer():Team() != TEAM_SPECTATOR && !LocalPlayer():Alive()) ) then return true end
if ( InRound != GetGlobalBool( "InRound", false ) ) then return true end
if ( RoundResult != GetGlobalInt( "RoundResult", 0 ) ) then return true end
if ( RoundWinner != GetGlobalEntity( "RoundWinner", nil ) ) then return true end
if ( IsObserver != LocalPlayer():IsObserver() ) then return true end
if ( ObserveMode != LocalPlayer():GetObserverMode() ) then return true end
if ( ObserveTarget != LocalPlayer():GetObserverTarget() ) then return true end
if ( InVote != GAMEMODE:InGamemodeVote() ) then return true end
return false
end
function GM:OnHUDUpdated()
Class = LocalPlayer():GetNWString( "Class", "Default" )
Alive = LocalPlayer():Alive()
Team = LocalPlayer():Team()
WaitingToRespawn = (LocalPlayer():GetNWFloat( "RespawnTime", 0 ) > CurTime()) && LocalPlayer():Team() != TEAM_SPECTATOR && !Alive
InRound = GetGlobalBool( "InRound", false )
RoundResult = GetGlobalInt( "RoundResult", 0 )
RoundWinner = GetGlobalEntity( "RoundWinner", nil )
IsObserver = LocalPlayer():IsObserver()
ObserveMode = LocalPlayer():GetObserverMode()
ObserveTarget = LocalPlayer():GetObserverTarget()
InVote = GAMEMODE:InGamemodeVote()
end
function GM:OnHUDPaint()
end
function GM:RefreshHUD()
if ( !GAMEMODE:HUDNeedsUpdate() ) then return end
GAMEMODE:OnHUDUpdated()
if ( IsValid( hudScreen ) ) then hudScreen:Remove() end
hudScreen = vgui.Create( "DHudLayout" )
if ( InVote ) then return end
if ( RoundWinner and RoundWinner != NULL ) then
GAMEMODE:UpdateHUD_RoundResult( RoundWinner, Alive )
elseif ( RoundResult != 0 ) then
GAMEMODE:UpdateHUD_RoundResult( RoundResult, Alive )
elseif ( IsObserver ) then
GAMEMODE:UpdateHUD_Observer( WaitingToRespawn, InRound, ObserveMode, ObserveTarget )
elseif ( !Alive ) then
GAMEMODE:UpdateHUD_Dead( WaitingToRespawn, InRound )
else
GAMEMODE:UpdateHUD_Alive( InRound )
if ( GetGlobalBool( "RoundWaitForPlayers" ) && ( ( team.NumPlayers( TEAM_HUNTERS ) < 1 ) || ( team.NumPlayers( TEAM_PROPS ) < 1 ) ) ) then
GAMEMODE:UpdateHUD_WaitForPlayers( InRound )
end
end
end
function GM:HUDPaint()
self.BaseClass:HUDPaint()
GAMEMODE:OnHUDPaint()
GAMEMODE:RefreshHUD()
end
function GM:UpdateHUD_WaitForPlayers( InRound )
if ( InRound && Alive ) then
local WaitText = vgui.Create( "DHudElement" );
WaitText:SizeToContents()
WaitText:SetText( "Waiting for players..." )
GAMEMODE:AddHUDItem( WaitText, 8 )
end
end
function GM:UpdateHUD_RoundResult( RoundResult, Alive )
local txt = GetGlobalString( "RRText" )
if ( type( RoundResult ) == "number" ) && ( team.GetAllTeams()[ RoundResult ] && txt == "" ) then
local TeamName = team.GetName( RoundResult )
if ( TeamName ) then txt = TeamName .. " Wins!" end
elseif ( type( RoundResult ) == "Player" && IsValid( RoundResult ) && txt == "" ) then
txt = RoundResult:Name() .. " Wins!"
end
local RespawnText = vgui.Create( "DHudElement" );
RespawnText:SizeToContents()
RespawnText:SetText( txt )
GAMEMODE:AddHUDItem( RespawnText, 8 )
end
function GM:UpdateHUD_Observer( bWaitingToSpawn, InRound, ObserveMode, ObserveTarget )
local lbl = nil
local txt = nil
local col = Color( 255, 255, 255 );
if ( IsValid( ObserveTarget ) && ObserveTarget:IsPlayer() && ObserveTarget != LocalPlayer() && ObserveMode != OBS_MODE_ROAMING ) then
lbl = "SPECTATING"
txt = ObserveTarget:Nick()
col = team.GetColor( ObserveTarget:Team() );
end
if ( ObserveMode == OBS_MODE_DEATHCAM || ObserveMode == OBS_MODE_FREEZECAM ) then
txt = "You Died!" // were killed by?
end
if ( txt ) then
local txtLabel = vgui.Create( "DHudElement" );
txtLabel:SetText( txt )
if ( lbl ) then txtLabel:SetLabel( lbl ) end
txtLabel:SetTextColor( col )
GAMEMODE:AddHUDItem( txtLabel, 2 )
end
GAMEMODE:UpdateHUD_Dead( bWaitingToSpawn, InRound )
end
function GM:UpdateHUD_Dead( bWaitingToSpawn, InRound )
if ( !InRound && GAMEMODE.RoundBased ) then
local RespawnText = vgui.Create( "DHudElement" );
RespawnText:SizeToContents()
RespawnText:SetText( "Waiting for round start" )
GAMEMODE:AddHUDItem( RespawnText, 8 )
return
end
if ( bWaitingToSpawn ) then
local RespawnTimer = vgui.Create( "DHudCountdown" );
RespawnTimer:SizeToContents()
RespawnTimer:SetValueFunction( function() return LocalPlayer():GetNWFloat( "RespawnTime", 0 ) end )
RespawnTimer:SetLabel( "SPAWN IN" )
GAMEMODE:AddHUDItem( RespawnTimer, 8 )
return
end
--[[
if ( InRound ) then
local RoundTimer = vgui.Create( "DHudCountdown" );
RoundTimer:SizeToContents()
RoundTimer:SetValueFunction( function()
if ( GetGlobalFloat( "RoundStartTime", 0 ) > CurTime() ) then return GetGlobalFloat( "RoundStartTime", 0 ) end
return GetGlobalFloat( "RoundEndTime" ) end )
RoundTimer:SetLabel( "TIME" )
GAMEMODE:AddHUDItem( RoundTimer, 8 )
return
end
]]--
local Bar = vgui.Create( "DHudBar" )
GAMEMODE:AddHUDItem( Bar, 8 )
-- This should show on dead players too
if ( InRound ) then
local TeamIndicator_Name_AddString = "(DEAD) "
if ( LocalPlayer():Team() == TEAM_SPECTATOR ) then TeamIndicator_Name_AddString = "" end
local TeamIndicator = vgui.Create( "DHudUpdater" );
TeamIndicator:SizeToContents()
TeamIndicator:SetValueFunction( function()
return TeamIndicator_Name_AddString..""..team.GetName( LocalPlayer():Team() )
end )
TeamIndicator:SetColorFunction( function()
return team.GetColor( LocalPlayer():Team() )
end )
TeamIndicator:SetFont( "HudSelectionText" )
Bar:AddItem( TeamIndicator )
local RoundNumber = vgui.Create( "DHudUpdater" );
RoundNumber:SizeToContents()
RoundNumber:SetValueFunction( function() return GetGlobalInt( "RoundNumber", 0 ) end )
RoundNumber:SetLabel( "ROUND" )
Bar:AddItem( RoundNumber )
local RoundTimer = vgui.Create( "DHudCountdown" );
RoundTimer:SizeToContents()
RoundTimer:SetValueFunction( function()
if ( GetGlobalFloat( "RoundStartTime", 0 ) > CurTime() ) then return GetGlobalFloat( "RoundStartTime", 0 ) end
return GetGlobalFloat( "RoundEndTime" ) end )
RoundTimer:SetLabel( "TIME" )
Bar:AddItem( RoundTimer )
end
if ( Team != TEAM_SPECTATOR && !Alive && !GAMEMODE.RoundBased ) then
local RespawnText = vgui.Create( "DHudElement" );
RespawnText:SizeToContents()
RespawnText:SetText( "Press Fire to Spawn" )
GAMEMODE:AddHUDItem( RespawnText, 8 )
end
end
function GM:UpdateHUD_Alive( InRound )
if ( GAMEMODE.RoundBased || GAMEMODE.TeamBased ) then
local Bar = vgui.Create( "DHudBar" )
GAMEMODE:AddHUDItem( Bar, 2 )
if ( GAMEMODE.TeamBased && GAMEMODE.ShowTeamName ) then
local TeamIndicator = vgui.Create( "DHudUpdater" );
TeamIndicator:SizeToContents()
TeamIndicator:SetValueFunction( function()
return team.GetName( LocalPlayer():Team() )
end )
TeamIndicator:SetColorFunction( function()
return team.GetColor( LocalPlayer():Team() )
end )
TeamIndicator:SetFont( "HudSelectionText" )
Bar:AddItem( TeamIndicator )
end
if ( GAMEMODE.RoundBased ) then
local RoundNumber = vgui.Create( "DHudUpdater" );
RoundNumber:SizeToContents()
RoundNumber:SetValueFunction( function() return GetGlobalInt( "RoundNumber", 0 ) end )
RoundNumber:SetLabel( "ROUND" )
Bar:AddItem( RoundNumber )
local RoundTimer = vgui.Create( "DHudCountdown" );
RoundTimer:SizeToContents()
RoundTimer:SetValueFunction( function()
if ( GetGlobalFloat( "RoundStartTime", 0 ) > CurTime() ) then return GetGlobalFloat( "RoundStartTime", 0 ) end
return GetGlobalFloat( "RoundEndTime" ) end )
RoundTimer:SetLabel( "TIME" )
Bar:AddItem( RoundTimer )
end
end
end
--[[
this thing is obsolete/depcretaed. Sorry!
function GM:UpdateHUD_AddedTime( iTimeAdded )
// to do or to override, your choice
end
usermessage.Hook( "RoundAddedTime", function( um ) if( GAMEMODE && um ) then GAMEMODE:UpdateHUD_AddedTime( um:ReadFloat() ) end end )
]]--