nolanri Posted March 8, 2017 Share Posted March 8, 2017 (edited) Spoiler --[[ Injury Detection And Armor Based Injury Blocking By Nolan Ritchie ]] function loadArmorToPlayer(Armor, player) ArmorSaveBodyDamage(player); loadArmor(Armor); end function getBodyPartDisplayName(TypeIn) BPType = tostring(TypeIn); if(BPType == "Foot_L") then return "Left Foot"; elseif(BPType == "Foot_R") then return "Right Foot"; elseif(BPType == "ForeArm_L") then return "Left Fore Arm"; elseif(BPType == "ForeArm_R") then return "Right Fore Arm"; elseif(BPType == "Hand_L") then return "Left Hand"; elseif(BPType == "Hand_R") then return "Right Hand"; elseif(BPType == "LowerLeg_L") then return "Left Lower Leg"; elseif(BPType == "LowerLeg_R") then return "Right Lower Leg"; elseif(BPType == "Torso_Lower") then return "Lower Torso"; elseif(BPType == "Torso_Upper") then return "Upper Torso"; elseif(BPType == "UpperArm_L") then return "Left Upper Arm"; elseif(BPType == "UpperArm_R") then return "Right Upper Arm"; elseif(BPType == "UpperLeg_L") then return "Left Upper Leg"; elseif(BPType == "UpperLeg_R") then return "Right Upper Leg"; else return BPType; end end function ExamineArmor(items, result, player) for i=0, items:size()-1 do Armor = items:get(i); end loadArmor(Armor); local out = "Remaining Durability: " .. tostring(Armor:getModData().Durability) .. "\n"; local BPs = player:getBodyDamage():getBodyParts(); for i=0, BPs:size()-1 do if(Armor:getModData().ScratchRes ~= nil) and (Armor:getModData().ScratchRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().ScratchRes[tostring(BPs:get(i):getType())]).. "%" .. " chance to block Scratches on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().DeepWoundRes ~= nil) and (Armor:getModData().DeepWoundRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().DeepWoundRes[tostring(BPs:get(i):getType())]).. "%" .. " Chance to block to Deep Wounds on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().BiteRes ~= nil) and (Armor:getModData().BiteRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().BiteRes[tostring(BPs:get(i):getType())]) .. "%".. " Chance to block to Bites on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().GlassRes ~= nil) and (Armor:getModData().GlassRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().GlassRes[tostring(BPs:get(i):getType())]) .. "%".. " Chance to block to Glass on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().FractureRes ~= nil) and (Armor:getModData().FractureRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().FractureRes[tostring(BPs:get(i):getType())]) .. "%".. " Chance to block to Fractures on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().BurnRes ~= nil) and (Armor:getModData().BurnRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().BurnRes[tostring(BPs:get(i):getType())]) .. "%".. " Chance to block to Burns on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().BulletRes ~= nil) and (Armor:getModData().BulletRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().BulletRes[tostring(BPs:get(i):getType())]).. "%" .. " Chance to block to Bullets on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end end out = Armor:getDisplayName() .. "\n" .. out; ArmorWindow:setText(out); ArmorWindow:setVisible(true); --player:Say(); end function ArmorSaveBodyDamage(player) player:getModData().ArmorTempBodyDamage = {}; ArmorTempBodyDamage = player:getModData().ArmorTempBodyDamage; local BD = player:getBodyDamage(); --local InjuryTypes = {0 = "Scratch",1 = "DeepWound", 2 = "Burn", 3 = "BulletRes", 4 = "Fracture", 5 = "Glass"}; ArmorTempBodyDamage["IsInfected"] = BD:IsInfected(); local BPs = BD:getBodyParts(); for i=0, BPs:size()-1 do ArmorTempBodyDamage[tostring(BPs:get(i):getType())] = {Splint= false, Bandage = false, Bite = false, Scratch = false, DeepWound = false, Burn = false, Bullet = false, Fracture = false, Glass = false}; ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Splint"] = BPs:get(i):isSplint(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bandage"] = BPs:get(i):bandaged(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Scratch"] = BPs:get(i):scratched(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["DeepWound"] = BPs:get(i):deepWounded(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Burn"] = BPs:get(i):getBurnTime(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bullet"] = BPs:get(i):haveBullet(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Fracture"] = BPs:get(i):getFractureTime(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Glass"] = BPs:get(i):haveGlass(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bite"] = BPs:get(i):bitten(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["HasInjury"] = BPs:get(i):HasInjury(); end player:getModData().ArmorBDamageSaved = true; end function tryBlock(BodyPartType, InjuryType, ArmorType, player) local Armor = player:getInventory():getItemFromType(ArmorType); if(InjuryType == "Scratch") then if(Armor:getModData().ScratchRes ~= nil) and (Armor:getModData().ScratchRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().ScratchRes[BodyPartType] ); end elseif(InjuryType == "DeepWound") then if((Armor:getModData().DeepWoundRes ~= nil) and Armor:getModData().DeepWoundRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().DeepWoundRes[BodyPartType] ); end elseif(InjuryType == "Bite") then if(Armor:getModData().BiteRes ~= nil) and (Armor:getModData().BiteRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().BiteRes[BodyPartType] ); end elseif(InjuryType == "Fracture") then if(Armor:getModData().FractureRes ~= nil) and (Armor:getModData().FractureRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().FractureRes[BodyPartType] ); end elseif(InjuryType == "Burn") then if(Armor:getModData().BurnRes ~= nil) and (Armor:getModData().BurnRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().BurnRes[BodyPartType] ); end elseif(InjuryType == "Glass") then if(Armor:getModData().GlassRes ~= nil) and (Armor:getModData().GlassRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().GlassRes[BodyPartType] ); end elseif(InjuryType == "Bullet") then if(Armor:getModData().BulletRes ~= nil) and (Armor:getModData().BulletRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().BulletRes[BodyPartType] ); end end end function EquipAsShield(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); if (player:getSecondaryHandItem() == player:getPrimaryHandItem()) then player:setPrimaryHandItem(nil); end player:setSecondaryHandItem(items:get(i)); player:getModData().ShieldArmor = items:get(i):getType(); end end function EquipOnHead(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().HeadArmor = items:get(i):getType(); end end function EquipOnHands(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().HandArmor = items:get(i):getType(); end end function EquipOnArms(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().ArmArmor = items:get(i):getType(); end end function EquipOnLegs(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().LegArmor = items:get(i):getType(); end end function EquipOnChest(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().ChestArmor = items:get(i):getType(); end end function EquipOnFeet(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().FootArmor = items:get(i):getType(); end end function DamageArmor(Armor, player, InjuryType) local Damage = 1; if(InjuryType == "Scratch") then Damage = 1; elseif(InjuryType == "DeepWound") then Damage = 3; elseif(InjuryType == "Bite") then Damage = 2; elseif(InjuryType == "Fracture") then Damage = 3; elseif(InjuryType == "Burn") then Damage = 2; elseif(InjuryType == "Glass") then Damage = 2; elseif(InjuryType == "Bullet") then Damage = 5; end local isBroken = false; Armor:getModData().Durability = Armor:getModData().Durability - Damage; if (Armor:getModData().Durability <= 0) then isBroken = true; if(Armor:getModData().onBreakTurnInto ~= nil) then player:Say("adding broken armor" .. Armor:getModData().onBreakTurnInto); player:getInventory():AddItem(Armor:getModData().onBreakTurnInto); end player:getInventory():Remove(Armor); end return isBroken; end function wasDamagedBlocked(BodyPartType, InjuryType, player) if(ArmorTempBodyDamage[tostring(BodyPartType)]["Bandage"] == true) or (ArmorTempBodyDamage[tostring(BodyPartType)]["Splint"] == true) then return false; end if(player:getSecondaryHandItem() ~= nil) then if(player:getModData().ShieldArmor ~= nil) and (player:getSecondaryHandItem():getType() == player:getModData().ShieldArmor) then if(tryBlock(BodyPartType, InjuryType, player:getModData().ShieldArmor, player) == true) then if(DamageArmor(player:getInventory():getItemFromType(player:getModData().ShieldArmor),player,InjuryType) == true) then player:setSecondaryHandItem(nil); end return true; end end end if(player:getModData().HeadArmor ~= nil) and (player:getInventory():contains(player:getModData().HeadArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().HeadArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().HeadArmor),player,InjuryType); return true; end end if(player:getModData().HandArmor ~= nil) and (player:getInventory():contains(player:getModData().HandArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().HandArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().HandArmor),player,InjuryType); return true; end end if(player:getModData().ArmArmor ~= nil) and (player:getInventory():contains(player:getModData().ArmArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().ArmArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().ArmArmor),player,InjuryType); return true; end end if(player:getModData().ChestArmor ~= nil) and (player:getInventory():contains(player:getModData().ChestArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().ChestArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().ChestArmor),player,InjuryType); return true; end end if(player:getModData().LegArmor ~= nil) and (player:getInventory():contains(player:getModData().LegArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().LegArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().LegArmor),player,InjuryType); return true; end end if(player:getModData().FootArmor ~= nil) and (player:getInventory():contains(player:getModData().FootArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().FootArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().FootArmor),player,InjuryType); return true; end end return false; end function healBodyPart(bodyPart, player, BD) bodyPart:SetInfected(false); bodyPart:setInfectedWound(false); bodyPart:SetFakeInfected(false); bodyPart:setWoundInfectionLevel(0); if(ArmorTempBodyDamage["IsInfected"] == false) and (BD:IsInfected() == true) then BD:setInf(false); -- remove infection if did not have before the blocked scratch end bodyPart:RestoreToFullHealth(); bodyPart:DamageUpdate() ; player:Say("!"); sendClientCommand(player, "Armor", "Say", {saythis = "!"}); end function ArmorCheckForDamage(player) local ArmorbInjuryDetected = false; if(player:getModData().ArmorBDamageSaved ~= nil) and (player ~= nil) then local BD = player:getBodyDamage(); --local InjuryTypes = {0 = "Scratch",1 = "DeepWound", 2 = "Burn", 3 = "BulletRes", 4 = "Fracture", 5 = "Glass"}; ArmorTempBodyDamage = player:getModData().ArmorTempBodyDamage; local BPs = BD:getBodyParts(); for i=0, BPs:size()-1 do if((ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bandage"] == false) and (ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["HasInjury"] == false)) then if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Scratch"] ~= BPs:get(i):scratched()) and (BPs:get(i):scratched() == true) then --player:Say("Scratch Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Scratch", player)) then healBodyPart(BPs:get(i), player, BD); end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["DeepWound"] ~= BPs:get(i):deepWounded()) and (BPs:get(i):deepWounded() == true) and (ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bullet"] ~= true) and (ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Glass"] ~= true) then if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bullet"]) or (ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Glass"]) then ArmorbInjuryDetected = true; else if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "DeepWound", player)) then healBodyPart(BPs:get(i), player, BD); end end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bite"] ~= BPs:get(i):bitten()) and (BPs:get(i):bitten() == true) then --player:Say("Bite Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Bite", player)) then healBodyPart(BPs:get(i), player, BD); end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Burn"] ~= BPs:get(i):getBurnTime()) and (BPs:get(i):getBurnTime() ~= 0) then --player:Say("Burn Detected on ".. tostring(BPs:get(i):getType()) ); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Burn", player)) then healBodyPart(BPs:get(i), player, BD); end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bullet"] ~= BPs:get(i):haveBullet()) and (BPs:get(i):haveBullet() == true) and (BPs:get(i):deepWounded() == false) then --player:Say("Lodged Bullets Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Bullet", player)) then healBodyPart(BPs:get(i), player, BD); end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Fracture"] ~= BPs:get(i):getFractureTime()) and (BPs:get(i):getFractureTime() ~= 0) and (BPs:get(i):isSplint() == false) then --player:Say("Fracture Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Fracture", player)) then healBodyPart(BPs:get(i), player, BD); end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Glass"] ~= BPs:get(i):haveGlass()) and (BPs:get(i):haveGlass() == true) and (BPs:get(i):deepWounded() == false) then --player:Say("Logged Glass Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Glass", player)) then healBodyPart(BPs:get(i), player, BD); end ArmorbInjuryDetected = true; end end end end if(ArmorbInjuryDetected) then ArmorSaveBodyDamage(player); end return ArmorbInjuryDetected; end function ArmorupdateThePlayer(player) ArmorCheckForDamage(player); if(player:isLocalPlayer()) then player:getInventory():Remove("HCEquiparmor"); end end function ArmorInit() ArmorSaveBodyDamage(getPlayer()); end function ArmorKeysUp(keynum) --getPlayer():Say(tostring(keynum)); if keynum == 25 then local player = getPlayer(); local armorstring = "Currently Equipped Armor \n"; if(player:getModData().ShieldArmor ~= nil) and (player:getSecondaryHandItem() ~= nil) and (player:getSecondaryHandItem():getType() == player:getModData().ShieldArmor) then armorstring = armorstring .. "Shield: " .. player:getInventory():getItemFromType(player:getModData().ShieldArmor):getDisplayName() .. "\n"; end if(player:getModData().HeadArmor ~= nil) and (player:getInventory():contains(player:getModData().HeadArmor)) then armorstring = armorstring .. "Helmet: " .. player:getInventory():getItemFromType(player:getModData().HeadArmor):getDisplayName() .. "\n"; end if(player:getModData().HandArmor ~= nil) and (player:getInventory():contains(player:getModData().HandArmor)) then armorstring = armorstring .. "Hands: " .. player:getInventory():getItemFromType(player:getModData().HandArmor):getDisplayName() .. "\n"; end if(player:getModData().ArmArmor ~= nil) and (player:getInventory():contains(player:getModData().ArmArmor)) then armorstring = armorstring .. "Arms: " .. player:getInventory():getItemFromType(player:getModData().ArmArmor):getDisplayName() .. "\n"; end if(player:getModData().LegArmor ~= nil) and (player:getInventory():contains(player:getModData().LegArmor)) then armorstring = armorstring .. "Legs: " .. player:getInventory():getItemFromType(player:getModData().LegArmor):getDisplayName() .. "\n"; end if(player:getModData().ChestArmor ~= nil) and (player:getInventory():contains(player:getModData().ChestArmor)) then armorstring = armorstring .. "Chest: " .. player:getInventory():getItemFromType(player:getModData().ChestArmor):getDisplayName() .. "\n"; end if(player:getModData().FootArmor ~= nil) and (player:getInventory():contains(player:getModData().FootArmor)) then armorstring = armorstring .. "Feet: " .. player:getInventory():getItemFromType(player:getModData().FootArmor):getDisplayName() .. "\n"; end ArmorWindow:setText(armorstring); ArmorWindow:setVisible(true); end end Events.OnKeyPressed.Add(ArmorKeysUp); Events.OnPlayerUpdate.Add(ArmorupdateThePlayer); Events.OnGameStart.Add(ArmorInit); @Hydromancerx armor code to i think re fix a problem that i re introduced trying to fix anther problem. (The dropping hp after blocks problem) And also, now it supports putting armor on survivors in survivors mod Edited March 8, 2017 by nolanri Link to comment Share on other sites More sharing options...
wsensor Posted March 8, 2017 Share Posted March 8, 2017 Hey could you make sifting dirt work from the ground? (I having to pick up the dirt each time... T_T Also always seem to drop the colanders during sifting of dirt sometimes.) Link to comment Share on other sites More sharing options...
Di-Crash Posted March 8, 2017 Share Posted March 8, 2017 2 hours ago, nolanri said: Reveal hidden contents --[[ Injury Detection And Armor Based Injury Blocking By Nolan Ritchie ]] function loadArmorToPlayer(Armor, player) ArmorSaveBodyDamage(player); loadArmor(Armor); end function getBodyPartDisplayName(TypeIn) BPType = tostring(TypeIn); if(BPType == "Foot_L") then return "Left Foot"; elseif(BPType == "Foot_R") then return "Right Foot"; elseif(BPType == "ForeArm_L") then return "Left Fore Arm"; elseif(BPType == "ForeArm_R") then return "Right Fore Arm"; elseif(BPType == "Hand_L") then return "Left Hand"; elseif(BPType == "Hand_R") then return "Right Hand"; elseif(BPType == "LowerLeg_L") then return "Left Lower Leg"; elseif(BPType == "LowerLeg_R") then return "Right Lower Leg"; elseif(BPType == "Torso_Lower") then return "Lower Torso"; elseif(BPType == "Torso_Upper") then return "Upper Torso"; elseif(BPType == "UpperArm_L") then return "Left Upper Arm"; elseif(BPType == "UpperArm_R") then return "Right Upper Arm"; elseif(BPType == "UpperLeg_L") then return "Left Upper Leg"; elseif(BPType == "UpperLeg_R") then return "Right Upper Leg"; else return BPType; end end function ExamineArmor(items, result, player) for i=0, items:size()-1 do Armor = items:get(i); end loadArmor(Armor); local out = "Remaining Durability: " .. tostring(Armor:getModData().Durability) .. "\n"; local BPs = player:getBodyDamage():getBodyParts(); for i=0, BPs:size()-1 do if(Armor:getModData().ScratchRes ~= nil) and (Armor:getModData().ScratchRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().ScratchRes[tostring(BPs:get(i):getType())]).. "%" .. " chance to block Scratches on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().DeepWoundRes ~= nil) and (Armor:getModData().DeepWoundRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().DeepWoundRes[tostring(BPs:get(i):getType())]).. "%" .. " Chance to block to Deep Wounds on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().BiteRes ~= nil) and (Armor:getModData().BiteRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().BiteRes[tostring(BPs:get(i):getType())]) .. "%".. " Chance to block to Bites on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().GlassRes ~= nil) and (Armor:getModData().GlassRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().GlassRes[tostring(BPs:get(i):getType())]) .. "%".. " Chance to block to Glass on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().FractureRes ~= nil) and (Armor:getModData().FractureRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().FractureRes[tostring(BPs:get(i):getType())]) .. "%".. " Chance to block to Fractures on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().BurnRes ~= nil) and (Armor:getModData().BurnRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().BurnRes[tostring(BPs:get(i):getType())]) .. "%".. " Chance to block to Burns on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().BulletRes ~= nil) and (Armor:getModData().BulletRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().BulletRes[tostring(BPs:get(i):getType())]).. "%" .. " Chance to block to Bullets on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end end out = Armor:getDisplayName() .. "\n" .. out; ArmorWindow:setText(out); ArmorWindow:setVisible(true); --player:Say(); end function ArmorSaveBodyDamage(player) player:getModData().ArmorTempBodyDamage = {}; ArmorTempBodyDamage = player:getModData().ArmorTempBodyDamage; local BD = player:getBodyDamage(); --local InjuryTypes = {0 = "Scratch",1 = "DeepWound", 2 = "Burn", 3 = "BulletRes", 4 = "Fracture", 5 = "Glass"}; ArmorTempBodyDamage["IsInfected"] = BD:IsInfected(); local BPs = BD:getBodyParts(); for i=0, BPs:size()-1 do ArmorTempBodyDamage[tostring(BPs:get(i):getType())] = {Splint= false, Bandage = false, Bite = false, Scratch = false, DeepWound = false, Burn = false, Bullet = false, Fracture = false, Glass = false}; ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Splint"] = BPs:get(i):isSplint(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bandage"] = BPs:get(i):bandaged(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Scratch"] = BPs:get(i):scratched(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["DeepWound"] = BPs:get(i):deepWounded(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Burn"] = BPs:get(i):getBurnTime(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bullet"] = BPs:get(i):haveBullet(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Fracture"] = BPs:get(i):getFractureTime(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Glass"] = BPs:get(i):haveGlass(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bite"] = BPs:get(i):bitten(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["HasInjury"] = BPs:get(i):HasInjury(); end player:getModData().ArmorBDamageSaved = true; end function tryBlock(BodyPartType, InjuryType, ArmorType, player) local Armor = player:getInventory():getItemFromType(ArmorType); if(InjuryType == "Scratch") then if(Armor:getModData().ScratchRes ~= nil) and (Armor:getModData().ScratchRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().ScratchRes[BodyPartType] ); end elseif(InjuryType == "DeepWound") then if((Armor:getModData().DeepWoundRes ~= nil) and Armor:getModData().DeepWoundRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().DeepWoundRes[BodyPartType] ); end elseif(InjuryType == "Bite") then if(Armor:getModData().BiteRes ~= nil) and (Armor:getModData().BiteRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().BiteRes[BodyPartType] ); end elseif(InjuryType == "Fracture") then if(Armor:getModData().FractureRes ~= nil) and (Armor:getModData().FractureRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().FractureRes[BodyPartType] ); end elseif(InjuryType == "Burn") then if(Armor:getModData().BurnRes ~= nil) and (Armor:getModData().BurnRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().BurnRes[BodyPartType] ); end elseif(InjuryType == "Glass") then if(Armor:getModData().GlassRes ~= nil) and (Armor:getModData().GlassRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().GlassRes[BodyPartType] ); end elseif(InjuryType == "Bullet") then if(Armor:getModData().BulletRes ~= nil) and (Armor:getModData().BulletRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().BulletRes[BodyPartType] ); end end end function EquipAsShield(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); if (player:getSecondaryHandItem() == player:getPrimaryHandItem()) then player:setPrimaryHandItem(nil); end player:setSecondaryHandItem(items:get(i)); player:getModData().ShieldArmor = items:get(i):getType(); end end function EquipOnHead(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().HeadArmor = items:get(i):getType(); end end function EquipOnHands(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().HandArmor = items:get(i):getType(); end end function EquipOnArms(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().ArmArmor = items:get(i):getType(); end end function EquipOnLegs(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().LegArmor = items:get(i):getType(); end end function EquipOnChest(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().ChestArmor = items:get(i):getType(); end end function EquipOnFeet(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().FootArmor = items:get(i):getType(); end end function DamageArmor(Armor, player, InjuryType) local Damage = 1; if(InjuryType == "Scratch") then Damage = 1; elseif(InjuryType == "DeepWound") then Damage = 3; elseif(InjuryType == "Bite") then Damage = 2; elseif(InjuryType == "Fracture") then Damage = 3; elseif(InjuryType == "Burn") then Damage = 2; elseif(InjuryType == "Glass") then Damage = 2; elseif(InjuryType == "Bullet") then Damage = 5; end local isBroken = false; Armor:getModData().Durability = Armor:getModData().Durability - Damage; if (Armor:getModData().Durability <= 0) then isBroken = true; if(Armor:getModData().onBreakTurnInto ~= nil) then player:Say("adding broken armor" .. Armor:getModData().onBreakTurnInto); player:getInventory():AddItem(Armor:getModData().onBreakTurnInto); end player:getInventory():Remove(Armor); end return isBroken; end function wasDamagedBlocked(BodyPartType, InjuryType, player) if(ArmorTempBodyDamage[tostring(BodyPartType)]["Bandage"] == true) or (ArmorTempBodyDamage[tostring(BodyPartType)]["Splint"] == true) then return false; end if(player:getSecondaryHandItem() ~= nil) then if(player:getModData().ShieldArmor ~= nil) and (player:getSecondaryHandItem():getType() == player:getModData().ShieldArmor) then if(tryBlock(BodyPartType, InjuryType, player:getModData().ShieldArmor, player) == true) then if(DamageArmor(player:getInventory():getItemFromType(player:getModData().ShieldArmor),player,InjuryType) == true) then player:setSecondaryHandItem(nil); end return true; end end end if(player:getModData().HeadArmor ~= nil) and (player:getInventory():contains(player:getModData().HeadArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().HeadArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().HeadArmor),player,InjuryType); return true; end end if(player:getModData().HandArmor ~= nil) and (player:getInventory():contains(player:getModData().HandArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().HandArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().HandArmor),player,InjuryType); return true; end end if(player:getModData().ArmArmor ~= nil) and (player:getInventory():contains(player:getModData().ArmArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().ArmArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().ArmArmor),player,InjuryType); return true; end end if(player:getModData().ChestArmor ~= nil) and (player:getInventory():contains(player:getModData().ChestArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().ChestArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().ChestArmor),player,InjuryType); return true; end end if(player:getModData().LegArmor ~= nil) and (player:getInventory():contains(player:getModData().LegArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().LegArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().LegArmor),player,InjuryType); return true; end end if(player:getModData().FootArmor ~= nil) and (player:getInventory():contains(player:getModData().FootArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().FootArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().FootArmor),player,InjuryType); return true; end end return false; end function healBodyPart(bodyPart, player, BD) bodyPart:SetInfected(false); bodyPart:setInfectedWound(false); bodyPart:SetFakeInfected(false); bodyPart:setWoundInfectionLevel(0); if(ArmorTempBodyDamage["IsInfected"] == false) and (BD:IsInfected() == true) then BD:setInf(false); -- remove infection if did not have before the blocked scratch end bodyPart:RestoreToFullHealth(); bodyPart:DamageUpdate() ; player:Say("!"); sendClientCommand(player, "Armor", "Say", {saythis = "!"}); end function ArmorCheckForDamage(player) local ArmorbInjuryDetected = false; if(player:getModData().ArmorBDamageSaved ~= nil) and (player ~= nil) then local BD = player:getBodyDamage(); --local InjuryTypes = {0 = "Scratch",1 = "DeepWound", 2 = "Burn", 3 = "BulletRes", 4 = "Fracture", 5 = "Glass"}; ArmorTempBodyDamage = player:getModData().ArmorTempBodyDamage; local BPs = BD:getBodyParts(); for i=0, BPs:size()-1 do if((ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bandage"] == false) and (ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["HasInjury"] == false)) then if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Scratch"] ~= BPs:get(i):scratched()) and (BPs:get(i):scratched() == true) then --player:Say("Scratch Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Scratch", player)) then healBodyPart(BPs:get(i), player, BD); end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["DeepWound"] ~= BPs:get(i):deepWounded()) and (BPs:get(i):deepWounded() == true) and (ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bullet"] ~= true) and (ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Glass"] ~= true) then if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bullet"]) or (ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Glass"]) then ArmorbInjuryDetected = true; else if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "DeepWound", player)) then healBodyPart(BPs:get(i), player, BD); end end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bite"] ~= BPs:get(i):bitten()) and (BPs:get(i):bitten() == true) then --player:Say("Bite Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Bite", player)) then healBodyPart(BPs:get(i), player, BD); end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Burn"] ~= BPs:get(i):getBurnTime()) and (BPs:get(i):getBurnTime() ~= 0) then --player:Say("Burn Detected on ".. tostring(BPs:get(i):getType()) ); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Burn", player)) then healBodyPart(BPs:get(i), player, BD); end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bullet"] ~= BPs:get(i):haveBullet()) and (BPs:get(i):haveBullet() == true) and (BPs:get(i):deepWounded() == false) then --player:Say("Lodged Bullets Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Bullet", player)) then healBodyPart(BPs:get(i), player, BD); end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Fracture"] ~= BPs:get(i):getFractureTime()) and (BPs:get(i):getFractureTime() ~= 0) and (BPs:get(i):isSplint() == false) then --player:Say("Fracture Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Fracture", player)) then healBodyPart(BPs:get(i), player, BD); end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Glass"] ~= BPs:get(i):haveGlass()) and (BPs:get(i):haveGlass() == true) and (BPs:get(i):deepWounded() == false) then --player:Say("Logged Glass Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Glass", player)) then healBodyPart(BPs:get(i), player, BD); end ArmorbInjuryDetected = true; end end end end if(ArmorbInjuryDetected) then ArmorSaveBodyDamage(player); end return ArmorbInjuryDetected; end function ArmorupdateThePlayer(player) ArmorCheckForDamage(player); if(player:isLocalPlayer()) then player:getInventory():Remove("HCEquiparmor"); end end function ArmorInit() ArmorSaveBodyDamage(getPlayer()); end function ArmorKeysUp(keynum) --getPlayer():Say(tostring(keynum)); if keynum == 25 then local player = getPlayer(); local armorstring = "Currently Equipped Armor \n"; if(player:getModData().ShieldArmor ~= nil) and (player:getSecondaryHandItem() ~= nil) and (player:getSecondaryHandItem():getType() == player:getModData().ShieldArmor) then armorstring = armorstring .. "Shield: " .. player:getInventory():getItemFromType(player:getModData().ShieldArmor):getDisplayName() .. "\n"; end if(player:getModData().HeadArmor ~= nil) and (player:getInventory():contains(player:getModData().HeadArmor)) then armorstring = armorstring .. "Helmet: " .. player:getInventory():getItemFromType(player:getModData().HeadArmor):getDisplayName() .. "\n"; end if(player:getModData().HandArmor ~= nil) and (player:getInventory():contains(player:getModData().HandArmor)) then armorstring = armorstring .. "Hands: " .. player:getInventory():getItemFromType(player:getModData().HandArmor):getDisplayName() .. "\n"; end if(player:getModData().ArmArmor ~= nil) and (player:getInventory():contains(player:getModData().ArmArmor)) then armorstring = armorstring .. "Arms: " .. player:getInventory():getItemFromType(player:getModData().ArmArmor):getDisplayName() .. "\n"; end if(player:getModData().LegArmor ~= nil) and (player:getInventory():contains(player:getModData().LegArmor)) then armorstring = armorstring .. "Legs: " .. player:getInventory():getItemFromType(player:getModData().LegArmor):getDisplayName() .. "\n"; end if(player:getModData().ChestArmor ~= nil) and (player:getInventory():contains(player:getModData().ChestArmor)) then armorstring = armorstring .. "Chest: " .. player:getInventory():getItemFromType(player:getModData().ChestArmor):getDisplayName() .. "\n"; end if(player:getModData().FootArmor ~= nil) and (player:getInventory():contains(player:getModData().FootArmor)) then armorstring = armorstring .. "Feet: " .. player:getInventory():getItemFromType(player:getModData().FootArmor):getDisplayName() .. "\n"; end ArmorWindow:setText(armorstring); ArmorWindow:setVisible(true); end end Events.OnKeyPressed.Add(ArmorKeysUp); Events.OnPlayerUpdate.Add(ArmorupdateThePlayer); Events.OnGameStart.Add(ArmorInit); @Hydromancerx armor code to i think re fix a problem that i re introduced trying to fix anther problem. (The dropping hp after blocks problem) And also, now it supports putting armor on survivors in survivors mod Spoiler ;)) Link to comment Share on other sites More sharing options...
nolanri Posted March 8, 2017 Share Posted March 8, 2017 (edited) 18 hours ago, Di-Crash said: Hide contents ;)) I'm sure you don't have the full history of armor revisions and bug reports in mind so... This is what it Used to be for a long time until about 1 month ago: Spoiler function healBodyPart(bodyPart, player, BD) bodyPart:SetInfected(false); bodyPart:setInfectedWound(false); bodyPart:SetFakeInfected(false); bodyPart:setWoundInfectionLevel(0); if(ArmorTempBodyDamage["IsInfected"] == false) and (BD:IsInfected() == true) then BD:setInf(false); -- remove infection if did not have before the blocked scratch BD:setInfectionLevel(0); end bodyPart:RestoreToFullHealth(); bodyPart:DamageUpdate() ; player:Say("!"); sendClientCommand(player, "Armor", "Say", {saythis = "!"}); end With the above there was definitely no problem of health loss after blocking. I let zombies attack me with 100% block for 24 in game hours, then waited 24 more hours to see if i got sick or lost hp and no.BUT people then complained that character with Hemphobiac trait, would start to "get sick" like zombification sick. not same hp loss with no symptoms like before. They would get sick and slowly die. As a response to this report I thought i'd try this: Spoiler function healBodyPart(bodyPart, player, BD) bodyPart:SetInfected(false); bodyPart:setInfectedWound(false); bodyPart:SetFakeInfected(false); b̶o̶d̶y̶P̶a̶r̶t̶:̶s̶e̶t̶W̶o̶u̶n̶d̶I̶n̶f̶e̶c̶t̶i̶o̶n̶L̶e̶v̶e̶l̶(̶0̶)̶;̶ if(ArmorTempBodyDamage["IsInfected"] == false) and (BD:IsInfected() == true) then BD:setInf(false); -- remove infection if did not have before the blocked scratch ̶B̶D̶:̶s̶e̶t̶I̶n̶f̶e̶c̶t̶i̶o̶n̶L̶e̶v̶e̶l̶(̶0̶)̶;̶ end bodyPart:RestoreToFullHealth(); bodyPart:DamageUpdate() ; player:Say("!"); sendClientCommand(player, "Armor", "Say", {saythis = "!"}); end I'm not really sure what Hemphobiac trait even does but I figured since the getting sick problem only happens to those with it, But with the immediate above, the slow hp loss after blocking has returned. Since i'm quite sure the old slow hp loss thing is not hp loss from zombification, (because it would happen from any zombie injury block, and only 25% of zombie inflicted injuries should cause zombification.) so I figured that it must be the body part (infection) set to 0 (The line that you added) might be initiating the infection for people with hemphobiac trait. but I looked in the bodydamage.class and i dont think that is the problem. therefore if I had to guess, so maybe lets try this: Spoiler function healBodyPart(bodyPart, player, BD) bodyPart:SetInfected(false); bodyPart:setInfectedWound(false); bodyPart:SetFakeInfected(false); bodyPart:setWoundInfectionLevel(0); if(ArmorTempBodyDamage["IsInfected"] == false) and (BD:IsInfected() == true) then BD:setInf(false); -- remove infection if did not have before the blocked scratch BD:setInfectionLevel(0); BD:setInfectionGrowthRate(0); BD:setIsFakeInfected(false); end bodyPart:RestoreToFullHealth(); bodyPart:DamageUpdate() ; player:Say("!"); sendClientCommand(player, "Armor", "Say", {saythis = "!"}); end Full Armor.lua file code: Spoiler --[[ Injury Detection And Armor Based Injury Blocking By Nolan Ritchie ]] function loadArmorToPlayer(Armor, player) ArmorSaveBodyDamage(player); loadArmor(Armor); end function getBodyPartDisplayName(TypeIn) BPType = tostring(TypeIn); if(BPType == "Foot_L") then return "Left Foot"; elseif(BPType == "Foot_R") then return "Right Foot"; elseif(BPType == "ForeArm_L") then return "Left Fore Arm"; elseif(BPType == "ForeArm_R") then return "Right Fore Arm"; elseif(BPType == "Hand_L") then return "Left Hand"; elseif(BPType == "Hand_R") then return "Right Hand"; elseif(BPType == "LowerLeg_L") then return "Left Lower Leg"; elseif(BPType == "LowerLeg_R") then return "Right Lower Leg"; elseif(BPType == "Torso_Lower") then return "Lower Torso"; elseif(BPType == "Torso_Upper") then return "Upper Torso"; elseif(BPType == "UpperArm_L") then return "Left Upper Arm"; elseif(BPType == "UpperArm_R") then return "Right Upper Arm"; elseif(BPType == "UpperLeg_L") then return "Left Upper Leg"; elseif(BPType == "UpperLeg_R") then return "Right Upper Leg"; else return BPType; end end function ExamineArmor(items, result, player) for i=0, items:size()-1 do Armor = items:get(i); end loadArmor(Armor); local out = "Remaining Durability: " .. tostring(Armor:getModData().Durability) .. "\n"; local BPs = player:getBodyDamage():getBodyParts(); for i=0, BPs:size()-1 do if(Armor:getModData().ScratchRes ~= nil) and (Armor:getModData().ScratchRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().ScratchRes[tostring(BPs:get(i):getType())]).. "%" .. " chance to block Scratches on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().DeepWoundRes ~= nil) and (Armor:getModData().DeepWoundRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().DeepWoundRes[tostring(BPs:get(i):getType())]).. "%" .. " Chance to block to Deep Wounds on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().BiteRes ~= nil) and (Armor:getModData().BiteRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().BiteRes[tostring(BPs:get(i):getType())]) .. "%".. " Chance to block to Bites on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().GlassRes ~= nil) and (Armor:getModData().GlassRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().GlassRes[tostring(BPs:get(i):getType())]) .. "%".. " Chance to block to Glass on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().FractureRes ~= nil) and (Armor:getModData().FractureRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().FractureRes[tostring(BPs:get(i):getType())]) .. "%".. " Chance to block to Fractures on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().BurnRes ~= nil) and (Armor:getModData().BurnRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().BurnRes[tostring(BPs:get(i):getType())]) .. "%".. " Chance to block to Burns on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().BulletRes ~= nil) and (Armor:getModData().BulletRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().BulletRes[tostring(BPs:get(i):getType())]).. "%" .. " Chance to block to Bullets on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end end out = Armor:getDisplayName() .. "\n" .. out; ArmorWindow:setText(out); ArmorWindow:setVisible(true); --player:Say(); end function ArmorSaveBodyDamage(player) player:getModData().ArmorTempBodyDamage = {}; ArmorTempBodyDamage = player:getModData().ArmorTempBodyDamage; local BD = player:getBodyDamage(); --local InjuryTypes = {0 = "Scratch",1 = "DeepWound", 2 = "Burn", 3 = "BulletRes", 4 = "Fracture", 5 = "Glass"}; ArmorTempBodyDamage["IsInfected"] = BD:IsInfected(); local BPs = BD:getBodyParts(); for i=0, BPs:size()-1 do ArmorTempBodyDamage[tostring(BPs:get(i):getType())] = {Splint= false, Bandage = false, Bite = false, Scratch = false, DeepWound = false, Burn = false, Bullet = false, Fracture = false, Glass = false}; ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Splint"] = BPs:get(i):isSplint(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bandage"] = BPs:get(i):bandaged(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Scratch"] = BPs:get(i):scratched(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["DeepWound"] = BPs:get(i):deepWounded(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Burn"] = BPs:get(i):getBurnTime(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bullet"] = BPs:get(i):haveBullet(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Fracture"] = BPs:get(i):getFractureTime(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Glass"] = BPs:get(i):haveGlass(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bite"] = BPs:get(i):bitten(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["HasInjury"] = BPs:get(i):HasInjury(); end player:getModData().ArmorBDamageSaved = true; end function tryBlock(BodyPartType, InjuryType, ArmorType, player) local Armor = player:getInventory():getItemFromType(ArmorType); if(InjuryType == "Scratch") then if(Armor:getModData().ScratchRes ~= nil) and (Armor:getModData().ScratchRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().ScratchRes[BodyPartType] ); end elseif(InjuryType == "DeepWound") then if((Armor:getModData().DeepWoundRes ~= nil) and Armor:getModData().DeepWoundRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().DeepWoundRes[BodyPartType] ); end elseif(InjuryType == "Bite") then if(Armor:getModData().BiteRes ~= nil) and (Armor:getModData().BiteRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().BiteRes[BodyPartType] ); end elseif(InjuryType == "Fracture") then if(Armor:getModData().FractureRes ~= nil) and (Armor:getModData().FractureRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().FractureRes[BodyPartType] ); end elseif(InjuryType == "Burn") then if(Armor:getModData().BurnRes ~= nil) and (Armor:getModData().BurnRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().BurnRes[BodyPartType] ); end elseif(InjuryType == "Glass") then if(Armor:getModData().GlassRes ~= nil) and (Armor:getModData().GlassRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().GlassRes[BodyPartType] ); end elseif(InjuryType == "Bullet") then if(Armor:getModData().BulletRes ~= nil) and (Armor:getModData().BulletRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().BulletRes[BodyPartType] ); end end end function EquipAsShield(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); if (player:getSecondaryHandItem() == player:getPrimaryHandItem()) then player:setPrimaryHandItem(nil); end player:setSecondaryHandItem(items:get(i)); player:getModData().ShieldArmor = items:get(i):getType(); end end function EquipOnHead(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().HeadArmor = items:get(i):getType(); end end function EquipOnHands(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().HandArmor = items:get(i):getType(); end end function EquipOnArms(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().ArmArmor = items:get(i):getType(); end end function EquipOnLegs(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().LegArmor = items:get(i):getType(); end end function EquipOnChest(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().ChestArmor = items:get(i):getType(); end end function EquipOnFeet(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().FootArmor = items:get(i):getType(); end end function DamageArmor(Armor, player, InjuryType) local Damage = 1; if(InjuryType == "Scratch") then Damage = 1; elseif(InjuryType == "DeepWound") then Damage = 3; elseif(InjuryType == "Bite") then Damage = 2; elseif(InjuryType == "Fracture") then Damage = 3; elseif(InjuryType == "Burn") then Damage = 2; elseif(InjuryType == "Glass") then Damage = 2; elseif(InjuryType == "Bullet") then Damage = 5; end local isBroken = false; Armor:getModData().Durability = Armor:getModData().Durability - Damage; if (Armor:getModData().Durability <= 0) then isBroken = true; if(Armor:getModData().onBreakTurnInto ~= nil) then player:Say("adding broken armor" .. Armor:getModData().onBreakTurnInto); player:getInventory():AddItem(Armor:getModData().onBreakTurnInto); end player:getInventory():Remove(Armor); end return isBroken; end function wasDamagedBlocked(BodyPartType, InjuryType, player) if(ArmorTempBodyDamage[tostring(BodyPartType)]["Bandage"] == true) or (ArmorTempBodyDamage[tostring(BodyPartType)]["Splint"] == true) then return false; end if(player:getSecondaryHandItem() ~= nil) then if(player:getModData().ShieldArmor ~= nil) and (player:getSecondaryHandItem():getType() == player:getModData().ShieldArmor) then if(tryBlock(BodyPartType, InjuryType, player:getModData().ShieldArmor, player) == true) then if(DamageArmor(player:getInventory():getItemFromType(player:getModData().ShieldArmor),player,InjuryType) == true) then player:setSecondaryHandItem(nil); end return true; end end end if(player:getModData().HeadArmor ~= nil) and (player:getInventory():contains(player:getModData().HeadArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().HeadArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().HeadArmor),player,InjuryType); return true; end end if(player:getModData().HandArmor ~= nil) and (player:getInventory():contains(player:getModData().HandArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().HandArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().HandArmor),player,InjuryType); return true; end end if(player:getModData().ArmArmor ~= nil) and (player:getInventory():contains(player:getModData().ArmArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().ArmArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().ArmArmor),player,InjuryType); return true; end end if(player:getModData().ChestArmor ~= nil) and (player:getInventory():contains(player:getModData().ChestArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().ChestArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().ChestArmor),player,InjuryType); return true; end end if(player:getModData().LegArmor ~= nil) and (player:getInventory():contains(player:getModData().LegArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().LegArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().LegArmor),player,InjuryType); return true; end end if(player:getModData().FootArmor ~= nil) and (player:getInventory():contains(player:getModData().FootArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().FootArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().FootArmor),player,InjuryType); return true; end end return false; end function healBodyPart(bodyPart, player, BD) bodyPart:SetInfected(false); bodyPart:setInfectedWound(false); bodyPart:SetFakeInfected(false); bodyPart:setWoundInfectionLevel(0); if(ArmorTempBodyDamage["IsInfected"] == false) and (BD:IsInfected() == true) then BD:setInf(false); -- remove infection if did not have before the blocked scratch BD:setInfectionLevel(0); BD:setInfectionGrowthRate(0); BD:setIsFakeInfected(false); end bodyPart:RestoreToFullHealth(); bodyPart:DamageUpdate() ; player:Say("!"); sendClientCommand(player, "Armor", "Say", {saythis = "!"}); end function ArmorCheckForDamage(player) local ArmorbInjuryDetected = false; if(player:getModData().ArmorBDamageSaved ~= nil) and (player ~= nil) then local BD = player:getBodyDamage(); --local InjuryTypes = {0 = "Scratch",1 = "DeepWound", 2 = "Burn", 3 = "BulletRes", 4 = "Fracture", 5 = "Glass"}; ArmorTempBodyDamage = player:getModData().ArmorTempBodyDamage; local BPs = BD:getBodyParts(); for i=0, BPs:size()-1 do if((ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bandage"] == false) and (ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["HasInjury"] == false)) then if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Scratch"] ~= BPs:get(i):scratched()) and (BPs:get(i):scratched() == true) then --player:Say("Scratch Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Scratch", player)) then healBodyPart(BPs:get(i), player, BD); end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["DeepWound"] ~= BPs:get(i):deepWounded()) and (BPs:get(i):deepWounded() == true) and (ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bullet"] ~= true) and (ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Glass"] ~= true) then if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bullet"]) or (ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Glass"]) then ArmorbInjuryDetected = true; else if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "DeepWound", player)) then healBodyPart(BPs:get(i), player, BD); end end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bite"] ~= BPs:get(i):bitten()) and (BPs:get(i):bitten() == true) then --player:Say("Bite Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Bite", player)) then healBodyPart(BPs:get(i), player, BD); end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Burn"] ~= BPs:get(i):getBurnTime()) and (BPs:get(i):getBurnTime() ~= 0) then --player:Say("Burn Detected on ".. tostring(BPs:get(i):getType()) ); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Burn", player)) then healBodyPart(BPs:get(i), player, BD); end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bullet"] ~= BPs:get(i):haveBullet()) and (BPs:get(i):haveBullet() == true) and (BPs:get(i):deepWounded() == false) then --player:Say("Lodged Bullets Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Bullet", player)) then healBodyPart(BPs:get(i), player, BD); end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Fracture"] ~= BPs:get(i):getFractureTime()) and (BPs:get(i):getFractureTime() ~= 0) and (BPs:get(i):isSplint() == false) then --player:Say("Fracture Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Fracture", player)) then healBodyPart(BPs:get(i), player, BD); end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Glass"] ~= BPs:get(i):haveGlass()) and (BPs:get(i):haveGlass() == true) and (BPs:get(i):deepWounded() == false) then --player:Say("Logged Glass Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Glass", player)) then healBodyPart(BPs:get(i), player, BD); end ArmorbInjuryDetected = true; end end end end if(ArmorbInjuryDetected) then ArmorSaveBodyDamage(player); end return ArmorbInjuryDetected; end function ArmorupdateThePlayer(player) ArmorCheckForDamage(player); if(player:isLocalPlayer()) then player:getInventory():Remove("HCEquiparmor"); end end function ArmorInit() ArmorSaveBodyDamage(getPlayer()); end function ArmorKeysUp(keynum) --getPlayer():Say(tostring(keynum)); if keynum == 25 then local player = getPlayer(); local armorstring = "Currently Equipped Armor \n"; if(player:getModData().ShieldArmor ~= nil) and (player:getSecondaryHandItem() ~= nil) and (player:getSecondaryHandItem():getType() == player:getModData().ShieldArmor) then armorstring = armorstring .. "Shield: " .. player:getInventory():getItemFromType(player:getModData().ShieldArmor):getDisplayName() .. "\n"; end if(player:getModData().HeadArmor ~= nil) and (player:getInventory():contains(player:getModData().HeadArmor)) then armorstring = armorstring .. "Helmet: " .. player:getInventory():getItemFromType(player:getModData().HeadArmor):getDisplayName() .. "\n"; end if(player:getModData().HandArmor ~= nil) and (player:getInventory():contains(player:getModData().HandArmor)) then armorstring = armorstring .. "Hands: " .. player:getInventory():getItemFromType(player:getModData().HandArmor):getDisplayName() .. "\n"; end if(player:getModData().ArmArmor ~= nil) and (player:getInventory():contains(player:getModData().ArmArmor)) then armorstring = armorstring .. "Arms: " .. player:getInventory():getItemFromType(player:getModData().ArmArmor):getDisplayName() .. "\n"; end if(player:getModData().LegArmor ~= nil) and (player:getInventory():contains(player:getModData().LegArmor)) then armorstring = armorstring .. "Legs: " .. player:getInventory():getItemFromType(player:getModData().LegArmor):getDisplayName() .. "\n"; end if(player:getModData().ChestArmor ~= nil) and (player:getInventory():contains(player:getModData().ChestArmor)) then armorstring = armorstring .. "Chest: " .. player:getInventory():getItemFromType(player:getModData().ChestArmor):getDisplayName() .. "\n"; end if(player:getModData().FootArmor ~= nil) and (player:getInventory():contains(player:getModData().FootArmor)) then armorstring = armorstring .. "Feet: " .. player:getInventory():getItemFromType(player:getModData().FootArmor):getDisplayName() .. "\n"; end ArmorWindow:setText(armorstring); ArmorWindow:setVisible(true); end end Events.OnKeyPressed.Add(ArmorKeysUp); Events.OnPlayerUpdate.Add(ArmorupdateThePlayer); Events.OnGameStart.Add(ArmorInit); This is still just my best guess, as im too lazy to actually test it right now. So Di-Crash if you would like to try and fix it all yourself please do, just make sure you also try testing the condition 24 hours after blocking many zombie attacks WITH Hemphobiac trait aslo. because that was the bug report that made me have to bother opening this code back up for edits after a long time. Edited March 8, 2017 by nolanri Link to comment Share on other sites More sharing options...
Di-Crash Posted March 8, 2017 Share Posted March 8, 2017 (edited) I think the problem is that you used an integer rather than a fractional one, I checked the command RestoreToFullHealth() in BodyDamage.class it uses this value to cure the infection. I tried to let the zombie bite myself and track the infection through the print command when it happened. I died naturally and the character did not become a zombie. This means that the path to recovery is in setInfectionLevel (0.0) Spoiler Edited March 8, 2017 by Di-Crash Link to comment Share on other sites More sharing options...
Di-Crash Posted March 8, 2017 Share Posted March 8, 2017 By the way about the attacks of a lot of zombies, it can happen so that even such armor will not save from a bite, it seems some damage slips between the frames. Link to comment Share on other sites More sharing options...
nolanri Posted March 8, 2017 Share Posted March 8, 2017 3 minutes ago, Di-Crash said: I think the problem is that you used an integer rather than a fractional one, I checked the command RestoreToFullHealth() in BodyDamage.class it uses this value to cure the infection. I tried to let the zombie bite myself and track the infection through the print command when it happened. I died naturally and the character did not become a zombie. This means that the path to recovery is in setInfectionLevel (0.0) try it with setInfectionLevel (0) that will work too. its the same thing. the problem we are trying to solve here has to do with the Hypochondriac trait. I just happened to RE-introduce an old problem WHILE TRYING to fix the Hypochondriac trait problem. Link to comment Share on other sites More sharing options...
nolanri Posted March 8, 2017 Share Posted March 8, 2017 3 minutes ago, Di-Crash said: By the way about the attacks of a lot of zombies, it can happen so that even such armor will not save from a bite, it seems some damage slips between the frames. zombie "Punches" do not cause injury, only loss of hp and are therefore not blocked. Link to comment Share on other sites More sharing options...
Di-Crash Posted March 8, 2017 Share Posted March 8, 2017 1 minute ago, nolanri said: zombie "Punches" do not cause injury, only loss of hp and are therefore not blocked. No, I mean bites and scratches. I made the armor with 100 percent protection for the tests, they still pierce it sometimes. Link to comment Share on other sites More sharing options...
nolanri Posted March 8, 2017 Share Posted March 8, 2017 are you saying Injuries still happened? as in, you were bitten on a body part with 100% block bite? Note: Bandaged or bodyparts with injuries cannot be blocked. I had to remove that due to an exploitation. Link to comment Share on other sites More sharing options...
Di-Crash Posted March 8, 2017 Share Posted March 8, 2017 1 minute ago, nolanri said: are you saying Injuries still happened? as in, you were bitten on a body part with 100% block bite? Note: Bandaged or bodyparts with injuries cannot be blocked. I had to remove that due to an exploitation. Yes, bastards break through the armor despite 100 percent protection. I know about the fact that you added ignoring the damaged limbs. By the way can it be worth adding stitches to the list?To track infection, I used command say. Spoiler By the way, I plan to make armor fully outfitted, like clothes. Now I am writing the time of action. Link to comment Share on other sites More sharing options...
nolanri Posted March 8, 2017 Share Posted March 8, 2017 works for me man, i used this for test: Spoiler if(Armor:getType() == "LeatherGloves") then Armor:getModData().ScratchRes = { Hand_L = 100, Hand_R = 100, ForeArm_L = 100, ForeArm_R = 100, UpperArm_L = 100, UpperArm_R = 100, Torso_Upper = 100, Torso_Lower = 100, Groin = 100, Head = 100, Neck = 100, LowerLeg_L = 100, LowerLeg_L = 100, LowerLeg_R = 100, LowerLeg_R = 100, Foot_L = 100, Foot_R = 100} ; Armor:getModData().DeepWoundRes = {Hand_L = 100, Hand_R = 100, ForeArm_L = 100, ForeArm_R = 100, UpperArm_L = 100, UpperArm_R = 100, Torso_Upper = 100, Torso_Lower = 100, Groin = 100, Head = 100, Neck = 100, LowerLeg_L = 100, LowerLeg_L = 100, LowerLeg_R = 100, LowerLeg_R = 100, Foot_L = 100, Foot_R = 100} ; Armor:getModData().BiteRes = { Hand_L = 100, Hand_R = 100, ForeArm_L = 100, ForeArm_R = 100, UpperArm_L = 100, UpperArm_R = 100, Torso_Upper = 100, Torso_Lower = 100, Groin = 100, Head = 100, Neck = 100, LowerLeg_L = 100, LowerLeg_L = 100, LowerLeg_R = 100, LowerLeg_R = 100, Foot_L = 100, Foot_R = 100} ; Armor:getModData().GlassRes = {Hand_L = 100, Hand_R = 100, ForeArm_L = 100, ForeArm_R = 100, UpperArm_L = 100, UpperArm_R = 100, Torso_Upper = 100, Torso_Lower = 100, Groin = 100, Head = 100, Neck = 100, LowerLeg_L = 100, LowerLeg_L = 100, LowerLeg_R = 100, LowerLeg_R = 100, Foot_L = 100, Foot_R = 100}; Armor:getModData().BulletRes = {Hand_L = 100, Hand_R = 100, ForeArm_L = 100, ForeArm_R = 100, UpperArm_L = 100, UpperArm_R = 100, Torso_Upper = 100, Torso_Lower = 100, Groin = 100, Head = 100, Neck = 100, LowerLeg_L = 100, LowerLeg_L = 100, LowerLeg_R = 100, LowerLeg_R = 100, Foot_L = 100, Foot_R = 100}; Armor:getModData().Durability = 1000; leather gloves with 100% block everything on every body part. I let zombies attack me for 24 in game hours. did not get any scratch or bite. only PUNCHES. which lower hp but do not cause INJURY Link to comment Share on other sites More sharing options...
Di-Crash Posted March 8, 2017 Share Posted March 8, 2017 I inserted it wrongly, I must write it from above. )) Link to comment Share on other sites More sharing options...
Di-Crash Posted March 8, 2017 Share Posted March 8, 2017 17 minutes ago, nolanri said: works for me man, i used this for test: Reveal hidden contents if(Armor:getType() == "LeatherGloves") then Armor:getModData().ScratchRes = { Hand_L = 100, Hand_R = 100, ForeArm_L = 100, ForeArm_R = 100, UpperArm_L = 100, UpperArm_R = 100, Torso_Upper = 100, Torso_Lower = 100, Groin = 100, Head = 100, Neck = 100, LowerLeg_L = 100, LowerLeg_L = 100, LowerLeg_R = 100, LowerLeg_R = 100, Foot_L = 100, Foot_R = 100} ; Armor:getModData().DeepWoundRes = {Hand_L = 100, Hand_R = 100, ForeArm_L = 100, ForeArm_R = 100, UpperArm_L = 100, UpperArm_R = 100, Torso_Upper = 100, Torso_Lower = 100, Groin = 100, Head = 100, Neck = 100, LowerLeg_L = 100, LowerLeg_L = 100, LowerLeg_R = 100, LowerLeg_R = 100, Foot_L = 100, Foot_R = 100} ; Armor:getModData().BiteRes = { Hand_L = 100, Hand_R = 100, ForeArm_L = 100, ForeArm_R = 100, UpperArm_L = 100, UpperArm_R = 100, Torso_Upper = 100, Torso_Lower = 100, Groin = 100, Head = 100, Neck = 100, LowerLeg_L = 100, LowerLeg_L = 100, LowerLeg_R = 100, LowerLeg_R = 100, Foot_L = 100, Foot_R = 100} ; Armor:getModData().GlassRes = {Hand_L = 100, Hand_R = 100, ForeArm_L = 100, ForeArm_R = 100, UpperArm_L = 100, UpperArm_R = 100, Torso_Upper = 100, Torso_Lower = 100, Groin = 100, Head = 100, Neck = 100, LowerLeg_L = 100, LowerLeg_L = 100, LowerLeg_R = 100, LowerLeg_R = 100, Foot_L = 100, Foot_R = 100}; Armor:getModData().BulletRes = {Hand_L = 100, Hand_R = 100, ForeArm_L = 100, ForeArm_R = 100, UpperArm_L = 100, UpperArm_R = 100, Torso_Upper = 100, Torso_Lower = 100, Groin = 100, Head = 100, Neck = 100, LowerLeg_L = 100, LowerLeg_L = 100, LowerLeg_R = 100, LowerLeg_R = 100, Foot_L = 100, Foot_R = 100}; Armor:getModData().Durability = 1000; leather gloves with 100% block everything on every body part. I let zombies attack me for 24 in game hours. did not get any scratch or bite. only PUNCHES. which lower hp but do not cause INJURY Link to comment Share on other sites More sharing options...
nolanri Posted March 8, 2017 Share Posted March 8, 2017 12 minutes ago, Di-Crash said: interesting. I have a hunch. try this code: armor.lua Spoiler --[[ Injury Detection And Armor Based Injury Blocking By Nolan Ritchie ]] function loadArmorToPlayer(Armor, player) ArmorSaveBodyDamage(player); loadArmor(Armor); end function getBodyPartDisplayName(TypeIn) BPType = tostring(TypeIn); if(BPType == "Foot_L") then return "Left Foot"; elseif(BPType == "Foot_R") then return "Right Foot"; elseif(BPType == "ForeArm_L") then return "Left Fore Arm"; elseif(BPType == "ForeArm_R") then return "Right Fore Arm"; elseif(BPType == "Hand_L") then return "Left Hand"; elseif(BPType == "Hand_R") then return "Right Hand"; elseif(BPType == "LowerLeg_L") then return "Left Lower Leg"; elseif(BPType == "LowerLeg_R") then return "Right Lower Leg"; elseif(BPType == "Torso_Lower") then return "Lower Torso"; elseif(BPType == "Torso_Upper") then return "Upper Torso"; elseif(BPType == "UpperArm_L") then return "Left Upper Arm"; elseif(BPType == "UpperArm_R") then return "Right Upper Arm"; elseif(BPType == "UpperLeg_L") then return "Left Upper Leg"; elseif(BPType == "UpperLeg_R") then return "Right Upper Leg"; else return BPType; end end function ExamineArmor(items, result, player) for i=0, items:size()-1 do Armor = items:get(i); end loadArmor(Armor); local out = "Remaining Durability: " .. tostring(Armor:getModData().Durability) .. "\n"; local BPs = player:getBodyDamage():getBodyParts(); for i=0, BPs:size()-1 do if(Armor:getModData().ScratchRes ~= nil) and (Armor:getModData().ScratchRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().ScratchRes[tostring(BPs:get(i):getType())]).. "%" .. " chance to block Scratches on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().DeepWoundRes ~= nil) and (Armor:getModData().DeepWoundRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().DeepWoundRes[tostring(BPs:get(i):getType())]).. "%" .. " Chance to block to Deep Wounds on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().BiteRes ~= nil) and (Armor:getModData().BiteRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().BiteRes[tostring(BPs:get(i):getType())]) .. "%".. " Chance to block to Bites on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().GlassRes ~= nil) and (Armor:getModData().GlassRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().GlassRes[tostring(BPs:get(i):getType())]) .. "%".. " Chance to block to Glass on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().FractureRes ~= nil) and (Armor:getModData().FractureRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().FractureRes[tostring(BPs:get(i):getType())]) .. "%".. " Chance to block to Fractures on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().BurnRes ~= nil) and (Armor:getModData().BurnRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().BurnRes[tostring(BPs:get(i):getType())]) .. "%".. " Chance to block to Burns on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().BulletRes ~= nil) and (Armor:getModData().BulletRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().BulletRes[tostring(BPs:get(i):getType())]).. "%" .. " Chance to block to Bullets on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end end out = Armor:getDisplayName() .. "\n" .. out; ArmorWindow:setText(out); ArmorWindow:setVisible(true); --player:Say(); end function ArmorSaveBodyDamage(player) player:getModData().ArmorTempBodyDamage = {}; ArmorTempBodyDamage = player:getModData().ArmorTempBodyDamage; local BD = player:getBodyDamage(); --local InjuryTypes = {0 = "Scratch",1 = "DeepWound", 2 = "Burn", 3 = "BulletRes", 4 = "Fracture", 5 = "Glass"}; ArmorTempBodyDamage["IsInfected"] = BD:IsInfected(); local BPs = BD:getBodyParts(); for i=0, BPs:size()-1 do ArmorTempBodyDamage[tostring(BPs:get(i):getType())] = {Splint= false, Bandage = false, Bite = false, Scratch = false, DeepWound = false, Burn = false, Bullet = false, Fracture = false, Glass = false}; ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Splint"] = BPs:get(i):isSplint(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bandage"] = BPs:get(i):bandaged(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Scratch"] = BPs:get(i):scratched(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["DeepWound"] = BPs:get(i):deepWounded(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Burn"] = BPs:get(i):getBurnTime(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bullet"] = BPs:get(i):haveBullet(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Fracture"] = BPs:get(i):getFractureTime(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Glass"] = BPs:get(i):haveGlass(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bite"] = BPs:get(i):bitten(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["HasInjury"] = BPs:get(i):HasInjury(); end player:getModData().ArmorBDamageSaved = true; end function tryBlock(BodyPartType, InjuryType, ArmorType, player) local Armor = player:getInventory():getItemFromType(ArmorType); if(InjuryType == "Scratch") then if(Armor:getModData().ScratchRes ~= nil) and (Armor:getModData().ScratchRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().ScratchRes[BodyPartType] ); end elseif(InjuryType == "DeepWound") then if((Armor:getModData().DeepWoundRes ~= nil) and Armor:getModData().DeepWoundRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().DeepWoundRes[BodyPartType] ); end elseif(InjuryType == "Bite") then if(Armor:getModData().BiteRes ~= nil) and (Armor:getModData().BiteRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().BiteRes[BodyPartType] ); end elseif(InjuryType == "Fracture") then if(Armor:getModData().FractureRes ~= nil) and (Armor:getModData().FractureRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().FractureRes[BodyPartType] ); end elseif(InjuryType == "Burn") then if(Armor:getModData().BurnRes ~= nil) and (Armor:getModData().BurnRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().BurnRes[BodyPartType] ); end elseif(InjuryType == "Glass") then if(Armor:getModData().GlassRes ~= nil) and (Armor:getModData().GlassRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().GlassRes[BodyPartType] ); end elseif(InjuryType == "Bullet") then if(Armor:getModData().BulletRes ~= nil) and (Armor:getModData().BulletRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().BulletRes[BodyPartType] ); end end end function EquipAsShield(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); if (player:getSecondaryHandItem() == player:getPrimaryHandItem()) then player:setPrimaryHandItem(nil); end player:setSecondaryHandItem(items:get(i)); player:getModData().ShieldArmor = items:get(i):getType(); end end function EquipOnHead(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().HeadArmor = items:get(i):getType(); end end function EquipOnHands(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().HandArmor = items:get(i):getType(); end end function EquipOnArms(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().ArmArmor = items:get(i):getType(); end end function EquipOnLegs(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().LegArmor = items:get(i):getType(); end end function EquipOnChest(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().ChestArmor = items:get(i):getType(); end end function EquipOnFeet(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().FootArmor = items:get(i):getType(); end end function DamageArmor(Armor, player, InjuryType) local Damage = 1; if(InjuryType == "Scratch") then Damage = 1; elseif(InjuryType == "DeepWound") then Damage = 3; elseif(InjuryType == "Bite") then Damage = 2; elseif(InjuryType == "Fracture") then Damage = 3; elseif(InjuryType == "Burn") then Damage = 2; elseif(InjuryType == "Glass") then Damage = 2; elseif(InjuryType == "Bullet") then Damage = 5; end local isBroken = false; Armor:getModData().Durability = Armor:getModData().Durability - Damage; if (Armor:getModData().Durability <= 0) then isBroken = true; if(Armor:getModData().onBreakTurnInto ~= nil) then player:Say("adding broken armor" .. Armor:getModData().onBreakTurnInto); player:getInventory():AddItem(Armor:getModData().onBreakTurnInto); end player:getInventory():Remove(Armor); end return isBroken; end function wasDamagedBlocked(BodyPartType, InjuryType, player) if(ArmorTempBodyDamage[tostring(BodyPartType)]["Bandage"] == true) or (ArmorTempBodyDamage[tostring(BodyPartType)]["Splint"] == true) then return false; end if(player:getSecondaryHandItem() ~= nil) then if(player:getModData().ShieldArmor ~= nil) and (player:getSecondaryHandItem():getType() == player:getModData().ShieldArmor) then if(tryBlock(BodyPartType, InjuryType, player:getModData().ShieldArmor, player) == true) then if(DamageArmor(player:getInventory():getItemFromType(player:getModData().ShieldArmor),player,InjuryType) == true) then player:setSecondaryHandItem(nil); end return true; end end end if(player:getModData().HeadArmor ~= nil) and (player:getInventory():contains(player:getModData().HeadArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().HeadArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().HeadArmor),player,InjuryType); return true; end end if(player:getModData().HandArmor ~= nil) and (player:getInventory():contains(player:getModData().HandArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().HandArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().HandArmor),player,InjuryType); return true; end end if(player:getModData().ArmArmor ~= nil) and (player:getInventory():contains(player:getModData().ArmArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().ArmArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().ArmArmor),player,InjuryType); return true; end end if(player:getModData().ChestArmor ~= nil) and (player:getInventory():contains(player:getModData().ChestArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().ChestArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().ChestArmor),player,InjuryType); return true; end end if(player:getModData().LegArmor ~= nil) and (player:getInventory():contains(player:getModData().LegArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().LegArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().LegArmor),player,InjuryType); return true; end end if(player:getModData().FootArmor ~= nil) and (player:getInventory():contains(player:getModData().FootArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().FootArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().FootArmor),player,InjuryType); return true; end end return false; end function healBodyPart(bodyPart, player, BD) bodyPart:SetInfected(false); bodyPart:setInfectedWound(false); bodyPart:SetFakeInfected(false); bodyPart:setWoundInfectionLevel(0); if(ArmorTempBodyDamage["IsInfected"] == false) and (BD:IsInfected() == true) then BD:setInf(false); -- remove infection if did not have before the blocked scratch BD:setInfectionLevel(0); BD:setInfectionGrowthRate(0); BD:setIsFakeInfected(false); end bodyPart:RestoreToFullHealth(); bodyPart:DamageUpdate() ; player:Say("!"); sendClientCommand(player, "Armor", "Say", {saythis = "!"}); end function ArmorCheckForDamage(player) local ArmorbInjuryDetected = false; if(player:getModData().ArmorBDamageSaved ~= nil) and (player ~= nil) then local BD = player:getBodyDamage(); --local InjuryTypes = {0 = "Scratch",1 = "DeepWound", 2 = "Burn", 3 = "BulletRes", 4 = "Fracture", 5 = "Glass"}; ArmorTempBodyDamage = player:getModData().ArmorTempBodyDamage; local BPs = BD:getBodyParts(); for i=0, BPs:size()-1 do if((ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bandage"] == false) and (ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["HasInjury"] == false)) then if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Scratch"] ~= BPs:get(i):scratched()) and (BPs:get(i):scratched() == true) then --player:Say("Scratch Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Scratch", player)) then healBodyPart(BPs:get(i), player, BD); else ArmorbInjuryDetected = true; end end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["DeepWound"] ~= BPs:get(i):deepWounded()) and (BPs:get(i):deepWounded() == true) and (ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bullet"] ~= true) and (ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Glass"] ~= true) then if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bullet"]) or (ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Glass"]) then ArmorbInjuryDetected = true; else if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "DeepWound", player)) then healBodyPart(BPs:get(i), player, BD); else ArmorbInjuryDetected = true; end end end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bite"] ~= BPs:get(i):bitten()) and (BPs:get(i):bitten() == true) then --player:Say("Bite Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Bite", player)) then healBodyPart(BPs:get(i), player, BD); else ArmorbInjuryDetected = true; end end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Burn"] ~= BPs:get(i):getBurnTime()) and (BPs:get(i):getBurnTime() ~= 0) then --player:Say("Burn Detected on ".. tostring(BPs:get(i):getType()) ); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Burn", player)) then healBodyPart(BPs:get(i), player, BD); else ArmorbInjuryDetected = true; end end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bullet"] ~= BPs:get(i):haveBullet()) and (BPs:get(i):haveBullet() == true) and (BPs:get(i):deepWounded() == false) then --player:Say("Lodged Bullets Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Bullet", player)) then healBodyPart(BPs:get(i), player, BD); else ArmorbInjuryDetected = true; end end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Fracture"] ~= BPs:get(i):getFractureTime()) and (BPs:get(i):getFractureTime() ~= 0) and (BPs:get(i):isSplint() == false) then --player:Say("Fracture Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Fracture", player)) then healBodyPart(BPs:get(i), player, BD); else ArmorbInjuryDetected = true; end end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Glass"] ~= BPs:get(i):haveGlass()) and (BPs:get(i):haveGlass() == true) and (BPs:get(i):deepWounded() == false) then --player:Say("Logged Glass Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Glass", player)) then healBodyPart(BPs:get(i), player, BD); else ArmorbInjuryDetected = true; end end end end end if(ArmorbInjuryDetected) then ArmorSaveBodyDamage(player); end return ArmorbInjuryDetected; end function ArmorupdateThePlayer(player) ArmorCheckForDamage(player); if(player:isLocalPlayer()) then player:getInventory():Remove("HCEquiparmor"); end end function ArmorInit() ArmorSaveBodyDamage(getPlayer()); end function ArmorKeysUp(keynum) --getPlayer():Say(tostring(keynum)); if keynum == 25 then local player = getPlayer(); local armorstring = "Currently Equipped Armor \n"; if(player:getModData().ShieldArmor ~= nil) and (player:getSecondaryHandItem() ~= nil) and (player:getSecondaryHandItem():getType() == player:getModData().ShieldArmor) then armorstring = armorstring .. "Shield: " .. player:getInventory():getItemFromType(player:getModData().ShieldArmor):getDisplayName() .. "\n"; end if(player:getModData().HeadArmor ~= nil) and (player:getInventory():contains(player:getModData().HeadArmor)) then armorstring = armorstring .. "Helmet: " .. player:getInventory():getItemFromType(player:getModData().HeadArmor):getDisplayName() .. "\n"; end if(player:getModData().HandArmor ~= nil) and (player:getInventory():contains(player:getModData().HandArmor)) then armorstring = armorstring .. "Hands: " .. player:getInventory():getItemFromType(player:getModData().HandArmor):getDisplayName() .. "\n"; end if(player:getModData().ArmArmor ~= nil) and (player:getInventory():contains(player:getModData().ArmArmor)) then armorstring = armorstring .. "Arms: " .. player:getInventory():getItemFromType(player:getModData().ArmArmor):getDisplayName() .. "\n"; end if(player:getModData().LegArmor ~= nil) and (player:getInventory():contains(player:getModData().LegArmor)) then armorstring = armorstring .. "Legs: " .. player:getInventory():getItemFromType(player:getModData().LegArmor):getDisplayName() .. "\n"; end if(player:getModData().ChestArmor ~= nil) and (player:getInventory():contains(player:getModData().ChestArmor)) then armorstring = armorstring .. "Chest: " .. player:getInventory():getItemFromType(player:getModData().ChestArmor):getDisplayName() .. "\n"; end if(player:getModData().FootArmor ~= nil) and (player:getInventory():contains(player:getModData().FootArmor)) then armorstring = armorstring .. "Feet: " .. player:getInventory():getItemFromType(player:getModData().FootArmor):getDisplayName() .. "\n"; end ArmorWindow:setText(armorstring); ArmorWindow:setVisible(true); end end Events.OnKeyPressed.Add(ArmorKeysUp); Events.OnPlayerUpdate.Add(ArmorupdateThePlayer); Events.OnGameStart.Add(ArmorInit); Link to comment Share on other sites More sharing options...
Di-Crash Posted March 8, 2017 Share Posted March 8, 2017 The same result. If there are scratches and bites, the infection can also. Spoiler Link to comment Share on other sites More sharing options...
nolanri Posted March 8, 2017 Share Posted March 8, 2017 try letting only 1 zombie attack you and see if it can happen. Maybe something to do with being hit twice at the same time. Link to comment Share on other sites More sharing options...
Di-Crash Posted March 8, 2017 Share Posted March 8, 2017 (edited) 12 minutes ago, nolanri said: try letting only 1 zombie attack you and see if it can happen. Maybe something to do with being hit twice at the same time. Spoiler This time there were no injuries, not even an infection. In general, in theory, in any case, she should not protect 100 percent. Edited March 8, 2017 by Di-Crash Link to comment Share on other sites More sharing options...
Di-Crash Posted March 8, 2017 Share Posted March 8, 2017 (edited) By the way, it would be great if you did this when developing mods like this, it allows you to translate mods faster. )) Spoiler elseif(BPType == "ForeArm_R") then return getText('UIText_RightForeArm'); In addition, it allows the mod to be multilingual. Edited March 8, 2017 by Di-Crash Link to comment Share on other sites More sharing options...
Di-Crash Posted March 13, 2017 Share Posted March 13, 2017 (edited) This is a victory!!! :))) Spoiler Edited March 13, 2017 by Di-Crash Link to comment Share on other sites More sharing options...
nolanri Posted March 13, 2017 Share Posted March 13, 2017 I made some changes to armor, even found and fixed a problem that i made with the recent support for survivors mod. And I tested letting zombies eat away at me with 100% block for a good while. Then ran away and took sleeping pills and slept straight for 2 days. First i did this without Hypochondriac and then did the same with a character with Hypochondriac trait. Neither time did i get sick after the 2 days of sleeping. So here is this updated version of armor.lua Spoiler --[[ Injury Detection And Armor Based Injury Blocking By Nolan Ritchie ]] function loadArmorToPlayer(Armor, player) ArmorSaveBodyDamage(player); loadArmor(Armor); end function getBodyPartDisplayName(TypeIn) BPType = tostring(TypeIn); if(BPType == "Foot_L") then return "Left Foot"; elseif(BPType == "Foot_R") then return "Right Foot"; elseif(BPType == "ForeArm_L") then return "Left Fore Arm"; elseif(BPType == "ForeArm_R") then return "Right Fore Arm"; elseif(BPType == "Hand_L") then return "Left Hand"; elseif(BPType == "Hand_R") then return "Right Hand"; elseif(BPType == "LowerLeg_L") then return "Left Lower Leg"; elseif(BPType == "LowerLeg_R") then return "Right Lower Leg"; elseif(BPType == "Torso_Lower") then return "Lower Torso"; elseif(BPType == "Torso_Upper") then return "Upper Torso"; elseif(BPType == "UpperArm_L") then return "Left Upper Arm"; elseif(BPType == "UpperArm_R") then return "Right Upper Arm"; elseif(BPType == "UpperLeg_L") then return "Left Upper Leg"; elseif(BPType == "UpperLeg_R") then return "Right Upper Leg"; else return BPType; end end function ExamineArmor(items, result, player) for i=0, items:size()-1 do Armor = items:get(i); end loadArmor(Armor); local out = "Remaining Durability: " .. tostring(Armor:getModData().Durability) .. "\n"; local BPs = player:getBodyDamage():getBodyParts(); for i=0, BPs:size()-1 do if(Armor:getModData().ScratchRes ~= nil) and (Armor:getModData().ScratchRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().ScratchRes[tostring(BPs:get(i):getType())]).. "%" .. " chance to block Scratches on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().DeepWoundRes ~= nil) and (Armor:getModData().DeepWoundRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().DeepWoundRes[tostring(BPs:get(i):getType())]).. "%" .. " Chance to block to Deep Wounds on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().BiteRes ~= nil) and (Armor:getModData().BiteRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().BiteRes[tostring(BPs:get(i):getType())]) .. "%".. " Chance to block to Bites on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().GlassRes ~= nil) and (Armor:getModData().GlassRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().GlassRes[tostring(BPs:get(i):getType())]) .. "%".. " Chance to block to Glass on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().FractureRes ~= nil) and (Armor:getModData().FractureRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().FractureRes[tostring(BPs:get(i):getType())]) .. "%".. " Chance to block to Fractures on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().BurnRes ~= nil) and (Armor:getModData().BurnRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().BurnRes[tostring(BPs:get(i):getType())]) .. "%".. " Chance to block to Burns on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().BulletRes ~= nil) and (Armor:getModData().BulletRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().BulletRes[tostring(BPs:get(i):getType())]).. "%" .. " Chance to block to Bullets on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end end out = Armor:getDisplayName() .. "\n" .. out; ArmorWindow:setText(out); ArmorWindow:setVisible(true); --player:Say(); end function ArmorSaveBodyDamage(player) player:getModData().ArmorTempBodyDamage = {}; ArmorTempBodyDamage = player:getModData().ArmorTempBodyDamage; local BD = player:getBodyDamage(); --local InjuryTypes = {0 = "Scratch",1 = "DeepWound", 2 = "Burn", 3 = "BulletRes", 4 = "Fracture", 5 = "Glass"}; ArmorTempBodyDamage["IsInfected"] = BD:IsInfected(); local BPs = BD:getBodyParts(); for i=0, BPs:size()-1 do ArmorTempBodyDamage[tostring(BPs:get(i):getType())] = {Splint= false, Bandage = false, Bite = false, Scratch = false, DeepWound = false, Burn = false, Bullet = false, Fracture = false, Glass = false}; ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Splint"] = BPs:get(i):isSplint(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bandage"] = BPs:get(i):bandaged(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Scratch"] = BPs:get(i):scratched(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["DeepWound"] = BPs:get(i):deepWounded(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Burn"] = BPs:get(i):getBurnTime(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bullet"] = BPs:get(i):haveBullet(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Fracture"] = BPs:get(i):getFractureTime(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Glass"] = BPs:get(i):haveGlass(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bite"] = BPs:get(i):bitten(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["HasInjury"] = BPs:get(i):HasInjury(); end player:getModData().ArmorBDamageSaved = true; end function tryBlock(BodyPartType, InjuryType, ArmorType, player) local Armor = player:getInventory():getItemFromType(ArmorType); if(InjuryType == "Scratch") then if(Armor:getModData().ScratchRes ~= nil) and (Armor:getModData().ScratchRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().ScratchRes[BodyPartType] ); end elseif(InjuryType == "DeepWound") then if((Armor:getModData().DeepWoundRes ~= nil) and Armor:getModData().DeepWoundRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().DeepWoundRes[BodyPartType] ); end elseif(InjuryType == "Bite") then if(Armor:getModData().BiteRes ~= nil) and (Armor:getModData().BiteRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().BiteRes[BodyPartType] ); end elseif(InjuryType == "Fracture") then if(Armor:getModData().FractureRes ~= nil) and (Armor:getModData().FractureRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().FractureRes[BodyPartType] ); end elseif(InjuryType == "Burn") then if(Armor:getModData().BurnRes ~= nil) and (Armor:getModData().BurnRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().BurnRes[BodyPartType] ); end elseif(InjuryType == "Glass") then if(Armor:getModData().GlassRes ~= nil) and (Armor:getModData().GlassRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().GlassRes[BodyPartType] ); end elseif(InjuryType == "Bullet") then if(Armor:getModData().BulletRes ~= nil) and (Armor:getModData().BulletRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().BulletRes[BodyPartType] ); end end end function EquipAsShield(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); if (player:getSecondaryHandItem() == player:getPrimaryHandItem()) then player:setPrimaryHandItem(nil); end player:setSecondaryHandItem(items:get(i)); player:getModData().ShieldArmor = items:get(i):getType(); end end function EquipOnHead(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().HeadArmor = items:get(i):getType(); end end function EquipOnHands(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().HandArmor = items:get(i):getType(); end end function EquipOnArms(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().ArmArmor = items:get(i):getType(); end end function EquipOnLegs(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().LegArmor = items:get(i):getType(); end end function EquipOnChest(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().ChestArmor = items:get(i):getType(); end end function EquipOnFeet(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().FootArmor = items:get(i):getType(); end end function DamageArmor(Armor, player, InjuryType) local Damage = 1; if(InjuryType == "Scratch") then Damage = 1; elseif(InjuryType == "DeepWound") then Damage = 3; elseif(InjuryType == "Bite") then Damage = 2; elseif(InjuryType == "Fracture") then Damage = 3; elseif(InjuryType == "Burn") then Damage = 2; elseif(InjuryType == "Glass") then Damage = 2; elseif(InjuryType == "Bullet") then Damage = 5; end local isBroken = false; Armor:getModData().Durability = Armor:getModData().Durability - Damage; if (Armor:getModData().Durability <= 0) then isBroken = true; if(Armor:getModData().onBreakTurnInto ~= nil) then player:Say("adding broken armor" .. Armor:getModData().onBreakTurnInto); player:getInventory():AddItem(Armor:getModData().onBreakTurnInto); end player:getInventory():Remove(Armor); end return isBroken; end function wasDamagedBlocked(BodyPartType, InjuryType, player) if(ArmorTempBodyDamage[tostring(BodyPartType)]["Bandage"] == true) or (ArmorTempBodyDamage[tostring(BodyPartType)]["Splint"] == true) then return false; end if(player:getSecondaryHandItem() ~= nil) then if(player:getModData().ShieldArmor ~= nil) and (player:getSecondaryHandItem():getType() == player:getModData().ShieldArmor) then if(tryBlock(BodyPartType, InjuryType, player:getModData().ShieldArmor, player) == true) then if(DamageArmor(player:getInventory():getItemFromType(player:getModData().ShieldArmor),player,InjuryType) == true) then player:setSecondaryHandItem(nil); end return true; end end end if(player:getModData().HeadArmor ~= nil) and (player:getInventory():contains(player:getModData().HeadArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().HeadArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().HeadArmor),player,InjuryType); return true; end end if(player:getModData().HandArmor ~= nil) and (player:getInventory():contains(player:getModData().HandArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().HandArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().HandArmor),player,InjuryType); return true; end end if(player:getModData().ArmArmor ~= nil) and (player:getInventory():contains(player:getModData().ArmArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().ArmArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().ArmArmor),player,InjuryType); return true; end end if(player:getModData().ChestArmor ~= nil) and (player:getInventory():contains(player:getModData().ChestArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().ChestArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().ChestArmor),player,InjuryType); return true; end end if(player:getModData().LegArmor ~= nil) and (player:getInventory():contains(player:getModData().LegArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().LegArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().LegArmor),player,InjuryType); return true; end end if(player:getModData().FootArmor ~= nil) and (player:getInventory():contains(player:getModData().FootArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().FootArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().FootArmor),player,InjuryType); return true; end end return false; end function healBodyPart(bodyPart, player, BD, ArmorTempBodyDamage) bodyPart:SetInfected(false); bodyPart:setInfectedWound(false); bodyPart:SetFakeInfected(false); bodyPart:setWoundInfectionLevel(0); if(ArmorTempBodyDamage["IsInfected"] == false) and (BD:IsInfected() == true) then BD:setInf(false); -- remove infection if did not have before the blocked scratch BD:setInfectionLevel(0); BD:setInfectionGrowthRate(0); BD:setFakeInfectionLevel(0); end bodyPart:RestoreToFullHealth(); player:Say("!"); sendClientCommand(player, "Armor", "Say", {saythis = "!"}); end function ArmorCheckForDamage(player) local ArmorbInjuryDetected = false; if(player:getModData().ArmorBDamageSaved ~= nil) and (player ~= nil) then local BD = player:getBodyDamage(); --local InjuryTypes = {0 = "Scratch",1 = "DeepWound", 2 = "Burn", 3 = "BulletRes", 4 = "Fracture", 5 = "Glass"}; ArmorTempBodyDamage = player:getModData().ArmorTempBodyDamage; local BPs = BD:getBodyParts(); for i=0, BPs:size()-1 do if((ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bandage"] == false) and (ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["HasInjury"] == false)) then if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Scratch"] ~= BPs:get(i):scratched()) and (BPs:get(i):scratched() == true) then --player:Say("Scratch Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Scratch", player)) then healBodyPart(BPs:get(i), player, BD, ArmorTempBodyDamage); end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["DeepWound"] ~= BPs:get(i):deepWounded()) and (BPs:get(i):deepWounded() == true) and (ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bullet"] ~= true) and (ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Glass"] ~= true) then if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bullet"]) or (ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Glass"]) then ArmorbInjuryDetected = true; else if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "DeepWound", player)) then healBodyPart(BPs:get(i), player, BD, ArmorTempBodyDamage); end end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bite"] ~= BPs:get(i):bitten()) and (BPs:get(i):bitten() == true) then --player:Say("Bite Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Bite", player)) then healBodyPart(BPs:get(i), player, BD, ArmorTempBodyDamage); end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Burn"] ~= BPs:get(i):getBurnTime()) and (BPs:get(i):getBurnTime() ~= 0) then --player:Say("Burn Detected on ".. tostring(BPs:get(i):getType()) ); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Burn", player)) then healBodyPart(BPs:get(i), player, BD, ArmorTempBodyDamage); end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bullet"] ~= BPs:get(i):haveBullet()) and (BPs:get(i):haveBullet() == true) and (BPs:get(i):deepWounded() == false) then --player:Say("Lodged Bullets Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Bullet", player)) then healBodyPart(BPs:get(i), player, BD, ArmorTempBodyDamage); end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Fracture"] ~= BPs:get(i):getFractureTime()) and (BPs:get(i):getFractureTime() ~= 0) and (BPs:get(i):isSplint() == false) then --player:Say("Fracture Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Fracture", player)) then healBodyPart(BPs:get(i), player, BD, ArmorTempBodyDamage); end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Glass"] ~= BPs:get(i):haveGlass()) and (BPs:get(i):haveGlass() == true) and (BPs:get(i):deepWounded() == false) then --player:Say("Logged Glass Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Glass", player)) then healBodyPart(BPs:get(i), player, BD, ArmorTempBodyDamage); end ArmorbInjuryDetected = true; end end end end if(ArmorbInjuryDetected) then ArmorSaveBodyDamage(player); end return ArmorbInjuryDetected; end function ArmorupdateThePlayer(player) ArmorCheckForDamage(player); if(player:isLocalPlayer()) then player:getInventory():Remove("HCEquiparmor"); end end function ArmorInit() ArmorSaveBodyDamage(getPlayer()); end function ArmorKeysUp(keynum) --getPlayer():Say(tostring(keynum)); if keynum == 25 then local player = getPlayer(); local armorstring = "Currently Equipped Armor \n"; if(player:getModData().ShieldArmor ~= nil) and (player:getSecondaryHandItem() ~= nil) and (player:getSecondaryHandItem():getType() == player:getModData().ShieldArmor) then armorstring = armorstring .. "Shield: " .. player:getInventory():getItemFromType(player:getModData().ShieldArmor):getDisplayName() .. "\n"; end if(player:getModData().HeadArmor ~= nil) and (player:getInventory():contains(player:getModData().HeadArmor)) then armorstring = armorstring .. "Helmet: " .. player:getInventory():getItemFromType(player:getModData().HeadArmor):getDisplayName() .. "\n"; end if(player:getModData().HandArmor ~= nil) and (player:getInventory():contains(player:getModData().HandArmor)) then armorstring = armorstring .. "Hands: " .. player:getInventory():getItemFromType(player:getModData().HandArmor):getDisplayName() .. "\n"; end if(player:getModData().ArmArmor ~= nil) and (player:getInventory():contains(player:getModData().ArmArmor)) then armorstring = armorstring .. "Arms: " .. player:getInventory():getItemFromType(player:getModData().ArmArmor):getDisplayName() .. "\n"; end if(player:getModData().LegArmor ~= nil) and (player:getInventory():contains(player:getModData().LegArmor)) then armorstring = armorstring .. "Legs: " .. player:getInventory():getItemFromType(player:getModData().LegArmor):getDisplayName() .. "\n"; end if(player:getModData().ChestArmor ~= nil) and (player:getInventory():contains(player:getModData().ChestArmor)) then armorstring = armorstring .. "Chest: " .. player:getInventory():getItemFromType(player:getModData().ChestArmor):getDisplayName() .. "\n"; end if(player:getModData().FootArmor ~= nil) and (player:getInventory():contains(player:getModData().FootArmor)) then armorstring = armorstring .. "Feet: " .. player:getInventory():getItemFromType(player:getModData().FootArmor):getDisplayName() .. "\n"; end ArmorWindow:setText(armorstring); ArmorWindow:setVisible(true); end end Events.OnKeyPressed.Add(ArmorKeysUp); Events.OnPlayerUpdate.Add(ArmorupdateThePlayer); Events.OnGameStart.Add(ArmorInit); Link to comment Share on other sites More sharing options...
Di-Crash Posted March 13, 2017 Share Posted March 13, 2017 12 minutes ago, nolanri said: I made some changes to armor, even found and fixed a problem that i made with the recent support for survivors mod. And I tested letting zombies eat away at me with 100% block for a good while. Then ran away and took sleeping pills and slept straight for 2 days. First i did this without Hypochondriac and then did the same with a character with Hypochondriac trait. Neither time did i get sick after the 2 days of sleeping. So here is this updated version of armor.lua Reveal hidden contents --[[ Injury Detection And Armor Based Injury Blocking By Nolan Ritchie ]] function loadArmorToPlayer(Armor, player) ArmorSaveBodyDamage(player); loadArmor(Armor); end function getBodyPartDisplayName(TypeIn) BPType = tostring(TypeIn); if(BPType == "Foot_L") then return "Left Foot"; elseif(BPType == "Foot_R") then return "Right Foot"; elseif(BPType == "ForeArm_L") then return "Left Fore Arm"; elseif(BPType == "ForeArm_R") then return "Right Fore Arm"; elseif(BPType == "Hand_L") then return "Left Hand"; elseif(BPType == "Hand_R") then return "Right Hand"; elseif(BPType == "LowerLeg_L") then return "Left Lower Leg"; elseif(BPType == "LowerLeg_R") then return "Right Lower Leg"; elseif(BPType == "Torso_Lower") then return "Lower Torso"; elseif(BPType == "Torso_Upper") then return "Upper Torso"; elseif(BPType == "UpperArm_L") then return "Left Upper Arm"; elseif(BPType == "UpperArm_R") then return "Right Upper Arm"; elseif(BPType == "UpperLeg_L") then return "Left Upper Leg"; elseif(BPType == "UpperLeg_R") then return "Right Upper Leg"; else return BPType; end end function ExamineArmor(items, result, player) for i=0, items:size()-1 do Armor = items:get(i); end loadArmor(Armor); local out = "Remaining Durability: " .. tostring(Armor:getModData().Durability) .. "\n"; local BPs = player:getBodyDamage():getBodyParts(); for i=0, BPs:size()-1 do if(Armor:getModData().ScratchRes ~= nil) and (Armor:getModData().ScratchRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().ScratchRes[tostring(BPs:get(i):getType())]).. "%" .. " chance to block Scratches on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().DeepWoundRes ~= nil) and (Armor:getModData().DeepWoundRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().DeepWoundRes[tostring(BPs:get(i):getType())]).. "%" .. " Chance to block to Deep Wounds on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().BiteRes ~= nil) and (Armor:getModData().BiteRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().BiteRes[tostring(BPs:get(i):getType())]) .. "%".. " Chance to block to Bites on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().GlassRes ~= nil) and (Armor:getModData().GlassRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().GlassRes[tostring(BPs:get(i):getType())]) .. "%".. " Chance to block to Glass on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().FractureRes ~= nil) and (Armor:getModData().FractureRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().FractureRes[tostring(BPs:get(i):getType())]) .. "%".. " Chance to block to Fractures on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().BurnRes ~= nil) and (Armor:getModData().BurnRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().BurnRes[tostring(BPs:get(i):getType())]) .. "%".. " Chance to block to Burns on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end if(Armor:getModData().BulletRes ~= nil) and (Armor:getModData().BulletRes[tostring(BPs:get(i):getType())] ~= nil) then out = out .. tostring(Armor:getModData().BulletRes[tostring(BPs:get(i):getType())]).. "%" .. " Chance to block to Bullets on the " .. getBodyPartDisplayName(BPs:get(i):getType()) .. "\n"; end end out = Armor:getDisplayName() .. "\n" .. out; ArmorWindow:setText(out); ArmorWindow:setVisible(true); --player:Say(); end function ArmorSaveBodyDamage(player) player:getModData().ArmorTempBodyDamage = {}; ArmorTempBodyDamage = player:getModData().ArmorTempBodyDamage; local BD = player:getBodyDamage(); --local InjuryTypes = {0 = "Scratch",1 = "DeepWound", 2 = "Burn", 3 = "BulletRes", 4 = "Fracture", 5 = "Glass"}; ArmorTempBodyDamage["IsInfected"] = BD:IsInfected(); local BPs = BD:getBodyParts(); for i=0, BPs:size()-1 do ArmorTempBodyDamage[tostring(BPs:get(i):getType())] = {Splint= false, Bandage = false, Bite = false, Scratch = false, DeepWound = false, Burn = false, Bullet = false, Fracture = false, Glass = false}; ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Splint"] = BPs:get(i):isSplint(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bandage"] = BPs:get(i):bandaged(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Scratch"] = BPs:get(i):scratched(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["DeepWound"] = BPs:get(i):deepWounded(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Burn"] = BPs:get(i):getBurnTime(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bullet"] = BPs:get(i):haveBullet(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Fracture"] = BPs:get(i):getFractureTime(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Glass"] = BPs:get(i):haveGlass(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bite"] = BPs:get(i):bitten(); ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["HasInjury"] = BPs:get(i):HasInjury(); end player:getModData().ArmorBDamageSaved = true; end function tryBlock(BodyPartType, InjuryType, ArmorType, player) local Armor = player:getInventory():getItemFromType(ArmorType); if(InjuryType == "Scratch") then if(Armor:getModData().ScratchRes ~= nil) and (Armor:getModData().ScratchRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().ScratchRes[BodyPartType] ); end elseif(InjuryType == "DeepWound") then if((Armor:getModData().DeepWoundRes ~= nil) and Armor:getModData().DeepWoundRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().DeepWoundRes[BodyPartType] ); end elseif(InjuryType == "Bite") then if(Armor:getModData().BiteRes ~= nil) and (Armor:getModData().BiteRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().BiteRes[BodyPartType] ); end elseif(InjuryType == "Fracture") then if(Armor:getModData().FractureRes ~= nil) and (Armor:getModData().FractureRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().FractureRes[BodyPartType] ); end elseif(InjuryType == "Burn") then if(Armor:getModData().BurnRes ~= nil) and (Armor:getModData().BurnRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().BurnRes[BodyPartType] ); end elseif(InjuryType == "Glass") then if(Armor:getModData().GlassRes ~= nil) and (Armor:getModData().GlassRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().GlassRes[BodyPartType] ); end elseif(InjuryType == "Bullet") then if(Armor:getModData().BulletRes ~= nil) and (Armor:getModData().BulletRes[BodyPartType] ~= nil) then return ( (ZombRand(100)+1) < Armor:getModData().BulletRes[BodyPartType] ); end end end function EquipAsShield(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); if (player:getSecondaryHandItem() == player:getPrimaryHandItem()) then player:setPrimaryHandItem(nil); end player:setSecondaryHandItem(items:get(i)); player:getModData().ShieldArmor = items:get(i):getType(); end end function EquipOnHead(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().HeadArmor = items:get(i):getType(); end end function EquipOnHands(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().HandArmor = items:get(i):getType(); end end function EquipOnArms(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().ArmArmor = items:get(i):getType(); end end function EquipOnLegs(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().LegArmor = items:get(i):getType(); end end function EquipOnChest(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().ChestArmor = items:get(i):getType(); end end function EquipOnFeet(items, result, player) -- Recipe must only have one ingredient which is the armor, and be set to "keep" for i=0, items:size()-1 do loadArmorToPlayer(items:get(i), player); player:getModData().FootArmor = items:get(i):getType(); end end function DamageArmor(Armor, player, InjuryType) local Damage = 1; if(InjuryType == "Scratch") then Damage = 1; elseif(InjuryType == "DeepWound") then Damage = 3; elseif(InjuryType == "Bite") then Damage = 2; elseif(InjuryType == "Fracture") then Damage = 3; elseif(InjuryType == "Burn") then Damage = 2; elseif(InjuryType == "Glass") then Damage = 2; elseif(InjuryType == "Bullet") then Damage = 5; end local isBroken = false; Armor:getModData().Durability = Armor:getModData().Durability - Damage; if (Armor:getModData().Durability <= 0) then isBroken = true; if(Armor:getModData().onBreakTurnInto ~= nil) then player:Say("adding broken armor" .. Armor:getModData().onBreakTurnInto); player:getInventory():AddItem(Armor:getModData().onBreakTurnInto); end player:getInventory():Remove(Armor); end return isBroken; end function wasDamagedBlocked(BodyPartType, InjuryType, player) if(ArmorTempBodyDamage[tostring(BodyPartType)]["Bandage"] == true) or (ArmorTempBodyDamage[tostring(BodyPartType)]["Splint"] == true) then return false; end if(player:getSecondaryHandItem() ~= nil) then if(player:getModData().ShieldArmor ~= nil) and (player:getSecondaryHandItem():getType() == player:getModData().ShieldArmor) then if(tryBlock(BodyPartType, InjuryType, player:getModData().ShieldArmor, player) == true) then if(DamageArmor(player:getInventory():getItemFromType(player:getModData().ShieldArmor),player,InjuryType) == true) then player:setSecondaryHandItem(nil); end return true; end end end if(player:getModData().HeadArmor ~= nil) and (player:getInventory():contains(player:getModData().HeadArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().HeadArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().HeadArmor),player,InjuryType); return true; end end if(player:getModData().HandArmor ~= nil) and (player:getInventory():contains(player:getModData().HandArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().HandArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().HandArmor),player,InjuryType); return true; end end if(player:getModData().ArmArmor ~= nil) and (player:getInventory():contains(player:getModData().ArmArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().ArmArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().ArmArmor),player,InjuryType); return true; end end if(player:getModData().ChestArmor ~= nil) and (player:getInventory():contains(player:getModData().ChestArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().ChestArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().ChestArmor),player,InjuryType); return true; end end if(player:getModData().LegArmor ~= nil) and (player:getInventory():contains(player:getModData().LegArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().LegArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().LegArmor),player,InjuryType); return true; end end if(player:getModData().FootArmor ~= nil) and (player:getInventory():contains(player:getModData().FootArmor)) then if(tryBlock(BodyPartType, InjuryType, player:getModData().FootArmor, player) == true) then DamageArmor(player:getInventory():getItemFromType(player:getModData().FootArmor),player,InjuryType); return true; end end return false; end function healBodyPart(bodyPart, player, BD, ArmorTempBodyDamage) bodyPart:SetInfected(false); bodyPart:setInfectedWound(false); bodyPart:SetFakeInfected(false); bodyPart:setWoundInfectionLevel(0); if(ArmorTempBodyDamage["IsInfected"] == false) and (BD:IsInfected() == true) then BD:setInf(false); -- remove infection if did not have before the blocked scratch BD:setInfectionLevel(0); BD:setInfectionGrowthRate(0); BD:setFakeInfectionLevel(0); end bodyPart:RestoreToFullHealth(); player:Say("!"); sendClientCommand(player, "Armor", "Say", {saythis = "!"}); end function ArmorCheckForDamage(player) local ArmorbInjuryDetected = false; if(player:getModData().ArmorBDamageSaved ~= nil) and (player ~= nil) then local BD = player:getBodyDamage(); --local InjuryTypes = {0 = "Scratch",1 = "DeepWound", 2 = "Burn", 3 = "BulletRes", 4 = "Fracture", 5 = "Glass"}; ArmorTempBodyDamage = player:getModData().ArmorTempBodyDamage; local BPs = BD:getBodyParts(); for i=0, BPs:size()-1 do if((ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bandage"] == false) and (ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["HasInjury"] == false)) then if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Scratch"] ~= BPs:get(i):scratched()) and (BPs:get(i):scratched() == true) then --player:Say("Scratch Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Scratch", player)) then healBodyPart(BPs:get(i), player, BD, ArmorTempBodyDamage); end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["DeepWound"] ~= BPs:get(i):deepWounded()) and (BPs:get(i):deepWounded() == true) and (ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bullet"] ~= true) and (ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Glass"] ~= true) then if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bullet"]) or (ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Glass"]) then ArmorbInjuryDetected = true; else if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "DeepWound", player)) then healBodyPart(BPs:get(i), player, BD, ArmorTempBodyDamage); end end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bite"] ~= BPs:get(i):bitten()) and (BPs:get(i):bitten() == true) then --player:Say("Bite Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Bite", player)) then healBodyPart(BPs:get(i), player, BD, ArmorTempBodyDamage); end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Burn"] ~= BPs:get(i):getBurnTime()) and (BPs:get(i):getBurnTime() ~= 0) then --player:Say("Burn Detected on ".. tostring(BPs:get(i):getType()) ); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Burn", player)) then healBodyPart(BPs:get(i), player, BD, ArmorTempBodyDamage); end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Bullet"] ~= BPs:get(i):haveBullet()) and (BPs:get(i):haveBullet() == true) and (BPs:get(i):deepWounded() == false) then --player:Say("Lodged Bullets Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Bullet", player)) then healBodyPart(BPs:get(i), player, BD, ArmorTempBodyDamage); end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Fracture"] ~= BPs:get(i):getFractureTime()) and (BPs:get(i):getFractureTime() ~= 0) and (BPs:get(i):isSplint() == false) then --player:Say("Fracture Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Fracture", player)) then healBodyPart(BPs:get(i), player, BD, ArmorTempBodyDamage); end ArmorbInjuryDetected = true; end if(ArmorTempBodyDamage[tostring(BPs:get(i):getType())]["Glass"] ~= BPs:get(i):haveGlass()) and (BPs:get(i):haveGlass() == true) and (BPs:get(i):deepWounded() == false) then --player:Say("Logged Glass Detected on ".. tostring(BPs:get(i):getType())); if(wasDamagedBlocked(tostring(BPs:get(i):getType()), "Glass", player)) then healBodyPart(BPs:get(i), player, BD, ArmorTempBodyDamage); end ArmorbInjuryDetected = true; end end end end if(ArmorbInjuryDetected) then ArmorSaveBodyDamage(player); end return ArmorbInjuryDetected; end function ArmorupdateThePlayer(player) ArmorCheckForDamage(player); if(player:isLocalPlayer()) then player:getInventory():Remove("HCEquiparmor"); end end function ArmorInit() ArmorSaveBodyDamage(getPlayer()); end function ArmorKeysUp(keynum) --getPlayer():Say(tostring(keynum)); if keynum == 25 then local player = getPlayer(); local armorstring = "Currently Equipped Armor \n"; if(player:getModData().ShieldArmor ~= nil) and (player:getSecondaryHandItem() ~= nil) and (player:getSecondaryHandItem():getType() == player:getModData().ShieldArmor) then armorstring = armorstring .. "Shield: " .. player:getInventory():getItemFromType(player:getModData().ShieldArmor):getDisplayName() .. "\n"; end if(player:getModData().HeadArmor ~= nil) and (player:getInventory():contains(player:getModData().HeadArmor)) then armorstring = armorstring .. "Helmet: " .. player:getInventory():getItemFromType(player:getModData().HeadArmor):getDisplayName() .. "\n"; end if(player:getModData().HandArmor ~= nil) and (player:getInventory():contains(player:getModData().HandArmor)) then armorstring = armorstring .. "Hands: " .. player:getInventory():getItemFromType(player:getModData().HandArmor):getDisplayName() .. "\n"; end if(player:getModData().ArmArmor ~= nil) and (player:getInventory():contains(player:getModData().ArmArmor)) then armorstring = armorstring .. "Arms: " .. player:getInventory():getItemFromType(player:getModData().ArmArmor):getDisplayName() .. "\n"; end if(player:getModData().LegArmor ~= nil) and (player:getInventory():contains(player:getModData().LegArmor)) then armorstring = armorstring .. "Legs: " .. player:getInventory():getItemFromType(player:getModData().LegArmor):getDisplayName() .. "\n"; end if(player:getModData().ChestArmor ~= nil) and (player:getInventory():contains(player:getModData().ChestArmor)) then armorstring = armorstring .. "Chest: " .. player:getInventory():getItemFromType(player:getModData().ChestArmor):getDisplayName() .. "\n"; end if(player:getModData().FootArmor ~= nil) and (player:getInventory():contains(player:getModData().FootArmor)) then armorstring = armorstring .. "Feet: " .. player:getInventory():getItemFromType(player:getModData().FootArmor):getDisplayName() .. "\n"; end ArmorWindow:setText(armorstring); ArmorWindow:setVisible(true); end end Events.OnKeyPressed.Add(ArmorKeysUp); Events.OnPlayerUpdate.Add(ArmorupdateThePlayer); Events.OnGameStart.Add(ArmorInit); Do not see any changes in the code? What changed? You watched my video in which I demostrated the fully equipped and removed armor? Link to comment Share on other sites More sharing options...
nolanri Posted March 13, 2017 Share Posted March 13, 2017 1 minute ago, Di-Crash said: Do not see any changes in the code? What changed? You watched my video in which I demostrated the fully equipped and removed armor? extra param in healbodypart function. healbodypart function altered a fair bit aswell. i saw your vid in your " This is a victory!!! :))) " post. but i don't understand it, as it is all russian. Ya ne govoryu per russki Link to comment Share on other sites More sharing options...
Di-Crash Posted March 13, 2017 Share Posted March 13, 2017 1 minute ago, nolanri said: extra param in healbodypart function. healbodypart function altered a fair bit aswell. i saw your vid in your " This is a victory!!! :))) " post. but i don't understand it, as it is all russian. Ya ne govoryu per russki I wrote the code that equip and unequip armor without the participation of recipes. Context menu, check the subject and create options: Spoiler MGContextMenu = {}; MGContextMenu.init = function(_player, context, _items) local player = getSpecificPlayer(_player); local clickedItems = _items; if #clickedItems > 1 then return; end for i, item in ipairs(clickedItems) do if not instanceof(item, "InventoryItem") then item = item.items[2]; end if instanceof(item, "InventoryItem") then MGContextMenu.createMenus(player, context, item); end end end MGContextMenu.createMenus = function(player, context, item) local itemType = item:getType(); if itemType == "ParamedicHelmet" or itemType == "MICH2000HelmetUCP" or itemType == "MICH2000HelmetMulticam" or itemType == "IOTVUCP" or itemType == "IOTVMulticam" or itemType == "TacticalElbowBlack" or itemType == "TacticalElbowOlive" or itemType == "TacticalGlovesBlack" or itemType == "TacticalGlovesOlive" or itemType == "TacticalKneeBlack" or itemType == "TacticalKneeOlive" then local time = 0 HeadArmor = item:getModData().EquipedHeadArmor; ChestArmor = item:getModData().EquipedChestArmor; ArmArmor = item:getModData().EquipedArmArmor; HandArmor = item:getModData().EquipedHandArmor; LegArmor = item:getModData().EquipedLegArmor; FootArmor = item:getModData().EquipedFootArmor; if itemType == "MICH2000HelmetMulticam" or itemType == "MICH2000HelmetUCP" or itemType == "ParamedicHelmet" then time = 60 end if itemType == "IOTVMulticam" or itemType == "IOTVUCP" then time = 150 end if itemType == "TacticalElbowOlive" or itemType == "TacticalElbowBlack" then time = 70 end if itemType == "TacticalGlovesOlive" or itemType == "TacticalGlovesBlack" then time = 40 end if itemType == "TacticalKneeOlive" or itemType == "TacticalKneeBlack" then time = 80 end -- if itemType == "" or itemType == "" then -- time = 90 -- end if (HeadArmor or ChestArmor or ArmArmor or HandArmor or LegArmor or FootArmor) ~= 1 then context:addOption(getText("UI_Text_Equip_Armor"), item, MGContextMenu.EquipArmor, player, time); end if (HeadArmor or ChestArmor or ArmArmor or HandArmor or LegArmor or FootArmor) == 1 then context:addOption(getText("UI_Text_Unequip_Armor"), item, MGContextMenu.UnequipArmor, player, time); end context:addOption(getText("UI_Text_Inspect_Armor"), item, MGContextMenu.InspectArmor, player, time); end end MGContextMenu.EquipArmor = function(item, player, time) if luautils.haveToBeTransfered(player, item) then ISTimedActionQueue.add(ISInventoryTransferAction:new(player, item, item:getContainer(), player:getInventory())); end ISTimedActionQueue.add(MGEquipArmorAction:new(player, item, time)); end MGContextMenu.UnequipArmor = function(item, player, time) if luautils.haveToBeTransfered(player, item) then ISTimedActionQueue.add(ISInventoryTransferAction:new(player, item, item:getContainer(), player:getInventory())); end ISTimedActionQueue.add(MGUnequipArmorAction:new(player, item, time)); end MGContextMenu.InspectArmor = function(item, player, time) if luautils.haveToBeTransfered(player, item) then ISTimedActionQueue.add(ISInventoryTransferAction:new(player, item, item:getContainer(), player:getInventory())); end ISTimedActionQueue.add(MGInspectArmorAction:new(player, item, time)); end Events.OnFillInventoryObjectContextMenu.Add(MGContextMenu.init); Time action. Equipping armor on the character: Spoiler require "TimedActions/ISBaseTimedAction" MGEquipArmorAction = ISBaseTimedAction:derive("MGEquipArmorAction"); function MGEquipArmorAction:isValid() return self.character:getInventory():contains(self.item); end function MGEquipArmorAction:update() self.item:setJobDelta(self:getJobDelta()); end function MGEquipArmorAction:start() self.item:setJobType(getText("UI_Text_Equip_Armor")); self.item:setJobDelta(0.0); end function MGEquipArmorAction:stop() ISBaseTimedAction.stop(self); self.item:setJobDelta(0.0); end function MGEquipArmorAction:perform() self.item:getContainer():setDrawDirty(true); self.item:setJobDelta(0.0); local itemType = self.item:getType(); local player = self.character; if itemType == "MICH2000HelmetMulticam" or itemType == "MICH2000HelmetUCP" or itemType == "ParamedicHelmet" then local EquipedItem = self.item; local items = player:getInventory():getItems(); for i = 0, items:size()-1 do local CurrentArmor = items:get(i); if CurrentArmor:getModData().EquipedHeadArmor == 1 then CurrentArmor:getModData().EquipedHeadArmor = 0; end end EquipedItem:getModData().EquipedHeadArmor = 1; EquipOnHead(EquipedItem, player) end if itemType == "IOTVMulticam" or itemType == "IOTVUCP" then local EquipedItem = self.item; local items = player:getInventory():getItems(); for i = 0, items:size()-1 do local CurrentArmor = items:get(i); if CurrentArmor:getModData().EquipedChestArmor == 1 then CurrentArmor:getModData().EquipedChestArmor = 0; end end EquipedItem:getModData().EquipedChestArmor = 1; EquipedItem:setActualWeight(EquipedItem:getEquippedWeight()); EquipOnChest(EquipedItem, player) end if itemType == "TacticalElbowOlive" or itemType == "TacticalElbowBlack" then local EquipedItem = self.item; local items = player:getInventory():getItems(); for i = 0, items:size()-1 do local CurrentArmor = items:get(i); if CurrentArmor:getModData().EquipedArmArmor == 1 then CurrentArmor:getModData().EquipedArmArmor = 0; end end EquipedItem:getModData().EquipedArmArmor = 1; EquipOnArms(EquipedItem, player) end if itemType == "TacticalGlovesOlive" or itemType == "TacticalGlovesBlack" then local EquipedItem = self.item; local items = player:getInventory():getItems(); for i = 0, items:size()-1 do local CurrentArmor = items:get(i); if CurrentArmor:getModData().EquipedHandArmor == 1 then CurrentArmor:getModData().EquipedHandArmor = 0; end end EquipedItem:getModData().EquipedHandArmor = 1; EquipOnHands(EquipedItem, player) end if itemType == "TacticalKneeOlive" or itemType == "TacticalKneeBlack" then local EquipedItem = self.item; local items = player:getInventory():getItems(); for i = 0, items:size()-1 do local CurrentArmor = items:get(i); if CurrentArmor:getModData().EquipedLegArmor == 1 then CurrentArmor:getModData().EquipedLegArmor = 0; end end EquipedItem:getModData().EquipedLegArmor = 1; EquipOnLegs(EquipedItem, player) end -- if itemType == "" or itemType == "" then -- local EquipedItem = self.item; -- local items = player:getInventory():getItems(); -- for i = 0, items:size()-1 do -- local CurrentArmor = items:get(i); -- if CurrentArmor:getModData().EquipedFootArmor == 1 then -- CurrentArmor:getModData().EquipedFootArmor = 0; -- end -- end -- EquipedItem:getModData().EquipedFootArmor = 1; -- EquipOnFeet(EquipedItem, player) -- end -- needed to remove from queue / start next. ISBaseTimedAction.perform(self); end function MGEquipArmorAction:new(character, item, time) local o = {} setmetatable(o, self) self.__index = self o.character = character; o.item = item; o.stopOnWalk = true; o.stopOnRun = true; o.maxTime = time; return o end Time action. Removing the armor from the character: Spoiler require "TimedActions/ISBaseTimedAction" MGUnequipArmorAction = ISBaseTimedAction:derive("MGUnequipArmorAction"); function MGUnequipArmorAction:isValid() return self.character:getInventory():contains(self.item); end function MGUnequipArmorAction:update() self.item:setJobDelta(self:getJobDelta()); end function MGUnequipArmorAction:start() self.item:setJobType(getText("UI_Text_Unequip_Armor")); self.item:setJobDelta(0.0); end function MGUnequipArmorAction:stop() ISBaseTimedAction.stop(self); self.item:setJobDelta(0.0); end function MGUnequipArmorAction:perform() self.item:getContainer():setDrawDirty(true); self.item:setJobDelta(0.0); local itemType = self.item:getType(); local player = self.character; if itemType == "MICH2000HelmetMulticam" or itemType == "MICH2000HelmetUCP" or itemType == "ParamedicHelmet" then local EquipedItem = self.item; EquipedItem:getModData().EquipedHeadArmor = 0; end if itemType == "IOTVMulticam" or itemType == "IOTVUCP" then local EquipedItem = self.item; EquipedItem:getModData().EquipedChestArmor = 0; end if itemType == "TacticalElbowOlive" or itemType == "TacticalElbowBlack" then local EquipedItem = self.item; EquipedItem:getModData().EquipedArmArmor = 0; end if itemType == "TacticalGlovesOlive" or itemType == "TacticalGlovesBlack" then local EquipedItem = self.item; EquipedItem:getModData().EquipedHandArmor = 0; end if itemType == "TacticalKneeOlive" or itemType == "TacticalKneeBlack" then local EquipedItem = self.item; EquipedItem:getModData().EquipedLegArmor = 0; end -- if itemType == "" or itemType == "" then -- local EquipedItem = self.item; -- EquipedItem:getModData().EquipedFootArmor = 0; -- end -- needed to remove from queue / start next. ISBaseTimedAction.perform(self); end function MGUnequipArmorAction:new(character, item, time) local o = {} setmetatable(o, self) self.__index = self o.character = character; o.item = item; o.stopOnWalk = true; o.stopOnRun = true; o.maxTime = time; return o end Time action. Activating the equipment inspection window: Spoiler require "TimedActions/ISBaseTimedAction" MGInspectArmorAction = ISBaseTimedAction:derive("MGInspectArmorAction"); function MGInspectArmorAction:isValid() return self.character:getInventory():contains(self.item); end function MGInspectArmorAction:update() self.item:setJobDelta(self:getJobDelta()); end function MGInspectArmorAction:start() self.item:setJobType(getText("UI_Text_Inspect_Armor")); self.item:setJobDelta(0.0); end function MGInspectArmorAction:stop() ISBaseTimedAction.stop(self); self.item:setJobDelta(0.0); end function MGInspectArmorAction:perform() self.item:getContainer():setDrawDirty(true); self.item:setJobDelta(0.0); local player = self.character; local item = self.item ExamineArmor(item, player) -- needed to remove from queue / start next. ISBaseTimedAction.perform(self); end function MGInspectArmorAction:new(character, item, time) local o = {} setmetatable(o, self) self.__index = self o.character = character; o.item = item; o.stopOnWalk = true; o.stopOnRun = true; o.maxTime = time; return o end The code has not yet been completely completed, lacks some mechanisms, such as checking the weight of the armored armor. Link to comment Share on other sites More sharing options...
nolanri Posted March 13, 2017 Share Posted March 13, 2017 6 minutes ago, Di-Crash said: I wrote the code that equip and unequip armor without the participation of recipes. Context menu, check the subject and create options: Hide contents MGContextMenu = {}; MGContextMenu.init = function(_player, context, _items) local player = getSpecificPlayer(_player); local clickedItems = _items; if #clickedItems > 1 then return; end for i, item in ipairs(clickedItems) do if not instanceof(item, "InventoryItem") then item = item.items[2]; end if instanceof(item, "InventoryItem") then MGContextMenu.createMenus(player, context, item); end end end MGContextMenu.createMenus = function(player, context, item) local itemType = item:getType(); if itemType == "ParamedicHelmet" or itemType == "MICH2000HelmetUCP" or itemType == "MICH2000HelmetMulticam" or itemType == "IOTVUCP" or itemType == "IOTVMulticam" or itemType == "TacticalElbowBlack" or itemType == "TacticalElbowOlive" or itemType == "TacticalGlovesBlack" or itemType == "TacticalGlovesOlive" or itemType == "TacticalKneeBlack" or itemType == "TacticalKneeOlive" then local time = 0 HeadArmor = item:getModData().EquipedHeadArmor; ChestArmor = item:getModData().EquipedChestArmor; ArmArmor = item:getModData().EquipedArmArmor; HandArmor = item:getModData().EquipedHandArmor; LegArmor = item:getModData().EquipedLegArmor; FootArmor = item:getModData().EquipedFootArmor; if itemType == "MICH2000HelmetMulticam" or itemType == "MICH2000HelmetUCP" or itemType == "ParamedicHelmet" then time = 60 end if itemType == "IOTVMulticam" or itemType == "IOTVUCP" then time = 150 end if itemType == "TacticalElbowOlive" or itemType == "TacticalElbowBlack" then time = 70 end if itemType == "TacticalGlovesOlive" or itemType == "TacticalGlovesBlack" then time = 40 end if itemType == "TacticalKneeOlive" or itemType == "TacticalKneeBlack" then time = 80 end -- if itemType == "" or itemType == "" then -- time = 90 -- end if (HeadArmor or ChestArmor or ArmArmor or HandArmor or LegArmor or FootArmor) ~= 1 then context:addOption(getText("UI_Text_Equip_Armor"), item, MGContextMenu.EquipArmor, player, time); end if (HeadArmor or ChestArmor or ArmArmor or HandArmor or LegArmor or FootArmor) == 1 then context:addOption(getText("UI_Text_Unequip_Armor"), item, MGContextMenu.UnequipArmor, player, time); end context:addOption(getText("UI_Text_Inspect_Armor"), item, MGContextMenu.InspectArmor, player, time); end end MGContextMenu.EquipArmor = function(item, player, time) if luautils.haveToBeTransfered(player, item) then ISTimedActionQueue.add(ISInventoryTransferAction:new(player, item, item:getContainer(), player:getInventory())); end ISTimedActionQueue.add(MGEquipArmorAction:new(player, item, time)); end MGContextMenu.UnequipArmor = function(item, player, time) if luautils.haveToBeTransfered(player, item) then ISTimedActionQueue.add(ISInventoryTransferAction:new(player, item, item:getContainer(), player:getInventory())); end ISTimedActionQueue.add(MGUnequipArmorAction:new(player, item, time)); end MGContextMenu.InspectArmor = function(item, player, time) if luautils.haveToBeTransfered(player, item) then ISTimedActionQueue.add(ISInventoryTransferAction:new(player, item, item:getContainer(), player:getInventory())); end ISTimedActionQueue.add(MGInspectArmorAction:new(player, item, time)); end Events.OnFillInventoryObjectContextMenu.Add(MGContextMenu.init); Time action. Equipping armor on the character: Hide contents require "TimedActions/ISBaseTimedAction" MGEquipArmorAction = ISBaseTimedAction:derive("MGEquipArmorAction"); function MGEquipArmorAction:isValid() return self.character:getInventory():contains(self.item); end function MGEquipArmorAction:update() self.item:setJobDelta(self:getJobDelta()); end function MGEquipArmorAction:start() self.item:setJobType(getText("UI_Text_Equip_Armor")); self.item:setJobDelta(0.0); end function MGEquipArmorAction:stop() ISBaseTimedAction.stop(self); self.item:setJobDelta(0.0); end function MGEquipArmorAction:perform() self.item:getContainer():setDrawDirty(true); self.item:setJobDelta(0.0); local itemType = self.item:getType(); local player = self.character; if itemType == "MICH2000HelmetMulticam" or itemType == "MICH2000HelmetUCP" or itemType == "ParamedicHelmet" then local EquipedItem = self.item; local items = player:getInventory():getItems(); for i = 0, items:size()-1 do local CurrentArmor = items:get(i); if CurrentArmor:getModData().EquipedHeadArmor == 1 then CurrentArmor:getModData().EquipedHeadArmor = 0; end end EquipedItem:getModData().EquipedHeadArmor = 1; EquipOnHead(EquipedItem, player) end if itemType == "IOTVMulticam" or itemType == "IOTVUCP" then local EquipedItem = self.item; local items = player:getInventory():getItems(); for i = 0, items:size()-1 do local CurrentArmor = items:get(i); if CurrentArmor:getModData().EquipedChestArmor == 1 then CurrentArmor:getModData().EquipedChestArmor = 0; end end EquipedItem:getModData().EquipedChestArmor = 1; EquipedItem:setActualWeight(EquipedItem:getEquippedWeight()); EquipOnChest(EquipedItem, player) end if itemType == "TacticalElbowOlive" or itemType == "TacticalElbowBlack" then local EquipedItem = self.item; local items = player:getInventory():getItems(); for i = 0, items:size()-1 do local CurrentArmor = items:get(i); if CurrentArmor:getModData().EquipedArmArmor == 1 then CurrentArmor:getModData().EquipedArmArmor = 0; end end EquipedItem:getModData().EquipedArmArmor = 1; EquipOnArms(EquipedItem, player) end if itemType == "TacticalGlovesOlive" or itemType == "TacticalGlovesBlack" then local EquipedItem = self.item; local items = player:getInventory():getItems(); for i = 0, items:size()-1 do local CurrentArmor = items:get(i); if CurrentArmor:getModData().EquipedHandArmor == 1 then CurrentArmor:getModData().EquipedHandArmor = 0; end end EquipedItem:getModData().EquipedHandArmor = 1; EquipOnHands(EquipedItem, player) end if itemType == "TacticalKneeOlive" or itemType == "TacticalKneeBlack" then local EquipedItem = self.item; local items = player:getInventory():getItems(); for i = 0, items:size()-1 do local CurrentArmor = items:get(i); if CurrentArmor:getModData().EquipedLegArmor == 1 then CurrentArmor:getModData().EquipedLegArmor = 0; end end EquipedItem:getModData().EquipedLegArmor = 1; EquipOnLegs(EquipedItem, player) end -- if itemType == "" or itemType == "" then -- local EquipedItem = self.item; -- local items = player:getInventory():getItems(); -- for i = 0, items:size()-1 do -- local CurrentArmor = items:get(i); -- if CurrentArmor:getModData().EquipedFootArmor == 1 then -- CurrentArmor:getModData().EquipedFootArmor = 0; -- end -- end -- EquipedItem:getModData().EquipedFootArmor = 1; -- EquipOnFeet(EquipedItem, player) -- end -- needed to remove from queue / start next. ISBaseTimedAction.perform(self); end function MGEquipArmorAction:new(character, item, time) local o = {} setmetatable(o, self) self.__index = self o.character = character; o.item = item; o.stopOnWalk = true; o.stopOnRun = true; o.maxTime = time; return o end Time action. Removing the armor from the character: Reveal hidden contents require "TimedActions/ISBaseTimedAction" MGUnequipArmorAction = ISBaseTimedAction:derive("MGUnequipArmorAction"); function MGUnequipArmorAction:isValid() return self.character:getInventory():contains(self.item); end function MGUnequipArmorAction:update() self.item:setJobDelta(self:getJobDelta()); end function MGUnequipArmorAction:start() self.item:setJobType(getText("UI_Text_Unequip_Armor")); self.item:setJobDelta(0.0); end function MGUnequipArmorAction:stop() ISBaseTimedAction.stop(self); self.item:setJobDelta(0.0); end function MGUnequipArmorAction:perform() self.item:getContainer():setDrawDirty(true); self.item:setJobDelta(0.0); local itemType = self.item:getType(); local player = self.character; if itemType == "MICH2000HelmetMulticam" or itemType == "MICH2000HelmetUCP" or itemType == "ParamedicHelmet" then local EquipedItem = self.item; EquipedItem:getModData().EquipedHeadArmor = 0; end if itemType == "IOTVMulticam" or itemType == "IOTVUCP" then local EquipedItem = self.item; EquipedItem:getModData().EquipedChestArmor = 0; end if itemType == "TacticalElbowOlive" or itemType == "TacticalElbowBlack" then local EquipedItem = self.item; EquipedItem:getModData().EquipedArmArmor = 0; end if itemType == "TacticalGlovesOlive" or itemType == "TacticalGlovesBlack" then local EquipedItem = self.item; EquipedItem:getModData().EquipedHandArmor = 0; end if itemType == "TacticalKneeOlive" or itemType == "TacticalKneeBlack" then local EquipedItem = self.item; EquipedItem:getModData().EquipedLegArmor = 0; end -- if itemType == "" or itemType == "" then -- local EquipedItem = self.item; -- EquipedItem:getModData().EquipedFootArmor = 0; -- end -- needed to remove from queue / start next. ISBaseTimedAction.perform(self); end function MGUnequipArmorAction:new(character, item, time) local o = {} setmetatable(o, self) self.__index = self o.character = character; o.item = item; o.stopOnWalk = true; o.stopOnRun = true; o.maxTime = time; return o end Time action. Activating the equipment inspection window: Hide contents require "TimedActions/ISBaseTimedAction" MGInspectArmorAction = ISBaseTimedAction:derive("MGInspectArmorAction"); function MGInspectArmorAction:isValid() return self.character:getInventory():contains(self.item); end function MGInspectArmorAction:update() self.item:setJobDelta(self:getJobDelta()); end function MGInspectArmorAction:start() self.item:setJobType(getText("UI_Text_Inspect_Armor")); self.item:setJobDelta(0.0); end function MGInspectArmorAction:stop() ISBaseTimedAction.stop(self); self.item:setJobDelta(0.0); end function MGInspectArmorAction:perform() self.item:getContainer():setDrawDirty(true); self.item:setJobDelta(0.0); local player = self.character; local item = self.item ExamineArmor(item, player) -- needed to remove from queue / start next. ISBaseTimedAction.perform(self); end function MGInspectArmorAction:new(character, item, time) local o = {} setmetatable(o, self) self.__index = self o.character = character; o.item = item; o.stopOnWalk = true; o.stopOnRun = true; o.maxTime = time; return o end The code has not yet been completely completed, lacks some mechanisms, such as checking the weight of the armored armor. ah i see, those are some nice improvements. But if your going to do that, then it will be best to add the "Location" that the armor goes on (such as head, arms, legs hands etc.) into the armor definitions. Change the armor definitions to a global table rather than just a load function with if. Add me on discord "Nolan" or on steam "nolanritchie" or skype "nolanri" and lets collaborate on these improvements, Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now