mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 05:43:46 +03:00
334 lines
10 KiB
Lua
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
|