Bunch of stuff...

* NEW CONFIG VALUES: ```DMS_GodmodeCrates``` and
```DMS_CrateCase_Sniper```. DMS_GodmodeCrates is pretty self-explanatory
:P
* NEW FEATURE FOR "DMS_fnc_FillCrate": You can now define "crate cases"
in the config (such as "DMS_CrateCase_Sniper"). Passing the "crate case"
name (such as "Sniper") will make the crate spawn with the exact gear
defined in the config. Refer to the testmission.sqf (line 80) and
"DMS_CrateCase_Sniper" config for an example.
* Spawned vehicles will now be LOCKED and INVINCIBLE until the mission
is completed.
* Spawned vehicles spawn with 100% fuel.
* "Fixed" some cases where killing from a mounted gun would reset your
money/respect (maybe).
* Fixed some spelling errors and incorrect names in some of the mission
messages/markers.
* Fixed DMS_fnc_FindSafePos for Bornholm. If you have any issues with
custom maps, please let us know.
* Fixed backpack spawning on the ground behind an AI unit that was
supposed to get a launcher.
This commit is contained in:
eraser1 2015-09-11 20:21:53 -05:00
parent 21878d400c
commit 2650157577
13 changed files with 227 additions and 107 deletions

View File

@ -417,6 +417,40 @@ DMS_DEBUG = false;
/* Loot Settings */
DMS_GodmodeCrates = true; // Whether or not crates will have godmode after being filled with loot.
DMS_CrateCase_Sniper = [ // If you pass "Sniper" in _lootValues, then it will spawn these weapons/items/backpacks
[
["Rangefinder",1],
["srifle_GM6_F",1],
["srifle_LRR_F",1],
["srifle_EBR_DMS_pointer_snds_F",1],
["hgun_Pistol_heavy_01_MRD_F",1],
["hgun_PDW2000_Holo_snds_F",1]
],
[
["ItemGPS",1],
["U_B_FullGhillie_ard",1],
["U_I_FullGhillie_lsh",1],
["U_O_FullGhillie_sard",1],
["U_O_GhillieSuit",1],
["V_PlateCarrierGL_blk",1],
["V_HarnessO_brn",1],
["Exile_Item_InstaDoc",3],
["Exile_Item_Surstromming_Cooked",5],
["Exile_Item_PlasticBottleFreshWater",5],
["optic_LRPS",1],
["muzzle_snds_acp",1],
["5Rnd_127x108_APDS_Mag",3],
["7Rnd_408_Mag",3],
["20Rnd_762x51_Mag",5],
["11Rnd_45ACP_Mag",3],
["30Rnd_9x21_Mag",3]
],
[
["B_Carryall_cbr",1],
["B_Kitbag_mcamo",1]
]
];
DMS_BoxWeapons = [ // List of weapons that can spawn in a crate
"Exile_Melee_Axe",
"arifle_Katiba_GL_F",

View File

@ -75,7 +75,7 @@ _msgWIN = format["<t color='#0080ff' size='1.25'>Humantarian Supplies! </t><br/>
_msgLOSE = format["<t color='#FF0000' size='1.25'>Humantarian Supplies! </t><br/> The bandits have taken the humanitarian supplies and escaped!"];
// Define mission name (for map marker and logging)
_missionName = "Humantarian Supplies";
_missionName = "Humanitarian Supplies";
// Create Markers
_markers =

View File

@ -64,13 +64,13 @@ _missionObjs =
];
// Define Mission Start message
_msgStart = format["<t color='#FFFF00' size='1.25'>Car Dealer Robbery! </t><br/> A squad of proffesional Navy Seals team is performing gorilla warfare in convict land, deal with them!"];
_msgStart = format["<t color='#FFFF00' size='1.25'>Navy Seals! </t><br/> A squad of professional Navy Seals team is performing gorilla warfare in convict land, deal with them!"];
// Define Mission Win message
_msgWIN = format["<t color='#0080ff' size='1.25'>Car Dealer Robbery! </t><br/> Convicts have successfully taken care of the Navy Seals, you must be the top of your class!"];
_msgWIN = format["<t color='#0080ff' size='1.25'>Navy Seals! </t><br/> Convicts have successfully taken care of the Navy Seals, you must be the top of your class!"];
// Define Mission Lose message
_msgLOSE = format["<t color='#FF0000' size='1.25'>Car Dealer Robbery! </t><br/> The Navy Seals have escaped and are now planning their next raid!"];
_msgLOSE = format["<t color='#FF0000' size='1.25'>Navy Seals! </t><br/> The Navy Seals have escaped and are now planning their next raid!"];
// Define mission name (for map marker and logging)
_missionName = "Rogue Navy Seals";

View File

@ -33,11 +33,12 @@ _group =
_side // "bandit","hero", etc.
] call DMS_fnc_SpawnAIGroup;
_dir = random 180;
_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]
[_pos,5+random 5,_dir] call DMS_fnc_SelectOffsetPos,
[_pos,5+random 5,_dir+180] call DMS_fnc_SelectOffsetPos
],
_group,
"assault",
@ -48,7 +49,13 @@ _staticGuns =
// Create Crate
_crate = ["Box_NATO_Wps_F",_pos] call DMS_fnc_SpawnCrate;
_vehicle = ["Exile_Car_Offroad_Armed_Guerilla01",_pos] call DMS_fnc_SpawnNonPersistentVehicle;
// Spawn vehicle
_vehicle = ["Exile_Car_Offroad_Armed_Guerilla01",[_pos,3+random 10,_dir+90] call DMS_fnc_SelectOffsetPos] call DMS_fnc_SpawnNonPersistentVehicle;
//trololol
_crate setObjectTextureGlobal [0,"#(rgb,8,8,3)color(1,0,0.1,1)"];
_crate setObjectTextureGlobal [1,"#(rgb,8,8,3)color(1,0,0.1,1)"];
// Set crate loot values
_crate_loot_values =
@ -70,7 +77,7 @@ _missionObjs =
[
_staticGuns, // We only spawn the static guns
[_vehicle],
[[_crate,_crate_loot_values]]
[[_crate,"Sniper"]]
];
// Define Mission Start message

