143 lines
4.9 KiB
Lua
143 lines
4.9 KiB
Lua
-- 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)
|