243 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			243 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
--easysettings by Evil Factory
 | 
						|
local easySettings = dofile(NT.Path .. "/Lua/Scripts/Client/easysettings.lua")
 | 
						|
local MultiLineTextBox = dofile(NT.Path .. "/Lua/Scripts/Client/MultiLineTextBox.lua")
 | 
						|
local GUIComponent = LuaUserData.CreateStatic("Barotrauma.GUIComponent")
 | 
						|
local configUI
 | 
						|
 | 
						|
local function CommaStringToTable(str)
 | 
						|
	local tbl = {}
 | 
						|
 | 
						|
	for word in string.gmatch(str, "([^,]+)") do
 | 
						|
		table.insert(tbl, word)
 | 
						|
	end
 | 
						|
 | 
						|
	return tbl
 | 
						|
end
 | 
						|
 | 
						|
--calculate difficulty
 | 
						|
local function DetermineDifficulty()
 | 
						|
	local difficulty = 0
 | 
						|
	local defaultDifficulty = 0
 | 
						|
	local res = ""
 | 
						|
 | 
						|
	for key, entry in pairs(NTConfig.Entries) do
 | 
						|
		if entry.difficultyCharacteristics then
 | 
						|
			local entryValue = entry.value
 | 
						|
			local entryValueDefault = entry.default
 | 
						|
			local diffMultiplier = 1
 | 
						|
			if entry.type == "bool" then
 | 
						|
				entryValue = HF.BoolToNum(entry.value)
 | 
						|
				entryValueDefault = HF.BoolToNum(entry.default)
 | 
						|
			end
 | 
						|
			if entry.difficultyCharacteristics.multiplier then
 | 
						|
				diffMultiplier = entry.difficultyCharacteristics.multiplier
 | 
						|
			end
 | 
						|
 | 
						|
			defaultDifficulty = defaultDifficulty + entryValueDefault * diffMultiplier
 | 
						|
			difficulty = difficulty + math.min(entryValue * diffMultiplier, entry.difficultyCharacteristics.max or 1)
 | 
						|
		end
 | 
						|
	end
 | 
						|
 | 
						|
	-- normalize to 10
 | 
						|
	difficulty = difficulty / defaultDifficulty * 10
 | 
						|
 | 
						|
	if difficulty > 23 then
 | 
						|
		res = "Impossible"
 | 
						|
	elseif difficulty > 16 then
 | 
						|
		res = "Very hard"
 | 
						|
	elseif difficulty > 11 then
 | 
						|
		res = "Hard"
 | 
						|
	elseif difficulty > 8 then
 | 
						|
		res = "Normal"
 | 
						|
	elseif difficulty > 6 then
 | 
						|
		res = "Easy"
 | 
						|
	elseif difficulty > 4 then
 | 
						|
		res = "Very easy"
 | 
						|
	elseif difficulty > 2 then
 | 
						|
		res = "Barely different"
 | 
						|
	else
 | 
						|
		res = "Vanilla but sutures"
 | 
						|
	end
 | 
						|
 | 
						|
	res = res .. " (" .. HF.Round(difficulty, 1) .. ")"
 | 
						|
	return res
 | 
						|
end
 | 
						|
 | 
						|
--bulk of the GUI code
 | 
						|
