183 lines
5.5 KiB
Lua
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)
|