+ *
+ * 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];
diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml
index 8b3aaed92c..a1ae4d554e 100644
--- a/addons/zeus/stringtable.xml
+++ b/addons/zeus/stringtable.xml
@@ -1097,6 +1097,22 @@
需要一個不存在的插件
현재 없는 애드온을 필요로 합니다
+
+ Only Players
+ プレイヤーのみ
+ Nur Spieler
+ 오직 플레이어만
+ Tylko gracze
+ Joueurs seulement
+ Solo Giocatori
+ 仅玩家
+ 只有玩家
+ Только игроки
+ Apenas Jogadores
+ Pouze hráči
+ Solo jugadores
+ Sadece Oyuncular
+
None
Keiner
@@ -1322,6 +1338,7 @@
화물 내리기
Выгрузить из отсека
Décharger de la cargaison
+ Descargar de la carga
Toggle NVGs
@@ -1968,6 +1985,7 @@
의료 메뉴가 비활성화되었습니다
Медицинское меню отключено
Le Menu médical est désactivé
+ El menú médico está deshabilitado
Lay Trenchline
@@ -1978,6 +1996,7 @@
Piazza Trincea
塹壕溝線を敷設
Проложить траншею
+ Poner una Trinchera
+SHIFT to force (Can only lay N/S or E/W)
@@ -1988,6 +2007,28 @@
+SHIFT per forzare (Può piazzare solo N/S o E/O
+SHIFTキー で強制的に敷設 (北/南または東/西方向にのみ配置可能)
+SHIFT на принудительное (может укладываться только на Север/Юг или Восток/Запад)
+ +SHIFT para forzar (Puede solo colocar en N/S or E/O)
+
+
+ Forces the spectator interface preventing the player from closing it with the Escape key
+
+
+ Hide player
+
+
+ Hides the player by making them invisible, invulnerable, muted, and removing them from their group
+
+
+ Sets the sides that are available to spectate
+
+
+ White Hot
+
+
+ Black Hot
+
+
+ Toggle All
diff --git a/addons/zeus/ui/RscAttributes.hpp b/addons/zeus/ui/RscAttributes.hpp
index 0ff21b145f..da3f53364f 100644
--- a/addons/zeus/ui/RscAttributes.hpp
+++ b/addons/zeus/ui/RscAttributes.hpp
@@ -915,3 +915,231 @@ class GVAR(RscSuicideBomber): RscDisplayAttributes {
class ButtonCancel: ButtonCancel {};
};
};
+
+class GVAR(RscSpectator): RscDisplayAttributes {
+ onLoad = QUOTE([ARR_3('onLoad',_this,QQGVAR(RscSpectator))] call FUNC(zeusAttributes));
+ onUnload = QUOTE([ARR_3('onUnload',_this,QQGVAR(RscSpectator))] call FUNC(zeusAttributes));
+ class Controls: Controls {
+ class Background: Background {};
+ class Title: Title {};
+ class Content: Content {
+ class Controls {
+ class spectator: RscControlsGroupNoScrollbars {
+ onSetFocus = QUOTE(_this call FUNC(ui_spectator));
+ idc = 92530;
+ x = 0;
+ y = 0;
+ w = QUOTE(W_PART(26));
+ h = QUOTE(H_PART(10.7));
+ class controls {
+ class ForceInterfaceLabel: RscText {
+ idc = -1;
+ text = "$STR_a3_cfgvehicles_modulecurator_f_arguments_forced";
+ tooltip = CSTRING(ModuleSpectator_ForceInterface_Tooltip);
+ x = 0;
+ y = 0;
+ w = QUOTE(W_PART(10));
+ h = QUOTE(H_PART(1));
+ colorBackground[] = {0, 0, 0, 0.5};
+ };
+ class ForceInterface: ctrlToolbox {
+ idc = 92531;
+ x = QUOTE(W_PART(10.1));
+ y = 0;
+ w = QUOTE(W_PART(15.9));
+ h = QUOTE(H_PART(1));
+ rows = 1;
+ columns = 2;
+ strings[] = {ECSTRING(common,No), ECSTRING(common,Yes)};
+ };
+ class HidePlayerLabel: ForceInterfaceLabel {
+ text = CSTRING(ModuleSpectator_HidePlayer);
+ tooltip = CSTRING(ModuleSpectator_HidePlayer_Tooltip);
+ y = QUOTE(H_PART(1.1));
+ };
+ class HidePlayer: ForceInterface {
+ idc = 92532;
+ y = QUOTE(H_PART(1.1));
+ };
+ class SpectateSides: RscControlsGroupNoScrollbars {
+ idc = 92533;
+ x = 0;
+ y = QUOTE(H_PART(2.2));
+ w = QUOTE(W_PART(26));
+ h = QUOTE(H_PART(2.5));
+ class controls {
+ class Label: RscText {
+ idc = -1;
+ text = "$STR_A3_Spectator_Eden_WhitelistedSides_Name";
+ tooltip = CSTRING(ModuleSpectator_SpectableSides_Tooltip);
+ x = 0;
+ y = 0;
+ w = QUOTE(W_PART(10));
+ h = QUOTE(H_PART(2.5));
+ colorBackground[] = {0, 0, 0, 0.5};
+ };
+ class Background: RscText {
+ idc = -1;
+ x = QUOTE(W_PART(10));
+ y = 0;
+ w = QUOTE(W_PART(16));
+ h = QUOTE(H_PART(2.5));
+ colorBackground[] = {1, 1, 1, 0.1};
+ };
+ class BLUFOR: RscActivePicture {
+ idc = 92541;
+ text = "\a3\Ui_F_Curator\Data\Displays\RscDisplayCurator\side_west_ca.paa";
+ x = QUOTE(W_PART(12.5));
+ y = QUOTE(H_PART(0.25));
+ w = QUOTE(W_PART(2));
+ h = QUOTE(H_PART(2));
+ tooltip = "$STR_WEST";
+ };
+ class OPFOR: BLUFOR {
+ idc = 92540;
+ text = "\a3\Ui_F_Curator\Data\Displays\RscDisplayCurator\side_east_ca.paa";
+ x = QUOTE(W_PART(15.5));
+ tooltip = "$STR_EAST";
+ };
+ class Independent: BLUFOR {
+ idc = 92542;
+ text = "\a3\Ui_F_Curator\Data\Displays\RscDisplayCurator\side_guer_ca.paa";
+ x = QUOTE(W_PART(18.5));
+ tooltip = "$STR_guerrila";
+ };
+ class Civilian: BLUFOR {
+ idc = 92543;
+ text = "\a3\Ui_F_Curator\Data\Displays\RscDisplayCurator\side_civ_ca.paa";
+ x = QUOTE(W_PART(21.5));
+ tooltip = "$STR_Civilian";
+ };
+ };
+ };
+ class CameraModes: RscControlsGroupNoScrollbars {
+ idc = 92534;
+ x = 0;
+ y = QUOTE(H_PART(4.8));
+ w = QUOTE(W_PART(26));
+ h = QUOTE(H_PART(2.5));
+ class controls {
+ class Label: RscText {
+ idc = -1;
+ text = ECSTRING(spectator,modes_DisplayName);
+ tooltip = ECSTRING(spectator,modes_Description);
+ x = 0;
+ y = 0;
+ w = QUOTE(W_PART(10));
+ h = QUOTE(H_PART(2.5));
+ colorBackground[] = {0, 0, 0, 0.5};
+ };
+ class Background: RscText {
+ idc = -1;
+ x =QUOTE(W_PART(10));
+ y = 0;
+ w = QUOTE(W_PART(16));
+ h = QUOTE(H_PART(2.5));
+ colorBackground[] = {1, 1, 1, 0.1};
+ };
+ class Free: RscActivePicture {
+ idc = 92550;
+ text = "a3\Ui_f\data\GUI\Rsc\RscDisplayEGSpectator\Free.paa";
+ x = QUOTE(W_PART(13.375));
+ y = QUOTE(H_PART(0.375));
+ w = QUOTE(W_PART(1.75));
+ h = QUOTE(H_PART(1.75));
+ tooltip = "$STR_A3_Spectator_free_camera_tooltip";
+ };
+ class Follow: Free {
+ idc = 92552;
+ text = "a3\Ui_f\data\GUI\Rsc\RscDisplayEGSpectator\Follow.paa";
+ x = QUOTE(W_PART(17.125));
+ tooltip = "$STR_A3_Spectator_3pp_camera_tooltip";
+ };
+ class FirstPerson: Free {
+ idc = 92551;
+ text = "a3\Ui_f\data\GUI\Rsc\RscDisplayEGSpectator\Fps.paa";
+ x = QUOTE(W_PART(20.875));
+ tooltip = "$STR_A3_Spectator_1pp_camera_tooltip";
+ };
+ };
+ };
+ class VisionModes: RscControlsGroupNoScrollbars {
+ idc = 92535;
+ x = 0;
+ y = QUOTE(H_PART(7.4));
+ w = QUOTE(W_PART(26));
+ h = QUOTE(H_PART(3.3));
+ class controls {
+ class Label: RscText {
+ idc = -1;
+ text = ECSTRING(spectator,visions_DisplayName);
+ tooltip = ECSTRING(spectator,visions_Description);
+ x = 0;
+ y = 0;
+ w = QUOTE(W_PART(26));
+ h = QUOTE(H_PART(1));
+ colorBackground[] = {0, 0, 0, 0.5};
+ };
+ class Background: RscText {
+ idc = -1;
+ x = 0;
+ y = QUOTE(H_PART(1));
+ w = QUOTE(W_PART(26));
+ h = QUOTE(H_PART(2.3));
+ colorBackground[] = {1, 1, 1, 0.1};
+ };
+ class AllCheckBox: RscCheckBox {
+ idc = 92557;
+ tooltip = CSTRING(ToggleAll);
+ x = QUOTE(W_PART(25));
+ y = 0;
+ w = QUOTE(W_PART(1));
+ h = QUOTE(H_PART(1));
+ };
+ class NormalLabel: Label {
+ text = "$STR_speed_normal";
+ tooltip = "";
+ x = QUOTE(W_PART(1));
+ y = QUOTE(H_PART(1.1));
+ w = QUOTE(W_PART(10.8));
+ colorBackground[] = {0, 0, 0, 0.6};
+ };
+ class Normal: AllCheckBox {
+ idc = 92558;
+ x = QUOTE(W_PART(11.9));
+ y = QUOTE(H_PART(1.1));
+ };
+ class NightVisionLabel: NormalLabel {
+ text = "$STR_usract_night_vision";
+ y = QUOTE(H_PART(2.2));
+ };
+ class NightVision: Normal {
+ idc = 92559;
+ y = QUOTE(H_PART(2.2));
+ };
+ class WhiteHotLabel: NormalLabel {
+ text = CSTRING(ModuleSpectator_WhiteHot);
+ x = QUOTE(W_PART(13.1));
+ };
+ class WhiteHot: Normal {
+ idc = 92560;
+ x = QUOTE(W_PART(24));
+ };
+ class BlackHotLabel: WhiteHotLabel {
+ text = CSTRING(ModuleSpectator_BlackHot);
+ y = QUOTE(Y_PART(2.2));
+ };
+ class BlackHot: WhiteHot {
+ idc = 92561;
+ y = QUOTE(H_PART(2.2));
+ };
+ };
+ };
+ };
+ };
+ };
+ };
+ class ButtonOK: ButtonOK {};
+ class ButtonCancel: ButtonCancel {};
+ };
+};
diff --git a/docs/_config.yml b/docs/_config.yml
index 66cd1141f7..ee7822969d 100644
--- a/docs/_config.yml
+++ b/docs/_config.yml
@@ -9,8 +9,8 @@ ace:
version:
major: 3
minor: 17
- patch: 0
- build: 82
+ patch: 1
+ build: 86
markdown: kramdown
diff --git a/docs/_config_dev.yml b/docs/_config_dev.yml
index e3c042e9c7..348e1aee44 100644
--- a/docs/_config_dev.yml
+++ b/docs/_config_dev.yml
@@ -9,8 +9,8 @@ ace:
version:
major: 3
minor: 17
- patch: 0
- build: 82
+ patch: 1
+ build: 86
markdown: kramdown
diff --git a/docs/wiki/feature/grenades.md b/docs/wiki/feature/grenades.md
index 679b309b1e..2b60c08d4e 100644
--- a/docs/wiki/feature/grenades.md
+++ b/docs/wiki/feature/grenades.md
@@ -23,6 +23,8 @@ version:
### 1.1 Throw modes
Provides different modes for throwing grenades (high throw, precision throw and drop mode).
+A grenade is only rollable if the fuse time (`explosionTime`) is >= 1 second and the player isn't in a vehicle.
+
### 1.2 Hand flares
Adds throwable hand flares in the colors white, red, green and yellow. Additionally buffs existing flares by making them brighter and last longer.
diff --git a/docs/wiki/framework/cargo-framework.md b/docs/wiki/framework/cargo-framework.md
index 68b28f7fa7..a1d810ce9c 100644
--- a/docs/wiki/framework/cargo-framework.md
+++ b/docs/wiki/framework/cargo-framework.md
@@ -47,6 +47,24 @@ class CfgVehicles {
ace_cargo_hasCargo and ace_cargo_canLoad are only needed if you aren't inheriting from any of BI base classes or if you are trying to disable loading for a specific vehicle / object.
+### 1.3 Adding predefined cargo via config
+
+```cpp
+class CfgVehicles {
+ class yourVehicleClass {
+ ace_cargo_space = 4; // Add if necessary
+ ace_cargo_hasCargo = 1; // Add if necessary
+ class ace_cargo {
+ class cargo {
+ class ACE_medicalSupplyCrate { // Doesn't have to have the same name as the item you're adding
+ type = "ACE_medicalSupplyCrate";
+ amount = 1;
+ };
+ };
+ };
+ };
+};
+```
## 2. Events
diff --git a/docs/wiki/framework/events-framework.md b/docs/wiki/framework/events-framework.md
index 825364a92b..860cd90068 100644
--- a/docs/wiki/framework/events-framework.md
+++ b/docs/wiki/framework/events-framework.md
@@ -103,18 +103,17 @@ MenuType: 0 = Interaction, 1 = Self Interaction
| Event Key | Parameters | Locality | Type | Description |
|----------|---------|---------|---------|---------|
-|`ace_refuel_started` | [_source, _target] | Local | Listen | Refueling has started |
+|`ace_refuel_started` | [_source, _target] | Local | Listen | Refuelling has started |
|`ace_refuel_tick` | [_source, _target, _amount] | Local | Listen | Amount of fuel transferred in a tick |
-|`ace_refuel_stopped` | [_source, _target] | Local | Listen | Refueling has stopped |
+|`ace_refuel_stopped` | [_source, _target] | Local | Listen | Refuelling has stopped |
### 2.10 Cook Off (`ace_cookoff`)
| Event Key | Parameters | Locality | Type | Description |
|----------|---------|---------|---------|---------|---------|
-|`ace_cookoff_cookOff` | [_vehicle, _intensity, _instigator, _smokeDelayEnabled, _ammoDetonationChance, _detonateAfterCookoff, _fireSource, _canRing, _maxIntensity, _canJet] | Server | Callable | Start vehicle cook-off |
-|`ace_cookoff_cookOffBox` | [_box, _killer, _instigator] | Server | Callable | Start ammo box cook-off |
-|`ace_cookoff_detonateAmmunition` | [_object, _destroyWhenFinished, _killer, _instigator, _initialDelay"] | Server | Callable | Start ammo detonation |
-|`ace_cookoff_engineFire` | _vehicle | Server | Callable | Start engine fire |
+|`ace_cookoff_cookOff` | [_vehicle, _intensity, _instigator, _smokeDelayEnabled, _ammoDetonationChance, _detonateAfterCookoff, _fireSource, _canRing, _maxIntensity, _canJet] | Global | Listen | Vehicle cook-off has started |
+|`ace_cookoff_cookOffBox` | [_box, _source, _instigator, _delay] | Global | Listen | Ammo box cook-off has started |
+|`ace_cookoff_engineFire` | [_vehicle] | Global | Listen | Engine fire has started |
### 2.11 Attach (`ace_attach`)
@@ -156,9 +155,15 @@ MenuType: 0 = Interaction, 1 = Self Interaction
| Event Key | Parameters | Locality | Type | Description |
|---------- |------------|----------|------|-------------|
-|---------- |------------|----------|------|-------------|
| `ace_interaction_doorOpeningStarted` | [_house, _door, _animations] | Local | Listen | Called when local unit starts interacting with doors
-| `ace_interaction_doorOpeningStopped` | [_house, _door, _animations] | Local | Listen | Called when local unit stopps interacting with doors
+| `ace_interaction_doorOpeningStopped` | [_house, _door, _animations] | Local | Listen | Called when local unit stops interacting with doors
+
+### 2.17 Headless (`ace_headless`)
+
+| Event Key | Parameters | Locality | Type | Description |
+|---------- |------------|----------|------|-------------|
+| `ace_headless_groupTransferPre` | [_group, _HC (OBJECT), _previousOwner, _idHC] | Target | Listen | Called just before a group is transferred from any machine to a HC. Called where group currently is local and on the HC, where group is going to be local.
+| `ace_headless_groupTransferPost` | [_group, _HC (OBJECT), _previousOwner, _idHC, _transferredSuccessfully] | Target | Listen | Called just after a group is transferred from a machine to a HC. Called where group was local and on the HC, where group is now local. `_transferredSuccessfully` is passed so mods can actually check if the locality was properly transferred, as ownership transfer is not guaranteed.
## 3. Usage
Also Reference [CBA Events System](https://github.com/CBATeam/CBA_A3/wiki/Custom-Events-System){:target="_blank"} documentation.
diff --git a/docs/wiki/framework/grenades-framework.md b/docs/wiki/framework/grenades-framework.md
index fce3b480c2..755773c171 100644
--- a/docs/wiki/framework/grenades-framework.md
+++ b/docs/wiki/framework/grenades-framework.md
@@ -50,6 +50,10 @@ class CfgAmmo {
ace_grenades_flashbangBangs = 6; // 6 bangs
ace_grenades_flashbangInterval = 0.25; // 0.25 seconds between each subsequent bang
ace_grenades_flashbangIntervalMaxDeviation = 0.05; // Deviation of up to ± 0.05 seconds on each fuse
+ ace_grenades_flashbangExplodeSound[] = { // Sound that is played upon detonation
+ {"A3\Sounds_F\arsenal\explosives\grenades\Explosion_HE_grenade_01.wss", 5, 1.2, 400}, // file path, volume, pitch, max distance
+ {"A3\Sounds_F\arsenal\explosives\grenades\Explosion_HE_grenade_02.wss", 5, 1.2, 400}
+ };
};
};
```
@@ -70,6 +74,11 @@ The average amount of time in seconds, after `explosionTime` has passed, between
The amount of randomness in the fuse time.
+### 2.1.5 ace_grenades_flashbangExplodeSound
+
+The sounds that can be used when the flashbang detonates. It randomly selects an entry from this array (equal chances, there are no weights involved).
+If not defined, `[format ["A3\Sounds_F\arsenal\explosives\grenades\Explosion_HE_grenade_0%1.wss", floor (random 4) + 1], 5, 1.2, 400]` is used as a default instead (4 sounds total).
+
### 2.2 Incendiary Config Values
```cpp
@@ -103,6 +112,12 @@ If set to zero or left undefined, the grenade is not treated as a flare. If it i
Sets the color of the emitted light. The first 3 values of the array of the color, the last is the light intensity.
+### 2.4 Grenade Rolling
+
+#### 2.4.1 ace_grenades_rollVectorDirAndUp
+
+Sets the `setVectorDirAndUp` of the grenade when the grenade is rolled.
+
## 3. Events
### 3.1 Listenable
diff --git a/docs/wiki/framework/headless-framework.md b/docs/wiki/framework/headless-framework.md
index 6dbc83c512..7a2a5a0822 100644
--- a/docs/wiki/framework/headless-framework.md
+++ b/docs/wiki/framework/headless-framework.md
@@ -30,14 +30,29 @@ As of ACEX v3.2.0 _(before merge into ACE3)_ this feature can also be enabled wi
## 2. Scripting
-### 2.1 Disable Transferring for a Group
+### 2.1 Manipulating HC Transfers of Groups via function
-To prevent a group from transferring to a Headless Client use the following line on a group leader (or every unit in a group in case group leader may not spawn):
+`ace_headless_fnc_blacklist`
+
+ | Arguments | Type | Optional (default value)
+---| --------- | ---- | ------------------------
+0 | Units | Object, Group or Array of both | Required
+1 | Add (true) or remove (false) from blacklist | Bool | Optional (default: `true`)
+2 | Owner to transfer units to | Number | Optional (default: `-1`)
+3 | Rebalance (0 = no rebalance, 1 = rebalance, 2 = force rebalance) | Number | (default: `0`)
+**R** | None | None | Return value
+
+`Force rebalance` means that all units, including the ones that are on the HCs, are rebalanced amongst the HCs, whereas `rebalance` means that newly spawned units are going to be evenly distributed amongst HCs. Therefore, `rebalance` does not guarantee that the HCs will have an equal amount of groups, whereas `force rebalance` does.
+
+### 2.2 Disable Transferring for a Group via variable
+
+To prevent a group from transferring to a Headless Client use the following line on a unit within a group:
```sqf
this setVariable ["acex_headless_blacklist", true];
```
+This variable can also be set on vehicles, disabling transferal of any groups having units in said vehicles.
## 3. Limitations
@@ -48,3 +63,7 @@ Some Arma 3 features are incompatible, this is up to BI to add support. Disable
Additionally, groups will not be transferred due to lack of support if they:
- Have waypoints with synchronized triggers (waypoint would not change status based on trigger condition) (added in ACEX v3.2.0 - _before merge into ACE3_)
+
+Groups will not be transferred to avoid issues:
+- If a player is within the group.
+- If they contain UAVs.
diff --git a/docs/wiki/framework/medical-treatment-framework.md b/docs/wiki/framework/medical-treatment-framework.md
index 736295804a..52e661a516 100644
--- a/docs/wiki/framework/medical-treatment-framework.md
+++ b/docs/wiki/framework/medical-treatment-framework.md
@@ -128,3 +128,10 @@ If a mission maker wishes to disable Zeus access to the medical menu, they can s
```sqf
ace_medical_gui_enableZeusModule = false; // default is true
```
+
+### 3.3 SpO2 Configuration
+
+If 3rd party mods want to disable SpO2 being set to a minimum upon successful CPR, they can set the variable below:
+```sqf
+ace_medical_treatment_setSpO2UponCPRSuccess = false; // default is true
+```
diff --git a/docs/wiki/framework/nametags-framework.md b/docs/wiki/framework/nametags-framework.md
new file mode 100644
index 0000000000..d27a358b17
--- /dev/null
+++ b/docs/wiki/framework/nametags-framework.md
@@ -0,0 +1,45 @@
+---
+layout: wiki
+title: Nametags Framework
+description: Explains how to implement rank icons for factions.
+group: framework
+order: 5
+parent: wiki
+mod: ace
+version:
+ major: 3
+ minor: 13
+ patch: 0
+---
+
+## 1. Config Values
+
+### 1.1 Faction rank icons
+
+Defines the rank icons used by a faction.
+
+```cpp
+class CfgFactionClasses {
+ class MyFaction {
+ ace_nametags_rankIcons[] = {
+ "\z\ace\addons\nametags\UI\icons_germany\private_gs.paa", // path to private rank icon
+ "\z\ace\addons\nametags\UI\icons_germany\corporal_gs.paa", // path to corporal rank icon
+ "\z\ace\addons\nametags\UI\icons_germany\sergeant_gs.paa", // path to sergeant rank icon
+ "\z\ace\addons\nametags\UI\icons_germany\lieutenant_gs.paa", // path to lieutenant rank icon
+ "\z\ace\addons\nametags\UI\icons_germany\captain_gs.paa", // path to captain rank icon
+ "\z\ace\addons\nametags\UI\icons_germany\major_gs.paa", // path to major rank icon
+ "\z\ace\addons\nametags\UI\icons_germany\colonel_gs.paa" // path to colonel rank icon
+ };
+ };
+};
+```
+
+## 2. Mission Variables
+
+### 2.1 Faction rank icon usage
+
+If disabled, it won't use the faction icons defined via the config entry listed above.
+Needs to be set before postInit.
+```sqf
+ace_nametags_useFactionIcons = false; // by default true
+```
diff --git a/docs/wiki/framework/refuel-framework.md b/docs/wiki/framework/refuel-framework.md
index 325606a970..3cf10d7205 100644
--- a/docs/wiki/framework/refuel-framework.md
+++ b/docs/wiki/framework/refuel-framework.md
@@ -134,5 +134,5 @@ The jerry can will now have a volume of 200 liters.
| Name | Arguments | Global? | Added in |
| ------------- | ------------- | ----- | ------------- |
-| ace_refuel_sourceInitialized | Fuel source (OBJECT), items (BOOL or ARRAY) | Yes | 3.16.0 |
+| ace_refuel_sourceInitialized | Fuel source (OBJECT) | Yes | 3.16.0 |
| ace_refuel_jerryCanInitalized | Jerry can (OBJECT) | Yes | 3.16.0 |
diff --git a/docs/wiki/framework/vehicledamage-framework.md b/docs/wiki/framework/vehicledamage-framework.md
index 60d60e9676..0d4268bf5e 100644
--- a/docs/wiki/framework/vehicledamage-framework.md
+++ b/docs/wiki/framework/vehicledamage-framework.md
@@ -126,3 +126,11 @@ Default ARMA config value. We assume that the warheads are vanilla strings, so o
- `TandemHEAT`
If no `ace_vehicle_damage_incendiary` defined, this value will be used to assume a default based on above table of common values (excluding `Incendiary Bullet` which is 0).
+
+## 3. Disabling crew bailing for individual vehicles
+
+Crew bailing when their vehicle is disabled (immobile or can't shoot) can be disabled for a specific vehicle:
+
+```
+_vehicle setVariable ["ace_vehicle_damage_allowCrewInImmobile", true, true];
+```