Files
wnsrc/lua/stormfox2/functions/cl_menu.lua
lifestorm 324f19217d Upload
2024-08-05 18:40:29 +03:00

334 lines
10 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/
--]]
StormFox2.Menu = StormFox2.Menu or {}
local function niceName(sName)
if sName[1] == "#" then
sName = sName:sub(2)
end
sName = string.Replace(sName, "_", " ")
local str = ""
for s in string.gmatch(sName, "[^%s]+") do
str = str .. string.upper(s[1]) .. string.sub(s, 2) .. " "
end
return string.TrimRight(str, " ")
end
local function wrapText(sText, wide)
wide = wide - 10
local tw,th = surface.GetTextSize(language.GetPhrase(sText))
local lines,b = 1, false
local s = ""
for w in string.gmatch(sText, "[^%s,]+") do
local tt = s .. (b and " " or "") .. w
if surface.GetTextSize(tt) >= wide then
s = s .. "\n" .. w
lines = lines + 1
else
s = tt
end
b = true
end
return s, lines
end
local m = Material("gui/gradient")
local function paintKnob(self,x, y) -- Skin doesn't have x or y pos
local skin = self:GetSkin()
if ( self:GetDisabled() ) then return skin.tex.Input.Slider.H.Disabled( x, y, 15, 15 ) end
if ( self.Depressed ) then
return skin.tex.Input.Slider.H.Down( x, y, 15, 15 )
end
if ( self.Hovered ) then
return skin.tex.Input.Slider.H.Hover( x, y, 15, 15 )
end
skin.tex.Input.Slider.H.Normal( x, y, 15, 15 )
end
local notchesColor = Color(0,0,0,100)
-- Tips
local function AddTip( self, text )
if IsValid( self.tTip ) then return end
self.tTip = vgui.Create("DTooltip")
self.tTip:SetText( text )
self.tTip.TargetPanel = self
self.tTip:PositionTooltip()
end
local function RemoveTip( self )
if IsValid( self.tTip ) then
self.tTip:Remove()
end
self.tTip = nil
end
local tabs = {
[1] = {"Start","#start",(Material("stormfox2/hud/menu/dashboard.png")),function(board)
board:AddTitle("#information")
local dash = vgui.Create("DPanel", board)
dash.Paint = empty
dash:Dock(TOP)
dash:SetTall(80)
local fps, qu, sup, mth
-- FPS
local p = vgui.Create("SF_Setting_Ring", dash)
p:SetText(string.upper(language.GetPhrase("#fps")) .. ": ")
p:SetSize(74, 74)
p:SetPos(24,10)
function p:Think()
if (self.u_t or 0) > SysTime() then return end
if not system.HasFocus() then return end
self.u_t = SysTime() + 1
local t = StormFox2.Setting.GetCache("quality_target",144)
local _, avgFPS = StormFox2.Client.GetQualityNumber()
self:SetValue( avgFPS / t)
p:SetText(string.upper(language.GetPhrase("#fps")) .. ": " .. math.floor(avgFPS))
end
fps = p
-- Quality
local p = vgui.Create("SF_Setting_Ring", dash)
p:SetText(language.GetPhrase("#effects"))
p:SetSize(74, 74)
p:SetPos(106,10)
function p:Think()
if (self.u_t or 0) > SysTime() then return end
if not system.HasFocus() then return end
self.u_t = SysTime() + 1
local max_q = StormFox2.Setting.GetCache("quality_ultra",false) and 20 or 7
local q, _ = StormFox2.Client.GetQualityNumber()
local f = q / max_q
self:SetValue( f )
p:SetText(language.GetPhrase("#effects") .. "\n" .. math.floor(f * 100) .. "%")
end
qu = p
-- Support GPU
local p = vgui.Create("SF_Setting_Ring", dash)
p:SetText(niceName(language.GetPhrase("#support")))
p:SetSize(74, 74)
p:SetPos(188,10)
--p:SetColor(255,0,0)
local t = {render.SupportsPixelShaders_1_4(),render.SupportsVertexShaders_2_0(), render.SupportsPixelShaders_2_0(), render.SupportsHDR()}
local v = 0
local s ="#problems.no_problems"
for k,v2 in ipairs(t) do
if not v2 then
if k == 1 then
s = "#problem.no_ps14"
elseif k == 2 then
s = "#problem.no_vs20"
elseif k == 3 then
s = "#problem.no_ps20"
else
s = "#problem.no_hdr"
end
break
end
v = v + 1
end
p:SetTooltip(s)
local f = v / #t
p:SetValue(f)
local c = HSLToColor(120 * f, 1, 0.5 * f)
--p:SetColor(c.r,c.g,c.b)
p:SetText(niceName(language.GetPhrase("#support")) .. "\n" .. v .. "/" .. #t)
sup = p
-- MThread
local p = vgui.Create("SF_Setting_Ring", dash)
p:SetText(niceName(language.GetPhrase("#MThread")))
p:SetSize(74, 74)
p:SetPos(188,10)
--p:SetColor(255,0,0)
local t = {["cl_threaded_bone_setup"] = 1,
["cl_threaded_client_leaf_system"] = 1,
["r_threaded_client_shadow_manager"] = 1,
["r_threaded_particles"] = 1,
["r_threaded_renderables"] = 1,
["r_queued_ropes"] = 1,
["studio_queue_mode"] = 1,
["gmod_mcore_test"] = 1,
["mat_queue_mode"] = 2}
local v = 0
local s = "\n"
for k,v2 in pairs(t) do
if GetConVar(k):GetInt() ~= v2 then
s = s .. k .. " " .. v2 .. "\n"
continue
end
v = v + 1
end
local f = v / table.Count(t)
p:SetValue(f)
local c = HSLToColor(120 * f, 1, 0.5 * f)
--p:SetColor(c.r,c.g,c.b)
p:SetText(niceName(language.GetPhrase("#MThread")) .. "\n" .. v .. "/" .. table.Count(t))
if f < 1 then
p:SetTooltip(string.format(language.GetPhrase("#sf_mthreadwarning"), s))
else
p:SetTooltip(language.GetPhrase("#problems.no_problems"))
end
mth = p
function dash:PerformLayout(w, h)
local a = w / 5
local x = -fps:GetTall() / 2
fps:SetPos(x + a, h - fps:GetTall())
qu:SetPos(x + a*2, h - qu:GetTall())
sup:SetPos(x + a*3, h - sup:GetTall())
mth:SetPos(x + a*4, h - sup:GetTall())
end
-- Fps Slider
local FPSTarget = vgui.Create("SF_Setting", board)
FPSTarget:SetSetting("quality_target")
board:MarkUsed("quality_target")
do
local obj = StormFox2.Setting.GetObject("quality_target")
local slider = vgui.Create("DButton", FPSTarget)
local text = vgui.Create("DTextEntry", FPSTarget)
FPSTarget:MoveDescription(340)
slider:SetPos(5,15)
slider:SetSize( 300, 25 )
slider:SetText("")
text:SetPos( 304, 19)
text:SetSize( 40,20 )
local hot = Color(255,0,0,205)
-- Text set
function text:OnEnter( str )
str = str:lower()
if str == language.GetPhrase("#all"):lower() or str == "all" then
str = 0
else
str = tonumber( str ) or 0
end
obj:SetValue(str)
end
-- Slider skin functions
function slider:GetNotchColor()
return notchesColor
end
function slider:GetNotches()
return math.floor(self:GetWide() / 21)
end
-- Slider paint
function slider:Paint( w, h )
local var = self._OvR or StormFox2.Setting.GetCache("quality_target", 144)
local cV = 300 - var
local skin = self:GetSkin()
skin:PaintNumSlider(self,w,h)
-- "warm"
surface.SetMaterial(m)
surface.SetDrawColor(hot)
local wi = w / 300 * 260
surface.DrawTexturedRectUV(wi - 7, 4, w - wi, h - 6, 1,0,0,1)
paintKnob(self, 1 + (w - 16) / 300 * cV,-0.5)
end
function slider:UpdateText( var )
if var > 0 then
text:SetText(var)
else
text:SetText(niceName(language.GetPhrase("#all")))
end
end
-- Slider think
function slider:Think()
if self:IsDown() then
self._down = true
self._OvR = math.Clamp(1 - (self:LocalCursorPos() - 6) / (self:GetWide() - 12), 0, 1) * 300
if self._OvR < 40 then
AddTip(self, "#frame_blend_pp.desc2")
else
RemoveTip( self )
end
self:UpdateText( math.Round(self._OvR, 0) )
else
if not text:IsEditing() then
self:UpdateText( math.Round(obj:GetValue(), 0) )
end
self._OvR = nil
RemoveTip( self )
if self._down then
self._down = nil
local var = math.Clamp(1 - (self:LocalCursorPos() - 6) / (self:GetWide() - 12), 0, 1) * 300
obj:SetValue( math.Round(var, 0) )
end
end
end
slider:UpdateText(math.Round(obj:GetValue(), 0))
end
FPSTarget:Dock(TOP)
-- EnableDisable
local p = board:AddSetting("clenable")
--local qs = board:AddSetting("quality_target")
board:AddSetting("quality_ultra")
board:AddTitle("#sf_customization")
local l = vgui.Create("DPanel", board)
l:DockMargin(10,0,0,0)
l:SetTall(24)
l:Dock(TOP)
function l:Paint(w,h)
local md = StormFox2.Setting.GetCache("use_monthday",false) and os.date( "%m/%d/%Y" ) or os.date( "%d/%m/%Y" )
local dt = StormFox2.Setting.GetCache("display_temperature")
local hs = string.Explode(":", os.date( "%H:%M") or "17:23")
local n = hs[1] * 60 + hs[2]
local str = niceName(language.GetPhrase("#time")) .. ": " .. StormFox2.Time.GetDisplay(n) .. " " .. md
str = str .. " " .. niceName(language.GetPhrase("#temperature")) .. ": " .. math.Round(StormFox2.Temperature.Convert(nil,dt,22), 1) .. StormFox2.Temperature.GetDisplaySymbol()
draw.DrawText(str, "DermaDefaultBold", 5, 0, color_black, TEXT_ALIGN_LEFT)
end
board:AddSetting("12h_display")
board:AddSetting("use_monthday")
board:AddSetting("display_temperature")
end},
[2] = {"Effects","#effects",(Material("stormfox2/hud/menu/settings.png")),function(board)
board:AddTitle(language.GetPhrase("#effects"))
local fog = board:AddSetting("enable_fog")
board:AddSetting("extra_darkness")
board:AddSetting("extra_darkness_amount")
board:AddSetting("enable_breath")
board:AddSetting("enable_sunbeams")
board:AddSetting("edit_cubemaps")
board:AddTitle(language.GetPhrase("#footprints"))
board:AddSetting("footprint_enabled")
board:AddSetting("footprint_playeronly")
board:AddSetting("footprint_distance")
board:AddSetting("footprint_max")
board:AddTitle(language.GetPhrase("#sf_window_effects"))
board:AddSetting("window_enable")
board:AddSetting("window_distance")
fog:SetDisabled(not StormFox2.Setting.GetCache("allow_fog_change"))
StormFox2.Setting.Callback("allow_fog_change",function(vVar,_,_, self)
fog:SetDisabled(not vVar)
end,fog)
end},
[3] = {"Misc","#misc",(Material("stormfox2/hud/menu/other.png")),function(board)
board:AddTitle("SF2 " .. language.GetPhrase("spawnmenu.utilities.settings"))
local panel = board:AddSetting("mapfile_cl")
panel:SetTitle("#makepersistent")
panel:SetDescription(language.GetPhrase("#persistent_mode") .. " data\\stormfox2\\cl_settings\\" .. game.GetMap() .. ".json")
end},
[4] = {"DLC","DLC",(Material("stormfox2/hud/menu/dlc.png")), function(board)
hook.Run("stormfox2.menu.dlc", board)
end}
}
---Opens the client-settings.
---@client
function StormFox2.Menu.Open()
if _SFMENU and IsValid(_SFMENU) then
_SFMENU:Remove()
_SFMENU = nil
end
local p = vgui.Create("SF_Menu")
_SFMENU = p
p:SetTitle("StormFox " .. niceName(language.GetPhrase("#client")) .. " ".. language.GetPhrase("#spawnmenu.utilities.settings"))
p:CreateLayout(tabs, StormFox2.Setting.GetAllClient())
p:SetCookie("sf2_lastmenucl")
_SFMENU:MakePopup()
end