local function ConstructUI(parent)
 | 
						|
	local list = easySettings.BasicList(parent)
 | 
						|
 | 
						|
	--info text
 | 
						|
	local userBlock = GUI.TextBlock(
 | 
						|
		GUI.RectTransform(Vector2(1, 0.2), list.Content.RectTransform),
 | 
						|
		"Server config can be changed by owner or a client with manage settings permission. If the server doesn't allow writing into the config folder, then it must be edited manually.",
 | 
						|
		Color(200, 255, 255),
 | 
						|
		nil,
 | 
						|
		GUI.Alignment.Center,
 | 
						|
		true,
 | 
						|
		nil,
 | 
						|
		Color(0, 0, 0)
 | 
						|
	)
 | 
						|
	local difficultyBlock = GUI.TextBlock(
 | 
						|
		GUI.RectTransform(Vector2(1, 0.1), list.Content.RectTransform),
 | 
						|
		"",
 | 
						|
		Color(200, 255, 255),
 | 
						|
		nil,
 | 
						|
		GUI.Alignment.Center,
 | 
						|
		true,
 | 
						|
		nil,
 | 
						|
		Color(0, 0, 0)
 | 
						|
	)
 | 
						|
 | 
						|
	--set difficulty text (why does this even exist in the first place)
 | 
						|
	local function OnChanged()
 | 
						|
		difficultyRate = "Calculated difficulty rating: " .. DetermineDifficulty()
 | 
						|
		difficultyBlock.Text = difficultyRate
 | 
						|
	end
 | 
						|
	OnChanged()
 | 
						|
 | 
						|
	--empty space
 | 
						|
	--GUI.TextBlock(GUI.RectTransform(Vector2(0.2, 0.1), list.Content.RectTransform), "", Color(255,255,255), nil, GUI.Alignment.Center, true, nil, Color(0,0,0))
 | 
						|
 | 
						|
	-- procedurally construct config UI
 | 
						|
	for key, entry in pairs(NTConfig.Entries) do
 | 
						|
		if entry.type == "float" then
 | 
						|
			-- scalar value
 | 
						|
			--grab range
 | 
						|
			local minrange = ""
 | 
						|
			local maxrange = ""
 | 
						|
			local count = 0
 | 
						|
			for _, rangegrab in pairs(entry.range) do
 | 
						|
				if count == 0 then
 | 
						|
					minrange = rangegrab
 | 
						|
				end
 | 
						|
				if count == 1 then
 | 
						|
					maxrange = rangegrab
 | 
						|
				end
 | 
						|
				count = count + 1
 | 
						|
			end
 | 
						|
 | 
						|
			local rect = GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform)
 | 
						|
			local textBlock = GUI.TextBlock(
 | 
						|
				rect,
 | 
						|
				entry.name .. " (" .. minrange .. "-" .. maxrange .. ")",
 | 
						|
				Color(230, 230, 170),
 | 
						|
				nil,
 | 
						|
				GUI.Alignment.Center,
 | 
						|
				true,
 | 
						|
				nil,
 | 
						|
				Color(0, 0, 0)
 | 
						|
			)
 | 
						|
			if entry.description then
 | 
						|
				textBlock.ToolTip = entry.description
 | 
						|
			end
 | 
						|
			local scalar =
 | 
						|
				GUI.NumberInput(GUI.RectTransform(Vector2(1, 0.08), list.Content.RectTransform), NumberType.Float)
 | 
						|
			local key2 = key
 | 
						|
			scalar.valueStep = 0.1
 | 
						|
			scalar.MinValueFloat = 0
 | 
						|
			scalar.MaxValueFloat = 100
 | 
						|
			if entry.range then
 | 
						|
				scalar.MinValueFloat = entry.range[1]
 | 
						|
				scalar.MaxValueFloat = entry.range[2]
 | 
						|
			end
 | 
						|
			scalar.FloatValue = NTConfig.Get(key2, 1)
 | 
						|
			scalar.OnValueChanged = function()
 | 
						|
				NTConfig.Set(key2, scalar.FloatValue)
 | 
						|
				OnChanged()
 | 
						|
			end
 | 
						|
		elseif entry.type == "string" then
 | 
						|
			--user string input
 | 
						|
			local style = ""
 | 
						|
			--get custom style
 | 
						|
			if entry.style ~= nil then
 | 
						|
				style = " (" .. entry.style .. ")"
 | 
						|
			end
 | 
						|
 | 
						|
			local rect = GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform)
 | 
						|
			local textBlock = GUI.TextBlock(
 | 
						|
				rect,
 | 
						|
				entry.name .. style,
 | 
						|
				Color(230, 230, 170),
 | 
						|
				nil,
 | 
						|
				GUI.Alignment.Center,
 | 
						|
				true,
 | 
						|
				nil,
 | 
						|
				Color(0, 0, 0)
 | 
						|
			)
 | 
						|
			if entry.description then
 | 
						|
				textBlock.ToolTip = entry.description
 | 
						|
			end
 | 
						|
 | 
						|
			local stringinput = MultiLineTextBox(list.Content.RectTransform, "", entry.boxsize)
 | 
						|
 | 
						|
			stringinput.Text = table.concat(entry.value, ",")
 | 
						|
 | 
						|
			stringinput.OnTextChangedDelegate = function(textBox)
 | 
						|
				entry.value = CommaStringToTable(textBox.Text)
 | 
						|
			end
 | 
						|
		elseif entry.type == "bool" then
 | 
						|
			-- toggle
 | 
						|
			local rect = GUI.RectTransform(Vector2(1, 0.2), list.Content.RectTransform)
 | 
						|
			local toggle = GUI.TickBox(rect, entry.name)
 | 
						|
			if entry.description then
 | 
						|
				toggle.ToolTip = entry.description
 | 
						|
			end
 | 
						|
			local key2 = key
 | 
						|
			toggle.Selected = NTConfig.Get(key2, false)
 | 
						|
			toggle.OnSelected = function()
 | 
						|
				NTConfig.Set(key2, toggle.State == GUIComponent.ComponentState.Selected)
 | 
						|
				OnChanged()
 | 
						|
			end
 | 
						|
		elseif entry.type == "category" then
 | 
						|
			-- visual separation
 | 
						|
			GUI.TextBlock(
 | 
						|
				GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform),
 | 
						|
				entry.name,
 | 
						|
				Color(255, 255, 255),
 | 
						|
				nil,
 | 
						|
				GUI.Alignment.Center,
 | 
						|
				true,
 | 
						|
				nil,
 | 
						|
				Color(0, 0, 0)
 | 
						|
			)
 | 
						|
		end
 | 
						|
	end
 | 
						|
 | 
						|
	--empty space as last tickbox was getting cutoff
 | 
						|
	GUI.TextBlock(
 | 
						|
		GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform),
 | 
						|
		"",
 | 
						|
		Color(255, 255, 255),
 | 
						|
		nil,
 | 
						|
		GUI.Alignment.Center,
 | 
						|
		true,
 | 
						|
		nil,
 | 
						|
		Color(0, 0, 0)
 | 
						|
	)
 | 
						|
 | 
						|
	if Game.IsMultiplayer and not Game.Client.HasPermission(ClientPermissions.ManageSettings) then
 | 
						|
		for guicomponent in list.GetAllChildren() do
 | 
						|
			guicomponent.enabled = false
 | 
						|
		end
 | 
						|
	end
 | 
						|
 | 
						|
	return list
 | 
						|
end
 | 
						|
 | 
						|
Networking.Receive("NT.ConfigUpdate", function(msg)
 | 
						|
	NTConfig.ReceiveConfig(msg)
 | 
						|
	local parent = configUI.Parent.Parent
 | 
						|
	configUI.RectTransform.Parent = nil
 | 
						|
	configUI = nil
 | 
						|
	configUI = ConstructUI(parent)
 | 
						|
end)
 | 
						|
 | 
						|
easySettings.AddMenu("Neurotrauma", function(parent)
 | 
						|
	if Game.IsMultiplayer then
 | 
						|
		local msg = Networking.Start("NT.ConfigRequest")
 | 
						|
		Networking.Send(msg)
 | 
						|
	end
 | 
						|
	configUI = ConstructUI(parent)
 | 
						|
end)
 |