diff --git a/.github/workflows/arma.yml b/.github/workflows/arma.yml
index 1af2e7e0602..c3769d59126 100644
--- a/.github/workflows/arma.yml
+++ b/.github/workflows/arma.yml
@@ -34,6 +34,8 @@ jobs:
uses: actions/checkout@v4
- name: Setup HEMTT
uses: arma-actions/hemtt@v1
+ with:
+ annotate: false
- name: Run HEMTT build
run: hemtt build
- name: Rename build folder
diff --git a/.hemtt/lints.toml b/.hemtt/lints.toml
index f77ab4358b1..1faf5157242 100644
--- a/.hemtt/lints.toml
+++ b/.hemtt/lints.toml
@@ -1,3 +1,6 @@
+[config.file_type]
+options.allow_no_extension = true
+
[sqf.banned_commands]
options.ignore = [
"addPublicVariableEventHandler", # Alt syntax is broken, we are using main syntax
diff --git a/addons/advanced_throwing/stringtable.xml b/addons/advanced_throwing/stringtable.xml
index 54338f393d7..12818c14518 100644
--- a/addons/advanced_throwing/stringtable.xml
+++ b/addons/advanced_throwing/stringtable.xml
@@ -88,7 +88,7 @@
Zezwól na podnoszenie przyczepionych obiektów miotanych
Permitir pegar arremessáveis fixados
Вкл. подбор прикрепленных гранат
- Aktiviere erneute Aufnahme befestigter Wurfobjekte
+ Erlaube erneute Aufnahme befestigter Wurfobjekte
부착 투척물 줍기 활성화
装着済の投擲物の拾い上げを有効化
啟用可撿取附著投擲物
diff --git a/addons/arsenal/stringtable.xml b/addons/arsenal/stringtable.xml
index 106f7fd3aa9..195ceea4b45 100644
--- a/addons/arsenal/stringtable.xml
+++ b/addons/arsenal/stringtable.xml
@@ -1203,7 +1203,7 @@
Rejestruj brakujące / niedostępne przedmioty
Registrar em log itens indisponíveis/não encontrados
Вести журнал недоступных предметов
- Aktiviert die Aufzeichnung fehlender Gegenstände in der RPT
+ Aufzeichnung fehlender Gegenstände in der RPT
누락 된 항목 / 사용 할 수 없는 항목 기록
欠落 / 利用不可アイテムを記録
記錄遺失/無法使用的項目
diff --git a/addons/artillerytables/dev/showShotInfo.inc.sqf b/addons/artillerytables/dev/showShotInfo.inc.sqf
index 6945e95ba0b..69f7a0728a4 100644
--- a/addons/artillerytables/dev/showShotInfo.inc.sqf
+++ b/addons/artillerytables/dev/showShotInfo.inc.sqf
@@ -29,11 +29,9 @@ INFO("showing shot info");
}, {
params ["", "_shootPos", "_lastPos"];
private _mkrB = createMarker [format ["shotInfo-%1-%2",_shootPos,_lastPos], _lastPos];
- _mkrB setMarkerType "mil_dot";
- _mkrB setMarkerColor "ColorGreen";
- _mkrB setMarkerSize [0.5,0.5];
- private _diff = _lastPos vectorDiff _shootPos;
- _mkrB setMarkerText format ["%1", _diff apply {round _x}];
+ _mkrB setMarkerTypeLocal "mil_dot";
+ _mkrB setMarkerColorLocal "ColorGreen";
+ _mkrB setMarkerSizeLocal [0.5,0.5];
private _dist2d = _shootPos distance2D _lastPos;
private _dir = _shootPos getDir _lastPos;
@@ -42,7 +40,7 @@ INFO("showing shot info");
}, [_proj, _shootPos, [0,0,0], _submunitionAmmo]] call CBA_fnc_waitUntilAndExecute;
private _mkrA = createMarker [format ["shotInfo-%1",_shootPos], _shootPos];
- _mkrA setMarkerType "mil_dot";
- _mkrA setMarkerColor "ColorRed";
+ _mkrA setMarkerTypeLocal "mil_dot";
+ _mkrA setMarkerColorLocal "ColorRed";
_mkrA setMarkerSize [0.5,0.5];
}] call CBA_fnc_addClassEventHandler;
diff --git a/addons/ballistics/functions/fnc_statTextStatement_magazineMuzzleVelocity.sqf b/addons/ballistics/functions/fnc_statTextStatement_magazineMuzzleVelocity.sqf
index a57a52bba7c..994a667eb2f 100644
--- a/addons/ballistics/functions/fnc_statTextStatement_magazineMuzzleVelocity.sqf
+++ b/addons/ballistics/functions/fnc_statTextStatement_magazineMuzzleVelocity.sqf
@@ -4,7 +4,7 @@
* Text statement for the magazine ammo muzzle velocity stat.
*
* Arguments:
- * 0: Type what it is here (unused)
+ * 0: Stats (unused)
* 1: Item config path
*
* Return Value:
@@ -13,47 +13,17 @@
* Public: No
*/
-params ["", "_configMagazine"];
+params ["_stats", "_configMagazine"];
-if (EGVAR(arsenal,currentLeftPanel) == 2002) then {
- private _primaryMag = primaryWeaponMagazine EGVAR(arsenal,center);
- [primaryWeapon EGVAR(arsenal,center), _primaryMag param [0, ""]]
-} else {
- private _primaryMag = handgunMagazine EGVAR(arsenal,center);
- [handgunWeapon EGVAR(arsenal,center), _primaryMag param [0, ""]]
-} params ["_weapon", "_magazine"];
+private _magClass = configName _configMagazine;
+private _weapons = [primaryWeapon EGVAR(arsenal,center), handgunWeapon EGVAR(arsenal,center)];
+private _weaponIndex = _weapons findIf {_x canAdd [_magClass, _x]};
-// we might be looking at random mags not related to our weapon
-private _magIsForCurrentWeapon = (configName _configMagazine == _magazine) && {_weapon != ""};
-private _configWeapon = configNull;
+// Defer to weapon stat if mag fits in the primary muzzle of an equipped weapon (except launchers)
+if (_weaponIndex != -1) exitWith {
+ [_stats, configFile >> "CfgWeapons" >> _weapons select _weaponIndex, _configMagazine] call FUNC(statTextStatement_weaponMuzzleVelocity);
+};
private _muzzleVelocity = getNumber (_configMagazine >> "initSpeed");
-private _initSpeedCoef = 0;
-if (_magIsForCurrentWeapon) then {
- _configWeapon = configFile >> "CfgWeapons" >> _weapon;
- _initSpeedCoef = getNumber (_configWeapon >> "initSpeed");
-};
-if (_initSpeedCoef < 0) then {
- _muzzleVelocity = _muzzleVelocity * -_initSpeedCoef;
-};
-if (_initSpeedCoef > 0) then {
- _muzzleVelocity = _initSpeedCoef;
-};
-private _abAdjustText = "";
-if (
- _magIsForCurrentWeapon &&
- {missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]} &&
- {missionNamespace getVariable [QEGVAR(advanced_ballistics,barrelLengthInfluenceEnabled), false]} // this can be on while AB is off or vice-versa
-) then {
- private _configAmmo = (configFile >> "CfgAmmo" >> (getText (_configMagazine >> "ammo")));
- private _barrelLength = getNumber (_configWeapon >> "ACE_barrelLength");
- private _muzzleVelocityTable = getArray (_configAmmo >> "ACE_muzzleVelocities");
- private _barrelLengthTable = getArray (_configAmmo >> "ACE_barrelLengths");
- private _abShift = [_barrelLength, _muzzleVelocityTable, _barrelLengthTable, 0] call EFUNC(advanced_ballistics,calculateBarrelLengthVelocityShift);
- if (_abShift != 0) then {
- _abAdjustText = " [AB]";
- _muzzleVelocity = _abShift;
- };
-};
-format ["%1 m/s (%2 ft/s)%3", _muzzleVelocity toFixed 0, (_muzzleVelocity * 3.28084) toFixed 0, _abAdjustText]
+format ["%1 m/s (%2 ft/s)", _muzzleVelocity toFixed 0, (_muzzleVelocity * METERS_TO_FEET_MULT) toFixed 0]
diff --git a/addons/ballistics/functions/fnc_statTextStatement_weaponMuzzleVelocity.sqf b/addons/ballistics/functions/fnc_statTextStatement_weaponMuzzleVelocity.sqf
index e11c7cf5fb6..03123f14d08 100644
--- a/addons/ballistics/functions/fnc_statTextStatement_weaponMuzzleVelocity.sqf
+++ b/addons/ballistics/functions/fnc_statTextStatement_weaponMuzzleVelocity.sqf
@@ -4,8 +4,9 @@
* Text statement for the weapon muzzle velocity stat.
*
* Arguments:
- * 0: Type what it is here (unused)
- * 1: Item config path
+ * 0: Stats (unused)
+ * 1: Weapon config path
+ * 2: Magazine config path (default: configNull)
*
* Return Value:
* Display text
@@ -13,21 +14,32 @@
* Public: No
*/
-params ["", "_configWeapon"];
+params ["", "_configWeapon", ["_configMagazine", configNull]];
-if (EGVAR(arsenal,currentLeftPanel) == 2002) then {
- private _primaryMag = primaryWeaponMagazine EGVAR(arsenal,center);
- [primaryWeapon EGVAR(arsenal,center), _primaryMag param [0, ""]]
-} else {
- private _primaryMag = handgunMagazine EGVAR(arsenal,center);
- [handgunWeapon EGVAR(arsenal,center), _primaryMag param [0, ""]]
-} params ["_weapon", "_magazine"];
+if (isNull _configMagazine) then { // Get the current weapon's mag
+ _configMagazine = configFile >> "CfgMagazines" >> (weaponState EGVAR(arsenal,center)) select 3;;
+};
-if (_magazine isEqualTo "") then {
+if (isNull _configMagazine) exitWith { // Nothing in the magwell
localize "str_empty";
+};
+
+private _muzzleVelocity = getNumber (_configMagazine >> "initSpeed");
+
+private _abAdjustText = "";
+private _useAB = missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false] && {EGVAR(advanced_ballistics,barrelLengthInfluenceEnabled)};
+
+if (_useAB) then {
+ private _configAmmo = configFile >> "CfgAmmo" >> (getText (_configMagazine >> "ammo"));
+ private _barrelLength = getNumber (_configWeapon >> "ACE_barrelLength");
+ private _muzzleVelocityTable = getArray (_configAmmo >> "ACE_muzzleVelocities");
+ private _barrelLengthTable = getArray (_configAmmo >> "ACE_barrelLengths");
+ private _abShift = [_barrelLength, _muzzleVelocityTable, _barrelLengthTable, 0] call EFUNC(advanced_ballistics,calculateBarrelLengthVelocityShift);
+ if (_abShift != 0) then {
+ _abAdjustText = " [AB]";
+ _muzzleVelocity = _abShift;
+ };
} else {
- private _configMagazine = configFile >> "CfgMagazines" >> _magazine;
- private _muzzleVelocity = getNumber (_configMagazine >> "initSpeed");
private _initSpeedCoef = getNumber (_configWeapon >> "initSpeed");
if (_initSpeedCoef < 0) then {
_muzzleVelocity = _muzzleVelocity * -_initSpeedCoef;
@@ -35,21 +47,6 @@ if (_magazine isEqualTo "") then {
if (_initSpeedCoef > 0) then {
_muzzleVelocity = _initSpeedCoef;
};
-
- private _abAdjustText = "";
- if (
- missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false] &&
- {missionNamespace getVariable [QEGVAR(advanced_ballistics,barrelLengthInfluenceEnabled), false]} // this can be on while AB is off or vice-versa
- ) then {
- private _configAmmo = (configFile >> "CfgAmmo" >> (getText (_configMagazine >> "ammo")));
- private _barrelLength = getNumber (_configWeapon >> "ACE_barrelLength");
- private _muzzleVelocityTable = getArray (_configAmmo >> "ACE_muzzleVelocities");
- private _barrelLengthTable = getArray (_configAmmo >> "ACE_barrelLengths");
- private _abShift = [_barrelLength, _muzzleVelocityTable, _barrelLengthTable, 0] call EFUNC(advanced_ballistics,calculateBarrelLengthVelocityShift);
- if (_abShift != 0) then {
- _abAdjustText = " [AB]";
- _muzzleVelocity = _abShift;
- };
- };
- format ["%1 m/s (%2 ft/s)%3", _muzzleVelocity toFixed 0, (_muzzleVelocity * 3.28084) toFixed 0, _abAdjustText]
};
+
+format ["%1 m/s (%2 ft/s)%3", _muzzleVelocity toFixed 0, (_muzzleVelocity * METERS_TO_FEET_MULT) toFixed 0, _abAdjustText]
diff --git a/addons/ballistics/script_component.hpp b/addons/ballistics/script_component.hpp
index a1b54b53b48..8cb4be327b0 100644
--- a/addons/ballistics/script_component.hpp
+++ b/addons/ballistics/script_component.hpp
@@ -15,3 +15,5 @@
#endif
#include "\z\ace\addons\main\script_macros.hpp"
+
+#define METERS_TO_FEET_MULT 3.28084
diff --git a/addons/cargo/stringtable.xml b/addons/cargo/stringtable.xml
index d40122d96f3..2442cf0dbbf 100644
--- a/addons/cargo/stringtable.xml
+++ b/addons/cargo/stringtable.xml
@@ -268,14 +268,17 @@
Check Cargo Size
Vérifier la taille de la cargaison
Проверить размер груза
+ Prüfe Frachtgröße
화물 크기 확인
貨物の大きさを確認
Show Check Cargo Size Interaction
Вкл. проверку размера груза
+ Zeige Interaktion zum Prüfen der Frachtgröße
貨物の大きさを確認のインタラクションを表示
화물 크기 확인 상호작용 표시
+ Afficher l'interaction de confirmation de la taille de la cargaison
Custom name has been cleared.
diff --git a/addons/common/XEH_PREP.hpp b/addons/common/XEH_PREP.hpp
index db18cd12f16..e8cfb683518 100644
--- a/addons/common/XEH_PREP.hpp
+++ b/addons/common/XEH_PREP.hpp
@@ -125,6 +125,8 @@ PREP(hideUnit);
PREP(interpolateFromArray);
PREP(inTransitionAnim);
PREP(isAwake);
+PREP(isBeingCarried);
+PREP(isBeingDragged);
PREP(isEngineer);
PREP(isEOD);
PREP(isInBuilding);
diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf
index f5bea2958f8..ced3bf305b1 100644
--- a/addons/common/XEH_postInit.sqf
+++ b/addons/common/XEH_postInit.sqf
@@ -473,59 +473,84 @@ addMissionEventHandler ["PlayerViewChanged", {
//////////////////////////////////////////////////
GVAR(isReloading) = false;
-GVAR(reloadMutex_lastMagazines) = [];
-// When reloading, the new magazine is removed from inventory, an animation plays and then the old magazine is added
-// If the animation is interrupted, the new magazine will be lost
-["loadout", {
- params ["_unit", "_newLoadout"];
- private _mags = magazines _unit;
- // if our magazine count dropped by 1, we might be reloading
- if ((count GVAR(reloadMutex_lastMagazines)) - (count _mags) == 1) then {
- private _weapon = currentWeapon _unit;
- private _muzzle = currentMuzzle _unit;
- if (_weapon == "") exitWith {};
- private _wpnMzlConfig = configFile >> "CfgWeapons" >> _weapon;
- if (_muzzle != _weapon) then { _wpnMzlConfig = _wpnMzlConfig >> _muzzle; };
-
- private _compatMags = [_wpnMzlConfig] call CBA_fnc_compatibleMagazines;
- private _lastCompatMagCount = {_x in _compatMags} count GVAR(reloadMutex_lastMagazines);
- private _curCompatMagCount = {_x in _compatMags} count _mags;
- TRACE_3("",_wpnMzlConfig,_lastCompatMagCount,_curCompatMagCount);
- if (_lastCompatMagCount - _curCompatMagCount != 1) exitWith {}; // check if magazines for our specific muzzle dropped by 1
-
- private _gesture = getText (_wpnMzlConfig >> "reloadAction");
- if (_gesture == "") exitWith {}; //Ignore weapons with no reload gesture (binoculars)
- private _isLauncher = _weapon isKindOf ["Launcher", configFile >> "CfgWeapons"];
- private _duration = 0;
- if (_isLauncher) then {
- _duration = getNumber (configFile >> "CfgMovesMaleSdr" >> "States" >> _gesture >> "speed");
- };
- if (_duration == 0) then {
- _duration = getNumber (configFile >> "CfgGesturesMale" >> "States" >> _gesture >> "speed");
- };
- if (_duration != 0) then {
- _duration = if (_duration < 0) then { abs _duration } else { 1 / _duration };
- } else {
- _duration = 6;
- };
+["unit", {
+ params ["_newPlayer"];
+
+ // Catch the current unit reloading
+ private _weaponState = weaponState _newPlayer;
+ GVAR(isReloading) = (_weaponState select 6) != 0;
+
+ if (!GVAR(isReloading)) exitWith {};
- TRACE_2("Reloading, blocking gestures",_weapon,_duration);
- GVAR(reloadingETA) = CBA_missionTime + _duration;
+ GVAR(magazineReloadPhase) = 0;
- if (!GVAR(isReloading)) then {
- GVAR(isReloading) = true;
+ // Wait until reload animation has finished (if weapon is no longer available, it returns -1)
+ [{
+ private _magazineReloadingPhase = ((_this select 0) weaponState (_this select 1)) select 6;
+
+ // Need to check the reloading phase, as if you interrupt reloading with a gesture, the phase will remain stuck at a value > 0
+ if (GVAR(magazineReloadPhase) == _magazineReloadingPhase) exitWith {
+ TRACE_2("Interrupted magazine reloading",_this select 0,_this select 1);
- [{
- CBA_missionTime > GVAR(reloadingETA)
- },{
- GVAR(isReloading) = false;
- }] call CBA_fnc_waitUntilAndExecute;
+ true
};
- };
- GVAR(reloadMutex_lastMagazines) = _mags;
+
+ GVAR(magazineReloadPhase) = _magazineReloadingPhase;
+
+ _magazineReloadingPhase <= 0
+ }, {
+ TRACE_2("End magazine reloading",_this select 0,_this select 1);
+
+ // Player might switch units before reload finishes
+ if ((_this select 0) isNotEqualTo ACE_player) exitWith {};
+
+ GVAR(isReloading) = false;
+ }, [_newPlayer, _weaponState select 1]] call CBA_fnc_waitUntilAndExecute;
}, true] call CBA_fnc_addPlayerEventHandler;
+[QGVAR(magazineReloading), "MagazineReloading", {
+ params ["_unit", "", "_muzzle"];
+
+ TRACE_2("Init magazine reloading",_unit,_muzzle);
+
+ // Wait until reload animation has started
+ [{
+ ((_this select 0) weaponState (_this select 1)) select 6 != 0
+ }, {
+ TRACE_2("Start magazine reloading",_this select 0,_this select 1);
+
+ // Player might switch units before reload starts
+ if ((_this select 0) isNotEqualTo ACE_player) exitWith {};
+
+ GVAR(isReloading) = true;
+ GVAR(magazineReloadPhase) = 0;
+
+ // Wait until reload animation has finished (if weapon is no longer available, it returns -1)
+ [{
+ private _magazineReloadingPhase = ((_this select 0) weaponState (_this select 1)) select 6;
+
+ // Need to check the reloading phase, as if you interrupt reloading with a gesture, the phase will remain stuck at a value > 0
+ if (GVAR(magazineReloadPhase) == _magazineReloadingPhase) exitWith {
+ TRACE_2("Interrupted magazine reloading",_this select 0,_this select 1);
+
+ true
+ };
+
+ GVAR(magazineReloadPhase) = _magazineReloadingPhase;
+
+ _magazineReloadingPhase <= 0
+ }, {
+ TRACE_2("End magazine reloading",_this select 0,_this select 1);
+
+ // Player might switch units before reload finishes
+ if ((_this select 0) isNotEqualTo ACE_player) exitWith {};
+
+ GVAR(isReloading) = false;
+ }, _this] call CBA_fnc_waitUntilAndExecute;
+ }, [_unit, _muzzle], 5] call CBA_fnc_waitUntilAndExecute;
+}] call CBA_fnc_addBISPlayerEventHandler;
+
//////////////////////////////////////////////////
// Start the sway loop
//////////////////////////////////////////////////
diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf
index bb2a0c6810a..af16bfc23df 100644
--- a/addons/common/XEH_preInit.sqf
+++ b/addons/common/XEH_preInit.sqf
@@ -35,7 +35,7 @@ ACE_COUNTERS = [];
GVAR(statusEffects) = createHashMap;
-GVAR(setHearingCapabilityMap) = [];
+GVAR(setHearingCapabilityMap) = createHashMap;
[] call FUNC(setupLocalUnitsHandler); // Add local units event handlers (ace_common_localUnits)
diff --git a/addons/medical_status/functions/fnc_isBeingCarried.sqf b/addons/common/functions/fnc_isBeingCarried.sqf
similarity index 68%
rename from addons/medical_status/functions/fnc_isBeingCarried.sqf
rename to addons/common/functions/fnc_isBeingCarried.sqf
index 2c4d6552f4d..be37d3719db 100644
--- a/addons/medical_status/functions/fnc_isBeingCarried.sqf
+++ b/addons/common/functions/fnc_isBeingCarried.sqf
@@ -1,18 +1,18 @@
#include "..\script_component.hpp"
/*
* Author: PabstMirror
- * Returns if a target is being carried. (from ace_dragging)
+ * Returns if an object is being carried. (from ace_dragging)
*
* Arguments:
- * 0: Target Unit
@@ -1135,7 +1135,7 @@
Fattore di Oscillazione Appoggiato
Fator de balanço de mira em repouso
Коэф. колебания прицела в состоянии покоя
- Verwacklungsfaktor, wenn aufgelegt
+ Verwacklungsfaktor beim Auflegen
휴식 시 손떨림 정도
静止依託時の手ぶれ係数
@@ -1796,10 +1796,18 @@
Realistic Compass Declination
Déclinaison réaliste de la boussole
+ Realistische Missweisung des Kompasses
+ 現実的なコンパス偏角
+ Реалистичный компасса
+ 현실적인 나침반 편각
Compass will point to magnetic north
La boussole indique le nord magnétique
+ Der Kompass zeigt nach missweisend Nord
+ コンパスが磁北を指すようになります
+ Компас будет указывать на северный магнитный полюс
+ 나침반이 자북을 가리키게 됩니다.
Players only
diff --git a/addons/compat_ef/compat_ef_realisticnames/stringtable.xml b/addons/compat_ef/compat_ef_realisticnames/stringtable.xml
index 3dead3055be..bfe5912f9b3 100644
--- a/addons/compat_ef/compat_ef_realisticnames/stringtable.xml
+++ b/addons/compat_ef/compat_ef_realisticnames/stringtable.xml
@@ -11,7 +11,7 @@
M-ATV AT
M-ATV ПТ
M-ATV AT
- M-ATV AT
+ M-ATV (대전차)
M-ATV AT
防地雷反伏擊全地形車 AT
M-ATV AT
@@ -28,7 +28,7 @@
M-ATV FSV
M-ATV FSV
M-ATV FSV
- M-ATV FSV
+ M-ATV (화력지원)
M-ATV FSV
防地雷反伏擊全地形車 FSV
M-ATV FSV
@@ -45,7 +45,7 @@
M-ATV LAAD
M-ATV LAAD
M-ATV LAAD
- M-ATV LAAD
+ M-ATV (저고도 대공 방어)
M-ATV LAAD
防地雷反伏擊全地形車 LAAD
M-ATV LAAD
diff --git a/addons/compat_rf/compat_rf_realisticnames/CfgVehicles.hpp b/addons/compat_rf/compat_rf_realisticnames/CfgVehicles.hpp
index f8779b302c7..3269b267858 100644
--- a/addons/compat_rf/compat_rf_realisticnames/CfgVehicles.hpp
+++ b/addons/compat_rf/compat_rf_realisticnames/CfgVehicles.hpp
@@ -68,12 +68,22 @@ class CfgVehicles {
};
// Typhoon
+ class O_Truck_03_transport_F;
+ class O_Truck_03_cargo_RF: O_Truck_03_transport_F {
+ displayName = SUBCSTRING(truck_03_cargo_Name);
+ };
+
class O_Truck_03_fuel_F;
class C_Truck_03_water_rf: O_Truck_03_fuel_F {
displayName = SUBCSTRING(truck_03_water_Name);
};
// RAM 1500 (Pickup)
+ class Pickup_service_base_old_rf;
+ class Pickup_service_base_rf: Pickup_service_base_old_rf {
+ displayName = SUBCSTRING(pickup_01_service_Name);
+ };
+
class Offroad_01_unarmed_base_F;
class Pickup_01_base_rf: Offroad_01_unarmed_base_F {
displayName = SUBCSTRING(pickup_01_Name);
@@ -81,32 +91,40 @@ class CfgVehicles {
class Pickup_fuel_base_rf: Pickup_01_base_rf {
displayName = SUBCSTRING(pickup_01_fuel_Name);
};
- class Pickup_service_base_rf: Pickup_01_base_rf {
- displayName = SUBCSTRING(pickup_01_service_Name);
- };
class Pickup_repair_base_rf: Pickup_service_base_rf {
displayName = SUBCSTRING(pickup_01_repair_Name);
};
class Pickup_comms_base_rf: Pickup_service_base_rf {
displayName = SUBCSTRING(pickup_01_comms_Name);
};
- class Pickup_repair_ig_base_rf: Pickup_repair_base_rf {
+ class Pickup_repair_ig_base_rf: Pickup_service_base_old_rf {
displayName = SUBCSTRING(pickup_01_repair_Name);
};
+ class Pickup_covered_base_rf: Pickup_service_base_rf {
+ displayName = SUBCSTRING(pickup_01_covered_Name);
+ };
+
+ // Armed Variants
+ class Pickup_01_aat_base_rf: Pickup_01_base_rf {
+ displayName = SUBCSTRING(pickup_01_aa_Name);
+ };
class Pickup_01_hmg_base_rf: Pickup_01_base_rf {
displayName = SUBCSTRING(pickup_01_hmg_Name);
};
+ class Pickup_01_minigun_base_rf: Pickup_01_base_rf {
+ displayName = SUBCSTRING(pickup_01_minigun_Name);
+ };
class Pickup_01_mmg_base_rf: Pickup_01_base_rf {
displayName = SUBCSTRING(pickup_01_mmg_Name);
};
class Pickup_01_mrl_base_rf: Pickup_01_base_rf {
displayName = SUBCSTRING(pickup_01_mrl_Name);
};
- class Pickup_01_aat_base_rf: Pickup_01_base_rf {
- displayName = SUBCSTRING(pickup_01_aa_Name);
+ class Pickup_01_rcws_base_rf: Pickup_01_aat_base_rf {
+ displayName = SUBCSTRING(pickup_01_rcws_Name);
};
- class Pickup_covered_base_rf: Pickup_service_base_rf {
- displayName = SUBCSTRING(pickup_01_covered_Name);
+ class Pickup_01_rocket_base_rf: Pickup_01_aat_base_rf {
+ displayName = SUBCSTRING(pickup_01_rocket_Name);
};
class C_IDAP_Pickup_rf;
diff --git a/addons/compat_rf/compat_rf_realisticnames/CfgWeapons.hpp b/addons/compat_rf/compat_rf_realisticnames/CfgWeapons.hpp
index c2d9003f11a..abc429819f1 100644
--- a/addons/compat_rf/compat_rf_realisticnames/CfgWeapons.hpp
+++ b/addons/compat_rf/compat_rf_realisticnames/CfgWeapons.hpp
@@ -36,6 +36,9 @@ class CfgWeapons {
class hgun_DEagle_gold_RF: hgun_DEagle_RF {
displayName = SUBCSTRING(deagle_gold_Name);
};
+ class hgun_DEagle_camo_RF: hgun_DEagle_RF {
+ displayName = SUBCSTRING(deagle_camo_Name);
+ };
class srifle_h6_base_rf;
class srifle_h6_tan_rf: srifle_h6_base_rf {
diff --git a/addons/compat_rf/compat_rf_realisticnames/stringtable.xml b/addons/compat_rf/compat_rf_realisticnames/stringtable.xml
index 6d93f471eeb..2619ea74f55 100644
--- a/addons/compat_rf/compat_rf_realisticnames/stringtable.xml
+++ b/addons/compat_rf/compat_rf_realisticnames/stringtable.xml
@@ -136,6 +136,11 @@
데저트 이글 마크 XIX L5 (브론즈)
デザートイーグル Mark XIX L5 (ブロンズ)
+
+ Desert Eagle Mark XIX L5 (Camo)
+ デザートイーグル Mark XIX L5 (迷彩)
+ 데저트 이글 마크 XIX L5 (위장)
+
Desert Eagle Mark XIX L5 (Classic)
Desert Eagle Mark XIX L5 (Classique)
@@ -187,7 +192,7 @@
H225 Super Puma (Transporte)
H225 Super Puma (Trasporto)
H225 Super Puma (Transport)
- H225 슈퍼 퓨마 (비무장)
+ H225 슈퍼 퓨마 (수송)
H225 シュペル ピューマ (輸送型)
@@ -196,7 +201,7 @@
H225 Super Puma (Civil)
H225 Super Puma (Civile)
H225 Super Puma (Zivil)
- H225 슈퍼 퓨마 (비무장)
+ H225 슈퍼 퓨마 (민간)
H225 シュペル ピューマ (民生型)
@@ -205,7 +210,7 @@
H215 Super Puma (Transporte)
H215 Super Puma (Trasporto)
H215 Super Puma (Transport)
- H215 슈퍼 퓨마 (비무장)
+ H215 슈퍼 퓨마 (수송)
H215 シュペル ピューマ (輸送型)
@@ -214,7 +219,7 @@
H215 Super Puma (Civil)
H215 Super Puma (Civile)
H215 Super Puma (Zivil)
- H215 슈퍼 퓨마 (비무장)
+ H215 슈퍼 퓨마 (민간)
H215 シュペル ピューマ (民生型)
@@ -394,8 +399,8 @@
C-More Railway (Rojo, Desierto)
C-More Railway (Rosso, Desert)
C-More Railway (Rot, Wüste)
- 씨모어 레일웨이 (빨강, 사막)
- C-More レイルウェイ (グリーン、砂漠迷彩)
+ 씨모어 레일웨이 (빨강, 사막 위장)
+ C-More レイルウェイ (レッド、砂漠迷彩)
C-More Railway (Green, Desert)
@@ -403,7 +408,7 @@
C-More Railway (Verde, Desierto)
C-More Railway (Verde, Deserto)
C-More Railway (Grün, Wüste)
- 씨모어 레일웨이 (녹색, 사막)
+ 씨모어 레일웨이 (녹색, 사막 위장)
C-More レイルウェイ (グリーン、砂漠迷彩)
@@ -421,8 +426,8 @@
C-More Railway (Rojo, Boscoso)
C-More Railway (Rosso, Boschivo)
C-More Railway (Rot, Grünes Tarnmuster)
- 씨모어 레일웨이 (빨강, 수풀)
- C-More レイルウェイ (グリーン、森林迷彩)
+ 씨모어 레일웨이 (빨강, 수풀 위장)
+ C-More レイルウェイ (レッド、森林迷彩)
EOTech MRDS (Khaki)
@@ -541,6 +546,11 @@
램 1500 (중기관총)
ラム 1500 (HMG)
+
+ Ram 1500 (Minigun)
+ ラム 1500 (ミニガン)
+ 램 1500 (미니건)
+
Ram 1500 (MMG)
Ram 1500 (MMG)
@@ -559,6 +569,16 @@
램 1500 (다연장로켓)
ラム 1500 (MRL)
+
+ Ram 1500 (RCWS)
+ ラム 1500 (RCWS)
+ 램 1500 (무인포탑)
+
+
+ Ram 1500 (Rocket)
+ ラム 1500 (ロケット)
+ 램 1500 (로켓)
+
Ram 1500 (Repair)
Ram 1500 (Réparation)
@@ -677,9 +697,14 @@
Пожарная машина HEMTT
HEMTT-Löschfahrzeug
HEMTT 소방트럭
- HEMTT 消防車
+ HEMTT (消防車)
HEMTT 消防卡车
+
+ Typhoon Cargo
+ タイフーン (貨物)
+ 타이푼 화물
+
Typhoon Water
Typhoon Water
@@ -687,7 +712,7 @@
Typhoon Acqua
Typhoon Water
타이푼 급수
- タイフーン 給水
+ タイフーン (給水車)
AMOS Container
diff --git a/addons/compat_ws/compat_ws_realisticnames/CfgWeapons.hpp b/addons/compat_ws/compat_ws_realisticnames/CfgWeapons.hpp
index b1929a49043..a9b21221399 100644
--- a/addons/compat_ws/compat_ws_realisticnames/CfgWeapons.hpp
+++ b/addons/compat_ws/compat_ws_realisticnames/CfgWeapons.hpp
@@ -137,9 +137,23 @@ class CfgWeapons {
class arifle_XMS_Base_Sand_lxWS: arifle_XMS_Base_lxWS {
displayName = SUBCSTRING(XMS_Sand_Name);
};
+ class arifle_XMS_lxWS;
+ class arifle_XMS_Camo_lxWS: arifle_XMS_lxWS {
+ displayName = SUBCSTRING(XMS_Camo_Name);
+ };
+ class arifle_XMS_Gray_lxWS: arifle_XMS_lxWS {
+ displayName = SUBCSTRING(XMS_Gray_Name);
+ };
+
class arifle_XMS_GL_lxWS: arifle_XMS_Base_lxWS {
displayName = SUBCSTRING(XMS_GL_Name);
};
+ class arifle_XMS_GL_Camo_lxWS: arifle_XMS_GL_lxWS {
+ displayName = SUBCSTRING(XMS_GL_Camo_Name);
+ };
+ class arifle_XMS_GL_Gray_lxWS: arifle_XMS_GL_lxWS {
+ displayName = SUBCSTRING(XMS_GL_Gray_Name);
+ };
class arifle_XMS_GL_khk_lxWS: arifle_XMS_GL_lxWS {
displayName = SUBCSTRING(XMS_GL_Khaki_Name);
};
@@ -149,6 +163,12 @@ class CfgWeapons {
class arifle_XMS_Shot_lxWS: arifle_XMS_Base_lxWS {
displayName = SUBCSTRING(XMS_SG_Name);
};
+ class arifle_XMS_Shot_Camo_lxWS: arifle_XMS_Shot_lxWS {
+ displayName = SUBCSTRING(XMS_SG_Camo_Name);
+ };
+ class arifle_XMS_Shot_Gray_lxWS: arifle_XMS_Shot_lxWS {
+ displayName = SUBCSTRING(XMS_SG_Gray_Name);
+ };
class arifle_XMS_Shot_khk_lxWS: arifle_XMS_Shot_lxWS {
displayName = SUBCSTRING(XMS_SG_Khaki_Name);
};
@@ -158,6 +178,12 @@ class CfgWeapons {
class arifle_XMS_M_lxWS: arifle_XMS_Base_lxWS {
displayName = SUBCSTRING(XMS_SW_Name);
};
+ class arifle_XMS_M_Camo_lxWS: arifle_XMS_M_lxWS {
+ displayName = SUBCSTRING(XMS_SW_Camo_Name);
+ };
+ class arifle_XMS_M_Gray_lxWS: arifle_XMS_M_lxWS {
+ displayName = SUBCSTRING(XMS_SW_Gray_Name);
+ };
class arifle_XMS_M_khk_lxWS: arifle_XMS_M_lxWS {
displayName = SUBCSTRING(XMS_SW_Khaki_Name);
};
diff --git a/addons/compat_ws/compat_ws_realisticnames/CfgWeaponsAttachments.hpp b/addons/compat_ws/compat_ws_realisticnames/CfgWeaponsAttachments.hpp
index a805e82edcf..f10af9776aa 100644
--- a/addons/compat_ws/compat_ws_realisticnames/CfgWeaponsAttachments.hpp
+++ b/addons/compat_ws/compat_ws_realisticnames/CfgWeaponsAttachments.hpp
@@ -1,4 +1,14 @@
// Attachments
+class optic_Aco;
+class optic_ACO_camo_lxWS: optic_Aco {
+ displayName = SUBCSTRING(aco_camo_Name);
+};
+
+class optic_ACO_grn;
+class optic_ACO_grn_camo_lxWS: optic_ACO_grn {
+ displayName = SUBCSTRING(aco_grn_camo_Name);
+};
+
class optic_Arco;
class optic_arco_hex_lxWS: optic_Arco {
displayName = SUBCSTRING(arco_hex_Name);
diff --git a/addons/compat_ws/compat_ws_realisticnames/stringtable.xml b/addons/compat_ws/compat_ws_realisticnames/stringtable.xml
index af0beae62b4..dc1ed60de23 100644
--- a/addons/compat_ws/compat_ws_realisticnames/stringtable.xml
+++ b/addons/compat_ws/compat_ws_realisticnames/stringtable.xml
@@ -352,6 +352,16 @@
XMS GL
XMS GL
+
+ XMS GL (Stripes)
+ XMS GL (縞模様迷彩)
+ XMS GL (줄무늬 위장)
+
+
+ XMS GL (Gray)
+ XMS GL (グレー)
+ XMS GL (회색)
+
XMS GL (Sand)
XMS GL (sable)
@@ -388,6 +398,16 @@
XMS
XMS
+
+ XMS (Stripes)
+ XMS (縞模様迷彩)
+ XMS (줄무늬 위장)
+
+
+ XMS (Gray)
+ XMS (グレー)
+ XMS (회색)
+
XMS SG (Khaki)
XMS SG (kaki)
@@ -412,6 +432,16 @@
XMS SG
XMS SG
+
+ XMS SG (Stripes)
+ XMS SG (縞模様迷彩)
+ XMS SG (줄무늬 위장)
+
+
+ XMS SG (Gray)
+ XMS SG (グレー)
+ XMS SG (회색)
+
XMS SG (Sand)
XMS SG (sable)
@@ -448,6 +478,16 @@
XMS SW
XMS SW
+
+ XMS SW (Stripes)
+ XMS SW (縞模様迷彩)
+ XMS SW (줄무늬 위장)
+
+
+ XMS SW (Gray)
+ XMS SW (グレー)
+ XMS SW (회색)
+
XMS SW (Sand)
XMS SW (sable)
@@ -526,6 +566,16 @@
오토카 아르마 APC (비무장)
オトカ アルマ (非武装)
+
+ C-More Railway (Red, Stripes)
+ C-More レイルウェイ (レッド、縞模様迷彩)
+ 씨모어 레일웨이 (빨강/줄무늬 위장)
+
+
+ C-More Railway (Green, Stripes)
+ C-More レイルウェイ (グリーン、縞模様迷彩)
+ 씨모어 레일웨이 (초록/줄무늬 위장)
+
ELCAN SpecterOS (Hex)
ELCAN SpecterOS (Hex)
@@ -776,7 +826,7 @@
KamAZ Munizioni
KamAZ Munition
카마즈 탄약
- KamAZ 弾薬
+ KamAZ (弾薬)
KamAZ Cargo
@@ -785,7 +835,7 @@
KamAZ Carico
KamAZ Fracht
카마즈 화물
- KamAZ 貨物
+ KamAZ (貨物)
KamAZ Flatbed
@@ -794,7 +844,7 @@
KamAZ Pianale
KamAZ Flachbett
카마즈 플랫베드
- KamAZ フラットベッド
+ KamAZ (平台)
KamAZ Racing
@@ -803,7 +853,7 @@
KamAZ da corsa
KamAZ Rennlaster
카마즈 경주용
- KamAZ レース仕様
+ KamAZ (レース仕様)
KamAZ Repair
@@ -812,7 +862,7 @@
KamAZ Riparazione
KamAZ Instandsetzung
카마즈 정비
- KamAZ 修理
+ KamAZ (修理)
diff --git a/addons/cookoff/functions/fnc_detonateAmmunitionServerLoop.sqf b/addons/cookoff/functions/fnc_detonateAmmunitionServerLoop.sqf
index 09e427f9278..4e9b674396d 100644
--- a/addons/cookoff/functions/fnc_detonateAmmunitionServerLoop.sqf
+++ b/addons/cookoff/functions/fnc_detonateAmmunitionServerLoop.sqf
@@ -118,7 +118,7 @@ if (_removeAmmoDuringCookoff) then {
_magazineIndex = _virtualAmmo findIf {(_x select 0) == _magazineClassname};
if (_magazineIndex == -1) exitWith {
- TRACE_1("no virtual magazine",_magazineClass);
+ TRACE_1("no virtual magazine",_magazineClassname);
};
if (_newAmmoCount <= 0) then {
diff --git a/addons/field_rations/stringtable.xml b/addons/field_rations/stringtable.xml
index 0f8531653c2..b083248c219 100644
--- a/addons/field_rations/stringtable.xml
+++ b/addons/field_rations/stringtable.xml
@@ -57,7 +57,7 @@
Bebida refrescante de sabor laranja, com um sabor frutado e formigante.
Напиток с апельсиновым вкусом
Ein nach Orange schmeckender Softdrink mit einem prickelndem und fruchtigem Geschmack
- 오렌지 향의 톡쏘는 탄산음료
+ 오렌지향의 톡 쏘는 탄산음료
口いっぱいに果物を感じるオレンジ風味のソフトドリンク
有著微微的橘子水果味的汽水
橙子味汽水,有刺鼻的水果味
@@ -1284,15 +1284,19 @@
If enabled, hunger and thirst will continue to increase while the Zeus interface is open.
+ Wenn aktiviert, werden Hunger und Durst bei geöffnetem Zeus-Interface weiter zunehmen.
有効化すると、空腹と渇きはZeusインタフェイスを開いている間も継続して進行します。
활성화 시 제우스 인터페이스가 열려 있는 동안 허기와 갈증이 계속 증가합니다.
Si cette option est activée, la faim et la soif continueront d'augmenter tant que l'interface Zeus sera ouverte.
+ Если эта функция включена, чувство голода и жажды будет продолжать усиливаться, пока открыт интерфейс Zeus.
Update Hunger and Thirst in Zeus
+ Zunehmender Hunger und Durst im Zeus
Zeus時に空腹と渇きを進行させる
제우스의 허기와 갈증 업데이트
Mise à jour Faim et soif dans Zeus
+ Обновление голода и жажды в Zeus
diff --git a/addons/fieldmanual/CfgHints.hpp b/addons/fieldmanual/CfgHints.hpp
index 6f5b0c8efef..9020df1a40a 100644
--- a/addons/fieldmanual/CfgHints.hpp
+++ b/addons/fieldmanual/CfgHints.hpp
@@ -106,22 +106,30 @@ class CfgHints {
description = CSTRING(Items_EarPlugs_Description);
tip = "Hearing Wiki";
};
- class ACE_EntrenchingTool: ACE_FieldManual_Base {
+ class ACE_EHP: ACE_FieldManual_Base {
logicalOrder = 11;
+ arguments[] = {BASE_ARGUMENTS, QUOTE('ACE_EHP' call FUNC(getItemName))};
+ displayName = "%14";
+ displayNameShort = CSTRING(Items_EHP_ShortName);
+ description = CSTRING(Items_EHP_Description);
+ tip = "Hearing Wiki";
+ };
+ class ACE_EntrenchingTool: ACE_FieldManual_Base {
+ logicalOrder = 12;
arguments[] = {BASE_ARGUMENTS, QUOTE('ACE_EntrenchingTool' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_EntrenchingTool_ShortName);
description = CSTRING(Items_EntrenchingTool_Description);
};
class ACE_Flashlights: ACE_FieldManual_Base {
- logicalOrder = 12;
+ logicalOrder = 13;
displayName = CSTRING(Items_Flashlights_DisplayName);
displayNameShort = CSTRING(Items_Flashlights_ShortName);
description = CSTRING(Items_Flashlights_Description);
tip = "Flashlights Wiki";
};
class ACE_FortifyTool: ACE_FieldManual_Base {
- logicalOrder = 13;
+ logicalOrder = 14;
arguments[] = {BASE_ARGUMENTS, QUOTE('ACE_Fortify' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_FortifyTool_ShortName);
@@ -129,7 +137,7 @@ class CfgHints {
tip = "Fortify Wiki";
};
class ACE_HuntIR_Monitor: ACE_FieldManual_Base {
- logicalOrder = 14;
+ logicalOrder = 15;
arguments[] = {BASE_ARGUMENTS, QUOTE('ACE_HuntIR_monitor' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_HuntIR_Monitor_ShortName);
@@ -137,14 +145,14 @@ class CfgHints {
tip = "HuntIR Wiki";
};
class ACE_IR_Strobe: ACE_FieldManual_Base {
- logicalOrder = 15;
+ logicalOrder = 16;
arguments[] = {BASE_ARGUMENTS, QUOTE('ACE_IR_Strobe_Item' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_IR_Strobe_ShortName);
description = CSTRING(Items_IR_Strobe_Description);
};
class ACE_Kestrel4500: ACE_FieldManual_Base {
- logicalOrder = 16;
+ logicalOrder = 17;
arguments[] = {BASE_ARGUMENTS, QUOTE('ACE_Kestrel4500' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_Kestrel4500_ShortName);
@@ -152,7 +160,7 @@ class CfgHints {
tip = "Kestrel 4500 Wiki";
};
class ACE_Lockpick: ACE_FieldManual_Base {
- logicalOrder = 17;
+ logicalOrder = 18;
arguments[] = {BASE_ARGUMENTS, QUOTE('ACE_key_lockpick' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_Lockpick_ShortName);
@@ -160,14 +168,14 @@ class CfgHints {
tip = "Vehicle Lock Wiki";
};
class ACE_MapTools: ACE_FieldManual_Base {
- logicalOrder = 18;
+ logicalOrder = 19;
arguments[] = {BASE_ARGUMENTS, QUOTE('ACE_MapTools' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_MapTools_ShortName);
description = CSTRING(Items_MapTools_Description);
};
class ACE_MicroDAGR: ACE_FieldManual_Base {
- logicalOrder = 19;
+ logicalOrder = 20;
arguments[] = {BASE_ARGUMENTS, QUOTE('ACE_microDAGR' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_MicroDAGR_ShortName);
@@ -176,20 +184,20 @@ class CfgHints {
};
// Combine all range tables under one roof [mortar, artillery, rifle]
class ACE_RangeTables: ACE_FieldManual_Base {
- logicalOrder = 20;
+ logicalOrder = 21;
displayName = CSTRING(Items_RangeTables_DisplayName);
displayNameShort = CSTRING(Items_RangeTables_ShortName);
description = CSTRING(Items_RangeTables_Description);
tip = "Rangecard Wiki";
};
class ACE_Ropes: ACE_FieldManual_Base {
- logicalOrder = 21;
+ logicalOrder = 22;
displayName = CSTRING(Items_Ropes_DisplayName);
displayNameShort = CSTRING(Items_Ropes_ShortName);
description = CSTRING(Items_Ropes_Description);
};
class ACE_Sandbag: ACE_FieldManual_Base {
- logicalOrder = 22;
+ logicalOrder = 23;
arguments[] = {BASE_ARGUMENTS, QUOTE('ACE_Sandbag_empty' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_Sandbag_ShortName);
@@ -197,7 +205,7 @@ class CfgHints {
tip = "Sandbag Wiki";
};
class ACE_SpareBarrels: ACE_FieldManual_Base {
- logicalOrder = 23;
+ logicalOrder = 24;
arguments[] = {BASE_ARGUMENTS, QUOTE('ACE_SpareBarrel_Item' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_SpareBarrels_ShortName);
@@ -205,14 +213,14 @@ class CfgHints {
tip = "Overheating Wiki";
};
class ACE_SprayPaint: ACE_FieldManual_Base {
- logicalOrder = 24;
+ logicalOrder = 25;
displayName = CSTRING(Items_SprayPaint_DisplayName);
displayNameShort = CSTRING(Items_SprayPaint_ShortName);
description = CSTRING(Items_SprayPaint_Description);
tip = "Tagging Wiki";
};
class ACE_Tripod: ACE_FieldManual_Base {
- logicalOrder = 25;
+ logicalOrder = 26;
arguments[] = {BASE_ARGUMENTS, QUOTE('ACE_Tripod' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_Tripod_ShortName);
@@ -220,7 +228,7 @@ class CfgHints {
tip = "Tripod Wiki";
};
class ACE_UAVBattery: ACE_FieldManual_Base {
- logicalOrder = 26;
+ logicalOrder = 27;
arguments[] = {BASE_ARGUMENTS, QUOTE('ACE_UAVBattery' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_UAVBattery_ShortName);
@@ -228,14 +236,14 @@ class CfgHints {
tip = "UAV Battery Wiki";
};
class ACE_VehicleKey: ACE_FieldManual_Base {
- logicalOrder = 27;
+ logicalOrder = 28;
displayName = CSTRING(Items_VehicleKey_DisplayName);
displayNameShort = CSTRING(Items_VehicleKey_ShortName);
description = CSTRING(Items_VehicleKey_Description);
tip = "Vehicle Lock Wiki";
};
class ACE_Wirecutter: ACE_FieldManual_Base {
- logicalOrder = 28;
+ logicalOrder = 29;
arguments[] = {BASE_ARGUMENTS, QUOTE('ACE_wirecutter' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_Wirecutter_ShortName);
diff --git a/addons/fieldmanual/stringtable.xml b/addons/fieldmanual/stringtable.xml
index 73551b4a341..76026a533a5 100644
--- a/addons/fieldmanual/stringtable.xml
+++ b/addons/fieldmanual/stringtable.xml
@@ -91,6 +91,7 @@
O %3Horus ATragMX%4 considera condições atmosféricas, dados de armas, munição, alcance, e velocidade do projétil - e até os efeitos Coriolis e Spin - para calcular as configurações necessárias da mira. O %3ATragMX%4, carregado em um computador portátil feito pela %3TDS Recon%4, é rápido e fácil de usar. O %3Recon%4 satisfaz os rigorosos padrões militares %3MIL-STD-810F%4 para quedas, vibrações, umidade, altitude e temperaturas extremas.<br/><br/>%3Uso:%4<br/>Por favor, visite a wiki para mais informações.
%3호러스 ATragMX%4는 대기 상태, 총기 데이터, 탄약, 사거리, 탄속 그리고 총구 속도를 고려하여 %3나타나는 결과%4로 정확한 해결책을 계산하고 %3코리올리 효과%4와 %3스핀 드리프트 효과%4도 설명합니다. %3TDS Recon%4 사에서 제작한 휴대용 컴퓨터에 탑재된 %3ATragMX%4는 사용하기 쉽고 매우 빠릅니다. %3Recon%4 사는 낙하, 진동, 습도, 고도 및 극한 온도에 대해 엄격한 %3%4MIL-STD-810F%4 군사 표준을 충족합니다.<br/><br/>%3사용 방법:%4<br/>자세한 내용은 위키 페이지를 참조하십시오.
%3ホルス ATragMX%4は、大気条件、銃のデータ、弾薬、射程、速度、および初速を考慮した%3最適な結果が得られる%4正確な照準のための計算とその解法を提供します。さらに、%3コリオリ効果%4および%3スピン ドリフト効果%4も考慮します。%3ATragMX%4は%3TDS Recon製%4の携帯コンピュータに読み込まれており、使いやすく、超高速です。%3Recon%4はは、落下、振動、湿度、高度、極端な温度に関する厳格な%3MIL-STD-810F%4軍事規格を満たしています。<br/><br/>%3使用方法:%4<br/>詳細については、Wiki ページを参照してください。
+ Le %3Horus ATragMX%4 prend en compte les conditions atmosphériques, les données de l'arme, les munitions, la portée, la vitesse et la vitesse initiale pour calculer des solutions de visée précises avec des résultats %3Come-Up%4 - et prend même en compte les effets %3Coriolis%4 et %3Spin Drift%4. Le %3ATragMX%4, chargé sur un ordinateur de poche fabriqué par %3TDS Recon%4, est facile à utiliser et rapide comme l'éclair. Le %3Recon%4 est conforme à la norme militaire rigoureuse %3MIL-STD-810F%4 concernant les chutes, les vibrations, l'humidité, l'altitude et les températures extrêmes.<br/><br/>%3Utilisation:%4<br/>Veuillez consulter la page wiki pour plus d'informations.
Portable, Precise, Rugged
@@ -110,6 +111,7 @@
OS %3Sacos de Cadáver%4 são utilizados para transportar cadáveres. Eles podem ser arrastados e embarcados em veículos.<br/><br/>%3Uso:%4<br/>%2Aproxime-se de um cadáver.<br/>%2Utilize [%3%13%4] ou [%3%15%4] e selecione %3Colocar cadáver dentro do saco%4.
%3시체 운반용 부대%4는 시체를 운반하는 데 사용되며, 차량으로 끌고 가서 적재할 수 있습니다.<br/><br/>%3사용 방법:%4<br/>%2시체에 접근하십시오.<br/>%2[%3%13%4] 또는 [%3%15%4]를 사용하여 %3시체 운반용 부대에 담기%4를 선택하십시오.
%3遺体袋%4は、遺体の輸送に使用されます。引きずって車両に積み込むことができます。<br/><br/>%3使用方法:%4<br/>%2遺体に近寄る。<br/>%2[%3%13%4] または [%3%15%4] を使って%3遺体袋に入れる%4を選択して使用します。
+ %3Les sacs mortuaires%4 sont utilisés pour transporter les cadavres. Ils peuvent être traînés et chargés dans des véhicules.<br/><br/>%3Utilisation:%4<br/>%2Approchez-vous d'un cadavre.<br/>Utilisez [%3%13%4] ou [%3%15%4] et sélectionnez %3Placer le corps dans le sac mortuaire%4.
Bring Out Your Dead
@@ -129,6 +131,7 @@
As %3Algema Plásticas%4 permitem a captura e detenção de soldados. Quando apreendidos, o captor se torna capaz de inspecionar os pertences do prisioneiro, liberá-los, ou acompanhá-los a outro local. Transportes mais longos também são possíveis, podendo colocá-los em veículos, se necessário. A depender das configurações, pode ser necessário que as unidades estejam rendidas antes de serem detidas.<br/><br/>%3Uso:%4<br/>%2Aproxime-se da unidade e use [%3%13%4].<br/>%2A interação encontra-se próxima às mãos simbolizada por uma algema.<br/>%2Faça o mesmo para liberar.
%3케이블 타이%4를 사용하면 병사가 다른 병사를 포로로 잡고 구금할 수 있습니다. 체포되면 포로는 포로의 소지품을 검사하여 석방하거나 대체 지역으로 동행시킬 수 있습니다. 필요하면 차량에 싣는 것을 포함하여 죄수를 호송할 수도 있습니다. 설정에 따라 유닛은 포로가 되기 전에 항복해야 할 수도 있습니다.<br/><br/>%3사용 방법:%4<br/>%2유닛에 접근하여 [%3%13%4]를 사용하십시오.<br/>%2상호작용은 수갑 아이콘의 형태로 손 부분에 위치합니다.<br/>%2해제 하려면 같은 행동을 반복하십시오.
%3ケーブル タイ%4は兵士が他の兵士を拘束できるようにします。一度拘束すれば、拘束者は捕虜の所持品を検査したり、釈放したり、別の場所に移送することができるようになります。必要に応じて車両に積み込むなどして捕虜の輸送や護送も可能です。設定によっては、ユニットは捕虜になる前に降伏する必要がある場合があります。<br/><br/>%3使用方法:%4<br/>%2対象に近づいて [%3%13%4] を使います。<br/>%2インタラクションは、手錠アイコンの形で手のあたりに表示されます。<br/>%2同様の方法で解放できます。
+ %3Les serflex%4 permettent à un soldat de capturer et de détenir un autre soldat. Une fois capturé, le soldat peut inspecter les effets personnels du prisonnier, le libérer ou l'accompagner dans une autre zone. Le transport des prisonniers escortés est également possible, y compris leur chargement dans des véhicules si nécessaire. En fonction de vos paramètres, il se peut que les unités doivent se rendre avant d'être capturées.<br/><br/>%3Utilisation:%4<br/>%2Approchez-vous de l'unité et utilisez le [%3%13%4].<br/>%2L'interaction est située autour des mains sous la forme d'une icône de menottes.<br/>%2Répétez l'opération pour libérer l'unité.
Take Prisoners
@@ -272,7 +275,7 @@
%3Tappi auricolari%4 aiutano a prevenire danni all'udito da ripetuti rumori forti in prossimità del soldato. Inserisci %3Tappi auricolari%4 per ridurre il volume dell'ambiente per il soldato e impedire %3Assordamento%4.<br/><br/>%3Utilizzo:%4<br/>%2Usa [%3%12%4] e seleziona %3Equipaggiamento%4.<br/>%2Indossa %3Tappi Auricolari%4.
%3Stopery do Uszu%4 zapobiegają uszkodzeniom słuchu na skutek wybuchów i strzałów w pobliżu żołnierza. Włóż %3Stopery do Uszu%4 w celu wyciszenia otoczenia i uniknięcia %3Głuchoty Bojowej%4.<br/><br/>%3Użycie:%4<br/>%2Użyj [%3%12%4] i wybierz %3Ekwipunek%4.<br/>%2Włóż %3Stopery do Uszu%4.
%3귀마개%4는 병사 주변에서 반복되는 시끄러운 소리로 인한 청력 손상을 방지하는 데 도움이 됩니다. %3귀마개%4를 끼워서 병사가 있는 환경의 소리 크기를 낮추고 %3전투로 인한 청력손상%4을 방지하십시오.<br/><br/>%3사용 방법:%4<br/>%2[%3%12%4]를 사용하여 %3장비%4를 선택하십시오.<br/>%2%3귀마개%4를 삽입하십시오.
- %3耳栓%4は、兵士の近くで繰り返される大きな騒音による聴覚障害を防ぐのに役立ちます。%3耳栓%4を耳に挿入することで兵士の環境の音量を下げ、%3戦闘難聴%4を防ぎます。<br/><br/>%3使用方法:%4<br/>%2[%3%12%4] を使って%3装備%4を選択します。<br/>%2%3耳栓を着ける%4ことで使用できます。
+ %3耳栓%4は、兵士の近くで繰り返される大きな騒音による聴覚障害を防ぐのに役立ちます。%3耳栓%4を耳に挿入することで兵士の環境の音量を下げ、%3戦闘難聴%4を防ぎます。<br/><br/>%3使用方法:%4<br/>%2[%3%12%4] を使って%3装備%4を選択します。<br/>%2%3耳栓を装着%4することで使用できます。
Protect Your Hearing
@@ -284,6 +287,16 @@
청력을 보호합니다
聴覚の保護
+
+ %3Electronic Hearing Protection (EHP)%4 helps prevent hearing damage from repeat loud noises near a soldier. Differently from %3Ear Plugs%4, volume is only reduced when necessary. %3EHP%4 can also be built-in to certain types of %3Headgear%4 and %3Facewear%4.<br/><br/>%3Usage:%4<br/>%2Use [%3%12%4] and select %3Equipment%4.<br/>%2Put on Electronic Hearing Protection%4.
+ %3電子聴覚保護装置%4は、兵士の近くで繰り返される大きな騒音による聴覚障害を防ぐのに役立ちます。%3耳栓%4とは異なり、音量は必要な場合にのみ下げられます。 %3電子聴覚保護装置%4は、特定の種類の%3ヘッドギア%4および%3フェイスウェア%4に組み込まれていることがあります。<br/><br/>%3使用方法:%4<br/>%2[%3%12%4] を使って%3装備%4を選択します。<br/>%2電子聴覚保護装置を装着%4することで使用できます。
+ %3전자 청력 보호구 (EHP)%4는 병사 근처에서 큰 소음이 반복되는 것으로 인한 청력 손상을 예방하는 데 도움을 줍니다. %3귀마개%4와는 달리 음량은 필요할 때만 줄어듭니다. %3EHP%4는 특정한 유형의 %3헤드기어%4 및 %3페이스웨어%4에 내장되어 있습니다.<br/><br/>%3사용 방법:%4<br/>%2[%3%12%4]를 사용하여 %3장비%4를 선택하십시오.<br/>%2%3전자 청력 보호구%4를 착용하십시오.
+
+
+ Protect Your Hearing, Electronically
+ 聴覚を保護。電子的に。
+ 전자적으로 청력을 보호합니다
+
The %3Entrenching Tool%4 allows soldiers to dig trenches to help defend their position. The soldier must be on soil in order to dig a trench.<br/><br/>%3Usage:%4<br/>%2Equip an %3Entrenching Tool%4.<br/>%2Use [%3%12%4] and select %3Equipment%4.<br/>%2Select the type of trench you wish to build.
La %3Pala de Trincheras%4 permite a los soldados excavar trincheras para ayudarles a defender su posición. El soldado debe estar sobre tierra para poder excavar una trinchera.<br/><br/>%3Uso:%4<br/>%2Equipar la %3Pala de Trincheras%4.<br/>%2Usar [%3%12%4] y seleccionar %3Equipamiento%4.<br/>%2Seleccionar el tipo de trinchera que quieres construir.
@@ -440,7 +453,7 @@
三角測量で位置を特定
- The %3MicroDAGR GPS%4 is an advanced version of the %3DAGR%4. It provides position, navigation, and timing (PNT) data to include:<br/>%2Compass and heading<br/>%2Date and hour synced to the mission<br/>%2Elevation (relative to sea level)<br/>%2Current speed<br/>%2GPS with topographic and satellite view<br/>%2Creating, naming, and deleting waypoints<br/>%2Friendly identification (Requires ACE BLUFOR Tracker Setting)<br/>Connection to the Vector-21 Rangefinder for data import (waypoint creation and grid reference of ranged targets)<br/><br/>%3Usage:%4<br/>%2For usage instructions, please visit the dedicated %3MicroDAGR%4 wiki.
+ The %3MicroDAGR GPS%4 is an advanced version of the %3DAGR%4. It provides position, navigation, and timing (PNT) data to include:<br/>%2Compass and heading<br/>%2Date and hour synced to the mission<br/>%2Elevation (relative to sea level)<br/>%2Current speed<br/>%2GPS with topographic and satellite view<br/>%2Creating, naming, and deleting waypoints<br/>%2Friendly identification (Requires ACE BLUFOR Tracker Setting)<br/>%2Connection to the Vector-21 Rangefinder for data import (waypoint creation and grid reference of ranged targets)<br/><br/>%3Usage:%4<br/>%2For usage instructions, please visit the dedicated %3MicroDAGR%4 wiki.
El %3GPS MicroDAGR%4 es una versión avanzada del %3DAGR%4. Provee de posicionamiento, navegación y datos de temporización (PNT) que incluye:<br/>%2Brújula y dirección<br/>%2Fecha y hora sincronizada con la misión<br/>%2Elevación (relativa al nivel del mar)<br/>%2Velocidad actual<br/>%2GPS con vista topográfica y satelital<br/>%2Creación, nombrado y borrado de puntos de ruta<br/>%2Identificación de aliados (Requiere la opción de ACE BLUFOR Tracker)<br/>Conexión con el telémetro Vector-21 para importación de datos (creación de puntos de ruta y referenciado en eje de coordenada para objetivos a distancia)<br/><br/>%3Uso:%4<br/>%2Para instrucciones de uso, por favor visita la Wiki dedicada de %3MicroDAGR%4.
Il %3GPS MicroDAGR%4 è una versione avanzata del %3DAGR%4. Esso mostra dati su posizione, navigazione e tempismo (PNT), includendo:<br/>%2Bussola e azimut<br/>%2Data e ora sincronizzate con la missione<br/>%2Elevazione (dal livello del mare)<br/>%2Velocità attuale<br/>%2GPS con visuale topografica e satellitare<br/>%2Creazione, rinomina e rimozione di waypoint<br/>%2Identificazione di alleati (Richiede Impostazioni ACE BLUFOR Tracker)<br/>Connessione al Telemetro Vector-21 per importazione di dati (creazione waypoint e indicazione di griglia su bersagli puntati)<br/><br/>%3Utilizzo:%4<br/>%2Per informazioni sull'utilizzo sei pregato di visitare la pagina wiki dedicata al %3MicroDAGR%4.
%3MicroDAGR GPS%4 jest zaawansowaną wersją %3DAGR%4. Dostarcza dane oparte o pozycję, nawigację, i czas (PNT): <br/>%2Kompas i kierunek<br/>%2Datę i godzinę zsynchronizowaną z misją<br/>%2Elewację (relatywną do poziomu morza)<br/>%2Obecną prędkość<br/>%2GPS z widokiem topograficznym i satelitarnym<br/>%2Tworzenie, nazywanie oraz usuwanie waypointów<br/>%2Identyfikację sojuszników (Wymaga ACE BLUFOR Tracker)<br/>Połączenie do dalmierza Vector-21 w celu importu danych (waypointy i współrzędne zmierzonego celu)<br/><br/>%3Użycie: %4<br/>%2Po instrukcję użycia odwiedź %3MicroDAGR%4 wiki.
@@ -784,7 +797,7 @@
%%3Внутривенные жидкости%4восстанавливают потерянный объем крови. Кровь, плазма и физраствор функционально идентичны.<br/><br/>%3 Использование:%4<br/>%2 Используйте [%3%13%4] или [%3%14%4] и выберите добавку.<br/>%2 Восстановите объем крови выбрав желаемый %4тип %3жидкости
%3IV-Flüssigkeiten%4 stellen das verlorene Blutvolumen wieder her. Blut, Plasma und Kochsalzlösung sind funktionell gleich.<br/><br/>%3Verwende:%4<br/>%2Verwende [%3%13%4] oder [%3%14%4] und wählen ein Körperteil aus..<br/>%2Stelle das Blutvolumen wieder her, indem der gewünschte %3IV Flüssigkeitstyp%4 ausgewählt wird.
%3수액용기%4는 손실된 혈액량을 보충합니다. 혈액, 혈장 및 생리식염수는 기능적으로 동일합니다.<br/><br/>%3사용 방법:%4<br/>%2[%3%13%4] 또는 [%3%14%4]를 사용하고 부위를 선택하십시오.<br/>%2원하는 %3수액용기%4 종류를 선택하여 혈액량을 보충하십시오.
- %3IV 輸液%4は失われた血液を回復します。血液、血漿、生理食塩水は機能的には同じです。<br/><br/>%3使用方法:%4<br/>%2[%3%13%4] または [%3%14%4] を使って四肢を選択します。<br/>%2希望の%3IV 輸液%4の種類を選択して、血液量を復元します。
+ %3静脈注射(IV)による輸液%4は失われた血液を回復します。血液、血漿、生理食塩液は機能的には同じです。<br/><br/>%3使用方法:%4<br/>%2[%3%13%4] または [%3%14%4] を使って四肢を選択します。<br/>%2希望の%3輸液IV(静脈注射)%4の種類を選択して、血液量を復元します。
IV Fluids
@@ -795,7 +808,7 @@
Fluidos IV
IV-Flüssigkeiten
IV 수액
- IV 輸液
+ 静脈注射(IV)による輸液
Restore Blood Volume
diff --git a/addons/flashsuppressors/stringtable.xml b/addons/flashsuppressors/stringtable.xml
index 7cc495ab7e2..5f37b6c2808 100644
--- a/addons/flashsuppressors/stringtable.xml
+++ b/addons/flashsuppressors/stringtable.xml
@@ -11,7 +11,7 @@
Supressor de Clarão (.338)
Пламегаситель (.338)
Mündungsfeuerdämpfer (.338)
- 소염기 (.338)
+ 소염기 (.338구경)
消炎器 (.338)
消光器 (.338)
消焰器(.338)
@@ -96,7 +96,7 @@
Supressor de Clarão (.45 ACP)
Пламегаситель (.45 ACP)
Mündungsfeuerdämpfer (.45 ACP)
- 소염기 (.45 ACP)
+ 소염기 (.45구경 ACP)
消炎器 (.45 ACP)
消光器 (.45 ACP)
消焰器(.45 ACP)
diff --git a/addons/frag/stringtable.xml b/addons/frag/stringtable.xml
index 1385937a377..6499e57d1b1 100644
--- a/addons/frag/stringtable.xml
+++ b/addons/frag/stringtable.xml
@@ -7,6 +7,7 @@
Debug
Debug
Отладка
+ Debug
디버그
デバッグ
@@ -16,6 +17,7 @@
Dibujar hitboxes
Visualizza hitbox
Изобразить хитбоксы
+ Zeige Hitboxen
히트박스 그리기
ヒットボックスを描画
@@ -25,7 +27,7 @@
Dibuja hitboxes en objetos que son seguidos.
Visualizza hitbox su potenziali bersagli della frammentazione.
Изобразить хитбоксы на объектах, которые были нацелены.
- Splitter-/Explosions-Debugging
+ Zeige Hitboxen von Zielobjekten
타겟팅된 오브젝트에 히트박스를 그립니다.
被弾した物体のヒットボックスを描画します。
@@ -35,7 +37,7 @@
Trazado Debug de Fragmentación/Astillamiento
Traccia Frag/Spall per Debug
Отладка трассировки фрагментации/осколков
- Splitter-/Explosions-Debug-Verfolgung
+ Debug-Verfolgung von Splittern und Wurfstücken
파열/파편 디버그 추적
フラグとスポールの追跡デバッグ
@@ -45,7 +47,7 @@
Habilitar trazado visual de los proyectiles generados por la fragmentación y el astillamiento.
Abilita il tracciamento visivo di effetti di frammentazione e spalling.
Включает визуальную трассировку фрагментации и осколочных снарядов.
- Splitter-/Explosions-Debugging
+ Aktiviert die visuelle Verfolgung von Splittern und Wurfstücken.
파열과 파편의 시각적 추적을 활성화합니다.
フラグメンテーションとスポーリングによって発生した破片飛翔体の動きを視覚的に追跡できる機能を有効化します。
@@ -120,7 +122,7 @@
Symulacja odprysków
Simulação de estilhaços
Симуляция обломков
- Explosionssimulation
+ Simulation von Spreng- und Wurfstücken
파편 시뮬레이션
スポーリング シミュレーション
模擬剝落
@@ -136,7 +138,7 @@
Aktywuje symulację odprysków ACE
Ativa a simulação de estilhaços do ACE
Включить симуляцию обломков ACE
- Aktiviere ACE-Explosionssimulation
+ Aktiviere die ACE Simulation von Spreng- und Wurfstücken
ACE 파편 시뮬레이션을 적용합니다.
ACE スポーリング シミュレーションを有効化
啟用ACE模擬剝落
@@ -149,6 +151,7 @@
Dibujar Esferas de Eventos
Visualizza sfere eventi
Изобразить сферы событий
+ Visualisiere Ereigniskugeln
이벤트 구체 그리기
イベントを球体として描画
@@ -158,6 +161,7 @@
Dibujar esferas codificadas por color en cualquier evento para proyectiles seguidos.
Visualizza sfere colorate su ogni evento di un frammento tracciato.
Изобразить цветные сферы на любом событии для отслеживаемых раундов.
+ Zeige bei jedem Ereignis farbige Kugeln für verfolgte Wurfstücke.
모든 이벤트에서 추적된 파편을 위한 색상으로 구분하는 구체를 그립니다.
追跡中の飛翔体に発生した全てのイベントを色付けた球体として描画します。
@@ -183,6 +187,7 @@
Intensidad del astillamiento
Intensità dello spalling
Интенсивность обрушения
+ Intensität der Wurfstücke
파편 강도
スポーリング強度
@@ -192,6 +197,7 @@
Modificador para aumentar o disminuir el número y la intensidad de los eventos de astillamiento. Aumentar este valor puede producir una degradación en el rendimiento.
Modificatore per il numero e intensità di spalling simulato, ovvero la frammentazione interna ad un veicolo colpito. Valori alti possono causare una degradazione della performance.
Модификатор для увеличения или уменьшения количества и интенсивности событий обрушения. Увеличение этого значения может привести к ухудшению производительности.
+ Ein Modifikator, der die Anzahl und Intensität der Wurfstücke erhöht oder verringert. Eine Erhöhung dieses Wertes kann zu Leistungseinbußen führen.
파편 이벤트 수와 강도를 늘리거나 줄입니다. 이 값을 늘리면 성능이 저하될 수 있습니다.
スポーリング現象が発生する数と強度を増減することが出来ます。この値を大きくすることはパフォーマンスの低下につながる可能性があります。
diff --git a/addons/gforces/ACE_Arsenal_Stats.hpp b/addons/gforces/ACE_Arsenal_Stats.hpp
index 1a85d6a107f..c72b63bfaef 100644
--- a/addons/gforces/ACE_Arsenal_Stats.hpp
+++ b/addons/gforces/ACE_Arsenal_Stats.hpp
@@ -7,7 +7,7 @@ class EGVAR(arsenal,stats) {
displayName = CSTRING(statGReduction);
showBar = 1;
barStatement = QUOTE([ARR_3((_this select 0) select 0,_this select 1,[ARR_3([ARR_2(1,0)],[ARR_2(0.01,1)],false)])] call EFUNC(arsenal,statBarStatement_default));
- condition = QUOTE(getNumber (_this select 1 >> (_this select 0) select 0) < 1);
+ condition = QUOTE(getNumber (_this select 1 >> (_this select 0) select 0) < 1); // All uniforms should have this set to 1 by default
tabs[] = {{3}, {}};
};
};
diff --git a/addons/goggles/stringtable.xml b/addons/goggles/stringtable.xml
index c44454fd9d6..87523bc5235 100644
--- a/addons/goggles/stringtable.xml
+++ b/addons/goggles/stringtable.xml
@@ -21,6 +21,9 @@
Show Goggles Overlay
ゴーグルのオーバーレイを表示する
고글 오버레이 표시
+ Afficher la superposition des lunettes
+ Показать оверлей очков
+ Zeige Schutzbrillenoberfläche
Show Wipe Goggles self interaction
@@ -31,7 +34,7 @@
Pokaż interakcję Wyczyść Gogle
Mostra a auto-interação de limpar os óculos
Показывать действие Протереть очки
- Zeige "Brille abwischen" im Selbstinteraktionsmenü
+ Zeige "Brille abwischen" Interaktion
자기상호작용에 고글 닦기 선택 보이기
ゴーグルを拭うセルフ・インタラクションを表示する
在自我互動中顯示擦拭護目鏡的動作
diff --git a/addons/gunbag/stringtable.xml b/addons/gunbag/stringtable.xml
index a0033f33bb6..6648308c62e 100644
--- a/addons/gunbag/stringtable.xml
+++ b/addons/gunbag/stringtable.xml
@@ -59,7 +59,7 @@
Bolsa de Arma Vazia
Чехол пуст
Waffentasche leer
- 총가방 비어있음
+ 총가방 비어 있음
ガンバッグは空です
槍袋為空
枪袋为空
diff --git a/addons/hearing/ACE_Arsenal_Stats.hpp b/addons/hearing/ACE_Arsenal_Stats.hpp
index 0ab83eed601..a83d274f8a2 100644
--- a/addons/hearing/ACE_Arsenal_Stats.hpp
+++ b/addons/hearing/ACE_Arsenal_Stats.hpp
@@ -3,19 +3,23 @@ class EGVAR(arsenal,stats) {
class ACE_hearingProtection: statBase {
scope = 2;
priority = 2;
- stats[] = {QGVAR(protection)};
- displayName= CSTRING(statHearingProtection);
+ stats[] = {QGVAR(protection), QGVAR(hasEHP)};
+ displayName = CSTRING(statHearingProtection);
showBar = 1;
- barStatement = QUOTE([ARR_3((_this select 0) select 0,_this select 1,[ARR_3([ARR_2(0,1)],[ARR_2(0.01,1)],false)])] call EFUNC(arsenal,statBarStatement_default));
- tabs[] = {{6}, {}};
+ condition = QUOTE([ARR_2(_this select 0,_this select 1)] call EFUNC(arsenal,statCondition_existsAny));
+ barStatement = QUOTE([ARR_2(_this select 0,_this select 1)] call FUNC(statBarStatement_hearingProtection));
+ showText = 1;
+ textStatement = QUOTE(_this select 1 call FUNC(statTextStatement_hearingProtection));
+ tabs[] = {{6, 7}, {}};
};
class ACE_volumeMuffling: statBase {
scope = 2;
priority = 1.75;
stats[] = {QGVAR(lowerVolume)};
- displayName= CSTRING(statHearingLowerVolume);
+ displayName = CSTRING(statHearingLowerVolume);
showBar = 1;
+ condition = QUOTE([ARR_2(_this select 0,_this select 1)] call EFUNC(arsenal,statCondition_existsAll));
barStatement = QUOTE([ARR_3((_this select 0) select 0,_this select 1,[ARR_3([ARR_2(0,1)],[ARR_2(0.01,1)],false)])] call EFUNC(arsenal,statBarStatement_default));
- tabs[] = {{6}, {}};
+ tabs[] = {{6, 7}, {}};
};
};
diff --git a/addons/hearing/CfgEventHandlers.hpp b/addons/hearing/CfgEventHandlers.hpp
index 59cd1b36296..9fc1be4aee7 100644
--- a/addons/hearing/CfgEventHandlers.hpp
+++ b/addons/hearing/CfgEventHandlers.hpp
@@ -23,3 +23,36 @@ class Extended_Respawn_EventHandlers {
};
};
};
+
+class Extended_Killed_EventHandlers {
+ class Car {
+ class ADDON {
+ killed = QUOTE(_this call FUNC(handleVehicleKilled));
+ };
+ };
+ class Tank {
+ class ADDON {
+ killed = QUOTE(_this call FUNC(handleVehicleKilled));
+ };
+ };
+ class Motorcycle {
+ class ADDON {
+ killed = QUOTE(_this call FUNC(handleVehicleKilled));
+ };
+ };
+ class Helicopter {
+ class ADDON {
+ killed = QUOTE(_this call FUNC(handleVehicleKilled));
+ };
+ };
+ class Plane {
+ class ADDON {
+ killed = QUOTE(_this call FUNC(handleVehicleKilled));
+ };
+ };
+ class Ship_F {
+ class ADDON {
+ killed = QUOTE(_this call FUNC(handleVehicleKilled));
+ };
+ };
+};
diff --git a/addons/hearing/CfgVehicles.hpp b/addons/hearing/CfgVehicles.hpp
index 636184ecd22..182c0ccb46f 100644
--- a/addons/hearing/CfgVehicles.hpp
+++ b/addons/hearing/CfgVehicles.hpp
@@ -5,7 +5,7 @@ class CfgVehicles {
class ACE_Equipment {
class ACE_PutInEarplugs {
displayName = CSTRING(EarPlugs_On);
- condition = QUOTE(GVAR(enableCombatDeafness) && {!(_player call FUNC(hasEarPlugsIn)) && {[ARR_2(_player,'ACE_EarPlugs')] call EFUNC(common,hasItem)}});
+ condition = QUOTE(GVAR(enableCombatDeafness) && {!(_player getVariable [ARR_2('ACE_hasEarPlugsIn',false)]) && {[ARR_2(_player,'ACE_EarPlugs')] call EFUNC(common,hasItem)}});
exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting"};
statement = QUOTE([ARR_2(_player,true)] call FUNC(putInEarPlugs));
showDisabled = 0;
@@ -13,12 +13,28 @@ class CfgVehicles {
};
class ACE_RemoveEarplugs {
displayName = CSTRING(EarPlugs_Off);
- condition = QUOTE(GVAR(enableCombatDeafness) && {_player call FUNC(hasEarPlugsIn)});
+ condition = QUOTE(GVAR(enableCombatDeafness) && {_player getVariable [ARR_2('ACE_hasEarPlugsIn',false)]});
exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting"};
statement = QUOTE([ARR_2(_player,true)] call FUNC(removeEarPlugs));
showDisabled = 0;
icon = QPATHTOF(UI\ACE_earplugs_x_ca.paa);
};
+ class ACE_PutOnEHP {
+ displayName = CSTRING(ElectronicHearingProtection_On);
+ condition = QUOTE([_player] call FUNC(canPutOnEHP));
+ exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting"};
+ statement = QUOTE([ARR_2(_player,true)] call FUNC(putOnEHP));
+ showDisabled = 0;
+ icon = "\A3\Characters_F_Orange\Headgear\Data\UI\icon_H_EarProtectors_black_F_CA.paa";
+ };
+ class ACE_RemoveEHP {
+ displayName = CSTRING(ElectronicHearingProtection_Off);
+ condition = QUOTE(GVAR(EnableCombatDeafness) && {_player getVariable [ARR_2('ACE_hasEHP',false)]});
+ exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting"};
+ statement = QUOTE([ARR_2(_player,true)] call FUNC(removeEHP));
+ showDisabled = 0;
+ icon = "\A3\Characters_F_Orange\Headgear\Data\UI\icon_H_EarProtectors_black_F_CA.paa";
+ };
};
};
};
@@ -32,60 +48,70 @@ class CfgVehicles {
class Box_NATO_Support_F: NATO_Box_Base {
class TransportItems {
MACRO_ADDITEM(ACE_EarPlugs,12);
+ MACRO_ADDITEM(ACE_EHP,12);
};
};
class B_supplyCrate_F: ReammoBox_F {
class TransportItems {
MACRO_ADDITEM(ACE_EarPlugs,12);
+ MACRO_ADDITEM(ACE_EHP,12);
};
};
class Box_East_Support_F: EAST_Box_Base {
class TransportItems {
MACRO_ADDITEM(ACE_EarPlugs,12);
+ MACRO_ADDITEM(ACE_EHP,12);
};
};
class O_supplyCrate_F: B_supplyCrate_F {
class TransportItems {
MACRO_ADDITEM(ACE_EarPlugs,12);
+ MACRO_ADDITEM(ACE_EHP,12);
};
};
class Box_IND_Support_F: IND_Box_Base {
class TransportItems {
MACRO_ADDITEM(ACE_EarPlugs,12);
+ MACRO_ADDITEM(ACE_EHP,12);
};
};
class Box_FIA_Support_F: FIA_Box_Base_F {
class TransportItems {
MACRO_ADDITEM(ACE_EarPlugs,12);
+ MACRO_ADDITEM(ACE_EHP,12);
};
};
class I_supplyCrate_F: B_supplyCrate_F {
class TransportItems {
MACRO_ADDITEM(ACE_EarPlugs,12);
+ MACRO_ADDITEM(ACE_EHP,12);
};
};
class IG_supplyCrate_F: ReammoBox_F {
class TransportItems {
MACRO_ADDITEM(ACE_EarPlugs,12);
+ MACRO_ADDITEM(ACE_EHP,12);
};
};
class C_supplyCrate_F: ReammoBox_F {
class TransportItems {
MACRO_ADDITEM(ACE_EarPlugs,12);
+ MACRO_ADDITEM(ACE_EHP,12);
};
};
class ACE_Box_Misc: Box_NATO_Support_F {
class TransportItems {
MACRO_ADDITEM(ACE_EarPlugs,12);
+ MACRO_ADDITEM(ACE_EHP,12);
};
};
diff --git a/addons/hearing/CfgWeapons.hpp b/addons/hearing/CfgWeapons.hpp
index 8cef02edfd8..1f80544ea7f 100644
--- a/addons/hearing/CfgWeapons.hpp
+++ b/addons/hearing/CfgWeapons.hpp
@@ -14,6 +14,18 @@ class CfgWeapons {
};
};
+ class ACE_EHP: ACE_ItemCore {
+ author = ECSTRING(common,ACETeam);
+ displayName = CSTRING(ElectronicHearingProtection_Name);
+ descriptionShort = CSTRING(ElectronicHearingProtection_Description);
+ model = "\A3\Characters_F_Orange\Headgear\H_EarProtectors_F.p3d";
+ picture = "\A3\Characters_F_Orange\Headgear\Data\UI\icon_H_EarProtectors_black_F_CA.paa";
+ scope = 2;
+ class ItemInfo: CBA_MiscItem_ItemInfo {
+ mass = 8.4; // 380g, based on 3M Peltor
+ };
+ };
+
class H_HelmetB;
class H_HelmetCrew_B: H_HelmetB {
diff --git a/addons/hearing/XEH_PREP.hpp b/addons/hearing/XEH_PREP.hpp
index 64161300d3e..f2b70b8ab53 100644
--- a/addons/hearing/XEH_PREP.hpp
+++ b/addons/hearing/XEH_PREP.hpp
@@ -1,13 +1,18 @@
PREP(addEarPlugs);
+PREP(canPutOnEHP);
PREP(earRinging);
PREP(explosion);
PREP(firedNear);
PREP(getAmmoLoudness);
PREP(handleRespawn);
-PREP(hasEarPlugsIn);
+PREP(handleVehicleKilled);
PREP(moduleHearing);
PREP(putInEarPlugs);
+PREP(putOnEHP);
PREP(removeEarPlugs);
+PREP(removeEHP);
+PREP(statBarStatement_hearingProtection);
+PREP(statTextStatement_hearingProtection);
PREP(updateHearingProtection);
PREP(updatePlayerVehAttenuation);
PREP(updateVolume);
diff --git a/addons/hearing/XEH_postInit.sqf b/addons/hearing/XEH_postInit.sqf
index 0ced6cad9c2..3108161900b 100644
--- a/addons/hearing/XEH_postInit.sqf
+++ b/addons/hearing/XEH_postInit.sqf
@@ -50,6 +50,7 @@ GVAR(time3) = 0;
GVAR(damageCoefficent) = 1;
GVAR(volumeAttenuation) = 1;
GVAR(lastPlayerVehicle) = objNull;
+GVAR(ehpTimeout) = -1;
["CBA_settingsInitialized", {
TRACE_1("settingInit - client",GVAR(enableCombatDeafness));
@@ -97,6 +98,6 @@ GVAR(lastPlayerVehicle) = objNull;
GVAR(deafnessPrior) = 0;
GVAR(time3) = 0;
- UPDATE_HEARING_EARPLUGS call FUNC(updateHearingProtection);
+ UPDATE_HEARING call FUNC(updateHearingProtection);
}, true] call CBA_fnc_addPlayerEventHandler;
}] call CBA_fnc_addEventHandler;
diff --git a/addons/hearing/XEH_preInit.sqf b/addons/hearing/XEH_preInit.sqf
index eb9636a12c2..36d2159e8c9 100644
--- a/addons/hearing/XEH_preInit.sqf
+++ b/addons/hearing/XEH_preInit.sqf
@@ -19,6 +19,15 @@ PREP_RECOMPILE_END;
[QGVAR(updateVolume), true, _unit] call CBA_fnc_targetEvent;
};
};
+
+ if (_extendedInfo getOrDefault ["ace_ehp", false]) then {
+ _unit setVariable ["ACE_hasEHP", true, true];
+
+ // Only force update volume if unit is a player (including remote controlled)
+ if (_unit call EFUNC(common,isPlayer)) then {
+ [QGVAR(updateVolume), true, _unit] call CBA_fnc_targetEvent;
+ };
+ };
}] call CBA_fnc_addEventHandler;
["CBA_loadoutGet", {
@@ -27,6 +36,10 @@ PREP_RECOMPILE_END;
if (_unit getVariable ["ACE_hasEarPlugsIn", false]) then {
_extendedInfo set ["ace_earplugs", true]
};
+
+ if (_unit getVariable ["ACE_hasEHP", false]) then {
+ _extendedInfo set ["ace_ehp", true]
+ };
}] call CBA_fnc_addEventHandler;
ADDON = true;
diff --git a/addons/hearing/config.cpp b/addons/hearing/config.cpp
index ba6674b9db0..fcdef40324b 100644
--- a/addons/hearing/config.cpp
+++ b/addons/hearing/config.cpp
@@ -4,7 +4,7 @@ class CfgPatches {
class ADDON {
name = COMPONENT_NAME;
units[] = {};
- weapons[] = {"ACE_EarPlugs"};
+ weapons[] = {"ACE_EarPlugs", "ACE_EHP"};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"ace_interaction"};
author = ECSTRING(common,ACETeam);
diff --git a/addons/hearing/functions/fnc_addEarPlugs.sqf b/addons/hearing/functions/fnc_addEarPlugs.sqf
index 11999f77378..c0bd6b92d83 100644
--- a/addons/hearing/functions/fnc_addEarPlugs.sqf
+++ b/addons/hearing/functions/fnc_addEarPlugs.sqf
@@ -27,7 +27,7 @@ params ["_unit"];
TRACE_2("params",_unit,typeOf _unit);
// Exit if the unit already has earplugs (in ears (persistence scenarios) or inventory)
-if (_unit call FUNC(hasEarPlugsIn) || {[_unit, "ACE_EarPlugs"] call EFUNC(common,hasItem)}) exitWith {};
+if ((_unit getVariable ["ACE_hasEarPlugsIn", false]) || {[_unit, "ACE_EarPlugs"] call EFUNC(common,hasItem)}) exitWith {};
// Add earplugs if enabled for everyone or if the unit has a rocket launcher
if (GVAR(autoAddEarplugsToUnits) == 2 || {(secondaryWeapon _unit) != ""}) exitWith {
diff --git a/addons/hearing/functions/fnc_canPutOnEHP.sqf b/addons/hearing/functions/fnc_canPutOnEHP.sqf
new file mode 100644
index 00000000000..01f327ac1ec
--- /dev/null
+++ b/addons/hearing/functions/fnc_canPutOnEHP.sqf
@@ -0,0 +1,23 @@
+#include "..\script_component.hpp"
+/*
+ * Author: BaerMitUmlaut
+ * Checks if the unit can put on electronic hearing protection.
+ *
+ * Arguments:
+ * 0: Unit
+ *
+ * Return Value:
+ * True if unit can put on electronic hearing protection, otherwise false.
+ *
+ * Example:
+ * [player] call ace_hearing_fnc_canPutOnEHP
+ *
+ * Public: No
+ */
+params ["_unit"];
+
+GVAR(enableCombatDeafness)
+&& {!(_unit getVariable ["ACE_hasEHP", false])}
+&& {[_unit, "ACE_EHP"] call EFUNC(common,hasItem)}
+&& {(headgear _unit == "") || {getNumber (configFile >> "CfgWeapons" >> headgear _unit >> QGVAR(hasEHP)) == 0}}
+&& {(goggles _unit == "") || {getNumber (configFile >> "CfgGlasses" >> goggles _unit >> QGVAR(hasEHP)) == 0}}
diff --git a/addons/hearing/functions/fnc_earRinging.sqf b/addons/hearing/functions/fnc_earRinging.sqf
index 57888e90a2e..70f9f6015f9 100644
--- a/addons/hearing/functions/fnc_earRinging.sqf
+++ b/addons/hearing/functions/fnc_earRinging.sqf
@@ -23,4 +23,23 @@ if (!GVAR(enabledForZeusUnits) && {player != ACE_player}) exitWith {};
TRACE_2("adding",_strength * GVAR(damageCoefficent),GVAR(deafnessDV));
+// Handle volume reduction by electronic hearing protection
+if (
+ _strength >= EHP_MIN_STRENGTH
+ && {ACE_player getVariable ["ACE_hasEHP", false] || {ACE_player getVariable ["ACE_hasBuiltInEHP", false]}}
+) then {
+ if (GVAR(ehpTimeout) == -1) then {
+ [QGVAR(ehp), EHP_REDUCTION * GVAR(volumeAttenuation), true] call EFUNC(common,setHearingCapability);
+
+ [{
+ CBA_missionTime >= GVAR(ehpTimeout)
+ }, {
+ [QGVAR(ehp), 1, true, EHP_FADE_IN] call EFUNC(common,setHearingCapability);
+ GVAR(ehpTimeout) = -1;
+ }] call CBA_fnc_waitUntilAndExecute;
+ };
+
+ GVAR(ehpTimeout) = CBA_missionTime + EHP_TIMEOUT;
+};
+
GVAR(deafnessDV) = GVAR(deafnessDV) + (_strength * GVAR(damageCoefficent));
diff --git a/addons/hearing/functions/fnc_handleRespawn.sqf b/addons/hearing/functions/fnc_handleRespawn.sqf
index 54d4730eda2..957f38a3f93 100644
--- a/addons/hearing/functions/fnc_handleRespawn.sqf
+++ b/addons/hearing/functions/fnc_handleRespawn.sqf
@@ -27,11 +27,15 @@ private _respawn = [0] call BIS_fnc_missionRespawnType;
// If respawn is not group or side:
if (_respawn <= 3) then {
- // Remove earplugs if they have them:
+ // Remove earplugs & EHP if they have them
if (_unit getVariable ["ACE_hasEarPlugsIn", false]) then {
TRACE_1("had EarPlugs in - removing",_unit);
_unit setVariable ["ACE_hasEarPlugsIn", false, true];
};
+ if (_unit getVariable ["ACE_hasEHP", false]) then {
+ TRACE_1("had EHP on - removing",_unit);
+ _unit setVariable ["ACE_hasEHP", false, true];
+ };
};
// Re-add if they need them
diff --git a/addons/hearing/functions/fnc_handleVehicleKilled.sqf b/addons/hearing/functions/fnc_handleVehicleKilled.sqf
new file mode 100644
index 00000000000..08e44ed194c
--- /dev/null
+++ b/addons/hearing/functions/fnc_handleVehicleKilled.sqf
@@ -0,0 +1,64 @@
+#include "..\script_component.hpp"
+/*
+ * Author: BaerMitUmlaut
+ * Handles the explosion noise when a vehicle is destroyed.
+ *
+ * Arguments:
+ * 0: Vehicle
+ * 1: Killer
+ * 2: Instigator
+ * 3: Use effects
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * [vehicle player, player, player, true] call ace_hearing_fnc_handleVehicleKilled
+ *
+ * Public: No
+ */
+params ["_vehicle", "", "", "_useEffects"];
+
+if (!_useEffects) exitWith {};
+
+private _distance = (ACE_player distance _vehicle) max 1;
+if (_distance > 50) exitWith {};
+
+// Calculate explosion power
+// This formula was once revealed to me in a dream
+private _cfg = configOf _vehicle;
+private _explosionPower = getNumber (_cfg >> "secondaryExplosion");
+if (_explosionPower == 0) exitWith {};
+
+if (_explosionPower < 0) then {
+ private _fuelCargoPower = (getFuelCargo _vehicle max 0) * getNumber (_cfg >> "transportFuel") * 0.1;
+ private _fuelPower = fuel _vehicle * getNumber (_cfg >> "fuelCapacity") * 0.1;
+
+ private _ammoCargoPower = (getAmmoCargo _vehicle max 0) * getNumber (_cfg >> "transportAmmo") * 0.05;
+ private _ammoPower = 0;
+ private _magCache = createHashMap;
+ {
+ _x params ["_magClass", "_count"];
+ private _hit = _magCache getOrDefaultCall [_magClass, {
+ private _ammo = getText (configFile >> "CfgMagazines" >> _magClass >> "ammo");
+ getNumber (configFile >> "CfgAmmo" >> _ammo >> "hit")
+ }, true];
+
+ _ammoPower = _ammoPower + _hit * _count * 0.015;
+ } forEach magazinesAmmoFull _vehicle;
+
+ _explosionPower = abs _explosionPower * (_ammoCargoPower + _fuelCargoPower + _fuelPower + _ammoPower);
+};
+
+private _powerCoef = getNumber (_cfg >> "fuelExplosionPower");
+
+// A low explosion power causes no immediate audible explosion
+// Number + coef mechanics found through extensive testing
+if (_explosionPower > 6.25 * _powerCoef) then {
+ // Calculate effective strength for player
+ private _vehAttenuation = [GVAR(playerVehAttenuation), 1] select (isNull objectParent ACE_player || {isTurnedOut ACE_player});
+
+ private _effect = getText (_cfg >> "explosionEffect");
+ private _strength = [VEHICLE_EXPLOSION_STRENGTH, VEHICLE_EXPLOSION_BIG_STRENGTH] select (toLower _effect in ["fuelexplosionbig", "fuelcapacitorexplosion"]);
+ (_vehAttenuation * _strength / _distance) call FUNC(earRinging);
+};
diff --git a/addons/hearing/functions/fnc_hasEarPlugsIn.sqf b/addons/hearing/functions/fnc_hasEarPlugsIn.sqf
deleted file mode 100644
index a94f0fe47e0..00000000000
--- a/addons/hearing/functions/fnc_hasEarPlugsIn.sqf
+++ /dev/null
@@ -1,20 +0,0 @@
-#include "..\script_component.hpp"
-/*
- * Author: commy2
- * Check if the unit has earplugs put in.
- *
- * Arguments:
- * 0: Unit
- *
- * Return Value:
- * Has Earplugs in
- *
- * Example:
- * player call ace_hearing_fnc_hasEarPlugsIn
- *
- * Public: No
- */
-
-params ["_unit"];
-
-_unit getVariable ["ACE_hasEarPlugsIn", false]
diff --git a/addons/hearing/functions/fnc_putInEarplugs.sqf b/addons/hearing/functions/fnc_putInEarplugs.sqf
index 535ad7af01d..cb425226fd8 100644
--- a/addons/hearing/functions/fnc_putInEarplugs.sqf
+++ b/addons/hearing/functions/fnc_putInEarplugs.sqf
@@ -31,5 +31,4 @@ if (_displayHint) then {
// Force an immediate volume update
true call FUNC(updateVolume);
-
-UPDATE_HEARING_EARPLUGS call FUNC(updateHearingProtection);
+UPDATE_HEARING call FUNC(updateHearingProtection);
diff --git a/addons/hearing/functions/fnc_putOnEHP.sqf b/addons/hearing/functions/fnc_putOnEHP.sqf
new file mode 100644
index 00000000000..8bb055884d4
--- /dev/null
+++ b/addons/hearing/functions/fnc_putOnEHP.sqf
@@ -0,0 +1,34 @@
+#include "..\script_component.hpp"
+/*
+ * Author: BaerMitUmlaut
+ * Puts on electronic hearing protection.
+ *
+ * Arguments:
+ * 0: Unit
+ * 1: Display hint (default: false)
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * [player, false] call ace_hearing_fnc_putOnEHP
+ *
+ * Public: No
+ */
+
+if (!GVAR(enableCombatDeafness)) exitWith {};
+
+params ["_unit", ["_displayHint", false]];
+
+// Plugs in inventory, putting them in
+_unit removeItem "ACE_EHP";
+
+_unit setVariable ["ACE_hasEHP", true, true];
+
+if (_displayHint) then {
+ [LLSTRING(ElectronicHearingProtection_Are_On)] call EFUNC(common,displayTextStructured);
+};
+
+// Force an immediate volume update
+true call FUNC(updateVolume);
+UPDATE_HEARING call FUNC(updateHearingProtection);
diff --git a/addons/hearing/functions/fnc_removeEHP.sqf b/addons/hearing/functions/fnc_removeEHP.sqf
new file mode 100644
index 00000000000..37d3d114f7e
--- /dev/null
+++ b/addons/hearing/functions/fnc_removeEHP.sqf
@@ -0,0 +1,39 @@
+#include "..\script_component.hpp"
+/*
+ * Author: BaerMitUmlaut
+ * Takes off electronic hearing protection.
+ *
+ * Arguments:
+ * 0: Unit
+ * 1: Display hint (default: false)
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * [player, false] call ace_hearing_fnc_removeEHP
+ *
+ * Public: No
+ */
+
+if (!GVAR(enableCombatDeafness)) exitWith {};
+
+params ["_unit", ["_displayHint", false]];
+
+// Inventory full
+if !([_unit, "ACE_EHP"] call CBA_fnc_canAddItem) exitWith {
+ [LELSTRING(common,Inventory_Full)] call EFUNC(common,displayTextStructured);
+};
+
+// Plugs already in and removing them.
+_unit addItem "ACE_EHP";
+
+_unit setVariable ["ACE_hasEHP", false, true];
+
+if (_displayHint) then {
+ [LLSTRING(ElectronicHearingProtection_Are_Off)] call EFUNC(common,displayTextStructured);
+};
+
+// Force an immediate volume update
+true call FUNC(updateVolume);
+UPDATE_HEARING call FUNC(updateHearingProtection);
diff --git a/addons/hearing/functions/fnc_removeEarplugs.sqf b/addons/hearing/functions/fnc_removeEarplugs.sqf
index 2d6cffb02e9..18e8256aa23 100644
--- a/addons/hearing/functions/fnc_removeEarplugs.sqf
+++ b/addons/hearing/functions/fnc_removeEarplugs.sqf
@@ -36,5 +36,4 @@ if (_displayHint) then {
// Force an immediate volume update
true call FUNC(updateVolume);
-
-UPDATE_HEARING_EARPLUGS call FUNC(updateHearingProtection);
+UPDATE_HEARING call FUNC(updateHearingProtection);
diff --git a/addons/hearing/functions/fnc_statBarStatement_hearingProtection.sqf b/addons/hearing/functions/fnc_statBarStatement_hearingProtection.sqf
new file mode 100644
index 00000000000..729c39c5790
--- /dev/null
+++ b/addons/hearing/functions/fnc_statBarStatement_hearingProtection.sqf
@@ -0,0 +1,22 @@
+#include "..\script_component.hpp"
+/*
+ * Author: LinkIsGrim
+ * Bar statement for hearing protection.
+ *
+ * Arguments:
+ * 0: Stats
+ * 1: Item config path
+ *
+ * Return Value:
+ * Bar statement
+ *
+ * Public: No
+*/
+
+params ["_stats", "_config", "_args"];
+
+if (getNumber (_config >> (_stats # 1)) == 1) exitWith {
+ 1
+};
+
+[_stats select 0, _config, [[0, 1], [0.01, 1], false]] call EFUNC(arsenal,statBarStatement_default)
diff --git a/addons/hearing/functions/fnc_statTextStatement_hearingProtection.sqf b/addons/hearing/functions/fnc_statTextStatement_hearingProtection.sqf
new file mode 100644
index 00000000000..19a9fa4145e
--- /dev/null
+++ b/addons/hearing/functions/fnc_statTextStatement_hearingProtection.sqf
@@ -0,0 +1,17 @@
+#include "..\script_component.hpp"
+/*
+ * Author: LinkIsGrim
+ * Text statement for hearing protection.
+ *
+ * Arguments:
+ * 0: Item config path
+ *
+ * Return Value:
+ * Stat Text
+ *
+ * Public: No
+*/
+
+params ["_config"];
+
+["", LLSTRING(statEHP)] select (getNumber (_config >> QGVAR(hasEHP)))
diff --git a/addons/hearing/functions/fnc_updateHearingProtection.sqf b/addons/hearing/functions/fnc_updateHearingProtection.sqf
index b4584a567a8..d1b06af9b48 100644
--- a/addons/hearing/functions/fnc_updateHearingProtection.sqf
+++ b/addons/hearing/functions/fnc_updateHearingProtection.sqf
@@ -10,7 +10,7 @@
* None
*
* Example:
- * UPDATE_HEARING_EARPLUGS call ace_hearing_fnc_updateHearingProtection
+ * UPDATE_HEARING call ace_hearing_fnc_updateHearingProtection
*
* Public: No
*/
@@ -25,13 +25,16 @@ if (isNull ACE_player) exitWith {
params ["_slot"];
TRACE_1("",_slot);
-if !(_slot in [UPDATE_HEARING_EARPLUGS, TYPE_GOGGLE, TYPE_HEADGEAR]) exitWith {};
+if !(_slot in [UPDATE_HEARING, TYPE_GOGGLE, TYPE_HEADGEAR]) exitWith {};
-// Handle Earplugs
-private _hasEarPlugsIn = ACE_player call FUNC(hasEarPlugsIn);
+// Handle ACE items
+private _hasEarPlugsIn = ACE_player getVariable ["ACE_hasEarPlugsIn", false];
GVAR(damageCoefficent) = [1, 0.25] select _hasEarPlugsIn;
GVAR(volumeAttenuation) = [1, GVAR(earplugsVolume)] select _hasEarPlugsIn;
+private _hasEHPOn = ACE_player getVariable ["ACE_hasEHP", false];
+private _hasBuiltInEHP = false;
+
// Handle Headgear
private _headgear = headgear ACE_player;
@@ -43,6 +46,8 @@ if (_headgear != "") then {
private _attenuation = getNumber (_heargearConfig >> QGVAR(lowerVolume)) min 1;
GVAR(volumeAttenuation) = GVAR(volumeAttenuation) * (1 - _attenuation);
+
+ _hasBuiltInEHP = _hasBuiltInEHP || { getNumber (_heargearConfig >> QGVAR(hasEHP)) > 0 };
};
// Handle Goggles
@@ -56,4 +61,18 @@ if (_goggles != "") then {
private _attenuation = getNumber (_gogglesConfig >> QGVAR(lowerVolume)) min 1;
GVAR(volumeAttenuation) = GVAR(volumeAttenuation) * (1 - _attenuation);
+
+ _hasBuiltInEHP = _hasBuiltInEHP || { getNumber (_gogglesConfig >> QGVAR(hasEHP)) > 0 };
+};
+
+// Unequip electronic hearing protection when gear has one built in
+if (_hasEHPOn && _hasBuiltInEHP) then {
+ [ACE_player, false] call FUNC(removeEHP);
+};
+
+// Handle electronic hearing protection - effect can only be applied once
+if (_hasEHPOn || _hasBuiltInEHP) then {
+ GVAR(damageCoefficent) = GVAR(damageCoefficent) * 0.25;
};
+
+ACE_player setVariable ["ACE_hasBuiltInEHP", _hasBuiltInEHP];
diff --git a/addons/hearing/functions/fnc_updateVolume.sqf b/addons/hearing/functions/fnc_updateVolume.sqf
index bb1d57e3c14..32ae063663f 100644
--- a/addons/hearing/functions/fnc_updateVolume.sqf
+++ b/addons/hearing/functions/fnc_updateVolume.sqf
@@ -42,10 +42,11 @@ if (!_updateVolumeOnly) then {
GVAR(time3) = CBA_missionTime;
+ private _effectsVolume = getAudioOptionVolumes#0;
if (GVAR(deafnessDV) > 19.75) then {
- playSound (["ACE_Combat_Deafness_Heavy", "ACE_Combat_Deafness_Heavy_NoRing"] select GVAR(disableEarRinging));
+ playSoundUI [["ACE_Combat_Deafness_Heavy", "ACE_Combat_Deafness_Heavy_NoRing"] select GVAR(disableEarRinging), _effectsVolume];
} else {
- playSound (["ACE_Combat_Deafness_Medium", "ACE_Combat_Deafness_Medium_NoRing"] select GVAR(disableEarRinging));
+ playSoundUI [["ACE_Combat_Deafness_Medium", "ACE_Combat_Deafness_Medium_NoRing"] select GVAR(disableEarRinging), _effectsVolume];
};
};
diff --git a/addons/hearing/initKeybinds.inc.sqf b/addons/hearing/initKeybinds.inc.sqf
index d1299661986..b8c3d5f5dc5 100644
--- a/addons/hearing/initKeybinds.inc.sqf
+++ b/addons/hearing/initKeybinds.inc.sqf
@@ -2,13 +2,13 @@
// Conditions: specific
if !([ACE_player, objNull, ["isNotSwimming", "isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith)) exitWith {false};
- if (GVAR(enableCombatDeafness) && {!(ACE_player call FUNC(hasEarPlugsIn))} && {[ACE_player, "ACE_EarPlugs"] call EFUNC(common,hasItem)}) exitWith {
+ if (GVAR(enableCombatDeafness) && {!(ACE_player getVariable ["ACE_hasEarPlugsIn", false])} && {[ACE_player, "ACE_EarPlugs"] call EFUNC(common,hasItem)}) exitWith {
[ACE_player, true] call FUNC(putInEarPlugs);
true // return
};
- if (GVAR(enableCombatDeafness) && {ACE_player call FUNC(hasEarPlugsIn)}) exitWith {
+ if (GVAR(enableCombatDeafness) && {ACE_player getVariable ["ACE_hasEarPlugsIn", false]}) exitWith {
[ACE_player, true] call FUNC(removeEarPlugs);
true // return
@@ -16,3 +16,22 @@
false // return
}] call CBA_fnc_addKeybind; // UNBOUND
+
+["ACE3 Equipment", QGVAR(putOrRemoveEHP), LLSTRING(PutOrRemoveEHP), {
+ // Conditions: specific
+ if !([ACE_player, objNull, ["isNotSwimming", "isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith)) exitWith {false};
+
+ if ([ACE_player] call FUNC(canPutOnEHP)) exitWith {
+ [ACE_player, true] call FUNC(putOnEHP);
+
+ true // return
+ };
+
+ if (GVAR(enableCombatDeafness) && {ACE_player getVariable ["ACE_hasEHP", false]}) exitWith {
+ [ACE_player, true] call FUNC(removeEHP);
+
+ true // return
+ };
+
+ false // return
+}] call CBA_fnc_addKeybind; // UNBOUND
diff --git a/addons/hearing/script_component.hpp b/addons/hearing/script_component.hpp
index a211922087d..f30c20471d6 100644
--- a/addons/hearing/script_component.hpp
+++ b/addons/hearing/script_component.hpp
@@ -17,4 +17,14 @@
#include "\z\ace\addons\main\script_macros.hpp"
#include "\z\ace\addons\hearing\script_macros_hearingProtection.hpp"
-#define UPDATE_HEARING_EARPLUGS -1
+#define UPDATE_HEARING -1
+
+// Electronic hearing protection FX
+#define EHP_REDUCTION 0.125
+#define EHP_MIN_STRENGTH 0.07
+#define EHP_TIMEOUT 0.7
+#define EHP_FADE_IN 0.1
+
+// Vehicle explosion hearing damage
+#define VEHICLE_EXPLOSION_STRENGTH 200
+#define VEHICLE_EXPLOSION_BIG_STRENGTH 500
diff --git a/addons/hearing/script_macros_hearingProtection.hpp b/addons/hearing/script_macros_hearingProtection.hpp
index 377560247ee..1c4a30a3a1a 100644
--- a/addons/hearing/script_macros_hearingProtection.hpp
+++ b/addons/hearing/script_macros_hearingProtection.hpp
@@ -1,4 +1,4 @@
#define HEARING_PROTECTION_OPEN EGVAR(hearing,protection) = 0; EGVAR(hearing,lowerVolume) = 0
#define HEARING_PROTECTION_VICCREW EGVAR(hearing,protection) = 0.85; EGVAR(hearing,lowerVolume) = 0.6
#define HEARING_PROTECTION_EARMUFF EGVAR(hearing,protection) = 0.75; EGVAR(hearing,lowerVolume) = 0.5
-#define HEARING_PROTECTION_PELTOR EGVAR(hearing,protection) = 0.75; EGVAR(hearing,lowerVolume) = 0
+#define HEARING_PROTECTION_PELTOR EGVAR(hearing,protection) = 0.75; EGVAR(hearing,lowerVolume) = 0; EGVAR(hearing,hasEHP) = 1
diff --git a/addons/hearing/stringtable.xml b/addons/hearing/stringtable.xml
index 46be3272c85..ba468dd2a9c 100644
--- a/addons/hearing/stringtable.xml
+++ b/addons/hearing/stringtable.xml
@@ -59,7 +59,7 @@
Protetores colocados
Беруши надеты
Ohrenstöpsel drin
- 귀마개 착용
+ 귀마개 착용함
耳栓を装着しました
耳塞已塞入
耳塞已塞入
@@ -109,7 +109,7 @@
Protetores retirados
Снять беруши
Ohrenstöpsel raus
- 귀마개 뺌
+ 귀마개 빼기
耳栓を外す
取出耳塞
取出耳塞
@@ -133,6 +133,54 @@
Kulak Tıkacı Tak
Füldugó berakva
+
+ Electronic Hearing Protection taken off
+ Elektronischer Gehörschutz abgesetzt
+ 電子聴覚保護具を外しました
+ Электронная защита слуха снята
+ Protection auditive électronique retirée.
+ 전자 청력 보호구 벗음
+
+
+ Electronic Hearing Protection put on
+ Elektronischer Gehörschutz aufgesetzt
+ 電子聴覚保護具を装着しました
+ Электронная защита слуха надета
+ Protection auditive électronique mise en place
+ 전자 청력 보호구 씀
+
+
+ Electronic Hearing Protection protects the wearer from hearing damage without reducing situational awareness.
+ Elektronischer Gehörschutz schützt den Träger vor Hörschäden, ohne dass sein Situationsbewusstsein eingeschränkt wird.
+ 電子聴覚保護具は状況認識力を低下させることなく、装着者の聴覚障害を防ぐことができる。
+ Электронная защита органов слуха защищает пользователя от повреждения слуха, не снижая при этом его осведомленности о ситуации.
+ Les protections auditives électroniques protègent le porteur contre les lésions auditives sans limiter sa conscience de la situation.
+ 전자 청력 보호구는 상황 인식을 저하시키지 않으면서 착용자의 청력 손상을 예방합니다.
+
+
+ Electronic Hearing Protection
+ Elektronischer Gehörschutz
+ 電子聴覚保護具
+ Электронная защита слуха
+ Protection électronique de l'ouïe
+ 전자 청력 보호구
+
+
+ Take off Electronic Hearing Protection
+ Elektronischen Gehörschutz absetzen
+ 電子聴覚保護具を外す
+ Снять электронную защиту слуха
+ Retirer les protections auditives électroniques
+ 전자 청력 보호구 벗기
+
+
+ Put on Electronic Hearing Protection
+ Elektronischen Gehörschutz aufsetzen
+ 電子聴覚保護具を装着
+ Надеть электронную защиту слуха
+ Mettre les protections auditives électroniques
+ 전자 청력 보호구 쓰기
+
Reduces the hearing ability as the player takes hearing damage
Snižuje schopnost sluchu pokud dojde k jeho poškození hlasitou a blízkou střelbou
@@ -142,7 +190,7 @@
Możliwość chwilowej utraty słuchu przy głośnych wystrzałach i jednoczesnym braku włożonych stoperów
Ativar surdez em combate?
Уменьшает возможность игрока слышать звуки при повреждении органов слуха
- Verringert das Hörvermögen wenn der Spieler einen Hörschaden davonträg
+ Verringert das Hörvermögen, wenn der Spieler Hörschäden erleidet
청력에 손상을 입으면 듣는 소리가 감소합니다.
プレイヤーが聴覚にダメージを受けると聴力が低下します
當玩家聽力受損時降低聽力能力?
@@ -213,6 +261,14 @@
Kulak Tıkacın Yok
Nincsen füldugód
+
+ Put on/take off Electronic Hearing Protection
+ Elektronischer Gehörschutz aufsetzen/absetzen
+ 電子聴覚保護具の着脱
+ Надеть/снять электронную защиту слуха
+ Mettre/enlever une protection auditive électronique
+ 전자 청력 보호구 토글
+
Put/take out earplugs
Mettre/enlever les bouchons
@@ -317,6 +373,7 @@
Changes how much deafness explosions cause.\nSetting to 0 will disable explosion hearing damage.
Изменяет степень глухоты, вызываемой взрывами.\nУстановка значения 0 отключает повреждение слуха при взрыве.
+ Ändert den Grad der Taubheit, den Explosionen verursachen.\nEin Wert von 0 deaktiviert von Explosionen verursachte Hörschäden.
폭발로 인한 청력 상실 정도를 변경합니다.\n0으로 설정하면 폭발에도 청력을 온전히 유지할 수 있습니다.
爆発による聴力低下の程度を変更します。\n0に設定することで爆発による聴力低下を無効化できます。
Modifie le degré de surdité causé par les explosions.\nLa valeur 0 désactive les dégâts auditifs causés par les explosions.
@@ -324,6 +381,7 @@
Explosion Deafness Coefficient
Коэффициент оглушения при взрыве
+ Koeffizient für Taubheit bei Explosionen
폭발 난청 계수
爆発による難聴発生係数
Coefficient de surdité à l'explosion
@@ -369,6 +427,14 @@
聽力保護
听力保护
+
+ ELECTRONIC
+ ELEKTRONISCH
+ 電子聴覚保護
+ ЭЛЕКТРОННЫЙ
+ ELECTRONIQUE
+ 전자 청력 보호
+
Volume when unconscious.
Hlasitost během ztráty vědomí.
diff --git a/addons/hitreactions/stringtable.xml b/addons/hitreactions/stringtable.xml
index 1b76933ca7f..e238163fa0b 100644
--- a/addons/hitreactions/stringtable.xml
+++ b/addons/hitreactions/stringtable.xml
@@ -4,8 +4,10 @@
If a unit takes more damage than this setting's value whilst moving on foot, they will fall over.\nIf set to -1 the mechanic is turned off.
Если при передвижении пешком юнит получит больше урона, чем указано в этой настройке,то он упадет.\nЕсли установлено значение -1, механика отключается.
+ Wenn eine Einheit zu Fuß mehr Schaden als diesen Wert erleidet, stürzt sie.\nBei einem Wert von -1, ist diese Mechanik ausgeschaltet.
유닛이 도보로 이동하는 동안 이 설정 값보다 많은 대미지를 입으면 넘어집니다.\n-1로 설정하면 이 기능은 꺼집니다.
徒歩で移動中のユニットが設定値を超えるダメージを受けると転倒します。\n-1に設定することでこの機能を無効化できます。
+ Si une unité subit plus de dégâts que la valeur de ce paramètre alors qu'elle se déplace à pied, elle tombera à la renverse.\nSi le paramètre est réglé sur -1 le mécanisme est désactivé.
Min Damage to trigger falling
@@ -30,7 +32,7 @@
Probabilità dell'IA di far cadere l'arma (colpo al braccio)
Probabilidade da IA de largar a arma após tiro no braço
Шанс выпадения оружия у ИИ (попадание в руку)
- KI-Wahrscheinlichkeit, die Waffe fallen zu lassen (Arm Treffer)
+ KI-Wahrscheinlichkeit für Waffenabwurf (Armtreffer)
인공지능이 무기를 떨굴 확률 (팔 피격)
AIが武器を落とす確率 (腕部への被弾)
@@ -41,7 +43,7 @@
Probabilità dei giocatori di far cadere l'arma (colpo al braccio)
Probabilidade do jogador de largar a arma após tiro no braço
Шанс выпадения оружия у игрока (попадание в руку)
- Spieler Wahrscheinlichkeit, die Waffe fallen zu lassen (Arm Treffer)
+ Spieler-Wahrscheinlichkeit für Waffenabwurf (Armtreffer)
플레이어가 무기를 떨굴 확률 (팔 피격)
プレイヤーが武器を落とす確率 (腕部への被弾)
diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml
index 23ee4dd3c7c..dea81e33d5c 100644
--- a/addons/interact_menu/stringtable.xml
+++ b/addons/interact_menu/stringtable.xml
@@ -27,7 +27,7 @@
Zawsze wyświetlaj kursor dla interakcji
Sempre mostrar cursor para interação
Показывать курсор (взаимодействие)
- Immer den Mauszeiger für Fremd-Interaktionen anzeigen
+ Immer Mauszeiger für Fremd-Interaktionen anzeigen
상호작용 시 항상 커서를 보이기
カーソルを常に表示
互動時永遠顯示游標
@@ -44,7 +44,7 @@
Zawsze wyświetlaj kursor dla własnej interakcji
Sempre mostrar cursor para interação pessoal
Показывать курсор (взаимодействия с собой)
- Immer den Mauszeiger für Selbst-Interaktionen anzeigen.
+ Immer Mauszeiger für Selbst-Interaktionen anzeigen
자기상호작용 시 항상 커서를 보이기
カーソルを常に表示
自我互動時永遠顯示游標
diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml
index 305179055c1..dd17836a364 100644
--- a/addons/interaction/stringtable.xml
+++ b/addons/interaction/stringtable.xml
@@ -855,6 +855,7 @@
手榴弾を渡す
수류탄 건네주기
Donner une grenade
+ Передать гранаты
%1 passed you %2.
@@ -862,6 +863,7 @@
%1 は あなたに %2 を渡した。
%1 님이 %2을(를) 건네주었습니다.
%1 vous a donné %2
+ %1 передал вам %2.
Show "pass grenade" interaction
@@ -869,6 +871,7 @@
"手榴弾を渡す"をインタラクションに表示
"수류탄 건네주기" 상호작용 표시
Afficher l'interaction « Donner une grenade »
+ Показывать действие "передать гранату"
Passengers
@@ -999,6 +1002,7 @@
Interacción con animaciones
Interazione con animazioni
Взаимодействие с анимациями
+ Interaktion mit Animationen
애니메이션 있는 상호작용
車両アニメーションベースのインタラクション
@@ -1337,6 +1341,7 @@
Limita algunas interacciones en vehículos tripulador por facciones enemigas.
Limita alcune interazioni su veicoli con nemici a bordo.
Ограничьте некоторые взаимодействия на транспортных средствах, управляемых вражеской стороной.
+ Beschränkt einige Interaktionen auf Fahrzeuge, die von feindlichen Fraktionen besetzt sind.
적 진영이 탑승한 차량과의 일부 상호작용을 제한합니다.
敵性力の乗員が乗っている車両へのインタラクションを一部制限します。
@@ -1346,6 +1351,7 @@
Interactuar Con Tripulación Enemiga
Interazioni con equipaggio nemico
Взаимодействие с вражеским экипажем
+ Interaktion mit feindlicher Besatzung
적 승무원과의 상호작용
敵乗員がいる状態でのインタラクト
@@ -1355,6 +1361,7 @@
Permitir para Armas Estáticas
Permetti con armi statiche
Разрешить использование статического оружия
+ Erlaube für statische Waffen
고정화기 허용
固定火器での許可
@@ -1377,6 +1384,7 @@
Permite abandonar y cambiar el color del equipo de cualquier unidad en la escuadra del jugador
Permetti di cambiare il colore o rimuovere una qualsiasi unità della propria squadra
Позволяет сбрасывать и менять командные цвета любого подразделения в отряде игрока
+ Erlaubt das Ändern der Teamfarbe einer beliebigen Einheit in der Gruppe des Spielers
플레이어 분대의 모든 유닛을 삭제하고 팀 색상 변경하는 것을 허용합니다.
プレイヤー分隊内の任意のユニットにチームからの脱退と色の変更を許可します
@@ -1386,6 +1394,7 @@
Gestión Remota de Escuadra
Gestione squadra da remoto
Дистанционное управление отрядом
+ Fernverwaltung von Gruppen
분대 원격 관리
遠隔分隊管理
diff --git a/addons/laserpointer/stringtable.xml b/addons/laserpointer/stringtable.xml
index b11298ee0fe..c22749d95d7 100644
--- a/addons/laserpointer/stringtable.xml
+++ b/addons/laserpointer/stringtable.xml
@@ -11,7 +11,7 @@
Emite luz visível.
Испускает узкий пучок видимого света.
Strahlt sichtbares Licht aus.
- 밝은 곳에서도 보임
+ 가시광을 방출합니다.
可視光をだします。
發射出可見光
发出可见激光
diff --git a/addons/maverick/stringtable.xml b/addons/maverick/stringtable.xml
index 7c7fae20782..38f8bb13eae 100644
--- a/addons/maverick/stringtable.xml
+++ b/addons/maverick/stringtable.xml
@@ -8,6 +8,7 @@
AGM-65 Maverick D
AGM-65 Maverick D
AGM-65 Maverick D
+ AGM-65 Maverick D
AGM-65 매버릭 D
AGM-65 マーベリック D
@@ -17,6 +18,7 @@
AGM-65 Maverick D [ACE]
AGM-65 Maverick D [ACE]
AGM-65 Maverick D [ACE]
+ AGM-65 Maverick D [ACE]
AGM-65 매버릭 D [ACE]
AGM-65 マーベリック D [ACE]
@@ -26,6 +28,7 @@
3x AGM-65 Maverick D [ACE]
3x AGM-65 Maverick D [ACE]
3x AGM-65 Maverick D [ACE]
+ 3x AGM-65 Maverick D [ACE]
3x AGM-65 매버릭 D [ACE]
3x AGM-65 マーベリック D [ACE]
@@ -35,6 +38,7 @@
AGM-65 Maverick G
AGM-65 Maverick G
AGM-65 Maverick G
+ AGM-65 Maverick G
AGM-65 매버릭 G
AGM-65 マーベリック G
@@ -44,6 +48,7 @@
AGM-65 Maverick G [ACE]
AGM-65 Maverick G [ACE]
AGM-65 Maverick G [ACE]
+ AGM-65 Maverick G [ACE]
AGM-65 매버릭 G [ACE]
AGM-65 マーベリック G [ACE]
@@ -53,6 +58,7 @@
2x AGM-65 Maverick G [ACE]
2x AGM-65 Maverick G [ACE]
2x AGM-65 Maverick G [ACE]
+ 2x AGM-65 Maverick G [ACE]
2x AGM-65 매버릭 G [ACE]
2x AGM-65 マーベリック G [ACE]
@@ -62,6 +68,7 @@
3x AGM-65 Maverick G [ACE]
3x AGM-65 Maverick G [ACE]
3x AGM-65 Maverick G [ACE]
+ 3x AGM-65 Maverick G [ACE]
3x AGM-65 매버릭 G [ACE]
3x AGM-65 マーベリック G [ACE]
diff --git a/addons/medical/functions/fnc_getIVs.sqf b/addons/medical/functions/fnc_getIVs.sqf
index e9352090b0d..6bbd3d7798a 100644
--- a/addons/medical/functions/fnc_getIVs.sqf
+++ b/addons/medical/functions/fnc_getIVs.sqf
@@ -10,9 +10,10 @@
* IVs :
* 0: IV volume remaining, in liters
* 1: IV type (blood, saline, plasma, etc)
- * 2: Body part IV is attached to
- * 3: IV classname
+ * 2: IV body part
+ * 3: IV treatment classname
* 4: IV flow rate coef
+ * 5: IV item classname
*
* Example:
* player call ace_medical_fnc_getIVs
@@ -37,7 +38,16 @@ if !(_unit isKindOf "CAManBase") exitWith {
private _ivBags = [];
{
- _ivBags pushBack +_x; // manual deep copy so modification doesn't affect unit state
+ _x params ["_bagVolume", "_bagType", "_bodyPartIndex", "_treatment", "_rateCoef", "_bagItem"]; // gotta convert body part index back to the part
+
+ _ivBags pushBack [
+ _bagVolume,
+ _bagType,
+ ALL_BODY_PARTS select _bodyPartIndex,
+ treatment,
+ _rateCoef,
+ _bagItem
+ ];
} forEach (_unit getVariable [QGVAR(ivBags), []]);
_ivBags
diff --git a/addons/medical_damage/functions/fnc_woundsHandlerBase.sqf b/addons/medical_damage/functions/fnc_woundsHandlerBase.sqf
index 92effda9bd5..270e77b2513 100644
--- a/addons/medical_damage/functions/fnc_woundsHandlerBase.sqf
+++ b/addons/medical_damage/functions/fnc_woundsHandlerBase.sqf
@@ -199,8 +199,6 @@ if (_createdWounds) then {
_unit setVariable [VAR_OPEN_WOUNDS, _openWounds, true];
_unit setVariable [QEGVAR(medical,bodyPartDamage), _bodyPartDamage, true];
- [_unit] call EFUNC(medical_status,updateWoundBloodLoss);
-
_bodyPartVisParams call EFUNC(medical_engine,updateBodyPartVisuals);
[QEGVAR(medical,injured), [_unit, _painLevel]] call CBA_fnc_localEvent;
diff --git a/addons/medical_damage/stringtable.xml b/addons/medical_damage/stringtable.xml
index 85b91b4b91b..74573d14d75 100644
--- a/addons/medical_damage/stringtable.xml
+++ b/addons/medical_damage/stringtable.xml
@@ -392,7 +392,7 @@
Szana na śmierć przy śmiertelej ranie
Chance de Morte por Ferimento Fatal
Вероятность смерти от смертельной травмы
- Tödliche Verletzung - Wahrscheinlichkeit des Todes
+ Sterbewahrscheinlichkeit bei tödlichen Verletzungen
치명상 사망 확률
致命傷による死亡確率
致命伤死亡概率
@@ -846,26 +846,34 @@
Sets the amount of damage limbs can receive before going critical, leading to death. Must be over 0 for any effect.\nRequires the "Use Limb Damage" setting to be enabled and "Fatal Damage Source" to be set to "Sum of Trauma" or "Either".\nStacks multiplicatively with the overall unit Damage Threshold. Doesn't interact with fractures/limping at all.
Устанавливает величину урона, который могут получить конечности, прежде чем урон станет критическим, что приведет к смерти. Для любого эффекта должно быть больше 0.\nТребуется, чтобы настройка "Использовать урон конечностям" была включена, а "Причина смертельного урона" была установлена на "Совокупность травмы" или "Оба".\nУмножается с общим порогом повреждения. Никак не взаимодействует с переломами или хроманием.
+ Legt die Menge an Gliedmaßenschaden fest, bevor sie kritisch werden und zum Tod führen. Muss über 0 liegen, um einen Effekt zu bewirken.\nDie Einstellung "Verwende Gliedmaßenschaden" muss aktiviert und "Quelle für tödlichen Schaden" muss auf "Summe aller Traumata" oder "Beide" eingestellt sein.\nStapelt sich multiplikativ mit der Gesamtschadensschwelle der Einheit. Interagiert nicht mit Brüchen/Humpeln.
致命的状態となり死亡する前に手足が受けられるダメージの量を設定します。\n効果の発動には0より大きい数字に設定する必要があります。\n"手足のダメージを使用" 設定を有効化した上で "致命ダメージの原因" を "外傷の合計" または "どちらか" に設定する必要があります。\nユニット全体のダメージしきい値に対して乗算的に上乗せされます。 骨折や足の引きずり(跛行)とは無関係です。
치명적인 상태가 되어 죽음에 이르기 전까지 사지에 받는 피해량을 설정합니다. 효과가 생기려면 값이 0보다 커야 합니다.\n"사지 피해 사용" 설정을 활성화하고 "치명상의 원인"을 "외상 중첩" 또는 "둘 다"로 설정해야 합니다.\n전체 유닛 피해량 임계값과 곱해져서 누적됩니다. 골절/절뚝거림과는 전혀 상관 없습니다.
+ Définit la quantité de dégâts que les membres peuvent recevoir avant de devenir critiques et d'entraîner la mort. Doit être supérieur à 0 pour avoir un effet.\nIl faut que le paramètre « Utiliser les dommages aux membres » soit activé et que « Cause de blessure mortelle » soit réglé sur « Somme des traumatismes » ou « Les deux ».\nS'empile de façon multiplicative avec le seuil de dégâts de l'unité globale. N'interagit pas du tout avec les fractures et le boitement.
Limb Damage Threshold
Порог повреждения конечностей
+ Schwelle für Gliedmaßenschaden
手足のダメージしきい値
사지 피해량 임계값
+ Seuil de dommages aux membres
Controls whether limb damage is taken into account for sum of trauma calculations.
Определяет, учитывается ли повреждение конечностей при расчете совокупности травм.
+ Legt fest, ob Gliedmaßenschäden bei der Berechnung der Summe aller Traumata berücksichtigt werden.
"外傷の合計" の計算に手足のダメージを考慮するかどうかを制御します。
외상 중첩을 계산할 때 사지 피해량을 고려할지 여부를 제어합니다.
+ Contrôle si les dommages aux membres sont pris en compte dans les calculs de la somme des traumatismes.
Use Limb Damage
Использовать урон конечностям
+ Verwende Gliedmaßenschaden
手足のダメージを使用
사지 피해 사용
+ Utiliser les dommages aux membres
diff --git a/addons/medical_engine/functions/fnc_handleDamage.sqf b/addons/medical_engine/functions/fnc_handleDamage.sqf
index cf891f5e532..a338efcf009 100644
--- a/addons/medical_engine/functions/fnc_handleDamage.sqf
+++ b/addons/medical_engine/functions/fnc_handleDamage.sqf
@@ -13,6 +13,9 @@
*
* Public: No
*/
+
+#define INSTAKILL_ALLOWED(unit) (unit isNotEqualTo (unit getVariable [QGVAR(blockInstaKill), objNull]))
+
params ["_unit", "_selection", "_damage", "_shooter", "_ammo", "_hitPointIndex", "_instigator", "_hitpoint", "_directHit", "_context"];
// HD sometimes triggers for remote units - ignore.
@@ -35,13 +38,25 @@ if !(isDamageAllowed _unit && {_unit getVariable [QEGVAR(medical,allowDamage), t
// Killing units via End key is an edge case (#10375)
// This didn't matter pre-Arma 3 2.18 but now this goes through the event handler
// TODO: Structural fire damage >= 1 in a single damage event could still be caught here and we don't want that, but we haven't found a better way to catch this, fire damage should be small most of the time anyway
+// Also triggers for catastrophic vehicle explosions which would kill crew outright, check for blocking
private _newDamage = _damage - _oldDamage;
-if (_structuralDamage && {(abs (_newDamage - 1)) < 0.001 && _ammo == "" && isNull _shooter && isNull _instigator}) exitWith {_damage};
+if (_structuralDamage && {(abs (_newDamage - 1)) < 0.001 && _ammo == "" && isNull _shooter && isNull _instigator} && {INSTAKILL_ALLOWED(_unit)}) exitWith {
+ TRACE_1("unit killed by curator or engine",_unit);
+
+ _damage
+};
// _newDamage == 0 happens occasionally for vehiclehit events (see line 80 onwards), just exit early to save some frametime
// context 4 is engine "bleeding". For us, it's just a duplicate event for #structural which we can ignore without any issues
+// Leverage this to block insta-kills on the same frame (see above)
if (_context != 2 && {_context == 4 || _newDamage == 0}) exitWith {
- TRACE_4("Skipping engine bleeding or zero damage",_ammo,_newDamage,_directHit,_context);
+ TRACE_4("Skipping engine bleeding or zero damage, blocking insta kills until next frame",_ammo,_newDamage,_directHit,_context);
+
+ if (INSTAKILL_ALLOWED(_unit)) then {
+ _unit setVariable [QGVAR(blockInstaKill), _unit];
+ [{_this setVariable [QGVAR(blockInstaKill), nil]}, _unit] call CBA_fnc_execNextFrame;
+ };
+
_oldDamage
};
diff --git a/addons/medical_status/XEH_PREP.hpp b/addons/medical_status/XEH_PREP.hpp
index 967332da2e2..7bfd270f8de 100644
--- a/addons/medical_status/XEH_PREP.hpp
+++ b/addons/medical_status/XEH_PREP.hpp
@@ -11,8 +11,6 @@ PREP(handleKilled);
PREP(handleKilledMission);
PREP(hasStableVitals);
PREP(initUnit);
-PREP(isBeingCarried);
-PREP(isBeingDragged);
PREP(isInStableCondition);
PREP(setCardiacArrestState);
PREP(setDead);
diff --git a/addons/medical_status/XEH_postInit.sqf b/addons/medical_status/XEH_postInit.sqf
index 65e308fa301..1865fe1d7fc 100644
--- a/addons/medical_status/XEH_postInit.sqf
+++ b/addons/medical_status/XEH_postInit.sqf
@@ -3,6 +3,8 @@
// Handle pain changes on injury
[QEGVAR(medical,injured), LINKFUNC(adjustPainLevel)] call CBA_fnc_addEventHandler;
+// Update wound bleeding on injury
+[QEGVAR(medical,injured), LINKFUNC(updateWoundBloodLoss)] call CBA_fnc_addEventHandler;
// Add inventory and open backpack actions to units
[QGVAR(addInventoryActions), LINKFUNC(addInventoryActions)] call CBA_fnc_addEventHandler;
diff --git a/addons/medical_status/functions/fnc_getBloodVolumeChange.sqf b/addons/medical_status/functions/fnc_getBloodVolumeChange.sqf
index 88e85d2c963..3430de7e83a 100644
--- a/addons/medical_status/functions/fnc_getBloodVolumeChange.sqf
+++ b/addons/medical_status/functions/fnc_getBloodVolumeChange.sqf
@@ -26,7 +26,7 @@ if (!isNil {_unit getVariable QEGVAR(medical,ivBags)}) then {
private _tourniquets = GET_TOURNIQUETS(_unit);
_bloodBags = _bloodBags apply {
- _x params ["_bagVolumeRemaining", "_type", "_bodyPart", "_classname", "_rateCoef"];
+ _x params ["_bagVolumeRemaining", "_type", "_bodyPart", "_treatment", "_rateCoef", "_item"];
if (_tourniquets select _bodyPart == 0) then {
private _bagChange = (_deltaT * EGVAR(medical,ivFlowRate) * IV_CHANGE_PER_SECOND * _rateCoef) min _bagVolumeRemaining; // absolute value of the change in miliLiters
@@ -37,7 +37,7 @@ if (!isNil {_unit getVariable QEGVAR(medical,ivBags)}) then {
if (_bagVolumeRemaining < 0.01) then {
[]
} else {
- [_bagVolumeRemaining, _type, _bodyPart, _classname, _rateCoef]
+ [_bagVolumeRemaining, _type, _bodyPart, _treatment, _rateCoef, _item]
};
};
diff --git a/addons/medical_status/stringtable.xml b/addons/medical_status/stringtable.xml
index 2afed32f279..66035019a04 100644
--- a/addons/medical_status/stringtable.xml
+++ b/addons/medical_status/stringtable.xml
@@ -70,7 +70,7 @@
Определяет, насколько быстро подействуют эффекты внутривенного переливания как:\nвременной интервал (s) * изменение внутривенного вливания в секунду (4,1667 мл/с) * скорость потока (этот коэффициент).
Wie schnell der Effekt der Transfusion eintritt
수액용기에서 액체가 얼마나 빠르게 흘러들어가는지를 제어합니다. 수액용기 부피 변화는 다음과 같이 계산됩니다:\n시간 간격 (초) x 초 당 수액 변화량(4.1667mL/s) x 흘러들어가는 양 (해당 계수).
- IV 輸液パックから輸液が流出する速度を制御します。 IV 輸液バッグの容量変化は次のように計算されます:\n時間間隔(秒) x 点滴速度毎秒(4.1667 mL/秒) x 流量(この係数)
+ 輸液IV(静脈注射)バッグから輸液が流出する速度を制御します。 輸液IV(静脈注射)バッグの容量変化は次のように計算されます:\n時間間隔(秒) x 点滴速度毎秒(4.1667 mL/秒) x 流量(この係数)
控制從點滴輸入人體的液體流量多快。點滴的體積更改是以\n時間間隔(單位秒)乘上點滴每秒速度(4.1667毫升/秒)乘上流量(該係數)。
控制从点滴输入人体的液体流量多快。静脉输液袋容积变化的计算方法是:\n时间间隔(秒)x点滴每秒速度(4.1667毫升/秒)x流量(该系数)。
IV Torbalardan sıvının ne kadar hızlı aktığını kontrol eder. IV Torba hacim değişikliği şu şekilde hesaplanır: zaman aralıkları iv saniye başına değişim (4.1667 mL / s) akış hızı (bu katsayı).
@@ -86,7 +86,7 @@
Скорость внутривенного переливания
Transfusions Fließrate
수혈 속도
- IV 輸液の流量
+ 輸液IV(静脈注射)の流量
點滴輸血流量
点滴输血流量
IV Transfüzyon Akış Hızı
diff --git a/addons/medical_treatment/functions/fnc_fullHealLocal.sqf b/addons/medical_treatment/functions/fnc_fullHealLocal.sqf
index 42c5866a9af..3d14380c776 100644
--- a/addons/medical_treatment/functions/fnc_fullHealLocal.sqf
+++ b/addons/medical_treatment/functions/fnc_fullHealLocal.sqf
@@ -50,7 +50,7 @@ _patient setVariable [VAR_BLOOD_VOL, DEFAULT_BLOOD_VOLUME, true];
};
} forEach GET_TOURNIQUETS(_patient);
_patient setVariable [VAR_TOURNIQUET, DEFAULT_TOURNIQUET_VALUES, true];
-_patient setVariable [QGVAR(occludedMedications), nil, true];
+_patient setVariable [QEGVAR(medical,occludedMedications), nil, true];
// Wounds and Injuries
_patient setVariable [VAR_OPEN_WOUNDS, createHashMap, true];
diff --git a/addons/medical_treatment/functions/fnc_ivBag.sqf b/addons/medical_treatment/functions/fnc_ivBag.sqf
index a856afec32a..e2ed2ad7165 100644
--- a/addons/medical_treatment/functions/fnc_ivBag.sqf
+++ b/addons/medical_treatment/functions/fnc_ivBag.sqf
@@ -8,21 +8,21 @@
* 1: Patient
* 2: Body Part
* 3: Treatment
- * 4: Item User (not used)
+ * 4: Item User
* 5: Used Item
*
* Return Value:
* None
*
* Example:
- * [player, cursorObject, "RightArm", "BloodIV", objNull, "ACE_bloodIV"] call ace_medical_treatment_fnc_ivBag
+ * [player, cursorObject, "RightArm", "BloodIV", player, "ACE_bloodIV"] call ace_medical_treatment_fnc_ivBag
*
* Public: No
*/
-params ["_medic", "_patient", "_bodyPart", "_classname", "", "_usedItem"];
+params ["_medic", "_patient", "_bodyPart", "_classname", "_itemUser", "_usedItem"];
[_patient, _usedItem] call FUNC(addToTriageCard);
[_patient, "activity", LSTRING(Activity_gaveIV), [[_medic, false, true] call EFUNC(common,getName)]] call FUNC(addToLog);
-[QGVAR(ivBagLocal), [_patient, _bodyPart, _classname, _medic], _patient] call CBA_fnc_targetEvent;
+[QGVAR(ivBagLocal), [_patient, _bodyPart, _classname, _medic, _itemUser, _usedItem], _patient] call CBA_fnc_targetEvent;
diff --git a/addons/medical_treatment/functions/fnc_ivBagLocal.sqf b/addons/medical_treatment/functions/fnc_ivBagLocal.sqf
index a5ef089f12f..f40cdd5189c 100644
--- a/addons/medical_treatment/functions/fnc_ivBagLocal.sqf
+++ b/addons/medical_treatment/functions/fnc_ivBagLocal.sqf
@@ -8,30 +8,26 @@
* 1: Body Part
* 2: Treatment
* 3: Medic
+ * 4: Item User
+ * 5: Used item
*
* Return Value:
* None
*
* Example:
- * [player, "RightArm", "BloodIV", player] call ace_medical_treatment_fnc_ivBagLocal
+ * [player, "RightArm", "BloodIV", player, player, "ACE_BloodIV"] call ace_medical_treatment_fnc_ivBagLocal
*
* Public: No
*/
-params ["_patient", "_bodyPart", "_classname", "_medic"];
+params ["_patient", "_bodyPart", "_treatment", "_medic", "_itemUser", "_item"];
// Exit if patient has max blood volume
private _bloodVolume = GET_BLOOD_VOLUME(_patient);
if (_bloodVolume >= DEFAULT_BLOOD_VOLUME) exitWith {
// Return the bag if patient is topped up on blood
- if (_medic call EFUNC(common,isPlayer)) then {
- private _receiver = [_patient, _medic, _medic] select GVAR(allowSharedEquipment);
- [_receiver, _classname] call EFUNC(common,addToInventory);
- } else {
- // If the medic is AI, only return bag if enabled
- if (missionNamespace getVariable [QEGVAR(medical_ai,requireItems), 0] > 0) then {
- [_medic, _classname] call EFUNC(common,addToInventory);
- };
+ if (_medic call EFUNC(common,isPlayer) || {missionNamespace getVariable [QEGVAR(medical_ai,requireItems), 0] > 0}) then {
+ [_itemUser, _item] call EFUNC(common,addToInventory);
};
};
@@ -39,7 +35,7 @@ private _partIndex = ALL_BODY_PARTS find toLowerANSI _bodyPart;
// Get attributes for the used IV
private _defaultConfig = configFile >> QUOTE(ADDON) >> "IV";
-private _ivConfig = _defaultConfig >> _classname;
+private _ivConfig = _defaultConfig >> _treatment;
private _volume = GET_NUMBER(_ivConfig >> "volume",getNumber (_defaultConfig >> "volume"));
private _type = GET_STRING(_ivConfig >> "type",getText (_defaultConfig >> "type"));
@@ -47,5 +43,5 @@ private _rateCoef = GET_NUMBER(_ivConfig >> "rateCoef",getNumber (_defaultConfig
// Add IV bag to patient's ivBags array
private _ivBags = _patient getVariable [QEGVAR(medical,ivBags), []];
-_ivBags pushBack [_volume, _type, _partIndex, _classname, _rateCoef];
+_ivBags pushBack [_volume, _type, _partIndex, _treatment, _rateCoef, _item];
_patient setVariable [QEGVAR(medical,ivBags), _ivBags, true];
diff --git a/addons/medical_treatment/functions/fnc_loadUnit.sqf b/addons/medical_treatment/functions/fnc_loadUnit.sqf
index edb9cbe0621..2632c6b9fad 100644
--- a/addons/medical_treatment/functions/fnc_loadUnit.sqf
+++ b/addons/medical_treatment/functions/fnc_loadUnit.sqf
@@ -24,11 +24,11 @@ if (_patient call EFUNC(common,isAwake)) exitWith {
[[LSTRING(CanNotLoad), _patient call EFUNC(common,getName)]] call EFUNC(common,displayTextStructured);
};
-if (_patient call EFUNC(medical_status,isBeingCarried)) then {
+if (_patient call EFUNC(common,isBeingCarried)) then {
[_medic, _patient] call EFUNC(dragging,dropObject_carry);
};
-if (_patient call EFUNC(medical_status,isBeingDragged)) then {
+if (_patient call EFUNC(common,isBeingDragged)) then {
[_medic, _patient] call EFUNC(dragging,dropObject);
};
diff --git a/addons/medical_treatment/functions/fnc_tourniquetRemove.sqf b/addons/medical_treatment/functions/fnc_tourniquetRemove.sqf
index 80dab5094cf..627d7ecd534 100644
--- a/addons/medical_treatment/functions/fnc_tourniquetRemove.sqf
+++ b/addons/medical_treatment/functions/fnc_tourniquetRemove.sqf
@@ -42,7 +42,9 @@ TRACE_1("clearConditionCaches: tourniquetRemove",_nearPlayers);
// Add tourniquet item to medic or patient
if (_medic call EFUNC(common,isPlayer)) then {
- private _receiver = [_patient, _medic, _medic] select GVAR(allowSharedEquipment);
+ private _allowSharedEquipment = GVAR(allowSharedEquipment);
+ if (_allowSharedEquipment == 3) then { _allowSharedEquipment = [0, 1] select ([_medic] call FUNC(isMedic)) };
+ private _receiver = [_patient, _medic, _medic] select _allowSharedEquipment;
[_receiver, "ACE_tourniquet"] call EFUNC(common,addToInventory);
} else {
// If the medic is AI, only return tourniquet if enabled
diff --git a/addons/medical_treatment/functions/fnc_treatment.sqf b/addons/medical_treatment/functions/fnc_treatment.sqf
index 4a28212966d..8e36448ac6a 100644
--- a/addons/medical_treatment/functions/fnc_treatment.sqf
+++ b/addons/medical_treatment/functions/fnc_treatment.sqf
@@ -49,7 +49,7 @@ if (_treatmentTime == 0) exitWith {false};
private _userAndItem = if (GET_NUMBER_ENTRY(_config >> "consumeItem") == 1) then {
[_medic, _patient, getArray (_config >> "items")] call FUNC(useItem);
} else {
- [objNull, ""]; // Treatment does not require items to be consumed
+ [objNull, "", false]; // Treatment does not require items to be consumed
};
_userAndItem params ["_itemUser", "_usedItem", "_createLitter"];
diff --git a/addons/medical_treatment/functions/fnc_useItem.sqf b/addons/medical_treatment/functions/fnc_useItem.sqf
index 33ac9f98f42..7f9299872c9 100644
--- a/addons/medical_treatment/functions/fnc_useItem.sqf
+++ b/addons/medical_treatment/functions/fnc_useItem.sqf
@@ -10,7 +10,7 @@
* 2: Items
*
* Return Value:
- * User and Item and Litter Created
+ * User and Item and Litter Created
*
* Example:
* [player, cursorObject, ["bandage"]] call ace_medical_treatment_fnc_useItem
@@ -21,12 +21,14 @@
params ["_medic", "_patient", "_items"];
if (_medic isEqualTo player && {!isNull findDisplay 312}) exitWith {
- [_medic, _items select 0]
+ [_medic, _items select 0, false] // return
};
scopeName "Main";
-private _useOrder = [[_patient, _medic], [_medic, _patient], [_medic]] select GVAR(allowSharedEquipment);
+private _allowSharedEquipment = GVAR(allowSharedEquipment);
+if (_allowSharedEquipment == 3) then { _allowSharedEquipment = [0, 1] select ([_medic] call FUNC(isMedic)) };
+private _useOrder = [[_patient, _medic], [_medic, _patient], [_medic]] select _allowSharedEquipment;
{
private _unit = _x;
@@ -40,24 +42,24 @@ private _useOrder = [[_patient, _medic], [_medic, _patient], [_medic]] select GV
switch (true) do {
case (_x in _vehicleItems): {
_unitVehicle addItemCargoGlobal [_x, -1];
- [_unit, _x, false] breakOut "Main";
+ [_unit, _x, false] breakOut "Main"; // return
};
case (_x in _vehicleMagazines): {
[_unitVehicle, _x] call EFUNC(common,adjustMagazineAmmo);
- [_unit, _x, false] breakOut "Main";
+ [_unit, _x, false] breakOut "Main"; // return
};
case (_x in _unitItems): {
_unit removeItem _x;
- [_unit, _x, true] breakOut "Main";
+ [_unit, _x, true] breakOut "Main"; // return
};
case (_x in _unitMagazines): {
private _magsStart = count magazines _unit;
[_unit, _x] call EFUNC(common,adjustMagazineAmmo);
private _magsEnd = count magazines _unit;
- [_unit, _x, (_magsEnd < _magsStart)] breakOut "Main";
+ [_unit, _x, (_magsEnd < _magsStart)] breakOut "Main"; // return
};
};
} forEach _items;
} forEach _useOrder;
-[objNull, "", false]
+[objNull, "", false] // return
diff --git a/addons/medical_treatment/initSettings.inc.sqf b/addons/medical_treatment/initSettings.inc.sqf
index 3f30f514faa..b5297e7f34b 100644
--- a/addons/medical_treatment/initSettings.inc.sqf
+++ b/addons/medical_treatment/initSettings.inc.sqf
@@ -85,7 +85,7 @@
"LIST",
[LSTRING(AllowSharedEquipment_DisplayName), LSTRING(AllowSharedEquipment_Description)],
LSTRING(Category),
- [[0, 1, 2], [LSTRING(AllowSharedEquipment_PriorityPatient), LSTRING(AllowSharedEquipment_PriorityMedic), ELSTRING(common,No)], 0],
+ [[0, 1, 3, 2], [LSTRING(AllowSharedEquipment_PriorityPatient), LSTRING(AllowSharedEquipment_PriorityMedic), LSTRING(AllowSharedEquipment_PriorityMedicIfMedic), ELSTRING(common,No)], 0],
true
] call CBA_fnc_addSetting;
diff --git a/addons/medical_treatment/stringtable.xml b/addons/medical_treatment/stringtable.xml
index cd6eb039837..875e674f529 100644
--- a/addons/medical_treatment/stringtable.xml
+++ b/addons/medical_treatment/stringtable.xml
@@ -299,7 +299,7 @@
Перелить пакет физраствора (1000 мл)
Kochsalzlösung IV (1000ml)
IV 생리식염수 수혈 (1000ml)
- 生理食塩水 IV (1000ml) を投与
+ 生理食塩液 IV (1000ml) を投与
注射生理食鹽水 (1000毫升)
静脉注射生理盐水(1000毫升)
Serum IV (1000ml) Ver
@@ -316,7 +316,7 @@
Перелить пакет физраствора (250 мл)
Kochsalzlösung IV (250ml)
IV 생리식염수 수혈 (250ml)
- 生理食塩水 IV (250ml) を投与
+ 生理食塩液 IV (250ml) を投与
注射生理食鹽水 (250毫升)
静脉注射生理盐水(250毫升)
Serum IV (250ml) Ver
@@ -333,7 +333,7 @@
Перелить пакет физраствора (500 мл)
Kochsalzlösung IV (500ml)
IV 생리식염수 수혈 (500ml)
- 生理食塩水 IV (500ml) を投与
+ 生理食塩液 IV (500ml) を投与
注射生理食鹽水 (500毫升)
静脉注射生理盐水(500毫升)
Serum IV (500ml) Ver
@@ -447,7 +447,7 @@
%1 провёл переливание
%1 hat eine Infusion verabreicht
%1 (이)가 IV를 실시했다
- %1 がIVを投与した
+ %1 が輸液をIV(静脈注射)で投与した
%1 已經給予靜脈注射液
%1 已进行静脉注射
% 1 IV verildi
@@ -745,7 +745,7 @@
Zezwalaj na pakowanie nieprzytomnych osób do worka na ciało.
Permite colocar um paciente inconsciente em um saco de cadáver.
Разрешает упаковывать пациентов без сознания в мешки для трупов.
- Aktiviert, Bewusstlose in Leichensack zu legen.
+ Erlaubt es, Bewusstlose in Leichensäcke zu legen.
기절 상태의 인원을 시체 운반용 부대에 옮겨 담을 수 있는 지를 정합니다.
無意識状態のプレイヤーを遺体袋へ入れることが出来る様にします。
能够将昏迷的伤员装入尸袋中。
@@ -758,7 +758,7 @@
Nieprzytomni w worku na ciało
Permitir inconscientes em sacos de cadáver
Упаковка без сознания в мешки для трупов
- Erlaube Benutzung des Leichensackes mit bewusstlosen Personen
+ Erlaube Bewusstlose in Leichensäcken zu legen
기절 인원 시체 운반용 부대에 옮기기
無意識者の遺体袋への収容許可
允许昏迷者装入尸袋
@@ -842,7 +842,7 @@
Позволяет использовать внутривенные переливания на себе
Erlaube Bluttransfusionen an sich selbst zu benutzen
수액용기를 사용자 본인에게 쓸 수 있는지를 정합니다.
- 自らに対して IV 輸液を可能にします。
+ 自らに対しての輸液IV(静脈注射)を可能にします。
啟用是否能對自己注射點滴
启用是否能够自我静脉输液
@@ -857,7 +857,7 @@
Внутривенное переливание на себе
Eigennutzung von Bluttransfusionen
수액용기 자가 사용
- 自己 IV 輸液
+ 輸液の自己投与
自我注射點滴
自我静脉输液
@@ -966,11 +966,19 @@
Сначала медикаменты врача
Ausrüstung des Sanitäters zuerst
치료자의 의료물자 먼저 사용
- 救護者の装備を優先
+ 救護者装備を優先
優先使用醫療兵的醫療物資
优先消耗医疗兵装备
İlk Sıhhiyenin Ekipmanı
+
+ Medic's Equipment First [If medic role]
+ Сначала медикаменты врача [Если медик]
+ Équipement de l'infirmier d'abord [Si l'infirmier joue un rôle].
+ Ausrüstung des Sanitäters zuerst [Wenn Sanitäter]
+ 救護者装備を優先 [衛生兵の場合]
+ 치료자의 의료물자 먼저 사용 [의무병일 경우]
+
Patient's Equipment First
Prvně pacientovo vybavení
@@ -982,7 +990,7 @@
Сначала медикаменты пациента
Ausrüstung des Patienten zuerst
환자의 의료물자 먼저 사용
- 患者の装備を優先
+ 患者装備を優先
優先使用患者的醫療物資
优先消耗伤员装备
Önce Hastanın Ekipmanı
@@ -1651,7 +1659,7 @@
Пакет крови для возмещения объёма потерянной крови
Blut IV, um den Bluthaushalt des Patienten wiederherzustellen.
혈액 IV, 환자에게 혈액을 공급합니다.
- 血液 IVは患者の血液量を回復させます。
+ 血液静脈注射(IV)は患者の血液量を回復させます。
血液, 用於補充傷者流失的血液
血液,用于补充伤者流失的血液
Kan IV, bir hastanın kanını geri enjekte etmek için
@@ -1667,8 +1675,8 @@
Sangue O- , utilizado em casos raros para rapidamente repor o sangue. Uso habitual ocorre durante o transporte ou em estações de tratamento.
Кровь I группы, резус-отрицательная, применяется по жизненным показаниям для возмещения объема потерянной крови на догоспитальном этапе оказания медицинской помощи.
O Negative Blutinfusion wird nur in seltenen Fällen verwendet, um den Bluthaushalt des Patienten zu ergänzen. Wird in der Regel wärend der Transportphase durchgeführt.
- O형 혈액 투여는 매우 엄격하고 드문 혈액 보급의 경우에 쓰이는데 주로 치료의 운송단계에서 사용됩니다.
- 血液型O-の輸血は、厳密かつ稀な事象において行われる。通常、医療の搬送段階で血液を補充するために使用される。
+ O Rh- 혈액은 일반적으로 의료 후송 단계에서 혈액 공급을 보충하기 위한 엄격하고 드물게 사용되는 혈액입니다.
+ 血液型O-の血液は通常、搬送中の医療現場で血液を補充するために厳密かつ稀な状況で使用される。
O型陰性注射用血液, 在緊急情況時使用, 用於補充傷者流失的血液
O型负值注射用血液,在紧急情况时使用, 用于补充伤者流失的血液
Nullás vércsoportú, Rh-negatív vér-infúzió, melyet kritikus és ritka helyzetekben vérutánpótlásra használnak, jellemzően az orvosi ellátás szállítási fázisa közben.
@@ -2554,7 +2562,7 @@
Konwertuj przedmioty z vanili
Converter itens vanilla
Преобразовывать ванильные медикаменты
- Standard Arma-Equipment in ACE-Items umwandeln
+ Umwandlung von Arma-Equipment
바닐라 아이템 전환
バニラアイテムの変換
轉換原版物品
@@ -2907,7 +2915,7 @@
Введение аденозина...
Adenosin injizieren...
아데노신 주사 중...
- アドネシンを投与しています・・・
+ アデノシンを注射しています・・・
腺苷注射中...
正在注射腺苷...
Adenosin Enjekte Ediliyor...
@@ -2923,7 +2931,7 @@
Введение атропина...
Atropin injizieren...
아트로핀 주사 중...
- アトロピンを投与しています・・・
+ アトロピンを注射しています・・・
阿托品注射中 ...
正在注射阿托品...
Atropin Enjekte Ediliyor...
@@ -2940,7 +2948,7 @@
Введение адреналина...
Epinephrin injizieren...
에피네프린 주사 중...
- アドレナリンを投与しています・・・
+ アドレナリンを注射しています・・・
腎上腺素注射中...
正在注射肾上腺素...
Epinefrin Enjekte Ediliyor...
@@ -2957,7 +2965,7 @@
Введение морфина...
Morphin injizieren...
모르핀 주사 중...
- モルヒネを投与しています・・・
+ モルヒネを注射しています・・・
嗎啡注射中...
正在注射吗啡...
Morfin Enjekte Ediliyor ...
@@ -3081,6 +3089,7 @@
Controls where Adenosine can be used.
Контролирует, где можно использовать Аденозин.
+ Legt fest, wo Adenosin benutzt werden kann.
アデノシンが使える場所を制御します。
아데노신을 사용할 수 있는 장소를 정합니다.
Contrôle où l'Adénosine peut être utilisée.
@@ -3088,6 +3097,7 @@
Locations Adenosine
Места использования Аденозина
+ Orte für Adenosin
アデノシンの使用可能な場所
아데노신 사용 장소
Lieux d'utilisation de l'adénosine
@@ -3101,7 +3111,7 @@
Kontroluje, gdzie można stosować epinefrynę.
Controla onde Epinefrina pode ser utilizada.
Контролирует, где можно использовать Адреналин.
- Legt fest, wo Epinephrin genutzt werden kann.
+ Legt fest, wo Epinephrin benutzt werden kann.
에피네프린을 사용할 수 있는 장소를 정합니다.
アドレナリンが使える場所を制御します。
控制何處能使用腎上腺素
@@ -3132,9 +3142,9 @@
Kontroluje w jakich miejscach można robić transfuzje IV.
Controla onde as transfusões IV podem ser realizadas.
Контролирует, где можно использовать внутревенное переливание.
- Kontrolliert, wo IV-Transfusionen durchgeführt werden können.
+ Legt fest, wo IV-Transfusionen verabreicht werden können.
수액용기를 사용할 수 있는 장소를 정합니다.
- IV 輸液を行える場所を制御します。
+ 輸液IV(静脈注射)を行える場所を制御します。
控制何地可以静脉输液
@@ -3145,14 +3155,15 @@
Miejsca do transfuzji IV
Locais para transfusão IV
Места внутривенного переливания
- Orte an denen IV-Transfusionen angelegt werden können
+ Orte für IV-Transfusionen
수액용기 사용 장소
- IV輸液の可能な場所
+ 輸液IV(静脈注射)の可能な場所
静脉输液地点
Controls where Morphine can be used.
Контролирует, где можно использовать Морфин.
+ Legt fest, wo Morphin benutzt werden kann.
モルヒネが使える場所を制御します。
모르핀을 사용할 수 있는 장소를 정합니다.
Contrôle où la morphine peut être utilisée.
@@ -3160,6 +3171,7 @@
Locations Morphine
Места использования Морфина
+ Orte für Morphin
モルヒネの使用可能な場所
모르핀 사용 장소
Lieux d'utilisation de la morphine
@@ -3173,7 +3185,7 @@
Kontroluje, gdzie można korzystać z apteczek osobistych.
Controla onde o KPS pode ser utilizado.
Контролирует, где можно использовать Аптечку.
- Kontrolliert, wo ein Erste-Hilfe-Set benutzt werden kann.
+ Legt fest, wo ein Erste-Hilfe-Set benutzt werden kann.
개인응급키트을 사용할 수 있는 장소를 정합니다.
PAKが使える場所を制御します。
控制何處能使用個人急救包
@@ -3200,6 +3212,7 @@
Controls where Splints can be used.
Контролирует, где можно использовать шины.
+ Legt fest, wo eine Schiene benutzt werden kann.
添え木が使える場所を制御します。
부목을 사용할 수 있는 장소를 정합니다.
Contrôle l'endroit où les attelles peuvent être utilisées.
@@ -3207,6 +3220,7 @@
Locations Splint
Места наложения шины
+ Orte für Schiene
添え木の使用可能な場所
부목 사용 장소
Emplacement des attelles
@@ -3220,7 +3234,7 @@
Kontroluje, gdzie można użyć Zestawu Chirurgicznego.
Controle onde o Kit Cirúrgico pode ser utilizado.
Контролирует, где можно использовать Хирургический набор
- Legt fest, wo ein Operations-Set genutzt werden kann.
+ Legt fest, wo ein Operations-Set benutzt werden kann.
봉합 키트를 사용할 수 있는 장소를 정합니다.
手術キットが使える場所を制御します。
控制何處能使用手術包
@@ -3293,6 +3307,7 @@
Training level required to use Adenosine.
Уровень подготовки, необходимый для использования Аденозина
+ 'Fähigkeiten-Level', das benötigt wird, um Adenosin zu benutzen.
アデノシンの使用に必要な医療スキルのレベルを設定します。
아데노신을 사용하는데 필요한 등급을 정합니다.
Niveau de formation requis pour utiliser l'Adénosine.
@@ -3300,6 +3315,7 @@
Allow Adenosine
Доступ к Аденозину
+ Erlaube Adenosin
アデノシンの許可
아데노신 사용 허가
Autoriser l'adénosine
@@ -3313,7 +3329,7 @@
Poziom wyszkolenia wymagany do korzystania z epinefryny.
É necessária uma qualificação médica para usar epinefrina.
Уровень подготовки, необходимый для использования Адреналина.
- 'Fähigkeiten-Level', das benötigt wird, um Epinephrin zu nutzen.
+ 'Fähigkeiten-Level', das benötigt wird, um Epinephrin zu benutzen.
에피네프린을 사용하는데 필요한 등급을 정합니다.
アドレナリンの使用に必要な医療スキルのレベルを設定します。
要受過何種程度的醫療訓練才可以使用腎上腺素
@@ -3347,7 +3363,7 @@
Уровень навыка, требуемый для осуществления внутривенного переливания.
'Fähigkeiten-Level', das benötigt wird, um Blut zu transfundieren.
수액용기를 사용하는데 필요한 등급을 정합니다.
- IV 輸液を行うのに必要な医療スキルのレベルを設定します。
+ 輸液IV(静脈注射)を行うのに必要な医療スキルのレベルを設定します。
要有何種醫療水準才可注射點滴。
静脉输液所需的医疗水平。
@@ -3362,13 +3378,14 @@
Доступ к внутривенному переливанию
Erlaube Bluttransfusionen
수액용기 사용 허가
- IV 輸液の制限
+ 輸液IV(静脈注射)の制限
允許操作點滴
允许静脉输液
Training level required to use Morphine.
Уровень подготовки, необходимый для использования Морфина.
+ 'Fähigkeiten-Level', das benötigt wird, um Morphin zu benutzen.
モルヒネの使用に必要な医療スキルのレベルを設定します。
모르핀을 사용하는데 필요한 등급을 정합니다.
Niveau de formation requis pour l'utilisation de la morphine.
@@ -3376,6 +3393,7 @@
Allow Morphine
Доступ к Морфину
+ Erlaube Morphin
モルヒネの許可
모르핀 사용 허가
Autoriser la morphine
@@ -3389,7 +3407,7 @@
Poziom wyszkolenia wymagany do korzystania z apteczek osobistych.
É necessária uma qualificação médica para usar KPS
Уровень подготовки, необходимый для использования Аптечки.
- 'Fähigkeiten-Level', das benötigt wird, um ein Erste-Hilfe-Set zu nutzen.
+ 'Fähigkeiten-Level', das benötigt wird, um ein Erste-Hilfe-Set zu benutzen.
개인응급키트을 사용하는 데 필요한 등급을 정합니다.
PAKの使用に必要な医療スキルのレベルを設定します。
要受過何種程度的醫療訓練才可以使用個人急救包
@@ -3416,6 +3434,7 @@
Training level required to use Splint.
Уровень подготовки, необходимый для использования шины.
+ 'Fähigkeiten-Level', das benötigt wird, um eine Schiene zu benutzen.
添え木の使用に必要な医療スキルのレベルを設定します。
부목을 사용하는데 필요한 등급을 정합니다.
Niveau de formation requis pour l'utilisation de l'attelle.
@@ -3423,6 +3442,7 @@
Allow Splint
Доступ к наложению шины
+ Erlaube Schiene
添え木の許可
부목 사용 허가
Accès aux attelles
@@ -3436,7 +3456,7 @@
Poziom wyszkolenia wymagany do korzystania z Zestawu Chirurgicznego.
É necessária uma qualificação médica para usar Kit Cirúrgico
Уровень медицинской подготовки, необходимый для использования Хирургического набора.
- 'Fähigkeiten-Level', das benötigt wird um ein Operations-Set zu nutzen.
+ 'Fähigkeiten-Level', das benötigt wird um ein Operations-Set zu benutzen.
봉합 키트를 사용하는데 필요한 등급을 정합니다.
手術キットの使用に必要な医療スキルのレベルを設定します。
要受過多少程度的醫療訓練才能使用手術包。
@@ -3594,12 +3614,15 @@
Makes Check Pulse action give a numerical value based on setting
Заставляет действие контрольного импульса выдавать числовое значение, основанное на настройке
+ Die Aktion "Puls überprüfen" liefert einen numerischen Wert abhängig von der Einstellung
脈拍の確認アクションから得られる情報が数値化されるようになる医療レベルを設定します
설정에 따라 맥박 확인 행동을 통해 숫자로 표시된 값을 제공합니다.
+ L'action de vérification du pouls fournit une valeur numérique, en fonction de vos paramètres.
Numerical Pulse
Числовое значение пульса
+ Numerischer Puls
脈拍の数値化
맥박 수치
Pouls numérique
@@ -3772,7 +3795,7 @@
Дополнительный препарат, применяемый при возмещении объема крови.
Volumenerweiterungsmittel (künstliches Blutvolumen)
혈액량을 늘리기위한 보조수단 입니다.
- 血液量の増加を補助します。
+ 血液量を増加させるための成分が含まれている。
可快速得到血液補充
可快速得到血液补充
Egy térfogatnövelő vérkiegészítmény.
@@ -3788,7 +3811,7 @@
Дополнительный препарат, применяемый при возмещении объема крови.
Volumenerweiterungsmittel (künstliches Blutvolumen)
혈액량을 늘리기위한 보조수단 입니다.
- 血液量の増加を補助します。
+ 血液量を増加させるための成分が含まれている。
可快速得到血液補充
可快速得到血液补充
Egy térfogatnövelő vérkiegészítmény.
@@ -3887,7 +3910,7 @@
Физраствор для в/в вливания (1000 мл)
Kochsalzlösung (1000ml)
생리식염수 IV (1000ml)
- 生理食塩水 IV (1000ml)
+ 生理食塩液 IV (1000ml)
點滴 (食鹽水 1000毫升)
生理盐水(1000毫升)
Serum IV (1000ml)
@@ -3904,7 +3927,7 @@
Физраствор для в/в вливания (250 мл)
Kochsalzlösung (250ml)
생리식염수 IV (250ml)
- 生理食塩水 IV (250ml)
+ 生理食塩液 IV (250ml)
點滴 (食鹽水 250毫升)
生理盐水(250毫升)
Serum IV (250ml)
@@ -3921,7 +3944,7 @@
Физраствор для в/в вливания (500 мл)
Kochsalzlösung (500ml)
생리식염수 IV (500ml)
- 生理食塩水 IV (500ml)
+ 生理食塩液 IV (500ml)
點滴 (食鹽水 500毫升)
生理盐水(500毫升)
Serum IV (500ml)
@@ -3938,7 +3961,7 @@
Пакет физраствора для возмещения объёма потерянной крови
Kochsalzlösung, ein medizinisches Volumenersatzmittel
생리식염수, 환자의 혈액량을 보충할때 쓰입니다
- 生理食塩水 IVは患者の血液量を回復させます。
+ 生理食塩液静脈注射(IV)は患者の血液量を回復させます。
生理食鹽水, 用於恢復傷者血液
生理盐水,用于恢复伤者血液
0,9%-os sósvíz-infúzió, a páciens vérmennyiségének helyreállítására
@@ -3999,7 +4022,7 @@
Нет капельницы
Kein IV
수혈 없음
- IV なし
+ IV(静脈注射) なし
No pain
@@ -4290,7 +4313,7 @@
Перелить кровь
Bluttransfusion
혈액 수혈
- 血液を投与
+ 血液を輸液
輸血液
输入血液
Kan Ver
@@ -4307,7 +4330,7 @@
Перелить плазму
Plasmatransfusion
혈장 수혈
- 血漿を投与
+ 血漿を輸液
輸血漿
输入血浆
Plasma Ver
@@ -4324,7 +4347,7 @@
Перелить физраствор
Salzlösungstransfusion
생리식염수 수혈
- 生理食塩水を投与
+ 生理食塩液を輸液
注射生理食鹽水
输入生理盐水
Serum Ver
@@ -4341,7 +4364,7 @@
Переливание крови...
Bluttransfusion...
혈액 수혈 중...
- 血液を投与しています・・・
+ 血液を輸液しています・・・
輸血液中 ...
正在输入血液...
Kan Veriliyor...
@@ -4358,7 +4381,7 @@
Переливание плазмы...
Plasmatransfusion...
혈장 수혈 중...
- 血漿を投与しています・・・
+ 血漿を輸液しています・・・
輸血漿中 ...
正在输入血浆...
Plasma Veriliyor...
@@ -4375,7 +4398,7 @@
Переливание физраствора...
Salzlösungtransfusion...
생리식염수 수혈 중...
- 生理食塩水を投与しています・・・
+ 生理食塩液を輸液しています・・・
施打生理食鹽水中 ...
正在输入生理盐水...
Serum Veriliyor...
@@ -5207,7 +5230,7 @@
Принимается кровь [%1 мл]
Erhalte Blut IV [%1ml]
혈액 IV로 [%1ml] 수혈중
- 血液 IV [%1ml] を投与中
+ 血液をIV(静脈注射)投与中 [%1ml]
接收血液靜脈注射液中 [%1毫升]
正在接受血液静脉注射 [%1毫升]
Vér Infúzióra kötve [%1ml]
@@ -5223,7 +5246,7 @@
Принимается плазма [%1 мл]
Erhalte Plasma IV [%1ml]
혈장 IV로 [%1ml] 수혈중
- プラズマ IV [%1ml] を投与中
+ 血漿をIV(静脈注射)投与中 [%1ml]
接收血漿靜脈注射液中 [%1毫升]
正在接受血浆静脉注射 [%1毫升]
Plazma Infúzióra kötve [%1ml]
@@ -5239,7 +5262,7 @@
Принимается физраствор [%1 мл]
Erhalte Saline IV [%1ml]
생리식염수 IV로 [%1ml] 수혈중
- 生理食塩水 IV [%1ml] を投与中
+ 生理食塩液をIV(静脈注射)投与中 [%1ml]
接收生理鹽水靜脈注射液中 [%1毫升]
正在接受生理盐水静脉注射 [%1毫升]
Saline Infúzióra kötve [%1ml]
diff --git a/addons/microdagr/stringtable.xml b/addons/microdagr/stringtable.xml
index bb7ffb3eae6..614c6e08c8c 100644
--- a/addons/microdagr/stringtable.xml
+++ b/addons/microdagr/stringtable.xml
@@ -107,7 +107,7 @@
Preenchimento de mapa do MicroDAGR
Заполнение карты MicroDAGR
MicroDAGR-Kartenfüllung
- 마이크로DAGR - 지도채우기
+ 마이크로DAGR - 지도 정보량
MicroDAGR での地図情報
微型軍用GPS接收器地圖資料
微型军用 GPS 接收器地图资料
diff --git a/addons/missile_aim120/stringtable.xml b/addons/missile_aim120/stringtable.xml
index f5e9f63c50f..8b8a1e53180 100644
--- a/addons/missile_aim120/stringtable.xml
+++ b/addons/missile_aim120/stringtable.xml
@@ -4,54 +4,106 @@
AIM-120A [ACE]
AIM-120A [ACE]
+ AIM-120A [ACE]
+ AIM-120A [ACE]
+ AIM-120A [ACE]
+ AIM-120A 암람 [ACE]
1x AIM-120A [ACE]
1x AIM-120A [ACE]
+ 1x AIM-120A [ACE]
+ 1x AIM-120A [ACE]
+ 1x AIM-120A [ACE]
+ 1x AIM-120A 암람 [ACE]
AIM-120 [ACE]
AIM-120 [ACE]
+ AIM-120 [ACE]
+ AIM-120 [ACE]
+ AIM-120 [ACE]
+ AIM-120 암람 [ACE]
AIM-120C [ACE]
AIM-120C [ACE]
+ AIM-120C [ACE]
+ AIM-120C [ACE]
+ AIM-120C [ACE]
+ AIM-120C 암람 [ACE]
1x AIM-120C [ACE]
1x AIM-120C [ACE]
+ 1x AIM-120C [ACE]
+ 1x AIM-120C [ACE]
+ 1x AIM-120C [ACE]
+ 1x AIM-120C 암람 [ACE]
2x AIM-120C [ACE]
2x AIM-120C [ACE]
+ 2x AIM-120C [ACE]
+ 2x AIM-120C [ACE]
+ 2x AIM-120C [ACE]
+ 2x AIM-120C 암람 [ACE]
AIM-120D [ACE]
AIM-120D [ACE]
+ AIM-120D [ACE]
+ AIM-120D [ACE]
+ AIM-120D [ACE]
+ AIM-120D 암람 [ACE]
1x AIM-120D [ACE]
1x AIM-120D [ACE]
+ 1x AIM-120D [ACE]
+ 1x AIM-120D [ACE]
+ 1x AIM-120D [ACE]
+ 1x AIM-120D 암람 [ACE]
2x AIM-120D [ACE]
2x AIM-120D [ACE]
+ 2x AIM-120D [ACE]
+ 2x AIM-120D [ACE]
+ 2x AIM-120D [ACE]
+ 2x AIM-120D 암람 [ACE]
Direct
Direct
+ ダイレクト
+ Прямой
+ Direct
+ 다이렉트
Loft
Loft
+ ロフト
+ Сверху
+ Loft
+ 로프트
R-77 [ACE]
R-77 [ACE]
+ R-77 [ACE]
+ R-77 [ACE]
+ R-77 [ACE]
+ R-77 빔펠 [ACE]
1x R-77 [ACE]
1x R-77 [ACE]
+ 1x R-77 [ACE]
+ 1x R-77 [ACE]
+ 1x R-77 [ACE]
+ 1x R-77 빔펠 [ACE]
diff --git a/addons/missile_aim9/$PBOPREFIX$ b/addons/missile_aim9/$PBOPREFIX$
new file mode 100644
index 00000000000..c47abf3aae6
--- /dev/null
+++ b/addons/missile_aim9/$PBOPREFIX$
@@ -0,0 +1 @@
+z\ace\addons\missile_aim9
\ No newline at end of file
diff --git a/addons/missile_aim9/CfgAmmo.hpp b/addons/missile_aim9/CfgAmmo.hpp
new file mode 100644
index 00000000000..dae888c3561
--- /dev/null
+++ b/addons/missile_aim9/CfgAmmo.hpp
@@ -0,0 +1,91 @@
+class EGVAR(missileguidance,type_Sidewinder);
+class EGVAR(missileguidance,type_ASRAAM);
+class EGVAR(missileguidance,type_R73);
+class EGVAR(missileguidance,type_R74);
+class CfgAmmo {
+ class Missile_AA_04_F;
+ class GVAR(m): Missile_AA_04_F {
+ missileLockCone = 3; // caged lock
+ missileKeepLockedCone = 45;
+ missileLockMaxDistance = 5000;
+ missileLockMinDistance = 250;
+
+ author = "Dani (TCVM)";
+ maneuvrability = 0;
+
+ class ace_missileguidance: EGVAR(missileguidance,type_Sidewinder) {
+ enabled = 1;
+ };
+ };
+
+ class ammo_Missile_BIM9X;
+ class GVAR(x): ammo_Missile_BIM9X {
+ missileLockCone = 3; // caged lock
+ missileKeepLockedCone = 120;
+ missileLockMaxDistance = 5000;
+ missileLockMinDistance = 250;
+
+ author = "Dani (TCVM)";
+ maneuvrability = 0;
+
+ class ace_missileguidance: EGVAR(missileguidance,type_Sidewinder) {
+ enabled = 1;
+ pitchRate = 90;
+ yawRate = 90;
+ flareDistanceFilter = 50;
+ flareAngleFilter = 0.8; // can filter out flares that are >= flareAngleFilter to known target velocity
+ defaultNavigationType = "ZeroEffortMiss";
+ navigationTypes[] = { "ZeroEffortMiss" };
+ seekerAngle = 120;
+ seekerAccuracy = 0.95;
+ };
+ };
+
+ // AIM-132
+ class M_Air_AA;
+ class GVAR(aim132): M_Air_AA {
+ missileLockCone = 3; // caged lock
+ missileKeepLockedCone = 120;
+ missileLockMaxDistance = 8000;
+ missileLockMinDistance = 250;
+
+ author = "Dani (TCVM)";
+ maneuvrability = 0;
+
+ class ace_missileguidance: EGVAR(missileguidance,type_ASRAAM) {
+ enabled = 1;
+ };
+ };
+
+ // R-73
+ class ammo_Missile_AA_R73;
+ class GVAR(r73): ammo_Missile_AA_R73 {
+ missileLockCone = 3; // caged lock
+ missileKeepLockedCone = 40;
+ missileLockMaxDistance = 5000;
+ missileLockMinDistance = 250;
+
+ author = "Dani (TCVM)";
+ maneuvrability = 0;
+
+ class ace_missileguidance: EGVAR(missileguidance,type_Sidewinder) {
+ enabled = 1;
+ };
+ };
+
+ class Missile_AA_03_F;
+ class GVAR(r74): Missile_AA_03_F {
+ missileLockCone = 3; // caged lock
+ missileKeepLockedCone = 75;
+ missileLockMaxDistance = 8000;
+ missileLockMinDistance = 250;
+
+ author = "Dani (TCVM)";
+ maneuvrability = 0;
+
+ class ace_missileguidance: EGVAR(missileguidance,type_R74) {
+ enabled = 1;
+ };
+ };
+};
+
diff --git a/addons/missile_aim9/CfgMagazines.hpp b/addons/missile_aim9/CfgMagazines.hpp
new file mode 100644
index 00000000000..5fc12fcf106
--- /dev/null
+++ b/addons/missile_aim9/CfgMagazines.hpp
@@ -0,0 +1,153 @@
+class CfgMagazines {
+ class 2Rnd_Missile_AA_04_F;
+ class PylonRack_1Rnd_Missile_AA_04_F;
+ class PylonMissile_1Rnd_Missile_AA_04_F;
+
+ // AIM-9
+ class GVAR(2Rnd_Missile_9m): 2Rnd_Missile_AA_04_F {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(m_2x);
+ ammo = QGVAR(m);
+ };
+
+ class GVAR(PylonRack_1Rnd_Missile_9m): PylonRack_1Rnd_Missile_AA_04_F {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(m_1x);
+ ammo = QGVAR(m);
+ pylonWeapon = QGVAR(m);
+ };
+
+ class GVAR(PylonMissile_1Rnd_Missile_9m): PylonMissile_1Rnd_Missile_AA_04_F {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(m_1x);
+ ammo = QGVAR(m);
+ pylonWeapon = QGVAR(m);
+ };
+
+ class magazine_Missile_BIM9X_x1;
+ class PylonMissile_Missile_BIM9X_x1;
+ class PylonRack_Missile_BIM9X_x1;
+ class PylonRack_Missile_BIM9X_x2;
+
+ class GVAR(magazine_Missile_9x): magazine_Missile_BIM9X_x1 {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(x_1x);
+ ammo = QGVAR(x);
+ };
+
+ class GVAR(PylonMissile_Missile_9x): PylonMissile_Missile_BIM9X_x1 {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(x_1x);
+ ammo = QGVAR(x);
+ pylonWeapon = QGVAR(x);
+ };
+
+ class GVAR(PylonRack_Missile_9x): PylonRack_Missile_BIM9X_x1 {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(x_1x);
+ ammo = QGVAR(x);
+ pylonWeapon = QGVAR(x);
+ };
+
+ class GVAR(PylonRack_Missile_9x_2): PylonRack_Missile_BIM9X_x2 {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(x_2x);
+ ammo = QGVAR(x);
+ pylonWeapon = QGVAR(x);
+ };
+
+ // AIM-132
+ class 2Rnd_AAA_missiles;
+ class 2Rnd_AAA_missiles_MI02;
+ class 2Rnd_AAA_missiles_MI06;
+ class 4Rnd_AAA_missiles;
+ class 4Rnd_AAA_missiles_MI02;
+ class PylonRack_1Rnd_AAA_missiles;
+ class PylonMissile_1Rnd_AAA_missiles;
+
+ class GVAR(aim132_2Rnd): 2Rnd_AAA_missiles {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(aim132_2x);
+ ammo = QGVAR(aim132);
+ };
+
+ class GVAR(aim132_2Rnd_MI02): 2Rnd_AAA_missiles_MI02 {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(aim132_2x);
+ ammo = QGVAR(aim132);
+ };
+
+ class GVAR(aim132_2Rnd_MI06): 2Rnd_AAA_missiles_MI06 {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(aim132_2x);
+ ammo = QGVAR(aim132);
+ };
+
+ class GVAR(aim132_4Rnd): 4Rnd_AAA_missiles {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(aim132_4x);
+ ammo = QGVAR(aim132);
+ };
+
+ class GVAR(aim132_4Rnd_MI02): 4Rnd_AAA_missiles_MI02 {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(aim132_4x);
+ ammo = QGVAR(aim132);
+ };
+
+ class GVAR(PylonRack_1Rnd_aim132): PylonRack_1Rnd_AAA_missiles {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(aim132_1x);
+ ammo = QGVAR(aim132);
+ pylonWeapon = QGVAR(aim132);
+ };
+
+ class GVAR(PylonMissile_1Rnd_aim132): PylonMissile_1Rnd_AAA_missiles {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(aim132_1x);
+ ammo = QGVAR(aim132);
+ pylonWeapon = QGVAR(aim132);
+ };
+
+ // R-73
+ class PylonMissile_Missile_AA_R73_x1;
+ class magazine_Missile_AA_R73_x1;
+ class 2Rnd_Missile_AA_03_F;
+ class PylonRack_1Rnd_Missile_AA_03_F;
+ class PylonMissile_1Rnd_Missile_AA_03_F;
+
+ class GVAR(r73): magazine_Missile_AA_R73_x1 {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(r73_1x);
+ ammo = QGVAR(r73);
+ };
+
+ class GVAR(PylonMissile_Missile_R73_x1): PylonMissile_Missile_AA_R73_x1 {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(r73_1x);
+ ammo = QGVAR(r73);
+ pylonWeapon = QGVAR(r73);
+ };
+
+ class GVAR(2Rnd_Missile_R74): 2Rnd_Missile_AA_03_F {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(r74_2x);
+ ammo = QGVAR(r74);
+ };
+
+ // R-74 -- improved R-73, same missile in the way that an AIM-9X is the same as an AIM-9M
+ class GVAR(PylonRack_1Rnd_Missile_R74): PylonRack_1Rnd_Missile_AA_03_F {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(r74_1x);
+ ammo = QGVAR(r74);
+ pylonWeapon = QGVAR(r74);
+ };
+
+ class GVAR(PylonMissile_1Rnd_Missile_R74): PylonMissile_1Rnd_Missile_AA_03_F {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(r74_1x);
+ ammo = QGVAR(r74);
+ pylonWeapon = QGVAR(r74);
+ };
+};
+
diff --git a/addons/missile_aim9/CfgWeapons.hpp b/addons/missile_aim9/CfgWeapons.hpp
new file mode 100644
index 00000000000..cf69f9179c6
--- /dev/null
+++ b/addons/missile_aim9/CfgWeapons.hpp
@@ -0,0 +1,72 @@
+class CfgWeapons {
+ // AIM-9
+ class Missile_AA_04_Plane_CAS_01_F;
+ class GVAR(m): Missile_AA_04_Plane_CAS_01_F {
+ lockAcquire = 1; // auto lock
+
+ author = "Dani (TCVM)";
+ displayName = CSTRING(m);
+ weaponLockDelay = 0.5;
+ magazines[] = {QGVAR(2Rnd_Missile_9m), QGVAR(PylonRack_1Rnd_Missile_9m), QGVAR(PylonMissile_1Rnd_Missile_9m)};
+ };
+
+ class weapon_BIM9xLauncher;
+ class GVAR(x): weapon_BIM9xLauncher {
+ lockAcquire = 1; // auto lock
+
+ author = "Dani (TCVM)";
+ displayName = CSTRING(x);
+ weaponLockDelay = 0.5;
+ magazines[] = { QGVAR(magazine_Missile_9x), QGVAR(PylonMissile_Missile_9x), QGVAR(PylonRack_Missile_9x), QGVAR(PylonRack_Missile_9x_2) };
+ };
+
+ // ASRAAM
+ class missiles_ASRAAM;
+ class GVAR(aim132): missiles_ASRAAM {
+ lockAcquire = 1; // auto lock
+
+ author = "Dani (TCVM)";
+ displayName = CSTRING(aim132);
+ weaponLockDelay = 0.5;
+ magazines[] = {
+ QGVAR(aim132_2Rnd),
+ QGVAR(aim132_2Rnd_MI02),
+ QGVAR(aim132_2Rnd_MI06),
+ QGVAR(aim132_4Rnd),
+ QGVAR(aim132_4Rnd_MI02),
+ QGVAR(PylonRack_1Rnd_aim132),
+ QGVAR(PylonMissile_1Rnd_aim132)
+ };
+ };
+
+ // R-73
+ class weapon_R73Launcher;
+ class GVAR(r73): weapon_R73Launcher {
+ lockAcquire = 1; // auto lock
+
+ author = "Dani (TCVM)";
+ displayName = CSTRING(r73);
+ weaponLockDelay = 0.5;
+
+ magazines[] = {
+ QGVAR(r73),
+ QGVAR(PylonMissile_Missile_R73_x1)
+ };
+ };
+
+ class Missile_AA_03_Plane_CAS_02_F;
+ class GVAR(r74): Missile_AA_03_Plane_CAS_02_F {
+ lockAcquire = 1; // auto lock
+
+ author = "Dani (TCVM)";
+ displayName = CSTRING(r74);
+ weaponLockDelay = 0.5;
+
+ magazines[] = {
+ QGVAR(2Rnd_Missile_R74),
+ QGVAR(PylonRack_1Rnd_Missile_R74),
+ QGVAR(PylonMissile_1Rnd_Missile_R74)
+ };
+ };
+};
+
diff --git a/addons/missile_aim9/README.md b/addons/missile_aim9/README.md
new file mode 100644
index 00000000000..2f00568aa03
--- /dev/null
+++ b/addons/missile_aim9/README.md
@@ -0,0 +1,4 @@
+ace_missile_aim9
+===================
+
+Adds AIM-9 and R-73 AHR missiles
diff --git a/addons/missile_aim9/config.cpp b/addons/missile_aim9/config.cpp
new file mode 100644
index 00000000000..6b84b38bb70
--- /dev/null
+++ b/addons/missile_aim9/config.cpp
@@ -0,0 +1,20 @@
+#include "script_component.hpp"
+
+class CfgPatches {
+ class ADDON {
+ name = COMPONENT_NAME;
+ units[] = {};
+ weapons[] = {};
+ requiredVersion = REQUIRED_VERSION;
+ requiredAddons[] = {"ace_common","ace_missileguidance"};
+ author = ECSTRING(common,ACETeam);
+ authors[] = {"Dani (TCVM)"};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+ };
+};
+
+#include "CfgAmmo.hpp"
+#include "CfgMagazines.hpp"
+#include "CfgWeapons.hpp"
+
diff --git a/addons/missile_aim9/script_component.hpp b/addons/missile_aim9/script_component.hpp
new file mode 100644
index 00000000000..20bf611ad62
--- /dev/null
+++ b/addons/missile_aim9/script_component.hpp
@@ -0,0 +1,18 @@
+#define COMPONENT missile_aim9
+#define COMPONENT_BEAUTIFIED AIM-9
+#include "\z\ace\addons\main\script_mod.hpp"
+
+// #define DEBUG_MODE_FULL
+// #define DISABLE_COMPILE_CACHE
+// #define ENABLE_PERFORMANCE_COUNTERS
+
+#ifdef DEBUG_ENABLED_MISSILE_AIM9
+ #define DEBUG_MODE_FULL
+#endif
+
+#ifdef DEBUG_SETTINGS_MISSILE_AIM9
+ #define DEBUG_SETTINGS DEBUG_SETTINGS_MISSILE_AIM9
+#endif
+
+#include "\z\ace\addons\main\script_macros.hpp"
+
diff --git a/addons/missile_aim9/stringtable.xml b/addons/missile_aim9/stringtable.xml
new file mode 100644
index 00000000000..8f89ad11ce3
--- /dev/null
+++ b/addons/missile_aim9/stringtable.xml
@@ -0,0 +1,125 @@
+
+
+
+
+ AIM-9M [ACE]
+ AIM-9M [ACE]
+ AIM-9M [ACE]
+ AIM-9M [ACE]
+ AIM-9M [ACE]
+ AIM-9M 사이드와인더 [ACE]
+
+
+ AIM-9X [ACE]
+ AIM-9X [ACE]
+ AIM-9X [ACE]
+ AIM-9X [ACE]
+ AIM-9X [ACE]
+ AIM-9X 사이드와인더 [ACE]
+
+
+ AIM-132 [ACE]
+ AIM-132 [ACE]
+ AIM-132 [ACE]
+ AIM-132 [ACE]
+ AIM-132 [ACE]
+ AIM-132 아스람 [ACE]
+
+
+ R-73 [ACE]
+ R-73 [ACE]
+ R-73 [ACE]
+ R-73 [ACE]
+ R-73 [ACE]
+ R-73 빔펠 [ACE]
+
+
+ R-74 [ACE]
+ R-74 [ACE]
+ R-74 [ACE]
+ R-74 [ACE]
+ R-74 [ACE]
+ R-74 빔펠 [ACE]
+
+
+ 1x AIM-9M [ACE]
+ 1x AIM-9M [ACE]
+ 1x AIM-9M [ACE]
+ 1x AIM-9M [ACE]
+ 1x AIM-9M [ACE]
+ 1x AIM-9M 사이드와인더 [ACE]
+
+
+ 2x AIM-9M [ACE]
+ 2x AIM-9M [ACE]
+ 2x AIM-9M [ACE]
+ 2x AIM-9M [ACE]
+ 2x AIM-9M [ACE]
+ 2x AIM-9M 사이드와인더 [ACE]
+
+
+ 1x AIM-9X [ACE]
+ 1x AIM-9X [ACE]
+ 1x AIM-9X [ACE]
+ 1x AIM-9X [ACE]
+ 1x AIM-9X [ACE]
+ 1x AIM-9X 사이드와인더 [ACE]
+
+
+ 2x AIM-9X [ACE]
+ 2x AIM-9X [ACE]
+ 2x AIM-9X [ACE]
+ 2x AIM-9X [ACE]
+ 2x AIM-9X [ACE]
+ 2x AIM-9X 사이드와인더 [ACE]
+
+
+ 1x AIM-132 [ACE]
+ 1x AIM-132 [ACE]
+ 1x AIM-132 [ACE]
+ 1x AIM-132 [ACE]
+ 1x AIM-132 [ACE]
+ 1x AIM-132 아스람 [ACE]
+
+
+ 2x AIM-132 [ACE]
+ 2x AIM-132 [ACE]
+ 2x AIM-132 [ACE]
+ 2x AIM-132 [ACE]
+ 2x AIM-132 [ACE]
+ 2x AIM-132 아스람 [ACE]
+
+
+ 4x AIM-132 [ACE]
+ 4x AIM-132 [ACE]
+ 4x AIM-132 [ACE]
+ 4x AIM-132 [ACE]
+ 4x AIM-132 [ACE]
+ 4x AIM-132 아스람 [ACE]
+
+
+ 1x R-73 [ACE]
+ 1x R-73 [ACE]
+ 1x R-73 [ACE]
+ 1x R-73 [ACE]
+ 1x R-73 [ACE]
+ 1x R-73 빔펠 [ACE]
+
+
+ 1x R-74 [ACE]
+ 1x R-74 [ACE]
+ 1x R-74 [ACE]
+ 1x R-74 [ACE]
+ 1x R-74 [ACE]
+ 1x R-74 빔펠 [ACE]
+
+
+ 2x R-74 [ACE]
+ 2x R-74 [ACE]
+ 2x R-74 [ACE]
+ 2x R-74 [ACE]
+ 2x R-74 [ACE]
+ 2x R-74 빔펠 [ACE]
+
+
+
diff --git a/addons/missile_gbu/stringtable.xml b/addons/missile_gbu/stringtable.xml
index dd3e5f80eda..0e1bed9262a 100644
--- a/addons/missile_gbu/stringtable.xml
+++ b/addons/missile_gbu/stringtable.xml
@@ -7,7 +7,8 @@
GBU-12 [ACE]
GBU-12 [ACE]
GBU-12 [ACE]
- GBU-12 [ACE]
+ GBU-12 [ACE]
+ GBU-12 페이브웨이 II [ACE]
GBU-12 [ACE]
@@ -16,7 +17,8 @@
1x GBU-12 [ACE]
1x GBU-12 [ACE]
1x GBU-12 [ACE]
- 1x GBU-12 [ACE]
+ 1x GBU-12 [ACE]
+ 1x GBU-12 페이브웨이 II [ACE]
1x GBU-12 [ACE]
@@ -25,7 +27,8 @@
2x GBU-12 [ACE]
2x GBU-12 [ACE]
2x GBU-12 [ACE]
- 2x GBU-12 [ACE]
+ 2x GBU-12 [ACE]
+ 2x GBU-12 페이브웨이 II [ACE]
2x GBU-12 [ACE]
@@ -34,7 +37,8 @@
4x GBU-12 [ACE]
4x GBU-12 [ACE]
4x GBU-12 [ACE]
- 4x GBU-12 [ACE]
+ 4x GBU-12 [ACE]
+ 4x GBU-12 페이브웨이 II [ACE]
4x GBU-12 [ACE]
@@ -43,6 +47,7 @@
FAB-250M-54 [ACE]
FAB-250M-54 [ACE]
ФАБ-250M-54 [ACE]
+ FAB-250M-54 [ACE]
FAB-250M-54 [ACE]
FAB-250M-54 [ACE]
@@ -52,6 +57,7 @@
1x FAB-250M-54 [ACE]
1x FAB-250M-54 [ACE]
1x ФАБ-250M-54 [ACE]
+ 1x FAB-250M-54 [ACE]
1x FAB-250M-54 [ACE]
1x FAB-250M-54 [ACE]
@@ -61,6 +67,7 @@
2x FAB-250M-54 [ACE]
2x FAB-250M-54 [ACE]
2x ФАБ-250M-54 [ACE]
+ 2x FAB-250M-54 [ACE]
2x FAB-250M-54 [ACE]
2x FAB-250M-54 [ACE]
diff --git a/addons/missile_hud/functions/fnc_getCurrentWeapon.sqf b/addons/missile_hud/functions/fnc_getCurrentWeapon.sqf
index 64984507af2..3629b318c28 100644
--- a/addons/missile_hud/functions/fnc_getCurrentWeapon.sqf
+++ b/addons/missile_hud/functions/fnc_getCurrentWeapon.sqf
@@ -18,7 +18,7 @@
*/
params ["_unit", "_vehicle", "_turretPath"];
-TRACE_2("registerElement",_condition,_generator);
+TRACE_3("getCurrentWeapon",_unit,_vehicle,_turretPath);
private _currentWeapon = if (_unit isEqualTo _vehicle) then {
currentWeapon _unit
diff --git a/addons/missile_manpad/$PBOPREFIX$ b/addons/missile_manpad/$PBOPREFIX$
new file mode 100644
index 00000000000..693a43e0f63
--- /dev/null
+++ b/addons/missile_manpad/$PBOPREFIX$
@@ -0,0 +1 @@
+z\ace\addons\missile_manpad
\ No newline at end of file
diff --git a/addons/missile_manpad/CfgAmmo.hpp b/addons/missile_manpad/CfgAmmo.hpp
new file mode 100644
index 00000000000..adc5a71270c
--- /dev/null
+++ b/addons/missile_manpad/CfgAmmo.hpp
@@ -0,0 +1,34 @@
+class EGVAR(missileguidance,type_RAM);
+class EGVAR(missileguidance,type_Stinger);
+class CfgAmmo {
+ class ammo_Missile_rim116;
+ class GVAR(rim116): ammo_Missile_rim116 {
+ maneuvrability = 0;
+ missileLockMaxSpeed = 2000;
+
+ missileLockCone = 3; // caged lock
+ missileKeepLockedCone = 45;
+ missileLockMaxDistance = 5000;
+ missileLockMinDistance = 250;
+
+ class ace_missileguidance: EGVAR(missileguidance,type_RAM) {
+ enabled = 1;
+ };
+ };
+
+ class M_70mm_SAAMI;
+ class GVAR(stinger): M_70mm_SAAMI {
+ maneuvrability = 0;
+ missileLockMaxSpeed = 2000;
+
+ missileLockCone = 3; // caged lock
+ missileKeepLockedCone = 45;
+ missileLockMaxDistance = 5000;
+ missileLockMinDistance = 250;
+
+ class ace_missileguidance: EGVAR(missileguidance,type_Stinger) {
+ enabled = 1;
+ };
+ };
+};
+
diff --git a/addons/missile_manpad/CfgMagazines.hpp b/addons/missile_manpad/CfgMagazines.hpp
new file mode 100644
index 00000000000..22f80549988
--- /dev/null
+++ b/addons/missile_manpad/CfgMagazines.hpp
@@ -0,0 +1,22 @@
+class CfgMagazines {
+ class magazine_Missile_rim116_x21;
+ class GVAR(rim116): magazine_Missile_rim116_x21 {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(rim116_21x);
+ ammo = QGVAR(rim116);
+ };
+
+ class 4Rnd_70mm_SAAMI_missiles;
+ class GVAR(stinger): 4Rnd_70mm_SAAMI_missiles {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(stinger_4x);
+ ammo = QGVAR(stinger);
+ };
+
+ class Titan_AA;
+ class GVAR(stinger_man): Titan_AA {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(stinger);
+ ammo = QGVAR(stinger);
+ };
+};
diff --git a/addons/missile_manpad/CfgVehicles.hpp b/addons/missile_manpad/CfgVehicles.hpp
new file mode 100644
index 00000000000..7bbc7fb1821
--- /dev/null
+++ b/addons/missile_manpad/CfgVehicles.hpp
@@ -0,0 +1,108 @@
+class CfgVehicles {
+ class LandVehicle;
+ class StaticWeapon: LandVehicle {
+ class Turrets;
+ };
+ class StaticMGWeapon: StaticWeapon {
+ class Turrets: Turrets {
+ class MainTurret;
+ };
+ };
+
+ class SAM_System_01_base_F: StaticMGWeapon {
+ class AnimationSources {
+ class Missiles_revolving {
+ source = "revolving";
+ weapon = QGVAR(rim116);
+ };
+ };
+
+ class Turrets: Turrets {
+ class MainTurret: MainTurret {
+ weapons[] = {QGVAR(rim116)};
+ magazines[] = {QGVAR(rim116)};
+ };
+ };
+ };
+
+ class Tank;
+ class Tank_F: Tank {
+ class Turrets {
+ class MainTurret;
+ };
+ };
+ class LT_01_base_F: Tank_F {
+ class AnimationSources;
+ class Turrets: Turrets {};
+ };
+
+ class LT_01_AA_base_F: LT_01_base_F {
+ class AnimationSources: AnimationSources {
+ class Missiles_revolving {
+ source = "revolving";
+ weapon = QGVAR(FIM92);
+ };
+ };
+
+ class Turrets: Turrets {
+ class MainTurret: MainTurret {
+ weapons[] = {"SmokeLauncher", QGVAR(FIM92), "HMG_127"};
+ magazines[] = {
+ "SmokeLauncherMag",
+ QGVAR(stinger),
+ QGVAR(stinger),
+ "100Rnd_127x99_mag_Tracer_Red",
+ "100Rnd_127x99_mag_Tracer_Red",
+ "100Rnd_127x99_mag_Tracer_Red",
+ "100Rnd_127x99_mag_Tracer_Red"
+ };
+ };
+ };
+ };
+
+ class APC_Tracked_01_base_F: Tank_F {
+ class Turrets: Turrets {
+ class MainTurret: MainTurret {};
+ };
+ };
+ class B_APC_Tracked_01_base_F: APC_Tracked_01_base_F {
+ class AnimationSources;
+ };
+ class B_APC_Tracked_01_AA_F: B_APC_Tracked_01_base_F {
+ class AnimationSources: AnimationSources {
+ class Missiles_revolving {
+ source = "revolving";
+ weapon = QGVAR(FIM92);
+ };
+ };
+ class Turrets: Turrets {
+ class MainTurret: MainTurret {
+ weapons[] = {"autocannon_35mm", QGVAR(FIM92)};
+ magazines[] = {"680Rnd_35mm_AA_shells_Tracer_Red", QGVAR(stinger), QGVAR(stinger)};
+ };
+ };
+ };
+
+ class APC_Tracked_02_base_F: Tank_F {
+ class Turrets: Turrets {
+ class MainTurret: MainTurret {};
+ };
+ };
+ class O_APC_Tracked_02_base_F: APC_Tracked_02_base_F {
+ class AnimationSources;
+ };
+ class O_APC_Tracked_02_AA_F: O_APC_Tracked_02_base_F {
+ class AnimationSources: AnimationSources {
+ class Missiles_revolving {
+ source = "revolving";
+ weapon = QGVAR(FIM92);
+ };
+ };
+ class Turrets: Turrets {
+ class MainTurret: MainTurret {
+ weapons[] = {"autocannon_35mm", QGVAR(FIM92)};
+ magazines[] = {"680Rnd_35mm_AA_shells_Tracer_Green", QGVAR(stinger), QGVAR(stinger)};
+ };
+ };
+ };
+};
diff --git a/addons/missile_manpad/CfgWeapons.hpp b/addons/missile_manpad/CfgWeapons.hpp
new file mode 100644
index 00000000000..adba9137d23
--- /dev/null
+++ b/addons/missile_manpad/CfgWeapons.hpp
@@ -0,0 +1,23 @@
+class CfgWeapons {
+ class weapon_rim116Launcher;
+ class GVAR(rim116): weapon_rim116Launcher {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(rim116);
+ magazines[] = { QGVAR(rim116) };
+ weaponLockDelay = 0.5;
+ };
+
+ class missiles_SAAMI;
+ class GVAR(FIM92): missiles_SAAMI {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(stinger);
+ magazines[] = { QGVAR(stinger) };
+ weaponLockDelay = 0.5;
+ };
+
+ class Launcher_Base_F;
+ class launch_Titan_base: Launcher_Base_F {
+ magazines[] = {QGVAR(stinger_man)};
+ };
+};
+
diff --git a/addons/missile_manpad/README.md b/addons/missile_manpad/README.md
new file mode 100644
index 00000000000..4d1e78321ff
--- /dev/null
+++ b/addons/missile_manpad/README.md
@@ -0,0 +1,4 @@
+ace_missile_manpad
+===================
+
+Adds missile guidance to all vanilla MANPAD systems
diff --git a/addons/missile_manpad/config.cpp b/addons/missile_manpad/config.cpp
new file mode 100644
index 00000000000..d285b08cfc8
--- /dev/null
+++ b/addons/missile_manpad/config.cpp
@@ -0,0 +1,21 @@
+#include "script_component.hpp"
+
+class CfgPatches {
+ class ADDON {
+ name = COMPONENT_NAME;
+ units[] = {};
+ weapons[] = {};
+ requiredVersion = REQUIRED_VERSION;
+ requiredAddons[] = {"ace_common","ace_missileguidance"};
+ author = ECSTRING(common,ACETeam);
+ authors[] = {"Dani (TCVM)"};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+ };
+};
+
+#include "CfgAmmo.hpp"
+#include "CfgMagazines.hpp"
+#include "CfgWeapons.hpp"
+#include "CfgVehicles.hpp"
+
diff --git a/addons/missile_manpad/script_component.hpp b/addons/missile_manpad/script_component.hpp
new file mode 100644
index 00000000000..7c25a962e15
--- /dev/null
+++ b/addons/missile_manpad/script_component.hpp
@@ -0,0 +1,18 @@
+#define COMPONENT missile_manpad
+#define COMPONENT_BEAUTIFIED MANPAD
+#include "\z\ace\addons\main\script_mod.hpp"
+
+// #define DEBUG_MODE_FULL
+// #define DISABLE_COMPILE_CACHE
+// #define ENABLE_PERFORMANCE_COUNTERS
+
+#ifdef DEBUG_ENABLED_MISSILE_MANPAD
+ #define DEBUG_MODE_FULL
+#endif
+
+#ifdef DEBUG_SETTINGS_MISSILE_MANPAD
+ #define DEBUG_SETTINGS DEBUG_SETTINGS_MISSILE_MANPAD
+#endif
+
+#include "\z\ace\addons\main\script_macros.hpp"
+
diff --git a/addons/missile_manpad/stringtable.xml b/addons/missile_manpad/stringtable.xml
new file mode 100644
index 00000000000..a89c58a6561
--- /dev/null
+++ b/addons/missile_manpad/stringtable.xml
@@ -0,0 +1,37 @@
+
+
+
+
+ FIM-92 Stinger [ACE]
+ FIM-92 スティンガー [ACE]
+ FIM-92 Stinger [ACE]
+ FIM-92 Stinger [ACE]
+ FIM-92 Stinger [ACE]
+ FIM-92 스팅어 [ACE]
+
+
+ RIM-116 [ACE]
+ RIM-116 [ACE]
+ RIM-116 [ACE]
+ RIM-116 [ACE]
+ RIM-116 [ACE]
+ RIM-116 RAM [ACE]
+
+
+ 21x RIM-116 [ACE]
+ 21x RIM-116 [ACE]
+ 21x RIM-116 [ACE]
+ 21x RIM-116 [ACE]
+ 21x RIM-116 [ACE]
+ 21x RIM-116 RAM [ACE]
+
+
+ 4x FIM-92 Stinger [ACE]
+ 4x FIM-92 スティンガー [ACE]
+ 4x FIM-92 Stinger [ACE]
+ 4x FIM-92 Stinger [ACE]
+ 4x FIM-92 Stinger [ACE]
+ 4x FIM-92 스팅어 [ACE]
+
+
+
diff --git a/addons/missile_sam/stringtable.xml b/addons/missile_sam/stringtable.xml
index 86e13ec487d..a8ff3cea0a0 100644
--- a/addons/missile_sam/stringtable.xml
+++ b/addons/missile_sam/stringtable.xml
@@ -4,38 +4,74 @@
Mk-29 ESSM
Mk-29 ESSM
+ Mk-29 ESSM
+ Mk-29 ESSM
+ Mk-29 ESSM
+ 마크 29 ESSM
RIM-162 ESSM
RIM-162 ESSM
+ RIM-162 ESSM
+ RIM-162 ESSM
+ RIM-162 ESSM
+ RIM-162 ESSM
Mk-29 Operator
Mk-29 Operator
+ Mk-29 操作員
+ Mk-29 Operator
+ Mk-29 Bediener
+ 마크 29 조작병
MIM-104 Patriot
MIM-104 Patriot
+ MIM-104 ペトリオット
+ MIM-104 Patriot
+ MIM-104 Patriot
+ MIM-104 패트리어트
Patriot Missile
Patriot Missile
+ ペトリオット ミサイル
+ Patriot Missile
+ Patriot Rakete
+ 패트리어트 미사일
MIM-104 Operator
MIM-104 Operator
+ MIM-104 操作員
+ MIM-104 Operator
+ MIM-104 Bediener
+ MIM-104 패트리어트 조작병
S-400
S-400
+ S-400
+ S-400
+ S-400
+ S-400 트리움프
S-400 Missile
S-400 Missile
+ S-400 ミサイル
+ S-400 Missile
+ S-400 Rakete
+ S-400 트리움프 미사일
S-400 Operator
S-400 Operator
+ S-400 操作員
+ S-400 Operator
+ S-400 Bediener
+ S-400 트리움프 조작병
diff --git a/addons/missile_vikhr/stringtable.xml b/addons/missile_vikhr/stringtable.xml
index 4d61d0fbe27..5afe7a4bdf5 100644
--- a/addons/missile_vikhr/stringtable.xml
+++ b/addons/missile_vikhr/stringtable.xml
@@ -7,6 +7,7 @@
1x 9k121 Vikhr [ACE]
1x 9k121 Vikhr [ACE]
1x 9k121 Вихрь [ACE]
+ 1x 9k121 Vikhr [ACE]
1x 9K121 베프리 [ACE]
1x 9k121 ヴィーフリ [ACE]
@@ -16,6 +17,7 @@
2x 9k121 Vikhr [ACE]
2x 9k121 Vikhr [ACE]
2x 9k121 Вихрь [ACE]
+ 2x 9k121 Vikhr [ACE]
2x 9K121 베프리 [ACE]
2x 9k121 ヴィーフリ [ACE]
@@ -25,6 +27,7 @@
3x 9k121 Vikhr [ACE]
3x 9k121 Vikhr [ACE]
3x 9k121 Вихрь [ACE]
+ 3x 9k121 Vikhr [ACE]
3x 9K121 베프리 [ACE]
3x 9k121 ヴィーフリ [ACE]
@@ -34,6 +37,7 @@
4x 9k121 Vikhr [ACE]
4x 9k121 Vikhr [ACE]
4x 9k121 Вихрь [ACE]
+ 4x 9k121 Vikhr [ACE]
4x 9K121 베프리 [ACE]
4x 9k121 ヴィーフリ [ACE]
@@ -43,6 +47,7 @@
6x 9k121 Vikhr [ACE]
6x 9k121 Vikhr [ACE]
6x 9k121 Вихрь [ACE]
+ 6x 9k121 Vikhr [ACE]
6x 9K121 베프리 [ACE]
6x 9k121 ヴィーフリ [ACE]
@@ -52,6 +57,7 @@
8x 9k121 Vikhr [ACE]
8x 9k121 Vikhr [ACE]
8x 9k121 Вихрь [ACE]
+ 8x 9k121 Vikhr [ACE]
8x 9K121 베프리 [ACE]
8x 9k121 ヴィーフリ [ACE]
@@ -61,6 +67,7 @@
9k121 Vikhr [ACE]
9k121 Vikhr [ACE]
9k121 Вихрь [ACE]
+ 9k121 Vikhr [ACE]
9K121 베프리 [ACE]
9k121 ヴィーフリ [ACE]
diff --git a/addons/missileguidance/ACE_GuidanceConfig.hpp b/addons/missileguidance/ACE_GuidanceConfig.hpp
index 0475da204eb..58c650307dd 100644
--- a/addons/missileguidance/ACE_GuidanceConfig.hpp
+++ b/addons/missileguidance/ACE_GuidanceConfig.hpp
@@ -88,6 +88,14 @@ class GVAR(SeekerTypes) {
functionName = QFUNC(seekerType_MWR);
onFired = QFUNC(mwr_onFired);
};
+ class IR {
+ name = "";
+ visualName = "";
+ description = "";
+
+ functionName = QFUNC(seekerType_IR);
+ onFired = QFUNC(IR_onFired);
+ };
class DopplerRadar {
name = "";
visualName = "";
diff --git a/addons/missileguidance/CfgMissileTypesNato.hpp b/addons/missileguidance/CfgMissileTypesNato.hpp
index 87730b5ed0c..f59cf75856a 100644
--- a/addons/missileguidance/CfgMissileTypesNato.hpp
+++ b/addons/missileguidance/CfgMissileTypesNato.hpp
@@ -579,8 +579,8 @@ class GVAR(type_RBS70) {
class GVAR(type_Redeye) {
enabled = 0;
- pitchRate = 27; // Minium flap deflection for guidance
- yawRate = 27; // Maximum flap deflection for guidance
+ pitchRate = 40; // Minium flap deflection for guidance
+ yawRate = 40; // Maximum flap deflection for guidance
canVanillaLock = 1; // Can this default vanilla lock? Only applicable to non-cadet mode
@@ -594,8 +594,9 @@ class GVAR(type_Redeye) {
defaultSeekerLockMode = "LOBL";
seekerLockModes[] = { "LOBL" };
- defaultNavigationType = "ProportionalNavigation";
- navigationTypes[] = { "ProportionalNavigation" };
+ defaultNavigationType = "LineOfSight";
+ navigationTypes[] = { "LineOfSight" };
+ navigationGain = 3;
seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
seekerAngle = 45; // Angle from the shooter's view that can track the missile
@@ -612,8 +613,8 @@ class GVAR(type_Redeye) {
class GVAR(type_Sidewinder) {
enabled = 0;
- pitchRate = 25; // Minium flap deflection for guidance
- yawRate = 25; // Maximum flap deflection for guidance
+ pitchRate = 35; // Minium flap deflection for guidance
+ yawRate = 35; // Maximum flap deflection for guidance
canVanillaLock = 1; // Can this default vanilla lock? Only applicable to non-cadet mode
@@ -713,4 +714,4 @@ class GVAR(type_TOW) {
// Attack profile type selection
defaultAttackProfile = "WIRE";
attackProfiles[] = {"WIRE"};
-};
\ No newline at end of file
+};
diff --git a/addons/missileguidance/XEH_PREP.hpp b/addons/missileguidance/XEH_PREP.hpp
index c59389992ff..afdaba260a0 100644
--- a/addons/missileguidance/XEH_PREP.hpp
+++ b/addons/missileguidance/XEH_PREP.hpp
@@ -48,6 +48,7 @@ PREP(seekerType_Optic);
PREP(seekerType_SACLOS);
PREP(seekerType_Doppler);
PREP(seekerType_MWR);
+PREP(seekerType_IR);
// Attack Profiles OnFired
PREP(wire_onFired);
@@ -56,6 +57,7 @@ PREP(wire_onFired);
PREP(doppler_onFired);
PREP(SACLOS_onFired);
PREP(mwr_onFired);
+PREP(IR_onFired);
// Navigation OnFired
PREP(proNav_onFired);
diff --git a/addons/missileguidance/functions/fnc_IR_onFired.sqf b/addons/missileguidance/functions/fnc_IR_onFired.sqf
new file mode 100644
index 00000000000..14dfe45f18c
--- /dev/null
+++ b/addons/missileguidance/functions/fnc_IR_onFired.sqf
@@ -0,0 +1,29 @@
+#include "..\script_component.hpp"
+/*
+ * Author: tcvm
+ * Sets up IR state arrays (called from missileGuidance's onFired).
+ *
+ * Arguments:
+ * Guidance Arg Array
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * [] call ace_missileguidance_fnc_IR_onFired
+ *
+ * Public: No
+ */
+params ["_firedEH", "_launchParams", "", "", "_stateParams"];
+_firedEH params ["_shooter","_weapon","","","","","_projectile"];
+_stateParams params ["", "_seekerStateParams"];
+_launchParams params ["", "_targetLaunchParams"];
+_targetLaunchParams params ["_target"];
+
+private _flareDistanceFilter = getNumber (configOf _projectile >> QUOTE(ADDON) >> "flareDistanceFilter");
+private _flareAngleFilter = getNumber (configOf _projectile >> QUOTE(ADDON) >> "flareAngleFilter");
+
+_seekerStateParams set [0, _flareDistanceFilter];
+_seekerStateParams set [1, _flareAngleFilter];
+_seekerStateParams set [2, _target];
+
diff --git a/addons/missileguidance/functions/fnc_navigationType_lineOfSight.sqf b/addons/missileguidance/functions/fnc_navigationType_lineOfSight.sqf
index 958bc62ade9..62670e2f960 100644
--- a/addons/missileguidance/functions/fnc_navigationType_lineOfSight.sqf
+++ b/addons/missileguidance/functions/fnc_navigationType_lineOfSight.sqf
@@ -18,31 +18,29 @@ params ["_args", "_timestep", "_seekerTargetPos", "_profileAdjustedTargetPos"];
_args params ["_firedEH", "", "", "", "_stateParams", "_targetData"];
_firedEH params ["","","","","","","_projectile"];
_stateParams params ["", "", "", "","_navigationParams"];
-_navigationParams params ["_onLaunch"];
-_onLaunch params ["_lastLineOfSight"];
-_targetData params ["_targetDirection", "_attackProfileDirection", "", "_targetVelocity", ""];
+_navigationParams params ["_lastMissileFrame", "_navigationGain"];
+_lastMissileFrame params ["_lastLineOfSight"];
+_targetData params ["_targetDirection", "_attackProfileDirection"];
// Semi-proportional navigation implemented via "Fundamentals of proportional navigation" by Stephen Murtaugh and Harry Criel
-
-// the los rate is tiny, so we multiply by a constant of a power of ten to get more aggressive acceleration
-// this is just due to how we measure our LOS delta, the vectors involved are _tiny_
-private _losDelta = _attackProfileDirection vectorDiff _lastLineOfSight;
+private _losDelta = (vectorNormalized _attackProfileDirection) vectorDiff (vectorNormalized _lastLineOfSight);
private _losRate = if (_timestep == 0) then {
0
} else {
- 10 * (vectorMagnitude _losDelta) / _timestep;
+ 1 * (vectorMagnitude _losDelta) / _timestep;
};
-private _closingVelocity = _targetVelocity vectorDiff (velocity _projectile);
+private _lateralAcceleration = _navigationGain * _losRate;
+private _commandedAcceleration = _attackProfileDirection vectorMultiply _lateralAcceleration;
-private _commandedAcceleration = _closingVelocity vectorMultiply _losRate;
+private _missileDirection = vectorNormalized velocity _projectile;
// we need acceleration normal to our LOS
-private _commandedAccelerationProjected = _attackProfileDirection vectorMultiply (_commandedAcceleration vectorDotProduct _attackProfileDirection);
+private _commandedAccelerationProjected = _missileDirection vectorMultiply (_commandedAcceleration vectorDotProduct _missileDirection);
_commandedAcceleration = _commandedAcceleration vectorDiff _commandedAccelerationProjected;
if (accTime > 0) then {
- _navigationParams set [0, [_attackProfileDirection]];
+ _navigationParams set [0, [_seekerTargetPos]];
};
-_targetDirection
+_commandedAcceleration
diff --git a/addons/missileguidance/functions/fnc_seekerType_Doppler.sqf b/addons/missileguidance/functions/fnc_seekerType_Doppler.sqf
index 15f34574c64..e44ff2081f2 100644
--- a/addons/missileguidance/functions/fnc_seekerType_Doppler.sqf
+++ b/addons/missileguidance/functions/fnc_seekerType_Doppler.sqf
@@ -58,11 +58,6 @@ if (_isActive || { CBA_missionTime >= _timeWhenActive }) then {
private _a2 = 180 - ((_seekerAngle / 2) + _a1);
private _seekerBaseRadiusAtGround = ACTIVE_RADAR_MINIMUM_SCAN_AREA max (_distanceToExpectedTarget / sin(_a2) * sin(_seekerAngle / 2));
- private _lastKnownSpeed = if (_lastKnownVelocity isEqualTo [0, 0, 0]) then {
- 0
- } else {
- vectorMagnitude _lastKnownVelocity
- };
private _seekerBaseRadiusAdjusted = linearConversion [0, _seekerBaseRadiusAtGround, (CBA_missionTime - _lastTimeSeen) * vectorMagnitude _lastKnownVelocity, ACTIVE_RADAR_MINIMUM_SCAN_AREA, _seekerBaseRadiusAtGround, false];
if (_doesntHaveTarget) then {
_seekerBaseRadiusAdjusted = _seekerBaseRadiusAtGround;
diff --git a/addons/missileguidance/functions/fnc_seekerType_IR.sqf b/addons/missileguidance/functions/fnc_seekerType_IR.sqf
new file mode 100644
index 00000000000..5711f87cde0
--- /dev/null
+++ b/addons/missileguidance/functions/fnc_seekerType_IR.sqf
@@ -0,0 +1,144 @@
+#include "..\script_component.hpp"
+/*
+ * Author: tcvm
+ * Infrared seeker. Checks if flares are popped
+ *
+ * Arguments:
+ * 1: Guidance Arg Array
+ * 2: Seeker State
+ *
+ * Return Value:
+ * Position of wanted missile pos relative to the camera direction
+ *
+ * Example:
+ * [] call ace_missileguidance_fnc_seekerType_IR
+ *
+ * Public: No
+ */
+#ifdef DEBUG_MODE_FULL
+#define TRACK_ON_PAUSE true
+#else
+#define TRACK_ON_PAUSE false
+#endif
+
+//IGNORE_PRIVATE_WARNING ["_args"]; // from doSeekerSearch
+_args params ["_firedEH", "_launchParams", "_flightParams", "_seekerParams", "_stateParams", "_targetData"];
+_firedEH params ["_shooter","","","","_ammo","","_projectile"];
+_launchParams params ["_shooter","_targetLaunchParams","_seekerType","_attackProfile","_lockMode","_laserInfo","_navigationType"];
+_targetLaunchParams params ["_target", "", "_launchPos", "_launchDir", "_launchTime"];
+_flightParams params ["_pitchRate", "_yawRate", "_isBangBangGuidance"];
+_stateParams params ["_lastRunTime", "_seekerStateParams", "_attackProfileStateParams", "_lastKnownPosState","_navigationParams", "_guidanceParameters"];
+_seekerParams params ["_seekerAngle", "_seekerAccuracy", "_seekerMaxRange", "_seekerMinRange"];
+_targetData params ["_targetDirection", "_attackProfileDirection", "_targetRange", "_targetVelocity", "_targetAcceleration"];
+
+_seekerStateParams params ["_flareDistanceFilter", "_flareAngleFilter", "_trackingTarget"];
+
+private _distanceFromLaunch = _launchPos distanceSqr getPosASLVisual _projectile;
+if (_distanceFromLaunch <= _seekerMinRange * _seekerMinRange) exitWith {
+ private _dir = _launchPos vectorFromTo getPosASLVisual _projectile;
+ _dir vectorAdd getPosASLVisual _projectile
+};
+
+private _withinView = [_projectile, getPosASLVisual _trackingTarget, _seekerAngle] call FUNC(checkSeekerAngle);
+private _canSee = [_projectile, _trackingTarget, false] call FUNC(checkLos);
+if (_trackingTarget isNotEqualTo objNull && ({ !_withinView || !_canSee })) then {
+ _trackingTarget = objNull;
+};
+if (isNull _trackingTarget) then {
+ // find any target within seeker range
+ private _potentialTargets = _projectile nearEntities ["Air", _seekerMaxRange];
+ private _bestAngle = 90;
+ {
+ private _withinView = [_projectile, getPosASLVisual _x, _seekerAngle] call FUNC(checkSeekerAngle);
+ private _canSee = [_projectile, _x, false] call FUNC(checkLos);
+
+ if (_withinView && _canSee) then {
+ private _los = (getPosASLVisual _projectile) vectorFromTo (getPosASLVisual _x);
+ private _losAngle = (_los#2 atan2 _los#0);
+ if (_losAngle < _bestAngle) then {
+ _trackingTarget = _x;
+ _bestAngle = _losAngle;
+ };
+ };
+ } forEach _potentialTargets;
+};
+
+if (accTime > 0 && !isGamePaused) then {
+ // If there are flares nearby, check if they will confuse missile
+ private _nearby = _trackingTarget nearObjects _flareDistanceFilter;
+ _nearby = _nearby select {
+ // 2 = IR blocking
+ (([getNumber (configOf _x >> "weaponLockSystem"), 4] call EFUNC(common,binarizeNumber)) select 1) && // Check if chaff can break radar lock
+ {[_projectile, getPosASLVisual _x, _seekerAngle] call FUNC(checkSeekerAngle)} && // Check if within view
+ {[_projectile, _x, false] call FUNC(checkLos)} // Check if can be seen
+ };
+
+ private _frontAspectMultiplier = 1;
+ if (_trackingTarget isKindOf "Air") then {
+ private _targetVelocity = velocity _trackingTarget;
+
+ private _directionToTarget = (getPosASLVisual _projectile) vectorFromTo getPosASLVisual _trackingTarget;
+ private _angle = acos (_directionToTarget vectorCos _targetVelocity);
+
+ _frontAspectMultiplier = (((_angle / 60) min 1) max 0.3);
+ };
+
+ private _relativeTargetVelocity = _projectile vectorWorldToModelVisual velocity _trackingTarget;
+ _relativeTargetVelocity set [1, 0];
+ private _foundDecoy = false;
+ {
+ if (_trackingTarget isNotEqualTo _x) then {
+ private _considering = false;
+
+ private _flareRelativeVelocity = _projectile vectorWorldToModelVisual velocity _x;
+ _flareRelativeVelocity set [1, 0];
+ private _angleBetweenVelocities = acos (_relativeTargetVelocity vectorCos _flareRelativeVelocity);
+ // further away targets are filtered out by assumption that target cant move instantenously
+ private _chanceToDecoy = 1 - (_trackingTarget distance _x) / (_flareDistanceFilter * _frontAspectMultiplier);
+ if !(_foundDecoy) then {
+ if (_angleBetweenVelocities <= _flareAngleFilter) then {
+ _considering = true;
+ if (_seekerAccuracy <= random _chanceToDecoy) then {
+ _trackingTarget = _x;
+ _foundDecoy = true;
+ };
+ };
+ };
+
+ if (GVAR(debug_drawGuidanceInfo)) then {
+ private _flarePos = ASLToAGL getPosASLVisual _x;
+ private _colour = [1, 0, 0, 1];
+ if (_considering) then {
+ _colour = [0, 1, 0, 1];
+ };
+ if (_trackingTarget isEqualTo _x) then {
+ _colour = [0, 0, 1, 1];
+ };
+ drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", _colour, _flarePos, 0.75, 0.75, 0, format ["F %1 C %2", _angleBetweenVelocities, _chanceToDecoy], 1, 0.025, "TahomaB"];
+ };
+ };
+ } forEach _nearby;
+
+ _seekerStateParams set [2, _trackingTarget];
+
+};
+
+private _targetPosition = _trackingTarget modelToWorldVisualWorld getCenterOfMass _trackingTarget;
+
+if (GVAR(debug_drawGuidanceInfo) && { _targetPosition isNotEqualTo [0, 0, 0] }) then {
+ if (!isGamePaused && accTime > 0) then {
+ private _ps = "#particlesource" createVehicleLocal (ASLToAGL _targetPosition);
+ _PS setParticleParams [["\A3\Data_f\cl_basic", 8, 3, 1], "", "Billboard", 1, 3.0141, [0, 0, 0], [0, 0, 0], 1, 1.275, 1, 0, [1, 1], [[0, 0, 1, 1], [0, 0, 1, 1], [0, 0, 1, 1]], [1], 1, 0, "", "", nil];
+ _PS setDropInterval 1.0;
+ };
+};
+
+_targetData set [0, (getPosASL _projectile) vectorFromTo _targetPosition];
+_targetData set [2, 0];
+_targetData set [3, velocity _trackingTarget];
+
+if (_targetPosition isEqualTo [0, 0, 0]) then {
+ _targetPosition = (velocity _projectile) vectorAdd getPosASLVisual _projectile
+};
+
+_targetPosition
diff --git a/addons/missileguidance/functions/fnc_shouldFilterRadarHit.sqf b/addons/missileguidance/functions/fnc_shouldFilterRadarHit.sqf
index 0d4f944f646..aec7d62a28a 100644
--- a/addons/missileguidance/functions/fnc_shouldFilterRadarHit.sqf
+++ b/addons/missileguidance/functions/fnc_shouldFilterRadarHit.sqf
@@ -77,7 +77,6 @@ if !(_maskedByGround) exitWith {
private _nearby = _target nearObjects 50;
_nearby = _nearby select {
// 8 = radar blocking
- private _blocking = configOf _x >> "weaponLockSystem";
(([getNumber (configOf _x >> "weaponLockSystem"), 4] call EFUNC(common,binarizeNumber)) select 3) && // Check if chaff can break radar lock
{[_projectile, getPosASLVisual _x, _seekerAngle] call FUNC(checkSeekerAngle)} && // Check if within view
{[_projectile, _x, false] call FUNC(checkLos)} // Check if can be seen
diff --git a/addons/missileguidance/stringtable.xml b/addons/missileguidance/stringtable.xml
index f50083b4474..e10130bfb37 100644
--- a/addons/missileguidance/stringtable.xml
+++ b/addons/missileguidance/stringtable.xml
@@ -109,6 +109,7 @@
12x DAGR [ACE]
12x DAGR [ACE]
12x DAGR [ACE]
+ 12x DAGR [ACE]
12x DAGR [ACE]
12x DAGR [ACE]
@@ -118,6 +119,7 @@
24x DAGR [ACE]
24x DAGR [ACE]
24x DAGR [ACE]
+ 24x DAGR [ACE]
24x DAGR [ACE]
24x DAGR [ACE]
@@ -127,6 +129,7 @@
6x DAGR [ACE]
6x DAGR [ACE]
6x DAGR [ACE]
+ 6x DAGR [ACE]
6x DAGR [ACE]
6x DAGR [ACE]
diff --git a/addons/overheating/stringtable.xml b/addons/overheating/stringtable.xml
index eb0973d456f..8a98482aa8b 100644
--- a/addons/overheating/stringtable.xml
+++ b/addons/overheating/stringtable.xml
@@ -861,7 +861,7 @@
Szansa na to, że przy przeładowaniu broni zacięcie nie zostanie usunięte, przez co czynność będzie musiała zostać powtórzona ponownie.
Probabilidade que uma ação de desemperramento falhe, tendo que ser repetida
Вертоятность того, что устранение заклинивания не сработает, и его придется повторить.
- Wahrscheinlichkeit, dass der Versuch eine Ladehemmung zu beheben fehl schlägt und erneut durchgeführt werden muss.
+ Wahrscheinlichkeit, dass der Versuch eine Ladehemmung zu beheben fehlschlägt und erneut durchgeführt werden muss.
기능고장 해결 시도 시 실패할 확률이 있습니다. 이는 다시 기능고장 해결을 시도해야함을 의미합니다.
弾詰まり解除のアクションに失敗し、再実行が必要になる確率。
清除卡彈時有可能會失敗,需要反覆進行清槍。
@@ -923,7 +923,7 @@
Determina se la sostituzione della canna disinceppa l'arma.
Określa, czy wymiana lufy usuwa zacięcie się broni.
Определяет, устраняет ли замена ствола заклинивание оружия.
- Bestimmt, ob das Wechseln des Laufes eine Ladehemmung behebt.
+ Legt fest, ob ein Laufwechsel Ladehemmungen behebt.
총열을 교체하면서 기능고장을 해결합니다.
銃身を交換して弾詰まりの解消をできるようにします。
通过更换枪管,以便清除卡弹。
@@ -935,7 +935,7 @@
Disinceppa l'arma col cambio canna
Usuń zacięcie przy wymianie lufy
Замена ствола устраняет клин оружия
- Ladehemmung beim Wechseln des Laufes beheben.
+ Ladehemmung beim Laufwechsel beheben
총열 교환 시 기능고장 해결
銃身交換による弾詰まり解消
更换枪管清除卡弹
diff --git a/addons/parachute/stringtable.xml b/addons/parachute/stringtable.xml
index f36d09b4657..79532386f30 100644
--- a/addons/parachute/stringtable.xml
+++ b/addons/parachute/stringtable.xml
@@ -60,7 +60,7 @@
Szansa na nieotwarcie się spadochronu
Probabilidade de falha do paraquedas
Вероятность отказа парашюта
- Wahrscheinlichkeit, dass ein Fallschirm sich nicht öffnet
+ Wahrscheinlichkeit eines Fallschirmversagens
낙하산 펼치기 실패 확률
開傘失敗率
开伞失败率
diff --git a/addons/pylons/stringtable.xml b/addons/pylons/stringtable.xml
index d10eded85ca..d398e7cf5a6 100644
--- a/addons/pylons/stringtable.xml
+++ b/addons/pylons/stringtable.xml
@@ -101,7 +101,7 @@
<vazio>
<пусто>
<leer>
- <비어있음>
+ <비어 있음>
<空>
<空>
<空>
diff --git a/addons/realisticnames/CfgVehicles.hpp b/addons/realisticnames/CfgVehicles.hpp
index ba95cf147d5..6ad1ee1fec3 100644
--- a/addons/realisticnames/CfgVehicles.hpp
+++ b/addons/realisticnames/CfgVehicles.hpp
@@ -21,6 +21,9 @@ class CfgVehicles {
class I_static_AT_F: AT_01_base_F {
displayName = CSTRING(static_AT_Name);
};
+ class I_E_Static_AT_F: I_static_AT_F {
+ displayName = CSTRING(static_AT_Name);
+ };
class AA_01_base_F;
class B_static_AA_F: AA_01_base_F {
@@ -32,6 +35,9 @@ class CfgVehicles {
class I_static_AA_F: AA_01_base_F {
displayName = CSTRING(static_AA_Name);
};
+ class I_E_Static_AA_F: I_static_AA_F {
+ displayName = CSTRING(static_AA_Name);
+ };
class GMG_TriPod;
class GMG_01_base_F: GMG_TriPod {
@@ -174,6 +180,10 @@ class CfgVehicles {
class I_APC_tracked_03_cannon_F: I_APC_tracked_03_base_F {
displayName = CSTRING(APC_tracked_03_cannon_Name);
};
+ class I_E_APC_tracked_03_base_F;
+ class I_E_APC_tracked_03_cannon_F: I_E_APC_tracked_03_base_F {
+ displayName = CSTRING(APC_tracked_03_cannon_Name);
+ };
// Wheeled apcs
class B_APC_Wheeled_01_base_F;
@@ -267,13 +277,34 @@ class CfgVehicles {
class I_Truck_02_box_F: Truck_02_box_base_F {
displayName = CSTRING(Truck_02_box_Name);
};
+ class I_E_Truck_02_transport_F: Truck_02_transport_base_F {
+ displayName = CSTRING(Truck_02_transport_Name);
+ };
+ class I_E_Truck_02_F: Truck_02_base_F {
+ displayName = CSTRING(Truck_02_covered_Name);
+ };
+ class I_E_Truck_02_ammo_F: Truck_02_Ammo_base_F {
+ displayName = CSTRING(Truck_02_ammo_Name);
+ };
+ class I_E_Truck_02_fuel_F: Truck_02_fuel_base_F {
+ displayName = CSTRING(Truck_02_fuel_Name);
+ };
+ class I_E_Truck_02_box_F: Truck_02_box_base_F {
+ displayName = CSTRING(Truck_02_box_Name);
+ };
class Truck_02_MRL_base_F;
class I_Truck_02_MRL_F: Truck_02_MRL_base_F {
displayName = CSTRING(Truck_02_MRL_Name);
};
+ class I_E_Truck_02_MRL_F: Truck_02_MRL_base_F {
+ displayName = CSTRING(Truck_02_MRL_Name);
+ };
class I_Truck_02_medical_F: Truck_02_medical_base_F {
displayName = CSTRING(Truck_02_medical_Name);
};
+ class I_E_Truck_02_medical_F: Truck_02_medical_base_F {
+ displayName = CSTRING(Truck_02_medical_Name);
+ };
class C_Truck_02_transport_F: Truck_02_transport_base_F {
displayName = CSTRING(Truck_02_transport_Name);
};
@@ -383,11 +414,17 @@ class CfgVehicles {
class I_Heli_light_03_unarmed_F: Heli_light_03_unarmed_base_F {
displayName = CSTRING(Heli_light_03_unarmed_Name);
};
+ class I_E_Heli_light_03_unarmed_F: Heli_light_03_unarmed_base_F {
+ displayName = CSTRING(Heli_light_03_unarmed_Name);
+ };
class Heli_light_03_dynamicLoadout_base_F;
class I_Heli_light_03_dynamicLoadout_F: Heli_light_03_dynamicLoadout_base_F {
displayName = CSTRING(Heli_light_03_Name);
};
+ class I_E_Heli_light_03_dynamicLoadout_F: Heli_light_03_dynamicLoadout_base_F {
+ displayName = CSTRING(Heli_light_03_Name);
+ };
class Heli_Transport_02_base_F;
class I_Heli_Transport_02_F: Heli_Transport_02_base_F {
diff --git a/addons/realisticnames/stringtable.xml b/addons/realisticnames/stringtable.xml
index 0c61f004a55..2620e96393d 100644
--- a/addons/realisticnames/stringtable.xml
+++ b/addons/realisticnames/stringtable.xml
@@ -1984,7 +1984,7 @@
HEMTT (ремонтный)
HEMTT Instandsetzung
HEMTT 수리
- HEMTT 修理
+ HEMTT (修理)
重型增程機動戰術卡車 (維修)
HEMTT(维修)
HEMTT Tamir
@@ -2001,7 +2001,7 @@
HEMTT (боеприпасы)
HEMTT Munition
HEMTT 탄약
- HEMTT 弾薬
+ HEMTT (弾薬)
重型增程機動戰術卡車 (彈藥)
HEMTT(弹药)
HEMTT Cephane
@@ -2018,7 +2018,7 @@
HEMTT (контейнер)
HEMTT Container
HEMTT 컨테이너
- HEMTT コンテナ
+ HEMTT (コンテナ)
重型增程機動戰術卡車 (貨櫃)
HEMTT(货柜)
HEMTT Konteynır
@@ -2035,7 +2035,7 @@
HEMTT (транспортный, крытый)
HEMTT Transport (bedeckt)
HEMTT 수송 (덮개)
- HEMTT 輸送 (幌)
+ HEMTT (輸送、幌付き)
重型增程機動戰術卡車 (運輸, 棚布)
HEMTT(运输,棚布)
HEMTT Nakil (Kapalı)
@@ -2052,7 +2052,7 @@
HEMTT (топливозаправщик)
HEMTT Treibstoff
HEMTT 연료
- HEMTT 燃料
+ HEMTT (燃料)
重型增程機動戰術卡車 (燃油)
HEMTT(燃油)
HEMTT Yakıt
@@ -2069,7 +2069,7 @@
HEMTT (медицинский)
HEMTT Sanitäter
HEMTT 의료
- HEMTT 衛生
+ HEMTT (衛生)
重型增程機動戰術卡車 (醫療)
HEMTT(医疗)
HEMTT Medikal
@@ -2103,7 +2103,7 @@
HEMTT (транспортный)
HEMTT Transport
HEMTT 수송
- HEMTT 輸送
+ HEMTT (輸送)
重型增程機動戰術卡車 (運輸)
HEMTT(运输)
HEMTT Nakil
@@ -2120,7 +2120,7 @@
КамАЗ РСЗО
KamAS MRL
카마즈 다연장로켓
- KamAZ MRL
+ KamAZ (MRL)
"卡瑪斯"卡車 (多管火箭)
"卡玛兹"(多管火箭)
KamAZ
@@ -2136,7 +2136,7 @@
КамАЗ (боеприпасы)
KamAS Munition
카마즈 탄약
- KamAZ 弾薬
+ KamAZ (弾薬)
"卡瑪斯"卡車 (彈藥)
"卡玛兹"(弹药)
KamAZ Cephane
@@ -2153,7 +2153,7 @@
КамАЗ (ремонтный)
KamAS Instandsetzung
카마즈 수리
- KamAZ 修理
+ KamAZ (修理)
"卡瑪斯"卡車 (維修)
"卡玛兹"(维修)
KamAZ Tamir
@@ -2170,7 +2170,7 @@
КамАЗ (транспортный, крытый)
KamAS Transport (bedeckt)
카마즈 수송 (덮개)
- KamAZ 輸送 (幌)
+ KamAZ (輸送、幌付き)
"卡瑪斯"卡車 (運輸, 棚布)
"卡玛兹"(运输,棚布)
KamAZ Nakil (Kapalı)
@@ -2187,7 +2187,7 @@
КамАЗ (топливозаправщик)
KamAS Treibstoff
카마즈 연료
- KamAZ 燃料
+ KamAZ (燃料)
"卡瑪斯"卡車 (燃油)
"卡玛兹"(燃油)
KamAZ Yakıt
@@ -2204,7 +2204,7 @@
КамАЗ (медицинский)
KamAS Sanitäter
카마즈 의료
- KamAZ 衛生
+ KamAZ (衛生)
"卡瑪斯"卡車 (醫療)
"卡玛兹"(医疗)
KamAZ Medikal
@@ -2221,7 +2221,7 @@
КамАЗ (транспортный)
KamAS Transport
카마즈 수송
- KamAZ 輸送
+ KamAZ (輸送)
"卡瑪斯"卡車 (運輸)
"卡玛兹"(运输)
KamAZ Nakil
@@ -2236,7 +2236,7 @@
КамАЗ (водоноситель)
KamAS Wasser
카마즈 급수
- KamAZ 給水
+ KamAZ (給水車)
Typhoon Ammo
@@ -2249,7 +2249,7 @@
Тайфун (боеприпасы)
Typhoon Munition
타이푼 탄약
- タイフーン 弾薬
+ タイフーン (弾薬)
"颱風"卡車 (彈藥)
"台风"(弹药)
Typhoon Cephane
@@ -2266,7 +2266,7 @@
Тайфун (крытый)
Typhoon Transport (bedeckt)
타이푼 수송 (덮개)
- タイフーン 輸送 (幌)
+ タイフーン (輸送、幌付き)
"颱風"卡車 (運輸, 棚布)
"台风"(运输,棚布)
Typhoon Nakil (Kapalı)
@@ -2283,7 +2283,7 @@
Тайфун (устройство)
Typhoon Gerät
타이푼 장치
- タイフーン デバイス
+ タイフーン (デバイス)
"颱風"卡車 (精密設備)
"台风"(装置)
Typhoon Cihaz
@@ -2300,7 +2300,7 @@
Тайфун (топливозаправщик)
Typhoon Treibstoff
타이푼 연료
- タイフーン 燃料
+ タイフーン (燃料)
"颱風"卡車 (燃油)
"台风"(燃油)
Typhoon Yakıt
@@ -2317,7 +2317,7 @@
Тайфун (медицинский)
Typhoon Sanitäter
타이푼 의료
- タイフーン 衛生
+ タイフーン (衛生)
"颱風"卡車 (醫療)
"台风"(医疗)
Typhoon Medikal
@@ -2334,7 +2334,7 @@
Тайфун (ремонтный)
Typhoon Instandsetzung
타이푼 수리
- タイフーン 修理
+ タイフーン (修理)
"颱風"卡車 (維修)
"台风"(维修)
Typhoon Tamir
@@ -2351,7 +2351,7 @@
Тайфун (транспортный)
Typhoon Transport
타이푼 수송
- タイフーン 輸送
+ タイフーン (輸送)
"颱風"卡車 (運輸)
"台风"(运输)
Typhoon Nakil
diff --git a/addons/reload/stringtable.xml b/addons/reload/stringtable.xml
index 465aa675801..cf445662a58 100644
--- a/addons/reload/stringtable.xml
+++ b/addons/reload/stringtable.xml
@@ -115,7 +115,7 @@
Zawsze pokazuj interakcję od sprawdzania amunicji
Sempre mostrar a opção de checar a própria munição
Всегда показывать проверку боеприпасов
- Zeige immer die Selbstinteraktion zur Prüfung der Munition an.
+ Selbstinteraktion zur Munitionsprüfung immer anzeigen
상호작용에 탄약 확인을 항상 띄우기
弾薬確認アクションを常に表示
總是在自我互動中顯示檢查彈藥動作
diff --git a/addons/scopes/functions/fnc_getCurrentZeroRange.sqf b/addons/scopes/functions/fnc_getCurrentZeroRange.sqf
index d1bc3b7790d..a62e3d7a022 100644
--- a/addons/scopes/functions/fnc_getCurrentZeroRange.sqf
+++ b/addons/scopes/functions/fnc_getCurrentZeroRange.sqf
@@ -19,23 +19,40 @@ params ["_unit"];
if (!GVAR(enabled)) exitWith {currentZeroing _unit};
-private _weaponIndex = [_unit, currentWeapon _unit] call EFUNC(common,getWeaponIndex);
+private _currentWeapon = currentWeapon _unit;
+private _weaponIndex = [_unit, _currentWeapon] call EFUNC(common,getWeaponIndex);
if (_weaponIndex < 0) exitWith { currentZeroing _unit };
+
if (GVAR(simplifiedZeroing)) exitWith {
if !(GVAR(canAdjustElevation) select _weaponIndex) exitWith {currentZeroing _unit};
private _adjustment = _unit getVariable [QGVAR(Adjustment), [[0, 0, 0], [0, 0, 0], [0, 0, 0]]];
((_adjustment select _weaponIndex) select 0)
};
-private _optic = GVAR(Optics) select _weaponIndex;
+private _local = _unit == ACE_Player;
+
+private _optic = if (_local) then {
+ GVAR(Optics) select _weaponIndex
+} else {
+ ([_unit] call FUNC(getOptics)) select _weaponIndex
+};
private _opticConfig = if (_optic != "") then {
(configFile >> "CfgWeapons" >> _optic)
} else {
- (configFile >> "CfgWeapons" >> (GVAR(Guns) select _weaponIndex))
+ if (_local) then {
+ (configFile >> "CfgWeapons" >> (GVAR(Guns) select _weaponIndex))
+ } else {
+ (configFile >> "CfgWeapons" >> _currentWeapon)
+ };
};
private _zeroRange = currentZeroing _unit;
-if (GVAR(overwriteZeroRange) && {GVAR(canAdjustElevation) select _weaponIndex}) then {
+// Revert zeroing to default if overriding is enabled OR the selected sight's magnification is not higher than that of the naked eye, meaning that it is a secondary iron/holo sight
+if (
+ _local &&
+ (GVAR(canAdjustElevation) select _weaponIndex) &&
+ {GVAR(overwriteZeroRange) || {getNumber (_opticConfig >> "ItemInfo" >> "OpticsModes" >> (_unit getOpticsMode _weaponIndex) >> "opticsZoomMax") > MIN_ZOOM_NAKEDEYE}}
+) then {
_zeroRange = GVAR(defaultZeroRange);
};
if (isNumber (_opticConfig >> "ACE_ScopeZeroRange")) then {
diff --git a/addons/scopes/script_component.hpp b/addons/scopes/script_component.hpp
index 9e867a9bd28..e7a9edb1587 100644
--- a/addons/scopes/script_component.hpp
+++ b/addons/scopes/script_component.hpp
@@ -18,6 +18,8 @@
#define DEFAULT_RAIL_BASE_ANGLE 0.0086 // deg
+#define MIN_ZOOM_NAKEDEYE 0.2 // Magnification (CfgWeapons opticsZoomMax) that will always be unachievable by the naked eye
+
// #define DISABLE_DISPERSION
#ifdef DEBUG_ENABLED_SCOPES
diff --git a/addons/ui/stringtable.xml b/addons/ui/stringtable.xml
index ae711e02ec5..cc5a38983cd 100644
--- a/addons/ui/stringtable.xml
+++ b/addons/ui/stringtable.xml
@@ -374,7 +374,7 @@
Quantidade de Carregadores
Количество магазинов
Magazinanzahl
- 탄창수
+ 탄창 수
弾倉数
彈匣數量
弹匣数量
@@ -728,6 +728,7 @@
Ocultar toda la IU
Nascondi tutta l'IU
Скрыть весь интерфейс
+ Gesamte Benutzeroberfläche ausblenden
모든 UI 숨기기
全てのUIを隠す
diff --git a/addons/vehicle_damage/functions/fnc_handleDamageEjectIfDestroyed.sqf b/addons/vehicle_damage/functions/fnc_handleDamageEjectIfDestroyed.sqf
index 8169e140e2c..ab36fee75cd 100644
--- a/addons/vehicle_damage/functions/fnc_handleDamageEjectIfDestroyed.sqf
+++ b/addons/vehicle_damage/functions/fnc_handleDamageEjectIfDestroyed.sqf
@@ -22,7 +22,7 @@ if (alive _vehicle) exitWith {};
TRACE_2("handleDamageEjectIfDestroyed",typeOf _vehicle,_this);
-if (!IS_EXPLOSIVE_AMMO(_ammo)) then {
+if (IS_INEXPLOSIVE_AMMO(_ammo)) then {
{
if (alive _x) then {
moveOut _x;
diff --git a/addons/vehicle_damage/script_macros.hpp b/addons/vehicle_damage/script_macros.hpp
index 43bac7e2f80..dd40ac91711 100644
--- a/addons/vehicle_damage/script_macros.hpp
+++ b/addons/vehicle_damage/script_macros.hpp
@@ -4,7 +4,7 @@
#define BAILOUT_CHANCE_SHOOT 0.5
#define BAILOUT_CHANCE_MOVE 0.8
-#define IS_EXPLOSIVE_AMMO(ammo) (getNumber (ammo call CBA_fnc_getObjectConfig >> "explosive") > 0.5)
+#define IS_INEXPLOSIVE_AMMO(ammo) (getNumber (ammo call CBA_fnc_getObjectConfig >> "explosive") <= 0.5)
#define ENGINE_HITPOINTS [["hitengine"], "engine"]
#define HULL_HITPOINTS [["hithull", "hitbody", "#structural"], "hull"]
diff --git a/addons/vehicles/stringtable.xml b/addons/vehicles/stringtable.xml
index 9f52eedb32d..901fe89afd1 100644
--- a/addons/vehicles/stringtable.xml
+++ b/addons/vehicles/stringtable.xml
@@ -54,7 +54,7 @@
Oculta a opção de interação para ejetar. Requer que o jogo seja reiniciado.
Убирает действие 'Выпрыгнуть' из меню. (Требует перезагрузки)
Versteckt den Abspringen-Eintrag aus dem Aktionsmenü. Benötigt Neustart des Spiels.
- 휠액션에서 탈출을 숨깁니다. 게임 재시작을 필요로 합니다.
+ 마우스 휠 상호작용에서 비상탈출을 숨깁니다. 게임 재시작을 필요로 합니다.
アクションメニューに"脱出"の項目を表示しないようにします。ゲームの再起動が必要です。
隱藏在動作選單中逃脫動作的選項。要求遊戲重新啟動。
隐藏鼠标滚轮菜单中的下车选项。需要重新启动游戏。
diff --git a/addons/weaponselect/stringtable.xml b/addons/weaponselect/stringtable.xml
index 52d02f150fd..cd95171e0a7 100644
--- a/addons/weaponselect/stringtable.xml
+++ b/addons/weaponselect/stringtable.xml
@@ -61,7 +61,7 @@
Lançador de fumaça
Пустить дымовую завесу
Rauchwand abfeuern
- 연막발사기 박사
+ 연막발사기 발사
発煙弾を発射
發射煙霧發射器
发射烟雾发射器
diff --git a/addons/weather/stringtable.xml b/addons/weather/stringtable.xml
index 4f92af160a4..75f9592ed75 100644
--- a/addons/weather/stringtable.xml
+++ b/addons/weather/stringtable.xml
@@ -127,7 +127,7 @@
Pokaż akcje sprawdzającą temperaturę powietrza
Mostrar a ação "Checar a temperatura do ar"
Показывать действие проверки температуры
- Zeige "Überprüfe Lufttemperatur" im Selbstinteraktionsmenü
+ Zeige "Überprüfe Lufttemperatur" Interaktion
상호작용에서 기온 측정하기 표시
気温を確認のアクションを表示
顯示檢查氣溫動作
diff --git a/addons/zeus/functions/fnc_moduleSuicideBomber.sqf b/addons/zeus/functions/fnc_moduleSuicideBomber.sqf
index 6db261da534..89bfb250e1c 100644
--- a/addons/zeus/functions/fnc_moduleSuicideBomber.sqf
+++ b/addons/zeus/functions/fnc_moduleSuicideBomber.sqf
@@ -26,6 +26,7 @@
#define SCANNING_PERIOD 1
#ifdef DEBUG_MODE_FULL
+ #undef SCANNING_PERIOD
#define SCANNING_PERIOD 0
#endif
diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml
index 1b7c7cac730..120a14e4f81 100644
--- a/addons/zeus/stringtable.xml
+++ b/addons/zeus/stringtable.xml
@@ -222,7 +222,7 @@
Adicionar Arsenal Completo
Добавить весь Арсенал
Füge ganzes Arsenal hinzu
- 아스날 놓기
+ 전체 기존 아스널 추가
BI 武器庫を追加
增加完整的虛擬軍火庫到物件上
增加完整的虚拟军火库到物体上
@@ -483,7 +483,7 @@
Construção por construção
Здание за зданием
Gebäude nach Gebäude
- 건물에서 건물로
+ 건물마다
建物ごとに
一棟填滿後再換下一棟
一栋填满后再换下一栋
@@ -904,7 +904,7 @@
Remover Arsenal
Убрать Арсенал
Entferne Arsenal
- 아스날 제거
+ 전체 기존 아스널 제거
BI 武器庫を削除
移除物件上的虛擬軍火庫
移除物体上的虚拟军火库
@@ -951,7 +951,7 @@
Definir como engenheiro
Назначить инженера
Engineer zuweisen
- 엔지니어 지정
+ 공병 임명
工兵に割り当て
指派工程師
指派工程师
@@ -968,7 +968,7 @@
Habilidade do engenheiro
Инженерное мастерство
Ingenieur Fähigkeit
- 기술자의 기술
+ 공병의 숙련도
工兵のスキル
工程師技能
工程师技能
@@ -1480,7 +1480,7 @@
Desguarnecer grupo
Вывести группу из здания
Garnisionsgruppe auflösen
- 주둔해제
+ 그룹 주둔 해제
グループの駐屯解除
解除駐軍駐守狀態
解除驻军驻守状态
diff --git a/docs/wiki/class-names.md b/docs/wiki/class-names.md
index 0dcf014da16..7d3b425a58b 100644
--- a/docs/wiki/class-names.md
+++ b/docs/wiki/class-names.md
@@ -161,6 +161,7 @@ ACE_gunbag_Tan | Gunbag | Backpack |
Class Name | In-Game Name | Type |
---------- | --------- | ---------
ACE_EarPlugs | Earplugs | ACE_ItemCore |
+ACE_EHP | Electronic Hearing Protection | ACE_ItemCore |
### HuntIR
`Added in 3.1.1`
diff --git a/docs/wiki/development/ace3-config-entries.md b/docs/wiki/development/ace3-config-entries.md
index 8ff22438a10..8c7f1e43d34 100644
--- a/docs/wiki/development/ace3-config-entries.md
+++ b/docs/wiki/development/ace3-config-entries.md
@@ -129,6 +129,7 @@ ace_nextmodeclass
ace_modedescription
ace_hearing_protection
ace_hearing_lowerVolume
+ace_hearing_hasEHP
```
diff --git a/docs/wiki/framework/hearing-framework.md b/docs/wiki/framework/hearing-framework.md
index a6748b77898..4e1131d4a45 100644
--- a/docs/wiki/framework/hearing-framework.md
+++ b/docs/wiki/framework/hearing-framework.md
@@ -17,8 +17,9 @@ version:
```cpp
class CfgWeapons {
class MyHelmet {
- ace_hearing_protection = 0.80; // Protection against deafening (0 to 1, higher means more protection)
- ace_hearing_lowerVolume = 0.60; // Muffling of the sound (0 to 1, higher means more muffling)
+ ace_hearing_protection = 0.80; // Protection against deafening (0 to 1, higher means more protection)
+ ace_hearing_lowerVolume = 0.60; // Muffling of the sound (0 to 1, higher means more muffling)
+ ace_hearing_hasEHP = 1; // Is electronic hearing protection (0 to disable, 1 to enable)
};
};
```
diff --git a/extension/src/lib.rs b/extension/src/lib.rs
index 7d7565fb3e1..daaa3372f92 100644
--- a/extension/src/lib.rs
+++ b/extension/src/lib.rs
@@ -1,5 +1,6 @@
#![deny(clippy::all)]
#![deny(missing_debug_implementations)]
+#![allow(static_mut_refs)]
//! ACE3 Extension for quick maths and OS APIs