Added 3 new missions.
Added ownership transfer of AI.
This commit is contained in:
Defent 2015-09-01 18:59:35 +02:00
parent 9af7f3f0ea
commit 8483ca60eb
8 changed files with 502 additions and 5 deletions

View File

@ -58,9 +58,12 @@ DMS_DEBUG = false;
DMS_MissionTypes = [ // List of missions with spawn chances. If they add up to 100%, they represent the percentage chance each one will spawn DMS_MissionTypes = [ // List of missions with spawn chances. If they add up to 100%, they represent the percentage chance each one will spawn
["mission1",25], ["mission1",25],
["mission2",50], ["mission2",25],
["mission3",15], ["mission3",15],
["mission4",10] ["mission4",10],
["bauhaus",45],
["lost_battalion",30],
["walmart",20]
]; ];
DMS_findSafePosBlacklist = [ // For BIS_fnc_findSafePos position blacklist info refer to: https://community.bistudio.com/wiki/BIS_fnc_findSafePos DMS_findSafePosBlacklist = [ // For BIS_fnc_findSafePos position blacklist info refer to: https://community.bistudio.com/wiki/BIS_fnc_findSafePos

View File

@ -33,6 +33,7 @@ DMS_AddMissionToMonitor = compileFinal preprocessFileLineNumbers "\x\addons\d
DMS_CreateMarker = compileFinal preprocessFileLineNumbers "\x\addons\dms\scripts\CreateMarker.sqf"; DMS_CreateMarker = compileFinal preprocessFileLineNumbers "\x\addons\dms\scripts\CreateMarker.sqf";
DMS_FindSuppressor = compileFinal preprocessFileLineNumbers "\x\addons\dms\scripts\FindSuppressor.sqf"; DMS_FindSuppressor = compileFinal preprocessFileLineNumbers "\x\addons\dms\scripts\FindSuppressor.sqf";
DMS_SpawnCrate = compileFinal preprocessFileLineNumbers "\x\addons\dms\scripts\SpawnCrate.sqf"; DMS_SpawnCrate = compileFinal preprocessFileLineNumbers "\x\addons\dms\scripts\SpawnCrate.sqf";
DMS_SetAILocality = compileFinal preprocessFileLineNumbers "\x\addons\dms\scripts\SetAILocality.sqf";
//Load config //Load config
call compileFinal preprocessFileLineNumbers "\x\addons\dms\config.sqf"; call compileFinal preprocessFileLineNumbers "\x\addons\dms\config.sqf";

View File

@ -0,0 +1,151 @@
/*
Sample mission
Created by Defent and eraser1
Called from DMS_selectMission
*/
private ["_num", "_side", "_pos", "_difficulty", "_AICount", "_group", "_crate", "_crate_loot_values", "_msgStart", "_msgWIN", "_msgLOSE", "_missionName", "_missionAIUnits", "_missionObjs", "_markers", "_time", "_added","_wreck"];
// For logging purposes
_num = DMS_MissionCount;
// Set mission side (only "bandit" is supported for now)
_side = "bandit";
// find position
_pos = [10,100] call DMS_findSafePos;
// Set general mission difficulty
_difficulty = "difficult";
// Create AI
// TODO: Spawn AI only when players are nearby
_AICount = 6 + (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_SpawnAIGroup;
// Create Crate
_crate = ["Box_NATO_Wps_F",_pos] call DMS_SpawnCrate;
_wreck = createVehicle ["Land_Wreck_Ural_F",[(_pos select 0) - 10, (_pos select 1),-0.2],[], 0, "CAN_COLLIDE"];
// Set crate loot values
_crate_loot_values =
[
2, // Weapons
15, // Items
2 // 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 =
[
[], // No spawned buildings
[_crate,_wreck],
_crate_loot_values
];
// Define Mission Start message
_msgStart = format["A Bauhaus truck has crashed and lost all its building supplies, get there quickly!"];
// Define Mission Win message
_msgWIN = format["Convicts have successfully claimed the crashed Buahaus truck %1!"];
// Define Mission Lose message
_msgLOSE = format["The Bauhause truck has been repaired and escaped!"];
// Define mission name (for map marker and logging)
_missionName = "Bauhaus Truck";
// Create Markers
_markers =
[
_pos,
_missionName,
_difficulty
] call DMS_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_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;
false;
} count _missionAIUnits;
_cleanup pushBack ((_missionObjs select 0)+(_missionObjs select 1));
_cleanup call DMS_CleanUp;
// Delete the markers directly
{deleteMarker _x;false;} count _markers;
// Reset the mission count
DMS_MissionCount = DMS_MissionCount - 1;
};
// Notify players
_msgStart call DMS_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

@ -0,0 +1,151 @@
/*
Sample mission
Created by Defent and eraser1
Called from DMS_selectMission
*/
private ["_num", "_side", "_pos", "_difficulty", "_AICount", "_group", "_crate", "_crate2", "_crate_loot_values", "_msgStart", "_msgWIN", "_msgLOSE", "_missionName", "_missionAIUnits", "_missionObjs", "_markers", "_time", "_added"];
// For logging purposes
_num = DMS_MissionCount;
// Set mission side (only "bandit" is supported for now)
_side = "bandit";
// find position
_pos = [10,100] call DMS_findSafePos;
// Set general mission difficulty
_difficulty = "hardcore";
// Create AI
// TODO: Spawn AI only when players are nearby
_AICount = 6 + (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_SpawnAIGroup;
// Create Crate
_crate = ["Box_NATO_Wps_F",_pos] call DMS_SpawnCrate;
uiSleep 3;
_crate2 = ["Box_NATO_Wps_F",_pos] call DMS_SpawnCrate;
// Set crate loot values
_crate_loot_values =
[
7, // Weapons
5, // Items
5 // 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 =
[
[], // No spawned buildings
[_crate,_crate2],
_crate_loot_values
];
// Define Mission Start message
_msgStart = format["A battalion of soldiers have gotten lost in convict land! Eliminate them!"];
// Define Mission Win message
_msgWIN = format["Convicts have successfully eliminated the lost battalion!"];
// Define Mission Lose message
_msgLOSE = format["Whittlesey escaped with his Lost Battalion!"];
// Define mission name (for map marker and logging)
_missionName = "Lost Battalion";
// Create Markers
_markers =
[
_pos,
_missionName,
_difficulty
] call DMS_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_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;
false;
} count _missionAIUnits;
_cleanup pushBack ((_missionObjs select 0)+(_missionObjs select 1));
_cleanup call DMS_CleanUp;
// Delete the markers directly
{deleteMarker _x;false;} count _markers;
// Reset the mission count
DMS_MissionCount = DMS_MissionCount - 1;
};
// Notify players
_msgStart call DMS_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

@ -0,0 +1,154 @@
/*
Sample mission
Created by Defent and eraser1
Called from DMS_selectMission
*/
private ["_num", "_side", "_pos", "_difficulty", "_AICount", "_group", "_crate", "_crate_loot_values", "_msgStart", "_msgWIN", "_msgLOSE", "_missionName", "_missionAIUnits", "_missionObjs", "_markers", "_time", "_added","_wreck1","_wreck2","_wreck3","_wreck4"];
// For logging purposes
_num = DMS_MissionCount;
// Set mission side (only "bandit" is supported for now)
_side = "bandit";
// find position
_pos = [10,100] call DMS_findSafePos;
// Set general mission difficulty
_difficulty = "moderate";
// Create AI
// TODO: Spawn AI only when players are nearby
_AICount = 6 + (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_SpawnAIGroup;
// Create Crate
_crate = ["Box_NATO_Wps_F",_pos] call DMS_SpawnCrate;
_wreck1 = createVehicle ["Land_i_Shop_01_V1_F",[(_pos select 0) - 10, (_pos select 1),-0.1],[], 0, "CAN_COLLIDE"];
_wreck2 = createVehicle ["Land_Sacks_goods_F",[(_pos select 0) - 2, (_pos select 1),-0.8],[], 0, "CAN_COLLIDE"];
_wreck3 = createVehicle ["Land_StallWater_F",[(_pos select 0) - 5, (_pos select 1),-0.8],[], 0, "CAN_COLLIDE"];
_wreck4 = createVehicle ["Land_WoodenCart_F",[(_pos select 0) - 16, (_pos select 1),-0.5],[], 0, "CAN_COLLIDE"];
_wreck4 = createVehicle ["Land_CratesWooden_F",[(_pos select 0) - 16, (_pos select 1),-0.3],[], 0, "CAN_COLLIDE"];
// Set crate loot values
_crate_loot_values =
[
2, // Weapons
15, // Items
2 // 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 =
[
[_wreck1,_wreck2,_wreck3,_wreck4], // No spawned buildings
[_crate],
_crate_loot_values
];
// Define Mission Start message
_msgStart = format["A local Walmart shop is being raided, stop the raiders and take the loot!"];
// Define Mission Win message
_msgWIN = format["Convicts have done a good deed and stopped the raiders!"];
// Define Mission Lose message
_msgLOSE = format["The raiders has looted everything from Walmart and escaped!"];
// Define mission name (for map marker and logging)
_missionName = "Walmart Riot";
// Create Markers
_markers =
[
_pos,
_missionName,
_difficulty
] call DMS_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_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;
false;
} count _missionAIUnits;
_cleanup pushBack ((_missionObjs select 0)+(_missionObjs select 1));
_cleanup call DMS_CleanUp;
// Delete the markers directly
{deleteMarker _x;false;} count _markers;
// Reset the mission count
DMS_MissionCount = DMS_MissionCount - 1;
};
// Notify players
_msgStart call DMS_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

@ -0,0 +1,28 @@
/*
Makes a random player within 3 KM of the AI the owner.
Offloading AI can increase server performance.
Could however have negative effects if target player has a potato PC.
How To Use:
[_pos, _group] call DMS_SetAILocality;
Posistion of the player and the group that the AIs are in.
*/
private ["_group","_position","_exit","_randomPlayer"];
_group = _this select 0;
_position = _this select 1;
_exit = false;
while {!_exit} do
{
_randomPlayer = call ExileServer_system_session_getRandomPlayer;
if((_randomPlayer distance2D _position) < 3000)then
{
_exit = true;
};
};
ExileServerOwnershipSwapQueue pushBack [_group,_randomPlayer];
true

View File

@ -80,12 +80,16 @@ for "_i" from 1 to _count do {
// An AI will definitely spawn with a launcher if you define type // An AI will definitely spawn with a launcher if you define type
if ((!isNil "_launcher") || {DMS_ai_use_launchers && {(random 100) <= DMS_ai_use_launchers_chance}}) then if ((!isNil "_launcher") || {DMS_ai_use_launchers && {(random 100) <= DMS_ai_use_launchers_chance}}) then
{ {
/*
if (!isNil "_launcher") then if (!isNil "_launcher") then
{ {
_launcher = "AT"; _launcher = "AT";
}; };
_launcher = ((missionNamespace getVariable [format ["DMS_AI_wep_launchers_%1",_launcher],["launch_NLAW_F"]]) call BIS_fnc_selectRandom); _launcher = ((missionNamespace getVariable [format ["DMS_AI_wep_launchers_%1",_launcher],["launch_NLAW_F"]]) call BIS_fnc_selectRandom);
*/
_launcher = DMS_AI_wep_launchers_AT call BIS_fnc_selectRandom;
_unit addBackpack "B_Carryall_mcamo"; _unit addBackpack "B_Carryall_mcamo";
@ -111,11 +115,16 @@ if(_pos_z == 0) then
if (DMS_ai_offload_to_client) then if (DMS_ai_offload_to_client) then
{ {
/*
_client = (allPlayers call BIS_fnc_selectRandom); _client = (allPlayers call BIS_fnc_selectRandom);
ExileServerOwnershipSwapQueue pushBack [_group,_client]; ExileServerOwnershipSwapQueue pushBack [_group,_client];
*/
[_group,_pos] call DMS_SetAILocality;
if(DMS_DEBUG) then if(DMS_DEBUG) then
{ {
diag_log format["DMS_DEBUG SpawnAIGroup :: Swapping group ownership of %1 to %2",_group,_client]; diag_log format["DMS_DEBUG SpawnAIGroup :: Swapping group ownership of %1 to clients.",_group];
}; };
}; };

Binary file not shown.