debriefing.hpp \ description.ext \ functions\common.hpp \Y functions\fhq_markerPatrol.hpp DV_ functions\FHQ_markerPatrol\FHQ_fnc_getpointinarea.sqf 띨S functions\FHQ_markerPatrol\FHQ_fnc_markerPatrol.sqf U functions\fhq_tasktracker.hpp ."\ functions\FHQ_tasktracker\fn_ttAddBriefing.sqf 6Ww functions\FHQ_tasktracker\fn_ttAddBriefingGroup.sqf Z functions\FHQ_tasktracker\fn_ttAddTaskGroup.sqf ?Z functions\FHQ_tasktracker\fn_ttAddTasks.sqf i\ functions\FHQ_tasktracker\fn_ttAreTasksCompleted.sqf 6W functions\FHQ_tasktracker\fn_ttAreTasksSuccessful.sqf 6W functions\FHQ_tasktracker\fn_ttGetAllTasksWithState.sqf 6WG functions\FHQ_tasktracker\fn_ttGetTaskState.sqf 6W functions\FHQ_tasktracker\fn_ttiAddBriefingEntry.sqf 6W9 functions\FHQ_tasktracker\fn_ttiBuildCondition.sqf :
\m functions\FHQ_tasktracker\fn_ttiCreateOrUpdateTask.sqf i\G functions\FHQ_tasktracker\fn_ttiFilterUnits.sqf 6ZX4 functions\FHQ_tasktracker\fn_ttiGetTaskDesc.sqf 6W functions\FHQ_tasktracker\fn_ttiGetTaskId.sqf 6W functions\FHQ_tasktracker\fn_ttiGetTaskName.sqf 6Wm functions\FHQ_tasktracker\fn_ttiGetTaskState.sqf !i\] functions\FHQ_tasktracker\fn_ttiGetTaskTarget.sqf 6W functions\FHQ_tasktracker\fn_ttiGetTaskTitle.sqf 6W functions\FHQ_tasktracker\fn_ttiGetTaskType.sqf 6WC functions\FHQ_tasktracker\fn_ttiGetTaskWp.sqf 6W functions\FHQ_tasktracker\fn_ttiHasBriefingEntry.sqf 6W functions\FHQ_tasktracker\fn_ttiInit.sqf 2Zq functions\FHQ_tasktracker\fn_ttiIsFilter.sqf 6W functions\FHQ_tasktracker\fn_ttiIsTaskState.sqf 6W functions\FHQ_tasktracker\fn_ttiMissionBriefing.sqf 6W) functions\FHQ_tasktracker\fn_ttiMissionTasks.sqf 6W, functions\FHQ_tasktracker\fn_ttiPostInit.sqf x;Z functions\FHQ_tasktracker\fn_ttIsTaskCompleted.sqf 6W functions\FHQ_tasktracker\fn_ttIsTaskSuccessful.sqf 6WL functions\FHQ_tasktracker\fn_ttiTaskExists.sqf 6WQ functions\FHQ_tasktracker\fn_ttiUnitBriefing.sqf 6Wg functions\FHQ_tasktracker\fn_ttiUnitTasks.sqf 6W^ functions\FHQ_tasktracker\fn_ttiUpdateBriefingList.sqf LZXM functions\FHQ_tasktracker\fn_ttiUpdateTaskList.sqf Qd\ functions\FHQ_tasktracker\fn_ttMissionFlow.sqf x\ functions\FHQ_tasktracker\fn_ttSetTaskDescription.sqf xZC functions\FHQ_tasktracker\fn_ttSetTaskState.sqf 6Wx functions\FHQ_tasktracker\fn_ttSetTaskStateAndNext.sqf 6W$ functions\FHQ_tasktracker\fn_ttSetTaskTarget.sqf Zt functions\FHQ_tasktracker\fn_ttSetTaskTargetAndTitles.sqf Z functions\FHQ_tasktracker\fn_ttSetTaskTitle.sqf nZ? functions\FHQ_tasktracker\fn_ttSetTaskTitles.sqf lZ functions\FHQ_tasktracker\fn_ttTaskHint.sqf ZS functions\taw_vd\CfgFunctions.hpp KA\ functions\taw_vd\defines.h P0V7 functions\taw_vd\fn_onChar.sqf /V functions\taw_vd\fn_onSavePressed.sqf |R0V functions\taw_vd\fn_onSaveSelectionChanged.sqf bP0V functions\taw_vd\fn_onSliderChanged.sqf P/V functions\taw_vd\fn_onTerrainChanged.sqf /V functions\taw_vd\fn_openMenu.sqf ı/V functions\taw_vd\fn_openSaveManager.sqf O0VD functions\taw_vd\fn_stateTracker.fsm K0V functions\taw_vd\fn_updateViewDistance.sqf /V functions\taw_vd\GUI.h nI0VGO images\loadscreen.jpg ~5\3~ init.sqf 2\ mission.sqm l3] scripts\briefing.sqf B\ scripts\briefing_loadout.hpp \ scripts\infotext.sqf \ scripts\parameters.hpp Y3\ class Win
{
title = "Mission Accomplished";
subtitle = "Helicopter Retrieved";
description = "You have successfully stolen back our prototype heavier armored transport helicopter. Good job, Mission Accomplished.";
pictureBackground = "images\loadscreen.jpg";
}
class Lose
{
title = "Mission Failed";
subtitle = "Dead";
description = "You have been murdered by the NACs.";
pictureBackground = "images\loadscreen.jpg";
}
overviewPicture = "images\loadscreen.jpg";
author="Phantom Six";
loadScreen = "images\loadscreen.jpg";
OnLoadName = "Steal the Chopper";
OnLoadMission ="Take back the stolen Czech helicopter from the NAC.";
debriefing = 1;
allowFunctionsRecompile = 1;
class Header
{
gameType = Coop;
minPlayers = 1;
maxPlayers = 8;
playerCountMultipleOf = 1;
};
respawn = "SIDE";
respawnDelay = 5;
class CfgDebriefing
{
#include "debriefing.hpp"
};
#include "functions\taw_vd\GUI.h"
class CfgFunctions {
#include "functions\common.hpp"
};
class Params
{
#include "scripts\parameters.hpp"
};
#include "scripts\briefing_loadout.hpp"
#define INTERNAL_FUNCTION(x) \
class x \
{ \
description = "Internal Function"; \
};
#define EXPORTED_FUNCTION(x,y) \
class x \
{ \
description = y; \
};
#include "taw_vd\CfgFunctions.hpp"
class FHQ
{
#include "fhq_markerPatrol.hpp"
#include "fhq_tasktracker.hpp"
};
class FHQ_markerPatrol {
class getPointInArea
{
file = "functions\FHQ_markerPatrol\FHQ_fnc_getpointinarea.sqf";
description = "Generate a random point in a given marker";
};
class markerPatrol
{
file = "functions\FHQ_markerPatrol\FHQ_fnc_markerPatrol.sqf";
description = "Generate a patrol route inside a marker";
};
};/* This script generates a random location inside a given marker. The marker
* can have any form (rectangle, ellipse) and can be tilted.
*/
private ["_tX", "_tY", "_size", "_marker", "_pos", "_dir", "_shape", "_x", "_y", "_dist", "_phi"];
_marker = _this select 0;
_size = getMarkerSize _marker;
_pos = getMarkerPos _marker;
_dir = markerDir _marker;
_shape = markerShape _marker;
_x = 0;
_y = 0;
if (_shape == "RECTANGLE") then {
_tX = 1.0 - ((random 20000) / 10000.0);
_tY = 1.0 - ((random 20000) / 10000.0);
/* Calculate the actual coordinates. */
_x = (_pos select 0) + (((_tX * (_size select 0)) * cos(-_dir)) - ((_tY * (_size select 1)) * sin(-_dir)));
_y = (_pos select 1) + (((_tX * (_size select 0)) * sin(-_dir)) + ((_tY * (_size select 1)) * cos(-_dir)));
} else {
_dist = (random 10000) / 10000.0 + (random 10000) / 10000.0;
_phi = (random 36000) / 100.0;
if (_dist > 1.0) then {_dist = 2.0 - _dist};
_tX = (_dist * (_size select 0)) * sin(_phi);
_ty = (_dist * (_size select 1)) * cos(_phi);
_x = (_pos select 0) + (_tX * cos(-_dir)) - (_tY * sin(-_dir));
_y = (_pos select 1) + (_tX * sin(-_dir)) + (_tY * cos(-_dir));
};
/* DEBUG */
//_dbg = createMarker [format["debug%1%2", _x, _y], [_x, _y, 0]];
//_dbg setMarkerShape "ICON";
//_dbg setMarkerType "waypoint";
//_dbg setMarkerSize [0.5, 0.5];
[_x, _y, 0]/*
** Generate a patrol route for a given unit or group
**
** Parameters -
** 0: the group or leader of the group
** 1: [Optional] Name of the marker. Blank of "" to use the name of the group leader as the marker name
** 2: [Optional] Number of waypoints for the group. Default is 6
** 3: [Optional] If TRUE, generate a new route at the end of the patrol. If false (the default), cycle
** 4: [Optional] If TRUE, prefer waypoints on or near roads. Defaults to False
** 5: [Optional] if TRUE, delete all previous waypoints of the group. Default is TRUE
*/
private [
"_leader", "_group", "_marker", "_pos",
"_road", "_numWaypoints", "_resetRoute",
"_roadWay", "_wp", "_deleteWP"
];
_group = param [0, objNull, [objNull, grpNull]];
_leader = objNull;
if (typeName _group != typename grpNull) then {
_group = group _group;
_leader = leader _group;
} else {
_leader = leader _group;
};
_marker = param [1, str _leader, [""]];
_numWaypoints = param [2, 6, [0]];
_resetRoute = param [3, FALSE, [TRUE]];
_roadWay = param [4, FALSE, [TRUE]];
_deleteWP = param [5, TRUE, [TRUE]];
/*
** Check if the leader is defined. If not, exit
*/
if (isnull _leader) exitWith {
["expected group or group leader for markerPatrol"] call BIS_fnc_Error;
};
/*
** Check the marker name, and see if it exists
*/
if (_marker == "") then {
_marker = str _leader;
};
_pos = getMarkerPos _marker;
if ((_pos select 0) == 0 && (_pos select 1) == 0) exitWith {
["Marker name %1 not found", _marker] call BIS_fnc_Error;
};
/*
** Everything we need is there.
*/
// Delete previous waypoints
while {(count (waypoints _group)) > 0} do
{
deleteWaypoint ((waypoints _group) select 0);
};
// Make marker invisible just in case
_marker setMarkerAlpha 0;
for "_i" from 1 to _numWaypoints do {
_pos = [_marker] call FHQ_fnc_getPointInArea;
if (_roadWay) then {
_road = [_pos, 200, []] call BIS_fnc_nearestRoad;
if (!isnull _road) then {
_pos = position _road;
};
};
_wp = _group addWaypoint [_pos, 5];
_wp setWaypointBehaviour "SAFE";
_wp setWaypointType "MOVE";
_wp setWaypointSpeed "LIMITED";
_wp setWaypointFormation "COLUMN";
if (_i == _numWaypoints) then {
if (!_resetRoute) then {
_wp setWaypointType "CYCLE";
} else {
_wp setWaypointType "MOVE";
_wp setWaypointStatements ["true", format ["_nil = [group %1,%2,%3,%4,%5,%6] call FHQ_fnc_markerPatrol;",
_leader, _marker, _numWaypoints, _resetRoute, _roadWay, _deleteWP]];
};
};
};#define INTERNAL_FUNCTION(x) \
class x \
{ \
description = "Internal Function"; \
};
#define EXPORTED_FUNCTION(x,y) \
class x \
{ \
description = y; \
};
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)
INTERNAL_FUNCTION(ttiBuildCondition)
};
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")
EXPORTED_FUNCTION(ttSetTaskTarget, "Change a task target")
EXPORTED_FUNCTION(ttSetTaskDescription, "Change a task description")
EXPORTED_FUNCTION(ttSetTaskTitle, "Change a task title")
EXPORTED_FUNCTION(ttSetTaskTitles, "Change title and description")
EXPORTED_FUNCTION(ttSetTaskTargetAndTitles, "Change target, title and description")
EXPORTED_FUNCTION(ttAddTaskGroup, "Adds an EdenTT defined group of tasks.")
EXPORTED_FUNCTION(ttAddBriefingGroup, "Adds an EdenTT defined briefing.")
EXPORTED_FUNCTION(ttMissionFlow, "Control mission flow automatically.")
};
/* 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_ttAddBriefingGroup: Add EdenTT defined briefing group
*
* For more information on the definition of briefing groups, see the
* EdenTT manual and examples.
*
* This function adds a given briefing group to the units defined by the filter.
* The filter itself follows the same rules as filters in FHQ_fnc_ttAddTasks.
*
* Usage: [_filter, _briefingGroup] call FHQ_fnc_ttAddBriefingGroup;
* _filter: A filter similar to that given in FHQ_fnc_ttAddTask/ttAddBriefing.
* _briefingGroup: Name of the briefing group to add.
*
* Example:
* // Add briefing from brief1 to units p1, p2, and p3
* [[p1, p2, p3], "brief1"] call FHQ_fnc_ttAddBriefingGroup;
*
*/
params [
["_filter", {true}],
["_briefingGroup", "", [""]]
];
if (isServer) then {
private _briefings = missionNamespace getVariable ["FHQ_tt_MissionBriefing", []];
private _units = (if (isMultiplayer) then {playableUnits+FHQ_TTI_extraUnits} else {switchableUnits});
private _i = 0;
_units = [_filter, _units] call FHQ_fnc_ttiFilterUnits;
if (count _units == 0) exitWith {/* Nothing to be done */};
for [{_i = 0}, {_i < count _briefings}, {_i = _i + 1}] do
{
private _briefing = _briefings select _i;
private _group = _briefing select 0;
private _entry = _briefing select 1;
if (_briefingGroup isEqualTo _group) then {
([_units] + _entry) call FHQ_fnc_ttAddBriefing;
};
};
};/* FHQ_fnc_ttAddTaskGroup: Add EdenTT defined task group
*
* For more information on the definition of task groups, see the
* EdenTT manual and examples.
*
* This function adds a given task group to the units defined by the filter.
* The filter itself follows the same rules as filters in FHQ_fnc_ttAddTasks.
*
* Usage: [_filter, _taskGroup] call FHQ_fnc_ttAddTaskGroup;
* _filter: A filter similar to that given in FHQ_fnc_ttAddTask/ttAddBriefing.
* _taskGroup: Name of the task group to add.
*
* Example:
* // Add tasks from task1group to units p1, p2, and p3
* [[p1, p2, p3], "task1group"] call FHQ_fnc_ttAddTaskGroup;
*
* // Add task from westTasks to all west units
* [west, "westTasks"] call FHQ_fnc_ttAddTaskGroup;
*/
params [
["_filter", {true}],
["_taskGroup", "", [""]]
];
if (isServer) then {
private _tasks = missionNamespace getVariable ["FHQ_tt_MissionTasks", []];
private _units = (if (isMultiplayer) then {playableUnits+FHQ_TTI_extraUnits} else {switchableUnits});
private _i = 0;
_units = [_filter, _units] call FHQ_fnc_ttiFilterUnits;
if (count _units == 0) exitWith {/* Nothing to be done */};
for [{_i = 0}, {_i < count _tasks}, {_i = _i + 1}] do
{
private _task = _tasks select _i;
private _group = _task select 0;
private _entry = _task select 1;
if (_taskGroup isEqualTo _group) then {
([_units] + [_entry]) call FHQ_fnc_ttAddTasks;
};
};
};
/* 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]]];
/* build a condition from the conditions in the given mission flow that we
* can use for waitUntil
*/
private _cond = "";
private _i = 0;
for "_i" from 0 to (count _this - 1) do {
private _current = _this select _i;
if (_i != 0) then {
_cond = format ["%1 or", _cond];
};
_cond = format ["%1 (%2)", _cond, _current select 0];
};
_cond;private ["_current", "_existing", "_unit", "_name", "_state", "_idx", "_record", "_object", "_taskID",
"_parented", "_target"];
_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;
private _target = _current call FHQ_fnc_ttiGetTaskTarget;
private _desc = _current call FHQ_fnc_ttiGetTaskDesc;
private _title = _current call FHQ_fnc_ttiGetTaskTitle;
private _updated = false;
_parented = false;
_idx = [_existing, _name] call FHQ_fnc_ttiTaskExists;
if (_idx != -1) then {
/* Update existing task */
_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];
};
if (!(_target isEqualTo (_record select 3))) then {
private _target = _current call FHQ_fnc_ttiGetTaskTarget;
_record set [3, _target];
if (typeName _target == "ARRAY") then {
(_record select 1) setSimpleTaskDestination _target;
} else {
(_record select 1) setSimpleTaskTarget [_target, true];
};
_updated = true;
};
if (!(_desc isEqualTo (_record select 4))) then {
_record set [4, _desc];
(_record select 1) setSimpleTaskDescription [_desc, _title, _current call FHQ_fnc_ttiGetTaskWp];
_updated = true;
};
if (!(_title isEqualTo (_record select 5))) then {
_record set [5, _title];
(_record select 1) setSimpleTaskDescription [_desc, _title, _current call FHQ_fnc_ttiGetTaskWp];
_updated = true;
};
if (_unit == player && !FHQ_TTI_supressTaskHints && _updated) then {
[_current call FHQ_fnc_ttiGetTaskTitle, "update", _current call FHQ_fnc_ttiGetTaskType] call FHQ_fnc_ttTaskHint;
};
} else {
/* Create a new task */
_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);"
};
if (!(_state call FHQ_fnc_ttiIsTaskState)) then {
/* Due to the way the type is handled, this can actually NOT be a state */
_state = "created";
};
_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, _target, _current call FHQ_fnc_ttiGetTaskDesc, _current call FHQ_fnc_ttiGetTaskTitle, _current call FHQ_fnc_ttiGetTaskWp] ];
_target = nil;
};
_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 {
if ((_this select FHQ_TTIF_TASKSTATE) call FHQ_fnc_ttiIsTaskState) then {
_res = _this select FHQ_TTIF_TASKSTATE;
} else {
_res = "created";
};
} else {
if (count _this > FHQ_TTIF_TASKTARGET) then {
if (typename (_this select FHQ_TTIF_TASKTARGET) == "STRING") then {
if ((_this select FHQ_TTIF_TASKTARGET) call FHQ_fnc_ttiIsTaskState) then {
_res = _this select FHQ_TTIF_TASKTARGET;
} else {
_res = "created";
};
};
};
};
_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;
FHQ_TTI_DoSpectator = true;
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 (_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});/*
* Control mission flow based on an array of conditions and actions.
*
* Mission flow through FSMs is a good possibility for ensuring a single point of execution for
* any events happening during the game session. Most of the time, though, the FSM is following
* a very rigid structure: A single "on mission" state branching out into a bunch of conditions
* that in term lead to code executed and then return to the on mission state.
*
* This can be collapsed into the conditions and the code executed when the condition is met.
* This function does exactly that: It runs in a thread on the server only, waiting for
* any of the conditions to become true, then execute the code associated to that condition.
* Each condition/code pair can be attributed with a set of attributes that determine what happens
* afterwards. For example, the "single" attribute means that the condition can happen exactly once
* and will be removed after it happened. This prevents, for example, that a condition is executed
* every frame from then on out.
*
* The function is called like this:
* _result = [_flow] call FHQ_fnc_missionFlow;
*
* NOTE: It must be called in a scheduled environment. If in doubt, spawn a thread.
*
* Parameters:
* _flow: An array describing the actual flow of the mission. Each entry consists of three elements:
* - Condition string (will be compiled and must evaluate to a boolean)
* - Code to be executed when the condition is met.
* - Array of strings that define attributes for the condition/action pair. Currently, the following
* attributes are defined. Unknown items are ignored:
* "single" - This action should only be executed once. The condition/action pair is removed from the
* mission flow array after it has been executed once. Note: If the array is omitted, "single"
* is assumed
* "end" - This action ends the mission. If an "end" attribute is encountered, FHQ_fnc_missionFlow
* will exit.
*
* Return value:
* _result: If an "end" action is found, the attribute array corresponding to this action is returned. This
* allows the user to check the attributes of the ending action.
*
* Example:
* private _flow = [
* ["!alive blowMeUp", {systemChat "BlowMeUp is no more";}, ["single"]],
* ["triggerActivated exfilTrigger", {systemChat "Thats it, end mission";}, ["end", "success"]]
* ];
*
* private _result = [_flow] call FHQ_fnc_missionFlow;
* if ("success" in _result) then {
* systemChat "The mission was a success";
* };
*/
private _result = [];
if (isServer) then {
private _running = true;
params [
["_flow", []]
];
while {_running} do {
/* Create the condition to wait for */
private _cond = _flow call FHQ_fnc_ttiBuildCondition;
/* And wait until one of them happens */
waitUntil {call compile _cond};
/* Find out which */
_deleteMes = [];
{
private "_attribX";
private _condX = _x select 0;
private _codeX = _x select 1;
if (count _x >= 3) then {
_attribX = _x select 2;
} else {
_attribX = ["single"];
};
if (call compile _condX) then {
/* ok, this one's triggered, execute the code */
if (typename _codeX == "CODE") then {
call _codeX;
};
if (typename _codeX == "STRING") then {
[_codeX, "succeeded"] call FHQ_fnc_ttSetTaskState;
};
if ("single" in _attribX) then {
_deleteMes pushBack _forEachIndex;
};
if ("end" in _attribX) exitWith {
_running = false;
_result = +_attribX;
};
};
} foreach _flow;
{
_flow deleteAt _x;
} forEach _deleteMes;
};
};
_result/* FHQ_fnc_ttSetTaskDescription
*
* Set the "long" description of the specified task, and alert the player if necessary.
*
* NOTE: Server callable only. Calling this on a client does not have an effect
*
* Usage:
* [_task, _newDesc] call FHQ_fnc_ttSetTaskDescription;
* _task: the task name defined with FHQ_fnc_ttAddTasks
* _newDesc: New description
*
*/
#define FHQ_TTIF_TASKDESC 1
private ["_name", "_desc", "_idx", "_record", "_entry"];
if (isServer) then {
_name = [_this, 0, "", [""]] call BIS_fnc_param;
_desc = [_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_TASKDESC, _desc];
_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_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;
};
};
/* FHQ_fnc_ttSetTaskTarget
*
* Set the target of the specified task, and alert the player if necessary.
*
* NOTE: Server callable only. Calling this on a client does not have an effect
*
* Usage:
* [_task, _newTarget] call FHQ_fnc_ttSetTaskTarget;
* _task: the task name defined with FHQ_fnc_ttAddTasks
* _newTarget: The new target, can be an array (position) or an object
*
*/
#define FHQ_TTIF_TASKTARGET 4
private ["_name", "_target", "_idx", "_record", "_entry"];
if (isServer) then {
_name = [_this, 0, "", [""]] call BIS_fnc_param;
_target = [_this, 1, objNull, [objNull, [2,3]]] 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_TASKTARGET, _target];
_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_ttSetTaskTitlesAndTarget
*
* Set the title and description of the specified task, and alert the player if necessary.
*
* NOTE: Server callable only. Calling this on a client does not have an effect
*
* Usage:
* [_task,_newTarget, _newTitle, _newDesc] call FHQ_fnc_ttSetTaskTitle;
* _task: the task name defined with FHQ_fnc_ttAddTasks
* _newTitle: The new title
* _newDescription: The new description
*/
#define FHQ_TTIF_TASKDESC 1
#define FHQ_TTIF_TASKTITLE 2
#define FHQ_TTIF_TASKTARGET 4
private ["_name", "_title", "_desc", "_idx", "_record", "_entry", "_target"];
if (isServer) then {
_name = [_this, 0, "", [""]] call BIS_fnc_param;
_target = [_this, 1, objNull, [objNull, [2,3]]] call BIS_fnc_param;
_title = [_this, 2, "", [""]] call BIS_fnc_param;
_desc = [_this, 3, "", [""]] 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_TASKTITLE, _title];
_record set [FHQ_TTIF_TASKDESC, _desc];
_record set [FHQ_TTIF_TASKTARGET, _target];
_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_ttSetTaskTitle
*
* Set the "short" description of the specified task, and alert the player if necessary.
*
* NOTE: Server callable only. Calling this on a client does not have an effect
*
* Usage:
* [_task, _newTitle] call FHQ_fnc_ttSetTaskTitle;
* _task: the task name defined with FHQ_fnc_ttAddTasks
* _newTitle: The new title
*
*/
#define FHQ_TTIF_TASKTITLE 2
private ["_name", "_title", "_idx", "_record", "_entry"];
if (isServer) then {
_name = [_this, 0, "", [""]] call BIS_fnc_param;
_title = [_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_TASKTITLE, _title];
_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_ttSetTaskTitles
*
* Set the title and description of the specified task, and alert the player if necessary.
*
* NOTE: Server callable only. Calling this on a client does not have an effect
*
* Usage:
* [_task, _newTitle, _newDesc] call FHQ_fnc_ttSetTaskTitle;
* _task: the task name defined with FHQ_fnc_ttAddTasks
* _newTitle: The new title
* _newDescription: The new description
*/
#define FHQ_TTIF_TASKDESC 1
#define FHQ_TTIF_TASKTITLE 2
private ["_name", "_title", "_desc", "_idx", "_record", "_entry"];
if (isServer) then {
_name = [_this, 0, "", [""]] call BIS_fnc_param;
_title = [_this, 1, "", [""]] call BIS_fnc_param;
_desc = [_this, 2, "", [""]] 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_TASKTITLE, _title];
_record set [FHQ_TTIF_TASKDESC, _desc];
_entry set [1, _record];
FHQ_TTI_TaskList set [_idx, _entry];
publicVariable "FHQ_TTI_TaskList";
if (!isDedicated) then {
FHQ_TTI_TaskList call FHQ_fnc_ttiUpdateTaskList;
};
};
}; /* 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";
};
};
case "update":
{
_notifyTemplate = "TaskUpdated";
};
};
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;class TAW_VD {
tag = "TAWVD";
class Initialize {
file = "functions\taw_vd";
class stateTracker {
ext = ".fsm";
postInit = 1;
headerType = -1;
};
class onSliderChanged {};
class onTerrainChanged {};
class updateViewDistance {};
class openMenu {};
class onChar {};
class openSaveManager {};
class onSavePressed {};
class onSaveSelectionChanged {};
};
};/* Main display IDD & IDC's */
#define MENU_IDD 2900
#define INFANTRY_SLIDER 2901
#define INFANTRY_EDIT 2902
#define GROUND_SLIDER 2911
#define GROUND_EDIT 2912
#define AIR_SLIDER 2921
#define AIR_EDIT 2922
#define OBJECT_SLIDER 2941
#define OBJECT_EDIT 2942
#define DRONE_SLIDER 2951
#define DRONE_EDIT 2952
#define TERRAIN_NONE 2950
#define GUI_GRID_CENTER_WAbs ((safezoneW / safezoneH) min 1.2)
#define GUI_GRID_CENTER_HAbs (GUI_GRID_CENTER_WAbs / 1.2)
#define GUI_GRID_CENTER_W (GUI_GRID_CENTER_WAbs / 40)
#define GUI_GRID_CENTER_H (GUI_GRID_CENTER_HAbs / 25)
#define GUI_GRID_CENTER_X (safezoneX + (safezoneW - GUI_GRID_CENTER_WAbs)/2)
#define GUI_GRID_CENTER_Y (safezoneY + (safezoneH - GUI_GRID_CENTER_HAbs)/2)
#define ST_LEFT 0x00
#define ST_MULTI 0x10
#define SEL(ARRAY,INDEX) (ARRAY select INDEX)
/* Save / Load Manager */
#define MANAGER_GROUP 2999
#define SAVELOAD_GROUP 3000
#define SAVES_LIST 3001
#define SLOT_NAME 3002
/* Namespace Macros */
#define SVAR_MNS missionNamespace setVariable
#define SVAR_UINS uiNamespace setVariable
#define SVAR_PNS parsingNamespace setVariable
#define GVAR_MNS missionNamespace getVariable
#define GVAR_UINS uiNamespace getVariable
#define GVAR_PNS parsingNamespace getVariable
/* Condition Macros */
#define EQUAL(condition1,condition2) condition1 isEqualTo condition2
/* Display Macros */
#define CONTROL(disp,ctrl) ((findDisplay ##disp) displayCtrl ##ctrl)
#define CONTROL_DATA(ctrl) (lbData[ctrl,lbCurSel ctrl])
#define CONTROL_DATAI(ctrl,index) ctrl lbData index#include "defines.h"
/*
Author: Bryan "Tonic" Boardwine
Description:
When a character is entered it is validated and changes the
correct slider it is associated with. I probably over-complicated
this more then I had to but onChar behaves weird.
PARAMS:
0: CONTROL
1: SCALAR (INT)
2: STRING (Case option)
*/
private["_value","_varName","_maxRange"];
params ["_control","_code","_slider"];
disableSerialization;
if(isNull _control) exitWith {}; //POOOOOP
_maxRange = if(!isNil "tawvd_maxRange") then {tawvd_maxRange} else {20000};
_value = parseNumber (ctrlText _control);
if(_value > _maxRange OR _value < 100) exitwith {[] call TAWVD_fnc_openMenu;};
_varName = switch (_slider) do {
case "ground": {"tawvd_foot"};
case "vehicle": {"tawvd_car"};
case "air": {"tawvd_air"};
case "object": {"tawvd_object"};
case "drone": {"tawvd_drone"};
default {"tawvd_foot"};
};
SVAR_MNS [_varName,_value];
[] call TAWVD_fnc_updateViewDistance;
[] call TAWVD_fnc_openMenu;#include "defines.h"
/*
Author: Bryan "Tonic" Boardwine
Description:
Updates the view distance dependant on whether the player
is on foot, a car or an aircraft.
*/
private ["_saveIndex","_saveName"];
_saveIndex = lbCurSel SAVES_LIST;
_saveName = ctrlText SLOT_NAME;
SVAR_PNS [format["tawvd_slot_%1",_saveIndex],
[
_saveName,
tawvd_foot,
tawvd_car,
tawvd_air,
tawvd_drone,
tawvd_object,
tawvd_syncObject
]
];
saveProfileNamespace;
[] call TAWVD_fnc_openSaveManager;
#include "defines.h"
/*
Author: Bryan "Tonic" Boardwine
Description:
Updates the view distance dependant on whether the player
is on foot, a car or an aircraft.
*/
private "_saveData";
params [["_control",controlNull,[controlNull]],["_index",-1,[0]]];
/* Error checks */
if(EQUAL(_index,-1) OR isNull _control) exitWith {};
_saveData = GVAR_PNS format["tawvd_slot_%1",_index];
if(isNil "_saveData") exitWith {};
/* Set variables to chosen slot data */
CONTROL(MENU_IDD,SLOT_NAME) ctrlSetText (SEL(_saveData,0));
SVAR_MNS ["tawvd_foot",SEL(_saveData,1)];
SVAR_MNS ["tawvd_car",SEL(_saveData,2)];
SVAR_MNS ["tawvd_air",SEL(_saveData,3)];
SVAR_MNS ["tawvd_drone",SEL(_saveData,4)];
SVAR_MNS ["tawvd_object",SEL(_saveData,5)];
SVAR_MNS ["tawvd_syncObject",SEL(_saveData,6)];
/* Update Menu & View Distance */
[] call TAWVD_fnc_updateViewDistance;
[] call TAWVD_fnc_openMenu;#include "defines.h"
/*
Author: Bryan "Tonic" Boardwine
Description:
Called when the slider is changed for any field and
updates the view distance for it.
*/
private "_varData";
params [["_mode",-1,[0]],["_value",-1,[0]]];
if(EQUAL(_mode,-1) OR EQUAL(_value,-1)) exitWith {};
disableSerialization;
_varData = switch(_mode) do {
case 0: {["tawvd_foot",INFANTRY_EDIT]};
case 1: {["tawvd_car",GROUND_EDIT]};
case 2: {["tawvd_air",AIR_EDIT]};
case 3: {["tawvd_object",OBJECT_EDIT]};
case 4: {["tawvd_drone",DRONE_EDIT]};
};
SVAR_MNS [SEL(_varData,0),round(_value)];
ctrlSetText[SEL(_varData,1),str(GVAR_MNS SEL(_varData,0))];
[] call TAWVD_fnc_updateViewDistance;
if(EQUAL(_mode,3)) then {
setObjectViewDistance [tawvd_object,100];
};
if(tawvd_syncObject) then {
sliderSetPosition[OBJECT_SLIDER, tawvd_object];
ctrlSetText[OBJECT_EDIT,str(tawvd_object)];
};
/*
Author: Bryan "Tonic" Boardwine
Description:
Updates the players terraingrid when called.
*/
private "_type";
_type = param [0,"",[""]];
if(_type == "") exitWith {};
switch (_type) do {
case "none": {if(isNil "tawvd_disablenone") then {setTerrainGrid 50;};};
case "low": {setTerrainGrid 30;};
case "norm": {setTerrainGrid 12.5;};
case "high": {setTerrainGrid 3.125;};
};#include "defines.h"
/*
Author: Bryan "Tonic" Boardwine
Description:
Called via addAction and opens the TAW View Distance Menu
*/
if(isNull (findDisplay MENU_IDD)) then {
if(!createDialog "TAW_VDMenu") exitWith {hint "Something went wrong, the menu won't open?"};
};
disableSerialization;
{
ctrlSetText[SEL(_x,0),str(SEL(_x,1))];
} foreach [[INFANTRY_EDIT,tawvd_foot],[GROUND_EDIT,tawvd_car],[AIR_EDIT,tawvd_air],[OBJECT_EDIT,tawvd_object],[DRONE_EDIT,tawvd_drone]];
//Setup the sliders
{
if(!isNil "tawvd_maxRange") then {
slidersetRange [_x select 0,100,tawvd_maxRange];
} else {
slidersetRange [_x select 0,100,20000];
};
((findDisplay MENU_IDD) displayCtrl (_x select 0)) sliderSetSpeed [100,100,100];
sliderSetPosition[_x select 0, _x select 1];
} foreach [[INFANTRY_SLIDER,tawvd_foot],[GROUND_SLIDER,tawvd_car],[AIR_SLIDER,tawvd_air],[OBJECT_SLIDER,tawvd_object],[DRONE_SLIDER,tawvd_drone]];
((findDisplay MENU_IDD) displayCtrl 2931) cbSetChecked tawvd_syncObject;
if(tawvd_syncObject) then {
ctrlEnable [OBJECT_SLIDER,false];
ctrlEnable [OBJECT_EDIT,false];
} else {
ctrlEnable [OBJECT_SLIDER,true];
ctrlEnable [OBJECT_EDIT,true];
};
//Lets disable it..
if(!isNil "tawvd_disablenone") then {
ctrlEnable [TERRAIN_NONE,false];
};#include "defines.h"
/*
Author: Bryan "Tonic" Boardwine
Description:
Updates the view distance dependant on whether the player
is on foot, a car or an aircraft.
*/
private ["_controlGrp","_saveList"];
disableSerialization;
/* Store displays */
_controlGrp = CONTROL(MENU_IDD,MANAGER_GROUP);
_saveList = CONTROL(MENU_IDD,SAVES_LIST);
lbClear _saveList; //Purge the list
/* Make the Saves manager group visible */
_controlGrp ctrlSetfade 0;
_controlGrp ctrlCommit .3;
/* Fill the listbox */
for "_i" from 0 to 9 do {
_varData = GVAR_PNS format["tawvd_slot_%1",_i];
if(!isNil "_varData") then {
_saveList lbAdd SEL(_varData,0);
_saveList lbSetData [(lbSize _saveList)-1,"true"];
} else {
_saveList lbAdd format["Save Slot %1",_i];
_saveList lbSetData [(lbSize _saveList)-1,"false"];
};
};/*%FSM*/
/*%FSM*/
/*
item0[] = {"init",0,4346,-39.234997,-157.457230,50.765003,-107.457222,0.000000,"init"};
item1[] = {"true",8,218,-39.286701,-67.901810,50.713299,-17.901814,0.000000,"true"};
item2[] = {"I_am_a_loop__",2,250,-37.913574,2.551729,52.086441,52.551727,0.000000,"I am a loop.."};
item3[] = {"Dead_Player",4,218,-137.117889,56.721581,-47.117889,106.721581,0.000000,"Dead Player"};
item4[] = {"I_am_dead_Set_my",2,250,-215.837250,109.620483,-125.837227,159.620499,0.000000,"I am dead" \n "Set my corpse"};
item5[] = {"Alive_player",4,218,-215.185760,16.088562,-125.185867,66.088623,0.000000,"Alive player"};
item6[] = {"Re_add_my_action",2,250,-215.481354,-68.055023,-125.481308,-18.054995,0.000000,"Re-add my" \n "action please"};
item7[] = {"State_changed",4,218,107.007217,1.512135,197.007202,51.512016,0.000000,"State changed"};
item8[] = {"Update_me",2,250,107.804337,-67.884735,197.804352,-17.884773,0.000000,"Update me"};
link0[] = {0,1};
link1[] = {1,2};
link2[] = {2,3};
link3[] = {2,7};
link4[] = {3,4};
link5[] = {4,5};
link6[] = {5,6};
link7[] = {6,1};
link8[] = {7,8};
link9[] = {8,1};
globals[] = {0.000000,0,0,0,0,640,480,1,12,6316128,1,-604.631348,604.623535,286.974182,-497.663422,1404,911,1};
window[] = {2,-1,-1,-32000,-32000,785,25,1465,25,3,1422};
*//*%FSM*/
class FSM
{
fsmName = "TAW_VD State Tracker";
class States
{
/*%FSM*/
class init
{
name = "init";
init = /*%FSM*/"private [""_playerState"",""_corpse"",""_actionID"",""_droneState""];" \n
"" \n
"_playerState = vehicle player;" \n
"_droneState = UAVControl (getConnectedUAV player) select 1;" \n
"tawvd_addon_disable = true;" \n
"" \n
"if(isNil {profileNamespace getVariable ""tawvd_foot""}) then {" \n
" profileNamespace setVariable [""tawvd_foot"",viewDistance];" \n
" profileNamespace setVariable [""tawvd_car"",viewDistance];" \n
" profileNamespace setVariable [""tawvd_air"",viewDistance];" \n
" profileNamespace setVariable [""tawvd_drone"",viewDistance];" \n
" profileNamespace setVariable [""tawvd_object"",viewDistance];" \n
" saveProfileNamespace;" \n
"};" \n
"" \n
"tawvd_foot = profileNamespace getVariable [""tawvd_foot"",viewDistance];" \n
"tawvd_car = profileNamespace getVariable [""tawvd_car"",viewDistance];" \n
"tawvd_air = profileNamespace getVariable [""tawvd_air"",viewDistance];" \n
"tawvd_drone = profileNamespace getVariable [""tawvd_drone"",viewDistance];" \n
"tawvd_object = profileNamespace getVariable [""tawvd_object"",viewDistance];" \n
"" \n
"tawvd_syncObject = true;" \n
"_actionID = player addAction[""Settings"",TAWVD_fnc_openMenu,[],-99,false,false,"""",''];"/*%FSM*/;
precondition = /*%FSM*/""/*%FSM*/;
class Links
{
/*%FSM*/
class true
{
priority = 0.000000;
to="I_am_a_loop__";
precondition = /*%FSM*/""/*%FSM*/;
condition=/*%FSM*/"true"/*%FSM*/;
action=/*%FSM*/""/*%FSM*/;
};
/*%FSM*/
};
};
/*%FSM*/
/*%FSM*/
class I_am_a_loop__
{
name = "I_am_a_loop__";
init = /*%FSM*/""/*%FSM*/;
precondition = /*%FSM*/""/*%FSM*/;
class Links
{
/*%FSM*/
class State_changed
{
priority = 0.000000;
to="Update_me";
precondition = /*%FSM*/""/*%FSM*/;
condition=/*%FSM*/"(vehicle player != _playerState OR (UAVControl getConnectedUAV player select 1) != _droneState)"/*%FSM*/;
action=/*%FSM*/""/*%FSM*/;
};
/*%FSM*/
/*%FSM*/
class Dead_Player
{
priority = 0.000000;
to="I_am_dead_Set_my";
precondition = /*%FSM*/""/*%FSM*/;
condition=/*%FSM*/"!alive player"/*%FSM*/;
action=/*%FSM*/""/*%FSM*/;
};
/*%FSM*/
};
};
/*%FSM*/
/*%FSM*/
class I_am_dead_Set_my
{
name = "I_am_dead_Set_my";
init = /*%FSM*/"_corpse = player;" \n
"_corpse removeAction _actionID;"/*%FSM*/;
precondition = /*%FSM*/""/*%FSM*/;
class Links
{
/*%FSM*/
class Alive_player
{
priority = 0.000000;
to="Re_add_my_action";
precondition = /*%FSM*/""/*%FSM*/;
condition=/*%FSM*/"alive player"/*%FSM*/;
action=/*%FSM*/""/*%FSM*/;
};
/*%FSM*/
};
};
/*%FSM*/
/*%FSM*/
class Re_add_my_action
{
name = "Re_add_my_action";
init = /*%FSM*/"_actionID = player addAction[""Settings"",TAWVD_fnc_openMenu,[],-99,false,false,"""",''];"/*%FSM*/;
precondition = /*%FSM*/""/*%FSM*/;
class Links
{
/*%FSM*/
class true
{
priority = 0.000000;
to="I_am_a_loop__";
precondition = /*%FSM*/""/*%FSM*/;
condition=/*%FSM*/"true"/*%FSM*/;
action=/*%FSM*/""/*%FSM*/;
};
/*%FSM*/
};
};
/*%FSM*/
/*%FSM*/
class Update_me
{
name = "Update_me";
init = /*%FSM*/"[] call TAWVD_fnc_updateViewDistance;" \n
"_playerState = vehicle player;" \n
"_droneState = UAVControl (getConnectedUAV player) select 1;"/*%FSM*/;
precondition = /*%FSM*/""/*%FSM*/;
class Links
{
/*%FSM*/
class true
{
priority = 0.000000;
to="I_am_a_loop__";
precondition = /*%FSM*/""/*%FSM*/;
condition=/*%FSM*/"true"/*%FSM*/;
action=/*%FSM*/""/*%FSM*/;
};
/*%FSM*/
};
};
/*%FSM*/
};
initState="init";
finalStates[] =
{
};
};
/*%FSM*/#include "defines.h"
/*
Author: Bryan "Tonic" Boardwine
Description:
Updates the view distance dependant on whether the player
is on foot, a car or an aircraft.
*/
private "_dist";
switch (true) do {
case (!(EQUAL(SEL(UAVControl getConnectedUAV player,1),""))): {
setViewDistance tawvd_drone;
_dist = tawvd_drone;
};
case ((vehicle player) isKindOf "Man"): {
setViewDistance tawvd_foot;
_dist = tawvd_foot;
};
case ((vehicle player) isKindOf "LandVehicle"): {
setViewDistance tawvd_car;
_dist = tawvd_car;
};
case ((vehicle player) isKindOf "Air"): {
setViewDistance tawvd_air;
_dist = tawvd_air;
};
};
if(tawvd_syncObject) then {
setObjectViewDistance [_dist,100];
tawvd_object = _dist;
};#include "defines.h"
class RscEdit {
type = 2;
style = 0x00 + 0x40;
font = "PuristaMedium";
shadow = 2;
sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
colorBackground[] = {0, 0, 0, 1};
soundSelect[] = {"",0.1,1};
soundExpand[] = {"",0.1,1};
colorText[] = {0.95, 0.95, 0.95, 1};
colorDisabled[] = {1, 1, 1, 0.25};
autocomplete = false;
colorSelection[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", 1};
canModify = 1;
};
class RscListBox {
style = 16;
idc = -1;
type = 5;
w = 0.275;
h = 0.04;
font = "PuristaMedium";
colorSelect[] = {1, 1, 1, 1};
colorText[] = {1, 1, 1, 1};
colorBackground[] = {0.28,0.28,0.28,0.28};
colorSelect2[] = {1, 1, 1, 1};
colorSelectBackground[] = {0.95, 0.95, 0.95, 0.5};
colorSelectBackground2[] = {1, 1, 1, 0.5};
colorScrollbar[] = {0.2, 0.2, 0.2, 1};
colorPicture[] = {1,1,1,1};
colorPictureSelected[] = {1,1,1,1};
colorPictureDisabled[] = {1,1,1,1};
arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa";
arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa";
wholeHeight = 0.45;
rowHeight = 0.04;
color[] = {0.7, 0.7, 0.7, 1};
colorActive[] = {0,0,0,1};
colorDisabled[] = {0,0,0,0.3};
sizeEx = 0.023;
soundSelect[] = {"",0.1,1};
soundExpand[] = {"",0.1,1};
soundCollapse[] = {"",0.1,1};
maxHistoryDelay = 1;
autoScrollSpeed = -1;
autoScrollDelay = 5;
autoScrollRewind = 0;
tooltipColorText[] = {1,1,1,1};
tooltipColorBox[] = {1,1,1,1};
tooltipColorShade[] = {0,0,0,0.65};
class ListScrollBar {
color[] = {1,1,1,1};
colorActive[] = {1,1,1,1};
colorDisabled[] = {1,1,1,0.3};
thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa";
arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa";
arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa";
border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa";
shadow = 0;
scrollSpeed = 0.06;
width = 0;
height = 0;
autoScrollEnabled = 1;
autoScrollSpeed = -1;
autoScrollDelay = 5;
autoScrollRewind = 0;
}
};
class RscCheckBox {
access = 0; // Control access (0 - ReadAndWrite, 1 - ReadAndCreate, 2 - ReadOnly, 3 - ReadOnlyVerified)
idc = -1; // Control identification (without it, the control won't be displayed)
type = 77; // Type
style = ST_LEFT + ST_MULTI; // Style
default = 0; // Control selected by default (only one within a display can be used)
blinkingPeriod = 0; // Time in which control will fade out and back in. Use 0 to disable the effect.
x = 0;
y = 0;
w = 1 * GUI_GRID_CENTER_W; // Width
h = 1 * GUI_GRID_CENTER_H; // Height
//Colors
color[] = { 1, 1, 1, 0.7 }; // Texture color
colorFocused[] = { 1, 1, 1, 1 }; // Focused texture color
colorHover[] = { 1, 1, 1, 1 }; // Mouse over texture color
colorPressed[] = { 1, 1, 1, 1 }; // Mouse pressed texture color
colorDisabled[] = { 1, 1, 1, 0.2 }; // Disabled texture color
//Background colors
colorBackground[] = { 0, 0, 0, 0 }; // Fill color
colorBackgroundFocused[] = { 0, 0, 0, 0 }; // Focused fill color
colorBackgroundHover[] = { 0, 0, 0, 0 }; // Mouse hover fill color
colorBackgroundPressed[] = { 0, 0, 0, 0 }; // Mouse pressed fill color
colorBackgroundDisabled[] = { 0, 0, 0, 0 }; // Disabled fill color
//Textures
textureChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; //Texture of checked CheckBox.
textureUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; //Texture of unchecked CheckBox.
textureFocusedChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa"; //Texture of checked focused CheckBox (Could be used for showing different texture when focused).
textureFocusedUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa"; //Texture of unchecked focused CheckBox.
textureHoverChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa";
textureHoverUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa";
texturePressedChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa";
texturePressedUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa";
textureDisabledChecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_checked_ca.paa";
textureDisabledUnchecked = "\A3\Ui_f\data\GUI\RscCommon\RscCheckBox\CheckBox_unchecked_ca.paa";
tooltip = ""; // Tooltip text
tooltipColorShade[] = { 0, 0, 0, 1 }; // Tooltip background color
tooltipColorText[] = { 1, 1, 1, 1 }; // Tooltip text color
tooltipColorBox[] = { 1, 1, 1, 1 }; // Tooltip frame color
//Sounds
soundClick[] = { "\A3\ui_f\data\sound\RscButton\soundClick", 0.09, 1 }; // Sound played after control is activated in format {file, volume, pitch}
soundEnter[] = { "\A3\ui_f\data\sound\RscButton\soundEnter", 0.09, 1 }; // Sound played when mouse cursor enters the control
soundPush[] = { "\A3\ui_f\data\sound\RscButton\soundPush", 0.09, 1 }; // Sound played when the control is pushed down
soundEscape[] = { "\A3\ui_f\data\sound\RscButton\soundEscape", 0.09, 1 }; // Sound played when the control is released after pushing down
};
class RscXSliderH {
style = 1024;
type = 43;
shadow = 2;
x = 0;
y = 0;
h = 0.029412;
w = 0.400000;
color[] = {
1, 1, 1, 0.7
};
colorActive[] = {
1, 1, 1, 1
};
colorDisabled[] = {
1, 1, 1, 0.500000
};
arrowEmpty = "\A3\ui_f\data\gui\cfg\slider\arrowEmpty_ca.paa";
arrowFull = "\A3\ui_f\data\gui\cfg\slider\arrowFull_ca.paa";
border = "\A3\ui_f\data\gui\cfg\slider\border_ca.paa";
thumb = "\A3\ui_f\data\gui\cfg\slider\thumb_ca.paa";
};
class RscText {
x = 0;
y = 0;
h = 0.037;
w = 0.3;
type = 0;
style = 0;
shadow = 1;
colorShadow[] = {0, 0, 0, 0.5};
font = "PuristaMedium";
SizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
text = "";
colorText[] = {1, 1, 1, 1.0};
colorBackground[] = {0, 0, 0, 0};
linespacing = 1;
};
class RscTitle:RscText {
style = 0;
shadow = 0;
sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
colorText[] = {0.95, 0.95, 0.95, 1};
};
class RscShortcutButton {
idc = -1;
style = 0;
default = 0;
shadow = 1;
w = 0.183825;
h = "( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 20)";
color[] = {1,1,1,1.0};
colorFocused[] = {1,1,1,1.0};
color2[] = {0.95,0.95,0.95,1};
colorDisabled[] = {1,1,1,0.25};
colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])",1};
colorBackgroundFocused[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])",1};
colorBackground2[] = {1,1,1,1};
animTextureDefault = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa";
animTextureNormal = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa";
animTextureDisabled = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\normal_ca.paa";
animTextureOver = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\over_ca.paa";
animTextureFocused = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\focus_ca.paa";
animTexturePressed = "\A3\ui_f\data\GUI\RscCommon\RscShortcutButton\down_ca.paa";
periodFocus = 1.2;
periodOver = 0.8;
class HitZone
{
left = 0.0;
top = 0.0;
right = 0.0;
bottom = 0.0;
};
class ShortcutPos
{
left = 0;
top = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 20) - ( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2";
w = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1) * (3/4)";
h = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
};
class TextPos
{
left = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1) * (3/4)";
top = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 20) - ( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2";
right = 0.005;
bottom = 0.0;
};
period = 0.4;
font = "PuristaMedium";
size = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
text = "";
soundEnter[] = {"\A3\ui_f\data\sound\RscButton\soundEnter",0.09,1};
soundPush[] = {"\A3\ui_f\data\sound\RscButton\soundPush",0.09,1};
soundClick[] = {"\A3\ui_f\data\sound\RscButton\soundClick",0.09,1};
soundEscape[] = {"\A3\ui_f\data\sound\RscButton\soundEscape",0.09,1};
action = "";
class Attributes
{
font = "PuristaMedium";
color = "#E5E5E5";
align = "left";
shadow = "true";
};
class AttributesImage
{
font = "PuristaMedium";
color = "#E5E5E5";
align = "left";
};
};
class RscControlsGroup {
type = 15;
idc = -1;
x = 0;
y = 0;
w = 1;
h = 1;
shadow = 0;
style = 16;
class ScrollBar {
color[] = {1, 1, 1, 0.6};
colorActive[] = {1, 1, 1, 1};
colorDisabled[] = {1, 1, 1, 0.3};
thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa";
arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa";
arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa";
border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa";
shadow = 0;
scrollSpeed = 0.05;
};
class VScrollbar:ScrollBar {
width = 0.021;
autoScrollSpeed = -1;
autoScrollDelay = 5;
autoScrollRewind = 0;
shadow = 0;
color[] = {1, 1, 1, 0.6};
};
class HScrollbar:ScrollBar {
height = 0.028;
shadow = 0;
color[] = {1, 1, 1, 0.6};
};
//class ListScrollBar : ScrollBar {};
class Controls {};
};
class RscControlsGroupNoScrollbars : RscControlsGroup {
class VScrollbar : VScrollbar {
width = 0;
};
class HScrollbar : HScrollbar {
height = 0;
};
};
class RscButtonMenu:RscShortcutButton {
idc = -1;
type = 16;
style = "0x02 + 0xC0";
default = 0;
shadow = 0;
x = 0;
y = 0;
w = 0.095589;
h = 0.039216;
animTextureNormal = "#(argb,8,8,3)color(1,1,1,1)";
animTextureDisabled = "#(argb,8,8,3)color(1,1,1,1)";
animTextureOver = "#(argb,8,8,3)color(1,1,1,1)";
animTextureFocused = "#(argb,8,8,3)color(1,1,1,1)";
animTexturePressed = "#(argb,8,8,3)color(1,1,1,1)";
animTextureDefault = "#(argb,8,8,3)color(1,1,1,1)";
colorBackground[] = {0,0,0,0.8};
colorBackgroundFocused[] = {1,1,1,1};
colorBackground2[] = {0.75,0.75,0.75,1};
color[] = {1,1,1,1};
colorFocused[] = {0,0,0,1};
color2[] = {0,0,0,1};
colorText[] = {1,1,1,1};
colorDisabled[] = {1,1,1,0.25};
period = 1.2;
periodFocus = 1.2;
periodOver = 1.2;
size = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
sizeEx = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)";
tooltipColorText[] = {1,1,1,1};
tooltipColorBox[] = {1,1,1,1};
tooltipColorShade[] = {0,0,0,0.65};
class TextPos
{
left = "0.25 * ( ((safezoneW / safezoneH) min 1.2) / 40)";
top = "( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) - ( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)) / 2";
right = 0.005;
bottom = 0.0;
};
class Attributes
{
font = "PuristaLight";
color = "#E5E5E5";
align = "left";
shadow = "false";
};
class ShortcutPos
{
left = "(6.25 * ( ((safezoneW / safezoneH) min 1.2) / 40)) - 0.0225 - 0.005";
top = 0.005;
w = 0.0225;
h = 0.03;
};
soundEnter[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundEnter",0.09,1};
soundPush[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundPush",0.09,1};
soundClick[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundClick",0.09,1};
soundEscape[] = {"\A3\ui_f\data\sound\RscButtonMenu\soundEscape",0.09,1};
textureNoShortcut = "";
};
class TAW_VDMenu {
idd = MENU_IDD;
name = "TAW_VDMenu";
movingEnabled = 0;
enableSimulation = 1;
onLoad = "((_this select 0) displayCtrl 2999) ctrlSetFade 1; ((_this select 0) displayCtrl 2999) ctrlCommit 0;";
class controlsBackground {
class TitleBackground : RscText {
colorBackground[] = { "(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", "(profilenamespace getvariable ['GUI_BCG_RGB_A',0.7])" };
idc = -1;
x = .3;
y = .2;
w = .5;
h = (1 / 25);
};
class MainBackground : RscText {
colorBackground[] = { 0, 0, 0, .7 };
idc = -1;
x = .3;
y = .2 + (11 / 250);
w = .5;
h = .57 - (22 / 250);
};
class Title : RscTitle {
colorBackround[] = { 0, 0, 0, 0 };
idc = -1;
text = "View Settings (SCRIPT)";
x = .3;
y = .2;
w = .8;
h = (1 / 25);
};
class OnFootText : RscText {
idc = -1;
text = "Infantry:";
x = .32;
y = .258;
w = .275;
h = .04;
};
class inCarText : OnFootText {
text = "Ground:";
y = .305;
};
class inAirText : OnFootText {
text = "Air:";
y = .355;
};
class ObjectText : OnFootText {
text = "Object:";
y = .655;
};
class DroneText : OnFootText {
text = "Drone:";
y = .405;
};
class TerrainBackground : TitleBackground {
text = "Grass Settings";
shadow = 0;
y = .46;
};
class ObjectBackground : TitleBackground {
text = "Object Settings";
y = .55;
};
class ButtonClose : RscButtonMenu {
idc = -1;
text = "Close";
onButtonClick = "closeDialog 0;";
x = 0.3;
y = 0.77 - (1 / 25);
w = (6.25 / 40);
h = (1 / 25);
};
class SaveManagerBtn:ButtonClose {
text = "Saves";
onButtonClick = "[] call tawvd_fnc_openSaveManager;";
x = .465;
};
};
class controls {
//Sliders
class VD_onFoot_slider : RscXSliderH {
idc = INFANTRY_SLIDER;
text = "";
onSliderPosChanged = "[0, _this select 1] call TAWVD_fnc_onSliderChanged;";
toolTip = "View Distance while on foot";
x = .42;
y = .30 - (1 / 25);
w = "9 * ( ((safezoneW / safezoneH) min 1.2) / 40)";
h = "1 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)";
};
class VD_inCar_slider : VD_onFoot_slider {
idc = GROUND_SLIDER;
toolTip = "View distance while in a ground vehicle";
onSliderPosChanged = "[1, _this select 1] call TAWVD_fnc_onSliderChanged;";
y = .35 - (1 / 25);
};
class VD_inAir_slider : VD_onFoot_slider {
idc = AIR_SLIDER;
toolTip = "View distance while in an aircraft";
onSliderPosChanged = "[2, _this select 1] call TAWVD_fnc_onSliderChanged;";
y = .40 - (1 / 25);
};
class VD_Object_slider : VD_onFoot_slider {
idc = OBJECT_SLIDER;
toolTip = "Object rendering distance";
onSliderPosChanged = "[3, _this select 1] call TAWVD_fnc_onSliderChanged;";
y = .7 - (1 / 25);
};
class VD_Drone_slider:VD_onFoot_slider {
idc = DRONE_SLIDER;
toolTip = "View distance while operating a UAV/UGV";
onSliderPosChanged = "[4, _this select 1] call TAWVD_fnc_onSliderChanged;";
y = .45 - (1 / 25);
}
//Values (RscEdit Butons)
class VD_onFoot_Edit : RscEdit {
idc = INFANTRY_EDIT;
text = "";
onKeyUp = "[_this select 0, _this select 1, 'ground',true] call TAWVD_fnc_onChar;";
x = .7;
y = .258;
w = .08;
h = .04;
};
class VD_inCar_Edit : VD_onFoot_Edit {
idc = GROUND_EDIT;
onKeyUp = "[_this select 0, _this select 1, 'vehicle',true] call TAWVD_fnc_onChar;";
y = .31;
};
class VD_inAir_Edit : VD_onFoot_Edit {
idc = AIR_EDIT;
onKeyUp = "[_this select 0, _this select 1, 'air',true] call TAWVD_fnc_onChar;";
y = .36;
};
class VD_inDrone_Edit:VD_onFoot_Edit {
idc = DRONE_EDIT;
onKeyUp = "[_this select 0, _this select 1, 'drone',true] call TAWVD_fnc_onChar;";
y = .41;
};
class VD_Object_Edit : VD_onFoot_Edit {
idc = OBJECT_EDIT;
onKeyUp = "[_this select 0, _this select 1, 'object',true] call TAWVD_fnc_onChar;";
y = .656;
};
//Grass Settings
class VD_terrain_none {
idc = TERRAIN_NONE;
type = 11;
style = 0;
font = "PuristaLight";
color[] = { 1, 1, 1, 1 };
colorActive[] = { 1, 0.2, 0.2, 1 };
colorDisabled[] = {0, 0, 0, 1};
soundEnter[] = { "\A3\ui_f\data\sound\onover", 0.09, 1 };
soundPush[] = { "\A3\ui_f\data\sound\new1", 0.0, 0 };
soundClick[] = { "\A3\ui_f\data\sound\onclick", 0.07, 1 };
soundEscape[] = { "\A3\ui_f\data\sound\onescape", 0.09, 1 };
text = "None";
action = "['none'] call TAWVD_fnc_onTerrainChanged;";
sizeEx = 0.04;
x = .38; y = .505;
w = .275; h = .04;
};
class VD_terrain_low : VD_terrain_none {
idc = -1;
text = "Low";
action = "['low'] call TAWVD_fnc_onTerrainChanged;";
x = .47;
};
class VD_terrain_normal : VD_terrain_none {
idc = -1;
text = "Normal";
action = "['norm'] call TAWVD_fnc_onTerrainChanged;";
x = .56;
};
class VD_terrain_high : VD_terrain_none {
idc = -1;
text = "High";
action = "['high'] call TAWVD_fnc_onTerrainChanged;";
x = .67;
};
class ObjectSyncCheckbox : RscCheckbox
{
idc = 2931;
x = .32; y = .6;
tooltip = "Sync object rendering with view rendering";
onCheckedChanged = "if((_this select 1) == 1) then {tawvd_syncObject = true;ctrlEnable [2941,false]; ctrlEnable [2942,false];} else {tawvd_syncObject = false; ctrlEnable [2942,true]; ctrlEnable [2941,true];};";
w = 1 * GUI_GRID_CENTER_W;
h = 1 * GUI_GRID_CENTER_H;
};
class ObjectSynctext : RscText {
idc = -1;
text = "Sync with view";
x = .345; y = .596;
w = .35; h = .04;
};
class Manager:RscControlsGroup {
idc = MANAGER_GROUP;
x = -0.21; y = .2;
w = .5; h = 3;
class Controls {
class SaveLoadGroup:RscControlsGroupNoScrollbars {
idc = SAVELOAD_GROUP;
x = 0;
y = 0;
w = .5;
h = 3;
class Controls {
class MyTitleBackground:RscText {
colorBackground[] = { "(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", "(profilenamespace getvariable ['GUI_BCG_RGB_A',0.7])" };
idc = -1;
x = 0;
y = 0;
w = .5;
h = (1 / 25);
};
class Title : RscTitle {
colorBackround[] = { 0, 0, 0, 0 };
idc = -1;
text = "Save Manager";
x = 0;
y = 0;
w = .8;
h = (1 / 25);
};
class MainBackground:RscText {
colorBackground[] = { 0, 0, 0, .7 };
idc = -1;
x = 0;
y = 0 + (11 / 250);
w = .5;
h = .57 - (22 / 250);
};
class SaveList:RscListBox {
idc = SAVES_LIST;
sizeEx = 0.04;
colorBackground[] = {0.1,0.1,0.1,0.9};
x = 0; y = 0 + (11 / 250);
w = .5; h = .49 - (22 / 250);
onLBSelChanged = "_this call TAWVD_fnc_onSaveSelectionChanged;";
};
class SaveSlotName:VD_onFoot_Edit {
idc = SLOT_NAME;
text = "SAVE NAME";
colorBackground[] = {0,0,0,0.6};
onKeyUp = "";
x = .025; y = .42 + (11 / 250);
w = .45;
};
class SaveButton:RscButtonMenu {
text = "Save";
onButtonClick = "[] call TAWVD_fnc_onSavePressed;";
x = 0;
y = 0.57 - (1 / 25);
w = (6.25 / 40);
h = (1 / 25);
};
class HideButton:RscButtonMenu {
text = "Hide";
onButtonClick = "((findDisplay 2900) displayCtrl 2999) ctrlSetFade 1; ((findDisplay 2900) displayCtrl 2999) ctrlCommit 0.3;";
x = .16;
y = 0.57 - (1 / 25);
w = (6.25 / 40);
h = (1 / 25);
};
};
};
};
};
};
};Exif MM * 8 ( 1 2 ҇i
'
'Adobe Photoshop CS5.1 Windows 2019:05:25 23:43:06 0221 n v( ~
H H Adobe_CM Adobe d
P "
?
3 !1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw 5 !1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?
i4}mW-5՝lK-SZoMZؖx^G\F2m{iu}72C1n>cʬiepm{?u\'Ve訵=ԹX>Uۭa%=<bl?] OW]6u~dq1sߊMU?Yݞp[̪ckmMvCXһN}~Wg{b
pi@u\v59lgz+`1HhL{G&T\^% Xȶ2Kjfz bm8^Wߤo{2n~c}{P{)mqH{3ŮYzkTŀ\#PH\2(yL߬џܶ^Q[I纬T\ g貲>meVz~Uo6-wQs=JÑ1ՏYc2̪r_]S/t|כ2p}s^ohg)53ooǪ˒]2is=QSW$N@t7F[Bgf/_RKbJCѶ+OJIZk*4)AJ
Jc B%jc B+SJ4ji7qFӠ~ϥIR1J
[OV(O())hJdJI%?]ADΟ~TI}~C[hqXK5G#2c]q{K+4$ ]h Dq' ?YG+~u.}{O{
pKx.?1Xf~;"֘{ٮXW [q}c /Dž=C ksn