Self blood bag in Dayz 1.8.1? How can I merge these scripts? :)

aussie battler

New Member
Hi

Just wondering if anyone has written self blood bagging into Dayz 1.8.1. Since the update blood bags have been assigned blood types and players can only blood bag each other. Just wondering if anyone has merged these old & new scripts yet?

This is the new blood bag script (another player required):

Code is in the next post

This is Krixies self blood bag script :

Code:
//////////////////////////////////////////////////////////////////////////////////////////////
// Script writen by Krixes                                   //
//  Infection chance and some comments added by Player2                   //
//  Combat check added by istealth                             //
//                                               //
//   Version 1.4                                         //
//                                               //
// Change Log:                                        //
// 1: Added bloodbag use timer                                 //
// 2: Added a timer for the amount of time before player can use self bloodbag again     //
//////////////////////////////////////////////////////////////////////////////////////////////

private ["_bloodAmount","_humanityBool","_infectionChance","_humanityNegBool","_humanityNegAmount","_humanityAmount","_infectedLifeLost","_infectedLifeBool","_lastBloodbag","_bloodbagLastUsedTime","_bloodbagTime","_bloodbagUseTime","_bloodbagUsageTime","_incombat","_timeout"];



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Config Start-----------------------------------------------------------------------------------------------------------------------//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

_bloodAmount = 4000; // Amount of blood to give to player
_bloodbagUseTime = 30; // Amount of time it takes in second for the player to use the self bloodbag
_bloodbagLastUsedTime = 60; // Amount of time in seconds before player can use self bloodbag again after a succesful use

_infectionChance = 10; // Percent chance of player infection on self bloodbag (10 = 10% | 2 = 50% | 1 = 100%)
_infectedLifeBool = true; // Whether the player can loose life if infected (True = On | False = off)
_infectedLifeLost = 1000; // Amount of life to loose in becomes infected

_humanityBool = false; // Whether the player can get humanity from giving self a bloodbag (True = On | False = off)
_humanityAmount = 50; // Amount of humanity to give player if _humanityBool is true (250 is default for normal bloodbags)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Config End-------------------------------------------------------------------------------------------------------------------------//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////





///////////////////////////////////////////////////////////////////////////////
// Everything below need not be modified unless you know what you are doing! //
///////////////////////////////////////////////////////////////////////////////

_bloodbagTime = time - lastBloodbag; // Variable used for easy reference in determining the self bloodbag cooldown
_bloodbagUsageTime = time;
_timeout = player getVariable["combattimeout", 0];
_inCombat = if (_timeout >= diag_tickTime) then { true } else { false };

if(_bloodbagTime < _bloodbagLastUsedTime) exitWith { // If cooldown is not done then exit script
   cutText [format["You may not use Self Bloodbag this soon please wait %1!",(_bloodbagTime - _bloodbagLastUsedTime)], "PLAIN DOWN"]; //display text at bottom center of screen when players cooldown is not done
};

