Files
barotrauma-localmods/Performance Fix/Lua/performancefix_gui.lua
2025-03-31 13:19:47 +02:00

301 lines
14 KiB
Lua

-- I'm sorry for the eyes of anyone looking at the GUI code.
local MultiLineTextBox = dofile(PerformanceFix.Path .. "/Lua/MultiLineTextBox.lua")
local easySettings = dofile(PerformanceFix.Path .. "/Lua/easysettings.lua")
Game.AddCommand("performancefix", "opens performance fix gui", function ()
PerformanceFix.ToggleGUI()
end)
local GUIComponent = LuaUserData.CreateStatic("Barotrauma.GUIComponent")
local function CommaStringToTable(str)
local tbl = {}
for word in string.gmatch(str, '([^,]+)') do
table.insert(tbl, word)
end
return tbl
end
local function ClearElements(guicomponent, removeItself)
local toRemove = {}
for value in guicomponent.GetAllChildren() do
table.insert(toRemove, value)
end
for index, value in pairs(toRemove) do
value.RemoveChild(value)
end
if guicomponent.Parent and removeItself then
guicomponent.Parent.RemoveChild(guicomponent)
end
end
local function GetAmountOfPrefab(prefabs)
local amount = 0
for key, value in prefabs do
amount = amount + 1
end
return amount
end
Hook.Add("stop", "PerformanceFix.CleanupGUI", function ()
if selectedGUIText then
selectedGUIText.Parent.RemoveChild(selectedGUIText)
end
if PerformanceFix.GUIFrame then
ClearElements(PerformanceFix.GUIFrame, true)
end
end)
PerformanceFix.ShowGUI = function (frame)
PerformanceFix.GUIFrame = frame
local config = easySettings.BasicList(frame)
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Active Items: " .. tostring(#Item.ItemList), nil, nil)
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Active Characters: " .. tostring(#Character.CharacterList), nil, nil)
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Active Walls: " .. tostring(#Structure.WallList), nil, nil)
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Active Submarines: " .. tostring(#Submarine.Loaded), nil, nil)
local shadowCastingLights = 0
local drawBehindSubLights = 0
for key, value in pairs(Item.ItemList) do
local light = value.GetComponentString("LightComponent")
if light and light.IsOn then
if light.CastShadows then shadowCastingLights = shadowCastingLights + 1 end
if light.DrawBehindSubs then drawBehindSubLights = drawBehindSubLights + 1 end
end
end
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Draw Behind Sub Lights: " .. tostring(shadowCastingLights), nil, nil)
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Shadow Casting Lights: " .. tostring(drawBehindSubLights), nil, nil)
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "", nil, nil)
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Item Prefabs Loaded: " .. tostring(GetAmountOfPrefab(ItemPrefab.Prefabs)), nil, nil)
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Character Prefabs Loaded: " .. tostring(GetAmountOfPrefab(CharacterPrefab.Prefabs)), nil, nil)
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Submarines Loaded In Memory: " .. tostring(#SubmarineInfo.SavedSubmarines), nil, nil)
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), config.Content.RectTransform), "Performance Fix Config", nil, nil, GUI.Alignment.Center)
local btn = GUI.Button(GUI.RectTransform(Vector2(1, 0.2), config.Content.RectTransform), "Save Config and Reload Client-Side Performance Fix", GUI.Alignment.Center, "GUIButtonSmall")
btn.OnClicked = function ()
File.Write(PerformanceFix.Path .. "/config.json", json.serialize(PerformanceFix.Config))
dofile(PerformanceFix.Path .. "/Lua/performancefix.lua")
end
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), config.Content.RectTransform), "Note: Server configurations require you to either restart or use the command reloadlua to change it. For dedicated servers you need to edit the file config.json, this GUI wont work.", nil, nil, GUI.Alignment.Center, true)
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Timing Accumulator Max", nil, nil, GUI.Alignment.Center, true)
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), config.Content.RectTransform), "Lower values of Timing Accumulator Max means the game will more aggressively skip ticks, thus it can improve performance when your game is running really slowly. The games default is 250.", nil, nil, GUI.Alignment.Center, true)
local accumulatorMax = GUI.NumberInput(GUI.RectTransform(Vector2(1, 0.1), config.Content.RectTransform), NumberType.Int)
accumulatorMax.MinValueInt = 1
accumulatorMax.MaxValueInt = 1000
accumulatorMax.valueStep = 10
if PerformanceFix.Config.accumulatorMax == nil then
accumulatorMax.IntValue = 250
else
accumulatorMax.IntValue = PerformanceFix.Config.accumulatorMax
end
accumulatorMax.OnValueChanged = function ()
PerformanceFix.Config.accumulatorMax = accumulatorMax.IntValue
end
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Client Map Entity Interval", nil, nil, GUI.Alignment.Center, true)
local clientMapEntityUpdateInterval = GUI.NumberInput(GUI.RectTransform(Vector2(1, 0.1), config.Content.RectTransform), NumberType.Int)
clientMapEntityUpdateInterval.MinValueInt = 1
clientMapEntityUpdateInterval.MaxValueInt = 60
clientMapEntityUpdateInterval.IntValue = PerformanceFix.Config.clientMapEntityUpdateInterval
clientMapEntityUpdateInterval.OnValueChanged = function ()
PerformanceFix.Config.clientMapEntityUpdateInterval = clientMapEntityUpdateInterval.IntValue
end
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Server Map Entity Interval", nil, nil, GUI.Alignment.Center, true)
local serverMapEntityUpdateInterval = GUI.NumberInput(GUI.RectTransform(Vector2(1, 0.1), config.Content.RectTransform), NumberType.Int)
serverMapEntityUpdateInterval.MinValueInt = 1
serverMapEntityUpdateInterval.MaxValueInt = 60
serverMapEntityUpdateInterval.IntValue = PerformanceFix.Config.serverMapEntityUpdateInterval
serverMapEntityUpdateInterval.OnValueChanged = function ()
PerformanceFix.Config.serverMapEntityUpdateInterval = serverMapEntityUpdateInterval.IntValue
end
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Powered Update Interval (Client-Side only and only works on multiplayer)", nil, nil, GUI.Alignment.Center, true)
local poweredUpdateInterval = GUI.NumberInput(GUI.RectTransform(Vector2(1, 0.1), config.Content.RectTransform), NumberType.Int)
poweredUpdateInterval.MinValueInt = 1
poweredUpdateInterval.MaxValueInt = 60
poweredUpdateInterval.IntValue = PerformanceFix.Config.poweredUpdateInterval or 1
poweredUpdateInterval.OnValueChanged = function ()
PerformanceFix.Config.poweredUpdateInterval = poweredUpdateInterval.IntValue
end
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Client High Priority Items", nil, nil, GUI.Alignment.Center, true)
local clientHighPriorityItems = MultiLineTextBox(config.Content.RectTransform, "", 0.2)
clientHighPriorityItems.Text = table.concat(PerformanceFix.Config.clientItemHighPriority, ",")
clientHighPriorityItems.OnTextChangedDelegate = function (textBox)
PerformanceFix.Config.clientItemHighPriority = CommaStringToTable(textBox.Text)
end
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Server High Priority Items", nil, nil, GUI.Alignment.Center, true)
local serverHighPriorityItems = MultiLineTextBox(config.Content.RectTransform, "", 0.2)
serverHighPriorityItems.Text = table.concat(PerformanceFix.Config.serverItemHighPriority, ",")
serverHighPriorityItems.OnTextChangedDelegate = function (textBox)
PerformanceFix.Config.serverItemHighPriority = CommaStringToTable(textBox.Text)
end
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Client High Priority Components", nil, nil, GUI.Alignment.Center, true)
local clientHighPriorityComponents = MultiLineTextBox(config.Content.RectTransform, "", 0.2)
clientHighPriorityComponents.Text = table.concat(PerformanceFix.Config.clientComponentPriority, ",")
clientHighPriorityComponents.OnTextChangedDelegate = function (textBox)
PerformanceFix.Config.clientComponentPriority = CommaStringToTable(textBox.Text)
end
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Server High Priority Components", nil, nil, GUI.Alignment.Center, true)
local serverHighPriorityComponents = MultiLineTextBox(config.Content.RectTransform, "", 0.2)
serverHighPriorityComponents.Text = table.concat(PerformanceFix.Config.serverComponentPriority, ",")
serverHighPriorityComponents.OnTextChangedDelegate = function (textBox)
PerformanceFix.Config.serverComponentPriority = CommaStringToTable(textBox.Text)
end
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), config.Content.RectTransform), "Character Update Config (Extra Experimental)", nil, nil, GUI.Alignment.Center, true)
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Client Character Update Interval", nil, nil, GUI.Alignment.Center, true)
local clientCharacterUpdateInterval = GUI.NumberInput(GUI.RectTransform(Vector2(1, 0.1), config.Content.RectTransform), NumberType.Int)
clientCharacterUpdateInterval.MinValueInt = 1
clientCharacterUpdateInterval.MaxValueInt = 60
clientCharacterUpdateInterval.IntValue = PerformanceFix.Config.clientCharacterUpdateInterval
clientCharacterUpdateInterval.OnValueChanged = function ()
PerformanceFix.Config.clientCharacterUpdateInterval = clientCharacterUpdateInterval.IntValue
end
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "Server Character Update Interval", nil, nil, GUI.Alignment.Center, true)
local serverCharacterUpdateInterval = GUI.NumberInput(GUI.RectTransform(Vector2(1, 0.1), config.Content.RectTransform), NumberType.Int)
serverCharacterUpdateInterval.MinValueInt = 1
serverCharacterUpdateInterval.MaxValueInt = 60
serverCharacterUpdateInterval.IntValue = PerformanceFix.Config.serverCharacterUpdateInterval
serverCharacterUpdateInterval.OnValueChanged = function ()
PerformanceFix.Config.serverCharacterUpdateInterval = serverCharacterUpdateInterval.IntValue
end
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), config.Content.RectTransform), "High Priority Characters", nil, nil, GUI.Alignment.Center, true)
local highPriorityCharacters = MultiLineTextBox(config.Content.RectTransform, "", 0.2)
highPriorityCharacters.Text = table.concat(PerformanceFix.Config.highPriorityCharacters, ",")
highPriorityCharacters.OnTextChangedDelegate = function (textBox)
PerformanceFix.Config.highPriorityCharacters = CommaStringToTable(textBox.Text)
end
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), config.Content.RectTransform), "WARNING: THE BELOW CONFIGS ARE PERMANENT FOR SINGLEPLAYER AND IN MULTIPLAYER ARE REVERSIBLE BY RESTARTING THE ROUND.", nil, nil, GUI.Alignment.Center, true)
local singleplayerPermanent = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), config.Content.RectTransform), "Allow Permanent Configs In Singleplayer")
singleplayerPermanent.Selected = PerformanceFix.Config.allowSingleplayerPermanentConfigs or false
singleplayerPermanent.OnSelected = function ()
PerformanceFix.Config.allowSingleplayerPermanentConfigs = singleplayerPermanent.State == GUIComponent.ComponentState.Selected
end
local shadowCasting = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), config.Content.RectTransform), "Disable Shadow Casting Lights")
shadowCasting.Selected = PerformanceFix.Config.disableShadowCastingLights
shadowCasting.OnSelected = function ()
PerformanceFix.Config.disableShadowCastingLights = shadowCasting.State == GUIComponent.ComponentState.Selected
end
local drawBehindSub = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), config.Content.RectTransform), "Disable Draw Behind Subs Lights")
drawBehindSub.Selected = PerformanceFix.Config.disableDrawBehindSubsLights
drawBehindSub.OnSelected = function ()
PerformanceFix.Config.disableDrawBehindSubsLights = drawBehindSub.State == GUIComponent.ComponentState.Selected
end
local hideInGameWires = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), config.Content.RectTransform), "Hide In Game Wires")
hideInGameWires.Selected = PerformanceFix.Config.hideInGameWires
hideInGameWires.OnSelected = function ()
PerformanceFix.Config.hideInGameWires = hideInGameWires.State == GUIComponent.ComponentState.Selected
end
local hideInGameComponents = GUI.TickBox(GUI.RectTransform(Vector2(1, 0.2), config.Content.RectTransform), "Hide In Game Components")
hideInGameComponents.Selected = PerformanceFix.Config.hideInGameComponents
hideInGameComponents.OnSelected = function ()
PerformanceFix.Config.hideInGameComponents = hideInGameComponents.State == GUIComponent.ComponentState.Selected
end
end
easySettings.AddMenu("Performance Fix", PerformanceFix.ShowGUI)
PerformanceFix.ToggleGUI = function ()
GUI.GUI.TogglePauseMenu()
if GUI.GUI.PauseMenuOpen then
easySettings.Open("Performance Fix")
end
end