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

3103 lines
118 KiB
Lua
Raw 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.

--[[
| 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 try_translate = ArcCW.TryTranslation
local defaultatticon = Material("arccw/hud/atts/default.png", "mips smooth")
local blockedatticon = Material("arccw/hud/atts/blocked.png", "mips smooth")
local bullseye = Material("arccw/hud/bullseye.png", "mips smooth")
local mat_hit = Material("arccw/hud/hit.png", "mips smooth")
local mat_hit_dot = Material("arccw/hud/hit_dot.png", "mips smooth")
local pickx_empty = Material("arccw/hud/pickx_empty.png", "mips smooth")
local pickx_full = Material("arccw/hud/pickx_filled.png", "mips smooth")
local bird = Material("arccw/hud/arccw_bird.png", "mips smooth")
local iconlock = Material("arccw/hud/locked_32.png", "mips smooth")
local iconunlock = Material("arccw/hud/unlocked_32.png", "mips smooth")
local col_fg = Color(255, 255, 255, 255)
local col_fg_tr = Color(255, 255, 255, 100)
local col_shadow = Color(0, 0, 0, 255)
local col_button = Color(0, 0, 0, 175)
local col_button_hv = Color(75, 75, 75, 175)
local col_mayomustard = Color(255, 255, 127)
local mayoicons = false
local col_block = Color(50, 0, 0, 175)
local col_block_txt = Color(175, 10, 10, 255)
local col_bad = Color(255, 50, 50, 255)
local col_good = Color(100, 255, 100, 255)
local col_info = Color(150, 150, 255, 255)
local col_unowned = col_block
local col_unowned_txt = col_block_txt
local ss, rss, thicc
local function ScreenScaleMulti(input)
return ScreenScale(input) * ArcCW.ConVars["hud_size"]:GetFloat()
end
local function LerpColor(d, col1, col2)
local r = Lerp(d, col1.r, col2.r)
local g = Lerp(d, col1.g, col2.g)
local b = Lerp(d, col1.b, col2.b)
local a = Lerp(d, col1.a, col2.a)
return Color(r, g, b, a)
end
local function DrawTextRot(span, txt, x, y, tx, ty, maxw, only)
local tw, th = surface.GetTextSize(txt)
span.TextRot = span.TextRot or {}
if tw > maxw then
local realx, realy = span:LocalToScreen(x, y)
render.SetScissorRect(realx, realy, realx + maxw, realy + (th * 2), true)
span.TextRot[txt] = span.TextRot[txt] or 0
if !only then
span.StartTextRot = span.StartTextRot or CurTime()
span.TextRotState = span.TextRotState or 0 -- 0: start, 1: moving, 2: end
if span.TextRotState == 0 then
span.TextRot[txt] = 0
if span.StartTextRot < CurTime() - 2 then
span.TextRotState = 1
end
elseif span.TextRotState == 1 then
span.TextRot[txt] = span.TextRot[txt] + (FrameTime() * ScreenScaleMulti(16))
if span.TextRot[txt] >= (tw - maxw) + ScreenScaleMulti(8) then
span.StartTextRot = CurTime()
span.TextRotState = 2
end
elseif span.TextRotState == 2 then
if span.StartTextRot < CurTime() - 2 then
span.TextRotState = 3
span.StartTextRot = CurTime()
end
elseif span.TextRotState == 3 then
span.TextRot[txt] = span.TextRot[txt] - (FrameTime() * ScreenScaleMulti(16))
if span.TextRot[txt] <= 0 then
span.StartTextRot = CurTime()
span.TextRotState = 0
end
end
end
surface.SetTextPos(tx - span.TextRot[txt], ty)
surface.DrawText(txt)
render.SetScissorRect(0, 0, 0, 0, false)
else
surface.DrawText(txt)
end
end
local function multlinetext(text, maxw, font)
local content = {}
local tline = ""
local x = 0
surface.SetFont(font)
local newlined = string.Split(text, "\n")
for _, line in pairs(newlined) do
local words = string.Split(line, " ")
for _, word in pairs(words) do
local tx = surface.GetTextSize(word)
if x + tx >= maxw then
table.insert(content, tline)
tline = ""
x = surface.GetTextSize(word)
end
tline = tline .. word .. " "
x = x + surface.GetTextSize(word .. " ")
end
table.insert(content, tline)
tline = ""
x = 0
end
return content
end
-- given fov and distance solve apparent size
local function solvetriangle(angle, dist)
local a = angle / 2
local b = dist
return b * math.tan(a) * 2
end
local hits_1 = {}
local hits_3 = {}
local function rollhit(radius)
local anglerand = math.Rand(0, 360)
local dist = math.Rand(0, radius)
local hit_x = math.sin(anglerand) * dist
local hit_y = math.cos(anglerand) * dist
return {x = hit_x, y = hit_y}
end
local function rollallhits(self, range_3, range_1)
hits_1 = {}
hits_3 = {}
local ang = self:GetBuff("AccuracyMOA") / 60
local radius_1 = solvetriangle(ang, range_1 * ArcCW.HUToM)
local radius_3 = solvetriangle(ang, range_3 * ArcCW.HUToM)
local hitcount = math.Clamp(math.max(math.Round(self:GetCapacity() / 4), math.Round(self:GetBuff("Num") * 2)), 10, 20)
for i = 1, hitcount do
table.insert(hits_1, rollhit(radius_1))
end
for i = 1, hitcount do
table.insert(hits_3, rollhit(radius_3))
end
end
local function RangeText(range)
local metres = tostring(math.Round(range)) .. "m"
local hu = tostring(math.Round(range / ArcCW.HUToM / 100) * 100) .. "HU"
return metres, hu
end
local shot_limit = 12
local max_shots = 8
local function shotstokill(mult, dmgmin, dmgmax, mran, sran)
-- for i, return range where i * damage == 100
-- return -1 if can't kill with i shots, math.huge if can kill at any range
local result = {}
for i = 1, shot_limit do
local req_damage = math.ceil(100 / mult / i) -- target damage to kill in i shots
if req_damage > dmgmin and req_damage > dmgmax then
-- cannot reach target damage ever
result[i] = -1
elseif req_damage <= dmgmin and req_damage <= dmgmax then
-- will always exceed target damage
result[i] = math.huge
elseif dmgmin < dmgmax then
-- damage decays over range
local frac = 1 - math.Clamp((req_damage - dmgmin) / (dmgmax - dmgmin), 0, 1)
result[i] = mran + frac * (sran - mran)
else
-- damage increases over range
local frac = math.Clamp((req_damage - dmgmax) / (dmgmin - dmgmax), 0, 1)
result[i] = mran + frac * (sran - mran)
end
end
return result
end
local function linepaintfunc(self2, w, h)
surface.SetDrawColor(Color(self2.Color.r, self2.Color.g, self2.Color.b, self2.Color.a * ArcCW.Inv_Fade))
surface.SetMaterial(pickx_full)
local imsize = h * 0.45
surface.DrawTexturedRect((h - imsize) / 2, ((h - imsize) / 2) + (ss * 2), imsize, imsize)
local tp = h + (ss * 2)
surface.SetFont("ArcCWC2_10_Glow")
surface.SetTextColor(col_shadow)
surface.SetTextPos(tp, 0)
DrawTextRot(self2, self2.Text, tp, 0, tp, 0, self2:GetWide() - tp)
surface.SetFont("ArcCWC2_10")
surface.SetTextColor(Color(self2.Color.r, self2.Color.g, self2.Color.b, self2.Color.a * ArcCW.Inv_Fade))
surface.SetTextPos(tp, 0)
DrawTextRot(self2, self2.Text, tp, 0, tp, 0, self2:GetWide() - tp, true)
end
local function headpaintfunc(self2, w, h)
local tp = 0
surface.SetFont("ArcCWC2_8_Glow")
surface.SetTextColor(col_shadow)
surface.SetTextPos(tp, 0)
DrawTextRot(self2, self2.Text, tp, 0, tp, 0, self2:GetWide() - tp)
surface.SetFont("ArcCWC2_8")
surface.SetTextColor(Color(self2.Color.r, self2.Color.g, self2.Color.b, self2.Color.a * ArcCW.Inv_Fade))
surface.SetTextPos(tp, 0)
DrawTextRot(self2, self2.Text, tp, 0, tp, 0, self2:GetWide() - tp, true)
end
function SWEP:ShowInventoryButton()
if ArcCW.ConVars["attinv_free"]:GetBool() then return false end
--if ArcCW.ConVars["attinv_lockmode"]:GetBool() then return false end
if !ArcCW.ConVars["enable_dropping"]:GetBool() then return false end
return true
end
function SWEP:GetSlotInstalled(i)
local slot = self.Attachments[i]
local installed = slot.Installed
if !installed then
for _, slot2 in pairs(slot.MergeSlots or {}) do
if !isnumber(slot2) then continue end
if self.Attachments[slot2] and self.Attachments[slot2].Installed then
installed = self.Attachments[slot2].Installed
break
elseif !self.Attachments[slot2] then
print("ERROR! No attachment " .. tostring(slot2))
end
end
end
return installed
end
-- 1: Customize
-- 2: Presets
-- 3: Inventory
ArcCW.Inv_SelectedMenu = 1
-- Selected inventory slot
SWEP.Inv_SelectedSlot = 0
SWEP.Inv_Scroll = {}
-- 1: Stats
-- 2: Trivia
-- 3: Ballistics
ArcCW.Inv_SelectedInfo = 1
ArcCW.Inv_Fade = 0.01
ArcCW.Inv_ShownAtt = nil
ArcCW.Inv_Hidden = false
function SWEP:CreateCustomize2HUD()
local cvar_reloadincust = ArcCW.ConVars["reloadincust"]
local cvar_cust_sounds = ArcCW.ConVars["cust_sounds"]
local cvar_darkunowned = ArcCW.ConVars["attinv_darkunowned"]
local cvar_lockmode = ArcCW.ConVars["attinv_lockmode"]
local cvar_truenames = ArcCW.ConVars["truenames"]
if cvar_darkunowned:GetBool() then
col_unowned = Color(0, 0, 0, 150)
col_unowned_txt = Color(150, 150, 150, 255)
else
col_unowned = col_block
col_unowned_txt = col_block_txt
end
ArcCW.Inv_ShownAtt = nil
local scrw, scrh = ScrW(), ScrH()
if vrmod and vrmod.IsPlayerInVR(self:GetOwner()) then
-- Other resolutions seem to cause stretching issues
scrw = 1366
scrh = 768
end
ArcCW.InvHUD = vgui.Create("DFrame")
local scrwmult = ArcCW.ConVars["hud_deadzone_x"]:GetFloat() * scrw
local scrhmult = ArcCW.ConVars["hud_deadzone_y"]:GetFloat() * scrh
ss = ArcCW.AugmentedScreenScale(1)
rss = ss -- REAL SCREEN SCALE
thicc = math.ceil(ss * 2)
scrw, scrh = scrw - scrwmult, scrh - scrhmult
local bar1_w = scrw / 4
local bar2_w = scrw / 5
local bar3_w = scrw / 2
local airgap_x = ss * 24
local airgap_y = ss * 24
local smallgap = ss * 4
local top_zone = ss * 24
local bottom_zone = ss * 40
local cornerrad = ss * 4
local bigbuttonheight = ss * 36
local smallbuttonheight = rss * 16
local function PaintScrollBar(panel, w, h)
local s = ss * 2
draw.RoundedBox(ss * 1, (w - s) / 2, 0, s, h, col_fg)
end
local function clearrightpanel()
if ArcCW.Inv_SelectedInfo == 1 then
ArcCW.InvHUD_FormWeaponStats()
elseif ArcCW.Inv_SelectedInfo == 2 then
ArcCW.InvHUD_FormWeaponTrivia()
elseif ArcCW.Inv_SelectedInfo == 3 then
ArcCW.InvHUD_FormWeaponBallistics()
end
end
ArcCW.Inv_Fade = 0.01
ArcCW.InvHUD:SetPos(0, 0)
ArcCW.InvHUD:SetSize(scrw, scrh)
ArcCW.InvHUD:Center()
ArcCW.InvHUD:SetDraggable(false)
ArcCW.InvHUD:SetText("")
ArcCW.InvHUD:SetTitle("")
ArcCW.InvHUD:ShowCloseButton(false)
ArcCW.InvHUD.Paint = function(self2)
if !IsValid(self) then
gui.EnableScreenClicker(false)
ArcCW.InvHUD:Remove()
return
end
if self:GetReloading() and !cvar_reloadincust:GetBool() then
ArcCW.InvHUD:Remove()
return
end
local st = 1 / 5
if self:GetState() == ArcCW.STATE_CUSTOMIZE and !ArcCW.Inv_Hidden then
ArcCW.Inv_Fade = math.Approach(ArcCW.Inv_Fade, 1, FrameTime() * 1 / st)
--print("nooo")
else
ArcCW.Inv_Fade = math.Approach(ArcCW.Inv_Fade, 0, FrameTime() * 1 / st)
--if (!game.SinglePlayer() and IsFirstTimePredicted() or true) and (self:GetState() != ArcCW.STATE_CUSTOMIZE or !ArcCW.Inv_Hidden) and ArcCW.Inv_Fade == 0 then ArcCW.InvHUD:Remove() end
--print(CurTime())
-- This'll completely screw up on multiplayer games and sometimes even singleplayer
end
col_fg = Color(255, 255, 255, Lerp(ArcCW.Inv_Fade, 0, 255))
col_mayomustard = Color(255, 255, 127, Lerp(ArcCW.Inv_Fade, 0, 255))
col_fg_tr = Color(255, 255, 255, Lerp(ArcCW.Inv_Fade, 0, 125))
col_shadow = Color(0, 0, 0, Lerp(ArcCW.Inv_Fade, 0, 255))
col_button = Color(0, 0, 0, Lerp(ArcCW.Inv_Fade, 0, 175))
col_block = Color(50, 0, 0, 175 * ArcCW.Inv_Fade)
col_block_txt = Color(175, 10, 10, Lerp(ArcCW.Inv_Fade, 0, 255))
if cvar_darkunowned:GetBool() then
col_unowned = Color(0, 0, 0, Lerp(ArcCW.Inv_Fade, 0, 150))
col_unowned_txt = Color(150, 150, 150, Lerp(ArcCW.Inv_Fade, 0, 255))
else
col_unowned = col_block
col_unowned_txt = col_block_txt
end
--col_bad = Color(255, 50, 50, 255 * ArcCW.Inv_Fade)
--col_good = Color(100, 255, 100, 255 * ArcCW.Inv_Fade)
--col_info = Color(75, 75, 255, 255 * ArcCW.Inv_Fade)
end
ArcCW.InvHUD.ActiveWeapon = self
ArcCW.InvHUD.OnRemove = function()
local close = false
if self:IsValid() and self:GetState() == ArcCW.STATE_CUSTOMIZE then
close = true
end
if LocalPlayer():GetActiveWeapon() != ArcCW.InvHUD.ActiveWeapon then
close = true
end
if close then
net.Start("arccw_togglecustomize")
net.WriteBool(false)
net.SendToServer()
if IsValid(self) and self.ToggleCustomizeHUD then
self:ToggleCustomizeHUD(false)
end
end
--print("INVHUD REMOVED", CurTime())
ArcCW.Inv_Fade = 0.01
gui.EnableScreenClicker(false)
end
if ArcCW.ConVars["attinv_onlyinspect"]:GetBool() then
return
end
local menu1_w = bar1_w - airgap_x
local menu1_h = scrh - (2 * airgap_y) - bottom_zone - top_zone + smallgap
local closebutton = vgui.Create("DButton", ArcCW.InvHUD)
closebutton:SetText("")
closebutton:SetPos(scrw - smallbuttonheight - airgap_x, smallgap)
closebutton:SetSize(rss * 24, bigbuttonheight)
closebutton.Paint = function(self2, w, h)
local col = col_fg
if self2:IsHovered() then
col = col_shadow
end
--draw.RoundedBox(ss * 1, 0, 0, w, h, Color(127, 127, 127, 127))
-- Comment me! But it'll show when the HUD is alive.
surface.SetTextColor(col_shadow)
surface.SetTextPos(ss * 8, 0)
surface.SetFont("ArcCWC2_24_Glow")
surface.DrawText("x")
surface.SetTextColor(col)
surface.SetTextPos(ss * 8, 0)
surface.SetFont("ArcCWC2_24")
surface.DrawText("x")
end
closebutton.DoClick = function(self2, clr, btn)
net.Start("arccw_togglecustomize")
net.WriteBool(false)
net.SendToServer()
if IsValid(self) and self.ToggleCustomizeHUD then
self:ToggleCustomizeHUD(false)
end
end
closebutton.DoRightClick = function(self2, clr, btn)
ArcCW.InvHUD:Remove()
end
local hidebutton = vgui.Create("DButton", ArcCW.InvHUD)
hidebutton:SetText("")
hidebutton:SetPos(scrw - smallbuttonheight * 2 - airgap_x, smallgap)
hidebutton:SetSize(smallbuttonheight, bigbuttonheight)
hidebutton.Paint = function(self2, w, h)
local col = col_fg
if self2:IsHovered() then
col = Color(col_shadow.r, col_shadow.g, col_shadow.b, col_shadow.a * ArcCW.Inv_Fade)
end
--draw.RoundedBox(ss * 1, 0, 0, w, h, Color(127, 127, 127, 127))
-- Comment me! But it'll show when the HUD is alive.
surface.SetTextColor(col_shadow)
surface.SetTextPos(ss * 8, ss * -4)
surface.SetFont("ArcCWC2_24_Glow")
surface.DrawText("_")
surface.SetTextColor(col)
surface.SetTextPos(ss * 8, ss * -4)
surface.SetFont("ArcCWC2_24")
surface.DrawText("_")
end
hidebutton.DoClick = function(self2, clr, btn)
if IsValid(self) and self.ToggleCustomizeHUD then
ArcCW.Inv_Hidden = !ArcCW.Inv_Hidden
gui.EnableScreenClicker(false)
end
end
-- Menu for attachment slots/presets
ArcCW.InvHUD_Menu1 = vgui.Create("DScrollPanel", ArcCW.InvHUD)
ArcCW.InvHUD_Menu1:SetPos(airgap_x, airgap_y + top_zone + smallgap)
ArcCW.InvHUD_Menu1:SetSize(menu1_w, menu1_h)
local scroll_1 = ArcCW.InvHUD_Menu1:GetVBar()
scroll_1.Paint = function() end
scroll_1.btnUp.Paint = function(span, w, h)
end
scroll_1.btnDown.Paint = function(span, w, h)
end
scroll_1.btnGrip.Paint = PaintScrollBar
local topframe = vgui.Create("DPanel", ArcCW.InvHUD)
topframe:SetSize(menu1_w, ss * 16)
topframe:SetPos(airgap_x, airgap_y + ss * 8)
topframe.Paint = function() end
local customizebutton = vgui.Create("DButton", topframe)
customizebutton:SetSize(ss * 90, ss * 16)
customizebutton:SetPos(0, 0)
customizebutton:SetText("")
customizebutton.Text = translate("ui.customize")
customizebutton.Val = 1
customizebutton.DoClick = function(self2, clr, btn)
ArcCW.Inv_SelectedMenu = 1
ArcCW.InvHUD_FormAttachments()
surface.PlaySound("weapons/arccw/hover.wav")
end
customizebutton.Paint = function(self2, w, h)
local col = col_button
local col2 = col_fg
if self2:IsHovered() or (ArcCW.Inv_SelectedMenu == self2.Val) then
col = col_fg_tr
col2 = col_shadow
end
draw.RoundedBox(cornerrad, 0, 0, w, h, col)
surface.SetFont("ArcCWC2_8")
local tw, th = surface.GetTextSize(self2.Text)
surface.SetFont("ArcCWC2_8_Glow")
surface.SetTextColor(col_shadow)
surface.SetTextPos((w - tw) / 2, (h - th) / 2)
surface.DrawText(self2.Text)
surface.SetFont("ArcCWC2_8")
surface.SetTextColor(col2)
surface.SetTextPos((w - tw) / 2, (h - th) / 2)
surface.DrawText(self2.Text)
end
local presetsbutton = vgui.Create("DButton", topframe)
presetsbutton:SetSize(ss * 80, ss * 16)
presetsbutton:SetPos(ss * 94, 0)
presetsbutton:SetText("")
presetsbutton.Text = translate("ui.presets")
presetsbutton.Val = 2
presetsbutton.DoClick = function(self2, clr, btn)
ArcCW.Inv_SelectedMenu = 2
ArcCW.InvHUD_FormPresets()
surface.PlaySound("weapons/arccw/hover.wav")
end
presetsbutton.Paint = customizebutton.Paint
if self:ShowInventoryButton() then
customizebutton:SetSize(ss * 60, ss * 16)
presetsbutton:SetSize(ss * 55, ss * 16)
presetsbutton:SetPos(ss * 65, 0)
local inventorybutton = vgui.Create("DButton", topframe)
inventorybutton:SetSize(ss * 50, ss * 16)
inventorybutton:SetPos(ss * 125, 0)
inventorybutton:SetText("")
inventorybutton.Text = translate("ui.inventory")
inventorybutton.Val = 3
inventorybutton.DoClick = function(self2, clr, btn)
ArcCW.Inv_SelectedMenu = 3
ArcCW.InvHUD_FormInventory()
surface.PlaySound("weapons/arccw/hover.wav")
end
inventorybutton.Paint = customizebutton.Paint
end
local menu2_x, menu2_y = ArcCW.InvHUD_Menu1:GetPos()
menu2_x = menu2_x + ArcCW.InvHUD_Menu1:GetWide() + smallgap
local menu2_w = bar2_w
local menu2_h = scrh - top_zone - airgap_y - airgap_y - (ss * 16)
-- Menu for attachments
ArcCW.InvHUD_Menu2 = vgui.Create("DScrollPanel", ArcCW.InvHUD)
ArcCW.InvHUD_Menu2:SetPos(menu2_x, menu2_y)
ArcCW.InvHUD_Menu2:SetSize(menu2_w, menu2_h)
-- ArcCW.InvHUD_Menu2.Paint = function(self2, w, h)
-- draw.RoundedBox(2, 0, 0, w, h, col_fg)
-- end
local scroll_2 = ArcCW.InvHUD_Menu2:GetVBar()
scroll_2.AlreadySet = false
scroll_2.Paint = function(self2, w, h)
if !self2.AlreadySet then
self2:SetScroll(self.Inv_Scroll[self.Inv_SelectedSlot or 0] or 0)
self2.AlreadySet = true
end
local scroll = self2:GetScroll()
self.Inv_Scroll[self.Inv_SelectedSlot or 0] = scroll
end
scroll_2.btnUp.Paint = function(span, w, h)
end
scroll_2.btnDown.Paint = function(span, w, h)
end
scroll_2.btnGrip.Paint = PaintScrollBar
function ArcCW.InvHUD_FormInventory()
if !IsValid(ArcCW.InvHUD) or !IsValid(self) then return end
ArcCW.InvHUD_Menu1:Clear()
ArcCW.InvHUD_Menu2:Clear()
self.Inv_SelectedSlot = nil
clearrightpanel()
local attinv = LocalPlayer().ArcCW_AttInv or {}
local atts = table.GetKeys(attinv)
table.sort(atts)
local str = nil
if #atts == 0 then
str = translate("ui.noatts")
elseif cvar_lockmode:GetBool() then
str = translate("ui.lockinv")
end
if str then
local msg = vgui.Create("DPanel", ArcCW.InvHUD_Menu1)
msg:SetText("")
msg:SetSize(menu2_w - (2 * ss), rss * 12)
msg:Dock(TOP)
msg.Paint = function(self2, w, h)
local old = DisableClipping(true)
surface.SetTextColor(col_shadow)
surface.SetTextPos(ss * 4, ss * 2)
surface.SetFont("ArcCWC2_12_Glow")
surface.DrawText(str)
--DrawTextRot(self2, str, ss * 4, 0, ss * 4, ss * 2, w - (ss * 4))
surface.SetTextColor(col_fg)
surface.SetTextPos(ss * 4, ss * 2)
surface.SetFont("ArcCWC2_12")
surface.DrawText(str)
--DrawTextRot(self2, str, ss * 4, 0, ss * 4, ss * 2, w - (ss * 4))
DisableClipping(old)
end
end
for i, k in ipairs(atts) do
if (ArcCW:PlayerGetAtts(self:GetOwner(), k) or 0) <= 0 then continue end
local atttbl = ArcCW.AttachmentTable[k or ""]
if atttbl.Free then continue end
local button = vgui.Create("DButton", ArcCW.InvHUD_Menu1)
button.att = k
button:SetText("")
button:SetSize(menu2_w - (2 * ss), smallbuttonheight)
button:DockMargin(0, smallgap, 0, 0)
button:Dock(TOP)
button.DoClick = function(self2, clr, btn)
if cvar_lockmode:GetBool() then return end
surface.PlaySound("weapons/arccw/uninstall.wav")
net.Start("arccw_asktodrop")
net.WriteUInt(ArcCW.AttachmentTable[self2.att].ID, 24)
net.SendToServer()
ArcCW:PlayerTakeAtt(self:GetOwner(), self2.att)
if (self:GetOwner().ArcCW_AttInv[self2.att] or 0) == 0 then
self2:Remove()
end
clearrightpanel()
end
button.DoRightClick = function(self2, clr, btn)
ArcCW.InvHUD_FormAttachmentStats(self2.att, self2.attslot)
end
button.Paint = function(self2, w, h)
local col = col_button
local col2 = col_fg
if self2:IsHovered() then
col = col_fg_tr
col2 = col_shadow
end
--[[]
if self2:IsHovered() then
ArcCW.InvHUD_FormAttachmentStats(self2.att, self2.attslot)
end
]]
draw.RoundedBox(cornerrad, 0, 0, w, h, col)
local icon_h = h
local buffer = 0
if !cvar_lockmode:GetBool() then
local amt = ArcCW:PlayerGetAtts(self:GetOwner(), self2.att) or 0
amt = math.min(amt, 99)
local amttxt = tostring(amt)
surface.SetFont("ArcCWC2_8")
local amt_w = surface.GetTextSize(amttxt)
-- surface.SetTextColor(col_shadow)
-- surface.SetFont("ArcCWC2_8_Glow")
-- surface.SetTextPos(w - amt_w - (ss * 1), h - (rss * 8) - (ss * 1))
-- surface.DrawText(amttxt)
surface.SetTextColor(col2)
surface.SetFont("ArcCWC2_8")
surface.SetTextPos(w - amt_w - (ss * 4), h - (rss * 8) - (ss * 1))
surface.DrawText(amttxt)
buffer = amt_w + (ss * 6)
end
local txt = translate("name." .. self2.att .. ".short") or atttbl.AbbrevName
if !txt then
txt = translate("name." .. self2.att) or atttbl.PrintName
end
surface.SetTextColor(atttbl.Ignore and col_mayomustard or col2)
surface.SetTextPos(icon_h + ss * 4, ss * 2)
surface.SetFont("ArcCWC2_12")
DrawTextRot(self2, txt, icon_h + (ss * 4), 0, icon_h + ss * 4, ss * 2, w - icon_h - (ss * 4) - buffer)
local icon = atttbl.Icon
if !icon or icon:IsError() then icon = bird end
surface.SetDrawColor(atttbl.Ignore and mayoicons and col_mayomustard or col2)
surface.SetMaterial(icon)
surface.DrawTexturedRect(ss * 2, 0, icon_h, icon_h)
end
end
end
function ArcCW.InvHUD_FormPresets()
if !IsValid(ArcCW.InvHUD) or !IsValid(self) then return end
ArcCW.InvHUD_Menu1:Clear()
ArcCW.InvHUD_Menu2:Clear()
self.Inv_SelectedSlot = nil
self.Preset_DeleteMode = false
clearrightpanel()
local framer = vgui.Create("DPanel", ArcCW.InvHUD_Menu1)
framer:SetSize(menu1_w, smallbuttonheight * 1.2)
framer:DockMargin(0, 0, 0, smallgap)
framer:Dock(TOP)
framer.Paint = function() end
local button = vgui.Create("DButton", framer)
button:SetText("")
button:Dock(LEFT)
button:SetWide(menu1_w * 0.5)
button:DockMargin(0, 0, smallgap, 0)
button.DoClick = function(self2, clr, btn)
self:CreatePresetSave()
surface.PlaySound("weapons/arccw/open.wav")
end
button.Paint = function(self2, w, h)
local col = col_button
local col2 = col_fg
if self2:IsHovered() then
col = col_fg_tr
col2 = col_shadow
end
draw.RoundedBox(cornerrad, 0, 0, w, h, col)
local preset_txt = translate("ui.createpreset") --"Create New Preset"
surface.SetFont("ArcCWC2_14")
surface.SetTextPos(ss * 4, ss * 0)
surface.SetTextColor(col2)
DrawTextRot(self2, preset_txt, 0, 0, ss * 4, ss * 0, w - ss * 4)
end
local remov = vgui.Create("DButton", framer)
remov:SetText("")
remov:Dock(FILL)
remov.DoClick = function(self2, clr, btn)
self.Preset_DeleteMode = !self.Preset_DeleteMode
surface.PlaySound(self.Preset_DeleteMode and "weapons/arccw/open.wav" or "weapons/arccw/close.wav")
end
remov.Paint = function(self2, w, h)
local col = col_button
local col2 = col_fg
if self.Preset_DeleteMode then
if self2:IsHovered() then
col = Color(200, 0, 0, Lerp(ArcCW.Inv_Fade, 0, 125))
col2 = col_shadow
else
col = Color(100, 0, 0, Lerp(ArcCW.Inv_Fade, 0, 175))
end
elseif self2:IsHovered() then
col = col_fg_tr
col2 = col_shadow
end
draw.RoundedBox(cornerrad, 0, 0, w, h, col)
local preset_txt = translate("ui.deletepreset")
surface.SetFont("ArcCWC2_14")
surface.SetTextPos(ss * 4, ss * 0)
surface.SetTextColor(col2)
DrawTextRot(self2, preset_txt, 0, 0, ss * 4, ss * 0, w - ss * 4)
end
local presetpanel = vgui.Create("DScrollPanel", ArcCW.InvHUD_Menu1)
presetpanel:SetSize(menu1_w, menu1_h - smallbuttonheight * 1.2 - smallgap)
presetpanel:SetPos(0, smallbuttonheight * 1.2 + smallgap)
local scroll_preset = presetpanel:GetVBar()
scroll_preset.Paint = function() end
scroll_preset.btnUp.Paint = function(span, w, h)
end
scroll_preset.btnDown.Paint = function(span, w, h)
end
scroll_preset.btnGrip.Paint = PaintScrollBar
local preset = {}
preset = self:GetPresets()
for i, k in pairs(preset) do
if string.StripExtension(k) == "autosave" then continue end
local load_btn = vgui.Create("DButton", presetpanel)
load_btn:SetText("")
load_btn.PresetName = string.StripExtension(k)
load_btn.PresetFile = k
load_btn:SetSize(menu1_w, smallbuttonheight)
load_btn:DockMargin(0, smallgap, 0, 0)
load_btn:Dock(TOP)
load_btn.DoClick = function(self2, clr, btn)
if !self.Preset_DeleteMode then
self.LastPresetName = self2.PresetName
self:LoadPreset(self2.PresetName)
else
file.Delete(ArcCW.PresetPath .. self:GetPresetBase() .. "/" .. self2.PresetFile)
self2:Remove()
surface.PlaySound("weapons/arccw/uninstall.wav")
end
end
--[[]
load_btn.DoRightClick = function(self2)
local filename = ArcCW.PresetPath .. self:GetPresetBase() .. "/" .. self2.PresetName .. ".txt"
file.Delete(filename)
self2:Remove()
end
]]
load_btn.Paint = function(self2, w, h)
local col = col_button
local col2 = col_fg
if self.Preset_DeleteMode then
if self2:IsHovered() then
col = Color(200, 0, 0, Lerp(ArcCW.Inv_Fade, 0, 125))
col2 = col_shadow
--else
-- col = Color(100, 0, 0, Lerp(ArcCW.Inv_Fade, 0, 175))
end
elseif self2:IsHovered() then
col = col_fg_tr
col2 = col_shadow
end
draw.RoundedBox(cornerrad, 0, 0, w, h, col)
local preset_txt = self2.PresetName:upper()
surface.SetFont("ArcCWC2_14")
surface.SetTextPos(ss * 4, ss * 0)
surface.SetTextColor(col2)
DrawTextRot(self2, preset_txt, 0, 0, ss * 4, ss * 0, w - ss * 4)
end
end
end
function ArcCW.InvHUD_FormAttachmentSelect()
if !IsValid(ArcCW.InvHUD) or !IsValid(self) then return end
ArcCW.InvHUD_Menu2:Clear()
local slot = self.Attachments[self.Inv_SelectedSlot or 0]
if !slot then return end
local atts = {}
local slots = {self.Inv_SelectedSlot}
local attCheck = {}
table.Add(slots, slot.MergeSlots or {})
for _, y in pairs(slots) do
for _, bruh in pairs(ArcCW:GetAttsForSlot((self.Attachments[y] or {}).Slot, self)) do
if attCheck[bruh] then continue end
table.insert(atts, {
att = bruh,
slot = y
})
attCheck[bruh] = true
end
end
atts[0] = {
att = "",
slot = self.Inv_SelectedSlot
}
table.sort(atts, function(a, b)
a = a.att or ""
b = b.att or ""
local atttbl_a = ArcCW.AttachmentTable[a]
local atttbl_b = ArcCW.AttachmentTable[b]
local order_a = 0
local order_b = 0
order_a = atttbl_a.SortOrder or order_a
order_b = atttbl_b.SortOrder or order_b
if order_a == order_b then
return (translate("name." .. a) or atttbl_a.PrintName or "") > (translate("name." .. b) or atttbl_b.PrintName or "")
end
return order_a > order_b
end)
local has = false
for _, att in pairs(atts) do
if !att then continue end
if !istable(att) then continue end
local show, _, _ = self:ValidateAttachment(att.att, nil, att.slot)
-- if !ArcCW.AttachmentTable[att] then continue end
if !show then continue end
has = (att.att != "")
local button = vgui.Create("DButton", ArcCW.InvHUD_Menu2)
button.att = att.att
button.attslot = att.slot
button:SetText("")
button:SetSize(menu2_w - (2 * ss), smallbuttonheight)
button:DockMargin(0, smallgap, 0, 0)
button:Dock(TOP)
button.DoClick = function(self2, clr, btn)
-- self.Inv_SelectedSlot = self2.attindex
-- ArcCW.InvHUD_FormAttachmentSelect()
-- self:DetachAllMergeSlots(self2.attslot, true)
--if ArcCW.ConVars["enable_customization"]:GetInt() < 0 then return end
if ArcCW:PlayerCanAttach(LocalPlayer(), self, self2.att, self2.attslot, false) then
if self2.att == "" then
self2:DoRightClick()
elseif self:Attach(self2.attslot, self2.att) then
ArcCW.Inv_ShownAtt = nil -- Force a regen on the panel so we can see toggle/slider options
ArcCW.InvHUD_FormAttachmentStats(self2.att, self2.attslot, true)
elseif self:CountAttachments() >= self:GetPickX() then
ArcCW.Inv_LastPickXBlock = CurTime()
end
else
if CLIENT then surface.PlaySound("items/medshotno1.wav") end
end
end
button.DoRightClick = function(self2)
if ArcCW:PlayerCanAttach(LocalPlayer(), self, self2.att, self2.attslot, true) then
self:DetachAllMergeSlots(self2.attslot)
ArcCW.InvHUD_FormAttachmentSelect()
else
if CLIENT then surface.PlaySound("items/medshotno1.wav") end
end
end
button.Paint = function(self2, w, h)
if !IsValid(ArcCW.InvHUD) or !IsValid(self) then return end
local col = col_button
local col2 = col_fg
local atttbl = ArcCW.AttachmentTable[self2.att or ""] or {}
local _, _, blocked, showqty = self:ValidateAttachment(att.att, nil, att.slot)
if blocked and atttbl.HideIfBlocked then self2:Remove() return end
local installed = self:GetSlotInstalled(self2.attslot)
if self2:IsHovered() or self2.att == installed or (self2.att == "" and !installed) then
col = col_fg_tr
col2 = col_shadow
-- self2:SetSize(menu2_w - (2 * ss), smallbuttonheight * 2)
-- else
-- self2:SetSize(menu2_w - (2 * ss), smallbuttonheight)
end
if self2:IsHovered() then
ArcCW.InvHUD_FormAttachmentStats(self2.att, self2.attslot, installed == self2.att)
end
local owned = ArcCW:PlayerGetAtts(self:GetOwner(), att.att) > 0
if blocked then
col = col_block
col2 = col_block_txt
elseif !owned and installed != self2.att then
col = col_unowned
col2 = col_unowned_txt
end
if !owned and installed != self2.att then
showqty = false
end
draw.RoundedBox(cornerrad, 0, 0, w, h, col)
local icon_h = h
if !self2.att or self2.att == "" then
local attslot = self.Attachments[self2.attslot]
local att_txt = self:GetBuff_Hook("Hook_GetDefaultAttName", self2.attslot, true) or attslot.DefaultAttName
att_txt = att_txt and try_translate(att_txt) or translate("attslot.noatt")
atttbl = {
PrintName = att_txt,
Icon = self:GetBuff_Hook("Hook_GetDefaultAttIcon", self2.attslot, true) or attslot.DefaultAttIcon or defaultatticon
}
end
local buffer = 0
if showqty then
local amt = ArcCW:PlayerGetAtts(self:GetOwner(), self2.att) or 0
amt = math.min(amt, 99)
local amttxt = tostring(amt)
surface.SetFont("ArcCWC2_8")
local amt_w = surface.GetTextSize(amttxt)
-- surface.SetTextColor(col_shadow)
-- surface.SetFont("ArcCWC2_8_Glow")
-- surface.SetTextPos(w - amt_w - (ss * 1), h - (rss * 8) - (ss * 1))
-- surface.DrawText(amttxt)
surface.SetTextColor(col2)
surface.SetFont("ArcCWC2_8")
surface.SetTextPos(w - amt_w - (ss * 4), h - (rss * 8) - (ss * 1))
surface.DrawText(amttxt)
buffer = amt_w + (ss * 6)
end
local txt = translate("name." .. self2.att .. ".short") or atttbl.AbbrevName
if !txt then
txt = translate("name." .. self2.att) or atttbl.PrintName
end
surface.SetTextColor(atttbl.Ignore and col_mayomustard or col2)
surface.SetTextPos(icon_h + ss * 4, ss * 2)
surface.SetFont("ArcCWC2_12")
DrawTextRot(self2, txt, icon_h + (ss * 4), 0, icon_h + ss * 4, ss * 2, w - icon_h - (ss * 4) - buffer)
local icon = atttbl.Icon
if !icon or icon:IsError() then icon = bird end
surface.SetDrawColor(atttbl.Ignore and mayoicons and col_mayomustard or col2)
surface.SetMaterial(icon)
surface.DrawTexturedRect(ss * 2, 0, icon_h, icon_h)
end
end
if table.Count(atts) > 1 and !has then
local msg = vgui.Create("DPanel", ArcCW.InvHUD_Menu2)
msg:SetText("")
msg:SetSize(menu2_w - (2 * ss), smallbuttonheight)
msg:Dock(TOP)
msg.Paint = function(self2, w, h)
local txt = translate("ui.noatts_slot")
surface.SetTextColor(col_shadow)
surface.SetTextPos(ss * 4, ss * 2)
surface.SetFont("ArcCWC2_10_Glow")
DrawTextRot(self2, txt, ss * 4, 0, ss * 4, ss * 2, w - (ss * 4))
surface.SetTextColor(col_fg)
surface.SetTextPos(ss * 4, ss * 2)
surface.SetFont("ArcCWC2_10")
DrawTextRot(self2, txt, ss * 4, 0, ss * 4, ss * 2, w - (ss * 4))
end
end
end
-- add attachments
function ArcCW.InvHUD_FormAttachments()
if !IsValid(ArcCW.InvHUD) or !IsValid(self) then return end
ArcCW.InvHUD_Menu1:Clear()
for i, slot in pairs(self.Attachments) do
if !istable(slot) then continue end
if !slot.PrintName then continue end
if i == "BaseClass" then continue end
if slot.Hidden or slot.Blacklisted then continue end
if slot.Integral then continue end
local button = vgui.Create("DButton", ArcCW.InvHUD_Menu1)
button.attindex = i
button:SetText("")
button:SetSize(menu1_w, bigbuttonheight)
button:DockMargin(0, 0, 0, smallgap)
button:Dock(TOP)
button.DoClick = function(self2, clr, btn)
if self.Inv_SelectedSlot == self2.attindex then
self.Inv_SelectedSlot = nil
ArcCW.InvHUD_Menu2:Clear()
clearrightpanel()
if cvar_cust_sounds:GetBool() then surface.PlaySound("weapons/arccw/close.wav") end
else
local aslot = self.Attachments[i]
if self:CheckFlags(aslot.ExcludeFlags, aslot.RequireFlags) then
self.Inv_SelectedSlot = self2.attindex
ArcCW.InvHUD_FormAttachmentSelect()
ArcCW.InvHUD_FormAttachmentStats(self2.attindex, self2.attindex, true)
if cvar_cust_sounds:GetBool() then surface.PlaySound("weapons/arccw/open.wav") end
end
end
end
button.DoRightClick = function(self2)
if ArcCW:PlayerCanAttach(LocalPlayer(), self, nil, self2.attindex, true) then
self:DetachAllMergeSlots(self2.attindex)
ArcCW.InvHUD_FormAttachmentSelect()
else
if CLIENT then surface.PlaySound("items/medshotno1.wav") end
end
end
button.Paint = function(self2, w, h)
if !IsValid(ArcCW.InvHUD) or !IsValid(self) then return end
local col = col_button
local col2 = col_fg
if self2:IsHovered() or self.Inv_SelectedSlot == self2.attindex then
col = col_fg_tr
col2 = col_shadow
end
local aslot = self.Attachments[i]
if !self:CheckFlags(aslot.ExcludeFlags, aslot.RequireFlags) then
col = col_block
col2 = col_block_txt
end
draw.RoundedBox(cornerrad, 0, 0, w, h, col)
local installed = self:GetSlotInstalled(i)
local att_icon = self:GetBuff_Hook("Hook_GetDefaultAttIcon", i, true) or slot.DefaultAttIcon or defaultatticon
local att_txt = self:GetBuff_Hook("Hook_GetDefaultAttName", i, true) or slot.DefaultAttName
att_txt = att_txt and try_translate(att_txt) or translate("attslot.noatt")
local atttbl = ArcCW.AttachmentTable[installed or ""]
if atttbl then
att_txt = translate("name." .. installed .. ".short") or atttbl.AbbrevName
if !att_txt then
att_txt = translate("name." .. installed) or atttbl.PrintName
end
att_icon = atttbl and atttbl.Icon
if !att_icon or att_icon:IsError() then att_icon = bird end
end
local slot_txt = try_translate(slot.PrintName)
surface.SetDrawColor((atttbl and atttbl.Ignore and mayoicons and col_mayomustard) or col2)
local icon_h = h
surface.SetMaterial(att_icon)
surface.DrawTexturedRect(w - icon_h - ss * 2, 0, icon_h, icon_h)
surface.SetTextColor((atttbl and atttbl.Ignore and col_mayomustard) or col2)
surface.SetFont("ArcCWC2_10")
surface.SetTextPos(ss * 6, ss * 4)
DrawTextRot(self2, slot_txt, 0, 0, ss * 6, ss * 4, w - icon_h - ss * 4)
-- surface.DrawText(slot.PrintName)
surface.SetFont("ArcCWC2_14")
surface.SetTextPos(ss * 6, ss * 14)
DrawTextRot(self2, att_txt, 0, 0, ss * 6, ss * 14, w - icon_h - ss * 4)
end
end
local pickxpanel = vgui.Create("DPanel", ArcCW.InvHUD)
pickxpanel:SetSize(menu1_w - ArcCW.InvHUD_Menu1:GetVBar():GetWide(), bottom_zone - smallgap * 4)
pickxpanel:SetPos(airgap_x, scrh - bottom_zone - smallgap * 4)
pickxpanel.Paint = function(self2, w, h)
if !IsValid(ArcCW.InvHUD) or !IsValid(self) then return end
local pickx_amount = self:GetPickX()
local pickedatts = self:CountAttachments()
local col_fg_pick = col_fg
local d = 0.5
local diff = CurTime() - (ArcCW.Inv_LastPickXBlock or 0 + d)
if diff > 0 then
col_fg_pick = Color(255, 255 * diff / d, 255 * diff / d, 255*ArcCW.Inv_Fade)
end
if pickx_amount == 0 then return end
if pickx_amount > 8 then
surface.SetFont("ArcCWC2_16")
local txt = string.format(translate("ui.pickx"), pickedatts, pickx_amount)
local s = surface.GetTextSize(txt)
surface.SetTextColor(col_fg_pick)
surface.SetTextPos(w / 2 - s / 2, ss * 4)
surface.DrawText(txt)
return
end
local x = 0
local y = ss * 4
local s = ss * 20
x = (w - (s * pickx_amount)) / 2
local icons = {}
for k, v in pairs(self.Attachments) do
if v.Installed and !v.FreeSlot and !ArcCW.AttachmentTable[v.Installed].IgnorePickX then
local icon = (ArcCW.AttachmentTable[v.Installed] or {}).Icon or defaultatticon
if !icon or icon:IsError() then icon = bird end
table.insert(icons, icon)
end
end
for i = 1, pickx_amount do
surface.SetDrawColor(col_fg_pick)
if i > pickedatts then
surface.SetMaterial(pickx_empty)
else
surface.SetMaterial(pickx_full)
end
surface.DrawTexturedRect(x, y, s, s)
if i <= pickedatts and icons[i] then
surface.SetDrawColor(col_shadow)
surface.SetMaterial(icons[i])
surface.DrawTexturedRect(x + ss * 3, y + ss * 3, ss * 14, ss * 14)
end
x = x + s
end
end
end
local menu3_h = scrh - airgap_y - bottom_zone
local menu3_w = bar3_w
-- weapon details
ArcCW.InvHUD_Menu3 = vgui.Create("DScrollPanel", ArcCW.InvHUD)
ArcCW.InvHUD_Menu3:SetPos(scrw - menu3_w, airgap_y + smallgap)
ArcCW.InvHUD_Menu3:SetSize(menu3_w, menu3_h)
function ArcCW.InvHUD_FormAttachmentStats(att, slot, equipped)
if ArcCW.Inv_ShownAtt == att then
return
end
if isnumber(att) then
local installed = self:GetSlotInstalled(att)
att = installed
end
if !att then
clearrightpanel()
return
end
local atttbl = ArcCW.AttachmentTable[att]
if !atttbl then return end
ArcCW.InvHUD_Menu3:Clear()
ArcCW.Inv_ShownAtt = att
local s = ss * 250
local bgim = vgui.Create("DLabel", ArcCW.InvHUD_Menu3)
bgim:SetText("")
bgim:SetPos(menu3_w - s - (ss * 25), 0)
bgim:SetSize(s, s)
bgim.Paint = function(self2, w, h)
local icon = atttbl.Icon
if !icon or icon:IsError() then icon = bird end
surface.SetDrawColor(255, 255, 255, 25 * ArcCW.Inv_Fade)
surface.SetMaterial(icon)
surface.DrawTexturedRect(0, 0, w, h)
end
local attname_panel = vgui.Create("DPanel", ArcCW.InvHUD_Menu3)
attname_panel:SetSize(menu3_w, rss * 24)
attname_panel:SetPos(0, rss * 16)
attname_panel.Paint = function(self2, w, h)
local name = translate("name." .. atttbl.ShortName) or atttbl.PrintName
surface.SetFont("ArcCWC2_24")
local tw = surface.GetTextSize(name)
surface.SetTextColor(col_shadow)
surface.SetFont("ArcCWC2_24_Glow")
surface.SetTextPos(w - tw - airgap_x, 0)
DrawTextRot(self2, name, 0, 0, 0, 0, w - airgap_x)
surface.SetTextColor(col_fg)
surface.SetFont("ArcCWC2_24")
surface.SetTextPos(w - tw - airgap_x, 0)
DrawTextRot(self2, name, 0, 0, 0, 0, w - airgap_x, true)
end
local scroll = vgui.Create("DScrollPanel", ArcCW.InvHUD_Menu3)
--scroll:SetSize(menu3_w - airgap_x, ss * 128)
--scroll:SetPos(0, rss * 32 + ss * 16)
local scroll_bar = scroll:GetVBar()
scroll_bar.Paint = function() end
scroll_bar.btnUp.Paint = function(span, w, h)
end
scroll_bar.btnDown.Paint = function(span, w, h)
end
scroll_bar.btnGrip.Paint = PaintScrollBar
local bottombuffer = 0
local m_w = menu3_w * 0.75
local leftbuffer = 0
if equipped and self.Attachments[slot].SlideAmount and !atttbl.MountPositionOverride then
local slider = vgui.Create("DButton", ArcCW.InvHUD_Menu3)
slider:SetSize(m_w * 2 / 3, rss * 10)
slider:SetPos(0, rss * 16 + rss * 24 + ss * 128 - (rss * 10))
slider:SetText("")
slider.Dragging = false
slider.NextDrag = 0
slider.OnRemove = function(self2)
self:SendDetail_SlidePos(slot)
self:SavePreset("autosave")
end
slider.Paint = function(self2, w, h)
local col = col_button
local col2 = col_fg
if self2:IsHovered() or self2.Dragging then
col = col_fg_tr
col2 = col_shadow
end
draw.RoundedBox(cornerrad, 0, 0, w, h, col)
local linebuffer = ss * 8
local line_w = w - (linebuffer * 2)
if self2.Dragging or (self2:IsHovered() and input.IsMouseDown(MOUSE_LEFT)) then
local x, _ = self2:LocalCursorPos()
local mouse_line_x = x - linebuffer
local delta = mouse_line_x / line_w
delta = math.Clamp(delta, 0, 1)
if self.Attachments[slot].SlidePos != delta and self2.NextDrag <= CurTime() then
-- local amt = math.abs(self.Attachments[slot].SlidePos - delta)
EmitSound("weapons/arccw/dragatt.wav", EyePos(), -2, CHAN_ITEM, 1,75, 0, math.Clamp(90+(delta * 20), 90, 110))
self2.NextDrag = CurTime() + 0.05
end
self.Attachments[slot].SlidePos = delta
self2.Dragging = true
if !input.IsMouseDown(MOUSE_LEFT) then
self2.Dragging = false
self:SetupActiveSights()
self:SendDetail_SlidePos(slot)
self:SavePreset("autosave")
end
end
local slide = (self.Attachments[slot] or {}).SlidePos or 0.5
surface.SetDrawColor(col2)
surface.DrawLine(linebuffer, h / 2, w - linebuffer, h / 2)
local rect_x = slide * line_w + linebuffer
local rect_w = ss * 6
surface.DrawRect(rect_x - (rect_w / 2), (h - rect_w) / 2, rect_w, rect_w)
end
leftbuffer = m_w * 2 / 3
bottombuffer = bottombuffer + rss * 10
end
if equipped and atttbl.ToggleStats then
local toggle = vgui.Create("DButton", ArcCW.InvHUD_Menu3)
toggle:SetSize(m_w * 1 / 3 - rss * 2, rss * 10)
toggle:SetPos(leftbuffer + (ss * 4), rss * 16 + rss * 24 + ss * 128 - (rss * 10))
toggle:SetText("")
toggle.OnMousePressed = function(self2, kc)
if kc == MOUSE_LEFT then
self:ToggleSlot(slot)
elseif kc == MOUSE_RIGHT then
self:ToggleSlot(slot, nil, nil, true)
end
end
toggle.Paint = function(self2, w, h)
local col = col_button
local col2 = col_fg
if self2:IsHovered() or ArcCW.Inv_SelectedInfo == self2.Val then
col = col_fg_tr
col2 = col_shadow
end
draw.RoundedBox(cornerrad, 0, 0, w, h, col)
local txt = (translate("ui.toggle"))
local catttbl = ArcCW.AttachmentTable[att]
if catttbl and catttbl.ToggleStats[self.Attachments[slot].ToggleNum]
and catttbl.ToggleStats[self.Attachments[slot].ToggleNum].PrintName then
txt = try_translate(catttbl.ToggleStats[self.Attachments[slot].ToggleNum].PrintName)
end
surface.SetFont("ArcCWC2_8")
local tw, th = surface.GetTextSize(txt)
surface.SetFont("ArcCWC2_8_Glow")
surface.SetTextColor(col_shadow)
surface.SetTextPos((w - tw) / 2, (h - th) / 2)
surface.DrawText(txt)
surface.SetFont("ArcCWC2_8")
surface.SetTextColor(col2)
surface.SetTextPos((w - tw) / 2, (h - th) / 2)
surface.DrawText(txt)
end
local togglelock = vgui.Create("DButton", ArcCW.InvHUD_Menu3)
togglelock:SetSize(rss * 10, rss * 10)
togglelock:SetPos(leftbuffer + (ss * 4) + m_w * 1 / 3, rss * 16 + rss * 24 + ss * 128 - (rss * 10))
togglelock:SetText("")
togglelock.OnMousePressed = function(self2, kc)
self.Attachments[slot].ToggleLock = !self.Attachments[slot].ToggleLock
if self.Attachments[slot].ToggleLock then
self:EmitSound("weapons/arccw/dragatt.wav", 0, 150)
else
self:EmitSound("weapons/arccw/dragatt.wav", 0, 80)
end
end
togglelock.Paint = function(self2, w, h)
local col = col_button
local col2 = col_fg
if self2:IsHovered() or ArcCW.Inv_SelectedInfo == self2.Val then
col = col_fg_tr
col2 = col_shadow
end
draw.RoundedBox(cornerrad, 0, 0, w, h, col)
surface.SetDrawColor(col2.r, col2.g, col2.b)
surface.SetMaterial(self.Attachments[slot].ToggleLock and iconlock or iconunlock)
surface.DrawTexturedRect(4, 4, w - 8, h - 8)
end
bottombuffer = bottombuffer + rss * 10
end
scroll:SetPos(0, rss * 32 + ss * 16 + bottombuffer)
scroll:SetSize(menu3_w - airgap_x, ss * 128 - bottombuffer)
local multiline = {}
local desc = translate("desc." .. atttbl.ShortName) or translate(atttbl.Description) or atttbl.Description
multiline = multlinetext(desc, scroll:GetWide() - (ss * 2), "ArcCW_10")
local desc_title = vgui.Create("DPanel", scroll)
desc_title:SetSize(scroll:GetWide(), rss * 8)
desc_title:SetPos(0, 0)
desc_title.Paint = function(self2, w, h)
surface.SetFont("ArcCWC2_8")
local txt = translate("trivia.description")
local tw_1 = surface.GetTextSize(txt)
surface.SetFont("ArcCWC2_8_Glow")
surface.SetTextColor(col_shadow)
surface.SetTextPos(w - tw_1, 0)
surface.DrawText(txt)
surface.SetFont("ArcCWC2_8")
surface.SetTextColor(col_fg)
surface.SetTextPos(w - tw_1, 0)
surface.DrawText(txt)
end
for i, text in pairs(multiline) do
local desc_line = vgui.Create("DPanel", scroll)
desc_line:SetSize(scroll:GetWide(), rss * 10)
desc_line:SetPos(0, (rss * 10 * i) - (rss * 2))
desc_line.Paint = function(self2, w, h)
surface.SetFont("ArcCWC2_10")
local tw = surface.GetTextSize(text)
surface.SetFont("ArcCWC2_10_Glow")
surface.SetTextColor(col_shadow)
surface.SetTextPos(w - tw, 0)
surface.DrawText(text)
surface.SetFont("ArcCWC2_10")
surface.SetTextColor(col_fg)
surface.SetTextPos(w - tw, 0)
surface.DrawText(text)
end
end
local scroll_pros = vgui.Create("DScrollPanel", ArcCW.InvHUD_Menu3)
scroll_pros:SetSize(menu3_w, ss * 172)
scroll_pros:SetPos(0, menu3_h - (ss * 172))
scroll_pros.Paint = function() end
local scroll_bar_pros = scroll_pros:GetVBar()
scroll_bar_pros.Paint = function() end
scroll_bar_pros.btnUp.Paint = function(span, w, h)
end
scroll_bar_pros.btnDown.Paint = function(span, w, h)
end
scroll_bar_pros.btnGrip.Paint = PaintScrollBar
-- Don't have stats disappear due to toggle state
local pros, cons, infos = ArcCW:GetProsCons(self, atttbl) -- self.Attachments[slot].ToggleNum
pros = pros or {}
cons = cons or {}
infos = infos or {}
local p_w = menu3_w / 2
local pan_pros = vgui.Create("DPanel", scroll_pros)
pan_pros:SetPos(0, 0)
pan_pros.Paint = function() end
local pan_cons = vgui.Create("DPanel", scroll_pros)
pan_cons:SetPos(#pros > 0 and (menu3_w * 1 / 2) or 0, 0)
pan_cons.Paint = function() end
local pan_infos
if #infos > 0 then
pan_infos = vgui.Create("DPanel", scroll_pros)
pan_infos:SetWide(menu3_w)
pan_infos.Paint = function() end
end
p_w = (pan_pros and pan_cons) and (menu3_w / 2) or p_w
if #pros > 0 then
local pan_head = vgui.Create("DPanel", pan_pros)
pan_head:SetTall(rss * 8)
pan_head:Dock(TOP)
pan_head.Paint = headpaintfunc
pan_head.Text = translate("ui.positives")
pan_head.Color = col_good
end
if #cons > 0 then
local pan_head = vgui.Create("DPanel", pan_cons)
pan_head:SetTall(rss * 8)
pan_head:Dock(TOP)
pan_head.Paint = headpaintfunc
pan_head.Text = translate("ui.negatives")
pan_head.Color = col_bad
end
for i, line in pairs(pros) do
if !line or line == "" then continue end
local pan_line = vgui.Create("DPanel", pan_pros)
pan_line:SetSize(p_w, rss * 10)
pan_line:SetPos(0, rss * 10 * i)
pan_line.Paint = linepaintfunc
pan_line.Text = line
pan_line.Color = col_good
end
pan_pros:SizeToChildren(true, true)
for i, line in pairs(cons) do
if !line or line == "" then continue end
local pan_line = vgui.Create("DPanel", pan_cons)
pan_line:SetSize(p_w, rss * 10)
pan_line:SetPos(0, rss * 10 * i)
pan_line.Paint = linepaintfunc
pan_line.Text = line
pan_line.Color = col_bad
end
pan_cons:SizeToChildren(true, true)
if #infos > 0 then
local pan_head = vgui.Create("DPanel", pan_infos)
pan_head:SetTall(rss * 8)
pan_head:Dock(TOP)
pan_head.Paint = headpaintfunc
pan_head.Text = translate("ui.information")
pan_head.Color = col_info
for i, line in pairs(infos) do
if !line or line == "" then continue end
local pan_line = vgui.Create("DPanel", pan_infos)
pan_line:SetSize(menu3_w, rss * 10)
pan_line:SetPos(0, rss * 10 * i)
pan_line.Paint = linepaintfunc
pan_line.Text = line
pan_line.Color = col_info
end
-- We can't do this on initialize because SizeToChildren isn't called yet
local h = math.max(pan_pros and pan_pros:GetTall() or 0, pan_cons and pan_cons:GetTall() or 0)
h = (h > 0) and (h + rss * 10) or 0 -- if only info, don't add padding
pan_infos:SetPos(0, h)
pan_infos:SizeToChildren(true, true)
end
end
function ArcCW.InvHUD_FormStatsTriviaBar()
if !IsValid(ArcCW.InvHUD) or !IsValid(self) then return end
local statsbutton = vgui.Create("DButton", ArcCW.InvHUD_Menu3)
statsbutton:SetSize(ss * 48, ss * 16)
statsbutton:SetPos(menu3_w - (ss * 48 * 2) - airgap_x - (ss * 4), rss * 48 + ss * 12)
statsbutton:SetText("")
statsbutton.Text = translate("ui.stats")
statsbutton.Val = 1
statsbutton.DoClick = function(self2, clr, btn)
ArcCW.InvHUD_FormWeaponStats()
ArcCW.Inv_SelectedInfo = 1
end
statsbutton.Paint = function(self2, w, h)
local col = col_button
local col2 = col_fg
if self2:IsHovered() or ArcCW.Inv_SelectedInfo == self2.Val then
col = col_fg_tr
col2 = col_shadow
end
draw.RoundedBox(cornerrad, 0, 0, w, h, col)
surface.SetFont("ArcCWC2_8")
local tw, th = surface.GetTextSize(self2.Text)
surface.SetFont("ArcCWC2_8_Glow")
surface.SetTextColor(col_shadow)
surface.SetTextPos((w - tw) / 2, (h - th) / 2)
surface.DrawText(self2.Text)
surface.SetFont("ArcCWC2_8")
surface.SetTextColor(col2)
surface.SetTextPos((w - tw) / 2, (h - th) / 2)
surface.DrawText(self2.Text)
end
local triviabutton = vgui.Create("DButton", ArcCW.InvHUD_Menu3)
triviabutton:SetSize(ss * 48, ss * 16)
triviabutton:SetPos(menu3_w - ss * 48 - airgap_x, rss * 48 + ss * 12)
triviabutton:SetText("")
triviabutton.Text = translate("ui.trivia")
triviabutton.Val = 2
triviabutton.DoClick = function(self2, clr, btn)
ArcCW.InvHUD_FormWeaponTrivia()
ArcCW.Inv_SelectedInfo = 2
end
triviabutton.Paint = statsbutton.Paint
local ballisticsbutton = vgui.Create("DButton", ArcCW.InvHUD_Menu3)
ballisticsbutton:SetSize(ss * 48, ss * 16)
ballisticsbutton:SetPos(menu3_w - (ss * 48 * 3) - airgap_x - (ss * 4 * 2), rss * 48 + ss * 12)
ballisticsbutton:SetText("")
ballisticsbutton.Text = translate("ui.ballistics")
ballisticsbutton.Val = 3
ballisticsbutton.DoClick = function(self2, clr, btn)
ArcCW.InvHUD_FormWeaponBallistics()
ArcCW.Inv_SelectedInfo = 3
end
ballisticsbutton.Paint = statsbutton.Paint
end
function ArcCW.InvHUD_FormWeaponName()
if !IsValid(ArcCW.InvHUD) or !IsValid(self) then return end
ArcCW.InvHUD_FormStatsTriviaBar()
local weapon_title = vgui.Create("DPanel", ArcCW.InvHUD_Menu3)
weapon_title:SetSize(menu3_w, rss * 32)
weapon_title:SetPos(0, 0)
weapon_title.Paint = function(self2, w, h)
if !IsValid(ArcCW.InvHUD) or !IsValid(self) then return end
local name = translate("name." .. self:GetClass() .. (cvar_truenames:GetBool() and ".true" or "")) or translate(self.PrintName) or self.PrintName
surface.SetFont("ArcCWC2_32")
local tw = surface.GetTextSize(name)
surface.SetTextColor(col_shadow)
surface.SetFont("ArcCWC2_32_Glow")
surface.SetTextPos(w - tw - airgap_x, 0)
DrawTextRot(self2, name, 0, 0, 0, 0, w - airgap_x)
surface.SetTextColor(col_fg)
surface.SetFont("ArcCWC2_32")
surface.SetTextPos(w - tw - airgap_x, 0)
DrawTextRot(self2, name, 0, 0, 0, 0, w - airgap_x, true)
end
local weapon_cat = vgui.Create("DPanel", ArcCW.InvHUD_Menu3)
weapon_cat:SetSize(menu3_w, rss * 16)
weapon_cat:SetPos(0, rss * 32)
weapon_cat.Paint = function(self2, w, h)
if !IsValid(ArcCW.InvHUD) or !IsValid(self) then return end
local class = try_translate(self:GetBuff_Override("Override_Trivia_Class") or self.Trivia_Class) or "missing"
local cal = try_translate(self:GetBuff_Override("Override_Trivia_Calibre") or self.Trivia_Calibre)
local name = class
if !self.PrimaryMelee and !self.Throwing and cal then
name = name .. ", " .. cal
end
surface.SetFont("ArcCWC2_16")
local tw = surface.GetTextSize(name)
surface.SetTextColor(col_shadow)
surface.SetFont("ArcCWC2_16_Glow")
surface.SetTextPos(w - tw - airgap_x, 0)
DrawTextRot(self2, name, 0, 0, 0, 0, w - airgap_x)
surface.SetTextColor(col_fg)
surface.SetFont("ArcCWC2_16")
surface.SetTextPos(w - tw - airgap_x, 0)
DrawTextRot(self2, name, 0, 0, 0, 0, w - airgap_x, true)
end
end
function ArcCW.InvHUD_FormWeaponTrivia()
if !IsValid(ArcCW.InvHUD) or !IsValid(self) then return end
ArcCW.InvHUD_Menu3:Clear()
ArcCW.InvHUD_FormWeaponName()
local scroll = vgui.Create("DScrollPanel", ArcCW.InvHUD_Menu3)
scroll:SetSize(menu3_w - airgap_x, ss * 110)
scroll:SetPos(0, rss * 48 + ss * 32)
local scroll_bar = scroll:GetVBar()
scroll_bar.Paint = function() end
scroll_bar.btnUp.Paint = function(span, w, h)
end
scroll_bar.btnDown.Paint = function(span, w, h)
end
scroll_bar.btnGrip.Paint = PaintScrollBar
local multiline = {}
local desc = translate(self:GetBuff_Override("Override_Trivia_Desc")) or translate("desc." .. self:GetClass()) or self.Trivia_Desc
multiline = multlinetext(desc, scroll:GetWide() - (ss * 2), "ArcCW_10")
local desc_title = vgui.Create("DPanel", scroll)
desc_title:SetSize(scroll:GetWide(), rss * 8)
desc_title:Dock(TOP)
desc_title.Paint = function(self2, w, h)
surface.SetFont("ArcCWC2_8")
local txt = translate("trivia.description")
local tw_1 = surface.GetTextSize(txt)
surface.SetFont("ArcCWC2_8_Glow")
surface.SetTextColor(col_shadow)
surface.SetTextPos(w - tw_1, 0)
surface.DrawText(txt)
surface.SetFont("ArcCWC2_8")
surface.SetTextColor(col_fg)
surface.SetTextPos(w - tw_1, 0)
surface.DrawText(txt)
end
for i, text in pairs(multiline) do
local desc_line = vgui.Create("DPanel", scroll)
desc_line:SetSize(scroll:GetWide(), rss * 10)
desc_line:Dock(TOP)
desc_line.Paint = function(self2, w, h)
surface.SetFont("ArcCWC2_10")
local tw = surface.GetTextSize(text)
surface.SetFont("ArcCWC2_10_Glow")
surface.SetTextColor(col_shadow)
surface.SetTextPos(w - tw, 0)
surface.DrawText(text)
surface.SetFont("ArcCWC2_10")
surface.SetTextColor(col_fg)
surface.SetTextPos(w - tw, 0)
surface.DrawText(text)
end
end
local info = vgui.Create("DPanel", ArcCW.InvHUD_Menu3)
info:SetSize(menu3_w - airgap_x, menu3_h - ss * 110 - rss * 48 - ss * 32)
info:SetPos(0, rss * 48 + ss * 32 + ss * 110)
info.Paint = function(self2, w, h)
local infos = self.Infos_Trivia or {}
local year = try_translate(self:GetBuff_Override("Override_Trivia_Year") or self.Trivia_Year)
if year then
if isnumber(year) and year < 0 then
table.insert(infos, {
title = translate("trivia.year"),
value = tostring(-year),
unit = translate("unit.bce"),
})
else
table.insert(infos, {
title = translate("trivia.year"),
value = tostring(year),
})
end
end
local mech = try_translate(self:GetBuff_Override("Override_Trivia_Mechanism") or self.Trivia_Mechanism)
if mech then
table.insert(infos, {
title = translate("trivia.mechanism"),
value = translate(mech) or mech,
})
end
local country = try_translate(self:GetBuff_Override("Override_Trivia_Country") or self.Trivia_Country)
if country then
table.insert(infos, {
title = translate("trivia.country"),
value = translate(country) or country,
})
end
local manufacturer = try_translate(self:GetBuff_Override("Override_Trivia_Manufacturer") or self.Trivia_Manufacturer)
if manufacturer then
table.insert(infos, {
title = translate("trivia.manufacturer"),
value = translate(manufacturer) or manufacturer,
})
end
local calibre = try_translate(self:GetBuff_Override("Override_Trivia_Calibre") or self.Trivia_Calibre)
if calibre then
table.insert(infos, {
title = translate("trivia.calibre"),
value = translate(calibre) or calibre,
})
end
for i, triv in pairs(infos) do
triv.unit = triv.unit or ""
local i_2 = i - 1
surface.SetFont("ArcCWC2_8")
local tw_1 = surface.GetTextSize(triv.title)
surface.SetFont("ArcCWC2_8_Glow")
surface.SetTextColor(col_shadow)
surface.SetTextPos(w - tw_1, i_2 * (rss * 24))
surface.DrawText(triv.title)
surface.SetFont("ArcCWC2_8")
surface.SetTextColor(col_fg)
surface.SetTextPos(w - tw_1, i_2 * (rss * 24))
surface.DrawText(triv.title)
surface.SetFont("ArcCWC2_8")
local tw_2 = surface.GetTextSize(triv.unit)
surface.SetFont("ArcCWC2_8_Glow")
surface.SetTextColor(col_shadow)
surface.SetTextPos(w - tw_2, (i_2 * (rss * 24)) + (rss * 12))
surface.DrawText(triv.unit)
surface.SetFont("ArcCWC2_8")
surface.SetTextColor(col_fg)
surface.SetTextPos(w - tw_2, (i_2 * (rss * 24)) + (rss * 12))
surface.DrawText(triv.unit)
surface.SetFont("ArcCWC2_16")
local tw_3 = surface.GetTextSize(tostring(triv.value))
surface.SetFont("ArcCWC2_16_Glow")
surface.SetTextColor(col_shadow)
surface.SetTextPos(w - tw_2 - tw_3, (i_2 * (rss * 24)) + (rss * 6))
-- surface.DrawText(triv.value)
DrawTextRot(self2, triv.value, 0, i_2 * (rss * 24), math.max(w - tw_2 - tw_3, 0), (i_2 * (rss * 24)) + (rss * 6), w)
-- (span, txt, x, y, tx, ty, maxw, only)
surface.SetFont("ArcCWC2_16")
surface.SetTextColor(col_fg)
surface.SetTextPos(w - tw_2 - tw_3, (i_2 * (rss * 24)) + (rss * 6))
-- surface.DrawText(triv.value)
DrawTextRot(self2, triv.value, 0, i_2 * (rss * 24), math.max(w - tw_2 - tw_3, 0), (i_2 * (rss * 24)) + (rss * 6), w, true)
end
end
end
function ArcCW.InvHUD_FormWeaponStats()
if !IsValid(ArcCW.InvHUD) or !IsValid(self) then return end
ArcCW.InvHUD_Menu3:Clear()
ArcCW.InvHUD_FormWeaponName()
self.Infos_Stats = nil
self.Infos_Breakpoints = nil
local stats_breakpoint = false
local info = vgui.Create("DPanel", ArcCW.InvHUD_Menu3)
info:SetSize(menu3_w - airgap_x, menu3_h - ss * 110 - rss * 48 - ss * 32)
info:SetPos(0, rss * 48 + ss * 32 + ss * 110)
info.Paint = function(self2, w, h)
if !IsValid(ArcCW.InvHUD) or !IsValid(self) then return end
--local infos = self.Infos_Stats or {}
if !self.Infos_Stats then
self.Infos_Stats = {}
-- rpm
local rpm = math.Round(60 / self:GetFiringDelay())
if self:GetIsManualAction() then
local fireanim = self:GetBuff_Hook("Hook_SelectFireAnimation") or self:SelectAnimation("fire")
local firedelay = self.Animations[fireanim].MinProgress or 0
rpm = math.Round(60 / ((firedelay + self:GetAnimKeyTime("cycle", true)) * self:GetBuff_Mult("Mult_CycleTime")))
table.insert(self.Infos_Stats, {
title = translate("trivia.firerate"),
value = "~" .. tostring(rpm),
unit = translate("unit.rpm"),
})
elseif !self.PrimaryBash and !self.Throwing then
table.insert(self.Infos_Stats, {
title = translate("trivia.firerate"),
value = tostring(rpm),
unit = translate("unit.rpm"),
})
local mode = self:GetCurrentFiremode()
if mode.Mode < 0 then
table.insert(self.Infos_Stats, {
title = translate("trivia.firerate_burst"),
value = tostring( math.Round( 60 / (self:GetFiringDelay() + ((mode.PostBurstDelay or 0) / -mode.Mode)) ) ),
unit = translate("unit.rpm"),
})
end
end
-- precision
local precision = math.Round(self:GetBuff("AccuracyMOA"), 1)
if !self.PrimaryBash and !self.Throwing then
table.insert(self.Infos_Stats, {
title = translate("trivia.precision"),
value = precision,
unit = translate("unit.moa"),
})
end
-- ammo type
local ammo = string.lower(self:GetBuff_Override("Override_Ammo", self.Primary.Ammo))
if (ammo or "") != "" and ammo != "none" then
local ammotype = ArcCW.TranslateAmmo(ammo) --language.GetPhrase(self.Primary.Ammo .. "_ammo")
if ammotype then
table.insert(self.Infos_Stats, {
title = translate("trivia.ammo"),
value = ammotype,
--unit = " (" .. ammo .. ")",
})
end
end
-- penetration
local shootent = self:GetBuff("ShootEntity", true)
if !self.PrimaryBash and !shootent then
local pen = math.Round( self:GetBuff("Penetration") )
table.insert(self.Infos_Stats, {
title = translate("trivia.penetration"),
value = pen,
unit = translate("unit.mm"),
})
end
-- noise
local noise = self:GetBuff("ShootVol")
if !self.PrimaryBash and !self.Throwing then
table.insert(self.Infos_Stats, {
title = translate("trivia.noise"),
value = math.Round(noise),
unit = translate("unit.db"),
})
end
if self.Throwing then
local ft = self:GetBuff_Override("Override_FuseTime") or self.FuseTime
if ft and ft > 0 then
table.insert(self.Infos_Stats, {
title = translate("trivia.fusetime"),
value = tostring(math.Round(ft, 1)),
unit = "s"
})
end
end
if self.PrimaryBash then
local meleedelay = self.MeleeTime * self:GetBuff_Mult("Mult_MeleeTime")
table.insert(self.Infos_Stats, {
title = translate("trivia.attackspersecond"),
value = tostring(math.Round(1 / meleedelay, 1)),
unit = translate("unit.aps")
})
local meleerange = self:GetBuff("MeleeRange")
table.insert(self.Infos_Stats, {
title = translate("trivia.range"),
value = tostring(math.Round(meleerange * ArcCW.HUToM)),
unit = "m"
})
local dmg = self.MeleeDamage * self:GetBuff_Mult("Mult_MeleeDamage")
table.insert(self.Infos_Stats, {
title = translate("trivia.damage"),
value = dmg,
})
local dmgtype = self:GetBuff_Override("Override_MeleeDamageType") or self.MeleeDamageType
if ArcCW.MeleeDamageTypes[dmgtype or ""] then
table.insert(self.Infos_Stats, {
title = translate("trivia.meleedamagetype"),
value = translate(ArcCW.MeleeDamageTypes[dmgtype]),
})
end
end
end
for i, triv in pairs(self.Infos_Stats) do
triv.unit = triv.unit or ""
local i_2 = i - 1
surface.SetFont("ArcCWC2_8")
local tw_1 = surface.GetTextSize(triv.title)
surface.SetFont("ArcCWC2_8_Glow")
surface.SetTextColor(col_shadow)
surface.SetTextPos(w - tw_1, i_2 * (rss * 24))
surface.DrawText(triv.title)
surface.SetFont("ArcCWC2_8")
surface.SetTextColor(col_fg)
surface.SetTextPos(w - tw_1, i_2 * (rss * 24))
surface.DrawText(triv.title)
surface.SetFont("ArcCWC2_16")
local tw_3a = select(2, surface.GetTextSize(tostring(triv.value)))
surface.SetFont("ArcCWC2_8")
local tw_2 = surface.GetTextSize(triv.unit)
local tw_2a = select(2, surface.GetTextSize(triv.unit))
surface.SetFont("ArcCWC2_8_Glow")
surface.SetTextColor(col_shadow)
surface.SetTextPos(w - tw_2, (i_2 * (rss * 24)) + (rss * 4.4) + tw_2a)
surface.DrawText(triv.unit)
surface.SetFont("ArcCWC2_8")
surface.SetTextColor(col_fg)
surface.SetTextPos(w - tw_2, (i_2 * (rss * 24)) + (rss * 4.4) + tw_2a)
surface.DrawText(triv.unit)
surface.SetFont("ArcCWC2_16")
local tw_3 = surface.GetTextSize(tostring(triv.value))
surface.SetFont("ArcCWC2_16_Glow")
surface.SetTextColor(col_shadow)
surface.SetTextPos(math.max(w - tw_2 - tw_3, 0), (i_2 * (rss * 24)) + (rss * 6))
surface.DrawText(triv.value)
surface.SetFont("ArcCWC2_16")
surface.SetTextColor(col_fg)
surface.SetTextPos(math.max(w - tw_2 - tw_3, 0), (i_2 * (rss * 24)) + (rss * 6))
surface.DrawText(triv.value)
end
end
local stk_min, stk_max, stk_count = 1, shot_limit, shot_limit
local stk_num = self:GetBuff("Num")
local dmgt = tostring("DMG")
local rangegraph = vgui.Create("DButton", ArcCW.InvHUD_Menu3)
rangegraph:SetSize(ss * 200, ss * 110)
rangegraph:SetPos(menu3_w - ss * 200 - airgap_x, rss * 48 + ss * 32)
rangegraph:SetText("")
rangegraph.DoClick = function(self2)
stats_breakpoint = !stats_breakpoint
end
rangegraph.Paint = function(self2, w, h)
if !IsValid(ArcCW.InvHUD) or !IsValid(self) then return end
local col = col_button
if self2:IsHovered() then
col = col_button_hv
end
draw.RoundedBox(cornerrad, 0, 0, w, h, col)
if self.PrimaryBash or
self.ShootEntity or
self:GetBuff_Override("Override_ShootEntity") or
self.NoRangeGraph
then
local txt = translate("ui.nodata")
surface.SetTextColor(col_fg)
surface.SetFont("ArcCWC2_24")
local tw, th = surface.GetTextSize(txt)
surface.SetTextPos((w - tw) / 2, (h - th) / 2)
surface.DrawText(txt)
return
elseif self:GetBuff("Num") <= 0 then
local txt = translate("ui.nonum")
surface.SetTextColor(col_fg)
surface.SetFont("ArcCWC2_12")
local tw, th = surface.GetTextSize(txt)
surface.SetTextPos((w - tw) / 2, (h - th) / 2)
surface.DrawText(txt)
return
end
local dmgmax = self:GetDamage(0)
local dmgmin = self:GetDamage(math.huge)
local mran, sran = self:GetMinMaxRange()
if stats_breakpoint then
if !self.Infos_Breakpoints then
self.Infos_Breakpoints = {}
local our = self:GetBuff_Override("Override_BodyDamageMults", self.BodyDamageMults)
local gam = ArcCW.LimbCompensation[engine.ActiveGamemode()] or ArcCW.LimbCompensation[1]
if our and ArcCW.ConVars["bodydamagemult_cancel"]:GetBool() then
gam = {}
elseif !our then
our = {}
end
-- Head
table.insert(self.Infos_Breakpoints, {"ui.hitgroup.head", shotstokill((our[HITGROUP_HEAD] or 1) / (gam[HITGROUP_HEAD] or 1), dmgmin, dmgmax, mran, sran)})
-- Torso
-- separates into Chest and Stomach if they have different values
local m_chest = (our[HITGROUP_CHEST] or 1) / (gam[HITGROUP_CHEST] or 1)
local m_stomach = (our[HITGROUP_STOMACH] or 1) / (gam[HITGROUP_STOMACH] or 1)
if m_chest == m_stomach then
table.insert(self.Infos_Breakpoints, {"ui.hitgroup.torso", shotstokill(m_chest, dmgmin, dmgmax, mran, sran)})
else
table.insert(self.Infos_Breakpoints, {"ui.hitgroup.chest", shotstokill(m_chest, dmgmin, dmgmax, mran, sran)})
table.insert(self.Infos_Breakpoints, {"ui.hitgroup.stomach", shotstokill(m_stomach, dmgmin, dmgmax, mran, sran)})
end
-- Arms and Legs
-- if two limbs have different multipliers (why???), use the smaller one
local m_arms = math.min((our[HITGROUP_LEFTARM] or 1) / (gam[HITGROUP_LEFTARM] or 1), (our[HITGROUP_RIGHTARM] or 1) / (gam[HITGROUP_RIGHTARM] or 1))
table.insert(self.Infos_Breakpoints, {"ui.hitgroup.arms", shotstokill(m_arms, dmgmin, dmgmax, mran, sran)})
local m_legs = math.min((our[HITGROUP_LEFTLEG] or 1) / (gam[HITGROUP_LEFTLEG] or 1), (our[HITGROUP_RIGHTLEG] or 1) / (gam[HITGROUP_RIGHTLEG] or 1))
table.insert(self.Infos_Breakpoints, {"ui.hitgroup.legs", shotstokill(m_legs, dmgmin, dmgmax, mran, sran)})
stk_num = self:GetBuff("Num")
local max = max_shots * (stk_num > 1 and 0.5 or 1)
-- Trim table values that are all -1 or math.huge on either end
stk_min, stk_max = 1, 1 + max_shots
local stk_min_n, stk_min_y = true, true
for i = 1, shot_limit do
if stk_min_y or stk_min_n then
stk_min = i
else
break
end
for j = 1, #self.Infos_Breakpoints do
if stk_min_n and self.Infos_Breakpoints[j][2][i] != -1 then
stk_min_n = false
elseif stk_min_y and self.Infos_Breakpoints[j][2][i] != math.huge then
stk_min_y = false
end
if !stk_min_y and !stk_min_n then
stk_min = math.Clamp(shot_limit, 1, math.max(1, i - 1))
break
end
end
end
local stk_max_n, stk_max_y = true, true
for i = shot_limit, 1, -1 do
if stk_max_y or stk_max_n then
stk_max = i
else
break
end
for j = 1, #self.Infos_Breakpoints do
if stk_max_n and self.Infos_Breakpoints[j][2][i] != -1 then
stk_max_n = false
elseif stk_max_y and self.Infos_Breakpoints[j][2][i] != math.huge then
stk_max_y = false
end
if !stk_max_y and !stk_max_n then
stk_max = math.Clamp(i + 1, 1, shot_limit)
break
end
end
end
stk_count = stk_max - stk_min + 1
if stk_count > max then
stk_max = stk_min + max - 1
stk_count = max
end
if GetConVar("developer"):GetInt() > 0 then
print(dmgmax .. "-" .. dmgmin .. "DMG; range " .. mran .. "/" .. sran)
print("table range: " .. stk_min .. " - " .. stk_max .. " (" .. stk_count .. ")")
PrintTable(self.Infos_Breakpoints)
end
end
local header_w = ss * 48
local column_w = (w - header_w) / stk_count
local header_h = ss * 16
local column_h = (h - header_h) / #self.Infos_Breakpoints
-- header texts
surface.SetTextColor(col_fg)
surface.SetFont("ArcCWC2_8")
local hg_t = translate("ui.hitgroup")
local _, hg_h = surface.GetTextSize(hg_t)
surface.SetTextPos(ss, header_h - (thicc / 2) - hg_h)
surface.DrawText(hg_t)
local stk_t = translate("ui.shotstokill")
local stk_w, _ = surface.GetTextSize(stk_t)
surface.SetTextPos(header_w - (thicc / 2) - stk_w, 0)
surface.DrawText(stk_t)
-- vertical dividers
local cnt_t = stk_num > 1 and ("×" .. stk_num) or ""
surface.SetFont("ArcCWC2_8")
local cnt_w, cnt_h = surface.GetTextSize(cnt_t)
surface.SetDrawColor(255, 255, 255, Lerp(ArcCW.Inv_Fade, 0, 255))
for i = 1, stk_count do
surface.DrawLine(header_w + i * column_w, 0, header_w + i * column_w, header_h)
surface.SetFont("ArcCWC2_16")
local num_t = tostring(i + stk_min - 1)
local num_w, num_h = surface.GetTextSize(num_t)
surface.SetTextPos(header_w + (i - 0.5) * column_w - num_w / 2 - cnt_w / 2, header_h / 2 - num_h / 2)
surface.DrawText(num_t)
if stk_num > 1 then
surface.SetFont("ArcCWC2_8")
surface.SetTextPos(header_w + (i - 0.5) * column_w + num_w / 2 - cnt_w / 2, header_h / 2 - num_h / 2 + cnt_h / 2)
surface.DrawText(cnt_t)
end
end
-- table info
surface.SetFont("ArcCWC2_8")
for i, tbl in ipairs(self.Infos_Breakpoints) do
local row_t = translate(tbl[1])
local row_w, row_h = surface.GetTextSize(row_t)
surface.SetTextPos(header_w / 2 - row_w / 2, header_h + column_h * (i - 0.5) - row_h / 2)
surface.DrawText(row_t)
for j = 1, stk_count do
local val = tbl[2][j + stk_min - 1]
local mat, siz
if val == -1 then
--ran_t = ""
siz = ss * 8
mat = mat_hit
surface.SetDrawColor(col_bad.r, col_bad.g, col_bad.b, Lerp(ArcCW.Inv_Fade, 0, 255))
elseif val == math.huge then
--ran_t = "⚫"
siz = ss * 16
mat = mat_hit_dot
surface.SetDrawColor(col_good.r, col_good.g, col_good.b, Lerp(ArcCW.Inv_Fade, 0, 255))
else
local ran_t = math.floor(val) .. "m"
local ran_w, ran_h = surface.GetTextSize(ran_t)
surface.SetTextPos(header_w + (j - 0.5) * column_w - ran_w / 2, header_h + column_h * (i - 0.5) - ran_h / 2)
surface.DrawText(ran_t)
end
if mat then
surface.SetMaterial(mat)
surface.DrawTexturedRect(header_w + (j - 0.5) * column_w - siz / 2, header_h + column_h * (i - 0.5) - siz / 2, siz, siz)
end
end
end
for i = 1, thicc do
local meth = ((thicc - i) / thicc)
surface.SetDrawColor(255, 255, 255, Lerp(ArcCW.Inv_Fade, 0, 127 * meth))
local of
if i == 1 then
surface.SetDrawColor(col_fg)
of = 0
elseif (i % 2 == 0) then
-- even
of = -1 * i / 2
else
-- odd
of = 1 * i / 2
end
-- first vertical
surface.DrawLine(header_w + of, 0, header_w + of, h)
-- first horizontal
surface.DrawLine(0, header_h + of, w, header_h + of)
-- diagonal header
--surface.DrawLine(0, of, header_w, header_h + of)
-- horizontal dividers
for j = 1, #self.Infos_Breakpoints - 1 do
surface.DrawLine(0, header_h + column_h * j + of, w, header_h + column_h * j + of)
end
end
return
end
local scale = math.ceil((math.max(dmgmax, dmgmin) + 10) / 25) * 25
local hscale = math.ceil(math.max(mran, sran) / 150) * 150
scale = math.max(scale, 75)
hscale = math.max(hscale, 150)
local wmin = mran / hscale * w
local wmax = math.min(sran / hscale * w, w - ss * 32)
if sran == hscale then wmax = w end
-- segment 1: minimum range
local x_1 = 0
local y_1 = h - (dmgmax / scale * h)
y_1 = math.Clamp(y_1, ss * 16, h - (ss * 16))
-- segment 2: slope
local x_2 = 0
local y_2 = y_1
-- segment 3: maximum range
local x_3 = wmax
local y_3 = h - (dmgmin / scale * h)
y_3 = math.Clamp(y_3, ss * 16, h - (ss * 16))
local x_4 = w
local y_4 = y_3
if sran == mran then
x_2 = w / 2
x_3 = w / 2
elseif mran > 0 then
x_2 = wmin -- w * 1 / 3
end
local col_vline = LerpColor(0.5, col_fg, Color(0, 0, 0, 0))
surface.SetDrawColor(col_vline)
-- line for min range
if dmgmax != dmgmin and mran > 0 then
surface.DrawLine(x_2, 0, x_2, h)
end
-- line for max range
if dmgmax != dmgmin then
surface.DrawLine(x_3, 0, x_3, h)
end
-- damage number text
for i = 1, thicc do
local meth = ((thicc - i) / thicc)
surface.SetDrawColor(255, 255, 255, Lerp(ArcCW.Inv_Fade, 0, 127 * meth))
local of
if i == 1 then
surface.SetDrawColor(col_fg)
of = 0
elseif (i % 2 == 0) then
-- even
of = -1 * i / 2
else
-- odd
of = 1 * i / 2
end
if mran > 0 then
-- draw seg 1
surface.DrawLine(x_1, y_1 + of, x_2, y_2 + of)
end
-- draw seg 2
surface.DrawLine(x_2, y_2 + of, x_3, y_3 + of)
-- drag seg 3
surface.DrawLine(x_3, y_3 + of, x_4, y_4 + of)
end
surface.SetTextColor(col_fg)
surface.SetFont("ArcCWC2_8")
local drawndmg = false
if dmgmax != dmgmin then
if mran == 0 or wmin > ss * 24 then
local m_1, hu_1 = RangeText(0)
surface.SetTextPos(ss * 2, h - rss * 16)
surface.DrawText(m_1)
surface.SetTextPos(ss * 2, h - rss * 10)
surface.DrawText(hu_1)
end
if sran != hscale and w - wmax > ss * 40 then
local m_1x, hu_1x = RangeText(hscale)
local w_m, _ = surface.GetTextSize(m_1x)
local w_hu, _ = surface.GetTextSize(hu_1x)
surface.SetTextPos(w - w_m - ss * 2, h - rss * 16)
surface.DrawText(m_1x)
surface.SetTextPos(w - w_hu - ss * 2, h - rss * 10)
surface.DrawText(hu_1x)
end
if mran > 0 then
-- min damage
local dmg = tostring(math.Round(dmgmax))
local tw = surface.GetTextSize(dmg)
if wmin < tw then
surface.SetTextPos(x_2 + ss * 1, ss * 1)
else
surface.SetTextPos(x_2 - (tw / 2), ss * 1)
end
surface.DrawText(dmg)
local m_2, hu_2 = RangeText(mran)
surface.SetTextPos(x_2, h - rss * 16)
surface.DrawText(m_2)
surface.SetTextPos(x_2, h - rss * 10)
surface.DrawText(hu_2)
local twt = surface.GetTextSize(dmgt)
if wmin < tw then
surface.SetTextPos(x_2 + ss * 1, ss * 8)
else
surface.SetTextPos(x_2 - (twt / 2), ss * 8)
end
surface.DrawText(dmgt)
drawndmg = true
end
if sran == hscale then
-- draw max damage at edge
local dmg = tostring(math.Round(dmgmin))
local tw = surface.GetTextSize(dmg)
surface.SetTextPos(w - ss * 2 - tw, ss * 1)
surface.DrawText(dmg)
local m_3, hu_3 = RangeText(sran)
local w_m, _ = surface.GetTextSize(m_3)
local w_hu, _ = surface.GetTextSize(hu_3)
surface.SetTextPos(w - ss * 2 - w_m, h - rss * 16)
surface.DrawText(m_3)
surface.SetTextPos(w - ss * 2 - w_hu, h - rss * 10)
surface.DrawText(hu_3)
local twt = surface.GetTextSize(dmgt)
surface.SetTextPos(w - ss * 2 - twt, ss * 8)
surface.DrawText(dmgt)
elseif sran != mran then
-- draw max damage centered
local dmg = tostring(math.Round(dmgmin))
local tw = surface.GetTextSize(dmg)
surface.SetTextPos(x_3 - (tw / 2), ss * 1)
surface.DrawText(dmg)
local m_3, hu_3 = RangeText(sran)
surface.SetTextPos(x_3, h - rss * 16)
surface.DrawText(m_3)
surface.SetTextPos(x_3, h - rss * 10)
surface.DrawText(hu_3)
local twt = surface.GetTextSize(dmgt)
surface.SetTextPos(x_3 - (twt / 2), ss * 8)
surface.DrawText(dmgt)
end
if sran != mran and self2:IsHovered() then
local mouse_x, _ = self2:ScreenToLocal(input.GetCursorPos())
local mouse_frac = math.Clamp((mouse_x - x_2) / (x_3 - x_2), 0, 1)
if mouse_frac > 0 and mouse_frac < 1 then
local mouse_range = mran + mouse_frac * (sran - mran)
local mouse_dmg = math.Round(self:GetDamage(mouse_range))
local y_slope = Lerp(mouse_frac, y_2, y_3)
surface.SetDrawColor(col_vline)
surface.DrawLine(mouse_x, 0, mouse_x, h)
local mouse_text1 = tostring(mouse_dmg)
local mouse_text_w, _ = surface.GetTextSize(mouse_text1)
local nudge = -mouse_text_w * 0.5
local side_margin = ss * 12
local a = 255
if mouse_x - x_2 <= side_margin then
local f = (1 - (mouse_x - x_2) / side_margin)
a = Lerp(f, 255, 0)
elseif x_3 - mouse_x <= side_margin then
local f = (1 - (x_3 - mouse_x) / side_margin)
a = Lerp(f, 255, 25)
end
surface.SetTextColor(255, 255, 255, a)
surface.SetTextPos(mouse_x + nudge, y_slope - ss * 12)
surface.DrawText(mouse_text1)
local m_mouse, hu_mouse = RangeText(mouse_range)
local w_m, _ = surface.GetTextSize(m_mouse)
local w_hu, _ = surface.GetTextSize(hu_mouse)
surface.SetTextPos(mouse_x - w_m * 0.5, y_slope + rss * 5)
surface.DrawText(m_mouse)
surface.SetTextPos(mouse_x - w_hu * 0.5, y_slope + rss * 11)
surface.DrawText(hu_mouse)
end
end
end
if !drawndmg then
surface.SetTextColor(col_fg)
local dmg = tostring(math.Round(dmgmax))
surface.SetTextPos(ss * 2, ss * 1)
surface.DrawText(dmg)
surface.SetTextPos(ss * 2, ss * 8)
surface.DrawText(dmgt)
end
end
end
function ArcCW.InvHUD_FormWeaponBallistics()
if !IsValid(ArcCW.InvHUD) or !IsValid(self) then return end
ArcCW.InvHUD_Menu3:Clear()
ArcCW.InvHUD_FormWeaponName()
self.Infos_Ballistics = nil
local info = vgui.Create("DPanel", ArcCW.InvHUD_Menu3)
info:SetSize(menu3_w - airgap_x, menu3_h - (ss * 110) - (ss * 70) - rss * 48 - ss * 32)
info:SetPos(0, rss * 48 + ss * 32 + (ss * 110) + (ss * 70))
info.Paint = function(self2, w, h)
if !IsValid(ArcCW.InvHUD) or !IsValid(self) then return end
if !self.Infos_Ballistics then
self.Infos_Ballistics = {}
table.insert(self.Infos_Ballistics, {
title = translate("trivia.muzzlevel"),
value = math.Round(self:GetMuzzleVelocity() * ArcCW.HUToM),
unit = translate("unit.mps"),
})
table.insert(self.Infos_Ballistics, {
title = translate("trivia.recoil"),
value = math.Round(self.Recoil * ArcCW.RecoilUnit * self:GetBuff_Mult("Mult_Recoil"), 1),
unit = translate("unit.lbfps"),
})
table.insert(self.Infos_Ballistics, {
title = translate("trivia.recoilside"),
value = math.Round(self.RecoilSide * ArcCW.RecoilUnit * self:GetBuff_Mult("Mult_RecoilSide"), 1),
unit = translate("unit.lbfps"),
})
-- arccw_approved_recoil_score
local aars = 0
local disclaimers = ""
aars = aars + (self.Recoil + self:GetBuff_Add("Add_Recoil")) * self:GetBuff_Mult("Mult_Recoil")
aars = aars + (self.RecoilSide + self:GetBuff_Add("Add_RecoilSide")) * self:GetBuff_Mult("Mult_RecoilSide") * 0.5
local arpm = (60 / self:GetFiringDelay())
if self:GetIsManualAction() then
local fireanim = self:GetBuff_Hook("Hook_SelectFireAnimation") or self:SelectAnimation("fire")
local firedelay = self.Animations[fireanim].MinProgress or 0
arpm = math.Round(60 / ((firedelay + self:GetAnimKeyTime("cycle", true)) * self:GetBuff_Mult("Mult_CycleTime")))
elseif self:GetCurrentFiremode().Mode == 1 then
arpm = math.min(400, 60 / self:GetFiringDelay())
end
aars = aars * arpm
--[[
if self:GetCurrentFiremode().Mode == 1 or self:GetIsManualAction() then
disclaimers = disclaimers .. " " .. arpm .. translate("unit.rpm")
end
]]
table.insert(self.Infos_Ballistics, {
title = translate("trivia.recoilscore"),
value = math.Round(aars),
unit = " points" .. disclaimers,
})
end
for i, triv in pairs(self.Infos_Ballistics) do
triv.unit = triv.unit or ""
local i_2 = i - 1
surface.SetFont("ArcCWC2_8")
local tw_1 = surface.GetTextSize(triv.title)
surface.SetFont("ArcCWC2_8_Glow")
surface.SetTextColor(col_shadow)
surface.SetTextPos(w - tw_1, i_2 * (rss * 24))
surface.DrawText(triv.title)
surface.SetFont("ArcCWC2_8")
surface.SetTextColor(col_fg)
surface.SetTextPos(w - tw_1, i_2 * (rss * 24))
surface.DrawText(triv.title)
surface.SetFont("ArcCWC2_16")
local tw_3a = select(2, surface.GetTextSize(tostring(triv.value)))
surface.SetFont("ArcCWC2_8")
local tw_2 = surface.GetTextSize(triv.unit)
local tw_2a = select(2, surface.GetTextSize(triv.unit))
surface.SetFont("ArcCWC2_8_Glow")
surface.SetTextColor(col_shadow)
surface.SetTextPos(w - tw_2, (i_2 * (rss * 24)) + (rss * 4.4) + tw_2a)
surface.DrawText(triv.unit)
surface.SetFont("ArcCWC2_8")
surface.SetTextColor(col_fg)
surface.SetTextPos(w - tw_2, (i_2 * (rss * 24)) + (rss * 4.4) + tw_2a)
surface.DrawText(triv.unit)
surface.SetFont("ArcCWC2_16")
local tw_3 = surface.GetTextSize(tostring(triv.value))
surface.SetFont("ArcCWC2_16_Glow")
surface.SetTextColor(col_shadow)
surface.SetTextPos(math.max(w - tw_2 - tw_3, 0), (i_2 * (rss * 24)) + (rss * 6))
surface.DrawText(triv.value)
surface.SetFont("ArcCWC2_16")
surface.SetTextColor(col_fg)
surface.SetTextPos(math.max(w - tw_2 - tw_3, 0), (i_2 * (rss * 24)) + (rss * 6))
surface.DrawText(triv.value)
end
end
local range_3 = math.max(math.Round(self:GetBuff("Range") / 25) * 25, 50) --self.Range * self:GetBuff_Mult("Mult_Range")
local range_1 = math.max(math.Round(range_3 / 3 / 25) * 25, 15) --(self.RangeMin or 0) * self:GetBuff_Mult("Mult_RangeMin")
if range_1 == 0 then
range_1 = range_3 * 0.5
end
rollallhits(self, range_3, range_1)
local ballisticchart = vgui.Create("DButton", ArcCW.InvHUD_Menu3)
ballisticchart:SetSize(ss * 200, ss * 110)
ballisticchart:SetPos(menu3_w - ss * 200 - airgap_x, rss * 48 + ss * 32)
ballisticchart:SetText("")
ballisticchart.DoClick = function(self2)
rollallhits(self, range_3, range_1)
end
ballisticchart.Paint = function(self2, w, h)
if !IsValid(ArcCW.InvHUD) or !IsValid(self) then return end
local col = col_button
if self2:IsHovered() then
col = col_button_hv
end
if self.PrimaryBash then
draw.RoundedBox(cornerrad, 0, 0, w, h, col)
local txt = translate("ui.nodata")
surface.SetTextColor(col_fg)
surface.SetFont("ArcCWC2_24")
local tw, th = surface.GetTextSize(txt)
surface.SetTextPos((w - tw) / 2, (h - th) / 2)
surface.DrawText(txt)
return
end
draw.RoundedBox(cornerrad, 0, 0, w, h, col)
local s = w / 2
local s2 = ss * 10
local range_1_txt = tostring(range_1) .. "m / " .. tostring(math.Round(range_1 / ArcCW.HUToM / 100) * 100) .. "HU"
local range_3_txt = tostring(range_3) .. "m / " .. tostring(math.Round(range_3 / ArcCW.HUToM / 100) * 100) .. "HU"
local col_bullseye = Color(200, 200, 200, Lerp(ArcCW.Inv_Fade, 0, 100))
surface.SetMaterial(bullseye)
surface.SetDrawColor(col_bullseye)
surface.DrawTexturedRect(0, 0, s, s)
local r_1_x, r_1_y = self2:LocalToScreen(0, 0)
render.SetScissorRect(r_1_x, r_1_y, r_1_x + s, r_1_y + s, true)
for _, hit in ipairs(hits_1) do
if self:GetBuff("Num") > 1 then
surface.SetMaterial(mat_hit_dot)
else
surface.SetMaterial(mat_hit)
end
surface.SetDrawColor(col_fg)
surface.DrawTexturedRect((s / 2) + (hit.x * s) - (s2 / 2), (s / 2) + (hit.y * s) - (s2 / 2), s2, s2)
end
render.SetScissorRect(r_1_x, r_1_y, r_1_x + s, r_1_y + s, false)
surface.SetTextColor(col_fg)
surface.SetFont("ArcCWC2_12")
local range_1_txtw = surface.GetTextSize(range_1_txt)
surface.SetTextPos((s - range_1_txtw) / 2, h - (ss * 12) - (ss * 1))
surface.DrawText(range_1_txt)
surface.SetMaterial(bullseye)
surface.SetDrawColor(col_bullseye)
surface.DrawTexturedRect(s, 0, s, s)
render.SetScissorRect(r_1_x + s, r_1_y, r_1_x + (s * 2), r_1_y + s, true)
for _, hit in ipairs(hits_3) do
if self:GetBuff("Num") > 1 then
surface.SetMaterial(mat_hit_dot)
else
surface.SetMaterial(mat_hit)
end
surface.SetDrawColor(col_fg)
surface.DrawTexturedRect(s + (s / 2) + (hit.x * s) - (s2 / 2), (s / 2) + (hit.y * s) - (s2 / 2), s2, s2)
end
render.SetScissorRect(r_1_x, r_1_y, r_1_x + s, r_1_y + s, false)
surface.SetTextColor(col_fg)
surface.SetFont("ArcCWC2_12")
local range_3_txtw = surface.GetTextSize(range_3_txt)
surface.SetTextPos(s + (s - range_3_txtw) / 2, h - (ss * 12) - (ss * 1))
surface.DrawText(range_3_txt)
end
local penchart = vgui.Create("DPanel", ArcCW.InvHUD_Menu3)
penchart:SetSize(ss * 200, ss * 60)
penchart:SetPos(menu3_w - ss * 200 - airgap_x, rss * 48 + ss * 32 + (ss * 115))
penchart:SetText("")
penchart.Paint = function(self2, w, h)
if !IsValid(ArcCW.InvHUD) or !IsValid(self) then return end
local col = col_button
draw.RoundedBox(cornerrad, 0, 0, w, h, col)
local pen = self:GetBuff("Penetration")
local pm_wood = ArcCW.PenTable[MAT_WOOD]
local pm_metal = ArcCW.PenTable[MAT_METAL]
local pm_concrete = ArcCW.PenTable[MAT_CONCRETE]
local line_s = ss * 1
local line_h = h - (rss * 8 * 2) - (ss * 2)
-- wood
local pen_wood = math.Round(pen / pm_wood, 1)
local wood_txt = "WOOD"
surface.SetTextColor(col_fg)
surface.SetFont("ArcCWC2_8")
local wood_txtw = surface.GetTextSize(wood_txt)
surface.SetTextPos((w * 1 / 6) - (wood_txtw / 2), h - (rss * 8))
surface.DrawText(wood_txt)
local wood_txt2 = tostring(pen_wood) .. "HU"
surface.SetTextColor(col_fg)
surface.SetFont("ArcCWC2_8")
local wood_txt2w = surface.GetTextSize(wood_txt)
surface.SetTextPos((w * 1 / 6) - (wood_txt2w / 2), h - (rss * 8 * 2))
surface.DrawText(wood_txt2)
local wood_width = (math.ceil(pen_wood / 5) * 5)
wood_width = math.max(wood_width, 5)
wood_width = math.min(wood_width, 20)
local wood_s = wood_width * ss
surface.SetDrawColor(col_fg_tr)
surface.DrawRect((w * 1 / 6) - (wood_s / 2), ss * 4, wood_s, line_h / 2 - (line_s / 2) - (ss * 4))
surface.DrawRect((w * 1 / 6) - (wood_s / 2), line_h / 2 + (line_s / 2), wood_s, line_h / 2 - (line_s / 2))
-- bullet
surface.DrawRect((w * 1 / 6) - (wood_s / 2) - (w / 6), line_h / 2 - (line_s / 2), w / 6, line_s)
if pen_wood > wood_width then
-- penetrated
surface.DrawRect((w * 1 / 6) + (wood_s / 2), line_h / 2 - (line_s / 2), ss * 4, line_s)
else
-- did not penetrate
local pen_percent = (pen_wood / wood_width)
surface.DrawRect((w * 1 / 6) - (wood_s / 2) + math.ceil(wood_s * pen_percent), line_h / 2 - (line_s / 2) - 1, wood_s - math.ceil(wood_s * pen_percent), line_s + 1)
end
-- metal
local pen_metal = math.Round(pen / pm_metal, 1)
local metal_txt = "METAL"
surface.SetTextColor(col_fg)
surface.SetFont("ArcCWC2_8")
local metal_txtw = surface.GetTextSize(metal_txt)
surface.SetTextPos((w * 3 / 6) - (metal_txtw / 2), h - (rss * 8))
surface.DrawText(metal_txt)
local metal_txt2 = tostring(pen_metal) .. "HU"
surface.SetTextColor(col_fg)
surface.SetFont("ArcCWC2_8")
local metal_txt2w = surface.GetTextSize(metal_txt)
surface.SetTextPos((w * 3 / 6) - (metal_txt2w / 2), h - (rss * 8 * 2))
surface.DrawText(metal_txt2)
local metal_width = (math.ceil(pen_metal / 5) * 5)
metal_width = math.max(metal_width, 5)
metal_width = math.min(metal_width, 20)
local metal_s = metal_width * ss
surface.SetDrawColor(col_fg_tr)
surface.DrawRect((w * 3 / 6) - (metal_s / 2), ss * 4, metal_s, line_h / 2 - (line_s / 2) - (ss * 4))
surface.DrawRect((w * 3 / 6) - (metal_s / 2), line_h / 2 + (line_s / 2), metal_s, line_h / 2 - (line_s / 2))
-- bullet
surface.DrawRect((w * 3 / 6) - (metal_s / 2) - (w / 6), line_h / 2 - (line_s / 2), w / 6, line_s)
if pen_metal > metal_width then
-- penetrated
surface.DrawRect((w * 3 / 6) + (metal_s / 2), line_h / 2 - (line_s / 2), ss * 4, line_s)
else
-- did not penetrate
local pen_percent = (pen_metal / metal_width)
surface.DrawRect((w * 3 / 6) - (metal_s / 2) + math.ceil(metal_s * pen_percent), line_h / 2 - (line_s / 2) - 1, metal_s - math.ceil(metal_s * pen_percent), line_s + 1)
end
-- concrete
local pen_concrete = math.Round(pen / pm_concrete, 1)
local concrete_txt = "CONCRETE"
surface.SetTextColor(col_fg)
surface.SetFont("ArcCWC2_8")
local concrete_txtw = surface.GetTextSize(concrete_txt)
surface.SetTextPos((w * 5 / 6) - (concrete_txtw / 2), h - (rss * 8))
surface.DrawText(concrete_txt)
local concrete_txt2 = tostring(pen_concrete) .. "HU"
surface.SetTextColor(col_fg)
surface.SetFont("ArcCWC2_8")
local concrete_txt2w = surface.GetTextSize(concrete_txt)
surface.SetTextPos((w * 5 / 6) - (concrete_txt2w / 2), h - (rss * 8 * 2))
surface.DrawText(concrete_txt2)
local concrete_width = (math.ceil(pen_concrete / 5) * 5)
concrete_width = math.max(concrete_width, 5)
concrete_width = math.min(concrete_width, 20)
local concrete_s = concrete_width * ss
surface.SetDrawColor(col_fg_tr)
surface.DrawRect((w * 5 / 6) - (concrete_s / 2), ss * 4, concrete_s, line_h / 2 - (line_s / 2) - (ss * 4))
surface.DrawRect((w * 5 / 6) - (concrete_s / 2), line_h / 2 + (line_s / 2), concrete_s, line_h / 2 - (line_s / 2))
-- bullet
surface.DrawRect((w * 5 / 6) - (concrete_s / 2) - (w / 6), line_h / 2 - (line_s / 2), w / 6, line_s)
if pen_concrete > concrete_width then
-- penetrated
surface.DrawRect((w * 5 / 6) + (concrete_s / 2), line_h / 2 - (line_s / 2), ss * 4, line_s)
else
-- did not penetrate
local pen_percent = (pen_concrete / concrete_width)
surface.DrawRect((w * 5 / 6) - (concrete_s / 2) + math.ceil(concrete_s * pen_percent), line_h / 2 - (line_s / 2) - 1, concrete_s - math.ceil(concrete_s * pen_percent), line_s + 1)
end
end
end
function ArcCW.InvHUD_FormGamemodeFunctions()
if !IsValid(ArcCW.InvHUD) or !IsValid(self) then return end
if !ArcCW.ConVars["attinv_gamemodebuttons"]:GetBool() then return end
local shoulddrawtitle = false
local function paint_gmbutton(self2, w, h)
local col = col_button
local col2 = col_fg
if self2:IsHovered() then
col = col_fg_tr
col2 = col_shadow
end
draw.RoundedBox(cornerrad, 0, 0, w, h, col)
surface.SetFont("ArcCWC2_14")
local tw, th = surface.GetTextSize(self2.Text)
surface.SetFont("ArcCWC2_14_Glow")
surface.SetTextColor(col_shadow)
surface.SetTextPos((w - tw) / 2, (h - th) / 2)
surface.DrawText(self2.Text)
surface.SetFont("ArcCWC2_14")
surface.SetTextColor(col2)
surface.SetTextPos((w - tw) / 2, (h - th) / 2)
surface.DrawText(self2.Text)
end
if engine.ActiveGamemode() == "terrortown" then
shoulddrawtitle = true
local shop = vgui.Create("DButton", ArcCW.InvHUD)
shop:SetSize(ss * 64, ss * 24)
shop:SetPos(ScrW() * 0.5 - ss * (64 + 4), ScrH() - ss * (24 + 10))
shop:SetText("")
shop.Text = translate("ui.tttequip")
shop.DoClick = function(self2, clr, btn)
RunConsoleCommand("ttt_cl_traitorpopup")
end
shop.Paint = paint_gmbutton
local quickchat = vgui.Create("DButton", ArcCW.InvHUD)
quickchat:SetSize(ss * 64, ss * 24)
quickchat:SetPos(ScrW() * 0.5 + ss * 4, ScrH() - ss * (24 + 10))
quickchat:SetText("")
quickchat.Text = translate("ui.tttchat")
quickchat.DoClick = function(self2, clr, btn)
if RADIO then RADIO:ShowRadioCommands(!RADIO.Show) end
end
quickchat.Paint = paint_gmbutton
elseif engine.ActiveGamemode() == "darkrp" or DarkRP then
-- Check for the global table, as DarkRP has many derivatives
shoulddrawtitle = true
local drop = vgui.Create("DButton", ArcCW.InvHUD)
drop:SetSize(ss * 96, ss * 24)
drop:SetPos(ScrW() * 0.5 - ss * 48, ScrH() - ss * (24 + 10))
drop:SetText("")
drop.Text = translate("ui.darkrpdrop")
drop.DoClick = function(self2, clr, btn)
LocalPlayer():ConCommand("say /drop")
end
drop.Paint = paint_gmbutton
end
if shoulddrawtitle then
local text = vgui.Create("DPanel", ArcCW.InvHUD)
text:SetSize(ss * 256, ss * 12)
text:SetPos(ScrW() * 0.5 - ss * 128, ScrH() - ss * (24 + 12 + 12))
text.Paint = function(self2, w, h)
local col2 = col_fg
local str = translate("ui.gamemode_buttons")
surface.SetFont("ArcCWC2_12")
local tw, th = surface.GetTextSize(str)
surface.SetFont("ArcCWC2_12_Glow")
surface.SetTextColor(col_shadow)
surface.SetTextPos((w - tw) / 2, (h - th) / 2)
surface.DrawText(str)
surface.SetFont("ArcCWC2_12")
surface.SetTextColor(col2)
surface.SetTextPos((w - tw) / 2, (h - th) / 2)
surface.DrawText(str)
end
local text2 = vgui.Create("DPanel", ArcCW.InvHUD)
text2:SetSize(ss * 256, ss * 8)
text2:SetPos(ScrW() * 0.5 - ss * 128, ScrH() - ss * 9)
text2.Paint = function(self2, w, h)
local col2 = col_fg
local str = translate("ui.gamemode_usehint")
surface.SetFont("ArcCWC2_8")
local tw, th = surface.GetTextSize(str)
surface.SetFont("ArcCWC2_8_Glow")
surface.SetTextColor(col_shadow)
surface.SetTextPos((w - tw) / 2, (h - th) / 2)
surface.DrawText(str)
surface.SetFont("ArcCWC2_8")
surface.SetTextColor(col2)
surface.SetTextPos((w - tw) / 2, (h - th) / 2)
surface.DrawText(str)
end
end
end
clearrightpanel()
ArcCW.Inv_SelectedMenu = ArcCW.Inv_SelectedMenu or 1
if ArcCW.Inv_SelectedMenu == 1 then
ArcCW.InvHUD_FormAttachments()
if self.Inv_SelectedSlot then
ArcCW.InvHUD_FormAttachmentSelect()
end
elseif ArcCW.Inv_SelectedMenu == 2 then
ArcCW.InvHUD_FormPresets()
elseif ArcCW.Inv_SelectedMenu == 3 then
ArcCW.InvHUD_FormInventory()
end
ArcCW.InvHUD_FormGamemodeFunctions()
end