From af85135fb6824726dc4db5cfd642ea20f5b918e7 Mon Sep 17 00:00:00 2001 From: Pao Date: Fri, 27 Jan 2023 11:07:23 +0100 Subject: [PATCH] Added compatibility with Fancy Handwork --- .vscode/settings.json | 8 +- media/lua/client/TOC_HelperFunctions.lua | 21 +++- media/lua/client/TOC_ModCompatibility.lua | 109 ++++++++++++++++++++ media/lua/client/TOC_OverridenFunctions.lua | 25 ++--- 4 files changed, 143 insertions(+), 20 deletions(-) create mode 100644 media/lua/client/TOC_ModCompatibility.lua diff --git a/.vscode/settings.json b/.vscode/settings.json index aa6e2cd..9302fba 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -44,6 +44,12 @@ "BloodBodyPartType", "ISInventoryPane", "ModData", - "isDebugEnabled" + "isDebugEnabled", + "getActivatedMods", + "ISHotbar", + "isForceDropHeavyItem", + "isFHModKeyDown", + "getPlayerData", + "FHSwapHandsAction" ] } \ No newline at end of file diff --git a/media/lua/client/TOC_HelperFunctions.lua b/media/lua/client/TOC_HelperFunctions.lua index fe19315..f7719b3 100644 --- a/media/lua/client/TOC_HelperFunctions.lua +++ b/media/lua/client/TOC_HelperFunctions.lua @@ -92,7 +92,6 @@ function TocDamagePlayerDuringAmputation(patient, part_name) body_damage_part:setBleedingTime(ZombRand(10, 20)) end ----@param body_part BodyPartType ---@param heal_bite boolean function TocSetParametersForMissingLimb(body_part, heal_bite) body_part:setBleeding(false) @@ -251,3 +250,23 @@ function CheckIfItemIsInstalledProsthesis(item) end end + +function TocPopulateCanBeHeldTable(can_be_held, limbs_data) + + for _, side in ipairs(TOC_sides) do + can_be_held[side] = true + + if limbs_data[side .. "_Hand"].is_cut then + if limbs_data[side .. "_LowerArm"].is_cut then + if not limbs_data[side .. "_LowerArm"].is_prosthesis_equipped then + can_be_held[side] = false + end + elseif not limbs_data[side .. "_Hand"].is_prosthesis_equipped then + can_be_held[side] = false + end + end + end + + return + +end \ No newline at end of file diff --git a/media/lua/client/TOC_ModCompatibility.lua b/media/lua/client/TOC_ModCompatibility.lua new file mode 100644 index 0000000..50d754c --- /dev/null +++ b/media/lua/client/TOC_ModCompatibility.lua @@ -0,0 +1,109 @@ +--------------------------------- +-- Compatibility for various mods +--------------------------------- + +local function OverrideFancyHandwork() + if getActivatedMods():contains('FancyHandwork') == false then return end + + + + local og_ISHotbar_equipItem = ISHotbar.equipItem + + function ISHotbar:equipItem(item) + print("TOC: Overriding FancyHandwork methods") + local mod = isFHModKeyDown() + local primary = self.chr:getPrimaryHandItem() + local secondary = self.chr:getSecondaryHandItem() + local equip = true + + local limbs_data = getPlayer():getModData().TOC.Limbs + local can_be_held = {} + TocPopulateCanBeHeldTable(can_be_held, limbs_data) + + + for _, test in pairs(can_be_held) do + print(test) + end + --ISInventoryPaneContextMenu.transferIfNeeded(self.chr, item) + + -- If we already have the item equipped + if (primary and primary == item) or (secondary and secondary == item) then + ISTimedActionQueue.add(ISUnequipAction:new(self.chr, item, 20)) + equip = false + end + + -- If we didn't just do something + if equip then + -- Handle holding big objects + if primary and isForceDropHeavyItem(primary) then + ISTimedActionQueue.add(ISUnequipAction:new(self.chr, primary, 50)) + ----- treat "equip" as if we have something equipped from here down + equip = false + end + if mod then + -- If we still have something equipped in secondary, unequip + if secondary and equip and can_be_held["Left"] then + ISTimedActionQueue.add(ISUnequipAction:new(self.chr, secondary, 20)) + end + + if can_be_held["Left"] then + ISTimedActionQueue.add(ISEquipWeaponAction:new(self.chr, item, 20, false, item:isTwoHandWeapon())) + else + ISTimedActionQueue.add(ISEquipWeaponAction:new(self.chr, item, 20, true, item:isTwoHandWeapon())) + + end + else + -- If we still have something equipped in primary, unequip + if primary and equip and can_be_held["Right"] then + ISTimedActionQueue.add(ISUnequipAction:new(self.chr, primary, 20)) + end + -- Equip Primary + if can_be_held["Right"] then + ISTimedActionQueue.add(ISEquipWeaponAction:new(self.chr, item, 20, true, item:isTwoHandWeapon())) + else + ISTimedActionQueue.add(ISEquipWeaponAction:new(self.chr, item, 20, false, item:isTwoHandWeapon())) + + end + end + end + + self.chr:getInventory():setDrawDirty(true) + getPlayerData(self.chr:getPlayerNum()).playerInventory:refreshBackpacks() + end + + + + local og_FHSwapHandsAction = FHSwapHandsAction.start + + function FHSwapHandsAction:start() + local limbs_data = getPlayer():getModData().TOC.Limbs + local can_be_held = {} + TocPopulateCanBeHeldTable(can_be_held, limbs_data) + + + if self.itemL and can_be_held["Right"] then + self.itemL:setJobType(getText("ContextMenu_Equip_Primary") .. " " .. self.itemL:getName()) + self.itemL:setJobDelta(0.0) + + else + self:stop() + return + end + + if self.itemR and can_be_held["Left"] then + self.itemR:setJobType(getText("ContextMenu_Equip_Secondary") .. " " .. self.itemR:getName()) + self.itemR:setJobDelta(0.0) + else + self:stop() + return + end + + self:setActionAnim("EquipItem") + self:setOverrideHandModels(self.itemR, self.itemL) + + end + +end + + +Events.OnGameStart.Add(OverrideFancyHandwork) \ No newline at end of file diff --git a/media/lua/client/TOC_OverridenFunctions.lua b/media/lua/client/TOC_OverridenFunctions.lua index 0236cd9..94de3f3 100644 --- a/media/lua/client/TOC_OverridenFunctions.lua +++ b/media/lua/client/TOC_OverridenFunctions.lua @@ -10,10 +10,10 @@ function ISBaseTimedAction:adjustMaxTime(maxTime) -- TODO Make the malus for time a little less awful and add some other malus, like fitness and stuff - print("TOC: Input max time " .. tostring(maxTime)) + --print("TOC: Input max time " .. tostring(maxTime)) local original_max_time = og_ISEquipTimedActionAdjustMaxTime(self, maxTime) - print("TOC: Return original max time: " .. tostring(original_max_time)) + --print("TOC: Return original max time: " .. tostring(original_max_time)) if original_max_time ~= -1 then @@ -61,7 +61,7 @@ function ISBaseTimedAction:adjustMaxTime(maxTime) if modified_max_time > 10 * original_max_time then modified_max_time = 10 * original_max_time end - print("TOC: Modified Max Time " .. modified_max_time) + --print("TOC: Modified Max Time " .. modified_max_time) return modified_max_time else @@ -124,24 +124,13 @@ end local og_ISEquipWeaponActionPerform = ISEquipWeaponAction.perform function ISEquipWeaponAction:perform() + -- TODO this is only for weapons, not items. Won't work for everything I think + --TODO Block it before even performing -- TODO in the inventory menu there is something broken, even though this works og_ISEquipWeaponActionPerform(self) - local part_data = self.character:getModData().TOC.Limbs + local limbs_data = self.character:getModData().TOC.Limbs local can_be_held = {} - - for _, side in ipairs(TOC_sides) do - can_be_held[side] = true - - if part_data[side .. "_Hand"].is_cut then - if part_data[side .. "_LowerArm"].is_cut then - if not part_data[side .. "_LowerArm"].is_prosthesis_equipped then - can_be_held[side] = false - end - elseif not part_data[side .. "_Hand"].is_prosthesis_equipped then - can_be_held[side] = false - end - end - end + TocPopulateCanBeHeldTable(can_be_held, limbs_data) if not self.item:isRequiresEquippedBothHands() then if can_be_held["Right"] and not can_be_held["Left"] then