Better handling of items in containers

This commit is contained in:
ZioPao
2023-11-10 12:37:38 +01:00
parent 7424f45ae3
commit 7813d242e8
5 changed files with 85 additions and 30 deletions

View File

@@ -1,6 +1,7 @@
local ModDataHandler = require("Handlers/TOC_ModDataHandler")
local StaticData = require("TOC_StaticData")
local ItemsHandler = require("Handlers/TOC_ItemsHandler")
local PlayerHandler = require("Handlers/TOC_PlayerHandler")
---------------------------
@@ -50,27 +51,30 @@ function AmputationHandler:damageDuringAmputation()
end
---Execute the amputation
function AmputationHandler:execute()
---@param damagePlayer boolean?
function AmputationHandler:execute(damagePlayer)
-- TODO Calculate surgeonStats
-- TODO Cap it to a certain amount, it shouldn't be more than ...?
local surgeonFactor = 1
if damagePlayer == nil then damagePlayer = true end -- Default at true
if damagePlayer then
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)
end
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, surgeonFactor)
@@ -78,11 +82,10 @@ function AmputationHandler:execute()
-- Give the player the correct amputation item
ItemsHandler.DeleteOldAmputationItem(self.patient, self.limbName)
ItemsHandler.SpawnAmputationItem(self.patient, self.limbName)
end
---Force the execution of the amputation for a trait
function AmputationHandler:executeForTrait()
ModDataHandler.GetInstance():setCutLimb(self.limbName, true, true, true, 0)
-- Add it to the list of cut limbs
PlayerHandler.AddLocalAmputatedLimb(self.limbName)
end
---Deletes the instance
@@ -90,5 +93,11 @@ function AmputationHandler:close()
AmputationHandler.instance = nil
end
--* Events *--
function AmputationHandler.UpdateCicatrization()
if ModDataHandler.GetInstance():getIsAnyLimbCut() == false then return end
end
return AmputationHandler

View File

@@ -1,5 +1,6 @@
local StaticData = require("TOC_StaticData")
local CommonMethods = require("TOC_Common")
local PlayerHandler = require("Handlers/TOC_PlayerHandler")
---------------------------
@@ -98,6 +99,27 @@ function ItemsHandler.SpawnAmputationItem(playerObj, limbName)
playerObj:setWornItem(clothingItem:getBodyLocation(), clothingItem)
end
--------------------------
--* Overrides *--
local og_ISInventoryPane_refreshContainer = ISInventoryPane.refreshContainer
---Get the list of items for the container and remove the amputations
function ISInventoryPane:refreshContainer()
-- Search into the container and remove the reference to the amputation item
og_ISInventoryPane_refreshContainer(self)
for i=1, #self.itemslist do
local cItem = self.itemslist[i]
if cItem and cItem.cat == "Amputation" then
--print("TOC: current item is an amputation, removing it from the list")
table.remove(self.itemslist, i)
end
end
end
return ItemsHandler

View File

@@ -1,12 +1,12 @@
local ModDataHandler = require("Handlers/TOC_ModDataHandler")
local AmputationHandler = require("Handlers/TOC_AmputationHandler")
local ItemsHandler = require("Handlers/TOC_ItemsHandler")
local CommonMethods = require("TOC_Common")
local StaticData = require("TOC_StaticData")
-----------
-- TODO We should instantiate this anyway if we want to keep track of cut limbs here. Doing so, we would be able to handle other players too
-- LIST OF STUFF THAT THIS CLASS NEEDS TO DO
-- Keep track of cut limbs so that we don't have to loop through all of them all the time
-- Update current player status (infection checks)
-- handle stats increase\decrease
@@ -24,9 +24,20 @@ function PlayerHandler.InitializePlayer(_, playerObj, isForced)
PlayerHandler.modDataHandler:setup(isForced)
PlayerHandler.playerObj = playerObj
-- Calculate amputated limbs at startup
PlayerHandler.amputatedLimbs = {}
for i=1, #StaticData.LIMBS_STRINGS do
local limbName = StaticData.LIMBS_STRINGS[i]
if PlayerHandler.modDataHandler:getIsCut(limbName) then
PlayerHandler.AddLocalAmputatedLimb(limbName)
end
end
-- Since isForced is used to reset an existing player data, we're gonna clean their ISHealthPanel table too
if isForced then
ISHealthPanel.highestAmputations = {}
local ItemsHandler = require("Handlers/TOC_ItemsHandler")
ItemsHandler.DeleteAllOldAmputationItems(playerObj)
end
end
@@ -34,11 +45,12 @@ end
---Handles the traits
---@param playerObj IsoPlayer
function PlayerHandler.ManageTraits(playerObj)
local AmputationHandler = require("Handlers/TOC_AmputationHandler")
for k, v in pairs(StaticData.TRAITS_BP) do
if playerObj:HasTrait(k) then
-- Once we find one, we should be done.
local tempHandler = AmputationHandler:new(v)
tempHandler:executeForTrait()
tempHandler:execute(false) -- No damage
tempHandler:close()
return
end
@@ -46,6 +58,18 @@ function PlayerHandler.ManageTraits(playerObj)
end
---Cache the currently amputated limbs
---@param limbName string
function PlayerHandler.AddLocalAmputatedLimb(limbName)
print("TOC: added " .. limbName .. " to known amputated limbs")
table.insert(PlayerHandler.amputatedLimbs, limbName)
end
--* Getters *--
function PlayerHandler.GetAmputatedLimbs()
return PlayerHandler.amputatedLimbs or {}
end
--* Events *--
---Check if the player has an infected (as in, zombie infection) body part
@@ -100,20 +124,21 @@ function PlayerHandler.UpdatePerks(player)
end
end
Events.OnPlayerUpdate.Add(PlayerHandler.UpdatePerks)
--Events.OnPlayerUpdate.Add(PlayerHandler.UpdatePerks)
--* Some overrides *--
local og_ISBaseTimedAction_adjustMaxTime = ISBaseTimedAction.adjustMaxTime
--- Adjust time
function ISBaseTimedAction:adjustMaxTime(maxTime)
local time = og_ISBaseTimedAction_adjustMaxTime(self, maxTime)
local modDataHandler = ModDataHandler.GetInstance()
if time ~= -1 and modDataHandler and modDataHandler:getIsAnyLimbCut() then
local pl = getPlayer()
for i=1, #StaticData.LIMBS_STRINGS do
local limbName = StaticData.LIMBS_STRINGS[i]
for i=1, #PlayerHandler.amputatedLimbs do
local limbName = PlayerHandler.amputatedLimbs[i]
if modDataHandler:getIsCut(limbName) then
local perk = Perks["Side_" .. CommonMethods.GetSide(limbName)]
local perkLevel = pl:getPerkLevel(perk)
@@ -127,6 +152,7 @@ function ISBaseTimedAction:adjustMaxTime(maxTime)
end
local og_ISBaseTimedAction_perform = ISBaseTimedAction.perform
--- After each action, level up perks
function ISBaseTimedAction:perform()
og_ISBaseTimedAction_perform(self)
@@ -142,7 +168,4 @@ end
return PlayerHandler