173 lines
5.1 KiB
Plaintext
173 lines
5.1 KiB
Plaintext
/* //
|
|
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];
|