Jump to content
Sign in to follow this  
Jnr4817

Respawn Script equals vehicle explosion: Help

Recommended Posts

Hello,
 
I am using the Simple Vehicle Respawn Script by Tophe of OOPS.
 
I am using this for several helo's that will respawn on a custom composition.
 
Well, sometimes when the helo respawns it explodes. I know this is not a new issue. Can I improve the script any to make the respawning helo set damage to false during respawn then sleep for 1-2 seconds and reset as set damage true. Any other way would help.
 
Here is the script

/*  
==================================================================================================================
  Simple Vehicle Respawn Script v1.81 for Arma 3
  by Tophe of Östgöta Ops [OOPS]
  
  Put this in the vehicles init line:
  veh = [this] execVM "vehicle.sqf"

  
  Options:
  There are some optional settings. The format for these are:
  veh = [object, Delay, Deserted timer, Respawns, Effect, Dynamic] execVM "vehicle.sqf"
  
  Default respawn delay is 30 seconds, to set a custom respawn delay time, put that in the init as well. 
  Like this:
  veh = [this, 15] execVM "vehicle.sqf"

  Default respawn time when vehicle is deserted, but not destroyed is 120 seconds. To set a custom timer for this 
  first set respawn delay, then the deserted vehicle timer. (0 = disabled) 
  Like this:  
  veh = [this, 15, 10] execVM "vehicle.sqf"

  By default the number of respawns is infinite. To set a limit first set preceding values then the number of respawns you want (0 = infinite).
  Like this:
  veh = [this, 15, 10, 5] execVM "vehicle.sqf"

  Set this value to TRUE to add a special explosion effect to the wreck when respawning.
  Default value is FALSE, which will simply have the wreck disappear.
  Like this:
  veh = [this, 15, 10, 5, TRUE] execVM "vehicle.sqf"
  
  By default the vehicle will respawn to the point where it first was when the mission started (static). 
  This can be changed to dynamic. Then the vehicle will respawn to the position where it was destroyed. 
  First set all preceding values then set TRUE for dynamic or FALSE for static.
  Like this:
  veh = [this, 15, 10, 5, TRUE, TRUE] execVM "vehicle.sqf"
  
  If you you want to set the INIT field of the respawned vehicle, first set all other values, then set init commands. 
  Those must be inside quotations.
  Like this:
  veh = [this, 15, 10, 5, TRUE, FALSE, "this setDammage 0.5"] execVM "vehicle.sqf"
  
  Default values of all settings are:
  veh = [this, 30, 120, 0, FALSE, FALSE] execVM "vehicle.sqf"
  
	
Contact & Bugreport: cwadensten@gmail.com
================================================================================================================== */

if (!isServer) exitWith {};

// Define variables
_unit = _this select 0;
_delay = if (count _this > 1) then {_this select 1} else {30};
_deserted = if (count _this > 2) then {_this select 2} else {120};
_respawns = if (count _this > 3) then {_this select 3} else {0};
_explode = if (count _this > 4) then {_this select 4} else {false};
_dynamic = if (count _this > 5) then {_this select 5} else {false};
_unitinit = if (count _this > 6) then {_this select 6} else {};
_haveinit = if (count _this > 6) then {true} else {false};

_hasname = false;
_unitname = vehicleVarName _unit;
if (isNil _unitname) then {_hasname = false;} else {_hasname = true;};
_noend = true;
_run = true;
_rounds = 0;

if (_delay < 0) then {_delay = 0};
if (_deserted < 0) then {_deserted = 0};
if (_respawns <= 0) then {_respawns= 0; _noend = true;};
if (_respawns > 0) then {_noend = false};

_dir = getDir _unit;
_position = getPosASL _unit;
_type = typeOf _unit;
_dead = false;
_nodelay = false;

