Merge pull request #20 from Defent/StaticStuff

Staticstuff
This commit is contained in:
eraser1 2015-09-09 22:01:54 -05:00
commit 077b1e0b71
11 changed files with 329 additions and 49 deletions

View File

@ -49,6 +49,7 @@ class CfgFunctions
class SetGroupBehavior {};
class SpawnAIGroup {};
class SpawnAISoldier {};
class SpawnAIStatic {};
class SpawnCrate {};
class SpawnNonPersistentVehicle {};
class TargetsKilled {};

View File

@ -21,9 +21,6 @@ DMS_DEBUG = false;
DMS_AI_KillPercent = 100; // The percent amount of AI that need to be killed for "killPercent" mission requirement (NOT IMPLEMENTED)
DMS_BanditMoneyGainOnKill = 50; // The amount of Poptabs gained for killing a bandit
DMS_BanditRepGainOnKill = 10; // The amount of Respect gained for killing a bandit
DMS_MissionMarkerWinDot = true; // Keep the mission marker dot with a "win" message after mission is over
DMS_MissionMarkerLoseDot = true; // Keep the mission marker dot with a "lose" message after mission is over
DMS_MissionMarkerWinDotTime = 30; // How many seconds the "win" mission dot will remain on the map
@ -84,9 +81,15 @@ DMS_DEBUG = false;
/* AI Settings */
DMS_Bandit_Soldier_MoneyGain = 50; // The amount of Poptabs gained for killing a bandit soldier
DMS_Bandit_Soldier_RepGain = 10; // The amount of Respect gained for killing a bandit soldier
DMS_Bandit_Static_MoneyGain = 100; // The amount of Poptabs gained for killing a bandit static gunner
DMS_Bandit_Static_RepGain = 25; // The amount of Respect gained for killing a bandit static gunner
DMS_banditSide = EAST; // The side (team) that AI Bandits will spawn on
DMS_clear_AI_body = false; // Clear AI body as soon as they die
DMS_clear_AI_body_chance = 50; // Percentage chance that AI bodies will be cleared when they die
DMS_ai_disable_ramming_damage = true; // Disables damage due to ramming into AI. !!!NOTE: THIS WILL NOT BE RELIABLE WITH "DMS_ai_offload_to_client"!!!
DMS_credit_roadkill = false; // Credit players with respect/poptabs if they kill an AI by running it over
DMS_remove_roadkill = true; // Remove gear from AI bodies that are roadkilled
DMS_remove_roadkill_chance = 50; // Percentage chance that roadkilled AI bodies will be deleted
@ -101,7 +104,6 @@ DMS_DEBUG = false;
DMS_ai_enable_water_equipment = true; // Enable/disable overriding default weapons of an AI if it spawns on/in water
// https://community.bistudio.com/wiki/AI_Sub-skills#general
DMS_ai_static_skills = true; // Use "DMS_ai_skill_static" for AI on static guns
DMS_ai_skill_static = [["aimingAccuracy",0.20],["aimingShake",0.70],["aimingSpeed",0.75],["spotDistance",0.70],["spotTime",0.50],["courage",1.00],["reloadSpeed",1.00],["commanding",1.00],["general",1.00]]; // Static AI Skills
DMS_ai_skill_easy = [["aimingAccuracy",0.30],["aimingShake",0.50],["aimingSpeed",0.50],["spotDistance",0.50],["spotTime",0.50],["courage",1.00],["reloadSpeed",1.00],["commanding",1.00],["general",0.50]]; // Easy
DMS_ai_skill_moderate = [["aimingAccuracy",0.60],["aimingShake",0.60],["aimingSpeed",0.60],["spotDistance",0.60],["spotTime",0.60],["courage",1.00],["reloadSpeed",1.00],["commanding",1.00],["general",0.60]]; // Moderate
@ -533,5 +535,6 @@ DMS_DEBUG = false;
if(DMS_DEBUG) then {
DMS_TimeBetweenMissions = [30,60];
DMS_MissionTimeOut = [60,90];
//DMS_MissionTypes = [["testmission",1]];
diag_log format ["DMS_DEBUG CONFIG :: Overriding DMS_TimeBetweenMissions (%1) and DMS_MissionTimeOut (%2)",DMS_TimeBetweenMissions,DMS_MissionTimeOut];
};

