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

167 lines
4.9 KiB
Lua

local invertedHighPriorityItems = {}
local invertedHighPriorityCharacters = {}
local highPriorityComponents = {}
local signalComponents = {}
if SERVER then
Game.mapEntityUpdateInterval = PerformanceFix.Config.serverMapEntityUpdateInterval
Game.characterUpdateInterval = PerformanceFix.Config.serverCharacterUpdateInterval
highPriorityComponents = PerformanceFix.Config.serverComponentPriority
for key, value in pairs(PerformanceFix.Config.serverItemHighPriority) do
invertedHighPriorityItems[value] = key
end
for key, value in pairs(PerformanceFix.Config.highPriorityCharacters) do
invertedHighPriorityCharacters[value] = key
end
Hook.Add("item.equip", "highPriorityHands", function(item, char)
Game.RemovePriorityItem(item)
Game.AddPriorityItem(item)
end)
else
local result, error = pcall(function()
Game.mapEntityUpdateInterval = PerformanceFix.Config.clientMapEntityUpdateInterval
Game.characterUpdateInterval = PerformanceFix.Config.clientCharacterUpdateInterval
if Game.IsMultiplayer then
Game.poweredUpdateInterval = PerformanceFix.Config.poweredUpdateInterval or 1
end
Timer.AccumulatorMax = (PerformanceFix.Config.accumulatorMax or 50) / 1000
end)
if error then
printerror("The below error most likely was thrown because of an outdated Lua client, please consider updating.")
printerror(error)
end
highPriorityComponents = PerformanceFix.Config.clientComponentPriority
for key, value in pairs(PerformanceFix.Config.clientItemHighPriority) do
invertedHighPriorityItems[value] = key
end
for key, value in pairs(PerformanceFix.Config.highPriorityCharacters) do
invertedHighPriorityCharacters[value] = key
end
Hook.Add("item.equip", "highPriorityHands", function(item, char)
Game.RemovePriorityItem(item)
Game.AddPriorityItem(item)
end)
end
Hook.Add("think", "signalUpdatePerformanceFix", function()
for key, value in pairs(signalComponents) do
value.SendSignal(tostring(Game.mapEntityUpdateInterval), "signal_out")
end
end)
local function IsPriority(item)
if item.HasTag("highpriority") or invertedHighPriorityItems[item.Prefab.Identifier.Value] ~= nil then
return true
end
for _, comp in pairs(highPriorityComponents) do
if item.GetComponentString(comp) ~= nil then
return true
end
end
return false
end
local function SetPriority()
if CLIENT then
for k, v in pairs(Item.ItemList) do
if PerformanceFix.Config.allowSingleplayerPermanentConfigs and Game.IsSingleplayer then
break
end
if string.find(v.Tags, "performancefix") then
table.insert(signalComponents, v)
end
local light = v.GetComponentString("LightComponent")
if light ~= nil then
if PerformanceFix.Config.disableShadowCastingLights then
light.CastShadows = false
end
if PerformanceFix.Config.disableDrawBehindSubsLights then
light.DrawBehindSubs = false
end
end
if PerformanceFix.Config.hideInGameWires then
local wire = v.GetComponentString("Wire")
if wire and #wire.Connections ~= 0 then
wire.Item.HiddenInGame = true
end
end
if PerformanceFix.Config.hideInGameComponents then
if v.HasTag("logic") then
v.HiddenInGame = true
end
end
end
end
Game.ClearPriorityItem()
Game.ClearPriorityCharacter()
for key, value in pairs(Item.ItemList) do
if IsPriority(value) then
Game.AddPriorityItem(value)
end
end
for key, value in pairs(Character.CharacterList) do
if invertedHighPriorityCharacters[value.SpeciesName.Value] then
Game.AddPriorityCharacter(value)
end
if value.Inventory ~= nil then
local rightItem = value.Inventory.GetItemInLimbSlot(InvSlotType.RightHand)
local leftItem = value.Inventory.GetItemInLimbSlot(InvSlotType.LeftHand)
if rightItem ~= nil then
Game.AddPriorityItem(rightItem)
end
if leftItem ~= nil then
Game.AddPriorityItem(leftItem)
end
end
end
end
Hook.Add("roundStart", "initRoundStart", function()
Timer.Wait(function()
SetPriority()
end, 1000)
end)
Hook.Add("characterCreated", "addToPriority", function(character)
if invertedHighPriorityCharacters[character.SpeciesName.Value] then
Game.AddPriorityCharacter(character)
end
end)
Hook.Add("item.created", "addToPriority", function (item)
if IsPriority(item) then
Game.AddPriorityItem(item)
end
end)
SetPriority()