briefing.sqf |` debriefing.hpp ^5 description.ext y` fhq_tasktracker.hpp ] functions\barrage_generic.sqf ]
functions\fhq_ambience.hpp ]K functions\fhq_common.hpp ]. functions\fhq_forcetracker.hpp ] functions\fhq_forcetracker\fn_forceTrackAdd.sqf ]I functions\fhq_forcetracker\fn_forceTrackInit.sqf ] functions\fhq_forcetracker\fn_forceTrackOnFrame.sqf ] functions\fhq_forcetracker\fn_forceTrackRemove.sqf ] functions\fhq_forcetracker\fn_forceTrackSetDelay.sqf ]L functions\fhq_forcetracker\fn_forceTrackStart.sqf ] functions\fhq_forcetracker\fn_forceTrackStop.sqf ] functions\fhq_forcetracker\fn_forceTrackUpdateSingle.sqf ] functions\fhq_misc.hpp ]
functions\fhq_tasktracker.hpp ] functions\fhq_tasktracker\fn_ttAddBriefing.sqf ]w functions\fhq_tasktracker\fn_ttAddTasks.sqf ] functions\fhq_tasktracker\fn_ttAreTasksCompleted.sqf ] functions\fhq_tasktracker\fn_ttAreTasksSuccessful.sqf ] functions\fhq_tasktracker\fn_ttGetAllTasksWithState.sqf ]G functions\fhq_tasktracker\fn_ttGetTaskState.sqf ] functions\fhq_tasktracker\fn_ttiAddBriefingEntry.sqf ]9 functions\fhq_tasktracker\fn_ttiCreateOrUpdateTask.sqf ]
functions\fhq_tasktracker\fn_ttiFilterUnits.sqf ]4 functions\fhq_tasktracker\fn_ttiGetTaskDesc.sqf ] functions\fhq_tasktracker\fn_ttiGetTaskId.sqf ] functions\fhq_tasktracker\fn_ttiGetTaskName.sqf ]m functions\fhq_tasktracker\fn_ttiGetTaskState.sqf ]. functions\fhq_tasktracker\fn_ttiGetTaskTarget.sqf ] functions\fhq_tasktracker\fn_ttiGetTaskTitle.sqf ] functions\fhq_tasktracker\fn_ttiGetTaskType.sqf ]C functions\fhq_tasktracker\fn_ttiGetTaskWp.sqf ] functions\fhq_tasktracker\fn_ttiHasBriefingEntry.sqf ] functions\fhq_tasktracker\fn_ttiInit.sqf ]Y functions\fhq_tasktracker\fn_ttiIsFilter.sqf ] functions\fhq_tasktracker\fn_ttiIsTaskState.sqf ] functions\fhq_tasktracker\fn_ttiMissionBriefing.sqf ]) functions\fhq_tasktracker\fn_ttiMissionTasks.sqf ], functions\fhq_tasktracker\fn_ttiPostInit.sqf ] functions\fhq_tasktracker\fn_ttIsTaskCompleted.sqf ] functions\fhq_tasktracker\fn_ttIsTaskSuccessful.sqf ]L functions\fhq_tasktracker\fn_ttiTaskExists.sqf ]Q functions\fhq_tasktracker\fn_ttiUnitBriefing.sqf ]g functions\fhq_tasktracker\fn_ttiUnitTasks.sqf ]^ functions\fhq_tasktracker\fn_ttiUpdateBriefingList.sqf ]M functions\fhq_tasktracker\fn_ttiUpdateTaskList.sqf ] functions\fhq_tasktracker\fn_ttSetTaskState.sqf ]x functions\fhq_tasktracker\fn_ttSetTaskStateAndNext.sqf ]$ functions\fhq_tasktracker\fn_ttTaskHint.sqf ] functions\fn_setWeatherEffect.sqf ] functions\fn_weatherEffect.sqf ] functions\fnc_explosion.sqf ]e functions\weatherEffects.fsm ]i init.sqf _ initServer.sqf ~8] mission.sqm ra missionVariables.sqf !x`- parameters.hpp ]C readMe.txt A] sounds.hpp ^ stt.jpg |` weatherEffects.fsm ]r /*
Briefing
file: briefing.sqf
FHQ Task tracker
Biggest problem and cause for briefing to display error is missing or extra ,;]({ and above all, ".
Use ' if you have to use quotation mark
indicates line break
Task tracker has multiple features, but this will work in 90% of the missions just fine.
Keep safe copy somewhere, and edit carefully. It is very easy to get errors which are difficult to trace in start.
*/
// Don't mess with this section just yet.
_color = ["GUI", "BCG_RGB"] call BIS_fnc_displayColorGet;
_htmlcolor = _color call BIS_fnc_colorRGBAtoHTML;
#define clink(text, marker) "" + text + ""
// *** Situation ***
// {true} indicates
//
[{true},["Situation","
This cold war never ends.
We are tasked to destroy an armored vehicle and two ammo tucks, hit them in their front lines.
"],
// "+ 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","
One team will start "+ clink("here", "here")+".
"],
["Important Notes","
Three of you have wire cutter tool incase you want to .. you know. Cut fences..ACE interaction.
Blow up the BMP at the checkpoint and the Two ammo truck at the Supply base.
--------------------------------
"],
////////////////////////////////////////////////
/////////// *** 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.
"]] 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},["taskblowup","
Blow up the two ammo trucks at Supply base. Once done, exfil
","Destroy ammo trucks","","destroy"]] 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 = "A day to remember";
description = "Well Done";
};
class Lose
{
title = "Mission Failed";
subtitle = "Damn People";
description = "Win for the bad people";
};
/*
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 = "Demo Play";
OnLoadMission = "hit and run";
loadscreen = "stt.jpg";
enableDebugConsole = 1;
class Header
{
gameType = Coop;
minPlayers = 1;
maxPlayers = 20;
};
class CfgFunctions
{
#include "functions\fhq_tasktracker.hpp"
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"
};
/* 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*/// *** 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
// *** 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;
};};
};
raP
version 6 EditorData 8 sourceName third%20mission%20GM addons 2 gm_characters_gc_characters gm_vehicles_land_wheeled_btr60_gc_army_btr60 gm_vehicles_land_tracked_bmp1_gc_army_bmp1 gm_vehicles_land_wheeled_p601_gc_army_p601 gm_structures_euro_80 gm_vehicles_land_wheeled_ural4320_gc_army_ural4320 gm_vehicles_land_wheeled_ural375d_gc_army_ural375d gm_weapons_ammoboxes A3_Structures_F_Items_Vessels ace_cargo ace_dragging A3_Structures_F_Civ_Constructions A3_Structures_F_Heli_Civ_Market A3_Modules_F A3_Structures_F_Civ_Market gm_vehicles_land_wheeled_brdm2_gc_army_brdm2 A3_Structures_F_EPA_Civ_Camping A3_Structures_F_Furniture ace_sitting cba_xeh A3_Structures_F_EPA_Items_Food A3_Props_F_Orange_Humanitarian_Supplies A3_Structures_F_Items_Food gm_characters_ge_characters gm_weapons_rifles_mp5 gm_weapons_attachments_optics_feroz24 gm_weapons_pistols_p1 gm_weapons_equipment_binoculars_ferod16 A3_Weapons_F gm_weapons_items_ge_items gm_weapons_throw gm_weapons_ammo ace_logistics_wirecutter gm_weapons_put gm_core_weapons ace_explosives gm_weapons_rifles_g3 gm_weapons_items ace_medical_treatment A3_Ui_F A3_Characters_F A3_Data_F_Exp_A_Virtual A3_Modules_F_Curator_Curator A3_Data_F_Curator_Virtual A3_Misc_F_Helpers A3_Structures_F_Civ_Camping A3_Props_F_Exp_Infrastructure_Railways gm_vehicles_land_wheeled_uaz469_gc_army_uaz469 CUP_Editor_Structures_Config cwr3_misc AddonsMetaData dlcs gm Heli Orange Expansion cwr3_dlc randomSeed 7 ScenarioData 3 CustomAttributes Mission " moveGridStep ?angleGridStep
>scaleGridStep ?autoGroupingDist Atoggles ItemIDProvider MarkerIDProvider LayerIndexProvider Camera % nextID nextID nextID % pos EEF: CEdir ;%S>up B?4>aside B> Rmv? List 3 ,items + Item0 Item1 (
Item2
Item3 Item4 * Item5 Item6 d
Item7 Item8 Item9 Item10 | Item11 Item12 s Item13 Item14 Item15 8 Item16 Item17 ! Item18 Item19 @ Item20 Item21 ` Item22 Item23 Item24
Item25 Item26 Item27 | Item28 Item29 i Item30 Item31 C Item32 Item33 7 Item34 Item35 Item36 Item37 5 Item38 Item39 : Item40 Item41 z Item42 3 className gm_characters_gc_characters name gm_characters_gc_characters author Global Mobilization url global-mobilization.com (
className gm_vehicles_land_wheeled_btr60_gc_army_btr60 name gm_vehicles_land_wheeled_btr60_gc_army_btr60 author Global Mobilization url global-mobilization.com
className gm_vehicles_land_tracked_bmp1_gc_army_bmp1 name gm_vehicles_land_tracked_bmp1_gc_army_bmp1 author Global Mobilization url global-mobilization.com className gm_vehicles_land_wheeled_p601_gc_army_p601 name gm_vehicles_land_wheeled_p601_gc_army_p601 author Global Mobilization url global-mobilization.com * className gm_structures_euro_80 name gm_structures_euro_80 author Global Mobilization url global-mobilization.com className gm_vehicles_land_wheeled_ural4320_gc_army_ural4320 name gm_vehicles_land_wheeled_ural4320_gc_army_ural4320 author Global Mobilization url global-mobilization.com d
className gm_vehicles_land_wheeled_ural375d_gc_army_ural375d name gm_vehicles_land_wheeled_ural375d_gc_army_ural375d author Global Mobilization url global-mobilization.com className gm_weapons_ammoboxes name gm_weapons_ammoboxes author Global Mobilization url global-mobilization.com className A3_Structures_F name Arma 3 - Buildings and Structures author Bohemia Interactive url https://www.arma3.com className ace_cargo name ACE3 - Cargo author ACE-Team url http://ace3mod.com/ | className ace_dragging name ACE3 - Dragging author ACE-Team url http://ace3mod.com/ className A3_Structures_F_Heli name Arma 3 Helicopters - Buildings and Structures author Bohemia Interactive url https://www.arma3.com s className A3_Modules_F name Arma 3 Alpha - Scripted Modules author Bohemia Interactive url https://www.arma3.com className gm_vehicles_land_wheeled_brdm2_gc_army_brdm2 name gm_vehicles_land_wheeled_brdm2_gc_army_brdm2 author Global Mobilization url global-mobilization.com className A3_Structures_F_EPA name Arma 3 Survive Episode - Buildings and Structures author Bohemia Interactive url https://www.arma3.com 8 className ace_sitting name ACE3 - Sitting author ACE-Team url http://ace3mod.com/ className A3_Characters_F name Arma 3 Alpha - Characters and Clothing author Bohemia Interactive url https://www.arma3.com ! className A3_Props_F_Orange name Arma 3 Orange - Decorative and Mission Objects author Bohemia Interactive url https://www.arma3.com className gm_characters_ge_characters name gm_characters_ge_characters author Global Mobilization url global-mobilization.com @ className gm_weapons_rifles_mp5 name gm_weapons_rifles_mp5 author Global Mobilization url global-mobilization.com className gm_weapons_attachments_optics_feroz24 name gm_weapons_attachments_optics_feroz24 author Global Mobilization url global-mobilization.com ` className gm_weapons_pistols_p1 name gm_weapons_pistols_p1 author Global Mobilization url global-mobilization.com className gm_weapons_equipment_binoculars_ferod16 name gm_weapons_equipment_binoculars_ferod16 author Global Mobilization url global-mobilization.com className A3_Weapons_F name Arma 3 Alpha - Weapons and Accessories author Bohemia Interactive url https://www.arma3.com
className gm_weapons_items_ge_items name gm_weapons_items_ge_items author Global Mobilization url global-mobilization.com className gm_weapons_throw name gm_weapons_throw author Global Mobilization url global-mobilization.com className gm_weapons_ammo name gm_weapons_ammo author Global Mobilization url global-mobilization.com | className ace_logistics_wirecutter name ACE3 - Logistics Wire Cutter author ACE-Team url http://ace3mod.com/ className gm_weapons_put name gm_weapons_put author Global Mobilization url global-mobilization.com i className gm_core_weapons name gm_core_weapons author Global Mobilization url global-mobilization.com className ace_explosives name ACE3 - Explosives author ACE-Team url http://ace3mod.com/ C className gm_weapons_rifles_g3 name gm_weapons_rifles_g3 author Global Mobilization url global-mobilization.com className gm_weapons_items name gm_weapons_items author Global Mobilization url global-mobilization.com 7 className ace_medical_treatment name ACE3 - Medical Treatment author ACE-Team url http://ace3mod.com/ className A3_Ui_F name Arma 3 - User Interface author Bohemia Interactive url https://www.arma3.com className A3_Data_F_Exp_A name Arma 3 Nexus Update - Main Configuration author Bohemia Interactive url https://www.arma3.com className A3_Modules_F_Curator name Arma 3 Zeus Update - Scripted Modules author Bohemia Interactive url https://www.arma3.com 5 className A3_Data_F_Curator name Arma 3 Zeus Update - Main Configuration author Bohemia Interactive url https://www.arma3.com className A3_Misc_F name Arma 3 - 3D Aids and Helpers author Bohemia Interactive url https://www.arma3.com : className A3_Props_F_Exp name Arma 3 Apex - Decorative and Mission Objects author Bohemia Interactive url https://www.arma3.com className gm_vehicles_land_wheeled_uaz469_gc_army_uaz469 name gm_vehicles_land_wheeled_uaz469_gc_army_uaz469 author Global Mobilization url global-mobilization.com z className CUP_Editor_Structures_Config name CUP_Editor_Structures_Config className cwr3_misc name cwr3_misc author CWR III Modification url http://cwr3.arma2.fr 3 author Benchmark Header X gameType Coop minPlayers maxPlayers Category0 Category1 ! " name Multiplayer Attribute0 nAttributes ! property RespawnTemplates expression true Value .! ! data >! ! type Y! value m! ! type ARRAY m! items Item0 ! ! data ! ! type ! value None ! type STRING ! name Scenario Attribute0 " nAttributes " property EnableDebugConsole expression true Value E" " data U" " type q" value ?" type SCALAR " Intel " Entities @$ Connections = overviewText Benchmark's. Hit and Run, BMP and Ammo trucks timeOfChanges DstartWeather ) >startFog _>startWind =startWaves =forecastWeather >forecastWind =forecastWaves =forecastLightnings =wavesForced windForced year month day hour minute startFogBase zCstartFogDecay B`e<forecastFogDecay B`e<@$ items Item0 =- Item1 3 Item2 H@ Item3 M Item4 gN Item5 tY Item6 1Z Item7 ][ Item8
e Item9 n Item10 Uo Item11 o Item12 p Item13 { Item14 | Item15 ?} Item16 } Item17 ~ Item18 5 Item19 Item20 y Item21 Item22 Item23 o Item24 Item25 Item26 U Item27 Item28 Item29 K Item30 Item31 Item32 1 Item33 Item34 Item35 ' Item36 Ɋ Item37 k Item38 Item39 Item40 a Item41 Item42 Item43 W Item44 Item45 Item46 = Item47 ߑ Item48 Item49 3 Item50 Փ Item51 w Item52 Item53 ˕ Item54 m Item55 Item56 Item57 S Item58 Item59 Item60 E Item61 Item62 { Item63 Item64 Item65 U Item66 Item67 Item68 5 Item69 ՟ Item70 Item71 Y Item72 Item73 ? Item74 Item75 z Item76 Y Item77 Item78 Item79 - Item80 ɯ Item81 k Item82 Item83 ϱ Item84 Item85 3 Item86 ҳ Item87 q Item88 Item89 Item90 > Item91 ߶ Item92 } Item93 Item94 Item95 Item96 Item97 \ Item98 Item99 L Item100 Item101 Item102 Item103 Item104 B Item105 E Item106 A Item107 Item108 1 Item109 #! Item110 ! Item111 " Item112 ( Item113 7/ Item114 / Item115 5 Item116 5 Item117 u7 Item118 9 Item119 : Item120 ^< Item121 > Item122 ? Item123 |B Item124 G Item125 H Item126 e Item127 h Item128 i Item129 o Item130 dz Item131 $} Item132 Item133 Ԃ Item134 Item135 Item136 \ Item137 4 Item138 Item139 ˑ Item140 Item141 L Item142 Item143 Item144 u Item145 4 Item146 Item147 Item148 J Item149 Item150 Item151 c Item152 Item153 Item154 t Item155 5 Item156 Item157 Item158 L Item159
Item160 Item161 | Item162 $ Item163 Item164 Item165 n Item166 / Item167 Item168 Item169 D Item170 Item171 Item172 w Item173 & Item174 Item175 Item176 ? Item177 Item178 Item179 Item180 B Item181 Item182 Item183 y = dataType Group side East Entities - Attributes L2 CrewLinks R2 id 3 items Item0 - Item1 . Item2 y/ Item3 ;0 Item4 0 Item5 K1 Item6 1 L2 dataType Object PositionInfo y. side East flags Attributes . id type gm_gc_army_crew_mpiaks74nk_80_blk . position B =FBXEangles ҕ@@1h<. . dataType Object PositionInfo ;/ side East flags Attributes s/ id type gm_gc_army_crew_mpiaks74nk_80_blk y/ position B =FBXEangles ҕ@@1h