if (_inCombat) then { // Check if in combat
  cutText [format["You are in Combat and cannot give yourself a Bloodbag"], "PLAIN DOWN"]; //display text at bottom center of screen when in combat
} else {

   player removeAction s_player_selfBloodbag; //remove the action from users scroll menu

   player playActionNow "Medic"; //play bloodbag animation

   ////////////////////////////////////////////////
   // Fancy cancel if interrupted addition start //
   ////////////////////////////////////////////////
   r_interrupt = false; // public interuppt variable
   _animState = animationState player; // get the animation state of the player
   r_doLoop = true; // while true sets whether to continue self bloodbagging
   _started = false; // this starts as false as a check
   _finished = false; // this starts as false and when true later sets players blood
   while {r_doLoop} do {
     _animState = animationState player; // keep checking to make sure player is in correct animation
     _isMedic = ["medic",_animState] call fnc_inString; // checking to make sure the animstate is the medic animation still
     if (_isMedic) then {
       _started = true; // this is a check to make sure everything is still ok
     };
     if(!_isMedic && !r_interrupt && (time - _bloodbagUsageTime) < _bloodbagUseTime) then {
       player playActionNow "Medic"; //play bloodbag animation
       _isMedic = true;
     };
     if (_started && !_isMedic && (time - _bloodbagUsageTime) > _bloodbagUseTime) then {
       r_doLoop = false; // turns off the loop
       _finished = true; // set finished to true to finish the self bloodbag and give player health/humanity
       lastBloodbag = time; // the last self bloodbag time
     };
     if (r_interrupt) then {
       r_doLoop = false; // if interuppted turns loop off early so _finished is never true
     };
     sleep 0.1;
   };
   r_doLoop = false; // make sure loop is off on successful self bloodbag
   ///////////////////////////////////////////////
   // Fancy cancel if interrupted addition end //
   //////////////////////////////////////////////

   if (_finished) then {
     player removeMagazine "ItemBloodbag"; //remove the used bloodbag from inventory

     r_player_blood = r_player_blood + _bloodAmount; //set players LOCAL blood to a certain ammount
  
     if(r_player_blood > 12000) then {
       r_player_blood = 12000; // If players blood is greater then max amount allowed set it to max allowed (this check keeps an error at bay)
     };
  
     // check if infected
     if (random(_infectionChance) < 1) then {
       r_player_infected = true; //set players client to show infection
       player setVariable["USEC_infected",true,true]; //tell the server the player is infected
       cutText [format["You have used a bloodbag on yourself but the bloodbag was infected!"], "PLAIN DOWN"]; //display text at bottom center of screen if infected
    
       // check for if loosing life on infection is turned on
       if(_infectedLifeBool) then {
         r_player_blood = r_player_blood - _infectedLifeLost; //set players LOCAL blood to a certain ammount
         player setVariable["USEC_BloodQty",r_player_blood,true]; //save this blood ammount to the database
       } else { // if loosing life is turned off
         r_player_lowblood = false; //set lowblood setting to false
         10 fadeSound 1; //slowly fade their volume back to maximum
         "dynamicBlur" ppEffectAdjust [0]; "dynamicBlur" ppEffectCommit 5; //disable post processing blur effect
         "colorCorrections" ppEffectAdjust [1, 1, 0, [1, 1, 1, 0.0], [1, 1, 1, 1],  [1, 1, 1, 1]];"colorCorrections" ppEffectCommit 5; //give them their colour back
         r_player_lowblood = false; //just double checking their blood isnt low
         player setVariable["USEC_BloodQty",r_player_blood,true]; //save this blood ammount to the database
       };
     } else { // if not infected
       r_player_lowblood = false; //set lowblood setting to false
       10 fadeSound 1; //slowly fade their volume back to maximum
       "dynamicBlur" ppEffectAdjust [0]; "dynamicBlur" ppEffectCommit 5; //disable post processing blur effect
       "colorCorrections" ppEffectAdjust [1, 1, 0, [1, 1, 1, 0.0], [1, 1, 1, 1],  [1, 1, 1, 1]];"colorCorrections" ppEffectCommit 5; //give them their colour back
       r_player_lowblood = false; //just double checking their blood isnt low
       player setVariable["USEC_BloodQty",r_player_blood,true]; //save this blood ammount to the database

       cutText [format["You have used a bloodbag on yourself!"], "PLAIN DOWN"]; //display text at bottom center of screen on succesful self bloodbag
     };
  
     // check if giving player humanity is on
     if(_humanityBool) then {
       [player,_humanityAmount] call player_humanityChange; // Set players humanity based on amount listed in config area
     };
   } else {
     // this is for handling if interrupted
     r_interrupt = false;
     player switchMove "";
     player playActionNow "stop";
     cutText [format["You have interrupted giving yourself a bloodbag!"], "PLAIN DOWN"]; //display text at bottom center of screen on interrupt
   };
};
 
