We got some phone calls from worried civilians about gunshots nearby. We know that there's a hunting zone nearby, but they say its more spraying bullets all over than a single hunting shots.
Just to be sure, we gear up and go to the Hunters camp and see if something is happening.
"],
// "+ clink("Mossad Spy trawler", "exfil")+" denotes hyperlink. Latter "", aka "exfil" indicates marker name of same name.
// ^ Careful with "], in the end of section.
/////////////////////////////////////
/////////// *** Mission ***//////////
["Location Of Teams","
Team will start "+ clink("here", "here")+".
"],
["Important Notes","
You got mine detector. Listen..
Roles:
Breacher can shoot doors to open them.
Explosive Spec can place breaching charges (action menu) and defuse bombs and mines (defuse kit, ACE interaction).
Engineer can mirror under door (menu option) and pick locks if needed (menu option - first check lock, then pick it if its locked). Can also defuse bombs.
If engineer is down, Commander and Explosive spec can take his toolkit, to allow mirror under door again if needed. Place toolkit on ground, then pick it up.
"],
////////////////////////////////////////////////
/////////// *** Command and Signal ***////////
// If you wish to delete one of these sections, make sure you delete it all so you won't leave orphan ] or ,
////////////////////////////////////////////////
/////////// *** Notes ***////////
["Technical notes:","
Three Zeus slot is available.
"],
/// **** Credits ***
["Credits","
Mission by Benchmark
Thanks to the CiA lads who always there to help when you're lost.
Mission uses FHQ Task tracker.
Thanks to Wogz1987 and his awesome MMF FrameWork.
Roque_THE_GAMER for creating and giving permmision to use his S.W.A.T scripts.
"]] call FHQ_fnc_ttaddBriefing;
/*** Tasking ***
This section has the start tasks.
Again, extra ,"} etc is biggest error here.
title of the task, like "taskHVT" is important, as it will be referred later.
Last line is particularly important and troublesome.
"Head hunting" is how task is visible to player
"Eliminate" is short description
getmarkerpos "base", indicates marker pointing to task location. I don't usually use these myself.
"assigned" means it shows active to player.
"kill" indicates symbol. Use link below to check specific symbols.
"kill", "destroy", "exit", "scout", "move", "defend", "interact", are most common.
https://community.bistudio.com/wiki/Arma_3_Tasks_Overhaul
One task, taskIntel, provides named OBJECT. It can be any object, or even unit, but it must be named accordingly in editor.
In this case laptop_1 refers to editor placed object with same name.
*/
[{true},["taskcheck","
Check Hunters camp for gun shots reports.
","Check Hunters Camp","","check"]] call FHQ_fnc_ttaddTasks;
// At simplest, this will just do...
// Again if you wish to delete task, make sure you delete entire section
// This is with a parent task..if it looks complex, don't worry about it.
// This is for Zeus only, and visible only if Zeus is slotted.
/***
This part defines potential mission outcomes.
Class names, like EndComplete are referred when ending mission.
["Lose"] call BIS_fnc_endMissionServer;
["EndComplete"] call BIS_fnc_endMissionServer; and so on
picture indicates marker name
last example gives custom colour.
file: debriefing.hpp
*/
class EndComplete
{
title = "Mission Completed";
subtitle = "Well done!";
description = "Success";
};
class Lose
{
title = "Partial Success";
subtitle = "Bomb exploded";
description = "Try better next time";
};
/*
Errors in this file usually makes Arma crash
This basically sets up various mission attributes.
Many of these can also be defined in Eden editor.
Link below gives further information, but unless you know what you are doing leave this as it is.
https://community.bistudio.com/wiki/Description.ext
file: description.ext
*/
respawn = 4;
respawnDelay = 45;
respawnOnStart = 0;
author="Benchmark";
OnLoadName = "Night Of Horror";
OnLoadMission = "Cult revenge";
loadscreen = "stt.jpg";
enableDebugConsole = 1;
class Header
{
gameType = Coop;
minPlayers = 1;
maxPlayers = 20;
};
class CfgFunctions
{
#include "functions\fhq_tasktracker.hpp"
#include "MMF_Core\Defines\Functions.h"
class SAF {
#define SAF_FNCS
#include "sushi_scripts\core\init.cpp"
#include "sushi_scripts\breach\init.cpp"
#undef SAF_FNCS
};
class Stag
{
/*
class serverSide
{
class barrage {file = "functions\barrage_generic.sqf";};
class explosion {file = "functions\fnc_explosion.sqf";};
};
*/
class missionVariables
{class gV {file = "missionVariables.sqf";preInit = 1;};};
};
};
class Params {
#include "parameters.hpp"
};
class CfgSounds
{
#include "sounds.hpp"
};
class CfgTaskEnhancements
{
enable = 1; //0: disable new task features (default), 1: enable new task features & add new task markers and task widgets into the map
3d = 1; //0: do not use new 3D markers (default), 1: replace task waypoints with new 3D markers
3dDrawDist = 2000; //3d marker draw distance (default: 2000)
share = 0; //0: do not count assigned players (default), 1: count how many players have the task assigned
propagate = 1; //0: do not propagate (default), 1: propagate shared tasks to subordinates
};
class CfgDebriefing
{
#include "debriefing.hpp"
};
#define SAF_DEF
#include "sushi_scripts\core\init.cpp"
#include "sushi_scripts\breach\init.cpp"
#undef SAF_DEF
/* FHQ Task Tracker
* Copyright 2016 by Thomas Frieden (Varanon). All rights reserved. Use of this software
* is at your own risk. The copyright holder is in no way responsible for damages
* resulting from the use of this software.
* Distribution of the software is only allowed within a mission. In addition, no
* changes are allowed to the software without the permission of the authors.
* Distribution as a standalone package is prohibited.
* Attribution (getting a mention in the credits section of your mission) is appreciated,
* but not a requirement
*/
#define INTERNAL_FUNCTION(x) \
class x \
{ \
description = "Internal Function"; \
};
#define EXPORTED_FUNCTION(x,y) \
class x \
{ \
description = y; \
};
class FHQ {
class TaskTrackerInternal {
tag="FHQ";
file="functions\fhq_tasktracker";
class ttiInit
{
description = "Internal function, called automatically";
preInit = 1;
};
class ttiPostInit
{
description = "Internal function, called automatically";
postInit = 1;
};
INTERNAL_FUNCTION(ttifilterUnits)
INTERNAL_FUNCTION(ttiAddBriefingEntry)
INTERNAL_FUNCTION(ttiHasBriefingEntry)
INTERNAL_FUNCTION(ttiUpdateBriefingList)
INTERNAL_FUNCTION(ttiGetTaskId)
INTERNAL_FUNCTION(ttiGetTaskDesc)
INTERNAL_FUNCTION(ttiGetTaskTitle)
INTERNAL_FUNCTION(ttiGetTaskWp)
INTERNAL_FUNCTION(ttiGetTaskTarget)
INTERNAL_FUNCTION(ttiGetTaskState)
INTERNAL_FUNCTION(ttiGetTaskName)
INTERNAL_FUNCTION(ttiGetTaskType)
INTERNAL_FUNCTION(ttiTaskExists)
INTERNAL_FUNCTION(ttiCreateOrUpdateTask)
INTERNAL_FUNCTION(ttiUpdateTaskList)
INTERNAL_FUNCTION(ttiMissionTasks)
INTERNAL_FUNCTION(ttiMissionBriefing)
INTERNAL_FUNCTION(ttiUnitTasks)
INTERNAL_FUNCTION(ttiUnitBriefing)
INTERNAL_FUNCTION(ttiIsFilter)
INTERNAL_FUNCTION(ttiIsTaskState)
};
class TaskTracker {
tag="FHQ";
file="functions\fhq_tasktracker";
EXPORTED_FUNCTION(ttTaskHint, "This function is called for every task hint to be displayed.")
EXPORTED_FUNCTION(ttAddBriefing, "Adds a briefing to the missing.")
EXPORTED_FUNCTION(ttAddTasks, "Adds tasks to the mission.")
EXPORTED_FUNCTION(ttGetTaskState, "Return the state of a task.")
EXPORTED_FUNCTION(ttSetTaskState, "Set the new state of a task.")
EXPORTED_FUNCTION(ttIsTaskCompleted, "Check whether a given task is completed")
EXPORTED_FUNCTION(ttAreTasksCompleted, "Check whether a list of tasks is completed")
EXPORTED_FUNCTION(ttIsTaskSuccessful, "Check whether a given task is successfully completed")
EXPORTED_FUNCTION(ttAreTasksSuccessful, "Check whether a list of tasks is successfully completed")
EXPORTED_FUNCTION(ttGetAllTasksWithState, "Return an array of all tasks with a given state")
EXPORTED_FUNCTION(ttSetTaskStateAndNext, "Set a task's state, and select the next one")
};
};
/*
File: barrage_generic.sqf
Author: Stagwine. Some elements from Bangabob's mortar script.
Description: Simulates ambient artillery. Internal use only. Classnames may not be accurate
Parameters:
[Marker, # of rounds, dispersion, type of ordnance, flight time, time between impacts]. 0 time between impacts means random value.
Types of ordnance:
See below. Example 0 = Mk 82 bomb
---------------------------
*/
if !(isServer) exitwith{};
//diag_log text "DEBUG: Ambient arty script start.";
private ["_marker","_t","_dispersion","_type","_ammo","_flight","_impactTime","_rndAlt","_rndVel","_timer"];
//systemChat "Arty start";
_marker = [_this, 0, "myMarker",[""]] call BIS_fnc_param; // marker pos
_t = [_this,1,0,[0]] call BIS_fnc_param; // number of rnds
_dispersion = [_this,2,50,[0]] call BIS_fnc_param; // dispersion of impacts.
_type = [_this,3, 2,[0]] call BIS_fnc_param; // ammotype
_flight = [_this,4,20,[0]] call BIS_fnc_param; // "flight time" of first round
_impactTime = [_this,5,10,[0]] call BIS_fnc_param; // time between the impacts.
_timer = 0;
// Random option
if (_impactTime == 0) then {_timer = 1;};
_rndAlt = 100;
_rndVel = -111;
sleep _flight; // Waits for the "fligt time"
switch (_type) do {
case 0: {
_ammo = "rhs_ammo_fab250"; // 500 pound general purpose aircraft bomb. Big explosion.
};
case 1: {
_ammo = "Sh_155mm_AMOS"; // 155mm Artillery HE.
};
case 2: {
_ammo = "rhs_ammo_m21OF_HE"; //
};
case 3: {
_ammo = "CUP_sh_122_HE";
};
case 4: {
_ammo = "R_230mm_fly"; // MLRS round
};
case 5: {
_ammo = "Smoke_82mm_AMOS_White"; // Smoke
};
case 6: {
_ammo = "RHS_ammo_152_WP"; // RHS WP
};
case 7: {
_ammo = "Sh_82mm_AMOS"; // 82mm Mortar HE.
};
case 8: {
_ammo = "CUP_Sh_122_SMOKE"; //
};
case 9: {
_ammo = "CUP_Sh_105_SMOKE"; //
};
case 10: {
_ammo = "rhs_ammo_3WB3"; // Nuke?
};
default {
_ammo = "Sh_120mm_HE";
};
};
_center = getMarkerPos _marker;
for "_i" from 0 to _t do {
sleep 0.2;
_pos = [
(_center select 0) - _dispersion*sin(random 360),
(_center select 1) - _dispersion*cos(random 360),
_rndAlt// Creates rounds at this altitude.
];
_warhead = createVehicle [_ammo, _pos, [],0, "NONE"];
[_warhead, -90, 0] call BIS_fnc_setPitchBank;
_warhead setVelocity [0,0,_rndVel];
sleep 1;
_rndm = 1 + random 8;
if (_timer == 0) then {sleep _impactTime;}
else
{sleep _rndm;};
//hint format ["Ordnance inbound: %1\nRoundcount: %2\nLoc: %3\nDispersion: %4\nFlight time: %5\nImpact delay: %6\n",_ammo,_t,_marker,_dispersion,_flight,_impactTime];
};
/*
ammo = "rhs_ammo_3WB3";
ammo = "rhs_ammo_smokegen";
ammo = "rhs_ammo_m314_ilum";
ammo = "rhs_ammo_fab250";
ammo = "RHS_ammo_23mm_AA";
*/
class AmbienceInternal {
tag="FHQ";
file="functions\fhq_ambience";
class amiInit
{
description = "Internal function, called automatically";
preInit = 1;
};
INTERNAL_FUNCTION(amiThread)
INTERNAL_FUNCTION(amiSetupGroups)
INTERNAL_FUNCTION(amiSetupFactions)
INTERNAL_FUNCTION(amiFindFaction)
INTERNAL_FUNCTION(amiSpawnGroup)
INTERNAL_FUNCTION(amiCleanupGroups)
INTERNAL_FUNCTION(amiGetDistanceToTarget)
INTERNAL_FUNCTION(amiSelectGroup)
INTERNAL_FUNCTION(amiSelectPosForSpawn)
INTERNAL_FUNCTION(amiSelectByWeight)
INTERNAL_FUNCTION(amiSetGroupJob)
INTERNAL_FUNCTION(amiRecalculateWeight)
};
class Ambience {
tag="FHQ";
file="functions\fhq_ambience";
/* Ambience module
*
* The Ambience module is used to spawn groups in the vicinity of the player(s).
* Spawning is controlled by probabilities: Depending on the load of the ambient
* spawns (controlled by SetIntensity), a group is spawned between the minimum
* and maximum distance from the target (alternatively, maybe allow a marker as target ?)
* The group is selected through probabilities for type (infantry, mechanised infantry,
* armor, helis, planes, etc) and faction. A callback (SetSpawnCallback) is called with
* every group spawned like this (allowing users to modify the group's skills, ammo count
* etc). Standard callbacks are provided for specific behavior simulation, like patrols, guarding etc.
*
* All functions have to be called on the server only
*/
EXPORTED_FUNCTION(amSetTarget, "Set the target for spawning, may be player, group, or 'all', meaning all playable units (JIP compatible)")
EXPORTED_FUNCTION(amSetIntensity, "Set intensity of ambient combat")
EXPORTED_FUNCTION(amSetDistances, "Set minimal and maximal spawn distance")
EXPORTED_FUNCTION(amSetSpawnCallback, "Set a callback handler that is called with each spawned group")
EXPORTED_FUNCTION(amSetTypeProbability, "Set probability for different types of groups (infantry, armor, planes, etc)")
EXPORTED_FUNCTION(amSetFactionProbability, "Set probability for different factions to be spawned (default is 0 for all factions)")
EXPORTED_FUNCTION(amSetTaskProbability, "Set probability for different types of tasks (guard, patrol, seek&destroy)")
EXPORTED_FUNCTION(amRandomAirTraffic, "Generate random air traffic, for pure ambience")
};
#define INTERNAL_FUNCTION(x) \
class x \
{ \
description = "Internal Function"; \
};
#define EXPORTED_FUNCTION(x,y) \
class x \
{ \
description = y; \
};
class FHQ {
#include "fhq_misc.hpp"
#include "fhq_tasktracker.hpp"
};
/*
#define INTERNAL_FUNCTION(x) \
class x \
{ \
description = "Internal Function"; \
};
#define EXPORTED_FUNCTION(x,y) \
class x \
{ \
description = y; \
};
class FHQ {
class ForceTracker {
tag = "FHQ";
file="functions\fhq_forcetracker";
EXPORTED_FUNCTION(forceTrackStart, "Start Force Tracking");
EXPORTED_FUNCTION(forceTrackStop, "End Force Tracking");
EXPORTED_FUNCTION(forceTrackAdd, "Add a group to the force tracker");
EXPORTED_FUNCTION(forceTrackRemove, "Remove a group from the tracking");
EXPORTED_FUNCTION(forceTrackSetDelay, "Sets the delay between updates. Use if there are a lot of uints to track");
// Internal - do not call
INTERNAL_FUNCTION(forceTrackUpdateSingle);
INTERNAL_FUNCTION(forceTrackOnFrame);
class forceTrackInit
{
description = "Internal function, called automatically";
preInit = 1;
};
};
};
*/
/*
Description:
Add a group to the force tracking
Parameter(s):
_this select 0: Group to add (group)
_this select 1: Type of group (string, default "inf")
_this select 2: Name/Callsign of group (string, default empty)
_this select 3: Icon scale (float, default 1)
_this select 4: (optional) override color, from CfgMarkerColors
Returns:
Nothing
*/
params [
["_group", grpNull, [grpNull]],
["_type", "inf", [""]],
["_name", "", [""]],
["_scale", 1, [1]],
["_newColor", "", [""]]
];
if (!isServer && !local _group) exitWith {};
if (!isServer) then {
_this remoteExecCall ["FHQ_fnc_taskTrackAdd", 2];
};
if (isNil "FHQ_ForceTrackerRoot") then {
call FHQ_fnc_forceTrackInit;
};
if (isNull _group) exitWith {};
if (_group getVariable ["FHQ_ForceTrack_Init", false]) exitWith {diag_log "tracking a non-initialized group";};
_group setVariable ["FHQ_ForceTrack_Init", true, true];
private _side = side _group;
private _prf = switch (_side) do {
case west: {"b_"};
case east: {"o_"};
case independent: {"n_"};
};
private _color = switch (_side) do {
case west: {"ColorWest"};
case east: {"ColorEast"};
case independent: {"ColorIndependent"};
};
if (_newColor != "") then {
_color = _newColor;
};
private _iconName = _prf + _type;
private _markerName = format ["FHQ_ForceTrack_Marker%1", FHQ_ForceTrackNextId];
FHQ_ForceTrackNextId = FHQ_ForceTrackNextId + 1;
createMarker [_markerName, getPos leader _group];
_markerName setMarkerType _iconName;
_markerName setMarkerColor _color;
if (_name isEqualTo "") then {
_name = groupId _group;
};
_markerName setMarkerText _name;
if (!FHQ_ForceTrackOn) then {
_markerName setMarkerAlpha 0;
};
_group setVariable ["FHQ_ForceTrackMarker", _markerName, true];
_array = FHQ_ForceTrackerRoot getVariable "FHQ_ForceTrack_Array";
//diag_log format ["ForceTracker: Adding _group %1 to the array", _group];
_array append [_group];
//diag_log format ["ForceTracker: Afterwards, _array = %1", _array];
FHQ_ForceTrackerRoot setVariable ["FHQ_ForceTrack_Array", _array, true];if (!isServer) exitWith {};
diag_log format ["forceTrackInit called, isNil = %1", !isNil "FHQ_ForceTrackerRoot"];
if (!isNil "FHQ_ForceTrackerRoot") exitWith {}; // Already initialized
diag_log "FT init";
FHQ_ForceTrackerRoot = (createGroup sideLogic) createUnit ["LOGIC", [0,0,0], [], 0, "NONE"];
publicVariable "FHQ_ForceTrackerRoot";
FHQ_ForceTrackerRoot setVariable ["FHQ_ForceTrack_Array", [], true];
FHQ_ForceTrackLastTime = time;
FHQ_ForceTrackNextId = 0;
FHQ_ForceTrackOn = false;
FHQ_ForceTrackDelay = 0.3;/* Called automatically on every frame when force tracking is enabled */
if (!isServer) exitWith {};
// Check if the time quantum expired
if (FHQ_ForceTrackLastTime + FHQ_ForceTrackDelay > time) exitWith {};
FHQ_ForceTrackLastTime = time;
// This array contains a number of groups that are being tracked. All other relevant data
// is stored on the group itself
_array = FHQ_ForceTrackerRoot getVariable "FHQ_ForceTrack_Array";
{
_x call FHQ_fnc_forceTrackUpdateSingle;
} forEach _array;/*
Description:
Remove a group from force tracking
Parameter(s):
_this select 0: Group to remove
Returns:
Nothing
*/
if (!isServer) then {
_this remoteExec ["FHQ_fnc_taskTrackRemove", 2];
};
params [
["_group", grpNull, [grpNull]]
];
_array = FHQ_ForceTrackerRoot getVariable "FHQ_ForceTrack_Array";
_array = _array - [_group];
FHQ_ForceTrackerRoot setVariable ["FHQ_ForceTrack_Array", _array, true];
_marker = _group getVariable "FHQ_ForceTrackMarker";
deleteMarker _marker;FHQ_ForceTrackDelay = _this select 0;
publicVariable "FHQ_ForceTrackDelay";/*
Description:
Start tracking units
Returns:
Nothing
*/
if (!isServer) then {
[] remoteExec ["FHQ_fnc_taskTrackStart", 2];
};
["FHQ_ForceTrack", "onEachFrame", { call FHQ_fnc_forceTrackOnFrame}] call BIS_fnc_addStackedEventHandler;
FHQ_ForceTrackOn = true;
_array = FHQ_ForceTrackerRoot getVariable "FHQ_ForceTrack_Array";
{
_marker = _x getVariable "FHQ_ForceTrackMarker";
_marker setMarkerAlpha 1;
} forEach _array;/*
Description:
Stop tracking groups on the map and/or 3D
Parameter(s):
None
Returns:
Nothing
*/
if (!isServer) then {
[] remoteExec ["FHQ_fnc_taskTrackStop", 2];
};
["FHQ_ForceTrack", "onEachFrame"] call BIS_fnc_removeStackedEventHandler;
FHQ_ForceTrackOn = false;
_array = FHQ_ForceTrackerRoot getVariable "FHQ_ForceTrack_Array";
{
_marker = _x getVariable "FHQ_ForceTrackMarker";
_marker setMarkerAlpha 0;
} forEach _array;/*
Description:
Update Force Tracker
Parameter(s):
_this select 0: group to update
Returns:
Nothing
*/
params [
["_group", grpNull, [grpNull]]
];
if (isNull _group) exitWith {};
_marker = _group getVariable "FHQ_ForceTrackMarker";
if (({alive _x } count units _group) == 0) exitWith {
// Dead, delete the marker
deleteMarker _marker;
};
_pos = getpos leader _group;
_marker setMarkerPos _pos;
class Time {
tag="FHQ";
file="functions\fhq_misc";
EXPORTED_FUNCTION(date2String, "Convert a date to a string.")
EXPORTED_FUNCTION(time2FuzzyString, "Convert current time into a fuzzy string")
};
class Spawning {
tag="FHQ";
file="functions\fhq_misc";
EXPORTED_FUNCTION(checkPresence, "Check presence of an object depending on the difficulty")
EXPORTED_FUNCTION(debugMarker, "Easily create a marker for debugging purposes")
EXPORTED_FUNCTION(spawnGroup, "Create a group of vehicles")
EXPORTED_FUNCTION(deleteGroup, "Delete all units and vehicles in the group, and the group itself")
};
class Units {
tag="FHQ";
file="functions\fhq_misc";
EXPORTED_FUNCTION(safeAddLoadout, "Add a loadout to a unit, JIP friendly")
EXPORTED_FUNCTION(enableUnit, "Enable a unit that has been disabled")
EXPORTED_FUNCTION(disableUnit, "Disable a unit so it minimizes resources used")
EXPORTED_FUNCTION(disableGroup, "Disables all units in a group, including vehicles and UAV's")
EXPORTED_FUNCTION(enableGroup, "Enable a previously disabled group")
EXPORTED_FUNCTION(findLeader, "Find a leader in the given groups. Groups may also be empty")
EXPORTED_FUNCTION(findBoundingCircle, "Find the circle enclosing all given units in an array")
EXPORTED_FUNCTION(unitsInTrigger, "Find all units in a given trigger")
EXPORTED_FUNCTION(areUnitsInTrigger, "Check if all given units are in a trigger")
EXPORTED_FUNCTION(getOpsLeader, "Get the highest ranking player")
};
class Random {
tag="FHQ";
file="functions\fhq_misc";
EXPORTED_FUNCTION(getPointInMarker, "Generate a random point in a given marker")
EXPORTED_FUNCTION(getPointInTrigger, "Generate a random point in a given trigger")
EXPORTED_FUNCTION(getPointInShape, "Generate a random point in a given shape")
EXPORTED_FUNCTION(isPointInShape, "Check if a given point is inside the given shape")
EXPORTED_FUNCTION(isPointInMarker, "Check if a given point is inside the given marker")
EXPORTED_FUNCTION(isPointInTrigger, "Check if a given point is inside the given shape")
EXPORTED_FUNCTION(getRandomPos, "Generate a random position")
};
class Intro {
tag="FHQ";
file="functions\fhq_misc";
EXPORTED_FUNCTION(fadeQuote, "Generate title quote")
EXPORTED_FUNCTION(introDsp, "Generate ticker text")
};
class Transport {
tag="FHQ";
file="functions\fhq_misc";
EXPORTED_FUNCTION(createExtraction, "Create extraction vehicle(s) and have them pick up a bunch of units")
EXPORTED_FUNCTION(createInsertion, "Use existing vehicles to insert a group of people")
};
class Effect {
tag="FHQ";
file="functions\fhq_misc";
EXPORTED_FUNCTION(weatherEffect, "Weather effects like snow and fog")
EXPORTED_FUNCTION(setWeatherEffect, "Update parameters of weather effects")
};
/* FHQ Task Tracker
* Copyright 2016 by Thomas Frieden (Varanon). All rights reserved. Use of this software
* is at your own risk. The copyright holder is in no way responsible for damages
* resulting from the use of this software.
* Distribution of the software is only allowed within a mission. In addition, no
* changes are allowed to the software without the permission of the authors.
* Distribution as a standalone package is prohibited.
* Attribution (getting a mention in the credits section of your mission) is appreciated,
* but not a requirement
*/
#define INTERNAL_FUNCTION(x) \
class x \
{ \
description = "Internal Function"; \
};
#define EXPORTED_FUNCTION(x,y) \
class x \
{ \
description = y; \
};
class FHQ {
class ForceTracker {
tag = "FHQ";
file="functions\fhq_forcetracker";
EXPORTED_FUNCTION(forceTrackStart, "Start Force Tracking");
EXPORTED_FUNCTION(forceTrackStop, "End Force Tracking");
EXPORTED_FUNCTION(forceTrackAdd, "Add a group to the force tracker");
EXPORTED_FUNCTION(forceTrackRemove, "Remove a group from the tracking");
EXPORTED_FUNCTION(forceTrackSetDelay, "Sets the delay between updates. Use if there are a lot of uints to track");
// Internal - do not call
INTERNAL_FUNCTION(forceTrackUpdateSingle);
INTERNAL_FUNCTION(forceTrackOnFrame);
class forceTrackInit
{
description = "Internal function, called automatically";
preInit = 1;
};
};
class TaskTrackerInternal {
tag="FHQ";
file="functions\fhq_tasktracker";
class ttiInit
{
description = "Internal function, called automatically";
preInit = 1;
};
class ttiPostInit
{
description = "Internal function, called automatically";
postInit = 1;
};
INTERNAL_FUNCTION(ttifilterUnits)
INTERNAL_FUNCTION(ttiAddBriefingEntry)
INTERNAL_FUNCTION(ttiHasBriefingEntry)
INTERNAL_FUNCTION(ttiUpdateBriefingList)
INTERNAL_FUNCTION(ttiGetTaskId)
INTERNAL_FUNCTION(ttiGetTaskDesc)
INTERNAL_FUNCTION(ttiGetTaskTitle)
INTERNAL_FUNCTION(ttiGetTaskWp)
INTERNAL_FUNCTION(ttiGetTaskTarget)
INTERNAL_FUNCTION(ttiGetTaskState)
INTERNAL_FUNCTION(ttiGetTaskName)
INTERNAL_FUNCTION(ttiGetTaskType)
INTERNAL_FUNCTION(ttiTaskExists)
INTERNAL_FUNCTION(ttiCreateOrUpdateTask)
INTERNAL_FUNCTION(ttiUpdateTaskList)
INTERNAL_FUNCTION(ttiMissionTasks)
INTERNAL_FUNCTION(ttiMissionBriefing)
INTERNAL_FUNCTION(ttiUnitTasks)
INTERNAL_FUNCTION(ttiUnitBriefing)
INTERNAL_FUNCTION(ttiIsFilter)
INTERNAL_FUNCTION(ttiIsTaskState)
};
class TaskTracker {
tag="FHQ";
file="functions\fhq_tasktracker";
EXPORTED_FUNCTION(ttTaskHint, "This function is called for every task hint to be displayed.")
EXPORTED_FUNCTION(ttAddBriefing, "Adds a briefing to the missing.")
EXPORTED_FUNCTION(ttAddTasks, "Adds tasks to the mission.")
EXPORTED_FUNCTION(ttGetTaskState, "Return the state of a task.")
EXPORTED_FUNCTION(ttSetTaskState, "Set the new state of a task.")
EXPORTED_FUNCTION(ttIsTaskCompleted, "Check whether a given task is completed")
EXPORTED_FUNCTION(ttAreTasksCompleted, "Check whether a list of tasks is completed")
EXPORTED_FUNCTION(ttIsTaskSuccessful, "Check whether a given task is successfully completed")
EXPORTED_FUNCTION(ttAreTasksSuccessful, "Check whether a list of tasks is successfully completed")
EXPORTED_FUNCTION(ttGetAllTasksWithState, "Return an array of all tasks with a given state")
EXPORTED_FUNCTION(ttSetTaskStateAndNext, "Set a task's state, and select the next one")
};
};
/* FHQ_fnc_ttAddBriefing: Add a full briefing
*
* This functions receives an array as input. The elements of the input array
* are interpreted as follows:
* If the element is a two-element array consisting of two strings, the entry is
* interpreted as a new briefing topic. If the array has three strings, it's interpreted
* as a new briefing entry, with the first one being the general subject ("Diary" by default),
* and the two subsequent strings title and description.
* If the element is anything else, the following topics will only be presented to
* the units matching the element. For example, if the element is a group, the following
* entries are added to this group only.
*
* NOTE: The old hierarchical filtering is no longer supported. It wasn't that useful for
* real-world application and was posing severe problems with respawn missions.
*
* Example:
*
* [
* west,
* ["Mission", "Get some!"],
* ["Enemy Forces", "There's lots of ruskies around"],
* east,
* ["Mission", "Get those imperialistic americans"],
* ["Current Supply of Vodka", "Low"],
* {true},
* ["Credits", "Mission by", "Some Dude"],
* ["Credits", "Uses scripts by", "Some other dude Yet another dude"]
* ] call FHQ_fnc_ttAddBriefing.
*
* The first two lines (Mission, Enemy Forces), are added under "Briefing" for west
* troops only, the second two lines (Mission, Current Supply of Vodka) only for east.
* The last two lines add two new entries "Mission by" and "Uses scripts by" into a new
* subject "Credits".
*
* NOTE: Do not over-use the additional subject feature. Briefing and all associated information
* should go to the default subject.
*
* Calling FHQ_TT_addBriefing with an already existing subject/title will add a new log entry
* if the text differs from the previous one.
*
* Notifications are shown after the initial briefing has been donwloaded by the clients, i.e.
* not at mission start, only when new briefing entries are added.
*/
private ["_currentFilter", "_i", "_current", "_x"];
_currentFilter = {true};
if (isServer) then {
/* Note: Server only code. Briefing entries must be added on the server, not on an
* individual client
*/
for [{_i = 0}, {_i < count _this}, {_i = _i + 1}] do {
_current = _this select _i;
if (_current call FHQ_fnc_ttiIsFilter) then {
_currentFilter = nil;
_currentFilter = _current;
} else {
/* It's a briefing entry. */
[_currentFilter, _current] call FHQ_fnc_ttiAddBriefingEntry;
};
};
publicVariable "FHQ_TTI_BriefingList";
if (!isDedicated) then {
FHQ_TTI_BriefingList call FHQ_fnc_ttiUpdateBriefingList;
};
FHQ_TTI_briefing = true;
publicVariable "FHQ_TTI_briefing";
};
/* FHQ_fnc_ttAddTasks: Add tasks to the mission
*
* Task are defined similar to briefing entries. The function accepts an array as input.
* Each entry is either a filter (see FHQ_TT_addBriefing), or a task description.
*
* A task description itself is an array and can be one of the following format:
* [_taskName, _longDescription, _shortDescription, _waypointDescription, _target, _initialState, _type]
* [[_taskName, _parentTask], _longDescription, _shortDescription, _waypointDescription, _target, _initialState, _type]
*
* Both _target and _initialState are optional and can be left out.
*
* o _taskName is a symbolic name that is invisible to the player.
* o _longDescription is a text describing the task.
* o _shortDescription is used as a headline for the task in the task list and on task hints
* o _waypointDescription is displayed on the waypoint on the map and in the 3d view (if enabled).
* o _target can be a position (three-element array) or an object. If either is given, the
* task waypoint is shown on the map an the 3d view. Objects that move also move
* the waypoint marker.
* o _initialState is the initial state of the task ("succeeded", "failed", "canceled",
* "created", or "assigned"). By default, if _initialState is ommited, the state is set
* to "created". If set to "assigned", the task is also automatically assigned to everyone
* that knows about it.
* o _type is one of the defined task types, see the link for more information:
* https://community.bistudio.com/wiki/Arma_3_Tasks_Overhaul#Default_Task_Types:_Actions
*
* Example:
*
* [
* west,
* ["taskBoard1", "Board your chopper", "Board your chopper", "BOARD", westHelo1, "assigned"],
* ["taskCAS", "Fly around", "Fly around", "CAS"],
* ["taskRetreat1", "Return to LZ", "Return to LZ", "RETREAT", getMarkerPos "markLZ"],
* "BLU_G_F",
* ["taskSecret", "Secret: Betray NATO for whatever reason", "Secret: Betray NATO", ""],
* [["taskSecret1", "taskSecret"], "Because they are idiots", "Idiots", ""],
* [["taskSecret2", "taskSecret"], "Because I am evil", "Evil", ""]
* ] call FHQ_fnc_ttAddTasks;
*
* The first three tasks are assigned at all playable west units. The second bunch of three tasks is
* only assigned to FIA units. The latter two, taskSecret1 and taskSecret2 are created as subtasks
* of the task "taskSecret" and will be displayed immediately below their respective parent.
*
* NOTE: This function can only be called on the server. Calling it anywhere else will have no effect.
*/
private _currentFilter = {true};
if (isServer) then {
/* Note: Server only code. Briefing entries must be added on the server, not on an
* individual client
*/
private _i = 0;
for [{_i = 0}, {_i < count _this}, {_i = _i + 1}] do {
private _current = _this select _i;
if (_current call FHQ_fnc_ttiIsFilter) then {
/* Must be a filter */
_currentFilter = nil;
_currentFilter = _current;
} else {
/* Task entry.
* Check if the task already exists. If not, construct a full
* task entry with all redundant information filled in for easier
* access later on
*/
private _name = _current call FHQ_fnc_ttiGetTaskName;
if (([FHQ_TTI_TaskList, _name] call FHQ_fnc_ttiTaskExists) == -1) then {
private _newTask =
[_current call FHQ_fnc_ttiGetTaskId,
_current call FHQ_fnc_ttiGetTaskDesc,
_current call FHQ_fnc_ttiGetTaskTitle,
_current call FHQ_fnc_ttiGetTaskWp,
_current call FHQ_fnc_ttiGetTaskTarget,
_current call FHQ_fnc_ttiGetTaskState,
_current call FHQ_fnc_ttiGetTaskType];
FHQ_TTI_TaskList = FHQ_TTI_TaskList + [[_currentFilter, _newTask]];
};
};
};
publicVariable "FHQ_TTI_TaskList";
if (!isDedicated) then {
FHQ_TTI_TaskList call FHQ_fnc_ttiUpdateTaskList;
};
FHQ_TTI_tasks = true;
publicVariable "FHQ_TTI_tasks";
};
/* FHQ_fnc_ttAreTasksCompleted
*
* Check for all tasks given whether they are considered completed. This function can
* be called on the client as well as the server.
*
* Usage
* _result = [_taskName1, _taskName2, ...] call FHQ_fnc_ttAreTasksCompleted
*
* _taskName1 and following: Task names that are tested for being completed. If any of them is not
* completed, the function returns false, else true.
*/
private ["_result", "_x"];
_result = true;
{
if (!(tolower ([_x] call FHQ_fnc_ttGetTaskState) in ["succeeded", "canceled", "failed"])) exitWith
{
_result = false;
};
} forEach _this;
_result;
/* FHQ_fnc_ttAreTasksSuccessful
*
* Check success for all tasks given. This function can be called on the client as well as
* the server.
*
* _result = [_taskName1, _taskName2, ...] call FHQ_fnc_ttAreTasksSuccessful
*/
private ["_result", "_x"];
_result = true;
{
if (tolower ([_x] call FHQ_fnc_ttGetTaskState) != "succeeded") exitWith
{
_result = false;
};
} forEach _this;
_result;
/* FHQ_fnc_ttGetAllTasksWithState
*
* Get all tasks with a given state. This function can be called on the client as well as
* the server.
*
* _taskList = [_state] call FHQ_fnc_ttGetAllTasksWithState;
*/
#define FHQ_TTIF_TASKSTATE 5
private ["_result", "_taskState"];
_result = [];
_taskState = [_this, 0, "", [""]] call BIS_fnc_param;
{
if (((_x select 1) select FHQ_TTIF_TASKSTATE) == _taskState) then
{
_result = _result + [(_x select 1) call FHQ_fnc_ttiGetTaskName];
};
} forEach FHQ_TTI_TaskList;
_result;
/* FHQ_fnc_ttGetTaskState
*
* Get the state of a given task. This function can be called on the client as well as
* the server.
*
* Usage:
* _state = [_task] call FHQ_fnc_ttGetTaskState;
*
* _task: The name of a task defined via FHQ_fnc_ttAddTask
*
* Returns the state of the task ("succeeded", "failed", "canceled", "created", "assigned"), or an empty
* string if the task does not exist
*/
#define FHQ_TTIF_TASKSTATE 5
private ["_res", "_name", "_idx", "_entry"];
_res = "";
_name = [_this, 0, "", [""]] call BIS_fnc_param;
_idx = [FHQ_TTI_TaskList, _name] call FHQ_fnc_ttiTaskExists;
if (_idx != -1) then {
_entry = FHQ_TTI_TaskList select _idx;
_res = (_entry select 1) select FHQ_TTIF_TASKSTATE;
};
_res;
/* Internal: Add a briefing record on the server
* parameters:
* select 0: Filter
* select 1: [_section, _subject, _text]
*/
private _record = [_this, 1] call BIS_fnc_param;
private _filter = [_this, 0] call BIS_fnc_param;
private _subject = "Diary";
private _topic = _record select 0;
private _text = _record select 1;
if (count _record == 3) then {
_subject = _record select 0;
_topic = _record select 1;
_text = _record select 2;
};
FHQ_TTI_BriefingList = FHQ_TTI_BriefingList + [[_filter, [_subject, _topic, _text]]];
private ["_current", "_existing", "_unit", "_name", "_state", "_idx", "_record", "_object", "_taskID",
"_parented"];
_current = [_this, 0] call BIS_fnc_param;
_existing = [_this, 1] call BIS_fnc_param;
_unit = [_this, 2] call BIS_fnc_param;
_name = _current call FHQ_fnc_ttiGetTaskName;
_state = _current call FHQ_fnc_ttiGetTaskState;
_parented = false;
_idx = [_existing, _name] call FHQ_fnc_ttiTaskExists;
if (_idx != -1) then {
_record = _existing select _idx;
if ((_record select 0) != _state) then {
/* Need to set new state */
_record set [0, _state];
if (_state == "assigned") then {
_unit setCurrentTask (_record select 1);
};
(_record select 1) setTaskState _state;
if (_unit == player && !FHQ_TTI_supressTaskHints) then
{
[_current call FHQ_fnc_ttiGetTaskTitle, _state, _current call FHQ_fnc_ttiGetTaskType] call FHQ_fnc_ttTaskHint;
};
/* Update the list */
_existing set [_idx, _record];
};
} else {
_taskID = _current call FHQ_fnc_ttiGetTaskId;
if (typename _taskID == "STRING") then {
_object = _unit createSimpleTask [_name];
} else {
_object = _unit createSimpleTask [_name, _unit getVariable format["FHQ_TT_taskname_%1", _taskID select 1]];
_parented = true;
};
_object setSimpleTaskDescription [_current call FHQ_fnc_ttiGetTaskDesc,
_current call FHQ_fnc_ttiGetTaskTitle,
_current call FHQ_fnc_ttiGetTaskWp];
_target = _current call FHQ_fnc_ttiGetTaskTarget;
switch (typename _target) do
{
case "ARRAY": {
_object setSimpleTaskDestination _target;
};
case "OBJECT": {
_object setSimpleTaskTarget [_target, true];
};
};
private _taskType = _current call FHQ_fnc_ttiGetTaskType;
if (_taskType != "" && FHQ_TTI_version > 156) then {
[_object, _taskType] call compile "(_this select 0) setSimpleTaskType (_this select 1);"
};
_target = nil;
_object setTaskState _state;
if (tolower(_state) == "assigned") then
{
_unit setCurrentTask _object;
};
_unit setVariable [format["FHQ_TT_taskname_%1", _name], _object]; // FIXME: propagate through network ?
if (_unit == player && !FHQ_TTI_supressTaskHints) then
{
[_current call FHQ_fnc_ttiGetTaskTitle, _state, _current call FHQ_fnc_ttiGetTaskType] call FHQ_fnc_ttTaskHint;
};
_existing = _existing + [ [_state, _object, _name] ];
};
_existing;/* Internal function */
private ["_unitsArray", "_outputArray"];
_filter = [_this, 0] call BIS_fnc_param;
_unitsArray = [_this, 1, (if (isMultiplayer) then {playableUnits+FHQ_TTI_extraUnits} else {switchableUnits})] call BIS_fnc_param;
_outputArray = [];
switch (typename _filter) do
{
case "CODE":
{
// Filter all playable units by comparing them with the code
{if (_x call _filter) then {_outputArray = _outputArray + [_x];};} forEach _unitsArray;
};
case "GROUP":
{
// Filter out all objects not in group
{if (_x in units _filter) then {_outputArray = _outputArray + [_x];};} forEach _unitsArray;
};
case "OBJECT":
{
// Result is only the array containing the object
_outputArray = [_filter];
};
case "SIDE":
{
// Filter out all objects not belonging to side
{if (side _x == _filter) then {_outputArray = _outputArray + [_x];};} forEach _unitsArray;
};
case "STRING":
{
// Filer out all objects not belonging to the faction
{if (faction _x == _filter) then {_outputArray = _outputArray + [_x];};} forEach _unitsArray;
};
case "ARRAY":
{
// Result is the input
_outputArray = _filter;
}
};
_outputArray;
#define FHQ_TTIF_TASKNAME 0
#define FHQ_TTIF_TASKDESC 1
#define FHQ_TTIF_TASKTITLE 2
#define FHQ_TTIF_TASKWP 3
#define FHQ_TTIF_TASKTARGET 4
#define FHQ_TTIF_TASKSTATE 5
_res = _this select FHQ_TTIF_TASKDESC;
_res;#define FHQ_TTIF_TASKNAME 0
#define FHQ_TTIF_TASKDESC 1
#define FHQ_TTIF_TASKTITLE 2
#define FHQ_TTIF_TASKWP 3
#define FHQ_TTIF_TASKTARGET 4
#define FHQ_TTIF_TASKSTATE 5
_res = _this select FHQ_TTIF_TASKNAME;
_res;#define FHQ_TTIF_TASKNAME 0
#define FHQ_TTIF_TASKDESC 1
#define FHQ_TTIF_TASKTITLE 2
#define FHQ_TTIF_TASKWP 3
#define FHQ_TTIF_TASKTARGET 4
#define FHQ_TTIF_TASKSTATE 5
private _name = "";
private _task = _this select FHQ_TTIF_TASKNAME;
if (typename _task == "ARRAY") then
{
_name = _task select 0;
}
else
{
_name = _task;
};
_name;#define FHQ_TTIF_TASKNAME 0
#define FHQ_TTIF_TASKDESC 1
#define FHQ_TTIF_TASKTITLE 2
#define FHQ_TTIF_TASKWP 3
#define FHQ_TTIF_TASKTARGET 4
#define FHQ_TTIF_TASKSTATE 5
/* Might not be present */
private _res = "created";
if (count _this > FHQ_TTIF_TASKSTATE) then {
_res = _this select FHQ_TTIF_TASKSTATE;
} else {
if (count _this > FHQ_TTIF_TASKTARGET) then {
if (typename (_this select FHQ_TTIF_TASKTARGET) == "STRING") then {
_res = _this select FHQ_TTIF_TASKTARGET;
};
};
};
_res;#define FHQ_TTIF_TASKNAME 0
#define FHQ_TTIF_TASKDESC 1
#define FHQ_TTIF_TASKTITLE 2
#define FHQ_TTIF_TASKWP 3
#define FHQ_TTIF_TASKTARGET 4
#define FHQ_TTIF_TASKSTATE 5
/* Might not be present */
private _res = "";
if (count _this > FHQ_TTIF_TASKTARGET) then {
_thing = _this select FHQ_TTIF_TASKTARGET;
/* A string means it's the initial state (unless starting with # or @), so if it's not, it's either
* a position (array) or target (object)
*/
switch (typename _thing) do {
case "ARRAY": {
_res = nil;
_res = _thing;
};
case "OBJECT": {
_res = nil;
_res = _thing;
};
case "CODE": {
_res = nil;
_res = call _thing;
};
case "STRING": {
_res = nil;
if (_thing find "#" == 0) exitWith {
private _parts = _thing select [1];
_res = call compile _parts ;
};
if (_thing find "@" == 0) exitWith {
private _parts = _thing select [1];
_res = getMarkerPos _parts;
};
_res = "";
};
};
};
_res;
#define FHQ_TTIF_TASKNAME 0
#define FHQ_TTIF_TASKDESC 1
#define FHQ_TTIF_TASKTITLE 2
#define FHQ_TTIF_TASKWP 3
#define FHQ_TTIF_TASKTARGET 4
#define FHQ_TTIF_TASKSTATE 5
_res = _this select FHQ_TTIF_TASKTITLE;
_res;#define FHQ_TTIF_TASKNAME 0
#define FHQ_TTIF_TASKDESC 1
#define FHQ_TTIF_TASKTITLE 2
#define FHQ_TTIF_TASKWP 3
#define FHQ_TTIF_TASKTARGET 4
#define FHQ_TTIF_TASKSTATE 5
#define FHQ_TTIF_TASKTYPE 6
/* Might not be present */
private _res = "";
private _num = count _this;
/* It must be a string, and it must be the last one, so we're just checking if there's more than 4
* and the last one is a string that is not a target or a state
*/
if (_num > 4) then {
private _type = _this select (_num - 1);
if (typename _type == "STRING") then {
if (!(_type call FHQ_fnc_ttiIsTaskState) and (_type find "#" != 0) and (_type find "@" != 0)) then {
/* Last element is a string, but no position, and no state, so it must be a type */
_res = _type;
};
};
};
_res;#define FHQ_TTIF_TASKNAME 0
#define FHQ_TTIF_TASKDESC 1
#define FHQ_TTIF_TASKTITLE 2
#define FHQ_TTIF_TASKWP 3
#define FHQ_TTIF_TASKTARGET 4
#define FHQ_TTIF_TASKSTATE 5
_res = _this select FHQ_TTIF_TASKWP;
_res;private ["_x", "_res", "_test", "_inArray"];
_res = false;
_inArray = [_this, 1, []] call BIS_fnc_param;
_test = [_this, 0, []] call BIS_fnc_param;
{
if (_x select 0 == _inArray select 0 && ((_x select 1) select 0) == ((_inArray select 1) select 0)
&& ((_x select 1) select 1) == ((_inArray select 1) select 1)) exitWith {
_res = true;
};
} foreach _test;
_res; /* Internal function, called automatically */
FHQ_TT_subtaskPrefix = " > ";
FHQ_TTI_supressTaskHints = true;
FHQ_TTI_version = productVersion select 2;
if (isServer) then
{
FHQ_TTI_BriefingList = [];
FHQ_TTI_TaskList = [];
};
if (!isDedicated) then
{
FHQ_TTI_ClientTaskList = [];
if (isNil {player} || isNull player) then
{
FHQ_TTI_isJIPPlayer = true;
};
[] spawn
{
// Wait for join in progress
waitUntil {!isNil {player}};
waitUntil {!isNull player};
waitUntil {!isNil "FHQ_TTI_PostInitDone"};
/* Wait until briefing is ready (on server).
* Note that we spawn this code, to cope with the possibility of having no briefing at all
*/
[] spawn {
waitUntil {!isNil "FHQ_TTI_briefing"};
FHQ_TTI_BriefingList call FHQ_fnc_ttiUpdateBriefingList;
"FHQ_TTI_BriefingList" addPublicVariableEventHandler {(_this select 1) call FHQ_fnc_ttiUpdateBriefingList};
};
// Wait until the task list is ready (on server)
waitUntil {!isNil "FHQ_TTI_tasks"};
FHQ_TTI_TaskList call FHQ_fnc_ttiUpdateTaskList;
"FHQ_TTI_TaskList" addPublicVariableEventHandler {(_this select 1) call FHQ_fnc_ttiUpdateTaskList};
FHQ_TTI_supressTaskHints = false;
};
};
/* Internal function */
private "_x";
private _filter = _this;
private _res = false;
switch (typename _filter) do
{
case "CODE":
{
_res = true;
};
case "GROUP":
{
_res = true;
};
case "OBJECT":
{
_res = true;
};
case "SIDE":
{
_res = true;
};
case "STRING":
{
_res = true;
};
case "ARRAY":
{
/* The complex case: If all elements are objects, then it's a filter */
private _nonObjects = 0;
{
if (typename _x != "OBJECT") then {
_nonObjects = _nonObjects + 1;
};
} foreach _filter;
if (_nonObjects == 0) then {
_res = true;
};
};
};
_res;/* Internal Function */
private _state = toLower _this;
private _res = false;
if (_state in ["succeeded", "failed", "canceled", "created", "assigned"]) then {
_res = true;
};
_res;/* Eden compatible mission briefing
* This function is called like
* [_value] call FHQ_fnc_ttiMissionBriefing;
*
* _value is an array of briefing blocks. Each block is an array in itself,
* with the following format:
* ["identifier", [ [FHQ_TT briefing entry],... ]]
*
* "identifier" is a string identifying a "block" of entries. Units can receive one
* such block, i.e. all briefing entries listed under the identifier will be given to
* the unit.
*/
missionNamespace setVariable ["FHQ_tt_MissionBriefing", param [0, []]]; /* Eden compatible mission tasks
* This function is called like
* [_value] call FHQ_fnc_ttiMissionTasks;
*
* _value is an array of tasks. Each entry is an identifier followed by
* a full FHQ TT task entry
*
*/
missionNamespace setVariable ["FHQ_tt_MissionTasks", param [0, []]]; /* PostInit function
* This function walks through all playable/switchable units and assigns tasks and briefings to them
*/
/* Briefings:
* FHQ_tt_MissionBriefing is a global variable that contains an array of briefing blocks.
* Each block has a unique ID and a list of entries.
*
* We process this by going through the briefing blocks first: For each entry, the units
* referencing the briefing are collected in an array, and
*/
if (!isServer) exitWith {};
FHQ_TTI_extraUnits = allMissionObjects "VirtualCurator_F"+allMissionObjects "VirtualSpectator_F";
FHQ_TTI_PostInitDone = true;
publicVariable "FHQ_TTI_extraUnits";
publicVariable "FHQ_TTI_PostInitDone";
private _briefings = missionNamespace getVariable ["FHQ_tt_MissionBriefing", []];
private _tasks = missionNamespace getVariable ["FHQ_tt_MissionTasks", []];
private _playable = (if (isMultiplayer) then {playableUnits+FHQ_TTI_extraUnits} else {switchableUnits});
private _i = 0;
for [{_i = 0}, {_i < count _briefings}, {_i = _i + 1}] do
{
private _briefing = _briefings select _i;
private _id = _briefing select 0;
private _entry = _briefing select 1;
private _units = [];
{
if (tolower(_id) == tolower(_x getVariable ["FHQ_tt_UnitBriefing", ""])) then {
_units = _units + [_x];
};
} foreach _playable;
if (count _units != 0) then {
([_units] + _entry) call FHQ_fnc_ttAddBriefing;
};
};
for [{_i = 0}, {_i < count _tasks}, {_i = _i + 1}] do
{
private _task = _tasks select _i;
private _id = _task select 0;
private _entry = _task select 1;
private _units = [];
{
if (tolower(_id) in (_x getVariable ["FHQ_tt_UnitTasks", []])) then {
_units = _units + [_x];
};
} foreach _playable;
if (count _units != 0) then {
([_units] + [_entry]) call FHQ_fnc_ttAddTasks;
};
};
/* FHQ_fnc_ttIsTaskCompleted
*
* Check whether a task is canceled, successful or failed. Like all query functions, this can be called
* on any client as well as the server.
*
* _result = [_task] call FHQ_fnc_ttIsTaskCompleted;
*
* _task: Name of the task.
*
* Returns true or false if the task's state is considered a "completed" state, i.e.
* succeeded, canceled, or failed
*
*/
private "_result";
_result = (tolower(_this call FHQ_fnc_ttGetTaskState) in ["succeeded", "canceled", "failed"]);
_result;
/* FHQ_fnc_ttIsTaskSuccessful
*
* Check whether a task is ended successfully. This function can be called on the client as well as
* the server.
*
* _result = [_taskName] call FHQ_fnc_ttIsTaskSuccessful;
*/
private "_result";
_result = (tolower(_this call FHQ_fnc_ttGetTaskState) == "succeeded");
_result;
private ["_unitTaskList", "_name", "_res", "_current", "_i", "_checkName"];
_unitTaskList = [_this, 0] call BIS_fnc_param;
_name = [_this, 1] call BIS_fnc_param;
_res = -1;
for "_i" from 0 to count _unitTaskList - 1 do
{
_current = _unitTaskList select _i;
if (count _current == 2) then {
_checkName = (_current select 1) call FHQ_fnc_ttiGetTaskName; // Server list
} else {
_checkName = (_current select 2); // Client list
};
if (_checkName == _name) exitWith {
_res = _i;
};
} foreach _unitTaskList;
_res;/* Eden compatible mission briefing
* This function is called like
* [_unit, _value] call FHQ_fnc_ttiUnitBriefing;
*
* _unit is the unit that should receive the briefing, and _value
* denotes the briefing itself.
*/
private _unit = param [0, objNull];
private _value = param [1, ""];
_unit setVariable ["FHQ_tt_UnitBriefing", _value];/* Eden compatible mission tasks
* This function is called like
* [_unit, _value] call FHQ_fnc_ttiUnitTasks;
*
* _unit is the unit that should receive the briefing, and _value
* denotes the briefing itself.
*/
private _unit = param [0, objNull];
private _value = param [1, ""];
_unit setVariable ["FHQ_tt_UnitTasks", _value];private ["_i", "_idx", "_current", "_record", "_filter", "_units", "_x", "_briefing", "_list", "_existing", "_notify"];
_briefing = _this;
_notify = false;
{
_list = [];
for [{_i = 0}, {_i < count _briefing}, {_i = _i + 1}] do {
_current = _briefing select _i; // [_filter, [_section, _subject, _text]]
_filter = _current select 0;
_units = [_filter] call FHQ_fnc_ttiFilterUnits;
if (_x in _units) then {
_record = _current select 1;
_list = _list + [[_record select 0, [_record select 1, _record select 2]]];
};
};
/* Now add them in reverse order */
_existing = _x getVariable ["FHQ_TTI_ClientBriefingList", []];
for [{_i = count _list - 1}, {_i >= 0}, {_i = _i - 1}] do {
_current = _list select _i;
if (!([_existing, _current] call FHQ_fnc_ttiHasBriefingEntry)) then {
/* Check if the section exists and create it if necessary, then add the record */
if (!(_x diarySubjectExists (_current select 0))) then {
_x createDiarySubject [_current select 0, _current select 0];
};
_x createDiaryRecord [_current select 0, [(_current select 1) select 0, (_current select 1) select 1]];
if (player == _x && !FHQ_TTI_supressTaskHints) then
{
private "_title";
_title = _current select 0;
if (_title == "Diary") then {
_title = "Briefing";
};
[format ["%1/%2", _title, (_current select 1) select 0], "newbriefing"] call FHQ_fnc_ttTaskHint;
};
};
};
_x setVariable ["FHQ_TTI_ClientBriefingList", _list]; // FIXME ?
} foreach (if (isMultiplayer) then {playableUnits+FHQ_TTI_extraUnits} else {switchableUnits});private _tasks = _this;
private _i = 0;
{
private _list = [];
for [{_i = 0}, {_i < count _tasks}, {_i = _i + 1}] do {
private _current = _tasks select _i; // [_filter, [_section, _subject, _text]]
private _filter = _current select 0;
private _units = [_filter] call FHQ_fnc_ttiFilterUnits;
if (_x in _units) then {
//_list = _list + [_current select 1];
_list pushBack (_current select 1);
};
};
/* Now add them in reverse order */
private _existing = _x getVariable ["FHQ_TTI_ClientTaskList", []];
for [{_i = 0}, {_i < count _list}, {_i = _i + 1}] do {
private _current = _list select _i;
_existing = [_current, _existing, _x] call FHQ_fnc_ttiCreateOrUpdateTask;
};
_x setVariable ["FHQ_TTI_ClientTaskList", _existing];
} foreach (if (isMultiplayer) then {playableUnits+FHQ_TTI_extraUnits} else {switchableUnits});/* FHQ_fnc_ttSetTaskState
*
* Set the state of the specified task to the specified state, and alert the player
* if necessary.
*
* NOTE: Server callable only. Calling this on a client does not have an effect
*
* Usage:
* [_task, _state] call FHQ_fnc_ttSetTaskState;
* _task: the task name defined with FHQ_fnc_ttAddTasks
* _state: One of "succeeded", "failed", "canceled", "created", "assigned"
*
*/
#define FHQ_TTIF_TASKSTATE 5
private ["_name", "_state", "_idx", "_record", "_entry"];
if (isServer) then {
_name = [_this, 0, "", [""]] call BIS_fnc_param;
_state = [_this, 1, "", [""]] call BIS_fnc_param;
_idx = [FHQ_TTI_TaskList, _name] call FHQ_fnc_ttiTaskExists;
if (_idx != -1) then {
_entry = FHQ_TTI_TaskList select _idx;
_record = _entry select 1;
_record set [FHQ_TTIF_TASKSTATE, _state];
_entry set [1, _record];
FHQ_TTI_TaskList set [_idx, _entry];
publicVariable "FHQ_TTI_TaskList";
if (!isDedicated) then {
FHQ_TTI_TaskList call FHQ_fnc_ttiUpdateTaskList;
};
};
};
/* FHQ_fnc_ttSetTaskStateAndNext
*
* Set the state of a given task to the given state, and select another task from a list of
* tasks which is not finished yet. The first task found will be set to assigned and a message will
* be shown to the player, if enabled.
*
* NOTE: Can only be called on the server
*
* Usage:
* [_task1, _state, _task2, ...] call FHQ_fnc_ttSetTaskStateAndNext;
*
* _task1: The task to set to _state
* _state: The state for _task1
* _task2 and following: The tasks are checked in turn for completion, and the first one not
* completed will be assigned.
*
* Example:
*
* ["taskGetVodka", "succeeded", "taskDrink", "taskBeMerry"] call FHQ_fnc_ttSetTaskStateAndNext;
*/
private "_i";
[_this select 0, _this select 1] call FHQ_fnc_ttSetTaskState;
for [ {_i = 2}, {_i < count _this}, {_i = _i + 1} ] do
{
if (!([_this select _i] call FHQ_fnc_ttIsTaskCompleted)) exitWith
{
[_this select _i, "assigned"] call FHQ_fnc_ttSetTaskState;
};
};
/* Arma 3 */
private ["_notifyTemplate", "_desc", "_state"];
_desc = [_this, 0, ""] call BIS_fnc_param;
_state = [_this, 1, "created"] call BIS_fnc_param;
private _type = [_this, 2, ""] call BIS_fnc_param;
_notifyTemplate = "TaskCreated";
switch (tolower _state) do
{
case "created":
{
_notifyTemplate = "TaskCreated";
};
case "assigned":
{
_notifyTemplate = "TaskAssigned";
};
case "succeeded":
{
_notifyTemplate = "TaskSucceeded";
};
case "canceled":
{
_notifyTemplate = "TaskCanceled";
};
case "cancelled":
{
_notifyTemplate = "TaskCanceled";
};
case "failed":
{
_notifyTemplate = "TaskFailed";
};
case "newbriefing":
{
_notifyTemplate = "TaskAssigned";
if (isClass (missionConfigFile >> "CfgNotifications" >> "NewBriefing")) then {
_notifyTemplate = "NewBriefing";
};
};
};
if (count _type != 0) then {
_notifyTemplate = _notifyTemplate + "Icon";
if (isClass (missionConfigFile >> "CfgTaskTypes" >> _type)) then {
_type = getText (missionConfigFile >> "CfgTaskTypes" >> _type >> "icon");
} else {
_type = getText(configFile >> "CfgTaskTypes" >> _type >> "icon");
};
};
[_notifyTemplate, [_type, _desc]] call BIS_fnc_showNotification;/* Update an aspect of the weather effect
*
* Parameters:
* param [0] - fsm (from FHQ_fnc_weatherEffect)
* param [1] - Name (Snow, Fog, Sand, snowInterval, fogInterval, sandInterval)
* param [2] - depends on param [1]
*
* Example: Cancel snow
* [_fsm, "Snow", {false}] call FHQ_fnc_setWeatherEffect;
*
*/
/* Note: Variables are global, so _fsm is actually ignored. Reserved for future use */
private _name = param [1];
private _param = param [2, 0, [{true}, 0, []]];
if ((tolower _name) in ["snow", "fog", "sand"]) then {
_param call compile format ["FHQ_handle%1 = _this;", _name];
};
if ((tolower _name) == "snowInterval") then {
waitUntil {!isNil "FHQ_Snow"};
FHQ_Snow setDropInterval _param;
};
if ((tolower _name) == "fogInterval") then {
waitUntil {!isNil "FHQ_GrndFog"};
FHQ_GrndFog setDropInterval _param;
};
if ((tolower _name) == "fogSize") then {
waitUntil {!isNil "FHQ_GrndFog"};
FHQ_FogParamArray set [11, _param];
FHQ_GrndFog setParticleParams FHQ_FogParamArray;
};
if ((tolower _name) == "sandInterval") then {
waitUntil {!isNil "FHQ_Sand"};
FHQ_Sand setDropInterval _param;
};
if ((tolower _name) == "sandSize") then {
waitUntil {!isNil "FHQ_Sand"};
FHQ_SandParamArray set [11, _param];
FHQ_Sand setParticleParams FHQ_SandParamArray;
};
/*
[
["\A3\data_f\cl_basic.p3d", 1, 0, 1],
"",
"Billboard",
1,
10,
[0, 0, 0],
wind,
1,
1.275,
1,
0,
[4],
[ [1.0 * _fogBrightness, 1.0 * _fogBrightness, 1.0 * _fogBrightness, 0], [1.0 * _fogBrightness, 1.0 * _fogBrightness, 1.0 * _fogBrightness, 0.04], [1.0 * _fogBrightness, 1.0 * _fogBrightness, 1.0 * _fogBrightness, 0.02] ],
[1000],
[["\A3\data_f\cl_basic.p3d", 1, 0, 1], "",
"Billboard",
1,
10,
[0, 0, 0],
wind,
1, 1.275, 1, 0,
[4],
[
[1.0 * _fogBrightness, 1.0 * _fogBrightness, 1.0 * _fogBrightness, 0],
[1.0 * _fogBrightness, 1.0 * _fogBrightness, 1.0 * _fogBrightness, 0.04],
[1.0 * _fogBrightness, 1.0 * _fogBrightness, 1.0 * _fogBrightness, 0.02]
],
[1000], 1, 0, "", "", ""];
1,
0,
"",
"",
""];
*//* Create the weather effect fsm.
* This function must be called on each client. The parameter array is automatically
* passed on to the FSM.
*
* Parameters:
* param [0] - Object that the particle system will be attached to,
* objNull for camera
*
* param [1] - List of effects and their selectors
*
*
* Selectors work like this:
* Each entry in the effect list is an array of ["name", {code}].
* Name is either snow, fog, sand, wind.
* Code is the code that evaluates whether the effect is shown or not. Must return
* true or false. If always shown, code should be {true}
*
* Returns:
* The FSM handle
*
* Example: Let it snow, let it snow, let it snow
*
* [
* objNull,
* [["snow", {true}]]
* ] call FHQ_fnc_weatherEffect;
*
*/
if (isNil "FHQ_EffectsFSM") then {
FHQ_EffectsFSM = _this execFSM "functions\weatherEffects.fsm";
};
FHQ_EffectsFSM;
/*
// Author: Stagwine
// File: fnc_explosion.sqf
//
// Simple function to spawn explosions and smoke, at the target
// Params: explosiontype (11 = random), position (object), spawnAlt
// With some warheads you must have enough altitude to get the desired effect
*/
if !(isServer) exitwith{}; // this really, really does not need to run on a client...
private ["_exp", "_target","_warhead", "_burstalt","_type","_manualDetonation"];
_type = [_this, 0,0,[0]] call BIS_fnc_param;
_target = [_this, 1, objnull] call BIS_fnc_param;
_burstAlt = [_this, 2,0,[0]] call BIS_fnc_param;
_manualDetonation = 0;
if (_type == 11 || _type == 10) then {_manualDetonation = 1;};
switch (_type) do {
case 0: {
_exp = "Smokeshell"; // Cases 0-1 are smokeshells
};
case 1: {
_exp = "Smokeshellred";
};
case 2: {
_exp = "Bo_GBU12_LGB"; // Cases 2-3 are flight bombs
};
case 3: {
_exp = "Bo_Mk82";
};
case 4: {
_exp = "Sh_120mm_HE"; // Cases 4-7 are generic explosions
};
case 5: {
_exp = "R_230mm_HE";
};
case 6: {
_exp = "Sh_155mm_AMOS";
};
case 7: {
_exp = "GrenadeHand";
};
case 8: {
_exp = "Cluster_155mm_AMOS"; // Cluster munition
};
case 9: {
_exp = "Helicopterexplobig";
};
case 10: {
_exp = "ATMine_Range_ammo";
};
case 11: {
_exp = "SatchelCharge_Remote_ammo"; // doesnt work this way
};
case 12: {
// Random array
_exp = ["R_230mm_HE","Sh_155mm_AMOS","Sh_125mm_HE","Bo_Mk82","Bo_GBU12_LGB","Helicopterexplobig"] call BIS_fnc_selectRandom;
};
default {
_exp = "Bo_GBU12_LGB";
};
};
_warhead = createVehicle [_exp, [(getPosASL _target select 0)+1, (getPosASL _target select 1)+1, _burstAlt], [],0, "NONE"];
[_warhead, -90, 0] call BIS_fnc_setPitchBank;
_warhead setVelocity [0,0,-30];
if (_manualDetonation == 1) then {_warhead setdamage 1;};
true // Returning a general value just to be sure./*%FSM*/
/*%FSM*/
/*
item0[] = {"Start",0,4346,-900.000000,-1790.000000,-800.000000,-1740.000000,0.000000,"Start"};
item1[] = {"_",8,218,-860.000000,-1725.000000,-840.000000,-1715.000000,0.000000,""};
item2[] = {"no_display",4,218,-760.000000,-1785.000000,-700.000000,-1745.000000,0.000000,"no" \n "display"};
item3[] = {"Not_a_client",1,250,-680.000000,-1785.000000,-610.000000,-1745.000000,0.000000,"Not a client"};
item4[] = {"_",8,218,-1025.000000,-1640.000000,-1005.000000,-1630.000000,0.000000,""};
item5[] = {"Check_new",2,250,-880.000000,-1650.000000,-820.000000,-1620.000000,0.000000,"Check" \n "new"};
item6[] = {"Update",2,250,-1045.000000,-1700.000000,-985.000000,-1665.000000,0.000000,"Update"};
item7[] = {"fog",4,218,-875.000000,-1595.000000,-825.000000,-1565.000000,1.000000,"fog"};
item8[] = {"create_fog",2,250,-1045.000000,-1595.000000,-985.000000,-1565.000000,0.000000,"create" \n "fog"};
item9[] = {"__fog",4,218,-875.000000,-1540.000000,-825.000000,-1510.000000,1.000000,"!fog"};
item10[] = {"delete_fog",2,250,-1045.000000,-1540.000000,-985.000000,-1510.000000,0.000000,"delete" \n "fog"};
item11[] = {"Delay",4,218,-950.000000,-1695.000000,-900.000000,-1670.000000,0.000000,"Delay"};
item12[] = {"",7,210,-854.000000,-1686.500000,-846.000000,-1678.500000,0.000000,""};
item13[] = {"snow",4,218,-875.000000,-1490.000000,-825.000000,-1460.000000,1.000000,"snow"};
item14[] = {"create_snow",2,250,-1045.000000,-1490.000000,-985.000000,-1460.000000,0.000000,"create" \n "snow"};
item15[] = {"__snow",4,218,-875.000000,-1440.000000,-825.000000,-1410.000000,1.000000,"!snow"};
item16[] = {"delete_snow",2,250,-1045.000000,-1440.000000,-985.000000,-1410.000000,0.000000,"delete" \n "snow"};
item17[] = {"sand",4,218,-875.000000,-1385.000000,-825.000000,-1355.000000,1.000000,"sand"};
item18[] = {"create_sand",2,250,-1045.000000,-1385.000000,-985.000000,-1355.000000,0.000000,"create" \n "sand"};
item19[] = {"__sand",4,218,-875.000000,-1330.000000,-825.000000,-1300.000000,1.000000,"!sand"};
item20[] = {"delete_sand",2,250,-1045.000000,-1330.000000,-985.000000,-1300.000000,0.000000,"delete" \n "sand"};
link0[] = {0,1};
link1[] = {0,2};
link2[] = {1,5};
link3[] = {2,3};
link4[] = {4,6};
link5[] = {5,4};
link6[] = {5,7};
link7[] = {5,9};
link8[] = {5,13};
link9[] = {5,15};
link10[] = {5,17};
link11[] = {5,19};
link12[] = {6,11};
link13[] = {7,8};
link14[] = {8,4};
link15[] = {9,10};
link16[] = {10,4};
link17[] = {11,12};
link18[] = {12,5};
link19[] = {13,14};
link20[] = {14,4};
link21[] = {15,16};
link22[] = {16,4};
link23[] = {17,18};
link24[] = {18,4};
link25[] = {19,20};
link26[] = {20,4};
globals[] = {0.000000,0,0,0,0,640,480,1,491,6316128,1,-1180.770142,-607.158508,-1227.380127,-1786.636597,959,935,1};
window[] = {2,-1,-1,-1,-1,1014,78,1310,78,3,977};
*//*%FSM*/
class FSM
{
fsmName = "weatherEffect";
class States
{
/*%FSM*/
class Start
{
name = "Start";
itemno = 0;
init = /*%FSM*/"/* FSM controlling particle systems." \n
" * Parameters:" \n
" * param [0] - Object that the particle system will be attached to," \n
" * objNull for camera" \n
" *" \n
" * param [1] - List of effects and their selectors" \n
" *" \n
" *" \n
" * Selectors work like this:" \n
" * Each entry in the effect list is an array of [""name"", {code}]." \n
" * Name is either snow, fog or sand." \n
" * Code is the code that evaluates whether the effect is shown or not. Must return " \n
" * true or false. If always shown, code should be {true}" \n
" */" \n
"" \n
"_target = param [0, cameraOn, [objNull]];" \n
"_effects = param [1, [], [[]]];" \n
"" \n
"" \n
"FHQ_handleSnow = {false};" \n
"FHQ_handleFog = {false};" \n
"FHQ_handleSand = {false};" \n
"FHQ_handleWind = {false};" \n
"" \n
"{" \n
" _name = _x param [0];" \n
" _code = _x param [1, {true}, [{true}]];" \n
" " \n
" _code call compile format [""FHQ_handle%1 = _this;"", _name];" \n
"} forEach _effects;" \n
"" \n
"_effectList = [];" \n
"_lastWindTime = 0;"/*%FSM*/;
precondition = /*%FSM*/""/*%FSM*/;
class Links
{
/*%FSM*/
class no_display
{
itemno = 2;
priority = 0.000000;
to="Not_a_client";
precondition = /*%FSM*/""/*%FSM*/;
condition=/*%FSM*/"!hasInterface"/*%FSM*/;
action=/*%FSM*/""/*%FSM*/;
};
/*%FSM*/
/*%FSM*/
class _
{
itemno = 1;
priority = 0.000000;
to="Check_new";
precondition = /*%FSM*/""/*%FSM*/;
condition=/*%FSM*/""/*%FSM*/;
action=/*%FSM*/""/*%FSM*/;
};
/*%FSM*/
};
};
/*%FSM*/
/*%FSM*/
class Not_a_client
{
name = "Not_a_client";
itemno = 3;
init = /*%FSM*/""/*%FSM*/;
precondition = /*%FSM*/""/*%FSM*/;
class Links
{
};
};
/*%FSM*/
/*%FSM*/
class Check_new
{
name = "Check_new";
itemno = 5;
init = /*%FSM*/"_doSnow = call FHQ_handleSnow;" \n
"_doFog = call FHQ_handleFog;" \n
"_doSand = call FHQ_handleSand;" \n
"_doWind = call FHQ_handleWind;" \n
"" \n
"_currentTime = time;" \n
"" \n
"//diag_log format[""%1 %2 %3"", _doSnow, _doFog, _doSand];"/*%FSM*/;
precondition = /*%FSM*/""/*%FSM*/;
class Links
{
/*%FSM*/
class fog
{
itemno = 7;
priority = 1.000000;
to="create_fog";
precondition = /*%FSM*/""/*%FSM*/;
condition=/*%FSM*/"_doFog && isNil ""FHQ_GrndFog"""/*%FSM*/;
action=/*%FSM*/""/*%FSM*/;
};
/*%FSM*/
/*%FSM*/
class __fog
{
itemno = 9;
priority = 1.000000;
to="delete_fog";
precondition = /*%FSM*/""/*%FSM*/;
condition=/*%FSM*/"!_doFog && !isNil ""FHQ_GrndFog"""/*%FSM*/;
action=/*%FSM*/""/*%FSM*/;
};
/*%FSM*/
/*%FSM*/
class snow
{
itemno = 13;
priority = 1.000000;
to="create_snow";
precondition = /*%FSM*/""/*%FSM*/;
condition=/*%FSM*/"_doSnow && isNil ""FHQ_Snow"""/*%FSM*/;
action=/*%FSM*/""/*%FSM*/;
};
/*%FSM*/
/*%FSM*/
class __snow
{
itemno = 15;
priority = 1.000000;
to="delete_snow";
precondition = /*%FSM*/""/*%FSM*/;
condition=/*%FSM*/"!_doSnow && !isNil ""FHQ_Snow"""/*%FSM*/;
action=/*%FSM*/""/*%FSM*/;
};
/*%FSM*/
/*%FSM*/
class sand
{
itemno = 17;
priority = 1.000000;
to="create_sand";
precondition = /*%FSM*/""/*%FSM*/;
condition=/*%FSM*/"_doSand && isNil ""FHQ_Sand"""/*%FSM*/;
action=/*%FSM*/""/*%FSM*/;
};
/*%FSM*/
/*%FSM*/
class __sand
{
itemno = 19;
priority = 1.000000;
to="delete_sand";
precondition = /*%FSM*/""/*%FSM*/;
condition=/*%FSM*/"!_doSand && !isNil ""FHQ_Sand"""/*%FSM*/;
action=/*%FSM*/""/*%FSM*/;
};
/*%FSM*/
/*%FSM*/
class _
{
itemno = 4;
priority = 0.000000;
to="Update";
precondition = /*%FSM*/""/*%FSM*/;
condition=/*%FSM*/""/*%FSM*/;
action=/*%FSM*/""/*%FSM*/;
};
/*%FSM*/
};
};
/*%FSM*/
/*%FSM*/
class Update
{
name = "Update";
itemno = 6;
init = /*%FSM*/"_pos = getPos _target;" \n
"" \n
"{" \n
" _obj = _x param [0];" \n
" _ground = _x param [1];" \n
"" \n
" if (_ground) then {" \n
" _obj setPos [_pos select 0, _pos select 1, 0];" \n
" } else {" \n
" _obj setPos _pos;" \n
" }" \n
"} forEach _effectList;" \n
"" \n
"_currentTime = time;" \n
"" \n
"if (_doWind) then {" \n
" if (time - _lastWindTime > 3) then {" \n
" _lastWindTime = time;" \n
" playsound ([""wind1"", ""wind2"", ""wind3"", ""wind4"", ""wind5""] call BIS_fnc_selectRandom);" \n
" };" \n
"};"/*%FSM*/;
precondition = /*%FSM*/""/*%FSM*/;
class Links
{
/*%FSM*/
class Delay
{
itemno = 11;
priority = 0.000000;
to="Check_new";
precondition = /*%FSM*/""/*%FSM*/;
condition=/*%FSM*/"time - _currentTime > 0.1;"/*%FSM*/;
action=/*%FSM*/""/*%FSM*/;
};
/*%FSM*/
};
};
/*%FSM*/
/*%FSM*/
class create_fog
{
name = "create_fog";
itemno = 8;
init = /*%FSM*/"_pos = position _target;" \n
"" \n
"_brightness = 1.0;" \n
"FHQ_GrndFog = ""#particlesource"" createVehicleLocal _pos; " \n
"FHQ_GrndFog setParticleParams [" \n
" [""\a3\data_f\ParticleEffects\Universal\Universal.p3d"", " \n
" 16, 12, 13, 0], """", ""Billboard"", " \n
" 1, 10, " \n
" [0, 0, -6], wind, 1, 1.275, 1, 0, [4], " \n
" [[_brightness, _brightness, _brightness, 0], " \n
" [_brightness, _brightness, _brightness, 0.04], " \n
" [1, 1, 1, 0]], [1000], 1, 0, """", """", """"];" \n
"FHQ_GrndFog setParticleRandom [3, [40, 40, 0], [0, 0, 0], 2, 0.5, [0, 0, 0, 0.1], 0, 0];" \n
"FHQ_GrndFog setParticleCircle [0.1, [0, 0, 0]];" \n
"FHQ_GrndFog setDropInterval 0.025;" \n
"" \n
"_effectList = _effectList + [[FHQ_GrndFog, true]];"/*%FSM*/;
precondition = /*%FSM*/""/*%FSM*/;
class Links
{
/*%FSM*/
class _
{
itemno = 4;
priority = 0.000000;
to="Update";
precondition = /*%FSM*/""/*%FSM*/;
condition=/*%FSM*/""/*%FSM*/;
action=/*%FSM*/""/*%FSM*/;
};
/*%FSM*/
};
};
/*%FSM*/
/*%FSM*/
class delete_fog
{
name = "delete_fog";
itemno = 10;
init = /*%FSM*/"_effectList = _effectList - [[FHQ_GrndFog, true]];" \n
"" \n
"deleteVehicle FHQ_GrndFog;" \n
"FHQ_GrndFog = nil;"/*%FSM*/;
precondition = /*%FSM*/""/*%FSM*/;
class Links
{
/*%FSM*/
class _
{
itemno = 4;
priority = 0.000000;
to="Update";
precondition = /*%FSM*/""/*%FSM*/;
condition=/*%FSM*/""/*%FSM*/;
action=/*%FSM*/""/*%FSM*/;
};
/*%FSM*/
};
};
/*%FSM*/
/*%FSM*/
class create_snow
{
name = "create_snow";
itemno = 14;
init = /*%FSM*/"_pos = position _target;" \n
"" \n
"FHQ_Snow = ""#particlesource"" createVehicleLocal _pos; " \n
"FHQ_Snow setParticleParams [" \n
" [""\a3\data_f\ParticleEffects\Universal\Universal.p3d"", 16, 12, 8, 1], """"," \n
" ""Billboard"", 1, 4, [0,0,0], wind, 1, 0.000001, 0, 1.4," \n
" [0.05,0.05], [[1,1,1,1]], [0,1], 0.2, 1.2," \n
" """", """", """"" \n
"];" \n
"FHQ_Snow setParticleRandom [0, [10, 10, 7], [0, 0, 0], 0, 0.01, [0, 0, 0, 0.1], 0, 0];" \n
"FHQ_Snow setParticleCircle [0.0, [0, 0, 0]];" \n
"FHQ_Snow setDropInterval 0.001;" \n
"" \n
"_effectList = _effectList + [[FHQ_Snow, false]];"/*%FSM*/;
precondition = /*%FSM*/""/*%FSM*/;
class Links
{
/*%FSM*/
class _
{
itemno = 4;
priority = 0.000000;
to="Update";
precondition = /*%FSM*/""/*%FSM*/;
condition=/*%FSM*/""/*%FSM*/;
action=/*%FSM*/""/*%FSM*/;
};
/*%FSM*/
};
};
/*%FSM*/
/*%FSM*/
class delete_snow
{
name = "delete_snow";
itemno = 16;
init = /*%FSM*/"_effectList = _effectList - [[FHQ_Snow, false]];" \n
"" \n
"deleteVehicle FHQ_Snow;" \n
"FHQ_Snow = nil;"/*%FSM*/;
precondition = /*%FSM*/""/*%FSM*/;
class Links
{
/*%FSM*/
class _
{
itemno = 4;
priority = 0.000000;
to="Update";
precondition = /*%FSM*/""/*%FSM*/;
condition=/*%FSM*/""/*%FSM*/;
action=/*%FSM*/""/*%FSM*/;
};
/*%FSM*/
};
};
/*%FSM*/
/*%FSM*/
class create_sand
{
name = "create_sand";
itemno = 18;
init = /*%FSM*/"_pos = position _target;" \n
"" \n
"_brightness = 1.0;" \n
"" \n
"_color = [1.0 * _brightness, 0.9 * _brightness, 0.8 * _brightness];" \n
"" \n
"FHQ_Sand = ""#particlesource"" createVehicleLocal _pos; " \n
"FHQ_Sand setParticleParams [[""A3\Data_F\ParticleEffects\Universal\universal.p3d"", 16, 12, 8, 0], """", ""Billboard"", 1, " \n
" 2, [0, 0, 0], wind, 1, 1.275, 1, 0, [5], " \n
" [" \n
" [1.0 * _brightness, 0.9 * _brightness, 0.8 * _brightness, 0]," \n
" [1.0 * _brightness, 0.9 * _brightness, 0.8 * _brightness, 0.2]," \n
" [1.0 * _brightness, 0.9 * _brightness, 0.8 * _brightness, 0]" \n
" ]," \n
" [1000], 1, 0, """", """", """"];" \n
"FHQ_Sand setParticleRandom [3, [10, 10, 0], [0, 0, 0], 1, 0, [0, 0, 0, 0.05], 0, 0];" \n
"FHQ_Sand setParticleCircle [0.1, [0, 0, 0]];" \n
"FHQ_Sand setDropInterval 0.07;" \n
"" \n
"" \n
"_effectList = _effectList + [[FHQ_Sand, true]];"/*%FSM*/;
precondition = /*%FSM*/""/*%FSM*/;
class Links
{
/*%FSM*/
class _
{
itemno = 4;
priority = 0.000000;
to="Update";
precondition = /*%FSM*/""/*%FSM*/;
condition=/*%FSM*/""/*%FSM*/;
action=/*%FSM*/""/*%FSM*/;
};
/*%FSM*/
};
};
/*%FSM*/
/*%FSM*/
class delete_sand
{
name = "delete_sand";
itemno = 20;
init = /*%FSM*/"_effectList = _effectList - [[FHQ_Sand, true]];" \n
"" \n
"deleteVehicle FHQ_Sand;" \n
"FHQ_Sand = nil;"/*%FSM*/;
precondition = /*%FSM*/""/*%FSM*/;
class Links
{
/*%FSM*/
class _
{
itemno = 4;
priority = 0.000000;
to="Update";
precondition = /*%FSM*/""/*%FSM*/;
condition=/*%FSM*/""/*%FSM*/;
action=/*%FSM*/""/*%FSM*/;
};
/*%FSM*/
};
};
/*%FSM*/
};
initState="Start";
finalStates[] =
{
"Not_a_client",
};
};
/*%FSM*/_Target = _this select 0;
if (
(Goggles _Target in ["TAC_SF10","H_CrewHelmetHeli_B","KA_MCU","CPE_MK50","skn_m04_gas_mask_bare_dry","skn_m04_gas_mask_blk","skn_m04_gas_mask_blu","skn_m04_gas_mask_gre","skn_m50_gas_mask","skn_m50_gas_mask_hood","skn_m50_gas_mask_hood_wd","skn_s10_balaclava_blue_dry","skn_s10_balaclava_red_dry","skn_s10_balaclava_white_dry","skn_s10_balaclava_yellow_dry","G_RegulatorMask_F","G_AirPurifyingRespirator_01_F","G_AirPurifyingRespirator_02_sand_F","G_AirPurifyingRespirator_02_olive_F","G_AirPurifyingRespirator_02_black_F"]) or
(headgear _Target in ["TAC_SF10","H_CrewHelmetHeli_B","KA_MCU","CPE_MK50","skn_m04_gas_mask_bare_dry","skn_m04_gas_mask_blk","skn_m04_gas_mask_blu","skn_m04_gas_mask_gre","skn_m50_gas_mask","skn_m50_gas_mask_hood","skn_m50_gas_mask_hood_wd","skn_s10_balaclava_blue_dry","skn_s10_balaclava_red_dry","skn_s10_balaclava_white_dry","skn_s10_balaclava_yellow_dry"])
) exitWith {};
if(!captive _Target AND !(headgear _Target == "H_CrewHelmetHeli_B") AND Alive _Target and !isplayer _target) then {
_Target setVariable ["Gased", 123, true];
_Target setskill ["courage",((_Target skill "courage") - random 1)];
[_Target, "ApanPercMstpSnonWnonDnon_ApanPpneMstpSnonWnonDnon"] remoteExec ["switchmove", 0];
sleep 0.6;
if (!captive _Target and alive _Target) then {[_Target, "AinvPknlMstpSlayWrflDnon_healed"] remoteExec ["switchmove", 0]};
sleep 5;
if (!captive _Target and alive _Target) then {[_Target, "AinvPknlMstpSlayWrflDnon_healed"] remoteExec ["switchmove", 0]};
sleep 5;
if (!captive _Target and alive _Target) then {[_Target, "AinvPknlMstpSlayWrflDnon_healed"] remoteExec ["switchmove", 0]};
sleep 5;
if (!captive _Target and alive _Target) then {[_Target, "AinvPknlMstpSlayWrflDnon_healed"] remoteExec ["switchmove", 0]};
sleep 5;
if(!captive _Target AND Alive _Target) then {
[_Target, "ApanPercMstpSnonWnonDnon_ApanPpneMstpSnonWnonDnon"] remoteExec ["switchmove", 0];
sleep 1;
[_Target, ""] remoteExec ["switchmove", 0];
};
_Target setVariable ["Gased", nil];
};
if(!captive _Target AND !(headgear _Target == "H_CrewHelmetHeli_B") AND Alive _Target and isplayer _target) then {
_Target setVariable ["Gased", 123, true];
if (!captive _Target) then {[_Target, "ApanPercMstpSnonWnonDnon_ApanPpneMstpSnonWnonDnon"] remoteExec ["switchmove", 0]};
if (!captive _Target) then {[_Target, ""] remoteExec ["switchmove", 0]};
_Target setVariable ["Gased", nil];
};
// *** init.sqf ***
/*
Code in this file runs BOTH on SERVER and CLIENTS
Briefing, forceTracker, and certain parameters are ran here.
*/
// Mission start scripts
[] execVM "briefing.sqf"; // Briefing by task tracker
//fix ACE bullshit
waitUntil {!(call BIS_fnc_isLoading)};
sleep 3;
// toolkit mirror
if ("ToolKit" in (items player) AND isNil "MirrorAction" AND isNil "MirrorTablet") then {
_Target = player;
MirrorAction = [
_Target,
"Assemble Mirror",
"\a3\ui_f\data\IGUI\Cfg\holdactions\holdAction_unloadDevice_ca.paa",
"\a3\ui_f\data\IGUI\Cfg\holdactions\holdAction_unloadDevice_ca.paa",
"_this distance _target < 3",
"_caller distance _target < 3",
{}, // Code executed when action starts
{},
{
player execVM "Mirror.sqf";
}, // Code executed on completion
{}, // Code executed on interrupted
[], // Arguments passed to the scripts as _this select 3
2, // Action duration [s]
0, // Priority
false, // Remove on completion
false // Show in unconscious state
] call BIS_fnc_holdActionAdd;
};
if (!("ToolKit" in (items player)) AND !isNil "MirrorAction" or !isNil "MirrorTablet") then {
[ player,MirrorAction] call BIS_fnc_holdActionRemove;
MirrorAction = nil;
};
/*======================= initPlayerLocal --> MMF_core/defines/start/start_player --> "MMF_fnc_start_player" ==========================
this file establishes client nameSpace variables and begins various local effects
=========================================================================================================================================================*/
//params ["_player", "_didJIP"];
//[] call MMF_fnc_start_default; //default arrays-- required
/*======================= local effects ==========================
comment "//" to enable or disable features
configure as per comments
==================================================================================*/
//_player call MMF_fnc_handle_damage; //damage effects, **to disable call on objNull**
//[] call MMF_fnc_colorSpace; //dynamic color space
//_player call MMF_fnc_car_controls; //start radio on vehicle enter
//[_player, 100, 600] call MMF_fnc_start_random; //random location, area must be > 0 [caller, area, height]
//_player setVariable ["MMF_can_build", false]; //enable build menu (MP/SP)
/*======================= custom code block, scheduled begins at mission start -- "_this" is _player ==========================*/
//======================================================================SP start
//[
// [
// _player, //unit is a player
// "Command", //group ID
// [true, _player, 0, 300, [100, 1], "OFF"] //[enable base, base object, loot box #, loot area, [$, res], auto-crew]
// ] //base object may be static, unit, veh // auto-crew "OFF", "ON", "PER"
//] call MMF_fnc_start_player; //base services disabled in MP
// *** initServer.sqf ***
//
// Code and scripts in this file runs in mission start, and ONLY on server.
// Two slashes // denotes comment. If line is commented, it won't run.
// It can be handy to comment scripts out when editing mission.
// Alternate syntax is /* .... */, useful for multiple lines.
/*
Like
this
*/
/*
[] execVM basically starts a script. scripts\ indicates subfolder in mission folder.
*/
// Example: Script below is commented out, and won't run.
// [] execVM "scripts\myFancyTestScript.sqf";
// Lines below puts all units under Curator control
if (isServer) then {
[] spawn {
while {true} do {
{
_x addCuratorEditableObjects [allUnits, true];
_x addCuratorEditableObjects [vehicles, true];
_x addCuratorEditableObjects [allUnitsUAV, true];
_x addCuratorEditableObjects [allMines, true];
} forEach allCurators;
sleep 45;
};};
};
[]call MMF_fnc_start_custom; //default arrays-- required
//[objNull, 1, 0, true] call MMF_fnc_start_random; //random time
// debug / misc
missionNameSpace setVariable ["MMF_unitLimit", 80]; //nemesis unit limit
missionNameSpace setVariable ["MMF_drawPath", true]; //show nemesis path / created path
missionNameSpace setVariable ["MMF_drone_waves", false]; //nemesis drone IED waves
missionNameSpace setVariable ["MMF_call_monitor", false]; //show common call vars, function names, FPS and Scripts (WIP)
missionNameSpace setVariable ["MMF_mil_pop", true]; //add mil units to autopop (uses nemesis type)
missionNameSpace setVariable ["MMF_dynamic_sim", true]; //do dynamic simulation (must be enabled in mission)
//scheduled--> begins at mission start
MMF_injector={
};
//center can be player, (allPlayers select 0), object, vehicle, trigger, not marker
[
(allplayers select 0), //object treated as center
["", "BLACK FADED", 0.001], //intro message, type, time (0.1 = 1 second)
[false, 1200, [], MMF_IND, [true, 500], false], //nemesis [enable, area, array, enemy, [killpnts, val], wounding]
false, //dynamic weather
[false, 3, 300], //[flaming wrecks, amount, area]
false //auto population
] call MMF_fnc_start_mission;
_onoff = [_this, 0, 0.95, [0]] call BIS_fnc_param;
_distance = [_this, 1, 1000, [0]] call BIS_fnc_param;
_marker = [_this, 2, getMarkerPos "lightsmarker", ["",[],objNull]] call BIS_fnc_param;
_types = ["Lamps_Base_F", "PowerLines_base_F","Land_LampDecor_F","Land_LampHalogen_F","Land_LampHarbour_F","Land_LampShabby_F","Land_NavigLight","Land_runway_edgelight","Land_PowerPoleWooden_L_F"];
for [{_i=0},{_i < (count _types)},{_i=_i+1}] do
{
_lamps = _marker nearObjects [_types select _i, _distance];
sleep 0.1;
{_x setDamage _onoff} forEach _lamps;
};
if (isNil "MirrorTablet") then{
if (!isPipEnabled) then {hintSilent "You need to enable PIP(Picture in Picture) to see in the tablet, check your video settings"};
MyMirrorRTT = (random 100);
MirrorTablet = "Land_Tablet_01_F" createVehicle (getPosATL player);
MirrorTablet attachTo [player, [0, 0.1, 0.2], "granat2"];
MirrorTablet setVectorDirAndUp [[0,0,1],[0,-1,0]];
MirrorCamera = "Land_HandyCam_F" createVehicle (getPosATL player);
MirrorCamera attachTo [player, [0, 0.2, 0.2], "granat2"];
MirrorCamera setdir 180;
MirrorTablettexture = format ["#(argb,512,512,1)r2t(%1,1)", MyMirrorRTT];
MirrorTablet setObjectTextureGlobal [0, MirrorTablettexture];
MirrorCameraCan = "Land_HandyCam_F" createVehicle (getPosATL player);
MirrorCameraCanTexture = format ["%1", MyMirrorRTT];
[MirrorCameraCan, ["Internal", "Back", MirrorCameraCanTexture]] remoteExec ["cameraEffect"];
MirrorCameraCan attachTo [player, [0, 0.4, 0.2], "granat2"];
MirrorCameraCan hideObjectGlobal true;
mirrorAction1 = player addaction ["Turn Forward",{MirrorCameraCan setdir 0;}];
player setUserActionText [mirrorAction1 , "Turn Foward", ""];
mirrorAction2 = player addaction ["Turn Right",{MirrorCameraCan setdir 90;}];
player setUserActionText [mirrorAction2 , "Turn Right", ""];
mirrorAction3 = player addaction ["Turn Left",{MirrorCameraCan setdir 270;}];
player setUserActionText [mirrorAction3 , "Turn Left", ""];
mirrorAction4 = player addaction ["Hide Mirror",{
[MirrorCameraCan, ["terminate", "Back", MirrorCameraCanTexture]] remoteExec ["cameraEffect"];
sleep 1;
{detach _x} forEach attachedObjects player;
{deleteVehicle _x} forEach [MirrorTablet,MirrorCamera,MirrorTablet,MirrorCameraCan];
{player removeAction _x} forEach [mirrorAction1,mirrorAction2,mirrorAction3,mirrorAction4];
mirrorAction1 = nil;
mirrorAction2 = nil;
mirrorAction3 = nil;
mirrorAction4 = nil;
MirrorTablet = nil;
}];
player setUserActionText [mirrorAction4 , "Hide Mirror", ""];
};
raP !
version 6 EditorData _ sourceName SWAT%20mission%20for%20unofficial%20nights addons a CUP_CAStructures_E_Misc_Misc_Lamp A3_Structures_F_Furniture A3_Props_F_Orange_Humanitarian_Garbage A3_Props_F_Enoch_Military_Decontamination A3_Characters_F_AoW A3_Weapons_F A3_Characters_F_Enoch_Facewear A3_Props_F_Enoch_Military_Camps A3_Soft_F_Gamma_Van_01 ace_refuel A3_Soft_F_Orange_Van_02 A3_Structures_F_Civ_Constructions ace_cargo ace_dragging A3_Structures_F_EPA_Items_Medical A3_Props_F_Orange_Humanitarian_Camps A3_Structures_F_Items_Electronics A3_Structures_F_Heli_Items_Electronics A3_Props_F_Orange_Humanitarian_Supplies A3_Air_F_Orange_UAV_06 A3_Supplies_F_Orange_Ammoboxes A3_Structures_F_System A3_Props_F_Orange_Furniture CUP_A1_EditorObjects CUP_Editor_Structures_Config CUP_CAStructures_E_Misc_Misc_Interier A3_Structures_F_Heli_Furniture A3_Structures_F_Civ_Camping A3_Props_F_Enoch_Industrial_Supplies A3_Structures_F_Civ_Garbage A3_Structures_F_EPA_Items_Tools A3_Structures_F_EPA_Items_Food A3_Structures_F_Heli_Items_Food A3_Structures_F_Items_Food A3_Structures_F_Civ_Dead A3_Structures_F_EPB_Items_Luggage A3_Structures_F_Heli_Ind_Machines CUP_Misc3_Config A3_Props_F_Tank_Military_TankAcc A3_Structures_F_Items_Documents A3_Structures_F_Items_Stationery ace_realisticnames A3_Structures_F_Heli_Items_Sport A3_Structures_F_Items_Tools A3_Modules_F A3_Soft_F_Exp_Offroad_02 A3_Weapons_F_Explosives A3_Misc_F_Helpers A3_Structures_F_Wrecks A3_Structures_F_Enoch_Industrial_Materials A3_Characters_F A3_Modules_F_Curator_Mines A3_Characters_F_Exp A3_Props_F_Enoch_Military_Equipment A3_Structures_F_Items_Gadgets A3_Props_F_Orange_Items_Decorative A3_Characters_F_Exp_Civil A3_Characters_F_Enoch ace_goggles A3_Modules_F_Curator_Curator A3_Ui_F A3_Structures_F_Enoch_Cultural_Cemeteries A3_Characters_F_Orange_Vests A3_Structures_F_Exp_Military_Pillboxes A3_Structures_F_Enoch_Infrastructure_Lamps A3_Structures_F_Civ_Lamps A3_Modules_F_Curator_Lightning A3_Data_F_Exp_A_Virtual A3_Data_F_Curator_Virtual A3_Characters_F_Orange A3_Soft_F_Exp_Offroad_01 A3_Structures_F_Items_Valuables A3_Weapons_F_Exp_Rifles_SPAR_01 cba_jr A3_Weapons_F_Exp ace_ballistics A3_Weapons_F_Pistols_P07 ace_smallarms ace_optics A3_Characters_F_Exp_Headgear A3_Weapons_F_Items ace_medical_engine ace_medical_treatment A3_Characters_F_Exp_Vests ace_flashlights ace_explosives A3_Weapons_F_Orange A3_Weapons_F_Mark_LongRangeRifles_DMR_03 ace_scopes A3_Weapons_F_Acc ace_fcs A3_Weapons_F_Exp_Rifles_AKM A3_Characters_F_Oldman_Headgear A3_Soft_F_Enoch_Tractor_01 A3_Soft_F_Gamma_Truck_02 A3_Soft_F_Gamma_SUV_01 A3_Soft_F_Offroad_01 AddonsMetaData dlcs ORANGE Enoch Expansion Contact Heli Tank Curator Mark Oldman randomSeed ScenarioData {) CustomAttributes ) Mission 3 !
moveGridStep ?angleGridStep
>scaleGridStep ?autoGroupingDist Atoggles mods 3denEnhanced ItemIDProvider ( MarkerIDProvider ; LayerIndexProvider N Camera a nextID ` ; nextID
N nextID a pos ELA-r/Edir d55?up d5?5?aside ? /;4 List {) 6items 5 Item0 P Item1 Item2 1 Item3 Item4 ` Item5 Item6 x Item7 Item8 Item9 Item10 ~ Item11 Item12 < Item13 Item14 i Item15 Item16 r Item17 Item18 Item19 Item20 Item21 U Item22 Item23 m Item24 Item25 r Item26 Item27 l Item28 Item29 Item30 ( Item31 Item32 Item33 Item34 ) Item35 Item36 ^! Item37 ! Item38 u" Item39 " Item40 # Item41 # Item42 K$ Item43 $ Item44 % Item45 % Item46 % Item47 Y&