From 34570cd013a47f89b40e40a6da1a0d22fa3cd667 Mon Sep 17 00:00:00 2001 From: ZioPao Date: Thu, 16 Nov 2023 12:50:07 +0100 Subject: [PATCH] cicatrization process --- dev_stuff/healthPanelHide.psd | Bin 4658138 -> 4696534 bytes media/lua/client/TOC/CommonMethods.lua | 8 +++ .../client/TOC/Handlers/AmputationHandler.lua | 15 ++++- .../client/TOC/Handlers/ModDataHandler.lua | 35 ++++++++++ .../lua/client/TOC/Handlers/PlayerHandler.lua | 63 +++++++++++++++--- media/lua/client/TOC/Main.lua | 5 +- media/lua/shared/TOC/StaticData.lua | 6 +- 7 files changed, 114 insertions(+), 18 deletions(-) diff --git a/dev_stuff/healthPanelHide.psd b/dev_stuff/healthPanelHide.psd index ab18f595e25e99dc5aa4120052ed2965b4a90e28..7fa36bc945b8eb61b0269c79e119bc9260d32cc6 100644 GIT binary patch delta 42874 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 delta 5419 zcmeH~dvH|M9mjunce8m539@-WN+5~ES|l+=C>S0o^&v?akaX|LBrFz0J9_OsY;1x9j+glqEDKqP{|$ z7$xx&HS@F@l5kA7tXsZ*b~Q>yQ7c5c6NffnpeFhb?W874&Wb#nXZbz)vUJgfFrz<@ zCcKjs;Ah}XqSmL0^u4zGR&LZ;%(eOE)9QU4b!E4gcGRt|EA3d<@vT|+M{P}vj`Zy< zsZgpf9ekg5f?y@B)g-`#un=+c)9PQUGF?tA6zd*9po$8T({ zelxhi!6F6qPyk@nJGOE7#Q3oDlTnT;y*ck18ukK#sgkoUoEn=u8E(o zv@B~VvW4{GZ`2o()|!+l8*9G zgHbz*LX}a=|okE0_*UAP?k&0#FEMfSI5Od=AV4#b7p=)3c|sr2Gd; zO{<)%tZkJI|GTogskB_#eyG%_9B(Skf2OUe6qJG6z+6xcZU>(ScYrT|dEibkA5?%! za2KcoUjz%l-C!YD1il0ogC*b|Pz{!XWnej20cyaP!Ah{Ir>&{h5mw4~$*Z>bDaup| zP?-5BLWca`gk9T047HSEdMUy@O+gl*G|DdMjxrV<46q>SZnga(!YJTlA);4!$;~2! zR(ua_OAzP>?3Fh?iCGt_cdF z9CqoQzVQY>g~f@^>GP-*5oL0Y6GJJYlGjC2777j`7HuA(A?2NBd5LnVMK+|U$fiE! z-4?k}&+MekZ;@-)C0m{_QNCt3Xp-`BG_$-oRWlkiQJ!WpWYP?VO`5qpVJ>HcSjI3n zP{j>q{nri7Zk4y2Cn&^5F>XGnCx)9jh%?Td0>YUS$zYth5<14l2w73+7=ypWH41en z)XBV<9Zt-Y2#sJugrTrUb{2+S#jpp>G>GAzfW`^nLL5I0VNz-Ma2rRZ;RIfE$nnsq zz)cRAci=&scrcg1g-7CWS2VZW!p#x#va6&EFr~eX$AJY^2g9s}x`AH}qoatbqO0WY zc(=SeLg!pv=r*oS#EGGXs}s@GGzzmSdLBiLqnKF}ECLNe2QmG_Y=9UGnOQ#uq94@* zXfT){fM<;3XG3@aG<@iSqq5-yUdDYInRFPn7`S3F852%vv2u&pC4yiQL4dk}-z0)y zx)}r(`F{z5jwEIFlk#-s#WuO{-~0_VW~bq+kcM@p5&v{$MXNk*G81NFK)ek+?e`<) zc#`xi@&%EmA0UPFB|&r!pNbnRZ%;J2GTa+Q8slnCKGDiiI*$uC(gM*ne|~_DA^Re=3w0s;GSbwEEX>G(+#A8v zj4Z>*j-1122+5MsAWx0d&(k4&jJ$@?ki=BTz+%&g^(X%u$e{e%T~evM+b-8AN8Kee z%ve9D14x)ElqjHvPY&^w14Y%~$$n9aoIFSGi~m{pkW3$zDshtQ|B15snhxVPYUVzR zp1~^QA7Rd?8(kkYrQ2Py;M$0pM8u$om?@kaiVG6x z>6MG^a(w|$*IATJQ}E9cDV)ErM!c!*PsuZs&Aa6(Jrx%Db%{6Ml+^qdG|!++koq5N zp7zPZ+@Vxj;RUWKGw+$5s%Xo;TwrVEG6o7sp{{8NJL#M zH5&1{u!Cp`U=3!)sn_GexyOeOk(H4*;v%OTsm98}>KIar6>CE$QjL}ATAG_j@g}2{ zWGCoOJ9S}chLX=to3ukhRdHcLXjE&+8&8hdlHA~$c2CdPPvuu7?&(9H_SC+ipzL7G z(~+(Dra6|Fr=FpWc_vf-T+LIRmV1@8hxuF<+wKEm+ufP8?LL&e z?e3z~!1b7e4$brPphRB+U?Iqfkj} R$Q%DFD3@N8ecVms-vIyPAD93D diff --git a/media/lua/client/TOC/CommonMethods.lua b/media/lua/client/TOC/CommonMethods.lua index 860e410..ee335f3 100644 --- a/media/lua/client/TOC/CommonMethods.lua +++ b/media/lua/client/TOC/CommonMethods.lua @@ -7,4 +7,12 @@ function CommonMethods.GetSide(name) if string.find(name, "_L") then return "L" else return "R" end end +---Stops and start an event, making sure that we don't stack them up +---@param event string +---@param method function +function CommonMethods.SafeStartEvent(event, method) + Events[event].Remove(method) + Events[event].Add(method) +end + return CommonMethods \ No newline at end of file diff --git a/media/lua/client/TOC/Handlers/AmputationHandler.lua b/media/lua/client/TOC/Handlers/AmputationHandler.lua index b9752d5..fea4d21 100644 --- a/media/lua/client/TOC/Handlers/AmputationHandler.lua +++ b/media/lua/client/TOC/Handlers/AmputationHandler.lua @@ -5,6 +5,13 @@ local PlayerHandler = require("TOC/Handlers/PlayerHandler") local StaticData = require("TOC/StaticData") --------------------------- +--Triggered when a limb has been amputated +---@class Events +---@field OnAmputatedLimb any +LuaEventManager.AddEvent("OnAmputatedLimb") + +-------------- + -- TODO Add Bandages, Torniquet, etc. --- Manages an amputation. Will be run on the patient client ---@class AmputationHandler @@ -150,15 +157,17 @@ function AmputationHandler:execute(damagePlayer) CachedDataHandler.AddAmputatedLimb(username, self.limbName) CachedDataHandler.CalculateHighestAmputatedLimbs(username) - -- TODO Check infection level! - -- If the part was actually infected, heal the player, if they were in time - if bodyPart:IsInfected() and not modDataHandler:getIsIgnoredPartInfected() then + -- If the part was actually infected, heal the player, if they were in time (infectionLevel < 20) + if bd:getInfectionLevel() < 20 and bodyPart:IsInfected() and not modDataHandler:getIsIgnoredPartInfected() then PlayerHandler.HealZombieInfection(bd, bodyPart, self.limbName, modDataHandler) end -- The last part is to handle the damage that the player will receive after the amputation if not damagePlayer then return end self:damageAfterAmputation(surgeonFactor) + + -- Trigger this event + triggerEvent("OnAmputatedLimb") end ---Deletes the instance diff --git a/media/lua/client/TOC/Handlers/ModDataHandler.lua b/media/lua/client/TOC/Handlers/ModDataHandler.lua index 8ccb967..d1f272f 100644 --- a/media/lua/client/TOC/Handlers/ModDataHandler.lua +++ b/media/lua/client/TOC/Handlers/ModDataHandler.lua @@ -109,6 +109,20 @@ function ModDataHandler:setIsInfected(limbName, isInfected) self.tocData.limbs[limbName].isInfected = isInfected end +---Set isCicatrized +---@param limbName string +---@param isCicatrized boolean +function ModDataHandler:setIsCicatrized(limbName, isCicatrized) + self.tocData.limbs[limbName].isCicatrized = isCicatrized +end + +---Set cicatrizationTime +---@param limbName string +---@param cicatrizationTime number +function ModDataHandler:setCicatrizationTime(limbName, cicatrizationTime) + self.tocData.limbs[limbName].cicatrizationTime = cicatrizationTime +end + ---Set isProstEquipped ---@param group string ---@param isProstEquipped boolean @@ -152,6 +166,20 @@ function ModDataHandler:getIsVisible(limbName) return self.tocData.limbs[limbName].isVisible end +---Get isCicatrized +---@param limbName string +---@return boolean +function ModDataHandler:getIsCicatrized(limbName) + return self.tocData.limbs[limbName].isCicatrized +end + +---Get cicatrizationTime +---@param limbName string +---@return number +function ModDataHandler:getCicatrizationTime(limbName) + return self.tocData.limbs[limbName].cicatrizationTime +end + ---Get isProstEquipped ---@param group string ---@return boolean @@ -213,6 +241,13 @@ function ModDataHandler:setLimbParams(limbName, ampStatus, cicatrizationTime) if cicatrizationTime ~= nil then limbData.cicatrizationTime = cicatrizationTime end end +--* Update statuses of a limb *-- + +---Decreases the cicatrization time +---@param limbName string +function ModDataHandler:decreaseCicatrizationTime(limbName) + self.tocData.limbs[limbName].cicatrizationTime = self.tocData.limbs[limbName].cicatrizationTime - 1 +end --* Global Mod Data Handling *-- diff --git a/media/lua/client/TOC/Handlers/PlayerHandler.lua b/media/lua/client/TOC/Handlers/PlayerHandler.lua index bbf97fe..3437df9 100644 --- a/media/lua/client/TOC/Handlers/PlayerHandler.lua +++ b/media/lua/client/TOC/Handlers/PlayerHandler.lua @@ -29,6 +29,11 @@ function PlayerHandler.InitializePlayer(playerObj, isForced) CachedDataHandler.CalculateAmputatedLimbs(username) CachedDataHandler.CalculateHighestAmputatedLimbs(username) + -- TODO Check if there are cut limbs and that needs cicatrization. If yes, then enable the loop + if ModDataHandler.GetInstance(username):getIsAnyLimbCut() then + CommonMethods.SafeStartEvent("EveryHours", PlayerHandler.UpdateCicatrization) + end + -- Since isForced is used to reset an existing player data, we're gonna clean their ISHealthPanel table too if isForced then --ISHealthPanel.highestAmputations = {} @@ -149,14 +154,50 @@ end Events.OnPlayerGetDamage.Add(PlayerHandler.CheckDamage) - ----Updates the cicatrization process, run when a limb has been cut +---Updates the cicatrization process, run when a limb has been cut. Run it every 1 hour function PlayerHandler.UpdateCicatrization() - if ModDataHandler.GetInstance():getIsAnyLimbCut() == false then return end + local modDataHandler = ModDataHandler.GetInstance() + if modDataHandler:getIsAnyLimbCut() == false then + Events.EveryHours.Remove(PlayerHandler.UpdateCicatrization) + end + + local pl = PlayerHandler.playerObj + local amputatedLimbs = CachedDataHandler.GetAmputatedLimbs(pl:getUsername()) + local needsUpdate = false + + for i=1, #amputatedLimbs do + local limbName = amputatedLimbs[i] + local isCicatrized = modDataHandler:getIsCicatrized(limbName) + if not isCicatrized then + needsUpdate = true + local cicTime = modDataHandler:getCicatrizationTime(limbName) + + if cicTime > 0 then + cicTime = cicTime - 60 -- 1 per minute, each cicatrizationTime is divisible by 60 + modDataHandler:setCicatrizationTime(limbName, cicTime) + if cicTime < 0 then + modDataHandler:setIsCicatrized(limbName, true) + end + end + end + end + + if needsUpdate then + modDataHandler:apply() -- TODO This is gonna be heavy. Not entirely sure + else + Events.EveryHours.Remove(PlayerHandler.UpdateCicatrization) -- We can remove it safely, no cicatrization happening here boys + end + TOC_DEBUG.print("updating cicatrization!") - -- TODO Update cicatrization end +---Starts safely the loop to update cicatrzation +function PlayerHandler.ToggleCicatrizationUpdate() + CommonMethods.SafeStartEvent("EveryHours", PlayerHandler.UpdateCicatrization) +end + +Events.OnAmputatedLimb.Add(PlayerHandler.ToggleCicatrizationUpdate) + ------------------------------------------ @@ -181,13 +222,13 @@ function ISBaseTimedAction:adjustMaxTime(maxTime) local amputatedLimbs = CachedDataHandler.GetAmputatedLimbs(pl:getUsername()) for i=1, #amputatedLimbs do local limbName = amputatedLimbs[i] - if modDataHandler:getIsCut(limbName) then - local perk = Perks["Side_" .. CommonMethods.GetSide(limbName)] - local perkLevel = pl:getPerkLevel(perk) - local perkLevelScaled - if perkLevel ~= 0 then perkLevelScaled = perkLevel / 10 else perkLevelScaled = 0 end - time = time * (StaticData.LIMBS_TIME_MULTIPLIER_IND_NUM[limbName] - perkLevelScaled) - end + --if modDataHandler:getIsCut(limbName) then + local perk = Perks["Side_" .. CommonMethods.GetSide(limbName)] + local perkLevel = pl:getPerkLevel(perk) + local perkLevelScaled + if perkLevel ~= 0 then perkLevelScaled = perkLevel / 10 else perkLevelScaled = 0 end + time = time * (StaticData.LIMBS_TIME_MULTIPLIER_IND_NUM[limbName] - perkLevelScaled) + --end end end return time diff --git a/media/lua/client/TOC/Main.lua b/media/lua/client/TOC/Main.lua index c4fc077..e5b6a06 100644 --- a/media/lua/client/TOC/Main.lua +++ b/media/lua/client/TOC/Main.lua @@ -1,4 +1,5 @@ local PlayerHandler = require("TOC/Handlers/PlayerHandler") +local CommonMethods = require("TOC/CommonMethods") ------------------ ---@class Main @@ -44,6 +45,7 @@ end function Main.Initialize() + ---Looop until we've successfully initialized the mod local function TryToInitialize() local pl = getPlayer() TOC_DEBUG.print("Current username in TryToInitialize: " .. pl:getUsername()) @@ -55,8 +57,7 @@ function Main.Initialize() PlayerHandler.InitializePlayer(pl, false) Events.OnTick.Remove(TryToInitialize) end - - Events.OnTick.Add(TryToInitialize) + CommonMethods.SafeStartEvent("OnTick", TryToInitialize) end diff --git a/media/lua/shared/TOC/StaticData.lua b/media/lua/shared/TOC/StaticData.lua index 2eaa1a0..16f15b4 100644 --- a/media/lua/shared/TOC/StaticData.lua +++ b/media/lua/shared/TOC/StaticData.lua @@ -55,9 +55,11 @@ StaticData.LIMBS_BASE_DAMAGE_IND_NUM = {} StaticData.LIMBS_TIME_MULTIPLIER_IND_NUM = {} StaticData.BODYLOCS_IND_BPT = {} +-- CicatrizationBaseTime should be mod 60 since we're using EveryHours to update the cicatrizationTime + local function AssembleHandData(assembledName) StaticData.LIMBS_BASE_DAMAGE_IND_NUM[assembledName] = 60 - StaticData.LIMBS_CICATRIZATION_TIME_IND_NUM[assembledName] = 1700 + StaticData.LIMBS_CICATRIZATION_TIME_IND_NUM[assembledName] = 1200 StaticData.LIMBS_TIME_MULTIPLIER_IND_NUM[assembledName] = 2 StaticData.LIMBS_DEPENDENCIES_IND_STR[assembledName] = {} end @@ -71,7 +73,7 @@ end local function AssembleUpperarmData(assembledName, side) StaticData.LIMBS_BASE_DAMAGE_IND_NUM[assembledName] = 100 - StaticData.LIMBS_CICATRIZATION_TIME_IND_NUM[assembledName] = 2000 + StaticData.LIMBS_CICATRIZATION_TIME_IND_NUM[assembledName] = 1800 StaticData.LIMBS_TIME_MULTIPLIER_IND_NUM[assembledName] = 4 StaticData.LIMBS_DEPENDENCIES_IND_STR[assembledName] = { StaticData.PARTS_IND_STR.Hand .. "_" .. side, StaticData.PARTS_IND_STR.ForeArm .. "_" .. side }