Track LocalMods as part of monolith
This commit is contained in:
+136
@@ -0,0 +1,136 @@
|
||||
-- Hooks a XML Lua event "surgerytable.update" to use for getting
|
||||
-- Neurotrauma and vanilla character data with the surgical table or hospital bed
|
||||
-- lifted and translated from betterhealthui
|
||||
local NormalHeartrate = 60
|
||||
local MaxTachycardiaHeartrate = 180
|
||||
local MaxFibrillationHeartrate = 300
|
||||
local function GetHeartrate(character)
|
||||
if character == nil or character.CharacterHealth == nil or character.IsDead then return 0 end
|
||||
|
||||
local rate = NormalHeartrate
|
||||
|
||||
local cardiacarrest = character.CharacterHealth.GetAffliction("cardiacarrest")
|
||||
|
||||
-- return 0 rate if in cardiac arrest
|
||||
if cardiacarrest ~= nil and cardiacarrest.Strength >= 0.5 then return 0 end
|
||||
|
||||
local tachycardia = character.CharacterHealth.GetAffliction("tachycardia")
|
||||
local fibrillation = character.CharacterHealth.GetAffliction("fibrillation")
|
||||
|
||||
if fibrillation ~= nil then
|
||||
rate = HF.Lerp(
|
||||
MaxTachycardiaHeartrate,
|
||||
MaxFibrillationHeartrate,
|
||||
fibrillation.Strength / 100 * (1 + math.random() * 0.5)
|
||||
)
|
||||
elseif tachycardia ~= nil then
|
||||
rate = HF.Lerp(NormalHeartrate, MaxTachycardiaHeartrate, tachycardia.Strength / 100)
|
||||
end
|
||||
|
||||
return rate
|
||||
end
|
||||
|
||||
local function GetPH(character)
|
||||
if character == nil or character.CharacterHealth == nil then return 0 end
|
||||
|
||||
local acidosis = HF.GetAfflictionStrength(character, "acidosis", 0)
|
||||
local alkalosis = HF.GetAfflictionStrength(character, "alkalosis", 0)
|
||||
|
||||
return alkalosis - acidosis
|
||||
end
|
||||
|
||||
Hook.Add("surgerytable.update", "surgerytable.update", function(effect, deltaTime, item, targets, worldPosition)
|
||||
-- fetch controller component
|
||||
local controllerComponent = item.GetComponentString("Controller")
|
||||
if controllerComponent == nil then
|
||||
item.SendSignal("0", "state_out")
|
||||
return
|
||||
end
|
||||
|
||||
-- check if targets present
|
||||
-- laying on the table
|
||||
local target = controllerComponent.User
|
||||
-- noone one the table? check the targets array for the one with the least vitality
|
||||
if target == nil or not target.IsHuman then
|
||||
local minVitality = 999
|
||||
for index, value in ipairs(targets) do
|
||||
if value.Name ~= nil and value.IsHuman and (value.Vitality < minVitality) then
|
||||
minVitality = value.Vitality
|
||||
target = value
|
||||
end
|
||||
end
|
||||
end
|
||||
-- no target found
|
||||
if target == nil or not target.IsHuman then
|
||||
item.SendSignal("0", "state_out")
|
||||
return
|
||||
end
|
||||
|
||||
-- send signals
|
||||
item.SendSignal("1", "state_out")
|
||||
if target.IsDead then
|
||||
item.SendSignal("0", "alive_out")
|
||||
else
|
||||
item.SendSignal("1", "alive_out")
|
||||
end
|
||||
if target.IsDead or HF.HasAffliction(target, "sym_unconsciousness", 0.1) then
|
||||
item.SendSignal("0", "conscious_out")
|
||||
else
|
||||
item.SendSignal("1", "conscious_out")
|
||||
end
|
||||
item.SendSignal(target.Name, "name_out")
|
||||
item.SendSignal(tostring(HF.Round(target.Vitality)), "vitality_out")
|
||||
if target.IsDead then
|
||||
item.SendSignal("0", "bloodpressure_out")
|
||||
else
|
||||
item.SendSignal(tostring(HF.Round(HF.GetAfflictionStrength(target, "bloodpressure", 100))), "bloodpressure_out")
|
||||
end
|
||||
item.SendSignal(tostring(HF.Round(100 - HF.GetAfflictionStrength(target, "hypoxemia", 0))), "bloodoxygen_out")
|
||||
item.SendSignal(tostring(HF.Round(HF.GetAfflictionStrength(target, "cerebralhypoxia", 0))), "neurotrauma_out")
|
||||
item.SendSignal(tostring(HF.Round(HF.GetAfflictionStrength(target, "organdamage", 0))), "organdamage_out")
|
||||
|
||||
local heartrate = HF.Round(GetHeartrate(target))
|
||||
item.SendSignal(tostring(heartrate), "heartrate_out")
|
||||
|
||||
local breathingrate = math.random(15, 18)
|
||||
if HF.HasAffliction(target, "respiratoryarrest") or target.IsDead then
|
||||
breathingrate = 0
|
||||
elseif HF.HasAffliction(target, "hyperventilation") then
|
||||
breathingrate = breathingrate + math.random(6, 8)
|
||||
elseif HF.HasAffliction(target, "hypoventilation") then
|
||||
breathingrate = breathingrate - math.random(6, 8)
|
||||
end
|
||||
item.SendSignal(tostring(breathingrate), "breathingrate_out")
|
||||
|
||||
item.SendSignal(tostring(HF.BoolToNum(HF.HasAffliction(target, "surgeryincision"), 1)), "insurgery_out")
|
||||
|
||||
if target.IsDead and target.causeOfDeath ~= nil then
|
||||
item.SendSignal(HF.CauseOfDeathToString(target.causeOfDeath), "causeofdeath_out")
|
||||
end
|
||||
|
||||
local bloodph = HF.Round(GetPH(target))
|
||||
item.SendSignal(tostring(bloodph), "bloodph_out")
|
||||
end)
|
||||
|
||||
--Hook.Add("surgerytable.forceon", "surgerytable.forceon", function (effect, deltaTime, item, targets, worldPosition)
|
||||
-- -- fetch controller component
|
||||
-- local controllerComponent = item.GetComponentString("Controller")
|
||||
-- if controllerComponent == nil or controllerComponent.IsActive then return end
|
||||
--
|
||||
-- -- check if targets present
|
||||
-- if targets == nil or #targets <= 0 then return end
|
||||
-- local target = nil
|
||||
-- for index, value in ipairs(targets) do
|
||||
-- target=value
|
||||
-- if target ~=nil then break end
|
||||
-- end
|
||||
-- if target == nil then return end
|
||||
--
|
||||
-- -- was experimenting with forcing the patient into laying down here, sort of worked... until 0 vitality.
|
||||
-- -- it's too janky to be released.
|
||||
--
|
||||
-- -- target.Stun = 0
|
||||
-- -- HF.SetAffliction(target,"givein",0)
|
||||
-- -- controllerComponent.Select(target)
|
||||
-- -- target.SelectedConstruction = item
|
||||
--end)
|
||||
Reference in New Issue
Block a user