Jump to content

Hydrocraft Mod


Hydromancerx

Recommended Posts

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 by nolanri
Link to comment
Share on other sites

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

NU8SpAa.png

;))

Link to comment
Share on other sites

18 hours ago, Di-Crash said:

 

  Hide contents

NU8SpAa.png

;))

 

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 by nolanri
Link to comment
Share on other sites

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

QKE2vRZ.png

 

Edited by Di-Crash
Link to comment
Share on other sites

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

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

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

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

MFUdkMs.png

 

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

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

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

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

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

yuzg3m2.jpg

This time there were no injuries, not even an infection. In general, in theory, in any case, she should not protect 100 percent.

 

 

Edited by Di-Crash
Link to comment
Share on other sites

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 by Di-Crash
Link to comment
Share on other sites

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

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

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

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

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...