Files
wnsrc/lua/weapons/arccw_base/cl_presets.lua

468 lines
14 KiB
Lua
Raw Permalink Normal View History

2024-08-04 23:54:45 +03:00
--[[
| 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