Last edited:
This is the new blood bag script (needs another player to administer):

Code:
private ["_unit","_blood","_lowBlood","_injured","_inPain","_lastused","_hasTransfusionKit","_animState","_started","_finished","_timer","_i","_isMedic","_isClose","_duration","_rhVal","_bloodBagArrayNeeded","_BBneeded","_bbselect","_bloodBagNeeded","_badBag","_wholeBag","_bagFound","_bagToRemove","_forceClose","_bloodType","_rh","_bloodBagArray","_bbarray_length","_bloodBagWholeNeeded","_haswholebag","_r"];
// bleed.sqf
_unit = (_this select 3) select 0;
_blood = _unit getVariable ["USEC_BloodQty", 0];
_lowBlood = _unit getVariable ["USEC_lowBlood", false];
_injured = _unit getVariable ["USEC_injured", false];
_inPain = _unit getVariable ["USEC_inPain", false];
_lastused = _unit getVariable ["LastTransfusion", time];
_hasTransfusionKit = "transfusionKit" in magazines player;

_bloodType = _unit getVariable ["blood_type", false];
_rh = _unit getVariable ["rh_factor", false];

_badBag = false;
_wholeBag = false;
_bagFound = false;
_BBneeded = false;
_forceClose = false;
if (!_hasTransfusionKit) exitWith { systemChat (localize "str_info_missingtransfusionkit");     };

if (_blood <= 4000) then {
    _duration = 3;
    } else {
    _duration = 2;
};

_bloodBagArray = ["bloodBagANEG","bloodBagAPOS","bloodBagBNEG","bloodBagBPOS","bloodBagABNEG","bloodBagABPOS","bloodBagONEG","bloodBagOPOS","wholeBloodBagANEG","wholeBloodBagAPOS","wholeBloodBagBNEG","wholeBloodBagBPOS","wholeBloodBagABNEG","wholeBloodBagABPOS","wholeBloodBagONEG","wholeBloodBagOPOS"];

if (_rh) then {_rhVal = "POS";} else {_rhVal = "NEG";};

switch (_bloodType) do {
    case "A" : {
        if (_rh) then {
            _bloodBagArrayNeeded = ["ItemBloodbag","bloodBagAPOS","bloodBagANEG","bloodBagONEG","bloodBagOPOS"];
        } else {
            _bloodBagArrayNeeded = ["ItemBloodbag","bloodBagANEG","bloodBagONEG"];
        };
    };

    case "B" : {
        if (_rh) then {
            _bloodBagArrayNeeded = ["ItemBloodbag","bloodBagBPOS","bloodBagBNEG","bloodBagONEG","bloodBagOPOS"];
        } else {
            _bloodBagArrayNeeded = ["ItemBloodbag","bloodBagBNEG","bloodBagONEG"];
        };
    };

    case "AB" : {
        if (_rh) then {
            _bloodBagArrayNeeded = ["ItemBloodbag","bloodBagABPOS","bloodBagABNEG","bloodBagANEG","bloodBagAPOS","bloodBagBNEG","bloodBagBPOS","bloodBagONEG","bloodBagOPOS"];
        } else {
            _bloodBagArrayNeeded = ["ItemBloodbag","bloodBagABNEG","bloodBagANEG","bloodBagBNEG","bloodBagONEG"];
        };
    };

    case "O" : {
        if (_rh) then {
            _bloodBagArrayNeeded = ["ItemBloodbag","bloodBagOPOS","bloodBagONEG"];
        } else {
            _bloodBagArrayNeeded = ["ItemBloodbag","bloodBagONEG"];
        };
    };
};

_bbarray_length = (count _bloodBagArrayNeeded) - 1;
for "_q" from 0 to _bbarray_length do {
    _bbselect = _bloodBagArrayNeeded select _q;
    _bloodBagNeeded = _bbselect in magazines player;
        if (_bloodBagNeeded) exitWith {_BBneeded = true;};
};

