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

672 lines
19 KiB
Lua

-- Hooks Lua event "character.applyDamage" to cause NT afflictions after attacks depending on the damaging affliction defined here in NT.OnDamagedMethods
local function getCalculatedConcussionReduction(armor, strength)
if armor == nil then
return 0
end
local reduction = 0
if armor.HasTag("deepdiving") or armor.HasTag("deepdivinglarge") then
local modifiers = armor.GetComponentString("Wearable").DamageModifiers
for modifier in modifiers do
if string.find(modifier.AfflictionIdentifiers, "concussion") ~= nil then
reduction = strength - strength * modifier.DamageMultiplier
end
end
elseif armor.HasTag("smallitem") then
local modifiers = armor.GetComponentString("Wearable").DamageModifiers
for modifier in modifiers do
if string.find(modifier.AfflictionIdentifiers, "concussion") ~= nil then
reduction = strength - strength * modifier.DamageMultiplier
end
end
end
return reduction
end
Hook.Add("character.applyDamage", "NT.ondamaged", function(characterHealth, attackResult, hitLimb)
--print(hitLimb.HealthIndex or hitLimb ~= nil)
if -- invalid attack data, don't do anything
characterHealth == nil
or characterHealth.Character == nil
or characterHealth.Character.IsDead
or not characterHealth.Character.IsHuman
or attackResult == nil
or attackResult.Afflictions == nil
or #attackResult.Afflictions <= 0
or hitLimb == nil
or hitLimb.IsSevered
then
return
end
local afflictions = attackResult.Afflictions
-- ntc
-- modifying ondamaged hooks
for key, val in pairs(NTC.ModifyingOnDamagedHooks) do
afflictions = val(characterHealth, afflictions, hitLimb)
end
local identifier = ""
local methodtorun = nil
for value in afflictions do
-- execute fitting method, if available
identifier = value.Prefab.Identifier.Value
methodtorun = NT.OnDamagedMethods[identifier]
if methodtorun ~= nil then
-- make resistance from afflictions apply
local resistance = HF.GetResistance(characterHealth.Character, identifier, hitLimb.type)
local strength = value.Strength * (1 - resistance)
methodtorun(characterHealth.Character, strength, hitLimb.type)
end
end
-- ntc
-- ondamaged hooks
for key, val in pairs(NTC.OnDamagedHooks) do
val(characterHealth, attackResult, hitLimb)
end
end)
NT.OnDamagedMethods = {}
local function HasLungs(c)
return not HF.HasAffliction(c, "lungremoved")
end
local function HasHeart(c)
return not HF.HasAffliction(c, "heartremoved")
end
-- cause foreign bodies, rib fractures, pneumothorax, tamponade, internal bleeding, fractures, neurotrauma
NT.OnDamagedMethods.gunshotwound = function(character, strength, limbtype)
limbtype = HF.NormalizeLimbType(limbtype)
local causeFullForeignBody = false
-- torso specific
if strength >= 1 and limbtype == LimbType.Torso then
local hitOrgan = false
if
HF.Chance(
HF.Clamp(strength * 0.02, 0, 0.3)
* NTC.GetMultiplier(character, "anyfracturechance")
* NTConfig.Get("NT_fractureChance", 1)
)
then
NT.BreakLimb(character, limbtype)
causeFullForeignBody = true
end
if
HasLungs(character)
and HF.Chance(
0.3 * NTC.GetMultiplier(character, "pneumothoraxchance") * NTConfig.Get("NT_pneumothoraxChance", 1)
)
then
HF.AddAffliction(character, "pneumothorax", 5)
HF.AddAffliction(character, "lungdamage", strength)
HF.AddAffliction(character, "organdamage", strength / 4)
hitOrgan = true
end
if
HasHeart(character)
and hitOrgan == false
and strength >= 5
and HF.Chance(
strength / 50 * NTC.GetMultiplier(character, "tamponadechance") * NTConfig.Get("NT_tamponadeChance", 1)
)
then
HF.AddAffliction(character, "tamponade", 5)
HF.AddAffliction(character, "heartdamage", strength)
HF.AddAffliction(character, "organdamage", strength / 4)
hitOrgan = true
end
if strength >= 5 then
HF.AddAffliction(character, "internalbleeding", strength * HF.RandomRange(0.3, 0.6))
end
-- liver and kidney damage
if hitOrgan == false and strength >= 2 and HF.Chance(0.5) then
HF.AddAfflictionLimb(character, "organdamage", limbtype, strength / 4)
if HF.Chance(0.5) then
HF.AddAffliction(character, "liverdamage", strength)
else
HF.AddAffliction(character, "kidneydamage", strength)
end
end
end
-- head
if strength >= 1 and limbtype == LimbType.Head then
if
HF.Chance(
strength / 90 * NTC.GetMultiplier(character, "anyfracturechance") * NTConfig.Get("NT_fractureChance", 1)
)
then
NT.BreakLimb(character, limbtype)
causeFullForeignBody = true
end
if strength >= 5 and HF.Chance(0.7) then
HF.AddAffliction(character, "cerebralhypoxia", strength * HF.RandomRange(0.1, 0.4))
end
end
-- extremities
if strength >= 1 and HF.LimbIsExtremity(limbtype) then
if
NT.LimbIsBroken(character, limbtype)
and not NT.LimbIsAmputated(character, limbtype)
and HF.Chance(strength / 60 * NTC.GetMultiplier(character, "traumamputatechance"))
then
NT.TraumamputateLimb(character, limbtype)
end
if
HF.Chance(
strength / 60 * NTC.GetMultiplier(character, "anyfracturechance") * NTConfig.Get("NT_fractureChance", 1)
)
then
NT.BreakLimb(character, limbtype)
causeFullForeignBody = true
end
end
-- foreign bodies
if causeFullForeignBody then
HF.AddAfflictionLimb(
character,
"foreignbody",
limbtype,
HF.Clamp(strength, 0, 30) * NTC.GetMultiplier(character, "foreignbodymultiplier")
)
else
if HF.Chance(0.75) then
HF.AddAfflictionLimb(
character,
"foreignbody",
limbtype,
HF.Clamp(strength / 4, 0, 20) * NTC.GetMultiplier(character, "foreignbodymultiplier")
)
end
end
end
-- cause foreign bodies, rib fractures, pneumothorax, internal bleeding, concussion, fractures
NT.OnDamagedMethods.explosiondamage = function(character, strength, limbtype)
limbtype = HF.NormalizeLimbType(limbtype)
if HF.Chance(0.75) then
HF.AddAfflictionLimb(
character,
"foreignbody",
limbtype,
strength / 2 * NTC.GetMultiplier(character, "foreignbodymultiplier")
)
end
-- torso specific
if strength >= 1 and limbtype == LimbType.Torso then
if
strength >= 10
and HF.Chance(
strength / 50 * NTC.GetMultiplier(character, "anyfracturechance") * NTConfig.Get("NT_fractureChance", 1)
)
then
NT.BreakLimb(character, limbtype)
end
if
HasLungs(character)
and strength >= 5
and HF.Chance(
strength
/ 50
* NTC.GetMultiplier(character, "pneumothoraxchance")
* NTConfig.Get("NT_pneumothoraxChance", 1)
)
then
HF.AddAffliction(character, "pneumothorax", 5)
end
if strength >= 5 then
HF.AddAffliction(character, "internalbleeding", strength * HF.RandomRange(0.2, 0.5))
end
end
-- head
if strength >= 1 and limbtype == LimbType.Head then
local armor1 = character.Inventory.GetItemInLimbSlot(InvSlotType.OuterClothes)
local armor2 = character.Inventory.GetItemInLimbSlot(InvSlotType.Head)
local reduceddmg = math.max(
10
- getCalculatedConcussionReduction(armor1, 10, limbtype)
- getCalculatedConcussionReduction(armor2, 10, limbtype),
0
)
if strength >= 15 and HF.Chance(math.min(strength / 60, 0.7)) then
HF.AddAfflictionResisted(character, "concussion", reduceddmg)
end
if
strength >= 15
and HF.Chance(
math.min(strength / 60, 0.7)
* NTC.GetMultiplier(character, "anyfracturechance")
* NTConfig.Get("NT_fractureChance", 1)
)
then
NT.BreakLimb(character, limbtype)
end
if
strength >= 15
and HF.Chance(
math.min(strength / 60, 0.7)
* NTC.GetMultiplier(character, "anyfracturechance")
* NTConfig.Get("NT_fractureChance", 1)
)
then
HF.AddAffliction(character, "n_fracture", 5)
end
if strength >= 25 and HF.Chance(0.25) then
-- drop previously held item
local previtem = HF.GetHeadWear(character)
if previtem ~= nil then
previtem.Drop(character, true)
end
HF.AddAfflictionLimb(character, "gate_ta_h", limbtype, 5)
end
end
-- extremities
if strength >= 1 and HF.LimbIsExtremity(limbtype) then
if
NT.LimbIsBroken(character, limbtype)
and not NT.LimbIsAmputated(character, limbtype)
and HF.Chance(strength / 60 * NTC.GetMultiplier(character, "traumamputatechance"))
then
NT.TraumamputateLimb(character, limbtype)
end
if
HF.Chance(
strength / 60 * NTC.GetMultiplier(character, "anyfracturechance") * NTConfig.Get("NT_fractureChance", 1)
)
then
NT.BreakLimb(character, limbtype)
end
if
HF.Chance(
0.35 * NTC.GetMultiplier(character, "dislocationchance") * NTConfig.Get("NT_dislocationChance", 1)
) and not NT.LimbIsAmputated(character, limbtype)
then
NT.DislocateLimb(character, limbtype)
end
end
end
-- cause rib fractures, pneumothorax, internal bleeding, concussion, fractures
NT.OnDamagedMethods.bitewounds = function(character, strength, limbtype)
limbtype = HF.NormalizeLimbType(limbtype)
-- torso specific
if strength >= 1 and limbtype == LimbType.Torso then
if
strength >= 10
and HF.Chance(
(strength - 10)
/ 50
* NTC.GetMultiplier(character, "anyfracturechance")
* NTConfig.Get("NT_fractureChance", 1)
)
then
NT.BreakLimb(character, limbtype)
end
if
HasLungs(character)
and strength >= 5
and HF.Chance(
(strength - 5)
/ 50
* NTC.GetMultiplier(character, "pneumothoraxchance")
* NTConfig.Get("NT_pneumothoraxChance", 1)
)
then
HF.AddAffliction(character, "pneumothorax", 5)
end
if strength >= 5 then
HF.AddAffliction(character, "internalbleeding", strength * HF.RandomRange(0.2, 0.5))
end
end
-- head
if strength >= 1 and limbtype == LimbType.Head then
local armor1 = character.Inventory.GetItemInLimbSlot(InvSlotType.OuterClothes)
local armor2 = character.Inventory.GetItemInLimbSlot(InvSlotType.Head)
local reduceddmg = math.max(
10
- getCalculatedConcussionReduction(armor1, 10, limbtype)
- getCalculatedConcussionReduction(armor2, 10, limbtype),
0
)
if strength >= 15 and HF.Chance(math.min(strength / 60, 0.7)) then
HF.AddAfflictionResisted(character, "concussion", reduceddmg)
end
if
strength >= 15
and HF.Chance(
math.min((strength - 10) / 60, 0.7)
* NTC.GetMultiplier(character, "anyfracturechance")
* NTConfig.Get("NT_fractureChance", 1)
)
then
NT.BreakLimb(character, limbtype)
end
end
-- extremities
if strength >= 1 and HF.LimbIsExtremity(limbtype) then
if
NT.LimbIsBroken(character, limbtype)
and not NT.LimbIsAmputated(character, limbtype)
and HF.Chance((strength - 5) / 60 * NTC.GetMultiplier(character, "traumamputatechance"))
then
NT.TraumamputateLimb(character, limbtype)
end
if
HF.Chance(
(strength - 5)
/ 60
* NTC.GetMultiplier(character, "anyfracturechance")
* NTConfig.Get("NT_fractureChance", 1)
)
then
NT.BreakLimb(character, limbtype)
end
end
end
-- cause rib fractures, pneumothorax, tamponade, internal bleeding, fractures
NT.OnDamagedMethods.lacerations = function(character, strength, limbtype)
limbtype = HF.NormalizeLimbType(limbtype)
-- torso specific
if strength >= 1 and limbtype == LimbType.Torso then
if
strength >= 10
and HF.Chance(
(strength - 10)
/ 50
* NTC.GetMultiplier(character, "anyfracturechance")
* NTConfig.Get("NT_fractureChance", 1)
)
then
NT.BreakLimb(character, limbtype)
end
if
HasLungs(character)
and strength >= 5
and HF.Chance(
(strength - 5)
/ 50
* NTC.GetMultiplier(character, "pneumothoraxchance")
* NTConfig.Get("NT_pneumothoraxChance", 1)
)
then
HF.AddAffliction(character, "pneumothorax", 5)
end
if
HasHeart(character)
and strength >= 5
and HF.Chance(
(strength - 5)
/ 50
* NTC.GetMultiplier(character, "tamponadechance")
* NTConfig.Get("NT_tamponadeChance", 1)
)
then
HF.AddAffliction(character, "tamponade", 5)
end
if strength >= 5 then
HF.AddAffliction(character, "internalbleeding", strength * HF.RandomRange(0.2, 0.5))
end
end
-- head
if strength >= 1 and limbtype == LimbType.Head then
if
strength >= 15
and HF.Chance(
math.min((strength - 15) / 60, 0.7)
* NTC.GetMultiplier(character, "anyfracturechance")
* NTConfig.Get("NT_fractureChance", 1)
)
then
NT.BreakLimb(character, limbtype)
end
end
-- extremities
if strength >= 1 and HF.LimbIsExtremity(limbtype) then
if
NT.LimbIsBroken(character, limbtype)
and not NT.LimbIsAmputated(character, limbtype)
and HF.Chance(strength / 60 * NTC.GetMultiplier(character, "traumamputatechance"))
then
NT.TraumamputateLimb(character, limbtype)
end
if
HF.Chance(
(strength - 5)
/ 60
* NTC.GetMultiplier(character, "anyfracturechance")
* NTConfig.Get("NT_fractureChance", 1)
)
then
NT.BreakLimb(character, limbtype)
end
end
end
-- cause rib fractures, organ damage, pneumothorax, concussion, fractures, neurotrauma
NT.OnDamagedMethods.blunttrauma = function(character, strength, limbtype)
limbtype = HF.NormalizeLimbType(limbtype)
local fractureImmune = HF.HasAffliction(character, "cpr_fracturebuff")
-- torso
if not fractureImmune and strength >= 1 and limbtype == LimbType.Torso then
if
HF.Chance(
strength / 50 * NTC.GetMultiplier(character, "anyfracturechance") * NTConfig.Get("NT_fractureChance", 1)
)
then
NT.BreakLimb(character, limbtype)
end
HF.AddAffliction(character, "lungdamage", strength * HF.RandomRange(0, 1))
HF.AddAffliction(character, "heartdamage", strength * HF.RandomRange(0, 1))
HF.AddAffliction(character, "liverdamage", strength * HF.RandomRange(0, 1))
HF.AddAffliction(character, "kidneydamage", strength * HF.RandomRange(0, 1))
HF.AddAffliction(character, "organdamage", strength * HF.RandomRange(0, 1))
if
HasLungs(character)
and strength >= 5
and HF.Chance(
strength
/ 50
* NTC.GetMultiplier(character, "pneumothoraxchance")
* NTConfig.Get("NT_pneumothoraxChance", 1)
)
then
HF.AddAffliction(character, "pneumothorax", 5)
end
end
-- head
if not fractureImmune and strength >= 1 and limbtype == LimbType.Head then
local armor1 = character.Inventory.GetItemInLimbSlot(InvSlotType.OuterClothes)
local armor2 = character.Inventory.GetItemInLimbSlot(InvSlotType.Head)
local reduceddmg = math.max(
10
- getCalculatedConcussionReduction(armor1, 10, limbtype)
- getCalculatedConcussionReduction(armor2, 10, limbtype),
0
)
if strength >= 15 and HF.Chance(math.min(strength / 60, 0.7)) then
HF.AddAfflictionResisted(character, "concussion", reduceddmg)
end
if
strength >= 15
and HF.Chance(
math.min((strength - 10) / 60, 0.7)
* NTC.GetMultiplier(character, "anyfracturechance")
* NTConfig.Get("NT_fractureChance", 1)
)
then
NT.BreakLimb(character, limbtype)
end
if
strength >= 15
and HF.Chance(
math.min((strength - 10) / 60, 0.7)
* NTC.GetMultiplier(character, "anyfracturechance")
* NTConfig.Get("NT_fractureChance", 1)
)
then
HF.AddAffliction(character, "n_fracture", 5)
end
if strength >= 5 and HF.Chance(0.7) then
HF.AddAffliction(character, "cerebralhypoxia", strength * HF.RandomRange(0.1, 0.4))
end
end
-- extremities
if not fractureImmune and strength >= 1 and HF.LimbIsExtremity(limbtype) then
if
strength > 15
and NT.LimbIsBroken(character, limbtype)
and not NT.LimbIsAmputated(character, limbtype)
and HF.Chance(strength / 100 * NTC.GetMultiplier(character, "traumamputatechance"))
then
NT.TraumamputateLimb(character, limbtype)
end
if
HF.Chance(
(strength - 2)
/ 60
* NTC.GetMultiplier(character, "anyfracturechance")
* NTConfig.Get("NT_fractureChance", 1)
)
then
NT.BreakLimb(character, limbtype)
end
if
HF.Chance(
HF.Clamp((strength - 2) / 80, 0, 0.5)
* NTC.GetMultiplier(character, "dislocationchance")
* NTConfig.Get("NT_dislocationChance", 1)
) and not NT.LimbIsAmputated(character, limbtype)
then
NT.DislocateLimb(character, limbtype)
end
end
end
-- cause rib fractures, organ damage, pneumothorax, concussion, fractures
NT.OnDamagedMethods.internaldamage = function(character, strength, limbtype)
limbtype = HF.NormalizeLimbType(limbtype)
-- torso
if strength >= 1 and limbtype == LimbType.Torso then
if
HF.Chance(
(strength - 5)
/ 50
* NTC.GetMultiplier(character, "anyfracturechance")
* NTConfig.Get("NT_fractureChance", 1)
)
then
NT.BreakLimb(character, limbtype)
end
HF.AddAffliction(character, "lungdamage", strength * HF.RandomRange(0, 1))
HF.AddAffliction(character, "heartdamage", strength * HF.RandomRange(0, 1))
HF.AddAffliction(character, "liverdamage", strength * HF.RandomRange(0, 1))
HF.AddAffliction(character, "kidneydamage", strength * HF.RandomRange(0, 1))
HF.AddAffliction(character, "organdamage", strength * HF.RandomRange(0, 1))
if
HasLungs(character)
and strength >= 5
and HF.Chance(
(strength - 5)
/ 50
* NTC.GetMultiplier(character, "pneumothoraxchance")
* NTConfig.Get("NT_pneumothoraxChance", 1)
)
then
HF.AddAffliction(character, "pneumothorax", 5)
end
end
-- head
if strength >= 1 and limbtype == LimbType.Head then
local armor1 = character.Inventory.GetItemInLimbSlot(InvSlotType.OuterClothes)
local armor2 = character.Inventory.GetItemInLimbSlot(InvSlotType.Head)
local reduceddmg = math.max(
10
- getCalculatedConcussionReduction(armor1, 10, limbtype)
- getCalculatedConcussionReduction(armor2, 10, limbtype),
0
)
if strength >= 15 and HF.Chance(math.min(strength / 60, 0.7)) then
HF.AddAfflictionResisted(character, "concussion", reduceddmg)
end
if
strength >= 15
and HF.Chance(
math.min((strength - 5) / 60, 0.7)
* NTC.GetMultiplier(character, "anyfracturechance")
* NTConfig.Get("NT_fractureChance", 1)
)
then
NT.BreakLimb(character, limbtype)
end
if
strength >= 15
and HF.Chance(
math.min((strength - 5) / 60, 0.7)
* NTC.GetMultiplier(character, "anyfracturechance")
* NTConfig.Get("NT_fractureChance", 1)
)
then
HF.AddAffliction(character, "n_fracture", 5)
end
end
-- extremities
if strength >= 1 and HF.LimbIsExtremity(limbtype) then
if
strength > 10
and NT.LimbIsBroken(character, limbtype)
and not NT.LimbIsAmputated(character, limbtype)
and HF.Chance((strength - 10) / 60 * NTC.GetMultiplier(character, "traumamputatechance"))
then
NT.TraumamputateLimb(character, limbtype)
end
if
HF.Chance(
(strength - 5)
/ 60
* NTC.GetMultiplier(character, "anyfracturechance")
* NTConfig.Get("NT_fractureChance", 1)
)
then
NT.BreakLimb(character, limbtype)
end
if
HF.Chance(
0.25 * NTC.GetMultiplier(character, "dislocationchance") * NTConfig.Get("NT_dislocationChance", 1)
) and not NT.LimbIsAmputated(character, limbtype)
then
NT.DislocateLimb(character, limbtype)
end
end
end