123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852 |
- // cTab - Commander's Tablet with FBCB2 Blue Force Tracking
- // Battlefield tablet to access real time intel and blue force tracker.
- // By - Riouken
- // http://forums.bistudio.com/member.php?64032-Riouken
- // You may re-use any of this work as long as you provide credit back to me.
- // keys.sqf parses the userconfig
- #include "functions\keys.sqf"
- #include "\ClonecTab\shared\cTab_gui_macros.hpp"
- // Exit if this is machine has no interface, i.e. is a headless client (HC)
- if (!hasInterface) exitWith {};
- // Get a rsc layer for for our displays
- cTabRscLayer = ["cTab"] call BIS_fnc_rscLayer;
- cTabRscLayerMailNotification = ["cTab_mailNotification"] call BIS_fnc_rscLayer;
- // Set up user markers
- cTab_userMarkerTransactionId = -1;
- cTab_userMarkerLists = [];
- [] call cTab_fnc_getUserMarkerList;
- // Set up side specific encryption keys
- if (isNil "cTab_encryptionKey_west") then {
- cTab_encryptionKey_west = "b";
- };
- if (isNil "cTab_encryptionKey_east") then {
- cTab_encryptionKey_east = "o";
- };
- if (isNil "cTab_encryptionKey_guer") then {
- cTab_encryptionKey_guer = call {
- if (([west,resistance] call BIS_fnc_areFriendly) and {!([east,resistance] call BIS_fnc_areFriendly)}) exitWith {
- "b"
- };
- if (([east,resistance] call BIS_fnc_areFriendly) and {!([west,resistance] call BIS_fnc_areFriendly)}) exitWith {
- "o"
- };
- "i"
- };
- };
- if (isNil "cTab_encryptionKey_civ") then {
- cTab_encryptionKey_civ = "c";
- };
- // Set up empty lists
- cTabBFTmembers = [];
- cTabBFTgroups = [];
- cTabBFTvehicles = [];
- cTabUAVlist = [];
- cTabHcamlist = [];
- cTabNotificationCache = [];
- // set current player object in cTab_player and run a check on every frame to see if there is a change
- cTab_player = objNull;
- ["cTab_checkForPlayerChange", "onEachFrame", {
- if !(cTab_player isEqualTo (missionNamespace getVariable ["BIS_fnc_moduleRemoteControl_unit",player])) then {
- cTab_player = missionNamespace getVariable ["BIS_fnc_moduleRemoteControl_unit",player];
- // close any interface that might still be open
- call cTab_fnc_close;
- //prep the arrays that will hold ctab data
- cTabBFTmembers = [];
- cTabBFTgroups = [];
- cTabBFTvehicles = [];
- cTabUAVlist = [];
- cTabHcamlist = [];
- call cTab_fnc_updateLists;
- call cTab_fnc_updateUserMarkerList;
- // remove msg notification
- cTabRscLayerMailNotification cutText ["", "PLAIN"];
- };
- }] call BIS_fnc_addStackedEventHandler;
- /*
- Figure out the scaling factor based on the current map (island) being played
- Requires the scale of the map control to be at 0.001
- */
- call {
- private ["_displayName","_display","_mapCtrl","_mapScreenPos","_mapScreenX_left","_mapScreenH","_mapScreenY_top","_mapScreenY_middle","_mapWorldY_top","_mapWorldY_middle"];
-
- _displayName = "cTab_mapSize_dsp";
- cTabRscLayer cutRsc [_displayName,"PLAIN",0, false];
- while {isNull (uiNamespace getVariable _displayName)} do {};
- _display = uiNamespace getVariable _displayName;
- _mapCtrl = _display displayCtrl 1110;
- // get the screen postition of _mapCtrl as [x, y, w, h]
- _mapScreenPos = ctrlPosition _mapCtrl;
- // Find the screen coordinate for the left side
- _mapScreenX_left = _mapScreenPos select 0;
- // Find the screen height
- _mapScreenH = _mapScreenPos select 3;
- // Find the screen coordinate for top Y
- _mapScreenY_top = _mapScreenPos select 1;
- // Find the screen coordinate for middle Y
- _mapScreenY_middle = _mapScreenY_top + _mapScreenH / 2;
- // Get world coordinate for top Y in meters
- _mapWorldY_top = (_mapCtrl ctrlMapScreenToWorld [_mapScreenX_left,_mapScreenY_top]) select 1;
- // Get world coordinate for middle Y in meters
- _mapWorldY_middle = (_mapCtrl ctrlMapScreenToWorld [_mapScreenX_left,_mapScreenY_middle]) select 1;
- // calculate the difference between top and middle world coordinates, devide by the screen height and return
- cTabMapScaleFactor = (abs(_mapWorldY_middle - _mapWorldY_top)) / _mapScreenH;
- _display closeDisplay 0;
- uiNamespace setVariable [_displayName, displayNull];
- };
- cTabMapScaleUAV = 0.8 / cTabMapScaleFactor;
- cTabMapScaleHCam = 0.3 / cTabMapScaleFactor;
- cTabDisplayPropertyGroups = [
- ["cTab_Tablet_dlg","Tablet"],
- ];
- cTabSettings = [];
- [cTabSettings,"COMMON",[
- ["mode","BFT"],
- ["mapScaleMin",0.1],
- ["mapScaleMax",2 ^ round(sqrt(2666 * cTabMapScaleFactor / 1024))]
- ]] call BIS_fnc_setToPairs;
- [cTabSettings,"Main",[
- ]] call BIS_fnc_setToPairs;
- [cTabSettings,"Tablet",[
- ["dlgIfPosition",[]],
- ["mode","DESKTOP"],
- ["showIconText",true],
- ["mapWorldPos",[]],
- ["mapScaleDsp",2],
- ["mapScaleDlg",2],
- ["mapTypes",[["SAT",IDC_CTAB_SCREEN],["TOPO",IDC_CTAB_SCREEN_TOPO]]],
- ["mapType","SAT"],
- ["uavCam",""],
- ["hCam",""],
- ["mapTools",true],
- ["nightMode",2],
- ["brightness",0.9]
- ]] call BIS_fnc_setToPairs;
- ]] call BIS_fnc_setToPairs;
- ]] call BIS_fnc_setToPairs;
- // set base colors from BI -- Helps keep colors matching if user changes colors in options.
- _r = profilenamespace getvariable ['Map_BLUFOR_R',0];
- _g = profilenamespace getvariable ['Map_BLUFOR_G',0.8];
- _b = profilenamespace getvariable ['Map_BLUFOR_B',1];
- _a = profilenamespace getvariable ['Map_BLUFOR_A',0.8];
- cTabColorBlue = [_r,_g,_b,_a];
- _r = profilenamespace getvariable ['Map_OPFOR_R',0];
- _g = profilenamespace getvariable ['Map_OPFOR_G',1];
- _b = profilenamespace getvariable ['Map_OPFOR_B',1];
- _a = profilenamespace getvariable ['Map_OPFOR_A',0.8];
- cTabColorRed = [_r,_g,_b,_a];
- _r = profilenamespace getvariable ['Map_Independent_R',0];
- _g = profilenamespace getvariable ['Map_Independent_G',1];
- _b = profilenamespace getvariable ['Map_Independent_B',1];
- _a = profilenamespace getvariable ['Map_OPFOR_A',0.8];
- cTabColorGreen = [_r,_g,_b,_a];
- // Define Fire-Team colors
- // MAIN,RED,GREEN,BLUE,YELLOW
- cTabColorTeam = [cTabColorBlue,[200/255,0,0,0.8],[0,199/255,0,0.8],[0,0,200/255,0.8],[225/255,225/255,0,0.8]];
- // define items that enable head cam
- if (isNil "cTab_helmetClass_has_HCam") then {
- if (!isNil "cTab_helmetClass_has_HCam_server") then {
- cTab_helmetClass_has_HCam = cTab_helmetClass_has_HCam_server;
- } else {
- cTab_helmetClass_has_HCam = ["H_HelmetB_light","H_Helmet_Kerry","H_HelmetSpecB","H_HelmetO_ocamo","BWA3_OpsCore_Fleck_Camera","BWA3_OpsCore_Schwarz_Camera","BWA3_OpsCore_Tropen_Camera"];
- };
- };
- // strip list of invalid config names and duplicates to save time checking through them later
- _classNames = [];
- {
- if (isClass (configfile >> "CfgWeapons" >> _x) && _classNames find _x == -1) then {
- 0 = _classNames pushBack _x;
- };
- } count cTab_helmetClass_has_HCam;
- // iterate through all class names and add child classes, so we end up with a list of helmet classes that have the defined helmet classes as parents
- {
- _childClasses = "inheritsFrom _x == (configfile >> 'CfgWeapons' >> '" + _x + "')" configClasses (configfile >> "CfgWeapons");
- {
- _childClassName = configName _x;
- if (_classNames find _childClassName == -1) then {
- 0 = _classNames pushBack configName _x;
- };
- } count _childClasses;
- } forEach _classNames;
- cTab_helmetClass_has_HCam = [] + _classNames;
- // add cTab_updatePulse event handler triggered periodically by the server
- ["cTab_updatePulse",cTab_fnc_updateLists] call CBA_fnc_addEventHandler;
- // fnc to set various text and icon sizes
- cTab_fnc_update_txt_size = {
- cTabIconSize = cTabTxtFctr * 2;
- cTabIconManSize = cTabIconSize * 0.75;
- cTabGroupOverlayIconSize = cTabIconSize * 1.625;
- cTabUserMarkerArrowSize = cTabTxtFctr * 8 * cTabMapScaleFactor;
- cTabTxtSize = cTabTxtFctr / 12 * 0.035;
- cTabAirContactGroupTxtSize = cTabTxtFctr / 12 * 0.060;
- cTabAirContactSize = cTabTxtFctr / 12 * 32;
- cTabAirContactDummySize = cTabTxtFctr / 12 * 20;
- };
- // Beginning text and icon size
- cTabTxtFctr = 12;
- call cTab_fnc_update_txt_size;
- cTabBFTtxt = true;
- // Draw Map Tolls (Hook)
- cTabDrawMapTools = false;
- // Base defines.
- cTabUavViewActive = false;
- cTabUAVcams = [];
- cTabCursorOnMap = false;
- cTabMapCursorPos = [0,0];
- cTabMapWorldPos = [];
- cTabMapScale = 0.5;
- // Initialize all uiNamespace variables
- uiNamespace setVariable ["cTab_Tablet_dlg", displayNull];
- // Set up the array that will hold text messages.
- player setVariable ["ctab_messages",[]];
- // cTabIfOpenStart will be set to true while interface is starting and prevent further open attempts
- cTabIfOpenStart = false;
- /*
- Function handling IF_Main keydown event
- Based on player equipment and the vehicle type he might be in, open or close a cTab device as Main interface.
- No Parameters
- Returns TRUE when action was taken (interface opened or closed)
- Returns FALSE when no action was taken (i.e. player has no cTab device / is not in cTab enabled vehicle)
- */
- cTab_fnc_onIfMainPressed = {
- if (cTabIfOpenStart) exitWith {false};
- _previousInterface = "";
- if (cTabUavViewActive) exitWith {
- objNull remoteControl (gunner cTabActUav);
- vehicle cTab_player switchCamera 'internal';
- cTabUavViewActive = false;
- call cTab_fnc_onIfTertiaryPressed;
- true
- };
- if (!isNil "cTabIfOpen" && {cTabIfOpen select 0 == 0}) exitWith {
- // close Main
- call cTab_fnc_close;
- true
- };
- if !(isNil "cTabIfOpen") then {
- _previousInterface = cTabIfOpen select 1;
- // close Secondary / Tertiary
- call cTab_fnc_close;
- };
-
- _player = cTab_player;
- _vehicle = vehicle _player;
- _interfaceName = call {
- if ([_player,["ItemcTab"]] call cTab_fnc_checkGear) exitWith {"cTab_Tablet_dlg"};
- // default
- ""
- };
-
- if (_interfaceName != "" && _interfaceName != _previousInterface) exitWith {
- // queue the start up of the interface as we might still have one closing down
- [{
- if (isNil "cTabIfOpen") then {
- [_this select 1] call CBA_fnc_removePerFrameHandler;
- (_this select 0) call cTab_fnc_open;
- };
- },0,[0,_interfaceName,_player,_vehicle]] call CBA_fnc_addPerFrameHandler;
- true
- };
-
- false
- };
- /*
- Function handling IF_Secondary keydown event
- Based on player equipment and the vehicle type he might be in, open or close a cTab device as Secondary interface.
- No Parameters
- Returns TRUE when action was taken (interface opened or closed)
- Returns FALSE when no action was taken (i.e. player has no cTab device / is not in cTab enabled vehicle)
- */
- cTab_fnc_onIfSecondaryPressed = {
- if (cTabIfOpenStart) exitWith {false};
- _previousInterface = "";
- if (cTabUavViewActive) exitWith {
- objNull remoteControl (gunner cTabActUav);
- vehicle cTab_player switchCamera 'internal';
- cTabUavViewActive = false;
- call cTab_fnc_onIfTertiaryPressed;
- true
- };
- if (!isNil "cTabIfOpen" && {cTabIfOpen select 0 == 1}) exitWith {
- // close Secondary
- call cTab_fnc_close;
- true
- };
- if !(isNil "cTabIfOpen") then {
- _previousInterface = cTabIfOpen select 1;
- // close Main / Tertiary
- call cTab_fnc_close;
- };
-
- _player = cTab_player;
- _vehicle = vehicle _player;
- _interfaceName = call {
- if ([_player,["ItemcTab"]] call cTab_fnc_checkGear) exitWith {"cTab_Tablet_dlg"};
- // default
- ""
- };
-
- if (_interfaceName != "" && _interfaceName != _previousInterface) exitWith {
- // queue the start up of the interface as we might still have one closing down
- [{
- if (isNil "cTabIfOpen") then {
- [_this select 1] call CBA_fnc_removePerFrameHandler;
- (_this select 0) call cTab_fnc_open;
- };
- },0,[1,_interfaceName,_player,_vehicle]] call CBA_fnc_addPerFrameHandler;
- true
- };
-
- false
- };
- /*
- Function handling IF_Tertiary keydown event
- Based on player equipment and the vehicle type he might be in, open or close a cTab device as Tertiary interface.
- No Parameters
- Returns TRUE when action was taken (interface opened or closed)
- Returns FALSE when no action was taken (i.e. player has no cTab device / is not in cTab enabled vehicle)
- */
- cTab_fnc_onIfTertiaryPressed = {
- if (cTabIfOpenStart) exitWith {false};
- _previousInterface = "";
- if (cTabUavViewActive) then {
- objNull remoteControl (gunner cTabActUav);
- vehicle cTab_player switchCamera 'internal';
- cTabUavViewActive = false;
- true
- };
- if (!isNil "cTabIfOpen" && {cTabIfOpen select 0 == 2}) exitWith {
- // close Tertiary
- call cTab_fnc_close;
- true
- };
- if !(isNil "cTabIfOpen") then {
- _previousInterface = cTabIfOpen select 1;
- // close Main / Secondary
- call cTab_fnc_close;
- };
-
- _player = cTab_player;
- _vehicle = vehicle _player;
- _interfaceName = call {
- if ([_player,["ItemcTab"]] call cTab_fnc_checkGear) exitWith {"cTab_Tablet_dlg"};
- // default
- ""
- };
-
- if (_interfaceName != "" && _interfaceName != _previousInterface) exitWith {
- // queue the start up of the interface as we might still have one closing down
- [{
- if (isNil "cTabIfOpen") then {
- [_this select 1] call CBA_fnc_removePerFrameHandler;
- (_this select 0) call cTab_fnc_open;
- };
- },0,[2,_interfaceName,_player,_vehicle]] call CBA_fnc_addPerFrameHandler;
- true
- };
-
- false
- };
- /*
- Function handling Zoom_In keydown event
- If supported cTab interface is visible, decrease map scale
- Returns TRUE when action was taken
- Returns FALSE when no action was taken (i.e. no interface open, or unsupported interface)
- */
- cTab_fnc_onZoomInPressed = {
- if (cTabIfOpenStart || (isNil "cTabIfOpen")) exitWith {false};
- _displayName = cTabIfOpen select 1;
- if !([_displayName] call cTab_fnc_isDialog) exitWith {
- _mapScale = ([_displayName,"mapScaleDsp"] call cTab_fnc_getSettings) / 2;
- _mapScaleMin = [_displayName,"mapScaleMin"] call cTab_fnc_getSettings;
- if (_mapScale < _mapScaleMin) then {
- _mapScale = _mapScaleMin;
- };
- _mapScale = [_displayName,[["mapScaleDsp",_mapScale]]] call cTab_fnc_setSettings;
- true
- };
- false
- };
- /*
- Function handling Zoom_Out keydown event
- If supported cTab interface is visible, increase map scale
- Returns TRUE when action was taken
- Returns FALSE when no action was taken (i.e. no interface open, or unsupported interface)
- */
- cTab_fnc_onZoomOutPressed = {
- if (cTabIfOpenStart || (isNil "cTabIfOpen")) exitWith {false};
- _displayName = cTabIfOpen select 1;
- if !([_displayName] call cTab_fnc_isDialog) exitWith {
- _mapScale = ([_displayName,"mapScaleDsp"] call cTab_fnc_getSettings) * 2;
- _mapScaleMax = [_displayName,"mapScaleMax"] call cTab_fnc_getSettings;
- if (_mapScale > _mapScaleMax) then {
- _mapScale = _mapScaleMax;
- };
- _mapScale = [_displayName,[["mapScaleDsp",_mapScale]]] call cTab_fnc_setSettings;
- true
- };
- false
- };
- /*
- Function to toggle text next to BFT icons
- Parameter 0: String of uiNamespace variable for which to toggle showIconText for
- Returns TRUE
- */
- cTab_fnc_iconText_toggle = {
- _displayName = _this select 0;
- if (cTabBFTtxt) then {cTabBFTtxt = false} else {cTabBFTtxt = true};
- [_displayName,[["showIconText",cTabBFTtxt]]] call cTab_fnc_setSettings;
- true
- };
- /*
- Function to toggle mapType to the next one in the list of available map types
- Parameter 0: String of uiNamespace variable for which to toggle to mapType for
- Returns TRUE
- */
- cTab_fnc_mapType_toggle = {
- _displayName = _this select 0;
- _mapTypes = [_displayName,"mapTypes"] call cTab_fnc_getSettings;
- _currentMapType = [_displayName,"mapType"] call cTab_fnc_getSettings;
- _currentMapTypeIndex = [_mapTypes,_currentMapType] call BIS_fnc_findInPairs;
- if (_currentMapTypeIndex == count _mapTypes - 1) then {
- [_displayName,[["mapType",_mapTypes select 0 select 0]]] call cTab_fnc_setSettings;
- } else {
- [_displayName,[["mapType",_mapTypes select (_currentMapTypeIndex + 1) select 0]]] call cTab_fnc_setSettings;
- };
- true
- };
- /*
- Function to toggle showMenu
- Parameter 0: String of uiNamespace variable for which to toggle showMenu for
- Returns TRUE
- */
- cTab_fnc_showMenu_toggle = {
- _displayName = _this select 0;
- _showMenu = [_displayName,"showMenu"] call cTab_fnc_getSettings;
- _showMenu = !_showMenu;
- [_displayName,[["showMenu",_showMenu]]] call cTab_fnc_setSettings;
- true
- };
- /*
- Function to toggle night mode
- Parameter 0: String of uiNamespace variable for which to toggle nightMode for
- Returns TRUE
- */
- cTab_fnc_toggleNightMode = {
- _displayName = _this select 0;
- _nightMode = [_displayName,"nightMode"] call cTab_fnc_getSettings;
-
- if (_nightMode != 2) then {
- if (_nightMode == 0) then {_nightMode = 1} else {_nightMode = 0};
- [_displayName,[["nightMode",_nightMode]]] call cTab_fnc_setSettings;
- };
-
- true
- };
- /*
- Function to increase brightness
- Parameter 0: String of uiNamespace variable for which to increase brightness for
- Returns TRUE
- */
- cTab_fnc_incBrightness = {
- _displayName = _this select 0;
- _brightness = [_displayName,"brightness"] call cTab_fnc_getSettings;
- _brightness = _brightness + 0.1;
- // make sure brightness is not larger than 1
- if (_brightness > 1) then {_brightness = 1};
- [_displayName,[["brightness",_brightness]]] call cTab_fnc_setSettings;
-
- true
- };
- /*
- Function to decrease brightness
- Parameter 0: String of uiNamespace variable for which to decreas brightness for
- Returns TRUE
- */
- cTab_fnc_decBrightness = {
- _displayName = _this select 0;
- _brightness = [_displayName,"brightness"] call cTab_fnc_getSettings;
- _brightness = _brightness - 0.1;
- // make sure brightness is not larger than 0.5
- if (_brightness < 0.5) then {_brightness = 0.5};
- [_displayName,[["brightness",_brightness]]] call cTab_fnc_setSettings;
-
- true
- };
- // fnc to increase icon and text size
- cTab_fnc_txt_size_inc = {
- cTabTxtFctr = cTabTxtFctr + 1;
- call cTab_fnc_update_txt_size;
- };
- // fnc to decrease icon and text size
- cTab_fnc_txt_size_dec = {
- if (cTabTxtFctr > 1) then {cTabTxtFctr = cTabTxtFctr - 1};
- call cTab_fnc_update_txt_size;
- };
- // This is drawn every frame on the tablet. fnc
- cTabOnDrawbft = {
- _cntrlScreen = _this select 0;
- _display = ctrlParent _cntrlScreen;
-
- cTabMapWorldPos = [_cntrlScreen] call cTab_fnc_ctrlMapCenter;
- cTabMapScale = ctrlMapScale _cntrlScreen;
- [_cntrlScreen,true] call cTab_fnc_drawUserMarkers;
- [_cntrlScreen,0] call cTab_fnc_drawBftMarkers;
-
- // draw directional arrow at own location
- _veh = vehicle cTab_player;
- _playerPos = getPosASL _veh;
- _heading = direction _veh;
- _cntrlScreen drawIcon ["\A3\ui_f\data\map\VehicleIcons\iconmanvirtual_ca.paa"_playerPos,_heading,"", 1,cTabTxtSize,"TahomaB","right"];
-
- // update hook information
- if (cTabDrawMapTools) then {
- [_display,_cntrlScreen,_playerPos,cTabMapCursorPos,0,false] call cTab_fnc_drawHook;
- };
-
- true
- };
- // This is drawn every frame on the vehicle display. fnc
- cTabOnDrawbftVeh = {
- _cntrlScreen = _this select 0;
- _display = ctrlParent _cntrlScreen;
-
- cTabMapWorldPos = [_cntrlScreen] call cTab_fnc_ctrlMapCenter;
- cTabMapScale = ctrlMapScale _cntrlScreen;
-
- [_cntrlScreen,true] call cTab_fnc_drawUserMarkers;
- [_cntrlScreen,0] call cTab_fnc_drawBftMarkers;
-
- // draw directional arrow at own location
- _veh = vehicle cTab_player;
- _playerPos = getPosASL _veh;
- _heading = direction _veh;
- _cntrlScreen drawIcon ["\A3\ui_f\data\map\VehicleIcons\iconmanvirtual_ca.paa",_playerPos,_heading,"", 1,cTabTxtSize,"TahomaB","right"];
-
- // update hook information
- if (cTabDrawMapTools) then {
- [_display,_cntrlScreen,_playerPos,cTabMapCursorPos,0,false] call cTab_fnc_drawHook;
- };
-
- true
- };
- // This is drawn every frame on the tablet uav screen. fnc
- cTabOnDrawUAV = {
- if (isNil 'cTabActUav') exitWith {};
- if (cTabActUav == player) exitWith {};
-
- _cntrlScreen = _this select 0;
- _display = ctrlParent _cntrlScreen;
- _pos = getPosASL cTabActUav;
-
- [_cntrlScreen,false] call cTab_fnc_drawUserMarkers;
- [_cntrlScreen,0] call cTab_fnc_drawBftMarkers;
-
- // draw icon at own location
- _veh = vehicle cTab_player;
- _cntrlScreen drawIcon ["\A3\ui_f\data\map\VehicleIcons\iconmanvirtual_ca.paa",getPosASL _veh,direction _veh,"", 1,cTabTxtSize,"TahomaB","right"];
-
- // draw icon at UAV location
- _cntrlScreen drawIcon ["\A3\ui_f\data\map\VehicleIcons\iconmanvirtual_ca.paa",_pos,direction cTabActUav,"",0,cTabTxtSize,"TahomaB","right"];
-
- _cntrlScreen ctrlMapAnimAdd [0,cTabMapScaleUAV,_pos];
- ctrlMapAnimCommit _cntrlScreen;
- true
- };
- // This is drawn every frame on the tablet helmet cam screen. fnc
- cTabOnDrawHCam = {
- if (isNil 'cTabHcams') exitWith {};
- _camHost = cTabHcams select 2;
-
- _cntrlScreen = _this select 0;
- _display = ctrlParent _cntrlScreen;
- _pos = getPosASL _camHost;
-
- [_cntrlScreen,false] call cTab_fnc_drawUserMarkers;
- [_cntrlScreen,0] call cTab_fnc_drawBftMarkers;
-
- // draw icon at own location
- _veh = vehicle cTab_player;
- _cntrlScreen drawIcon ["\A3\ui_f\data\map\VehicleIcons\iconmanvirtual_ca.paa",getPosASL _veh,direction _veh,"", 1,cTabTxtSize,"TahomaB","right"];
-
- // draw icon at helmet cam location
- _cntrlScreen drawIcon ["\A3\ui_f\data\map\VehicleIcons\iconmanvirtual_ca.paa",direction _camHost,"",0,cTabTxtSize,"TahomaB","right"];
-
- _cntrlScreen ctrlMapAnimAdd [0,cTabMapScaleHCam,_pos];
- ctrlMapAnimCommit _cntrlScreen;
- true
- };
- //Main loop to add the key handler to the unit.
- [] spawn {
- waitUntil {sleep 0.1;!(IsNull (findDisplay 46))};
-
- ["cTab","ifMain",["Toggle Main Interface","Open cTab device in small overlay mode if available"],{call cTab_fnc_onIfMainPressed},"",[cTab_key_if_main_scancode,cTab_key_if_main_modifiers],false] call cba_fnc_addKeybind;
- ["cTab","ifSecondary",["Toggle Secondary Interface","Open cTab device in interactable mode"],{call cTab_fnc_onIfSecondaryPressed},"",[cTab_key_if_secondary_scancode,cTab_key_if_secondary_modifiers],false] call cba_fnc_addKeybind;
- ["cTab","zoomIn",["Zoom In","Zoom In on map while cTab is in small overlay mode"],{call cTab_fnc_onZoomInPressed},"",[cTab_key_zoom_in_scancode,cTab_key_zoom_in_modifiers],false] call cba_fnc_addKeybind;
- ["cTab","zoomOut",["Zoom Out","Zoom Out on map while cTab is in small overlay mode"],{call cTab_fnc_onZoomOutPressed},"",[cTab_key_zoom_out_scancode,cTab_key_zoom_out_modifiers],false] call cba_fnc_addKeybind;
- ["cTab","toggleIfPosition",["Toggle Interface Position","Toggle overlay mode interface position from left to right or reset interactive mode interface position to default"],{[] call cTab_fnc_toggleIfPosition},"",[cTab_key_toggleIfPosition_scancode,cTab_key_toggleIfPosition_modifiers],false] call cba_fnc_addKeybind;
-
- // if player is curator (ZEUS), setup key handlers
- waitUntil {sleep 0.1;!(isNull player)};
- sleep 2;
- if (player in (call BIS_fnc_listCuratorPlayers)) then {
- [] spawn {
- while {true} do {
- waitUntil {sleep 0.1;!(isNull (findDisplay 312))};
- (findDisplay 312) displayAddEventHandler ["KeyDown","[_this,'keydown'] call cTab_fnc_processCuratorKey"];
- (findDisplay 312) displayAddEventHandler ["KeyUp","[_this,'keyup'] call cTab_fnc_processCuratorKey"];
- waitUntil {sleep 0.1;isNull (findDisplay 312)};
- };
- };
- };
- };
- cTab_msg_gui_load = {
- disableSerialization;
- _return = true;
- _display = uiNamespace getVariable (cTabIfOpen select 1);
- _playerEncryptionKey = call cTab_fnc_getPlayerEncryptionKey;
- _msgArray = cTab_player getVariable [format ["cTab_messages_%1",_playerEncryptionKey],[]];
- _msgControl = _display displayCtrl IDC_CTAB_MSG_LIST;
- _plrlistControl = _display displayCtrl IDC_CTAB_MSG_RECIPIENTS;
- lbClear _msgControl;
- lbClear _plrlistControl;
- _plrList = playableUnits;
- // since playableUnits will return an empty array in single player, add the player if array is empty
- if (_plrList isEqualTo []) then {_plrList pushBack cTab_player};
- _validSides = call cTab_fnc_getPlayerSides;
-
- // turn this on for testing, otherwise not really usefull, since sending to an AI controlled, but switchable unit will send the message to the player himself
- /*if (count _plrList < 1) then { _plrList = switchableUnits;};*/
-
- uiNamespace setVariable ['cTab_msg_playerList', _plrList];
- // Messages
- {
- _title = _x select 0;
- _msgState = _x select 2;
- _img = call {
- if (_msgState == 0) exitWith {"\ClonecTab\img\icoUnopenedmail.paa"};
- if (_msgState == 1) exitWith {"\ClonecTab\img\icoOpenmail.paa"};
- if (_msgState == 2) exitWith {"\ClonecTab\img\icon_sentMail_ca.paa"};
- };
- _index = _msgControl lbAdd _title;
- _msgControl lbSetPicture [_index,_img];
- _msgControl lbSetTooltip [_index,_title];
- } count _msgArray;
-
- lbSort [_plrlistControl, "ASC"];
-
- _return;
- };
- cTab_msg_get_mailTxt = {
- disableSerialization;
- _return = true;
- _index = _this select 1;
- _display = uiNamespace getVariable (cTabIfOpen select 1);
- _playerEncryptionKey = call cTab_fnc_getPlayerEncryptionKey;
- _msgArray = cTab_player getVariable [format ["cTab_messages_%1",_playerEncryptionKey],[]];
- _msgName = (_msgArray select _index) select 0;
- _msgtxt = (_msgArray select _index) select 1;
- _msgState = (_msgArray select _index) select 2;
- if (_msgState == 0) then {
- _msgArray set [_index,[_msgName,_msgtxt,1]];
- cTab_player setVariable [format ["cTab_messages_%1",_playerEncryptionKey],_msgArray];
- };
-
- _nop = [] call cTab_msg_gui_load;
-
- _txtControl = _display displayCtrl IDC_CTAB_MSG_CONTENT;
- _nul = _txtControl ctrlSetText _msgtxt;
-
- _return;
- };
- cTab_msg_Send = {
- private ["_return","_display","_plrLBctrl","_msgBodyctrl","_plrList","_indices","_time","_msgTitle","_msgBody","_recip","_recipientNames","_msgArray","_playerEncryptionKey"];
- disableSerialization;
- _return = true;
- _display = uiNamespace getVariable (cTabIfOpen select 1);
- _playerEncryptionKey = call cTab_fnc_getPlayerEncryptionKey;
- _plrLBctrl = _display displayCtrl IDC_CTAB_MSG_RECIPIENTS;
- _msgBodyctrl = _display displayCtrl IDC_CTAB_MSG_COMPOSE;
- _plrList = (uiNamespace getVariable "cTab_msg_playerList");
-
- _indices = lbSelection _plrLBctrl;
-
- if (_indices isEqualTo []) exitWith {false};
-
- _time = call cTab_fnc_currentTime;
- _msgTitle = format ["%1 - %2:%3 (%4)",_time,groupId group cTab_player,[cTab_player] call CBA_fnc_getGroupIndex,name cTab_player];
- _msgBody = ctrlText _msgBodyctrl;
- if (_msgBody isEqualTo "") exitWith {false};
- _recipientNames = "";
-
- {
- _data = _plrLBctrl lbData _x;
- _recip = objNull;
- {
- if (_data == str _x) exitWith {_recip = _x;};
- } count _plrList;
-
- if !(IsNull _recip) then {
- if (_recipientNames isEqualTo "") then {
- _recipientNames = format ["%1:%2 (%3)",groupId group _recip,[_recip] call CBA_fnc_getGroupIndex,name _recip];
- } else {
- _recipientNames = format ["%1; %2",_recipientNames,name _recip];
- };
-
- ["cTab_msg_receive",[_recip,_msgTitle,_msgBody,_playerEncryptionKey,cTab_player]] call CBA_fnc_whereLocalEvent;
- };
- } forEach _indices;
-
- // If the message was sent
- if (_recipientNames != "") then {
- _msgArray = cTab_player getVariable [format ["cTab_messages_%1",_playerEncryptionKey],[]];
- _msgArray pushBack [format ["%1 - %2",_time,_recipientNames],_msgBody,2];
- cTab_player setVariable [format ["cTab_messages_%1",_playerEncryptionKey],_msgArray];
-
- if (!isNil "cTabIfOpen" && {[cTabIfOpen select 1,"mode"] call cTab_fnc_getSettings == "MESSAGE"}) then {
- call cTab_msg_gui_load;
- };
-
- // add a notification
- ["MSG","Message sent successfully",3] call cTab_fnc_addNotification;
- playSound "cTab_mailSent";
- // remove message body
- _msgBodyctrl ctrlSetText "";
- // clear selected recipients
- _plrLBctrl lbSetCurSel -1;
- };
-
- _return;
- };
- ["cTab_msg_receive",
- {
- _msgRecipient = _this select 0;
- _msgTitle = _this select 1;
- _msgBody = _this select 2;
- _msgEncryptionKey = _this select 3;
- _sender = _this select 4;
- _playerEncryptionKey = call cTab_fnc_getPlayerEncryptionKey;
- _msgArray = _msgRecipient getVariable [format ["cTab_messages_%1",_msgEncryptionKey],[]];
- _msgArray pushBack [_msgTitle,_msgBody,0];
-
- _msgRecipient setVariable [format ["cTab_messages_%1",_msgEncryptionKey],_msgArray];
-
- if (_msgRecipient == cTab_player && _sender != cTab_player && {_playerEncryptionKey == _msgEncryptionKey} && {[cTab_player,["ItemcTab"]] call cTab_fnc_checkGear}) then {
- playSound "cTab_phoneVibrate";
-
- if (!isNil "cTabIfOpen" && {[cTabIfOpen select 1,"mode"] call cTab_fnc_getSettings == "MESSAGE"}) then {
- _nop = [] call cTab_msg_gui_load;
-
- // add a notification
- ["MSG",format ["New message from %1",name _sender],6] call cTab_fnc_addNotification;
- } else {
- cTabRscLayerMailNotification cutRsc ["cTab_Mail_ico_disp", "PLAIN"]; //show
- };
- };
- }
- ] call CBA_fnc_addLocalEventHandler;
-
- cTab_msg_delete_all = {
- _playerEncryptionKey = call cTab_fnc_getPlayerEncryptionKey;
- cTab_player setVariable [format ["cTab_messages_%1",_playerEncryptionKey],[]];
- };
- /*
- Function to execute the correct action when btnACT is pressed on Tablet
- No Parameters
- Returns TRUE
- */
- cTab_Tablet_btnACT = {
- _mode = ["cTab_Tablet_dlg","mode"] call cTab_fnc_getSettings;
- call {
- if (_mode == "UAV") exitWith {[] call cTab_fnc_remoteControlUav;};
- if (_mode == "HCAM") exitWith {["cTab_Tablet_dlg",[["mode","HCAM_FULL"]]] call cTab_fnc_setSettings;};
- if (_mode == "HCAM_FULL") exitWith {["cTab_Tablet_dlg",[["mode","HCAM"]]] call cTab_fnc_setSettings;};
- };
- true
- };
- /*
- Function called when DELETE button is pressed in messaging mode
- Parameter 0: Name of uiNameSpace variable of display
- Returns false if nothing was selected for deletion, else returns true
- */
- cTab_fnc_onMsgBtnDelete = {
- _displayName = _this select 0;
- _display = uiNamespace getVariable _displayName;
- _msgLbCtrl = _display displayCtrl IDC_CTAB_MSG_LIST;
- _msgLbSelection = lbSelection _msgLbCtrl;
-
- if (count _msgLbSelection == 0) exitWith {false};
- _playerEncryptionKey = call cTab_fnc_getPlayerEncryptionKey;
- _msgArray = cTab_player getVariable [format ["cTab_messages_%1",_playerEncryptionKey],[]];
-
- // run through the selection backwards as otherwise the indices won't match anymore
- for "_i" from (count _msgLbSelection) to 0 step -1 do {
- _msgArray deleteAt (_msgLbSelection select _i);
- };
- cTab_player setVariable [format ["cTab_messages_%1",_playerEncryptionKey],_msgArray];
-
- _msgTextCtrl = _display displayCtrl IDC_CTAB_MSG_CONTENT;
- _msgTextCtrl ctrlSetText "No Message Selected";
- _nop = [] call cTab_msg_gui_load;
- true
- };
|