Files
barotrauma-localmods/Neurotrauma/Lua/Scripts/Server/ntcompat.lua
2025-03-31 13:19:47 +02:00

312 lines
9.3 KiB
Lua

NTC = {} -- a class containing compatibility functions for other mods to make use of neurotraumas symptom system
-- use this function to register your expansion mod to be displayed by the
-- console lua startup readout of neurotrauma expansions
-- check surgery plus or cybernetics for an example
-- example of code for registering your expansion in init.lua:
-- MyExp = {} -- Example Expansions
-- MyExp.Name="My Expansion"
-- MyExp.Version = "A1.0"
-- MyExp.VersionNum = 01000000 -- split into two digits (01->1.; 00->0.; 00->0h; 00->0) -> 1.0.0h0
-- MyExp.MinNTVersion = "A1.7.1"
-- MyExp.MinNTVersionNum = 01070100 -- 01.07.01.00 -> A1.7.1h0
-- Timer.Wait(function() if NT ~= nil then NTC.RegisterExpansion(MyExp) end end,1)
NTC.RegisteredExpansions = {}
function NTC.RegisterExpansion(expansionMainObject)
table.insert(NTC.RegisteredExpansions, expansionMainObject)
end
-- a table of tables, each character that has some custom data has an entry
NTC.CharacterData = {}
-- use this function to induce symptoms temporarily
-- duration is in humanupdates (~2 seconds), should at least be 2 to prevent symptom flickering
function NTC.SetSymptomTrue(character, symptomidentifer, duration)
if duration == nil then
duration = 2
end
NTC.AddEmptyCharacterData(character)
local data = NTC.GetCharacterData(character)
data[symptomidentifer] = duration
NTC.CharacterData[character.ID] = data
end
-- use this function to suppress symptoms temporarily. this takes precedence over NTC.SetSymptomTrue.
-- duration is in humanupdates (~2 seconds), should at least be 2 to prevent symptom flickering
function NTC.SetSymptomFalse(character, symptomidentifer, duration)
if duration == nil then
duration = 2
end
NTC.AddEmptyCharacterData(character)
local data = NTC.GetCharacterData(character)
data["!" .. symptomidentifer] = duration
NTC.CharacterData[character.ID] = data
end
-- usage example: anywhere in your lua code, cause 4 seconds (2 humanupdates) of pale skin with this:
-- NTC.SetSymptomTrue(targetCharacter,"sym_paleskin",2)
-- a list of possible symptom identifiers:
-- sym_unconsciousness
-- tachycardia
-- hyperventilation
-- hypoventilation
-- dyspnea
-- sym_cough
-- sym_paleskin
-- sym_lightheadedness
-- sym_blurredvision
-- sym_confusion
-- sym_headache
-- sym_legswelling
-- sym_weakness
-- sym_wheezing
-- sym_vomiting
-- sym_nausea
-- sym_hematemesis
-- sym_fever
-- sym_abdomdiscomfort
-- sym_bloating
-- sym_jaundice
-- sym_sweating
-- sym_palpitations
-- sym_craving
-- pain_abdominal
-- pain_chest
-- lockleftarm
-- lockrightarm
-- lockleftleg
-- lockrightleg
-- with the following identifiers you can either cause things or prevent them.
-- i recommend setting the duration when using these to cause things to 1.
-- triggersym_seizure
-- triggersym_coma
-- triggersym_stroke
-- triggersym_heartattack
-- triggersym_cardiacarrest
-- triggersym_respiratoryarrest
-- prints all of the current compatibility data in the chat
-- might be useful for debugging
function NTC.DebugPrintAllData()
local res = "neurotrauma compatibility data:\n"
for key, value in pairs(NTC.CharacterData) do
res = res .. "\n" .. value["character"].Name
for key2, value2 in pairs(value) do
res = res .. "\n " .. tostring(key2) .. " : " .. tostring(value2)
end
end
PrintChat(res)
end
NTC.PreHumanUpdateHooks = {}
-- use this function to add a function to be executed before humanupdate with a character parameter
function NTC.AddPreHumanUpdateHook(func)
NTC.PreHumanUpdateHooks[#NTC.PreHumanUpdateHooks + 1] = func
end
NTC.HumanUpdateHooks = {}
-- use this function to add a function to be executed after humanupdate with a character parameter
function NTC.AddHumanUpdateHook(func)
NTC.HumanUpdateHooks[#NTC.HumanUpdateHooks + 1] = func
end
NTC.OnDamagedHooks = {}
-- use this function to add a function to be executed after ondamaged
-- with a characterhealth, attack result and limb parameter
function NTC.AddOnDamagedHook(func)
NTC.OnDamagedHooks[#NTC.OnDamagedHooks + 1] = func
end
NTC.ModifyingOnDamagedHooks = {}
-- use this function to add a function to be executed before ondamaged
-- with a characterhealth, afflictions and limb parameter, and afflictions return type
function NTC.AddModifyingOnDamagedHook(func)
NTC.ModifyingOnDamagedHooks[#NTC.ModifyingOnDamagedHooks + 1] = func
end
NTC.CharacterSpeedMultipliers = {}
-- use this function to multiply a characters speed for one human update.
-- should always be called from within a prehumanupdate hook
function NTC.MultiplySpeed(character, multiplier)
if NTC.CharacterSpeedMultipliers[character] == nil then
NTC.CharacterSpeedMultipliers[character] = multiplier
else
NTC.CharacterSpeedMultipliers[character] = NTC.CharacterSpeedMultipliers[character] * multiplier
end
end
-- use this function to register an affliction to be detected by the hematology analyzer
function NTC.AddHematologyAffliction(identifier)
Timer.Wait(function()
if not HF.TableContains(NT.HematologyDetectable, identifier) then
table.insert(NT.HematologyDetectable, identifier)
end
end, 1)
end
-- use this function to register an affliction to be healed by sutures
-- identifier: the identifier of the affliction to be healed
-- surgeryskillgain: how much surgery skill is gained by healing this affliction (optional, default: 0)
-- requiredaffliction: what affliction has to be present alongside the healed affliction for it to get healed (optional, default: none)
-- func: a function that gets run if the affliction is present. if provided, doesnt heal the affliction automatically (optional, default: none)
-- func(item, usingCharacter, targetCharacter, limb)
function NTC.AddSuturedAffliction(identifier, surgeryskillgain, requiredaffliction, func)
Timer.Wait(function()
if not HF.TableContains(NT.SutureAfflictions, identifier) then
NT.SutureAfflictions[identifier] = {
xpgain = surgeryskillgain,
case = requiredaffliction,
func = func,
}
end
end, 1)
end
NTC.AfflictionsAffectingVitality = {
bleeding = true,
bleedingnonstop = true,
burn = true,
acidburn = true,
lacerations = true,
gunshotwound = true,
bitewounds = true,
explosiondamage = true,
blunttrauma = true,
internaldamage = true,
organdamage = true,
cerebralhypoxia = true,
gangrene = true,
th_amputation = true,
sh_amputation = true,
suturedw = true,
alcoholaddiction = true,
opiateaddiction = true,
}
function NTC.AddAfflictionAffectingVitality(identifier)
NTC.AfflictionsAffectingVitality[identifier] = true
end
-- these functions are used by neurotrauma to check for symptom overrides
function NTC.GetSymptom(character, symptomidentifer)
local chardata = NTC.GetCharacterData(character)
if chardata == nil then
return false
end
local durationleft = chardata[symptomidentifer]
if durationleft == nil then
return false
end
return true
end
function NTC.GetSymptomFalse(character, symptomidentifer)
local chardata = NTC.GetCharacterData(character)
if chardata == nil then
return false
end
local durationleft = chardata["!" .. symptomidentifer]
if durationleft == nil then
return false
end
return true
end
-- sets multiplier data for one humanupdate, should be called from within a humanupdate hook
function NTC.SetMultiplier(character, multiplieridentifier, multiplier)
NTC.AddEmptyCharacterData(character)
local data = NTC.GetCharacterData(character)
data["mult_" .. multiplieridentifier] = NTC.GetMultiplier(character, multiplieridentifier) * multiplier
NTC.CharacterData[character.ID] = data
end
function NTC.GetMultiplier(character, multiplieridentifier)
local data = NTC.GetCharacterData(character)
if data == nil or data["mult_" .. multiplieridentifier] == nil then
return 1
end
return data["mult_" .. multiplieridentifier]
end
-- sets tag data for one humanupdate, should be called from within a humanupdate hook
function NTC.SetTag(character, tagidentifier)
NTC.AddEmptyCharacterData(character)
local data = NTC.GetCharacterData(character)
data["tag_" .. tagidentifier] = 1
end
function NTC.HasTag(character, tagidentifier)
local data = NTC.GetCharacterData(character)
if data == nil or data["tag_" .. tagidentifier] == nil then
return false
end
return true
end
-- don't concern yourself with these
function NTC.AddEmptyCharacterData(character)
if NTC.GetCharacterData(character) ~= nil then
return
end
local newdat = {}
newdat["character"] = character
NTC.CharacterData[character.ID] = newdat
end
function NTC.CheckChardataEmpty(character)
local chardat = NTC.GetCharacterData(character)
if chardat == nil or HF.TableSize(chardat) > 1 then
return
end
-- remove entry from data
NTC.CharacterData[character.ID] = nil
end
function NTC.GetCharacterData(character)
return NTC.CharacterData[character.ID]
end
function NTC.TickCharacter(character)
local chardata = NTC.GetCharacterData(character)
if chardata == nil then
return
end
for key, value in pairs(chardata) do
if key ~= "character" then
if HF.StartsWith(key, "mult_") then -- multipliers
chardata[key] = nil
NTC.CheckChardataEmpty(character)
else -- symptoms
local durationleft = value
if durationleft ~= nil and durationleft > 1 then
chardata[key] = durationleft - 1
else
chardata[key] = nil
NTC.CheckChardataEmpty(character)
end
end
end
end
NTC.CharacterData[character.ID] = chardata
end
function NTC.GetSpeedMultiplier(character)
if NTC.CharacterSpeedMultipliers[character] ~= nil then
return NTC.CharacterSpeedMultipliers[character]
end
return 1
end