From aadbe02df42515dc3ba69b24dcb1612d400b1eab Mon Sep 17 00:00:00 2001 From: ZioPao Date: Sun, 5 May 2024 00:14:37 +0200 Subject: [PATCH 1/2] Fixed sync with server after setup to prevent issues with medical check --- .../client/TOC/Controllers/DataController.lua | 18 ++++++++++++++---- media/lua/server/TOC/ServerDataHandler.lua | 8 +++++++- media/lua/shared/TOC/StaticData.lua | 2 +- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/media/lua/client/TOC/Controllers/DataController.lua b/media/lua/client/TOC/Controllers/DataController.lua index 9157b43..eaaa512 100644 --- a/media/lua/client/TOC/Controllers/DataController.lua +++ b/media/lua/client/TOC/Controllers/DataController.lua @@ -57,6 +57,7 @@ function DataController:setup(key) ---@type tocModDataType self.tocData = { -- Generic stuff that does not belong anywhere else + isInitializing = true, isIgnoredPartInfected = false, isAnyLimbCut = false, limbs = {}, @@ -86,9 +87,16 @@ function DataController:setup(key) } end - -- Add it to global mod data + -- Add it to client global mod data ModData.add(key, self.tocData) + -- Sync with the server + self:apply() + + -- -- Disable lock + -- self.tocData.isInitializing = false + -- ModData.add(key, self.tocData) + end ---In case of desync between the table on ModData and the table here @@ -100,7 +108,7 @@ function DataController:applyOnlineData(tocData) end ---@param key string -function DataController:loadLocalData(key) +function DataController:tryLoadLocalData(key) self.tocData = ModData.get(key) --TOC_DEBUG.printTable(self.tocData) @@ -389,6 +397,7 @@ function DataController.ReceiveData(key, data) -- TODO Add update from server scenario if handler.isResetForced then + TOC_DEBUG.print("Forced reset") handler:setup(key) elseif data then if data.isUpdateFromServer then @@ -396,7 +405,8 @@ function DataController.ReceiveData(key, data) end handler:applyOnlineData(data) elseif username == getPlayer():getUsername() then - handler:loadLocalData(key) + TOC_DEBUG.print("loading local data") + handler:tryLoadLocalData(key) end @@ -436,7 +446,7 @@ Events.OnReceiveGlobalModData.Add(DataController.ReceiveData) --- SP Only initialization ---@param key string function DataController:initSinglePlayer(key) - self:loadLocalData(key) + self:tryLoadLocalData(key) if self.tocData == nil or self.isResetForced then self:setup(key) end diff --git a/media/lua/server/TOC/ServerDataHandler.lua b/media/lua/server/TOC/ServerDataHandler.lua index 253ff67..e302f46 100644 --- a/media/lua/server/TOC/ServerDataHandler.lua +++ b/media/lua/server/TOC/ServerDataHandler.lua @@ -29,12 +29,18 @@ function ServerDataHandler.AddTable(key, table) --TOC_DEBUG.printTable(table) -- Set that the data has been modified and it's updated on the server - table.isUpdateFromServer = true + table.isUpdateFromServer = true -- FIX this is useless ModData.add(key, table) -- Add it to the server mod data ServerDataHandler.modData[key] = table + -- if table.isInitializing == true then + -- TOC_DEBUG.print("Applied data after setup") + -- table.isInitializing = false + -- end + + -- Since this could be triggered by a different client than the one referenced in the key, we're gonna -- apply the changes back to the key client again to be sure that everything is in sync local username = CommandsData.GetUsername(key) diff --git a/media/lua/shared/TOC/StaticData.lua b/media/lua/shared/TOC/StaticData.lua index 7d8d168..2d3c47f 100644 --- a/media/lua/shared/TOC/StaticData.lua +++ b/media/lua/shared/TOC/StaticData.lua @@ -2,7 +2,7 @@ ---@alias limbsTable {Hand_L : partDataType, ForeArm_L : partDataType, UpperArm_L : partDataType, Hand_R : partDataType, ForeArm_R : partDataType, UpperArm_R : partDataType } ---@alias prosthesisData {isProstEquipped : boolean, prostFactor : number } ---@alias prosthesesTable {Top_L : prosthesisData, Top_R : prosthesisData } -- TODO add Bottom_L and Bottom_R ----@alias tocModDataType { limbs : limbsTable, prostheses : prosthesesTable, isIgnoredPartInfected : boolean, isAnyLimbCut : boolean, isUpdateFromServer : boolean } +---@alias tocModDataType { limbs : limbsTable, prostheses : prosthesesTable, isIgnoredPartInfected : boolean, isAnyLimbCut : boolean, isUpdateFromServer : boolean, isInitializing : boolean} --------------------------- From 5cc982188a89d2744730cb2d1e1d5731cf7ab1aa Mon Sep 17 00:00:00 2001 From: ZioPao Date: Sun, 5 May 2024 00:47:50 +0200 Subject: [PATCH 2/2] Fixed prosthesis not working correctly --- .../Controllers/LimitActionsController.lua | 23 ++++++++++++------- .../TOC/Controllers/LocalPlayerController.lua | 12 +++++++++- media/lua/client/TOC/Events.lua | 1 + .../client/TOC/Handlers/CachedDataHandler.lua | 2 ++ .../client/TOC/Handlers/ProsthesisHandler.lua | 17 ++++++++------ media/lua/server/TOC/ServerDataHandler.lua | 9 +------- 6 files changed, 40 insertions(+), 24 deletions(-) diff --git a/media/lua/client/TOC/Controllers/LimitActionsController.lua b/media/lua/client/TOC/Controllers/LimitActionsController.lua index 48a042e..e34d71f 100644 --- a/media/lua/client/TOC/Controllers/LimitActionsController.lua +++ b/media/lua/client/TOC/Controllers/LimitActionsController.lua @@ -15,8 +15,12 @@ local StaticData = require("TOC/StaticData") -- a prosthesis on, that can trigger random bleeds. local function CheckHandFeasibility(limbName) + TOC_DEBUG.print("Checking hand feasibility: " .. limbName) local dcInst = DataController.GetInstance() - return not dcInst:getIsCut(limbName) or dcInst:getIsProstEquipped(limbName) + + local isFeasible = not dcInst:getIsCut(limbName) or dcInst:getIsProstEquipped(limbName) + TOC_DEBUG.print("isFeasible: " .. tostring(isFeasible)) + return isFeasible end @@ -107,6 +111,8 @@ end ---A recreation of the original method, but with amputations in mind ---@param dcInst DataController function ISEquipWeaponAction:performWithAmputation(dcInst) + + TOC_DEBUG.print("running ISEquipWeaponAction performWithAmputation") local hand = nil local otherHand = nil local getMethodFirst = nil @@ -130,6 +136,10 @@ function ISEquipWeaponAction:performWithAmputation(dcInst) setMethodSecond = self.character.setSecondaryHandItem end + local isFirstValid = CheckHandFeasibility(hand) + local isSecondValid = CheckHandFeasibility(otherHand) + + if not self.twoHands then if getMethodFirst(self.character) and getMethodFirst(self.character):isRequiresEquippedBothHands() then setMethodFirst(self.character, nil) @@ -145,10 +155,10 @@ function ISEquipWeaponAction:performWithAmputation(dcInst) setMethodSecond(self.character, nil) -- TODO We should use the CachedData indexable instead of dcInst - if not dcInst:getIsCut(hand) then + if isFirstValid then setMethodSecond(self.character, self.item) -- Check other HAND! - elseif not dcInst:getIsCut(otherHand) then + elseif isSecondValid then setMethodFirst(self.character, self.item) end end @@ -156,13 +166,10 @@ function ISEquipWeaponAction:performWithAmputation(dcInst) setMethodFirst(self.character, nil) setMethodSecond(self.character, nil) - - local isFirstValid = CheckHandFeasibility(hand) - local isSecondValid = CheckHandFeasibility(otherHand) -- TOC_DEBUG.print("First Hand: " .. tostring(hand)) - -- TOC_DEBUG.print("Prost Group: " .. tostring(prostGroup)) + -- --TOC_DEBUG.print("Prost Group: " .. tostring(prostGroup)) -- TOC_DEBUG.print("Other Hand: " .. tostring(otherHand)) - -- TOC_DEBUG.print("Other Prost Group: " .. tostring(otherProstGroup)) + -- --TOC_DEBUG.print("Other Prost Group: " .. tostring(otherProstGroup)) -- TOC_DEBUG.print("isPrimaryHandValid: " .. tostring(isFirstValid)) -- TOC_DEBUG.print("isSecondaryHandValid: " .. tostring(isSecondValid)) diff --git a/media/lua/client/TOC/Controllers/LocalPlayerController.lua b/media/lua/client/TOC/Controllers/LocalPlayerController.lua index 24bdc65..73fc2a0 100644 --- a/media/lua/client/TOC/Controllers/LocalPlayerController.lua +++ b/media/lua/client/TOC/Controllers/LocalPlayerController.lua @@ -354,10 +354,20 @@ function LocalPlayerController.DropItemsAfterAmputation(limbName) end end end + + -- TODO Consider 2 handed weapons too + + -- equipped items too + if side == "R" then + pl:setPrimaryHandItem(nil) + elseif side == "L" then + pl:setSecondaryHandItem(nil) + end + end Events.OnAmputatedLimb.Add(LocalPlayerController.DropItemsAfterAmputation) - +Events.OnProsthesisUnequipped.Add(LocalPlayerController.DropItemsAfterAmputation) diff --git a/media/lua/client/TOC/Events.lua b/media/lua/client/TOC/Events.lua index 13b9246..0d3b4c9 100644 --- a/media/lua/client/TOC/Events.lua +++ b/media/lua/client/TOC/Events.lua @@ -1,3 +1,4 @@ --* Setup Events *-- LuaEventManager.AddEvent("OnAmputatedLimb") --Triggered when a limb has been amputated +LuaEventManager.AddEvent("OnProsthesisUnequipped") LuaEventManager.AddEvent("OnReceivedTocData") -- Triggered when TOC data is ready diff --git a/media/lua/client/TOC/Handlers/CachedDataHandler.lua b/media/lua/client/TOC/Handlers/CachedDataHandler.lua index 77aa059..2d6330d 100644 --- a/media/lua/client/TOC/Handlers/CachedDataHandler.lua +++ b/media/lua/client/TOC/Handlers/CachedDataHandler.lua @@ -111,6 +111,8 @@ end + + --* Hand feasibility caching *-- CachedDataHandler.handFeasibility = {} diff --git a/media/lua/client/TOC/Handlers/ProsthesisHandler.lua b/media/lua/client/TOC/Handlers/ProsthesisHandler.lua index afdd5f6..cfb4943 100644 --- a/media/lua/client/TOC/Handlers/ProsthesisHandler.lua +++ b/media/lua/client/TOC/Handlers/ProsthesisHandler.lua @@ -70,11 +70,10 @@ function ProsthesisHandler.CheckIfEquippable(fullType) return false end - ---Handle equipping or unequipping prosthetics ---@param item InventoryItem ---@param isEquipping boolean ----@return boolean +---@return boolean function ProsthesisHandler.SearchAndSetupProsthesis(item, isEquipping) if not ProsthesisHandler.CheckIfProst(item) then return false end @@ -100,7 +99,7 @@ local function HandleProsthesisValidation(item, isEquippable) local isProst = ProsthesisHandler.CheckIfProst(item) if not isProst then return isEquippable end - local fullType = item:getFullType() -- use fulltype for side + local fullType = item:getFullType() -- use fulltype for side if isEquippable then isEquippable = ProsthesisHandler.CheckIfEquippable(fullType) else @@ -133,8 +132,6 @@ function ISClothingExtraAction:isValid() return HandleProsthesisValidation(testItem, isEquippable) end - - --[[ Horrendous workaround @@ -161,7 +158,6 @@ function ISClothingExtraAction:perform() if isProst then group:setMultiItem("TOC_ArmProst", true) end - end local og_ISUnequipAction_perform = ISUnequipAction.perform @@ -176,8 +172,15 @@ function ISUnequipAction:perform() if isProst then group:setMultiItem("TOC_ArmProst", true) + + -- we need to fetch the limbname associated to the prosthesis + local side = CommonMethods.GetSide(self.item:getFullType()) + local highestAmputatedLimbs = CachedDataHandler.GetHighestAmputatedLimbs(getPlayer():getUsername()) + if highestAmputatedLimbs then + local hal = highestAmputatedLimbs[side] + triggerEvent("OnProsthesisUnequipped", hal) + end end end - return ProsthesisHandler diff --git a/media/lua/server/TOC/ServerDataHandler.lua b/media/lua/server/TOC/ServerDataHandler.lua index e302f46..68fea34 100644 --- a/media/lua/server/TOC/ServerDataHandler.lua +++ b/media/lua/server/TOC/ServerDataHandler.lua @@ -29,18 +29,11 @@ function ServerDataHandler.AddTable(key, table) --TOC_DEBUG.printTable(table) -- Set that the data has been modified and it's updated on the server - table.isUpdateFromServer = true -- FIX this is useless + table.isUpdateFromServer = true -- FIX this is useless as of now ModData.add(key, table) -- Add it to the server mod data ServerDataHandler.modData[key] = table - - -- if table.isInitializing == true then - -- TOC_DEBUG.print("Applied data after setup") - -- table.isInitializing = false - -- end - - -- Since this could be triggered by a different client than the one referenced in the key, we're gonna -- apply the changes back to the key client again to be sure that everything is in sync local username = CommandsData.GetUsername(key)