2015-08-28 05:23:34 +00:00
/*
2015-09-05 03:40:00 +00:00
DMS_fnc_FillCrate
2015-08-28 21:52:56 +00:00
Original credit goes to WAI: https://github.com/nerdalertdk/WICKED-AI
Edited by eraser1
Usage:
[
2015-09-26 00:28:04 +00:00
_crate, // OBJECT: The crate object
_lootValues, // ARRAY, STRING, or NUMBER: String or number refers to a crate case in config.cfg; array determines random crate weapons/items/backpacks
_rareLootChance // (OPTIONAL) NUMBER: Manually define the percentage chance of spawning some rare items.
2015-09-12 01:21:53 +00:00
] call DMS_fnc_FillCrate;
Loot values can be a number or a string with a corresponding "Crate Case" defined in the config. EG: DMS_CrateCase_Sniper. Or it can be an array.
In the array, the loot values are defined as:
2015-08-28 21:52:56 +00:00
[
_weapons,
_items,
_backpacks
]
2015-09-12 01:21:53 +00:00
Each loot argument can be an explicitly defined array of weapons with a number to spawn, or simply a number and weapons defined in the config.sqf are used.
For example, _weapons could simply be a number, in which case the given number of weapons are selected from "DMS_boxWeapons",
or an array as [_wepCount,_weps], where _wepCount is the number of weapons, and _weps is an array of weapons from which the guns are randomly selected.
2015-08-28 05:23:34 +00:00
*/
2015-09-26 00:28:04 +00:00
private ["_crate","_lootValues","_wepCount","_weps","_itemCount","_items","_backpackCount","_backpacks","_weapon","_ammo","_item","_backpack","_crateValues","_rareLootChance","_marker"];
2015-08-28 21:52:56 +00:00
2015-08-28 05:23:34 +00:00
2015-08-30 00:33:32 +00:00
_OK = params
2015-08-28 21:52:56 +00:00
[
2015-08-31 20:43:59 +00:00
["_crate",objNull,[objNull]],
2015-09-12 01:21:53 +00:00
["_lootValues","",[0,"",[]],[3]]
2015-08-28 21:52:56 +00:00
];
2015-08-31 20:43:59 +00:00
if (!_OK || {isNull _crate}) exitWith
2015-08-28 21:52:56 +00:00
{
2015-08-30 00:33:32 +00:00
diag_log format ["DMS ERROR :: Calling DMS_FillCrate with invalid parameters: %1",_this];
2015-08-28 21:52:56 +00:00
};
2015-08-27 07:44:23 +00:00
2015-09-12 01:21:53 +00:00
if !(DMS_GodmodeCrates) then
2015-08-28 21:52:56 +00:00
{
2015-09-12 01:21:53 +00:00
_crate allowDamage true;
2015-08-27 07:44:23 +00:00
};
2015-08-28 21:52:56 +00:00
2015-09-18 23:26:36 +00:00
_crate hideObjectGlobal false;
2015-08-28 21:52:56 +00:00
2015-09-12 01:21:53 +00:00
if ((typeName _lootValues)=="ARRAY") then
2015-08-28 21:52:56 +00:00
{
2015-09-12 01:21:53 +00:00
// Weapons
if(typeName (_lootValues select 0) == "ARRAY") then
{
_wepCount = (_lootValues select 0) select 0;
_weps = (_lootValues select 0) select 1;
}
else
{
_wepCount = _lootValues select 0;
_weps = DMS_boxWeapons;
};
2015-08-28 21:52:56 +00:00
2015-09-12 01:21:53 +00:00
// Items
if(typeName (_lootValues select 1) == "ARRAY") then
{
_itemCount = (_lootValues select 1) select 0;
_items = (_lootValues select 1) select 1;
}
else
{
_itemCount = _lootValues select 1;
_items = DMS_boxItems;
};
2015-08-27 07:44:23 +00:00
2015-08-28 05:23:34 +00:00
2015-09-12 01:21:53 +00:00
// Backpacks
if(typeName (_lootValues select 2) == "ARRAY") then
{
_backpackCount = (_lootValues select 2) select 0;
_backpacks = (_lootValues select 2) select 1;
}
else
{
_backpackCount = _lootValues select 2;
_backpacks = DMS_boxBackpacks;
};
2015-08-27 07:44:23 +00:00
Readme changes, new debug fnc, fixes, tweaks
Created disclaimer for DMS. Now mentioning that HC for DMS isn't that
good.
Some structure stuff in readme (let's see if it works lol)
* **NEW CONFIG VALUE: DMS_Use_Map_Config**
* You can now overwrite "main config values" with map-specific config
values located in the new "map_configs" folder. This should allow you to
use one DMS PBO if you have multiple servers with different maps.
Included examples for Altis, Bornholm, Esseker, and Tavi (Taviana).
* Because of the above implementation, DMS by default will not include
the salt flats blacklist for findSafePos. In addition, it is
preconfigured to the hilly terrains in Esseker and Taviana, as well as
reducing all of the blacklist distances due to the smaller map size in
Esseker.
* Created new function "DMS_fnc_DebugLog". All DMS files (that produced
debug logs) have been changed, including mission files. However,
updating them is not important (and completely pointless if you don't
even use DMS_DEBUG).
* Fixed a few locations where it said "sized" instead of "seized".
Thanks to [icomrade](https://github.com/icomrade) for pointing them out.
* DMS now utilizes the "ARMA_LOG" DLL (if it exists) by infiSTAR to
produce debug logs (if enabled). All debug logs now also include server
uptime (in seconds) and server FPS.
* The FSM no longer produces debug logs.
* AI Locality manager will now run every minute.
* Debug logs for "DMS_fnc_MissionsMonitor" will only output the mission
name and the position, instead of all of the parameters.
* "DMS_fnc_IsNearWater" will now check the provided position itself for
water.
* "DMS_fnc_IsValidPosition" will now do a surfaceNormal check within a 5
meter radius of the provided position as well.
* "_customGearSet" should now actually work for
"DMS_fnc_SpawnAISoldier", and the function title comment has been
updated for the slightly tweaked syntax.
2015-10-10 01:35:07 +00:00
(format["FillCrate :: Filling %4 with %1 guns, %2 items and %3 backpacks",_wepCount,_itemCount,_backpackCount,_crate]) call DMS_fnc_DebugLog;
2015-09-12 01:21:53 +00:00
if ((_wepCount>0) && {count _weps>0}) then
2015-08-28 21:52:56 +00:00
{
2015-09-12 01:21:53 +00:00
// Add weapons + mags
for "_i" from 1 to _wepCount do
2015-08-31 07:52:46 +00:00
{
2015-09-12 01:21:53 +00:00
_weapon = _weps call BIS_fnc_selectRandom;
_ammo = _weapon call DMS_fnc_selectMagazine;
if ((typeName _weapon)=="STRING") then
{
_weapon = [_weapon,1];
};
_crate addWeaponCargoGlobal _weapon;
_crate addItemCargoGlobal [_ammo, (4 + floor(random 3))];
2015-08-31 07:52:46 +00:00
};
2015-08-27 07:44:23 +00:00
};
2015-09-12 01:21:53 +00:00
if ((_itemCount > 0) && {count _items>0}) then
2015-08-28 21:52:56 +00:00
{
2015-09-12 01:21:53 +00:00
// Add items
for "_i" from 1 to _itemCount do
2015-08-31 07:52:46 +00:00
{
2015-09-12 01:21:53 +00:00
_item = _items call BIS_fnc_selectRandom;
if ((typeName _item)=="STRING") then
{
_item = [_item,1];
};
_crate addItemCargoGlobal _item;
2015-08-31 07:52:46 +00:00
};
2015-08-27 07:44:23 +00:00
};
2015-09-12 01:21:53 +00:00
if ((_backpackCount > 0) && {count _backpacks>0}) then
2015-08-28 21:52:56 +00:00
{
2015-09-12 01:21:53 +00:00
// Add backpacks
for "_i" from 1 to _backpackCount do
2015-08-31 07:52:46 +00:00
{
2015-09-12 01:21:53 +00:00
_backpack = _backpacks call BIS_fnc_selectRandom;
if ((typeName _backpack)=="STRING") then
{
_backpack = [_backpack,1];
};
_crate addBackpackCargoGlobal _backpack;
2015-08-31 07:52:46 +00:00
};
2015-08-27 07:44:23 +00:00
};
2015-09-12 01:21:53 +00:00
}
else
{
_crateValues = missionNamespace getVariable [ format ["DMS_CrateCase_%1",_lootValues], [[], [], []] ];
// Weapons
{
if ((typeName _x)=="STRING") then
{
_x = [_x,1];
};
_crate addWeaponCargoGlobal _x;
} forEach (_crateValues select 0);
// Items/Mags
{
if ((typeName _x)=="STRING") then
{
_x = [_x,1];
};
_crate addItemCargoGlobal _x;
} forEach (_crateValues select 1);
// Backpacks
{
if ((typeName _x)=="STRING") then
{
_x = [_x,1];
};
_crate addBackpackCargoGlobal _x;
} forEach (_crateValues select 2);
2015-08-27 07:44:23 +00:00
};
2015-08-31 08:04:07 +00:00
if(DMS_RareLoot && {count DMS_RareLootList>0}) then
2015-08-28 21:52:56 +00:00
{
2015-09-26 00:28:04 +00:00
_rareLootChance = DMS_RareLootChance;
if ((count _this)>2) then
{
_rareLootChance = param [2,DMS_RareLootChance,[0]];
};
2015-08-28 21:52:56 +00:00
// (Maybe) Add rare loot
2015-09-26 00:28:04 +00:00
if(random 100 < _rareLootChance) then
2015-08-28 21:52:56 +00:00
{
2015-08-31 08:04:07 +00:00
_item = DMS_RareLootList call BIS_fnc_selectRandom;
2015-08-31 07:52:46 +00:00
if ((typeName _item)=="STRING") then
{
_item = [_item,1];
};
2015-08-31 20:43:59 +00:00
_crate addItemCargoGlobal _item;
2015-08-27 07:44:23 +00:00
};
2015-08-31 20:43:59 +00:00
};
2015-09-25 06:40:59 +00:00
// In case somebody wants to use fillCrate on a vehicle but also wants to use smoke, don't create smoke/IR strobe unless it's a crate
if (_crate isKindOf "ReammoBox_F") then
2015-09-12 01:21:53 +00:00
{
2015-09-25 06:40:59 +00:00
if(DMS_SpawnBoxSmoke && {sunOrMoon == 1}) then
{
_marker = "SmokeShellPurple" createVehicle getPosATL _crate;
_marker setPosATL (getPosATL _crate);
_marker attachTo [_crate,[0,0,0]];
};
2015-08-31 20:43:59 +00:00
2015-09-25 06:40:59 +00:00
if (DMS_SpawnBoxIRGrenade && {sunOrMoon != 1}) then
{
_marker = "B_IRStrobe" createVehicle getPosATL _crate;
_marker setPosATL (getPosATL _crate);
_marker attachTo [_crate, [0,0,0.5]];
};
2015-08-27 07:44:23 +00:00
};