diff --git a/addons/spectator/XEH_postInit.sqf b/addons/spectator/XEH_postInit.sqf index d81be40640..e41e4715c4 100644 --- a/addons/spectator/XEH_postInit.sqf +++ b/addons/spectator/XEH_postInit.sqf @@ -18,7 +18,7 @@ if (GVAR(endMission) && isServer) then { [{ - if ({(isPlayer _x) && (alive _x) && !(_x getVariable [QGVAR(isSpectator), false])} count playableUnits == 0) then { + if ({(isPlayer _x) && (alive _x) && !(_x getVariable [QGVAR(isSpectator), false])} count allUnits == 0) then { [["endDeath", false], "BIS_fnc_endMission"] call BIS_fnc_MP; [_this select 1] call CBA_fnc_removePerFrameHandler; }; @@ -36,7 +36,7 @@ player addEventHandler ["Killed", { [player] joinSilent grpNull; - if (isClass (configFile >> "CfgPatches" >> "ace_hearing")) then {EGVAR(hearing,disableVolumeUpdate) = true}; + if (["ace_hearing"] call EFUNC(common,isModLoaded)) then {EGVAR(hearing,disableVolumeUpdate) = true}; _delay = getNumber (missionConfigFile >> "respawnDelay"); _delay fadeSound 0; 999999 cutText ["", "BLACK", _delay]; @@ -44,4 +44,6 @@ player addEventHandler ["Respawn", FUNC(setSpectator)]; -}] call EFUNC(common,addEventHandler); + #include "initKeybinds.sqf"; + +}] call EFUNC(common,addEventHandler); \ No newline at end of file diff --git a/addons/spectator/XEH_preInit.sqf b/addons/spectator/XEH_preInit.sqf index 2db681c352..b6187efa6a 100644 --- a/addons/spectator/XEH_preInit.sqf +++ b/addons/spectator/XEH_preInit.sqf @@ -3,7 +3,6 @@ ADDON = false; PREP(camera); -PREP(cameraIntro); PREP(canSpectateUnit); PREP(checkUnits); PREP(compass); diff --git a/addons/spectator/functions/fnc_camera.sqf b/addons/spectator/functions/fnc_camera.sqf index ee5f755eed..81e0f9ea40 100644 --- a/addons/spectator/functions/fnc_camera.sqf +++ b/addons/spectator/functions/fnc_camera.sqf @@ -8,10 +8,10 @@ Arguments: 0: Mode: "Init" is the only mission relevant one 1: (optional): - 0: Whether player can escape from camera (false for MP spectator; true for SP photography) + 0: Whether camera is permanent (can't be escaped via escape key) Example: - ["Init", [false]] call ace_spectator_fnc_camera; + ["Init", [true]] call ace_spectator_fnc_camera; Return Value: None @@ -21,9 +21,9 @@ */ #include "script_component.hpp" -#include "\a3\editor_f\Data\Scripts\dikCodes.h" disableSerialization; + _mode = _this select 0; _this = _this select 1; @@ -31,7 +31,11 @@ switch _mode do { case "Init": { - GVAR(noEscape) = if (count _this > 0) then {_this select 0} else {false}; + GVAR(noEscape) = if (count _this > 0) then { + _this select 0 + } else { + false + }; _camPos = if (!isNil QGVAR(startingPos)) then { GVAR(startingPos) @@ -46,7 +50,7 @@ switch _mode do { }; _camPos set [2, (_camPos select 2) + 2]; - _cam = "camera" camCreate _camPos; + _cam = "Camera" camCreate _camPos; _cam setDir _camDir; _cam cameraEffect ["internal", "back"]; _cam camSetFocus [-1, -1]; @@ -54,10 +58,8 @@ switch _mode do { showCinemaBorder false; cameraEffectEnableHUD true; - //variables + //camera vars GVAR(cam) = _cam; - GVAR(LMB) = false; - GVAR(RMB) = false; GVAR(vector) = [_camDir, 0, 0]; GVAR(fov) = 0.7; GVAR(vision) = 0; @@ -67,11 +69,42 @@ switch _mode do { GVAR(lock) = [-1]; GVAR(attach) = objNull; GVAR(unit) = objNull; - GVAR(mouseBusy) = false; GVAR(markers) = 3; GVAR(accTime) = 1; GVAR(third) = false; + //mouse vars + GVAR(mouseLeft) = false; + GVAR(mouseRight) = false; + GVAR(mouseBusy) = false; + + //kb vars + GVAR(keyCamMoveForward) = false; + GVAR(keyCamMoveBackward) = false; + GVAR(keyCamMoveLeft) = false; + GVAR(keyCamMoveRight) = false; + GVAR(keyCamMoveUp) = false; + GVAR(keyCamMoveDown) = false; + GVAR(keyCamRotDownLeft) = false; + GVAR(keyCamRotDown) = false; + GVAR(keyCamRotDownRight) = false; + GVAR(keyCamRotLeft) = false; + GVAR(keyCamRotRight) = false; + GVAR(keyCamRotUpLeft) = false; + GVAR(keyCamRotUp) = false; + GVAR(keyCamRotUpRight) = false; + GVAR(keyCamBankLeft) = false; + GVAR(keyCamBankRight) = false; + GVAR(keyFOVup) = false; + GVAR(keyFOVdown) = false; + GVAR(keyFocusUp) = false; + GVAR(keyFocusDown) = false; + GVAR(keyTimeAccUp) = false; + GVAR(keyTimeAccDown) = false; + GVAR(keyCamBankMod) = false; + GVAR(keyCamRotMore) = false; + GVAR(keyCamRotLess) = false; + //define only if doesn't exist (to preserve saved spots from a previous camera) if (isNil QGVAR(savedSpots)) then { GVAR(savedSpots) = []; @@ -83,24 +116,39 @@ switch _mode do { for "_i" from 0 to 9 do {GVAR(savedUnits) set [_i, objNull]}; }; - GVAR(keys) = []; - _DIKcodes = true call BIS_fnc_keyCode; - _DIKlast = _DIKcodes select (count _DIKcodes - 1); - for "_i" from 0 to (_DIKlast - 1) do { - GVAR(keys) set [_i, false]; - }; - _display = findDisplay 46; GVAR(ehDraw3D) = addMissionEventhandler ["Draw3D", {['Draw3D', _this] call FUNC(draw3D)}]; addMissionEventHandler ["Ended", {if (!isNil QGVAR(cam)) then {["Exit"] call FUNC(camera)}}]; - GVAR(ehKeyDown) = _display displayAddEventHandler ["keyDown", {['KeyDown', _this] call FUNC(camera)}]; - GVAR(ehKeyUp) = _display displayAddEventHandler ["keyUp", {['KeyUp', _this] call FUNC(camera)}]; GVAR(ehMouseButtonDown) = _display displayAddEventHandler ["mouseButtonDown", {['MouseButtonDown', _this] call FUNC(camera)}]; GVAR(ehMouseButtonUp) = _display displayAddEventHandler ["mouseButtonUp", {['MouseButtonUp',_this] call FUNC(camera)}]; GVAR(ehMouseZChanged) = _display displayAddEventHandler ["mouseZChanged", {['MouseZChanged',_this] call FUNC(camera)}]; GVAR(ehMouseMoving) = _display displayAddEventHandler ["mouseMoving", {['Mouse',_this] call FUNC(camera)}]; GVAR(ehMouseHolding) =_display displayAddEventHandler ["mouseHolding", {['Mouse',_this] call FUNC(camera)}]; + GVAR(ehKeyDown) = _display displayAddEventHandler ["keyDown", { + _key = _this select 1; + _ret = false; + + //block grave/tilde key (there is no default tilde keybind we use to override) + if (_key == 41) then { + _ret = true + }; + + //escape sequence initiated (CBA can't handle escape) + if (_key == 1) then { + if GVAR(noEscape) exitWith {_ret = false}; + //insert excuse for using spawn + _this spawn { + disableSerialization; + _display = _this select 0; + _message = [localize LSTRING(Exit), localize LSTRING(Module_DisplayName), nil, true, _display] call BIS_fnc_guiMessage; + if (_message) then {["Exit"] call FUNC(camera)}; + }; + _ret = true; + }; + + _ret + }]; //remove mission layer _displayMission = call (uiNamespace getVariable "BIS_fnc_displayMission"); @@ -133,13 +181,13 @@ switch _mode do { _layer = [QGVAR(help)] call BIS_fnc_rscLayer; preloadTitleRsc [QGVAR(help), "PLAIN", 0, true]; - if (isClass (configFile >> "CfgPatches" >> "ace_nametags")) then { + if (["ace_nametags"] call EFUNC(common,isModLoaded)) then { GVAR(tags) = [EGVAR(nametags,showPlayerNames), EGVAR(nametags,showNamesForAI)]; EGVAR(nametags,showPlayerNames) = 0; EGVAR(nametags,showNamesForAI) = false; }; - if (isClass (configFile >> "CfgPatches" >> "ace_interact_menu")) then { + if (["ace_interact_menu"] call EFUNC(common,isModLoaded)) then { [QGVAR(interactCondition), {false}] call EFUNC(common,addCanInteractWithCondition); }; @@ -148,7 +196,9 @@ switch _mode do { [FUNC(checkUnits), 2] call CBA_fnc_addPerFrameHandler }; - [FUNC(cameraIntro), 1] call CBA_fnc_addPerFrameHandler; + //intro + 999999 cutText ["", "BLACK IN", 2]; + 2 fadeSound 1; }; ////////////////////////////////////////// @@ -156,15 +206,15 @@ switch _mode do { _mapOn = uiNamespace getVariable QGVAR(map); if (!isNull _mapOn) exitWith {}; - _keys = GVAR(keys); _cam = GVAR(cam); _dir = GVAR(vector) select 0; _pitch = GVAR(vector) select 1; _bank = GVAR(vector) select 2; _camPos = getPosASL _cam; - _coef = (GVAR(moveScale) * (((getPosATL _cam) select 2) / 2)) min 50 max 0.001; + _coef = GVAR(moveScale * (((getPosATL _cam) select 2) / 2)) min 50 max 0.001; - _move = { + //temporary functions / TODO: Move to external func? + _camMove = { _inPos = _this; if !GVAR(cameraOn) exitWith {}; if (_inPos select 2 > 20000) then {_inPos set [2, 20000]}; @@ -179,40 +229,7 @@ switch _mode do { }; }; - if (GVAR(LMB) || GVAR(RMB)) then { - if GVAR(mouseBusy) exitWith {}; - _mX = (_this select 1) * (GVAR(accTime) max 0.05); - _mY = (_this select 2) * (GVAR(accTime) max 0.05); - - if GVAR(RMB) then { - - _dX = _mX; - _dY = -_mY; - - _camPos = [_camPos, _dY, getDir _cam] call BIS_fnc_relPos; - _camPos = [_camPos, _dX, getDir _cam + 90] call BIS_fnc_relPos; - - _camPos call _move; - - } else { - if (GVAR(lock) select 0 > -1) exitWith {}; - _dX = _mX / 50 * 180 * GVAR(fov); - _dY = -_mY / 50 * 180 * GVAR(fov); - - if (_keys select DIK_LSHIFT) then { - _pitch = (_pitch + _dY) max -180 min 180; - _bank = (_bank + _dX) max -181 min 181; - if (_bank <= -181) then {_bank = 180} else {if (_bank >= 181) then {_bank = -180}}; - } else { - _dir = _dir + _dX; - _pitch = (_pitch + _dY) max -90 min 90; - }; - GVAR(vector) = [_dir, _pitch, _bank]; - [_cam, GVAR(vector)] call BIS_fnc_setObjectRotation; - }; - }; - - _camMove = { + _camMoveKeyboard = { _dX = _this select 0; _dY = _this select 1; _dZ = _this select 2; @@ -226,7 +243,13 @@ switch _mode do { //for some reason, at visual height = 0, cameras report 10cm higher than they actually are _camPos set [2, (_camPos select 2) max (getTerrainHeightASL _camPos + 0.1)]; - _camPos call _move; + _camPos call _camMove; + }; + + _rotMod = if (GVAR(keyCamRotMore) && !GVAR(keyCamRotLess)) then { + 5 + } else { + if (!GVAR(keyCamRotMore) && GVAR(keyCamRotLess)) then {0.1} else {1}; }; _camRotate = { @@ -250,51 +273,73 @@ switch _mode do { [_cam, GVAR(vector)] call BIS_fnc_setObjectRotation; }; - _numPad0 = _keys select DIK_NUMPAD0; - _numPadDel = _keys select DIK_DECIMAL; - _rotMod = if (_numPad0 && !_numPadDel) then { - 5 - } else { - if (!_numPad0 && _numPadDel) then {0.1} else {1}; + //apply mouse + if (GVAR(mouseLeft) || GVAR(mouseRight)) then { + if GVAR(mouseBusy) exitWith {}; + _mX = (_this select 1) * (GVAR(accTime) max 0.05); + _mY = (_this select 2) * (GVAR(accTime) max 0.05); + + if GVAR(mouseRight) then { + + _dX = _mX; + _dY = -_mY; + + _camPos = [_camPos, _dY, getDir _cam] call BIS_fnc_relPos; + _camPos = [_camPos, _dX, getDir _cam + 90] call BIS_fnc_relPos; + + _camPos call _camMove; + + } else { + if (GVAR(lock) select 0 > -1) exitWith {}; + _dX = _mX / 50 * 180 * GVAR(fov); + _dY = -_mY / 50 * 180 * GVAR(fov); + + if GVAR(keyCamBankMod) then { + _pitch = (_pitch + _dY) max -180 min 180; + _bank = (_bank + _dX) max -181 min 181; + if (_bank <= -181) then {_bank = 180} else {if (_bank >= 181) then {_bank = -180}}; + } else { + _dir = _dir + _dX; + _pitch = (_pitch + _dY) max -90 min 90; + }; + GVAR(vector) = [_dir, _pitch, _bank]; + [_cam, GVAR(vector)] call BIS_fnc_setObjectRotation; + }; }; - if (_keys select DIK_W) then {[0,1,0] call _camMove}; - if (_keys select DIK_S) then {[0,-1,0] call _camMove}; - if (_keys select DIK_A) then {[-1,1,0] call _camMove}; - if (_keys select DIK_D) then {[1,1,0] call _camMove}; + //apply kb + if GVAR(keyCamMoveForward) then {[0,1,0] call _camMoveKeyboard}; + if GVAR(keyCamMoveBackward) then {[0,-1,0] call _camMoveKeyboard}; + if GVAR(keyCamMoveLeft) then {[-1,1,0] call _camMoveKeyboard}; + if GVAR(keyCamMoveRight) then {[1,1,0] call _camMoveKeyboard}; + if GVAR(keyCamMoveUp) then {[0,0,1] call _camMoveKeyboard}; + if GVAR(keyCamMoveDown) then {[0,0,-1] call _camMoveKeyboard}; - if (_keys select DIK_Q) then {[0,0,1] call _camMove}; - if (_keys select DIK_Z) then {[0,0,-1] call _camMove}; + if GVAR(keyCamRotDownLeft) then {[-1,-1,0] call _camRotate}; + if GVAR(keyCamRotDown) then {[+0,-1,0] call _camRotate}; + if GVAR(keyCamRotDownRight) then {[+1,-1,0] call _camRotate}; + if GVAR(keyCamRotLeft) then {[-1,+0,0] call _camRotate}; + if GVAR(keyCamRotRight) then {[+1,+0,0] call _camRotate}; + if GVAR(keyCamRotUpLeft) then {[-1,+1,0] call _camRotate}; + if GVAR(keyCamRotUp) then {[+0,+1,0] call _camRotate}; + if GVAR(keyCamRotUpRight) then {[+1,+1,0] call _camRotate}; - if (_keys select DIK_NUMPAD1) then {[-1,-1,0] call _camRotate}; - if (_keys select DIK_NUMPAD2) then {[+0,-1,0] call _camRotate}; - if (_keys select DIK_NUMPAD3) then {[+1,-1,0] call _camRotate}; - if (_keys select DIK_NUMPAD4) then {[-1,+0,0] call _camRotate}; - if (_keys select DIK_NUMPAD6) then {[+1,+0,0] call _camRotate}; - if (_keys select DIK_NUMPAD7) then {[-1,+1,0] call _camRotate}; - if (_keys select DIK_NUMPAD8) then {[+0,+1,0] call _camRotate}; - if (_keys select DIK_NUMPAD9) then {[+1,+1,0] call _camRotate}; - if (_keys select DIK_DIVIDE) then {[-1] call _camBank}; - if (_keys select DIK_MULTIPLY) then {[+1] call _camBank}; + if GVAR(keyCamBankLeft) then {[-1] call _camBank}; + if GVAR(keyCamBankRight) then {[+1] call _camBank}; - if (_keys select DIK_ADD) then { + if GVAR(keyFOVup) then { GVAR(fov) = GVAR(fov) - (GVAR(fov) / 50 * _rotMod) max 0.01; _cam camPrepareFOV GVAR(fov); _cam camCommitPrepared 0; }; - if (_keys select DIK_SUBTRACT) then { + + if GVAR(keyFOVdown) then { GVAR(fov) = GVAR(fov) + (GVAR(fov) / 50 * _rotMod) min 2; _cam camPrepareFOV GVAR(fov); _cam camCommitPrepared 0; }; - if (_keys select DIK_NUMPADENTER) then { - GVAR(fov) = 0.7; - _cam camPrepareFOV GVAR(fov); - _cam camCommitPrepared 0; - }; - - if (_keys select DIK_MINUS) then { + if GVAR(keyFocusDown) then { _cur = GVAR(focus) select 0; if (_cur < 0) then {_cur = 1}; _cur = _cur - (_cur / 25) max 0.25; @@ -303,7 +348,7 @@ switch _mode do { _cam camCommit 0; }; - if (_keys select DIK_EQUALS) then { + if GVAR(keyFocusUp) then { _cur = GVAR(focus) select 0; if (_cur < 0) then {_cur = 1}; _cur = _cur + (_cur / 25) min 5000; @@ -312,7 +357,7 @@ switch _mode do { _cam camCommit 0; }; - if (_keys select DIK_LBRACKET)then { + if GVAR(keyTimeAccDown) then { if (!isMultiplayer) then { _cur = GVAR(accTime); _cur = _cur - (_cur / 25) max 0; @@ -321,7 +366,7 @@ switch _mode do { }; }; - if (_keys select DIK_RBRACKET)then { + if GVAR(keyTimeAccUp) then { if (!isMultiplayer) then { _cur = GVAR(accTime); _cur = _cur + (_cur / 25) min 4; @@ -337,15 +382,10 @@ switch _mode do { if (!isNull _mapOn) exitWith {}; _button = _this select 1; - _mX = _this select 2; - _mY = _this select 3; - _shift = _this select 4; - _ctrl = _this select 5; - _alt = _this select 6; switch (_button) do { - case 0: {GVAR(LMB) = true}; - case 1: {GVAR(RMB) = true}; + case 0: {GVAR(mouseLeft) = true}; + case 1: {GVAR(mouseRight) = true}; }; }; @@ -355,9 +395,10 @@ switch _mode do { if (!isNull _mapOn) exitWith {}; _button = _this select 1; + switch (_button) do { - case 0: {GVAR(LMB) = false}; - case 1: {GVAR(RMB) = false}; + case 0: {GVAR(mouseLeft) = false}; + case 1: {GVAR(mouseRight) = false}; }; }; @@ -375,14 +416,10 @@ switch _mode do { }; ////////////////////////////////////////// - case "KeyDown": { - _key = _this select 1; - _shift = _this select 2; - _ctrl = _this select 3; - _alt = _this select 4; - _return = false; + case "CameraSlot": { - GVAR(keys) set [_key, true]; + _mode = _this select 0; + _value = _this select 1; _cam = GVAR(cam); _camOn = GVAR(cameraOn); @@ -407,7 +444,7 @@ switch _mode do { _arr = GVAR(savedSpots) select _num; if (count (_arr) > 0) then { if (!_camOn) then { - ["Camera", ["Free"]] call FUNC(camera) + ["CameraMode", ["Free"]] call FUNC(camera) }; call _detach; _cam setPos (_arr select 0); @@ -437,21 +474,21 @@ switch _mode do { _unit = GVAR(savedUnits) select _num; if (!isNull _unit) then { if (_lock > -1) then { - ["Camera", ["Lock"]] call FUNC(camera) + ["CameraMode", ["Lock"]] call FUNC(camera) }; if (GVAR(unit) == _unit) then { call _detach; if (_camOn) then { - ["Camera", ["Third"]] call FUNC(camera); + ["CameraMode", ["Third"]] call FUNC(camera); } else { - ["Camera", ["SwitchUnit"]] call FUNC(camera); + ["CameraMode", ["SwitchUnit"]] call FUNC(camera); }; } else { GVAR(unit) = _unit; - if ((GVAR(lock) select 0) > -1) then {["Camera", ["Lock"]] call FUNC(camera)}; + if ((GVAR(lock) select 0) > -1) then {["CameraMode", ["Lock"]] call FUNC(camera)}; if (!_camOn) then { call _detach; - ["Camera", ["SwitchUnit"]] call FUNC(camera); + ["CameraMode", ["SwitchUnit"]] call FUNC(camera); }; }; }; @@ -459,230 +496,31 @@ switch _mode do { _detach = { if (!isNull GVAR(attach)) then { - ["Camera", ["Attach"]] call FUNC(camera); + ["CameraMode", ["Attach"]] call FUNC(camera); }; }; - switch (_key) do { - - case (DIK_F1): {if (_ctrl) then {[0] call _camSaveSpot} else {[0] call _camLoadSpot}; _return = true}; - case (DIK_F2): {if (_ctrl) then {[1] call _camSaveSpot} else {[1] call _camLoadSpot}; _return = true}; - case (DIK_F3): {if (_ctrl) then {[2] call _camSaveSpot} else {[2] call _camLoadSpot}; _return = true}; - case (DIK_F4): {if (_ctrl) then {[3] call _camSaveSpot} else {[3] call _camLoadSpot}; _return = true}; - case (DIK_F5): {if (_ctrl) then {[4] call _camSaveSpot} else {[4] call _camLoadSpot}; _return = true}; - case (DIK_F6): {if (_ctrl) then {[5] call _camSaveSpot} else {[5] call _camLoadSpot}; _return = true}; - case (DIK_F7): {if (_ctrl) then {[6] call _camSaveSpot} else {[6] call _camLoadSpot}; _return = true}; - case (DIK_F8): {if (_ctrl) then {[7] call _camSaveSpot} else {[7] call _camLoadSpot}; _return = true}; - case (DIK_F9): {if (_ctrl) then {[8] call _camSaveSpot} else {[8] call _camLoadSpot}; _return = true}; - case (DIK_F10): {if (_ctrl) then {[9] call _camSaveSpot} else {[9] call _camLoadSpot}; _return = true}; - case (DIK_F11): {if (_ctrl) then {[10] call _camSaveSpot} else {[10] call _camLoadSpot}; _return = true}; - case (DIK_F12): {if (_ctrl) then {[11] call _camSaveSpot} else {[11] call _camLoadSpot}; _return = true}; - - case (DIK_1): {if (_ctrl) then {[0] call _camSaveUnit} else {[0] call _camLoadUnit}; _return = true}; - case (DIK_2): {if (_ctrl) then {[1] call _camSaveUnit} else {[1] call _camLoadUnit}; _return = true}; - case (DIK_3): {if (_ctrl) then {[2] call _camSaveUnit} else {[2] call _camLoadUnit}; _return = true}; - case (DIK_4): {if (_ctrl) then {[3] call _camSaveUnit} else {[3] call _camLoadUnit}; _return = true}; - case (DIK_5): {if (_ctrl) then {[4] call _camSaveUnit} else {[4] call _camLoadUnit}; _return = true}; - case (DIK_6): {if (_ctrl) then {[5] call _camSaveUnit} else {[5] call _camLoadUnit}; _return = true}; - case (DIK_7): {if (_ctrl) then {[6] call _camSaveUnit} else {[6] call _camLoadUnit}; _return = true}; - case (DIK_8): {if (_ctrl) then {[7] call _camSaveUnit} else {[7] call _camLoadUnit}; _return = true}; - case (DIK_9): {if (_ctrl) then {[8] call _camSaveUnit} else {[8] call _camLoadUnit}; _return = true}; - case (DIK_0): {if (_ctrl) then {[9] call _camSaveUnit} else {[9] call _camLoadUnit}; _return = true}; - - case (DIK_NUMPAD5): { - _dir = getDir _cam; - if (!isNull GVAR(attach)) then {_dir = _dir - getDir GVAR(attach)}; - GVAR(vector) = [_dir, 0, 0]; - [_cam, GVAR(vector)] call BIS_fnc_setObjectRotation; - GVAR(fov) = 0.7; - _cam camPrepareFOV GVAR(fov); - _cam camCommitPrepared 0; + switch _mode do { + case "SaveSpot": { + [_value] call _camSaveSpot }; - case (DIK_NUMPADENTER): {_return = true}; - - case (DIK_NUMPAD0): {_return = true}; - - case (DIK_DECIMAL): {_return = true}; - - case (DIK_BACKSPACE): { - GVAR(focus) = if (!_shift) then { - [-1, 1]; - } else { - [-1, -1]; - }; - _cam camPrepareFocus GVAR(focus); - _cam camCommitPrepared 0; - _return = true; + case "LoadSpot": { + [_value] call _camLoadSpot }; - case (DIK_BACKSLASH): { - if (!isMultiplayer) then { - GVAR(accTime) = 1; - setAccTime GVAR(accTime); - }; + case "SaveUnit": { + [_value] call _camSaveUnit }; - case (DIK_GRAVE): {_return = true}; - - case (DIK_SPACE): { - if (!_camOn) exitWith {}; - if (_ctrl) then { - ["Camera", ["Attach"]] call FUNC(camera); - } else { - ["Camera", ["Lock"]] call FUNC(camera); - }; + case "LoadUnit": { + [_value] call _camLoadUnit }; - - case (DIK_LEFT): { - ["Camera", ["NewUnit", -1]] call FUNC(camera) - }; - - case (DIK_RIGHT): { - ["Camera", ["NewUnit", 1]] call FUNC(camera) - }; - - case (DIK_UP): { - if (isNull GVAR(unit)) exitWith {}; - if (_lock > -1) then {["Camera", ["Lock"]] call FUNC(camera)}; - call _detach; - if (_camOn) then { - ["Camera", ["Third"]] call FUNC(camera); - } else { - if GVAR(third) then { - ["Camera", ["First"]] call FUNC(camera); - }; - }; - }; - - case (DIK_DOWN): { - if (isNull GVAR(unit)) exitWith {}; - if (_lock > -1) then {["Camera", ["Lock"]] call FUNC(camera)}; - call _detach; - if (!_camOn) then { - if !GVAR(third) then { - ["Camera", ["Third"]] call FUNC(camera); - } else { - ["Camera", ["Free"]] call FUNC(camera); - }; - }; - }; - - case (DIK_T): { - GVAR(markers) = GVAR(markers) + 1; - if (GVAR(markers) > 3) then {GVAR(markers) = 0}; - if (GVAR(markers) == 0) then {clearRadio}; - }; - - case (DIK_U): { - _map = uiNameSpace getVariable [QGVAR(map), findDisplay 12202]; - if (!isNull _map) exitWith {}; - - _overlay = uiNamespace getVariable [QGVAR(overlay), findDisplay 12200]; - if (isNull _overlay) then { - createDialog QGVAR(overlay); - } else { - closeDialog 0; - }; - }; - - case (DIK_X): { - _layer = [QGVAR(crosshair)] call BIS_fnc_rscLayer; - _xhair = uiNamespace getVariable QGVAR(crosshair); - if (isNull _xhair) then { - _layer cutRsc [QGVAR(crosshair), "PLAIN", 0, true]; - call FUNC(crosshair); - } else { - _layer cutText ["", "PLAIN"]; - }; - }; - - case (DIK_C): { - _layer = [QGVAR(compass)] call BIS_fnc_rscLayer; - if (isNull (uiNamespace getVariable QGVAR(compass))) then { - _layer cutRsc [QGVAR(compass), "PLAIN", 0, true]; - } else { - _layer cutText ["", "PLAIN"]; - }; - - _layer = [QGVAR(status)] call BIS_fnc_rscLayer; - if (isNull (uiNamespace getVariable QGVAR(status))) then { - _layer cutRsc [QGVAR(status), "PLAIN", 0, true]; - } else { - _layer cutText ["", "PLAIN"]; - }; - }; - - case (DIK_H): { - _layer = [QGVAR(help)] call BIS_fnc_rscLayer; - if (isNull (uiNamespace getVariable QGVAR(help))) then { - _layer cutRsc [QGVAR(help), "PLAIN", 0, true]; - } else { - _layer cutText ["", "PLAIN"]; - }; - }; - - case (DIK_M): { - _map = uiNameSpace getVariable [QGVAR(map), findDisplay 12202]; - if (isNull _map) then { - createDialog QGVAR(map); - } else { - closeDialog 0; - }; - }; - - case (DIK_N): { - GVAR(vision) = GVAR(vision) + 1; - if (GVAR(vision) > 4) then {GVAR(vision) = 0}; - switch GVAR(vision) do { - case 0: { - camUseNVG false; - false SetCamUseTi 0; - }; - case 1: { - camUseNVG true; - false SetCamUseTi 0; - }; - case 2: { - camUseNVG false; - true SetCamUseTi 0; - }; - case 3: { - camUseNVG false; - true SetCamUseTi 1; - }; - - case 4: { - camUseNVG false; - true SetCamUseTi 4; - }; - }; - }; - - case (DIK_ESCAPE): { - if !GVAR(noEscape) then { - _return = true; - _this spawn { - disableSerialization; - _display = _this select 0; - _message = ["Do you want to exit spectator?", "ACE Spectator", nil, true, _display] call BIS_fnc_guiMessage; - if (_message) then {["Exit"] call FUNC(camera)}; - }; - }; - }; - default {}; }; - - _return }; ////////////////////////////////////////// - case "KeyUp": { - GVAR(keys) set [_this select 1, false]; - }; - - ////////////////////////////////////////// - case "Camera": { + case "CameraMode": { _mode = _this select 0; @@ -690,9 +528,9 @@ switch _mode do { _camOn = GVAR(cameraOn); _unit = GVAR(unit); _lock = GVAR(lock) select 0; + _camPos = [getPos _cam, GVAR(vector), GVAR(fov), GVAR(focus)]; _findTarget = { - _ret = []; _screenPos = screenToWorld [0.5,0.5]; _camPosASL = getPosASL _cam; @@ -791,21 +629,20 @@ switch _mode do { if (_index > (_count - 1)) then {_index = 0}; GVAR(unit) = _units select _index; - if (!_camOn) then {["Camera", ["SwitchUnit"]] call FUNC(camera)}; + if (!_camOn) then {["CameraMode", ["SwitchUnit"]] call FUNC(camera)}; }; }; case "SwitchUnit": { if !GVAR(third) then { - ["Camera", ["First"]] call FUNC(camera); + ["CameraMode", ["First"]] call FUNC(camera); } else { - ["Camera", ["Third"]] call FUNC(camera); + ["CameraMode", ["Third"]] call FUNC(camera); }; }; case "Lock": { if (_lock < 0) then { - _target = call _findTarget; if (typeName _target == "OBJECT") then { @@ -820,13 +657,12 @@ switch _mode do { _cam camCommitPrepared 0; call FUNC(crosshair); } else { - _dir = getDir _cam; _pitchBank = _cam call BIS_fnc_getPitchBank; GVAR(lock) = [-1]; _cam cameraEffect ["Terminate", "Back"]; camDestroy _cam; - _cam = "camera" camCreate (_camPos select 0); + _cam = "Camera" camCreate (_camPos select 0); [_cam, _camPos select 1] call BIS_fnc_setObjectRotation; _cam camPrepareFOV (_camPos select 2); _cam camPrepareFocus GVAR(focus); @@ -872,145 +708,20 @@ switch _mode do { call FUNC(crosshair); }; - ////////////////////////////////////////// - case "Help": { - - _dialog = _this; - -_c1Action = parseText " -Camera:
-
-Move
-Pitch, Yaw
-Roll
-Slide
-Speed Multiplier
-Camera Mode
-Track Pos or Object
-Lock to Object
-Save Pos
-Recall Pos
-Optic Mode
-Focus
-Autofocus
-Disable Focus
-Pitch and Yaw
-Roll
-Pitch/Roll Reset
-Zoom
-Reset Zoom
-Pitch/Yaw/Roll/Zoom Fast
-Pitch/Yaw/Roll/Zoom Slow
-
-"; - -_c1Control = parseText " -
-
-W, A, S, D
-LMB + Mouse
-Shift + LMB + Mouse
-RMB + Mouse
-MouseWheel Up, Down
-Arrow Up, Down
-Space
-Ctrl + Space
-Ctrl + F1...F12
-F1...F12
-N
-Keyboard - and +
-Backspace
-Shift + Backspace
-Numpad 1...9
-Numpad / and *
-Numpad 5
-Numpad - and +
-Numpad Enter
-Numpad 0
-Numpad Decimal
-
-"; - -_c2Action = parseText " -Units:
-
-Cycle Unit
-Save Unit
-Recall Unit
-Unit List
-
-Display:
-
-Toggle Crosshair
-Toggle Status Bar
-View Distance Dialog
-Cycle Marker Mode
-Toggle Help
-
-"; - -_c2Control = parseText " -
-
-Arrow Left, Right
-Ctrl + 1...10
-1...10
-U
-
-
-
-X
-C
-G
-T
-H
-
-"; - -if (!isMultiplayer) then { - -_add1 = parseText " -
-Time:
-
-Faster, Slower
-Reset -
-"; - -_add2 = parseText " -
-
-
-[ and ]
-\
-
-"; - - _c2Action = composeText [_c2Action, _add1]; - _c2Control = composeText [_c2Control, _add2]; -}; - - (_dialog displayCtrl 1) ctrlSetStructuredText _c1Action; - (_dialog displayCtrl 2) ctrlSetStructuredText _c1Control; - (_dialog displayCtrl 3) ctrlSetStructuredText _c2Action; - (_dialog displayCtrl 4) ctrlSetStructuredText _c2Control; - }; - ////////////////////////////////////////// case "Exit": { - if (isClass (configFile >> "CfgPatches" >> "ace_nametags")) then { + if (["ace_nametags"] call EFUNC(common,isModLoaded)) then { EGVAR(nametags,showPlayerNames) = GVAR(tags) select 0; EGVAR(nametags,showNamesForAI) = GVAR(tags) select 1; GVAR(tags) = nil; }; - if (isClass (configFile >> "CfgPatches" >> "ace_hearing")) then { + if (["ace_hearing"] call EFUNC(common,isModLoaded)) then { EGVAR(hearing,disableVolumeUpdate) = false; }; - if (isClass (configFile >> "CfgPatches" >> "ace_interact_menu")) then { + if (["ace_interact_menu"] call EFUNC(common,isModLoaded)) then { [QGVAR(interactCondition)] call EFUNC(common,removeCanInteractWithCondition); }; @@ -1020,10 +731,9 @@ _add2 = parseText " camDestroy GVAR(cam); clearRadio; + //camera vars GVAR(noEscape) = nil; GVAR(cam) = nil; - GVAR(LMB) = nil; - GVAR(RMB) = nil; GVAR(vector) = nil; GVAR(fov) = nil; GVAR(vision) = nil; @@ -1033,24 +743,51 @@ _add2 = parseText " GVAR(lock) = nil; GVAR(attach) = nil; GVAR(unit) = nil; - GVAR(mouseBusy) = nil; GVAR(markers) = nil; - GVAR(keys) = nil; GVAR(accTime) = nil; + //mouse vars + GVAR(mouseLeft) = nil; + GVAR(mouseRight) = nil; + GVAR(mouseBusy) = nil; + + //kb vars + GVAR(keyCamMoveForward) = nil; + GVAR(keyCamMoveBackward) = nil; + GVAR(keyCamMoveLeft) = nil; + GVAR(keyCamMoveRight) = nil; + GVAR(keyCamMoveUp) = nil; + GVAR(keyCamMoveDown) = nil; + GVAR(keyCamRotDownLeft) = nil; + GVAR(keyCamRotDown) = nil; + GVAR(keyCamRotDownRight) = nil; + GVAR(keyCamRotLeft) = nil; + GVAR(keyCamRotRight) = nil; + GVAR(keyCamRotUpLeft) = nil; + GVAR(keyCamRotUp) = nil; + GVAR(keyCamRotUpRight) = nil; + GVAR(keyCamBankLeft) = nil; + GVAR(keyCamBankRight) = nil; + GVAR(keyFOVup) = nil; + GVAR(keyFOVdown) = nil; + GVAR(keyFocusUp) = nil; + GVAR(keyFocusDown) = nil; + GVAR(keyTimeAccUp) = nil; + GVAR(keyTimeAccDown) = nil; + GVAR(keyCamBankMod) = nil; + GVAR(keyCamRotMore) = nil; + GVAR(keyCamRotLess) = nil; + _display = findDisplay 46; removeMissionEventHandler ["Draw3D", GVAR(ehDraw3D)]; _display displayRemoveEventHandler ["keyDown", GVAR(ehKeyDown)]; - _display displayRemoveEventHandler ["keyUp", GVAR(ehKeyUp)]; _display displayRemoveEventHandler ["mouseButtonDown", GVAR(ehMouseButtonDown)]; _display displayRemoveEventHandler ["mouseButtonUp", GVAR(ehMouseButtonUp)]; _display displayRemoveEventHandler ["mouseZChanged", GVAR(ehMouseZChanged)]; _display displayRemoveEventHandler ["mouseMoving", GVAR(ehMouseMoving)]; _display displayRemoveEventHandler ["mouseHolding", GVAR(ehMouseHolding)]; GVAR(ehDraw3D) = nil; - GVAR(ehKeyDown) = nil; - GVAR(ehKeyUp) = nil; GVAR(ehMouseButtonDown) = nil; GVAR(ehMouseButtonUp) = nil; GVAR(ehMouseZChanged) = nil; @@ -1066,4 +803,4 @@ _add2 = parseText " if (!isMultiplayer) then {setAccTime 1}; ACE_player switchCamera "Internal"; }; -}; +}; \ No newline at end of file diff --git a/addons/spectator/functions/fnc_cameraIntro.sqf b/addons/spectator/functions/fnc_cameraIntro.sqf deleted file mode 100644 index 22bfa27d57..0000000000 --- a/addons/spectator/functions/fnc_cameraIntro.sqf +++ /dev/null @@ -1,28 +0,0 @@ -/* - Author: - voiper - - Description: - Curtain, sound, and text intro when camera starts. - - Arguments: - None - - Example: - call ace_spectator_fnc_camIntro; - - Return Value: - None - - Public: - No -*/ - -#include "script_component.hpp" - -999999 cutText ["", "BLACK IN", 2]; -2 fadeSound 1; - -["Press H for spectator controls", 2] call EFUNC(common,displaytextstructured); - -[_this select 1] call CBA_fnc_removePerFrameHandler; \ No newline at end of file diff --git a/addons/spectator/initKeybinds.sqf b/addons/spectator/initKeybinds.sqf new file mode 100644 index 0000000000..aa2a137ef3 --- /dev/null +++ b/addons/spectator/initKeybinds.sqf @@ -0,0 +1,1333 @@ +/* + Author: + voiper +*/ + +#include "script_component.hpp" +#include "\a3\editor_f\Data\Scripts\dikCodes.h" + +#define MOD QUOTE(ACE3 Spectator) +#define ESCAPE if (isNil QGVAR(cam)) exitWith {false} + +/* + Rationale for so many GVARs: In Keydown EHs, held keys have a ~0.5s pause before + they start repeating, which is bad UX for camera movement; with these GVARs, a + PFH (one in fnc_camera) immediately reacts to when their value changes, and starts + repeating on the next frame. +*/ + +[MOD, QGVAR(keyNameCamMoveForward), localize LSTRING(keyCamMoveForward), +{ + ESCAPE; + GVAR(keyCamMoveForward) = true; + false +}, +{ + ESCAPE; + GVAR(keyCamMoveForward) = false; + false +}, +[DIK_W, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameCamMoveBackward), localize LSTRING(keyCamMoveBackward), +{ + ESCAPE; + GVAR(keyCamMoveBackward) = true; + false +}, +{ + ESCAPE; + GVAR(keyCamMoveBackward) = false; + false +}, +[DIK_S, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameCamMoveLeft), localize LSTRING(keyCamMoveLeft), +{ + ESCAPE; + GVAR(keyCamMoveLeft) = true; + false +}, +{ + ESCAPE; + GVAR(keyCamMoveLeft) = false; + false +}, +[DIK_A, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameCamMoveRight), localize LSTRING(keyCamMoveRight), +{ + ESCAPE; + GVAR(keyCamMoveRight) = true; + false +}, +{ + ESCAPE; + GVAR(keyCamMoveRight) = false; + false +}, +[DIK_D, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameCamMoveUp), localize LSTRING(keyCamMoveUp), +{ + ESCAPE; + GVAR(keyCamMoveUp) = true; + false +}, +{ + ESCAPE; + GVAR(keyCamMoveUp) = false; + false +}, +[DIK_Q, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameCamMoveDown), localize LSTRING(keyCamMoveDown), +{ + ESCAPE; + GVAR(keyCamMoveDown) = true; + false +}, +{ + ESCAPE; + GVAR(keyCamMoveDown) = false; + false +}, +[DIK_Z, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameCamRotUp), localize LSTRING(keyCamRotUp), +{ + ESCAPE; + GVAR(keyCamRotUp) = true; + false +}, +{ + ESCAPE; + GVAR(keyCamRotUp) = false; + false +}, +[DIK_NUMPAD8, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameCamRotDown), localize LSTRING(keyCamRotDown), +{ + ESCAPE; + GVAR(keyCamRotDown) = true; + false +}, +{ + ESCAPE; + GVAR(keyCamRotDown) = false; + false +}, +[DIK_NUMPAD2, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameCamRotLeft), localize LSTRING(keyCamRotLeft), +{ + ESCAPE; + GVAR(keyCamRotLeft) = true; + false +}, +{ + ESCAPE; + GVAR(keyCamRotLeft) = false; + false +}, +[DIK_NUMPAD4, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameCamRotRight), localize LSTRING(keyCamRotRight), +{ + ESCAPE; + GVAR(keyCamRotRight) = true; + false +}, +{ + ESCAPE; + GVAR(keyCamRotRight) = false; + false +}, +[DIK_NUMPAD6, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameCamRotUpLeft), localize LSTRING(keyCamRotUpLeft), +{ + ESCAPE; + GVAR(keyCamRotUpLeft) = true; + false +}, +{ + ESCAPE; + GVAR(keyCamRotUpLeft) = false; + false +}, +[DIK_NUMPAD7, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameCamRotUpRight), localize LSTRING(keyCamRotUpRight), +{ + ESCAPE; + GVAR(keyCamRotUpRight) = true; + false +}, +{ + ESCAPE; + GVAR(keyCamRotUpRight) = false; + false +}, +[DIK_NUMPAD9, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameCamRotDownLeft), localize LSTRING(keyCamRotDownLeft), +{ + ESCAPE; + GVAR(keyCamRotDownLeft) = true; + false +}, +{ + ESCAPE; + GVAR(keyCamRotDownLeft) = false; + false +}, +[DIK_NUMPAD1, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameCamRotDownRight), localize LSTRING(keyCamRotDownRight), +{ + ESCAPE; + GVAR(keyCamRotDownRight) = true; + false +}, +{ + ESCAPE; + GVAR(keyCamRotDownRight) = false; + false +}, +[DIK_NUMPAD3, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameCamBankLeft), localize LSTRING(keyCamBankLeft), +{ + ESCAPE; + GVAR(keyCamBankLeft) = true; + false +}, +{ + ESCAPE; + GVAR(keyCamBankLeft) = false; + false +}, +[DIK_DIVIDE, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameCamBankRight), localize LSTRING(keyCamBankRight), +{ + ESCAPE; + GVAR(keyCamBankRight) = true; + false +}, +{ + ESCAPE; + GVAR(keyCamBankRight) = false; + false +}, +[DIK_MULTIPLY, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameCamRotMore), localize LSTRING(keyCamRotMore), +{ + ESCAPE; + GVAR(keyCamRotMore) = true; + //true to block default behaviour + true +}, +{ + ESCAPE; + GVAR(keyCamRotMore) = false; + false +}, +[DIK_NUMPAD0, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameCamRotLess), localize LSTRING(keyCamRotLess), +{ + ESCAPE; + GVAR(keyCamRotLess) = true; + //true to block default behaviour + true +}, +{ + ESCAPE; + GVAR(keyCamRotLess) = false; + false +}, +[DIK_DECIMAL, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameCamBankMod), localize LSTRING(keyCamBankMod), +{ + ESCAPE; + GVAR(keyCamBankMod) = true; + false +}, +{ + ESCAPE; + GVAR(keyCamBankMod) = false; + false +}, +[DIK_LSHIFT, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameCamReset), localize LSTRING(keyCamReset), +{ + ESCAPE; + _cam = GVAR(cam); + _dir = getDir _cam; + if (!isNull GVAR(attach)) then {_dir = _dir - getDir GVAR(attach)}; + GVAR(vector) = [_dir, 0, 0]; + [_cam, GVAR(vector)] call BIS_fnc_setObjectRotation; + GVAR(fov) = 0.7; + _cam camPrepareFOV GVAR(fov); + _cam camCommitPrepared 0; + false +}, +{ + false +}, +[DIK_NUMPAD5, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameCamLock), localize LSTRING(keyCamLock), +{ + ESCAPE; + if !GVAR(cameraOn) exitWith {}; + ["CameraMode", ["Lock"]] call FUNC(camera); + false +}, +{ + false +}, +[DIK_SPACE, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameCamAttach), localize LSTRING(keyCamAttach), +{ + ESCAPE; + if !GVAR(cameraOn) exitWith {}; + ["CameraMode", ["Attach"]] call FUNC(camera); + false +}, +{ + false +}, +[DIK_SPACE, [false, true, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameUnitNext), localize LSTRING(keyUnitNext), +{ + ESCAPE; + ["CameraMode", ["NewUnit", 1]] call FUNC(camera); + false +}, +{ + false +}, +[DIK_RIGHT, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameUnitPrevious), localize LSTRING(keyUnitPrevious), +{ + ESCAPE; + ["CameraMode", ["NewUnit", -1]] call FUNC(camera); + false +}, +{ + false +}, +[DIK_LEFT, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNamePOVup), localize LSTRING(keyPOVup), +{ + ESCAPE; + if (isNull GVAR(unit)) exitWith {}; + _lock = GVAR(lock) select 0; + if (_lock > -1) then {["CameraMode", ["Lock"]] call FUNC(camera)}; + if (!isNull GVAR(attach)) then { + ["CameraMode", ["Attach"]] call FUNC(camera); + }; + if GVAR(cameraOn) then { + ["CameraMode", ["Third"]] call FUNC(camera); + } else { + if GVAR(third) then { + ["CameraMode", ["First"]] call FUNC(camera); + }; + }; + false +}, +{ + false +}, +[DIK_UP, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNamePOVdown), localize LSTRING(keyPOVdown), +{ + ESCAPE; + if (isNull GVAR(unit)) exitWith {}; + _lock = GVAR(lock) select 0; + if (_lock > -1) then {["CameraMode", ["Lock"]] call FUNC(camera)}; + if (!isNull GVAR(attach)) then { + ["CameraMode", ["Attach"]] call FUNC(camera); + }; + if !GVAR(cameraOn) then { + if !GVAR(third) then { + ["CameraMode", ["Third"]] call FUNC(camera); + } else { + ["CameraMode", ["Free"]] call FUNC(camera); + }; + }; + false +}, +{ + false +}, +[DIK_DOWN, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameSaveSpot1), localize LSTRING(keySaveSpot1), +{ + ESCAPE; + ["CameraSlot", ["SaveSpot", 0]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_F1, [false, true, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameSaveSpot2), localize LSTRING(keySaveSpot2), +{ + ESCAPE; + ["CameraSlot", ["SaveSpot", 1]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_F2, [false, true, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameSaveSpot3), localize LSTRING(keySaveSpot3), +{ + ESCAPE; + ["CameraSlot", ["SaveSpot", 2]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_F3, [false, true, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameSaveSpot4), localize LSTRING(keySaveSpot4), +{ + ESCAPE; + ["CameraSlot", ["SaveSpot", 3]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_F4, [false, true, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameSaveSpot5), localize LSTRING(keySaveSpot5), +{ + ESCAPE; + ["CameraSlot", ["SaveSpot", 4]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_F5, [false, true, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameSaveSpot6), localize LSTRING(keySaveSpot6), +{ + ESCAPE; + ["CameraSlot", ["SaveSpot", 5]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_F6, [false, true, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameSaveSpot7), localize LSTRING(keySaveSpot7), +{ + ESCAPE; + ["CameraSlot", ["SaveSpot", 6]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_F7, [false, true, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameSaveSpot8), localize LSTRING(keySaveSpot8), +{ + ESCAPE; + ["CameraSlot", ["SaveSpot", 7]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_F8, [false, true, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameSaveSpot9), localize LSTRING(keySaveSpot9), +{ + ESCAPE; + ["CameraSlot", ["SaveSpot", 8]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_F9, [false, true, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameSaveSpot10), localize LSTRING(keySaveSpot10), +{ + ESCAPE; + ["CameraSlot", ["SaveSpot", 9]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_F10, [false, true, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameSaveSpot11), localize LSTRING(keySaveSpot11), +{ + ESCAPE; + ["CameraSlot", ["SaveSpot", 10]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_F11, [false, true, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameSaveSpot12), localize LSTRING(keySaveSpot12), +{ + ESCAPE; + ["CameraSlot", ["SaveSpot", 11]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_F12, [false, true, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameLoadSpot1), localize LSTRING(keyLoadSpot1), +{ + ESCAPE; + ["CameraSlot", ["LoadSpot", 0]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_F1, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameLoadSpot2), localize LSTRING(keyLoadSpot2), +{ + ESCAPE; + ["CameraSlot", ["LoadSpot", 1]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_F2, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameLoadSpot3), localize LSTRING(keyLoadSpot3), +{ + ESCAPE; + ["CameraSlot", ["LoadSpot", 2]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_F3, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameLoadSpot4), localize LSTRING(keyLoadSpot4), +{ + ESCAPE; + ["CameraSlot", ["LoadSpot", 3]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_F4, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameLoadSpot5), localize LSTRING(keyLoadSpot5), +{ + ESCAPE; + ["CameraSlot", ["LoadSpot", 4]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_F5, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameLoadSpot6), localize LSTRING(keyLoadSpot6), +{ + ESCAPE; + ["CameraSlot", ["LoadSpot", 5]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_F6, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameLoadSpot7), localize LSTRING(keyLoadSpot7), +{ + ESCAPE; + ["CameraSlot", ["LoadSpot", 6]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_F7, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameLoadSpot8), localize LSTRING(keyLoadSpot8), +{ + ESCAPE; + ["CameraSlot", ["LoadSpot", 7]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_F8, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameLoadSpot9), localize LSTRING(keyLoadSpot9), +{ + ESCAPE; + ["CameraSlot", ["LoadSpot", 8]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_F9, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameLoadSpot10), localize LSTRING(keyLoadSpot10), +{ + ESCAPE; + ["CameraSlot", ["LoadSpot", 9]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_F10, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameLoadSpot11), localize LSTRING(keyLoadSpot11), +{ + ESCAPE; + ["CameraSlot", ["LoadSpot", 10]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_F11, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameLoadSpot12), localize LSTRING(keyLoadSpot12), +{ + ESCAPE; + ["CameraSlot", ["LoadSpot", 11]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_F12, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameSaveUnit1), localize LSTRING(keySaveUnit1), +{ + ESCAPE; + ["CameraSlot", ["SaveUnit", 0]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_1, [false, true, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameSaveUnit2), localize LSTRING(keySaveUnit2), +{ + ESCAPE; + ["CameraSlot", ["SaveUnit", 1]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_2, [false, true, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameSaveUnit3), localize LSTRING(keySaveUnit3), +{ + ESCAPE; + ["CameraSlot", ["SaveUnit", 2]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_3, [false, true, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameSaveUnit4), localize LSTRING(keySaveUnit4), +{ + ESCAPE; + ["CameraSlot", ["SaveUnit", 3]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_4, [false, true, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameSaveUnit5), localize LSTRING(keySaveUnit5), +{ + ESCAPE; + ["CameraSlot", ["SaveUnit", 4]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_5, [false, true, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameSaveUnit6), localize LSTRING(keySaveUnit6), +{ + ESCAPE; + ["CameraSlot", ["SaveUnit", 5]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_6, [false, true, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameSaveUnit7), localize LSTRING(keySaveUnit7), +{ + ESCAPE; + ["CameraSlot", ["SaveUnit", 6]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_7, [false, true, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameSaveUnit8), localize LSTRING(keySaveUnit8), +{ + ESCAPE; + ["CameraSlot", ["SaveUnit", 7]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_8, [false, true, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameSaveUnit9), localize LSTRING(keySaveUnit9), +{ + ESCAPE; + ["CameraSlot", ["SaveUnit", 8]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_9, [false, true, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameSaveUnit10), localize LSTRING(keySaveUnit10), +{ + ESCAPE; + ["CameraSlot", ["SaveUnit", 9]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_0, [false, true, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameLoadUnit1), localize LSTRING(keyLoadUnit1), +{ + ESCAPE; + ["CameraSlot", ["LoadUnit", 0]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_1, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameLoadUnit2), localize LSTRING(keyLoadUnit2), +{ + ESCAPE; + ["CameraSlot", ["LoadUnit", 1]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_2, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameLoadUnit3), localize LSTRING(keyLoadUnit3), +{ + ESCAPE; + ["CameraSlot", ["LoadUnit", 2]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_3, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameLoadUnit4), localize LSTRING(keyLoadUnit4), +{ + ESCAPE; + ["CameraSlot", ["LoadUnit", 3]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_4, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameLoadUnit5), localize LSTRING(keyLoadUnit5), +{ + ESCAPE; + ["CameraSlot", ["LoadUnit", 4]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_5, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameLoadUnit6), localize LSTRING(keyLoadUnit6), +{ + ESCAPE; + ["CameraSlot", ["LoadUnit", 5]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_6, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameLoadUnit7), localize LSTRING(keyLoadUnit7), +{ + ESCAPE; + ["CameraSlot", ["LoadUnit", 6]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_7, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameLoadUnit8), localize LSTRING(keyLoadUnit8), +{ + ESCAPE; + ["CameraSlot", ["LoadUnit", 7]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_8, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameLoadUnit9), localize LSTRING(keyLoadUnit9), +{ + ESCAPE; + ["CameraSlot", ["LoadUnit", 8]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_9, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameLoadUnit10), localize LSTRING(keyLoadUnit10), +{ + ESCAPE; + ["CameraSlot", ["LoadUnit", 9]] call FUNC(camera); + //true to block default behaviour + true +}, +{ + false +}, +[DIK_0, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameFOVup), localize LSTRING(keyFOVup), +{ + ESCAPE; + GVAR(keyFOVup) = true; + false +}, +{ + ESCAPE; + GVAR(keyFOVup) = false; + false +}, +[DIK_ADD, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameFOVdown), localize LSTRING(keyFOVdown), +{ + ESCAPE; + GVAR(keyFOVdown) = true; + false +}, +{ + ESCAPE; + GVAR(keyFOVdown) = false; + false +}, +[DIK_SUBTRACT, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameFOVreset), localize LSTRING(keyFOVreset), +{ + ESCAPE; + GVAR(fov) = 0.7; + GVAR(cam) camPrepareFOV GVAR(fov); + GVAR(cam) camCommitPrepared 0; + //true to block default behaviour + true +}, +{ + false +}, +[DIK_NUMPADENTER, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameFocusUp), localize LSTRING(keyFocusUp), +{ + ESCAPE; + GVAR(keyFocusUp) = true; + false +}, +{ + ESCAPE; + GVAR(keyFocusUp) = false; + false +}, +[DIK_EQUALS, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameFocusDown), localize LSTRING(keyFocusDown), +{ + ESCAPE; + GVAR(keyFocusDown) = true; + false +}, +{ + ESCAPE; + GVAR(keyFocusDown) = false; + false +}, +[DIK_MINUS, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameFocusReset), localize LSTRING(keyFocusReset), +{ + ESCAPE; + GVAR(focus) = [-1, 1]; + _cam camPrepareFocus GVAR(focus); + _cam camCommitPrepared 0; + false +}, +{ + false +}, +[DIK_BACKSPACE, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameFocusInfinite), localize LSTRING(keyFocusInfinite), +{ + ESCAPE; + GVAR(focus) = [-1, -1]; + _cam camPrepareFocus GVAR(focus); + _cam camCommitPrepared 0; + //true to block default behaviour + true +}, +{ + false +}, +[DIK_BACKSPACE, [true, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameTimeAccUp), localize LSTRING(keyTimeAccUp), +{ + ESCAPE; + GVAR(keyTimeAccUp) = true; + false +}, +{ + ESCAPE; + GVAR(keyTimeAccUp) = false; + false +}, +[DIK_RBRACKET, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameTimeAccDown), localize LSTRING(keyTimeAccDown), +{ + ESCAPE; + GVAR(keyTimeAccDown) = true; + false +}, +{ + ESCAPE; + GVAR(keyTimeAccDown) = false; + false +}, +[DIK_LBRACKET, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameTimeAccReset), localize LSTRING(keyTimeAccReset), +{ + ESCAPE; + if (!isMultiplayer) then { + GVAR(accTime) = 1; + setAccTime GVAR(accTime); + }; + false +}, +{ + false +}, +[DIK_BACKSLASH, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameToggleMarkers), localize LSTRING(keyToggleMarkers), +{ + ESCAPE; + GVAR(markers) = GVAR(markers) + 1; + if (GVAR(markers) > 3) then {GVAR(markers) = 0}; + if (GVAR(markers) == 0) then {clearRadio}; + false +}, +{ + false +}, +[DIK_T, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameUnitList), localize LSTRING(keyUnitList), +{ + ESCAPE; + _map = uiNameSpace getVariable [QGVAR(map), findDisplay 12202]; + if (!isNull _map) exitWith {}; + + _overlay = uiNamespace getVariable [QGVAR(overlay), findDisplay 12200]; + if (isNull _overlay) then { + createDialog QGVAR(overlay); + } else { + closeDialog 0; + }; + false +}, +{ + false +}, +[DIK_U, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameCrosshair), localize LSTRING(keyCrosshair), +{ + ESCAPE; + _layer = [QGVAR(crosshair)] call BIS_fnc_rscLayer; + _xhair = uiNamespace getVariable QGVAR(crosshair); + if (isNull _xhair) then { + _layer cutRsc [QGVAR(crosshair), "PLAIN", 0, true]; + call FUNC(crosshair); + } else { + _layer cutText ["", "PLAIN"]; + }; + false +}, +{ + false +}, +[DIK_X, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameStatus), localize LSTRING(keyStatus), +{ + ESCAPE; + _layer = [QGVAR(compass)] call BIS_fnc_rscLayer; + if (isNull (uiNamespace getVariable QGVAR(compass))) then { + _layer cutRsc [QGVAR(compass), "PLAIN", 0, true]; + } else { + _layer cutText ["", "PLAIN"]; + }; + + _layer = [QGVAR(status)] call BIS_fnc_rscLayer; + if (isNull (uiNamespace getVariable QGVAR(status))) then { + _layer cutRsc [QGVAR(status), "PLAIN", 0, true]; + } else { + _layer cutText ["", "PLAIN"]; + }; + false +}, +{ + false +}, +[DIK_C, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameMap), localize LSTRING(keyMap), +{ + ESCAPE; + _map = uiNameSpace getVariable [QGVAR(map), findDisplay 12202]; + if (isNull _map) then { + createDialog QGVAR(map); + } else { + closeDialog 0; + }; + false +}, +{ + false +}, +[DIK_M, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; + +[MOD, QGVAR(keyNameVision), localize LSTRING(keyVision), +{ + ESCAPE; + GVAR(vision) = GVAR(vision) + 1; + if (GVAR(vision) > 4) then {GVAR(vision) = 0}; + switch GVAR(vision) do { + case 0: { + camUseNVG false; + false SetCamUseTi 0; + }; + case 1: { + camUseNVG true; + false SetCamUseTi 0; + }; + case 2: { + camUseNVG false; + true SetCamUseTi 0; + }; + case 3: { + camUseNVG false; + true SetCamUseTi 1; + }; + + case 4: { + camUseNVG false; + true SetCamUseTi 4; + }; + }; + false +}, +{ + false +}, +[DIK_N, [false, false, false]], +false, +0] call CBA_fnc_addKeybind; \ No newline at end of file diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml index ed2586266a..32e9c44058 100644 --- a/addons/spectator/stringtable.xml +++ b/addons/spectator/stringtable.xml @@ -40,5 +40,271 @@ End mission when all players dead (default BIS behaviour)? + + Are you sure you want to exit camera mode? + + + + + Move Camera Forward + + + Move Camera Backward + + + Move Camera Left + + + Move Camera Right + + + Move Camera Up + + + Move Camera Down + + + Angle Camera Up + + + Angle Camera Down + + + Angle Camera Left + + + Angle Camera Right + + + Angle Camera Up + Left + + + Angle Camera Up + Right + + + Angle Camera Down + Left + + + Angle Camera Down + Right + + + Bank Camera Left + + + Bank Camera Right + + + Angle/Bank Camera Faster (keyboard only) + + + Angle/Bank Camera Slower (keyboard only) + + + Bank Camera Modifier (with mouse) + + + Reset Camera Angle + + + Follow Target or Position + + + Attach Camera to Object + + + Save Position #1 + + + Save Position #2 + + + Save Position #3 + + + Save Position #4 + + + Save Position #5 + + + Save Position #6 + + + Save Position #7 + + + Save Position #8 + + + Save Position #9 + + + Save Position #10 + + + Save Position #11 + + + Save Position #12 + + + Restore Position #1 + + + Restore Position #2 + + + Restore Position #3 + + + Restore Position #4 + + + Restore Position #5 + + + Restore Position #6 + + + Restore Position #7 + + + Restore Position #8 + + + Restore Position #9 + + + Restore Position #10 + + + Restore Position #11 + + + Restore Position #12 + + + Save Unit #1 + + + Save Unit #2 + + + Save Unit #3 + + + Save Unit #4 + + + Save Unit #5 + + + Save Unit #6 + + + Save Unit #7 + + + Save Unit #8 + + + Save Unit #9 + + + Save Unit #10 + + + Restore Unit #1 + + + Restore Unit #2 + + + Restore Unit #3 + + + Restore Unit #4 + + + Restore Unit #5 + + + Restore Unit #6 + + + Restore Unit #7 + + + Restore Unit #8 + + + Restore Unit #9 + + + Restore Unit #10 + + + Increase FOV + + + Decrease FOV + + + Reset FOV + + + Increase Focal Distance (PP must be enabled) + + + Decrease Focal Distance (PP must be enabled) + + + Reset Focal Distance (PP must be enabled) + + + Disable Focus + + + Increase Time Acceleration (SP only) + + + Decrease Time Acceleration (SP only) + + + Reset Time Acceleration (SP only) + + + Toggle 2D/3D Marker Mode + + + Toggle Unit List + + + Toggle Crosshair + + + Toggle Status Overlay + + + Toggle Map + + + Toggle Vision Mode + + + Switch to Next Unit + + + Switch to Previous Unit + + + Unit POV In + + + Unit POV Out + + + Exit Camera Key (mission dependent) +