104 lines
3.1 KiB
Lua
104 lines
3.1 KiB
Lua
local ModDataHandler = require("TOC_ModDataHandler")
|
|
local StaticData = require("TOC_StaticData")
|
|
-----------
|
|
|
|
|
|
---@class PlayerHandler
|
|
local PlayerHandler = {}
|
|
|
|
|
|
---Setup player modData
|
|
---@param _ nil
|
|
---@param playerObj IsoPlayer
|
|
function PlayerHandler.InitializePlayer(_, playerObj)
|
|
PlayerHandler.modDataHandler = ModDataHandler:new(playerObj)
|
|
PlayerHandler.modDataHandler:setup()
|
|
end
|
|
|
|
---Cut a limb for a trait
|
|
---@param playerObj IsoPlayer
|
|
function PlayerHandler.ManageTraits(playerObj)
|
|
for k, v in pairs(StaticData.TRAITS_BP) do
|
|
if playerObj:HasTrait(k) then
|
|
-- Once we find one, we should be done.
|
|
PlayerHandler.ForceCutLimb(v)
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
---comment
|
|
---@param patient IsoPlayer
|
|
---@param surgeon IsoPlayer
|
|
---@param limbName string
|
|
---@param surgeryHelpItems table
|
|
function PlayerHandler.CutLimb(patient, surgeon, limbName, surgeryHelpItems)
|
|
|
|
-- TODO Start bleeding and crap like that
|
|
|
|
local patientStats = patient:getStats()
|
|
|
|
-- TODO Get surgeon ability from his aid skill
|
|
local surgeonSkill = 50
|
|
local surgeonFactor = surgeonSkill - 1 -- TODO Should be decided by surgeryHelpItems
|
|
|
|
local bd = patient:getBodyDamage()
|
|
local bodyPart = bd:getBodyPart(BodyPartType[limbName])
|
|
local baseDamage = StaticData.LIMBS_BASE_DAMAGE[limbName]
|
|
|
|
-- Set the bleeding and all the damage stuff in that part
|
|
bodyPart:AddDamage(baseDamage - surgeonSkill)
|
|
bodyPart:setAdditionalPain(baseDamage - surgeonSkill)
|
|
bodyPart:setBleeding(true)
|
|
bodyPart:setBleedingTime(baseDamage - surgeonSkill)
|
|
bodyPart:setDeepWounded(true)
|
|
bodyPart:setDeepWoundTime(baseDamage - surgeonSkill)
|
|
patientStats:setEndurance(surgeonSkill)
|
|
patientStats:setStress(baseDamage - surgeonSkill)
|
|
|
|
PlayerHandler.modDataHandler:setCutLimb(limbName, false, false, false, surgeonFactor)
|
|
|
|
end
|
|
|
|
|
|
---Set an already cut limb, for example for a trait.
|
|
---@param limbName string
|
|
function PlayerHandler.ForceCutLimb(limbName)
|
|
PlayerHandler.modDataHandler:setCutLimb(limbName, true, true, true)
|
|
-- TODO Spawn amputation item
|
|
end
|
|
|
|
|
|
|
|
--* Events *--
|
|
|
|
---Check if the player has an infected (as in, zombie infection) body part
|
|
---@param character IsoGameCharacter
|
|
---@param damageType string
|
|
---@param damage number
|
|
function PlayerHandler.CheckInfection(character, damageType, damage)
|
|
|
|
-- This fucking event barely works. Bleeding seems to be the only thing that triggers it
|
|
-- TODO Check other body parts that are not included in the mod, if there's a bite there then the player is fucked
|
|
local bd = character:getBodyDamage()
|
|
|
|
for i=1, #StaticData.LIMBS_STRINGS do
|
|
local limbName = StaticData.LIMBS_STRINGS[i]
|
|
local bptEnum = StaticData.BODYPARTSTYPES_ENUM[limbName]
|
|
local bodyPart = bd:getBodyPart(bptEnum)
|
|
|
|
if bodyPart:bitten() then
|
|
if PlayerHandler.modDataHandler:getIsCut(limbName) then
|
|
bodyPart:SetBitten(false)
|
|
else
|
|
PlayerHandler.modDataHandler:setIsInfected(limbName, true)
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
Events.OnPlayerGetDamage.Add(PlayerHandler.CheckInfection)
|
|
|
|
return PlayerHandler |