Files
wnsrc/lua/weapons/arccw_base/cl_hud.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

1205 lines
42 KiB
Lua

--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
local translate = ArcCW.GetTranslation
local function ScreenScaleMulti(input)
return ScreenScale(input) * ArcCW.ConVars["hud_size"]:GetFloat()
end
local cvar_deadzonex, cvar_deadzoney
local function CopeX()
if !cvar_deadzonex then cvar_deadzonex = ArcCW.ConVars["hud_deadzone_x"] end
return cvar_deadzonex:GetFloat() * ScrW() / 2
end
local function CopeY()
if !cvar_deadzoney then cvar_deadzoney = ArcCW.ConVars["hud_deadzone_y"] end
return cvar_deadzoney:GetFloat() * ScrH() / 2
end
local function MyDrawText(tbl)
local x = tbl.x
local y = tbl.y
local dontbust = Color(tbl.col.r, tbl.col.g, tbl.col.b, tbl.col.a)
surface.SetFont(tbl.font)
if tbl.alpha then
dontbust.a = tbl.alpha
else
dontbust.a = 255
end
if tbl.align or tbl.yalign then
local w, h = surface.GetTextSize(tbl.text)
if tbl.align == 1 then
x = x - w
elseif tbl.align == 2 then
x = x - (w / 2)
end
if tbl.yalign == 1 then
y = y - h
elseif tbl.yalign == 2 then
y = y - h / 2
end
end
if tbl.shadow then
surface.SetTextColor(Color(0, 0, 0, tbl.alpha or 255))
surface.SetTextPos(x, y)
surface.SetFont(tbl.font .. "_Glow")
surface.DrawText(tbl.text)
end
surface.SetTextColor(dontbust)
surface.SetTextPos(x, y)
surface.SetFont(tbl.font)
surface.DrawText(tbl.text)
end
local vhp = 0
local varmor = 0
local vclip = 0
local vreserve = 0
local vclip2 = 0
local vreserve2 = 0
local vubgl = 0
local lastwpn = ""
local lastinfo = {ammo = 0, clip = 0, firemode = "", plus = 0}
local lastinfotime = 0
function SWEP:GetHUDData()
local data = {
clip = math.Round(vclip or self:Clip1()),
ammo = math.Round(vreserve or self:Ammo1()),
bars = self:GetFiremodeBars(),
mode = self:GetFiremodeName(),
ammotype = self.Primary.Ammo,
ammotype2 = self.Secondary.Ammo,
heat_enabled = self:HeatEnabled(),
heat_name = translate("ui.heat"),
heat_level = self:GetHeat(),
heat_maxlevel = self:GetMaxHeat(),
heat_locked = self:GetHeatLocked(),
}
if data.clip > self:GetCapacity() then
data.plus = data.clip - self:GetCapacity()
data.clip = self:GetCapacity()
end
local infammo, btmless = self:HasInfiniteAmmo(), self:HasBottomlessClip()
data.infammo = infammo
data.btmless = btmless
if self.PrimaryBash or self:Clip1() == -1 or self:GetCapacity() == 0 or self.Primary.ClipSize == -1 then
data.clip = "-"
end
if self.PrimaryBash then
data.ammo = "-"
end
if self:GetBuff_Override("UBGL") then
data.clip2 = math.Round(vclip2 or self:Clip2())
local ubglammo = self:GetBuff_Override("UBGL_Ammo")
if ubglammo then
data.ammo2 = tostring(math.Round(vreserve2 or self:GetOwner():GetAmmoCount(ubglammo)))
end
if data.clip2 > self:GetBuff_Override("UBGL_Capacity") then
data.plus2 = (data.clip2 - self:GetBuff_Override("UBGL_Capacity"))
data.clip2 = self:GetBuff_Override("UBGL_Capacity")
end
end
do
if infammo then
data.ammo = btmless and data.ammo or "-"
data.clip = self.Throwing and "" or data.clip
end
if btmless then
data.clip = infammo and "" or data.ammo
data.ammo = "-"
end
local ubglammo = self:GetBuff_Override("UBGL_Ammo")
if ubglammo then
data.ubgl = self:Clip2() + self:GetOwner():GetAmmoCount(ubglammo)
end
end
data = self:GetBuff_Hook("Hook_GetHUDData", data) or data
return data
end
local t_states = {
[0] = "STATE_IDLE",
[1] = "STATE_SIGHTS",
[2] = "STATE_SPRINT",
[3] = "STATE_DISABLE",
[4] = "STATE_CUSTOMIZE",
[5] = "STATE_BIPOD"
}
local mr = math.Round
local bird = Material("arccw/hud/really cool bird.png", "mips smooth")
local statlocked = Material("arccw/hud/locked_32.png", "mips smooth")
local bar_fill = Material("arccw/hud/fmbar_filled.png", "mips smooth")
local bar_outl = Material("arccw/hud/fmbar_outlined.png", "mips smooth")
local bar_shad = Material("arccw/hud/fmbar_shadow.png", "mips smooth")
local bar_shou = Material("arccw/hud/fmbar_outlined_shadow.png", "mips smooth")
local hp = Material("arccw/hud/hp.png", "smooth")
local hp_shad = Material("arccw/hud/hp_shadow.png", "mips smooth")
local armor = Material("arccw/hud/armor.png", "mips smooth")
local armor_shad = Material("arccw/hud/armor_shadow.png", "mips smooth")
local ubgl_mat = Material("arccw/hud/ubgl.png", "smooth")
local bipod_mat = Material("arccw/hud/bipod.png", "smooth")
local function debug_panel(self)
local reloadtime = self:GetReloadTime()
local s = ScreenScaleMulti(1)
local thestate = self:GetState()
local ecksy = s * 64
if thestate == ArcCW.STATE_CUSTOMIZE then
ecksy = s * 256
elseif thestate == ArcCW.STATE_SIGHTS then
surface.SetDrawColor(255, 50, 50, 150)
surface.DrawLine(ScrW() / 2, ScrH() * 0.5 - 256, ScrW() / 2, ScrH() * 0.5 + 256)
surface.DrawLine(ScrW() * 0.5 - 256, ScrH() / 2, ScrW() * 0.5 + 256, ScrH() / 2)
end
surface.SetFont("ArcCW_26")
surface.SetTextColor(255, 255, 255, 255)
surface.SetDrawColor(0, 0, 0, 63)
-- it's for contrast, i promise
surface.SetMaterial(bird)
surface.DrawTexturedRect(ecksy - s-400, s-320, s * 512, s * 512)
surface.SetDrawColor(255, 255, 255, 255)
if reloadtime then
surface.SetTextPos(ecksy, 26 * s * 1)
surface.DrawText(math.Round(reloadtime[1], 2))
surface.SetTextPos(ecksy, 26 * s * 2)
surface.DrawText(math.Round(reloadtime[2], 2))
surface.SetTextPos(ecksy, 26 * s * 3)
if self:GetMagUpIn() - CurTime() > 0 then
surface.SetTextColor(255, 127, 127, 255)
end
surface.DrawText( mr( math.max( self:GetMagUpIn() - CurTime(), 0 ), 2) )
else
surface.SetFont("ArcCW_20")
surface.SetTextPos(ecksy, 26 * s * 2)
surface.DrawText("NO RELOAD ANIMATION")
surface.SetFont("ArcCW_12")
surface.SetTextPos(ecksy, 26 * s * 2.66)
surface.DrawText("not a mag fed one, at least...")
end
surface.SetTextPos(ecksy + (s*36*3), 26 * s * 3)
if self:GetReloadingREAL() - CurTime() > 0 then
surface.SetTextColor(255, 127, 127, 255)
end
surface.DrawText( mr( math.max( self:GetReloadingREAL() - CurTime(), 0 ), 2) )
surface.SetFont("ArcCW_26")
surface.SetTextColor(255, 255, 255, 255)
local delay = math.max(self:GetReloadingREAL(), self:GetNWPriorityAnim())
if delay - CurTime() > 0 then
surface.SetTextColor(255, 127, 127, 255)
end
surface.SetTextPos(ecksy, 26 * s * 4)
surface.DrawText( mr( math.max( delay - CurTime(), 0 ), 2 ) )
surface.SetTextColor(255, 255, 255, 255)
if self:GetWeaponOpDelay() - CurTime() > 0 then
surface.SetTextColor(255, 127, 127, 255)
end
surface.SetTextPos(ecksy, 26 * s * 5)
surface.DrawText( mr( math.max( self:GetWeaponOpDelay() - CurTime(), 0 ), 2 ) )
surface.SetTextColor(255, 255, 255, 255)
if self:GetNextPrimaryFire() - CurTime() > 0 then
surface.SetTextColor(255, 127, 127, 255)
end
surface.SetTextPos(ecksy, 26 * s * 6)
surface.DrawText( mr( math.max( self:GetNextPrimaryFire() * 1000 - CurTime() * 1000, 0 ), 0 ) .. "ms" )
surface.SetTextColor(255, 255, 255, 255)
local seq = self:GetSequenceInfo( self:GetOwner():GetViewModel():GetSequence() )
local seq2 = self:GetOwner():GetViewModel():GetSequence()
local seq3 = self:GetOwner():GetViewModel()
surface.SetFont("ArcCW_20")
surface.SetTextPos(ecksy, 26 * s * 7)
surface.DrawText( seq2 .. ", " .. seq.label )
local proggers = 1 - ( self.LastAnimFinishTime - CurTime() ) / seq3:SequenceDuration()
surface.SetTextPos(ecksy, 26 * s * 8)
surface.SetFont("ArcCW_12")
surface.DrawText( mr( seq3:SequenceDuration() * proggers, 2 ) )
surface.SetTextPos(ecksy + s * 30, 26 * s * 8)
surface.DrawText( "-" )
surface.SetTextPos(ecksy + s * 48, 26 * s * 8)
surface.DrawText( mr( self:SequenceDuration( seq2 ), 2 ) )
surface.SetTextPos(ecksy + s * 132, 26 * s * 7.6)
surface.DrawText( mr(proggers * 100) .. "%" )
-- welcome to the bar
surface.DrawOutlinedRect(ecksy, 26 * s * 7.7, s * 128, s * 8, s)
surface.DrawRect(ecksy, 26 * s * 7.7 + s * 2, s * 128 * math.Clamp(proggers, 0, 1), s * 8-s * 4, s)
surface.SetFont("ArcCW_20")
surface.SetTextPos(ecksy, 26 * s * 8.5)
surface.DrawText( t_states[thestate] )
surface.SetTextPos(ecksy, 26 * s * 9.25)
surface.DrawText( mr(self:GetSightDelta() * 100) .. "%" )
surface.DrawOutlinedRect(ecksy, 26 * s * 10, s * 64, s * 4, s / 2)
surface.DrawRect(ecksy, 26 * s * 10 + s * 1, s * 64 * self:GetSightDelta(), s * 4-s * 2)
surface.DrawOutlinedRect(ecksy, 26 * s * 10.25, s * 64, s * 4, s / 2)
surface.DrawRect(ecksy, 26 * s * 10.25 + s * 1, s * 64 * self:GetSprintDelta(), s * 4-s * 2)
surface.SetTextPos(ecksy, 26 * s * 11)
surface.DrawText( mr(self:GetHolster_Time(), 1) )
surface.SetTextPos(ecksy, 26 * s * 12)
surface.DrawText( tostring(self:GetHolster_Entity()) )
-- Labels
surface.SetTextColor(255, 255, 255, 255)
surface.SetFont("ArcCW_8")
if reloadtime then
surface.SetTextPos(ecksy, 26 * s * 1)
surface.DrawText("RELOAD")
surface.SetTextPos(ecksy- s * 36, s * 26 * 1.33)
surface.DrawText("FULL")
surface.SetTextPos(ecksy- s * 36, s * 26 * 2.33)
surface.DrawText("MAGIN")
surface.SetTextPos(ecksy- s * 36, s * 26 * 3.33)
surface.DrawText("MAG LOAD")
end
surface.SetTextPos(ecksy- s * (36 * -2), s * 26 * 3.33)
surface.DrawText("RELOAD TIME")
surface.SetTextPos(ecksy, 26 * s * 4)
surface.DrawText("PRIORITY DELAY")
surface.SetTextPos(ecksy, 26 * s * 5)
surface.DrawText("WEAPON OPERATION DELAY")
surface.SetTextPos(ecksy, 26 * s * 6)
surface.DrawText("NEXT PRIMARY FIRE")
surface.SetTextPos(ecksy, 26 * s * 7)
surface.DrawText("CURRENT ANIMATION")
surface.SetTextPos(ecksy, 26 * s * 8.5)
surface.DrawText("WEAPON STATE")
surface.SetTextPos(ecksy, 26 * s * 9.25)
surface.DrawText("SIGHT DELTA")
surface.SetTextPos(ecksy, 26 * s * 11)
surface.DrawText("HOLSTER TIME")
surface.SetTextPos(ecksy, 26 * s * 12)
surface.DrawText("HOLSTER ENT")
-- lhik timeline
surface.SetTextColor(255, 255, 255, 255)
surface.SetFont("ArcCW_8")
surface.SetDrawColor(255, 255, 255, 11)
surface.DrawRect(s * 8, s * 8, ScrW() - (s * 16), s * 2)
local texy = math.Round(CurTime(),1)
local a, b = surface.GetTextSize(texy)
surface.SetTextPos((ScrW() / 2) - (a / 2), (s * 16) - (b / 2))
surface.DrawText(texy)
surface.SetDrawColor(255, 255, 255, 127)
if self.LHIKTimeline then for i, v in pairs(self.LHIKTimeline) do
local pox = ScrW() / 2
local poy = (s * 7)
local zo = s * 0.01
local dist = self.LHIKStartTime + v.t
surface.DrawRect(pox + (dist * zo), poy, s * 8, s * 4)
texy = math.Round(dist,1)
a, b = surface.GetTextSize(texy)
surface.SetTextPos(pox + (dist * zo) - (a / 2), (s * 16) - (b / 2) )
surface.DrawText(texy)
end end
end
function SWEP:DrawHUD()
if ArcCW.ConVars["dev_debug"]:GetBool() then
debug_panel(self)
end
if ArcCW.ConVars["dev_benchgun"]:GetBool() then
draw.SimpleTextOutlined("BENCHGUN ENABLED", "ArcCW_26", ScrW() / 2, ScreenScaleMulti(4), color_white, TEXT_ALIGN_CENTER, TEXT_ALIGN_TOP, 2, Color(0, 0, 0))
draw.SimpleTextOutlined("VIEWMODEL POSITION MOVED", "ArcCW_16", ScrW() / 2, ScreenScaleMulti(30), color_white, TEXT_ALIGN_CENTER, TEXT_ALIGN_TOP, 2, Color(0, 0, 0))
end
if !GetConVar("cl_drawhud"):GetBool() then return false end
if self:GetState() != ArcCW.STATE_CUSTOMIZE then
self:GetBuff_Hook("Hook_DrawHUD")
end
local col2 = Color(255, 255, 255, 255)
local col3 = Color(255, 0, 0, 255)
local airgap = ScreenScaleMulti(8)
local apan_bg = {
w = ScreenScaleMulti(128),
h = ScreenScaleMulti(48),
}
local data = self:GetHUDData()
if data.heat_locked then
col2 = col3
end
local curTime = CurTime()
--local mode = self:GetFiremodeName()
local muzz = self:GetBuff_Override("Override_MuzzleEffectAttachment") or self.MuzzleEffectAttachment or 1
local fmbars = ArcCW.ConVars["hud_fcgbars"]:GetBool() and string.len( self:GetFiremodeBars() or "-----" ) != 0
if ArcCW:ShouldDrawHUDElement("CHudAmmo") then
local decaytime = GetConVar("arccw_hud_3dfun_decaytime"):GetFloat()
if decaytime == 0 then decaytime = math.huge end
local visible = (lastinfotime + decaytime + 1 > curTime or lastinfotime - 0.5 > curTime)
-- Detect changes to stuff drawn in HUD
local curInfo = {
ammo = data.ammo,
clip = data.clip,
plus = data.plus or "0", -- data.plus is nil when it doesnt exist
ammo2 = data.ammo2,
clip2 = data.clip2,
plus2 = data.plus2 or "0", -- data.plus is nil when it doesnt exist
ammotype = data.ammotype,
firemode = data.mode,
heat = data.heat_level,
self:GetInUBGL(),
self:GetInBipod(),
self:CanBipod(),
}
if GetConVar("arccw_hud_3dfun_lite"):GetBool() then
curInfo.clip = nil
curInfo.plus = nil
curInfo.clip2 = nil
curInfo.plus2 = nil
curInfo.heat = nil
end
for i, v in pairs(curInfo) do
if v != lastinfo[i] then
lastinfotime = visible and (curTime - 0.5) or curTime
lastinfo = curInfo
break
end
end
local qss = ScreenScaleMulti(24)
local correct_y = 28
local correct_x = 0
if !GetConVar("arccw_hud_3dfun"):GetBool() then
qss = ScreenScaleMulti(-24)
correct_y = -36
correct_x = 52
end
-- TODO: There's an issue where this won't ping the HUD when switching in from non-ArcCW weapons
if LocalPlayer():KeyDown(IN_RELOAD) or lastwpn != self then lastinfotime = visible and (curTime - 0.5) or curTime end
local alpha
if lastinfotime + decaytime < curTime then
alpha = 255 - (curTime - lastinfotime - decaytime) * 255
elseif lastinfotime + 0.5 > curTime then
alpha = 255 - (lastinfotime + 0.5 - curTime) * 255
else
alpha = 255
end
if alpha > 0 then
local EyeAng = EyeAngles()
local angpos
if GetConVar("arccw_hud_3dfun"):GetBool() and self:GetOwner():ShouldDrawLocalPlayer() then
local bone = "ValveBiped.Bip01_R_Hand"
local ind = self:GetOwner():LookupBone(bone)
if ind and ind > -1 then
local p, a = self:GetOwner():GetBonePosition(ind)
angpos = {Ang = a, Pos = p}
end
elseif GetConVar("arccw_hud_3dfun"):GetBool() then
local vm = self:GetOwner():GetViewModel()
if vm and vm:IsValid() then
angpos = vm:GetAttachment(muzz)
end
end
if GetConVar("arccw_hud_3dfun"):GetBool() and angpos then
angpos.Pos = angpos.Pos - EyeAng:Up() * GetConVar("arccw_hud_3dfun_up"):GetFloat() - EyeAng:Right() * GetConVar("arccw_hud_3dfun_right"):GetFloat() - EyeAng:Forward() * GetConVar("arccw_hud_3dfun_forward"):GetFloat()
cam.Start3D()
local toscreen = angpos.Pos:ToScreen()
cam.End3D()
apan_bg.x = toscreen.x - apan_bg.w - ScreenScaleMulti(8)
apan_bg.y = toscreen.y - apan_bg.h * 0.5
else
apan_bg.x = ScrW() - CopeX() - ScreenScaleMulti(128 + 8)
apan_bg.y = ScrH() - CopeY() - ScreenScaleMulti(48)
end
apan_bg.x = math.Clamp(apan_bg.x, ScreenScaleMulti(8), ScrW() - CopeX() - ScreenScaleMulti(128 + 8))
apan_bg.y = math.Clamp(apan_bg.y, ScreenScaleMulti(8), ScrH() - CopeY() - ScreenScaleMulti(48))
if !fmbars then
apan_bg.y = apan_bg.y + ScreenScaleMulti(6)
end
local corny = 22 * math.ease.OutSine(math.sin(vubgl * math.pi)) * (self:GetInUBGL() and -1 or 1)
local ngap = 22 * vubgl
local wammo = {
x = apan_bg.x + apan_bg.w - airgap + ScreenScaleMulti(corny),
y = apan_bg.y - ScreenScaleMulti(4) - ScreenScaleMulti(ngap),
text = tostring(data.clip),
font = "ArcCW_26",
col = col2,
align = 1,
shadow = true,
alpha = alpha,
}
wammo.col = col2
if data.clip == 0 then
wammo.col = col3
end
if tostring(data.clip) == "-" then
wammo.text = ""
end
MyDrawText(wammo)
wammo.w, wammo.h = surface.GetTextSize(wammo.text)
surface.SetFont("ArcCW_26")
if data.plus and !self:HasBottomlessClip() then
local wplus = {
x = wammo.x,
y = wammo.y,
text = "+" .. tostring(data.plus),
font = "ArcCW_16",
col = col2,
shadow = true,
alpha = alpha,
}
MyDrawText(wplus)
end
local wreserve = {
x = wammo.x - wammo.w - ScreenScaleMulti(4),
y = apan_bg.y + ScreenScaleMulti(10) - ScreenScaleMulti(ngap),
text = tostring(data.ammo) .. " /",
font = "ArcCW_12",
col = col2,
align = 1,
yalign = 2,
shadow = true,
alpha = alpha,
}
if tonumber(data.ammo) and tonumber(data.clip) and tonumber(data.clip) >= self:GetCapacity() then
wreserve.text = tostring(data.ammo) .. " |"
end
if self:GetPrimaryAmmoType() <= 0 then
wreserve.text = "!"
end
if self.PrimaryBash then
wreserve.text = ""
end
local drew = false
local ungl = false
if tostring(data.ammo) != "-" then
drew = true
MyDrawText(wreserve)
surface.SetFont("ArcCW_12")
wreserve.w, wreserve.h = surface.GetTextSize(wreserve.text)
end
if GetConVar("arccw_hud_3dfun_ammotype"):GetBool() and isstring(data.ammotype) then
local wammotype = {
x = wammo.x - wammo.w - ScreenScaleMulti(3),
y = wammo.y + (wammo.h/2),
text = language.GetPhrase(data.ammotype .. "_ammo"),
font = "ArcCW_8",
col = col2,
align = 1,
yalign = 2,
shadow = true,
alpha = alpha,
}
if drew then
wammotype.x = wreserve.x - wreserve.w - ScreenScaleMulti(3)
wammotype.y = wreserve.y-- + (wreserve.h/2)
end
MyDrawText(wammotype)
end
--ubgl
if self:GetBuff_Override("UBGL") then
ungl = true
local ugap = 22 * (1-vubgl)
local wammo = {
x = apan_bg.x + apan_bg.w - airgap + ScreenScaleMulti(corny*-1),
y = apan_bg.y - ScreenScaleMulti(4) - ScreenScaleMulti(ugap),
text = tostring(data.clip2),
font = "ArcCW_26",
col = col2,
align = 1,
shadow = true,
alpha = alpha,
}
wammo.col = col2
if data.clip2 == 0 then
wammo.col = col3
end
if tostring(data.clip2) != "-" then
MyDrawText(wammo)
end
surface.SetFont("ArcCW_26")
wammo.w, wammo.h = surface.GetTextSize(wammo.text)
if data.plus2 and !self:HasBottomlessClip() then
local wplus = {
x = wammo.x,
y = wammo.y,
text = "+" .. tostring(data.plus2),
font = "ArcCW_16",
col = col2,
shadow = true,
alpha = alpha,
}
MyDrawText(wplus)
end
local wreserve = {
x = wammo.x - wammo.w - ScreenScaleMulti(4),
y = apan_bg.y + ScreenScaleMulti(10) - ScreenScaleMulti(ugap),
text = tostring(data.ammo2) .. " /",
font = "ArcCW_12",
col = col2,
align = 1,
yalign = 2,
shadow = true,
alpha = alpha,
}
if tonumber(data.ammo2) and tonumber(data.clip2) and tonumber(data.clip2) >= self:GetBuff_Override("UBGL_Capacity") then
wreserve.text = tostring(data.ammo2) .. " |"
end
if self:GetSecondaryAmmoType() <= 0 then
wreserve.text = "!"
end
local drew = false
if tostring(data.ammo2) != "-" then
drew = true
MyDrawText(wreserve)
surface.SetFont("ArcCW_12")
wreserve.w, wreserve.h = surface.GetTextSize(wreserve.text)
end
if GetConVar("arccw_hud_3dfun_ammotype"):GetBool() and isstring(data.ammotype) then
local wammotype = {
x = wammo.x - wammo.w - ScreenScaleMulti(3),
y = wammo.y + (wammo.h/2),
text = language.GetPhrase(data.ammotype2 .. "_ammo"),
font = "ArcCW_8",
col = col2,
align = 1,
yalign = 2,
shadow = true,
alpha = alpha,
}
if drew then
wammotype.x = wreserve.x - wreserve.w - ScreenScaleMulti(3)
wammotype.y = wreserve.y
end
MyDrawText(wammotype)
end
end
local wmode = {
x = apan_bg.x + apan_bg.w - airgap,
y = apan_bg.y + ScreenScaleMulti(28),
font = "ArcCW_12",
text = data.mode,
col = col2,
align = 1,
shadow = true,
alpha = alpha,
}
if !fmbars then
wmode.y = wmode.y - ScreenScaleMulti(6)
end
MyDrawText(wmode)
-- overheat bar 3d
if self:GetMalfunctionJam() then
local col = Color(255, 0, 32)
local wheat = { --cheeeeerios
x = apan_bg.x + apan_bg.w - airgap,
y = wmode.y + ScreenScaleMulti(16) * ( !GetConVar("arccw_hud_3dfun"):GetBool() and -2.5 or 1 ),
font = "ArcCW_12",
text = translate("ui.jammed"),
col = col,
align = 1,
shadow = true,
alpha = alpha,
}
if fmbars then
wheat.y = wmode.y + ScreenScaleMulti(16) * ( !GetConVar("arccw_hud_3dfun"):GetBool() and -2.5 or 0.8 )
end
if ungl then
wheat.y = wheat.y - ScreenScaleMulti(24)
end
local wheat_shad = {
x = wheat.x,
y = wheat.y,
font = "ArcCW_12_Glow",
text = wheat.text,
col = col,
align = 1,
shadow = false,
alpha = alpha,
}
MyDrawText(wheat_shad)
MyDrawText(wheat)
elseif data.heat_enabled then
local pers = math.Clamp(1 - (data.heat_level / data.heat_maxlevel), 0, 1)
local pers2 = math.Clamp(data.heat_level / data.heat_maxlevel, 0, 1)
local colheat1 = data.heat_locked and Color(255, 0, 0) or Color(255, 128 + 127 * pers, 128 + 127 * pers)
local colheat2 = data.heat_locked and Color(255, 0, 0) or Color(255 * pers2, 0, 0)
local wheat = {
x = apan_bg.x + apan_bg.w - airgap,
y = wmode.y + ScreenScaleMulti(16) * ( !GetConVar("arccw_hud_3dfun"):GetBool() and -2.5 or 1 ),
font = "ArcCW_12",
text = data.heat_name .. " " .. tostring(math.floor(100 * data.heat_level / data.heat_maxlevel)) .. "%",
col = colheat1,
align = 1,
shadow = false,
alpha = alpha,
}
if fmbars then
wheat.y = wmode.y + ScreenScaleMulti(16) * ( !GetConVar("arccw_hud_3dfun"):GetBool() and -2.5 or 0.8 )
end
if ungl then
wheat.y = wheat.y - ScreenScaleMulti(24)
end
local wheat_shad = {
x = wheat.x,
y = wheat.y,
font = "ArcCW_12_Glow",
text = wheat.text,
col = colheat2,
align = 1,
shadow = false,
alpha = alpha * pers,
}
MyDrawText(wheat_shad)
MyDrawText(wheat)
end
if self:CanBipod() or self:GetInBipod() then
local size = ScreenScaleMulti(32)
local awesomematerial = self:GetBuff_Override("Bipod_Icon", bipod_mat)
local whatsthecolor = self:GetInBipod() and Color(255, 255, 255, alpha) or
self:CanBipod() and Color(255, 255, 255, alpha / 4) or Color(0, 0, 0, 0)
local bar = {
w = size,
h = size,
x = (ScrW()/2) - (size/2),
y = ScrH() - CopeY() - ScreenScaleMulti(40),
}
surface.SetDrawColor( whatsthecolor )
surface.SetMaterial( awesomematerial )
surface.DrawTexturedRect( bar.x, bar.y, bar.w, bar.h )
local txt = string.upper(ArcCW:GetBind("+use"))
local bip = {
shadow = true,
x = bar.x + (bar.w/2),
y = bar.y - ScreenScaleMulti(12),
align = 2,
font = "ArcCW_12",
text = txt,
col = whatsthecolor,
alpha = alpha,
}
MyDrawText(bip)
end
if ArcCW.ConVars["hud_togglestats"] and ArcCW.ConVars["hud_togglestats"]:GetBool() then
local items = {
}
--[[
{
Icon = "",
Locked = false,
Selected = 1,
Toggles = {
[1] = "",
[2] = "",
[3] = "",
}
}
]]
for k, v in pairs(self.Attachments) do
local atttbl = v.Installed and ArcCW.AttachmentTable[v.Installed]
if atttbl and atttbl.ToggleStats then-- and !v.ToggleLock then
--print(atttbl.PrintName)
local item = {
Icon = atttbl.Icon,
Locked = v.ToggleLock,
Selected = v.ToggleNum,
Toggles = {}
}
for i, h in ipairs(atttbl.ToggleStats) do
table.insert(item.Toggles, h.PrintName)
--print("\t" .. (v.ToggleNum == i and "> " or "") .. atttbl.ToggleStats[i].PrintName .. (v.ToggleNum == i and " <" or ""))
end
table.insert(items, item)
end
end
for i=1, 0 do
table.insert(items, {
Icon = Material("Test"),
Locked = false,
Selected = i,
Toggles = {
"Test",
"Test",
"Test",
"Test",
"Test",
}
})
end
do
local size = ScreenScaleMulti(28)
local lock = ScreenScaleMulti(7)
local shiit = 1.5
local gaap = ScreenScaleMulti(7) -- 32 / 8
if #items == 1 then
gaap = 0
shiit = 1
end
for index, item in ipairs(items) do
surface.SetMaterial(item.Icon or bird)
surface.SetDrawColor(color_white)
local px, py = (ScrW()/2) - ((size*shiit)*(index-(#items*0.5))) + gaap, (ScrH()-CopeY()-(size*1.25))
surface.DrawTexturedRect(px, py, size, size)
if item.Locked then
surface.SetMaterial(statlocked)
surface.DrawTexturedRect(px + (size/2) - (lock/2), py + size - (lock/2), lock, lock)
end
for tdex, tinfo in ipairs(item.Toggles) do
local infor = {
x = px + (size*0.5),
y = py - (#item.Toggles * ScreenScaleMulti(8)) + (tdex * ScreenScaleMulti(8)),
font = "ArcCW_8",
text = tinfo,
col = col2,
align = 2,
yalign = 1,
shadow = true,
alpha = alpha * (tdex == item.Selected and 1 or 0.25),
}
MyDrawText(infor)
end
end
end
end
if fmbars then
local segcount = string.len( self:GetFiremodeBars() or "-----" )
local bargap = ScreenScaleMulti(2)
local bart = {
w = (ScreenScaleMulti(100) + ((segcount + 1) * bargap)) / segcount,
h = ScreenScaleMulti(8),
x = apan_bg.x + apan_bg.w,
y = apan_bg.y + apan_bg.h
}
bart.x = bart.x - ((bart.w / 2 + bargap) * segcount) - ScreenScaleMulti(4) - (bart.w / 4)
bart.y = bart.y - ScreenScaleMulti(28)
for i = 1, segcount do
local c = data.bars[i]
if c == "#" then continue end
if c != "!" and c != "-" then
surface.SetMaterial(bar_shou)
else
surface.SetMaterial(bar_shad)
end
surface.SetDrawColor(255, 255, 255, 255 / 5 * 3)
surface.DrawTexturedRect(bart.x, bart.y, bart.w, bart.h)
if c == "-" then
-- good ol filled
surface.SetMaterial(bar_fill)
surface.SetDrawColor(col2)
surface.DrawTexturedRect(bart.x, bart.y, bart.w, bart.h)
elseif c == "!" then
surface.SetMaterial(bar_fill)
surface.SetDrawColor(col3)
surface.DrawTexturedRect(bart.x, bart.y, bart.w, bart.h)
surface.SetMaterial(bar_outl)
surface.SetDrawColor(col2)
surface.DrawTexturedRect(bart.x, bart.y, bart.w, bart.h)
else
-- good ol outline
surface.SetMaterial(bar_outl)
surface.SetDrawColor(col2)
surface.DrawTexturedRect(bart.x, bart.y, bart.w, bart.h)
end
bart.x = bart.x + (bart.w / 2 + bargap)
end
end
end
elseif !ArcCW.ConVars["override_hud_off"]:GetBool() and ArcCW.ConVars["hud_minimal"]:GetBool() then
if fmbars then
local segcount = string.len( self:GetFiremodeBars() or "-----" )
local bargap = ScreenScaleMulti(2)
local bart = {
w = (ScreenScaleMulti(256) - ((segcount + 1) * bargap)) / segcount,
h = ScreenScaleMulti(8),
x = ScrW() / 2,
y = ScrH() - ScreenScaleMulti(24)
}
bart.x = bart.x - ((bart.w / 4) * segcount) - bart.w / 3.5 - bargap
for i = 1, segcount do
local c = data.bars[i]
if c == "#" then continue end
if c != "!" and c != "-" then
surface.SetMaterial(bar_shou)
else
surface.SetMaterial(bar_shad)
end
surface.SetDrawColor(255, 255, 255, 255 / 5 * 3)
surface.DrawTexturedRect(bart.x, bart.y, bart.w, bart.h)
if c == "-" then
-- good ol filled
surface.SetMaterial(bar_fill)
surface.SetDrawColor(col2)
surface.DrawTexturedRect(bart.x, bart.y, bart.w, bart.h)
elseif c == "!" then
surface.SetMaterial(bar_fill)
surface.SetDrawColor(col3)
surface.DrawTexturedRect(bart.x, bart.y, bart.w, bart.h)
surface.SetMaterial(bar_outl)
surface.SetDrawColor(col2)
surface.DrawTexturedRect(bart.x, bart.y, bart.w, bart.h)
else
-- good ol outline
surface.SetMaterial(bar_outl)
surface.SetDrawColor(col2)
surface.DrawTexturedRect(bart.x, bart.y, bart.w, bart.h)
end
bart.x = bart.x + (bart.w / 2) + bargap
end
end
local wmode = {
x = ScrW() / 2,
y = ScrH() - ScreenScaleMulti(34),
font = "ArcCW_12",
text = data.mode,
col = col2,
align = 2,
shadow = true,
alpha = alpha,
}
MyDrawText(wmode)
if self:GetBuff_Override("UBGL") then
local size = ScreenScaleMulti(32)
local awesomematerial = self:GetBuff_Override("UBGL_Icon", ubgl_mat)
local whatsthecolor = self:GetInUBGL() and Color(255, 255, 255, 255) or
Color(255, 255, 255, 0)
local bar2 = {
w = size,
h = size,
x = ScrW() / 2 + ScreenScaleMulti(32),
y = ScrH() - ScreenScaleMulti(52),
}
surface.SetDrawColor( whatsthecolor )
surface.SetMaterial( awesomematerial )
surface.DrawTexturedRect( bar2.x, bar2.y, bar2.w, bar2.h )
end
if self:CanBipod() or self:GetInBipod() then
local size = ScreenScaleMulti(32)
local awesomematerial = self:GetBuff_Override("Bipod_Icon", bipod_mat)
local whatsthecolor = self:GetInBipod() and Color(255, 255, 255, 255) or
self:CanBipod() and Color(255, 255, 255, 127) or
Color(255, 255, 255, 0)
local bar2 = {
w = size,
h = size,
x = ScrW() / 2 - ScreenScaleMulti(64),
y = ScrH() - ScreenScaleMulti(52),
}
surface.SetDrawColor( whatsthecolor )
surface.SetMaterial( awesomematerial )
surface.DrawTexturedRect( bar2.x, bar2.y, bar2.w, bar2.h )
local txt = string.upper(ArcCW:GetBind("+use"))
local bip = {
shadow = true,
x = ScrW() / 2 - ScreenScaleMulti(64),
y = ScrH() - ScreenScaleMulti(52),
font = "ArcCW_12",
text = txt,
col = whatsthecolor,
}
MyDrawText(bip)
end
if data.heat_enabled then
surface.SetDrawColor(col2)
local perc = data.heat_level / data.heat_maxlevel
local bar = {
x = 0,
y = ScrH() - ScreenScaleMulti(22)
}
surface.DrawOutlinedRect(ScrW() / 2 - ScreenScaleMulti(62), bar.y + ScreenScaleMulti(4.5), ScreenScaleMulti(124), ScreenScaleMulti(3))
surface.DrawRect(ScrW() / 2 - ScreenScaleMulti(62), bar.y + ScreenScaleMulti(4.5), ScreenScaleMulti(124) * perc, ScreenScaleMulti(3))
surface.SetFont("ArcCW_8")
local bip = {
shadow = false,
x = (ScrW() / 2) - (surface.GetTextSize(data.heat_name) / 2),
y = bar.y + ScreenScaleMulti(8),
font = "ArcCW_8",
text = data.heat_name,
col = col2,
}
MyDrawText(bip)
end
end
-- health + armor
if ArcCW:ShouldDrawHUDElement("CHudHealth") then
local colhp = Color(255, 255, 255, 255)
local gotarmor = false
if LocalPlayer():Armor() > 0 then
gotarmor = true
local armor_s = ScreenScaleMulti(10)
local war = {
x = airgap + CopeX() + armor_s + ScreenScaleMulti(6),
y = ScrH() - ScreenScaleMulti(16) - airgap - CopeY(),
font = "ArcCW_16",
text = tostring(math.Round(varmor)),
col = Color(255, 255, 255, 255),
shadow = true,
alpha = alpha
}
local armor_x = war.x - armor_s - ScreenScaleMulti(4)
local armor_y = war.y + ScreenScaleMulti(4)
surface.SetMaterial(armor_shad)
surface.SetDrawColor(0, 0, 0, 255)
surface.DrawTexturedRect(armor_x, armor_y, armor_s, armor_s)
surface.SetMaterial(armor)
surface.SetDrawColor(colhp)
surface.DrawTexturedRect(armor_x, armor_y, armor_s, armor_s)
MyDrawText(war)
end
local hpicon_s = ScreenScaleMulti(16)
local hpicon_x = airgap + CopeX()
if LocalPlayer():Health() <= 30 then
colhp = col3
end
local whp = {
x = airgap + hpicon_s + CopeX(),
y = ScrH() - ScreenScaleMulti(26 + (gotarmor and 16 or 0)) - airgap - CopeY(),
font = "ArcCW_26",
text = tostring(math.Round(vhp)),
col = colhp,
shadow = true,
alpha = alpha
}
local hpicon_y = whp.y + ScreenScaleMulti(8)
MyDrawText(whp)
surface.SetMaterial(hp_shad)
surface.SetDrawColor(0, 0, 0, 255)
surface.DrawTexturedRect(hpicon_x, hpicon_y, hpicon_s, hpicon_s)
surface.SetMaterial(hp)
surface.SetDrawColor(colhp)
surface.DrawTexturedRect(hpicon_x, hpicon_y, hpicon_s, hpicon_s)
end
vhp = self:GetOwner():Health()
varmor = self:GetOwner():Armor()
local clipdiff = math.abs(vclip - self:Clip1())
local reservediff = math.abs(vreserve - self:Ammo1())
if clipdiff == 1 then
vclip = self:Clip1()
elseif self:Clip1() == ArcCW.BottomlessMagicNumber then
clipdiff = 0
end
vclip = math.Approach(vclip, self:Clip1(), FrameTime() * 30 * clipdiff)
vreserve = math.Approach(vreserve, self:Ammo1(), FrameTime() * 30 * reservediff)
do
local clipdiff = math.abs(vclip2 - self:Clip2())
local reservediff = math.abs(vreserve2 - self:Ammo2())
if clipdiff == 1 then
vclip2 = self:Clip2()
elseif self:Clip2() == ArcCW.BottomlessMagicNumber then
clipdiff = 0
end
vclip2 = math.Approach(vclip2, self:Clip2(), FrameTime() * 30 * clipdiff)
vreserve2 = math.Approach(vreserve2, self:Ammo2(), FrameTime() * 30 * reservediff)
end
vubgl = math.Approach(vubgl, (self:GetInUBGL() and 1 or 0), (FrameTime() / 0.3) )
if lastwpn != self then
vclip = self:Clip1()
vreserve = self:Ammo1()
vclip2 = self:Clip2()
vreserve2 = self:Ammo2()
vubgl = 0
vhp = self:GetOwner():Health()
varmor = self:GetOwner():Armor()
end
lastwpn = self
end
function SWEP:CustomAmmoDisplay()
local data = self:GetHUDData()
self.AmmoDisplay = self.AmmoDisplay or {}
self.AmmoDisplay.Draw = true -- draw the display?
if self.Primary.ClipSize > 0 and tonumber(data.clip) then
local plus = tonumber(data.plus) or 0
self.AmmoDisplay.PrimaryClip = tonumber(data.clip) + plus -- amount in clip
end
if self.Primary.ClipSize > 0 and tonumber(data.ammo) then
self.AmmoDisplay.PrimaryAmmo = tonumber(data.ammo) -- amount in reserve
end
if true then
local ubglammo = self:GetBuff_Override("UBGL_Ammo")
if ubglammo then
self.AmmoDisplay.SecondaryAmmo = self:Clip2() + self:GetOwner():GetAmmoCount(ubglammo) -- amount of secondary ammo
end
end
return self.AmmoDisplay -- return the table
end