// Kronzky's code
KRON_StrToArray = {
    private["_in","_i","_arr","_out"];
    _in=_this select 0;
    _arr = toArray(_in);
    _out=[];
    for "_i" from 0 to (count _arr)-1 do {
        _out=_out+[toString([_arr select _i])];
    };
    _out
};

KRON_StrLen = {
    private["_in","_arr","_len"];
    _in=_this select 0;
    _arr=[_in] call KRON_StrToArray;
    _len=count (_arr);
    _len
};

KRON_Replace = {
    private["_str","_old","_new","_out","_tmp","_jm","_la","_lo","_ln","_i"];
    _str=_this select 0;
    _arr=toArray(_str);
    _la=count _arr;
    _old=_this select 1;
    _new=_this select 2;
    _na=[_new] call KRON_StrToArray;
    _lo=[_old] call KRON_StrLen;
    _ln=[_new] call KRON_StrLen;
    _out="";
    for "_i" from 0 to (count _arr)-1 do {
        _tmp="";
        if (_i <= _la-_lo) then {
            for "_j" from _i to (_i+_lo-1) do {
                _tmp=_tmp + toString([_arr select _j]);
            };
        };
        if (_tmp==_old) then {
            _out=_out+_new;
            _i=_i+_lo-1;
        } else {
            _out=_out+toString([_arr select _i]);
        };
    };
    _out
};
// End of Kronzky's code

// Start monitoring the vehicle
while {_run} do 
{    
    sleep (2 + random 10);
      if ((getDammage _unit > 0.8) and ({alive _x} count crew _unit == 0)) then {_dead = true};

    // Check if the vehicle is deserted.
    if (_deserted > 0) then
    {
        if ((getPosASL _unit distance _position > 10) and ({alive _x} count crew _unit == 0) and (getDammage _unit < 0.8)) then 
        {
            _timeout = time + _deserted;
            sleep 0.1;
             waitUntil {_timeout < time or !alive _unit or {alive _x} count crew _unit > 0};
            if ({alive _x} count crew _unit > 0) then {_dead = false}; 
            if ({alive _x} count crew _unit == 0) then {_dead = true; _nodelay =true}; 
            if !(alive _unit) then {_dead = true; _nodelay = false}; 
        };
    };

    // Respawn vehicle
      if (_dead) then 
    {    
        if (_nodelay) then {sleep 0.1; _nodelay = false;} else {sleep _delay;};
        if (_dynamic) then {_position = getPosASL _unit; _dir = getDir _unit;};
        if (_explode) then {_effect = "M_AT" createVehicle getPosASL _unit; _effect setPosASL getPosASL _unit;};
        sleep 0.1;

        deleteVehicle _unit;
        sleep 2;
        _unit = _type createVehicle _position;
        _unit setPosASL _position;
        _unit setDir _dir;
        if (_haveinit) then {
            //_unit setVehicleInit format ["%1;", _unitinit];
            //processInitCommands;
            // Modified by BearBison
            private ["_IDunit", "_sCommand"];
            _IDunit = format["(objectFromNetID '%1')", netID _unit];
            _sCommand=[format["%1",_unitinit],"this",format["%1",_IDunit]] call KRON_Replace;
            // End of code modified by BearBison
            // Modified by naong and AgentRev
            [call compile format["[{%1}]",_sCommand], "BIS_fnc_spawn", true, true] spawn BIS_fnc_MP;
        };
        if (_hasname) then {
            //_unit setVehicleInit format ["%1 = this; this setVehicleVarName ""%1""",_unitname];
            //processInitCommands;
            private "_sCommand";
            _sCommand = format["[{(objectFromNetID '%1') setVehicleVarName '%2';}]", netID _unit, _unitname];
            [call compile format["%1",_sCommand],"BIS_fnc_spawn", true, true] spawn BIS_fnc_MP;
            _unit call compile format ["%1=_This; PublicVariable '%1'",_unitname];
        };
        // End of code modified by naong
        _dead = false;
        
        // Check respawn amount
        if !(_noend) then {_rounds = _rounds + 1};
        if ((_rounds == _respawns) and !(_noend)) then {_run = false;};
    };
};