//No subs for whole blood :(
_bloodBagWholeNeeded = "wholeBloodBag" + _bloodType + _rhVal;
_haswholebag = _bloodBagWholeNeeded in magazines player;

if (!_BBneeded and !_haswholebag) then {
    _badBag = true;
};

//use packed/separated bags first
if (_BBneeded) then {
    _wholeBag = false;
} else {
    if (_haswholebag) then {
        _wholeBag = true;
    };
};

call fnc_usec_medic_removeActions;
r_action = false;

if (vehicle player == player) then {
    //not in a vehicle
    player playActionNow "Medic";
};

r_interrupt = false;
_animState = animationState player;
r_doLoop = true;
_started = false;
_finished = false;
_timer = diag_tickTime;
_i = 0;
_r = 0;

while {r_doLoop and (_i < 12)} do {
    _animState = animationState player;
    _isMedic = ["medic",_animState] call fnc_inString;

    if (_isMedic and !_started) then {
        closeDialog 0;
        diag_log format ["TRANSFUSION: starting blood transfusion (%1 > %2)", name player, name _unit];
        if (_badBag) then {
            for "_r" from 0 to 15 do {
                _bagToRemove = _bloodBagArray select _r;
                if (_bagToRemove in magazines player) exitWith {   //TODO: add separate action menu options so the removed bag isn't random
                    _bagFound = true;
                    if (_r >= 8) then {
                        _wholeBag = true;
                    };
                };
            };
        } else {
            if (_wholeBag) then {_bagToRemove = _bloodBagWholeNeeded; } else { _bagToRemove = _bbselect; };
            if (_bagToRemove in magazines player) then {
                _bagFound = true;
            };
        };
        if (!_bagFound) then {_forceClose = true;} else { player removeMagazine _bagToRemove; player removeMagazine "transfusionKit";};
        cutText [localize "str_actions_medical_transfusion_start", "PLAIN DOWN"];
        [player,_unit,"loc",rTITLETEXT,localize "str_actions_medical_transfusion_start","PLAIN DOWN"] call RE;
        _started = true;
    };

    if (_started) then {
        if ((diag_tickTime - _timer) >= 1) then {
            _timer = diag_tickTime;
            //PVCDZ_hlt_Transfuse = [_unit,player,1000];
            //publicVariable "PVCDZ_hlt_Transfuse";
            if (!_wholeBag) then {
                _i = _i + 1;
            } else {
                _i = _i + 3;    //Whole blood only gives 4k
            };
            if (!_badBag) then {
                if (!_forceClose) then {
                    if (!_wholeBag) then {
                        _randomamount = round(random 60);
                        r_player_blood = r_player_blood + 100 + _randomamount;
                    } else {
                        _randomamount = round(random 200);
                        r_player_blood = r_player_blood + 800 + _randomamount;
                    };
                   
                    //PVDZ_send = [_unit,"Transfuse",[_unit,player,1000]];
                    //publicVariableServer "PVDZ_send";
                };
            } else {
                if (!_forceClose and (_i >= 12)) then {
                    [_unit, _duration] call fnc_usec_damageUnconscious;
                };
            };
        };

        if (!_isMedic) then {
            player playActionNow "Medic";
        };
    };

    _blood = _unit getVariable ["USEC_BloodQty", 0];

    if (((_blood >= r_player_bloodTotal) and !_badBag and _bagFound) or (_i == 12)) then {
        diag_log format ["TRANSFUSION: completed blood transfusion successfully (_i = %1)", _i];
        cutText [localize "str_actions_medical_transfusion_successful", "PLAIN DOWN"];
        [player,_unit,"loc",rTITLETEXT,localize "str_actions_medical_transfusion_successful","PLAIN DOWN"] call RE;
        [player,25] call player_humanityChange;
        r_doLoop = false;
    };

    _isClose = ((player distance _unit) < ((sizeOf typeOf _unit) / 2));

    if (r_interrupt or !_isClose or _forceClose) then {
        diag_log format ["TRANSFUSION: transfusion was interrupted (r_interrupt: %1 | distance: %2 (%3) | _i = %4)", r_interrupt, player distance _unit, _isClose, _i];
        cutText [localize "str_actions_medical_transfusion_interrupted", "PLAIN DOWN"];
        [player,_unit,"loc",rTITLETEXT,localize "str_actions_medical_transfusion_interrupted","PLAIN DOWN"] call RE;
        r_doLoop = false;
    };

    sleep 0.1;
};

