mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
2101 lines
77 KiB
Lua
2101 lines
77 KiB
Lua
--[[
|
||
| This file was obtained through the combined efforts
|
||
| of Madbluntz & Plymouth Antiquarian Society.
|
||
|
|
||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||
| Maloy, DrPepper10 @ RIP, Atle!
|
||
|
|
||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||
--]]
|
||
|
||
local translate = ArcCW.GetTranslation
|
||
|
||
local function ScreenScaleMulti(input)
|
||
return ScreenScale(input) * ArcCW.ConVars["hud_size"]:GetFloat()
|
||
end
|
||
|
||
local temp = 0
|
||
local SolidBlack = Color(temp, temp, temp)
|
||
-- don't fucking mess with the shadow, makes the menu hurt your goddamn eyes
|
||
|
||
local function DrawTextRot(span, txt, x, y, tx, ty, maxw, only)
|
||
local tw, th = surface.GetTextSize(txt)
|
||
|
||
if tw > maxw then
|
||
local realx, realy = span:LocalToScreen(x, y)
|
||
render.SetScissorRect(realx, realy, realx + maxw, realy + (th * 2), true)
|
||
|
||
if !only then
|
||
span.TextRot = span.TextRot or 0
|
||
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 = 0
|
||
if span.StartTextRot < CurTime() - 2 then
|
||
span.TextRotState = 1
|
||
end
|
||
elseif span.TextRotState == 1 then
|
||
span.TextRot = span.TextRot + (FrameTime() * ScreenScaleMulti(16))
|
||
if span.TextRot >= (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 = 0
|
||
span.StartTextRot = CurTime()
|
||
end
|
||
end
|
||
end
|
||
surface.SetTextPos(tx - span.TextRot, ty)
|
||
surface.DrawText(txt)
|
||
render.SetScissorRect(0, 0, 0, 0, false)
|
||
else
|
||
surface.DrawText(txt)
|
||
end
|
||
end
|
||
|
||
|
||
function SWEP:ToggleCustomizeHUD(ic)
|
||
if ic and self:GetState() == ArcCW.STATE_SPRINT then return end
|
||
if self:GetReloading() then ic = false end
|
||
if self:GetState() == ArcCW.STATE_DISABLE then return end
|
||
|
||
local noinspect = (CLIENT and ArcCW.ConVars["noinspect"]:GetBool()) or (SERVER and self:GetOwner():GetInfoNum("arccw_noinspect", 0) > 0)
|
||
|
||
if ic then
|
||
if (self:GetNextPrimaryFire() + 0.1) >= CurTime() then return end
|
||
|
||
self:SetState(ArcCW.STATE_CUSTOMIZE)
|
||
self:ExitSights()
|
||
self:SetShouldHoldType()
|
||
self:ExitBipod()
|
||
if !noinspect then
|
||
self:PlayAnimation(self:SelectAnimation("enter_inspect"), nil, true, nil, nil, true, false)
|
||
end
|
||
|
||
if CLIENT then
|
||
self:OpenCustomizeHUD()
|
||
end
|
||
else
|
||
self:SetState(ArcCW.STATE_IDLE)
|
||
self.Sighted = false
|
||
self.Sprinted = false
|
||
self:SetShouldHoldType()
|
||
|
||
if !noinspect then
|
||
self:PlayAnimation(self:SelectAnimation("exit_inspect"), nil, true, nil, nil, true, false)
|
||
end
|
||
|
||
if CLIENT then
|
||
self:CloseCustomizeHUD()
|
||
self:SendAllDetails()
|
||
end
|
||
end
|
||
end
|
||
|
||
if CLIENT then
|
||
|
||
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
|
||
|
||
-- local space_len = surface.GetTextSize(" ")
|
||
|
||
-- for _, word in pairs(string.Split(text, " ")) do
|
||
-- if word == "\n" then
|
||
-- table.insert(content, line)
|
||
-- line = ""
|
||
-- x = 0
|
||
-- else
|
||
-- x = x + surface.GetTextSize(word)
|
||
|
||
-- if x >= limitx then
|
||
-- table.insert(content, line)
|
||
-- line = ""
|
||
-- x = 0
|
||
-- x = x + surface.GetTextSize(word)
|
||
-- end
|
||
|
||
-- line = line .. word .. " "
|
||
|
||
-- x = x + space_len
|
||
|
||
-- -- print(word .. " at " .. tostring(x))
|
||
-- end
|
||
-- end
|
||
|
||
-- table.insert(content, line)
|
||
|
||
return content
|
||
end
|
||
|
||
-- Same snippet of code in Paint() moved to its own function so the button won't be added if it's not valid to begin with
|
||
function SWEP:ValidateAttachment(attname, attslot, i)
|
||
if !self:IsValid() or !self.Attachments then return false end
|
||
local atttbl = ArcCW.AttachmentTable[attname]
|
||
if !atttbl then return true, nil, nil, nil end
|
||
|
||
attslot = attslot or self.Attachments[i]
|
||
|
||
local show = true
|
||
local showqty = true
|
||
local installed = false
|
||
local blocked = !self:CheckFlags(atttbl.ExcludeFlags, atttbl.RequireFlags)
|
||
local owned = self:PlayerOwnsAtt(attname)
|
||
|
||
if !ArcCW:SlotAcceptsAtt(attslot.Slot or "", self, attname) then
|
||
blocked = true
|
||
end
|
||
|
||
if !atttbl or atttbl.Free then
|
||
showqty = false
|
||
end
|
||
|
||
if ArcCW.ConVars["attinv_free"]:GetBool() then
|
||
showqty = false
|
||
end
|
||
|
||
-- if !owned then
|
||
-- showqty = false
|
||
-- end
|
||
|
||
if ArcCW.ConVars["attinv_lockmode"]:GetBool() then
|
||
showqty = false
|
||
end
|
||
|
||
-- orighas checks if the original slot accepts this attachment.
|
||
-- If the original slot is ok but the mergeslot that has the same attachment is not, we're still okay
|
||
local orighas = ArcCW:SlotAcceptsAtt(self.Attachments[i], self, attname) and self:CheckFlags(self.Attachments[i].ExcludeFlags, self.Attachments[i].RequireFlags)
|
||
|
||
if attslot.Installed == attname then
|
||
installed = true
|
||
end
|
||
|
||
if attname == "" and !attslot.Installed then
|
||
installed = true
|
||
|
||
for _, slot in pairs(attslot.MergeSlots or {}) do
|
||
if self.Attachments[slot].Installed then
|
||
installed = false
|
||
break
|
||
end
|
||
end
|
||
end
|
||
|
||
for _, slot in pairs(attslot.MergeSlots or {}) do
|
||
if !slot then continue end
|
||
if !self.Attachments[slot] then continue end
|
||
if !blocked and ArcCW:SlotAcceptsAtt(self.Attachments[slot], self, attname) and
|
||
!self:CheckFlags(self.Attachments[slot].ExcludeFlags, self.Attachments[slot].RequireFlags) and
|
||
!orighas then
|
||
blocked = true
|
||
if self.Attachments[slot].HideIfBlocked then
|
||
show = false
|
||
end
|
||
break
|
||
end
|
||
if self.Attachments[slot].Installed == attname then
|
||
installed = true
|
||
break
|
||
end
|
||
end
|
||
|
||
if blocked and atttbl and atttbl.HideIfBlocked then
|
||
show = false
|
||
end
|
||
|
||
if !owned and atttbl and atttbl.HideIfUnavailable then
|
||
show = false
|
||
end
|
||
|
||
if !owned and ArcCW.ConVars["attinv_hideunowned"]:GetBool() then
|
||
show = false
|
||
end
|
||
|
||
return show, installed, blocked, showqty
|
||
end
|
||
|
||
function SWEP:OpenCustomizeHUD()
|
||
if self:GetPriorityAnim() then return end
|
||
if IsValid(ArcCW.InvHUD) then
|
||
ArcCW.InvHUD:Show()
|
||
-- ArcCW.InvHUD:RequestFocus()
|
||
else
|
||
--if GetConVar("arccw_dev_cust2beta"):GetBool() then self:CreateCustomize2HUD() else self:CreateCustomizeHUD() end
|
||
self:CreateCustomize2HUD()
|
||
gui.SetMousePos(ScrW() / 2, ScrH() / 2)
|
||
end
|
||
|
||
ArcCW.Inv_Hidden = false
|
||
gui.EnableScreenClicker(true)
|
||
|
||
if ArcCW.ConVars["cust_sounds"]:GetBool() then surface.PlaySound("weapons/arccw/extra.wav") end
|
||
|
||
end
|
||
|
||
function SWEP:CloseCustomizeHUD( hide )
|
||
if IsValid(ArcCW.InvHUD) then
|
||
--if !GetConVar("arccw_dev_cust2beta"):GetBool() then
|
||
if false then
|
||
ArcCW.InvHUD:Hide()
|
||
ArcCW.InvHUD:Clear()
|
||
if vrmod and vrmod.MenuExists( "ArcCW_Customize" ) then
|
||
vrmod.MenuClose( "ArcCW_Customize" )
|
||
end
|
||
if !hide then
|
||
ArcCW.InvHUD:Remove()
|
||
end
|
||
else
|
||
-- The new hud fades out instead of commiting sudoku, only do this if we're debugging
|
||
if ArcCW.ConVars["dev_removeonclose"]:GetBool() then
|
||
ArcCW.InvHUD:Remove()
|
||
end
|
||
end
|
||
|
||
if !hide then
|
||
gui.EnableScreenClicker(false)
|
||
end
|
||
ArcCW.Inv_Hidden = false
|
||
|
||
if ArcCW.ConVars["cust_sounds"]:GetBool() then surface.PlaySound("weapons/arccw/extra2.wav") end
|
||
end
|
||
end
|
||
|
||
local defaultatticon = Material("arccw/hud/atts/default.png", "smooth mips")
|
||
local blockedatticon = Material("arccw/hud/atts/blocked.png", "smooth mips")
|
||
local activeslot = nil
|
||
local bird = Material("arccw/hud/arccw_bird.png", "mips smooth")
|
||
|
||
SWEP.InAttMenu = false
|
||
|
||
function SWEP:CreateCustomizeHUD()
|
||
local barsize = ScreenScaleMulti(160)
|
||
local airgap = ScreenScaleMulti(16)
|
||
local smallgap = ScreenScaleMulti(2)
|
||
local linesize = ScreenScaleMulti(1)
|
||
local buttonsize = ScreenScaleMulti(32)
|
||
local fg_col = Color(255, 255, 255, 255)
|
||
local bg_col = Color(0, 0, 0, 150)
|
||
|
||
if !self:IsValid() then return end
|
||
|
||
self.InAttMenu = false
|
||
activeslot = 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()
|
||
|
||
scrw, scrh = scrw - scrwmult, scrh - scrhmult
|
||
|
||
ArcCW.InvHUD:SetPos(0, 0)
|
||
ArcCW.InvHUD:SetSize(scrw, scrh)
|
||
ArcCW.InvHUD:Center()
|
||
ArcCW.InvHUD:SetText("")
|
||
ArcCW.InvHUD:SetTitle("")
|
||
ArcCW.InvHUD.Paint = function(span)
|
||
if !IsValid(self) then
|
||
gui.EnableScreenClicker(false)
|
||
span:Remove()
|
||
end
|
||
|
||
if --[[self:GetState() != ArcCW.STATE_CUSTOMIZE or]] self:GetReloading() then
|
||
span:Remove()
|
||
end
|
||
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
|
||
|
||
gui.EnableScreenClicker(false)
|
||
end
|
||
|
||
if ArcCW.ConVars["attinv_onlyinspect"]:GetBool() then
|
||
return
|
||
end
|
||
|
||
local loadpresets = vgui.Create("DButton", ArcCW.InvHUD)
|
||
loadpresets:SetSize((barsize - ScreenScaleMulti(2)) / 2, ScreenScaleMulti(14))
|
||
loadpresets:SetText("")
|
||
loadpresets:SetPos(scrw - barsize - airgap, airgap)
|
||
|
||
loadpresets.OnMousePressed = function(spaa, kc)
|
||
self:CreatePresetMenu()
|
||
end
|
||
|
||
loadpresets.Paint = function(spaa, w, h)
|
||
if !self:IsValid() then return end
|
||
if !self.Attachments then return end
|
||
local Bfg_col = Color(255, 255, 255, 255)
|
||
local Bbg_col = Color(0, 0, 0, 100)
|
||
|
||
if spaa:IsHovered() then
|
||
Bbg_col = Color(255, 255, 255, 100)
|
||
Bfg_col = Color(0, 0, 0, 255)
|
||
end
|
||
|
||
surface.SetDrawColor(Bbg_col)
|
||
surface.DrawRect(0, 0, w, h)
|
||
|
||
local txt = (translate("ui.loadpreset"))
|
||
|
||
surface.SetTextColor(Bfg_col)
|
||
surface.SetTextPos(smallgap, ScreenScaleMulti(1))
|
||
surface.SetFont("ArcCW_12")
|
||
surface.DrawText(txt)
|
||
end
|
||
|
||
local savepresets = vgui.Create("DButton", ArcCW.InvHUD)
|
||
savepresets:SetSize((barsize - ScreenScaleMulti(2)) / 2, ScreenScaleMulti(14))
|
||
savepresets:SetText("")
|
||
savepresets:SetPos(scrw - (barsize / 2) + ScreenScaleMulti(1) - airgap, airgap)
|
||
|
||
savepresets.OnMousePressed = function(spaa, kc)
|
||
self:CreatePresetSave()
|
||
end
|
||
|
||
savepresets.Paint = function(spaa, w, h)
|
||
if !self:IsValid() then return end
|
||
if !self.Attachments then return end
|
||
local Bfg_col = Color(255, 255, 255, 255)
|
||
local Bbg_col = Color(0, 0, 0, 100)
|
||
|
||
if spaa:IsHovered() then
|
||
Bbg_col = Color(255, 255, 255, 100)
|
||
Bfg_col = Color(0, 0, 0, 255)
|
||
end
|
||
|
||
surface.SetDrawColor(Bbg_col)
|
||
surface.DrawRect(0, 0, w, h)
|
||
|
||
local txt = (translate("ui.savepreset"))
|
||
|
||
surface.SetTextColor(Bfg_col)
|
||
surface.SetTextPos(smallgap, ScreenScaleMulti(1))
|
||
surface.SetFont("ArcCW_12")
|
||
surface.DrawText(txt)
|
||
end
|
||
|
||
local attcatsy = scrh - ScreenScaleMulti(64) - airgap
|
||
|
||
local attcats = vgui.Create("DScrollPanel", ArcCW.InvHUD)
|
||
attcats:SetText("")
|
||
attcats:SetSize(barsize, attcatsy)
|
||
attcats:SetPos(airgap, airgap)
|
||
attcats.Paint = function(span, w, h)
|
||
-- surface.SetDrawColor(bg_col)
|
||
-- surface.DrawRect(0, 0, w, h)
|
||
end
|
||
|
||
local triviabox = vgui.Create("DScrollPanel", ArcCW.InvHUD)
|
||
triviabox:SetText("")
|
||
triviabox:SetSize(barsize, scrh - ScreenScaleMulti(64) - (3 * airgap))
|
||
triviabox:SetPos(scrw - barsize - airgap, 2 * airgap)
|
||
triviabox.Paint = function(span, w, h)
|
||
surface.SetDrawColor(bg_col)
|
||
surface.DrawRect(0, 0, w, h)
|
||
end
|
||
|
||
local sbar = attcats:GetVBar()
|
||
sbar.Paint = function() end
|
||
|
||
sbar.btnUp.Paint = function(span, w, h)
|
||
end
|
||
|
||
sbar.btnDown.Paint = function(span, w, h)
|
||
end
|
||
|
||
sbar.btnGrip.Paint = function(span, w, h)
|
||
surface.SetDrawColor(fg_col)
|
||
surface.DrawRect(0, 0, w, h)
|
||
end
|
||
|
||
local wpninfo = attcats:Add("DLabel")
|
||
wpninfo:SetSize(barsize, buttonsize)
|
||
wpninfo:SetText("")
|
||
wpninfo:Dock( TOP )
|
||
wpninfo:DockMargin( 0, 0, 0, smallgap )
|
||
|
||
wpninfo.Paint = function(span, w, h)
|
||
if !IsValid(self) then return end
|
||
local Bfg_col = fg_col
|
||
local Bbg_col = bg_col
|
||
|
||
surface.SetDrawColor(Bbg_col)
|
||
surface.DrawRect(0, 0, w, h)
|
||
surface.DrawRect(0, 0, w, h / 2)
|
||
|
||
surface.SetDrawColor(Bfg_col)
|
||
surface.DrawRect(0, (h - linesize) / 2, w, linesize)
|
||
|
||
surface.SetTextColor(SolidBlack)
|
||
surface.SetTextPos(smallgap, 0)
|
||
surface.SetFont("ArcCW_12_Glow")
|
||
surface.DrawText(translate("name." .. self:GetClass() .. (ArcCW.ConVars["truenames"]:GetBool() and ".true" or "")) or self.PrintName)
|
||
|
||
surface.SetTextColor(Bfg_col)
|
||
surface.SetTextPos(smallgap, 0)
|
||
surface.SetFont("ArcCW_12")
|
||
surface.DrawText(translate("name." .. self:GetClass() .. (ArcCW.ConVars["truenames"]:GetBool() and ".true" or "")) or self.PrintName)
|
||
|
||
surface.SetTextColor(Bfg_col)
|
||
surface.SetTextPos(smallgap * 2, (h - linesize) / 2 + smallgap)
|
||
surface.SetFont("ArcCW_12")
|
||
|
||
local pick = self:GetPickX()
|
||
|
||
if pick <= 0 then
|
||
surface.DrawText(ArcCW.TryTranslation(self:GetBuff_Override("Override_Trivia_Class") or self.Trivia_Class))
|
||
else
|
||
local txt = self:CountAttachments() .. "/" .. pick .. " Attachments"
|
||
|
||
surface.DrawText(txt)
|
||
end
|
||
end
|
||
|
||
local statbox = vgui.Create("DScrollPanel", ArcCW.InvHUD)
|
||
statbox:SetText("")
|
||
statbox:SetSize(barsize, scrh - ScreenScaleMulti(64) - (3 * airgap))
|
||
statbox:SetPos(scrw - barsize - airgap, 2 * airgap)
|
||
statbox.Paint = function(span, w, h)
|
||
surface.SetDrawColor(bg_col)
|
||
surface.DrawRect(0, 0, w, h)
|
||
end
|
||
statbox:Hide()
|
||
local regenStatList -- early definition so category unequiping can update
|
||
|
||
local sbar3 = statbox:GetVBar()
|
||
sbar3.Paint = function() end
|
||
|
||
sbar3.btnUp.Paint = function(span, w, h)
|
||
end
|
||
|
||
sbar3.btnDown.Paint = function(span, w, h)
|
||
end
|
||
|
||
sbar3.btnGrip.Paint = function(span, w, h)
|
||
surface.SetDrawColor(fg_col)
|
||
surface.DrawRect(0, 0, w, h)
|
||
end
|
||
|
||
local attmenuh = scrh - (2 * airgap)
|
||
|
||
local attmenu = vgui.Create("DScrollPanel", ArcCW.InvHUD)
|
||
attmenu:SetText("")
|
||
attmenu:SetSize(barsize + ScreenScaleMulti(12), attmenuh)
|
||
attmenu:SetPos(airgap + barsize + smallgap, airgap)
|
||
attmenu.Paint = function(span, w, h)
|
||
-- surface.SetDrawColor(bg_col)
|
||
-- surface.DrawRect(0, 0, w, h)
|
||
end
|
||
attmenu:Hide()
|
||
|
||
local sbar4 = attmenu:GetVBar()
|
||
sbar4.Paint = function() end
|
||
|
||
sbar4.btnUp.Paint = function(span, w, h)
|
||
end
|
||
|
||
sbar4.btnDown.Paint = function(span, w, h)
|
||
end
|
||
|
||
sbar4.btnGrip.Paint = function(span, w, h)
|
||
surface.SetDrawColor(fg_col)
|
||
surface.DrawRect(0, 0, w, h)
|
||
end
|
||
|
||
local attslidebox = vgui.Create("DPanel", ArcCW.InvHUD)
|
||
attslidebox:SetSize(barsize, ScreenScaleMulti(20))
|
||
attslidebox:SetPos(scrw - barsize - airgap, scrh - ScreenScaleMulti(64) - (1 * airgap))
|
||
attslidebox.Paint = function(span, w, h)
|
||
surface.SetDrawColor(bg_col)
|
||
surface.DrawRect(0, 0, w, h)
|
||
|
||
surface.SetTextColor(fg_col)
|
||
surface.SetFont("ArcCW_6")
|
||
surface.SetTextPos(smallgap, smallgap)
|
||
surface.DrawText(translate("ui.position"))
|
||
end
|
||
|
||
local attslider = vgui.Create("DSlider", attslidebox)
|
||
attslider:SetPos(ScreenScaleMulti(4), ScreenScaleMulti(12))
|
||
attslider:SetSize(barsize - ScreenScaleMulti(4 * 2), ScreenScaleMulti(4))
|
||
|
||
attslider.Paint = function(span, w, h)
|
||
surface.SetDrawColor(fg_col)
|
||
surface.DrawRect(0, h / 2, w, ScreenScaleMulti(1))
|
||
end
|
||
|
||
local lastslidepos = 0
|
||
local lastsoundtime = 0
|
||
|
||
attslider.Knob.Paint = function(span, w, h)
|
||
if !self:IsValid() then return end
|
||
if !self.Attachments then return end
|
||
|
||
if span:IsHovered() or attslider:GetDragging() then
|
||
surface.SetDrawColor(fg_col)
|
||
surface.DrawRect((w - ScreenScaleMulti(2)) / 2, 0, ScreenScaleMulti(2), h)
|
||
else
|
||
surface.SetDrawColor(fg_col)
|
||
surface.DrawRect((w - ScreenScaleMulti(1)) / 2, 0, ScreenScaleMulti(1), h)
|
||
end
|
||
|
||
if attslider:GetDragging() and activeslot then
|
||
local delta = attslider:GetSlideX()
|
||
if lastslidepos != delta and lastsoundtime <= CurTime() then
|
||
|
||
EmitSound("weapons/arccw/dragatt.wav", EyePos(), -2, CHAN_ITEM, 1,75, 0, math.Clamp(delta * 200, 90, 110))
|
||
|
||
lastsoundtime = CurTime() + 0.05
|
||
end
|
||
|
||
self.Attachments[activeslot].SlidePos = delta
|
||
lastslidepos = delta
|
||
end
|
||
|
||
attslider:SetSlideX((self.Attachments[activeslot] or {}).SlidePos or 0.5)
|
||
end
|
||
|
||
local og_attsliderknobmr = attslider.Knob.OnMouseReleased
|
||
|
||
attslider.Knob.OnMouseReleased = function(span, kc)
|
||
og_attsliderknobmr(span, kc)
|
||
self:SendDetail_SlidePos(activeslot)
|
||
self:SavePreset("autosave")
|
||
end
|
||
|
||
attslidebox:Hide()
|
||
|
||
local atttogglebtn = vgui.Create("DButton", ArcCW.InvHUD)
|
||
atttogglebtn:SetSize(barsize * 0.25, ScreenScaleMulti(15))
|
||
atttogglebtn:SetPos(scrw - barsize - airgap + barsize * 0.75, scrh - ScreenScaleMulti(64) - (1 * airgap))
|
||
atttogglebtn:SetText("")
|
||
atttogglebtn.OnMousePressed = function(spaa, kc)
|
||
if !self.Attachments[activeslot] then return end
|
||
local catttbl = ArcCW.AttachmentTable[self.Attachments[activeslot].Installed]
|
||
if !catttbl or !catttbl.ToggleStats then return end
|
||
|
||
self:ToggleSlot(activeslot)
|
||
--[[]
|
||
self.Attachments[activeslot].ToggleNum = (self.Attachments[activeslot].ToggleNum or 1) + 1
|
||
if self.Attachments[activeslot].ToggleNum > #catttbl.ToggleStats then
|
||
self.Attachments[activeslot].ToggleNum = 1
|
||
end
|
||
self:SendDetail_ToggleNum(activeslot)
|
||
self:AdjustAtts()
|
||
if self:GetHasFlashlights() then
|
||
self:CreateFlashlightsVM()
|
||
end
|
||
|
||
EmitSound("weapons/arccw/firemode.wav", EyePos(), -2, CHAN_ITEM, 1,75, 0, 100)
|
||
]]
|
||
end
|
||
atttogglebtn.Paint = function(spaa, w, h)
|
||
if !self:IsValid() then return end
|
||
if !self.Attachments then return end
|
||
local Bfg_col = Color(255, 255, 255, 255)
|
||
local Bbg_col = Color(0, 0, 0, 100)
|
||
|
||
if spaa:IsHovered() then
|
||
Bbg_col = Color(255, 255, 255, 100)
|
||
Bfg_col = Color(0, 0, 0, 255)
|
||
end
|
||
|
||
surface.SetDrawColor(Bbg_col)
|
||
surface.DrawRect(0, 0, w, h)
|
||
|
||
local txt = (translate("ui.toggle"))
|
||
local catttbl = activeslot and ArcCW.AttachmentTable[self.Attachments[activeslot].Installed]
|
||
if catttbl and catttbl.ToggleStats[self.Attachments[activeslot].ToggleNum]
|
||
and catttbl.ToggleStats[self.Attachments[activeslot].ToggleNum].PrintName then
|
||
txt = ArcCW.TryTranslation(catttbl.ToggleStats[self.Attachments[activeslot].ToggleNum].PrintName)
|
||
end
|
||
|
||
surface.SetTextColor(Bfg_col)
|
||
surface.SetTextPos(smallgap, ScreenScaleMulti(1))
|
||
surface.SetFont("ArcCW_12")
|
||
surface.DrawText(txt)
|
||
end
|
||
|
||
atttogglebtn:Hide()
|
||
|
||
local atttrivia = vgui.Create("DScrollPanel", ArcCW.InvHUD)
|
||
atttrivia:SetSize(barsize, scrh - ScreenScaleMulti(116))
|
||
atttrivia:SetPos(scrw - barsize - airgap, 2 * airgap)
|
||
atttrivia.Paint = function(span, w, h)
|
||
surface.SetDrawColor(bg_col)
|
||
surface.DrawRect(0, 0, w, h)
|
||
end
|
||
atttrivia:Hide()
|
||
|
||
local sbar5 = atttrivia:GetVBar()
|
||
sbar5.Paint = function() end
|
||
|
||
sbar5.btnUp.Paint = function(span, w, h)
|
||
end
|
||
|
||
sbar5.btnDown.Paint = function(span, w, h)
|
||
end
|
||
|
||
sbar5.btnGrip.Paint = function(span, w, h)
|
||
surface.SetDrawColor(fg_col)
|
||
surface.DrawRect(0, 0, w, h)
|
||
end
|
||
|
||
local last_atttrivia = nil
|
||
|
||
local function atttrivia_do(att, slot)
|
||
|
||
if !att then
|
||
last_atttrivia = att
|
||
atttrivia:Hide()
|
||
atttrivia:Clear()
|
||
return
|
||
end
|
||
|
||
if att == "" then
|
||
last_atttrivia = att
|
||
atttrivia:Hide()
|
||
atttrivia:Clear()
|
||
return
|
||
end
|
||
|
||
if att == last_atttrivia then
|
||
last_atttrivia = att
|
||
return
|
||
end
|
||
|
||
atttrivia:Clear()
|
||
|
||
last_atttrivia = att
|
||
|
||
local atttbl = ArcCW.AttachmentTable[att]
|
||
|
||
atttrivia:Show()
|
||
|
||
-- att name
|
||
|
||
local triv_attname = vgui.Create("DLabel", atttrivia)
|
||
triv_attname:SetSize(barsize, ScreenScaleMulti(16))
|
||
triv_attname:Dock(TOP)
|
||
triv_attname:DockMargin( 0, 0, 0, 0 )
|
||
triv_attname:SetText("")
|
||
triv_attname.Paint = function(span, w, h)
|
||
local txt = multlinetext(translate("name." .. att) or atttbl.PrintName, w, "ArcCW_16")
|
||
|
||
c = 0
|
||
|
||
for _, i in pairs(txt) do
|
||
surface.SetFont("ArcCW_16")
|
||
local tw = surface.GetTextSize(i)
|
||
|
||
surface.SetFont("ArcCW_16_Glow")
|
||
surface.SetTextPos((smallgap + (w - tw)) / 2, c)
|
||
surface.SetTextColor(SolidBlack)
|
||
surface.DrawText(i)
|
||
|
||
surface.SetFont("ArcCW_16")
|
||
surface.SetTextPos((smallgap + (w - tw)) / 2, c)
|
||
surface.SetTextColor(fg_col)
|
||
surface.DrawText(i)
|
||
|
||
c = c + ScreenScaleMulti(16)
|
||
end
|
||
|
||
span:SetSize(barsize, c)
|
||
end
|
||
|
||
-- att pic
|
||
|
||
local triv_pic = vgui.Create("DLabel", atttrivia)
|
||
triv_pic:SetSize(barsize, barsize / 2)
|
||
triv_pic:Dock(TOP)
|
||
triv_pic:DockMargin( 0, 0, 0, smallgap )
|
||
triv_pic:SetText("")
|
||
triv_pic.Paint = function(span, w, h)
|
||
local img = atttbl.Icon or defaultatticon
|
||
if !img or img:IsError() then img = bird end
|
||
|
||
surface.SetDrawColor(fg_col)
|
||
surface.SetMaterial(img)
|
||
surface.DrawTexturedRect(h / 2, 0, h, h)
|
||
end
|
||
|
||
-- att desc
|
||
|
||
desctext = multlinetext(translate("desc." .. att) or atttbl.Description, barsize - smallgap * 2, "ArcCW_8")
|
||
|
||
local triv_desc = vgui.Create("DLabel", atttrivia)
|
||
triv_desc:SetSize(barsize, ScreenScaleMulti(8) * (table.Count(desctext) + 1))
|
||
triv_desc:SetText("")
|
||
triv_desc:DockMargin( 0, 0, 0, smallgap )
|
||
triv_desc:Dock(TOP)
|
||
triv_desc.Paint = function(span, w, h)
|
||
local y = ScreenScaleMulti(8)
|
||
for i, line in pairs(desctext) do
|
||
surface.SetFont("ArcCW_8")
|
||
surface.SetTextPos(smallgap * 2, y)
|
||
surface.SetTextColor(fg_col)
|
||
surface.DrawText(line)
|
||
y = y + ScreenScaleMulti(8)
|
||
end
|
||
end
|
||
|
||
local neutrals = atttbl.Desc_Neutrals or {}
|
||
|
||
local pros, cons = ArcCW:GetProsCons(self, atttbl, self.Attachments[slot].ToggleNum)
|
||
|
||
if (pros and #pros or 0) > 0 then
|
||
|
||
local triv_pros = vgui.Create("DLabel", atttrivia)
|
||
triv_pros:SetSize(barsize, ScreenScaleMulti(10))
|
||
triv_pros:SetText("")
|
||
triv_pros:Dock(TOP)
|
||
triv_pros.Paint = function(span, w, h)
|
||
surface.SetDrawColor(Color(0, 50, 0, 100))
|
||
surface.DrawRect(0, 0, w, h)
|
||
|
||
surface.SetTextColor(Color(125, 200, 125))
|
||
surface.SetFont("ArcCW_8")
|
||
surface.SetTextPos(smallgap, 0)
|
||
surface.DrawText(translate("ui.positives"))
|
||
end
|
||
|
||
for _, i in pairs(pros) do
|
||
local triv_pro = vgui.Create("DLabel", atttrivia)
|
||
triv_pro:SetSize(barsize, ScreenScaleMulti(10))
|
||
triv_pro:SetText("")
|
||
triv_pro:Dock(TOP)
|
||
triv_pro.Paint = function(span, w, h)
|
||
|
||
surface.SetTextColor(Color(150, 225, 150))
|
||
surface.SetFont("ArcCW_8")
|
||
surface.SetTextPos(smallgap, 0)
|
||
surface.DrawText(i)
|
||
end
|
||
end
|
||
end
|
||
|
||
if (cons and #cons or 0) > 0 then
|
||
local triv_cons = vgui.Create("DLabel", atttrivia)
|
||
triv_cons:SetSize(barsize, ScreenScaleMulti(10))
|
||
triv_cons:SetText("")
|
||
triv_cons:Dock(TOP)
|
||
triv_cons.Paint = function(span, w, h)
|
||
surface.SetDrawColor(Color(50, 0, 0, 100))
|
||
surface.DrawRect(0, 0, w, h)
|
||
|
||
surface.SetTextColor(Color(200, 125, 125))
|
||
surface.SetFont("ArcCW_8")
|
||
surface.SetTextPos(smallgap, 0)
|
||
surface.DrawText(translate("ui.negatives"))
|
||
end
|
||
|
||
for _, i in pairs(cons) do
|
||
local triv_con = vgui.Create("DLabel", atttrivia)
|
||
triv_con:SetSize(barsize, ScreenScaleMulti(10))
|
||
triv_con:SetText("")
|
||
triv_con:Dock(TOP)
|
||
triv_con.Paint = function(span, w, h)
|
||
|
||
surface.SetTextColor(Color(225, 150, 150))
|
||
surface.SetFont("ArcCW_8")
|
||
surface.SetTextPos(smallgap, 0)
|
||
surface.DrawText(i)
|
||
end
|
||
end
|
||
end
|
||
|
||
if #neutrals > 0 then
|
||
|
||
local triv_neutrals = vgui.Create("DLabel", atttrivia)
|
||
triv_neutrals:SetSize(barsize, ScreenScaleMulti(10))
|
||
triv_neutrals:SetText("")
|
||
triv_neutrals:Dock(TOP)
|
||
triv_neutrals.Paint = function(span, w, h)
|
||
surface.SetDrawColor(Color(0, 0, 50, 100))
|
||
surface.DrawRect(0, 0, w, h)
|
||
|
||
surface.SetTextColor(Color(125, 125, 200))
|
||
surface.SetFont("ArcCW_8")
|
||
surface.SetTextPos(smallgap, 0)
|
||
surface.DrawText(translate("ui.information"))
|
||
end
|
||
|
||
for _, i in pairs(neutrals) do
|
||
local triv_neutral = vgui.Create("DLabel", atttrivia)
|
||
triv_neutral:SetSize(barsize, ScreenScaleMulti(10))
|
||
triv_neutral:SetText("")
|
||
triv_neutral:Dock(TOP)
|
||
triv_neutral.Paint = function(span, w, h)
|
||
|
||
surface.SetTextColor(Color(150, 150, 225))
|
||
surface.SetFont("ArcCW_8")
|
||
surface.SetTextPos(smallgap, 0)
|
||
surface.DrawText(ArcCW.TryTranslation(i))
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
ArcCW.InvHUD.OnMousePressed = function(span, kc)
|
||
if (kc == MOUSE_LEFT or kc == MOUSE_RIGHT) and
|
||
!triviabox:IsVisible() and !statbox:IsVisible() then
|
||
activeslot = nil
|
||
triviabox:Show()
|
||
statbox:Hide()
|
||
attmenu:Hide()
|
||
self.InAttMenu = false
|
||
atttrivia:Hide()
|
||
attslidebox:Hide()
|
||
atttogglebtn:Hide()
|
||
if ArcCW.ConVars["cust_sounds"]:GetBool() then surface.PlaySound("weapons/arccw/close.wav") end
|
||
end
|
||
end
|
||
|
||
for i, k in pairs(self.Attachments) do
|
||
if !k.PrintName then continue end
|
||
if i == "BaseClass" then continue end
|
||
if k.Hidden or k.Blacklisted then continue end
|
||
if k.Integral then continue end
|
||
|
||
local attcatb = attcats:Add("DButton")
|
||
if ArcCW.ConVars["hud_embracetradition"]:GetBool() then
|
||
attcatb:SetSize(barsize, buttonsize )
|
||
else
|
||
attcatb:SetSize(barsize, buttonsize / 2)
|
||
end
|
||
attcatb:SetText("")
|
||
attcatb:Dock( TOP )
|
||
attcatb:DockMargin( 0, 0, 0, smallgap )
|
||
|
||
attcatb.AttIndex = i
|
||
attcatb.AttSlot = k
|
||
|
||
local function attcatb_regen(span)
|
||
local catt = self.Attachments[span.AttIndex].Installed
|
||
local catttbl
|
||
if catt then
|
||
catttbl = ArcCW.AttachmentTable[catt]
|
||
end
|
||
|
||
if self.Attachments[span.AttIndex].Installed and self.Attachments[span.AttIndex].SlideAmount and !catttbl.MountPositionOverride then
|
||
attslidebox:Show()
|
||
else
|
||
attslidebox:Hide()
|
||
end
|
||
|
||
if self.Attachments[span.AttIndex].Installed and catttbl and catttbl.ToggleStats then
|
||
if attslidebox:IsVisible() then
|
||
atttogglebtn:SetPos(scrw - barsize - airgap + barsize * 0.75, scrh - ScreenScaleMulti(40) - (1 * airgap))
|
||
else
|
||
atttogglebtn:SetPos(scrw - barsize - airgap + barsize * 0.75, scrh - ScreenScaleMulti(64) - (1 * airgap))
|
||
end
|
||
atttogglebtn:Show()
|
||
else
|
||
atttogglebtn:Hide()
|
||
end
|
||
|
||
attmenu:Clear()
|
||
|
||
local atts = {}
|
||
local slots = {i}
|
||
local attCheck = {}
|
||
|
||
table.Add(slots, k.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] = ""
|
||
|
||
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 ca = 0
|
||
|
||
for _, att in pairs(atts) do
|
||
local aslot = att
|
||
if istable(att) then
|
||
aslot = aslot.slot
|
||
att = att.att
|
||
end
|
||
local owned = self:PlayerOwnsAtt(att)
|
||
|
||
if !owned and ArcCW.ConVars["attinv_hideunowned"]:GetBool() then continue end
|
||
|
||
local valid, installed, blocked, showqty = self:ValidateAttachment(att, k, i)
|
||
|
||
if !valid then continue end
|
||
|
||
local attbtn = attmenu:Add("DButton")
|
||
attbtn:SetSize(barsize + ScreenScaleMulti(12), ScreenScaleMulti(14))
|
||
attbtn:SetText("")
|
||
attbtn:Dock( TOP )
|
||
attbtn:DockMargin( 0, 0, 0, smallgap )
|
||
|
||
ca = ca + 1
|
||
|
||
attbtn.AttName = att
|
||
|
||
attbtn.OnMousePressed = function(spaa, kc2)
|
||
|
||
owned = self:PlayerOwnsAtt(spaa.AttName)
|
||
local installed = false
|
||
local orighas = ArcCW:SlotAcceptsAtt(self.Attachments[i], self, spaa.AttName) and self:CheckFlags(self.Attachments[i].ExcludeFlags, self.Attachments[i].RequireFlags)
|
||
|
||
local atttbl = ArcCW.AttachmentTable[spaa.AttName]
|
||
if atttbl then
|
||
if !self:CheckFlags(atttbl.ExcludeFlags, atttbl.RequireFlags) then return end
|
||
for _, slot in pairs(k.MergeSlots or {}) do
|
||
if self.Attachments[slot].Installed then
|
||
installed = true
|
||
end
|
||
|
||
if slot and self.Attachments[slot] and
|
||
ArcCW:SlotAcceptsAtt(self.Attachments[slot], self, spaa.AttName) and
|
||
!self:CheckFlags(self.Attachments[slot].ExcludeFlags, self.Attachments[slot].RequireFlags) and
|
||
!orighas then
|
||
return
|
||
end
|
||
end
|
||
end
|
||
|
||
if kc2 == MOUSE_LEFT and owned then
|
||
|
||
if spaa.AttName == "" then
|
||
self:DetachAllMergeSlots(span.AttIndex)
|
||
else
|
||
self:DetachAllMergeSlots(span.AttIndex, true)
|
||
self:Attach(aslot, spaa.AttName)
|
||
end
|
||
elseif kc2 == MOUSE_RIGHT and spaa.AttName != "" then
|
||
if span.AttSlot.Installed == spaa.AttName then
|
||
-- Unequip
|
||
self:DetachAllMergeSlots(span.AttIndex)
|
||
elseif installed then
|
||
self:DetachAllMergeSlots(span.AttIndex)
|
||
elseif owned then
|
||
-- Drop attachment
|
||
if ArcCW.ConVars["attinv_free"]:GetBool() then return end
|
||
if ArcCW.ConVars["attinv_lockmode"]:GetBool() then return end
|
||
if ArcCW.ConVars["enable_customization"]:GetInt() < 0 then return end
|
||
if !ArcCW.ConVars["enable_dropping"]:GetBool() then return end
|
||
|
||
net.Start("arccw_asktodrop")
|
||
net.WriteUInt(ArcCW.AttachmentTable[spaa.AttName].ID, 24)
|
||
net.SendToServer()
|
||
|
||
ArcCW:PlayerTakeAtt(self:GetOwner(), spaa.AttName)
|
||
end
|
||
end
|
||
|
||
attcatb_regen(span)
|
||
end
|
||
|
||
attbtn.Paint = function(spaa, w, h)
|
||
if !self:IsValid() then return end
|
||
if !self.Attachments then return end
|
||
local Bfg_col = Color(255, 255, 255, 255)
|
||
local Bbg_col = Color(0, 0, 0, 100)
|
||
local atttbl = ArcCW.AttachmentTable[spaa.AttName]
|
||
local qty = ArcCW:PlayerGetAtts(self:GetOwner(), spaa.AttName)
|
||
|
||
valid, installed, blocked, showqty = self:ValidateAttachment(att, k, i)
|
||
if !valid then
|
||
attbtn:Remove()
|
||
return
|
||
end
|
||
|
||
owned = self:PlayerOwnsAtt(spaa.AttName)
|
||
|
||
if !atttbl and ArcCW.AttachmentTable[k.EmptyFallback] then
|
||
atttbl = ArcCW.AttachmentTable[k.EmptyFallback]
|
||
elseif !atttbl then
|
||
atttbl = {
|
||
PrintName = k.DefaultAttName and ArcCW.TryTranslation(k.DefaultAttName) or translate("attslot.noatt"),
|
||
Icon = k.DefaultAttIcon or defaultatticon,
|
||
Free = true
|
||
}
|
||
end
|
||
|
||
if spaa:IsHovered() or installed then
|
||
Bbg_col = Color(255, 255, 255, 100)
|
||
Bfg_col = Color(0, 0, 0, 255)
|
||
end
|
||
|
||
if spaa:IsHovered() and installed then
|
||
Bbg_col = Color(255, 255, 255, 200)
|
||
Bfg_col = Color(0, 0, 0, 255)
|
||
end
|
||
|
||
if spaa:IsHovered() then
|
||
atttrivia_do(spaa.AttName, i)
|
||
end
|
||
|
||
if !owned and ArcCW.ConVars["attinv_darkunowned"]:GetBool() then
|
||
if spaa:IsHovered() then
|
||
Bbg_col = Color(50, 50, 50, 150)
|
||
Bfg_col = Color(150, 150, 150, 255)
|
||
else
|
||
Bbg_col = Color(20, 20, 20, 150)
|
||
Bfg_col = Color(150, 150, 150, 255)
|
||
end
|
||
elseif !owned or blocked then
|
||
if spaa:IsHovered() then
|
||
Bbg_col = Color(125, 25, 25, 150)
|
||
Bfg_col = Color(150, 50, 50, 255)
|
||
else
|
||
Bbg_col = Color(75, 0, 0, 150)
|
||
Bfg_col = Color(150, 50, 50, 255)
|
||
end
|
||
end
|
||
|
||
local max = atttbl.Max
|
||
|
||
if max then
|
||
local amt = 0
|
||
|
||
for i2, k2 in pairs(self.Attachments) do
|
||
if k2.Installed == spaa.AttName then
|
||
amt = amt + 1
|
||
end
|
||
end
|
||
|
||
if amt >= max and self.Attachments[i].Installed != spaa.AttName then
|
||
if spaa:IsHovered() then
|
||
Bbg_col = Color(125, 25, 25, 150)
|
||
Bfg_col = Color(150, 50, 50, 255)
|
||
else
|
||
Bbg_col = Color(75, 0, 0, 150)
|
||
Bfg_col = Color(150, 50, 50, 255)
|
||
end
|
||
end
|
||
end
|
||
|
||
surface.SetDrawColor(Bbg_col)
|
||
surface.DrawRect(0, 0, w, h)
|
||
surface.DrawRect(0, 0, h * 1.5, h)
|
||
|
||
surface.SetDrawColor(Bfg_col)
|
||
surface.DrawRect((h * 1.5) - (linesize / 2), 0, linesize, h)
|
||
|
||
local txt = translate("name." .. spaa.AttName) or atttbl.PrintName or "???"
|
||
|
||
if showqty then
|
||
txt = txt .. " (" .. tostring(qty) .. ")"
|
||
end
|
||
|
||
surface.SetTextColor(Bfg_col)
|
||
surface.SetTextPos((h * 1.5) + smallgap, ScreenScaleMulti(1))
|
||
surface.SetFont("ArcCW_12")
|
||
|
||
DrawTextRot(spaa, txt, h * 1.5, 0, (h * 1.5) + smallgap, ScreenScaleMulti(1), w - (h * 1.5))
|
||
|
||
-- surface.DrawText(txt)
|
||
|
||
local icon = k.DefaultAttIcon or defaultatticon
|
||
if atttbl then
|
||
icon = atttbl.Icon
|
||
end
|
||
if (!icon or icon:IsError()) then icon = bird end
|
||
|
||
surface.SetDrawColor(Bfg_col)
|
||
surface.SetMaterial(icon)
|
||
surface.DrawTexturedRect(h / 4, 0, h, h)
|
||
|
||
if blocked then
|
||
surface.SetDrawColor(color_white)
|
||
surface.SetMaterial(blockedatticon)
|
||
surface.DrawTexturedRect(h / 4 - h * 0.1, - h * 0.1, h * 1.2, h * 1.2)
|
||
end
|
||
end
|
||
end
|
||
|
||
local specsize = ca * (ScreenScaleMulti(14) + smallgap)
|
||
|
||
attmenu:SetSize(barsize + ScreenScaleMulti(12), math.min(specsize, attmenuh))
|
||
end
|
||
|
||
attcatb.OnMousePressed = function(span, kc)
|
||
if !self:CheckFlags(span.AttSlot.ExcludeFlags, span.AttSlot.RequireFlags) then
|
||
return
|
||
end
|
||
|
||
if kc == MOUSE_LEFT then
|
||
if activeslot == span.AttIndex then
|
||
activeslot = nil
|
||
triviabox:Show()
|
||
statbox:Hide()
|
||
attmenu:Hide()
|
||
self.InAttMenu = false
|
||
atttrivia:Hide()
|
||
attslidebox:Hide()
|
||
atttogglebtn:Hide()
|
||
surface.PlaySound("weapons/arccw/close.wav")
|
||
else
|
||
activeslot = span.AttIndex
|
||
triviabox:Hide()
|
||
statbox:Hide()
|
||
attmenu:Show()
|
||
attslider:SetSlideX(self.Attachments[span.AttIndex].SlidePos)
|
||
lastslidepos = self.Attachments[span.AttIndex].SlidePos
|
||
self.InAttMenu = true
|
||
surface.PlaySound("weapons/arccw/open.wav")
|
||
|
||
span.TextRot = 0
|
||
span.StartTextRot = CurTime()
|
||
span.TextRotState = 0
|
||
|
||
if self.Attachments[span.AttIndex].Installed then
|
||
atttrivia_do(self.Attachments[span.AttIndex].Installed, span.AttIndex)
|
||
end
|
||
|
||
attcatb_regen(span)
|
||
end
|
||
elseif kc == MOUSE_RIGHT then
|
||
self:DetachAllMergeSlots(span.AttIndex)
|
||
attcatb_regen(span)
|
||
if statbox:IsVisible() then
|
||
regenStatList()
|
||
end
|
||
end
|
||
end
|
||
|
||
attcatb.Paint = function(span, w, h)
|
||
|
||
-- Might error when player dies
|
||
if !self or !self.Attachments then return end
|
||
|
||
local Bfg_col = Color(255, 255, 255, 255)
|
||
local Bbg_col = Color(0, 0, 0, 100)
|
||
|
||
if span:IsHovered() or activeslot == span.AttIndex then
|
||
Bbg_col = Color(255, 255, 255, 100)
|
||
Bfg_col = Color(0, 0, 0, 255)
|
||
end
|
||
|
||
if span:IsHovered() and activeslot == span.AttIndex then
|
||
Bbg_col = Color(255, 255, 255, 200)
|
||
Bfg_col = Color(0, 0, 0, 255)
|
||
end
|
||
|
||
if self.CheckFlags and !self:CheckFlags(span.AttSlot.ExcludeFlags, span.AttSlot.RequireFlags) then
|
||
Bbg_col = Color(75, 0, 0, 150)
|
||
Bfg_col = Color(150, 50, 50, 255)
|
||
end
|
||
|
||
local txt = ArcCW.TryTranslation(k.PrintName)
|
||
|
||
local att_txt = k.DefaultAttName and ArcCW.TryTranslation(k.DefaultAttName) or translate("attslot.noatt")
|
||
local att_icon = k.DefaultAttIcon or defaultatticon
|
||
|
||
local installed = k.Installed
|
||
|
||
if !installed then
|
||
(k.MergeSlots or {})["BaseClass"] = nil
|
||
for _, slot in pairs(k.MergeSlots or {}) do
|
||
if self.Attachments[slot] and self.Attachments[slot].Installed then
|
||
installed = self.Attachments[slot].Installed
|
||
break
|
||
elseif !self.Attachments[slot] then
|
||
print("ERROR! No attachment " .. tostring(slot))
|
||
end
|
||
end
|
||
end
|
||
|
||
if installed then
|
||
local atttbl = ArcCW.AttachmentTable[installed]
|
||
|
||
if atttbl.Health then
|
||
local perc = (self:GetAttachmentHP(i) / self:GetAttachmentMaxHP(i)) * 100
|
||
perc = math.Round(perc)
|
||
txt = txt .. " (" .. tostring(perc) .. "%)"
|
||
end
|
||
if !ArcCW.ConVars["hud_embracetradition"]:GetBool() then
|
||
att_txt = translate("name." .. installed) or atttbl.PrintName
|
||
|
||
if atttbl.Icon then
|
||
att_icon = atttbl.Icon
|
||
if (!att_icon or att_icon:IsError()) then att_icon = bird end
|
||
end
|
||
end
|
||
end
|
||
|
||
if ArcCW.ConVars["hud_embracetradition"]:GetBool() then
|
||
surface.SetDrawColor(Bbg_col)
|
||
surface.DrawRect(0, 0, w, h)
|
||
surface.DrawRect(0, 0, w, h / 2)
|
||
surface.DrawRect(w - (1.5 * h), h / 2, 1.5 * h, h / 2)
|
||
|
||
surface.SetDrawColor(Bbg_col)
|
||
surface.DrawRect(0, 0, w, h)
|
||
surface.DrawRect(0, 0, w, h / 2)
|
||
surface.DrawRect(w - (1.5 * h), h / 2, 1.5 * h, h / 2)
|
||
|
||
surface.SetDrawColor(Bfg_col)
|
||
surface.DrawRect(0, (h - linesize) / 2, w - (1.5 * h), linesize)
|
||
|
||
surface.SetTextColor(SolidBlack)
|
||
surface.SetTextPos(smallgap, 0)
|
||
surface.SetFont("ArcCW_12_Glow")
|
||
surface.DrawText(txt)
|
||
|
||
surface.SetTextColor(Bfg_col)
|
||
surface.SetTextPos(smallgap, 0)
|
||
surface.SetFont("ArcCW_12")
|
||
surface.DrawText(txt)
|
||
|
||
if installed then
|
||
local atttbl = ArcCW.AttachmentTable[installed]
|
||
|
||
att_txt = translate("name." .. installed) or atttbl.PrintName
|
||
|
||
if atttbl.Icon then
|
||
att_icon = atttbl.Icon
|
||
if (!att_icon or att_icon:IsError()) then att_icon = bird end
|
||
end
|
||
end
|
||
|
||
surface.SetTextColor(Bfg_col)
|
||
surface.SetTextPos(smallgap * 2, (h - linesize) / 2 + smallgap)
|
||
surface.SetFont("ArcCW_12")
|
||
DrawTextRot(span, att_txt, 0, h / 2, smallgap * 2, (h - linesize) / 2 + smallgap, w - 1.5 * h)
|
||
|
||
surface.SetDrawColor(Bfg_col)
|
||
surface.DrawRect(w - (1.5 * h), 0, linesize, h)
|
||
|
||
surface.SetDrawColor(Bfg_col)
|
||
surface.SetMaterial(att_icon)
|
||
surface.DrawTexturedRect(w - (1.25 * h), 0, h, h)
|
||
----------------------------------------------------------------------
|
||
elseif activeslot == span.AttIndex then
|
||
span:SetSize(barsize, buttonsize)
|
||
|
||
surface.SetDrawColor(Bbg_col)
|
||
surface.DrawRect(0, 0, w, h)
|
||
surface.DrawRect(0, 0, w, h / 2)
|
||
surface.DrawRect(w - (1.5 * h), h / 2, 1.5 * h, h / 2)
|
||
|
||
surface.SetDrawColor(Bfg_col)
|
||
surface.DrawRect(0, (h - linesize) / 2, w - (1.5 * h), linesize)
|
||
|
||
surface.SetTextColor(SolidBlack)
|
||
surface.SetTextPos(smallgap, 0)
|
||
surface.SetFont("ArcCW_12_Glow")
|
||
surface.DrawText(txt)
|
||
|
||
surface.SetTextColor(Bfg_col)
|
||
surface.SetTextPos(smallgap, 0)
|
||
surface.SetFont("ArcCW_12")
|
||
surface.DrawText(txt)
|
||
|
||
surface.SetTextColor(Bfg_col)
|
||
surface.SetTextPos(smallgap * 2, (h - linesize) / 2 + smallgap)
|
||
surface.SetFont("ArcCW_12")
|
||
|
||
DrawTextRot(span, att_txt, 0, h / 2, smallgap * 2, (h - linesize) / 2 + smallgap, w - 1.5 * h)
|
||
|
||
surface.SetDrawColor(Bfg_col)
|
||
surface.DrawRect(w - (1.5 * h), 0, linesize, h)
|
||
|
||
surface.SetDrawColor(Bfg_col)
|
||
surface.SetMaterial(att_icon)
|
||
surface.DrawTexturedRect(w - (1.25 * h), 0, h, h)
|
||
else
|
||
if installed then
|
||
local atttbl = ArcCW.AttachmentTable[installed]
|
||
txt = att_txt
|
||
|
||
if atttbl.Health then
|
||
local perc = (self:GetAttachmentHP(i) / self:GetAttachmentMaxHP(i)) * 100
|
||
perc = math.Round(perc)
|
||
txt = txt .. " (" .. tostring(perc) .. "%)"
|
||
end
|
||
end
|
||
|
||
span:SetSize(barsize, buttonsize / 2)
|
||
|
||
surface.SetDrawColor(Bbg_col)
|
||
surface.DrawRect(0, 0, w, h)
|
||
surface.DrawRect(w - (1.5 * h), 0, 1.5 * h, h)
|
||
|
||
surface.SetTextColor(SolidBlack)
|
||
surface.SetTextPos(smallgap, 0)
|
||
surface.SetFont("ArcCW_12_Glow")
|
||
-- surface.DrawText(txt)
|
||
DrawTextRot(span, txt, 0, 0, smallgap, 0, w - 1.5 * h)
|
||
|
||
surface.SetTextColor(Bfg_col)
|
||
surface.SetTextPos(smallgap, 0)
|
||
surface.SetFont("ArcCW_12")
|
||
DrawTextRot(span, txt, 0, 0, smallgap, 0, w - 1.5 * h, true)
|
||
|
||
surface.SetDrawColor(Bfg_col)
|
||
surface.DrawRect(w - (1.5 * h), 0, linesize, h)
|
||
|
||
surface.SetDrawColor(Bfg_col)
|
||
surface.SetMaterial(att_icon)
|
||
surface.DrawTexturedRect(w - (1.25 * h), 0, h, h)
|
||
end
|
||
end
|
||
end
|
||
|
||
local sbar2 = triviabox:GetVBar()
|
||
sbar2.Paint = function() end
|
||
|
||
sbar2.btnUp.Paint = function(span, w, h)
|
||
end
|
||
|
||
sbar2.btnDown.Paint = function(span, w, h)
|
||
end
|
||
|
||
sbar2.btnGrip.Paint = function(span, w, h)
|
||
surface.SetDrawColor(fg_col)
|
||
surface.DrawRect(0, 0, w, h)
|
||
end
|
||
|
||
local triv_wpnnamelabel = vgui.Create("DLabel", triviabox)
|
||
triv_wpnnamelabel:SetSize(barsize, buttonsize)
|
||
triv_wpnnamelabel:Dock(TOP)
|
||
triv_wpnnamelabel:DockMargin( 0, 0, 0, smallgap )
|
||
triv_wpnnamelabel:SetText("")
|
||
triv_wpnnamelabel.Paint = function(span, w, h)
|
||
if !IsValid(self) then return end
|
||
local txt = translate("name." .. self:GetClass()) or self.PrintName
|
||
|
||
surface.SetFont("ArcCW_20")
|
||
local tw, th = surface.GetTextSize(txt)
|
||
|
||
surface.SetFont("ArcCW_20_Glow")
|
||
surface.SetTextPos((w - tw) / 2, th / 2)
|
||
surface.SetTextColor(SolidBlack)
|
||
surface.DrawText(txt)
|
||
|
||
surface.SetFont("ArcCW_20")
|
||
surface.SetTextPos((w - tw) / 2, th / 2)
|
||
surface.SetTextColor(fg_col)
|
||
surface.DrawText(txt)
|
||
end
|
||
|
||
local year = self:GetBuff_Override("Override_Trivia_Year") or self.Trivia_Year
|
||
|
||
if isnumber(year) and year < 0 then
|
||
year = tostring(math.abs(year)) .. "BC"
|
||
end
|
||
|
||
year = tostring(year)
|
||
|
||
local trivia = {
|
||
function() return translate("trivia.class") .. ": " .. ArcCW.TryTranslation(self:GetBuff_Override("Override_Trivia_Class") or self.Trivia_Class) or "Unknown" end,
|
||
function() return translate("trivia.year") .. ": " .. year or "Unknown" end,
|
||
function() return translate("trivia.mechanism") .. ": " .. ArcCW.TryTranslation(self:GetBuff_Override("Override_Trivia_Mechanism") or self.Trivia_Mechanism or "Unknown") end,
|
||
function() return translate("trivia.calibre") .. ": " .. ArcCW.TryTranslation(self:GetBuff_Override("Override_Trivia_Calibre") or self.Trivia_Calibre or "Unknown") end,
|
||
function() return translate("trivia.ammo") .. ": " .. language.GetPhrase(self.Primary.Ammo or self.PrintName) end,
|
||
function() return translate("trivia.country") .. ": " .. ArcCW.TryTranslation(self:GetBuff_Override("Override_Trivia_Country") or self.Trivia_Country or "Unknown") end,
|
||
function() return translate("trivia.manufacturer") .. ": " .. ArcCW.TryTranslation(self:GetBuff_Override("Override_Trivia_Manufacturer") or self.Trivia_Manufacturer or "Unknown") end,
|
||
function() return translate("trivia.clipsize") .. ": " .. self:GetCapacity() end,
|
||
function() return translate("trivia.precision") .. ": " .. self:GetBuff("AccuracyMOA") .. " MOA" end,
|
||
function() return translate("trivia.noise") .. ": " .. (self:GetBuff("ShootVol")) .. "dB" end,
|
||
function() return translate("trivia.recoil") .. ": " .. math.Truncate(self.Recoil * 41.4 * self:GetBuff_Mult("Mult_Recoil"), 1) .. " lb-fps" end,
|
||
function() return translate("trivia.penetration") .. ": " .. math.Round(self:GetBuff("Penetration"), 1) .. "mm" end,
|
||
}
|
||
|
||
if !self.ManualAction and !self:GetBuff_Override("Override_ManualAction") then
|
||
table.insert(trivia, function()
|
||
local rpm = math.Round(60 / self:GetFiringDelay())
|
||
return translate("trivia.firerate") .. ": " .. rpm .. "RPM"
|
||
end)
|
||
end
|
||
|
||
if !(self:GetBuff_Override("Override_Trivia_Class") or self.Trivia_Class) then
|
||
trivia[1] = nil
|
||
end
|
||
|
||
if !(self:GetBuff_Override("Override_Trivia_Year") or self.Trivia_Year) then
|
||
trivia[2] = nil
|
||
end
|
||
|
||
if !(self:GetBuff_Override("Override_Trivia_Mechanism") or self.Trivia_Mechanism) then
|
||
trivia[3] = nil
|
||
end
|
||
|
||
if !(self:GetBuff_Override("Override_Trivia_Calibre") or self.Trivia_Calibre) then
|
||
trivia[4] = nil
|
||
end
|
||
|
||
if !(self:GetBuff_Override("Override_Trivia_Country") or self.Trivia_Country) then
|
||
trivia[6] = nil
|
||
end
|
||
|
||
if !(self:GetBuff_Override("Override_Trivia_Manufacturer") or self.Trivia_Manufacturer) then
|
||
trivia[7] = nil
|
||
end
|
||
|
||
if self.PrimaryBash then
|
||
trivia[4] = nil
|
||
trivia[5] = nil
|
||
trivia[8] = nil
|
||
trivia[9] = nil
|
||
trivia[10] = nil
|
||
trivia[11] = nil
|
||
trivia[12] = nil
|
||
trivia[13] = nil
|
||
end
|
||
|
||
if self.Throwing then
|
||
trivia[4] = nil
|
||
trivia[8] = nil
|
||
trivia[9] = nil
|
||
trivia[10] = nil
|
||
trivia[11] = nil
|
||
trivia[12] = nil
|
||
trivia[13] = nil
|
||
end
|
||
|
||
local ft = self:GetBuff_Override("Override_FuseTime") or self.FuseTime
|
||
|
||
if ft then
|
||
table.insert(trivia, function() return translate("trivia.fusetime") .. ": " .. tostring(ft) end)
|
||
end
|
||
|
||
for _, i in pairs(trivia) do
|
||
if !i then continue end
|
||
local triv_misc = vgui.Create("DLabel", triviabox)
|
||
triv_misc:SetSize(barsize, ScreenScaleMulti(8))
|
||
triv_misc:Dock(TOP)
|
||
triv_misc:SetText("")
|
||
triv_misc:DockMargin( 0, 0, 0, 0 )
|
||
triv_misc.Paint = function(span, w, h)
|
||
if !IsValid(self) then return end
|
||
local txt = i()
|
||
|
||
surface.SetFont("ArcCW_8")
|
||
surface.SetTextPos(smallgap, 0)
|
||
surface.SetTextColor(fg_col)
|
||
surface.DrawText(txt)
|
||
end
|
||
end
|
||
|
||
-- multlinetext(text, maxw, font)
|
||
|
||
local adesctext = multlinetext(ArcCW.TryTranslation(self:GetBuff_Override("Override_Trivia_Desc")) or translate("desc." .. self:GetClass()) or self.Trivia_Desc, barsize - smallgap, "ArcCW_8")
|
||
|
||
table.insert(adesctext, "")
|
||
|
||
local triv_desc = vgui.Create("DLabel", triviabox)
|
||
triv_desc:SetSize(barsize, ScreenScaleMulti(8) * (table.Count(adesctext) + 1))
|
||
triv_desc:SetText("")
|
||
triv_desc:Dock(TOP)
|
||
triv_desc.Paint = function(span, w, h)
|
||
local y = ScreenScaleMulti(8)
|
||
for _, line in pairs(adesctext) do
|
||
surface.SetFont("ArcCW_8")
|
||
surface.SetTextPos(smallgap, y)
|
||
surface.SetTextColor(fg_col)
|
||
surface.DrawText(line)
|
||
y = y + ScreenScaleMulti(8)
|
||
end
|
||
end
|
||
|
||
if !self.ShootEntity and !self.PrimaryBash and !self.Throwing and !self.NoRangeGraph then
|
||
local rangegraph = vgui.Create("DLabel", triviabox)
|
||
rangegraph:SetSize(barsize, ScreenScaleMulti(64))
|
||
rangegraph:SetText("")
|
||
rangegraph:Dock(TOP)
|
||
rangegraph.Paint = function(span, w, h)
|
||
if !IsValid(self) then return end
|
||
local sidegap = 0
|
||
local gx, gy = 0, smallgap
|
||
local gw, gh = w - (2 * sidegap), h - smallgap - ScreenScaleMulti(6)
|
||
|
||
local dmgmax = math.Round(self:GetDamage(0))
|
||
local dmgmin = math.Round(self:GetDamage(math.huge))
|
||
|
||
local grsh = math.max(dmgmax, dmgmin)
|
||
|
||
grsh = math.ceil((grsh / 12) + 1) * 12
|
||
|
||
local mingr = self.RangeMin * self:GetBuff_Mult("Mult_Range") * self:GetBuff_Mult("Mult_RangeMin")
|
||
local maxgr = self.Range * self:GetBuff_Mult("Mult_Range")
|
||
|
||
if dmgmax < dmgmin then
|
||
maxgr = (self.Range / self:GetBuff_Mult("Mult_Range"))
|
||
end
|
||
|
||
maxgr = math.Round(maxgr)
|
||
|
||
local grsw = math.ceil((maxgr / 12) + 1) * 12
|
||
|
||
local convw = gw / grsw
|
||
local convh = gh / grsh
|
||
|
||
local starty = gh - (dmgmax * convh)
|
||
local endy = gh - (dmgmin * convh)
|
||
local startx = mingr * convw
|
||
local endx = maxgr * convw
|
||
|
||
surface.SetDrawColor(bg_col)
|
||
surface.DrawRect(gx, gy, gw, gh)
|
||
|
||
surface.SetDrawColor(fg_col)
|
||
|
||
-- start
|
||
surface.DrawLine(0, gy + starty, gx + startx, gy + starty)
|
||
-- before mid
|
||
surface.DrawLine(gx + startx, gy + starty, gx + endx, gy + endy)
|
||
if mingr != 0 then
|
||
surface.DrawLine(gx + startx, gy+ScreenScaleMulti(2) + starty, gx + startx, gy-ScreenScaleMulti(2) + starty)
|
||
end
|
||
-- long and into the void
|
||
surface.DrawLine(gx + endx, gy + endy, gx + gw, gy + endy)
|
||
surface.DrawLine(gx + endx, gy+ScreenScaleMulti(2) + endy, gx + endx, gy-ScreenScaleMulti(2) + endy)
|
||
|
||
-- start dmg
|
||
surface.SetTextColor(fg_col)
|
||
surface.SetFont("ArcCW_6")
|
||
surface.SetTextPos(0, gy + starty - ScreenScaleMulti(7) - 1)
|
||
surface.DrawText(tostring(dmgmax) .. "DMG")
|
||
|
||
-- end dmg
|
||
surface.SetTextColor(fg_col)
|
||
surface.SetFont("ArcCW_6")
|
||
|
||
local dtw = surface.GetTextSize(tostring(dmgmin) .. "DMG")
|
||
surface.SetTextPos(gx + gw - dtw, gy + endy - ScreenScaleMulti(7) - 1)
|
||
surface.DrawText(tostring(dmgmin) .. "DMG")
|
||
|
||
-- start range
|
||
surface.SetTextColor(fg_col)
|
||
surface.SetFont("ArcCW_6")
|
||
surface.SetTextPos(sidegap, smallgap + gh)
|
||
surface.DrawText("0m")
|
||
|
||
-- before mid range
|
||
if mingr != 0 then
|
||
surface.SetTextColor(fg_col)
|
||
surface.SetFont("ArcCW_6")
|
||
local btw = surface.GetTextSize(tostring(mingr) .. "m")
|
||
surface.SetTextPos(gx + startx - (btw / 2), smallgap + gh)
|
||
surface.DrawText(tostring(mingr) .. "m")
|
||
end
|
||
|
||
-- mid range
|
||
surface.SetTextColor(fg_col)
|
||
surface.SetFont("ArcCW_6")
|
||
local mtw = surface.GetTextSize(tostring(maxgr) .. "m")
|
||
surface.SetTextPos(gx + endx - (mtw / 2), smallgap + gh)
|
||
surface.DrawText(tostring(maxgr) .. "m")
|
||
|
||
-- end range
|
||
surface.SetTextColor(fg_col)
|
||
surface.SetFont("ArcCW_6")
|
||
local rtw = surface.GetTextSize(tostring(grsw) .. "m")
|
||
surface.SetTextPos(w - sidegap - rtw, smallgap + gh)
|
||
surface.DrawText(tostring(grsw) .. "m")
|
||
|
||
local mousex, mousey = span:CursorPos()
|
||
|
||
if mousex > gx and mousex < (gx + gw) and
|
||
(mousey > gy and mousey < (gy + gh)) then
|
||
local mouser = (mousex - gx) / convw
|
||
|
||
local shy
|
||
local shdmg
|
||
|
||
if mouser < mingr then
|
||
shy = starty
|
||
shdmg = dmgmax
|
||
elseif mouser < maxgr then
|
||
local delta = mouser / maxgr
|
||
shy = Lerp(delta, starty, endy)
|
||
shdmg = Lerp(delta, dmgmax, dmgmin)
|
||
else
|
||
shy = endy
|
||
shdmg = dmgmin
|
||
end
|
||
|
||
surface.SetDrawColor(Color(fg_col.r, fg_col.g, fg_col.b, 150))
|
||
surface.DrawLine(gx, gy + shy, gw, gy + shy)
|
||
surface.DrawLine(mousex, gy, mousex, gh + gy)
|
||
|
||
shy = shy + ScreenScaleMulti(4)
|
||
|
||
mouser = math.Round(mouser)
|
||
shdmg = math.Round(shdmg)
|
||
|
||
local alignleft = true
|
||
|
||
surface.SetFont("ArcCW_6")
|
||
local twmr = surface.GetTextSize(tostring(mouser) .. "m")
|
||
local twmb = surface.GetTextSize(tostring(shdmg) .. "DMG")
|
||
|
||
if mousex < math.max(twmr, twmb) + ScreenScaleMulti(2) then
|
||
alignleft = false
|
||
end
|
||
|
||
surface.SetTextColor(fg_col)
|
||
surface.SetFont("ArcCW_6")
|
||
if alignleft then
|
||
surface.SetTextPos(mousex - ScreenScaleMulti(2) - twmr, shy)
|
||
else
|
||
surface.SetTextPos(mousex + ScreenScaleMulti(2), shy)
|
||
end
|
||
surface.DrawText(tostring(mouser) .. "m")
|
||
|
||
surface.SetTextColor(fg_col)
|
||
surface.SetFont("ArcCW_6")
|
||
if alignleft then
|
||
surface.SetTextPos(mousex - ScreenScaleMulti(2) - twmb, ScreenScaleMulti(2) + gy)
|
||
else
|
||
surface.SetTextPos(mousex + ScreenScaleMulti(2), ScreenScaleMulti(2) + gy)
|
||
end
|
||
surface.DrawText(tostring(shdmg) .. "DMG")
|
||
end
|
||
end
|
||
end
|
||
|
||
local function defaultStatFunc(name, unit, round)
|
||
local orig = self[name]
|
||
if ArcCW.ConVar_BuffMults["Mult_" .. name] then
|
||
orig = orig * GetConVar(ArcCW.ConVar_BuffMults["Mult_" .. name]):GetFloat()
|
||
end
|
||
return math.Round((unit == "%" and 100 or unit == "ms" and 1000 or 1) * orig, round) .. (unit or ""),
|
||
math.Round((unit == "%" and 100 or unit == "ms" and 1000 or 1) * self[name] * self:GetBuff_Mult("Mult_" .. name), round) .. (unit or "")
|
||
end
|
||
|
||
local function defaultBetterFunc(name, inverse)
|
||
local mult = self:GetBuff_Mult("Mult_" .. name)
|
||
if ArcCW.ConVar_BuffMults[name] then
|
||
mult = mult / GetConVar(ArcCW.ConVar_BuffMults[name]):GetFloat()
|
||
end
|
||
if inverse then mult = 1 / mult end
|
||
if mult > 1 then return true
|
||
elseif mult < 1 then return false
|
||
else return nil end
|
||
end
|
||
|
||
local statList
|
||
regenStatList = function()
|
||
statList = {
|
||
{translate("stat.stat"), "",
|
||
function() return translate("stat.original"), translate("stat.current") end,
|
||
function() return nil end,
|
||
},
|
||
{translate("stat.damage"), translate("stat.damage.tooltip"),
|
||
function()
|
||
local curNum = self:GetBuff("Num")
|
||
local orig = math.Round(self.Damage * ArcCW.ConVars["mult_damage"]:GetFloat()) .. (self.Num != 1 and ("×" .. self.Num) or "")
|
||
local cur = math.Round(self:GetDamage(0) / curNum * ArcCW.ConVars["mult_damage"]:GetFloat()) .. (curNum != 1 and ("×" .. curNum) or "")
|
||
return orig, cur
|
||
end,
|
||
function()
|
||
local orig = self.Damage * self.Num * ArcCW.ConVars["mult_damage"]:GetFloat()
|
||
local cur = self:GetDamage(0)
|
||
if orig == cur then return nil else return cur > orig end
|
||
end,
|
||
},
|
||
{translate("stat.damagemin"), translate("stat.damagemin.tooltip"),
|
||
function()
|
||
local curNum = self:GetBuff("Num")
|
||
local orig = math.Round(self.DamageMin * ArcCW.ConVars["mult_damage"]:GetFloat()) .. (self.Num != 1 and ("×" .. self.Num) or "")
|
||
local cur = math.Round(self:GetDamage(self.Range) / curNum * ArcCW.ConVars["mult_damage"]:GetFloat()) .. (curNum != 1 and ("×" .. curNum) or "")
|
||
return orig, cur
|
||
end,
|
||
function()
|
||
local orig = self.DamageMin * self.Num * ArcCW.ConVars["mult_damage"]:GetFloat()
|
||
local maxgr = (self:GetBuff("Range"))
|
||
if math.Round(self:GetDamage(self.Range)) < math.Round(self:GetDamage(0)) then
|
||
maxgr = (self.Range / self:GetBuff_Mult("Mult_Range"))
|
||
end
|
||
local cur = self:GetDamage(maxgr)
|
||
if orig == cur then return nil else return cur > orig end
|
||
end,
|
||
},
|
||
{translate("stat.range"), translate("stat.range.tooltip"),
|
||
function() return defaultStatFunc("Range", "m") end,
|
||
function() return defaultBetterFunc("Range") end,
|
||
},
|
||
{translate("stat.firerate"), translate("stat.firerate.tooltip"),
|
||
function()
|
||
|
||
local orig = math.Round(60 / self.Delay) .. "RPM"
|
||
local cur = math.Round(60 / self:GetFiringDelay()) .. "RPM"
|
||
|
||
if self.ManualAction then
|
||
orig = translate("stat.firerate.manual")
|
||
end
|
||
if self:GetBuff_Override("Override_ManualAction") or self.ManualAction then
|
||
cur = translate("stat.firerate.manual")
|
||
end
|
||
|
||
return orig, cur
|
||
end,
|
||
function()
|
||
if !self:GetBuff_Override("Override_ManualAction") and !self.ManualAction then
|
||
return defaultBetterFunc("RPM")
|
||
end
|
||
-- Funky calculations for when some manual gun goes automatic
|
||
if !self.ManualAction and self:GetBuff_Override("Override_ManualAction") == true then
|
||
return false
|
||
elseif self.ManualAction and self:GetBuff_Override("Override_ManualAction") == false then
|
||
return true
|
||
end
|
||
return nil
|
||
end,
|
||
},
|
||
{translate("stat.capacity"), translate("stat.capacity.tooltip"),
|
||
function()
|
||
local m = self.RegularClipSize
|
||
local m2 = self.Primary.ClipSize
|
||
local cs = self.ChamberSize
|
||
local cs2 = self:GetChamberSize()
|
||
return m .. (cs > 0 and " +" .. cs or ""), m2 .. (cs2 > 0 and " +" .. cs2 or "")
|
||
end,
|
||
function()
|
||
local m = self.RegularClipSize
|
||
local m2 = self.Primary.ClipSize
|
||
local cs = self.ChamberSize
|
||
local cs2 = self:GetChamberSize()
|
||
if m + cs == m2 + cs2 then return nil end
|
||
return m + cs < m2 + cs2
|
||
end,
|
||
},
|
||
{translate("stat.precision"), translate("stat.precision.tooltip"),
|
||
function() return defaultStatFunc("AccuracyMOA", " MOA", 3) end,
|
||
function() return defaultBetterFunc("AccuracyMOA", true) end,
|
||
},
|
||
{translate("stat.hipdisp"), translate("stat.hipdisp.tooltip"),
|
||
function() return defaultStatFunc("HipDispersion", " MOA") end,
|
||
function() return defaultBetterFunc("HipDispersion", true) end,
|
||
},
|
||
{translate("stat.movedisp"), translate("stat.movedisp.tooltip"),
|
||
function() return defaultStatFunc("MoveDispersion", " MOA") end,
|
||
function() return defaultBetterFunc("MoveDispersion", true) end,
|
||
},
|
||
{translate("stat.recoil"), translate("stat.recoil.tooltip"),
|
||
function() return defaultStatFunc("Recoil", nil, 2) end,
|
||
function() return defaultBetterFunc("Recoil", true) end,
|
||
},
|
||
{translate("stat.recoilside"), translate("stat.recoilside.tooltip"),
|
||
function() return defaultStatFunc("RecoilSide", nil, 2) end,
|
||
function() return defaultBetterFunc("RecoilSide", true) end,
|
||
},
|
||
{translate("stat.sighttime"), translate("stat.sighttime.tooltip"),
|
||
function() return defaultStatFunc("SightTime", "ms") end,
|
||
function() return defaultBetterFunc("SightTime", true) end,
|
||
},
|
||
{translate("stat.speedmult"), translate("stat.speedmult.tooltip"),
|
||
function()
|
||
return math.Round(self.SpeedMult * 100) .. "%", math.Round(math.Clamp(self:GetBuff("SpeedMult") * self:GetBuff_Mult("Mult_MoveSpeed"), 0, 1) * 100) .. "%"
|
||
end,
|
||
function()
|
||
local mult = self:GetBuff_Mult("Mult_SpeedMult") * self:GetBuff_Mult("Mult_MoveSpeed")
|
||
if mult == 1 then return nil
|
||
elseif mult > 1 then return true
|
||
else return false end
|
||
end,
|
||
},
|
||
{translate("stat.sightspeed"), translate("stat.sightspeed.tooltip"),
|
||
function()
|
||
return math.Round(self.SightedSpeedMult * 100) .. "%", math.Round(math.Clamp(self:GetBuff("SightedSpeedMult") * self:GetBuff_Mult("Mult_SightedMoveSpeed"), 0, 1) * 100) .. "%"
|
||
end,
|
||
function()
|
||
local mult = self:GetBuff_Mult("Mult_SightedSpeedMult") * self:GetBuff_Mult("Mult_SightedMoveSpeed")
|
||
if mult == 1 then return nil
|
||
elseif mult > 1 then return true
|
||
else return false end
|
||
end,
|
||
},
|
||
{translate("stat.meleedamage"), translate("stat.meleedamage.tooltip"),
|
||
function() return defaultStatFunc("MeleeDamage") end,
|
||
function() return defaultBetterFunc("MeleeDamage") end,
|
||
},
|
||
{translate("stat.meleetime"), translate("stat.meleetime.tooltip"),
|
||
function() return defaultStatFunc("MeleeTime", "ms", 2) end,
|
||
function() return defaultBetterFunc("MeleeTime", true) end,
|
||
},
|
||
{translate("stat.shootvol"), translate("stat.shootvol.tooltip"),
|
||
function() return defaultStatFunc("ShootVol","dB") end,
|
||
function() return defaultBetterFunc("ShootVol", true) end,
|
||
},
|
||
{translate("stat.barrellen"), translate("stat.barrellen.tooltip"),
|
||
function()
|
||
local orig = self.BarrelLength
|
||
local cur = orig + self:GetBuff_Add("Add_BarrelLength")
|
||
return orig .. "in", cur .. "in"
|
||
end,
|
||
function()
|
||
local add = self:GetBuff_Add("Add_BarrelLength")
|
||
if add == 0 then return nil else return add < 0 end
|
||
end,
|
||
},
|
||
{translate("stat.pen"), translate("stat.pen.tooltip"),
|
||
function() return defaultStatFunc("Penetration","mm") end,
|
||
function() return defaultBetterFunc("Penetration") end,
|
||
},
|
||
}
|
||
|
||
statbox:Clear()
|
||
|
||
for _, i in pairs(statList) do
|
||
if !i then continue end
|
||
local stat_panel = vgui.Create("DPanel", statbox)
|
||
stat_panel:SetSize(barsize, ScreenScaleMulti(10))
|
||
stat_panel:Dock(TOP)
|
||
stat_panel:SetText("")
|
||
stat_panel:DockMargin( 0, ScreenScaleMulti(1), 0, ScreenScaleMulti(1) )
|
||
stat_panel.Paint = function(spaa, w, h)
|
||
local Bbg_col = Color(0, 0, 0, 50)
|
||
|
||
if spaa:IsHovered() then
|
||
Bbg_col = Color(100, 100, 100, 50)
|
||
end
|
||
|
||
surface.SetDrawColor(Bbg_col)
|
||
surface.DrawRect(0, 0, w, h)
|
||
end
|
||
|
||
local stat_title = vgui.Create("DLabel", stat_panel)
|
||
stat_title:SetSize(barsize * 0.5, ScreenScaleMulti(10))
|
||
stat_title:SetText("")
|
||
stat_title:Dock(LEFT)
|
||
stat_title.Paint = function(span, w, h)
|
||
surface.SetFont("ArcCW_8")
|
||
surface.SetTextPos(smallgap, 0)
|
||
surface.SetTextColor(fg_col)
|
||
surface.DrawText(i[1])
|
||
end
|
||
|
||
local origStat, curStat = i[3]()
|
||
local better = i[4]()
|
||
local stat_orig = vgui.Create("DLabel", stat_panel)
|
||
stat_orig:SetSize(barsize * 0.25, ScreenScaleMulti(10))
|
||
stat_orig:SetText("")
|
||
stat_orig:Dock(LEFT)
|
||
stat_orig.Paint = function(span, w, h)
|
||
surface.SetFont("ArcCW_8")
|
||
surface.SetTextPos(smallgap, 0)
|
||
surface.SetTextColor(fg_col)
|
||
surface.DrawText(origStat)
|
||
end
|
||
local stat_cur = vgui.Create("DLabel", stat_panel)
|
||
stat_cur:SetSize(barsize * 0.25, ScreenScaleMulti(10))
|
||
stat_cur:SetText("")
|
||
stat_cur:Dock(LEFT)
|
||
stat_cur.Paint = function(span, w, h)
|
||
local color = better == true and Color(150, 255, 150) or better == false and Color(255, 150, 150) or fg_col
|
||
|
||
surface.SetFont("ArcCW_8")
|
||
surface.SetTextPos(smallgap, 0)
|
||
surface.SetTextColor(color)
|
||
surface.DrawText(curStat)
|
||
end
|
||
end
|
||
end
|
||
|
||
if !self.Throwing and !self.PrimaryBash and !self.ShootEntity then
|
||
local togglestat = vgui.Create("DButton", ArcCW.InvHUD)
|
||
togglestat:SetSize((barsize - ScreenScaleMulti(2)) / 2, ScreenScaleMulti(14))
|
||
togglestat:SetText("")
|
||
togglestat:SetPos(scrw - barsize - airgap - ScreenScaleMulti(1) - (barsize / 2), airgap)
|
||
|
||
togglestat.OnMousePressed = function(spaa, kc)
|
||
if statbox:IsVisible() then
|
||
statbox:Hide()
|
||
triviabox:Show()
|
||
else
|
||
regenStatList()
|
||
statbox:Show()
|
||
triviabox:Hide()
|
||
attmenu:Hide()
|
||
self.InAttMenu = false
|
||
atttrivia:Hide()
|
||
attslidebox:Hide()
|
||
atttogglebtn:Hide()
|
||
end
|
||
end
|
||
|
||
togglestat.Paint = function(spaa, w, h)
|
||
if !self:IsValid() then return end
|
||
if !self.Attachments then return end
|
||
local Bfg_col = Color(255, 255, 255, 255)
|
||
local Bbg_col = Color(0, 0, 0, 100)
|
||
|
||
if spaa:IsHovered() then
|
||
Bbg_col = Color(255, 255, 255, 100)
|
||
Bfg_col = Color(0, 0, 0, 255)
|
||
end
|
||
|
||
surface.SetDrawColor(Bbg_col)
|
||
surface.DrawRect(0, 0, w, h)
|
||
|
||
local txt = translate(statbox:IsVisible() and "ui.trivia" or "ui.stats")
|
||
|
||
surface.SetTextColor(Bfg_col)
|
||
surface.SetTextPos(smallgap, ScreenScaleMulti(1))
|
||
surface.SetFont("ArcCW_12")
|
||
surface.DrawText(txt)
|
||
end
|
||
end
|
||
|
||
if engine.ActiveGamemode() == "terrortown" then
|
||
local gap = airgap
|
||
|
||
if GetRoundState() == ROUND_ACTIVE and (LocalPlayer():GetTraitor() or LocalPlayer():GetDetective() or (TTT2 and LocalPlayer().IsShopper and LocalPlayer():IsShopper())) then
|
||
local buymenu = vgui.Create("DButton", ArcCW.InvHUD)
|
||
buymenu:SetSize((barsize - ScreenScaleMulti(2)) / 2, ScreenScaleMulti(14))
|
||
buymenu:SetText("")
|
||
buymenu:SetPos(scrw - barsize - airgap - ScreenScaleMulti(1) - (barsize / 2), airgap + gap)
|
||
gap = gap + airgap
|
||
|
||
buymenu.OnMousePressed = function(spaa, kc)
|
||
RunConsoleCommand("ttt_cl_traitorpopup")
|
||
end
|
||
|
||
buymenu.Paint = function(spaa, w, h)
|
||
if !self:IsValid() then return end
|
||
if !self.Attachments then return end
|
||
local Bfg_col = Color(255, 255, 255, 255)
|
||
local Bbg_col = Color(0, 0, 0, 100)
|
||
|
||
if spaa:IsHovered() then
|
||
Bbg_col = Color(255, 255, 255, 100)
|
||
Bfg_col = Color(0, 0, 0, 255)
|
||
end
|
||
|
||
surface.SetDrawColor(Bbg_col)
|
||
surface.DrawRect(0, 0, w, h)
|
||
|
||
local txt = translate("ui.tttequip")
|
||
|
||
surface.SetTextColor(Bfg_col)
|
||
surface.SetTextPos(smallgap, ScreenScaleMulti(1))
|
||
surface.SetFont("ArcCW_12")
|
||
surface.DrawText(txt)
|
||
end
|
||
end
|
||
|
||
local radiomenu = vgui.Create("DButton", ArcCW.InvHUD)
|
||
radiomenu:SetSize((barsize - ScreenScaleMulti(2)) / 2, ScreenScaleMulti(14))
|
||
radiomenu:SetText("")
|
||
radiomenu:SetPos(scrw - barsize - airgap - ScreenScaleMulti(1) - (barsize / 2), airgap + gap)
|
||
|
||
radiomenu.OnMousePressed = function(spaa, kc)
|
||
RADIO:ShowRadioCommands(!RADIO.Show)
|
||
end
|
||
|
||
radiomenu.Paint = function(spaa, w, h)
|
||
if !self:IsValid() then return end
|
||
if !self.Attachments then return end
|
||
local Bfg_col = Color(255, 255, 255, 255)
|
||
local Bbg_col = Color(0, 0, 0, 100)
|
||
|
||
if spaa:IsHovered() then
|
||
Bbg_col = Color(255, 255, 255, 100)
|
||
Bfg_col = Color(0, 0, 0, 255)
|
||
end
|
||
|
||
surface.SetDrawColor(Bbg_col)
|
||
surface.DrawRect(0, 0, w, h)
|
||
|
||
local txt = translate("ui.tttchat")
|
||
|
||
surface.SetTextColor(Bfg_col)
|
||
surface.SetTextPos(smallgap, ScreenScaleMulti(1))
|
||
surface.SetFont("ArcCW_12")
|
||
surface.DrawText(txt)
|
||
end
|
||
end
|
||
|
||
if CLIENT and vrmod and vrmod.IsPlayerInVR(self:GetOwner()) then
|
||
local w, h = ArcCW.InvHUD:GetSize()
|
||
local ang = Angle(0,g_VR.tracking.hmd.ang.yaw-90,45)
|
||
local pos = g_VR.tracking.hmd.pos + Vector(0,0,-20) + Angle(0,g_VR.tracking.hmd.ang.yaw,0):Forward() * 30 + ang:Forward() * w * -0.02 + ang:Right() * h * -0.02
|
||
pos, ang = WorldToLocal(pos, ang, g_VR.origin, g_VR.originAngle)
|
||
vrmod.MenuCreate( "ArcCW_Customize", w, h, ArcCW.InvHUD, 4,
|
||
pos, ang, 0.04, true, function()
|
||
self:CloseCustomizeHUD()
|
||
end)
|
||
end
|
||
|
||
end
|
||
|
||
end |