2015-07-15 11:03:54 +00:00
|
|
|
/*
|
|
|
|
* Author: SilentSpike
|
|
|
|
* Handles spectator interface events
|
|
|
|
*
|
|
|
|
* Arguments:
|
|
|
|
* 0: Event name <STRING>
|
|
|
|
* 1: Event arguments <ANY>
|
|
|
|
*
|
|
|
|
* Return Value:
|
|
|
|
* None <NIL>
|
|
|
|
*
|
|
|
|
* Example:
|
|
|
|
* ["onLoad",_this] call ace_spectator_fnc_handleInterface
|
|
|
|
*
|
|
|
|
* Public: No
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "script_component.hpp"
|
|
|
|
|
2015-07-18 17:46:46 +00:00
|
|
|
params ["_mode",["_args",[]]];
|
2015-07-15 11:03:54 +00:00
|
|
|
|
|
|
|
switch (toLower _mode) do {
|
|
|
|
// Safely open/close the interface
|
|
|
|
case "open": {
|
|
|
|
// Prevent reopening
|
2015-08-03 20:38:44 +00:00
|
|
|
if (GVAR(isSet)) exitWith {};
|
2015-07-15 11:03:54 +00:00
|
|
|
|
2015-07-15 11:11:19 +00:00
|
|
|
// Initalize camera variables
|
2015-07-21 17:05:29 +00:00
|
|
|
GVAR(camBoom) = 0;
|
|
|
|
GVAR(camDolly) = [0,0];
|
2015-07-21 10:59:20 +00:00
|
|
|
GVAR(camGun) = false;
|
2015-07-15 11:11:19 +00:00
|
|
|
|
|
|
|
// Initalize display variables
|
|
|
|
GVAR(ctrlKey) = false;
|
2015-07-24 10:12:26 +00:00
|
|
|
GVAR(heldKeys) = [];
|
2015-07-15 11:11:19 +00:00
|
|
|
GVAR(mouse) = [false,false];
|
|
|
|
GVAR(mousePos) = [0.5,0.5];
|
|
|
|
|
2015-07-15 11:03:54 +00:00
|
|
|
// Initalize the camera view
|
2015-07-21 17:07:55 +00:00
|
|
|
GVAR(camera) = "Camera" camCreate (ASLtoATL GVAR(camPos));
|
2015-07-20 21:45:11 +00:00
|
|
|
[] call FUNC(transitionCamera);
|
2015-07-15 13:33:11 +00:00
|
|
|
|
2015-08-03 20:38:44 +00:00
|
|
|
// Close map
|
|
|
|
openMap [false,false];
|
|
|
|
|
2015-08-05 18:25:38 +00:00
|
|
|
// Disable BI damage effects
|
2015-08-03 20:38:44 +00:00
|
|
|
BIS_fnc_feedback_allowPP = false;
|
|
|
|
|
2015-07-24 16:55:33 +00:00
|
|
|
// Close all existing dialogs
|
|
|
|
while {dialog} do {
|
|
|
|
closeDialog 0;
|
|
|
|
};
|
|
|
|
|
2015-07-15 11:03:54 +00:00
|
|
|
// Create the dialog
|
2015-07-17 00:44:49 +00:00
|
|
|
createDialog QGVAR(interface);
|
2015-07-15 11:03:54 +00:00
|
|
|
|
|
|
|
// Cache and disable nametag settings
|
|
|
|
if (["ace_nametags"] call EFUNC(common,isModLoaded)) then {
|
|
|
|
GVAR(nametagSettingCache) = [EGVAR(nametags,showPlayerNames), EGVAR(nametags,showNamesForAI)];
|
|
|
|
EGVAR(nametags,showPlayerNames) = 0;
|
|
|
|
EGVAR(nametags,showNamesForAI) = false;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
case "close": {
|
2015-08-03 12:04:36 +00:00
|
|
|
_args params ["_unit"];
|
|
|
|
|
2015-07-15 11:03:54 +00:00
|
|
|
// Can't close a second time
|
2015-08-03 20:38:44 +00:00
|
|
|
if !(GVAR(isSet)) exitWith {};
|
2015-07-15 11:03:54 +00:00
|
|
|
|
|
|
|
// Terminate interface
|
2015-07-26 11:05:41 +00:00
|
|
|
while {dialog} do {
|
|
|
|
closeDialog 0;
|
|
|
|
};
|
2015-07-15 11:03:54 +00:00
|
|
|
|
|
|
|
// Terminate camera
|
|
|
|
GVAR(camera) cameraEffect ["terminate", "back"];
|
|
|
|
camDestroy GVAR(camera);
|
|
|
|
|
|
|
|
// Return to player view
|
2015-08-05 12:19:47 +00:00
|
|
|
clearRadio;
|
2015-08-03 12:04:36 +00:00
|
|
|
_unit switchCamera "internal";
|
2015-07-15 11:03:54 +00:00
|
|
|
|
2015-08-05 18:25:38 +00:00
|
|
|
// Enable BI damage effects
|
2015-08-03 20:38:44 +00:00
|
|
|
BIS_fnc_feedback_allowPP = true;
|
|
|
|
|
2015-07-15 11:11:19 +00:00
|
|
|
// Cleanup camera variables
|
|
|
|
GVAR(camera) = nil;
|
|
|
|
GVAR(camBoom) = nil;
|
|
|
|
GVAR(camDolly) = nil;
|
2015-07-21 10:59:20 +00:00
|
|
|
GVAR(camGun) = nil;
|
2015-07-15 11:11:19 +00:00
|
|
|
|
|
|
|
// Cleanup display variables
|
2015-07-18 17:46:46 +00:00
|
|
|
GVAR(ctrlKey) = nil;
|
2015-07-24 10:12:26 +00:00
|
|
|
GVAR(heldKeys) = nil;
|
2015-07-15 11:11:19 +00:00
|
|
|
GVAR(mouse) = nil;
|
|
|
|
GVAR(mousePos) = nil;
|
|
|
|
|
2015-07-15 11:03:54 +00:00
|
|
|
// Reset nametag settings
|
|
|
|
if (["ace_nametags"] call EFUNC(common,isModLoaded)) then {
|
|
|
|
EGVAR(nametags,showPlayerNames) = GVAR(nametagSettingCache) select 0;
|
|
|
|
EGVAR(nametags,showNamesForAI) = GVAR(nametagSettingCache) select 1;
|
|
|
|
GVAR(nametagSettingCache) = nil;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
// Dialog events
|
|
|
|
case "onload": {
|
2015-07-18 17:46:46 +00:00
|
|
|
_args params ["_display"];
|
|
|
|
|
2015-07-18 14:42:07 +00:00
|
|
|
// Always show interface and hide map upon opening
|
2015-07-20 21:45:11 +00:00
|
|
|
[_display,nil,nil,!GVAR(showInterface),GVAR(showMap)] call FUNC(toggleInterface);
|
2015-07-15 11:03:54 +00:00
|
|
|
|
2015-07-24 18:02:27 +00:00
|
|
|
// Keep unit list and tree up to date
|
2015-07-19 12:40:08 +00:00
|
|
|
[FUNC(handleUnits), 21, _display] call CBA_fnc_addPerFrameHandler;
|
2015-07-19 01:25:52 +00:00
|
|
|
|
2015-07-21 22:20:41 +00:00
|
|
|
// Populate the help splash
|
2015-07-24 16:50:33 +00:00
|
|
|
private "_help";
|
|
|
|
_help = (_display displayCtrl IDC_HELP) controlsGroupCtrl IDC_HELP_LIST;
|
2015-07-21 22:20:41 +00:00
|
|
|
{
|
2015-07-24 16:50:33 +00:00
|
|
|
// Add space before category titles
|
|
|
|
if (count _x == 1) then {
|
|
|
|
_help lnbAddRow [""];
|
|
|
|
};
|
|
|
|
|
|
|
|
_help lnbAddRow _x;
|
2015-07-21 22:20:41 +00:00
|
|
|
} forEach [
|
2015-07-24 16:50:33 +00:00
|
|
|
[localize LSTRING(uiControls),""],
|
2015-07-24 10:23:14 +00:00
|
|
|
[localize LSTRING(uiToggleHelp),"H"],
|
|
|
|
[localize LSTRING(uiToggleMap),"M"],
|
|
|
|
[localize LSTRING(uiToggleUnits),"1"],
|
|
|
|
[localize LSTRING(uiToggleTools),"2"],
|
|
|
|
[localize LSTRING(uiToggleCompass),"3"],
|
2015-07-24 16:23:25 +00:00
|
|
|
[localize LSTRING(uiToggleIcons),"4"],
|
2015-07-24 10:23:14 +00:00
|
|
|
[localize LSTRING(uiToggleInterface),"Backspace"],
|
|
|
|
|
2015-07-24 16:23:25 +00:00
|
|
|
[localize LSTRING(freeCamControls)],
|
2015-07-21 22:20:41 +00:00
|
|
|
[localize LSTRING(freeCamForward),"W"],
|
|
|
|
[localize LSTRING(freeCamBackward),"S"],
|
|
|
|
[localize LSTRING(freeCamLeft),"A"],
|
|
|
|
[localize LSTRING(freeCamRight),"D"],
|
|
|
|
[localize LSTRING(freeCamUp),"Q"],
|
|
|
|
[localize LSTRING(freeCamDown),"Z"],
|
2015-07-24 10:23:14 +00:00
|
|
|
[localize LSTRING(freeCamPan),"RMB (Hold)"],
|
|
|
|
[localize LSTRING(freeCamDolly),"LMB (Hold)"],
|
|
|
|
[localize LSTRING(freeCamSpeed),"Scrollwheel"],
|
|
|
|
[localize LSTRING(freeCamZoom),"Ctrl + Scrollwheel"],
|
2015-07-24 10:12:26 +00:00
|
|
|
[localize LSTRING(freeCamNextVis),"N"],
|
|
|
|
[localize LSTRING(freeCamPrevVis),"Ctrl + N"],
|
2015-07-24 10:23:14 +00:00
|
|
|
|
2015-07-24 16:50:33 +00:00
|
|
|
[localize LSTRING(otherControls)],
|
2015-07-25 10:20:59 +00:00
|
|
|
[localize LSTRING(nextCam),"Up Arrow"],
|
|
|
|
[localize LSTRING(prevCam),"Down Arrow"],
|
|
|
|
[localize LSTRING(nextUnit),"Right Arrow"],
|
|
|
|
[localize LSTRING(prevUnit),"Left Arrow"]
|
2015-07-21 22:20:41 +00:00
|
|
|
];
|
|
|
|
|
2015-08-05 18:25:38 +00:00
|
|
|
// Handle support for BI's respawn counter
|
|
|
|
[{
|
|
|
|
if !(isNull (GETUVAR(RscRespawnCounter,displayNull))) then {
|
|
|
|
disableSerialization;
|
|
|
|
private ["_counter","_title","_back","_timer","_frame","_x","_y"];
|
|
|
|
_counter = GETUVAR(RscRespawnCounter,displayNull);
|
|
|
|
_title = _counter displayCtrl 1001;
|
|
|
|
_back = _counter displayCtrl 1002;
|
|
|
|
_timer = _counter displayCtrl 1003;
|
|
|
|
_frame = _counter ctrlCreate ["RscFrame",1008];
|
|
|
|
|
|
|
|
_x = safeZoneX + safeZoneW - TOOL_W * 4 - MARGIN * 3;
|
|
|
|
_y = safeZoneY + safeZoneH - TOOL_H;
|
|
|
|
|
|
|
|
// Timer
|
|
|
|
_title ctrlSetPosition [_x,_y,TOOL_W,TOOL_H];
|
|
|
|
_back ctrlSetPosition [_x,_y,TOOL_W,TOOL_H];
|
|
|
|
_timer ctrlSetPosition [_x,_y,TOOL_W,TOOL_H];
|
|
|
|
_frame ctrlSetPosition [_x,_y,TOOL_W,TOOL_H];
|
|
|
|
_timer ctrlSetFontHeight TOOL_H;
|
|
|
|
|
|
|
|
_title ctrlCommit 0;
|
|
|
|
_back ctrlCommit 0;
|
|
|
|
_timer ctrlCommit 0;
|
|
|
|
_frame ctrlCommit 0;
|
|
|
|
};
|
|
|
|
},[],0.5] call EFUNC(common,waitAndExecute);
|
2015-07-15 11:03:54 +00:00
|
|
|
};
|
|
|
|
case "onunload": {
|
2015-08-02 23:22:50 +00:00
|
|
|
// Kill GUI PFHs
|
2015-07-18 16:06:13 +00:00
|
|
|
GVAR(camHandler) = nil;
|
2015-07-24 18:02:27 +00:00
|
|
|
GVAR(compHandler) = nil;
|
2015-07-25 11:28:03 +00:00
|
|
|
GVAR(iconHandler) = nil;
|
2015-07-24 18:02:27 +00:00
|
|
|
GVAR(toolHandler) = nil;
|
2015-07-15 11:03:54 +00:00
|
|
|
};
|
2015-07-15 11:11:19 +00:00
|
|
|
// Mouse events
|
|
|
|
case "onmousebuttondown": {
|
2015-07-18 17:46:46 +00:00
|
|
|
_args params ["_ctrl","_button"];
|
2015-07-15 11:11:19 +00:00
|
|
|
GVAR(mouse) set [_button,true];
|
2015-07-15 11:33:32 +00:00
|
|
|
|
|
|
|
// Detect right click
|
|
|
|
if ((_button == 1) && (GVAR(camMode) == 1)) then {
|
2015-07-15 13:33:11 +00:00
|
|
|
// In first person toggle sights mode
|
2015-07-21 17:05:29 +00:00
|
|
|
GVAR(camGun) = !GVAR(camGun);
|
2015-07-20 21:45:11 +00:00
|
|
|
[] call FUNC(transitionCamera);
|
2015-07-15 11:33:32 +00:00
|
|
|
};
|
2015-07-15 11:11:19 +00:00
|
|
|
};
|
|
|
|
case "onmousebuttonup": {
|
2015-07-18 17:46:46 +00:00
|
|
|
_args params ["_ctrl","_button"];
|
|
|
|
|
2015-07-15 11:11:19 +00:00
|
|
|
GVAR(mouse) set [_button,false];
|
2015-07-21 17:44:24 +00:00
|
|
|
if (_button == 0) then { GVAR(camDolly) = [0,0]; };
|
2015-07-15 11:11:19 +00:00
|
|
|
};
|
|
|
|
case "onmousezchanged": {
|
2015-07-18 17:46:46 +00:00
|
|
|
_args params ["_ctrl","_zChange"];
|
2015-07-15 11:33:32 +00:00
|
|
|
|
2015-07-19 21:30:44 +00:00
|
|
|
// Scroll to change speed, modifier for zoom
|
2015-07-15 11:33:32 +00:00
|
|
|
if (GVAR(ctrlKey)) then {
|
2015-07-24 18:02:27 +00:00
|
|
|
[nil,nil,nil,nil,nil,nil, GVAR(camZoom) + _zChange * 0.1] call FUNC(setCameraAttributes);
|
2015-07-15 11:33:32 +00:00
|
|
|
} else {
|
2015-07-24 18:02:27 +00:00
|
|
|
[nil,nil,nil,nil,nil,nil,nil, GVAR(camSpeed) + _zChange * 0.2] call FUNC(setCameraAttributes);
|
2015-07-15 11:33:32 +00:00
|
|
|
};
|
2015-07-15 11:11:19 +00:00
|
|
|
};
|
|
|
|
case "onmousemoving": {
|
2015-07-18 17:46:46 +00:00
|
|
|
_args params ["_ctrl","_x","_y"];
|
2015-07-15 11:11:19 +00:00
|
|
|
|
2015-07-18 15:59:05 +00:00
|
|
|
[_x,_y] call FUNC(handleMouse);
|
2015-07-15 11:11:19 +00:00
|
|
|
};
|
2015-07-15 11:03:54 +00:00
|
|
|
// Keyboard events
|
|
|
|
case "onkeydown": {
|
2015-07-18 17:46:46 +00:00
|
|
|
_args params ["_display","_dik","_shift","_ctrl","_alt"];
|
2015-07-15 11:03:54 +00:00
|
|
|
|
2015-07-24 10:12:26 +00:00
|
|
|
// Handle held keys (prevent repeat calling)
|
2015-07-25 22:59:15 +00:00
|
|
|
if (_dik in GVAR(heldKeys)) exitwith {};
|
2015-07-26 11:23:01 +00:00
|
|
|
// Exclude movement keys so that speed can be adjusted on fly
|
|
|
|
if !(_dik in [17,30,31,32]) then {
|
|
|
|
GVAR(heldKeys) pushBack _dik;
|
|
|
|
};
|
2015-07-24 10:12:26 +00:00
|
|
|
|
2015-07-15 11:03:54 +00:00
|
|
|
switch (_dik) do {
|
|
|
|
case 1: { // Esc
|
2015-07-25 22:59:15 +00:00
|
|
|
["escape", [_display]] call FUNC(handleInterface);
|
2015-07-15 11:03:54 +00:00
|
|
|
};
|
2015-07-19 21:50:13 +00:00
|
|
|
case 2: { // 1
|
2015-07-20 21:45:11 +00:00
|
|
|
[_display,nil,nil,nil,nil,nil,true] call FUNC(toggleInterface);
|
2015-07-19 21:50:13 +00:00
|
|
|
};
|
|
|
|
case 3: { // 2
|
2015-07-20 21:45:11 +00:00
|
|
|
[_display,nil,nil,nil,nil,true] call FUNC(toggleInterface);
|
2015-07-19 21:50:13 +00:00
|
|
|
};
|
|
|
|
case 4: { // 3
|
2015-07-20 21:45:11 +00:00
|
|
|
[_display,true] call FUNC(toggleInterface);
|
2015-07-19 21:50:13 +00:00
|
|
|
};
|
2015-07-24 16:23:25 +00:00
|
|
|
case 5: { // 4
|
|
|
|
GVAR(showIcons) = !GVAR(showIcons);
|
|
|
|
};
|
2015-07-15 11:03:54 +00:00
|
|
|
case 14: { // Backspace
|
2015-07-20 21:45:11 +00:00
|
|
|
[_display,nil,nil,true] call FUNC(toggleInterface);
|
2015-07-15 11:03:54 +00:00
|
|
|
};
|
2015-07-15 11:11:19 +00:00
|
|
|
case 16: { // Q
|
2015-07-31 22:32:25 +00:00
|
|
|
GVAR(camBoom) = 0.5 * GVAR(camSpeed);
|
2015-07-15 11:11:19 +00:00
|
|
|
};
|
|
|
|
case 17: { // W
|
2015-07-21 17:44:24 +00:00
|
|
|
GVAR(camDolly) set [1, GVAR(camSpeed)];
|
2015-07-15 11:11:19 +00:00
|
|
|
};
|
|
|
|
case 29: { // Ctrl
|
|
|
|
GVAR(ctrlKey) = true;
|
|
|
|
};
|
|
|
|
case 30: { // A
|
2015-07-21 17:44:24 +00:00
|
|
|
GVAR(camDolly) set [0, -GVAR(camSpeed)];
|
2015-07-15 11:11:19 +00:00
|
|
|
};
|
|
|
|
case 31: { // S
|
2015-07-21 17:44:24 +00:00
|
|
|
GVAR(camDolly) set [1, -GVAR(camSpeed)];
|
2015-07-15 11:11:19 +00:00
|
|
|
};
|
|
|
|
case 32: { // D
|
2015-07-21 17:44:24 +00:00
|
|
|
GVAR(camDolly) set [0, GVAR(camSpeed)];
|
2015-07-15 11:11:19 +00:00
|
|
|
};
|
2015-07-16 20:45:52 +00:00
|
|
|
case 35: { // H
|
2015-07-20 21:45:11 +00:00
|
|
|
[_display,nil,true] call FUNC(toggleInterface);
|
2015-07-18 14:42:07 +00:00
|
|
|
};
|
2015-07-15 11:11:19 +00:00
|
|
|
case 44: { // Z
|
2015-07-31 22:32:25 +00:00
|
|
|
GVAR(camBoom) = -0.5 * GVAR(camSpeed);
|
2015-07-21 10:59:20 +00:00
|
|
|
};
|
|
|
|
case 49: { // N
|
2015-07-24 10:12:26 +00:00
|
|
|
if (_ctrl) then {
|
|
|
|
[nil,nil,-1] call FUNC(cycleCamera);
|
|
|
|
} else {
|
|
|
|
[nil,nil,1] call FUNC(cycleCamera);
|
|
|
|
};
|
2015-07-15 11:11:19 +00:00
|
|
|
};
|
2015-07-15 11:03:54 +00:00
|
|
|
case 50: { // M
|
2015-07-20 21:45:11 +00:00
|
|
|
[_display,nil,nil,nil,true] call FUNC(toggleInterface);
|
2015-07-15 11:03:54 +00:00
|
|
|
};
|
2015-07-15 11:33:32 +00:00
|
|
|
case 57: { // Spacebar
|
2015-07-18 16:13:27 +00:00
|
|
|
// Freecam attachment here, if in external then set cam pos and attach
|
|
|
|
};
|
|
|
|
case 200: { // Up arrow
|
2015-07-21 12:31:13 +00:00
|
|
|
[-1] call FUNC(cycleCamera);
|
2015-07-15 11:33:32 +00:00
|
|
|
};
|
2015-07-18 15:20:19 +00:00
|
|
|
case 203: { // Left arrow
|
2015-07-21 15:06:07 +00:00
|
|
|
[nil,1] call FUNC(cycleCamera);
|
2015-07-18 15:20:19 +00:00
|
|
|
};
|
|
|
|
case 205: { // Right arrow
|
2015-07-21 15:06:07 +00:00
|
|
|
[nil,-1] call FUNC(cycleCamera);
|
2015-07-18 15:20:19 +00:00
|
|
|
};
|
2015-07-18 18:05:18 +00:00
|
|
|
case 208: { // Down arrow
|
2015-07-21 12:31:13 +00:00
|
|
|
[1] call FUNC(cycleCamera);
|
2015-07-18 18:05:18 +00:00
|
|
|
};
|
2015-07-15 11:03:54 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
true
|
|
|
|
};
|
|
|
|
case "onkeyup": {
|
2015-07-18 17:46:46 +00:00
|
|
|
_args params ["_display","_dik","_shift","_ctrl","_alt"];
|
2015-07-15 11:03:54 +00:00
|
|
|
|
2015-07-24 10:12:26 +00:00
|
|
|
// No longer being held
|
|
|
|
GVAR(heldKeys) = GVAR(heldKeys) - [_dik];
|
|
|
|
|
2015-07-15 11:03:54 +00:00
|
|
|
switch (_dik) do {
|
2015-07-15 11:11:19 +00:00
|
|
|
case 16: { // Q
|
2015-07-21 17:26:49 +00:00
|
|
|
GVAR(camBoom) = 0;
|
2015-07-15 11:11:19 +00:00
|
|
|
};
|
|
|
|
case 17: { // W
|
2015-07-21 17:44:24 +00:00
|
|
|
GVAR(camDolly) set [1, 0];
|
2015-07-15 11:11:19 +00:00
|
|
|
};
|
|
|
|
case 29: { // Ctrl
|
|
|
|
GVAR(ctrlKey) = false;
|
|
|
|
};
|
|
|
|
case 30: { // A
|
2015-07-21 17:44:24 +00:00
|
|
|
GVAR(camDolly) set [0, 0];
|
2015-07-15 11:11:19 +00:00
|
|
|
};
|
|
|
|
case 31: { // S
|
2015-07-21 17:44:24 +00:00
|
|
|
GVAR(camDolly) set [1, 0];
|
2015-07-15 11:11:19 +00:00
|
|
|
};
|
|
|
|
case 32: { // D
|
2015-07-21 17:44:24 +00:00
|
|
|
GVAR(camDolly) set [0, 0];
|
2015-07-15 11:11:19 +00:00
|
|
|
};
|
|
|
|
case 44: { // Z
|
2015-07-21 17:26:49 +00:00
|
|
|
GVAR(camBoom) = 0;
|
2015-07-15 11:11:19 +00:00
|
|
|
};
|
2015-07-15 11:03:54 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
true
|
|
|
|
};
|
2015-07-16 16:01:04 +00:00
|
|
|
// Tree events
|
|
|
|
case "ontreedblclick": {
|
2015-07-16 17:31:49 +00:00
|
|
|
// Update camera view when listbox unit is double clicked on
|
2015-07-18 17:46:46 +00:00
|
|
|
_args params ["_tree","_sel"];
|
2015-07-16 17:31:49 +00:00
|
|
|
|
|
|
|
// Ensure a unit was selected
|
2015-07-20 16:42:11 +00:00
|
|
|
if (count _sel == 3) then {
|
2015-07-18 17:46:46 +00:00
|
|
|
private ["_netID","_newUnit","_newMode"];
|
2015-07-16 17:31:49 +00:00
|
|
|
_netID = (_args select 0) tvData _sel;
|
2015-07-16 18:43:16 +00:00
|
|
|
_newUnit = objectFromNetId _netID;
|
2015-07-16 17:31:49 +00:00
|
|
|
|
2015-07-16 20:37:20 +00:00
|
|
|
// When unit is reselected, toggle camera mode
|
|
|
|
if (_newUnit == GVAR(camUnit) || GVAR(camMode) == 0) then {
|
2015-07-17 00:52:08 +00:00
|
|
|
_newMode = [2,2,1] select GVAR(camMode);
|
2015-07-16 16:01:04 +00:00
|
|
|
};
|
2015-07-16 20:37:20 +00:00
|
|
|
|
2015-07-21 14:53:20 +00:00
|
|
|
[_newMode,_newUnit] call FUNC(transitionCamera);
|
2015-07-16 16:01:04 +00:00
|
|
|
};
|
|
|
|
};
|
2015-07-19 12:40:08 +00:00
|
|
|
case "onunitsupdate": {
|
2015-07-19 22:03:40 +00:00
|
|
|
_args params ["_tree"];
|
2015-07-21 20:21:46 +00:00
|
|
|
private ["_curSelData","_cachedGrps","_cachedSides","_grp","_side","_sNode","_gNode","_uNode"];
|
2015-07-19 12:40:08 +00:00
|
|
|
|
|
|
|
// Cache current selection
|
2015-07-19 22:03:40 +00:00
|
|
|
_curSelData = _tree tvData (tvCurSel _tree);
|
2015-07-19 12:40:08 +00:00
|
|
|
|
|
|
|
// Clear the tree
|
2015-07-19 22:03:40 +00:00
|
|
|
tvClear _tree;
|
2015-07-19 12:40:08 +00:00
|
|
|
|
|
|
|
// Update the tree from the unit list
|
|
|
|
_cachedGrps = [];
|
2015-07-21 20:21:46 +00:00
|
|
|
_cachedSides = [];
|
2015-07-19 12:40:08 +00:00
|
|
|
{
|
|
|
|
_grp = group _x;
|
2015-07-24 14:53:08 +00:00
|
|
|
_side = [side _grp] call BIS_fnc_sideName;
|
2015-07-19 12:40:08 +00:00
|
|
|
|
2015-07-20 16:42:11 +00:00
|
|
|
// Use correct side node
|
2015-07-21 20:21:46 +00:00
|
|
|
if !(_side in _cachedSides) then {
|
|
|
|
// Add side node
|
|
|
|
_sNode = _tree tvAdd [[], _side];
|
|
|
|
|
|
|
|
_cachedSides pushBack _side;
|
|
|
|
_cachedSides pushBack _sNode;
|
|
|
|
} else {
|
|
|
|
// If side already processed, use existing node
|
|
|
|
_sNode = _cachedSides select ((_cachedSides find _side) + 1);
|
|
|
|
};
|
2015-07-20 16:42:11 +00:00
|
|
|
|
|
|
|
// Use correct group node
|
|
|
|
if !(_grp in _cachedGrps) then {
|
|
|
|
// Add group node
|
|
|
|
_gNode = _tree tvAdd [[_sNode], groupID _grp];
|
2015-07-19 12:40:08 +00:00
|
|
|
|
|
|
|
_cachedGrps pushBack _grp;
|
2015-07-20 16:42:11 +00:00
|
|
|
_cachedGrps pushBack _gNode;
|
2015-07-19 12:40:08 +00:00
|
|
|
} else {
|
2015-07-20 16:42:11 +00:00
|
|
|
// If group already processed, use existing node
|
|
|
|
_gNode = _cachedGrps select ((_cachedGrps find _grp) + 1);
|
2015-07-19 12:40:08 +00:00
|
|
|
};
|
|
|
|
|
2015-07-24 16:13:03 +00:00
|
|
|
_uNode = _tree tvAdd [[_sNode,_gNode], GETVAR(_x,GVAR(uName),"")];
|
2015-07-20 16:42:11 +00:00
|
|
|
_tree tvSetData [[_sNode,_gNode,_uNode], netID _x];
|
2015-07-19 12:40:08 +00:00
|
|
|
|
|
|
|
// Preserve the previous selection
|
2015-07-20 16:42:11 +00:00
|
|
|
if (_curSelData == (_tree tvData [_sNode,_gNode,_uNode])) then {
|
|
|
|
_tree tvSetCurSel [_sNode,_gNode,_uNode];
|
2015-07-19 12:40:08 +00:00
|
|
|
};
|
|
|
|
|
2015-07-20 16:42:11 +00:00
|
|
|
_tree tvSort [[_sNode,_gNode],false];
|
|
|
|
_tree tvExpand [_sNode,_gNode];
|
2015-07-19 12:40:08 +00:00
|
|
|
} forEach GVAR(unitList);
|
|
|
|
|
2015-07-21 20:21:46 +00:00
|
|
|
{
|
|
|
|
if (typeName _x == "SCALAR") then {
|
|
|
|
_tree tvSort [[_x],false];
|
|
|
|
_tree tvExpand [_x];
|
|
|
|
};
|
|
|
|
} forEach _cachedSides;
|
|
|
|
|
|
|
|
_tree tvSort [[],false];
|
2015-07-19 12:40:08 +00:00
|
|
|
};
|
2015-07-20 19:30:13 +00:00
|
|
|
// Map events
|
|
|
|
case "onmapdblclick": {
|
2015-07-25 14:29:53 +00:00
|
|
|
_args params ["_map","_button","_x","_y"];
|
2015-07-24 14:36:36 +00:00
|
|
|
private ["_newPos","_oldZ"];
|
2015-07-20 19:30:13 +00:00
|
|
|
|
2015-07-25 14:29:53 +00:00
|
|
|
if ((GVAR(camMode) == 0) && (_button == 0)) then {
|
2015-07-20 19:30:13 +00:00
|
|
|
_newPos = _map ctrlMapScreenToWorld [_x,_y];
|
2015-07-21 17:05:29 +00:00
|
|
|
_oldZ = (ASLtoATL GVAR(camPos)) select 2;
|
2015-07-21 17:07:55 +00:00
|
|
|
_newPos set [2, _oldZ];
|
2015-07-25 11:28:03 +00:00
|
|
|
[nil,nil,nil, _newPos] call FUNC(setCameraAttributes);
|
2015-07-20 19:30:13 +00:00
|
|
|
};
|
|
|
|
};
|
2015-07-24 14:36:36 +00:00
|
|
|
case "ondraw": {
|
|
|
|
_args params ["_map"];
|
|
|
|
|
|
|
|
if (GVAR(camMode) == 0) then {
|
|
|
|
_map drawIcon ["\A3\UI_F\Data\GUI\Rsc\RscDisplayMissionEditor\iconcamera_ca.paa",[0,0,0,1],GVAR(camera),24,24,GVAR(camPan)];
|
|
|
|
};
|
|
|
|
|
2015-07-24 16:23:25 +00:00
|
|
|
if !(GVAR(showIcons)) exitWith {};
|
|
|
|
|
2015-07-24 14:36:36 +00:00
|
|
|
private ["_cachedVehicles","_unit","_color","_icon"];
|
|
|
|
_cachedVehicles = [];
|
|
|
|
{
|
|
|
|
_unit = vehicle _x;
|
|
|
|
|
|
|
|
if !(_unit in _cachedVehicles) then {
|
|
|
|
_cachedVehicles pushBack _unit;
|
|
|
|
|
2015-07-24 16:13:03 +00:00
|
|
|
// Use previously cached info where possible
|
|
|
|
if (isNil { GETVAR(_unit,GVAR(uIcon),nil) }) then {
|
|
|
|
[_unit] call FUNC(cacheUnitInfo);
|
2015-07-24 14:36:36 +00:00
|
|
|
};
|
|
|
|
|
2015-07-24 16:23:25 +00:00
|
|
|
_color = GETVAR(_unit,GVAR(uColor),[ARR_4(0,0,0,0)]);
|
2015-07-24 16:13:03 +00:00
|
|
|
_icon = GETVAR(_unit,GVAR(uIcon),"");
|
2015-07-24 14:36:36 +00:00
|
|
|
_map drawIcon [_icon, _color, _unit, 24, 24, getDir _unit];
|
|
|
|
};
|
|
|
|
} forEach GVAR(unitList);
|
|
|
|
};
|
2015-08-05 23:39:14 +00:00
|
|
|
// Break from interface for escape menu
|
2015-07-25 22:59:15 +00:00
|
|
|
case "escape": {
|
|
|
|
_args params ["_display"];
|
2015-08-05 23:39:14 +00:00
|
|
|
private "_dlg";
|
2015-07-25 22:59:15 +00:00
|
|
|
|
|
|
|
// Kill display
|
|
|
|
_display closeDisplay 0;
|
|
|
|
|
2015-07-26 11:23:01 +00:00
|
|
|
// Reset cam/UI vars
|
|
|
|
GVAR(camBoom) = 0;
|
|
|
|
GVAR(camDolly) = [0,0];
|
|
|
|
|
2015-07-25 22:59:15 +00:00
|
|
|
GVAR(ctrlKey) = false;
|
|
|
|
GVAR(heldKeys) = [];
|
|
|
|
GVAR(mouse) = [false,false];
|
|
|
|
GVAR(mousePos) = [0.5,0.5];
|
|
|
|
|
|
|
|
createDialog (["RscDisplayInterrupt", "RscDisplayMPInterrupt"] select isMultiplayer);
|
|
|
|
|
|
|
|
disableSerialization;
|
|
|
|
_dlg = finddisplay 49;
|
|
|
|
_dlg displayAddEventHandler ["KeyDown", {
|
|
|
|
_key = _this select 1;
|
|
|
|
!(_key == 1)
|
|
|
|
}];
|
|
|
|
|
2015-08-05 23:39:14 +00:00
|
|
|
// Disable save, respawn, options & manual buttons
|
|
|
|
(_dlg displayCtrl 103) ctrlEnable false;
|
|
|
|
if !(alive player) then {
|
|
|
|
(_dlg displayCtrl 1010) ctrlEnable false;
|
2015-07-25 22:59:15 +00:00
|
|
|
};
|
2015-08-05 23:39:14 +00:00
|
|
|
(_dlg displayCtrl 101) ctrlEnable false;
|
|
|
|
(_dlg displayCtrl 122) ctrlEnable false;
|
2015-07-25 22:59:15 +00:00
|
|
|
|
2015-08-05 23:39:14 +00:00
|
|
|
// Initalize abort button (the "spawn" is a necessary evil)
|
|
|
|
(_dlg displayCtrl 104) ctrlAddEventHandler ["ButtonClick",{_this spawn {
|
|
|
|
disableSerialization;
|
|
|
|
_display = ctrlparent (_this select 0);
|
|
|
|
_abort = [localize "str_msg_confirm_return_lobby",nil,localize "str_disp_xbox_hint_yes",localize "str_disp_xbox_hint_no",_display,nil,true] call BIS_fnc_guiMessage;
|
|
|
|
if (_abort) then {_display closeDisplay 2; failMission "loser"};
|
|
|
|
}}];
|
2015-07-25 22:59:15 +00:00
|
|
|
|
|
|
|
// PFH to re-open display when menu closes
|
|
|
|
[{
|
|
|
|
if !(isNull (findDisplay 49)) exitWith {};
|
|
|
|
|
2015-08-05 23:39:14 +00:00
|
|
|
// If still a spectator then re-enter the interface
|
|
|
|
if (GVAR(isSet)) then {
|
|
|
|
createDialog QGVAR(interface);
|
|
|
|
[] call FUNC(transitionCamera);
|
|
|
|
};
|
2015-07-25 22:59:15 +00:00
|
|
|
|
|
|
|
[_this select 1] call CBA_fnc_removePerFrameHandler;
|
|
|
|
},0] call CBA_fnc_addPerFrameHandler;
|
2015-08-05 23:39:14 +00:00
|
|
|
|
|
|
|
true
|
2015-07-25 22:59:15 +00:00
|
|
|
};
|
2015-07-15 11:03:54 +00:00
|
|
|
};
|