Thank you

Share this post


Link to post
Share on other sites
_position = [_position,0,150,10,0,0,0,[],[_position]] call BIS_fnc_findSafePos;

Maybe try find safe Position. I had the same problem so I re wrote bis spawn script for some of my stuff. But BIS_fnc_findSafePos may fix your problem.

Share this post


Link to post
Share on other sites

Hello,

 

I am using the Simple Vehicle Respawn Script by Tophe of OOPS.

 

I am using this for several helo's that will respawn on a custom composition.

 

Well, sometimes when the helo respawns it explodes. I know this is not a new issue. Can I improve the script any to make the respawning helo set damage to false during respawn then sleep for 1-2 seconds and reset as set damage true. Any other way would help.

 

*SNIP*

 

Thank you

 

Question: You are not using ZBE_cache, are you?

I've had that problem with vehicle's exploding on respawn, and I narrowed it down to ZBE_cache.

It briefly disables simulation when the vehicle is spawned and when simulation is enabled again it could damage the vehicle.

 

I have a custom vehicle respawn script, but it would require you to modify your mission a bit. I can give you a link if you want.

I've used said script to respawn vehicles on a platform (which I made in eden) out in the sea with no problems.

Share this post


Link to post
Share on other sites

No, we are not using zbe_cache that I'm aware of. I'd like to keep the script I'm using and just add some way to turn damage off have to helo respawn, then turn damage back on.

 

Question: You are not using ZBE_cache, are you?
I've had that problem with vehicle's exploding on respawn, and I narrowed it down to ZBE_cache.
It briefly disables simulation when the vehicle is spawned and when simulation is enabled again it could damage the vehicle.
 
I have a custom vehicle respawn script, but it would require you to modify your mission a bit. I can give you a link if you want.
I've used said script to respawn vehicles on a platform (which I made in eden) out in the sea with no problems.

Share this post


Link to post
Share on other sites

Alright,

 

under _unit = _type createVehicle _position; (line 159) add

_unit allowDamage false;

 

And under _dead = false; (line 183) add 

Sleep 0.5; <- You can adjust this to your liking.

_unit allowDamage true;

 

That might work.

 

Oh, and about the vehicle ZBE_cache "turn off", I modified the original and added that feature myself.

Share this post


Link to post
Share on other sites

/\ This did not work.

 

Does the helicopter clip into the platform when it respawns?

 

If so, try this:

find:

_unit = _type createVehicle _position;

replace with:

_unit = _type createVehicle ASLToAGL [0,0,10];

If that doesn't work:

find:

_unit setPosASL _position;

replace with:

_unit setPosASL _position vectorAdd [0,0,1]; // Replace 1 with a higher number if needed.

If none of those work, then I don't think I can help you.

Share this post


Link to post
Share on other sites

This seemed to work so far,

Thanks

Does the helicopter clip into the platform when it respawns?
 

If so, try this:

find:

_unit = _type createVehicle _position;

replace with:

_unit = _type createVehicle ASLToAGL [0,0,10];

Share this post


Link to post
Share on other sites

This seemed to work so far,

Thanks

 

Great, I've had a problem in the past with vehicles not starting, and it was because createVehicle uses AGL as position and that's quite a difference in height from ASL, so they were first spawned underwater which kills engines of vehicles, and explodes helicopters. A little thing to keep in mind.

Share this post


Link to post
Share on other sites

Well, it almost worked.

 

This solution has worked for all helicopters, but the blackfish is a different story. The blackfish still respawns and flys into the sky and explodes.

 

 

Great, I've had a problem in the past with vehicles not starting, and it was because createVehicle uses AGL as position and that's quite a difference in height from ASL, so they were first spawned underwater which kills engines of vehicles, and explodes helicopters. A little thing to keep in mind.

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
Sign in to follow this  

×