View File

@ -6,29 +6,33 @@
Usage:
[
_crate,
_crate, // 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
] 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:
[
_weapons,
_items,
_backpacks
]
] call DMS_fnc_FillCrate;
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
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.
*/
if (isNil "_this") exitWith
{
diag_log "DMS ERROR :: Calling DMS_FillCrate with nil argument!";
};
private ["_crate","_lootValues","_wepCount","_weps","_itemCount","_items","_backpackCount","_backpacks","_weapon","_ammo","_item","_backpack","_crateValues"];
private ["_crate","_lootValues","_wepCount","_weps","_itemCount","_items","_backpackCount","_backpacks","_weapon","_ammo","_item","_backpack"];
_OK = params
[
["_crate",objNull,[objNull]],
["_lootValues",[0,0,0],[[]],[3]]
["_lootValues","",[0,"",[]],[3]]
];
if (!_OK || {isNull _crate}) exitWith
@ -36,95 +40,135 @@ if (!_OK || {isNull _crate}) exitWith
diag_log format ["DMS ERROR :: Calling DMS_FillCrate with invalid parameters: %1",_this];
};
// Weapons
if(typeName (_lootValues select 0) == "ARRAY") then
if !(DMS_GodmodeCrates) then
{
_wepCount = (_lootValues select 0) select 0;
_weps = (_lootValues select 0) select 1;
_crate allowDamage true;
};
if ((typeName _lootValues)=="ARRAY") then
{
// 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;
};
// 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;
};
// 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;
};
if(DMS_DEBUG) then
{
diag_log format["DMS_DEBUG FillCrate :: Filling %4 with %1 guns, %2 items and %3 backpacks",_wepCount,_itemCount,_backpackCount,_crate];
};
if ((_wepCount>0) && {count _weps>0}) then
{
// Add weapons + mags
for "_i" from 1 to _wepCount do
{
_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))];
};
};
if ((_itemCount > 0) && {count _items>0}) then
{
// Add items
for "_i" from 1 to _itemCount do
{
_item = _items call BIS_fnc_selectRandom;
if ((typeName _item)=="STRING") then
{
_item = [_item,1];
};
_crate addItemCargoGlobal _item;
};
};
if ((_backpackCount > 0) && {count _backpacks>0}) then
{
// Add backpacks
for "_i" from 1 to _backpackCount do
{
_backpack = _backpacks call BIS_fnc_selectRandom;
if ((typeName _backpack)=="STRING") then
{
_backpack = [_backpack,1];
};
_crate addBackpackCargoGlobal _backpack;
};
};
}
else
{
_wepCount = _lootValues select 0;
_weps = DMS_boxWeapons;
};
_crateValues = missionNamespace getVariable [ format ["DMS_CrateCase_%1",_lootValues], [[], [], []] ];
// 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;
};
// 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;
};
if(DMS_DEBUG) then
{
diag_log format["DMS_DEBUG FillCrate :: Filling %4 with %1 guns, %2 items and %3 backpacks",_wepCount,_itemCount,_backpackCount,_crate];
};
if ((_wepCount>0) && {count _weps>0}) then
{
// Add weapons + mags
for "_i" from 1 to _wepCount do
// Weapons
{
_weapon = _weps call BIS_fnc_selectRandom;
_ammo = _weapon call DMS_fnc_selectMagazine;
if ((typeName _weapon)=="STRING") then
if ((typeName _x)=="STRING") then
{
_weapon = [_weapon,1];
_x = [_x,1];
};
_crate addWeaponCargoGlobal _weapon;
_crate addItemCargoGlobal [_ammo, (4 + floor(random 3))];
};
};
_crate addWeaponCargoGlobal _x;
} forEach (_crateValues select 0);
if ((_itemCount > 0) && {count _items>0}) then
{
// Add items
for "_i" from 1 to _itemCount do
// Items/Mags
{
_item = _items call BIS_fnc_selectRandom;
if ((typeName _item)=="STRING") then
if ((typeName _x)=="STRING") then
{
_item = [_item,1];
_x = [_x,1];
};
_crate addItemCargoGlobal _item;
};
};
_crate addItemCargoGlobal _x;
} forEach (_crateValues select 1);
if ((_backpackCount > 0) && {count _backpacks>0}) then
{
// Add backpacks
for "_i" from 1 to _backpackCount do
// Backpacks
{
_backpack = _backpacks call BIS_fnc_selectRandom;
if ((typeName _backpack)=="STRING") then
if ((typeName _x)=="STRING") then
{
_backpack = [_backpack,1];
_x = [_x,1];
};
_crate addBackpackCargoGlobal _backpack;
};
_crate addBackpackCargoGlobal _x;
} forEach (_crateValues select 2);
};
@ -143,13 +187,15 @@ if(DMS_RareLoot && {count DMS_RareLootList>0}) then
};
if(DMS_SpawnBoxSmoke && {sunOrMoon == 1}) then {
if(DMS_SpawnBoxSmoke && {sunOrMoon == 1}) then
{
_marker = "SmokeShellPurple" createVehicle getPosATL _crate;
_marker setPosATL (getPosATL _crate);
_marker attachTo [_crate,[0,0,0]];
};
if (DMS_SpawnBoxIRGrenade && {sunOrMoon != 1}) then {
if (DMS_SpawnBoxIRGrenade && {sunOrMoon != 1}) then
{
_marker = "B_IRStrobe" createVehicle getPosATL _crate;
_marker setPosATL (getPosATL _crate);
_marker attachTo [_crate, [0,0,0.5]];

View File

@ -18,46 +18,52 @@ params
["_maxTerrainGradient",10,[0]]
];
_safePosParams =
[
[[],0,-1,_nearestObjectMinDistance,0,_maxTerrainGradient,0,DMS_findSafePosBlacklist],
[[16000,16000],0,16000,_nearestObjectMinDistance,0,_maxTerrainGradient,0,DMS_findSafePosBlacklist] //[16000,16000] w/ radius of 16000 works well for Altis
] select (worldName=="Altis");
// Some custom maps don't have the proper safePos config entries.
// If you are using one and you have an issue with mission spawns, please create an issue on GitHub or post a comment in the DMS thread.
switch (toLower worldName) do
{
case "altis" : { _safePosParams = [[16000,16000],0,16000,_nearestObjectMinDistance,0,_maxTerrainGradient,0,DMS_findSafePosBlacklist]; }; //[16000,16000] w/ radius of 16000 works well for Altis
case "bornholm" : { _safePosParams = [[11264,11264],0,12000,_nearestObjectMinDistance,0,_maxTerrainGradient,0,DMS_findSafePosBlacklist]; }; // Thanks to thirdhero for testing this info
default { _safePosParams = [[],0,-1,_nearestObjectMinDistance,0,_maxTerrainGradient,0,DMS_findSafePosBlacklist]; };
};
_validspot = false;
_i = 0;
while{!_validspot} do {
while{!_validspot} do
{
_pos = _safePosParams call BIS_fnc_findSafePos;
_i = _i+1;
try
{
// Check for nearby water
if ([_pos,DMS_WaterNearBlacklist] call DMS_fnc_isNearWater) exitWith
if ([_pos,DMS_WaterNearBlacklist] call DMS_fnc_isNearWater) then
{
throw ("water");
};
// Check for nearby players
if ([_pos,DMS_PlayerNearBlacklist] call DMS_fnc_IsPlayerNearby) exitWith
if ([_pos,DMS_PlayerNearBlacklist] call DMS_fnc_IsPlayerNearby) then
{
throw ("players");
};
{
// Check for nearby spawn points
if (((markertype _x) == "ExileSpawnZone") && {((getMarkerPos _x) distance2D _pos)<=DMS_SpawnZoneNearBlacklist}) exitWith
if (((markertype _x) == "ExileSpawnZone") && {((getMarkerPos _x) distance2D _pos)<=DMS_SpawnZoneNearBlacklist}) then
{
throw ("a spawn zone");
};
// Check for nearby trader zones
if (((markertype _x) == "ExileTraderZone") && {((getMarkerPos _x) distance2D _pos)<=DMS_TraderZoneNearBlacklist}) exitWith
if (((markertype _x) == "ExileTraderZone") && {((getMarkerPos _x) distance2D _pos)<=DMS_TraderZoneNearBlacklist}) then
{
throw ("a trader zone");
};
// Check for nearby missions
if (((_x find "DMS_MissionMarkerDot")>-1) && {((getMarkerPos _x) distance2D _pos)<=DMS_MissionNearBlacklist}) exitWith
if (((_x find "DMS_MissionMarkerDot")>-1) && {((getMarkerPos _x) distance2D _pos)<=DMS_MissionNearBlacklist}) then
{
throw ("another mission");
};
@ -68,7 +74,8 @@ while{!_validspot} do {
}
catch
{
if (DMS_DEBUG) then {
if (DMS_DEBUG) then
{
diag_log format ["DMS_DEBUG findSafePos :: Exception in attempt %1 | Position %2 is too close to %3!",_i,_pos,_exception];
};
};

View File

@ -63,6 +63,11 @@ private ["_pos", "_success", "_timeStarted", "_timeUntilFail", "_units", "_build
_arr = DMS_Mission_Arr deleteAt _forEachIndex;
{
_x lock 0;
_x allowDamage true;
} forEach _vehs;
{
_x call DMS_fnc_FillCrate;
} forEach _crate_info_array;

View File

@ -122,7 +122,7 @@ if (isPlayer _player) then
};};
if ((!isNull _playerObj) && {((getPlayerUID _playerObj) != "")}) then
if ((!isNull _playerObj) && {((getPlayerUID _playerObj) != "") && {_playerObj isKindOf "Exile_Unit_Player"}}) then
{
_moneyGain = missionNamespace getVariable [format ["DMS_%1_%2_MoneyGain",_side,_type],0];
_repGain = missionNamespace getVariable [format ["DMS_%1_%2_RepGain",_side,_type],0];

View File

@ -87,6 +87,7 @@ if ((!isNil "_launcher") || {DMS_ai_use_launchers && {(random 100) <= DMS_ai_use
_launcher = ((missionNamespace getVariable [format ["DMS_AI_wep_launchers_%1",_launcher],["launch_NLAW_F"]]) call BIS_fnc_selectRandom);
removeBackpack _unit;
_unit addBackpack "B_Carryall_mcamo";
[_unit, _launcher, DMS_AI_launcher_ammo_count] call BIS_fnc_addWeapon;

View File

@ -26,6 +26,8 @@ if (!_OK) then
_crate = createVehicle [_crateClassName,_pos,[], 0, "CAN_COLLIDE"];
_crate allowDamage false;
clearWeaponCargoGlobal _crate;
clearItemCargoGlobal _crate;
clearMagazineCargoGlobal _crate;

View File

@ -41,8 +41,10 @@ while{count _vehpos < 1} do
_maxDistance = (_maxDistance + 15);
};
_vehObj = ObjNull;
_vehObj = [_vehicleClass, _vehpos, (random 360), true] call ExileServer_object_vehicle_createNonPersistentVehicle;
_vehObj allowDamage false;
_vehObj setFuel 1;
_vehObj lock 2;
if (DMS_DEBUG) then
{

Binary file not shown.

View File

@ -78,6 +78,17 @@ if (!hasInterface && !isServer) then
## Changelog:
#### September 10, 2015 (8:30 PM CST-America):
* NEW CONFIG VALUES: ```DMS_GodmodeCrates``` and ```DMS_CrateCase_Sniper```. DMS_GodmodeCrates is pretty self-explanatory :P
* NEW FEATURE FOR "DMS_fnc_FillCrate": You can now define "crate cases" in the config (such as "DMS_CrateCase_Sniper"). Passing the "crate case" name (such as "Sniper") will make the crate spawn with the exact gear defined in the config. Refer to the testmission.sqf (line 80) and "DMS_CrateCase_Sniper" config for an example.
* Spawned vehicles will now be LOCKED and INVINCIBLE until the mission is completed.
* Spawned vehicles spawn with 100% fuel.
* "Fixed" some cases where killing from a mounted gun would reset your money/respect (maybe).
* Fixed some spelling errors and incorrect names in some of the mission messages/markers.
* Fixed DMS_fnc_FindSafePos for Bornholm. If you have any issues with custom maps, please let us know.
* Fixed backpack spawning on the ground behind an AI unit that was supposed to get a launcher.
#### September 10, 2015 (6:00 PM CST-America):
* NEW CONFIG VALUES: ```DMS_MarkerPosRandomization```, ```DMS_MarkerPosRandomRadius```, and ```DMS_RandomMarkerBrush```
* With the above configs, you can randomize the marker positions in a random position around the actual mission center.
@ -87,6 +98,7 @@ if (!hasInterface && !isServer) then
* Adjusted a couple functions to use them.
* Fixed ```DMS_fnc_IsNearWater```.
#### 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```.
@ -97,19 +109,23 @@ if (!hasInterface && !isServer) then
* NOTE: If you use custom ```DMS_fnc_SpawnAISoldier``` calls, you will have to update your calling parameters! Make sure you add "Soldier" at the end of the array, or before ```_customGearSet``` if you're using it!
* Added ```_launcher``` option for ```_customGearSet``` in ```DMS_fnc_SpawnAISoldier```. NOTE: This changes the order of the gearset parameters for the AI. ```_launcher``` is between ```_items``` and ```_helmet```! Use empty string ```""``` if you don't want any launcher on the AI unit.
#### 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.
* Fixed giving poptabs/respect for killing AI from vehicles. Passengers and mounted gunners should properly receive poptabs/respect when they kill AI.
* Launchers should now be reliably removed from AI bodies that have them.
#### September 7, 2015 (7:00 PM CST-America):
* AI bodies should now be cleared if configured to do so with "DMS_clear_AI_body" and "DMS_clear_AI_body_chance".
#### September 5, 2015 (1:00 AM CST-America):
* Created new function "DMS_fnc_IsPlayerNearby" to replace "ExileServer_util_position_isPlayerNearby".
* Fix IR Strobes spawning inside the crate and not appearing.
#### September 4, 2015 (11:20 PM CST-America):
* Improved crate handling by DMS. You can now spawn multiple crates with different loot, or simply no crates at all. (REQUIRES FILE CHANGES FOR EACH MISSION)
* Accounted for case sensitivity in switch-do statements for SpawnAISolder.