mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
Add spectator UI interrupt system
A public API system to allow external systems to interrupt and resume the spectator interface. Also made use of it for the escape menu and zeus support.
This commit is contained in:
parent
95aa9f604b
commit
21b0ee087a
@ -12,6 +12,7 @@ PREP(handleMap);
|
|||||||
PREP(handleMouse);
|
PREP(handleMouse);
|
||||||
PREP(handleToolbar);
|
PREP(handleToolbar);
|
||||||
PREP(handleUnits);
|
PREP(handleUnits);
|
||||||
|
PREP(interrupt);
|
||||||
PREP(moduleSpectatorSettings);
|
PREP(moduleSpectatorSettings);
|
||||||
PREP(respawnTemplate);
|
PREP(respawnTemplate);
|
||||||
PREP(setCameraAttributes);
|
PREP(setCameraAttributes);
|
||||||
@ -39,6 +40,7 @@ GVAR(camUnit) = objNull;
|
|||||||
GVAR(camVision) = -2;
|
GVAR(camVision) = -2;
|
||||||
GVAR(camZoom) = 1.25;
|
GVAR(camZoom) = 1.25;
|
||||||
|
|
||||||
|
GVAR(interrupts) = [];
|
||||||
GVAR(isSet) = false;
|
GVAR(isSet) = false;
|
||||||
|
|
||||||
GVAR(showComp) = true;
|
GVAR(showComp) = true;
|
||||||
|
@ -24,6 +24,7 @@ switch (toLower _mode) do {
|
|||||||
case "open": {
|
case "open": {
|
||||||
// Prevent reopening
|
// Prevent reopening
|
||||||
if (GVAR(isSet)) exitWith {};
|
if (GVAR(isSet)) exitWith {};
|
||||||
|
GVAR(interrupts) = [];
|
||||||
|
|
||||||
// Initalize camera variables
|
// Initalize camera variables
|
||||||
GVAR(camBoom) = 0;
|
GVAR(camBoom) = 0;
|
||||||
@ -68,16 +69,18 @@ switch (toLower _mode) do {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
case "close": {
|
case "close": {
|
||||||
_args params ["_unit"];
|
|
||||||
|
|
||||||
// Can't close a second time
|
// Can't close a second time
|
||||||
if !(GVAR(isSet)) exitWith {};
|
if !(GVAR(isSet)) exitWith {};
|
||||||
|
GVAR(interrupts) = [];
|
||||||
|
|
||||||
// Terminate interface
|
// Terminate interface
|
||||||
while {dialog} do {
|
while {dialog} do {
|
||||||
closeDialog 0;
|
closeDialog 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Kill the display
|
||||||
|
(findDisplay 12249) closeDisplay 0;
|
||||||
|
|
||||||
// Terminate camera
|
// Terminate camera
|
||||||
GVAR(camera) cameraEffect ["terminate", "back"];
|
GVAR(camera) cameraEffect ["terminate", "back"];
|
||||||
camDestroy GVAR(camera);
|
camDestroy GVAR(camera);
|
||||||
@ -203,11 +206,21 @@ switch (toLower _mode) do {
|
|||||||
};
|
};
|
||||||
case "onunload": {
|
case "onunload": {
|
||||||
// Kill GUI PFHs
|
// Kill GUI PFHs
|
||||||
|
removeMissionEventHandler ["Draw3D",GVAR(iconHandler)];
|
||||||
GVAR(camHandler) = nil;
|
GVAR(camHandler) = nil;
|
||||||
GVAR(compHandler) = nil;
|
GVAR(compHandler) = nil;
|
||||||
removeMissionEventHandler ["Draw3D",GVAR(iconHandler)];
|
|
||||||
GVAR(iconHandler) = nil;
|
GVAR(iconHandler) = nil;
|
||||||
GVAR(toolHandler) = nil;
|
GVAR(toolHandler) = nil;
|
||||||
|
|
||||||
|
// Reset variables
|
||||||
|
GVAR(camBoom) = 0;
|
||||||
|
GVAR(camDolly) = [0,0];
|
||||||
|
GVAR(ctrlKey) = false;
|
||||||
|
GVAR(heldKeys) = [];
|
||||||
|
GVAR(heldKeys) resize 255;
|
||||||
|
GVAR(mouse) = [false,false];
|
||||||
|
GVAR(mousePos) = [0.5,0.5];
|
||||||
|
GVAR(treeSel) = objNull;
|
||||||
};
|
};
|
||||||
// Mouse events
|
// Mouse events
|
||||||
case "onmousebuttondown": {
|
case "onmousebuttondown": {
|
||||||
@ -247,7 +260,8 @@ switch (toLower _mode) do {
|
|||||||
_args params ["_display","_dik","_shift","_ctrl","_alt"];
|
_args params ["_display","_dik","_shift","_ctrl","_alt"];
|
||||||
|
|
||||||
if ((alive player) && {_dik in (actionKeys "curatorInterface")} && {!isNull (getAssignedCuratorLogic player)}) exitWith {
|
if ((alive player) && {_dik in (actionKeys "curatorInterface")} && {!isNull (getAssignedCuratorLogic player)}) exitWith {
|
||||||
["zeus", [_display]] call FUNC(handleInterface);
|
[QGVAR(zeus)] call FUNC(interrupt);
|
||||||
|
["zeus"] call FUNC(handleInterface);
|
||||||
};
|
};
|
||||||
if ((isServer || {serverCommandAvailable "#kick"}) && {_dik in (actionKeys "Chat" + actionKeys "PrevChannel" + actionKeys "NextChannel")}) exitWith {
|
if ((isServer || {serverCommandAvailable "#kick"}) && {_dik in (actionKeys "Chat" + actionKeys "PrevChannel" + actionKeys "NextChannel")}) exitWith {
|
||||||
false
|
false
|
||||||
@ -262,7 +276,8 @@ switch (toLower _mode) do {
|
|||||||
|
|
||||||
switch (_dik) do {
|
switch (_dik) do {
|
||||||
case 1: { // Esc
|
case 1: { // Esc
|
||||||
["escape", [_display]] call FUNC(handleInterface);
|
[QGVAR(escape)] call FUNC(interrupt);
|
||||||
|
["escape"] call FUNC(handleInterface);
|
||||||
};
|
};
|
||||||
case 2: { // 1
|
case 2: { // 1
|
||||||
[_display,nil,nil,nil,nil,nil,true] call FUNC(toggleInterface);
|
[_display,nil,nil,nil,nil,nil,true] call FUNC(toggleInterface);
|
||||||
@ -515,23 +530,8 @@ switch (toLower _mode) do {
|
|||||||
};
|
};
|
||||||
// Break from interface for external events
|
// Break from interface for external events
|
||||||
case "escape": {
|
case "escape": {
|
||||||
_args params ["_display"];
|
|
||||||
private "_dlg";
|
private "_dlg";
|
||||||
|
|
||||||
// Kill display
|
|
||||||
_display closeDisplay 0;
|
|
||||||
|
|
||||||
// Reset cam/UI vars
|
|
||||||
GVAR(camBoom) = 0;
|
|
||||||
GVAR(camDolly) = [0,0];
|
|
||||||
|
|
||||||
GVAR(ctrlKey) = false;
|
|
||||||
GVAR(heldKeys) = [];
|
|
||||||
GVAR(heldKeys) resize 255;
|
|
||||||
GVAR(mouse) = [false,false];
|
|
||||||
GVAR(mousePos) = [0.5,0.5];
|
|
||||||
GVAR(treeSel) = objNull;
|
|
||||||
|
|
||||||
createDialog (["RscDisplayInterrupt", "RscDisplayMPInterrupt"] select isMultiplayer);
|
createDialog (["RscDisplayInterrupt", "RscDisplayMPInterrupt"] select isMultiplayer);
|
||||||
|
|
||||||
disableSerialization;
|
disableSerialization;
|
||||||
@ -562,31 +562,12 @@ switch (toLower _mode) do {
|
|||||||
if !(isNull (findDisplay 49)) exitWith {};
|
if !(isNull (findDisplay 49)) exitWith {};
|
||||||
|
|
||||||
// If still a spectator then re-enter the interface
|
// If still a spectator then re-enter the interface
|
||||||
if (GVAR(isSet)) then {
|
[QGVAR(escape),false] call FUNC(interrupt);
|
||||||
createDialog QGVAR(interface);
|
|
||||||
[] call FUNC(transitionCamera);
|
|
||||||
};
|
|
||||||
|
|
||||||
[_this select 1] call CBA_fnc_removePerFrameHandler;
|
[_this select 1] call CBA_fnc_removePerFrameHandler;
|
||||||
},0] call CBA_fnc_addPerFrameHandler;
|
},0] call CBA_fnc_addPerFrameHandler;
|
||||||
};
|
};
|
||||||
case "zeus": {
|
case "zeus": {
|
||||||
_args params ["_display"];
|
|
||||||
|
|
||||||
// Kill display
|
|
||||||
_display closeDisplay 0;
|
|
||||||
|
|
||||||
// Reset cam/UI vars
|
|
||||||
GVAR(camBoom) = 0;
|
|
||||||
GVAR(camDolly) = [0,0];
|
|
||||||
|
|
||||||
GVAR(ctrlKey) = false;
|
|
||||||
GVAR(heldKeys) = [];
|
|
||||||
GVAR(heldKeys) resize 255;
|
|
||||||
GVAR(mouse) = [false,false];
|
|
||||||
GVAR(mousePos) = [0.5,0.5];
|
|
||||||
GVAR(treeSel) = objNull;
|
|
||||||
|
|
||||||
openCuratorInterface;
|
openCuratorInterface;
|
||||||
|
|
||||||
[{
|
[{
|
||||||
@ -595,10 +576,7 @@ switch (toLower _mode) do {
|
|||||||
if !((isNull curatorCamera) && {isNull (GETMVAR(bis_fnc_moduleRemoteControl_unit,objNull))}) exitWith {};
|
if !((isNull curatorCamera) && {isNull (GETMVAR(bis_fnc_moduleRemoteControl_unit,objNull))}) exitWith {};
|
||||||
|
|
||||||
// If still a spectator then re-enter the interface
|
// If still a spectator then re-enter the interface
|
||||||
if (GVAR(isSet)) then {
|
[QGVAR(zeus),false] call FUNC(interrupt)
|
||||||
createDialog QGVAR(interface);
|
|
||||||
[] call FUNC(transitionCamera);
|
|
||||||
};
|
|
||||||
|
|
||||||
[_this select 1] call CBA_fnc_removePerFrameHandler;
|
[_this select 1] call CBA_fnc_removePerFrameHandler;
|
||||||
},0] call CBA_fnc_addPerFrameHandler;
|
},0] call CBA_fnc_addPerFrameHandler;
|
||||||
|
44
addons/spectator/functions/fnc_interrupt.sqf
Normal file
44
addons/spectator/functions/fnc_interrupt.sqf
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Author: SilentSpike
|
||||||
|
* Interrupts the spectator interface for external systems
|
||||||
|
*
|
||||||
|
* Arguments:
|
||||||
|
* 0: Reason <STRING>
|
||||||
|
* 1: Interrupting <BOOL>
|
||||||
|
*
|
||||||
|
* Return Value:
|
||||||
|
* None <NIL>
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* ["mySystem"] call ace_spectator_fnc_interrupt
|
||||||
|
*
|
||||||
|
* Public: Yes
|
||||||
|
*/
|
||||||
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
params [["_reason", "", [""]], ["_interrupt", true, [true]]];
|
||||||
|
|
||||||
|
// Nothing to do when spectator is closed
|
||||||
|
if !(GVAR(isSet)) exitWith {};
|
||||||
|
|
||||||
|
if (_reason == "") exitWith { ERROR("Invalid Reason"); };
|
||||||
|
if (_interrupt) then {
|
||||||
|
GVAR(interrupts) pushBack _reason;
|
||||||
|
} else {
|
||||||
|
GVAR(interrupts) = GVAR(interrupts) - [_reason];
|
||||||
|
};
|
||||||
|
|
||||||
|
if (GVAR(interrupts) isEqualTo []) then {
|
||||||
|
if (isNull (findDisplay 12249)) then {
|
||||||
|
createDialog QGVAR(interface);
|
||||||
|
[] call FUNC(transitionCamera);
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
if !(isNull (findDisplay 12249)) then {
|
||||||
|
while {dialog} do {
|
||||||
|
closeDialog 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
(findDisplay 12249) closeDisplay 0;
|
||||||
|
};
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user