diff --git a/media/lua/client/Handlers/TOC_ModDataHandler.lua b/media/lua/client/Handlers/TOC_ModDataHandler.lua index 792e345..4646d07 100644 --- a/media/lua/client/Handlers/TOC_ModDataHandler.lua +++ b/media/lua/client/Handlers/TOC_ModDataHandler.lua @@ -48,6 +48,9 @@ function ModDataHandler:createData() isAnyLimbCut = false } + -- Set a reference to TOC data in ModData + self.tocData = self.playerObj:getModData()[StaticData.MOD_NAME] + ---@type partData local defaultParams = {isCut = false, isInfected = false, isOperated = false, isCicatrized = false, isCauterized = false, isVisible = false} @@ -59,7 +62,6 @@ function ModDataHandler:createData() self:setLimbParams(StaticData.LIMBS_STRINGS[i], defaultParams, 0) end - self.tocData = self.playerObj:getModData()[StaticData.MOD_NAME] end diff --git a/media/lua/client/Handlers/TOC_PlayerHandler.lua b/media/lua/client/Handlers/TOC_PlayerHandler.lua index 9ef7c0c..efecd25 100644 --- a/media/lua/client/Handlers/TOC_PlayerHandler.lua +++ b/media/lua/client/Handlers/TOC_PlayerHandler.lua @@ -11,6 +11,8 @@ local StaticData = require("TOC_StaticData") -- handle stats increase\decrease ---@class PlayerHandler +---@field modDataHandler ModDataHandler +---@field playerObj IsoPlayer local PlayerHandler = {} ---Setup player modData @@ -20,6 +22,7 @@ local PlayerHandler = {} function PlayerHandler.InitializePlayer(_, playerObj, isForced) PlayerHandler.modDataHandler = ModDataHandler:new(playerObj) PlayerHandler.modDataHandler:setup(isForced) + PlayerHandler.playerObj = playerObj -- Since isForced is used to reset an existing player data, we're gonna clean their ISHealthPanel table too if isForced then @@ -100,6 +103,7 @@ end Events.OnPlayerUpdate.Add(PlayerHandler.UpdatePerks) +--* Some overrides *-- local og_ISBaseTimedAction_adjustMaxTime = ISBaseTimedAction.adjustMaxTime @@ -111,31 +115,34 @@ function ISBaseTimedAction:adjustMaxTime(maxTime) for i=1, #StaticData.LIMBS_STRINGS do local limbName = StaticData.LIMBS_STRINGS[i] if modDataHandler:getIsCut(limbName) then - --print("TOC: cut limb " .. limbName) - --print("TOC: cTime" .. tostring(time)) 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 - --print("TOC: perk level for this side: " .. tonumber(perkLevel)) - --print("TOC: perk scaling for this side: " .. tonumber(perkLevelScaled)) + if perkLevel ~= 0 then perkLevelScaled = perkLevel / 10 else perkLevelScaled = 0 end time = time * (StaticData.LIMBS_TIME_MULTIPLIER[limbName] - perkLevelScaled) end end - --print("TOC: new time " .. tostring(time)) end return time end +local og_ISBaseTimedAction_perform = ISBaseTimedAction.perform +function ISBaseTimedAction:perform() + og_ISBaseTimedAction_perform(self) + + if PlayerHandler.modDataHandler:getIsAnyLimbCut() then + for side, _ in pairs(StaticData.SIDES_STRINGS) do + local limbName = "Hand_" .. side + if ModDataHandler.GetInstance():getIsCut(limbName) then + PlayerHandler.playerObj:getXp():AddXP(Perks["Side_" .. side], 2) -- TODO Make it dynamic + end + end + end +end + - - return PlayerHandler \ No newline at end of file diff --git a/media/lua/client/TOC_Test.lua b/media/lua/client/TOC_Test.lua index cdd30b5..a3c4a7f 100644 --- a/media/lua/client/TOC_Test.lua +++ b/media/lua/client/TOC_Test.lua @@ -13,6 +13,29 @@ TestFramework.registerTestModule("Functionality", "PlayerHandler", function() PlayerHandler.InitializePlayer(_, pl, true) end + function Tests.SetMaxPerks() + local pl = getPlayer() + for _=0, 10 do + pl:LevelPerk(Perks["Side_L"]) + pl:LevelPerk(Perks["Side_R"]) + pl:getXp():setXPToLevel(Perks["Side_L"], pl:getPerkLevel(Perks["Side_L"])) + pl:getXp():setXPToLevel(Perks["Side_R"], pl:getPerkLevel(Perks["Side_R"])) + end + + SyncXp(pl) + end + + function Tests.ResetPerks() + local pl = getPlayer() + for _=0, 10 do + pl:LoseLevel(Perks["Side_L"]) + pl:LoseLevel(Perks["Side_R"]) + pl:getXp():setXPToLevel(Perks["Side_L"], pl:getPerkLevel(Perks["Side_L"])) + pl:getXp():setXPToLevel(Perks["Side_R"], pl:getPerkLevel(Perks["Side_R"])) + end + SyncXp(pl) + end + return Tests end)