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

71 lines
2.8 KiB
Lua

-- Makes bots try to get an anechoic suit before repairing leaks when in dangerous range of an active sonar.
Hook.Patch(
"Barotrauma.AIObjectiveGetItem",
".ctor",
{
"Barotrauma.Character",
"Barotrauma.Identifier",
"Barotrauma.AIObjectiveManager",
"System.Boolean",
"System.Boolean",
"System.Single",
"System.Boolean",
},
function(instance, ptable)
local objective = ptable["objectiveManager"].GetActiveObjective()
if tostring(objective) == "Barotrauma.AIObjectiveFindDivingGear" and RealSonar.Config.BotDamage and RealSonar.Config.SonarDamage > 0.25 and RealSonar.characterInSonarRange(ptable["character"]) and RealSonar.hullBreached(ptable["character"]) then
ptable["identifierOrTag"] = "anechoic"
end
end, Hook.HookMethodType.Before)
-- Replace messages with custom ones relating to the situation.
Hook.Patch(
"Barotrauma.Character",
"Speak",
function(instance, ptable)
if tostring(ptable["identifier"]) == "getdivinggear" and RealSonar.Config.BotDamage and RealSonar.Config.SonarDamage > 0.25 and RealSonar.characterInSonarRange(instance) and RealSonar.hullBreached(instance) then
ptable["message"] = TextManager.Get("dialoggetanechoicsuit").Value
elseif tostring(ptable["identifier"]) == "dialogcannotreachleak" and RealSonar.Config.BotDamage and RealSonar.Config.SonarDamage > 0.25 and RealSonar.characterInSonarRange(instance) and RealSonar.hullBreached(instance) then
ptable["delay"] = Single(2)
ptable["message"] = TextManager.Get("dialogcantfindanechoicsuit").Value
end
end, Hook.HookMethodType.Before)
-- Prevent bots from treating vibrationdamage/muscledamage with more than one manna extract at a time.
Hook.Patch(
"Barotrauma.CharacterHealth",
"GetPredictedStrength",
{
"Barotrauma.Affliction",
"System.Single",
"Barotrauma.Limb"
},
function(instance, ptable)
if ptable["affliction"].Prefab.Identifier == "vibrationdamage" or ptable["affliction"].Prefab.Identifier == "muscledamage" then
local vibrationdamage = false
local muscledamage = false
local mannainfluence = false
local afflictions = instance.GetAllAfflictions()
for affliction in afflictions do
if affliction.Prefab.Identifier == "vibrationdamage" then
vibrationdamage = true
elseif affliction.Prefab.Identifier == "mannainfluence" then
mannainfluence = true
elseif affliction.Prefab.Identifier == "muscledamage" then
muscledamage = true
end
end
if mannainfluence and vibrationdamage or mannainfluence and muscledamage then
ptable.PreventExecution = true
return 0
end
end
end, Hook.HookMethodType.Before)