View File

@ -42,8 +42,8 @@ _crate1 = ["Box_NATO_Wps_F",_pos] call DMS_fnc_SpawnCrate;
_wreck = createVehicle ["Land_FuelStation_Build_F",[(_pos select 0) - 10, (_pos select 1),-0.2],[], 0, "CAN_COLLIDE"];
_vehicle1 = ["Exile_Car_SUV_Red",_pos] call DMS_fnc_SpawnNonPersistentVehicle;
_vehicle2 = ["Exile_Car_SUV_Grey",_pos] call DMS_fnc_SpawnNonPersistentVehicle;
_vehicle1 = ["Exile_Car_SUV_Red",[(_pos select 0) + -1*(5+(random 5)),(_pos select 1) + -1*(5+(random 5)),0]] call DMS_fnc_SpawnNonPersistentVehicle;
_vehicle2 = ["Exile_Car_SUV_Grey",[(_pos select 0)+(5+(random 5)),(_pos select 1)+(5+(random 5)),0]] call DMS_fnc_SpawnNonPersistentVehicle;

View File

@ -36,6 +36,18 @@ _group =
_side // "bandit","hero", etc.
] call DMS_fnc_SpawnAIGroup;
_staticGuns =
[
[
[(_pos select 0)+(5+(random 5)),(_pos select 1)+(5+(random 5)),0],
[(_pos select 0) + -1*(5+(random 5)),(_pos select 1) + -1*(5+(random 5)),0]
],
_group,
"assault",
"static",
"bandit"
] call DMS_fnc_SpawnAIStatic;
// Create Crates
_crate1 = ["Box_NATO_Wps_F",_pos] call DMS_fnc_SpawnCrate;
@ -62,7 +74,7 @@ _missionAIUnits =
// Define mission-spawned objects and loot values
_missionObjs =
[
[_wreck],
[_wreck]+_staticGuns,
[_vehicle],
[[_crate1,_crate_loot_values1]]
];

View File

