/* // DZMSAISpawn.sqf by Vampire Usage: [position,unitcount,skillLevel] execVM "dir\DZMSAISpawn.sqf"; Position is the coordinates to spawn at [X,Y,Z] UnitCount is the number of units to spawn SkillLevel is the skill number defined in DZMSAIConfig.sqf */ // private ["_position","_unitcount","_skill","_wpRadius","_xpos","_ypos","_unitGroup","_aiskin","_aivest","_aiheadgear","_unit","_weapon","_magazine","_wppos1","_wppos2","_wppos3","_wppos4","_wp1","_wp2","_wp3","_wp4","_wpfin","_unitArrayName","_unitMissionCount"]; _position = _this select 0; _unitcount = _this select 1; _skill = _this select 2; _unitArrayName = _this select 3; //diag_log text format ["[DZMS]: AI Pos:%1 / AI UnitNum: %2 / AI SkillLev:%3",_position,_unitcount,_skill]; _wpRadius = 20; _xpos = _position select 0; _ypos = _position select 1; //Create the unit group. We use east by default. _unitGroup = createGroup DZMSAISide; //Probably unnecessary, but prevents client AI stacking if (!isServer) exitWith {}; for "_x" from 1 to _unitcount do { //Lets spawn the unit _unit = _unitGroup createUnit [DZMSAIModel, [(_position select 0),(_position select 1),(_position select 2)], [], 10, "NONE"]; //Make him join the correct team [_unit] joinSilent _unitGroup; //Add the behaviour _unit enableAI "TARGET"; _unit enableAI "AUTOTARGET"; _unit enableAI "MOVE"; _unit enableAI "ANIM"; _unit enableAI "FSM"; _unit setCombatMode "YELLOW"; _unit setBehaviour "COMBAT"; //Remove the items he spawns with by default removeAllWeapons _unit; removeAllItems _unit; removeAllAssignedItems _unit; removeUniform _unit; removeVest _unit; removeBackpack _unit; removeHeadgear _unit; removeGoggles _unit; //Add Money to AI Wallets. Credit to Zupa for the original code. if (DZMSAICheckWallet) then { _cash = round(random 10) * 5; // adds money to ai wallets in 5Cr increments. _unit setVariable["Crypto",_cash,true]; }; //Now we need to figure out their loadout, and assign it //Get the weapon array based on skill _weaponArray = [_skill] call DZMSGetWeapon; _weapon = _weaponArray select 0; _magazine = _weaponArray select 1; //diag_log text format ["[DZMS]: AI Weapon:%1 / AI Magazine:%2",_weapon,_magazine]; // Select a random uniform and put it on _aiskin = selectRandom DZMSBanditSkins; _unit forceAddUniform _aiskin; // If an array of helmets is provided then select a random one from that list // Otherwise select random vanilla headgear _aiheadgear = selectRandom DZMSBanditHelmets; if(_aiheadgear != "") then { _unit addHeadgear _aiheadgear; } else { _unit addHeadgear format ["H_%1_EPOCH", floor(random 91) + 1]; }; // If an array of vests is provided then select a random one from that list // Otherwise select a random vanilla vest _aivest = selectRandom DZMSBanditVests; if(_aivest != "") then { _unit addvest _aivest; } else { _unit addvest format ["V_%1_EPOCH", floor(random 39) + 1]; }; //Get the gear array _aigearArray = [DZMSGear0,DZMSGear1,DZMSGear2,DZMSGear3,DZMSGear4]; _gearmagazines = selectRandom _aigearArray; //Gear the AI backpack _aipack = selectRandom DZMSPacklist; //Lets add it to the Unit for "_i" from 1 to 3 do { _unit addMagazine _magazine; }; _unit addWeapon _weapon; _unit selectWeapon _weapon; _unit addBackpack _aipack; if (DZMSUseNVG) then { _unit addWeapon "NVGoggles"; }; { _unit addMagazine _x } forEach _gearmagazines; _aicskill = DZMSSkills1; //Lets set the skills switch (_skill) do { case 0: {_aicskill = DZMSSkills0;}; case 1: {_aicskill = DZMSSkills1;}; case 2: {_aicskill = DZMSSkills2;}; case 3: {_aicskill = DZMSSkills3;}; }; { _unit setSkill [(_x select 0),(_x select 1)] } forEach _aicskill; //Lets prepare the unit for cleanup _unit addEventHandler ["Killed",{ [(_this select 0), (_this select 1)] ExecVM DZMSAIKilled; }]; _unit setVariable ["DZMSAI", true]; }; //Lets give a launcher if enabled //The last _unit should still be defined from the FOR above if (DZMSUseRPG) then { _unit addWeapon "launch_RPG32_F"; _unit addMagazine "RPG32_F"; _unit addMagazine "RPG32_F"; }; // These are 4 waypoints in a NSEW around the center _wppos1 = [_xpos, _ypos+20, 0]; _wppos2 = [_xpos+20, _ypos, 0]; _wppos3 = [_xpos, _ypos-20, 0]; _wppos4 = [_xpos-20, _ypos, 0]; // We add the 4 waypoints _wp1 = _unitGroup addWaypoint [_wppos1, _wpRadius]; _wp1 setWaypointType "MOVE"; _wp2 = _unitGroup addWaypoint [_wppos2, _wpRadius]; _wp2 setWaypointType "MOVE"; _wp3 = _unitGroup addWaypoint [_wppos3, _wpRadius]; _wp3 setWaypointType "MOVE"; _wp4 = _unitGroup addWaypoint [_wppos4, _wpRadius]; _wp4 setWaypointType "MOVE"; // Then we add a center waypoint that tells them to visit the rest _wpfin = _unitGroup addWaypoint [[_xpos,_ypos, 0], _wpRadius]; _wpfin setWaypointType "CYCLE"; //diag_log text format ["[DZMS]: Spawned %1 AI at %2",_unitcount,_position]; // load the unit groups into a passed array name so they can be cleaned up later call compile format[" %1 = %1 + (units _unitGroup); _unitMissionCount = count %1; ",_unitArrayName]; diag_log text format["[DZMS]: (%3) %1 AI Spawned, %2 units in mission.",count (units _unitGroup),_unitMissionCount,_unitArrayName];