Sarge-AI/sarge/UPSMON/MODULES/UPSMON_RESPAWN.sqf
Teh Dango 7067ad9b0a 2.2.3
Check the change log for details
2016-08-18 22:58:49 -04:00

214 lines
6.4 KiB
Plaintext

/****************************************************************
File: UPSMON_RESPAWN.sqf
Author: Monsada
Description:
The script will create X Group with the same parameters and unit than the group of reference
Parameter(s):
<--- Parameters of the original group
<--- Surrended (boolean)
<--- Side of the group
Returns:
nothing
****************************************************************/
private ["_grp","_grpidx","_track","_orgpos","_respawn","_respawnmax","_unittype","_membertypes","_rnd","_grp","_lead","_initstr","_targetpos","_spawned","_vehicletypes","_UCthis","_respawndelay","_group"];
_grp = _this select 0;
_UCthis = _this select 1;
_side = (_grp getvariable "UPSMON_Origin") select 5;
_grpid = _grp getvariable ["UPSMON_Grpid",0];
_removeunit = _grp getvariable ["UPSMON_Removegroup",false];
_dist = 1000;
_respawnmax = 0;
if (UPSMON_Debug>0) then {hint format["%1 exiting mainloop",_grpid]; diag_log format ["exit: %1 %2 %3 %4",_grp,units _grp,alive leader _grp,_removeunit];};
//Limpiamos variables globales de este grupo
//UPSMON_targetsPos set [_grpid,[0,0]];
if (_side == civilian) then
{
if (_grp in UPSMON_Civs) then {UPSMON_Civs = UPSMON_Civs - [_grp];};
}
else
{
if (_grp in UPSMON_NPCs) then {UPSMON_NPCs = UPSMON_NPCs - [_grp];};
};
switch (_side) do
{
case West:
{
if (_grp in UPSMON_TRANSPORT_WEST_UNITS) then {UPSMON_TRANSPORT_WEST_UNITS = UPSMON_TRANSPORT_WEST_UNITS - [_grp];};
if (_grp in UPSMON_REINFORCEMENT_WEST_UNITS) then {UPSMON_REINFORCEMENT_WEST_UNITS = UPSMON_REINFORCEMENT_WEST_UNITS - [_grp];};
if (_grp in UPSMON_ARTILLERY_WEST_UNITS) then {UPSMON_ARTILLERY_WEST_UNITS = UPSMON_ARTILLERY_WEST_UNITS - [_grp];};
};
case EAST:
{
if (_grp in UPSMON_TRANSPORT_EAST_UNITS) then {UPSMON_TRANSPORT_EAST_UNITS = UPSMON_TRANSPORT_EAST_UNITS - [_grp];};
if (_grp in UPSMON_REINFORCEMENT_EAST_UNITS) then {UPSMON_REINFORCEMENT_EAST_UNITS = UPSMON_REINFORCEMENT_EAST_UNITS - [_grp];};
if (_grp in UPSMON_ARTILLERY_EAST_UNITS) then {UPSMON_ARTILLERY_EAST_UNITS = UPSMON_ARTILLERY_EAST_UNITS - [_grp];};
};
case resistance:
{
if (_grp in UPSMON_TRANSPORT_GUER_UNITS) then {UPSMON_TRANSPORT_GUER_UNITS = UPSMON_TRANSPORT_GUER_UNITS - [_grp];};
if (_grp in UPSMON_REINFORCEMENT_GUER_UNITS) then {UPSMON_REINFORCEMENT_GUER_UNITS = UPSMON_REINFORCEMENT_GUER_UNITS - [_grp];};
if (_grp in UPSMON_ARTILLERY_GUER_UNITS) then {UPSMON_ARTILLERY_GUER_UNITS = UPSMON_ARTILLERY_GUER_UNITS - [_grp];};
};
};
UPSMON_Exited=UPSMON_Exited+1;
If (!_removeunit) then
{
sleep (_grp getvariable ["UPSMON_RESPAWNDELAY",0]);
_respawnmax = _grp getvariable ["UPSMON_RESPAWNTIME",0];
_orgpos = _grp getvariable "UPSMON_RESPAWNPOS";
//Verify if targets near respawn
_mensnear = _orgpos nearentities [["CAManBase","TANK","CAR"],800];
_enemySides = _side call BIS_fnc_enemySides;
_enynear = false;
{
If (side _x in _enemySides) then {_enynear = true;}
} foreach _mensnear;
//does respawn of group =====================================================================================================
if (_grp getvariable ["UPSMON_RESPAWN",false] && _respawnmax > 0 && (_grp getvariable ["UPSMON_Grpmission",""] != "SURRENDER") && !_enynear) then
{
if (UPSMON_Debug>0) then {player sidechat format["%1 doing respawn",_grpid]};
_membertypes = (_grp getvariable "UPSMON_RESPAWNUNITS") select 0;
_vehicletypes = (_grp getvariable "UPSMON_RESPAWNUNITS") select 1;
_crews = [];
// any init strings?
_initstr = ["INIT:","",_UCthis] call UPSMON_getArg;
// make the clones civilians
// use random Civilian models for single unit groups
_group = createGroup _side;
_lead = ObjNull;
// copy team members (skip the leader)
_i=0;
{
_unittype = _x select 0;
if (_side == Civilian) then {_rnd=1+round(random 20); if (_rnd>1) then {_unittype=format["Civilian%1",_rnd]}};
_roletype = _x select 2;
_targetpos = _orgpos findEmptyPosition [5,50];
if (count _targetpos == 0) then {_targetpos = _orgpos};
_newunit = _group createUnit [_unittype, _targetpos, [], 0, "FORM"];
_equipment = _x select 1;
[_newunit,_equipment] call UPSMON_addequipment;
if (isMultiplayer) then
{
[[netid _newunit, _initstr], "UPSMON_fnc_setVehicleInit", true, true] spawn BIS_fnc_MP;
} else
{
_unitstr = "_newunit";
_index=[_initstr,"this",_unitstr] call UPSMON_Replace;
call compile format ["%1",_index];
};
If (count _roletype > 0) then
{
_crews pushback [_newunit,_roletype];
};
[_newunit] join _group;
If (_i == 0) then
{
_group selectLeader _newunit;
_lead = _newunit;
};
_i=_i+1;
sleep 0.1;
} foreach _membertypes;
if ( _lead == vehicle _lead) then {
{
if (alive _x && canmove _x) then
{
[_x] dofollow _lead;
};
sleep 0.1;
} foreach units _lead;
};
{
_vehicle = _x;
_targetpos = _orgpos findEmptyPosition [10, 200];
if (count _targetpos == 0) then {_targetpos = _orgpos};
//if (UPSMON_Debug>0) then {player globalchat format["%1 create vehicle _newpos %2 ",_x,_targetpos]};
_newunit = (_vehicle select 0) createvehicle (_targetpos);
_newunit setdir (_vehicle select 1);
{
_crew = _x select 0;
_role = (_x select 1) select 0;
unassignVehicle _crew;
switch (_role) do
{
case "driver":
{
_crew moveindriver _newunit
};
case "commander":
{
_crew moveincommander _newunit
};
case "Turret":
{
_crew moveInTurret [_newunit,(_x select 1) select 1]
};
case "cargo":
{
_crew moveinCargo _newunit
};
case "default":
{
};
};
sleep 0.02;
} foreach _crews;
} foreach _vehicletypes;
//if (UPSMON_Debug>0) then {player globalchat format["%1 _vehicletypes: %2",_grpidx, _vehicletypes]};
_spawned= if ("SPAWNED" in _UCthis) then {true} else {false};
//Set new parameters
if (!_spawned) then
{
_UCthis = _UCthis + ["SPAWNED"];
if ((count _vehicletypes) > 0) then
{
_UCthis = _UCthis + ["VEHTYPE:"] + ["dummyveh"];
};
};
_UCthis set [0,_lead];
_respawnmax = _respawnmax - 1;
_UCthis = ["RESPAWN:",_respawnmax,_UCthis] call UPSMON_setArg;
sleep 0.1;
_UCthis = ["VEHTYPE:",_vehicletypes,_UCthis] call UPSMON_setArg;
//Exec UPSMON script
_UCthis spawn UPSMON;
sleep 0.1;
};
};
if (({alive _x} count units _grp) == 0 ) then {
deleteGroup _grp;
};