Files
2025-03-31 13:19:47 +02:00

183 lines
5.5 KiB
Lua

-- Neurotrauma blood types functions
-- Hooks Lua event "characterCreated" to create a randomized blood type for spawned character and sets their immunity to 100
---@diagnostic disable: lowercase-global, undefined-global
NT.BLOODTYPE = { -- blood types and chance in percent
{ "ominus", 7 },
{ "oplus", 37 },
{ "aminus", 6 },
{ "aplus", 36 },
{ "bminus", 2 },
{ "bplus", 8 },
{ "abminus", 1 },
{ "abplus", 3 },
}
NT.setBlood = {}
NT.foundAny = false
-- Insert all blood types in one table for RandomizeBlood()
for index, value in ipairs(NT.BLOODTYPE) do
-- print(index," : ",value[1],", ",value[2],"%")
table.insert(NT.setBlood, index, { value[2], value[1] })
end
-- Applies math.random() blood type.
-- returns the applied bloodtype as an affliction identifier
function NT.RandomizeBlood(character)
rand = math.random(0, 99)
local i = 0
for index, value in ipairs(NT.setBlood) do
i = i + value[1]
if i > rand then
HF.SetAffliction(character, value[2], 100)
return value[2]
end
end
end
Hook.Add("characterCreated", "NT.BloodAndImmunity", function(createdCharacter)
Timer.Wait(function()
if createdCharacter.IsHuman and not createdCharacter.IsDead then
NT.TryRandomizeBlood(createdCharacter)
-- add immunity
local conditional2 = createdCharacter.CharacterHealth.GetAffliction("immunity")
if conditional2 == nil then
HF.SetAffliction(createdCharacter, "immunity", 100)
end
end
end, 1000)
end)
-- applies a new bloodtype only if the character doesnt already have one
function NT.TryRandomizeBlood(character)
NT.GetBloodtype(character)
end
-- returns the bloodtype of the character as an affliction identifier string
-- generates blood type if none present
function NT.GetBloodtype(character)
for index, affliction in ipairs(NT.BLOODTYPE) do
local conditional = character.CharacterHealth.GetAffliction(affliction[1])
if conditional ~= nil and conditional.Strength > 0 then
return affliction[1] -- TODO: give out abplus (AB+) to enemy team for blood infusions
end
end
return NT.RandomizeBlood(character)
end
function NT.HasBloodtype(character)
for index, affliction in ipairs(NT.BLOODTYPE) do
local conditional = character.CharacterHealth.GetAffliction(affliction[1])
if conditional ~= nil and conditional.Strength > 0 then
return true
end
end
return false
end
Hook.Add("OnInsertedIntoBloodAnalyzer", "NT.BloodAnalyzer", function(effect, deltaTime, item, targets, position)
-- Hematology Analyzer (bloodanalyzer) can scan inserted blood bags
local owner = item.GetRootInventoryOwner()
if owner == nil then return end
if not LuaUserData.IsTargetType(owner, "Barotrauma.Character") then return end
if not owner.IsPlayer then return end
local character = owner
local contained = item.OwnInventory.GetItemAt(0)
local BaseColor = "127,255,255"
local NameColor = "127,255,255"
local LowColor = "127,255,255"
local HighColor = "127,255,255"
local VitalColor = "127,255,255"
if NTConfig.Get("NTSCAN_enablecoloredscanner", 1) then
BaseColor = table.concat(NTConfig.Get("NTSCAN_basecolor", 1), ",")
NameColor = table.concat(NTConfig.Get("NTSCAN_namecolor", 1), ",")
LowColor = table.concat(NTConfig.Get("NTSCAN_lowcolor", 1), ",")
HighColor = table.concat(NTConfig.Get("NTSCAN_highcolor", 1), ",")
VitalColor = table.concat(NTConfig.Get("NTSCAN_vitalcolor", 1), ",")
end
-- NT adds bloodbag; NT Blood Work or 'Real Sonar Medical Item Recipes Patch for Neurotrauma' add allblood, lets check for either
if contained ~= nil and (contained.HasTag("bloodbag") or contained.HasTag("allblood")) then
HF.GiveItem(character, "ntsfx_syringe")
Timer.Wait(function()
if item == nil or character == nil or item.OwnInventory.GetItemAt(0) ~= contained then
return
end
local identifier = contained.Prefab.Identifier.Value
local packtype = "o-"
if identifier ~= "antibloodloss2" then
packtype = string.sub(identifier, string.len("bloodpack") + 1)
end
local bloodTypeDisplay = string.gsub(packtype, "abc", "c")
bloodTypeDisplay = string.gsub(bloodTypeDisplay, "plus", "+")
bloodTypeDisplay = string.gsub(bloodTypeDisplay, "minus", "-")
bloodTypeDisplay = string.upper(bloodTypeDisplay)
local readoutString = "‖color:"
.. BaseColor
.. ""
.. "Bloodpack: "
.. "‖color:end‖"
.. "‖color:"
.. NameColor
.. ""
.. bloodTypeDisplay
.. "‖color:end‖"
-- check if acidosis, alkalosis or sepsis
local tags = HF.SplitString(contained.Tags, ",")
local defects = ""
for tag in tags do
if tag == "sepsis" then
defects = defects .. "‖color:" .. VitalColor .. "" .. "\nSepsis detected" .. "‖color:end‖"
end
if HF.StartsWith(tag, "acid") then
local split = HF.SplitString(tag, ":")
if split[2] ~= nil then
defects = defects
.. "‖color:"
.. HighColor
.. ""
.. "\nAcidosis: "
.. tonumber(split[2])
.. "%"
.. "‖color:end‖"
end
elseif HF.StartsWith(tag, "alkal") then
local split = HF.SplitString(tag, ":")
if split[2] ~= nil then
defects = defects
.. "‖color:"
.. HighColor
.. ""
.. "\nAlkalosis: "
.. tonumber(split[2])
.. "%"
.. "‖color:end‖"
end
end
end
if defects ~= "" then
readoutString = readoutString .. defects
else
readoutString = readoutString
.. "‖color:"
.. LowColor
.. ""
.. "\nNo blood defects"
.. "‖color:end‖"
end
HF.DMClient(HF.CharacterToClient(character), readoutString, Color(127, 255, 255, 255))
end, 1500)
end
end)