@ -0,0 +1,161 @@
/*
Sample mission (duplicate for testing purposes)
*/
private ["_num", "_side", "_pos", "_difficulty", "_AICount", "_group", "_crate", "_crate_loot_values", "_msgStart", "_msgWIN", "_msgLOSE", "_missionName", "_missionAIUnits", "_missionObjs", "_markers", "_time", "_added","_vehicle"];
// For logging purposes
_num = DMS_MissionCount;
// Set mission side (only "bandit" is supported for now)
_side = "bandit";
// find position
_pos = call DMS_fnc_findSafePos;
// Set general mission difficulty
_difficulty = "moderate";
// Create AI
// TODO: Spawn AI only when players are nearby
_AICount = 4 + (round (random 2));
_group =
[
_pos, // Position of AI
_AICount, // Number of AI
"random", // "random","hardcore","difficult","moderate", or "easy"
"random", // "random","assault","MG","sniper" or "unarmed" OR [_type,_launcher]
_side // "bandit","hero", etc.
] call DMS_fnc_SpawnAIGroup;
_staticGuns =
[
[
[(_pos select 0)+(5+(random 5)),(_pos select 1)+(5+(random 5)),0],
[(_pos select 0) + -1*(5+(random 5)),(_pos select 1) + -1*(5+(random 5)),0]
],
_group,
"assault",
"static",
"bandit"
] call DMS_fnc_SpawnAIStatic;
// Create Crate
_crate = ["Box_NATO_Wps_F",_pos] call DMS_fnc_SpawnCrate;
_vehicle = ["Exile_Car_Offroad_Armed_Guerilla01",_pos] call DMS_fnc_SpawnNonPersistentVehicle;
// Set crate loot values
_crate_loot_values =
[
5, // Weapons
10, // Items
3 // Backpacks
];
// Define mission-spawned AI Units
_missionAIUnits =
[
_group // We only spawned the single group for this mission
];
// Define mission-spawned objects and loot values
_missionObjs =
[
_staticGuns, // We only spawn the static guns
[_vehicle],
[[_crate,_crate_loot_values]]
];
// Define Mission Start message
_msgStart = format["<t color='#FFFF00' size='1.25'>Armed Bandits! </t><br/> A heavily armed bandit group has been spotted, take them out and claim their vehicle!"];
// Define Mission Win message
_msgWIN = format["<t color='#0080ff' size='1.25'>Armed Bandits! </t><br/> Convicts have successfully taken care of the bandit group!"];
// Define Mission Lose message
_msgLOSE = format["<t color='#FF0000' size='1.25'>Armed Bandits! </t><br/> The bandits have taken their vehicle and drove off, no loot today!"];
// Define mission name (for map marker and logging)
_missionName = "Armed Bandits";
// Create Markers
_markers =
[
_pos,
_missionName,
_difficulty
] call DMS_fnc_CreateMarker;
// Record time here (for logging purposes, otherwise you could just put "diag_tickTime" into the "DMS_AddMissionToMonitor" parameters directly)
_time = diag_tickTime;
// Parse and add mission info to missions monitor
_added =
[
_pos,
[
[
"kill",
_group
],
[
"playerNear",
[_pos,DMS_playerNearRadius]
]
],
[
_time,
(DMS_MissionTimeOut select 0) + random((DMS_MissionTimeOut select 1) - (DMS_MissionTimeOut select 0))
],
_missionAIUnits,
_missionObjs,
[_msgWIN,_msgLOSE],
_markers,
_side
] call DMS_fnc_AddMissionToMonitor;
// Check to see if it was added correctly, otherwise delete the stuff
if !(_added) exitWith
{
diag_log format ["DMS ERROR :: Attempt to set up mission %1 with invalid parameters for DMS_AddMissionToMonitor! Deleting mission objects and resetting DMS_MissionCount.",_missionName];
// Delete AI units and the crate. I could do it in one line but I just made a little function that should work for every mission (provided you defined everything correctly)
_cleanup = [];
{
_cleanup pushBack _x;
} forEach _missionAIUnits;
_cleanup pushBack ((_missionObjs select 0)+(_missionObjs select 1));
{
_cleanup pushBack (_x select 0);
} foreach (_missionObjs select 2);
_cleanup call DMS_fnc_CleanUp;
// Delete the markers directly
{deleteMarker _x;} forEach _markers;
// Reset the mission count
DMS_MissionCount = DMS_MissionCount - 1;
};
// Notify players
_msgStart call DMS_fnc_BroadcastMissionStatus;
if (DMS_DEBUG) then
{
diag_log format ["DMS_DEBUG MISSION: (%1) :: Mission #%2 started at %3 with %4 AI units and %5 difficulty at time %6",_missionName,_num,_pos,_AICount,_difficulty,_time];
};

View File