r_doLoop = false;

if (r_interrupt) then {
    r_interrupt = false;
    player switchMove "";
    player playActionNow "stop";
};
 
I would love to get a working Self Blood Bag script for my DayZ 1.8.1 server. Help would be much appreciated on this! :)
 
I found a work around by increasing loot spawns of empty blood bags & transfusion kits.

You can self blood bag in Dayz 1.8.1 by:

1. Fill a empty blood bag (combined with a transfusion kit) with your own blood
2. Combine the full blood bag and a transfusion kit, then self blood bag.

I increased loot spawns in hospitals to help players out. Unfortunately the blood tester and full blood bags don't spawn as I must have the class names wrong.

Empty blood bags & transfusion kite spawning:

Code:
hospital[] = {
//med
    {"ItemBandage",0.96},
    {"ItemPainkiller",0.94},
    {"ItemMorphine",0.94},
    {"ItemEpinephrine",0.93},
    {"ItemAntibacterialWipe",0.94},
    {"ItembloodTester",0.91},
    {"transfusionKit",0.93},
    {"emptybloodBag",0.93},
    {"ItembloodBagOPOS",0.93},
    {"ItembloodBagOPNEG",0.93},
    {"ItembloodBagABPOS",0.93},
    {"ItembloodBagABNEG",0.93},
    {"ItembloodBagBPOS",0.93},
    {"ItembloodBagBNEG",0.93},
    {"ItembloodBagANEG",0.93},
    {"ItembloodBagAPOS",0.93},
    {"ItembloodTester",0.91},
    {"ItemAntibiotic",0.91},

Anyone know how to spawn full blood bags? I tried "ItemwholebloodBagOPOS" and that seems to be wrong.
 
I found a work around by increasing loot spawns of empty blood bags & transfusion kits.

You can self blood bag in Dayz 1.8.1 by:

1. Fill a empty blood bag (combined with a transfusion kit) with your own blood
2. Combine the full blood bag and a transfusion kit, then self blood bag.

I increased loot spawns in hospitals to help players out. Unfortunately the blood tester and full blood bags don't spawn as I must have the class names wrong.

Empty blood bags & transfusion kite spawning:

Code:
hospital[] = {
//med
    {"ItemBandage",0.96},
    {"ItemPainkiller",0.94},
    {"ItemMorphine",0.94},
    {"ItemEpinephrine",0.93},
    {"ItemAntibacterialWipe",0.94},
    {"ItembloodTester",0.91},
    {"transfusionKit",0.93},
    {"emptybloodBag",0.93},
    {"ItembloodBagOPOS",0.93},
    {"ItembloodBagOPNEG",0.93},
    {"ItembloodBagABPOS",0.93},
    {"ItembloodBagABNEG",0.93},
    {"ItembloodBagBPOS",0.93},
    {"ItembloodBagBNEG",0.93},
    {"ItembloodBagANEG",0.93},
    {"ItembloodBagAPOS",0.93},
    {"ItembloodTester",0.91},
    {"ItemAntibiotic",0.91},

Anyone know how to spawn full blood bags? I tried "ItemwholebloodBagOPOS" and that seems to be wrong.

ItembloodBagOPNEG <--- these bloodbags are full. The empty bloodbags are just called emptybloodbag
 
Royal:

I tried that and it broke loot and zombies spawning. Can you link me to the method you are referring too?
 
Back
Top