Files
2026-03-31 10:27:04 +03:00

1016 lines
38 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
function SWEP:ShouldDrawCrosshair()
if !TacRP.ConVars["crosshair"]:GetBool() then
return self:DoLowerIrons() and self:GetSightAmount() > 0 and !self:GetPeeking() and !self:GetReloading()
end
return !self:GetReloading() and !self:GetCustomize() and !self:GetSafe() and self:GetBlindFireMode() == TacRP.BLINDFIRE_NONE
and !(self:SprintLock() and !self.DrawCrosshairInSprint)
and !(self:DoForceSightsBehavior() and !self:GetPeeking())
and !self:GetJammed()
and (self:GetSightAmount() <= 0.5 or (self:GetPeeking() and !self:GetValue("ThermalCamera")) or self:DoLowerIrons())
and !(self:IsQuickNadeAllowed() and tobool(self:GetOwner():GetInfo("tacrp_nademenu")) and self:GetOwner():KeyDown(IN_GRENADE2))
and !(self:GetValue("CanBlindFire") and tobool(self:GetOwner():GetInfo("tacrp_blindfiremenu")) and (self:GetOwner():KeyDown(IN_ZOOM) or self:GetOwner().TacRPBlindFireDown))
end
function SWEP:DoDrawCrosshair(x, y)
local ft = FrameTime()
local ply = self:GetOwner()
self.CrosshairAlpha = self.CrosshairAlpha or 0
if !self:ShouldDrawCrosshair() then
self.CrosshairAlpha = math.Approach(self.CrosshairAlpha, 0, -10 * ft)
else
self.CrosshairAlpha = math.Approach(self.CrosshairAlpha, 1, 5 * ft)
end
local dev = TacRP.Developer()
local tacfunc
if self:GetValue("TacticalCrosshair") and self:GetTactical() then
tacfunc = self:GetValue("TacticalCrosshair")
elseif !dev and self.CrosshairAlpha <= 0 then return true end
local loweriron = self:DoLowerIrons() and self:GetSightAmount() > 0 and !self:GetPeeking() and !self:GetReloading()
local dir = self:GetShootDir(true)
local tr = util.TraceLine({
start = self:GetMuzzleOrigin(),
endpos = self:GetMuzzleOrigin() + (dir:Forward() * 50000),
mask = MASK_SHOT,
filter = self:GetOwner()
})
cam.Start3D()
local w2s = tr.HitPos:ToScreen()
x = math.Round(w2s.x)
y = math.Round(w2s.y)
cam.End3D()
local x2, y2 = x, y
local spread = TacRP.GetFOVAcc(self)
local sway = self:IsSwayEnabled() and self:GetSwayAmount() or self:GetForcedSwayAmount()
local truepos = self:GetValue("TacticalCrosshairTruePos")
if dev or truepos then
local tr2 = util.TraceLine({
start = self:GetMuzzleOrigin(),
endpos = self:GetMuzzleOrigin() + (self:GetShootDir():Forward() * 50000),
mask = MASK_SHOT,
filter = self:GetOwner()
})
cam.Start3D()
local tw2s = tr2.HitPos:ToScreen()
x2 = math.Round(tw2s.x)
y2 = math.Round(tw2s.y)
cam.End3D()
end
if tacfunc then
tacfunc(self, truepos and x2 or x, truepos and y2 or y, spread, sway)
end
spread = math.Round( math.max(spread, 2) + TacRP.SS(sway * math.pi))
if !dev and self.CrosshairAlpha <= 0 then return true end
local clr
if TacRP.ConVars["ttt_rolecrosshair"] and TacRP.ConVars["ttt_rolecrosshair"]:GetBool() then
if GetRoundState() == ROUND_PREP or GetRoundState() == ROUND_POST then
clr = Color(255, 255, 255)
elseif ply.GetRoleColor and ply:GetRoleColor() then
clr = ply:GetRoleColor() -- TTT2 feature
elseif ply:IsActiveTraitor() then
clr = Color(255, 50, 50)
elseif ply:IsActiveDetective() then
clr = Color(50, 50, 255)
else
clr = Color(50, 255, 50)
end
end
if loweriron then
clr = clr or color_white
surface.SetDrawColor(clr.r, clr.g, clr.b, clr.a * self.CrosshairAlpha * 0.75 * self:GetSightAmount())
surface.DrawRect(x - 1, y - 1, 3, 3)
surface.DrawRect(x - 13, y - 0.5, 6, 3)
surface.DrawRect(x + 8, y - 0.5, 6, 3)
surface.SetDrawColor(0, 0, 0, clr.a * self.CrosshairAlpha * self:GetSightAmount() * 0.7)
surface.DrawOutlinedRect(x - 2, y - 2, 5, 5, 1)
surface.DrawOutlinedRect(x - 14, y - 1.25, 8, 5, 1)
surface.DrawOutlinedRect(x + 7, y - 1.25, 8, 5, 1)
elseif TacRP.ConVars["crosshair"]:GetBool() then
clr = clr or Color(50, 255, 50)
surface.SetDrawColor(clr.r, clr.g, clr.b, clr.a * self.CrosshairAlpha)
surface.DrawRect(x, y, 1, 1)
if self.CrosshairStatic then spread = 16 end
local w = 16
surface.DrawLine(x, y - spread - w, x, y - spread)
surface.DrawLine(x, y + spread, x, y + spread + w)
surface.DrawLine(x - spread - w, y, x - spread, y)
surface.DrawLine(x + spread, y, x + spread + w, y)
end
-- Developer Crosshair
if dev then
if self:StillWaiting() then
surface.SetDrawColor(150, 150, 150, 75)
else
surface.SetDrawColor(255, 50, 50, 75)
end
surface.DrawLine(x2, y2 - 256, x2, y2 + 256)
surface.DrawLine(x2 - 256, y2, x2 + 256, y2)
spread = TacRP.GetFOVAcc(self)
local recoil_txt = "Recoil: " .. tostring(math.Round(self:GetRecoilAmount() or 0, 3))
surface.DrawCircle(x2, y2, spread, 255, 255, 255, 75)
surface.DrawCircle(x2, y2, spread + 1, 255, 255, 255, 75)
surface.SetFont("TacRP_Myriad_Pro_32_Unscaled")
surface.SetTextColor(255, 255, 255, 255)
surface.SetTextPos(x2 - 256, y2)
surface.DrawText(recoil_txt)
local spread_txt = tostring("Cone: " .. math.Round(math.deg(self:GetSpread()), 3)) .. " deg"
surface.SetTextPos(x2 - 256, y2 - 34)
surface.DrawText(spread_txt)
local spread_txt = tostring(math.Round( math.deg(self:GetSpread()) * 60, 3)) .. "MOA"
surface.SetTextPos(x2 - 256, y2 - 66)
surface.DrawText(spread_txt)
-- local tw = surface.GetTextSize(spread_txt)
-- surface.SetTextPos(x2 + 256 - tw, y2)
-- surface.DrawText(spread_txt)
local dist = (tr.HitPos - tr.StartPos):Length()
local dist_txt = math.Round(dist) .. " HU"
local tw = surface.GetTextSize(dist_txt)
surface.SetTextPos(x2 + 256 - tw, y2)
surface.DrawText(dist_txt)
local damage_txt = math.Round(self:GetDamageAtRange(dist)) .. " DMG"
local tw2 = surface.GetTextSize(damage_txt)
surface.SetTextPos(x2 + 256 - tw2, y2 - 34)
surface.DrawText(damage_txt)
local sprint_txt = math.Round(self:GetSprintAmount() * 100) .. "%"
local tw3 = surface.GetTextSize(sprint_txt)
surface.SetTextPos(x2 - tw3 * 0.5, y2 + 256)
surface.DrawText(sprint_txt)
local sight_txt = math.Round(self:GetSightAmount() * 100) .. "%"
local tw4 = surface.GetTextSize(sight_txt)
surface.SetTextPos(x2 - tw4 * 0.5, y2 + 256 + 32)
surface.DrawText(sight_txt)
end
return true
end
function SWEP:GetBinding(bind)
local t_bind = input.LookupBinding(bind)
if !t_bind then
t_bind = "BIND " .. bind .. "!"
end
return string.upper(t_bind)
end
local mat_vignette = Material("tacrp/hud/vignette.png", "mips smooth")
local mat_radial = Material("tacrp/grenades/radial.png", "mips smooth")
local rackrisetime = 0
local lastrow = 0
local lasthp = 0
local lasthealtime = 0
local lastdmgtime = 0
local lastarmor = 0
local faceindex = 0
local shockedtime = 0
local lastblindfiremode = 0
local col = Color(255, 255, 255)
local col_hi = Color(255, 150, 0)
local col_hi2 = Color(255, 230, 200)
local col_dark = Color(255, 255, 255, 20)
function SWEP:ShouldDrawBottomBar()
return self:GetFiremodeAmount() > 0 or self:IsQuickNadeAllowed()
end
function SWEP:DrawBottomBar(x, y, w, h)
if self:GetFiremodeAmount() > 0 then
if self:GetSafe() then
surface.SetMaterial(self:GetFiremodeMat(0))
else
surface.SetMaterial(self:GetFiremodeMat(self:GetCurrentFiremode()))
end
surface.SetDrawColor(col)
local sfm = TacRP.SS(14)
surface.DrawTexturedRect(x + w - sfm - TacRP.SS(1 + 10), y + h - sfm - TacRP.SS(1), sfm, sfm)
end
local fmoffset = TacRP.SS(25)
if self:GetFiremodeAmount() > 1 and !self:GetSafe() then
local nextfm = TacRP.GetBind("use") .. "+" .. TacRP.GetBind("reload")
surface.SetTextColor(col)
surface.SetFont("TacRP_HD44780A00_5x8_4")
local tw = surface.GetTextSize(nextfm)
surface.SetTextPos(x + w - tw - TacRP.SS(2), y + h - TacRP.SS(14))
surface.DrawText(nextfm)
surface.SetMaterial(self:GetFiremodeMat(self:GetNextFiremode()))
surface.SetDrawColor(col)
local nfm = TacRP.SS(8)
surface.DrawTexturedRect(x + w - nfm - TacRP.SS(4), y + h - nfm - TacRP.SS(1), nfm, nfm)
elseif self:GetSafe() then
surface.SetMaterial(self:GetFiremodeMat(self:GetCurrentFiremode()))
surface.SetDrawColor(col)
local nfm = TacRP.SS(8)
surface.DrawTexturedRect(x + w - nfm - TacRP.SS(4), y + h - nfm - TacRP.SS(1), nfm, nfm)
elseif self:GetFiremodeAmount() == 0 then
fmoffset = 0
end
if self:IsQuickNadeAllowed() then
local nade = self:GetGrenade()
local qty = nil --"INF"
if nade.Singleton then
qty = self:GetOwner():HasWeapon(nade.GrenadeWep) and 1 or 0
elseif !TacRP.IsGrenadeInfiniteAmmo(nade.Index) then
qty = self:GetOwner():GetAmmoCount(nade.Ammo)
end
local sg = TacRP.SS(14)
if nade.Icon then
surface.SetMaterial(nade.Icon)
surface.SetDrawColor(255, 255, 255)
surface.DrawTexturedRect(x + TacRP.SS(2), y + h - sg - TacRP.SS(1), sg, sg)
end
surface.SetTextColor(col)
if qty then
surface.SetTextPos(x + TacRP.SS(4) + sg, y + h - sg + TacRP.SS(8))
surface.SetFont("TacRP_HD44780A00_5x8_4")
surface.DrawText("x" .. qty)
surface.SetFont("TacRP_HD44780A00_5x8_6")
else
surface.SetFont("TacRP_HD44780A00_5x8_8")
end
local nadetext = TacRP:GetPhrase("quicknade." .. nade.PrintName .. ".name") or nade.PrintName
surface.SetTextPos(x + TacRP.SS(4) + sg, y + h - sg + TacRP.SS(1))
surface.DrawText(nadetext)
local mat = nil
if !TacRP.ConVars["nademenu"]:GetBool() then
mat = self:GetNextGrenade().Icon
else
mat = mat_radial
end
local nsg = TacRP.SS(10)
if mat then
surface.SetMaterial(mat)
surface.SetDrawColor(255, 255, 255)
surface.DrawTexturedRect(x + w - fmoffset - TacRP.SS(5) - nsg, y + h - nsg, nsg, nsg)
end
local nextnadetxt = TacRP.GetBind("+grenade2")
surface.SetTextColor(col)
surface.SetFont("TacRP_HD44780A00_5x8_4")
local tw = surface.GetTextSize(nextnadetxt)
surface.SetTextPos(x + w - fmoffset - (tw / 2) - nsg, y + h - nsg - TacRP.SS(4))
surface.DrawText(nextnadetxt)
end
end
local breath_a = 0
local last = 1
local lastt = 0
function SWEP:DrawBreathBar(x, y, w, h)
if CurTime() > lastt + 1 then
breath_a = math.Approach(breath_a, 0, FrameTime() * 2)
elseif breath_a < 1 then
breath_a = math.Approach(breath_a, 1, FrameTime())
end
local breath = self:GetBreath()
if last != self:GetBreath() then
lastt = CurTime()
last = breath
end
if breath_a == 0 then return end
x = x - w / 2
y = y - h / 2
surface.SetDrawColor(90, 90, 90, 200 * breath_a)
surface.DrawOutlinedRect(x - 1, y - 1, w + 2, h + 2, 1)
surface.SetDrawColor(0, 0, 0, 75 * breath_a)
surface.DrawRect(x, y, w, h)
if self:GetOutOfBreath() then
surface.SetDrawColor(255, 255 * breath ^ 0.5, 255 * breath, 150 * breath_a)
else
surface.SetDrawColor(255, 255, 255, 150 * breath_a)
end
surface.DrawRect(x, y, w * self:GetBreath(), h)
end
function SWEP:DrawHUDBackground()
self:DoScope()
if !GetConVar("cl_drawhud"):GetBool() then return end
-- draw a vignette effect around the screen based on recoil
local recoil = self:GetRecoilAmount()
if recoil > 0 and TacRP.ConVars["vignette"]:GetBool() then
local recoil_pct = math.Clamp(recoil / self:GetValue("RecoilMaximum"), 0, 1) ^ 1.25
local delta = self:Curve(recoil_pct)
surface.SetDrawColor(0, 0, 0, 200 * delta)
surface.SetMaterial(mat_vignette)
surface.DrawTexturedRect(0, 0, ScrW(), ScrH())
end
if self:GetValue("BlindFireCamera") then
self:DoCornershot()
end
if self:GetValue("ThermalCamera") then
self:DoThermalCam()
end
self:DrawLockOnHUD()
if self:GetValue("TacticalDraw") and self:GetTactical() then
self:GetValue("TacticalDraw")(self)
end
self:DrawCustomizeHUD()
if !self:GetCustomize() and TacRP.ConVars["hints"]:GetBool() then
self:DrawHints()
end
if !self:GetCustomize() and !TacRP.ConVars["jam_autoclear"]:GetBool() and self:GetJammed() then
local text = "[" .. TacRP.GetBindKey("+reload") .. "] " .. TacRP:GetPhrase("hint.unjam")
local font = "TacRP_HD44780A00_5x8_4"
surface.SetFont(font)
local w, h = surface.GetTextSize(text)
w = w + TacRP.SS(8)
h = h + TacRP.SS(4)
surface.SetDrawColor(0, 0, 0, 200)
TacRP.DrawCorneredBox(ScrW() / 2 - w / 2, ScrH() / 2, w, h)
draw.SimpleText(text, font, ScrW() / 2, ScrH() / 2 + h / 2, color_white, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
elseif DarkRP and TacRP.ConVars["rp_biocode_cp"]:GetBool() and self:GetNWBool("TacRP_PoliceBiocode") then
local text = TacRP:GetPhrase("hint.rp_biocode_cp")
local font = "TacRP_HD44780A00_5x8_4"
surface.SetFont(font)
local w, h = surface.GetTextSize(text)
w = w + TacRP.SS(8)
h = h + TacRP.SS(4)
if !LocalPlayer():isCP() then
surface.SetDrawColor(0, 0, 0, 200)
TacRP.DrawCorneredBox(ScrW() / 2 - w / 2, ScrH() / 2, w, h)
draw.SimpleText(text, font, ScrW() / 2, ScrH() / 2 + h / 2, color_white, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
elseif self:GetCustomize() then
surface.SetDrawColor(0, 0, 0, 200)
TacRP.DrawCorneredBox(ScrW() / 2 - w / 2, ScrH() - TacRP.SS(24), w, h)
draw.SimpleText(text, font, ScrW() / 2, ScrH() - TacRP.SS(24) + h / 2, color_white, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
end
end
if !self:GetCustomize() then
if TacRP.ConVars["hud"]:GetBool() and TacRP.ConVars["drawhud"]:GetBool() and engine.ActiveGamemode() != "terrortown" then
local w = TacRP.SS(110)
local h = TacRP.SS(40)
local x = ScrW() - w - TacRP.SS(8)
local y = ScrH() - h - TacRP.SS(8)
surface.SetDrawColor(0, 0, 0, 150)
TacRP.DrawCorneredBox(x, y, w, h, col)
local name_txt = TacRP:GetPhrase("wep." .. self:GetClass() .. ".name") or self:GetValue("PrintName")
surface.SetFont("TacRP_HD44780A00_5x8_8")
local tw = surface.GetTextSize(name_txt)
surface.SetTextPos(x + TacRP.SS(3), y + TacRP.SS(1))
if tw > w then
surface.SetFont("TacRP_HD44780A00_5x8_6")
tw = surface.GetTextSize(name_txt)
elseif tw > w - TacRP.SS(3) then
surface.SetTextPos(x + TacRP.SS(1.5), y + TacRP.SS(1))
end
surface.SetTextColor(col)
surface.DrawText(name_txt)
local ammotype = self:GetValue("PrimaryGrenade") and (TacRP.QuickNades[self:GetValue("PrimaryGrenade")].Ammo) or self:GetAmmoType()
local clips = math.min(math.ceil(self:GetOwner():GetAmmoCount(ammotype)), 999)
if self:GetValue("HUDAmmoMeter") then
local boxes = 25
local bw, bh = TacRP.SS(2), TacRP.SS(10)
local frac = math.Clamp(math.ceil(boxes * self:Clip1() / self:GetValue("ClipSize")), 0, boxes)
for i = 1, boxes do
if i - 1 > (boxes - frac) then
surface.SetDrawColor(col)
elseif i - 1 == (boxes - frac) then
surface.SetDrawColor(col_hi)
else
surface.SetDrawColor(col_dark)
end
surface.DrawRect(x + (i * (bw + TacRP.SS(1))), y + TacRP.SS(12), bw, bh)
end
draw.SimpleText(self:Clip1(), "TacRP_HD44780A00_5x8_10", x + TacRP.SS(93), y + TacRP.SS(17), col, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
elseif self.Primary.ClipSize > 0 then
if TacRP.ConVars["hud_ammo_number"]:GetBool() then
surface.SetFont("TacRP_HD44780A00_5x8_10")
local t = math.max(0, self:Clip1()) .. " /" .. self.Primary.ClipSize
local tw = surface.GetTextSize(t)
surface.SetTextColor(col)
surface.SetTextPos(x + w - tw - TacRP.SS(40), y + TacRP.SS(12))
surface.DrawText(t)
else
local sb = TacRP.SS(4)
local xoffset = TacRP.SS(77)
-- local pw = TacRP.SS(1)
local row1_bullets = 0
local row2_bullets = 0
local rackrise = 0
local cs = self:GetCapacity()
local c1 = self:Clip1()
local aps = self:GetValue("AmmoPerShot")
local row_size = 15
if cs == 20 then
row_size = 10
end
local row = math.ceil(c1 / row_size)
local maxrow = math.ceil(cs / row_size)
local row2_size = math.min(row_size, self:GetCapacity())
local row1_size = math.Clamp(self:GetCapacity() - row2_size, 0, row_size)
if c1 > row_size * 2 then
if row == maxrow then
row1_size = cs - row_size * (maxrow - 1)
row1_bullets = c1 - row_size * (maxrow - 1)
elseif c1 % row_size == 0 then
row1_bullets = row_size
else
row1_bullets = c1 % row_size
end
row2_bullets = row2_size
else
row2_bullets = math.min(row2_size, c1)
row1_bullets = math.min(row1_size, c1 - row2_bullets)
end
if row > 1 and row < lastrow then
rackrisetime = CurTime()
end
lastrow = row
if rackrisetime + 0.2 > CurTime() then
local rackrisedelta = ((rackrisetime + 0.2) - CurTime()) / 0.2
rackrise = rackrisedelta * (sb + TacRP.SS(1))
end
render.SetScissorRect(x, y, x + w, y + TacRP.SS(12) + sb + sb + 3, true)
for i = 1, row1_size do
if i >= row1_bullets - aps + 1 and i <= row1_bullets then
surface.SetDrawColor(col_hi)
elseif i > row1_bullets then
surface.SetDrawColor(col_dark)
elseif i % 5 == 0 then
surface.SetDrawColor(col_hi2)
else
surface.SetDrawColor(col)
end
surface.DrawRect(x + xoffset - (i * (sb + TacRP.SS(1))), y + TacRP.SS(12) + rackrise, sb, sb)
end
local hi_left = math.max(0, aps - row1_bullets)
for i = 1, row2_size do
if (i >= row2_bullets - aps + 1 and i <= row2_bullets and row1_bullets <= 0) or (row1_bullets > 0 and hi_left > 0 and i >= row2_bullets - hi_left + 1 and i <= row2_bullets) then
surface.SetDrawColor(col_hi)
elseif i > row2_bullets then
surface.SetDrawColor(col_dark)
elseif i % 5 == 0 then
surface.SetDrawColor(col_hi2)
else
surface.SetDrawColor(col)
end
if row1_size == 0 and row2_size <= 10 then
local m = 1.5
if row2_size <= 5 then
m = 2
end
surface.DrawRect(x + xoffset - (i * (sb * m + TacRP.SS(1))), y + TacRP.SS(12 + 1) + sb * (2 - m) / 2, sb * m, sb * m)
-- elseif row > 2 and i <= row - 2 then
-- surface.DrawRect(x + xoffset - (i * (sb + TacRP.SS(1))), y + TacRP.SS(12 + 1) + sb + rackrise, sb, sb)
-- surface.SetDrawColor(col_hi)
-- surface.DrawRect(x + xoffset - (i * (sb + TacRP.SS(1))) + sb / 2 - pw / 2, y + TacRP.SS(12 + 1) + sb + rackrise, pw, sb)
-- surface.DrawRect(x + xoffset - (i * (sb + TacRP.SS(1))), y + TacRP.SS(12 + 1) + sb + rackrise + sb / 2 - pw / 2, sb, pw)
else
surface.DrawRect(x + xoffset - (i * (sb + TacRP.SS(1))), y + TacRP.SS(12 + 1) + sb + rackrise, sb, sb)
end
end
end
render.SetScissorRect(0, 0, 0, 0, false)
if self.Primary.ClipSize <= 0 and ammotype == "" then
clips = ""
elseif ammotype == "" then
clips = "---"
elseif self.Primary.ClipSize > 0 then
surface.SetTextColor(col)
surface.SetTextPos(x + w - TacRP.SS(31), y + TacRP.SS(16))
surface.SetFont("TacRP_HD44780A00_5x8_6")
surface.DrawText("+")
if (self:GetValue("PrimaryGrenade") and TacRP.IsGrenadeInfiniteAmmo(self:GetValue("PrimaryGrenade"))) or (!self:GetValue("PrimaryGrenade") and self:GetInfiniteAmmo()) then
clips = "INF"
end
end
surface.SetTextColor(col)
surface.SetTextPos(x + w - TacRP.SS(25), y + TacRP.SS(12))
surface.SetFont("TacRP_HD44780A00_5x8_10")
surface.DrawText(clips)
else
if ammotype == "" then
clips = ""
elseif (self:GetValue("PrimaryGrenade") and TacRP.IsGrenadeInfiniteAmmo(self:GetValue("PrimaryGrenade"))) or (!self:GetValue("PrimaryGrenade") and self:GetInfiniteAmmo()) then
clips = "INF"
end
if self:GetValue("PrimaryGrenade") then
local nade = TacRP.QuickNades[self:GetValue("PrimaryGrenade")]
if nade.Icon then
local sg = TacRP.SS(32)
surface.SetMaterial(nade.Icon)
surface.SetDrawColor(255, 255, 255)
surface.DrawTexturedRect(x + TacRP.SS(4), y + h - sg + TacRP.SS(1), sg, sg)
end
surface.SetTextColor(col)
surface.SetTextPos(x + TacRP.SS(36), y + h - TacRP.SS(20))
surface.SetFont("TacRP_HD44780A00_5x8_14")
surface.DrawText("x" .. clips)
else
surface.SetTextColor(col)
surface.SetTextPos(x + TacRP.SS(36), y + TacRP.SS(12))
surface.SetFont("TacRP_HD44780A00_5x8_10")
surface.DrawText(clips)
end
end
if self:ShouldDrawBottomBar() then
surface.SetDrawColor(col)
surface.DrawLine(x + TacRP.SS(2), y + TacRP.SS(24), x + w - TacRP.SS(2), y + TacRP.SS(24))
self:DrawBottomBar(x, y, w, h)
end
if self:GetValue("Bipod") then
self:DrawBipodHint(x - h / 2 - TacRP.SS(4), y + h - TacRP.SS(10), h / 2)
end
local l_w = TacRP.SS(80)
local l_h = TacRP.SS(40)
local l_x = TacRP.SS(8)
local l_y = ScrH() - l_h - TacRP.SS(8)
local perc = LocalPlayer():Health() / LocalPlayer():GetMaxHealth()
surface.SetDrawColor(0, 0, 0, 150)
TacRP.DrawCorneredBox(l_x, l_y, l_w, l_h, col)
surface.SetTextPos(l_x + TacRP.SS(4), l_y + TacRP.SS(1))
surface.SetFont("TacRP_HD44780A00_5x8_10")
if perc <= 0.2 then
surface.SetTextColor(col_hi)
if math.sin(CurTime() * 7) > 0.5 then
surface.SetTextColor(col)
end
elseif perc <= 0.4 then
surface.SetTextColor(col_hi)
else
surface.SetTextColor(col)
end
surface.DrawText("")
local hpb_x = l_x + TacRP.SS(14)
local hpb_y = l_y + TacRP.SS(4)
local hpb_w = TacRP.SS(2)
local hpb_h = TacRP.SS(8)
local hpb_can = math.ceil(20 * perc)
hpb_can = math.min(hpb_can, 20)
for i = 1, 20 do
if hpb_can <= 2 then
surface.SetDrawColor(col_hi)
else
surface.SetDrawColor(col)
end
if hpb_can >= i then
surface.DrawRect(hpb_x + (i * (hpb_w + TacRP.SS(1))), hpb_y, hpb_w, hpb_h)
else
surface.DrawOutlinedRect(hpb_x + (i * (hpb_w + TacRP.SS(1))), hpb_y, hpb_w, hpb_h)
end
end
surface.SetDrawColor(col)
surface.DrawLine(l_x + TacRP.SS(2), l_y + TacRP.SS(15), l_x + l_w - TacRP.SS(2), l_y + TacRP.SS(15))
local face = "-_-"
local blindfiremode = self:GetBlindFireMode()
if blindfiremode == TacRP.BLINDFIRE_KYS then
if lastblindfiremode != blindfiremode then
shockedtime = CurTime() + 1
faceindex = math.random(1, 2)
end
end
lastblindfiremode = blindfiremode
if lastdmgtime + 1 > CurTime() then
face = ({
"#> <",
"(>Д<)",
"(@_@)",
"(ー;ー)",
"(・ロ・)",
"゛> <",
"(>_メ)",
"(*_*)",
"゜・+_+"
})[faceindex]
elseif shockedtime > CurTime() then
face = ({
";O-O;",
";>-<;",
})[faceindex]
elseif blindfiremode == TacRP.BLINDFIRE_KYS then
if math.sin(CurTime() * 1) > 0.995 then
face = ";>_<;"
else
face = ";o_o;"
end
elseif lasthealtime + 1 > CurTime() then
if perc >= 1 then
face = ({
"(^ω~)",
"(>ω^)",
"(>3^)",
"(^.~)",
"(・ω<)",
"(^.~)",
"♥(ツ)♥"
})[faceindex]
if lasthp < LocalPlayer():Health() then
lasthealtime = CurTime()
faceindex = math.random(1, 7)
end
else
face = ({
"(^w^)",
"('3')",
"(♡3♡)",
"(ПωП)",
"(>3<)",
"('w')",
"TYSM!"
})[faceindex]
end
else
if math.sin(CurTime() * 3) > 0.98 then
if perc < 0.1 then
face = "(>_<)"
elseif perc < 0.25 then
face = "(>_<)"
elseif perc < 0.5 then
face = "(>_<)"
elseif perc < 0.95 then
face = "(-_-)"
else
face = "(-_-)"
end
else
if perc < 0.1 then
face = "(×_×)"
elseif perc < 0.25 then
face = "(;_;)"
elseif perc < 0.5 then
face = "(゜_゜)"
elseif perc < 0.95 then
face = "('_')"
else
face = "(^_^)"
end
end
if lasthp > LocalPlayer():Health() then
lastdmgtime = CurTime()
faceindex = math.random(1, 8)
elseif lasthp < LocalPlayer():Health() or lastarmor < LocalPlayer():Armor() then
lasthealtime = CurTime()
faceindex = math.random(1, 7)
end
end
if LocalPlayer():GetNWBool("HasGodMode") or perc > 2.5 then
if math.sin(CurTime() * 3) > 0.96 then
face = "(UwU)"
else
face = "(OwO)"
end
end
surface.SetTextPos(l_x + TacRP.SS(4), l_y + TacRP.SS(22))
surface.SetFont("TacRP_HD44780A00_5x8_10")
surface.SetTextColor(col)
surface.DrawText(face)
lasthp = LocalPlayer():Health()
local armor = self:GetOwner():Armor()
local asq = TacRP.SS(8)
local ss = TacRP.SS(4)
local function drawarmorsquare(level, x, y)
if level == 1 then
surface.SetDrawColor(col)
surface.DrawOutlinedRect(x, y, asq, asq)
surface.DrawOutlinedRect(x + 1, y + 1, asq - 2, asq - 2)
elseif level == 2 then
surface.SetDrawColor(col)
surface.DrawRect(x + ((asq - ss) / 2), y + ((asq - ss) / 2), ss, ss)
surface.DrawOutlinedRect(x, y, asq, asq)
surface.DrawOutlinedRect(x + 1, y + 1, asq - 2, asq - 2)
else
surface.SetDrawColor(col)
surface.DrawRect(x, y, asq, asq)
end
end
local cx1 = l_x + l_w - TacRP.SS(20)
local cy1 = l_y + TacRP.SS(19)
local cx2 = cx1 + asq + 2
local cy2 = cy1 + asq + 2
surface.SetTextPos(cx1 - TacRP.SS(10), cy1 + TacRP.SS(3))
surface.SetFont("TacRP_HD44780A00_5x8_10")
surface.SetTextColor(col)
surface.DrawText("")
if armor >= 100 then
drawarmorsquare(3, cx1, cy1)
elseif armor > 75 then
drawarmorsquare(2, cx1, cy1)
else
drawarmorsquare(1, cx1, cy1)
end
if armor >= 75 then
drawarmorsquare(3, cx2, cy1)
elseif armor > 50 then
drawarmorsquare(2, cx2, cy1)
else
drawarmorsquare(1, cx2, cy1)
end
if armor >= 50 then
drawarmorsquare(3, cx2, cy2)
elseif armor > 25 then
drawarmorsquare(2, cx2, cy2)
else
drawarmorsquare(1, cx2, cy2)
end
if armor >= 25 then
drawarmorsquare(3, cx1, cy2)
elseif armor > 0 then
drawarmorsquare(2, cx1, cy2)
else
drawarmorsquare(1, cx1, cy2)
end
elseif TacRP.ConVars["minhud"]:GetBool() and self:ShouldDrawBottomBar() then
local bipod = self:GetValue("Bipod")
local w = TacRP.SS(110)
local h = TacRP.SS(16)
local x = ScrW() / 2 - w / 2
local y = ScrH() - h - TacRP.SS(8)
if bipod then x = x - h / 2 - TacRP.SS(2) end
surface.SetDrawColor(0, 0, 0, 150)
TacRP.DrawCorneredBox(x, y, w, h, col)
self:DrawBottomBar(x, y, w, h)
if bipod then
self:DrawBipodHint(x + w + TacRP.SS(4), y + h / 2, h)
end
end
end
if self:GetValue("Scope") or self:GetValue("PrimaryMelee") then
self:DrawBreathBar(ScrW() * 0.5, ScrH() * 0.65, TacRP.SS(64), TacRP.SS(4))
end
self:DrawGrenadeHUD()
self:DrawBlindFireHUD()
lastammo = self:Clip1()
lastarmor = LocalPlayer():Armor()
end
SWEP.Mat_Select = nil
function SWEP:DrawWeaponSelection(x, y, w, h, a)
if !self.Mat_Select then
self.Mat_Select = Material(self.IconOverride or "entities/" .. self:GetClass() .. ".png", "smooth mips")
end
surface.SetDrawColor(255, 255, 255, 255)
surface.SetMaterial(self.Mat_Select)
if self.IconOverride then
w = w - 128
x = x + 64
end
if w > h then
y = y - ((w - h) / 2)
end
surface.DrawTexturedRect(x, y, w, w)
end
function SWEP:RangeUnitize(range)
if TacRP.ConVars["metricunit"]:GetBool() then
return tostring(math.Round(range * TacRP.HUToM)) .. TacRP:GetPhrase("unit.meter")
else
return tostring(math.Round(range)) .. TacRP:GetPhrase("unit.hu")
end
end
function SWEP:CustomAmmoDisplay()
self.AmmoDisplay = self.AmmoDisplay or {}
self.AmmoDisplay.Draw = true
if TacRP.IsGrenadeInfiniteAmmo(self:GetGrenadeIndex()) then
self.AmmoDisplay.SecondaryAmmo = 99
end
if self.Primary.ClipSize <= 0 and self.Primary.Ammo != "" then
if self:GetValue("PrimaryGrenade") and TacRP.IsGrenadeInfiniteAmmo(self:GetValue("PrimaryGrenade")) then
self.AmmoDisplay.SecondaryAmmo = -1
self.AmmoDisplay.PrimaryClip = -1
self.AmmoDisplay.PrimaryAmmo = -1
else
self.AmmoDisplay.PrimaryClip = self:Ammo1()
self.AmmoDisplay.PrimaryAmmo = -1
end
elseif self.Primary.ClipSize <= 0 then
self.AmmoDisplay.PrimaryClip = -1
else
self.AmmoDisplay.PrimaryClip = self:Clip1()
self.AmmoDisplay.PrimaryAmmo = self:GetInfiniteAmmo() and 9999 or self:Ammo1()
end
return self.AmmoDisplay
end
local col2 = Color(50, 255, 50)
function SWEP:DrawLockOnHUD()
local owner = self:GetOwner()
local dir = owner:GetAimVector(true)
local tr = util.TraceLine({
start = owner:GetShootPos(),
endpos = owner:GetShootPos() + (dir * 50000),
mask = MASK_SHOT,
filter = owner
})
cam.Start3D()
local w2s = tr.HitPos:ToScreen()
sx = math.Round(w2s.x)
sy = math.Round(w2s.y)
cam.End3D()
local ss = ScreenScale(1)
if (self:GetScopeLevel() > 0 and self:GetValue("LockOnInSights")) or (self:GetScopeLevel() <= 0 and self:GetValue("LockOnOutOfSights")) then
surface.SetDrawColor(col2)
render.OverrideBlend(true, BLEND_ONE, BLEND_ONE, BLENDFUNC_ADD)
local trueFOV = self:WidescreenFix(self.TacRPLastFOV or 90)
local circle = (ScrH() / trueFOV) * self:GetValue("LockOnTrackAngle") + ss
local offset = 0
for i = 0, 15 do
local angle = (i / 8) * math.pi
local x1 = sx + math.cos(angle + offset) * circle
local y1 = sy + math.sin(angle + offset) * circle
local x2 = sx + math.cos(angle + offset + (math.pi * 1 / 8)) * circle
local y2 = sy + math.sin(angle + offset + (math.pi * 1 / 8)) * circle
surface.DrawLine(x1, y1, x2, y2)
end
if !IsValid(self:GetLockOnEntity()) then
local circle2 = (ScrH() / trueFOV) * 1 + ss
local offset2 = 0
for i = 0, 15 do
local angle = (i / 8) * math.pi
local x1 = sx + math.cos(angle + offset2) * circle2
local y1 = sy + math.sin(angle + offset2) * circle2
local x2 = sx + math.cos(angle + offset2 + (math.pi * 1 / 8)) * circle2
local y2 = sy + math.sin(angle + offset2 + (math.pi * 1 / 8)) * circle2
surface.DrawLine(x1, y1, x2, y2)
end
end
render.OverrideBlend(false, BLEND_ONE, BLEND_ONE, BLENDFUNC_ADD)
end
if !IsValid(self:GetLockOnEntity()) then return end
local pos = self:GetLockOnEntity():WorldSpaceCenter()
cam.Start3D()
local x, y = pos:ToScreen().x, pos:ToScreen().y
cam.End3D()
surface.SetDrawColor(col2)
render.OverrideBlend(true, BLEND_ONE, BLEND_ONE, BLENDFUNC_ADD)
local cross = ss * 10
local offset = (1 / 4) * math.pi
for i = 0, 3 do
local angle = (i / 2) * math.pi
local x1 = x + math.cos(angle + offset) * cross
local y1 = y + math.sin(angle + offset) * cross
local x2 = x + math.cos(angle + offset + (math.pi * 1 / 2)) * cross
local y2 = y + math.sin(angle + offset + (math.pi * 1 / 2)) * cross
surface.DrawLine(x1, y1, x2, y2)
end
if CurTime() >= self:GetValue("LockOnTime") + self:GetLockOnStartTime() then
-- Target locked, draw a diamond
local offset2 = 0
for i = 0, 5 do
local cross2 = cross * 0.7
local angle = (i / 2) * math.pi
local x1 = x + math.cos(angle + offset2) * cross2
local y1 = y + math.sin(angle + offset2) * cross2
local x2 = x + math.cos(angle + offset2 + (math.pi * 1 / 2)) * cross2
local y2 = y + math.sin(angle + offset2 + (math.pi * 1 / 2)) * cross2
surface.DrawLine(x1, y1, x2, y2)
end
end
render.OverrideBlend(false, BLEND_ONE, BLEND_ONE, BLENDFUNC_ADD)
end