mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33: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 |