Files
The-Only-Cure/media/lua/client/TOC_PlayerHandler.lua
2023-11-06 14:28:03 +01:00

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