diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml
index 155c5417e..5cecc4b07 100644
--- a/addons/common/stringtable.xml
+++ b/addons/common/stringtable.xml
@@ -249,6 +249,9 @@
目標
목표
+
+ Cursor
+
Selected Unit
Ausgewählte Einheit
@@ -342,6 +345,12 @@
固定式
고정
+
+ Weapon
+
+
+ Magazine
+
Nearest
Le plus proche
diff --git a/addons/modules/CfgVehicles.hpp b/addons/modules/CfgVehicles.hpp
index 0f4fac29c..5965e98a9 100644
--- a/addons/modules/CfgVehicles.hpp
+++ b/addons/modules/CfgVehicles.hpp
@@ -22,6 +22,10 @@ class CfgVehicles {
scopeCurator = 1;
};
+ class ModuleTracers_F: Module_F {
+ scopeCurator = 1;
+ };
+
class ModuleCAS_F;
class ModuleCASGun_F: ModuleCAS_F {
scopeCurator = 1;
@@ -428,6 +432,13 @@ class CfgVehicles {
function = QFUNC(moduleToggleLamps);
icon = QPATHTOF(ui\street_lamp_ca.paa);
};
+ class GVAR(moduleTracers): GVAR(moduleBase) {
+ category = "Effects";
+ displayName = "$STR_a3_cfgvehicles_moduletracers_f_0";
+ curatorInfoType = QGVAR(RscTracers);
+ icon = "\a3\modules_f_curator\Data\iconTracers_ca.paa";
+ portrait = "\a3\modules_f_curator\Data\portraitTracers_ca.paa";
+ };
class GVAR(moduleTurretOptics): GVAR(moduleBase) {
curatorCanAttach = 1;
category = QGVAR(Equipment);
diff --git a/addons/modules/XEH_PREP.hpp b/addons/modules/XEH_PREP.hpp
index e613aa852..748115c6d 100644
--- a/addons/modules/XEH_PREP.hpp
+++ b/addons/modules/XEH_PREP.hpp
@@ -8,6 +8,7 @@ PREP(compileEffects);
PREP(compileFlags);
PREP(compileMines);
PREP(compileReinforcements);
+PREP(compileTracers);
PREP(gui_ambientFlyby);
PREP(gui_cas);
PREP(gui_damageBuildings);
@@ -18,6 +19,7 @@ PREP(gui_globalHint);
PREP(gui_setDate);
PREP(gui_sideRelations);
PREP(gui_spawnReinforcements);
+PREP(gui_tracers);
PREP(initDisplay);
PREP(initModule);
PREP(moduleAddFullArsenal);
@@ -81,6 +83,7 @@ PREP(moduleTeleportPlayers);
PREP(moduleToggleFlashlights);
PREP(moduleToggleIRLasers);
PREP(moduleToggleLamps);
+PREP(moduleTracers);
PREP(moduleTurretOptics);
PREP(moduleUnGarrison);
PREP(moduleVisibility);
diff --git a/addons/modules/XEH_postInit.sqf b/addons/modules/XEH_postInit.sqf
index f0eee5eaf..a80c1bcfe 100644
--- a/addons/modules/XEH_postInit.sqf
+++ b/addons/modules/XEH_postInit.sqf
@@ -6,6 +6,7 @@ if (isServer) then {
[QGVAR(moduleCAS), LINKFUNC(moduleCAS)] call CBA_fnc_addEventHandler;
[QGVAR(moduleEditableObjects), LINKFUNC(moduleEditableObjects)] call CBA_fnc_addEventHandler;
[QGVAR(moduleSpawnReinforcements), LINKFUNC(moduleSpawnReinforcements)] call CBA_fnc_addEventHandler;
+ [QGVAR(moduleTracers), LINKFUNC(moduleTracers)] call CBA_fnc_addEventHandler;
// Public variable to track created teleporter objects
missionNamespace setVariable [QGVAR(teleporters), [], true];
diff --git a/addons/modules/XEH_preStart.sqf b/addons/modules/XEH_preStart.sqf
index b5d9dd3ef..adb11dde3 100644
--- a/addons/modules/XEH_preStart.sqf
+++ b/addons/modules/XEH_preStart.sqf
@@ -8,3 +8,4 @@ call FUNC(compileEffects);
call FUNC(compileFlags);
call FUNC(compileMines);
call FUNC(compileReinforcements);
+call FUNC(compileTracers);
diff --git a/addons/modules/config.cpp b/addons/modules/config.cpp
index 185538cc8..6150f0717 100644
--- a/addons/modules/config.cpp
+++ b/addons/modules/config.cpp
@@ -66,6 +66,7 @@ class CfgPatches {
QGVAR(moduleToggleFlashlights),
QGVAR(moduleToggleIRLasers),
QGVAR(moduleToggleLamps),
+ QGVAR(moduleTracers),
QGVAR(moduleTurretOptics),
QGVAR(moduleUnGarrison),
QGVAR(moduleVisibility),
diff --git a/addons/modules/functions/fnc_compileTracers.sqf b/addons/modules/functions/fnc_compileTracers.sqf
new file mode 100644
index 000000000..083d74c8c
--- /dev/null
+++ b/addons/modules/functions/fnc_compileTracers.sqf
@@ -0,0 +1,52 @@
+#include "script_component.hpp"
+/*
+ * Author: Ampersand, mharis001
+ * Compiles a list of weapons that have compatible tracer magazines.
+ *
+ * Arguments:
+ * None
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * [] call zen_modules_fnc_compileTracers
+ *
+ * Public: No
+ */
+
+private _tracersCache = createHashMap;
+private _cfgMagazines = configFile >> "CfgMagazines";
+private _cfgMagazineWells = configFile >> "CfgMagazineWells";
+
+{
+ if (
+ getNumber (_x >> "scope") == 2
+ && {getNumber (_x >> "type") == TYPE_WEAPON_PRIMARY}
+ && {count getArray (_x >> "muzzles") == 1}
+ ) then {
+ private _weapon = configName _x;
+
+ if (getText (_x >> "baseWeapon") == _weapon) then {
+ private _magazines = getArray (_x >> "magazines");
+
+ {
+ {
+ _magazines insert [-1, getArray _x, true];
+ } forEach configProperties [_cfgMagazineWells >> _x, "isArray _x", false];
+ } forEach getArray (_x >> "magazineWell");
+
+ private _tracerMagazines = _magazines select {
+ getNumber (_cfgMagazines >> _x >> "tracersEvery") == 1
+ } apply {
+ configName (_cfgMagazines >> _x)
+ };
+
+ if (_tracerMagazines isNotEqualTo []) then {
+ _tracersCache set [_weapon, _tracerMagazines];
+ };
+ };
+ };
+} forEach configProperties [configFile >> "CfgWeapons", "isClass _x"];
+
+uiNamespace setVariable [QGVAR(tracersCache), _tracersCache];
diff --git a/addons/modules/functions/fnc_gui_tracers.sqf b/addons/modules/functions/fnc_gui_tracers.sqf
new file mode 100644
index 000000000..6bd1a234d
--- /dev/null
+++ b/addons/modules/functions/fnc_gui_tracers.sqf
@@ -0,0 +1,191 @@
+#include "script_component.hpp"
+/*
+ * Author: Ampersand, mharis001
+ * Initializes the "Tracers" Zeus module display.
+ *
+ * Arguments:
+ * 0: Display
+ * 1: Logic
+
+ Burst Delay
+
+
+ The delay, in seconds, between bursts of tracers.\nSelected randomly in a range from min to max, gravitating towards mid.
+
+
+ Dispersion
+
+
+ The dispersion of the fired tracer rounds.
+
+
+ Tracers are fired randomly in the air.
+
+
+ Tracers are fired at the current camera position.
+
+
+ Tracers target is selected using the cursor after closing the dialog.
+
+
+ Tracers Target
+
Custom Fire
Benutzerdefiniertes Feuer
diff --git a/docs/user_guide/modules_list.md b/docs/user_guide/modules_list.md
index 2c1b52e47..a8393267d 100644
--- a/docs/user_guide/modules_list.md
+++ b/docs/user_guide/modules_list.md
@@ -271,6 +271,10 @@ Toggles the simulation of the attached object.
Toggles the visibility of the attached object.
+## Tracers
+
+Creates an invisible unit that shoots customizable tracer bursts at a specified target when no players are within 100 m of the module.
+
## Un-Garrison Group
Un-garrisons units from the attached group.