diff --git a/media/lua/client/Handlers/TOC_AmputationHandler.lua b/media/lua/client/Handlers/TOC_AmputationHandler.lua new file mode 100644 index 0000000..1871543 --- /dev/null +++ b/media/lua/client/Handlers/TOC_AmputationHandler.lua @@ -0,0 +1,85 @@ +local ModDataHandler = require("Handlers/TOC_ModDataHandler") +local StaticData = require("TOC_StaticData") + +--------------------------- + +-- TODO Add Bandages, Torniquet, etc. +--- This will be run EXCLUSIVELY on the client which is getting the amputation +---@class AmputationHandler +---@field patient IsoPlayer +---@field limbName string +---@field bodyPartType BodyPartType +---@field surgeonPl IsoPlayer? +local AmputationHandler = {} + + +---@param limbName string +---@param surgeonPl IsoPlayer? +---@return AmputationHandler +function AmputationHandler:new(limbName, surgeonPl) + local o = {} + setmetatable(o, self) + self.__index = self + + o.patient = getPlayer() + o.limbName = limbName + o.bodyPartType = BodyPartType[self.limbName] + if surgeonPl then + o.surgeonPl = surgeonPl + else + o.surgeonPl = o.patient + end + + AmputationHandler.instance = o + return o +end + +---Starts bleeding from the point where the saw is being used +function AmputationHandler:damageDuringAmputation() + print("TOC: Damage patient") + local bodyDamage = self.patient:getBodyDamage() + local bodyDamagePart = bodyDamage:getBodyPart(self.bodyPartType) + + bodyDamagePart:setBleeding(true) + bodyDamagePart:setCut(true) + bodyDamagePart:setBleedingTime(ZombRand(10, 20)) +end + +---Execute the amputation +function AmputationHandler:execute() + + -- TODO Calculate surgeonStats + local surgeonFactor = 100 + + + local patientStats = self.patient:getStats() + local bd = self.patient:getBodyDamage() + local bodyPart = bd:getBodyPart(self.bodyPartType) + local baseDamage = StaticData.LIMBS_BASE_DAMAGE[self.limbName] + + -- Set the bleeding and all the damage stuff in that part + bodyPart:AddDamage(baseDamage - surgeonFactor) + bodyPart:setAdditionalPain(baseDamage - surgeonFactor) + bodyPart:setBleeding(true) + bodyPart:setBleedingTime(baseDamage - surgeonFactor) + bodyPart:setDeepWounded(true) + bodyPart:setDeepWoundTime(baseDamage - surgeonFactor) + patientStats:setEndurance(surgeonFactor) + patientStats:setStress(baseDamage - surgeonFactor) + + -- Set the data in modData + ModDataHandler.GetInstance():setCutLimb(self.limbName, false, false, false, self.surgeonFactor) +end + +---Force the execution of the amputation for a trait +function AmputationHandler:executeForTrait() + ModDataHandler.GetInstance():setCutLimb(self.limbName, true, true, true, 0) +end + +---Deletes the instance +function AmputationHandler:close() + AmputationHandler.instance = nil +end + + +return AmputationHandler \ No newline at end of file diff --git a/media/lua/client/Handlers/TOC_ItemsHandler.lua b/media/lua/client/Handlers/TOC_ItemsHandler.lua new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/media/lua/client/Handlers/TOC_ItemsHandler.lua @@ -0,0 +1 @@ + diff --git a/media/lua/client/TOC_ModDataHandler.lua b/media/lua/client/Handlers/TOC_ModDataHandler.lua similarity index 95% rename from media/lua/client/TOC_ModDataHandler.lua rename to media/lua/client/Handlers/TOC_ModDataHandler.lua index 892e461..a3ebced 100644 --- a/media/lua/client/TOC_ModDataHandler.lua +++ b/media/lua/client/Handlers/TOC_ModDataHandler.lua @@ -158,4 +158,16 @@ end +---@return ModDataHandler +function ModDataHandler.GetInstance() + if ModDataHandler.instance ~= nil then + return ModDataHandler.instance + else + return ModDataHandler:new(getPlayer()) + end +end + + + + return ModDataHandler \ No newline at end of file diff --git a/media/lua/client/TOC_PlayerHandler.lua b/media/lua/client/Handlers/TOC_PlayerHandler.lua similarity index 54% rename from media/lua/client/TOC_PlayerHandler.lua rename to media/lua/client/Handlers/TOC_PlayerHandler.lua index 96ecfb5..55e3a71 100644 --- a/media/lua/client/TOC_PlayerHandler.lua +++ b/media/lua/client/Handlers/TOC_PlayerHandler.lua @@ -1,10 +1,21 @@ -local ModDataHandler = require("TOC_ModDataHandler") +local ModDataHandler = require("Handlers/TOC_ModDataHandler") +local AmputationHandler = require("Handlers/TOC_AmputationHandler") local StaticData = require("TOC_StaticData") ----------- + +-- LIST OF STUFF THAT THIS CLASS NEEDS TO DO + +-- Main thing, should contain the other handlers when needed +-- Handling Items (as in amputations spawns) +-- Update current player status (infection checks) +-- handle stats increase\decrease + + ---@class PlayerHandler local PlayerHandler = {} +-- TODO This should be instanceable for a player. Separate handlers not ---Setup player modData ---@param _ nil @@ -20,71 +31,20 @@ function PlayerHandler.InitializePlayer(_, playerObj, isForced) end end ----Cut a limb for a trait +---Handles the traits ---@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) + local tempHandler = AmputationHandler:new(v) + tempHandler:executeForTrait() + tempHandler:close() return end end end ---* Amputations *-- - ----Starts bleeding from the point where the saw is being used ----@param patient IsoPlayer ----@param limbName string -function PlayerHandler.DamageDuringAmputation(patient, limbName) - local bodyDamage = patient:getBodyDamage() - local bodyDamagePart = bodyDamage:getBodyPart(BodyPartType[limbName]) - - bodyDamagePart:setBleeding(true) - bodyDamagePart:setCut(true) - bodyDamagePart:setBleedingTime(ZombRand(10, 20)) -end - ----Do the amputation ----@param patient IsoPlayer ----@param surgeon IsoPlayer ----@param limbName string ----@param surgeryHelpItems table -function PlayerHandler.CutLimb(patient, surgeon, limbName, surgeryHelpItems) - 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, 0) - -- TODO Spawn amputation item -end - - --* Events *-- @@ -92,7 +52,7 @@ end ---@param character IsoGameCharacter ---@param damageType string ---@param damage number -function PlayerHandler.CheckInfection(character, damageType, damage) +function PlayerHandler.CheckInfection(character) -- This fucking event barely works. Bleeding seems to be the only thing that triggers it if character ~= getPlayer() then return end diff --git a/media/lua/client/Handlers/TOC_ProsthesisHandler.lua b/media/lua/client/Handlers/TOC_ProsthesisHandler.lua new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/media/lua/client/Handlers/TOC_ProsthesisHandler.lua @@ -0,0 +1 @@ + diff --git a/media/lua/client/TOC_ItemsHandler.lua b/media/lua/client/TOC_ItemsHandler.lua deleted file mode 100644 index 0bc1e57..0000000 --- a/media/lua/client/TOC_ItemsHandler.lua +++ /dev/null @@ -1,6 +0,0 @@ --- TODO Spawn items - --- TODO Remove Items - --- TODO Check if item make sense to be here or whatever - diff --git a/media/lua/client/TOC_Main.lua b/media/lua/client/TOC_Main.lua index 30261cf..dc49df2 100644 --- a/media/lua/client/TOC_Main.lua +++ b/media/lua/client/TOC_Main.lua @@ -1,4 +1,4 @@ -local PlayerHandler = require("TOC_PlayerHandler") +local PlayerHandler = require("Handlers/TOC_PlayerHandler") ------------------ diff --git a/media/lua/client/TOC_Test.lua b/media/lua/client/TOC_Test.lua index 3c091bc..5fbcfd8 100644 --- a/media/lua/client/TOC_Test.lua +++ b/media/lua/client/TOC_Test.lua @@ -2,7 +2,7 @@ if not getActivatedMods():contains("TEST_FRAMEWORK") or not isDebugEnabled() the local TestFramework = require("TestFramework/TestFramework") local TestUtils = require("TestFramework/TestUtils") -local PlayerHandler = require("TOC_PlayerHandler") +local PlayerHandler = require("Handlers/TOC_PlayerHandler") diff --git a/media/lua/client/TimedActions/TOC_CutLimbAction.lua b/media/lua/client/TimedActions/TOC_CutLimbAction.lua index 94aa2a0..dc60fd4 100644 --- a/media/lua/client/TimedActions/TOC_CutLimbAction.lua +++ b/media/lua/client/TimedActions/TOC_CutLimbAction.lua @@ -1,6 +1,8 @@ -local PlayerHandler = require("TOC_PlayerHandler") - require "TimedActions/ISBaseTimedAction" +local AmputationHandler = require("Handlers/TOC_AmputationHandler") + + +----------------------------- ---@class CutLimbAction ---@field patient IsoPlayer @@ -35,11 +37,10 @@ function CutLimbAction:isValid() end function CutLimbAction:start() - - print("Damage patient") if self.patient == self.surgeon then -- Self - PlayerHandler.DamageDuringAmputation(self.patient, self.limbName) + self.handler = AmputationHandler:new(self.limbName) + self.handler:damageDuringAmputation() else -- Other player -- TODO Send Damage @@ -47,8 +48,7 @@ function CutLimbAction:start() end function CutLimbAction:perform() - - PlayerHandler.CutLimb(self.patient, self.surgeon, self.limbName, {}) + self.handler:execute() ISBaseTimedAction.perform(self) end