Wreck (Turret)
Épave (tourelle)
diff --git a/addons/vehiclelock/initSettings.inc.sqf b/addons/vehiclelock/initSettings.inc.sqf
index 9f68c77e7c..dcb520e7e2 100644
--- a/addons/vehiclelock/initSettings.inc.sqf
+++ b/addons/vehiclelock/initSettings.inc.sqf
@@ -3,8 +3,7 @@
[LSTRING(DefaultLockpickStrength_DisplayName), LSTRING(DefaultLockpickStrength_Description)],
LSTRING(DisplayName),
[-1,60,10,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)]
- true, // isGlobal
- {[QGVAR(defaultLockpickStrength), _this] call EFUNC(common,cbaSettings_settingChanged)}
+ true // isGlobal
] call CBA_fnc_addSetting;
[
diff --git a/addons/vehiclelock/stringtable.xml b/addons/vehiclelock/stringtable.xml
index 55600489e8..7cfa58d07a 100644
--- a/addons/vehiclelock/stringtable.xml
+++ b/addons/vehiclelock/stringtable.xml
@@ -365,7 +365,7 @@
Alapértelmezett idő a zárfeltöréshez (másodpercben). Alapértelmezett: 10
Время для взлома замка отмычкой (в секундах). По умолчанию: 10
Tempo Default richiesto per forzare serrature (in secondi). Predefinito: 10
- Lockpickを使った作業の所要時間の標準設定。(秒) デフォルト: 10
+ Lockpickを使った作業の所要時間の標準設定。 (秒単位) デフォルト: 10
해정을 위해 들이는 기본시간입니다(초 단위). 기본설정: 10
开锁时间(秒)。预设:10
開鎖時間(秒)。預設:10
diff --git a/addons/viewdistance/stringtable.xml b/addons/viewdistance/stringtable.xml
index 4404d0efe8..eb7ed94838 100644
--- a/addons/viewdistance/stringtable.xml
+++ b/addons/viewdistance/stringtable.xml
@@ -96,7 +96,7 @@
Korlátozza, mekkora látótávolságot állíthatnak be a kliensek (maximum 10000-ig)
Устанавливает предел дальности, насколько клиенты могут увеличить свою дальность видимости (до 10000)
Imposta il limite massimo a cui i client possono alzare la propria distanza visiva (massimo 10000)
- 各クライアントが設定できる視界距離の上限を設定します。(最大 10000)
+ 各クライアントが設定できる視界距離の上限 (最大 10000)
클라이언트가 최대 얼마나 멀리 볼 수 있는지 제한을 둡니다 (10000 까지 가능)
设定客户端最高可显示的视距(最高至10000)
設定客戶端最高可顯示的視野距離 (最高至10000)
diff --git a/addons/viewrestriction/initSettings.inc.sqf b/addons/viewrestriction/initSettings.inc.sqf
index 3ed47c10ef..80382f5b19 100644
--- a/addons/viewrestriction/initSettings.inc.sqf
+++ b/addons/viewrestriction/initSettings.inc.sqf
@@ -6,7 +6,7 @@
[[0, 1, 2, 3], [LSTRING(Disabled), LSTRING(FirstPerson), LSTRING(ThirdPerson), LSTRING(Selective)], 0],
true,
{[QGVAR(mode), _this] call EFUNC(common,cbaSettings_settingChanged)},
- true
+ true // Needs mission restart
] call CBA_fnc_addSetting;
[
@@ -17,7 +17,7 @@
[[0, 1, 2], [LSTRING(Disabled), LSTRING(FirstPerson), LSTRING(ThirdPerson)], 0],
true,
{[QGVAR(modeSelectiveFoot), _this] call EFUNC(common,cbaSettings_settingChanged)},
- true
+ true // Needs mission restart
] call CBA_fnc_addSetting;
[
@@ -28,7 +28,7 @@
[[0, 1, 2], [LSTRING(Disabled), LSTRING(FirstPerson), LSTRING(ThirdPerson)], 0],
true,
{[QGVAR(modeSelectiveLand), _this] call EFUNC(common,cbaSettings_settingChanged)},
- true
+ true // Needs mission restart
] call CBA_fnc_addSetting;
[
@@ -39,7 +39,7 @@
[[0, 1, 2], [LSTRING(Disabled), LSTRING(FirstPerson), LSTRING(ThirdPerson)], 0],
true,
{[QGVAR(modeSelectiveAir), _this] call EFUNC(common,cbaSettings_settingChanged)},
- true
+ true // Needs mission restart
] call CBA_fnc_addSetting;
[
@@ -50,7 +50,7 @@
[[0, 1, 2], [LSTRING(Disabled), LSTRING(FirstPerson), LSTRING(ThirdPerson)], 0],
true,
{[QGVAR(modeSelectiveSea), _this] call EFUNC(common,cbaSettings_settingChanged)},
- true
+ true // Needs mission restart
] call CBA_fnc_addSetting;
[
diff --git a/addons/volume/initSettings.inc.sqf b/addons/volume/initSettings.inc.sqf
index 8735f81527..44bb464a1e 100644
--- a/addons/volume/initSettings.inc.sqf
+++ b/addons/volume/initSettings.inc.sqf
@@ -3,9 +3,6 @@
"CHECKBOX",
[ELSTRING(common,Enabled), LSTRING(KeybindDescription)],
format ["ACE %1", LLSTRING(Name)],
- false,
- false,
- {[QGVAR(enabled), _this] call EFUNC(common,cbaSettings_settingChanged)},
false
] call CBA_fnc_addSetting;
@@ -14,10 +11,7 @@
"LIST",
[LSTRING(Reduction), LSTRING(ReductionDescription)],
format ["ACE %1", LLSTRING(Name)],
- [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], ["0%", "10%", "20%", "30%", "40%", "50%", "60%", "70%", "80%", "90%", "100%"], 5],
- false,
- {[QGVAR(reduction), _this] call EFUNC(common,cbaSettings_settingChanged)},
- false
+ [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], ["0%", "10%", "20%", "30%", "40%", "50%", "60%", "70%", "80%", "90%", "100%"], 5]
] call CBA_fnc_addSetting;
[
@@ -25,10 +19,7 @@
"LIST",
[LSTRING(FadeDelay), LSTRING(FadeDelayDescription)],
format ["ACE %1", LLSTRING(Name)],
- [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], ["0s", "1s", "2s", "3s", "4s", "5s", "6s", "7s", "8s", "9s", "10s"], 1],
- false,
- {[QGVAR(fadeDelay), _this] call EFUNC(common,cbaSettings_settingChanged)},
- false
+ [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], ["0s", "1s", "2s", "3s", "4s", "5s", "6s", "7s", "8s", "9s", "10s"], 1]
] call CBA_fnc_addSetting;
[
@@ -36,9 +27,6 @@
"CHECKBOX",
[LSTRING(LowerInVehicles), LSTRING(LowerInVehiclesDescription)],
format ["ACE %1", LLSTRING(Name)],
- false,
- false,
- {[QGVAR(lowerInVehicles), _this] call EFUNC(common,cbaSettings_settingChanged)},
false
] call CBA_fnc_addSetting;
@@ -47,10 +35,7 @@
"CHECKBOX",
[LSTRING(ShowNotification), LSTRING(ShowNotificationDescription)],
format ["ACE %1", LLSTRING(Name)],
- true,
- false,
- {[QGVAR(showNotification), _this] call EFUNC(common,cbaSettings_settingChanged)},
- false
+ true
] call CBA_fnc_addSetting;
[
@@ -58,8 +43,5 @@
"CHECKBOX",
[LSTRING(RemindIfLowered), LSTRING(RemindIfLoweredDescription)],
format ["ACE %1", LLSTRING(Name)],
- false,
- false,
- {[QGVAR(remindIfLowered), _this] call EFUNC(common,cbaSettings_settingChanged)},
false
] call CBA_fnc_addSetting;
diff --git a/addons/volume/stringtable.xml b/addons/volume/stringtable.xml
index ea0eabf4eb..feecb28b10 100644
--- a/addons/volume/stringtable.xml
+++ b/addons/volume/stringtable.xml
@@ -168,7 +168,7 @@
Time it takes (in seconds) for the sound to fade in/out.
Zeit, die es benötigt (in Sekunden), für das Geräusch, ein- bzw. auszublenden.
- 音がフェードイン/アウトするまでの時間 (秒) を決定します。
+ 音がフェードイン/アウトするまでの時間。 (秒単位)
Temps nécessaire (en secondes) aux sons pour être réduits/rétablis.
페이드 인/아웃 되는데 걸리는 시간(초)
设定音量淡出/入时所需的秒数。
diff --git a/addons/weaponselect/initSettings.inc.sqf b/addons/weaponselect/initSettings.inc.sqf
index 029c5201cb..f5695748b4 100644
--- a/addons/weaponselect/initSettings.inc.sqf
+++ b/addons/weaponselect/initSettings.inc.sqf
@@ -2,7 +2,5 @@
QGVAR(displayText), "CHECKBOX",
[LSTRING(SettingDisplayTextName), LSTRING(SettingDisplayTextDesc)],
ELSTRING(common,ACEKeybindCategoryWeapons),
- true, // default value
- false, // isGlobal
- {[QGVAR(displayText), _this] call EFUNC(common,cbaSettings_settingChanged)}
+ true // default value
] call CBA_fnc_addSetting;
diff --git a/addons/weather/initSettings.inc.sqf b/addons/weather/initSettings.inc.sqf
index fb11e31e75..26f4442084 100644
--- a/addons/weather/initSettings.inc.sqf
+++ b/addons/weather/initSettings.inc.sqf
@@ -34,6 +34,5 @@ private _category = [format ["ACE %1", LLSTRING(Module_DisplayName)]];
QGVAR(showCheckAirTemperature), "CHECKBOX",
[LSTRING(showCheckAirTemperature_DisplayName), LELSTRING(common,showActionInSelfInteraction)],
_category,
- true, // default value
- false // isGlobal
+ true // default value
] call CBA_fnc_addSetting;
diff --git a/addons/weather/stringtable.xml b/addons/weather/stringtable.xml
index 55306f4a01..bb815b8d06 100644
--- a/addons/weather/stringtable.xml
+++ b/addons/weather/stringtable.xml
@@ -130,7 +130,7 @@
Megadja az intervallumot (másodpercben) az időjárás-frissítések között
Определяет интервал (в секундах) между обновлениями погоды
Definisce l'intervallo (in secondi) tra aggiornamenti del meteo
- 天候を更新する間隔を定義します。(秒)
+ 天候を更新する間隔 (秒) を定義します
기후를 갱신하는 간격을 초 단위로 정합니다.
设定天气更新的时间间隔(秒)
設定天氣更新的時間間隔(秒)
diff --git a/addons/zeus/CfgVehicles.hpp b/addons/zeus/CfgVehicles.hpp
index 2a1f261125..5fb4a4f61a 100644
--- a/addons/zeus/CfgVehicles.hpp
+++ b/addons/zeus/CfgVehicles.hpp
@@ -256,6 +256,12 @@ class CfgVehicles {
displayName = CSTRING(ModuleSimulation_DisplayName);
function = QFUNC(moduleSimulation);
};
+ class GVAR(moduleSpectator): GVAR(moduleBase) {
+ curatorCanAttach = 1;
+ category = QGVAR(Utility);
+ displayName = ECSTRING(spectator,Module_DisplayName);
+ curatorInfoType = QGVAR(RscSpectator);
+ };
class GVAR(moduleSuicideBomber): GVAR(moduleBase) {
curatorCanAttach = 1;
category = QGVAR(AI);
diff --git a/addons/zeus/XEH_PREP.hpp b/addons/zeus/XEH_PREP.hpp
index 8de15147bd..69dd7b18a6 100644
--- a/addons/zeus/XEH_PREP.hpp
+++ b/addons/zeus/XEH_PREP.hpp
@@ -34,6 +34,7 @@ PREP(moduleSetMedicalVehicle);
PREP(moduleSetRepairFacility);
PREP(moduleSetRepairVehicle);
PREP(moduleSimulation);
+PREP(moduleSpectator);
PREP(moduleSuicideBomber);
PREP(moduleSuppressiveFire);
PREP(moduleSuppressiveFireLocal);
@@ -56,6 +57,7 @@ PREP(ui_groupSide);
PREP(ui_patrolArea);
PREP(ui_searchArea);
PREP(ui_setEngineer);
+PREP(ui_spectator);
PREP(ui_suicideBomber);
PREP(ui_teleportPlayers);
PREP(ui_toggleFlashlight);
diff --git a/addons/zeus/XEH_postInit.sqf b/addons/zeus/XEH_postInit.sqf
index b4d1302ab5..15b4c15f76 100644
--- a/addons/zeus/XEH_postInit.sqf
+++ b/addons/zeus/XEH_postInit.sqf
@@ -11,6 +11,7 @@ QGVAR(GlobalSkillAI) addPublicVariableEventHandler FUNC(moduleGlobalSetSkill);
[QGVAR(moduleSearchNearby), CBA_fnc_searchNearby] call CBA_fnc_addEventHandler;
[QGVAR(moduleSearchArea), CBA_fnc_taskSearchArea] call CBA_fnc_addEventHandler;
[QGVAR(suppressiveFire), LINKFUNC(moduleSuppressiveFireLocal)] call CBA_fnc_addEventHandler;
+[QGVAR(moduleSpectator), LINKFUNC(moduleSpectator)] call CBA_fnc_addEventHandler;
// Editable object commands must be ran on server, this events are used in the respective module
if (isServer) then {
diff --git a/addons/zeus/config.cpp b/addons/zeus/config.cpp
index 2714c247b0..d90c906294 100644
--- a/addons/zeus/config.cpp
+++ b/addons/zeus/config.cpp
@@ -99,6 +99,11 @@ class CfgPatches {
QGVAR(moduleLayTrench)
};
};
+ class GVAR(spectator): ADDON {
+ units[] = {
+ QGVAR(moduleSpectator)
+ };
+ };
};
class ACE_Curator {
@@ -112,6 +117,7 @@ class ACE_Curator {
GVAR(arsenal) = "ace_arsenal";
GVAR(fire) = "ace_fire";
GVAR(trenches) = "ace_trenches";
+ GVAR(spectator) = "ace_spectator";
};
#include "CfgFactionClasses.hpp"
diff --git a/addons/zeus/functions/fnc_moduleSpectator.sqf b/addons/zeus/functions/fnc_moduleSpectator.sqf
new file mode 100644
index 0000000000..fb9ca2a63b
--- /dev/null
+++ b/addons/zeus/functions/fnc_moduleSpectator.sqf
@@ -0,0 +1,39 @@
+#include "..\script_component.hpp"
+/*
+ * Author: mharis001
+ * Zeus module function to make the local player an ACE Spectator.
+ *
+ * Arguments:
+ * 0: Force interface
+ * 1: Hide player
+ * 2: Sides available to spectate
+ * 3: Camera modes available
+ * 4: Vision modes available
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * [true, true, [west], [0, 1, 2], [-2, -1, 0, 1]] call ace_zeus_fnc_moduleSpectator
+ *
+ * Public: No
+ */
+
+params ["_force", "_hide", "_sides", "_modes", "_visions"];
+TRACE_1("params",_this);
+
+// Update sides available to spectate
+[_sides, [west, east, independent, civilian] - _sides] call EFUNC(spectator,updateSides);
+
+// Update available camera modes
+[_modes, [0, 1, 2] - _modes] call EFUNC(spectator,updateCameraModes);
+
+// Update available vision modes
+[_visions, [-2, -1, 0, 1, 2, 3, 4, 5, 6, 7] - _visions] call EFUNC(spectator,updateVisionModes);
+
+// Make unit spectator (close Zeus camera if open)
+if (!isNull curatorCamera) then {
+ (findDisplay 312) closeDisplay 2;
+};
+
+[true, _force, _hide] call EFUNC(spectator,setSpectator);
diff --git a/addons/zeus/functions/fnc_ui_spectator.sqf b/addons/zeus/functions/fnc_ui_spectator.sqf
new file mode 100644
index 0000000000..fe9b4a3668
--- /dev/null
+++ b/addons/zeus/functions/fnc_ui_spectator.sqf
@@ -0,0 +1,265 @@
+#include "..\script_component.hpp"
+/*
+ * Author: mharis001
+ * Initializes the "Spectator" Zeus module display.
+ *
+ * Arguments:
+ * 0: spectator controls group
+ *
+ * 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/development/arma-3-scheduler-and-our-practices.md b/docs/wiki/development/arma-3-scheduler-and-our-practices.md
index 440f0f9557..d2ffda2a07 100644
--- a/docs/wiki/development/arma-3-scheduler-and-our-practices.md
+++ b/docs/wiki/development/arma-3-scheduler-and-our-practices.md
@@ -36,7 +36,7 @@ Code running in the unscheduled environment uses linear execution, that means it
## 2. What is the scheduler and why do I care?
-The Arma 3 script scheduler basically gives a fair-share execution to all running scripts, FSMs, and SQS files running on any given client or server at any given time. See the [Biki article](https://community.bistudio.com/wiki/Biki2.0:Performance_Considerations){:target="_blank"} for a in-depth explanation of this. What this basically means though, is that all scripts get a fair share; this also means scheduled execution is drastically affected by other mods that use scheduled execution. For example, if 2 different spawn's are running in a tight loop of `while {true} do {...};`, they will both get exactly 50% of the scheduling time.
+The Arma 3 script scheduler basically gives a fair-share execution to all running scripts, FSMs, and SQS files running on any given client or server at any given time. See the [Biki article](https://community.bistudio.com/wiki/Biki2.0:Performance_Considerations){:target="_blank"} for an in-depth explanation of this. What this basically means though, is that all scripts get a fair share; this also means scheduled execution is drastically affected by other mods that use scheduled execution. For example, if 2 different spawn's are running in a tight loop of `while {true} do {...};`, they will both get exactly 50% of the scheduling time.
With the way mission makers and mod makers generally use `spawn`/`execVM`, this means you're actually getting drastically less execution time in the scheduled environment than you might think. This leads to visible delay issues all the way up to massive delay on execution. You can easily test and prove this by looping spawns and watching the execution times extend.
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/attach-framework.md b/docs/wiki/framework/attach-framework.md
index e05012f7e5..f118b3b934 100644
--- a/docs/wiki/framework/attach-framework.md
+++ b/docs/wiki/framework/attach-framework.md
@@ -15,7 +15,7 @@ version:
## 1. Config Values
### 1.1 Make item attachable
-An item can be added to the ACE Attach framework by adding the ``ACE_attachable`` property to a class in ``CfgWeapons`` or ``CfgMagazines``. The value must be the classname of a valid class in ``CfgVehicles``:
+An item can be added to the ACE Attach framework by adding the `ACE_attachable` property to a class in `CfgWeapons` or `CfgMagazines`. The value must be the classname of a valid class in `CfgVehicles`:
```cpp
class CfgWeapons {
class attach_item: CBA_MiscItem {
@@ -35,8 +35,8 @@ class CfgVehicles {
```
### 1.2 Define attach orientation for non-symmetric items
-In the case the item needs to have a particular orientation when attached, add the config value: ``ace_attach_orientation`` which is an array describing the ``roll`` and ``yaw`` orientation of the object.
-The default value is: ``[0,0]``.
+In the case the item needs to have a particular orientation when attached, add the config value: `ace_attach_orientation` which is an array describing the `roll` and `yaw` orientation of the object.
+The default value is: `[0,0]`.
Example:
```cpp
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/cookoff-framework.md b/docs/wiki/framework/cookoff-framework.md
index b53fea2049..8129699154 100644
--- a/docs/wiki/framework/cookoff-framework.md
+++ b/docs/wiki/framework/cookoff-framework.md
@@ -12,43 +12,22 @@ version:
patch: 0
---
-## 1. Disabling / Enabling Cook off for individual vehicles
+## 1. Disabling cook-off fire for individual vehicles
-You can dynamically enable and/or disable vehicle cook off for individual vehicles by using `setVariable`:
+Cook-off fire can be disabled for a specific vehicle (does not affect ammo cook-off):
```
-VEHICLE setVariable ["ace_cookoff_enable", true, true];
+_vehicle setVariable ["ace_cookoff_enable", false, true];
```
-The above will enable cook off for that specific vehicle, no matter the mission settings.
+Mission settings will always apply however, so you can't enable cook-off on a vehicle if the mission settings have cook-off for vehicles disabled.
-Likewise, cook off can also be disabled for a specific vehicle:
+## 2. Disabling ammunition cook-off for individual vehicles and boxes
+
+Ammunition cook-off can be disabled for a specific vehicle or box (does not affect cook-off fire):
```
-VEHICLE setVariable ["ace_cookoff_enable", false, true];
+_vehicleOrBox setVariable ["ace_cookoff_enableAmmoCookoff", false, true];
```
-## 2. Cook off probability
-
-You can set the probability of cook off for individual vehicle types by changing the `ace_cookoff_probability` value in the vehicle's config:
-
-```
-class MyVehicle {
- ace_cookoff_probability = 0.6;
-};
-```
-
-Global cook off probability can also be adjusted with the `ace_cookoff_probabilityCoef` mission setting.
-
-Higher values will make cook-off more probable, whilst lower values will make cook-off less probable.
-
-## 3. Ignore damage to turret
-
-For use on vehicles when damage to the main turret would not cause a vehicle cookoff.
-e.g. RCWS turrets
-
-```
-class MyVehicle {
- ace_vehicle_damage_turretFireProb = 0;
-};
-```
+Mission settings will always apply however, so you can't enable ammunition cook-off on a vehicle or box if the mission settings have ammunition cook-off disabled.
diff --git a/docs/wiki/framework/events-framework.md b/docs/wiki/framework/events-framework.md
index d6d4caa849..860cd90068 100644
--- a/docs/wiki/framework/events-framework.md
+++ b/docs/wiki/framework/events-framework.md
@@ -38,9 +38,9 @@ The vehicle events will also have the following local variables available `_gunn
|`ace_unconscious` | [_unit, _state(BOOL)] | Global | Listen | Unit's unconscious state changed |
|`ace_placedInBodyBag` | [_target, _bodyBag, _isGrave] | Global | Listen | Target placed into a bodybag Note: (Target will soon be deleted, target could be a bodybag) |
|`ace_placedInGrave` | [_target, _grave] | Global | Listen | Target placed into a grave, _grave will be objNull if `Create Grave Markers` is disabled Note: (Target will soon be deleted) |
-|`ace_treatmentStarted` | [_caller, _target, _selectionName, _className, _itemUser, _usedItem] | Local | Listen | Treatment action has started (local on the _caller) |
-|`ace_treatmentSucceded` | [_caller, _target, _selectionName, _className, _itemUser, _usedItem] | Local | Listen | Treatment action is completed (local on the _caller) |
-|`ace_treatmentFailed` | [_caller, _target, _selectionName, _className, _itemUser, _usedItem] | Local | Listen | Treatment action has been interrupted (local on the _caller) |
+|`ace_treatmentStarted` | [_caller, _target, _selectionName, _className, _itemUser, _usedItem, _createLitter] | Local | Listen | Treatment action has started (local on the _caller) |
+|`ace_treatmentSucceded` | [_caller, _target, _selectionName, _className, _itemUser, _usedItem, _createLitter] | Local | Listen | Treatment action is completed (local on the _caller) |
+|`ace_treatmentFailed` | [_caller, _target, _selectionName, _className, _itemUser, _usedItem, _createLitter] | Local | Listen | Treatment action has been interrupted (local on the _caller) |
|`ace_medical_handleUnitVitals` | [_unit, _deltaT] | Local | Listen | Vitals update ran for unit, _deltaT is the time elapsed since the previous vitals update (local to _unit) |
|`ace_medical_treatment_bandaged` | [_medic, _patient, _bodyPart, _className, _itemUser, _usedItem, _createLitter, _bandageEffectiveness] | Local | Listen | _medic has bandaged _patient, the array can be modified to change treatment parameters (local to _medic) |
@@ -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 | Global | Listen | Vehicle cook off has started
-|`ace_cookoff_cookOffBox` | _box | Global | Listen | Ammo box cook off has started |
-|`ace_cookoff_engineFire` | _vehicle | Global | Listen | Engine fire has started |
-
+|----------|---------|---------|---------|---------|---------|
+|`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 3fed8fd50a..755773c171 100644
--- a/docs/wiki/framework/grenades-framework.md
+++ b/docs/wiki/framework/grenades-framework.md
@@ -1,7 +1,7 @@
---
layout: wiki
title: Grenades Framework
-description: Explains how to set-up flashbangs, particularly multi-bangs.
+description: Explains how to set-up incendiary, flares and flashbangs, particularly multi-bangs.
group: framework
parent: wiki
order: 7
@@ -14,11 +14,12 @@ version:
## 1. Overview
-ACE provides a simple interface for creating flashbang grenades and specifying their properties. It is important that one sets `timeToLive` to be greater than the total possible time until the last explosion, i.e, `ace_grenades_flashbangBangs * ace_grenades_flashbangInterval + ace_grenades_flashbangIntervalMaxDeviation`. Any explosions that occur after the `timeToLive` has expired will occur at `(0,0)`.
+ACE provides a simple interface for creating incendiary, flare and flashbang grenades, as well as specifying their properties. For flashbangs, it is important that one sets `timeToLive` to be greater than the total possible time until the last explosion, i.e, `ace_grenades_flashbangBangs * ace_grenades_flashbangInterval + ace_grenades_flashbangIntervalMaxDeviation`. Any explosions that occur after the `timeToLive` has expired will occur at `(0,0)`.
## 2. Config Values
+### 2.1 Flashbang Config Values
There are several config entries specific to ACE flashbangs. All successive values can be left undefined and they will be given the defaults shown in the first example below, with the exception of `ace_grenades_flashbang`, which is equal to `0` if left undefined.
```cpp
@@ -49,26 +50,74 @@ 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}
+ };
};
};
```
-### 2.1 ace_grenades_flashbang
+#### 2.1.1 ace_grenades_flashbang
If set to zero or left undefined, the grenade is not treated as a flashbang. If it is set to 1, the grenade will be treated as a flashbang with the associated effects.
-### 2.2 ace_grenades_flashbangBangs
+#### 2.1.2 ace_grenades_flashbangBangs
The flashbang will explode as many times as is specified. The default is 1.
-### 2.3 ace_grenades_flashbangInterval
+#### 2.1.3 ace_grenades_flashbangInterval
The average amount of time in seconds, after `explosionTime` has passed, between each subsequent bang.
-### 2.4 ace_grenades_flashbangIntervalMaxDeviation
+#### 2.1.4 ace_grenades_flashbangIntervalMaxDeviation
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
+class CfgAmmo {
+ class ACE_G_M14 {
+ ace_grenades_incendiary = 1;
+ };
+};
+```
+
+#### 2.2.1 ace_grenades_incendiary
+
+If set to zero or left undefined, the grenade is not treated as an incendiary. If it is set to 1, the grenade will be treated as an incendiary with the associated effects.
+
+### 2.3 Flare Config Values
+
+```cpp
+class CfgAmmo {
+ class ACE_G_Handflare_White {
+ ace_grenades_flare = 1;
+ ace_grenades_color[] = {0.5,0.5,0.5,0.5}; // R, G, B, light intensity
+ };
+};
+```
+
+#### 2.3.1 ace_grenades_flare
+
+If set to zero or left undefined, the grenade is not treated as a flare. If it is set to 1, the grenade will be treated as a flare with the associated effects.
+
+#### 2.3.1 ace_grenades_color
+
+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 7e22bccf5d..0d4268bf5e 100644
--- a/docs/wiki/framework/vehicledamage-framework.md
+++ b/docs/wiki/framework/vehicledamage-framework.md
@@ -47,7 +47,7 @@ Default: 0.5
#### 1.1.5 `ace_vehicle_damage_turretFireProb`
-The probabilitiy for the vehicle to catch on fire upon its turret being penetrated
+The probability for the vehicle to catch on fire upon its turret being penetrated
Default: 0.2
@@ -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];
+```
diff --git a/include/a3/data_f/penetration/hard_ground.rvmat b/include/a3/data_f/penetration/hard_ground.rvmat
new file mode 100644
index 0000000000..1c4d7f82b0
--- /dev/null
+++ b/include/a3/data_f/penetration/hard_ground.rvmat
@@ -0,0 +1,9 @@
+surfaceInfo="A3\data_f\Penetration\hard_ground.bisurf";
+ambient[]={0.48699999,0.32800001,0.249,1};
+diffuse[]={0.48699999,0.32800001,0.249,1};
+forcedDiffuse[]={0,0,0,0};
+emmisive[]={0,0,0,1};
+specular[]={0,0,0,1};
+specularPower=1;
+PixelShaderID="Normal";
+VertexShaderID="Basic";
diff --git a/include/a3/ui_f/hpp/defineResincl.inc b/include/a3/ui_f/hpp/defineResincl.inc
index 2f513642bc..df589bde2d 100644
--- a/include/a3/ui_f/hpp/defineResincl.inc
+++ b/include/a3/ui_f/hpp/defineResincl.inc
@@ -1380,6 +1380,7 @@ enum
#define IDC_OPTIONS_PP_DOF_SLIDER 1317
#define IDC_OPTIONS_PP_DOF_VALUE 1318
#define IDC_OPTIONS_PP_CAUSTICS 1319
+#define IDC_OPTIONS_PP_HAZE 1329
#define IDC_OPTIONS_PP_SHARPEN_SLIDER 1320
#define IDC_OPTIONS_PP_SHARPEN_VALUE 1321
#define IDC_OPTIONS_PP_COLOR_CORRECTIONS 1322
diff --git a/include/a3/weapons_f/acc/data/optics.rvmat b/include/a3/weapons_f/acc/data/optics.rvmat
new file mode 100644
index 0000000000..1183f3e16d
--- /dev/null
+++ b/include/a3/weapons_f/acc/data/optics.rvmat
@@ -0,0 +1,82 @@
+class StageTI
+{
+ texture="a3\data_f\default_ti_ca.paa";
+};
+ambient[]={0,0,0,1};
+diffuse[]={0,0,0,1};
+forcedDiffuse[]={0,0,0,1};
+emmisive[]={0,0,0,1};
+specular[]={1,1,1,1};
+specularPower=500;
+PixelShaderID="Super";
+VertexShaderID="Super";
+class Stage1
+{
+ texture="a3\weapons_f\acc\data\optics_nohq.paa";
+ uvSource="tex1";
+ class uvTransform
+ {
+ aside[]={1,0,0};
+ up[]={0,1,0};
+ dir[]={0,0,0};
+ pos[]={0,0,0};
+ };
+};
+class Stage2
+{
+ texture="#(argb,8,8,3)color(0.5,0.5,0.5,0.5,DT)";
+ uvSource="tex";
+ class uvTransform
+ {
+ aside[]={1,0,0};
+ up[]={0,1,0};
+ dir[]={0,0,0};
+ pos[]={0,0,0};
+ };
+};
+class Stage3
+{
+ texture="#(argb,8,8,3)color(0,0,0,0.0,MC)";
+ uvSource="tex";
+ class uvTransform
+ {
+ aside[]={1,0,0};
+ up[]={0,1,0};
+ dir[]={0,0,0};
+ pos[]={0,0,0};
+ };
+};
+class Stage4
+{
+ texture="a3\weapons_f\acc\data\optics_as.paa";
+ uvSource="tex1";
+ class uvTransform
+ {
+ aside[]={1,0,0};
+ up[]={0,1,0};
+ dir[]={0,0,0};
+ pos[]={0,0,0};
+ };
+};
+class Stage5
+{
+ texture="#(argb,8,8,3)color(1,1,1,0.0,SMDI)";
+ uvSource="tex1";
+ class uvTransform
+ {
+ aside[]={1,0,0};
+ up[]={0,1,0};
+ dir[]={0,0,0};
+ pos[]={0,0,0};
+ };
+};
+class Stage6
+{
+ texture="#(ai,64,64,1)fresnel(0.915,0.38)";
+ uvSource="none";
+};
+class Stage7
+{
+ texture="a3\data_f\env_land_optic_co.paa";
+ uvSource="none";
+};
diff --git a/include/a3/weapons_f/acc/data/scope_view3_ca.paa b/include/a3/weapons_f/acc/data/scope_view3_ca.paa
new file mode 100644
index 0000000000..d7ef93da49
Binary files /dev/null and b/include/a3/weapons_f/acc/data/scope_view3_ca.paa differ
diff --git a/include/a3/weapons_f/acc/data/scope_view_ca.paa b/include/a3/weapons_f/acc/data/scope_view_ca.paa
new file mode 100644
index 0000000000..a8dc6b370a
Binary files /dev/null and b/include/a3/weapons_f/acc/data/scope_view_ca.paa differ
diff --git a/include/a3/weapons_f/data/nightvisiontl.paa b/include/a3/weapons_f/data/nightvisiontl.paa
new file mode 100644
index 0000000000..04bddf8795
Binary files /dev/null and b/include/a3/weapons_f/data/nightvisiontl.paa differ
diff --git a/include/a3/weapons_f/reticle/data/optics_bg_dirt_ca.paa b/include/a3/weapons_f/reticle/data/optics_bg_dirt_ca.paa
new file mode 100644
index 0000000000..d08da9e16d
Binary files /dev/null and b/include/a3/weapons_f/reticle/data/optics_bg_dirt_ca.paa differ
diff --git a/include/vn/characters_f_vietnam/OPFOR/vests/items/vn_mine_satchel_02.p3d b/include/vn/characters_f_vietnam/OPFOR/vests/items/vn_mine_satchel_02.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/objects_f_vietnam/supply/a2_ammo/macv/vn_us_30cal.p3d b/include/vn/objects_f_vietnam/supply/a2_ammo/macv/vn_us_30cal.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/objects_f_vietnam/supply/a2_ammo/macv/vn_us_can_30.p3d b/include/vn/objects_f_vietnam/supply/a2_ammo/macv/vn_us_can_30.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/objects_f_vietnam/supply/a2_ammo/pavn/vn_pavn_50_can.p3d b/include/vn/objects_f_vietnam/supply/a2_ammo/pavn/vn_pavn_50_can.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/objects_f_vietnam/usarmy/furniture/vn_us_fort_common_crate_01.p3d b/include/vn/objects_f_vietnam/usarmy/furniture/vn_us_fort_common_crate_01.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/objects_f_vietnam/usarmy/supply/mortar_m2/vn_prop_60mm_crate_01.p3d b/include/vn/objects_f_vietnam/usarmy/supply/mortar_m2/vn_prop_60mm_crate_01.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/objects_f_vietnam/usarmy/supply/mortar_m29/vn_prop_81mm_crate_02.p3d b/include/vn/objects_f_vietnam/usarmy/supply/mortar_m29/vn_prop_81mm_crate_02.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/static_f_vietnam/mortar_m2/vn_shell_60mm_m302_wp_ammo.p3d b/include/vn/static_f_vietnam/mortar_m2/vn_shell_60mm_m302_wp_ammo.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/static_f_vietnam/mortar_m2/vn_shell_60mm_m49a2_he_ammo.p3d b/include/vn/static_f_vietnam/mortar_m2/vn_shell_60mm_m49a2_he_ammo.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/static_f_vietnam/mortar_m2/vn_shell_60mm_m83_lume_ammo.p3d b/include/vn/static_f_vietnam/mortar_m2/vn_shell_60mm_m83_lume_ammo.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/static_f_vietnam/mortar_m29/vn_shell_81mm_m374_he_ammo.p3d b/include/vn/static_f_vietnam/mortar_m29/vn_shell_81mm_m374_he_ammo.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/static_f_vietnam/mortar_type53/vn_shell_82mm_d832_wp_ammo.p3d b/include/vn/static_f_vietnam/mortar_type53/vn_shell_82mm_d832_wp_ammo.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/static_f_vietnam/mortar_type53/vn_shell_82mm_o832d_he_ammo.p3d b/include/vn/static_f_vietnam/mortar_type53/vn_shell_82mm_o832d_he_ammo.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/static_f_vietnam/mortar_type53/vn_shell_82mm_s832s_lume_ammo.p3d b/include/vn/static_f_vietnam/mortar_type53/vn_shell_82mm_s832s_lume_ammo.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/static_f_vietnam/tow/vn_static_tow_mag.p3d b/include/vn/static_f_vietnam/tow/vn_static_tow_mag.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/weapons_f_vietnam/mines/m112/vn_mine_m112_mag.p3d b/include/vn/weapons_f_vietnam/mines/m112/vn_mine_m112_mag.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/weapons_f_vietnam/mines/m14/vn_mine_m14_mag.p3d b/include/vn/weapons_f_vietnam/mines/m14/vn_mine_m14_mag.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/weapons_f_vietnam/mines/m15/vn_mine_m15_mag.p3d b/include/vn/weapons_f_vietnam/mines/m15/vn_mine_m15_mag.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/weapons_f_vietnam/mines/m16/vn_mine_m16_mag.p3d b/include/vn/weapons_f_vietnam/mines/m16/vn_mine_m16_mag.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/weapons_f_vietnam/mines/m16/vn_mine_tripwire_m16_02.p3d b/include/vn/weapons_f_vietnam/mines/m16/vn_mine_tripwire_m16_02.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/weapons_f_vietnam/mines/m16/vn_mine_tripwire_m16_04.p3d b/include/vn/weapons_f_vietnam/mines/m16/vn_mine_tripwire_m16_04.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/weapons_f_vietnam/mines/m18/vn_mine_m18.p3d b/include/vn/weapons_f_vietnam/mines/m18/vn_mine_m18.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/weapons_f_vietnam/mines/m18/vn_mine_m18_x3.p3d b/include/vn/weapons_f_vietnam/mines/m18/vn_mine_m18_x3.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/weapons_f_vietnam/mines/punji/vn_mine_punji_01_mag.p3d b/include/vn/weapons_f_vietnam/mines/punji/vn_mine_punji_01_mag.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/weapons_f_vietnam/mines/punji/vn_mine_punji_02_mag.p3d b/include/vn/weapons_f_vietnam/mines/punji/vn_mine_punji_02_mag.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/weapons_f_vietnam/mines/punji/vn_mine_punji_03_mag.p3d b/include/vn/weapons_f_vietnam/mines/punji/vn_mine_punji_03_mag.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/weapons_f_vietnam/mines/tm57/vn_mine_tm57_mag.p3d b/include/vn/weapons_f_vietnam/mines/tm57/vn_mine_tm57_mag.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/weapons_f_vietnam/mines/tripwire_arty/vn_mine_tripwire_arty.p3d b/include/vn/weapons_f_vietnam/mines/tripwire_arty/vn_mine_tripwire_arty.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/weapons_f_vietnam/mines/tripwire_f1/vn_mine_tripwire_f1_02.p3d b/include/vn/weapons_f_vietnam/mines/tripwire_f1/vn_mine_tripwire_f1_02.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/include/vn/weapons_f_vietnam/mines/tripwire_f1/vn_mine_tripwire_f1_04.p3d b/include/vn/weapons_f_vietnam/mines/tripwire_f1/vn_mine_tripwire_f1_04.p3d
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/optionals/tracers/stringtable.xml b/optionals/tracers/stringtable.xml
index 30b6b04d88..f4b1d5a750 100644
--- a/optionals/tracers/stringtable.xml
+++ b/optionals/tracers/stringtable.xml
@@ -8,7 +8,7 @@
Магазин 150 патр. 5.56 мм с послед. трас. (зелёные)
5.56 mm 150 colpi ricarica traccianti (verdi) caricatore
5.56 mm 150 ranný zásobník, stopovka pro přebití (Zelená)
- Recarregar magazine de 150 balas tracejantes (verde)
+ Recarregar magazine de 150 balas tracejantes (Verde)
5.56 mm 150発入り 残通知 曳光弾 (緑) マガジン
Cargador de 150 Cartuchos 5.56 mm Trazadora de recarga (Verde)
5.56mm 150발들이 재장전 알림 예광탄 (초록) 탄창
@@ -32,7 +32,7 @@
Магазин 150 патр. 5.56 мм трассирующих (зелёные)
5.56 mm 150 colpi traccianti (verdi) caricatore
5.56 mm 150 ranný zásobník, stopovka (Zelená)
- Magazine 5.56mm Tracejante (verde)
+ Magazine 5.56mm Tracejante (Verde)
5.56 mm 150発入り 曳光弾 (緑) マガジン
Cargador de 150 Cartuchos 5.56 mm Trazadora (Verde)
5.56mm 150발들이 예광탄 (초록) 탄창
@@ -80,7 +80,7 @@
Короб 200 патр. 5.56 мм с послед. трас. (зелёные)
5.56 mm 200colpi Ricarica traccianti (verdi) scatola
5.56 mm 200 ranný box, stopovka pro přebití (Zelená)
- Recarregar Caixa 5.56mm 200 Balas tracejantes (verdes)
+ Recarregar Caixa 5.56mm 200 Balas tracejantes (Verdes)
5.56 mm 200発入り 残通知 曳光弾 (緑) ボックス
Caja de 200 Cartuchos 5.56 mm Trazadora de recarga (Verde)
5.56mm 150발들이 예광탄 (노랑) 탄창
@@ -92,7 +92,7 @@
Короб 200 патр. 5.56 мм трассирующих (зелёные)
5.56 mm 200colpi Traccianti (verdi) Scatola
5.56 mm 200 ranný box, stopovka (Zelená)
- Caixa 5.56mm 200 balas tracejantes (verdes)
+ Caixa 5.56mm 200 balas tracejantes (Verdes)
5.56 mm 200発入り 曳光弾 (緑) ボックス
Caja de 200 Cartuchos 5.56 mm Trazadora (Verde)
5.56mm 200발들이 예광탄 (초록) 탄상자
@@ -260,7 +260,7 @@
Магазин 30 патр. 6.5 мм с послед. трас. (зелёные)
6.5mm 30Colpi Ricarica Traccianti(verdi) Caricatore
6.5 mm 30 ranný zásobník, stopovka pro přebití (Zelená)
- Recarregar magazine 6.5mm 30 balas tracejantes (verde)
+ Recarregar magazine 6.5mm 30 balas tracejantes (Verde)
6.5 mm 30発入り 残通知 曳光弾 (緑) マガジン
Cargador de 30 Cartuchos 6.5 mm Trazadora de recarga (Verde)
6.5mm 30발들이 재장전 알림 예광탄 (초록) 탄창
@@ -308,7 +308,7 @@
Магазин 30 патр. 6.5 мм трассирующих (зелёные)
6.5mm 30Colpi Traccianti (Verdi) Caricatore
6.5 mm 30 ranný zásobník, stopovka (Zelená)
- Magazine 6.5mm 30 balas tracejantes (verde)
+ Magazine 6.5mm 30 balas tracejantes (Verde)
6.5 mm 30発入り 曳光弾 (緑) マガジン
Cargador de 30 Cartuchos 6.5 mm Trazadora (Verde)
6.5mm 30발들이 예광탄 (초록) 탄창
@@ -352,11 +352,11 @@