@ -10,12 +10,12 @@
_killer
],
_side, // "bandit" only for now
_type // not currently used
_type // Type of AI: "soldier","static","vehicle","heli", etc.
] call DMS_fnc_OnKilled;
*/
private ["_unit", "_player", "_playerObj", "_side", "_type", "_launcher", "_rockets", "_money", "_respect", "_moneyGain", "_repGain"];
private ["_unit", "_player", "_side", "_type", "_launcher", "_playerObj", "_rockets", "_grpUnits", "_veh", "_moneyGain", "_repGain", "_money", "_respect"];
if (DMS_DEBUG) then
@ -124,8 +124,8 @@ if (isPlayer _player) then
if ((!isNull _playerObj) && {((getPlayerUID _playerObj) != "")}) then
{
_moneyGain = missionNamespace getVariable [format ["DMS_%1MoneyGainOnKill",_side],0];
_repGain = missionNamespace getVariable [format ["DMS_%1RepGainOnKill",_side],0];
_moneyGain = missionNamespace getVariable [format ["DMS_%1_%2_MoneyGain",_side,_type],0];
_repGain = missionNamespace getVariable [format ["DMS_%1_%2_RepGain",_side,_type],0];
if ((_moneyGain>0) || (_repGain>0)) then
{

View File

@ -7,21 +7,21 @@
[
_pos, // Position of AI
_count, // Number of AI
_difficulty, // "random","hardcore","difficult","moderate", or "easy"
_type // "random","assault","MG","sniper" or "unarmed" OR [_type,_launcher]
_difficulty, // AI Difficulty: "random","hardcore","difficult","moderate", or "easy"
_class // AI Class: "random","assault","MG","sniper" or "unarmed" OR [_class,_launcher]
_side // Only "bandit" is supported atm
] call DMS_fnc_SpawnAIGroup;
Returns AI Group
*/
private ["_OK", "_pos", "_count", "_difficulty", "_type", "_side", "_pos_x", "_pos_y", "_pos_z", "_launcher", "_unit", "_client"];
private ["_OK", "_pos", "_count", "_difficulty", "_class", "_side", "_pos_x", "_pos_y", "_pos_z", "_launcher", "_unit", "_client"];
_OK = params
[
["_pos",[0,0,0],[[]],[3]],
["_count",0,[0]],
["_difficulty","random",[""]],
["_type","random",[""]],
["_class","random",[""]],
["_side","bandit",[""]]
];
@ -42,14 +42,14 @@ _pos_z = _pos select 2;
if(DMS_DEBUG) then
{
diag_log format["DMS_DEBUG SpawnAIGroup :: Spawning %1 %2 %3 AI at %4 with %5 difficulty.",_count,_type,_side,_pos,_difficulty];
diag_log format["DMS_DEBUG SpawnAIGroup :: Spawning %1 %2 %3 AI at %4 with %5 difficulty.",_count,_class,_side,_pos,_difficulty];
};
// if soldier have AT/AA weapons
if (typeName _type == "ARRAY") then
if (typeName _class == "ARRAY") then
{
_launcher = _type select 1;
_type = _type select 0;
_launcher = _class select 1;
_class = _class select 0;
};
// Randomize position
@ -74,7 +74,7 @@ if(_pos_z == 0) then
_group = createGroup (missionNamespace getVariable [format ["DMS_%1Side",_side],EAST]);
for "_i" from 1 to _count do {
_unit = [_group,[_pos_x,_pos_y,_pos_z],_type,_difficulty,_side] call DMS_fnc_SpawnAISoldier;
_unit = [_group,[_pos_x,_pos_y,_pos_z],_class,_difficulty,_side,"Soldier"] call DMS_fnc_SpawnAISoldier;
};
// An AI will definitely spawn with a launcher if you define type

View File

@ -7,9 +7,10 @@
[
_group, // Group the AI will belong to
_pos, // Position of AI
_type, // "random","assault","MG","sniper" or "unarmed"
_difficulty, // "random","hardcore","difficult","moderate", or "easy"
_class, // Classname: "random","assault","MG","sniper" or "unarmed"
_difficulty, // Difficulty: "random","static","hardcore","difficult","moderate", or "easy"
_side, // "bandit","hero", etc.
_type, // Type of AI: "soldier","static","vehicle","heli", etc.
_customGearSet // OPTIONAL: Manually defined AI gear.
] call DMS_fnc_SpawnAIGroup;
@ -21,6 +22,7 @@
_pistol, // String | EG: "hgun_Pistol_heavy_01_snds_F"
_pistolAttachments, // Array of strings | EG: ["optic_MRD","muzzle_snds_acp"]
_items, // Array of strings | EG: ["Rangefinder","ItemGPS","Exile_Item_InstaDoc"]
_launcher, // String | EG: "launch_RPG32_F"
_helmet, // String | EG: "H_HelmetLeaderO_ocamo"
_uniform, // String | EG: "U_O_GhillieSuit"
_vest, // String | EG: "V_PlateCarrierGL_blk"
@ -30,16 +32,18 @@
Returns AI Unit
*/
private ["_OK", "_useCustomGear", "_unarmed", "_type", "_customGear", "_unit", "_side", "_nighttime", "_weapon", "_muzzle", "_suppressor", "_pistols", "_pistol", "_customGearSet", "_helmet", "_uniform", "_vest", "_backpack", "_magazines", "_weaponAttachments", "_pistolAttachments", "_items", "_difficulty", "_skillArray"];
private ["_OK", "_useCustomGear", "_unarmed", "_class", "_customGear", "_type", "_unit", "_side", "_nighttime", "_weapon", "_muzzle", "_suppressor", "_pistols", "_pistol", "_customGearSet", "_helmet", "_uniform", "_vest", "_backpack", "_launcher", "_magazines", "_weaponAttachments", "_pistolAttachments", "_items", "_difficulty", "_skillArray"];
_OK = params
[
["_group",grpNull,[grpNull]],
["_pos",[0,0,0],[[]],[3]],
["_type","random",[""]],
["_class","random",[""]],
["_difficulty","random",[""]],
["_side","bandit",[""]]
["_side","bandit",[""]],
["_type","soldier",[""]]
];
_useCustomGear = false;
_unarmed = false;
@ -49,7 +53,7 @@ if (!_OK) then
}
else
{
if ((_type == "custom") && {((count _this)>5)}) then
if ((_class == "custom") && {((count _this)>6)}) then
{
_customGear = _this select 5;
_useCustomGear = true;
@ -93,20 +97,20 @@ if !(DMS_ai_default_items isEqualTo []) then
};
switch (toLower _type) do
switch (toLower _class) do
{
case "random" : {_type = DMS_random_AI call BIS_fnc_selectRandom;};
case "unarmed" : {_type = "assault";_unarmed = true;};
case "random" : {_class = DMS_random_AI call BIS_fnc_selectRandom;};
case "unarmed" : {_class = "assault";_unarmed = true;};
};
// Unit name
_unit setName format["[DMS_Unit_%1%2]",_type,floor(random 1000)];
_unit setName format["[DMS_Unit_%1%2]",_class,floor(random 1000)];
if (!_useCustomGear) then
{
if !(_type in DMS_ai_SupportedClasses) exitWith
if !(_class in DMS_ai_SupportedClasses) exitWith
{
diag_log format ["DMS ERROR :: DMS_SpawnAISoldier called with unsupported _type: %1 | _this: %2",_type,_this];
diag_log format ["DMS ERROR :: DMS_SpawnAISoldier called with unsupported _class: %1 | _this: %2",_class,_this];
};
@ -120,18 +124,18 @@ if (!_useCustomGear) then
{
_unit linkItem _x;
};
} forEach (missionNamespace getVariable [format ["DMS_%1_equipment",_type],[]]);
} forEach (missionNamespace getVariable [format ["DMS_%1_equipment",_class],[]]);
// Items (Loot stuff that goes in uniform/vest/backpack)
{_unit addItem _x;} forEach (missionNamespace getVariable [format ["DMS_%1_items",_type],[]]);
{_unit addItem _x;} forEach (missionNamespace getVariable [format ["DMS_%1_items",_class],[]]);
// Clothes
_unit addHeadgear ((missionNamespace getVariable [format ["DMS_%1_helmets",_type],[]]) call BIS_fnc_selectRandom);
_unit forceAddUniform ((missionNamespace getVariable [format ["DMS_%1_clothes",_type],[]]) call BIS_fnc_selectRandom);
_unit addVest ((missionNamespace getVariable [format ["DMS_%1_vests",_type],[]]) call BIS_fnc_selectRandom);
_unit addBackpack ((missionNamespace getVariable [format ["DMS_%1_backpacks",_type],[]]) call BIS_fnc_selectRandom);
_unit addHeadgear ((missionNamespace getVariable [format ["DMS_%1_helmets",_class],[]]) call BIS_fnc_selectRandom);
_unit forceAddUniform ((missionNamespace getVariable [format ["DMS_%1_clothes",_class],[]]) call BIS_fnc_selectRandom);
_unit addVest ((missionNamespace getVariable [format ["DMS_%1_vests",_class],[]]) call BIS_fnc_selectRandom);
_unit addBackpack ((missionNamespace getVariable [format ["DMS_%1_backpacks",_class],[]]) call BIS_fnc_selectRandom);
// Make AI effective at night
_nighttime = (sunOrMoon != 1);
@ -142,14 +146,14 @@ if (!_useCustomGear) then
if (!_unarmed) then
{
_weapon = (missionNamespace getVariable [format ["DMS_%1_weps",_type],[]]) call BIS_fnc_selectRandom;
_weapon = (missionNamespace getVariable [format ["DMS_%1_weps",_class],[]]) call BIS_fnc_selectRandom;
[_unit, _weapon, 6 + floor(random 3)] call BIS_fnc_addWeapon;
_unit selectWeapon _weapon;
if((random 100) <= (missionNamespace getVariable [format["DMS_%1_optic_chance",_type],0])) then
if((random 100) <= (missionNamespace getVariable [format["DMS_%1_optic_chance",_class],0])) then
{
_unit addPrimaryWeaponItem ((missionNamespace getVariable [format ["DMS_%1_optics",_type],[]]) call BIS_fnc_selectRandom);
_unit addPrimaryWeaponItem ((missionNamespace getVariable [format ["DMS_%1_optics",_class],[]]) call BIS_fnc_selectRandom);
};
if (_nighttime && {(random 100) <= DMS_ai_nighttime_accessory_chance}) then
@ -157,12 +161,12 @@ if (!_useCustomGear) then
_unit addPrimaryWeaponItem (["acc_pointer_IR","acc_flashlight"] call BIS_fnc_selectRandom);
};
if((random 100) <= (missionNamespace getVariable [format["DMS_%1_bipod_chance",_type],0])) then
if((random 100) <= (missionNamespace getVariable [format["DMS_%1_bipod_chance",_class],0])) then
{
_unit addPrimaryWeaponItem (DMS_ai_BipodList call BIS_fnc_selectRandom);
};
if((random 100) <= (missionNamespace getVariable [format["DMS_%1_suppressor_chance",_type],0])) then
if((random 100) <= (missionNamespace getVariable [format["DMS_%1_suppressor_chance",_class],0])) then
{
_suppressor = _weapon call DMS_fnc_FindSuppressor;
if(_suppressor != "") then
@ -182,7 +186,7 @@ if (!_useCustomGear) then
[_unit, "arifle_SDAR_F", 4 + floor(random 3), "20Rnd_556x45_UW_mag"] call BIS_fnc_addWeapon;
};
_pistols = missionNamespace getVariable [format ["DMS_%1_pistols",_type],[]];
_pistols = missionNamespace getVariable [format ["DMS_%1_pistols",_class],[]];
if !(_pistols isEqualTo []) then
{
_pistol = _pistols call BIS_fnc_selectRandom;
@ -204,6 +208,7 @@ else
["_pistol","",[""]],
["_pistolAttachments",[],[[]]],
["_items",[],[[]]],
["_launcher","",[""]],
["_helmet","",[""]],
["_uniform","",[""]],
["_vest","",[""]],
@ -241,6 +246,11 @@ else
_unit addBackpack _backpack;
};
if !(_launcher isEqualTo "") then
{
[_unit, _launcher, 0] call BIS_fnc_addWeapon;
};
// Add Magazines before weapon so that gun will be loaded
{
@ -255,7 +265,7 @@ else
// Add gun and attachments
if !(_weapon isEqualTo "") then
{
_muzzle = [_unit, _weapon, 0] call BIS_fnc_addWeapon;
[_unit, _weapon, 0] call BIS_fnc_addWeapon;
{
_unit addPrimaryWeaponItem _x;
@ -268,7 +278,7 @@ else
// Add pistol and attachments
if !(_pistol isEqualTo "") then
{
_muzzle = [_unit, _pistol, 0] call BIS_fnc_addWeapon;
[_unit, _pistol, 0] call BIS_fnc_addWeapon;
{
_unit addPrimaryWeaponItem _x;
@ -287,7 +297,21 @@ else
// Soldier killed event handler
_unit addMPEventHandler ["MPKilled",'if (isServer) then {[_this, '+str _side+', "soldier"] call DMS_fnc_OnKilled;};'];
_unit addMPEventHandler ["MPKilled",'if (isServer) then {[_this, '+str _side+', '+str _type+'] call DMS_fnc_OnKilled;};'];
// Remove ramming damage from players. Will not work if unit is not local (offloaded)
if (DMS_ai_disable_ramming_damage) then
{
_unit addEventHandler ["HandleDamage",
{
_dmg = _this select 2;
if (isPlayer (_this select 3) && {(_this select 4)==""}) then
{
_dmg = 0;
};
_dmg
}];
};
_unit enableAI "TARGET";
_unit enableAI "AUTOTARGET";
@ -297,7 +321,7 @@ _unit enableAI "FSM";
if (DMS_DEBUG) then
{
diag_log format ["DMS_DEBUG SpawnAISoldier :: Spawned a %1 %2 AI at %3 with %4 difficulty to group %5",_type,_side,_pos,_difficulty,_group];
diag_log format ["DMS_DEBUG SpawnAISoldier :: Spawned a %1 %2 %6 AI at %3 with %4 difficulty to group %5",_class,_side,_pos,_difficulty,_group,_type];
};
_unit

View File

@ -0,0 +1,71 @@
/*
DMS_fnc_SpawnAIStatic
Created by eraser1
Influenced by WAI
Usage:
[
[ // Array of static gun positions
_pos1,
_pos2,
...
_pos3
],
_group, // Group to which the AI unit(s) belongs to
_class, // Class: "random","assault","MG","sniper" or "unarmed"
_difficulty, // Difficulty: "random","static","hardcore","difficult","moderate", or "easy"
_side // "bandit","hero", etc.
] call DMS_fnc_SpawnAIStatic;
Returns an array of static gun objects.
*/
private ["_OK", "_guns", "_pos", "_gun", "_unit", "_group", "_class", "_difficulty", "_side", "_positions"];
_OK = params
[
["_positions",[],[[]]],
["_group",grpNull,[grpNull]],
["_class","random",[""]],
["_difficulty","static",[""]],
["_side","bandit",[""]]
];
if (!_OK) exitWith
{
diag_log format ["DMS ERROR :: Calling DMS_fnc_SpawnAIStatic with invalid parameters: %1",_this];
};
_guns = [];
{
_pos = _x;
_gun = createVehicle [(DMS_static_weapons call BIS_fnc_selectRandom), _pos, [], 0, "CAN_COLLIDE"];
_gun setDir (random 360);
_gun setPosATL _pos;
_gun addEventHandler ["GetOut",{(_this select 0) setDamage 1;}];
_gun lock 2;
_guns pushBack _gun;
_unit = [_group,_pos,_class,_difficulty,_side,"Static"] call DMS_fnc_SpawnAISoldier;
_unit moveingunner _gun;
reload _unit;
if (DMS_DEBUG) then
{
diag_log format ["DMS_DEBUG SpawnAIStatic :: Created unit %1 at %2 as static gunner in %3",_unit,_pos,_gun];
};
} forEach _positions;
if (DMS_DEBUG) then
{
diag_log format ["DMS_DEBUG SpawnAIStatic :: Created %1 static AI with parameters: %2",count _positions,_this];
};
_guns

Binary file not shown.

View File

@ -78,6 +78,14 @@ if (!hasInterface && !isServer) then
## Changelog:
#### September 9, 2015 (10:00 PM CST-America):
* Added static AI! The "donthasslethehoff" mission has them included by default. :D
* New config values: ```DMS_Bandit_Static_MoneyGain``` and ```DMS_Bandit_Static_RepGain```.
* Future-proofed ```DMS_fnc_OnKilled```. As a result, "DMS_BanditMoneyGainOnKill" is now ```DMS_Bandit_Soldier_MoneyGain```, and "DMS_BanditRepGainOnKill" is now ```DMS_Bandit_Soldier_RepGain```.
* Added config value ```DMS_ai_disable_ramming_damage```. Check the comment for more info :)
* Removed config value "DMS_ai_static_skills"
* Randomized vehicle spawn position for "cardealer" mission.
#### September 8, 2015 (11:00 PM CST-America):
* AI Bodies should now be properly cleaned when run over (if configured to do so with ```DMS_remove_roadkill``` and ```DMS_remove_roadkill_chance```).
* Added config option ```DMS_credit_roadkill```. If set to true, players will get poptabs/respect for running over AI. Default: false.