Need Scripting Help (Combat-Check and Loop)

i see, but i dont think s_player_sleep is working though. Its looks like its just a variable for an addaction
i think cyrq simplified it damn good and i released it on this version. But if you wish i can help you to finish a version which you like to use on your own server ^^
It would be very nice from yours =)
 
it seems to have some i supose syntaxis errors cause I have stuck at "requesting character data from server"
And logs PRT shows this:

Code:
23:36:21 Error in expression <se {
r_player_blood = r_player_blood;
};
sleep 2;
};>
23:36:21   Error position: <;
sleep 2;
};>
23:36:21   Error Missing )
23:36:21 File mpmissions\__cur_mp.Chernarus\Scripts\My_ver_full2.sqf, line 39
 
found some errors:
if ((r_player_blood < 12000) AND !(_exceptions) then { - missing ")" after (_exceptions)
so should be like this: if ((r_player_blood < 12000) AND !(_exceptions)) then {

And this line: if (vehicle player == player) AND !(s_player_sleep) then {
should look like this: if ((vehicle player == player) AND !(s_player_sleep)) then {

Also forgot ";" after r_player_blood = r_player_blood, (already fixed in my posts)
Will try now, if it works, will post the fixed version
 
You complicating things folks.
Read it closely.
The loop won't even run if r_player_blood is > 12000.
There's no need to state an "else" statement.
 
have tried this one
Code:
private ["_regeneration"];
waituntil {!alive player ; !isnull (finddisplay 46)};
_regeneration = 1; //change to whatever you like, 0 - no regeneration, 1 - normal regeneration, 2 - double speed regeneration, 3 - triple speed regeneration.

while {alive player} do {
    if    ((r_player_blood < 12000) AND !(r_player_unconscious)
    AND !(r_player_injured) AND !(r_player_infected)
    AND !(r_fracture_legs) AND !(r_fracture_arms)
    AND !(r_player_inpain) AND !(r_player_loaded)
    AND ((dayz_statusArray select 0) > 0.5) AND ((dayz_statusArray select 1) > 0.5)) then {
        if (s_player_sleep) then {
            r_player_blood = r_player_blood + (_regeneration * 1000); //when sleeping regeneration = 1000
        };
        if (vehicle player != player) then {
            r_player_blood = r_player_blood + (_regeneration * 10); //when in vehicle _regeneration = 10
        };
        if ((vehicle player == player) AND !(s_player_sleep)) then {
            switch (true) do {
                case (speed player >= 14): {
                    r_player_blood = r_player_blood + (_regeneration * 2);  //when running regeneration = 2
                };
                case (speed player >= 5) : {
                    r_player_blood = r_player_blood + (_regeneration * 4);  //when walking regeneration = 4
                };
                case (speed player >= 3) : {
                    r_player_blood = r_player_blood + (_regeneration * 6);  //when sneaking regeneration = 6
                };
                case (speed player >= 1) : {
                    r_player_blood = r_player_blood + (_regeneration * 8); //when crawling regeneration = 8
                };
                case (speed player == 0) : {
                    r_player_blood = r_player_blood + (_regeneration * 20); //when seating or staying regeneration = 20
                };
            };
        };
    } else {
        if (r_player_blood >= 12000) then { // this is what to do if after the check and 1 loop regeneration, the blood amount will be higher than 12000, to prevent BE kicks
            r_player_blood = 12000;
        };
    } else {
        r_player_blood = r_player_blood; //this is what to do if player hasn't passed the first check and his blood is lower than 12000
    };
    sleep 2;
};
It worked but not in a proper way, regeneration is always 10 points, fracture exception doesn't work, will now try another way
 
You complicating things folks.
Read it closely.
The loop won't even run if r_player_blood is > 12000.
There's no need to state an "else" statement.
I meab you have 11995 for instance so the script will loop and you can get additional 20 points if make no movement, so your blood should become 12015 and BE can kick - ban in this case. That's why i decided to make this check cause i don't know wether it is present in some of dayz_code to limit max blood
 
This has also worked, but with the same problems, like not all exceptions work, and no matter in vehicle or not, sleep or not, what movement speed i have, it regenerate 10 poiints for each loop
Code:
private ["_regeneration", "_exceptions"];
waituntil {!alive player ; !isnull (finddisplay 46)};
_regeneration = 1; //change to whatever you like, 0 - no regeneration, 1 - normal regeneration, 2 - double speed regeneration, 3 - triple speed regeneration.
_exceptions = ["r_player_unconscious","r_player_injured","r_player_infected","r_fracture_legs","r_fracture_arms","r_player_inpain","r_player_loaded","(dayz_statusArray select 0) > 0.5"," (dayz_statusArray select 1) > 0.5"];

while {alive player} do {
    if    ((r_player_blood < 12000) AND !(_exceptions))    then {
        switch (true) do {
            case (s_player_sleep): {
                r_player_blood = r_player_blood + (_regeneration * 1000);  //when sleeping regeneration = 1000
            };
            case (vehicle player != player): {
                r_player_blood = r_player_blood + (_regeneration * 10);  //when in vehicle regeneration = 10
            };
            case (speed player >= 14): {
                r_player_blood = r_player_blood + (_regeneration * 2);  //when running regeneration = 2
            };
            case (speed player >= 5) : {
                r_player_blood = r_player_blood + (_regeneration * 4);  //when walking regeneration = 4
            };
            case (speed player >= 3) : {
                r_player_blood = r_player_blood + (_regeneration * 6);  //when sneaking regeneration = 6
            };
            case (speed player >= 1) : {
                r_player_blood = r_player_blood + (_regeneration * 8); //when crawling regeneration = 8
            };
            case (speed player == 0) : {
                r_player_blood = r_player_blood + (_regeneration * 20); //when seating or staying regeneration = 20
            };
        };
    } else {
        if (r_player_blood >= 12000) then { // this is what to do if after the check and 1 loop regeneration, the blood amount will be higher than 12000, to prevent BE kicks
            r_player_blood = 12000;
        };
    } else {
        r_player_blood = r_player_blood; //this is what to do if player hasn't passed the first check and his blood is lower than 12000
    };
    sleep 2;
};
 
almost got it working, need more test with exceptions, and still regenerate only 10 points each time

Code:
private ["_vehicle","_inVehicle","_speed","_regeneration", "_exceptions"];
waituntil {!alive player ; !isnull (finddisplay 46)};
_vehicle = vehicle player;
_inVehicle = (_vehicle != player);
_speed = speed player;
_regeneration = 1; //change to whatever you like, 0 - no regeneration, 1 - normal regeneration, 2 - double speed regeneration, 3 - triple speed regeneration.
_exceptions = ["r_player_unconscious","r_player_injured","r_player_infected","r_fracture_legs","r_fracture_arms","r_player_inpain","r_player_loaded","(dayz_statusArray select 0) > 0.5"," (dayz_statusArray select 1) > 0.5"];

while {alive player} do {
    if    ((r_player_blood < 12000) AND !(_exceptions))    then {
        switch (true) do {
            case (s_player_sleep): {
                r_player_blood = r_player_blood + (_regeneration * 1000);  //when sleeping regeneration = 1000
            };
            case (_inVehicle): {
                r_player_blood = r_player_blood + (_regeneration * 10);  //when in vehicle regeneration = 10
            };
            case (_speed >= 14): {
                r_player_blood = r_player_blood + (_regeneration * 2);  //when running regeneration = 2
            };
            case (_speed >= 5) : {
                r_player_blood = r_player_blood + (_regeneration * 4);  //when walking regeneration = 4
            };
            case (_speed >= 3) : {
                r_player_blood = r_player_blood + (_regeneration * 6);  //when sneaking regeneration = 6
            };
            case (_speed >= 1) : {
                r_player_blood = r_player_blood + (_regeneration * 8); //when crawling regeneration = 8
            };
            case (_speed == 0) : {
                r_player_blood = r_player_blood + (_regeneration * 20); //when seating or staying regeneration = 20
            };
        };
    } else {
        if (r_player_blood >= 12000) then { // this is what to do if after the check and 1 loop regeneration, the blood amount will be higher than 12000, to prevent BE kicks
            r_player_blood = 12000;
        };
    } else {
        r_player_blood = r_player_blood; //this is what to do if player hasn't passed the first check and his blood is lower than 12000
    };
    sleep 2;
};
 
Have checked your release, so exceptions also don't work properly. The regeneration is always 10 + regeneration based on speed.
So the script isn't finished yet =(
Speed values also should be changed, cause not all of them make the effect, as when sneaking - has the same effect like walking.
 
Last edited:
cyrqs Version runs like charm, i just edited the speed so it should be right now. here it is:
Code:
//////////////////////////////////////////////////////////////////////////
// Script written by Schwede                                            //
//    Thanks to ka3ant1p, NoNameUnit  and cyrq for Support and Idea     //
//                                                                      //
//    Version 1.1                                                       //
//////////////////////////////////////////////////////////////////////////

while {alive player} do {
    if    ((r_player_blood < 12000) AND !(r_player_unconscious)
    AND !(r_player_injured) AND !(r_player_infected)
    AND !(r_fracture_legs) AND !(r_fracture_arms)
    AND !(r_player_inpain) AND !(r_player_loaded)
    AND ((dayz_statusArray select 0) > 0.5) AND ((dayz_statusArray select 1) > 0.5)) then {
        if (vehicle player != player) then {
            r_player_blood = r_player_blood + (1 * 10); //when in vehicle _regeneration = 10
        };
        if (vehicle player == player) then {
            switch (true) do {
                case (speed player >= 12): {
                    r_player_blood = r_player_blood + 1;  //when running _regeneration = 1
                };
                case (speed player >= 5) : {
                    r_player_blood = r_player_blood + (1 * 2);  //when walking _regeneration = 2
                };
                case (speed player >= 4) : {
                    r_player_blood = r_player_blood + (1 * 3);  //when sneaking _regeneration = 3
                };
                case (speed player >= 2) : {
                    r_player_blood = r_player_blood + (1 * 4); //when crawling _regeneration = 4
                };
                case (speed player == 0) : {
                    r_player_blood = r_player_blood + (1 * 5); //when seating or staying _regeneration = 5
                };
            };
        };
    };
sleep 2;
};

To your Script:
This is not necessary, because its already in another file and its working just fine, so no need for that in this script too.
Code:
if (r_player_blood >= 12000) then { // this is what to do if after the check and 1 loop regeneration, the blood amount will be higher than 12000, to prevent BE kicks
            r_player_blood = 12000;
        };
same thing for this:
Code:
        r_player_blood = r_player_blood; //this is what to do if player hasn't passed the first check and his blood is lower than 12000
you dont need it because if the player isnt passing the first if everything will be the same as before. So r_player_blood = r_player_blood stays the same.
 
I remaked the script structure a bit, now testing.
As for last checks, I mean if you pass the first check (blood < 11999) for example you passed it with 11990 and then regenerate while standing 20 points at once, it may cause BE kick, because of 12010 blood amount.
So made such structure (code later):
first check then {
_blood = _r_player_blood \\ making a local variable
case 1 : _regeneration = 5
case 2 : _regeneration = 10
case 3 : ...
_blood = r_player_blood + _regeneration
check if _blood is > 11999 then set r_player_blood to 12000 \\ to prevent kicks
And only after this we set global veriable r_player_blood to local _blood
r_player_blood = _blood

Also in script from release Vehicle check doesn't work, it should give you 10 points while in vehicle and if not it willgive you 2-20 point regeneration demands on the speed case
 
Have no time to test now, just look upon this variants, and may be try to test them.

Code:
private ["_veh","_inVeh","_speed","_regeneration","_thirst","_hunger","_exceptions","_blood","_cursorTarget"];
_veh = gettext (configFile >> 'CfgVehicles' >> (typeof vehicle player) >> 'displayName');
_inVeh = (_veh != "survivor");
_speed = speed player;
_thirst = (dayz_statusArray select 0) =< 0.5;
_hunger = (dayz_statusArray select 1) =< 0.5;
_exceptions = ["r_player_unconscious","r_player_injured","r_player_infected","r_fracture_legs","r_fracture_arms","r_player_inpain","r_player_loaded","_thirst","_hunger"];
s_player_sleep = player addAction [localize "str_actions_self_sleep", "\z\addons\dayz_code\actions\player_sleep.sqf",_cursorTarget, 0, false, true, "",""];

while { (alive player) } do {
    if    ((r_player_blood < 12000) AND !(_exceptions))    then {
        _blood = r_player_blood;
        _regeneration = 0;
        switch (true) do {
            case (s_player_sleep) : {
                _regeneration = 1000;  //when sleeping regeneration = 1000
            };
            case (_inVeh) : {
                _regeneration = 10;  //when in vehicle regeneration = 10
            };
            case (_speed >= 14) : {
                _regeneration = 2;  //when running regeneration = 2
            };
            case (_speed >= 5) : {
                _regeneration = 4;  //when walking regeneration = 4
            };
            case (_speed >= 3) : {
                _regeneration = 6;  //when sneaking regeneration = 6
            };
            case (_speed >= 1) : {
                _regeneration = 8; //when crawling regeneration = 8
            };
            case (_speed == 0) : {
                _regeneration = 20; //when seating or staying regeneration = 20
            };
        };
        _blood = _blood + _regeneration;
        if (_blood > 11999) then {
            r_player_blood = 12000;
        } else {
        r_player_blood = _blood;
        };
    };   
    sleep 2;
};
don't know may be _thirst and _hunger should have additional bracets

Also to make vehicle check work can try to change:
Code:
_veh = gettext (configFile >> 'CfgVehicles' >> (typeof vehicle player) >> 'displayName');
_inVeh = (_veh != "survivor");
to:

Code:
_vehicle = vehicle player;
_inVehicle = (_vehicle != player);
but don't forget to make changes in private and in code
 
Vehicle-Check is working just fine. It gives your +10 of you are in a vehicle and +5 when you are standing.
I didnt test it with Battleye but i dont think it will kick you for this.
There is already the same if in dayz_code which already doing your work, so you dont have put the samething twice in it:
Code:
r_player_bloodregen = r_player_bloodregen + _regen;

if (r_player_blood > r_player_bloodTotal) then {
    r_player_blood = r_player_bloodTotal;
};
 
don't know how you tested it, but when I was testing it was giving me 10 points if not in vehicle and + some points for case standing, so I got 15 points
 
Back
Top