mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
468 lines
14 KiB
Lua
468 lines
14 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/
|
|||
|
|
--]]
|
|||
|
|
|
|||
|
|
-- atts are comma separated
|
|||
|
|
-- optic_mrs,,,perk_quickdraw,ammo_match
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
local function ScreenScaleMulti(input)
|
|||
|
|
return ScreenScale(input) * ArcCW.ConVars["hud_size"]:GetFloat()
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
function SWEP:GetPresetBase()
|
|||
|
|
return self.PresetBase or self:GetClass()
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
function SWEP:GetPresets()
|
|||
|
|
local path = ArcCW.PresetPath .. self:GetPresetBase() .. "/*.txt"
|
|||
|
|
|
|||
|
|
local files = file.Find(path, "DATA")
|
|||
|
|
|
|||
|
|
files = table.Add(files, file.Find(ArcCW.PresetPath .. self:GetPresetBase() .. "/*.json", "DATA"))
|
|||
|
|
|
|||
|
|
return files
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
function SWEP:LoadPreset(presetname)
|
|||
|
|
presetname = presetname or "autosave"
|
|||
|
|
if presetname == "autosave" then
|
|||
|
|
if self:GetNWBool("ArcCW_DisableAutosave", false) then return end
|
|||
|
|
if !ArcCW.ConVars["autosave"]:GetBool() then return end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
if presetname != "autosave" then
|
|||
|
|
surface.PlaySound("weapons/arccw/install.wav")
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- ???
|
|||
|
|
self.Attachments.BaseClass = nil
|
|||
|
|
|
|||
|
|
local presetTbl
|
|||
|
|
|
|||
|
|
|
|||
|
|
-- New behavior
|
|||
|
|
local filename = ArcCW.PresetPath .. self:GetPresetBase() .. "/" .. presetname .. ".json"
|
|||
|
|
if file.Exists(filename, "DATA") then
|
|||
|
|
presetTbl = util.JSONToTable(file.Read(filename))
|
|||
|
|
if presetTbl and presetTbl != {} then
|
|||
|
|
for i = 1, table.Count(self.Attachments) do
|
|||
|
|
local ok = true
|
|||
|
|
|
|||
|
|
if !presetTbl[i] or !ArcCW.AttachmentTable[presetTbl[i].Installed or ""] then
|
|||
|
|
ok = false
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
if !ok then
|
|||
|
|
presetTbl[i] = nil
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- Legacy behavior
|
|||
|
|
filename = ArcCW.PresetPath .. self:GetPresetBase() .. "/" .. presetname .. ".txt"
|
|||
|
|
if presetTbl == nil and file.Exists(filename, "DATA") then
|
|||
|
|
local f = file.Open(filename, "r", "DATA")
|
|||
|
|
if !f then return end
|
|||
|
|
|
|||
|
|
presetTbl = {}
|
|||
|
|
|
|||
|
|
for i = 1, table.Count(self.Attachments) do
|
|||
|
|
local line = f:ReadLine()
|
|||
|
|
if !line then continue end
|
|||
|
|
local split = string.Split(string.Trim(line, "\n"), ",")
|
|||
|
|
if !ArcCW.AttachmentTable[split[1]] then continue end
|
|||
|
|
presetTbl[i] = {
|
|||
|
|
Installed = split[1],
|
|||
|
|
SlidePos = split[2] and tonumber(split[2]),
|
|||
|
|
SightMagnifications = split[3] and tonumber(split[3]),
|
|||
|
|
ToggleNum = nil, -- not implemented in legacy preset
|
|||
|
|
}
|
|||
|
|
end
|
|||
|
|
f:Close()
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
if !presetTbl then return end
|
|||
|
|
|
|||
|
|
net.Start("arccw_applypreset")
|
|||
|
|
net.WriteEntity(self)
|
|||
|
|
for k, v in pairs(self.Attachments) do
|
|||
|
|
local att = (presetTbl[k] or {}).Installed
|
|||
|
|
|
|||
|
|
if !att or !ArcCW.AttachmentTable[att] then
|
|||
|
|
net.WriteUInt(0, ArcCW.GetBitNecessity())
|
|||
|
|
continue
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
net.WriteUInt(ArcCW.AttachmentTable[att].ID, ArcCW.GetBitNecessity())
|
|||
|
|
|
|||
|
|
net.WriteBool(presetTbl[k].SlidePos)
|
|||
|
|
if presetTbl[k].SlidePos then
|
|||
|
|
net.WriteFloat(presetTbl[k].SlidePos)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
if ArcCW.AttachmentTable[att].ToggleStats != nil then
|
|||
|
|
net.WriteUInt(presetTbl[k].ToggleNum or 1, 8)
|
|||
|
|
end
|
|||
|
|
v.ToggleNum = presetTbl[k].ToggleNum or 1
|
|||
|
|
|
|||
|
|
-- not networked
|
|||
|
|
self.SightMagnifications[k] = presetTbl[k].SightMagnifications
|
|||
|
|
end
|
|||
|
|
net.SendToServer()
|
|||
|
|
|
|||
|
|
--[[]
|
|||
|
|
for i = 1, table.Count(self.Attachments) do
|
|||
|
|
local att = presetTbl[i]
|
|||
|
|
if !att then continue end
|
|||
|
|
|
|||
|
|
if ArcCW:PlayerGetAtts(self:GetOwner(), att) == 0 then continue end
|
|||
|
|
if !self.Attachments[i] then continue end
|
|||
|
|
|
|||
|
|
-- detect commas
|
|||
|
|
-- no commas = do nothing
|
|||
|
|
-- commas: If exactly two commas are detected
|
|||
|
|
-- try to parse them as slidepos, magnification
|
|||
|
|
|
|||
|
|
local split = string.Split(att, ",")
|
|||
|
|
local sc = table.Count(split)
|
|||
|
|
|
|||
|
|
local slidepos = 0.5
|
|||
|
|
local mag = -1
|
|||
|
|
|
|||
|
|
if sc == 3 then
|
|||
|
|
att = split[1]
|
|||
|
|
slidepos = tonumber(split[2])
|
|||
|
|
mag = tonumber(split[3])
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
if att == self.Attachments[i].Installed then continue end
|
|||
|
|
|
|||
|
|
self:Detach(i, true, true)
|
|||
|
|
|
|||
|
|
if !ArcCW.AttachmentTable[att] then continue end
|
|||
|
|
|
|||
|
|
self:Attach(i, att, true, true)
|
|||
|
|
|
|||
|
|
if slidepos != 0.5 then
|
|||
|
|
self.Attachments[i].SlidePos = slidepos
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
if mag != -1 then
|
|||
|
|
self.SightMagnifications[i] = mag
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
self:SendAllDetails()
|
|||
|
|
|
|||
|
|
self:SavePreset()
|
|||
|
|
]]
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
function SWEP:SavePreset(presetname)
|
|||
|
|
presetname = presetname or "autosave"
|
|||
|
|
if presetname == "autosave" and !ArcCW.ConVars["attinv_free"]:GetBool() then return end
|
|||
|
|
|
|||
|
|
local presetTbl = {}
|
|||
|
|
for i, k in pairs(self.Attachments) do
|
|||
|
|
if k.Installed then
|
|||
|
|
presetTbl[i] = {
|
|||
|
|
Installed = k.Installed,
|
|||
|
|
SlidePos = k.SlidePos,
|
|||
|
|
SightMagnifications = self.SightMagnifications[i],
|
|||
|
|
ToggleNum = k.ToggleNum
|
|||
|
|
}
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
filename = ArcCW.PresetPath .. self:GetPresetBase() .. "/" .. presetname .. ".json"
|
|||
|
|
file.CreateDir(ArcCW.PresetPath .. self:GetPresetBase())
|
|||
|
|
file.Write(filename, util.TableToJSON(presetTbl))
|
|||
|
|
|
|||
|
|
local legacy_filename = ArcCW.PresetPath .. self:GetPresetBase() .. "/" .. presetname .. ".txt"
|
|||
|
|
if file.Exists(legacy_filename, "DATA") then
|
|||
|
|
file.Delete(legacy_filename)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- Legacy presets
|
|||
|
|
--[[]
|
|||
|
|
local str = ""
|
|||
|
|
for i, k in pairs(self.Attachments) do
|
|||
|
|
if k.Installed then
|
|||
|
|
str = str .. k.Installed
|
|||
|
|
if k.SlidePos or self.SightMagnifications[i] then
|
|||
|
|
str = str .. "," .. tostring(k.SlidePos or 0.5) .. "," .. tostring(self.SightMagnifications[i] or -1)
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
str = str .. "\n"
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
filename = ArcCW.PresetPath .. self:GetPresetBase() .. "/" .. filename .. ".txt"
|
|||
|
|
|
|||
|
|
file.CreateDir(ArcCW.PresetPath .. self:GetPresetBase())
|
|||
|
|
file.Write(filename, str)
|
|||
|
|
]]
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
function SWEP:CreatePresetSave()
|
|||
|
|
if !IsValid(ArcCW.InvHUD) then return end
|
|||
|
|
local bg = vgui.Create("DFrame", ArcCW.InvHUD)
|
|||
|
|
bg:SetPos(0, 0)
|
|||
|
|
bg:SetSize(ScrW(), ScrH())
|
|||
|
|
bg:SetText("")
|
|||
|
|
bg:SetTitle("")
|
|||
|
|
bg:SetDraggable(false)
|
|||
|
|
bg:ShowCloseButton(false)
|
|||
|
|
bg.Paint = function(span)
|
|||
|
|
surface.SetDrawColor(0, 0, 0, 200)
|
|||
|
|
surface.DrawRect(0, 0, ScrW(), ScrH())
|
|||
|
|
end
|
|||
|
|
bg:MakePopup()
|
|||
|
|
|
|||
|
|
local text = vgui.Create("DTextEntry", bg)
|
|||
|
|
text:SetSize(ScreenScaleMulti(256), ScreenScaleMulti(26))
|
|||
|
|
text:Center()
|
|||
|
|
text:RequestFocus()
|
|||
|
|
text:SetFont("ArcCW_24")
|
|||
|
|
text:SetText(self.LastPresetName or "")
|
|||
|
|
|
|||
|
|
local accept = vgui.Create("DButton", bg)
|
|||
|
|
accept:SetSize((ScreenScaleMulti(256) - ScreenScaleMulti(2)) / 2, ScreenScaleMulti(14))
|
|||
|
|
accept:SetText("")
|
|||
|
|
accept:SetPos((ScrW() - ScreenScaleMulti(256)) / 2, ((ScrH() - ScreenScaleMulti(14)) / 2) + ScreenScaleMulti(26) + ScreenScaleMulti(2))
|
|||
|
|
|
|||
|
|
accept.OnMousePressed = function(spaa, kc)
|
|||
|
|
local txt = text:GetText()
|
|||
|
|
txt = string.sub(txt, 0, 36)
|
|||
|
|
self.LastPresetName = txt
|
|||
|
|
self:SavePreset(txt)
|
|||
|
|
bg:Close()
|
|||
|
|
bg:Remove()
|
|||
|
|
|
|||
|
|
ArcCW.InvHUD_FormPresets()
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
accept.Paint = function(spaa, w, h)
|
|||
|
|
if !self:IsValid() 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 = "Save"
|
|||
|
|
|
|||
|
|
surface.SetTextColor(Bfg_col)
|
|||
|
|
surface.SetTextPos(ScreenScaleMulti(2), ScreenScaleMulti(1))
|
|||
|
|
surface.SetFont("ArcCW_12")
|
|||
|
|
surface.DrawText(txt)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
local cancel = vgui.Create("DButton", bg)
|
|||
|
|
cancel:SetSize((ScreenScaleMulti(256) - ScreenScaleMulti(2)) / 2, ScreenScaleMulti(14))
|
|||
|
|
cancel:SetText("")
|
|||
|
|
cancel:SetPos(((ScrW() - ScreenScaleMulti(256)) / 2) + ScreenScaleMulti(128 + 1), ((ScrH() - ScreenScaleMulti(14)) / 2) + ScreenScaleMulti(26) + ScreenScaleMulti(2))
|
|||
|
|
|
|||
|
|
cancel.OnMousePressed = function(spaa, kc)
|
|||
|
|
bg:Close()
|
|||
|
|
bg:Remove()
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
cancel.Paint = function(spaa, w, h)
|
|||
|
|
if !self:IsValid() 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 = "Cancel"
|
|||
|
|
|
|||
|
|
surface.SetTextColor(Bfg_col)
|
|||
|
|
surface.SetTextPos(ScreenScaleMulti(2), ScreenScaleMulti(1))
|
|||
|
|
surface.SetFont("ArcCW_12")
|
|||
|
|
surface.DrawText(txt)
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
function SWEP:CreatePresetMenu()
|
|||
|
|
if !IsValid(ArcCW.InvHUD) then return end
|
|||
|
|
|
|||
|
|
if !IsValid(ArcCW.InvHUD) then return end
|
|||
|
|
local bg = vgui.Create("DFrame", ArcCW.InvHUD)
|
|||
|
|
bg:SetPos(0, 0)
|
|||
|
|
bg:SetSize(ScrW(), ScrH())
|
|||
|
|
bg:SetText("")
|
|||
|
|
bg:SetTitle("")
|
|||
|
|
bg:SetDraggable(false)
|
|||
|
|
bg:ShowCloseButton(false)
|
|||
|
|
bg.Paint = function(span)
|
|||
|
|
surface.SetDrawColor(0, 0, 0, 200)
|
|||
|
|
surface.DrawRect(0, 0, ScrW(), ScrH())
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
local cancel = vgui.Create("DButton", bg)
|
|||
|
|
cancel:SetSize(ScreenScaleMulti(128), ScreenScaleMulti(14))
|
|||
|
|
cancel:SetText("")
|
|||
|
|
cancel:SetPos((ScrW() - ScreenScaleMulti(128)) / 2, ScrH() - ScreenScaleMulti(32))
|
|||
|
|
|
|||
|
|
cancel.OnMousePressed = function(spaa, kc)
|
|||
|
|
bg:Close()
|
|||
|
|
bg:Remove()
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
cancel.Paint = function(spaa, w, h)
|
|||
|
|
if !self:IsValid() 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 = "Cancel"
|
|||
|
|
|
|||
|
|
surface.SetTextColor(Bfg_col)
|
|||
|
|
surface.SetTextPos(ScreenScaleMulti(2), ScreenScaleMulti(1))
|
|||
|
|
surface.SetFont("ArcCW_12")
|
|||
|
|
surface.DrawText(txt)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
local presetsmenu = vgui.Create("DScrollPanel", bg)
|
|||
|
|
presetsmenu:SetText("")
|
|||
|
|
presetsmenu:SetSize(ScreenScaleMulti(256), ScrH() - ScreenScaleMulti(64))
|
|||
|
|
presetsmenu:SetPos((ScrW() - ScreenScaleMulti(256)) / 2, ScreenScaleMulti(8))
|
|||
|
|
presetsmenu.Paint = function(span, w, h)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
local sbar = presetsmenu: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(255, 255, 255, 255)
|
|||
|
|
surface.DrawRect(0, 0, w, h)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
local c = 0
|
|||
|
|
|
|||
|
|
for i, k in pairs(self:GetPresets()) do
|
|||
|
|
if string.StripExtension(k) == "autosave" then continue end
|
|||
|
|
local preset = vgui.Create("DButton", presetsmenu)
|
|||
|
|
preset:SetSize(ScreenScaleMulti(254), ScreenScaleMulti(14))
|
|||
|
|
preset:SetText("")
|
|||
|
|
preset:Dock(TOP)
|
|||
|
|
preset:DockMargin( 0, 0, 0, ScreenScaleMulti(2) )
|
|||
|
|
|
|||
|
|
preset.PresetName = string.StripExtension(k) --string.sub(k, 1, -5)
|
|||
|
|
preset.PresetFile = k
|
|||
|
|
|
|||
|
|
preset.OnMousePressed = function(spaa, kc)
|
|||
|
|
self.LastPresetName = spaa.PresetName
|
|||
|
|
self:LoadPreset(spaa.PresetName)
|
|||
|
|
bg:Close()
|
|||
|
|
bg:Remove()
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
preset.Paint = function(spaa, w, h)
|
|||
|
|
if !self:IsValid() 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)
|
|||
|
|
|
|||
|
|
surface.SetTextColor(Bfg_col)
|
|||
|
|
surface.SetTextPos(ScreenScaleMulti(2), ScreenScaleMulti(1))
|
|||
|
|
surface.SetFont("ArcCW_12")
|
|||
|
|
surface.DrawText(string.upper(spaa.PresetName))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
local close = vgui.Create("DButton", preset)
|
|||
|
|
close:SetSize(ScreenScaleMulti(16), ScreenScaleMulti(16))
|
|||
|
|
close:SetText("")
|
|||
|
|
close:Dock(RIGHT)
|
|||
|
|
|
|||
|
|
close.OnMousePressed = function(spaa, kc)
|
|||
|
|
local filename = spaa.PresetFile
|
|||
|
|
file.Delete(filename)
|
|||
|
|
preset:Remove()
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
close.Paint = function(spaa, w, h)
|
|||
|
|
if !self:IsValid() or preset:IsHovered() 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 w_x, h_x = surface.GetTextSize("×")
|
|||
|
|
surface.SetTextColor(Bfg_col)
|
|||
|
|
surface.SetTextPos((ScreenScaleMulti(16) - w_x) / 2, (ScreenScaleMulti(16) - h_x) / 2)
|
|||
|
|
surface.SetFont("ArcCW_12")
|
|||
|
|
surface.DrawText("×")
|
|||
|
|
end
|
|||
|
|
c = c + 1
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
if c == 0 then
|
|||
|
|
local label = vgui.Create("DLabel", presetsmenu)
|
|||
|
|
label:SetSize(ScreenScaleMulti(254), ScreenScaleMulti(14))
|
|||
|
|
label:SetText("")
|
|||
|
|
label:Dock(TOP)
|
|||
|
|
label:DockMargin( 0, 0, 0, ScreenScaleMulti(2) )
|
|||
|
|
|
|||
|
|
label.Paint = function(spaa, w, h)
|
|||
|
|
local Bfg_col = Color(255, 255, 255, 255)
|
|||
|
|
|
|||
|
|
local txt = "No presets found! Go make some!"
|
|||
|
|
|
|||
|
|
surface.SetTextColor(Bfg_col)
|
|||
|
|
surface.SetTextPos(ScreenScaleMulti(2), ScreenScaleMulti(1))
|
|||
|
|
surface.SetFont("ArcCW_12")
|
|||
|
|
surface.DrawText(txt)
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
function SWEP:ClosePresetMenu()
|
|||
|
|
end
|