Files
barotrauma-localmods/Real Sonar/Lua/menu.lua
2025-03-31 13:19:47 +02:00

300 lines
17 KiB
Lua

local easySettings = dofile(RealSonar.Path .. "/Lua/easysettings.lua")
local MultiLineTextBox = dofile(RealSonar.Path .. "/Lua/multilinetextbox.lua")
local configPath = RealSonar.Path .. "/config.json"
local defaultConfig = dofile(RealSonar.Path .. "/Lua/defaultconfig.lua")
local function CommaStringToTable(str)
local tbl = {}
for word in string.gmatch(str, '([^,]+)') do
table.insert(tbl, word:match("^%s*(.-)%s*$")) -- Trim leading and trailing whitespace
end
return tbl
end
local function formatJsonTextBlock(str)
local pattern = "},\""
local replacement = "},\n\""
-- Add newline after first character and before last character
if #str > 1 then
str = str:sub(1, 1) .. "\n" .. str:sub(2, -2) .. "\n" .. str:sub(-1)
end
return string.gsub(str, pattern, replacement)
end
easySettings.AddMenu(TextManager.Get("realsonarsettings").Value, function (parent)
local list = easySettings.BasicList(parent)
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), list.Content.RectTransform), TextManager.Get("volumesettings").Value, nil, nil, GUI.Alignment.Center)
local textBlock = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center)
local slider = easySettings.Slider(list.Content, 0, 2, function (value)
RealSonar.Config.AirPingVolume = math.floor(value * 100)/100
textBlock.Text = string.format("%s %s%%", TextManager.Get("airpingvolume").Value, math.floor(value * 100))
easySettings.SaveTable(configPath, RealSonar.Config)
end, RealSonar.Config.AirPingVolume)
textBlock.Text = string.format("%s %s%%", TextManager.Get("airpingvolume").Value, math.floor(slider.BarScrollValue * 100))
local textBlock = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center)
local slider = easySettings.Slider(list.Content, 0, 2, function (value)
RealSonar.Config.WaterPingVolume = math.floor(value * 100)/100
textBlock.Text = string.format("%s %s%%", TextManager.Get("waterpingvolume").Value, math.floor(value * 100))
easySettings.SaveTable(configPath, RealSonar.Config)
end, RealSonar.Config.WaterPingVolume)
textBlock.Text = string.format("%s %s%%", TextManager.Get("waterpingvolume").Value, math.floor(slider.BarScrollValue * 100))
local textBlock = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center)
local slider = easySettings.Slider(list.Content, 0, 2, function (value)
RealSonar.Config.SuitPingVolume = math.floor(value * 100)/100
textBlock.Text = string.format("%s %s%%", TextManager.Get("suitpingvolume").Value, math.floor(value * 100))
easySettings.SaveTable(configPath, RealSonar.Config)
end, RealSonar.Config.SuitPingVolume)
textBlock.Text = string.format("%s %s%%", TextManager.Get("suitpingvolume").Value, math.floor(slider.BarScrollValue * 100))
if RealSonar.LITE == false then
local textBlock = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center)
local slider = easySettings.Slider(list.Content, 0, 2, function (value)
RealSonar.Config.TinnitusVolume = math.floor(value * 100)/100
textBlock.Text = string.format("%s %s%%", TextManager.Get("tinnitusvolume").Value, math.floor(value * 100))
easySettings.SaveTable(configPath, RealSonar.Config)
end, RealSonar.Config.TinnitusVolume)
textBlock.Text = string.format("%s %s%%", TextManager.Get("tinnitusvolume").Value, math.floor(slider.BarScrollValue * 100))
local textBlock = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center)
local slider = easySettings.Slider(list.Content, 0, 2, function (value)
RealSonar.Config.DistortionVolume = math.floor(value * 100)/100
textBlock.Text = string.format("%s %s%%", TextManager.Get("distortionvolume").Value, math.floor(value * 100))
easySettings.SaveTable(configPath, RealSonar.Config)
end, RealSonar.Config.DistortionVolume)
textBlock.Text = string.format("%s %s%%", TextManager.Get("distortionvolume").Value, math.floor(slider.BarScrollValue * 100))
end
if Game.IsMultiplayer then
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center)
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), list.Content.RectTransform), TextManager.Get("networksettings").Value, nil, nil, GUI.Alignment.Center)
local tick = easySettings.TickBox(list.Content, TextManager.Get("lowlatencymode"), function (state)
RealSonar.Config.LowLatencyMode = state
easySettings.SaveTable(configPath, RealSonar.Config)
end, RealSonar.Config.LowLatencyMode)
tick.ToolTip = TextManager.Get("lowlatencymodetooltip")
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center)
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), list.Content.RectTransform), TextManager.Get("gameplaysettingsserver").Value, nil, nil, GUI.Alignment.Center)
else
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.1), list.Content.RectTransform), TextManager.Get("gameplaysettingsclient").Value, nil, nil, GUI.Alignment.Center)
end
if RealSonar.LITE == false then
local tick = easySettings.TickBox(list.Content, TextManager.Get("submarinesonar"), function (state)
RealSonar.Config.SubmarineSonar = state
easySettings.SaveTable(configPath, RealSonar.Config)
end, RealSonar.Config.SubmarineSonar)
tick.ToolTip = TextManager.Get("submarinesonartooltip")
local tick = easySettings.TickBox(list.Content, TextManager.Get("beaconsonar"), function (state)
RealSonar.Config.BeaconSonar = state
easySettings.SaveTable(configPath, RealSonar.Config)
end, RealSonar.Config.BeaconSonar)
tick.ToolTip = TextManager.Get("beaconsonartooltip")
local tick = easySettings.TickBox(list.Content, TextManager.Get("shuttlesonar"), function (state)
RealSonar.Config.ShuttleSonar = state
easySettings.SaveTable(configPath, RealSonar.Config)
end, RealSonar.Config.ShuttleSonar)
tick.ToolTip = TextManager.Get("shuttlesonartooltip")
local tick = easySettings.TickBox(list.Content, TextManager.Get("enemysonar"), function (state)
RealSonar.Config.EnemySonar = state
easySettings.SaveTable(configPath, RealSonar.Config)
end, RealSonar.Config.EnemySonar)
tick.ToolTip = TextManager.Get("enemysonartooltip")
local tick = easySettings.TickBox(list.Content, TextManager.Get("customsonar"), function (state)
RealSonar.Config.CustomSonar = state
easySettings.SaveTable(configPath, RealSonar.Config)
end, RealSonar.Config.CustomSonar)
tick.ToolTip = TextManager.Get("customsonartooltip")
local tick = easySettings.TickBox(list.Content, TextManager.Get("targetcreatures"), function (state)
RealSonar.Config.CreatureDamage = state
easySettings.SaveTable(configPath, RealSonar.Config)
end, RealSonar.Config.CreatureDamage)
tick.ToolTip = TextManager.Get("targetcreaturestooltip")
local tick = easySettings.TickBox(list.Content, TextManager.Get("targetbots"), function (state)
RealSonar.Config.BotDamage = state
easySettings.SaveTable(configPath, RealSonar.Config)
end, RealSonar.Config.BotDamage)
tick.ToolTip = TextManager.Get("targetbotstooltip")
end
local tick = easySettings.TickBox(list.Content, TextManager.Get("targetplayers"), function (state)
RealSonar.Config.PlayerDamage = state
easySettings.SaveTable(configPath, RealSonar.Config)
end, RealSonar.Config.PlayerDamage)
tick.ToolTip = TextManager.Get("targetplayerstooltip")
local tick = easySettings.TickBox(list.Content, TextManager.Get("humanhulldetection"), function (state)
RealSonar.Config.HumanHullDetection = state
easySettings.SaveTable(configPath, RealSonar.Config)
end, RealSonar.Config.HumanHullDetection)
tick.ToolTip = TextManager.Get("humanhulldetectiontooltip")
local tick = easySettings.TickBox(list.Content, TextManager.Get("creaturehulldetection"), function (state)
RealSonar.Config.CreatureHullDetection = state
easySettings.SaveTable(configPath, RealSonar.Config)
end, RealSonar.Config.CreatureHullDetection)
tick.ToolTip = TextManager.Get("creaturehulldetectiontooltip")
local textBlock = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center)
local rangeStartingValue = RealSonar.Config.SonarRange
local slider = easySettings.Slider(list.Content, 0.1, 1.91, function (value)
RealSonar.Config.SonarRange = math.floor(value * 100)/100
textBlock.Text = string.format("%s %s%%", TextManager.Get("sonarrange").Value, math.floor(value * 100))
easySettings.SaveTable(configPath, RealSonar.Config)
if RealSonar.Config.SonarRange ~= rangeStartingValue then
easySettings.needRangeUpdate = true
else
easySettings.needRangeUpdate = false
end
end, RealSonar.Config.SonarRange)
textBlock.Text = string.format("%s %s%%", TextManager.Get("sonarrange").Value, math.floor(slider.BarScrollValue * 100))
if RealSonar.LITE == false then
local textBlock = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center)
local slider = easySettings.Slider(list.Content, 0, 2, function (value)
RealSonar.Config.SonarDamage = math.floor(value * 100)/100
textBlock.Text = string.format("%s %s%%", TextManager.Get("sonardamage").Value, math.floor(value * 100))
easySettings.SaveTable(configPath, RealSonar.Config)
end, RealSonar.Config.SonarDamage)
textBlock.Text = string.format("%s %s%%", TextManager.Get("sonardamage").Value, math.floor(slider.BarScrollValue * 100))
local textBlock = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center)
local slider = easySettings.Slider(list.Content, 0.5, 1.5, function (value)
RealSonar.Config.SonarSlow = math.floor(value * 100)/100
textBlock.Text = string.format("%s %s%%", TextManager.Get("sonarslow").Value, math.floor(value * 100))
easySettings.SaveTable(configPath, RealSonar.Config)
end, RealSonar.Config.SonarSlow)
textBlock.Text = string.format("%s %s%%", TextManager.Get("sonarslow").Value, math.floor(slider.BarScrollValue * 100))
local textBlock = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center)
local slider = easySettings.Slider(list.Content, 0, 2, function (value)
RealSonar.Config.ImpactVisuals = math.floor(value * 100)/100
textBlock.Text = string.format("%s %s%%", TextManager.Get("impactvisuals").Value, math.floor(value * 100))
easySettings.SaveTable(configPath, RealSonar.Config)
end, RealSonar.Config.ImpactVisuals)
textBlock.Text = string.format("%s %s%%", TextManager.Get("impactvisuals").Value, math.floor(slider.BarScrollValue * 100))
local title
if RealSonar.Config.VFXPreset == 2 then
title = "defaultfx"
elseif RealSonar.Config.VFXPreset == 1 then
title = "lowfx"
elseif RealSonar.Config.VFXPreset >= 0 then
title = "nofx"
end
local textBlock = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center)
local slider = easySettings.Slider(list.Content, 0, 2, function (value)
RealSonar.Config.VFXPreset = math.floor(value + 0.5)
if RealSonar.Config.VFXPreset == 2 then
title = "defaultfx"
elseif RealSonar.Config.VFXPreset == 1 then
title = "lowfx"
elseif RealSonar.Config.VFXPreset >= 0 then
title = "nofx"
end
textBlock.Text = string.format("%s", TextManager.Get(title).Value)
easySettings.SaveTable(configPath, RealSonar.Config)
end, RealSonar.Config.VFXPreset)
textBlock.Text = string.format("%s", TextManager.Get(title).Value)
end
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), TextManager.Get("ignoredplayers").Value, nil, nil, GUI.Alignment.Center, true)
local ignoredPlayers = MultiLineTextBox(list.Content.RectTransform, "", 0.1)
ignoredPlayers.Text = table.concat(RealSonar.Config.IgnoredPlayers, ", ")
ignoredPlayers.OnTextChangedDelegate = function (textBox)
RealSonar.Config.IgnoredPlayers = CommaStringToTable(textBox.Text)
easySettings.SaveTable(configPath, RealSonar.Config)
end
GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), TextManager.Get("ignoredcharacters").Value, nil, nil, GUI.Alignment.Center, true)
local ignoredCharacters = MultiLineTextBox(list.Content.RectTransform, "", 0.1)
ignoredCharacters.Text = table.concat(RealSonar.Config.IgnoredCharacters, ", ")
ignoredCharacters.OnTextChangedDelegate = function (textBox)
RealSonar.Config.IgnoredCharacters = CommaStringToTable(textBox.Text)
easySettings.SaveTable(configPath, RealSonar.Config)
end
local textBlock = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), TextManager.Get("wearableprotections").Value, nil, nil, GUI.Alignment.Center, true)
local wearableProtections = MultiLineTextBox(list.Content.RectTransform, "", 0.2)
local startingWearables = 0
local newWearables = 0
for _ in RealSonar.Config.WearableProtections do
startingWearables = startingWearables + 1
end
wearableProtections.Text = formatJsonTextBlock(json.serialize(RealSonar.Config.WearableProtections))
wearableProtections.OnTextChangedDelegate = function (textBox)
if pcall(json.parse, textBox.Text) then
RealSonar.Config.WearableProtections = json.parse(textBox.Text)
easySettings.SaveTable(configPath, RealSonar.Config)
textBlock.Text = TextManager.Get("wearableprotections").Value
for _ in RealSonar.Config.SonarTerminals do
newWearables = newWearables + 1
end
if newWearables > startingWearables then
easySettings.needWearableProtectionsUpdate = true
end
else
textBlock.Text = string.format("%s (%s)", TextManager.Get("wearableprotections").Value, TextManager.Get("invalidinput").Value)
end
end
local btn = GUI.Button(GUI.RectTransform(Vector2(1, 0.2), list.Content.RectTransform), TextManager.Get("resetdefault").Value, GUI.Alignment.Center, "GUIButtonSmall")
btn.OnClicked = function ()
RealSonar.Config.WearableProtections = defaultConfig.WearableProtections
File.Write(configPath, json.serialize(RealSonar.Config))
wearableProtections.Text = formatJsonTextBlock(json.serialize(RealSonar.Config.WearableProtections))
end
local textBlock = GUI.TextBlock(GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform), "", nil, nil, GUI.Alignment.Center, true)
local sonarTerminals = MultiLineTextBox(list.Content.RectTransform, "", 0.2)
local warningText = ""
local startingTerminals = 0
local newTerminals = 0
for _ in RealSonar.Config.SonarTerminals do
startingTerminals = startingTerminals + 1
end
if not RealSonar.Config.CustomSonar then
warningText = TextManager.Get("requirescustomsonar").Value
end
textBlock.Text = string.format("%s %s", TextManager.Get("sonarterminals").Value, warningText)
sonarTerminals.Text = formatJsonTextBlock(json.serialize(RealSonar.Config.SonarTerminals))
sonarTerminals.OnTextChangedDelegate = function (textBox)
if pcall(json.parse, textBox.Text) then
RealSonar.Config.SonarTerminals = json.parse(textBox.Text)
easySettings.SaveTable(configPath, RealSonar.Config)
textBlock.Text = string.format("%s %s",TextManager.Get("sonarterminals").Value, warningText)
easySettings.needRangeUpdate = true
for _ in RealSonar.Config.SonarTerminals do
newTerminals = newTerminals + 1
end
if newTerminals > startingTerminals then
easySettings.needSonarItemsUpdate = true
end
else
textBlock.Text = string.format("%s %s (%s)", TextManager.Get("sonarterminals").Value, warningText, TextManager.Get("invalidinput").Value)
end
end
local btn = GUI.Button(GUI.RectTransform(Vector2(1, 0.2), list.Content.RectTransform), TextManager.Get("resetdefault").Value, GUI.Alignment.Center, "GUIButtonSmall")
btn.OnClicked = function ()
RealSonar.Config.SonarTerminals = defaultConfig.SonarTerminals
File.Write(configPath, json.serialize(RealSonar.Config))
sonarTerminals.Text = formatJsonTextBlock(json.serialize(RealSonar.Config.SonarTerminals))
easySettings.needRangeUpdate = true
end
end)