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

468 lines
14 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
-- 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