mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
266 lines
7.7 KiB
Plaintext
266 lines
7.7 KiB
Plaintext
|
#include "..\script_component.hpp"
|
||
|
/*
|
||
|
* Author: mharis001
|
||
|
* Initializes the "Spectator" Zeus module display.
|
||
|
*
|
||
|
* Arguments:
|
||
|
* 0: spectator controls group <CONTROL>
|
||
|
*
|
||
|
* Return Value:
|
||
|
* None
|
||
|
*
|
||
|
* Example:
|
||
|
* [CONTROL] call ace_zeus_fnc_ui_spectator
|
||
|
*
|
||
|
* Public: No
|
||
|
*/
|
||
|
|
||
|
#define SIDE_IDCs [92540, 92541, 92542, 92543]
|
||
|
#define CAMERA_IDCs [92550, 92551, 92552]
|
||
|
#define VISION_IDCs [92558, 92559, 92560, 92561]
|
||
|
|
||
|
params ["_control"];
|
||
|
|
||
|
private _display = ctrlParent _control;
|
||
|
private _ctrlButtonOK = _display displayCtrl 1; // IDC_OK
|
||
|
private _logic = missionNamespace getVariable ["BIS_fnc_initCuratorAttributes_target", objNull];
|
||
|
TRACE_1("Logic Object",_logic);
|
||
|
|
||
|
_control ctrlRemoveAllEventHandlers "SetFocus";
|
||
|
|
||
|
// Validate module target
|
||
|
private _unit = attachedTo _logic;
|
||
|
TRACE_1("Unit",_unit);
|
||
|
|
||
|
scopeName "Main";
|
||
|
private _fnc_errorAndClose = {
|
||
|
params ["_msg"];
|
||
|
_display closeDisplay 0;
|
||
|
deleteVehicle _logic;
|
||
|
[_msg] call FUNC(showMessage);
|
||
|
breakOut "Main";
|
||
|
};
|
||
|
|
||
|
switch (false) do {
|
||
|
case (["ace_spectator"] call EFUNC(common,isModLoaded)): {
|
||
|
[LSTRING(RequiresAddon)] call _fnc_errorAndClose;
|
||
|
};
|
||
|
case (!isNull _unit): {
|
||
|
[LSTRING(NothingSelected)] call _fnc_errorAndClose;
|
||
|
};
|
||
|
case (_unit isKindOf "CAManBase"): {
|
||
|
[LSTRING(OnlyInfantry)] call _fnc_errorAndClose;
|
||
|
};
|
||
|
case (alive _unit): {
|
||
|
[LSTRING(OnlyAlive)] call _fnc_errorAndClose;
|
||
|
};
|
||
|
case ([_unit, true] call EFUNC(common,isPlayer)): {
|
||
|
[LSTRING(OnlyPlayers)] call _fnc_errorAndClose;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
// Specific onLoad stuff
|
||
|
private _side = side _unit;
|
||
|
|
||
|
// Spectate sides
|
||
|
private _fnc_onSideSelection = {
|
||
|
params ["_ctrl"];
|
||
|
|
||
|
private _display = ctrlParent _ctrl;
|
||
|
if (isNull _display) exitWith {};
|
||
|
|
||
|
private _color = _ctrl getVariable "color";
|
||
|
private _scale = 1;
|
||
|
|
||
|
private _sides = _display getVariable [QGVAR(spectateSides), []];
|
||
|
private _selectedSide = (ctrlIDC _ctrl) - 92540;
|
||
|
|
||
|
// Add or remove from spectatable sides and update color and scale
|
||
|
if (_selectedSide in _sides) then {
|
||
|
_display setVariable [QGVAR(spectateSides), _sides - [_selectedSide]];
|
||
|
_color set [3, 0.5];
|
||
|
} else {
|
||
|
_display setVariable [QGVAR(spectateSides), _sides + [_selectedSide]];
|
||
|
_color set [3, 1];
|
||
|
_scale = 1.2;
|
||
|
};
|
||
|
|
||
|
_ctrl ctrlSetTextColor _color;
|
||
|
[_ctrl, _scale, 0.1] call BIS_fnc_ctrlSetScale;
|
||
|
};
|
||
|
|
||
|
// Use the unit's side as default
|
||
|
private _activeSide = [east, west, independent, civilian] find _side;
|
||
|
|
||
|
// Handle sides other than default four (sideEnemy)
|
||
|
if (_activeSide != -1) then {
|
||
|
_display setVariable [QGVAR(spectateSides), [_activeSide]];
|
||
|
};
|
||
|
|
||
|
{
|
||
|
private _ctrl = _display displayCtrl _x;
|
||
|
private _side = _x - 92540;
|
||
|
private _color = [_side] call BIS_fnc_sideColor;
|
||
|
_ctrl setVariable ["color", _color];
|
||
|
_ctrl ctrlSetActiveColor _color;
|
||
|
_color set [3, 0.5];
|
||
|
|
||
|
if (_side == _activeSide) then {
|
||
|
[_ctrl, 1.2, 0] call BIS_fnc_ctrlSetScale;
|
||
|
_color set [3, 1];
|
||
|
};
|
||
|
|
||
|
_ctrl ctrlSetTextColor _color;
|
||
|
|
||
|
_ctrl ctrlAddEventHandler ["ButtonClick", _fnc_onSideSelection];
|
||
|
} forEach SIDE_IDCs;
|
||
|
|
||
|
// Camera modes
|
||
|
private _fnc_onModesSelection = {
|
||
|
params ["_ctrl"];
|
||
|
|
||
|
private _display = ctrlParent _ctrl;
|
||
|
if (isNull _display) exitWith {};
|
||
|
|
||
|
private _color = [1, 1, 1, 0.5];
|
||
|
private _scale = 1;
|
||
|
|
||
|
private _modes = _display getVariable [QGVAR(cameraModes), []];
|
||
|
private _selectedMode = (ctrlIDC _ctrl) - 92550;
|
||
|
|
||
|
// Add or remove from camera modes and update color and scale
|
||
|
if (_selectedMode in _modes) then {
|
||
|
_display setVariable [QGVAR(cameraModes), _modes - [_selectedMode]];
|
||
|
} else {
|
||
|
_display setVariable [QGVAR(cameraModes), _modes + [_selectedMode]];
|
||
|
_color set [3, 1];
|
||
|
_scale = 1.2;
|
||
|
};
|
||
|
|
||
|
_ctrl ctrlSetTextColor _color;
|
||
|
[_ctrl, _scale, 0.1] call BIS_fnc_ctrlSetScale;
|
||
|
};
|
||
|
|
||
|
// Use setting as default since global variable will change
|
||
|
private _availableModes = [[0, 1, 2], [1, 2], [0], [1], [2]] select EGVAR(spectator,restrictModes);
|
||
|
_display setVariable [QGVAR(cameraModes), _availableModes];
|
||
|
|
||
|
{
|
||
|
private _ctrl = _display displayCtrl _x;
|
||
|
private _color = [1, 1, 1, 0.5];
|
||
|
|
||
|
if ((_x - 92550) in _availableModes) then {
|
||
|
[_ctrl, 1.2, 0] call BIS_fnc_ctrlSetScale;
|
||
|
_color set [3, 1];
|
||
|
};
|
||
|
|
||
|
_ctrl ctrlSetTextColor _color;
|
||
|
|
||
|
_ctrl ctrlAddEventHandler ["ButtonClick", _fnc_onModesSelection];
|
||
|
} forEach CAMERA_IDCs;
|
||
|
|
||
|
// Vision Modes
|
||
|
private _fnc_onVisionSelection = {
|
||
|
params ["_ctrl", "_state"];
|
||
|
|
||
|
private _display = ctrlParent _ctrl;
|
||
|
if (isNull _display) exitwith {};
|
||
|
|
||
|
// Convert to boolean since EH returns state as 0 or 1
|
||
|
private _state = [false, true] select _state;
|
||
|
|
||
|
private _visions = _display getVariable [QGVAR(visionModes), []];
|
||
|
private _selectedVision = (ctrlIDC _ctrl) - 92560;
|
||
|
|
||
|
// Add or remove from vision modes
|
||
|
if (_state) then {
|
||
|
_display setVariable [QGVAR(visionModes), _visions + [_selectedVision]];
|
||
|
} else {
|
||
|
_display setVariable [QGVAR(visionModes), _visions - [_selectedVision]];
|
||
|
};
|
||
|
|
||
|
// Handle all checked/unchecked
|
||
|
private _allCheckboxes = VISION_IDCs apply {cbChecked (_display displayCtrl _x)};
|
||
|
|
||
|
if (_allCheckboxes isEqualTo [_state, _state, _state, _state]) then {
|
||
|
(_display displayCtrl 92557) cbSetChecked _state;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
// Use setting as default since global variable will change
|
||
|
private _availableVisions = [[-2,-1,0,1], [-2,-1], [-2,0,1], [-2]] select EGVAR(spectator,restrictVisions);
|
||
|
_display setVariable [QGVAR(visionModes), _availableVisions];
|
||
|
|
||
|
{
|
||
|
private _ctrl = _display displayCtrl _x;
|
||
|
|
||
|
if ((_x - 92560) in _availableVisions) then {
|
||
|
_ctrl cbSetChecked true;
|
||
|
};
|
||
|
|
||
|
_ctrl ctrlAddEventHandler ["CheckedChanged", _fnc_onVisionSelection];
|
||
|
} forEach VISION_IDCs;
|
||
|
|
||
|
// Init all visions checkbox
|
||
|
private _fnc_onVisionsAll = {
|
||
|
params ["_ctrl", "_state"];
|
||
|
|
||
|
private _display = ctrlParent _ctrl;
|
||
|
if (isNull _display) exitWith {};
|
||
|
|
||
|
// Convert to boolean since EH returns state as 0 or 1
|
||
|
_state = _state == 1;
|
||
|
|
||
|
// Set state of all checkboxes
|
||
|
{
|
||
|
(_display displayCtrl _x) cbSetChecked _state;
|
||
|
} forEach VISION_IDCs;
|
||
|
|
||
|
// Store new visions mode setting
|
||
|
private _setting = [[], [-2, -1, 0, 1]] select _state;
|
||
|
_display setVariable [QGVAR(visionModes), _setting];
|
||
|
};
|
||
|
|
||
|
private _allCheckbox = _display displayCtrl 92557;
|
||
|
|
||
|
// Set to checked by default if setting is all vision modes
|
||
|
if (_availableVisions isEqualTo [-2, -1, 0, 1]) then {
|
||
|
_allCheckbox cbSetChecked true;
|
||
|
};
|
||
|
|
||
|
_allCheckbox ctrlAddEventHandler ["CheckedChanged", _fnc_onVisionsAll];
|
||
|
|
||
|
// Confirm and Cancel
|
||
|
private _fnc_onUnload = {
|
||
|
private _logic = missionNamespace getVariable ["BIS_fnc_initCuratorAttributes_target", objNull];
|
||
|
if (isNull _logic) exitWith {};
|
||
|
|
||
|
deleteVehicle _logic;
|
||
|
};
|
||
|
|
||
|
private _fnc_onConfirm = {
|
||
|
params [["_ctrlButtonOK", controlNull, [controlNull]]];
|
||
|
|
||
|
private _display = ctrlParent _ctrlButtonOK;
|
||
|
if (isNull _display) exitWith {};
|
||
|
|
||
|
private _logic = missionNamespace getVariable ["BIS_fnc_initCuratorAttributes_target", objNull];
|
||
|
if (isNull _logic) exitWith {};
|
||
|
|
||
|
private _unit = attachedTo _logic;
|
||
|
if (isNull _unit) exitWith {};
|
||
|
|
||
|
private _force = lbCurSel (_display displayCtrl 92531) > 0;
|
||
|
private _hide = lbCurSel (_display displayCtrl 92532) > 0;
|
||
|
private _sides = (_display getVariable [QGVAR(spectateSides), []]) apply {_x call BIS_fnc_sideType};
|
||
|
private _modes = _display getVariable [QGVAR(cameraModes), []];
|
||
|
private _visions = _display getVariable [QGVAR(visionModes), []];
|
||
|
|
||
|
[QGVAR(moduleSpectator), [_force, _hide, _sides, _modes, _visions], _unit] call CBA_fnc_targetEvent;
|
||
|
|
||
|
deleteVehicle _logic;
|
||
|
};
|
||
|
|
||
|
_display displayAddEventHandler ["Unload", _fnc_onUnload];
|
||
|
_ctrlButtonOK ctrlAddEventHandler ["ButtonClick", _fnc_onConfirm];
|