diff --git a/media/lua/client/TOC_Checks.lua b/media/lua/client/TOC_Checks.lua index eb599cf..aa32262 100644 --- a/media/lua/client/TOC_Checks.lua +++ b/media/lua/client/TOC_Checks.lua @@ -10,17 +10,17 @@ function CheckIfCanBeCut(part_name) end -function CheckIfProsthesisAlreadyInstalled(toc_data, part_name) +function CheckIfProsthesisAlreadyInstalled(part_data, part_name) local r = "Right" local l = "Left" if string.find(part_name, r) then - return (toc_data[r .. "Hand"].is_prosthesis_equipped or toc_data[r .. "Forearm"].is_prosthesis_equipped) + return (part_data[r .. "_Hand"].is_prosthesis_equipped or part_data[r .. "_LowerArm"].is_prosthesis_equipped) elseif string.find(part_name, l) then - return (toc_data[l .. "Hand"].is_prosthesis_equipped or toc_data[l .. "Forearm"].is_prosthesis_equipped) + return (part_data[l .. "_Hand"].is_prosthesis_equipped or part_data[l .. "_LowerArm"].is_prosthesis_equipped) end @@ -30,9 +30,9 @@ end function CheckIfCanBeOperated(part_name) - local toc_data = getPlayer():getModData().TOC + local part_data = getPlayer():getModData().TOC.Limbs - return toc_data[part_name].is_operated == false and toc_data[part_name].is_amputation_shown + return part_data[part_name].is_operated == false and part_data[part_name].is_amputation_shown end diff --git a/media/lua/client/TOC_CommonFunctions.lua b/media/lua/client/TOC_CommonFunctions.lua index db94d18..ed978f5 100644 --- a/media/lua/client/TOC_CommonFunctions.lua +++ b/media/lua/client/TOC_CommonFunctions.lua @@ -28,7 +28,7 @@ function GetAcceptingProsthesisBodyPartTypes() end --- TODO Change name +-- TODO This is just convoluted. Do not use this function FindTocDataPartNameFromBodyPartType(toc_limbs_data, bodyPartType) if bodyPartType == BodyPartType.Hand_R then return toc_limbs_data.Right_Hand elseif bodyPartType == BodyPartType.ForeArm_R then return toc_limbs_data.Right_LowerArm diff --git a/media/lua/client/TOC_ContextMenus.lua b/media/lua/client/TOC_ContextMenus.lua index 2dd7068..0870d6e 100644 --- a/media/lua/client/TOC_ContextMenus.lua +++ b/media/lua/client/TOC_ContextMenus.lua @@ -66,21 +66,21 @@ TocContextMenus.CreateOperateWithOvenMenu = function(player, context, worldObjec -- TODO Add a way to move the player towards the oven - local toc_data = player_obj:getModData().TOC + local part_data = player_obj:getModData().TOC.Limbs local is_main_menu_already_created = false --local props = v:getSprite() and v:getSprite():getProperties() or nil - for k_stove, v_stove in pairs(worldObjects) do + for _, v_stove in pairs(worldObjects) do if instanceof(v_stove, "IsoStove") and (player_obj:HasTrait("Brave") or player_obj:getPerkLevel(Perks.Strength) >= 6) then -- Check temperature if v_stove:getCurrentTemperature() > 250 then - for k_bodypart, v_bodypart in ipairs(GetBodyParts()) do - if toc_data[v_bodypart].is_cut and toc_data[v_bodypart].is_amputation_shown and not toc_data[v_bodypart].is_operated then + for _, v_bodypart in ipairs(GetBodyParts()) do + if part_data[v_bodypart].is_cut and part_data[v_bodypart].is_amputation_shown and not part_data[v_bodypart].is_operated then local subMenu = context:getNew(context); if is_main_menu_already_created == false then @@ -125,16 +125,15 @@ end TocContextMenus.FillCutAndOperateMenus = function(local_player, clicked_player, world_objects, cut_menu, operate_menu) - local local_toc_data = local_player:getModData().TOC + local local_part_data = local_player:getModData().TOC.Limbs for _, v in ipairs(GetBodyParts()) do if local_player == clicked_player then -- Local player - if CheckIfCanBeCut(v) and not CheckIfProsthesisAlreadyInstalled(local_toc_data, v) then + if CheckIfCanBeCut(v) and not CheckIfProsthesisAlreadyInstalled(local_part_data, v) then cut_menu:addOption(getText('UI_ContextMenu_' .. v), _, TryTocAction, v, "Cut", local_player, local_player) - --cut_menu:addOption(getText('UI_ContextMenu_' .. v), _, TocCutLocal, local_player, local_player, v) elseif CheckIfCanBeOperated(v) then operate_menu:addOption(getText('UI_ContextMenu_' .. v), _, TryTocAction, v, "Operate", local_player, local_player) end diff --git a/media/lua/client/TOC_HelperFunctions.lua b/media/lua/client/TOC_HelperFunctions.lua index e6dccad..5a20ac2 100644 --- a/media/lua/client/TOC_HelperFunctions.lua +++ b/media/lua/client/TOC_HelperFunctions.lua @@ -1,7 +1,7 @@ -- CutLimb -- TODO if TheONlyCure. triggers an errors -function CheckIfStillInfected(toc_data) - if toc_data == nil then +function CheckIfStillInfected(part_data) + if part_data == nil then return end -- Check ALL body part types to check if the player is still gonna die @@ -9,12 +9,12 @@ function CheckIfStillInfected(toc_data) for _, v in ipairs(GetBodyParts()) do - if toc_data[v].is_infected then + if part_data[v].is_infected then check = true end end - if toc_data.is_other_bodypart_infected then + if part_data.is_other_bodypart_infected then check = true end @@ -40,14 +40,14 @@ end -- OperateLimb -function SetBodyPartsStatusAfterOperation(player, toc_data, part_name, use_oven) +function SetBodyPartsStatusAfterOperation(player, part_data, part_name, use_oven) --for _, v in ipairs(GetBodyParts()) do local body_part_type = player:getBodyDamage():getBodyPart(TocGetBodyPartTypeFromBodyPart(part_name)) FixSingleBodyPartType(body_part_type, use_oven) - for _, v in ipairs(toc_data[part_name].depends_on) do + for _, v in ipairs(part_data[part_name].depends_on) do local depended_body_part_type = player:getBodyDamage():getBodyPart(TocGetBodyPartTypeFromBodyPart(v)) FixSingleBodyPartType(depended_body_part_type, use_oven) diff --git a/media/lua/client/TOC_UI.lua b/media/lua/client/TOC_UI.lua index 235f367..d212070 100644 --- a/media/lua/client/TOC_UI.lua +++ b/media/lua/client/TOC_UI.lua @@ -60,9 +60,9 @@ local function GetImageName(part_name, toc_data) end -- If foreaerm equip, change hand - if part_name == "Right_Hand" and toc_data["Right_LowerArm"].is_prosthesis_equipped then + if part_name == "Right_Hand" and toc_data.Limbs["Right_LowerArm"].is_prosthesis_equipped then name = "media/ui/TOC/" .. part_name .. "/Hook.png" - elseif part_name == "Left_Hand" and toc_data["Left_LowerArm"].is_prosthesis_equipped then + elseif part_name == "Left_Hand" and toc_data.Limbs["Left_LowerArm"].is_prosthesis_equipped then name = "media/ui/TOC/" .. part_name .. "/Hook.png" end return name diff --git a/media/lua/client/TOC_Update.lua b/media/lua/client/TOC_Update.lua index e4f6dd8..995d45a 100644 --- a/media/lua/client/TOC_Update.lua +++ b/media/lua/client/TOC_Update.lua @@ -1,5 +1,7 @@ -- Makes the player drop an item if they don't have a limb or haven't equipped a prosthesis function TheOnlyCure.TryDropItem(player, toc_data) + + -- TODO this is old, was used in the update thing if TheOnlyCure.CheckIfCanPickUpItem(toc_data, Right, Hand, Forearm) and player:getPrimaryHandItem() ~= nil then if player:getPrimaryHandItem():getName() ~= "Bare Hands" then player:dropHandItems() @@ -18,6 +20,8 @@ end -- Helper for DropItem function TheOnlyCure.CheckIfCanPickUpItem(toc_data, side, limb, secondary_limb) + + -- TODO we can use this when uninstall prost or when cutting local full_primary_limb = side .. limb local full_secondary_limb = side .. secondary_limb @@ -33,10 +37,13 @@ function TheOnlyCure.CheckIfPlayerIsInfected(player, toc_data) local body_damage = player:getBodyDamage() for _, v in ipairs(GetLimbsBodyPartTypes()) do - local toc_bodypart = FindTocDataPartNameFromBodyPartType(toc_data.Limbs, v) - if body_damage:getBodyPart(v):bitten() and toc_bodypart ~= nil then - if toc_bodypart.is_cut == false then - toc_bodypart.is_infected = true + local part_name = FindTocBodyPartNameFromBodyPartType(v) + local part_data = toc_data.Limbs[part_name] + + + if body_damage:getBodyPart(v):bitten() and part_data ~= nil then + if part_data.is_cut == false then + part_data.is_infected = true player:transmitModData() end @@ -45,14 +52,14 @@ function TheOnlyCure.CheckIfPlayerIsInfected(player, toc_data) for _, v in ipairs(GetOtherBodyPartTypes()) do if body_damage:getBodyPart(v):bitten() then - toc_data.is_other_bodypart_infected = true -- Even one is enough, stop cycling if we find it + toc_data.Limbs.is_other_bodypart_infected = true -- Even one is enough, stop cycling if we find it player:transmitModData() break end end end -function TheOnlyCure.UpdatePlayerHealth(player, toc_data) +function TheOnlyCure.UpdatePlayerHealth(player, part_data) local body_damage = player:getBodyDamage() @@ -60,8 +67,8 @@ function TheOnlyCure.UpdatePlayerHealth(player, toc_data) if player:HasTrait("Insensitive") then body_damage:setPainReduction(49) end for i, part_name in pairs(GetBodyParts()) do - if toc_data[part_name].is_cut then - TheOnlyCure.HealSpecificPart(toc_data, part_name, player) + if part_data[part_name].is_cut then + TheOnlyCure.HealSpecificPart(part_data, part_name, player) end end @@ -72,7 +79,7 @@ function TheOnlyCure.UpdatePlayerHealth(player, toc_data) end --Helper function for UpdatePlayerHealth -function TheOnlyCure.HealSpecificPart(toc_data, part_name, player) +function TheOnlyCure.HealSpecificPart(part_data, part_name, player) local body_damage = player:getBodyDamage() @@ -98,7 +105,7 @@ function TheOnlyCure.HealSpecificPart(toc_data, part_name, player) -- Set max health - if toc_data[part_name].is_cicatrized and body_part_type:getHealth() > 80 then + if part_data[part_name].is_cicatrized and body_part_type:getHealth() > 80 then body_part_type:SetHealth(80) elseif body_part_type:getHealth() > 40 then body_part_type:SetHealth(40) @@ -114,7 +121,11 @@ function TheOnlyCure.HealSpecificPart(toc_data, part_name, player) -- Check if we can heal the infection if body_part_type:bitten() then body_part_type:SetBitten(false) - if not toc_data[part_name].is_other_bodypart_infected and not TheOnlyCure.CheckIfOtherLimbsAreInfected(toc_data, part_name) then + + + local is_other_bodypart_infected = player:getModData().TOC.Limbs.is_other_bodypart_infected + + if not is_other_bodypart_infected and not TheOnlyCure.CheckIfOtherLimbsAreInfected(part_data, part_name) then body_part_type:setInfected(false) body_part_type:setInfectionMortalityDuration(-1) body_part_type:setInfectionTime(-1) @@ -138,9 +149,9 @@ function TheOnlyCure.HealSpecificPart(toc_data, part_name, player) if body_part_type:getFractureTime()>0 then body_part_type:setFractureTime(0) end -- Cicatrization check - if toc_data[part_name].is_cut and not toc_data[part_name].is_cicatrized then - if toc_data[part_name].cicatrization_time < 0 then - toc_data[part_name].is_cicatrized = true + if part_data[part_name].is_cut and not part_data[part_name].is_cicatrized then + if part_data[part_name].cicatrization_time < 0 then + part_data[part_name].is_cicatrized = true -- TODO make this random if the player gets it or not --FIXME they're gonna stack!!!! @@ -158,9 +169,9 @@ function TheOnlyCure.HealSpecificPart(toc_data, part_name, player) end -- Phantom Pain - if toc_data[part_name].is_amputation_shown and ZombRand(1, 100) < 10 then + if part_data[part_name].is_amputation_shown and ZombRand(1, 100) < 10 then local added_pain - if toc_data[part_name].is_cauterized then added_pain = 60 else added_pain = 30 end + if part_data[part_name].is_cauterized then added_pain = 60 else added_pain = 30 end body_part_type:setAdditionalPain(ZombRand(1, added_pain)) end @@ -170,14 +181,14 @@ function TheOnlyCure.HealSpecificPart(toc_data, part_name, player) end --Helper function for UpdatePlayerHealth -function TheOnlyCure.CheckIfOtherLimbsAreInfected(toc_data, part_name) +function TheOnlyCure.CheckIfOtherLimbsAreInfected(part_data, part_name) local body_parts = GetBodyParts() body_parts[part_name] = nil for _,v in pairs(body_parts) do - if toc_data[v].is_infected then + if part_data[v].is_infected then return true end end @@ -200,7 +211,7 @@ function TheOnlyCure.UpdateEveryOneMinute() if toc_data ~= nil then --TheOnlyCure.TryDropItem(player, toc_data) -- TODO this must be set only in the cut\equipping function, not here TheOnlyCure.CheckIfPlayerIsInfected(player, toc_data) - TheOnlyCure.UpdatePlayerHealth(player, toc_data) + TheOnlyCure.UpdatePlayerHealth(player, toc_data.Limbs) end end diff --git a/media/lua/client/TOC_main.lua b/media/lua/client/TOC_main.lua index eb67180..48ba71c 100644 --- a/media/lua/client/TOC_main.lua +++ b/media/lua/client/TOC_main.lua @@ -20,7 +20,9 @@ function TheOnlyCure.InitTheOnlyCure(_, player) mod_data.TOC = { - Limbs = {}, + Limbs = { + is_other_bodypart_infected = false + }, Prosthesis = {}, Generic = {}, } @@ -159,6 +161,7 @@ function TheOnlyCure.CutLimb(part_name, surgeon_factor, bandage_table, painkille -- TODO Check if this works in MP through MENU UI local player = getPlayer() local toc_data = player:getModData().TOC + local part_data = toc_data.Limbs local body_part_type = player:getBodyDamage():getBodyPart(TocGetBodyPartTypeFromBodyPart(part_name)) local stats = player:getStats(); @@ -184,19 +187,19 @@ function TheOnlyCure.CutLimb(part_name, surgeon_factor, bandage_table, painkille -- Remove object in hand -- TODO do this - if toc_data[part_name].is_cut == false then - toc_data[part_name].is_cut = true - toc_data[part_name].is_amputation_shown = true - toc_data[part_name].cicatrization_time = toc_data[part_name].cicatrization_base_time - surgeon_factor * 50 + if part_data[part_name].is_cut == false then + part_data[part_name].is_cut = true + part_data[part_name].is_amputation_shown = true + part_data[part_name].cicatrization_time = part_data[part_name].cicatrization_base_time - surgeon_factor * 50 -- Heal the infection here local body_damage = player:getBodyDamage() - if toc_data[part_name].is_infected and body_damage.getInfectionLevel() < 20 then - toc_data[part_name].is_infected = false + if part_data[part_name].is_infected and body_damage.getInfectionLevel() < 20 then + part_data[part_name].is_infected = false body_part_type:SetBitten(false) -- Second check, let's see if there is any other infected limb. - if CheckIfStillInfected(toc_data) == false then + if CheckIfStillInfected(part_data) == false then CureInfection(body_damage) getPlayer():Say("I'm gonna be fine") else @@ -205,10 +208,10 @@ function TheOnlyCure.CutLimb(part_name, surgeon_factor, bandage_table, painkille end -- Cut the depended part - for _, depended_v in pairs(toc_data[part_name].depends_on) do - toc_data[depended_v].is_cut = true - toc_data[depended_v].is_amputation_shown = false -- TODO why was it true before? - toc_data[depended_v].cicatrization_time = toc_data[part_name].cicatrization_base_time - surgeon_factor * 50 + for _, depended_v in pairs(part_data[part_name].depends_on) do + part_data[depended_v].is_cut = true + part_data[depended_v].is_amputation_shown = false -- TODO why was it true before? + part_data[depended_v].cicatrization_time = part_data[part_name].cicatrization_base_time - surgeon_factor * 50 end --Equip model for amputation @@ -226,7 +229,7 @@ end function TheOnlyCure.OperateLimb(part_name, surgeon_factor, use_oven) local player = getPlayer() - local toc_data = player:getModData().TOC + local part_data = player:getModData().TOC.Limbs if use_oven then local stats = player:getStats() @@ -234,20 +237,20 @@ function TheOnlyCure.OperateLimb(part_name, surgeon_factor, use_oven) stats:setStress(100) end - if toc_data[part_name].is_operated == false and toc_data[part_name].is_cut == true then - toc_data[part_name].is_operated = true - toc_data[part_name].cicatrization_time = toc_data[part_name].cicatrization_time - (surgeon_factor * 200) - if use_oven then toc_data[part_name].is_cauterized = true end - for _, depended_v in pairs(toc_data[part_name].depends_on) do - toc_data[depended_v].is_operated = true - toc_data[depended_v].cicatrization_time = toc_data[depended_v].cicatrization_time - (surgeon_factor * 200) - if use_oven then toc_data[depended_v].is_cauterized = true end -- TODO does this make sense? + if part_data[part_name].is_operated == false and part_data[part_name].is_cut == true then + part_data[part_name].is_operated = true + part_data[part_name].cicatrization_time = part_data[part_name].cicatrization_time - (surgeon_factor * 200) + if use_oven then part_data[part_name].is_cauterized = true end + for _, depended_v in pairs(part_data[part_name].depends_on) do + part_data[depended_v].is_operated = true + part_data[depended_v].cicatrization_time = part_data[depended_v].cicatrization_time - (surgeon_factor * 200) + if use_oven then part_data[depended_v].is_cauterized = true end -- TODO does this make sense? end end - SetBodyPartsStatusAfterOperation(player, toc_data, part_name, use_oven) + SetBodyPartsStatusAfterOperation(player, part_data, part_name, use_oven) player:transmitModData() end diff --git a/media/lua/client/TimedActions/ISUninstallProsthesis.lua b/media/lua/client/TimedActions/ISUninstallProsthesis.lua index 53054e4..63598b0 100644 --- a/media/lua/client/TimedActions/ISUninstallProsthesis.lua +++ b/media/lua/client/TimedActions/ISUninstallProsthesis.lua @@ -56,9 +56,6 @@ function ISUninstallProsthesis:perform() print("Found prost in " .. part_name) if part_name then toc_data.Limbs[part_name].is_prosthesis_equipped = false - --toc_data.Limbs[part_name].prosthesis_factor = 1 -- TODO This is wrong - - --local side = string.gsub(part_name, "Hand" or "Forearm", "") local item_full_type = self.item:getFullType() print("Searching for " .. item_full_type) for _, prost_v in ipairs(GetProsthesisList()) do diff --git a/media/lua/client/TimedActions/OverridenFunctions.lua b/media/lua/client/TimedActions/OverridenFunctions.lua index 815c731..4dca05e 100644 --- a/media/lua/client/TimedActions/OverridenFunctions.lua +++ b/media/lua/client/TimedActions/OverridenFunctions.lua @@ -11,7 +11,7 @@ function ISBaseTimedAction:adjustMaxTime(maxTime) local original_max_time = og_ISEquipTimedActionAdjustMaxTime(self, maxTime) -- TODO will it work? local modified_max_time = original_max_time - local toc_data = getPlayer():getModData().TOC + local part_data = getPlayer():getModData().TOC.Limbs local burn_factor = 1.3 -- To make it faster, let's have everything already written in another func @@ -21,17 +21,16 @@ function ISBaseTimedAction:adjustMaxTime(maxTime) -- TODO this gets awfully slow really quick, doesn't even make much sense. for _, part_name in ipairs(all_body_parts) do - - if toc_data.Limbs[part_name].is_cut then + if part_data[part_name].is_cut then - if toc_data.Limbs[part_name].is_prosthesis_equipped then - modified_max_time = modified_max_time * toc_data.Limbs[part_name].equipped_prosthesis.prosthesis_factor + if part_data[part_name].is_prosthesis_equipped then + modified_max_time = modified_max_time * part_data[part_name].equipped_prosthesis.prosthesis_factor else modified_max_time = modified_max_time * 2 end - if toc_data.Limbs[part_name].is_cauterized then + if part_data[part_name].is_cauterized then modified_max_time = modified_max_time * burn_factor end @@ -61,18 +60,18 @@ local og_ISEquipWeaponActionPerform = ISEquipWeaponAction.perform function ISEquipWeaponAction:perform() og_ISEquipWeaponActionPerform(self) - local toc_data = self.character:getModData().TOC + local part_data = self.character:getModData().TOC.Limbs local can_be_held = {} for _, side in ipairs ({"Left", "Right"}) do can_be_held[side] = true - if toc_data[side .. "Hand"].is_cut then - if toc_data[side .. "Forearm"].is_cut then - if not toc_data[side .. "Forearm"].is_prosthesis_equipped then + 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 toc_data[side .. "Hand"].is_prosthesis_equipped then + elseif not part_data[side .. "_Hand"].is_prosthesis_equipped then can_be_held[side] = false end end