Epoch_Server/Server/@epochhive/addons/DZMS/Scripts/DZMSAISpawn.sqf

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];