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..1815b58bb00 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
부착 투척물 줍기 활성화
装着済の投擲物の拾い上げを有効化
啟用可撿取附著投擲物
@@ -133,6 +133,7 @@
Zeige während des werfens Windinformationen an, um Rauchgranaten effektiver zu platzieren.
연막탄을 효과적으로 배치하는 데 도움이 되도록 투척하는 동안 일시적으로 바람 정보를 표시합니다.
投擲行動中に風向きの情報を一時的に表示し、発煙手榴弾の煙幕を効果的に展開しやすくします。
+ 准备投掷时显示风速风向信息, 来帮助烟雾弹投掷
Show Temporary Wind Info
@@ -143,6 +144,7 @@
Zeige temporäre Windinformationen
바람 정보 임시로 표시
一時的に風の情報を表示
+ 临时显示风场信息
Enables advanced throwing system.
diff --git a/addons/ai/stringtable.xml b/addons/ai/stringtable.xml
index cde68795937..c79ac692d16 100644
--- a/addons/ai/stringtable.xml
+++ b/addons/ai/stringtable.xml
@@ -12,6 +12,7 @@
Rüstet NVG nachts aus dem Inventar aus und entfernt es tagsüber.\nFügt keine NVGs zum Inventar hinzu!
야간에는 야투경을 소지품에 장착하고 주간에는 장착을 해제합니다.\n주의! 소지품에 야투경을 추가하는 것이 아닙니다!
インベントリ内の暗視装置を夜間に装備し、日中は解除し収納します。\nこれはNVGをインベントリに追加しません。
+ 在夜晚自动佩戴夜视仪, 在白天自动摘下来\n不会将夜视仪添加进物品栏中!
Auto-Equip NVGs
@@ -24,6 +25,7 @@
Automatisch NVGs ausrüsten
야투경 자동 창착
暗視装置の自動装備
+ 自动佩戴夜视仪
AI
diff --git a/addons/aircraft/stringtable.xml b/addons/aircraft/stringtable.xml
index bd087e1e262..f23db3e8238 100644
--- a/addons/aircraft/stringtable.xml
+++ b/addons/aircraft/stringtable.xml
@@ -27,6 +27,7 @@
Folge-Entfernung
따라가는 거리
追跡距離
+ 跟随距离
Following unit within %1m
@@ -37,6 +38,7 @@
Folgt Einheit bis zu %1m
%1m 이내로 유닛을 따라갑니다
%1m 間隔で 目標を追跡します
+ 在%1m内跟随单位
30mm DU Armor Piercing
diff --git a/addons/arsenal/XEH_PREP.hpp b/addons/arsenal/XEH_PREP.hpp
index b69ff0cb749..e622ee66b52 100644
--- a/addons/arsenal/XEH_PREP.hpp
+++ b/addons/arsenal/XEH_PREP.hpp
@@ -93,6 +93,8 @@ PREP(sortStatement_mod);
PREP(sortStatement_protection);
PREP(sortStatement_rateOfFire);
PREP(sortStatement_scopeMag);
+PREP(statCondition_existsAll);
+PREP(statCondition_existsAny);
PREP(statBarStatement_accuracy);
PREP(statBarStatement_default);
PREP(statBarStatement_impact);
@@ -107,6 +109,7 @@ PREP(statTextStatement_rateOfFire);
PREP(statTextStatement_scopeMag);
PREP(statTextStatement_scopeVisionMode);
PREP(statTextStatement_smokeChemTTL);
+PREP(statTextStatement_yesno);
PREP(updateCamPos);
PREP(updateRightPanel);
PREP(updateCurrentItemsList);
diff --git a/addons/arsenal/functions/fnc_addListBoxItem.sqf b/addons/arsenal/functions/fnc_addListBoxItem.sqf
index 777b1efe875..b51a585a3b5 100644
--- a/addons/arsenal/functions/fnc_addListBoxItem.sqf
+++ b/addons/arsenal/functions/fnc_addListBoxItem.sqf
@@ -48,14 +48,21 @@ if (_skip) exitWith {};
private _configPath = ([configFile, campaignConfigFile, missionConfigFile] select _configRoot) >> _configCategory >> _className;
private _dlcName = _configPath call EFUNC(common,getAddon);
+ // Get DLC requirements
+ ([_configPath] call EFUNC(common,getDLC)) params ["_dlcClass", "_dlcSteamID"];
+ private _dlcPicture = "";
+ if (_dlcClass != "") then {
+ _dlcPicture = getText (configFile >> "CfgMods" >> _dlcClass >> "logo");
+ };
+
// If _pictureEntryName is empty, then this item has no picture (e.g. faces)
- [configName _configPath, getText (_configPath >> "displayName"), if (_pictureEntryName == "") then {""} else {getText (_configPath >> _pictureEntryName)}, if (_dlcName != "") then {(modParams [_dlcName, ["logo"]]) param [0, ""]} else {""}]
-}, true]) params ["_className", "_displayName", "_itemPicture", "_modPicture"];
+ [configName _configPath, getText (_configPath >> "displayName"), if (_pictureEntryName == "") then {""} else {getText (_configPath >> _pictureEntryName)}, if (_dlcName != "") then {(modParams [_dlcName, ["logo"]]) param [0, ""]} else {""}, _dlcPicture]
+}, true]) params ["_className", "_displayName", "_itemPicture", "_modPicture", "_dlcPicture"];
private _lbAdd = _ctrlPanel lbAdd _displayName;
_ctrlPanel lbSetData [_lbAdd, _className];
_ctrlPanel lbSetPicture [_lbAdd, _itemPicture];
-_ctrlPanel lbSetPictureRight [_lbAdd, ["", _modPicture] select GVAR(enableModIcons)];
+_ctrlPanel lbSetPictureRight [_lbAdd, ["", _modPicture, _dlcPicture] select GVAR(enableModIcons)];
_ctrlPanel lbSetTooltip [_lbAdd, format ["%1\n%2", _displayName, _className]];
if ((toLowerANSI _className) in GVAR(favorites)) then {
diff --git a/addons/arsenal/functions/fnc_fillLeftPanel.sqf b/addons/arsenal/functions/fnc_fillLeftPanel.sqf
index 1eb98d29eca..3c3f0c4831b 100644
--- a/addons/arsenal/functions/fnc_fillLeftPanel.sqf
+++ b/addons/arsenal/functions/fnc_fillLeftPanel.sqf
@@ -94,7 +94,7 @@ private _selectedItem = if (_idxVirt != -1) then { // Items
_lbAdd = _ctrlPanel lbAdd _displayName;
_ctrlPanel lbSetData [_lbAdd, _x];
_ctrlPanel lbSetTooltip [_lbAdd, format ["%1\n%2", _displayName, _x]];
- _ctrlPanel lbSetPictureRight [_lbAdd, ["", _modPicture] select GVAR(enableModIcons)];
+ _ctrlPanel lbSetPictureRight [_lbAdd, ["", _modPicture, ""] select GVAR(enableModIcons)];
} forEach GVAR(faceCache); // HashMap, not array
GVAR(currentFace)
diff --git a/addons/arsenal/functions/fnc_fillLoadoutsList.sqf b/addons/arsenal/functions/fnc_fillLoadoutsList.sqf
index 6174193b73d..8dc8ef76a28 100644
--- a/addons/arsenal/functions/fnc_fillLoadoutsList.sqf
+++ b/addons/arsenal/functions/fnc_fillLoadoutsList.sqf
@@ -101,9 +101,21 @@ if (GVAR(currentLoadoutsTab) != IDC_buttonSharedLoadouts) then {
// Change color on loadout lines that have items that aren't available or don't exist
if (_nullItemsList isNotEqualTo []) then {
_contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 0, 0, 0.8]]; // Red
+
+ if (GVAR(showUnavailableItems) == 2) then {
+ _contentPanelCtrl lnbSetTooltip [[_newRow, 0], format [LLSTRING(missingItems), (_nullItemsList arrayIntersect _nullItemsList) joinString endl]];
+ };
} else {
if (_unavailableItemsList isNotEqualTo []) then {
_contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 1, 1, 0.25]]; // Gray
+
+ if (GVAR(showUnavailableItems) > 0) then {
+ private _itemDisplayNames = _unavailableItemsList arrayIntersect _unavailableItemsList;
+ if (GVAR(showUnavailableItems) != 2) then { // Prettify
+ _itemDisplayNames = _itemDisplayNames apply {getText (_x call CBA_fnc_getItemConfig >> "displayName")};
+ };
+ _contentPanelCtrl lnbSetTooltip [[_newRow, 0], format [LLSTRING(unavailableItems), _itemDisplayNames joinString endl]];
+ };
};
};
@@ -148,9 +160,21 @@ if (GVAR(currentLoadoutsTab) != IDC_buttonSharedLoadouts) then {
// Change color on loadout lines that have items that aren't available or don't exist
if (_nullItemsList isNotEqualTo []) then {
_contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 0, 0, 0.8]]; // Red
+
+ if (GVAR(showUnavailableItems) == 2) then {
+ _contentPanelCtrl lnbSetTooltip [[_newRow, 0], format [LLSTRING(missingItems), (_nullItemsList arrayIntersect _nullItemsList) joinString endl]];
+ };
} else {
if (_unavailableItemsList isNotEqualTo []) then {
_contentPanelCtrl lnbSetColor [[_newRow, 1], [1, 1, 1, 0.25]]; // Gray
+
+ if (GVAR(showUnavailableItems) > 0) then {
+ private _itemDisplayNames = _unavailableItemsList arrayIntersect _unavailableItemsList;
+ if (GVAR(showUnavailableItems) != 2) then { // Prettify
+ _itemDisplayNames = _itemDisplayNames apply {getText (_x call CBA_fnc_getItemConfig >> "displayName")};
+ };
+ _contentPanelCtrl lnbSetTooltip [[_newRow, 0], format [LLSTRING(unavailableItems), _itemDisplayNames joinString endl]];
+ };
};
};
};
diff --git a/addons/arsenal/functions/fnc_statCondition_existsAll.sqf b/addons/arsenal/functions/fnc_statCondition_existsAll.sqf
new file mode 100644
index 00000000000..5ecafa7df41
--- /dev/null
+++ b/addons/arsenal/functions/fnc_statCondition_existsAll.sqf
@@ -0,0 +1,22 @@
+#include "..\script_component.hpp"
+/*
+ * Author: LinkIsGrim
+ * Stat condition to only show stats if all exist.
+ *
+ * Arguments:
+ * 0: Stats
+ * 1: Item config path
+ *
+ * Return Value:
+ * Show stat
+ *
+ * Example:
+ * ["ACE_maxZeroing", _config] call ace_arsenal_fnc_statCondition_existsAll
+ *
+ * Public: Yes
+*/
+
+params ["_stats", "_config"];
+TRACE_2("statCondition_existsAll",_stats,_config);
+
+(_stats findIf {isNull (_config >> _x)}) == -1
diff --git a/addons/arsenal/functions/fnc_statCondition_existsAny.sqf b/addons/arsenal/functions/fnc_statCondition_existsAny.sqf
new file mode 100644
index 00000000000..5228cb7d778
--- /dev/null
+++ b/addons/arsenal/functions/fnc_statCondition_existsAny.sqf
@@ -0,0 +1,22 @@
+#include "..\script_component.hpp"
+/*
+ * Author: LinkIsGrim
+ * Stat condition to only show stats if at least one exists.
+ *
+ * Arguments:
+ * 0: Stats
+ * 1: Item config path
+ *
+ * Return Value:
+ * Show stat
+ *
+ * Example:
+ * ["ACE_maxZeroing", _config] call ace_arsenal_fnc_statCondition_existsAny
+ *
+ * Public: Yes
+*/
+
+params ["_stats", "_config"];
+TRACE_2("statCondition_existsAny",_stats,_config);
+
+(_stats findIf {!isNull (_config >> _x)}) != -1
diff --git a/addons/arsenal/functions/fnc_statTextStatement_yesno.sqf b/addons/arsenal/functions/fnc_statTextStatement_yesno.sqf
new file mode 100644
index 00000000000..ea5611a3e40
--- /dev/null
+++ b/addons/arsenal/functions/fnc_statTextStatement_yesno.sqf
@@ -0,0 +1,25 @@
+#include "..\script_component.hpp"
+/*
+ * Author: LinkIsGrim
+ * Generic Yes/No/None Text statement for boolean stats.
+ *
+ * Arguments:
+ * 0: Stat
+ * 1: Item config path
+ *
+ * Return Value:
+ * Stat Text
+ *
+ * Example:
+ * ["ACE_hasEHP", _config] call ace_arsenal_fnc_statTextStatement_yesno
+ *
+ * Public: Yes
+*/
+
+params ["_stat", "_config"];
+TRACE_2("statTextStatement_yesno",_stat,_config);
+
+private _statConfig = _config >> _stat;
+if (isNull _statConfig) exitWith { LELSTRING(common,none) };
+
+localize ([ELSTRING(common,No), ELSTRING(common,Yes)] select (getNumber _statConfig > 0))
diff --git a/addons/arsenal/initSettings.inc.sqf b/addons/arsenal/initSettings.inc.sqf
index bc093eb5228..f3a26531ccc 100644
--- a/addons/arsenal/initSettings.inc.sqf
+++ b/addons/arsenal/initSettings.inc.sqf
@@ -10,10 +10,11 @@ private _category = LLSTRING(settingCategory);
[
QGVAR(enableModIcons),
- "CHECKBOX",
+ "LIST",
[LSTRING(modIconsSetting), LSTRING(modIconsTooltip)],
_category,
- true
+ [[0, 1, 2], [ELSTRING(common,Disabled), ELSTRING(common,Enabled), LSTRING(DLCRequirement)], 1],
+ false
] call CBA_fnc_addSetting;
[
@@ -72,6 +73,15 @@ private _loadoutCategory = LLSTRING(loadoutSubcategory);
true
] call CBA_fnc_addSetting;
+[
+ QGVAR(showUnavailableItems),
+ "LIST",
+ [LSTRING(unavailableItemsSetting), LSTRING(unavailableItemsTooltip)],
+ [_category, _loadoutCategory],
+ [[0, 1, 2], [ELSTRING(common,Disabled), ELSTRING(common,Enabled), ELSTRING(common,Debug)], 0],
+ 2 // never overwrite the client
+] call CBA_fnc_addSetting;
+
[
QGVAR(EnableRPTLog),
"CHECKBOX",
@@ -79,7 +89,7 @@ private _loadoutCategory = LLSTRING(loadoutSubcategory);
LSTRING(printToRPTTooltip)],
[_category, _loadoutCategory],
false,
- false
+ 2 // never overwrite the client
] call CBA_fnc_addSetting;
[
diff --git a/addons/arsenal/stringtable.xml b/addons/arsenal/stringtable.xml
index e64bb11962f..2a98a90827e 100644
--- a/addons/arsenal/stringtable.xml
+++ b/addons/arsenal/stringtable.xml
@@ -93,6 +93,22 @@
无法开启 ACE 虚拟军火库
ACE Arsenal açılamıyor
+
+ DLC Required
+ Vyžadováno DLC
+ DLC requis
+ Requiere DLC
+ DLC richiesto
+ Wymagane DLC
+ DLC necessário
+ Требуется DLC
+ DLC erforderlich
+ DLC 필요
+ DLCが必要です
+ 需要DLC
+ 需要DLC
+ DLC gereklidir
+
Detonates on impact
Détonation à l'impact
@@ -209,7 +225,7 @@
Atraso de detonação
Задержка детонации
Detonationsverzögerung
- 신관 시간
+ 신관 작동 시간
信管設定時間
引信时间
@@ -447,6 +463,7 @@
Wechseln Sie zwischen der Anzeige aller Elemente oder Ihrer Favoriten.\nDoppelklicken Sie bei gedrückter Umschalttaste, um ein Element hinzuzufügen oder zu entfernen.
모든 아이템을 표시하거나 즐겨찾기를 표시할 때 전환합니다\nShift 키를 누른 상태에서 두 번 클릭하여 아이템을 추가하거나 제거합니다.
アイテムをすべて表示するかお気に入りのみを表示するかを切り替えます。\nアイテムをお気に入りに追加または削除するには、Shiftキーを押しながらダブルクリックします。
+ 切换显示所有物品或收藏物品\n按住shift双击左键可将某物品加入或移出收藏
Hide
@@ -648,6 +665,7 @@
Suche\nSTRG + Click für Live-Aktualisierung während des Schreibens
검색\nCtrl + 클릭으로 실시간 검색 결과를 활성화
検索\nCTRL + クリックで検索結果の即時表示を有効化
+ CTRL+左键启用即时显示搜索结果
Private
@@ -724,6 +742,7 @@
Standardmäßig auf Favoriten eingestellt
즐겨찾기 기본값
お気に入りを標準に
+ 默认仅显示收藏物品
Controls whether the ACE Arsenal defaults to showing all items or favorites.
@@ -736,6 +755,7 @@
Steuert, ob das ACE Arsenal standardmäßig alle Gegenstände oder nur Favoriten anzeigt.
ACE 아스널이 기본적으로 모든 아이템 또는 즐겨찾기를 표시할 지 여부를 조정합니다.
ACE 武器庫が標準ですべてのアイテムを表示するか、お気に入りを表示するかを制御します。
+ 切换显示所有物品或仅显示收藏物品
Enable the faces / voices / insignias tabs
@@ -827,6 +847,7 @@
Favoritenfarbe
즐겨찾기 색상
お気に入りの色
+ 收藏物品颜色
Highlight color for favorited items.
@@ -839,6 +860,7 @@
Hervorhebungsfarbe für Lieblingsgegenstände.
즐겨찾기한 아이템을 색상으로 강조합니다.
お気に入りアイテムのハイライト色。
+ 高亮收藏物品的颜色
Panel font height
@@ -936,6 +958,16 @@
反转摄影机控制
Kamera kontrollerini ters çevir
+
+ Show missing / unavailable items
+ 누락/사용 불가 아이템 표시
+ 存在しない/利用できないアイテムを表示
+
+
+ Show missing / unavailable items when hovering over a loadout
+ 로드아웃 위에 마우스 커서를 올리면 누락되거나 사용할 수 없는 아이템을 표시합니다.
+ 装備にカーソルを重ねた時に存在しない/利用できないアイテムを表示します
+
The following loadout was deleted:
Tato sada vybavení byla smazána:
@@ -946,7 +978,7 @@
O seguinte loadout foi apagado:
Удален комплект экипировки:
Folgende Ausrüstung wurde entfernt:
- 다음 로드아웃이 삭제됨 :
+ 다음 로드아웃이 삭제됨:
装備を削除しました:
以下的裝備已被刪除:
以下的负载已被删除:
@@ -1026,7 +1058,7 @@
O seguinte loadout não é mais público:
Этот комплект экипировки больше не публичный:
Folgende Ausrüstung ist nicht mehr öffentlich:
- 다음 로드아웃이 더이상 공용이 아님:
+ 다음 로드아웃이 더 이상 공용이 아님:
装備を非公開にしました:
以下的裝備已不再被分享:
以下的负载已不再被分享:
@@ -1043,6 +1075,7 @@
Gesicht Speichern
얼굴 저장
顔の保存
+ 保存脸模
Save Insignia
@@ -1055,6 +1088,7 @@
Insignia Speichern
계급장 저장
バッジ(記章)の保存
+ 保存徽章
Save Voice
@@ -1067,6 +1101,12 @@
Stimme Speichern
목소리 저장
声の保存
+ 保存声音
+
+
+ Missing items:\n%1
+ 누락 아이템:\n%1
+ 存在しないアイテム:\n%1
Enable mod icons
@@ -1100,6 +1140,11 @@
在左面板中显示/隐藏模组图示
Sol panel de mod ikonlarını göster/gizle
+
+ Unavailable items:\n%1
+ 사용 불가 아이템:\n%1
+ 利用できないアイテム:\n%1
+
No virtual items available
Není dostupný žádný virtuální předmět
@@ -1187,7 +1232,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
누락 된 항목 / 사용 할 수 없는 항목 기록
欠落 / 利用不可アイテムを記録
記錄遺失/無法使用的項目
@@ -1301,6 +1346,7 @@
Aufsteigend
오름차순
昇順
+ 升序
Sort by accuracy
@@ -1439,6 +1485,7 @@
Absteigend
내림차순
降順
+ 降序
Illuminators
@@ -1450,6 +1497,7 @@
Leuchtmittel
조명
イルミネーター
+ 照明
Ammo count
@@ -1462,6 +1510,7 @@
Munitionszahl
장탄 수
弾薬数
+ 弹药数量
Magnification
@@ -1583,6 +1632,7 @@
Thermal und in Primärwaffe integriert
열화상과 주무기 내장
熱画像装置内蔵・プライマリに内蔵
+ 热成像&主镜内置
Primary supported
@@ -1623,6 +1673,7 @@
Thermal integriert
열화상 내장
熱画像装置内蔵
+ 内置热成像
Default loadouts
@@ -1715,7 +1766,7 @@
Комплекты экипировки, опубликованные вами и другими игроками
Ausrüstungen, die von dir und anderen Spielern geteilt wurden
플레이어들이 공유하는 로드아웃
- 自分か他人によって共有された装備です
+ 自分や他人によって共有された装備です
由你與其他玩家分享的裝備配置
你和其他玩家分享的负载配置
Senin veya diğer kişiler tarafından paylaşılan kıyafetler
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/attach/stringtable.xml b/addons/attach/stringtable.xml
index b25bac2e2ea..8ce6064a12d 100644
--- a/addons/attach/stringtable.xml
+++ b/addons/attach/stringtable.xml
@@ -96,7 +96,7 @@
Desprender item
Отсоединить
Gegenstand entfernen
- 떼내기
+ 떼어내기
アイテムを外す
取下裝備
取下装备
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/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml
index 356add4123d..a48e7b341ec 100644
--- a/addons/ballistics/stringtable.xml
+++ b/addons/ballistics/stringtable.xml
@@ -3453,6 +3453,7 @@
Luft
항공
航空
+ 对空
Armor
@@ -3465,6 +3466,7 @@
Panzerung
기갑
機甲
+ 对装甲
Smoke
@@ -3477,6 +3479,7 @@
Rauch
연막탄
発煙弾
+ 烟雾
Illum
@@ -3489,6 +3492,7 @@
Leuchtmittel
조명탄
照明弾
+ 照明弹
Inf
@@ -3501,6 +3505,7 @@
Infanterie
보병
歩兵
+ 步兵
Veh
@@ -3513,6 +3518,7 @@
Fahrzeug
차량
車両
+ 载具
AI Usage
@@ -3525,6 +3531,7 @@
KI Verwendet
인공지능 사용
AIの使用
+ AI使用场景
Ballistic coefficient
diff --git a/addons/captives/stringtable.xml b/addons/captives/stringtable.xml
index 9951b72fa44..89d96de1da9 100644
--- a/addons/captives/stringtable.xml
+++ b/addons/captives/stringtable.xml
@@ -12,6 +12,7 @@
Augen verbinden
포로 눈 가리기
目隠しをする
+ 使用眼罩
Cable Tie
@@ -122,7 +123,7 @@
Sincronizar uma unidade para deixá-la algemada.
Синхронизируйте с юнитами, чтобы связать им руки.
Synchronisiere eine Einheit, um sie in Handschellen zu legen.
- 수갑을 채우기 위해 동기화합니다.
+ 수갑을 채우게 할 유닛을 동기화합니다.
同期されたユニットを拘束させます。
使單位戴上手銬
使单位戴上手铐
@@ -235,7 +236,7 @@
Pode algemar o próprio lado
Можно связывать руки союзникам
Kann Kameraden fesseln
- 자기편을 포박 할 수 있습니다.
+ 자기 편을 포박 할 수 있습니다.
自陣営を拘束可能に
可以銬住同陣營隊友
可以铐住同阵营队友
@@ -311,7 +312,7 @@
Sincroniza uma unidade para fazer com que ela se renda.
Синхронизируйте с юнитами, чтобы заставить их сдаться.
Einheit synchronisieren, um sie kapitulieren zu lassen.
- 투항시키기 위해 동기화합니다.
+ 투항시키려 할 유닛을 동기화합니다.
同期されたユニットを投降させます。
同步此模塊到一個單位,使該單位投降
同步此模块到一个单位,使该单位投降
@@ -379,6 +380,7 @@
Augenbinde entfernen
눈가리개 풀기
目隠しを外す
+ 移除眼罩
Take Prisoner
@@ -441,7 +443,7 @@
Parar de se render
Прекратить сдаваться
Den Kampf erneut aufnehmen
- 투항하는것을 멈춤
+ 투항하는 것을 멈춤
投降をやめる
停止投降
停止投降
diff --git a/addons/cargo/stringtable.xml b/addons/cargo/stringtable.xml
index d54ea6e7fc2..b7ac46de493 100644
--- a/addons/cargo/stringtable.xml
+++ b/addons/cargo/stringtable.xml
@@ -58,6 +58,7 @@
%1 wird in %2 geladen...
%1을(를) %2에 싣는 중...
%1 を %2 に積み込んでいます・・・
+ 正在将%1装入%2
Enable Cargo
@@ -171,6 +172,7 @@
Frachtgröße: %1
화물 크기: %1
貨物の大きさ: %1
+ 货物大小: %1
Unloaded<br/>%1 from<br/>%2
@@ -213,6 +215,7 @@
Kann nicht entladen werden
하역할 수가 없습니다
荷降ろし不可能です
+ 无法被卸载
Unloading %1 from %2...
@@ -223,6 +226,7 @@
%1 wird von %2 entladen...
%1을(를) %2(으)로부터 내리는 중...
%1 を %2 から降ろしています・・・
+ 正在将%1从%2中卸载
Check Cargo Size
Vérifier la taille de la cargaison
+ Controlla spazio del carico
Проверить размер груза
+ 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
+ Mostra interazione di controllo dello spazio del carico
+ 显示检查货物尺寸选项
Custom name has been cleared.
@@ -324,6 +337,7 @@
Aufstellen
배치하기
配置する
+ 部署
Enable deploy
@@ -334,6 +348,7 @@
Aktiviere Aufbauen
배치 활성화
配置機能を有効化
+ 启用部署
Controls whether cargo items can be unloaded via the deploy method.
@@ -344,6 +359,7 @@
Steuert, ob Frachtgegenstände über die Aufbaumethode entladen werden können.
배치 방법을 통해 화물 아이템을 내릴 수 있는지 여부를 제어합니다.
配置機能を介して貨物アイテムを降ろすことが出来るかどうかを制御します。
+ 是否允许使用部署选项卸载货物
Cargo space left: %1
diff --git a/addons/chemlights/stringtable.xml b/addons/chemlights/stringtable.xml
index f179bd49bc4..4cd66ad1c6d 100644
--- a/addons/chemlights/stringtable.xml
+++ b/addons/chemlights/stringtable.xml
@@ -459,7 +459,7 @@
Protetor de Bastão de Luz (Vazio)
Контейнер для химсвета (пустой)
Knicklicht-Abschirmung (leer)
- 화학조명 가림막 (비어있음)
+ 화학조명 가림막 (비어 있음)
ケミカルライト シールド(空)
螢光棒保護殼 (空)
荧光棒保护壳(空)
diff --git a/addons/common/XEH_PREP.hpp b/addons/common/XEH_PREP.hpp
index e6a2a042c09..e8cfb683518 100644
--- a/addons/common/XEH_PREP.hpp
+++ b/addons/common/XEH_PREP.hpp
@@ -73,6 +73,7 @@ PREP(getDefaultAnim);
PREP(getDefinedVariable);
PREP(getDefinedVariableDefault);
PREP(getDefinedVariableInfo);
+PREP(getDLC);
PREP(getFiremodeIndex);
PREP(getFirstObjectIntersection);
PREP(getFirstTerrainIntersection);
@@ -80,6 +81,8 @@ PREP(getGunner);
PREP(getInPosition);
PREP(getItemReplacements);
PREP(getLocalUnits);
+PREP(getMagneticBearing);
+PREP(getMagneticBearingOffset);
PREP(getMapData);
PREP(getMapGridData);
PREP(getMapGridFromPos);
@@ -122,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..1ad14d8f63b 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)
@@ -73,7 +73,7 @@ GVAR(canDigSurfaces) = createHashMapFromArray [
["wavymetal_exp",false],["int_metal",false],["asphalt_exp",false],["pavement_exp",false],["gridmetal_exp",false],
["rooftiles_exp",false],["rock",false],["int_mat_exp",false],["wood_int",false],["concrete_int",false],["tarmac",false],["wood",false],
["roof_tin",false],["lino_exp",false],["concrete",false],["int_softwood_exp",false], ["concrete_exp",false],["stones_exp",false],
- ["forest_exp",true],["snow",true],["grasstall_exp",true],["grass",true]
+ ["forest_exp",true],["snow",true],["grasstall_exp",true],["grass",true],["forest",true],["drygrass",true]
];
isHC = !hasInterface && !isDedicated; // deprecated because no tag
diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf
index ed494627702..3cbd2e9bb10 100644
--- a/addons/common/functions/fnc_displayTextStructured.sqf
+++ b/addons/common/functions/fnc_displayTextStructured.sqf
@@ -28,7 +28,7 @@ if (typeName _text != "TEXT") then {
if (count _text > 0) then {
{
if (_x isEqualType "" && {isLocalized _x}) then {
- _text set [_foreachIndex, localize _x];
+ _text set [_forEachIndex, localize _x];
};
} forEach _text;
_text = format _text;
diff --git a/addons/common/functions/fnc_getDLC.sqf b/addons/common/functions/fnc_getDLC.sqf
new file mode 100644
index 00000000000..16b96d99737
--- /dev/null
+++ b/addons/common/functions/fnc_getDLC.sqf
@@ -0,0 +1,72 @@
+#include "..\script_component.hpp"
+/*
+ * Author: Brett Mayson
+ * Get the DLC information of a class.
+ *
+ * Arguments:
+ * 0: Classname or Config
+ * 1: Config root, searches if unspecified or null (default: configNull)
+ *
+ * Return Value:
+ * DLC Info
+ * 0: DLC Classname
+ * 1: Steam ID
+ *
+ * Example:
+ * "launch_NLAW_F" call ace_common_fnc_getDLC
+ *
+ * Public: Yes
+ */
+
+params [["_class", configNull, ["", configNull]], ["_root", configNull, [configNull]]];
+
+private _config = if (_class isEqualType configNull) then {
+ _class
+} else {
+ if !(isNull _root) then {
+ _root >> _class
+ } else {
+ _class call CBA_fnc_getItemConfig
+ };
+};
+if (isNull _config) exitWith {
+ ["", 0]
+};
+
+if (getNumber (_config >> "ItemInfo" >> "type") == TYPE_UNIFORM) then {
+ _config = configFile >> "CfgVehicles" >> getText (_config >> "itemInfo" >> "uniformClass")
+};
+
+(getAssetDLCInfo getText (_config >> "model")) params [
+ "_isDLC", "", "", "", "_id"
+];
+
+if (!_isDLC) exitWith {
+ ["", 0]
+};
+
+private _name = switch (_id) do {
+ case "1021790": { "Enoch" };
+ case "395180": { "Expansion" };
+ case "304380": { "Heli" };
+ case "601670": { "Jets" };
+ case "288520": { "Kart" };
+ case "332350": { "Mark" };
+ case "288520": { "Orange" };
+ case "744950": { "Tacops" };
+ case "798390": { "Tank" };
+ case "1042220": { "GM" };
+ case "1227700": { "VN" };
+ case "1294440": { "CSLA" };
+ case "1681170": { "WS" };
+ case "1175380": { "SPE" };
+ case "2647760": { "RF" };
+ case "2647830": { "EF" };
+ default { "" };
+};
+
+if !(_id isEqualType 0) then {
+ _id = parseNumber _id;
+};
+
+[_name, _id]
diff --git a/addons/common/functions/fnc_getMagneticBearing.sqf b/addons/common/functions/fnc_getMagneticBearing.sqf
new file mode 100644
index 00000000000..212dd96ecfe
--- /dev/null
+++ b/addons/common/functions/fnc_getMagneticBearing.sqf
@@ -0,0 +1,23 @@
+#include "..\script_component.hpp"
+/*
+ * Author: PabstMirror
+ * Returns magnetic heading (0..360)
+ *
+ * Arguments:
+ * 0: Object or Bearing
+
+ Debug
+ Debug
+ Debug
+ Debug
+ Отладка
+ Debug
+ 디버그
+ デバッグ
+ 开发者模式
+
Deployed sway factor
Facteur de balancement déployé
@@ -555,9 +566,10 @@
Fattore di Oscillazione su Bipode
Fator de balanço de mira em posição de tiro
Коэф. колебания прицела при развертывании
- Verwacklungsfaktor, wenn Zweibein aufgestellt ist.
+ Verwacklungsfaktor bei aufgestelltem Zweibein
거치 시 손떨림 정도
接地展開時の手ぶれ係数
+ 部署时的晃动系数
Influences the amount of weapon sway while weapon is deployed.
@@ -569,6 +581,7 @@
Beeinflusst, wie ruhig man die Waffen hält, während das Zweibein aufgestellt ist.
무기를 거치하는 동안 무기를 흔드는 정도를 정합니다.
武器の接地展開時の武器の手ぶれの大きさに影響します。
+ 武器部署后的晃动系数
Disabled
@@ -711,6 +724,7 @@
Aktiviere Waffen schwanken
무기 흔들림 추가
手ぶれを有効化
+ 启用ACE武器晃动
Enables weapon sway influenced by sway factors, such as stance, fatigue and medical condition.\nDisabling this setting will defer sway to vanilla or other mods.
@@ -721,6 +735,7 @@
Ermöglicht die Beeinflussung des Waffen-Schwankens durch Beeinflussungsfaktoren wie Haltung, Müdigkeit und Gesundheitszustand.\nDie Deaktivierung dieser Einstellung erlaubt die Beeinflussung durch Vanilla oder andere Mods.
흔들림 계수, 자세, 피로도, 건강 상태 등의 요인에 영향을 받는 무기 흔들림을 활성화합니다.\n이 설정을 비활성화하면 바닐라 또는 다른 모드의 흔들림으로 대체됩니다.
姿勢、疲労、負傷状態などの手ぶれ要因に影響を受ける武器照準の揺れを有効にします。\nこの設定を無効にすると、手ぶれの揺れはバニラまたは他のMODの処理に任されます。
+ 启用ACE参数控制的武器晃动, 比如姿势, 体力和受伤状况\n禁用这个选项将会使用原版或其他模组控制的武器晃动
Enabled
@@ -1135,9 +1150,10 @@
Fattore di Oscillazione Appoggiato
Fator de balanço de mira em repouso
Коэф. колебания прицела в состоянии покоя
- Verwacklungsfaktor, wenn aufgelegt
+ Verwacklungsfaktor beim Auflegen
휴식 시 손떨림 정도
静止依託時の手ぶれ係数
+ 有依托时的晃动系数
Influences the amount of weapon sway while weapon is rested.
@@ -1149,6 +1165,7 @@
Beeinflusst, wie ruhig man die Waffe hält, während sie aufgelegt ist.
무기가 아무런 행동도 하지 않는 동안 무기가 흔들리는 정도를 정합니다.
静止し壁などに依託している時の武器の手ぶれの大きさに影響します。
+ 武器依托在物体表面时的晃动系数
S
@@ -1793,6 +1810,26 @@
装载
Yükle
+
+ Realistic Compass Declination
+ Déclinaison réaliste de la boussole
+ Declinazione magnetica realistica
+ Realistische Missweisung des Kompasses
+ 現実的なコンパス偏角
+ Реалистичный компасса
+ 현실적인 나침반 편각
+ 真实的指南针偏角
+
+
+ Compass will point to magnetic north
+ La boussole indique le nord magnétique
+ La bussola indicherà il nord magnetico
+ Der Kompass zeigt nach missweisend Nord
+ コンパスが磁北を指すようになります
+ Компас будет указывать на северный магнитный полюс
+ 나침반이 자북을 가리키게 됩니다.
+ 指南针指向磁北极
+
Players only
Pouze hráči
@@ -1918,6 +1955,7 @@
Waffen schwanken
무기 흔들림
手ぶれ
+ 武器晃动
Toggle Handheld Device
diff --git a/addons/compat_cup_vehicles/CfgVehicles.hpp b/addons/compat_cup_vehicles/CfgVehicles.hpp
index ce502abad53..861dcdc3ab5 100644
--- a/addons/compat_cup_vehicles/CfgVehicles.hpp
+++ b/addons/compat_cup_vehicles/CfgVehicles.hpp
@@ -323,4 +323,40 @@ class CfgVehicles {
"hitera_r16", "hitera_r17", "hitera_r18", "hitera_r19", "hitera_r20"
};
};
+ class CUP_GAZ_Vodnik_Base: Wheeled_APC_F {
+ EGVAR(vehicle_damage,engineDetonationProb) = 0;
+ EGVAR(vehicle_damage,engineFireProb) = 0.1;
+ };
+ class CUP_GAZ_Vodnik_AGS_Base: CUP_GAZ_Vodnik_Base {
+ EGVAR(vehicle_damage,hullDetonationProb) = 0;
+ EGVAR(vehicle_damage,hullFireProb) = 0;
+ EGVAR(vehicle_damage,turretDetonationProb) = 0;
+ EGVAR(vehicle_damage,turretFireProb) = 0;
+ EGVAR(vehicle_damage,canHaveFireRing) = 0;
+ EGVAR(vehicle_damage,canHaveFireJet) = 0;
+ };
+ class CUP_GAZ_Vodnik_Unarmed_base: CUP_GAZ_Vodnik_Base {
+ EGVAR(vehicle_damage,hullDetonationProb) = 0;
+ EGVAR(vehicle_damage,hullFireProb) = 0;
+ EGVAR(vehicle_damage,turretDetonationProb) = 0;
+ EGVAR(vehicle_damage,turretFireProb) = 0;
+ EGVAR(vehicle_damage,canHaveFireRing) = 0;
+ EGVAR(vehicle_damage,canHaveFireJet) = 0;
+ };
+ class CUP_GAZ_Vodnik_MedEvac_Base: CUP_GAZ_Vodnik_Base {
+ EGVAR(vehicle_damage,hullDetonationProb) = 0;
+ EGVAR(vehicle_damage,hullFireProb) = 0;
+ EGVAR(vehicle_damage,turretDetonationProb) = 0;
+ EGVAR(vehicle_damage,turretFireProb) = 0;
+ EGVAR(vehicle_damage,canHaveFireRing) = 0;
+ EGVAR(vehicle_damage,canHaveFireJet) = 0;
+ };
+ class CUP_O_GAZ_Vodnik_PK_RU: CUP_GAZ_Vodnik_Base {
+ EGVAR(vehicle_damage,hullDetonationProb) = 0;
+ EGVAR(vehicle_damage,hullFireProb) = 0;
+ EGVAR(vehicle_damage,turretDetonationProb) = 0;
+ EGVAR(vehicle_damage,turretFireProb) = 0;
+ EGVAR(vehicle_damage,canHaveFireRing) = 0;
+ EGVAR(vehicle_damage,canHaveFireJet) = 0;
+ };
};
diff --git a/addons/compat_ef/$PBOPREFIX$ b/addons/compat_ef/$PBOPREFIX$
new file mode 100644
index 00000000000..680e3bd6194
--- /dev/null
+++ b/addons/compat_ef/$PBOPREFIX$
@@ -0,0 +1 @@
+z\ace\addons\compat_ef
diff --git a/addons/compat_ef/CfgWeapons.hpp b/addons/compat_ef/CfgWeapons.hpp
new file mode 100644
index 00000000000..1b2cd4c3fe5
--- /dev/null
+++ b/addons/compat_ef/CfgWeapons.hpp
@@ -0,0 +1,37 @@
+class CfgWeapons {
+ // -- ace_nightvision --
+ class NVGoggles;
+ class EF_LPNVG: NVGoggles { // all 4 inherit from this
+ EGVAR(nightvision,generation) = 4;
+ EGVAR(nightvision,colorPreset)[] = {0,{0,0,0,0},{0.7,0.65,0.4,0},{0.199,1.3,0.114,1}};
+ EGVAR(nightvision,border) = QPATHTOEF(nightvision,data\nvg_mask_binos_4096.paa);
+ };
+
+ // -- ace_hearing --
+ class HelmetBase;
+ class EF_H_Protecta: HelmetBase {
+ HEARING_PROTECTION_PELTOR;
+ };
+ class EF_H_MCH; // this does not have peltor
+ class EF_H_MCH_Basic: EF_H_MCH {
+ HEARING_PROTECTION_PELTOR;
+ };
+ class EF_H_MCH_BasicNet_Des: EF_H_MCH {
+ HEARING_PROTECTION_PELTOR;
+ };
+ class EF_H_MCH_Full: EF_H_MCH {
+ HEARING_PROTECTION_PELTOR;
+ };
+ class EF_H_MCH_FullCamo_Des: EF_H_MCH {
+ HEARING_PROTECTION_PELTOR;
+ };
+
+ // -- ace_overpressure --
+ class autocannon_30mm;
+ class EF_autocannon_50mm_AAV9: autocannon_30mm {
+ EGVAR(overpressure,priority) = 1;
+ EGVAR(overpressure,angle) = 90;
+ EGVAR(overpressure,range) = 5;
+ EGVAR(overpressure,damage) = 0.3;
+ };
+};
diff --git a/addons/compat_ef/compat_ef_realisticnames/CfgVehicles.hpp b/addons/compat_ef/compat_ef_realisticnames/CfgVehicles.hpp
new file mode 100644
index 00000000000..6c09b24a3f7
--- /dev/null
+++ b/addons/compat_ef/compat_ef_realisticnames/CfgVehicles.hpp
@@ -0,0 +1,17 @@
+class CfgVehicles {
+ class MRAP_01_gmg_base_F;
+ class EF_MRAP_01_FSV_base: MRAP_01_gmg_base_F {
+ displayName = SUBCSTRING(MRAP_01_FSV);
+ };
+ class EF_MRAP_01_AT_base: EF_MRAP_01_FSV_base {
+ displayName = SUBCSTRING(MRAP_01_AT);
+ };
+ class EF_MRAP_01_LAAD_base: EF_MRAP_01_FSV_base {
+ displayName = SUBCSTRING(MRAP_01_LAAD);
+ };
+
+ class Heli_Attack_01_dynamicLoadout_base_F;
+ class EF_AH99J_dynamicLoadout_base: Heli_Attack_01_dynamicLoadout_base_F {
+ displayName = SUBCSTRING(AH99J);
+ };
+};
diff --git a/addons/compat_ef/compat_ef_realisticnames/config.cpp b/addons/compat_ef/compat_ef_realisticnames/config.cpp
new file mode 100644
index 00000000000..0ce01e875cc
--- /dev/null
+++ b/addons/compat_ef/compat_ef_realisticnames/config.cpp
@@ -0,0 +1,18 @@
+#include "script_component.hpp"
+
+class CfgPatches {
+ class SUBADDON {
+ name = COMPONENT_NAME;
+ units[] = {};
+ weapons[] = {};
+ requiredVersion = REQUIRED_VERSION;
+ requiredAddons[] = {"EF_hunter", "EF_ah99", "ace_realisticnames"};
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+ addonRootClass = QUOTE(ADDON);
+ };
+};
+
+#include "CfgVehicles.hpp"
diff --git a/addons/compat_ef/compat_ef_realisticnames/script_component.hpp b/addons/compat_ef/compat_ef_realisticnames/script_component.hpp
new file mode 100644
index 00000000000..b8d0682fa4f
--- /dev/null
+++ b/addons/compat_ef/compat_ef_realisticnames/script_component.hpp
@@ -0,0 +1,3 @@
+#define SUBCOMPONENT realisticnames
+#define SUBCOMPONENT_BEAUTIFIED Realistic Names
+#include "..\script_component.hpp"
diff --git a/addons/compat_ef/compat_ef_realisticnames/stringtable.xml b/addons/compat_ef/compat_ef_realisticnames/stringtable.xml
new file mode 100644
index 00000000000..bfe5912f9b3
--- /dev/null
+++ b/addons/compat_ef/compat_ef_realisticnames/stringtable.xml
@@ -0,0 +1,73 @@
+
+
+
+
+ M-ATV AT
+ M-ATV AT
+ M-ATV AC
+ M-ATV AT
+ M-ATV AC
+ M-ATV ppanc
+ M-ATV AT
+ M-ATV ПТ
+ M-ATV AT
+ M-ATV (대전차)
+ M-ATV AT
+ 防地雷反伏擊全地形車 AT
+ M-ATV AT
+ M-ATV AT
+ M-ATV AT
+
+
+ M-ATV FSV
+ M-ATV FSV
+ M-ATV FSV
+ M-ATV FSV
+ M-ATV FSV
+ M-ATV FSV
+ M-ATV FSV
+ M-ATV FSV
+ M-ATV FSV
+ M-ATV (화력지원)
+ M-ATV FSV
+ 防地雷反伏擊全地形車 FSV
+ M-ATV FSV
+ M-ATV FSV
+ M-ATV FSV
+
+
+ M-ATV LAAD
+ M-ATV LAAD
+ M-ATV LAAD
+ M-ATV LAAD
+ M-ATV LAAD
+ M-ATV LAAD
+ M-ATV LAAD
+ M-ATV LAAD
+ M-ATV LAAD
+ M-ATV (저고도 대공 방어)
+ M-ATV LAAD
+ 防地雷反伏擊全地形車 LAAD
+ M-ATV LAAD
+ M-ATV LAAD
+ M-ATV LAAD
+
+
+ RAH-66J Comanche
+ RAH-66J Comanche
+ RAH-66J Comanche
+ RAH-66J Comanche
+ RAH-66J Comanche
+ RAH-66J Comanche
+ RAH-66J Comanche
+ RAH-66J Comanche
+ RAH-66J Comanche
+ RAH-66J 코만치
+ RAH-66J コマンチ
+ RAH-66J "卡曼契"攻擊直升機
+ RAH-66J "科曼奇"
+ RAH-66J Comanche
+ RAH-66J Comanche
+
+
+
diff --git a/addons/compat_ef/config.cpp b/addons/compat_ef/config.cpp
new file mode 100644
index 00000000000..9f701b7083f
--- /dev/null
+++ b/addons/compat_ef/config.cpp
@@ -0,0 +1,18 @@
+#include "script_component.hpp"
+#include "\z\ace\addons\hearing\script_macros_hearingProtection.hpp"
+
+class CfgPatches {
+ class ADDON {
+ name = COMPONENT_NAME;
+ units[] = {};
+ weapons[] = {};
+ requiredVersion = REQUIRED_VERSION;
+ requiredAddons[] = {"ace_common", "EF_Weapons", "EF_Marines"};
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+ };
+};
+
+#include "CfgWeapons.hpp"
diff --git a/addons/compat_ef/script_component.hpp b/addons/compat_ef/script_component.hpp
new file mode 100644
index 00000000000..b322febf6b0
--- /dev/null
+++ b/addons/compat_ef/script_component.hpp
@@ -0,0 +1,9 @@
+#define COMPONENT compat_ef
+#define COMPONENT_BEAUTIFIED Expeditionary Forces Compatibility
+
+#include "\z\ace\addons\main\script_mod.hpp"
+
+// #define DEBUG_MODE_FULL
+// #define DISABLE_COMPILE_CACHE
+
+#include "\z\ace\addons\main\script_macros.hpp"
diff --git a/addons/compat_rf/CfgEventHandlers.hpp b/addons/compat_rf/CfgEventHandlers.hpp
new file mode 100644
index 00000000000..9cc1b0427bc
--- /dev/null
+++ b/addons/compat_rf/CfgEventHandlers.hpp
@@ -0,0 +1,5 @@
+class Extended_PostInit_EventHandlers {
+ class ADDON {
+ init = QUOTE(call COMPILE_SCRIPT(XEH_postInit));
+ };
+};
diff --git a/addons/compat_rf/CfgVehicles.hpp b/addons/compat_rf/CfgVehicles.hpp
index bb2e1fa6e5f..f6165812db9 100644
--- a/addons/compat_rf/CfgVehicles.hpp
+++ b/addons/compat_rf/CfgVehicles.hpp
@@ -15,11 +15,13 @@ class CfgVehicles {
class C_Truck_03_water_rf: O_Truck_03_fuel_F {
EXGVAR(field_rations,waterSupply) = 10000;
EXGVAR(field_rations,offset)[] = {0, -5.05, -0.3};
+ EGVAR(refuel,fuelCargo) = -1;
};
class B_Truck_01_fuel_F;
class C_Truck_01_water_rf: B_Truck_01_fuel_F {
EXGVAR(field_rations,waterSupply) = 10000;
EXGVAR(field_rations,offset)[] = {-0.41, -5.15, -0.3};
+ EGVAR(refuel,fuelCargo) = -1;
};
};
diff --git a/addons/compat_rf/XEH_postInit.sqf b/addons/compat_rf/XEH_postInit.sqf
new file mode 100644
index 00000000000..38271e1a9b4
--- /dev/null
+++ b/addons/compat_rf/XEH_postInit.sqf
@@ -0,0 +1,27 @@
+#include "script_component.hpp"
+
+// Compat for ace_cookoff: Extinguish cook-off
+if (["ace_cookoff"] call EFUNC(common,isModLoaded)) then {
+ [missionNamespace, "lxRF_water_droppedOnVehicle", {
+ params ["_vehicle"];
+
+ if (_vehicle getVariable [QEGVAR(cookoff,isAmmoDetonating), false]) then {
+ _vehicle setVariable [QEGVAR(cookoff,interruptAmmoCookoff), true, true];
+ };
+ }] call BIS_fnc_addScriptedEventHandler;
+};
+
+// Compat for ace_fire: Extinguish burning units
+if (["ace_fire"] call EFUNC(common,isModLoaded)) then {
+ ["CBA_settingsInitialized", {
+ if (!EGVAR(fire,enabled)) exitWith {};
+
+ [missionNamespace, "lxRF_water_droppedOnUnit", {
+ params ["_unit"];
+
+ if (_unit call EFUNC(fire,isBurning)) then {
+ _unit setVariable [QEGVAR(fire,intensity), nil, true];
+ };
+ }] call BIS_fnc_addScriptedEventHandler;
+ }] call CBA_fnc_addEventHandler;
+};
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..8c904ec9775 100644
--- a/addons/compat_rf/compat_rf_realisticnames/stringtable.xml
+++ b/addons/compat_rf/compat_rf_realisticnames/stringtable.xml
@@ -136,6 +136,12 @@
데저트 이글 마크 XIX L5 (브론즈)
デザートイーグル Mark XIX L5 (ブロンズ)
+
+ Desert Eagle Mark XIX L5 (Camo)
+ Desert Eagle Mark XIX L5 (Mimetica)
+ デザートイーグル Mark XIX L5 (迷彩)
+ 데저트 이글 마크 XIX L5 (위장)
+
Desert Eagle Mark XIX L5 (Classic)
Desert Eagle Mark XIX L5 (Classique)
@@ -187,7 +193,7 @@
H225 Super Puma (Transporte)
H225 Super Puma (Trasporto)
H225 Super Puma (Transport)
- H225 슈퍼 퓨마 (비무장)
+ H225 슈퍼 퓨마 (수송)
H225 シュペル ピューマ (輸送型)
@@ -196,7 +202,7 @@
H225 Super Puma (Civil)
H225 Super Puma (Civile)
H225 Super Puma (Zivil)
- H225 슈퍼 퓨마 (비무장)
+ H225 슈퍼 퓨마 (민간)
H225 シュペル ピューマ (民生型)
@@ -205,7 +211,7 @@
H215 Super Puma (Transporte)
H215 Super Puma (Trasporto)
H215 Super Puma (Transport)
- H215 슈퍼 퓨마 (비무장)
+ H215 슈퍼 퓨마 (수송)
H215 シュペル ピューマ (輸送型)
@@ -214,7 +220,7 @@
H215 Super Puma (Civil)
H215 Super Puma (Civile)
H215 Super Puma (Zivil)
- H215 슈퍼 퓨마 (비무장)
+ H215 슈퍼 퓨마 (민간)
H215 シュペル ピューマ (民生型)
@@ -394,8 +400,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 +409,7 @@
C-More Railway (Verde, Desierto)
C-More Railway (Verde, Deserto)
C-More Railway (Grün, Wüste)
- 씨모어 레일웨이 (녹색, 사막)
+ 씨모어 레일웨이 (녹색, 사막 위장)
C-More レイルウェイ (グリーン、砂漠迷彩)
@@ -421,8 +427,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 +547,12 @@
램 1500 (중기관총)
ラム 1500 (HMG)
+
+ Ram 1500 (Minigun)
+ Ram 1500 (Minigun)
+ ラム 1500 (ミニガン)
+ 램 1500 (미니건)
+
Ram 1500 (MMG)
Ram 1500 (MMG)
@@ -559,6 +571,18 @@
램 1500 (다연장로켓)
ラム 1500 (MRL)
+
+ Ram 1500 (RCWS)
+ Ram 1500 (RCWS)
+ ラム 1500 (RCWS)
+ 램 1500 (무인포탑)
+
+
+ Ram 1500 (Rocket)
+ Ram 1500 (Razzi)
+ ラム 1500 (ロケット)
+ 램 1500 (로켓)
+
Ram 1500 (Repair)
Ram 1500 (Réparation)
@@ -677,9 +701,15 @@
Пожарная машина HEMTT
HEMTT-Löschfahrzeug
HEMTT 소방트럭
- HEMTT 消防車
+ HEMTT (消防車)
HEMTT 消防卡车
+
+ Typhoon Cargo
+ Typhoon Carico
+ タイフーン (貨物)
+ 타이푼 화물
+
Typhoon Water
Typhoon Water
@@ -687,7 +717,7 @@
Typhoon Acqua
Typhoon Water
타이푼 급수
- タイフーン 給水
+ タイフーン (給水車)
AMOS Container
diff --git a/addons/compat_rf/config.cpp b/addons/compat_rf/config.cpp
index 52ef83c1b74..a4697e9ca5a 100644
--- a/addons/compat_rf/config.cpp
+++ b/addons/compat_rf/config.cpp
@@ -15,5 +15,6 @@ class CfgPatches {
};
};
+#include "CfgEventHandlers.hpp"
#include "CfgWeapons.hpp"
#include "CfgVehicles.hpp"
diff --git a/addons/compat_rhs_afrf3/CfgAmmo.hpp b/addons/compat_rhs_afrf3/CfgAmmo.hpp
index 11aee03d795..8599ffd25de 100644
--- a/addons/compat_rhs_afrf3/CfgAmmo.hpp
+++ b/addons/compat_rhs_afrf3/CfgAmmo.hpp
@@ -158,7 +158,7 @@ class CfgAmmo {
EGVAR(frag,metal) = 200;
EGVAR(frag,charge) = 110;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "3/5";
+ EGVAR(frag,gurney_k) = 3/5;
EGVAR(frag,classes)[] = {"ACE_frag_small_HD"};
EGVAR(frag,skip) = 0;
EGVAR(frag,force) = 1;
@@ -186,7 +186,7 @@ class CfgAmmo {
EGVAR(frag,metal) = 400;
EGVAR(frag,charge) = 210;
EGVAR(frag,gurney_c) = 2800;
- EGVAR(frag,gurney_k) = "3/5";
+ EGVAR(frag,gurney_k) = 3/5;
EGVAR(frag,classes)[] = {"ACE_frag_medium_HD"};
EGVAR(frag,skip) = 0;
EGVAR(frag,force) = 1;
diff --git a/addons/compat_rhs_usf3/CfgAmmo.hpp b/addons/compat_rhs_usf3/CfgAmmo.hpp
index 6b885d7e04c..569d67ad5cc 100644
--- a/addons/compat_rhs_usf3/CfgAmmo.hpp
+++ b/addons/compat_rhs_usf3/CfgAmmo.hpp
@@ -364,7 +364,7 @@ class CfgAmmo {
EGVAR(frag,metal) = 213;
EGVAR(frag,charge) = 185;
EGVAR(frag,gurney_c) = 2700;
- EGVAR(frag,gurney_k) = "3/5";
+ EGVAR(frag,gurney_k) = 3/5;
EGVAR(frag,classes)[] = {"ACE_frag_medium_HD"};
EGVAR(frag,skip) = 0;
EGVAR(frag,force) = 1;
@@ -374,7 +374,7 @@ class CfgAmmo {
EGVAR(frag,metal) = 330;
EGVAR(frag,charge) = 280;
EGVAR(frag,gurney_c) = 2800;
- EGVAR(frag,gurney_k) = "3/5";
+ EGVAR(frag,gurney_k) = 3/5;
EGVAR(frag,classes)[] = {"ACE_frag_medium_HD"};
EGVAR(frag,skip) = 0;
EGVAR(frag,force) = 1;
diff --git a/addons/compat_rhs_usf3/compat_rhs_usf3_csw/stringtable.xml b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/stringtable.xml
index 4ef0946bf55..e7b5a65989a 100644
--- a/addons/compat_rhs_usf3/compat_rhs_usf3_csw/stringtable.xml
+++ b/addons/compat_rhs_usf3/compat_rhs_usf3_csw/stringtable.xml
@@ -41,7 +41,7 @@
[CSW] Mk. 19 40mm M384 HE
[CSW] Mk. 19 40 мм M384 HE
[CSW] Mk. 19 40mm M384 HE
- [CSW] Mk.19 40mm M384 HE
+ [CSW] Mk.19 40mm M384 고폭탄
[CSW] Mk. 19 40mm M384 HE
[班组] Mk. 19 40mm M384 高爆
diff --git a/addons/compat_sog/ACE_Medical_Injuries.hpp b/addons/compat_sog/ACE_Medical_Injuries.hpp
index 62acb1401fe..9f01a97f613 100644
--- a/addons/compat_sog/ACE_Medical_Injuries.hpp
+++ b/addons/compat_sog/ACE_Medical_Injuries.hpp
@@ -7,8 +7,7 @@ class ACE_Medical_Injuries {
};
class GVAR(explosive_incendiary): explosive {
class woundHandlers: woundHandlers {
- // TODO use function name after bug with the woundHandlers config caching is fixed
- ADDON = QUOTE({call FUNC(woundsHandlerIncendiary)});
+ ADDON = QFUNC(woundsHandlerIncendiary);
};
};
};
diff --git a/addons/compat_sog/CfgAmmo/grenades.hpp b/addons/compat_sog/CfgAmmo/grenades.hpp
index 6395756f640..1a40b48429f 100644
--- a/addons/compat_sog/CfgAmmo/grenades.hpp
+++ b/addons/compat_sog/CfgAmmo/grenades.hpp
@@ -2,6 +2,7 @@ class vn_grenadehand;
class vn_molotov_grenade_ammo: vn_grenadehand {
ACE_damageType = QGVAR(explosive_incendiary);
EGVAR(frag,enabled) = 0;
+ EGVAR(hearing,hearingDamageFactor) = 0;
};
class vn_t67_grenade_ammo: vn_grenadehand {
diff --git a/addons/compat_sog/CfgMagazines/explosives.hpp b/addons/compat_sog/CfgMagazines/explosives.hpp
index a8d6ca76bd3..87289ed689f 100644
--- a/addons/compat_sog/CfgMagazines/explosives.hpp
+++ b/addons/compat_sog/CfgMagazines/explosives.hpp
@@ -4,18 +4,17 @@ class vn_magazine;
class vn_mine_m18_mag: vn_magazine {
useAction = 0;
- displayNameShort = ""; // Every explosive inherits this and it breaks naming in the placing menu
-
EGVAR(explosives,placeable) = 1;
EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(m18);
class ACE_Triggers {
- SupportedTriggers[] = {"Command", "MK16_Transmitter"};
+ SupportedTriggers[] = {"Command", "MK16_Transmitter", "Timer"};
class Command {
digDistance = -0.05;
fuseTime = 0.5;
};
class MK16_Transmitter: Command {};
+ class Timer: Command {};
};
};
// Claymore (Proximity)
@@ -28,18 +27,6 @@ class vn_mine_m18_range_mag: vn_mine_m18_mag {
};
};
-// Claymore (Fuse)
-class vn_mine_m18_fuze10_mag: vn_mine_m18_mag {
- class ACE_Triggers: ACE_Triggers {
- class Command: Command {
- fuseTime = 10;
- };
- class MK16_Transmitter: MK16_Transmitter {
- fuseTime = 10;
- };
- };
-};
-
// Claymore x3 (Remote)
class vn_mine_m18_x3_mag: vn_mine_m18_mag {
EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(m18_x3);
@@ -64,17 +51,9 @@ class vn_mine_m18_x3_range_mag: vn_mine_m18_x3_mag {
};
// WP Claymore (Remote)
+class vn_mine_m18_fuze10_mag;
class vn_mine_m18_wp_mag: vn_mine_m18_fuze10_mag {
EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(m18_wp);
-
- class ACE_Triggers {
- SupportedTriggers[] = {"Command", "MK16_Transmitter"};
- class Command {
- digDistance = -0.05;
- fuseTime = 0.5;
- };
- class MK16_Transmitter: Command {};
- };
};
// WP Claymore (Proximity)
@@ -87,18 +66,6 @@ class vn_mine_m18_wp_range_mag: vn_mine_m18_wp_mag {
};
};
-// WP Claymore (Fuse)
-class vn_mine_m18_wp_fuze10_mag: vn_mine_m18_wp_mag {
- class ACE_Triggers: ACE_Triggers {
- class Command: Command {
- fuseTime = 10;
- };
- class MK16_Transmitter: MK16_Transmitter {
- fuseTime = 10;
- };
- };
-};
-
// Toe-Popper
class vn_mine_m14_mag: vn_mine_m18_mag {
EGVAR(explosives,setupObject) = QEXPLOSIVES_PLACE(m14);
diff --git a/addons/compat_spe/ACE_Medical_Injuries.hpp b/addons/compat_spe/ACE_Medical_Injuries.hpp
index 62acb1401fe..9f01a97f613 100644
--- a/addons/compat_spe/ACE_Medical_Injuries.hpp
+++ b/addons/compat_spe/ACE_Medical_Injuries.hpp
@@ -7,8 +7,7 @@ class ACE_Medical_Injuries {
};
class GVAR(explosive_incendiary): explosive {
class woundHandlers: woundHandlers {
- // TODO use function name after bug with the woundHandlers config caching is fixed
- ADDON = QUOTE({call FUNC(woundsHandlerIncendiary)});
+ ADDON = QFUNC(woundsHandlerIncendiary);
};
};
};
diff --git a/addons/compat_spe/CfgAmmo.hpp b/addons/compat_spe/CfgAmmo.hpp
index d11510648bd..46d83f256f8 100644
--- a/addons/compat_spe/CfgAmmo.hpp
+++ b/addons/compat_spe/CfgAmmo.hpp
@@ -4,4 +4,5 @@ class CfgAmmo {
#include "CfgAmmo\grenades.hpp"
#include "CfgAmmo\melee.hpp"
#include "CfgAmmo\bullets.hpp"
+ #include "CfgAmmo\shells.hpp"
};
diff --git a/addons/compat_spe/CfgAmmo/bombs.hpp b/addons/compat_spe/CfgAmmo/bombs.hpp
index 489930289c1..23d547d5f03 100644
--- a/addons/compat_spe/CfgAmmo/bombs.hpp
+++ b/addons/compat_spe/CfgAmmo/bombs.hpp
@@ -5,7 +5,7 @@ class SPE_NC250_Bomb: SPE_Bomb_base {
EGVAR(frag,metal) = 166000;
EGVAR(frag,charge) = 130000;
EGVAR(frag,gurney_c) = 2750;
- EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,gurney_k) = 1/2;
EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_large","ACE_frag_huge"};
};
class SPE_NC50_Bomb: SPE_Bomb_base {
@@ -14,7 +14,7 @@ class SPE_NC50_Bomb: SPE_Bomb_base {
EGVAR(frag,metal) = 25000;
EGVAR(frag,charge) = 24400;
EGVAR(frag,gurney_c) = 2750;
- EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,gurney_k) = 1/2;
EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_large"};
};
class SPE_SC500_Bomb: SPE_Bomb_base {
@@ -23,7 +23,7 @@ class SPE_SC500_Bomb: SPE_Bomb_base {
EGVAR(frag,metal) = 200000;
EGVAR(frag,charge) = 275000;
EGVAR(frag,gurney_c) = 2750;
- EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,gurney_k) = 1/2;
EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_large","ACE_frag_huge"};
};
class SPE_US_500lb_Bomb: SPE_Bomb_base {
@@ -32,7 +32,7 @@ class SPE_US_500lb_Bomb: SPE_Bomb_base {
EGVAR(frag,metal) = 100000;
EGVAR(frag,charge) = 124000;
EGVAR(frag,gurney_c) = 2700;
- EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,gurney_k) = 1/2;
EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_large","ACE_frag_huge"};
};
class SPE_US_1000lb_Bomb: SPE_Bomb_base {
@@ -41,6 +41,6 @@ class SPE_US_1000lb_Bomb: SPE_Bomb_base {
EGVAR(frag,metal) = 200000;
EGVAR(frag,charge) = 158000;
EGVAR(frag,gurney_c) = 2700;
- EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,gurney_k) = 1/2;
EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_large","ACE_frag_huge"};
};
diff --git a/addons/compat_spe/CfgAmmo/bullets.hpp b/addons/compat_spe/CfgAmmo/bullets.hpp
index 1e0e22e62d7..85556b83944 100644
--- a/addons/compat_spe/CfgAmmo/bullets.hpp
+++ b/addons/compat_spe/CfgAmmo/bullets.hpp
@@ -10,3 +10,26 @@ class SPE_B_127x99_Ball: SPE_Bullet_Vehicle_base {
class SPE_B_127x99_API: SPE_B_127x99_Ball {
EGVAR(vehicle_damage,incendiary) = 1;
};
+
+// FLAK
+class SPE_Bullet_AA_base;
+class SPE_SprGr_FlaK_38: SPE_Bullet_AA_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 50;
+ EGVAR(frag,charge) = 6;
+ EGVAR(frag,gurney_c) = 2930;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_tiny", "ACE_frag_small_HD"};
+};
+
+class SPE_Bullet_AP_base;
+class SPE_PzGr_FlaK_38_AP_T: SPE_Bullet_AP_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 50;
+ EGVAR(frag,charge) = 6;
+ EGVAR(frag,gurney_c) = 2930;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_tiny", "ACE_frag_small_HD"};
+};
diff --git a/addons/compat_spe/CfgAmmo/explosives.hpp b/addons/compat_spe/CfgAmmo/explosives.hpp
index 14b49104468..1f7df20213d 100644
--- a/addons/compat_spe/CfgAmmo/explosives.hpp
+++ b/addons/compat_spe/CfgAmmo/explosives.hpp
@@ -14,7 +14,7 @@ class SPE_PzFaust_30m: SPE_Rocket_base {
EGVAR(frag,metal) = 150;
EGVAR(frag,charge) = 400;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,gurney_k) = 1/2;
EGVAR(frag,classes)[] = {"ACE_frag_small"};
};
class SPE_60mm_M6: SPE_Rocket_base {
@@ -23,7 +23,7 @@ class SPE_60mm_M6: SPE_Rocket_base {
EGVAR(frag,metal) = 250;
EGVAR(frag,charge) = 400;
EGVAR(frag,gurney_c) = 2750;
- EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,gurney_k) = 1/2;
EGVAR(frag,classes)[] = {"ACE_frag_small"};
};
class SPE_Sh_M43A1_81_HE: SubmunitionBase {
@@ -32,7 +32,7 @@ class SPE_Sh_M43A1_81_HE: SubmunitionBase {
EGVAR(frag,metal) = 1200;
EGVAR(frag,charge) = 600;
EGVAR(frag,gurney_c) = 2750;
- EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,gurney_k) = 1/2;
EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_small"};
};
class SPE_M48_HE: SPE_ShellHE_base {
@@ -41,7 +41,7 @@ class SPE_M48_HE: SPE_ShellHE_base {
EGVAR(frag,metal) = 1250;
EGVAR(frag,charge) = 670;
EGVAR(frag,gurney_c) = 2750;
- EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,gurney_k) = 1/2;
EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_small"};
};
class SPE_M101_M1_HE: SPE_ShellHE_base {
@@ -50,7 +50,7 @@ class SPE_M101_M1_HE: SPE_ShellHE_base {
EGVAR(frag,metal) = 2500;
EGVAR(frag,charge) = 1980;
EGVAR(frag,gurney_c) = 2750;
- EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,gurney_k) = 1/2;
EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_large"};
};
class SPE_S_105L28_Gr38: SPE_ShellHE_base {
@@ -59,7 +59,7 @@ class SPE_S_105L28_Gr38: SPE_ShellHE_base {
EGVAR(frag,metal) = 2500;
EGVAR(frag,charge) = 1500;
EGVAR(frag,gurney_c) = 2750;
- EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,gurney_k) = 1/2;
EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_large"};
};
class SPE_S_105L28_Gr39HlC: SPE_ShellHEAT_base {
@@ -68,7 +68,7 @@ class SPE_S_105L28_Gr39HlC: SPE_ShellHEAT_base {
EGVAR(frag,metal) = 2500;
EGVAR(frag,charge) = 1500;
EGVAR(frag,gurney_c) = 2750;
- EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,gurney_k) = 1/2;
EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_large"};
};
class SPE_R_280mm_WkSpr: SubmunitionBase {
@@ -77,7 +77,7 @@ class SPE_R_280mm_WkSpr: SubmunitionBase {
EGVAR(frag,metal) = 37000;
EGVAR(frag,charge) = 50000;
EGVAR(frag,gurney_c) = 2750;
- EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,gurney_k) = 1/2;
EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_large","ACE_frag_huge"};
};
class SPE_US_Bangalore_ammo: SPE_MAIN_pipebomb {
@@ -86,7 +86,7 @@ class SPE_US_Bangalore_ammo: SPE_MAIN_pipebomb {
EGVAR(frag,metal) = 1700;
EGVAR(frag,charge) = 4100;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "3/5";
+ EGVAR(frag,gurney_k) = 3/5;
EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_small"};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02};
};
@@ -96,7 +96,7 @@ class SPE_Ladung_Big_ammo: SPE_MAIN_pipebomb {
EGVAR(frag,metal) = 500;
EGVAR(frag,charge) = 1500;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "3/5";
+ EGVAR(frag,gurney_k) = 3/5;
EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_small"};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02};
};
@@ -106,7 +106,7 @@ class SPE_Ladung_Small_ammo: SPE_MAIN_pipebomb {
EGVAR(frag,metal) = 250;
EGVAR(frag,charge) = 750;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "3/5";
+ EGVAR(frag,gurney_k) = 3/5;
EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_small"};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02};
};
@@ -116,7 +116,7 @@ class SPE_US_M1A1_ATMINE_ammo: SPE_MAIN_mine {
EGVAR(frag,metal) = 2100;
EGVAR(frag,charge) = 2700;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "3/5";
+ EGVAR(frag,gurney_k) = 3/5;
EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_small"};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02};
};
@@ -126,7 +126,7 @@ class SPE_US_TNT_half_pound_ammo: SPE_MAIN_pipebomb {
EGVAR(frag,metal) = 100;
EGVAR(frag,charge) = 226;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "3/5";
+ EGVAR(frag,gurney_k) = 3/5;
EGVAR(frag,classes)[] = {"ACE_frag_small"};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02};
};
@@ -136,7 +136,7 @@ class SPE_US_TNT_4pound_ammo: SPE_MAIN_pipebomb {
EGVAR(frag,metal) = 372;
EGVAR(frag,charge) = 1814;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "3/5";
+ EGVAR(frag,gurney_k) = 3/5;
EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_small"};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02};
};
@@ -146,7 +146,7 @@ class SPE_US_M3_PRessure_ammo: SPE_MAIN_mine {
EGVAR(frag,metal) = 2267;
EGVAR(frag,charge) = 454;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "3/5";
+ EGVAR(frag,gurney_k) = 3/5;
EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_small"};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02};
};
@@ -156,7 +156,7 @@ class SPE_US_M3_ammo: SPE_MAIN_mine {
EGVAR(frag,metal) = 2267;
EGVAR(frag,charge) = 454;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "3/5";
+ EGVAR(frag,gurney_k) = 3/5;
EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_small"};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02};
};
@@ -166,7 +166,7 @@ class SPE_shumine42_ammo: SPE_MAIN_mine {
EGVAR(frag,metal) = 300;
EGVAR(frag,charge) = 200;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "3/5";
+ EGVAR(frag,gurney_k) = 3/5;
EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_small"};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02};
};
@@ -176,7 +176,7 @@ class SPE_Shg24x7_Improvised_Mine_ammo: SPE_MAIN_mine {
EGVAR(frag,metal) = 525;
EGVAR(frag,charge) = 1330;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "3/5";
+ EGVAR(frag,gurney_k) = 3/5;
EGVAR(frag,classes)[] = {"ACE_frag_small_HD"};
};
class SPE_SMI35_Pressure_ammo: SPE_MAIN_mine {
@@ -185,7 +185,7 @@ class SPE_SMI35_Pressure_ammo: SPE_MAIN_mine {
EGVAR(frag,metal) = 2720;
EGVAR(frag,charge) = 182;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "3/5";
+ EGVAR(frag,gurney_k) = 3/5;
EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_small"};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02};
};
@@ -195,7 +195,7 @@ class SPE_SMI35_1_ammo: SPE_MAIN_mine {
EGVAR(frag,metal) = 2720;
EGVAR(frag,charge) = 182;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "3/5";
+ EGVAR(frag,gurney_k) = 3/5;
EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_small"};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02};
};
@@ -205,7 +205,7 @@ class SPE_SMI35_ammo: SPE_MAIN_mine {
EGVAR(frag,metal) = 2720;
EGVAR(frag,charge) = 182;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "3/5";
+ EGVAR(frag,gurney_k) = 3/5;
EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_small"};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02};
};
@@ -215,7 +215,7 @@ class SPE_STMI_ammo: SPE_MAIN_mine {
EGVAR(frag,metal) = 1520;
EGVAR(frag,charge) = 152;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "3/5";
+ EGVAR(frag,gurney_k) = 3/5;
EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_small"};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02};
};
@@ -225,7 +225,7 @@ class SPE_TMI42_ammo: SPE_MAIN_mine {
EGVAR(frag,metal) = 2520;
EGVAR(frag,charge) = 5400;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "3/5";
+ EGVAR(frag,gurney_k) = 3/5;
EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_small"};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02};
};
diff --git a/addons/compat_spe/CfgAmmo/grenades.hpp b/addons/compat_spe/CfgAmmo/grenades.hpp
index 12043d50116..197989cea98 100644
--- a/addons/compat_spe/CfgAmmo/grenades.hpp
+++ b/addons/compat_spe/CfgAmmo/grenades.hpp
@@ -12,7 +12,7 @@ class SPE_Shg24: SPE_GrenadeHand_base {
EGVAR(frag,metal) = 75;
EGVAR(frag,charge) = 170;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,gurney_k) = 1/2;
EGVAR(frag,classes)[] = {"ACE_frag_tiny_HD"};
};
class SPE_Shg24_Frag: SPE_GrenadeHand_base {
@@ -21,7 +21,7 @@ class SPE_Shg24_Frag: SPE_GrenadeHand_base {
EGVAR(frag,metal) = 250;
EGVAR(frag,charge) = 190;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,gurney_k) = 1/2;
EGVAR(frag,classes)[] = {"ACE_frag_small_HD"};
};
class SPE_Shg24x7: SPE_GrenadeHand_base {
@@ -30,7 +30,7 @@ class SPE_Shg24x7: SPE_GrenadeHand_base {
EGVAR(frag,metal) = 525;
EGVAR(frag,charge) = 1330;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "3/5";
+ EGVAR(frag,gurney_k) = 3/5;
EGVAR(frag,classes)[] = {"ACE_frag_small_HD"};
};
class SPE_M39: SPE_GrenadeHand_base {
@@ -39,7 +39,7 @@ class SPE_M39: SPE_GrenadeHand_base {
EGVAR(frag,metal) = 200;
EGVAR(frag,charge) = 112;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "3/5";
+ EGVAR(frag,gurney_k) = 3/5;
EGVAR(frag,classes)[] = {"ACE_frag_tiny_HD"};
};
class SPE_US_Mk_2: SPE_GrenadeHand_base {
@@ -48,7 +48,7 @@ class SPE_US_Mk_2: SPE_GrenadeHand_base {
EGVAR(frag,metal) = 400;
EGVAR(frag,charge) = 56;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "3/5";
+ EGVAR(frag,gurney_k) = 3/5;
EGVAR(frag,classes)[] = {"ACE_frag_small_HD"};
};
class SPE_US_Mk_2_Yellow: SPE_US_Mk_2 {};
@@ -58,7 +58,7 @@ class SPE_US_Mk_3: SPE_GrenadeHand_base {
EGVAR(frag,metal) = 90;
EGVAR(frag,charge) = 200;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,gurney_k) = 1/2;
EGVAR(frag,classes)[] = {"ACE_frag_tiny_HD"};
};
class SPE_G_M9A1: SPE_Grenade_base {
@@ -67,7 +67,7 @@ class SPE_G_M9A1: SPE_Grenade_base {
EGVAR(frag,metal) = 200;
EGVAR(frag,charge) = 113;
EGVAR(frag,gurney_c) = 2750;
- EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,gurney_k) = 1/2;
EGVAR(frag,classes)[] = {"ACE_frag_tiny_HD"};
};
class SPE_G_MK2: SPE_Grenade_base {
@@ -76,7 +76,7 @@ class SPE_G_MK2: SPE_Grenade_base {
EGVAR(frag,metal) = 400;
EGVAR(frag,charge) = 56;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "3/5";
+ EGVAR(frag,gurney_k) = 3/5;
EGVAR(frag,classes)[] = {"ACE_frag_small_HD"};
};
class SPE_G_PZGR_30: SPE_Grenade_base {
@@ -85,7 +85,7 @@ class SPE_G_PZGR_30: SPE_Grenade_base {
EGVAR(frag,metal) = 120;
EGVAR(frag,charge) = 50;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,gurney_k) = 1/2;
EGVAR(frag,classes)[] = {"ACE_frag_tiny_HD"};
};
class SPE_G_PZGR_40: SPE_Grenade_base {
@@ -94,7 +94,7 @@ class SPE_G_PZGR_40: SPE_Grenade_base {
EGVAR(frag,metal) = 180;
EGVAR(frag,charge) = 75;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,gurney_k) = 1/2;
EGVAR(frag,classes)[] = {"ACE_frag_tiny_HD"};
};
class SPE_G_SPRGR_30_Detonation: SPE_Grenade_base {
@@ -103,7 +103,7 @@ class SPE_G_SPRGR_30_Detonation: SPE_Grenade_base {
EGVAR(frag,metal) = 150;
EGVAR(frag,charge) = 200;
EGVAR(frag,gurney_c) = 2440;
- EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,gurney_k) = 1/2;
EGVAR(frag,classes)[] = {"ACE_frag_small_HD"};
};
diff --git a/addons/compat_spe/CfgAmmo/shells.hpp b/addons/compat_spe/CfgAmmo/shells.hpp
new file mode 100644
index 00000000000..734586184e4
--- /dev/null
+++ b/addons/compat_spe/CfgAmmo/shells.hpp
@@ -0,0 +1,306 @@
+class SPE_Shell_base;
+// Panzer III J, L, M HE
+class SPE_50mm_SprGr38_HE: SPE_ShellHE_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 1820;
+ EGVAR(frag,charge) = 217;
+ EGVAR(frag,gurney_c) = 2930;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_medium", "ACE_frag_small_HD"};
+};
+
+// Panzer III J, L, M APHE
+class SPE_50mm_PzGr39_AP: SPE_Shell_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 2050;
+ EGVAR(frag,charge) = 29;
+ EGVAR(frag,gurney_c) = 2930;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_medium", "ACE_frag_small_HD"};
+};
+// Panzer III N HE
+class SPE_SprGr34_K51_HE: SPE_ShellHE_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 5740;
+ EGVAR(frag,charge) = 686;
+ EGVAR(frag,gurney_c) = 2930;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_medium", "ACE_frag_medium_HD"};
+};
+
+// Panzer III N AP
+class SPE_KGrRotPz_K51_AP: SPE_Shell_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 6800;
+ EGVAR(frag,charge) = 103;
+ EGVAR(frag,gurney_c) = 2930;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_medium", "ACE_frag_medium_HD"};
+};
+
+// Panzer III N HEAT
+class SPE_HLGr38c_K51_HEAT: SPE_ShellHEAT_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 4800;
+ EGVAR(frag,charge) = 876;
+ EGVAR(frag,gurney_c) = 2930;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_medium", "ACE_frag_medium_HD"};
+};
+
+// Panzer IV, StuG III G HE
+class SPE_SprGr34_KWK40_HE: SPE_ShellHE_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 5740;
+ EGVAR(frag,charge) = 686;
+ EGVAR(frag,gurney_c) = 2930;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_medium", "ACE_frag_medium_HD"};
+};
+
+// Panzer IV G AP
+class SPE_PzGr39_KWK40_AP: SPE_Shell_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 6800;
+ EGVAR(frag,charge) = 29;
+ EGVAR(frag,gurney_c) = 2930;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_medium", "ACE_frag_medium_HD"};
+};
+
+// Panzer V HE
+class SPE_SprGr42_KwK42_HE: SPE_ShellHE_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 5740;
+ EGVAR(frag,charge) = 725;
+ EGVAR(frag,gurney_c) = 2930;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_medium", "ACE_frag_medium_HD"};
+};
+
+// Panzer V AP
+class SPE_PzGr3942_KwK42_AP: SPE_Shell_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 6800;
+ EGVAR(frag,charge) = 29;
+ EGVAR(frag,gurney_c) = 2930;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_medium", "ACE_frag_medium_HD"};
+};
+
+// Panzer VI HE
+class SPE_SprGr_KwK36_HE: SPE_ShellHE_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 9000;
+ EGVAR(frag,charge) = 900;
+ EGVAR(frag,gurney_c) = 2930;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_large", "ACE_frag_large_HD"};
+};
+
+// Panzer VI AP
+class SPE_PzGr39_KwK36_AP: SPE_Shell_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 10200;
+ EGVAR(frag,charge) = 109;
+ EGVAR(frag,gurney_c) = 2930;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_large", "ACE_frag_large_HD"};
+};
+
+// StuH 42 HE
+class SPE_105mm_StuH42_Gr38_HE: SPE_ShellHE_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 14810;
+ EGVAR(frag,charge) = 2530;
+ EGVAR(frag,gurney_c) = 2930;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_large", "ACE_frag_large_HD"};
+};
+// StuH 42 AP
+class SPE_105mm_Stuh42_PzGrRot_AP: SPE_Shell_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 14000;
+ EGVAR(frag,charge) = 305;
+ EGVAR(frag,gurney_c) = 2930;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_large", "ACE_frag_large_HD"};
+};
+
+// StuH 42 HEAT
+class SPE_105mm_StuH42_Gr39HlC_HEAT: SPE_ShellHEAT_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 12350;
+ EGVAR(frag,charge) = 2530;
+ EGVAR(frag,gurney_c) = 2930;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_large", "ACE_frag_large_HD"};
+};
+
+// Nashorn HE
+class SPE_SprGr39_HE: SPE_ShellHE_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 9400;
+ EGVAR(frag,charge) = 1000;
+ EGVAR(frag,gurney_c) = 2930;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_large", "ACE_frag_large_HD"};
+};
+
+// Nashorn AP
+class SPE_PzGr43_AP: SPE_Shell_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 10160;
+ EGVAR(frag,charge) = 109;
+ EGVAR(frag,gurney_c) = 2930;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_large", "ACE_frag_large_HD"};
+};
+
+// M10 HE
+class SPE_76mm_M7_M42_HE: SPE_ShellHE_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 5840;
+ EGVAR(frag,charge) = 390;
+ EGVAR(frag,gurney_c) = 2440;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_medium", "ACE_frag_medium_HD"};
+};
+
+// M10 AP
+class SPE_76mm_M7_M62_APHE: SPE_Shell_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 7000;
+ EGVAR(frag,charge) = 64;
+ EGVAR(frag,gurney_c) = 2440;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_medium", "ACE_frag_medium_HD"};
+};
+
+// M18 HE
+class SPE_76mm_M1_HC_M42_HE: SPE_76mm_M7_M42_HE {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 5840;
+ EGVAR(frag,charge) = 390;
+ EGVAR(frag,gurney_c) = 2440;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_medium", "ACE_frag_medium_HD"};
+};
+
+// M18 and Sherman 76 AP
+class SPE_76mm_M1_M62_APHE: SPE_76mm_M7_M62_APHE {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 7000;
+ EGVAR(frag,charge) = 64;
+ EGVAR(frag,gurney_c) = 2440;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_medium", "ACE_frag_medium_HD"};
+};
+
+// M4 Sherman 76 HE
+class SPE_76mm_M1_M42_HE: SPE_76mm_M7_M42_HE {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 5840;
+ EGVAR(frag,charge) = 390;
+ EGVAR(frag,gurney_c) = 2440;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_medium_HD"};
+};
+
+//M4 Sherman 75 AP
+class SPE_M61_M1_AP: SPE_Shell_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 6790;
+ EGVAR(frag,charge) = 64;
+ EGVAR(frag,gurney_c) = 2440;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_medium", "ACE_frag_medium_HD"};
+};
+
+// M4 Sherman 105 HEAT
+class SPE_M101_M67_HEAT: SPE_ShellHEAT_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 13140;
+ EGVAR(frag,charge) = 1610;
+ EGVAR(frag,gurney_c) = 2750;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_large"};
+};
+
+// M1 57mm AT gun HE
+class SPE_6pdr_mk10T_HE: SPE_ShellHE_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 2720;
+ EGVAR(frag,charge) = 590;
+ EGVAR(frag,gurney_c) = 2440;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_medium", "ACE_frag_small_HD"};
+};
+
+// M1 57mm AT gun AP
+class SPE_57mm_M86_APCBC: SPE_Shell_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 3290;
+ EGVAR(frag,charge) = 41;
+ EGVAR(frag,gurney_c) = 2440;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_medium", "ACE_frag_small_HD"};
+};
+
+// M3 Howitzer HE
+class SPE_M3_M1_HE: SPE_ShellHE_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 18350;
+ EGVAR(frag,charge) = 2180;
+ EGVAR(frag,gurney_c) = 2750;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_large"};
+};
+
+// M3 Howitzer HEAT
+class SPE_M3_M67_HEAT: SPE_ShellHEAT_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 16620;
+ EGVAR(frag,charge) = 2180;
+ EGVAR(frag,gurney_c) = 2750;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_medium","ACE_frag_large"};
+};
+
+// M8 Greyhound HE
+class SPE_S_37L57_M63: SPE_ShellHE_base {
+ EGVAR(frag,enabled) = 1;
+ EGVAR(frag,force) = 1;
+ EGVAR(frag,metal) = 1420;
+ EGVAR(frag,charge) = 39;
+ EGVAR(frag,gurney_c) = 2440;
+ EGVAR(frag,gurney_k) = "1/2";
+ EGVAR(frag,classes)[] = {"ACE_frag_medium", "ACE_frag_small_HD"};
+};
diff --git a/addons/compat_spe/CfgWeapons/cannons.hpp b/addons/compat_spe/CfgWeapons/cannons.hpp
new file mode 100644
index 00000000000..abd1b688617
--- /dev/null
+++ b/addons/compat_spe/CfgWeapons/cannons.hpp
@@ -0,0 +1,8 @@
+// CANNON
+class SPE_CannonCore;
+class SPE_TankCannon_base: SPE_CannonCore {
+ EGVAR(overpressure,angle) = 90; // Cone in which the damage is applied (in degrees from the muzzle of the cannon)
+ EGVAR(overpressure,range) = 50; // Range in meters in which the damage is applied
+ EGVAR(overpressure,damage) = 0.85; // Damage multiplier
+ EGVAR(overpressure,priority) = 1;
+};
diff --git a/addons/compat_spe/compat_spe_csw/stringtable.xml b/addons/compat_spe/compat_spe_csw/stringtable.xml
index cacbfbf4f7a..b5cb6f988b3 100644
--- a/addons/compat_spe/compat_spe_csw/stringtable.xml
+++ b/addons/compat_spe/compat_spe_csw/stringtable.xml
@@ -4,30 +4,35 @@
.30-06 100Rnd Belt (M2/Tracer)
Cinta de .30-06 100Rnd (M2/Trazadora)
+ Nastro .30-06 100cp (M2/Tracciante)
.30-06구경 스프링필드 100발 들이 벨트 (M2 훈련용/예광탄)
.30-06 100Rnd Belt (M2/Tracer)
7.92x57 100Rnd Belt (L.S./Tracer)
Cinta de 7.92x57 100Rnd (L.S./Trazadora)
+ Nastro 7.92x57 100cp (L.S./Tracciante)
7.92x57mm 100발 들이 벨트 (L.S. 훈련용/예광탄)
7.92x57 100Rnd Belt (L.S./Tracer)
.30-06 50Rnd Belt (M2/Tracer)
Cinta de .30-06 50Rnd (M2/Trazadora)
+ Nastro .30-06 50cp (M2/Tracciante)
.30-06구경 스프링필드 50발 들이 벨트 (M2 훈련용/예광탄)
.30-06 50Rnd Belt (M2/Tracer)
7.92x57 50Rnd Gurttrommel (L.S./Tracer)
Tambor de 7.92x57 50Rnd (L.S./Trazadora)
+ Nastro 7.92x57 50cp (L.S./Tracciante)
7.92x57mm 50발 들이 벨트 (L.S. 훈련용/예광탄)
7.92x57 50Rnd Gurttrommel (L.S./Tracer)
Altering Height...
Cambiando Altura...
+ Cambiando alzo...
높이 변경 중...
高さを変更・・・
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..307bd180a72 100644
--- a/addons/compat_ws/compat_ws_realisticnames/stringtable.xml
+++ b/addons/compat_ws/compat_ws_realisticnames/stringtable.xml
@@ -195,6 +195,7 @@
Vektor SS-77
Vektor SS-77
Vektor SS-77
+ Vektor SS-77
Vektor SS-77
Vektor SS-77
벡터 SS-77
@@ -352,6 +353,18 @@
XMS GL
XMS GL
+
+ XMS GL (Stripes)
+ XMS GL (Strisce)
+ XMS GL (縞模様迷彩)
+ XMS GL (줄무늬 위장)
+
+
+ XMS GL (Gray)
+ XMS GL (Grigio)
+ XMS GL (グレー)
+ XMS GL (회색)
+
XMS GL (Sand)
XMS GL (sable)
@@ -388,6 +401,18 @@
XMS
XMS
+
+ XMS (Stripes)
+ XMS (Strisce)
+ XMS (縞模様迷彩)
+ XMS (줄무늬 위장)
+
+
+ XMS (Gray)
+ XMS (Grigio)
+ XMS (グレー)
+ XMS (회색)
+
XMS SG (Khaki)
XMS SG (kaki)
@@ -412,6 +437,18 @@
XMS SG
XMS SG
+
+ XMS SG (Stripes)
+ XMS SG (Strisce)
+ XMS SG (縞模様迷彩)
+ XMS SG (줄무늬 위장)
+
+
+ XMS SG (Gray)
+ XMS SG (Grigio)
+ XMS SG (グレー)
+ XMS SG (회색)
+
XMS SG (Sand)
XMS SG (sable)
@@ -448,6 +485,18 @@
XMS SW
XMS SW
+
+ XMS SW (Stripes)
+ XMS SW (Strisce)
+ XMS SW (縞模様迷彩)
+ XMS SW (줄무늬 위장)
+
+
+ XMS SW (Gray)
+ XMS SW (Grigio)
+ XMS SW (グレー)
+ XMS SW (회색)
+
XMS SW (Sand)
XMS SW (sable)
@@ -526,6 +575,18 @@
오토카 아르마 APC (비무장)
オトカ アルマ (非武装)
+
+ C-More Railway (Red, Stripes)
+ C-More Railway (Rosso, Strisce)
+ C-More レイルウェイ (レッド、縞模様迷彩)
+ 씨모어 레일웨이 (빨강/줄무늬 위장)
+
+
+ C-More Railway (Green, Stripes)
+ C-More Railway (Verde, Strisce)
+ C-More レイルウェイ (グリーン、縞模様迷彩)
+ 씨모어 레일웨이 (초록/줄무늬 위장)
+
ELCAN SpecterOS (Hex)
ELCAN SpecterOS (Hex)
@@ -776,7 +837,7 @@
KamAZ Munizioni
KamAZ Munition
카마즈 탄약
- KamAZ 弾薬
+ KamAZ (弾薬)
KamAZ Cargo
@@ -785,7 +846,7 @@
KamAZ Carico
KamAZ Fracht
카마즈 화물
- KamAZ 貨物
+ KamAZ (貨物)
KamAZ Flatbed
@@ -794,7 +855,7 @@
KamAZ Pianale
KamAZ Flachbett
카마즈 플랫베드
- KamAZ フラットベッド
+ KamAZ (平台)
KamAZ Racing
@@ -803,7 +864,7 @@
KamAZ da corsa
KamAZ Rennlaster
카마즈 경주용
- KamAZ レース仕様
+ KamAZ (レース仕様)
KamAZ Repair
@@ -812,7 +873,7 @@
KamAZ Riparazione
KamAZ Instandsetzung
카마즈 정비
- KamAZ 修理
+ KamAZ (修理)
diff --git a/addons/cookoff/XEH_postInit.sqf b/addons/cookoff/XEH_postInit.sqf
index 5ea72193853..bb0e4c0cd7d 100644
--- a/addons/cookoff/XEH_postInit.sqf
+++ b/addons/cookoff/XEH_postInit.sqf
@@ -1,5 +1,7 @@
#include "script_component.hpp"
+GVAR(flareHash) = createHashMap;
+
[QGVAR(cookOffBoxLocal), LINKFUNC(cookOffBoxLocal)] call CBA_fnc_addEventHandler;
[QGVAR(cookOffLocal), LINKFUNC(cookOffLocal)] call CBA_fnc_addEventHandler;
[QGVAR(engineFireLocal), LINKFUNC(engineFireLocal)] call CBA_fnc_addEventHandler;
diff --git a/addons/cookoff/functions/fnc_detonateAmmunitionServer.sqf b/addons/cookoff/functions/fnc_detonateAmmunitionServer.sqf
index b6b97c856a2..222225dcbf0 100644
--- a/addons/cookoff/functions/fnc_detonateAmmunitionServer.sqf
+++ b/addons/cookoff/functions/fnc_detonateAmmunitionServer.sqf
@@ -43,7 +43,7 @@ _object setVariable [QGVAR(isAmmoDetonating), true, true];
_object setVariable [QGVAR(virtualMagazines), nil];
// Save the vehicle's ammo, so it won't be removed during cook-off
-if (!GVAR(removeAmmoDuringCookoff)) then {
+if (!alive _object || !GVAR(removeAmmoDuringCookoff)) then {
_object setVariable [QGVAR(cookoffMagazines), [_object, true] call FUNC(getVehicleAmmo)];
};
diff --git a/addons/cookoff/functions/fnc_detonateAmmunitionServerLoop.sqf b/addons/cookoff/functions/fnc_detonateAmmunitionServerLoop.sqf
index 380849a1395..184dd0d81b3 100644
--- a/addons/cookoff/functions/fnc_detonateAmmunitionServerLoop.sqf
+++ b/addons/cookoff/functions/fnc_detonateAmmunitionServerLoop.sqf
@@ -41,7 +41,8 @@ if (
{private _posASL = getPosWorld _object; surfaceIsWater _posASL && {(_posASL select 2) < 0}} || // Underwater is not very reliable, so use model center instead
{GVAR(ammoCookoffDuration) == 0} ||
{!([GVAR(enableAmmoCookoff), GVAR(enableAmmobox)] select (_object isKindOf "ReammoBox_F"))} ||
- {!(_object getVariable [QGVAR(enableAmmoCookoff), true])}
+ {!(_object getVariable [QGVAR(enableAmmoCookoff), true])} ||
+ {_object getVariable [QGVAR(interruptAmmoCookoff), false]} // QGVAR(interruptAmmoCookoff) stops the current cook-off (allowing future ones), whereas QGVAR(enableAmmoCookoff) disables it entirely
) exitWith {
// Box cook-off fire ends after the ammo has detonated (vehicle cook-off fire does not depend on the ammo detonation)
if (_object isKindOf "ReammoBox_F") then {
@@ -63,6 +64,7 @@ if (
// Reset variables, so the object can detonate its ammo again
_object setVariable [QGVAR(cookoffMagazines), nil];
_object setVariable [QGVAR(virtualMagazines), nil];
+ _object setVariable [QGVAR(interruptAmmoCookoff), nil, true];
_object setVariable [QGVAR(isAmmoDetonating), nil, true];
// If done, destroy the object if necessary
@@ -99,6 +101,10 @@ if (_removeAmmoDuringCookoff) then {
};
// Inventory magazines
case (_magazineInfo isEqualTo false): {
+ if (!alive _object) exitWith {
+ TRACE_1("clearing cargo mags from dead object",alive _object);
+ clearMagazineCargoGlobal _object;
+ };
// Remove selected magazine
_object addMagazineAmmoCargo [_magazineClassname, -1, _ammoCount];
@@ -114,7 +120,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/cookoff/functions/fnc_isMagazineFlare.sqf b/addons/cookoff/functions/fnc_isMagazineFlare.sqf
index f856b21a9a4..a13cf30892b 100644
--- a/addons/cookoff/functions/fnc_isMagazineFlare.sqf
+++ b/addons/cookoff/functions/fnc_isMagazineFlare.sqf
@@ -17,6 +17,8 @@
params ["_magazine"];
-private _configAmmo = configFile >> "CfgAmmo" >> getText (configFile >> "CfgMagazines" >> _magazine >> "ammo");
+GVAR(flareHash) getOrDefaultCall [_magazine, {
+ private _configAmmo = configFile >> "CfgAmmo" >> getText (configFile >> "CfgMagazines" >> _magazine >> "ammo");
-getNumber (_configAmmo >> "intensity") != 0 || {getNumber (_configAmmo >> QEGVAR(grenades,flare)) == 1}
+ getNumber (_configAmmo >> "intensity") != 0 || {getNumber (_configAmmo >> QEGVAR(grenades,flare)) == 1}
+}, true]
diff --git a/addons/csw/functions/fnc_initVehicle.sqf b/addons/csw/functions/fnc_initVehicle.sqf
index 3b8d2524ef8..4d936483bea 100644
--- a/addons/csw/functions/fnc_initVehicle.sqf
+++ b/addons/csw/functions/fnc_initVehicle.sqf
@@ -18,7 +18,7 @@
params ["_vehicle"];
if (!alive _vehicle) exitWith { WARNING_1("%1 not alive",_vehicle); };
if (!simulationEnabled _vehicle) exitWith {
- [{simulationEnabled _this}, FUNC(initVehicle), _vehicle] call CBA_fnc_waitUntilAndExecute;
+ [{simulationEnabled _this}, LINKFUNC(initVehicle), _vehicle] call CBA_fnc_waitUntilAndExecute;
};
private _typeOf = typeOf _vehicle;
diff --git a/addons/dragging/CfgVehicles.hpp b/addons/dragging/CfgVehicles.hpp
index bd9758447bf..d0b34c43f53 100644
--- a/addons/dragging/CfgVehicles.hpp
+++ b/addons/dragging/CfgVehicles.hpp
@@ -4,7 +4,9 @@ class CBA_Extended_EventHandlers;
class CfgVehicles {
class C_man_1;
- class GVAR(clone): C_man_1 {};
+ class GVAR(clone): C_man_1 {
+ scope = 1;
+ };
// Static weapons
class LandVehicle;
diff --git a/addons/dragging/anim/zDummy.rtm b/addons/dragging/anim/zDummy.rtm
deleted file mode 100644
index dfeb7b7fcc9..00000000000
Binary files a/addons/dragging/anim/zDummy.rtm and /dev/null differ
diff --git a/addons/explosives/functions/fnc_placeExplosive.sqf b/addons/explosives/functions/fnc_placeExplosive.sqf
index bb6fcea6ab3..76366905b9d 100644
--- a/addons/explosives/functions/fnc_placeExplosive.sqf
+++ b/addons/explosives/functions/fnc_placeExplosive.sqf
@@ -55,15 +55,13 @@ _triggerSpecificVars pushBack _triggerConfig;
if (isNumber (_magazineTrigger >> "digDistance")) then {
private _digDistance = getNumber (_magazineTrigger >> "digDistance");
- //Get Surface Type:
- private _canDigDown = true;
- private _surfaceType = surfaceType _pos;
- if ((_surfaceType select [0,1]) == "#") then {_surfaceType = _surfaceType select [1, 99];};
- if ((_surfaceType != "") || {isClass (configFile >> "CfgSurfaces" >> _surfaceType >> "soundEnviron")}) then {
- private _soundEnviron = getText (configFile >> "CfgSurfaces" >> _surfaceType >> "soundEnviron");
- TRACE_2("Dig Down Surface",_surfaceType,_soundEnviron);
- _canDigDown = !(_soundEnviron in ["road", "tarmac", "concrete", "concrete_int", "int_concrete", "concrete_ext"]);
+ // If dig distance is negative (=> placed closer towards the sky), ignore digging requirements
+ private _canDigDown = if (_digDistance >= 0) then {
+ [_pos] call EFUNC(common,canDig)
+ } else {
+ true
};
+
//Don't dig down if pos ATL is high (in a building or A2 road)
if (_canDigDown && {(_pos select 2) < 0.1}) then {
TRACE_2("Can Dig Down",_digDistance,_pos);
diff --git a/addons/fastroping/CfgVehicles.hpp b/addons/fastroping/CfgVehicles.hpp
index da49ff93aef..90092b63ca2 100644
--- a/addons/fastroping/CfgVehicles.hpp
+++ b/addons/fastroping/CfgVehicles.hpp
@@ -97,7 +97,7 @@ class CfgVehicles {
class Helicopter_Base_F;
class ACE_friesBase: Helicopter_Base_F {
- destrType = "";
+ destrType = "DestructNo";
class Turrets {};
class ACE_Actions {};
class ACE_SelfActions {};
diff --git a/addons/field_rations/XEH_preInit.sqf b/addons/field_rations/XEH_preInit.sqf
index e74e4086ca9..5efa1db7b55 100644
--- a/addons/field_rations/XEH_preInit.sqf
+++ b/addons/field_rations/XEH_preInit.sqf
@@ -14,11 +14,7 @@ PREP_RECOMPILE_END;
GVAR(thirstModifiers) = [];
GVAR(hungerModifiers) = [];
-private _cache = call (uiNamespace getVariable [QGVAR(cacheP3Ds), {ERROR("no cache")}]); // cache built at preStart
-// List of p3d water sources (case sensitive) for objects that report `typeOf == ""`
-GVAR(waterSourceP3Ds) = _cache select 0;
-// List of refill action offsets corresponding to the p3ds in the array above
-GVAR(waterSourceOffsets) = _cache select 1;
+GVAR(cacheP3Ds) = +(uiNamespace getVariable QGVAR(cacheP3Ds)); // cache built at preStart
// Custom Arsenal Tab
if (["ace_arsenal"] call EFUNC(common,isModLoaded)) then {
diff --git a/addons/field_rations/XEH_preStart.sqf b/addons/field_rations/XEH_preStart.sqf
index ebb22b6ee85..47c913f087d 100644
--- a/addons/field_rations/XEH_preStart.sqf
+++ b/addons/field_rations/XEH_preStart.sqf
@@ -2,14 +2,8 @@
#include "XEH_PREP.hpp"
-// List of p3d water sources (case sensitive) for objects that report `typeOf == ""`
-private _waterSourceP3Ds = [
- "misc_wellpump.p3d" // [11899, 9150, 0] on chenarus
-];
-
-// List of refill action offsets corresponding to the p3ds in the array above
-private _waterSourceOffsets = [
- [0, 0, 0]
+private _waterSourceData = createHashMapFromArray [
+ ["misc_wellpump.p3d", [0, 0, 0]] // [11899, 9150, 0] on Chernarus
];
// Fill water source arrays from CfgVehicles
@@ -22,13 +16,12 @@ private _waterSourceOffsets = [
_string = _string + ".p3d"
};
- private _index = _waterSourceP3Ds pushBackUnique _string;
- if (_index != -1) then {
- _waterSourceOffsets pushBack ([_x >> QXGVAR(offset), "ARRAY", [0, 0, 0]] call CBA_fnc_getConfigEntry);
+ if !(_string in _waterSourceData) then {
+ _waterSourceData set [_string, [_x >> QXGVAR(offset), "ARRAY", [0, 0, 0]] call CBA_fnc_getConfigEntry];
};
} forEach (QUOTE(isNumber (_x >> 'XGVAR(waterSupply)') && {(getNumber (_x >> 'XGVAR(waterSupply)')) != REFILL_WATER_DISABLED}) configClasses (configFile >> "CfgVehicles"));
-uiNamespace setVariable [QGVAR(cacheP3Ds), compileFinal str [_waterSourceP3Ds, _waterSourceOffsets]];
-TRACE_1("compiled",count _waterSourceP3Ds);
+uiNamespace setVariable [QGVAR(cacheP3Ds), compileFinal _waterSourceData];
+TRACE_1("compiled",count _waterSourceData);
call FUNC(scanFieldRations);
diff --git a/addons/field_rations/anim/zDummy.rtm b/addons/field_rations/anim/zDummy.rtm
deleted file mode 100644
index dfeb7b7fcc9..00000000000
Binary files a/addons/field_rations/anim/zDummy.rtm and /dev/null differ
diff --git a/addons/field_rations/functions/fnc_getActionOffset.sqf b/addons/field_rations/functions/fnc_getActionOffset.sqf
index 763654c6559..60e78cc594a 100644
--- a/addons/field_rations/functions/fnc_getActionOffset.sqf
+++ b/addons/field_rations/functions/fnc_getActionOffset.sqf
@@ -20,7 +20,7 @@ params ["_object"];
private _configOf = configOf _object;
if (isNull _configOf) then {
// Check for offset corresponding to p3d list
- GVAR(waterSourceOffsets) param [GVAR(waterSourceP3ds) find (getModelInfo _object select 0), [0, 0, 0], [[]]];
+ GVAR(cacheP3Ds) getOrDefault [getModelInfo _object select 0, [0, 0, 0]]
} else {
// Check for offset in config since we have valid typeOf
private _offset = getArray (_configOf >> QXGVAR(offset));
diff --git a/addons/field_rations/functions/fnc_getRemainingWater.sqf b/addons/field_rations/functions/fnc_getRemainingWater.sqf
index 1011136e0ce..1328e84799a 100644
--- a/addons/field_rations/functions/fnc_getRemainingWater.sqf
+++ b/addons/field_rations/functions/fnc_getRemainingWater.sqf
@@ -25,7 +25,7 @@ if (isNil "_water") then {
private _configOf = configOf _source;
if (isNull _configOf) then {
// Check the p3d name against list
- _water = if ((getModelInfo _source select 0) in GVAR(waterSourceP3ds)) then {REFILL_WATER_INFINITE} else {REFILL_WATER_DISABLED};
+ _water = [REFILL_WATER_DISABLED, REFILL_WATER_INFINITE] select ((getModelInfo _source select 0) in GVAR(cacheP3Ds));
} else {
// Check for waterSupply entry since we have valid typeOf
_water = getNumber (_configOf >> QXGVAR(waterSupply));
diff --git a/addons/field_rations/stringtable.xml b/addons/field_rations/stringtable.xml
index ebf780c3010..898225a533a 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
- 오렌지 향의 톡쏘는 탄산음료
+ 오렌지향의 톡 쏘는 탄산음료
口いっぱいに果物を感じるオレンジ風味のソフトドリンク
有著微微的橘子水果味的汽水
橙子味汽水,有刺鼻的水果味
@@ -309,7 +309,7 @@
Bebendo de %1...
Выпивание из %1...
Trinke von %1...
- %1 으로 부터 마시는 중...
+ %1(으)로 마시는 중...
%1 から飲んでいます・・・
飲用%1的水中...
从%1饮用中...
@@ -1284,11 +1284,21 @@
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.
+ Se attivato, fame e sete continueranno ad aumentare mentre l'interfaccia Zeus è aperta.
+ Если эта функция включена, чувство голода и жажды будет продолжать усиливаться, пока открыт интерфейс Zeus.
Update Hunger and Thirst in Zeus
+ Zunehmender Hunger und Durst im Zeus
Zeus時に空腹と渇きを進行させる
+ 제우스의 허기와 갈증 업데이트
+ Mise à jour Faim et soif dans Zeus
+ Simula fame e sete in 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..ac466207435 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,18 @@
청력을 보호합니다
聴覚の保護
+
+ %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.
+ %Protezione Uditiva Elettronica (PUE)%4 impedisce danni all'udito da ripetuti rumori assordanti vicino al soldato. Diversamente dai %3Tappi auricolari%4, il volume è solo ridotto quando necessario. %3PUE%4 può anche essere integrata in vari tipi di %3Caschi%4 e %3Occhiali%4.<br/><br/>%Utilizzo:%4<br/>%2Usa [%3%12%4] e seleziona %3Equipaggiamento%4.<br/>%2Indossa la protezione uditiva elettronica%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
+ Protegge il tuo udito, elettronicamente
+ 聴覚を保護。電子的に。
+ 전자적으로 청력을 보호합니다
+
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 +455,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 +799,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 +810,7 @@
Fluidos IV
IV-Flüssigkeiten
IV 수액
- IV 輸液
+ 静脈注射(IV)による輸液
Restore Blood Volume
diff --git a/addons/fire/XEH_postInit.sqf b/addons/fire/XEH_postInit.sqf
index 1050d757538..ed9b1b62523 100644
--- a/addons/fire/XEH_postInit.sqf
+++ b/addons/fire/XEH_postInit.sqf
@@ -9,6 +9,22 @@
[QGVAR(burnEffects), LINKFUNC(burnEffects)] call CBA_fnc_addEventHandler;
[QGVAR(burnSimulation), LINKFUNC(burnSimulation)] call CBA_fnc_addEventHandler;
+ // Make burning wrecks into fire sources
+ ["AllVehicles", "Killed", {
+ params ["_vehicle", "", "", "_useEffects"];
+
+ if (_useEffects && {_vehicle getEntityInfo 13}) then {
+ [QGVAR(addFireSource), [
+ _vehicle,
+ (boundingBoxReal [_vehicle, "FireGeometry"]) select 2,
+ BURN_MAX_INTENSITY,
+ QGVAR(wreck) + hashValue _vehicle,
+ {_this getEntityInfo 13},
+ _vehicle
+ ]] call CBA_fnc_serverEvent;
+ };
+ }, true, ["Man", "StaticWeapon"], true] call CBA_fnc_addClassEventHandler; // Use "Man" to exclude animals as well
+
[QGVAR(playScream), {
params ["_scream", "_source"];
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/CfgAmmoFragParameters.hpp b/addons/frag/CfgAmmoFragParameters.hpp
index 588032673d2..269f7df3548 100644
--- a/addons/frag/CfgAmmoFragParameters.hpp
+++ b/addons/frag/CfgAmmoFragParameters.hpp
@@ -10,7 +10,7 @@ class B_20mm: BulletBase {
GVAR(charge) = 6;
GVAR(metal) = 114;
GVAR(gurney_c) = 2830;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(classes)[] = {QGVAR(tiny_HD)};
};
@@ -23,7 +23,7 @@ class ammo_Gun20mmAABase: BulletBase { // 20x139mm
GVAR(charge) = 6;
GVAR(metal) = 114;
GVAR(gurney_c) = 2830;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(classes)[] = {QGVAR(tiny_HD)};
};
@@ -31,7 +31,7 @@ class ammo_Gun30mmAABase: BulletBase { // 30x210mm HEI
GVAR(skip) = 0;
GVAR(charge) = 40;
GVAR(metal) = 410;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(gurney_c) = 2901;
GVAR(classes)[] = {QGVAR(tiny_HD), QGVAR(tiny_HD), QGVAR(small_HD)};
@@ -44,7 +44,7 @@ class B_30mm_HE: B_19mm_HE {
GVAR(charge) = 25;
GVAR(metal) = 320;
GVAR(gurney_c) = 2552;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(classes)[] = {QGVAR(tiny_HD), QGVAR(tiny_HD), QGVAR(small_HD)};
};
class B_30mm_MP: B_30mm_HE {
@@ -53,7 +53,7 @@ class B_30mm_MP: B_30mm_HE {
GVAR(metal) = 388;
GVAR(charge) = 56;
GVAR(gurney_c) = 2600;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(classes)[] = {QGVAR(tiny_HD), QGVAR(tiny_HD), QGVAR(small_HD)};
};
@@ -63,7 +63,7 @@ class Gatling_30mm_HE_Plane_CAS_01_F: BulletBase {
GVAR(metal) = 388;
GVAR(charge) = 56;
GVAR(gurney_c) = 2600; // guessed
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
};
class ammo_Gun35mmAABase: BulletBase {
@@ -73,7 +73,7 @@ class ammo_Gun35mmAABase: BulletBase {
GVAR(skip) = 0;
GVAR(charge) = 98;
GVAR(metal) = 400;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(gurney_c) = 2700;
GVAR(classes)[] = {QGVAR(tiny_HD), QGVAR(tiny_HD), QGVAR(small_HD)};
};
@@ -85,7 +85,7 @@ class B_35mm_AA: BulletBase {
GVAR(skip) = 0;
GVAR(charge) = 98;
GVAR(metal) = 400;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(gurney_c) = 2700;
GVAR(classes)[] = {QGVAR(tiny_HD), QGVAR(tiny_HD), QGVAR(small_HD)};
};
@@ -98,7 +98,7 @@ class B_40mm_GPR: B_30mm_HE {
GVAR(metal) = 750;
GVAR(charge) = 120;
GVAR(gurney_c) = 2700; // guessed
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
};
class UnderwaterMine_Range_Ammo: MineBase {
GVAR(skip) = 1;
@@ -110,7 +110,7 @@ class Bo_GBU12_LGB: ammo_Bomb_LaserGuidedBase {
GVAR(charge) = 87000;
GVAR(metal) = 140000;
GVAR(gurney_c) = 2320;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(classes)[] = {QGVAR(large), QGVAR(large), QGVAR(large_HD), QGVAR(large_HD), QGVAR(huge_HD), QGVAR(huge_HD), QGVAR(huge_HD)};
};
class Bomb_03_F: ammo_Bomb_LaserGuidedBase {
@@ -118,7 +118,7 @@ class Bomb_03_F: ammo_Bomb_LaserGuidedBase {
GVAR(charge) = 100000;
GVAR(metal) = 150000;
GVAR(gurney_c) = 2320;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(classes)[] = {QGVAR(large), QGVAR(large), QGVAR(large_HD), QGVAR(large_HD), QGVAR(huge_HD), QGVAR(huge_HD), QGVAR(huge_HD)};
};
class Bomb_04_F: ammo_Bomb_LaserGuidedBase {
@@ -126,7 +126,7 @@ class Bomb_04_F: ammo_Bomb_LaserGuidedBase {
GVAR(charge) = 87000;
GVAR(metal) = 140000;
GVAR(gurney_c) = 2320;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(classes)[] = {QGVAR(large), QGVAR(large), QGVAR(large_HD), QGVAR(large_HD), QGVAR(huge_HD), QGVAR(huge_HD), QGVAR(huge_HD)};
};
class BombCluster_01_Ammo_F: Bomb_04_F {
@@ -137,7 +137,7 @@ class ammo_Bomb_SmallDiameterBase: ammo_Bomb_LaserGuidedBase {
GVAR(charge) = 160; // kg
GVAR(metal) = 113; // kg
GVAR(gurney_c) = 2830;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD), QGVAR(large), QGVAR(large_HD), QGVAR(huge_HD), QGVAR(huge_HD)};
};
@@ -147,7 +147,7 @@ class Bo_Mk82: BombCore {
GVAR(metal) = 140000;
GVAR(charge) = 87000;
GVAR(gurney_c) = 2320;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
};
class Mo_cluster_AP: ShellBase {
@@ -160,7 +160,7 @@ class Mo_cluster_Bomb_01_F: Mo_cluster_AP { // Mk 118 Rockeye
GVAR(metal) = 400;
GVAR(charge) = 180;
GVAR(gurney_c) = 2700;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
};
class Mo_cluster_Bomb_02_F: Mo_cluster_Bomb_01_F { // ShOAB-0.5
GVAR(classes)[] = {QGVAR(small_HD)};
@@ -188,7 +188,7 @@ class GrenadeHand: Grenade {
GVAR(metal) = 210; // metal in grams
GVAR(charge) = 185; // explosive in grams
GVAR(gurney_c) = 2843; // Gurney velocity constant for explosive type. See: http://en.wikipedia.org/wiki/Gurney_equations
- GVAR(gurney_k) = "3/5"; // Gurney shape factor, in this case a sphere. See: http://en.wikipedia.org/wiki/Gurney_equations
+ GVAR(gurney_k) = 3/5; // Gurney shape factor, in this case a sphere. See: http://en.wikipedia.org/wiki/Gurney_equations
};
class mini_Grenade: GrenadeHand {
GVAR(classes)[] = {QGVAR(tiny_HD)};
@@ -209,14 +209,14 @@ class G_40mm_HE: GrenadeBase {
GVAR(metal) = 200;
GVAR(charge) = 32;
GVAR(gurney_c) = 2700;
- GVAR(gurney_k) = "3/5"; // interior fragmenter/charge is a sphere
+ GVAR(gurney_k) = 3/5; // interior fragmenter/charge is a sphere
};
class G_20mm_HE: G_40mm_HE {
GVAR(classes)[] = {QGVAR(tiny_HD)};
GVAR(metal) = 50;
GVAR(charge) = 8;
GVAR(gurney_c) = 2700;
- GVAR(gurney_k) = "3/5"; // interior fragmenter/charge is a sphere
+ GVAR(gurney_k) = 3/5; // interior fragmenter/charge is a sphere
};
class G_40mm_HEDP: G_40mm_HE {
// Source: http://www.inetres.com/gp/military/infantry/grenade/40mm_ammo.html#M433
@@ -224,7 +224,7 @@ class G_40mm_HEDP: G_40mm_HE {
GVAR(metal) = 200;
GVAR(charge) = 45;
GVAR(gurney_c) = 2830;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
};
class ACE_G_40mm_HEDP: G_40mm_HEDP {};
@@ -247,7 +247,7 @@ class APERSMine_Range_Ammo: MineBase { // VS-50
GVAR(metal) = 100;
GVAR(charge) = 50;
GVAR(gurney_c) = 2700;
- GVAR(gurney_k) = "1/3";
+ GVAR(gurney_k) = 1/3;
};
class APERSBoundingMine_Range_Ammo: BoundingMineBase {
@@ -257,7 +257,7 @@ class APERSBoundingMine_Range_Ammo: BoundingMineBase {
GVAR(metal) = 80;
GVAR(charge) = 170;
GVAR(gurney_c) = 2700;
- GVAR(gurney_k) = "3/5";
+ GVAR(gurney_k) = 3/5;
};
class TrainingMine_Ammo: APERSMine_Range_Ammo {
@@ -275,7 +275,7 @@ class APERSTripMine_Wire_Ammo: DirectionalBombBase {
GVAR(metal) = 210;
GVAR(charge) = 185;
GVAR(gurney_c) = 2843;
- GVAR(gurney_k) = "3/5";
+ GVAR(gurney_k) = 3/5;
};
class IEDUrbanBig_Remote_Ammo: PipeBombBase {
@@ -284,7 +284,7 @@ class IEDUrbanBig_Remote_Ammo: PipeBombBase {
GVAR(metal) = 36000;
GVAR(charge) = 9979;
GVAR(gurney_c) = 2440;
- GVAR(gurney_k) = "3/5";
+ GVAR(gurney_k) = 3/5;
};
class IEDLandBig_Remote_Ammo: PipeBombBase {
GVAR(skip) = 0;
@@ -292,14 +292,14 @@ class IEDLandBig_Remote_Ammo: PipeBombBase {
GVAR(metal) = 36000;
GVAR(charge) = 9979;
GVAR(gurney_c) = 2440;
- GVAR(gurney_k) = "3/5";
+ GVAR(gurney_k) = 3/5;
};
class IEDUrbanSmall_Remote_Ammo: PipeBombBase {
GVAR(skip) = 0;
GVAR(metal) = 23000;
GVAR(charge) = 3148;
GVAR(gurney_c) = 2830;
- GVAR(gurney_k) = "3/5";
+ GVAR(gurney_k) = 3/5;
GVAR(classes)[] = {QGVAR(small), QGVAR(medium_HD), QGVAR(medium_HD)};
};
class IEDLandSmall_Remote_Ammo: PipeBombBase {
@@ -307,7 +307,7 @@ class IEDLandSmall_Remote_Ammo: PipeBombBase {
GVAR(metal) = 23000;
GVAR(charge) = 3148;
GVAR(gurney_c) = 2830;
- GVAR(gurney_k) = "3/5";
+ GVAR(gurney_k) = 3/5;
GVAR(classes)[] = {QGVAR(small), QGVAR(medium_HD), QGVAR(medium_HD)};
};
@@ -320,7 +320,7 @@ class UXO1_Ammo_Base_F: APERSMine_Range_Ammo { // Mk 118 Rockeye
GVAR(charge) = 180;
GVAR(metal) = 400;
GVAR(gurney_c) = 2700;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(classes)[] = {QGVAR(small_HD)};
};
@@ -343,7 +343,7 @@ class ClaymoreDirectionalMine_Remote_Ammo: DirectionalBombBase {
GVAR(metal) = 700;
GVAR(charge) = 680;
GVAR(gurney_c) = 2700;
- GVAR(gurney_k) = "3/5";
+ GVAR(gurney_k) = 3/5;
};
class SatchelCharge_Remote_Ammo: PipeBombBase {
@@ -374,7 +374,7 @@ class R_PG7_F: RocketBase {
GVAR(metal) = 100;
GVAR(charge) = 560;
GVAR(gurney_c) = 2730;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
};
class R_PG32V_F: RocketBase {
@@ -385,7 +385,7 @@ class R_TBG32V_F: R_PG32V_F { // Thermobaric
GVAR(metal) = 400;
GVAR(charge) = 210;
GVAR(gurney_c) = 2800;
- GVAR(gurney_k) = "3/5";
+ GVAR(gurney_k) = 3/5;
GVAR(classes)[] = {QGVAR(medium_HD)};
};
@@ -394,14 +394,14 @@ class M_SPG9_HEAT: RocketBase {
GVAR(metal) = 4150;
GVAR(charge) = 340;
GVAR(gurney_c) = 2970;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(classes)[] = {QGVAR(small_HD), QGVAR(medium_HD)};
};
class M_SPG9_HE: M_SPG9_HEAT {
GVAR(metal) = 4695;
GVAR(charge) = 655;
GVAR(gurney_c) = 2800;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(classes)[] = {QGVAR(small_HD), QGVAR(tiny), QGVAR(medium_HD), QGVAR(medium_HD)};
};
@@ -411,7 +411,7 @@ class R_MRAAWS_HEAT_F: RocketBase { // Table A-20. HEAT 751
GVAR(metal) = 2265;
GVAR(charge) = 635;
GVAR(gurney_c) = 2970;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(classes)[] = {QGVAR(small_HD)};
};
@@ -423,7 +423,7 @@ class R_MRAAWS_HE_F: R_MRAAWS_HEAT_F { // Table A-6. HE 441D RS
GVAR(metal) = 2300;
GVAR(charge) = 590;
GVAR(gurney_c) = 2800;
- GVAR(gurney_k) = "3/5";
+ GVAR(gurney_k) = 3/5;
GVAR(classes)[] = {QGVAR(small_HD)};
};
@@ -432,7 +432,7 @@ class R_80mm_HE: RocketBase { // S-8D
GVAR(charge) = 2150;
GVAR(metal) = 1650;
GVAR(gurney_c) = 2700;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(classes)[] = {QGVAR(small_HD), QGVAR(tiny_HD), QGVAR(tiny)};
};
class R_60mm_HE: R_80mm_HE { // no idea but looks like a FFAR so made it weaker
@@ -445,7 +445,7 @@ class m_70mm_saami: MissileBase {
GVAR(charge) = 2150;
GVAR(metal) = 1650;
GVAR(gurney_c) = 2700;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(classes)[] = {QGVAR(small_HD), QGVAR(tiny_HD), QGVAR(tiny)};
};
@@ -455,7 +455,7 @@ class Rocket_04_HE_F: MissileBase { // Shrieker (Hydra 70)
GVAR(metal) = 3850;
GVAR(charge) = 1040;
GVAR(gurney_c) = 2700;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
};
class Rocket_03_HE_F: Rocket_04_HE_F { // S-8DM makes the most sense
GVAR(metal) = 1800;
@@ -475,7 +475,7 @@ class R_230mm_fly: ShellBase {
GVAR(charge) = 100; // kg
GVAR(metal) = 150; // kg
GVAR(gurney_c) = 2320;
- GVAR(gurney_k) = "3/5";
+ GVAR(gurney_k) = 3/5;
GVAR(classes)[] = {QGVAR(large_HD), QGVAR(large), QGVAR(large), QGVAR(large), QGVAR(huge_HD), QGVAR(huge_HD), QGVAR(huge)};
};
@@ -485,7 +485,7 @@ class M_PG_AT: MissileBase { // DAGR M247 warhead
GVAR(charge) = 910;
GVAR(metal) = 3085;
GVAR(gurney_c) = 2700;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
};
class M_AT: M_PG_AT { // DAR (Hydra 70) M151 warhead
GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)};
@@ -502,7 +502,7 @@ class Missile_AGM_02_F: MissileBase {
GVAR(metal) = 56250;
GVAR(charge) = 39000;
GVAR(gurney_c) = 2700;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
};
class Missile_AGM_01_F: Missile_AGM_02_F { // Kh-25MTP !!! fix me
};
@@ -514,7 +514,7 @@ class M_Titan_AA: MissileBase {
GVAR(metal) = 1980;
GVAR(charge) = 1020;
GVAR(gurney_c) = 2501;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(classes)[] = {QGVAR(tiny), QGVAR(tiny_HD), QGVAR(small_HD)};
};
class M_Titan_AT: MissileBase {
@@ -525,7 +525,7 @@ class M_Titan_AP: M_Titan_AT {
GVAR(metal) = 400;
GVAR(charge) = 210;
GVAR(gurney_c) = 2800;
- GVAR(gurney_k) = "3/5";
+ GVAR(gurney_k) = 3/5;
GVAR(classes)[] = {QGVAR(medium_HD)};
};
@@ -535,7 +535,7 @@ class M_Scalpel_AT: MissileBase { // 9K121 Vikhr
GVAR(metal) = 10000;
GVAR(charge) = 3000;
GVAR(gurney_c) = 2700;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
};
class ACE_Hellfire_AGM114K: M_Scalpel_AT {
// Source: http://www.designation-systems.net/dusrm/m-114.html
@@ -545,7 +545,7 @@ class ACE_Hellfire_AGM114K: M_Scalpel_AT {
GVAR(metal) = 8000;
GVAR(charge) = 2400;
GVAR(gurney_c) = 2700;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
};
class ammo_Missile_CruiseBase: MissileBase {};
@@ -555,12 +555,12 @@ class ammo_missile_cruise_01: ammo_Missile_CruiseBase {
GVAR(metal) = 700000;
GVAR(charge) = 110000;
GVAR(gurney_c) = 2600;
- GVAR(gurney_k) = "3/5";
+ GVAR(gurney_k) = 3/5;
};
class ammo_Missile_Cruise_01_Cluster: ammo_missile_cruise_01 {};
class ammo_Missile_AntiRadiationBase: MissileBase {
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(gurney_c) = 2400;
};
class ammo_Missile_HARM: ammo_Missile_AntiRadiationBase {
@@ -581,7 +581,7 @@ class M_Zephyr: M_Titan_AA { // model is an AMRAAM- WDU-41/B warhead
GVAR(metal) = 12800;
GVAR(charge) = 4000;
GVAR(gurney_c) = 2900;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(classes)[] = {QGVAR(tiny), QGVAR(medium_HD), QGVAR(small), QGVAR(small_HD)};
};
@@ -590,7 +590,7 @@ class M_Air_AA: MissileBase { // Looks not real, maybe r-73 inspired?
GVAR(charge) = 2450;
GVAR(metal) = 4950;
GVAR(gurney_c) = 2700;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(classes)[] = {QGVAR(tiny), QGVAR(medium_HD), QGVAR(small_HD), QGVAR(small_HD)};
};
@@ -599,7 +599,7 @@ class Missile_AA_04_F: MissileBase {
GVAR(charge) = 4400;
GVAR(metal) = 5000;
GVAR(gurney_c) = 2830;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
};
class Missile_AA_03_F: Missile_AA_04_F {
GVAR(charge) = 2450;
@@ -608,7 +608,7 @@ class Missile_AA_03_F: Missile_AA_04_F {
};
class ammo_Missile_ShortRangeAABase: MissileBase {
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
};
class ammo_Missile_rim116: ammo_Missile_ShortRangeAABase {
GVAR(skip) = 0;
@@ -634,7 +634,7 @@ class ammo_Missile_AA_R73: ammo_Missile_ShortRangeAABase {
class ammo_Missile_MediumRangeAABase: MissileBase {
GVAR(gurney_c) = 2900;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
};
class ammo_Missile_rim162: ammo_Missile_MediumRangeAABase {
GVAR(skip) = 0;
@@ -673,7 +673,7 @@ class M_Vorona_HE: M_Vorona_HEAT {
GVAR(metal) = 13800;
GVAR(charge) = 4950;
GVAR(gurney_c) = 2800;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(classes)[] = {QGVAR(tiny)};
};
@@ -702,7 +702,7 @@ class Sh_155mm_AMOS: ShellBase {
GVAR(charge) = 9979;
GVAR(metal) = 36000;
GVAR(gurney_c) = 2440;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(classes)[] = {QGVAR(large), QGVAR(large), QGVAR(large_HD), QGVAR(large), QGVAR(huge), QGVAR(huge_HD), QGVAR(huge)};
};
@@ -717,7 +717,7 @@ class Sh_120mm_HE: ShellBase {
GVAR(charge) = 3148;
GVAR(metal) = 23000;
GVAR(gurney_c) = 2830;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)};
};
class Sh_120mm_HEAT_MP: ShellBase {
@@ -725,7 +725,7 @@ class Sh_120mm_HEAT_MP: ShellBase {
GVAR(charge) = 2500;
GVAR(metal) = 5000;
GVAR(gurney_c) = 2500;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(classes)[] = {QGVAR(small), QGVAR(medium), QGVAR(medium_HD), QGVAR(medium_HD)};
};
@@ -762,7 +762,7 @@ class ModuleOrdnanceHowitzer_F_ammo: Sh_155mm_AMOS {
GVAR(metal) = 1950;
GVAR(charge) = 15800;
GVAR(gurney_c) = 2320;
- GVAR(gurney_k) = "1/2";
+ GVAR(gurney_k) = 1/2;
GVAR(classes)[] = {QGVAR(large), QGVAR(large_HD), QGVAR(large_HD), QGVAR(large_HD), QGVAR(huge_HD), QGVAR(huge_HD), QGVAR(huge_HD)};
};
class ammo_Penetrator_Base: ShellBase {
diff --git a/addons/frag/initSettingsDebug.inc.sqf b/addons/frag/initSettingsDebug.inc.sqf
index a1528a446cf..ad2f8260bac 100644
--- a/addons/frag/initSettingsDebug.inc.sqf
+++ b/addons/frag/initSettingsDebug.inc.sqf
@@ -4,7 +4,7 @@ private _category = format ["ACE %1", LLSTRING(Module_DisplayName)];
QGVAR(debugOptions),
"CHECKBOX",
[LSTRING(EnableDebugTrace), LSTRING(EnableDebugTrace_Desc)],
- [_category, LSTRING(Debug)],
+ [_category, ELSTRING(common,Debug)],
true
] call CBA_fnc_addSetting;
@@ -12,7 +12,7 @@ private _category = format ["ACE %1", LLSTRING(Module_DisplayName)];
QGVAR(dbgSphere),
"CHECKBOX",
[LSTRING(HitSphereEnable), LSTRING(HitSphereEnable_Desc)],
- [_category, LSTRING(Debug)],
+ [_category, ELSTRING(common,Debug)],
false
] call CBA_fnc_addSetting;
@@ -20,6 +20,6 @@ private _category = format ["ACE %1", LLSTRING(Module_DisplayName)];
QGVAR(drawHitBox),
"CHECKBOX",
[LSTRING(DrawHitBox), LSTRING(DrawHitBox_Desc)],
- [_category, LSTRING(Debug)],
+ [_category, ELSTRING(common,Debug)],
true
] call CBA_fnc_addSetting;
diff --git a/addons/frag/stringtable.xml b/addons/frag/stringtable.xml
index 1385937a377..e71347cc98b 100644
--- a/addons/frag/stringtable.xml
+++ b/addons/frag/stringtable.xml
@@ -1,23 +1,16 @@
-
- Debug
- Debug
- Debug
- Debug
- Отладка
- 디버그
- デバッグ
-
Draw Hitboxes
Afficher les hitboxes
Dibujar hitboxes
Visualizza hitbox
Изобразить хитбоксы
+ Zeige Hitboxen
히트박스 그리기
ヒットボックスを描画
+ 显示碰撞箱
Draw hitboxes on objects that were targeted.
@@ -25,9 +18,10 @@
Dibuja hitboxes en objetos que son seguidos.
Visualizza hitbox su potenziali bersagli della frammentazione.
Изобразить хитбоксы на объектах, которые были нацелены.
- Splitter-/Explosions-Debugging
+ Zeige Hitboxen von Zielobjekten
타겟팅된 오브젝트에 히트박스를 그립니다.
被弾した物体のヒットボックスを描画します。
+ 在破片的目标物体上显示碰撞箱
Frag/Spall Debug Tracing
@@ -35,9 +29,10 @@
Trazado Debug de Fragmentación/Astillamiento
Traccia Frag/Spall per Debug
Отладка трассировки фрагментации/осколков
- Splitter-/Explosions-Debug-Verfolgung
+ Debug-Verfolgung von Splittern und Wurfstücken
파열/파편 디버그 추적
フラグとスポールの追跡デバッグ
+ 破片/剥落绘制轨迹
Enables visual tracing of fragmentation and spalling rounds.
@@ -45,9 +40,10 @@
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.
파열과 파편의 시각적 추적을 활성화합니다.
フラグメンテーションとスポーリングによって発生した破片飛翔体の動きを視覚的に追跡できる機能を有効化します。
+ 启用破片以及物体剥落产生的破片的轨迹绘制
Fragmentation Simulation
@@ -120,7 +116,7 @@
Symulacja odprysków
Simulação de estilhaços
Симуляция обломков
- Explosionssimulation
+ Simulation von Spreng- und Wurfstücken
파편 시뮬레이션
スポーリング シミュレーション
模擬剝落
@@ -136,7 +132,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,8 +145,10 @@
Dibujar Esferas de Eventos
Visualizza sfere eventi
Изобразить сферы событий
+ Visualisiere Ereigniskugeln
이벤트 구체 그리기
イベントを球体として描画
+ 绘制命中球体指示
Draw color coded spheres at any event for tracked rounds.
@@ -158,8 +156,10 @@
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.
모든 이벤트에서 추적된 파편을 위한 색상으로 구분하는 구체를 그립니다.
追跡中の飛翔体に発生した全てのイベントを色付けた球体として描画します。
+ 在破片命中物体的位置上绘制一个带有颜色的提示球
Fragmentation Simulation
@@ -183,8 +183,10 @@
Intensidad del astillamiento
Intensità dello spalling
Интенсивность обрушения
+ Intensität der Wurfstücke
파편 강도
スポーリング強度
+ 剥落效果强度
Modifier to increase or decrease the number and intensity of spalling events. Increasing this value may cause performance degradation.
@@ -192,8 +194,10 @@
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.
파편 이벤트 수와 강도를 늘리거나 줄입니다. 이 값을 늘리면 성능이 저하될 수 있습니다.
スポーリング現象が発生する数と強度を増減することが出来ます。この値を大きくすることはパフォーマンスの低下につながる可能性があります。
+ 增加或降低剥落破片的数量和强度. 增加可能会降低FPS
diff --git a/addons/gestures/anim/zDummy.rtm b/addons/gestures/anim/zDummy.rtm
deleted file mode 100644
index dfeb7b7fcc9..00000000000
Binary files a/addons/gestures/anim/zDummy.rtm and /dev/null differ
diff --git a/addons/gforces/ACE_Arsenal_Stats.hpp b/addons/gforces/ACE_Arsenal_Stats.hpp
index bebcf74489d..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) > 0);
+ 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/anim/zDummy.rtm b/addons/goggles/anim/zDummy.rtm
deleted file mode 100644
index dfeb7b7fcc9..00000000000
Binary files a/addons/goggles/anim/zDummy.rtm and /dev/null differ
diff --git a/addons/goggles/initSettings.inc.sqf b/addons/goggles/initSettings.inc.sqf
index 47b173be3a4..9dae1346aec 100644
--- a/addons/goggles/initSettings.inc.sqf
+++ b/addons/goggles/initSettings.inc.sqf
@@ -26,7 +26,7 @@
[
QGVAR(drawOverlay), "CHECKBOX",
- LSTRING(DrawOverlay),
+ LSTRING(SettingDrawOverlay),
localize LSTRING(SettingsName),
true,
0
diff --git a/addons/goggles/stringtable.xml b/addons/goggles/stringtable.xml
index d59584d8b3b..2b8d98f5082 100644
--- a/addons/goggles/stringtable.xml
+++ b/addons/goggles/stringtable.xml
@@ -20,17 +20,22 @@
Show Goggles Overlay
ゴーグルのオーバーレイを表示する
+ 고글 오버레이 표시
+ Afficher la superposition des lunettes
+ Mostra Overlay degli Occhiali
+ Показать оверлей очков
+ Zeige Schutzbrillenoberfläche
Show Wipe Goggles self interaction
Ukaž Vyčistit brýle v menu Interakce (vlastní)
Afficher l'interaction "Essuyer les lunettes"
Mostrar limpiar gafas en menú de auto-interacción
- Mostra interazione automatica per la pulizia degli occhiali
+ Mostra autointerazione per la pulizia degli occhiali
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_explosion.sqf b/addons/hearing/functions/fnc_explosion.sqf
index 2d3d5929895..8eceeeaf148 100644
--- a/addons/hearing/functions/fnc_explosion.sqf
+++ b/addons/hearing/functions/fnc_explosion.sqf
@@ -32,11 +32,6 @@ if (_distance > 100) exitWith {
private _ammoConfig = configOf _projectile;
private _hit = getNumber (_ammoConfig >> "hit");
if (_hit < 0.5) exitWith { TRACE_1("ignore smoke/flare",_hit) };
-private _explosive = getNumber (_ammoConfig >> "explosive");
-
-private _vehAttenuation = [GVAR(playerVehAttenuation), 1] select (isNull objectParent ACE_player || {isTurnedOut ACE_player});
-
-TRACE_4("",typeOf _projectile,_distance,_explosive,_vehAttenuation);
(if (isArray (_ammoConfig >> "soundHit1")) then {
getArray (_ammoConfig >> "soundHit1")
@@ -48,9 +43,16 @@ if (_distance > _maxDistance) exitWith {
TRACE_2("too far away",_distance,_maxDistance);
};
+private _explosive = getNumber (_ammoConfig >> "explosive");
+private _hearingDamageFactor = [_ammoConfig >> QGVAR(hearingDamageFactor), "NUMBER", 1] call CBA_fnc_getConfigEntry;
+
+private _vehAttenuation = [GVAR(playerVehAttenuation), 1] select (isNull objectParent ACE_player || {isTurnedOut ACE_player});
+
+TRACE_5("",typeOf _projectile,_distance,_explosive,_hearingDamageFactor,_vehAttenuation);
+
// Tone down _maxDistance to bring strength back to similar levels as a large burst of a loud weapon
-private _strength = _vehAttenuation * _explosive * _volume * (_maxDistance / 2) / _distance^2;
-TRACE_6("strength",_vehAttenuation,_explosive,_volume,_maxDistance,_distance,_strength);
+private _strength = _vehAttenuation * _explosive * _hearingDamageFactor * _volume * (_maxDistance / 2) / _distance^2;
+TRACE_7("strength",_vehAttenuation,_explosive,_hearingDamageFactor,_volume,_maxDistance,_distance,_strength);
// Call immediately, as it will get picked up later by the update thread anyway
(_strength * GVAR(explosionDeafnessCoefficient)) call FUNC(earRinging);
diff --git a/addons/hearing/functions/fnc_getAmmoLoudness.sqf b/addons/hearing/functions/fnc_getAmmoLoudness.sqf
index 062b96fa718..1ad072f157e 100644
--- a/addons/hearing/functions/fnc_getAmmoLoudness.sqf
+++ b/addons/hearing/functions/fnc_getAmmoLoudness.sqf
@@ -37,8 +37,9 @@ GVAR(cacheAmmoLoudness) getOrDefaultCall [_magazine, {
default {[_caliber, 6.5] select (_caliber <= 0)};
};
- private _loudness = (_caliber ^ 1.25 / 10) * (_initspeed / 1000) / 5;
- TRACE_5("building cache",_ammo,_magazine,_initSpeed,_caliber,_loudness);
+ private _hearingDamageFactor = [_ammoConfig >> QGVAR(hearingDamageFactor), "NUMBER", 1] call CBA_fnc_getConfigEntry;
+ private _loudness = _hearingDamageFactor * (_caliber ^ 1.25 / 10) * (_initspeed / 1000) / 5;
+ TRACE_6("building cache",_ammo,_magazine,_initSpeed,_caliber,_hearingDamageFactor,_loudness);
_loudness
}, true]
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 8bafa28664f..3f1970e830b 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,66 @@
Kulak Tıkacı Tak
Füldugó berakva
+
+ Electronic Hearing Protection taken off
+ Elektronischer Gehörschutz abgesetzt
+ 電子聴覚保護具を外しました
+ Электронная защита слуха снята
+ Protection auditive électronique retirée.
+ Protezione uditiva elettronica rimossa
+ 전자 청력 보호구 벗음
+ 降噪耳机已摘下
+
+
+ Electronic Hearing Protection put on
+ Elektronischer Gehörschutz aufgesetzt
+ 電子聴覚保護具を装着しました
+ Электронная защита слуха надета
+ Protection auditive électronique mise en place
+ Protezione uditiva elettronica inserita
+ 전자 청력 보호구 씀
+ 降噪耳机已佩戴
+
+
+ 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.
+ Protezione uditiva elettronica protegge l'utente da danni all'udito senza ridurre la sua situational awareness.
+ 전자 청력 보호구는 상황 인식을 저하시키지 않으면서 착용자의 청력 손상을 예방합니다.
+ 降噪耳机可保护佩戴者免受听力损害,同时又不会降低态势感知能力。
+
+
+ Electronic Hearing Protection
+ Elektronischer Gehörschutz
+ 電子聴覚保護具
+ Электронная защита слуха
+ Protection électronique de l'ouïe
+ Protezione uditiva elettronica
+ 전자 청력 보호구
+ 降噪耳机
+
+
+ Take off Electronic Hearing Protection
+ Elektronischen Gehörschutz absetzen
+ 電子聴覚保護具を外す
+ Снять электронную защиту слуха
+ Retirer les protections auditives électroniques
+ Levati la protezione uditiva elettronica
+ 전자 청력 보호구 벗기
+ 摘下降噪耳机
+
+
+ Put on Electronic Hearing Protection
+ Elektronischen Gehörschutz aufsetzen
+ 電子聴覚保護具を装着
+ Надеть электронную защиту слуха
+ Mettre les protections auditives électroniques
+ Indossa la protezione uditiva elettronica
+ 전자 청력 보호구 쓰기
+ 戴上降噪耳机
+
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 +202,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 +273,16 @@
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
+ Inserisci/Rimuovi la protezione uditiva elettronica
+ 전자 청력 보호구 토글
+ 戴上/摘下降噪耳机
+
Put/take out earplugs
Mettre/enlever les bouchons
@@ -223,6 +293,7 @@
Ohrstöpsel einsetzen/herausnehmen
귀마개 토글
耳栓の着脱
+ 戴上/摘下耳塞
Add the `ACE_EarPlugs` item to all units that have loud weapons. Can disable if using custom loadouts.
@@ -317,14 +388,22 @@
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.
+ Modifica quanto danno all'udito causano le esplosioni.\nSe impostato su 0 le esplosioni non causeranno danni all'udito.
+ 爆炸会导致多大程度的听力损伤.\n设置为0时爆炸将不会导致听力损伤
Explosion Deafness Coefficient
Коэффициент оглушения при взрыве
+ Koeffizient für Taubheit bei Explosionen
폭발 난청 계수
爆発による難聴発生係数
+ Coefficient de surdité à l'explosion
+ Coefficiente di danno da esplosioni
+ 爆炸听力损伤系数
Only units with heavy weapons
@@ -336,6 +415,7 @@
Nur Einheiten mit schweren Waffen
중화기를 가진 유닛만 해당
重火器を装備したユニットのみ
+ 装备重型武器的单位
Volume muffling
@@ -357,7 +437,7 @@
Ochrana sluchu
Protection auditive
Protección auditiva
- Protezione auditiva
+ Protezione uditiva
Ochrona słuchu
Proteção Auditiva
Защита слуха
@@ -367,6 +447,16 @@
聽力保護
听力保护
+
+ ELECTRONIC
+ ELEKTRONISCH
+ 電子聴覚保護
+ ЭЛЕКТРОННЫЙ
+ ELECTRONIQUE
+ ELETTRONICA
+ 전자 청력 보호
+ 降噪耳机
+
Volume when unconscious.
Hlasitost během ztráty vědomí.
diff --git a/addons/hitreactions/stringtable.xml b/addons/hitreactions/stringtable.xml
index 1b76933ca7f..29a7c856277 100644
--- a/addons/hitreactions/stringtable.xml
+++ b/addons/hitreactions/stringtable.xml
@@ -3,9 +3,12 @@
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.
+ Un'unità in movimento appiedato cadrà se riceve danni maggiori di questo settaggio.\nSe impostato su -1, la meccanica sarà disabilitata.
Если при передвижении пешком юнит получит больше урона, чем указано в этой настройке,то он упадет.\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 +33,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 +44,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/hot/CfgAmmo.hpp b/addons/hot/CfgAmmo.hpp
index 6f91d241fb9..764cebc7c53 100644
--- a/addons/hot/CfgAmmo.hpp
+++ b/addons/hot/CfgAmmo.hpp
@@ -86,7 +86,7 @@ class CfgAmmo {
EGVAR(frag,metal) = 7100; // 1000 steel balls
EGVAR(frag,charge) = 4100;
EGVAR(frag,gurney_c) = 2700;
- EGVAR(frag,gurney_k) = "3/5";
+ EGVAR(frag,gurney_k) = 3/5;
EGVAR(frag,classes)[] = {"ACE_frag_small"};
displayName = CSTRING(hot2mp);
diff --git a/addons/hunterkiller/stringtable.xml b/addons/hunterkiller/stringtable.xml
index 226859bc634..791e8356850 100644
--- a/addons/hunterkiller/stringtable.xml
+++ b/addons/hunterkiller/stringtable.xml
@@ -12,6 +12,7 @@
Hunter Killer
헌터 킬러
ハンターキラー
+ 猎歼系统
Observe
@@ -24,6 +25,7 @@
Observiere
관측
オブザーブ
+ 观察
Slew your turret onto other turret's viewpoint
@@ -36,6 +38,7 @@
Richtet deinen Turm auf die Blickrichtung eines anderen Turms
포탑을 다른 포탑의 시야에 놓습니다.
自分のタレットを相手のタレットの視点に旋回させる。
+ 将你的炮塔转向至另一个炮塔正在观察的位置
Override
@@ -48,6 +51,7 @@
Überschreibe
오버라이드
オーバーライド
+ 超越控制
Force other turret to slew onto your viewpoint
@@ -60,6 +64,7 @@
Zwingt andere Türme, sich auf deine Blickrichtung zu drehen
다른 포탑이 시야에 오도록 강제합니다.
他のタレットを強制的に自分の視点に旋回させる
+ 强制另一个炮塔转向你正在观察的位置
diff --git a/addons/huntir/stringtable.xml b/addons/huntir/stringtable.xml
index 4f1259f7d7d..1f1b1a06b28 100644
--- a/addons/huntir/stringtable.xml
+++ b/addons/huntir/stringtable.xml
@@ -1,23 +1,6 @@
-
- Altitude:
- Výška:
- Altitude :
- Altitud:
- Altitudine:
- Wysokość:
- Altitude:
- Высота:
- Höhe:
- 고도:
- 高度:
- 高度:
- 高度:
- Yükseklik:
- Magasság:
-
Camera:
Kamera:
@@ -273,5 +256,22 @@
HuntIR Ekranı
HuntIR Monitor
+
+ Altitude:
+ 高度:
+ 高度:
+ Výška:
+ Altitude :
+ Höhe:
+ Magasság:
+ Altitudine:
+ 高度:
+ 고도:
+ Wysokość:
+ Altitude:
+ Высота:
+ Altitud:
+ Yükseklik:
+
diff --git a/addons/intelitems/CfgVehicles.hpp b/addons/intelitems/CfgVehicles.hpp
index 81a09174065..3db414766e4 100644
--- a/addons/intelitems/CfgVehicles.hpp
+++ b/addons/intelitems/CfgVehicles.hpp
@@ -19,7 +19,7 @@ class CfgVehicles {
icon = "iconObject_2x3";
mapSize = 0.3;
simulation = "House"; // Needed because the objects don't have good collision physx
- destrType = "DesturctNo";
+ destrType = "DestructNo";
curatorInfoTypeEmpty = QGVAR(RscSetData);
editorSubcategory = QUOTE(XADDON);
GVAR(magazine) = "";
diff --git a/addons/intelitems/stringtable.xml b/addons/intelitems/stringtable.xml
index 101680a5cf2..88468215193 100644
--- a/addons/intelitems/stringtable.xml
+++ b/addons/intelitems/stringtable.xml
@@ -40,7 +40,7 @@
Documento Impresso - Pode ser acessado a partir da tela de mapa
Распечатанный документ - Можно получить доступ с экрана карты
Bedrucktes Dokument - Über die Karte abrufbar
- 문서들 - 지도에서 확인 가능합니다
+ 인쇄된 문서 - 지도에서 확인 가능합니다
印刷された資料 - マップ画面から確認可能
影印文件 - 可以透過地圖界面來存取
影印文件—可以透过地图界面访问
diff --git a/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf b/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf
index 9a3eb315983..463c4d4855b 100644
--- a/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf
+++ b/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf
@@ -28,7 +28,8 @@ private _player = ACE_player;
if ((_origActionData select 10) isNotEqualTo {}) then {
// It should, so make a copy and pass it to the modifierFunction
_origActionData = +_origActionData;
- [_target, ACE_player, _origActionData select 6, _origActionData] call (_origActionData select 10);
+ private _actionParams = _origActionData select 6; // Define _actionParams so its accessible within the statement/condition
+ [_target, ACE_player, _actionParams, _origActionData] call (_origActionData select 10);
};
_origActionData params [
diff --git a/addons/interact_menu/functions/fnc_keyUp.sqf b/addons/interact_menu/functions/fnc_keyUp.sqf
index a12a404da73..00f4f4903e8 100644
--- a/addons/interact_menu/functions/fnc_keyUp.sqf
+++ b/addons/interact_menu/functions/fnc_keyUp.sqf
@@ -42,9 +42,10 @@ if (GVAR(actionSelected)) then {
private _savedThis = this;
this = GVAR(selectedTarget);
- if ([_target, _player, _actionData select 6] call (_actionData select 4)) then {
+ private _actionParams = _actionData select 6; // Define _actionParams so its accessible within the statement/condition
+ if ([_target, _player, _actionParams] call (_actionData select 4)) then {
// Call the statement
- [_target, _player, _actionData select 6] call (_actionData select 3);
+ [_target, _player, _actionParams] call (_actionData select 3);
// Clear the conditions caches again if the action was performed
[QGVAR(clearConditionCaches), []] call CBA_fnc_localEvent;
diff --git a/addons/interact_menu/functions/fnc_render.sqf b/addons/interact_menu/functions/fnc_render.sqf
index 2089f6b1060..fca3522f33d 100644
--- a/addons/interact_menu/functions/fnc_render.sqf
+++ b/addons/interact_menu/functions/fnc_render.sqf
@@ -103,9 +103,10 @@ if (GVAR(openedMenuType) >= 0) then {
// Check the action conditions
private _actionData = GVAR(selectedAction) select 0;
- if ([_target, _player, _actionData select 6] call (_actionData select 4)) then {
+ private _actionParams = _actionData select 6; // Define _actionParams so its accessible within the statement/condition
+ if ([_target, _player, _actionParams] call (_actionData select 4)) then {
// Call the statement
- [_target, _player, _actionData select 6] call (_actionData select 3);
+ [_target, _player, _actionParams] call (_actionData select 3);
// Clear the conditions caches again if the action was performed
[QGVAR(clearConditionCaches), []] call CBA_fnc_localEvent;
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/CfgVehicles.hpp b/addons/interaction/CfgVehicles.hpp
index cc4742d0dab..075667dc2c1 100644
--- a/addons/interaction/CfgVehicles.hpp
+++ b/addons/interaction/CfgVehicles.hpp
@@ -251,6 +251,15 @@ class CfgVehicles {
statement = QUOTE([ARR_3(_player,_target,1)] call DFUNC(tapShoulder));
exceptions[] = {"isNotSwimming"};
};
+ class ACE_OpenBackpack {
+ displayName = "$STR_ACTION_OPEN_BAG";
+ position = QUOTE(call DFUNC(getBackpackPos));
+ distance = 3.0;
+ condition = QUOTE(call DFUNC(canOpenBackpack));
+ statement = QUOTE(_player action [ARR_2('OpenBag',_target)]);
+ modifierFunction = QUOTE(call FUNC(modifyOpenBackpackAction));
+ exceptions[] = {"isNotSwimming"};
+ };
};
class ACE_SelfActions {
diff --git a/addons/interaction/XEH_PREP.hpp b/addons/interaction/XEH_PREP.hpp
index dc6e5f41a23..cbea84cc3cb 100644
--- a/addons/interaction/XEH_PREP.hpp
+++ b/addons/interaction/XEH_PREP.hpp
@@ -2,6 +2,7 @@
// interaction menu
PREP(addPassengerActions);
PREP(addPassengersActions);
+PREP(getBackpackPos);
PREP(getInteractionDistance);
PREP(getVehiclePos);
PREP(getVehiclePosComplex);
@@ -18,6 +19,8 @@ PREP(canInteractWithCivilian);
PREP(canInteractWithVehicleCrew);
PREP(getDown);
PREP(sendAway);
+PREP(canOpenBackpack);
+PREP(modifyOpenBackpackAction);
PREP(canJoinGroup);
PREP(modifyJoinGroupAction);
PREP(modifyTeamManagementAction);
diff --git a/addons/interaction/functions/fnc_canOpenBackpack.sqf b/addons/interaction/functions/fnc_canOpenBackpack.sqf
new file mode 100644
index 00000000000..46053ab4760
--- /dev/null
+++ b/addons/interaction/functions/fnc_canOpenBackpack.sqf
@@ -0,0 +1,26 @@
+#include "..\script_component.hpp"
+/*
+ * Author: DartRuffian
+ * Checks if the player can open a unit's backpack.
+ *
+ * Arguments:
+ * 0: Target
+ * 1: Player
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * [cursorObject, player] call ace_interaction_fnc_canOpenBackpack
+ *
+ * Public: No
+ */
+
+params ["_target", "_player"];
+
+private _backpackContainer = backpackContainer _target;
+
+!isNull _backpackContainer &&
+{!lockedInventory _backpackContainer} &&
+{maxLoad _backpackContainer > 0} &&
+{getNumber (configOf _backpackContainer >> "disableInventory") != 1}
diff --git a/addons/interaction/functions/fnc_getBackpackPos.sqf b/addons/interaction/functions/fnc_getBackpackPos.sqf
new file mode 100644
index 00000000000..110f9cfc941
--- /dev/null
+++ b/addons/interaction/functions/fnc_getBackpackPos.sqf
@@ -0,0 +1,21 @@
+#include "..\script_component.hpp"
+/*
+ * Author: DartRuffian
+ * Return a suitable position for the action point for the target's backpack.
+ *
+ * Arguments:
+ * None (uses local variable _target)
+ *
+ * Return Value:
+ * Position of _target's backpack in model space
+ *
+ * Example:
+ * call ace_interaction_fnc_getBackpackPos
+ *
+ * Public: No
+ */
+
+//IGNORE_PRIVATE_WARNING ["_target"];
+
+private _position = _target selectionPosition "spine3";
+(((_target selectionPosition "rightshoulder" vectorDiff _position) vectorCrossProduct (_target selectionPosition "leftshoulder" vectorDiff _position)) vectorMultiply 4) vectorAdd _position;
diff --git a/addons/interaction/functions/fnc_modifyOpenBackpackAction.sqf b/addons/interaction/functions/fnc_modifyOpenBackpackAction.sqf
new file mode 100644
index 00000000000..feb3e31deb6
--- /dev/null
+++ b/addons/interaction/functions/fnc_modifyOpenBackpackAction.sqf
@@ -0,0 +1,27 @@
+#include "..\script_component.hpp"
+/*
+ * Author: DartRuffian
+ * Modifies the ACE_OpenBackpack action to show backpack name.
+ *
+ * Arguments:
+ * 0: Target
+ * 1: Player
+ * 2: Args
+ * 3: Action Data
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * [cursorObject, player, [], []] call ace_interaction_fnc_modifyOpenBackpackAction
+ *
+ * Public: No
+ */
+
+params ["_target", "_player", "", "_actionData"];
+
+private _backpack = backpackContainer _target;
+private _actionText = format [localize "STR_ACTION_OPEN_BAG", getText (configOf _backpack >> "displayName")];
+TRACE_3("",_target,_backpack,_actionText);
+
+_actionData set [1, _actionText];
diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml
index f516838ac7a..859c8c34aa2 100644
--- a/addons/interaction/stringtable.xml
+++ b/addons/interaction/stringtable.xml
@@ -448,6 +448,7 @@
Weiss beitreten
백팀 참여
ホワイトに参加
+ 加入白组
Join Red
@@ -853,16 +854,31 @@
Pass grenade
Granate geben
手榴弾を渡す
+ 수류탄 건네주기
+ Donner une grenade
+ Passa granata
+ Передать гранаты
+ 给予投掷物
%1 passed you %2.
%1 hat dir %2 gegeben.
%1 は あなたに %2 を渡した。
+ %1 님이 %2을(를) 건네주었습니다.
+ %1 vous a donné %2
+ %1 ti ha passato una granata %2.
+ %1 передал вам %2.
+ %1给你了%2
Show "pass grenade" interaction
Zeige "Granate geben" Interaktion
"手榴弾を渡す"をインタラクションに表示
+ "수류탄 건네주기" 상호작용 표시
+ Afficher l'interaction « Donner une grenade »
+ Mostra l'interazione "passa granata"
+ Показывать действие "передать гранату"
+ 显示"给予投掷物"选项
Passengers
@@ -993,8 +1009,10 @@
Interacción con animaciones
Interazione con animazioni
Взаимодействие с анимациями
+ Interaktion mit Animationen
애니메이션 있는 상호작용
車両アニメーションベースのインタラクション
+ 互动动作动画
Smash windshield
@@ -1331,8 +1349,10 @@
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.
적 진영이 탑승한 차량과의 일부 상호작용을 제한합니다.
敵性力の乗員が乗っている車両へのインタラクションを一部制限します。
+ 对敌军载具或固定武器乘员使用互动
Interact With Enemy Crew
@@ -1340,8 +1360,10 @@
Interactuar Con Tripulación Enemiga
Interazioni con equipaggio nemico
Взаимодействие с вражеским экипажем
+ Interaktion mit feindlicher Besatzung
적 승무원과의 상호작용
敵乗員がいる状態でのインタラクト
+ 敌军乘员互动
Allow for Static Weapons
@@ -1349,8 +1371,10 @@
Permitir para Armas Estáticas
Permetti con armi statiche
Разрешить использование статического оружия
+ Erlaube für statische Waffen
고정화기 허용
固定火器での許可
+ 允许固定式武器
Warning: can cause some objects to collide with others.
@@ -1371,8 +1395,10 @@
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
플레이어 분대의 모든 유닛을 삭제하고 팀 색상 변경하는 것을 허용합니다.
プレイヤー分隊内の任意のユニットにチームからの脱退と色の変更を許可します
+ 允许小队长更改队内玩家的火力组颜色
Remote Squad Management
@@ -1380,8 +1406,10 @@
Gestión Remota de Escuadra
Gestione squadra da remoto
Дистанционное управление отрядом
+ Fernverwaltung von Gruppen
분대 원격 관리
遠隔分隊管理
+ 远程火力组颜色管理
Attach
@@ -1405,7 +1433,7 @@
Desfixar
Снять
Löse
- 떼내기
+ 떼어내기
を外す
拆卸
diff --git a/addons/inventory/stringtable.xml b/addons/inventory/stringtable.xml
index ee175e54c3c..20af31a6968 100644
--- a/addons/inventory/stringtable.xml
+++ b/addons/inventory/stringtable.xml
@@ -59,7 +59,7 @@
Capacetes
Головные уборы
Kopfbedeckungen
- 헬멧
+ 머리 장비
ヘッドギア
頭盔
头盔
@@ -75,7 +75,7 @@
Médico
Медицина
Sanitätsmaterial
- 의료
+ 의료품
医療品
醫療
医疗
diff --git a/addons/irlight/stringtable.xml b/addons/irlight/stringtable.xml
index 3a895b003c9..f2362c13dd0 100644
--- a/addons/irlight/stringtable.xml
+++ b/addons/irlight/stringtable.xml
@@ -12,6 +12,7 @@
Doppelstrahllaservisier
이중 빔 조준 레이저
複合ビーム照準レーザー
+ 双光束瞄准激光
<t color='#9cf953'>Use: </t>Turn Laser ON/OFF<br>Double click to switch mode
@@ -24,6 +25,7 @@
<t color='#9cf953'>Benutzen: </t>Laser EIN/AUS<br>Doppelklick um Modus zu wechseln
<t color='#9cf953'>사용: </t>레이저 켜기/끄기<br>터블 클릭으로 모드 전환
<t color='#9cf953'>使用方法: </t>レーザーのオン/オフ切り替え<br>ダブルクリックでモード切り替え
+ <t color='#9cf953'>使用按键 </t>打开/关闭镭射<br>双击切换模式
DBAL-A3 (green)
@@ -36,6 +38,7 @@
DBAL-A3 (Grün)
DBAL-A3 (녹색)
DBAL-A3 (緑)
+ DBAL-A3 (绿色)
DBAL-A3 (red)
@@ -48,6 +51,7 @@
DBAL-A3 (rot)
DBAL-A3 (빨강)
DBAL-A3 (赤)
+ DBAL-A3 (红色)
IR Laser and Illuminator
@@ -60,6 +64,7 @@
IR-Laser und -Licht
적외선 레이저와 조명
IRレーザーとイルミネーター
+ 红外激光和照明
IR Illuminator
@@ -72,6 +77,7 @@
IR-Taschenlampe
적외선 조명
IRイルミネーター
+ 红外照明
IR Laser
@@ -84,6 +90,7 @@
IR-Laser
적외선 레이저
IRレーザー
+ 红外激光
Medium Beam
@@ -96,6 +103,7 @@
Mittlerer Lichtstrahl
중간 빔
標準ビーム
+ 中等光束
Narrow Beam
@@ -108,6 +116,7 @@
Schmaler Lichtstrahl
좁은 빔
狭角ビーム
+ 窄光束
Visible Laser
@@ -120,6 +129,7 @@
Sichtbarer Laser
가시 레이저
可視光レーザー
+ 可见激光
Wide Beam
@@ -132,6 +142,7 @@
Breiter Lichtstrahl
넓은 빔
広角ビーム
+ 宽光束
Illuminator / Laser Momentary Switch
@@ -144,6 +155,7 @@
Licht / Laser Tastschalter
조명/레이저 빠르게 스위치
イルミネーター/レーザーモーメンタリースイッチ
+ 照明/激光按住开关
Special Purpose IR LED Illuminator
@@ -156,6 +168,7 @@
Infrarot LED Taschenlampe
특수목적 적외선 LED 조명
特殊用途のIR LEDイルミネーター
+ 特殊用途红外LED照明器
<t color='#9cf953'>Use: </t>Turn Light ON/OFF<br>Double click to switch mode
@@ -168,6 +181,7 @@
<t color='#9cf953'>Benutzen: </t>Licht EIN/AUS<br>Doppelklick um Modus zu wechseln
<t color='#9cf953'>사용: </t>조명 켜기/끄기<br>더블 클릭으로 모드 전환
<t color='#9cf953'>使用方法: </t>ライトのオン/オフ<br>ダブルクリックでモード切り替え
+ <t color='#9cf953'>使用按键 </t>打开/关闭灯光<br>双击切换模式
diff --git a/addons/killtracker/stringtable.xml b/addons/killtracker/stringtable.xml
index 08d645c6de5..73702a5bc4e 100644
--- a/addons/killtracker/stringtable.xml
+++ b/addons/killtracker/stringtable.xml
@@ -11,6 +11,7 @@
ACE Abschüsse
ACE 킬트래커
ACE キル追跡
+ ACE 击杀追踪器
Friendly Fire
@@ -78,7 +79,7 @@
Abates totais:
Всего убийств:
Gesammte Abschüsse:
- 총 사살수:
+ 총 사살 수:
合計キル数:
总击杀数:
Toplam Öldürme:
@@ -93,6 +94,7 @@
Legt fest, ob getötete KIs während des Endbildschirms der Mission in den Abschüssen angezeigt werden.
사후강평 중 살해된 AI가 킬트래킹에 표시되는지 여부를 정의합니다.
キルしたAIをミッション終了デブリーフィング画面に表示させるかどうかを定義します。
+ 任务结束时被击杀的AI是否会显示
Track AI units killed by player
@@ -104,6 +106,7 @@
Zähle vom Spieler getöteten KI-Einheiten
플레이어가 죽인 AI 트래킹
プレイヤーがキルしたAIユニットを追跡
+ 记录被玩家击杀的AI
Vehicle: %1
@@ -128,6 +131,7 @@
Zeige Abschüsse des Fahrzeugs dem Fahrer, Richtschützen und Kommandanten an
차량 처치를 운전수, 사수, 지휘관에게 보여줍니다
車両でのキルを操縦手、砲手、車長で共有して表示する
+ 将载具取得的击杀计入驾驶员, 炮手和车长
Show vehicle kills to other crew members
@@ -138,6 +142,7 @@
Zeige der Fahrzeugbesatzung die Abschüsse des Fahrzeugs
다른 승무원에게 차량 처치 표시
車両でのキルを乗員全員に表示する
+ 将载具取得的击杀计入乘员
diff --git a/addons/laser/XEH_PREP.hpp b/addons/laser/XEH_PREP.hpp
index 2d26ff81f25..27e043c63f3 100644
--- a/addons/laser/XEH_PREP.hpp
+++ b/addons/laser/XEH_PREP.hpp
@@ -17,5 +17,4 @@ PREP(seekerFindLaserSpot);
PREP(setLaserCode);
PREP(shootCone);
PREP(shootRay);
-PREP(showVehicleHud);
PREP(toggleLST);
diff --git a/addons/laser/XEH_postInit.sqf b/addons/laser/XEH_postInit.sqf
index 3e9274f5fb7..0ad9e0182b1 100644
--- a/addons/laser/XEH_postInit.sqf
+++ b/addons/laser/XEH_postInit.sqf
@@ -4,29 +4,12 @@
if (hasInterface) then {
#include "initKeybinds.inc.sqf"
- GVAR(pfID) = -1;
-
["CBA_settingsInitialized", {
// Handle Map Drawing
GVAR(mapLaserSource) = objNull;
["ACE_controlledUAV", LINKFUNC(addMapHandler)] call CBA_fnc_addEventHandler;
["turret", LINKFUNC(addMapHandler), false] call CBA_fnc_addPlayerEventHandler;
["unit", LINKFUNC(addMapHandler), true] call CBA_fnc_addPlayerEventHandler;
-
- // Laser code display
- ["turret", LINKFUNC(showVehicleHud), false] call CBA_fnc_addPlayerEventHandler;
- ["vehicle", LINKFUNC(showVehicleHud), true] call CBA_fnc_addPlayerEventHandler; // only one of these needs the retro flag
-
- // Add UAV Control Compatibility
- ["ACE_controlledUAV", {
- params ["_UAV", "_seatAI", "_turret", "_position"];
- TRACE_4("ACE_controlledUAV EH",_UAV,_seatAI,_turret,_position);
- if (isNull _seatAI) then {
- [ace_player] call FUNC(showVehicleHud);
- } else {
- [_seatAI] call FUNC(showVehicleHud);
- };
- }] call CBA_fnc_addEventHandler;
}] call CBA_fnc_addEventHandler;
};
diff --git a/addons/laser/functions/fnc_showVehicleHud.sqf b/addons/laser/functions/fnc_showVehicleHud.sqf
deleted file mode 100644
index 2b2aba4b2f7..00000000000
--- a/addons/laser/functions/fnc_showVehicleHud.sqf
+++ /dev/null
@@ -1,114 +0,0 @@
-#include "..\script_component.hpp"
-/*
- * Author: PabstMirror
- * Shows the laser hud when vehicle is equiped with the weapon.
- * Shows laser code, fire mode and seeker status.
- *
- * Arguments:
- * 0: Player
- *
- * Return Value:
- * Nothing
- *
- * Example:
- * [player] call ace_laser_fnc_showVehicleHud
- *
- * Public: No
- */
-
-params ["_player"];
-TRACE_1("showHud",_player);
-
-private _enabled = false;
-private _vehicle = vehicle _player;
-private _turretPath = [-1];
-
-if ((alive _player) && {_player != _vehicle}) then {
- if (_player != (driver _vehicle)) then {
- _turretPath = _player call CBA_fnc_turretPath
- };
- {
- if ((getNumber (configFile >> "CfgWeapons" >> _x >> QGVAR(showHud))) == 1) then {
- TRACE_1("showHud",_x);
- _enabled = true;
- };
- } forEach (_vehicle weaponsTurret _turretPath);
-};
-
-if ((!_enabled) && (GVAR(pfID) < 0)) exitWith {TRACE_2("Disabled - No Change",_enabled,GVAR(pfID));};
-
-TRACE_2("Cleaning up old pfeh and display",_enabled,GVAR(pfID));
-[GVAR(pfID)] call CBA_fnc_removePerFrameHandler;
-if (!isNull (uiNamespace getVariable [QGVAR(display), displayNull])) then {
- ([QGVAR(modeDisplay)] call BIS_fnc_rscLayer) cutText ["", "PLAIN"];
-};
-GVAR(pfID) = -1;
-
-if (!_enabled) exitWith {TRACE_2("Disabled - Now Off",_enabled,GVAR(pfID));};
-
-TRACE_2("Enabled - Adding PFEH",_enabled,GVAR(pfID));
-
-private _adjustDown = false; // Flares display will block ours, if present just move ours down a bit
-{
- if ((getText (configFile >> "CfgWeapons" >> _x >> "simulation")) == "cmlauncher") exitWith {_adjustDown = true};
-} forEach (_vehicle weaponsTurret _turretPath);
-
-private _turretConfig = [_vehicle, _turretPath] call CBA_fnc_getTurret;
-private _seekerSource = getText (_turretConfig >> "memoryPointGunnerOptics");
-TRACE_3("",_adjustDown,_seekerSource,_vehicle selectionPosition _seekerSource);
-
-GVAR(pfID) = [{
- params ["_args", "_pfID"];
- _args params ["_vehicle", "_turretPath", "_seekerSource", "_adjustDown"];
-
- // Restart display if null (not just at start, this will happen periodicly)
- if (isNull (uiNamespace getVariable [QGVAR(display), displayNull])) then {
- TRACE_1("creating display",_this);
- ([QGVAR(modeDisplay)] call BIS_fnc_rscLayer) cutRsc [QGVAR(modeDisplay), "PLAIN", 1, false];
- if (_adjustDown) then {
- private _ctrl = (uiNamespace getVariable [QGVAR(display), displayNull]) displayCtrl IDC_MODECONTROLGROUP;
- private _pos = ctrlPosition _ctrl;
- _pos set [1, (_pos select 1) + ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)];
- _ctrl ctrlSetPosition _pos;
- _ctrl ctrlCommit 0;
- };
- };
-
- private _currentWeapon = _vehicle currentWeaponTurret _turretPath;
- private _showLockMode = (getNumber (configFile >> "CfgWeapons" >> _currentWeapon >> QGVAR(showHud))) == 1;
-
- private _ctrlGroup = (uiNamespace getVariable [QGVAR(display), displayNull]) displayCtrl 1000;
-
- if (!_showLockMode) exitWith {
- _ctrlGroup ctrlShow false;
- };
- _ctrlGroup ctrlShow true;
-
- private _ctrlText = (uiNamespace getVariable [QGVAR(display), displayNull]) displayCtrl IDC_ATTACKMODE;
- private _ctrlCode = (uiNamespace getVariable [QGVAR(display), displayNull]) displayCtrl IDC_LASERCODE;
- private _ctrlIcon = (uiNamespace getVariable [QGVAR(display), displayNull]) displayCtrl IDC_LASERICON;
-
- // Do Laser Scan:
- private _ammo = getText (configFile >> "CfgMagazines" >> _vehicle currentMagazineTurret _turretPath >> "ammo");
- private _laserSource = _vehicle modelToWorldWorld (_vehicle selectionPosition _seekerSource);
- private _laserCode = _vehicle getVariable [QGVAR(code), ACE_DEFAULT_LASER_CODE];
- private _seekerAngle = getNumber (configFile >> "CfgAmmo" >> _ammo >> "ace_missileguidance" >> "seekerAngle");
- private _seekerMaxRange = getNumber (configFile >> "CfgAmmo" >> _ammo >> "ace_missileguidance" >> "seekerMaxRange");
- private _laserResult = [_laserSource, vectorDir _vehicle, _seekerAngle, _seekerMaxRange, [ACE_DEFAULT_LASER_WAVELENGTH,ACE_DEFAULT_LASER_WAVELENGTH], _laserCode, _vehicle] call EFUNC(laser,seekerFindLaserSpot);
- private _foundTargetPos = _laserResult select 0;
- private _haveLock = !isNil "_foundTargetPos";
-
- private _defaultAttackProfile = getText (configFile >> "CfgAmmo" >> _ammo >> "ace_missileguidance" >> "defaultAttackProfile");
- private _vehicleLockMode = _vehicle getVariable [QEGVAR(missileguidance,attackProfile), _defaultAttackProfile];
-
- private _modeShort = if (_haveLock) then {
- getText (configFile >> QEGVAR(missileguidance,AttackProfiles) >> _vehicleLockMode >> "nameLocked");
- } else {
- getText (configFile >> QEGVAR(missileguidance,AttackProfiles) >> _vehicleLockMode >> "name");
- };
-
- _ctrlIcon ctrlSetTextColor ([[0,0,0,0.25],[1,0,0,0.75]] select _haveLock);
- _ctrlText ctrlSetText _modeShort;
- _ctrlCode ctrlSetText format ["CODE: %1", _laserCode];
-
-}, 0.1, [_vehicle, _turretPath, _seekerSource, _adjustDown]] call CBA_fnc_addPerFrameHandler;
diff --git a/addons/laser/stringtable.xml b/addons/laser/stringtable.xml
index 70104610254..2a558ac6be6 100644
--- a/addons/laser/stringtable.xml
+++ b/addons/laser/stringtable.xml
@@ -12,6 +12,7 @@
Laserziel Verfolgung: Aus
레이저 스팟 추적기: 끔
レーザースポットトラッカー: オフ
+ 激光点跟踪器: 关
Laser Spot Tracker: On
@@ -24,6 +25,7 @@
Laserziel Verfolgung: An
레이저 스팟 추적기: 켬
レーザースポットトラッカー: オン
+ 激光点跟踪器: 开
Laser Dispersion Simulation Count
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/logistics_rope/stringtable.xml b/addons/logistics_rope/stringtable.xml
index 15e5ec90565..283fa015c95 100644
--- a/addons/logistics_rope/stringtable.xml
+++ b/addons/logistics_rope/stringtable.xml
@@ -120,7 +120,7 @@
Uma trança torcida de fibras. Normalmente usada para rapel ou reboque.
Витой канат. Обычно используется для спуска или буксирования.
Ein verdrehtes Geflecht aus Fasern. Wird normalerweise zum Abseilen oder Abschleppen verwendet.
- 꼬아진 섬유입니다. 주로 레펠이나 견인에 사용됩니다.
+ 꼬아진 섬유 끈입니다. 주로 레펠이나 견인에 사용됩니다.
組み紐されたロープ。ラペリングやけん引に使用されます。
编织绳。通常用于索降和牵引拖曳。
diff --git a/addons/magazinerepack/stringtable.xml b/addons/magazinerepack/stringtable.xml
index 25e3b09b350..e9ca71c1c25 100644
--- a/addons/magazinerepack/stringtable.xml
+++ b/addons/magazinerepack/stringtable.xml
@@ -95,7 +95,7 @@
%1 carregador(es) cheio(s) e %2 disparo(s) a mais
%1 полных магазина(ов) и %2 патрона(ов)
%1 volle(s) Magazin(e) und %2 übrig gebliebene Patrone(n)
- %1개의 꽉찬 탄창과 %2발의 총알이 남았다
+ %1개의 꽉 찬 탄창과 %2발의 총알이 남았다
満装填した弾倉 %1 個と<br/>残 %2 発装填の弾倉
%1個滿的彈匣與%2發額外子彈
%1个满的弹匣与%2发额外子弹
diff --git a/addons/maptools/functions/fnc_openMapGpsUpdate.sqf b/addons/maptools/functions/fnc_openMapGpsUpdate.sqf
index 6d184366255..b048e591387 100644
--- a/addons/maptools/functions/fnc_openMapGpsUpdate.sqf
+++ b/addons/maptools/functions/fnc_openMapGpsUpdate.sqf
@@ -30,7 +30,7 @@ if (CBA_missionTime < GVAR(mapGpsNextUpdate)) exitWith {};
GVAR(mapGpsNextUpdate) = CBA_missionTime + 0.5;
private _ctrl = _mapDisplay displayCtrl 913590;
-_ctrl ctrlSetText str (round (getDir ACE_player)); // Set Heading
+_ctrl ctrlSetText str (round ([ACE_player] call EFUNC(common,getMagneticBearing))); // Set Heading
_ctrl = _mapDisplay displayCtrl 913591;
_ctrl ctrlSetText str (round ((getPosASL ACE_player) select 2) + EGVAR(common,mapAltitude)); // Set Altitude
diff --git a/addons/maptools/stringtable.xml b/addons/maptools/stringtable.xml
index 497ab2ca32d..bd45120ee80 100644
--- a/addons/maptools/stringtable.xml
+++ b/addons/maptools/stringtable.xml
@@ -14,6 +14,7 @@
맞춤 기준:
向きを合わせる
Állítása
+ 对齐到
The Map Tools allow you to measure distances and angles on the map.
@@ -41,6 +42,7 @@
Verstecke Wurfparabel Kartenwerkzeug
플로팅 보드 숨기기
標定盤を 隠す
+ 隐藏绘图板
Hide GPS on Map
@@ -221,6 +223,7 @@
Wurfparabel Kartenwerkzeug Acryl
플로팅 보드 (아크릴)
標定盤の アクリル板
+ 亚克力绘图板
Plotting Board
@@ -231,6 +234,7 @@
Wurfparabel Kartenwerkzeug
플로팅 보드
標定盤
+ 绘图板
Plotting Board Ruler
@@ -241,6 +245,7 @@
Wurfparabel Kartenwerkzeug Lineal
플로팅 보드 (자)
標定盤の 定規
+ 绘图板尺
The Plotting Board is a map tool designed for use in the directing of short range indirect fires.
@@ -251,6 +256,7 @@
Das Wurfparabel-Kartenwerkzeug ist ein Werkzeug, das für die Steuerung indirekten Feuers auf kurze Distanz entwickelt wurde.
플로팅 보드는 단거리 간접 사격을 지시하는 데 사용하도록 설계된 독도용 도구입니다.
標定盤(プロッティング・ボード)は、短距離の間接射撃の指示に使用するために設計されたマップツールです。
+ 绘图板是一种用于指引短程间瞄火力的地图工具
Plotting Board
@@ -261,6 +267,7 @@
Wurfparabel Kartenwerkzeug
플로팅 보드
標定盤
+ 绘图板
Show Plotting Board
@@ -271,6 +278,7 @@
Zeige Wurfparabel Kartenwerkzeug
플로팅 보드 보이기
標定盤を 表示
+ 显示绘图板
To Compass
@@ -285,6 +293,7 @@
나침반으로
方位磁石に
Iránytűhöz
+ 指南针
To Maptool
@@ -295,6 +304,7 @@
Zum Kartenwerkzeug
독도용 도구로
マップツールに
+ 地图工具
To North
@@ -309,6 +319,7 @@
북쪽으로
北に
Északhoz
+ 正北
To Plotting Board Acrylic
@@ -319,6 +330,7 @@
Zum Wurfparabel Kartenwerkzeug Acryl
플로팅 보드 (아크릴)에
標定盤の アクリル板に
+ 亚克力绘图板
To Plotting Board
@@ -329,6 +341,7 @@
Zum Wurfparabel Kartenwerkzeug
플로팅 보드에
標定盤に
+ 绘图板
To Plotting Board Ruler
@@ -339,6 +352,7 @@
Zum Wurfparabel Kartenwerkzeug Lineal
플로팅 보드 (자)에
標定盤の 定規に
+ 绘图板尺
Up
@@ -349,6 +363,7 @@
Nach oben
위로
上に
+ 上
Toggle Plotting Board Ruler
@@ -359,6 +374,7 @@
Schalte das Lineal des Wurfparabel-Kartenwerkzeuges um
플로팅 보드 (자) 토글
標定盤の 定規を 表示切替
+ 切换显示绘图板尺
Wipe all markers off Plotting Board
@@ -369,6 +385,7 @@
Alle Markierungen vom Wurfparabel Kartenwerkzeug entfernen
플로팅 보드에 있는 모든 마커 지우기
標定盤の 全マーカーを 拭き消す
+ 移除所有绘图板标记
Channels in which plotting board drawing is enabled.
@@ -379,6 +396,7 @@
Kanäle, in denen das Zeichnen mit dem Wurfparabel-Kartenwerkzeug auf der Karte erlaubt ist.
플로팅 보드 그리기가 활성화된 채널입니다.
どのチャンネルで標定盤の書き込みを有効化するか。
+ 允许使用绘图板绘制的频道
Allow Plotting Board Drawing channels
@@ -389,6 +407,7 @@
Wurfparabel Kartenwerkzeug erlaubte Kanäle
플로팅 보드 그리기 채널 허용
標定盤への書き込みを許可するチャンネル
+ 允许使用绘图板绘制的频道
Allow Direct Comms Only (Polylines Only)
@@ -399,6 +418,7 @@
Nur direkte Kommunikation zulassen (nur Polylinien)
직접교신만 허용 (선 긋기만)
直接チャンネルのみ許可 (線のみ)
+ 仅允许直接通话频道(仅允许划线)
Allow Direct/Group Comms (Polylines and Group Markers)
@@ -409,6 +429,7 @@
Direkte/Gruppenkommunikation zulassen (Polylinien und Gruppenmarkierungen)
직접교신/그룹무전망 허용 (선 긋기와 그룹 마커)
直接/グループチャンネルを許可 (線とグループマーカー)
+ 允许在直接和小队频道(允许划线和小队标记)
Draw on the edge of maptools to draw straight lines. Note: Must hover at midpoint to delete.
diff --git a/addons/marker_flags/stringtable.xml b/addons/marker_flags/stringtable.xml
index 5f51d9b0e6a..85cf48882d2 100644
--- a/addons/marker_flags/stringtable.xml
+++ b/addons/marker_flags/stringtable.xml
@@ -12,6 +12,7 @@
Höhe anpassen
높이 조정
高さを調整する
+ 调整高度
Cancel
@@ -57,6 +58,7 @@
Markierungsfahne platzieren
마킹용 깃발 꽂기
マーカー旗 を置く
+ 放置标记旗帜
Marker Flags
@@ -80,7 +82,7 @@
Permite colocar as bandeiras de marcação em qualquer lugar, independente do tipo de superfice
Размещать флажки где угодно вне зависимости от поверхности.
Platzieren Sie die Markierungsfahne überall, unabhängig von der Oberfläche.
- 지면에 상관없이 아무곳에서나 마킹용 깃발을 배치합니다.
+ 지면에 상관없이 아무 곳에서나 마킹용 깃발을 배치합니다.
どのような地表でも旗を設置できるようにします
不管地形表面是什么都可以放标记旗
diff --git a/addons/markers/stringtable.xml b/addons/markers/stringtable.xml
index 0b62ae423bd..33e7f1d5e87 100644
--- a/addons/markers/stringtable.xml
+++ b/addons/markers/stringtable.xml
@@ -301,6 +301,7 @@
"MS" - Milisekunden (von 0 bis 59)
"MS" - 밀리초 (0부터 59까지)
"MM" - ミリ秒 (0から59)
+ "MM" - 毫秒(0到59)
"mmm" - Milliseconds (from 0 to 999)
@@ -312,6 +313,7 @@
"mmm" - Milisekunden (von 0 bis 999)
"mmm" - 밀리초 (0부터 999까지)
"mmm" - ミリ秒 (0から599)
+ "mmm" - 毫秒(0到999)
Timestamp Hour Format
@@ -434,7 +436,7 @@
Relógio necessário
Необходимы часы
Uhr, GPS oder UAV Terminal benötigt
- 시계 필요함
+ 시계, GPS 또는 무인기 단말이 필요함
時計 か GPS または UAVターミナル が必要
需要手表
@@ -458,7 +460,7 @@
Zmień przesunięcie minut dla sygnatury czasowej UTC
Изменить минутное смещение для времени UTC
Ändere den Minutenversatz für den UTC-Zeitstempel
- UTC 타임 스탬프의 분 오프셋을 변경하십시오
+ UTC 타임스탬프의 분 단위 오프셋을 변경합니다
UTCタイムスタンプの分オフセットを変更します
更改UTC时间戳的分钟偏移量
@@ -482,7 +484,7 @@
Zmień przesunięcie czasu dla sygnatury czasowej UTC
Измените смещение времени для метки времени UTC
Ändere die Zeitverschiebung für den UTC-Zeitstempel
- UTC 타임 스탬프의 시간 오프셋을 변경하십시오
+ UTC 타임스탬프의 시간 단위 오프셋을 변경합니다
UTCタイムスタンプの時オフセットを変更します
更改UTC时间戳的时间偏移量
diff --git a/addons/maverick/stringtable.xml b/addons/maverick/stringtable.xml
index 7c7fae20782..d6247e2f9ec 100644
--- a/addons/maverick/stringtable.xml
+++ b/addons/maverick/stringtable.xml
@@ -8,8 +8,10 @@
AGM-65 Maverick D
AGM-65 Maverick D
AGM-65 Maverick D
+ AGM-65 Maverick D
AGM-65 매버릭 D
AGM-65 マーベリック D
+ AGM-65"小牛"空地D型
AGM-65 Maverick D [ACE]
@@ -17,8 +19,10 @@
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]
+ AGM-65"小牛"空地D型 [ACE]
3x AGM-65 Maverick D [ACE]
@@ -26,8 +30,10 @@
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]
+ 3x AGM-65"小牛"空地D型 [ACE]
AGM-65 Maverick G
@@ -35,8 +41,10 @@
AGM-65 Maverick G
AGM-65 Maverick G
AGM-65 Maverick G
+ AGM-65 Maverick G
AGM-65 매버릭 G
AGM-65 マーベリック G
+ AGM-65"小牛"空地G型
AGM-65 Maverick G [ACE]
@@ -44,8 +52,10 @@
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]
+ AGM-65"小牛"空地G型 [ACE]
2x AGM-65 Maverick G [ACE]
@@ -53,8 +63,10 @@
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]
+ 2x AGM-65"小牛"空地G型 [ACE]
3x AGM-65 Maverick G [ACE]
@@ -62,8 +74,10 @@
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]
+ 3x AGM-65"小牛"空地G型 [ACE]
Kh-25ML, Laser Guided Air-to-Ground-Missile
diff --git a/addons/medical/XEH_PREP.hpp b/addons/medical/XEH_PREP.hpp
index d1edb26493b..63d22caefe1 100644
--- a/addons/medical/XEH_PREP.hpp
+++ b/addons/medical/XEH_PREP.hpp
@@ -2,5 +2,12 @@ PREP(addDamageToUnit);
PREP(adjustPainLevel);
PREP(deserializeState);
PREP(fullHeal);
+PREP(getBandagedWounds);
+PREP(getBloodLoss);
+PREP(getIVs);
+PREP(getOpenWounds);
+PREP(getStitchedWounds);
+PREP(isInjured);
+PREP(isInStableCondition);
PREP(serializeState);
PREP(setUnconscious);
diff --git a/addons/medical/functions/fnc_fullHeal.sqf b/addons/medical/functions/fnc_fullHeal.sqf
index 13b3a1f979a..7c7a2cb13b8 100644
--- a/addons/medical/functions/fnc_fullHeal.sqf
+++ b/addons/medical/functions/fnc_fullHeal.sqf
@@ -27,4 +27,4 @@ if (!alive _patient) exitWith {
ERROR_2("fullHeal [medic %1][patient %2] Patient is dead or null",_medic,_patient);
};
-[_medic, _patient, _logMessage] call EFUNC(medical_treatment,fullHeal);
+[_medic, _patient, "", "", objNull, "", false, _logMessage] call EFUNC(medical_treatment,fullHeal);
diff --git a/addons/medical/functions/fnc_getBandagedWounds.sqf b/addons/medical/functions/fnc_getBandagedWounds.sqf
new file mode 100644
index 00000000000..17d9252510f
--- /dev/null
+++ b/addons/medical/functions/fnc_getBandagedWounds.sqf
@@ -0,0 +1,51 @@
+#include "..\script_component.hpp"
+/*
+ * Author: LinkIsGrim
+ * Returns a copy of unit's bandaged wounds on a body part.
+ *
+ * Arguments:
+ * 0: Unit
+ * 1: Body Part
+ *
+ * Return Value:
+ * Wounds :
+ * 0: Wound Class ID
+ * 1: Wound Bandaged Amount
+ * 2: Wound Bleeding Coef
+ * 3: Wound Damage
+ *
+ * Example:
+ * [player, "head"] call ace_medical_fnc_getBandagedWounds
+ *
+ * Public: Yes
+ */
+
+params [["_unit", objNull, [objNull]], ["_bodyPart", "", [""]]];
+
+if (isNull _unit) exitWith {
+ ERROR("getBandagedWounds - null unit");
+
+ []
+};
+
+if !(_unit isKindOf "CAManBase") exitWith {
+ ERROR_2("getBandagedWounds - unit %1 is not child of CAManBase - type %2",_unit,typeOf _unit);
+
+ []
+};
+
+_bodyPart = toLowerANSI _bodyPart;
+
+if !(_bodyPart in ALL_BODY_PARTS) exitWith {
+ ERROR_2("getBandagedWounds - invalid body part %1, expected one of %2",_bodyPart,ALL_BODY_PARTS);
+
+ []
+};
+
+private _bandagedWounds = [];
+
+{
+ _bandagedWounds pushBack +_x; // manual deep copy so modification doesn't affect unit state
+} forEach (GET_OPEN_WOUNDS(_unit) getOrDefault [_bodyPart, []]);
+
+_bandagedWounds
diff --git a/addons/medical/functions/fnc_getBloodLoss.sqf b/addons/medical/functions/fnc_getBloodLoss.sqf
new file mode 100644
index 00000000000..427f9b2fda8
--- /dev/null
+++ b/addons/medical/functions/fnc_getBloodLoss.sqf
@@ -0,0 +1,25 @@
+#include "..\script_component.hpp"
+/*
+ * Author: DartRuffian
+ * Calculate the total blood loss of a unit.
+ *
+ * Arguments:
+ * 0: Unit
+ *
+ * Return Value:
+ * Total blood loss of unit (litres/second)
+ *
+ * Example:
+ * player call ace_medical_fnc_getBloodLoss
+ *
+ * Public: Yes
+ */
+
+params [["_unit", objNull, [objNull]]];
+
+if (!local _unit) exitWith {
+ ERROR_1("unit [%1] is not local",_unit);
+ -1
+};
+
+GET_BLOOD_LOSS(_unit)
diff --git a/addons/medical/functions/fnc_getIVs.sqf b/addons/medical/functions/fnc_getIVs.sqf
new file mode 100644
index 00000000000..6bbd3d7798a
--- /dev/null
+++ b/addons/medical/functions/fnc_getIVs.sqf
@@ -0,0 +1,53 @@
+#include "..\script_component.hpp"
+/*
+ * Author: LinkIsGrim
+ * Returns a copy of unit's IVs.
+ *
+ * Arguments:
+ * 0: Unit
+ *
+ * Return Value:
+ * IVs :
+ * 0: IV volume remaining, in liters
+ * 1: IV type (blood, saline, plasma, etc)
+ * 2: IV body part
+ * 3: IV treatment classname
+ * 4: IV flow rate coef
+ * 5: IV item classname
+ *
+ * Example:
+ * player call ace_medical_fnc_getIVs
+ *
+ * Public: Yes
+ */
+
+params [["_unit", objNull, [objNull]]];
+
+if (!alive _unit) exitWith {
+ ERROR_1("getIVs - null or dead unit %1",_unit);
+
+ []
+};
+
+if !(_unit isKindOf "CAManBase") exitWith {
+ ERROR_2("getIVs - unit %1 is not child of CAManBase - type %2",_unit,typeOf _unit);
+
+ []
+};
+
+private _ivBags = [];
+
+{
+ _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/functions/fnc_getOpenWounds.sqf b/addons/medical/functions/fnc_getOpenWounds.sqf
new file mode 100644
index 00000000000..b15697210a2
--- /dev/null
+++ b/addons/medical/functions/fnc_getOpenWounds.sqf
@@ -0,0 +1,54 @@
+#include "..\script_component.hpp"
+/*
+ * Author: LinkIsGrim
+ * Returns a copy of unit's open wounds on a body part.
+ *
+ * Arguments:
+ * 0: Unit
+ * 1: Body Part
+ *
+ * Return Value:
+ * Wounds :
+ * 0: Wound Class ID
+ * 1: Wound Open Amount
+ * 2: Wound Bleeding Coef
+ * 3: Wound Damage
+ *
+ * Example:
+ * [player, "head"] call ace_medical_fnc_getOpenWounds
+ *
+ * Public: Yes
+ */
+
+params [["_unit", objNull, [objNull]], ["_bodyPart", "", [""]]];
+
+if (isNull _unit) exitWith {
+ ERROR("getOpenWounds - null unit");
+
+ []
+};
+
+if !(_unit isKindOf "CAManBase") exitWith {
+ ERROR_2("getOpenWounds - unit %1 is not child of CAManBase - type %2",_unit,typeOf _unit);
+
+ []
+};
+
+_bodyPart = toLowerANSI _bodyPart;
+
+if !(_bodyPart in ALL_BODY_PARTS) exitWith {
+ ERROR_2("getOpenWounds - invalid body part %1, expected one of %2",_bodyPart,ALL_BODY_PARTS);
+
+ []
+};
+
+private _openWounds = [];
+
+{
+ _x params ["", "_xAmount"];
+ if (_xAmount > 0) then { // bandaged wounds are open wounds with count 0, skip those
+ _openWounds pushBack +_x; // manual deep copy so modification doesn't affect unit state
+ };
+} forEach (GET_OPEN_WOUNDS(_unit) getOrDefault [_bodyPart, []]);
+
+_openWounds
diff --git a/addons/medical/functions/fnc_getStitchedWounds.sqf b/addons/medical/functions/fnc_getStitchedWounds.sqf
new file mode 100644
index 00000000000..041c27803f5
--- /dev/null
+++ b/addons/medical/functions/fnc_getStitchedWounds.sqf
@@ -0,0 +1,51 @@
+#include "..\script_component.hpp"
+/*
+ * Author: LinkIsGrim
+ * Returns a copy of unit's stitched wounds on a body part.
+ *
+ * Arguments:
+ * 0: Unit
+ * 1: Body Part
+ *
+ * Return Value:
+ * Wounds :
+ * 0: Wound Class ID
+ * 1: Wound Stitched Amount
+ * 2: Wound Bleeding Coef
+ * 3: Wound Damage
+ *
+ * Example:
+ * [player, "head"] call ace_medical_fnc_getStitchedWounds
+ *
+ * Public: Yes
+ */
+
+params [["_unit", objNull, [objNull]], ["_bodyPart", "", [""]]];
+
+if (isNull _unit) exitWith {
+ ERROR("getStitchedWounds - null unit");
+
+ []
+};
+
+if !(_unit isKindOf "CAManBase") exitWith {
+ ERROR_2("getStitchedWounds - unit %1 is not child of CAManBase - type %2",_unit,typeOf _unit);
+
+ []
+};
+
+_bodyPart = toLowerANSI _bodyPart;
+
+if !(_bodyPart in ALL_BODY_PARTS) exitWith {
+ ERROR_2("getStitchedWounds - invalid body part %1, expected one of %2",_bodyPart,ALL_BODY_PARTS);
+
+ []
+};
+
+private _stitchedWounds = [];
+
+{
+ _stitchedWounds pushBack +_x; // manual deep copy so modification doesn't affect unit state
+} forEach (GET_STITCHED_WOUNDS(_unit) getOrDefault [_bodyPart, []]);
+
+_stitchedWounds
diff --git a/addons/medical/functions/fnc_isInStableCondition.sqf b/addons/medical/functions/fnc_isInStableCondition.sqf
new file mode 100644
index 00000000000..d30e7d09854
--- /dev/null
+++ b/addons/medical/functions/fnc_isInStableCondition.sqf
@@ -0,0 +1,23 @@
+#include "..\script_component.hpp"
+/*
+ * Author: DartRuffian
+ * Checks if a unit is in stable condition (stable vitals, awake, and not bleeding).
+ * Unit shouldn't require further treatment if true and not injured.
+ *
+ * Arguments:
+ * 0: Unit
+ *
+ * Return Value:
+ * Is unit stable
+ *
+ * Example:
+ * player call ace_medical_fnc_isInStableCondition
+ *
+ * Public: Yes
+ */
+
+params [["_unit", objNull, [objNull]]];
+
+if (!alive _unit) exitWith { false };
+
+_unit call EFUNC(medical_status,isInStableCondition)
diff --git a/addons/medical/functions/fnc_isInjured.sqf b/addons/medical/functions/fnc_isInjured.sqf
new file mode 100644
index 00000000000..25a3aad9518
--- /dev/null
+++ b/addons/medical/functions/fnc_isInjured.sqf
@@ -0,0 +1,26 @@
+#include "..\script_component.hpp"
+/*
+ * Author: DartRuffian
+ * Checks if a unit is injured (bleeding, fractured limbs, low blood, etc).
+ * Unit may still require further treatment even if false.
+ *
+ * Arguments:
+ * 0: Unit
+ *
+ * Return Value:
+ * Is unit injured
+ *
+ * Example:
+ * player call ace_medical_fnc_isInjured
+ *
+ * Public: Yes
+ */
+
+params [["_unit", objNull, [objNull]]];
+
+if (!alive _unit) exitWith { false };
+
+private _fractures = GET_FRACTURES(_unit);
+
+((_fractures select HITPOINT_INDEX_LARM) == 1) || {(_fractures select HITPOINT_INDEX_RARM) == 1} ||
+{_unit call EFUNC(medical_ai,isInjured)}
diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml
index c1d2ec9d302..befd1c5ddc8 100644
--- a/addons/medical/stringtable.xml
+++ b/addons/medical/stringtable.xml
@@ -108,7 +108,7 @@
Controla o efeito de uso de talas para tratar fraturas.\nQuando desabilitado, ferimentos não causam fraturas.
Управляет эффектом использования шин для лечения переломов.\nПри отключении травмы не вызывают переломов.
Kontrolliert den Effekt wenn Schienen verwendet werden, um Knochenbrüche zu behandeln.\nWenn diese Einstellung nicht aktiviert ist, verursachen Verletzungen keine Knochenbrüche.
- 부목이 골절을 어떻게 치료할 지 결정합니다\n비활성화 시 골절이 일어나지 않습니다.
+ 부목이 골절을 어떻게 치료할 지 결정합니다.\n비활성화 시 골절이 일어나지 않습니다.
骨折の治療に添え木を使用した際の効果を設定します。\n無効にすると、骨折しません。
控制是否讓固定版能夠治療骨折。\n當停用時,受傷時不會導致骨折發生。
控制是否让固定板能够治疗骨折。 \n当停用时,受伤时不会导致骨折发生。
@@ -266,7 +266,7 @@
Selecione quais unidades o sistema médico avançado será habilitado
Выберите, на кого будет распространяться усложненная система медицины
Wähle aus, welche Einheiten unter das erweiterte Sanitätssystem fallen
- 어느 인원에게 고급 의료 시스템을 적용시킬지 선택하십시요.
+ 어느 인원에게 고급 의료 시스템을 적용시킬지 선택하십시오.
選択されたユニットが、高度な医療システムを使えるようになります
選擇進階醫療系統影響的對象
选择进阶医疗系统影响的物体
@@ -300,7 +300,7 @@
As unidades recebem dano de uma batida de veículo?
Должны ли юниты получать повреждения от аварий на транспорте?
Verursacht ein Fahrzeugunfall Verletzungen
- 차량 사고시 인원들이 부상을 입습니까?
+ 차량 사고 시 인원들이 부상을 입습니까?
ユニットが車両の衝突による負傷を受けるようにしますか?
設定人員是否會因為載具衝撞別的物件而產生傷害?
设定人员是否会因为载具冲撞别的物体而产生伤害?
@@ -366,7 +366,7 @@
Estável
После стабилизации
Stabil
- 안정된
+ 안정됨
安定下
穩定狀態下
稳定状态下
diff --git a/addons/medical_ai/functions/fnc_isInjured.sqf b/addons/medical_ai/functions/fnc_isInjured.sqf
index 2a4b6895143..657c0ba809d 100644
--- a/addons/medical_ai/functions/fnc_isInjured.sqf
+++ b/addons/medical_ai/functions/fnc_isInjured.sqf
@@ -25,3 +25,4 @@ if !(alive _this) exitWith {false};
((_fractures select 4) == 1) || {(_fractures select 5) == 1}
}
|| { GET_TOURNIQUETS(_this) isNotEqualTo DEFAULT_TOURNIQUET_VALUES }
+|| {GET_BLOOD_VOLUME(_this) < BLOOD_VOLUME_CLASS_2_HEMORRHAGE}
diff --git a/addons/medical_ai/stringtable.xml b/addons/medical_ai/stringtable.xml
index 723a09246b8..4dbd534c0ca 100644
--- a/addons/medical_ai/stringtable.xml
+++ b/addons/medical_ai/stringtable.xml
@@ -59,6 +59,7 @@
Automatische Konvertierung von Gegenständen der KI
인공지능 아이템 자동 변환
AIのアイテムを自動変換
+ 自动向AI转换物品
AI will only perform medical treatment if they have the necessary items in their inventory.
@@ -71,6 +72,7 @@
Die KI führt nur dann medizinische Behandlungen durch, wenn sie die erforderlichen Gegenstände in ihrem Inventar hat.
소지품에 필요한 아이템이 있을 경우에만 인공지능이 치료를 진행합니다.
AIのインベントリに必要なアイテムがある場合にのみ治療を実行します。
+ 仅当AI物品栏中有所需物品时才会进行医疗
Require Items
@@ -83,6 +85,7 @@
Erfordere Gegenstände
아이템 필요
アイテムを要求
+ 所需物品
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 cd5ae547805..6a35eb6a903 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
치명상 사망 확률
致命傷による死亡確率
致命伤死亡概率
@@ -532,6 +532,7 @@
Legt die Grenze für starke Schmerzen fest, oberhalb derer eine Person bei erlittenem Schaden bewusstlos werden kann.
사람이 데미지를 입었을 때 의식불명 상태가 될 수 있는 심각한 고통의 한계점을 설정합니다.
激しい痛みのしきい値を設定します。このしきい値を超えた状態でダメージを受けると意識を失う可能性があります。
+ 设定重度疼痛的阈值, 疼痛超过这个值时再次受到伤害可能会导致昏迷
Pain Unconscious Threshold
@@ -544,6 +545,7 @@
Schmerz-Bewusstlosigkeit-Grenze
고통 기절 한계점
無意識状態に陥る痛みのしきい値
+ 疼痛昏迷阈值
Sets the amount of damage a player can receive before going unconscious (and dying if "Sum of Trauma" is enabled).
@@ -555,7 +557,7 @@
Define a quantidade de dano que um jogador pode receber antes de ficar inconsciente.
Устанавливает количество урона, которое может получить игрок, прежде чем потеряет сознание (и умирает, если включена функция "Сумма травм").
Legt die Höhe des Schadens fest, den ein Spieler erhalten kann, bevor er ohnmächtig wird (oder stirbt, wenn "Summe aller Traumata" aktiviert ist).
- 플레이어가 치명상으로 인해 기절까지 가기 전의 한계점을 정합니다. ("피해량 중첩"이 켜져있으면 죽기도 합니다)
+ 플레이어가 치명상으로 인해 기절까지 가기 전의 한계점을 정합니다. ("외상 중첩"이 켜져있으면 죽기도 합니다)
プレイヤーが無意識状態に陥るまでに受けられるダメージ量を設定します。\n("外傷の合計"が有効な場合は死亡するまでに受けられるダメージ量)
設定玩家在無意識前能承受多少傷害。
设置玩家在昏迷前可以承受的伤害量(如果启用了“创伤总和”,则会死亡)。
@@ -822,7 +824,7 @@
Soma do trauma
Совокупность травмы
Summe aller Traumata
- 피해량 중첩
+ 외상 중첩
外傷の合計
外部創傷累計
创伤总和
@@ -846,22 +848,42 @@
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.
+ Imposta la quantità di danni che possono ricevere gli arti prima di causare la morte.\nDeve essere superiore a 0 per avere effetto.\nRichiede l'abilitazione di "Usa danni agli arti" e l'impostazione di "Fonte di danni letali" su "Somma dei traumi" o "Entrambi".\nL'effetto si cumula con la rispettiva soglia di danni critici. Non interagisce con fratture/zoppicamento in alcun modo.
+ 设置四肢可以承受的伤害, 超过时将导致致命伤. 必须大于0才能产生效果\n需要启用"四肢伤害计入创伤总和", 并且"致命伤来源"设置为"创伤总和"或"二者之一"\n与临界伤害阈值乘法叠加. 和骨折/跛脚无关
Limb Damage Threshold
Порог повреждения конечностей
+ Schwelle für Gliedmaßenschaden
手足のダメージしきい値
+ 사지 피해량 임계값
+ Seuil de dommages aux membres
+ Soglia dei danni critici agli arti
+ 四肢伤害阈值
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.
+ Determina se danni agli arti vengono presi in considerazione per il calcolo della somma dei traumi.
+ 控制四肢伤害是否计入创伤总和计算
Use Limb Damage
Использовать урон конечностям
+ Verwende Gliedmaßenschaden
手足のダメージを使用
+ 사지 피해 사용
+ Utiliser les dommages aux membres
+ Usa danni agli arti
+ 四肢伤害计入创伤总和
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_engine/stringtable.xml b/addons/medical_engine/stringtable.xml
index 19856781967..0a459ba5ead 100644
--- a/addons/medical_engine/stringtable.xml
+++ b/addons/medical_engine/stringtable.xml
@@ -38,6 +38,7 @@
Steuert den Effekt des „Durchschlagens“ von Panzerung auf den Gesamtschaden. Macht hohe Panzerungswerte, wie sie in GL-Westen verwendet werden, weniger effektiv.\nVerwende 0% für das Panzerungsverhalten vor 3.16.0.\nÄndere den Wert nur, wenn du weißt, was du tust!
최종 데미지에 대한 방어구의 'PassThrough' 효과를 조정합니다. GL 리그에 사용되는 것과 같은 높은 방호값을 덜 효과적으로 만듭니다\n3.16.0 이전의 방어구 동작에는 0%를 사용하십시오.\n당신이 뭘 하고 있는지 알고 있는 경우에만 이걸 설정하세요!
ボディアーマーの'passThrough'値が最終的な身体ダメージに与える影響を調整します。擲弾兵リグで使用されるような高い装甲値では効果が低くなります。\n3.16.0以前の挙動にするには0%にしてください。\nこれが何かわからない場合は変更しないことをお勧めします。
+ 控制Config中PassThrough对最终伤害产生的影响. 使高装甲值护甲(像是原版榴弹胸挂)减伤效果降低\n使用0%来获得3.16.0之前的护甲效果\n除非你知道在干什么, 否则不要更改这个选项!
Armor PassThrough Effect
@@ -50,6 +51,7 @@
Effekt des Panzerungsdurchschlags
방어구 PassThrough 효과
装甲貫通効果
+ 护甲PassThrough效果更改
diff --git a/addons/medical_gui/functions/fnc_updateInjuryList.sqf b/addons/medical_gui/functions/fnc_updateInjuryList.sqf
index f7a9eec1122..c9c9694a445 100644
--- a/addons/medical_gui/functions/fnc_updateInjuryList.sqf
+++ b/addons/medical_gui/functions/fnc_updateInjuryList.sqf
@@ -168,17 +168,17 @@ if (GVAR(showDamageEntry)) then {
private _damageThreshold = GET_DAMAGE_THRESHOLD(_target);
switch (true) do {
case (_selectionN > 3): { // legs: index 4 & 5
- if (!EGVAR(medical,useLimbDamage) || EGVAR(medical,limbDamageThreshold) == 0) then { // Just indicate how close to the limping threshold we are
- _damageThreshold = LIMPING_DAMAGE_THRESHOLD * 4;
- } else {
+ if (EGVAR(medical,limbDamageThreshold) != 0 && {[false, !isPlayer _target, true] select EGVAR(medical,useLimbDamage)}) then { // Just indicate how close to the limping threshold we are
_damageThreshold = _damageThreshold * EGVAR(medical,limbDamageThreshold);
+ } else {
+ _damageThreshold = FRACTURE_DAMAGE_THRESHOLD * 4;
};
};
case (_selectionN > 1): { // arms: index 2 & 3
- if (!EGVAR(medical,useLimbDamage) || EGVAR(medical,limbDamageThreshold) == 0) then { // Just indicate how close to the fracture threshold we are
- _damageThreshold = FRACTURE_DAMAGE_THRESHOLD * 4;
- } else {
+ if (EGVAR(medical,limbDamageThreshold) != 0 && {[false, !isPlayer _target, true] select EGVAR(medical,useLimbDamage)}) then { // Just indicate how close to the fracture threshold we are
_damageThreshold = _damageThreshold * EGVAR(medical,limbDamageThreshold);
+ } else {
+ _damageThreshold = FRACTURE_DAMAGE_THRESHOLD * 4;
};
};
case (_selectionN == 0): { // head: index 0
diff --git a/addons/medical_gui/stringtable.xml b/addons/medical_gui/stringtable.xml
index 2115bee81b9..93c2bed5dc9 100644
--- a/addons/medical_gui/stringtable.xml
+++ b/addons/medical_gui/stringtable.xml
@@ -109,6 +109,7 @@
Langsame Blutung
느린 출혈
出血は穏やか
+ 低速流血中
Moderate bleeding
@@ -121,6 +122,7 @@
Mäßige Blutung
중간 출혈
出血はそこそこ速い
+ 中速流血中
Severe bleeding
@@ -133,6 +135,7 @@
Schwere Blutung
심한 출혈
出血は激しい
+ 快速流血中
Massive bleeding
@@ -145,6 +148,7 @@
Massive Blutung
과다 출혈
出血は酷く多い
+ 极速流血中
Blood Loss Color %1
@@ -559,6 +563,7 @@
Kein Blutverlust
피를 잃지 않음
失血なし
+ 没有失血
Lost some blood
@@ -909,6 +914,7 @@
Medizinische Info anzeigen
의료 정보 보기
医療情報一時表示
+ 快速查看医疗信息
How long the medical info peek remains open after releasing the key.
@@ -921,6 +927,7 @@
Wie lange die medizinische Info-Anzeige nach dem Loslassen der Taste geöffnet bleibt.
키를 놓은 후 의료 정보가 열린 상태로 유지되는 시간입니다.
医療情報一時表示キーを放してからどれだけ長く情報表示するか。
+ 松开按键后医疗信息保留多长时间
Medical Peek Duration
@@ -933,6 +940,7 @@
Dauer zum Anzeigen der medizinischen Info
의료 정보 보기 지속 시간
医療情報一時表示の表示時間
+ 医疗信息持续时间
How long the medical info peek remains open after being injured.
@@ -1142,6 +1150,7 @@
Keine Blutung
출혈 없음
出血はしていない
+ 没在流血
Nasopharyngeal Tube [NPA]
@@ -1314,6 +1323,7 @@
Blutungsrate anzeigen
출혈 속도 표시
出血速度の表示
+ 显示流血速度
Show qualitative blood loss in the injury list.
@@ -1416,6 +1426,7 @@
Wechseln zu Ziel
대상으로 전환
相手に切り替え
+ 切换到目标
Switch to self
@@ -1428,6 +1439,7 @@
Wechseln zu selbst
자신으로 전환
自分に切り替え
+ 切换到自己
Torso
@@ -1589,6 +1601,7 @@
Zeigt an, dass der Patient blutet, optional mit Rate
환자가 출혈 중인지 여부를 표시합니다(선택적으로 출혈 속도 포함)
患者が出血しているかどうかを表示します。オプションで出血速度も表示します
+ 显示是否正在流血, 还可以显示流血速度
Show Bleeding State
@@ -1600,6 +1613,7 @@
Blutungsstatus anzeigen
출혈 상태 표시
出血状態の表示
+ 显示流血速度
Show trauma sustained in the injury list.
diff --git a/addons/medical_statemachine/stringtable.xml b/addons/medical_statemachine/stringtable.xml
index 7f908f92ea2..54ab527b2c0 100644
--- a/addons/medical_statemachine/stringtable.xml
+++ b/addons/medical_statemachine/stringtable.xml
@@ -11,7 +11,7 @@
Controla se a IA pode ficar inconsciente ao invés de morrer imediatamente.\nEssa configuração funciona com "Lesões Fatais de IA", pois para uma unidade ter uma parada cardíaca é necessário que a IA possa fica inconsciente.\nContudo, essas configurações são separadas pois unidades podem ficar inconscientes por vitais críticos causados por ferimentos não-fatais.\nEssencialmente, isso significa que para ativar uma parada cardíaca em IA, essa configuração precisa estar ativa.
Управляет тем, может ли ИИ потерять сознание, вместо того, чтобы немедленно умереть.\nЭтот параметр работает вместе с параметром «Смертельные раны ИИ», поскольку при остановке сердца требуется, чтобы юнит мог потерять сознание.\nОднако эти настройки разделены, потому что юниты могут потерять сознание из-за критических ранений жизненно важных органов, полученных в результате несмертельных травм.\nВ сущности, это означает, что для включения остановки сердца для ИИ этот параметр должен быть включен.
Kontrolliert, ob KI bewusstlos werden kann anstatt sofort zu sterben.\nDiese Einstellung funktioniert zusammen mit der Einstellung "Tödliche KI-Verletzungen". Denn wenn eine Einheit einen Herzstillstand erleiden soll, muss diese auch in der Lage sein, bewusstlos zu werden.\nDennoch sind diese beiden Einstellungen voneinander getrennt, da Einheiten auch durch kritische Vitalwerte bewusstlos werden können, die durch nicht tödliche Verletzungen aufgetreten sind.\nZusammengefasst bedeutet das, dass wenn KI-Einheiten einen Herzstillstand erleiden sollen, diese Einstellung aktiviert sein muss.
- 인공지능이 즉사하기보다 기절하는걸 설정합니다.\n이 기능은 "인공지능 중태" 기능과 같이 사용시 심정지를 구현합니다.
+ AI가 즉시 죽는 대신 의식불명이 되는지 여부를 제어합니다.\n이 설정은 "인공지능 중태" 설정과 함께 작동합니다. 심정지가 발생하려면 유닛이 의식불명이 되어야 하기 때문입니다.\n그러나 이런 설정들은 비치명적인 부상으로 인해 치명적인 상태로 의식불명이 될 수 있기 때문에 분리되어 있습니다.\n기본적으로 이는 AI 유닛에 대한 심정지를 활성화하려면 이 설정을 활성화 해야함을 의미합니다.
AIが即死する代わりに無意識状態化するかどうかを制御します。\nこれは "AIの致命傷" 設定と連動します。何故ならば、ユニットを心停止させるためには無意識状態に陥る必要がある為です。\nしかし、これらの設定は、致命的ではない負傷の経過による重症状態化でユニットが無意識状態に陥ることが出来るようにするため、分割されています。\n要するに、AIユニットの心停止を有効にするには、この設定を有効にする必要があるということです。
控制AI是否能進入無意識狀態而非立刻原地死亡。\n這個選項會與「AI致命傷」的選項聯動,使單位心搏停止的話必須先讓其無意識。\n然而,兩個設定分開之原因是使單位能因從非致命傷的攻擊情況下進入生命危險的狀態。\n簡單來說,你想要讓AI單位有心搏停止可能的話,該選項必須啟用。
控制 AI 是否可以进入昏迷状态而不是立即死亡。\n这个设置与"AI 致命伤"设置一起工作,因为进入心脏骤停需要单位能够昏迷。\n然而,这些设置是分开的,因为单位可能会因非致命伤害导致的关键生命体征而昏迷过去。\n从本质上讲,这意味着为了使 AI 单位的心脏骤停,必须启用此设置。
@@ -166,7 +166,7 @@
Em Parada Cardíaca
При остановке сердца
Herzstillstand
- 심정지가 옴
+ 심정지 중
心停止中
心搏停止中
心脏骤停中
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 61f5353583d..3430de7e83a 100644
--- a/addons/medical_status/functions/fnc_getBloodVolumeChange.sqf
+++ b/addons/medical_status/functions/fnc_getBloodVolumeChange.sqf
@@ -26,10 +26,10 @@ if (!isNil {_unit getVariable QEGVAR(medical,ivBags)}) then {
private _tourniquets = GET_TOURNIQUETS(_unit);
_bloodBags = _bloodBags apply {
- _x params ["_bagVolumeRemaining", "_type", "_bodyPart"];
+ _x params ["_bagVolumeRemaining", "_type", "_bodyPart", "_treatment", "_rateCoef", "_item"];
if (_tourniquets select _bodyPart == 0) then {
- private _bagChange = (_deltaT * EGVAR(medical,ivFlowRate) * IV_CHANGE_PER_SECOND) min _bagVolumeRemaining; // absolute value of the change in miliLiters
+ private _bagChange = (_deltaT * EGVAR(medical,ivFlowRate) * IV_CHANGE_PER_SECOND * _rateCoef) min _bagVolumeRemaining; // absolute value of the change in miliLiters
_bagVolumeRemaining = _bagVolumeRemaining - _bagChange;
_bloodVolumeChange = _bloodVolumeChange + (_bagChange / 1000);
};
@@ -37,7 +37,7 @@ if (!isNil {_unit getVariable QEGVAR(medical,ivBags)}) then {
if (_bagVolumeRemaining < 0.01) then {
[]
} else {
- [_bagVolumeRemaining, _type, _bodyPart]
+ [_bagVolumeRemaining, _type, _bodyPart, _treatment, _rateCoef, _item]
};
};
diff --git a/addons/medical_status/stringtable.xml b/addons/medical_status/stringtable.xml
index 2afed32f279..e55adc1cf12 100644
--- a/addons/medical_status/stringtable.xml
+++ b/addons/medical_status/stringtable.xml
@@ -46,6 +46,7 @@
Chance für einen Spieler, seine Waffe fallen zu lassen, wenn er bewusstlos wird.\nHat keine Auswirkung auf die KI.
플레이어가 기절할 때 무기를 떨어뜨릴 확률입니다.\nAI는 영향을 받지 않습니다.
プレーヤーが意識を失ったときに武器を落とす可能性。\nAI には影響しません。
+ 玩家在进入昏迷时把武器扔地上的概率\n对AI无效
Weapon Drop Chance
@@ -58,6 +59,7 @@
Wahrscheinlichkeit, die Waffe fallen zu lassen
무기 떨어뜨릴 확률
武器を落とす確率
+ 丢失武器概率
Controls how quickly fluid flows out of IV Bags. The IV Bag volume change is calculated as:\ntime interval (s) * iv change per second (4.1667 mL/s) * flow rate (this coefficient).
@@ -70,7 +72,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 +88,7 @@
Скорость внутривенного переливания
Transfusions Fließrate
수혈 속도
- IV 輸液の流量
+ 輸液IV(静脈注射)の流量
點滴輸血流量
点滴输血流量
IV Transfüzyon Akış Hızı
diff --git a/addons/medical_treatment/ACE_Medical_Treatment.hpp b/addons/medical_treatment/ACE_Medical_Treatment.hpp
index 0ac0c454a3b..6b66233a88b 100644
--- a/addons/medical_treatment/ACE_Medical_Treatment.hpp
+++ b/addons/medical_treatment/ACE_Medical_Treatment.hpp
@@ -629,10 +629,12 @@ class ADDON {
// volume is in millileters
volume = 1000;
ratio[] = {};
+ rateCoef = 1; // multiplier for IV flow rate, for other methods of giving fluids
type = "Blood";
class BloodIV {
volume = 1000;
ratio[] = {"Plasma", 1};
+ rateCoef = 1;
};
class BloodIV_500: BloodIV {
volume = 500;
diff --git a/addons/medical_treatment/functions/fnc_fullHeal.sqf b/addons/medical_treatment/functions/fnc_fullHeal.sqf
index e9295e3bac8..576e2fa4832 100644
--- a/addons/medical_treatment/functions/fnc_fullHeal.sqf
+++ b/addons/medical_treatment/functions/fnc_fullHeal.sqf
@@ -6,7 +6,12 @@
* Arguments:
* 0: Medic
* 1: Patient
- * 2: Write message to patient log (default: true)
+ * 2: Body Part (unused)
+ * 3: Treatment (unused)
+ * 4: Item User (unused)
+ * 5: Used Item (unused)
+ * 6: Create litter (unused)
+ * 7: Write message to patient log (default: true)
*
* Return Value:
* None
@@ -17,7 +22,8 @@
* Public: No
*/
-params ["_medic", "_patient", ["_logMessage", true]];
+params ["_medic", "_patient", "", "", "", "", "", ["_logMessage", true]];
+TRACE_3("fullHeal",_medic,_patient,_logMessage);
if (_logMessage) then {
[_patient, "activity", LSTRING(Activity_fullHeal), [[_medic, false, true] call EFUNC(common,getName)]] call FUNC(addToLog);
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 91a1db54a3f..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,12 +35,13 @@ 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"));
+private _volume = GET_NUMBER(_ivConfig >> "volume",getNumber (_defaultConfig >> "volume"));
+private _type = GET_STRING(_ivConfig >> "type",getText (_defaultConfig >> "type"));
+private _rateCoef = GET_NUMBER(_ivConfig >> "rateCoef",getNumber (_defaultConfig >> "rateCoef"));
// Add IV bag to patient's ivBags array
private _ivBags = _patient getVariable [QEGVAR(medical,ivBags), []];
-_ivBags pushBack [_volume, _type, _partIndex];
+_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 035bfc3e3fb..b6361650704 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
@@ -525,6 +525,7 @@
Verabreiche Schmerztabletten
진통제 투여
鎮痛剤を投与
+ 嗑片止疼药
Administering Painkillers...
@@ -535,6 +536,7 @@
Verabreiche Schmerztablette...
진통제 투여 중...
鎮痛剤を投与しています・・・
+ 正在服用止痛药
Enables treatment actions for different bandage types instead of the generic Bandage action.\nAdditionally, the reopening of bandaged wounds can also be enabled.
@@ -621,6 +623,7 @@
Aktiviert & kann Tod/Herzstillstand diagnostizieren [Direkt]
활성화 및 사망/심정지 진찰 가능 [직접]
有効 & 死亡/心停止状態を診断可能 [直接的に]
+ 已启用 & 可以诊断死亡/心搏骤停(直接显示结果)
Advanced Diagnose
@@ -745,7 +748,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 +761,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
기절 인원 시체 운반용 부대에 옮기기
無意識者の遺体袋への収容許可
允许昏迷者装入尸袋
@@ -774,6 +777,7 @@
Erlaubt das Graben von Gräbern um Leichen zu entsorgen.
시체를 처리하기 위해 무덤을 파는 것을 허용합니다.
墓を掘って死体を処理できるようになります。
+ 允许挖掘一个坟墓来处理尸体
Allow Grave Digging
@@ -786,6 +790,7 @@
Erlaube Graben von Gräbern
무덤 파기 허용
墓掘りを許可
+ 允许挖坟
Only if dead
@@ -798,6 +803,7 @@
Nur wenn tot
죽었을 때에만
死体のみ
+ 仅允许对尸体使用
Enables the creation of litter upon treatment.
@@ -842,7 +848,7 @@
Позволяет использовать внутривенные переливания на себе
Erlaube Bluttransfusionen an sich selbst zu benutzen
수액용기를 사용자 본인에게 쓸 수 있는지를 정합니다.
- 自らに対して IV 輸液を可能にします。
+ 自らに対しての輸液IV(静脈注射)を可能にします。
啟用是否能對自己注射點滴
启用是否能够自我静脉输液
@@ -857,7 +863,7 @@
Внутривенное переливание на себе
Eigennutzung von Bluttransfusionen
수액용기 자가 사용
- 自己 IV 輸液
+ 輸液の自己投与
自我注射點滴
自我静脉输液
@@ -903,7 +909,7 @@
Permite o uso de Kit Cirúrgico em si mesmo.
Включает использование хирургического набора на себе.
Ermöglicht die Benutzung des Operations-Sets, um sich selbst zu nähen.
- 봉합키트를 사용자 본인에게 쓸 수 있는지를 정합니다.
+ 봉합 키트를 사용자 본인에게 쓸 수 있는지를 정합니다.
手術キットを使い自らを縫合できるようにします。
啟用是否能自己使用手術包來縫合自己的傷口。
启用是否能够使用手术包进行自我缝合。
@@ -918,7 +924,7 @@
Auto-Cirurgia
Зашитие своей раны
Selbstnähen
- 봉합키트 자가 사용
+ 봉합 키트 자가 사용
自己縫合
自我縫合
自我缝合
@@ -966,11 +972,21 @@
Сначала медикаменты врача
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].
+ Prima le risorse del medico [Se ruolo medico]
+ Ausrüstung des Sanitäters zuerst [Wenn Sanitäter]
+ 救護者装備を優先 [衛生兵の場合]
+ 치료자의 의료물자 먼저 사용 [의무병일 경우]
+ 提供医疗者的装备优先(如果是医疗兵)
+
Patient's Equipment First
Prvně pacientovo vybavení
@@ -982,7 +998,7 @@
Сначала медикаменты пациента
Ausrüstung des Patienten zuerst
환자의 의료물자 먼저 사용
- 患者の装備を優先
+ 患者装備を優先
優先使用患者的醫療物資
优先消耗伤员装备
Önce Hastanın Ekipmanı
@@ -1651,7 +1667,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 +1683,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.
@@ -2319,6 +2335,7 @@
%1 ist im Herzstillstand
%1은(는) 심정지 상태입니다
%1 は心停止している
+ %1的心脏没在跳动
You check response of patient
@@ -2358,6 +2375,7 @@
%1 ist tod
%1은(는) 사망했습니다
%1 は死亡している
+ %1已经似了
%1 is responsive
@@ -2402,6 +2420,7 @@
%1 ist bewusstlos
%1은(는) 의식불명입니다
%1 は意識がない
+ %1没有意识
You checked %1
@@ -2512,8 +2531,9 @@
Co powinno zostać zużyte po zastosowaniu.
Контролирует, следует ли израсходовать Хирургический набор или нить после использования
Legt fest, ob etwas nach der Anwendung verwendet werden soll.
- 봉합키트를 1회성 소모품으로 설정할 지 여부를 결정합니다.
+ 봉합 키트를 1회성 소모품으로 설정할 지 여부를 결정합니다.
使用後に何を消費するか設定します。
+ 在使用后什么会被消耗
Consume Surgical Kit
@@ -2525,7 +2545,7 @@
Kit Cirúrgico Consumível
Израсходовать Хирургический набор
Verbrauche Operations-Set
- 봉합키트 소모
+ 봉합 키트 소모
手術キットの消費
手術包為消耗品
手术包是否被消耗
@@ -2554,7 +2574,7 @@
Konwertuj przedmioty z vanili
Converter itens vanilla
Преобразовывать ванильные медикаменты
- Standard Arma-Equipment in ACE-Items umwandeln
+ Umwandlung von Arma-Equipment
바닐라 아이템 전환
バニラアイテムの変換
轉換原版物品
@@ -2603,6 +2623,7 @@
Grabe ein Grab für den Leichnam
시체를 위해 무덤 파기
墓を掘る
+ 将此单位埋入土中
Digging grave for body...
@@ -2615,6 +2636,7 @@
Grab für Leichnam ausheben ...
시체를 위한 무덤 파는 중...
墓を掘っています
+ 正在挖坟
Doctors
@@ -2709,6 +2731,7 @@
Erstellt Grabmale beim Graben von Gräbern.
무덤을 파낼 때 무덤 마커를 표시할 수 있습니다.
墓を掘った際、墓標を作成できるようにします。
+ 挖坟时创建坟墓位置的地图标记
Create Grave Markers
@@ -2721,6 +2744,7 @@
Erstelle Grabmal
무덤 마커 생성
墓標を作成
+ 创建坟墓地图标记
Heavily wounded
@@ -2907,7 +2931,7 @@
Введение аденозина...
Adenosin injizieren...
아데노신 주사 중...
- アドネシンを投与しています・・・
+ アデノシンを注射しています・・・
腺苷注射中...
正在注射腺苷...
Adenosin Enjekte Ediliyor...
@@ -2923,7 +2947,7 @@
Введение атропина...
Atropin injizieren...
아트로핀 주사 중...
- アトロピンを投与しています・・・
+ アトロピンを注射しています・・・
阿托品注射中 ...
正在注射阿托品...
Atropin Enjekte Ediliyor...
@@ -2940,7 +2964,7 @@
Введение адреналина...
Epinephrin injizieren...
에피네프린 주사 중...
- アドレナリンを投与しています・・・
+ アドレナリンを注射しています・・・
腎上腺素注射中...
正在注射肾上腺素...
Epinefrin Enjekte Ediliyor...
@@ -2957,7 +2981,7 @@
Введение морфина...
Morphin injizieren...
모르핀 주사 중...
- モルヒネを投与しています・・・
+ モルヒネを注射しています・・・
嗎啡注射中...
正在注射吗啡...
Morfin Enjekte Ediliyor ...
@@ -3081,12 +3105,22 @@
Controls where Adenosine can be used.
Контролирует, где можно использовать Аденозин.
+ Legt fest, wo Adenosin benutzt werden kann.
アデノシンが使える場所を制御します。
+ 아데노신을 사용할 수 있는 장소를 정합니다.
+ Contrôle où l'Adénosine peut être utilisée.
+ Controlla dove si può usare l'Adenosina.
+ 控制何地能使用腺苷
Locations Adenosine
Места использования Аденозина
+ Orte für Adenosin
アデノシンの使用可能な場所
+ 아데노신 사용 장소
+ Lieux d'utilisation de l'adénosine
+ Luoghi Adenosina
+ 腺苷使用地点
Controls where epinephrine can be used.
@@ -3097,7 +3131,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.
에피네프린을 사용할 수 있는 장소를 정합니다.
アドレナリンが使える場所を制御します。
控制何處能使用腎上腺素
@@ -3128,9 +3162,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(静脈注射)を行える場所を制御します。
控制何地可以静脉输液
@@ -3141,20 +3175,30 @@
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.
+ Controlla dove si può usare la Morfina.
+ 控制何地能使用吗啡
Locations Morphine
Места использования Морфина
+ Orte für Morphin
モルヒネの使用可能な場所
+ 모르핀 사용 장소
+ Lieux d'utilisation de la morphine
+ Luoghi Morfina
+ 吗啡使用地点
Controls where a PAK can be used.
@@ -3165,7 +3209,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が使える場所を制御します。
控制何處能使用個人急救包
@@ -3192,12 +3236,22 @@
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.
+ Controlla dove si possono applicare Gessature.
+ 控制何地能使用骨折夹板
Locations Splint
Места наложения шины
+ Orte für Schiene
添え木の使用可能な場所
+ 부목 사용 장소
+ Emplacement des attelles
+ Luoghi Gessature
+ 骨折夹板使用地点
Controls where a surgical kit can be used.
@@ -3208,8 +3262,8 @@
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.
+ 봉합 키트를 사용할 수 있는 장소를 정합니다.
手術キットが使える場所を制御します。
控制何處能使用手術包
控制何地能使用手术包
@@ -3225,7 +3279,7 @@
Locais para Kit Cirúrgico
Места использования Хирургического набора
Orte für Operations-Set
- 봉합키트 사용 장소
+ 봉합 키트 사용 장소
手術キットの使用可能な場所
手術包使用地點
手术包使用地点
@@ -3281,12 +3335,22 @@
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.
+ Formazione richiesta per iniettare Adenosina.
+ 使用腺苷所需的医疗水平。
Allow Adenosine
Доступ к Аденозину
+ Erlaube Adenosin
アデノシンの許可
+ 아데노신 사용 허가
+ Autoriser l'adénosine
+ Permetti Adenosina
+ 允许使用腺苷
Training level required to use epinephrine.
@@ -3297,7 +3361,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.
에피네프린을 사용하는데 필요한 등급을 정합니다.
アドレナリンの使用に必要な医療スキルのレベルを設定します。
要受過何種程度的醫療訓練才可以使用腎上腺素
@@ -3331,7 +3395,7 @@
Уровень навыка, требуемый для осуществления внутривенного переливания.
'Fähigkeiten-Level', das benötigt wird, um Blut zu transfundieren.
수액용기를 사용하는데 필요한 등급을 정합니다.
- IV 輸液を行うのに必要な医療スキルのレベルを設定します。
+ 輸液IV(静脈注射)を行うのに必要な医療スキルのレベルを設定します。
要有何種醫療水準才可注射點滴。
静脉输液所需的医疗水平。
@@ -3346,19 +3410,29 @@
Доступ к внутривенному переливанию
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.
+ Formazione richiesta per iniettare Morfina.
+ 使用吗啡所需的医疗水平。
Allow Morphine
Доступ к Морфину
+ Erlaube Morphin
モルヒネの許可
+ 모르핀 사용 허가
+ Autoriser la morphine
+ Permetti Morfina
+ 允许使用吗啡
Training level required to use a PAK.
@@ -3369,7 +3443,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の使用に必要な医療スキルのレベルを設定します。
要受過何種程度的醫療訓練才可以使用個人急救包
@@ -3396,12 +3470,22 @@
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.
+ Formazione richiesta per applicare Gessature.
+ 使用骨折夹板所需的医疗水平。
Allow Splint
Доступ к наложению шины
+ Erlaube Schiene
添え木の許可
+ 부목 사용 허가
+ Accès aux attelles
+ Permetti Gessature
+ 允许使用骨折夹板
Training level required to use a surgical kit.
@@ -3412,8 +3496,8 @@
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.
+ 봉합 키트를 사용하는데 필요한 등급을 정합니다.
手術キットの使用に必要な医療スキルのレベルを設定します。
要受過多少程度的醫療訓練才能使用手術包。
使用手术包所需的医疗水平。
@@ -3429,7 +3513,7 @@
Permitir Kit Cirúrgico
Доступ к Хирургическому набору
Erlaube Operations-Set
- 봉합키트 사용 허가
+ 봉합 키트 사용 허가
手術キットを許可
允許使用手術包
允许使用手术包
@@ -3570,12 +3654,22 @@
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.
+ L'azione di controllare il polso darà un risultato numerico a seconda di questo settaggio.
+ 检查心率后会显示心率数值
Numerical Pulse
Числовое значение пульса
+ Numerischer Puls
脈拍の数値化
+ 맥박 수치
+ Pouls numérique
+ Frequenza Cardiaca Numerica
+ 显示心率数值
Used to pack medium to large wounds and stem the bleeding
@@ -3640,6 +3734,7 @@
시체를 검은 시체가방에 놓기
遺体袋 (黒) に入れる
Vücudu siyah ceset torbasına yerleştir
+ 将单位装入黑色尸袋
Place body in blue bodybag
@@ -3653,6 +3748,7 @@
시체를 파란 시체가방에 놓기
遺体袋 (青) に入れる
Vücudu mavi ceset torbasına yerleştir
+ 将单位装入蓝色尸袋
Place body in white bodybag
@@ -3666,6 +3762,7 @@
시체를 흰 시체가방에 놓기
遺体袋 (白) に入れる
Vücudu beyaz ceset torbasına yerleştir
+ 将单位装入白色尸袋
Placing body in bodybag...
@@ -3745,7 +3842,7 @@
Дополнительный препарат, применяемый при возмещении объема крови.
Volumenerweiterungsmittel (künstliches Blutvolumen)
혈액량을 늘리기위한 보조수단 입니다.
- 血液量の増加を補助します。
+ 血液量を増加させるための成分が含まれている。
可快速得到血液補充
可快速得到血液补充
Egy térfogatnövelő vérkiegészítmény.
@@ -3761,7 +3858,7 @@
Дополнительный препарат, применяемый при возмещении объема крови.
Volumenerweiterungsmittel (künstliches Blutvolumen)
혈액량을 늘리기위한 보조수단 입니다.
- 血液量の増加を補助します。
+ 血液量を増加させるための成分が含まれている。
可快速得到血液補充
可快速得到血液补充
Egy térfogatnövelő vérkiegészítmény.
@@ -3860,7 +3957,7 @@
Физраствор для в/в вливания (1000 мл)
Kochsalzlösung (1000ml)
생리식염수 IV (1000ml)
- 生理食塩水 IV (1000ml)
+ 生理食塩液 IV (1000ml)
點滴 (食鹽水 1000毫升)
生理盐水(1000毫升)
Serum IV (1000ml)
@@ -3877,7 +3974,7 @@
Физраствор для в/в вливания (250 мл)
Kochsalzlösung (250ml)
생리식염수 IV (250ml)
- 生理食塩水 IV (250ml)
+ 生理食塩液 IV (250ml)
點滴 (食鹽水 250毫升)
生理盐水(250毫升)
Serum IV (250ml)
@@ -3894,7 +3991,7 @@
Физраствор для в/в вливания (500 мл)
Kochsalzlösung (500ml)
생리식염수 IV (500ml)
- 生理食塩水 IV (500ml)
+ 生理食塩液 IV (500ml)
點滴 (食鹽水 500毫升)
生理盐水(500毫升)
Serum IV (500ml)
@@ -3911,7 +4008,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
@@ -3972,7 +4069,8 @@
Нет капельницы
Kein IV
수혈 없음
- IV なし
+ IV(静脈注射) なし
+ 没有静脉注射
No pain
@@ -3984,6 +4082,7 @@
Kein Schmerz
고통 없음
痛みはない
+ 没有疼痛
In pain
@@ -4144,6 +4243,7 @@
Chirurgisches Nahtmaterial zum Nähen von Wunden.
상처를 꿰메는 수술용 봉합술.
傷害縫合用の外科糸付縫合針。
+ 用于缝合伤口的手术缝合线
Surgical Suture for stitching injuries.
@@ -4156,6 +4256,7 @@
Chirurgisches Nahtmaterial zum Nähen von Wunden.
상처를 꿰메는 수술용 봉합술.
傷害縫合用の外科糸付縫合針。
+ 用于缝合伤口的手术缝合线
Suture
@@ -4168,6 +4269,7 @@
Naht
봉합술
糸付縫合針
+ 缝合线
Modifies how long a PAK takes to apply.\nThe treatment time is based on the total body part damage multiplied by this coefficient, with a minimum of 10 seconds.
@@ -4263,7 +4365,7 @@
Перелить кровь
Bluttransfusion
혈액 수혈
- 血液を投与
+ 血液を輸液
輸血液
输入血液
Kan Ver
@@ -4280,7 +4382,7 @@
Перелить плазму
Plasmatransfusion
혈장 수혈
- 血漿を投与
+ 血漿を輸液
輸血漿
输入血浆
Plasma Ver
@@ -4297,7 +4399,7 @@
Перелить физраствор
Salzlösungstransfusion
생리식염수 수혈
- 生理食塩水を投与
+ 生理食塩液を輸液
注射生理食鹽水
输入生理盐水
Serum Ver
@@ -4314,7 +4416,7 @@
Переливание крови...
Bluttransfusion...
혈액 수혈 중...
- 血液を投与しています・・・
+ 血液を輸液しています・・・
輸血液中 ...
正在输入血液...
Kan Veriliyor...
@@ -4331,7 +4433,7 @@
Переливание плазмы...
Plasmatransfusion...
혈장 수혈 중...
- 血漿を投与しています・・・
+ 血漿を輸液しています・・・
輸血漿中 ...
正在输入血浆...
Plasma Veriliyor...
@@ -4348,7 +4450,7 @@
Переливание физраствора...
Salzlösungtransfusion...
생리식염수 수혈 중...
- 生理食塩水を投与しています・・・
+ 生理食塩液を輸液しています・・・
施打生理食鹽水中 ...
正在输入生理盐水...
Serum Veriliyor...
@@ -4458,6 +4560,7 @@
Dauer von Behandlungen als Zeus wird mit diesem Koeffizienten multipliziert.
제우스일 때 모든 치료 시간에 이 계수를 곱합니다.
Zeus操作中は、すべての治療時間にこの係数を掛けます。
+ 宙斯的医疗时间乘数
Zeus Treatment Time Coefficient
@@ -4468,6 +4571,7 @@
Zeit-Koeffizient für Zeus Behandlungen
제우스 치료 시간 계수
Zeus治療時間係数
+ 宙斯医疗时间系数
Time, in seconds, required to dig a grave for a body.
@@ -4480,6 +4584,7 @@
Zeit (in Sekunden), die benötigt wird, um ein Grab für einen Leichnam auszuheben.
시신의 무덤을 파는 데 필요한 시간(초 단위).
遺体の墓を掘るのに掛かる時間。 (秒単位)
+ 挖掘坟墓所需时间(秒)
Grave Digging Time
@@ -4492,6 +4597,7 @@
Zeit zum Graben von Gräbern
무덤 파는 시간
墓掘りの所要時間
+ 挖坟时间
Time, in seconds, required to administer an IV bag.
@@ -4732,7 +4838,7 @@
Usar Kit Cirúrgico
Использовать хирургический набор
Operationsset benutzen
- 봉합키트 사용하기
+ 봉합 키트 사용하기
手術キットを使う
使用手術包
使用手术包
@@ -4856,6 +4962,7 @@
Bestimmt, wie wirksam Bandagen beim Verschließen von Wunden sind.
붕대가 상처를 치료하는 데 얼마나 효과적으로 지속되는지 결정합니다.
包帯が傷をふさぐのにどれだけ効果的かを定義します。
+ 绷带在包扎伤口时会多有效
Bandage Effectiveness Coefficient
@@ -4868,6 +4975,7 @@
Verbandswirksamkeitskoeffizient
붕대 효과 계수
包帯有効性係数
+ 绷带有效值系数
If enabled, bandages can close different types of wounds on the same body part.\nBandaging multiple injuries will scale bandaging time accordingly.
@@ -4880,6 +4988,7 @@
Wenn diese Option aktiviert ist, können Verbände verschiedene Arten von Wunden am selben Körperteil schließen.\nBeim Verbinden mehrerer Verletzungen wird die Verbandszeit entsprechend skaliert.
활성화된 경우 붕대로 동일한 신체 부위에 있는 다른 유형의 상처를 막을 수 있습니다.\n여러 부상을 붕대로 감으면 붕대 감는 시간이 그만큼 늘어납니다.
有効にすると、体の同じ部分にある別の種類の傷を一つの包帯で閉じることができます。\n複数の傷に包帯を巻くと、それに応じて包帯時間が変動します。
+ 如果启用, 一次包扎动作可以包扎同一身体部位的多个不同类型的伤口\n包扎时间也会相应改变
Bandage Rollover
@@ -4892,6 +5001,7 @@
Verbandüberschlag
붕대 모두 감기
包帯の繰り越し
+ 包扎多个伤口
The body twitched and may not be dead!
@@ -4917,6 +5027,7 @@
Überprüfe Name auf dem Grabstein
묘비 이름 확인
墓石の名前を確認
+ 检查墓碑上的名字
alive
@@ -5082,6 +5193,7 @@
医療品
Tıbbi Ürünler
Orvosi felszerelés
+ 医疗物品
He hasn't lost blood
@@ -5142,6 +5254,7 @@
Rezeptfreies Analgetikum zur Bekämpfung leichter bis mittelschwerer Schmerzen.
가벼운 통증부터 중간 정도의 통증을 퇴치하는 데 사용되는 일반의약품 진통제입니다.
軽度から中程度の痛みに対処するために使用される市販の鎮痛薬。
+ 非处方止疼药, 用于缓解轻至中度疼痛
Over-the-counter analgesic used to combat light to moderate pain experiences.
@@ -5152,6 +5265,7 @@
Rezeptfreies Analgetikum zur Bekämpfung leichter bis mittelschwerer Schmerzen.
가벼운 통증부터 중간 정도의 통증을 퇴치하는 데 사용되는 일반의약품 진통제입니다.
軽度から中程度の痛みに対処するために使用される市販の鎮痛薬。
+ 非处方止疼药, 用于缓解轻至中度疼痛
Painkillers
@@ -5180,7 +5294,7 @@
Принимается кровь [%1 мл]
Erhalte Blut IV [%1ml]
혈액 IV로 [%1ml] 수혈중
- 血液 IV [%1ml] を投与中
+ 血液をIV(静脈注射)投与中 [%1ml]
接收血液靜脈注射液中 [%1毫升]
正在接受血液静脉注射 [%1毫升]
Vér Infúzióra kötve [%1ml]
@@ -5196,7 +5310,7 @@
Принимается плазма [%1 мл]
Erhalte Plasma IV [%1ml]
혈장 IV로 [%1ml] 수혈중
- プラズマ IV [%1ml] を投与中
+ 血漿をIV(静脈注射)投与中 [%1ml]
接收血漿靜脈注射液中 [%1毫升]
正在接受血浆静脉注射 [%1毫升]
Plazma Infúzióra kötve [%1ml]
@@ -5212,7 +5326,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/medical_vitals/stringtable.xml b/addons/medical_vitals/stringtable.xml
index 1bd994cc656..c05fe40b246 100644
--- a/addons/medical_vitals/stringtable.xml
+++ b/addons/medical_vitals/stringtable.xml
@@ -11,6 +11,7 @@
Vitalwerte
생명
バイタル
+ 生命体征
Enables oxygen saturation simulation, providing variable heart rate and oxygen demand based on physical activity and altitude. Required for Airway Management.
@@ -22,6 +23,7 @@
Aktiviert die Simulation der Sauerstoffsättigung und bietet variable Herzfrequenz und Sauerstoffbedarf basierend auf körperlicher Aktivität und Geländehöhe. Erforderlich für das Atemwegsmanagement.
산소포화도 시뮬레이션을 활성화하여 신체 활동과 고도에 따라 다양한 심박수와 산소 요구량을 제공합니다. 기도 관리에 필요합니다.
酸素飽和度シミュレーションを有効にし、身体活動や標高に基づいて変動する心拍数と酸素要求量の機能を提供します。 気道管理に必要です。
+ 启用血氧饱和度模拟, 根据身体活动和海拔改变心率和氧气需求. 气道管理需要此选项启用
Enable SpO2 Simulation
@@ -33,6 +35,7 @@
SpO2-Simulation aktivieren
산소포화도 시뮬레이션 활성화
SpO2シミュレーションを有効化
+ 启用血氧模拟
diff --git a/addons/microdagr/stringtable.xml b/addons/microdagr/stringtable.xml
index 3d5e87df131..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 接收器地图资料
@@ -614,7 +614,7 @@
Nome do [%1]
Название [%1]
Name von [%1]
- [%1] 의 이름
+ [%1]의 이름
[%1] の名称
名稱 [%1]
名称 [%1]
diff --git a/addons/missile_aim120/$PBOPREFIX$ b/addons/missile_aim120/$PBOPREFIX$
new file mode 100644
index 00000000000..d83b0fd679b
--- /dev/null
+++ b/addons/missile_aim120/$PBOPREFIX$
@@ -0,0 +1 @@
+z\ace\addons\missile_aim120
diff --git a/addons/missile_aim120/CfgAmmo.hpp b/addons/missile_aim120/CfgAmmo.hpp
new file mode 100644
index 00000000000..45f4d94c704
--- /dev/null
+++ b/addons/missile_aim120/CfgAmmo.hpp
@@ -0,0 +1,79 @@
+class EGVAR(missileguidance,type_AMRAAM);
+class EGVAR(missileguidance,type_R77);
+class CfgAmmo {
+ class ammo_Missile_AMRAAM_C;
+ class M_Zephyr;
+ // AIM-120
+ class GVAR(a): M_Zephyr {
+ missileLockCone = 30;
+ missileKeepLockedCone = 30;
+ missileLockMaxDistance = 16000;
+ missileLockMinDistance = 500;
+
+ author = "Dani (TCVM)";
+ maneuvrability = 0;
+ flightProfiles[] = {"Direct", "Loft"};
+ class Direct {}; // dummy to allow for F cycling of missile mode
+ class Loft {};
+ class ace_missileguidance: EGVAR(missileguidance,type_AMRAAM) {
+ enabled = 1;
+ };
+ };
+
+ class GVAR(c): ammo_Missile_AMRAAM_C {
+ missileLockCone = 30;
+ missileKeepLockedCone = 30;
+ missileLockMaxDistance = 16000;
+ missileLockMinDistance = 500;
+
+ author = "Dani (TCVM)";
+ maneuvrability = 0;
+ flightProfiles[] = {"Direct", "Loft"};
+ class Direct {}; // dummy to allow for F cycling of missile mode
+ class Loft {};
+ class ace_missileguidance: EGVAR(missileguidance,type_AMRAAM) {
+ enabled = 1;
+ };
+ };
+
+ class ammo_Missile_AMRAAM_D;
+ class GVAR(d): ammo_Missile_AMRAAM_D {
+ missileLockCone = 45;
+ missileKeepLockedCone = 45;
+ missileLockMaxDistance = 16000;
+ missileLockMinDistance = 500;
+
+ author = "Dani (TCVM)";
+ maneuvrability = 0;
+ flightProfiles[] = {"Direct", "TopDown"};
+ class Direct {}; // dummy to allow for F cycling of missile mode
+ class TopDown {};
+ class ace_missileguidance: EGVAR(missileguidance,type_AMRAAM) {
+ enabled = 1;
+ pitchRate = 45;
+ yawRate = 45;
+ minimumSpeedFilter = 15; // filter out targets that have a closing velocity less than this
+ minimumTimeFilter = 0.00005; // filter out targets that are this close to the ground (speed of light)
+ maxTerrainCheck = 16000; // How far we should check for terrain
+ };
+ };
+
+ // R-77
+ class ammo_Missile_AA_R77;
+ class GVAR(r77): ammo_Missile_AA_R77 {
+ missileLockCone = 50;
+ missileKeepLockedCone = 50;
+ missileLockMaxDistance = 16000;
+ missileLockMinDistance = 500;
+
+ author = "Dani (TCVM)";
+ maneuvrability = 0;
+ flightProfiles[] = {"Direct", "TopDown"};
+ class Direct {}; // dummy to allow for F cycling of missile mode
+ class TopDown {};
+ class ace_missileguidance: EGVAR(missileguidance,type_R77) {
+ enabled = 1;
+ };
+ };
+};
+
diff --git a/addons/missile_aim120/CfgMagazines.hpp b/addons/missile_aim120/CfgMagazines.hpp
new file mode 100644
index 00000000000..7d866accb0e
--- /dev/null
+++ b/addons/missile_aim120/CfgMagazines.hpp
@@ -0,0 +1,108 @@
+class CfgMagazines {
+ class magazine_Missile_AMRAAM_C_x1;
+ class PylonMissile_Missile_AMRAAM_C_x1;
+ class PylonRack_Missile_AMRAAM_C_x1;
+ class PylonRack_Missile_AMRAAM_C_x2;
+ class PylonMissile_Missile_AMRAAM_D_x1;
+ class PylonMissile_Missile_AMRAAM_D_INT_x1;
+ class PylonRack_Missile_AMRAAM_D_x1;
+ class PylonRack_Missile_AMRAAM_D_x2;
+
+ class 4Rnd_GAA_missiles;
+ class PylonRack_1Rnd_GAA_missiles;
+ class PylonMissile_1Rnd_GAA_missiles;
+
+ class GVAR(a): 4Rnd_GAA_missiles {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(a);
+ ammo = QGVAR(a);
+ };
+
+ class GVAR(PylonRack_1Rnd_a): PylonRack_1Rnd_GAA_missiles {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(a_1x);
+ ammo = QGVAR(a);
+ pylonWeapon = QGVAR(aim120Launcher);
+ };
+
+ class GVAR(PylonMissile_1Rnd_a): PylonMissile_1Rnd_GAA_missiles {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(a_1x);
+ ammo = QGVAR(a);
+ pylonWeapon = QGVAR(aim120Launcher);
+ };
+
+ // AIM-120
+ class GVAR(c): magazine_Missile_AMRAAM_C_x1 {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(c_1x);
+ ammo = QGVAR(c);
+ };
+ class GVAR(PylonMissile_Missile_c_x1): PylonMissile_Missile_AMRAAM_C_x1 {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(c_1x);
+ ammo = QGVAR(c);
+ pylonWeapon = QGVAR(aim120Launcher);
+ };
+ class GVAR(PylonRack_Missile_c_x1): PylonRack_Missile_AMRAAM_C_x1 {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(c_1x);
+ ammo = QGVAR(c);
+ pylonWeapon = QGVAR(aim120Launcher);
+ };
+ class GVAR(PylonRack_Missile_c_x2): PylonRack_Missile_AMRAAM_C_x2 {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(c_2x);
+ ammo = QGVAR(c);
+ pylonWeapon = QGVAR(aim120Launcher);
+ };
+
+ class GVAR(PylonMissile_Missile_d_x1): PylonMissile_Missile_AMRAAM_D_x1 {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(d_1x);
+ ammo = QGVAR(d);
+ pylonWeapon = QGVAR(aim120Launcher);
+ };
+ class GVAR(PylonMissile_Missile_d_INT_x1): PylonMissile_Missile_AMRAAM_D_INT_x1 {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(d_1x);
+ ammo = QGVAR(d);
+ pylonWeapon = QGVAR(aim120Launcher);
+ };
+ class GVAR(PylonRack_Missile_d_x1): PylonRack_Missile_AMRAAM_D_x1 {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(d_1x);
+ ammo = QGVAR(d);
+ pylonWeapon = QGVAR(aim120Launcher);
+ };
+ class GVAR(PylonRack_Missile_d_x2): PylonRack_Missile_AMRAAM_D_x2 {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(d_2x);
+ ammo = QGVAR(d);
+ pylonWeapon = QGVAR(aim120Launcher);
+ };
+
+ // R-77
+ class magazine_Missile_AA_R77_x1;
+ class PylonMissile_Missile_AA_R77_x1;
+ class PylonMissile_Missile_AA_R77_INT_x1;
+
+ class GVAR(r77): magazine_Missile_AA_R77_x1 {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(r77_1x);
+ ammo = QGVAR(r77);
+ };
+ class GVAR(PylonMissile_Missile_R77_x1): PylonMissile_Missile_AA_R77_x1 {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(r77_1x);
+ ammo = QGVAR(r77);
+ pylonWeapon = QGVAR(r77Launcher);
+ };
+ class GVAR(PylonMissile_Missile_R77__INT_x1): PylonMissile_Missile_AA_R77_INT_x1 {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(r77_1x);
+ ammo = QGVAR(r77);
+ pylonWeapon = QGVAR(r77Launcher);
+ };
+};
+
diff --git a/addons/missile_aim120/CfgWeapons.hpp b/addons/missile_aim120/CfgWeapons.hpp
new file mode 100644
index 00000000000..e033b7424dd
--- /dev/null
+++ b/addons/missile_aim120/CfgWeapons.hpp
@@ -0,0 +1,118 @@
+class CfgWeapons {
+ class weapon_AMRAAMLauncher;
+ class MissileLauncher;
+
+ class GVAR(aim120Launcher): weapon_AMRAAMLauncher {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(aim120);
+ weaponLockDelay = 0.5;
+
+ magazines[] = {
+ QGVAR(a),
+ QGVAR(PylonRack_1Rnd_a),
+ QGVAR(PylonMissile_1Rnd_a),
+
+ QGVAR(c),
+ QGVAR(PylonMissile_Missile_c_x1),
+ QGVAR(PylonRack_Missile_c_x1),
+ QGVAR(PylonRack_Missile_c_x2),
+
+ QGVAR(PylonMissile_Missile_d_x1),
+ QGVAR(PylonMissile_Missile_d_INT_x1),
+ QGVAR(PylonRack_Missile_d_x1),
+ QGVAR(PylonRack_Missile_d_x2)
+ };
+
+ modes[] = {"Direct", "Loft"};
+ class Direct: MissileLauncher {
+ displayName = CSTRING(direct);
+ textureType = "direct";
+ reloadTime = 0.1;
+ magazineReloadTime = 0.1;
+ aiRateOfFire = 15;
+ aiRateOfFireDispersion = -10;
+ aiRateOfFireDistance = 10000;
+ minRange = 800;
+ minRangeProbab = 0.5;
+ midRange = 2500;
+ midRangeProbab = 0.95;
+ maxRange = 4000;
+ maxRangeProbab = 1;
+ sounds[] = {"StandardSound"};
+ class StandardSound {
+ begin1[] = {"A3\Sounds_F\weapons\Rockets\missile_2", 1.12202, 1.3, 1000};
+ soundBegin[] = {"begin1", 1};
+ weaponSoundEffect = "DefaultRifle";
+ };
+ soundFly[] = {"A3\Sounds_F\weapons\Rockets\rocket_fly_1", 1, 1.5, 700};
+ lockingTargetSound[] = {"\A3\Sounds_F\weapons\Rockets\locked_1", 0.562341, 1};
+ lockedTargetSound[] = {"\A3\Sounds_F\weapons\Rockets\locked_3", 0.562341, 2.5};
+
+ EGVAR(missileGuidance,attackProfile) = "DIR";
+ };
+ class Loft: Direct {
+ displayName = CSTRING(loft);
+ textureType = "topdown";
+
+ minRange = 4000;
+ minRangeProbab = 0.5;
+ midRange = 7000;
+ midRangeProbab = 0.95;
+ maxRange = 13000;
+ maxRangeProbab = 1;
+
+ EGVAR(missileGuidance,attackProfile) = "LOFT";
+ };
+ };
+
+ class weapon_R77Launcher;
+ class GVAR(r77Launcher): weapon_R77Launcher {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(r77);
+ weaponLockDelay = 0.5;
+
+ magazines[] = {QGVAR(r77), QGVAR(PylonMissile_Missile_R77_x1), QGVAR(PylonMissile_Missile_R77__INT_x1)};
+
+ modes[] = {"Direct", "Loft"};
+ class Direct: MissileLauncher {
+ displayName = CSTRING(direct);
+ textureType = "direct";
+ reloadTime = 0.1;
+ magazineReloadTime = 0.1;
+ aiRateOfFire = 15;
+ aiRateOfFireDispersion = -10;
+ aiRateOfFireDistance = 10000;
+ minRange = 800;
+ minRangeProbab = 0.5;
+ midRange = 2500;
+ midRangeProbab = 0.95;
+ maxRange = 4000;
+ maxRangeProbab = 1;
+ sounds[] = {"StandardSound"};
+ class StandardSound {
+ begin1[] = {"A3\Sounds_F\weapons\Rockets\missile_2", 1.12202, 1.3, 1000};
+ soundBegin[] = {"begin1", 1};
+ weaponSoundEffect = "DefaultRifle";
+ };
+ soundFly[] = {"A3\Sounds_F\weapons\Rockets\rocket_fly_1", 1, 1.5, 700};
+ lockingTargetSound[] = {"\A3\Sounds_F\weapons\Rockets\locked_1", 0.562341, 1};
+ lockedTargetSound[] = {"\A3\Sounds_F\weapons\Rockets\locked_3", 0.562341, 2.5};
+
+ EGVAR(missileGuidance,attackProfile) = "DIR";
+ };
+ class Loft: Direct {
+ displayName = CSTRING(loft);
+ textureType = "topdown";
+
+ minRange = 4000;
+ minRangeProbab = 0.5;
+ midRange = 7000;
+ midRangeProbab = 0.95;
+ maxRange = 13000;
+ maxRangeProbab = 1;
+
+ EGVAR(missileGuidance,attackProfile) = "LOFT";
+ };
+ };
+};
+
diff --git a/addons/missile_aim120/README.md b/addons/missile_aim120/README.md
new file mode 100644
index 00000000000..ebb6919c8fb
--- /dev/null
+++ b/addons/missile_aim120/README.md
@@ -0,0 +1,4 @@
+ace_missile_aim120
+===================
+
+Adds AIM-120, AIM-132, and R-77 AHR missiles
diff --git a/addons/missile_aim120/config.cpp b/addons/missile_aim120/config.cpp
new file mode 100644
index 00000000000..6b84b38bb70
--- /dev/null
+++ b/addons/missile_aim120/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_aim120/script_component.hpp b/addons/missile_aim120/script_component.hpp
new file mode 100644
index 00000000000..e9255cefe10
--- /dev/null
+++ b/addons/missile_aim120/script_component.hpp
@@ -0,0 +1,18 @@
+#define COMPONENT missile_aim120
+#define COMPONENT_BEAUTIFIED AIM-120
+#include "\z\ace\addons\main\script_mod.hpp"
+
+// #define DEBUG_MODE_FULL
+// #define DISABLE_COMPILE_CACHE
+// #define ENABLE_PERFORMANCE_COUNTERS
+
+#ifdef DEBUG_ENABLED_MISSILE_AIM120
+ #define DEBUG_MODE_FULL
+#endif
+
+#ifdef DEBUG_SETTINGS_MISSILE_AIM120
+ #define DEBUG_SETTINGS DEBUG_SETTINGS_MISSILE_AIM120
+#endif
+
+#include "\z\ace\addons\main\script_macros.hpp"
+
diff --git a/addons/missile_aim120/stringtable.xml b/addons/missile_aim120/stringtable.xml
new file mode 100644
index 00000000000..0b183e3ce9b
--- /dev/null
+++ b/addons/missile_aim120/stringtable.xml
@@ -0,0 +1,122 @@
+
+
+
+
+ AIM-120A [ACE]
+ 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]
+ 1x AIM-120A 암람 [ACE]
+
+
+ AIM-120 [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]
+ 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]
+ 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]
+ 2x AIM-120C 암람 [ACE]
+
+
+ AIM-120D [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]
+ 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]
+ 2x AIM-120D 암람 [ACE]
+
+
+ Direct
+ Direct
+ Diretto
+ ダイレクト
+ Прямой
+ Direct
+ 다이렉트
+
+
+ Loft
+ Loft
+ Loft
+ ロフト
+ Сверху
+ Loft
+ 로프트
+
+
+ R-77 [ACE]
+ 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]
+ 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..f306db095d5
--- /dev/null
+++ b/addons/missile_aim9/stringtable.xml
@@ -0,0 +1,140 @@
+
+
+
+
+ AIM-9M [ACE]
+ 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-9X 사이드와인더 [ACE]
+
+
+ AIM-132 [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-73 빔펠 [ACE]
+
+
+ R-74 [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]
+ 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]
+ 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]
+ 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]
+ 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]
+ 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]
+ 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]
+ 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-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]
+ 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]
+ 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/$PBOPREFIX$ b/addons/missile_hud/$PBOPREFIX$
new file mode 100644
index 00000000000..caccfc6f644
--- /dev/null
+++ b/addons/missile_hud/$PBOPREFIX$
@@ -0,0 +1 @@
+z\ace\addons\missile_hud
\ No newline at end of file
diff --git a/addons/missile_hud/ACE_GuidanceConfig.hpp b/addons/missile_hud/ACE_GuidanceConfig.hpp
new file mode 100644
index 00000000000..5e632bb1f8d
--- /dev/null
+++ b/addons/missile_hud/ACE_GuidanceConfig.hpp
@@ -0,0 +1,5 @@
+class EGVAR(missileguidance,SeekerTypes) {
+ class SALH {
+ hudInfo = QFUNC(info_salh);
+ };
+};
\ No newline at end of file
diff --git a/addons/missile_hud/CfgEventHandlers.hpp b/addons/missile_hud/CfgEventHandlers.hpp
new file mode 100644
index 00000000000..957d6badcb7
--- /dev/null
+++ b/addons/missile_hud/CfgEventHandlers.hpp
@@ -0,0 +1,17 @@
+class Extended_PreStart_EventHandlers {
+ class ADDON {
+ init = QUOTE(call COMPILE_SCRIPT(XEH_preStart));
+ };
+};
+
+class Extended_PreInit_EventHandlers {
+ class ADDON {
+ init = QUOTE(call COMPILE_SCRIPT(XEH_preInit));
+ };
+};
+
+class Extended_PostInit_EventHandlers {
+ class ADDON {
+ init = QUOTE(call COMPILE_SCRIPT(XEH_postInit));
+ };
+};
diff --git a/addons/missile_hud/README.md b/addons/missile_hud/README.md
new file mode 100644
index 00000000000..e17bd2e0c5a
--- /dev/null
+++ b/addons/missile_hud/README.md
@@ -0,0 +1,4 @@
+ace_missile_hud
+===================
+
+Displays information about missile to player through their in-game HUD
diff --git a/addons/missile_hud/RscTitles.hpp b/addons/missile_hud/RscTitles.hpp
new file mode 100644
index 00000000000..3f2492103a0
--- /dev/null
+++ b/addons/missile_hud/RscTitles.hpp
@@ -0,0 +1,40 @@
+class RscTitles {
+ class GVAR(infoDisplay) {
+ idd = -1;
+ onLoad = QUOTE(with uiNameSpace do { GVAR(display) = _this select 0 };);
+ movingEnable = 0;
+ duration = 60;
+ fadeIn = "false";
+ fadeOut = "false";
+ class controls {};
+ class controlPrefabs {
+ class line: RscControlsGroupNoScrollbars {
+ idc = -1;
+ x = "3.8 * (((safeZoneW / safeZoneH) min 1.2) / 40) + (profilenamespace getvariable ['IGUI_GRID_WEAPON_X',((safeZoneX + safeZoneW) - (10 * (((safeZoneW / safeZoneH) min 1.2) / 40)) - 4.3 * (((safeZoneW / safeZoneH) min 1.2) / 40))])";
+ y = "2.5 * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25) + (profilenamespace getVariable ['IGUI_GRID_WEAPON_Y', (safeZoneY + 0.5 * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25))])";
+ w = "10 * (((safeZoneW / safeZoneH) min 1.2) / 40)";
+ h = "1 * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
+ };
+ class text: RscText {
+ idc = -1;
+ colorText[] = {1, 1, 1, 1};
+ colorBackground[] = {0, 0, 0, 0};
+ x = "0";
+ y = "0";
+ w = "1 * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
+ h = "1 * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
+ sizeEx = "0.8 * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
+ };
+ class icon: RscPictureKeepAspect {
+ idc = -1;
+ colorText[] = {1, 1, 1, 1};
+ colorBackground[] = {0, 0, 0, 0};
+ text = "\a3\Ui_F_Curator\Data\CfgCurator\laser_ca.paa";
+ x = "0";
+ y = "0";
+ w = "(1) * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
+ h = "(1) * ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 25)";
+ };
+ };
+ };
+};
diff --git a/addons/missile_hud/XEH_PREP.hpp b/addons/missile_hud/XEH_PREP.hpp
new file mode 100644
index 00000000000..2f512a261b8
--- /dev/null
+++ b/addons/missile_hud/XEH_PREP.hpp
@@ -0,0 +1,8 @@
+PREP(createCtrlFromElement);
+PREP(getCurrentWeapon);
+PREP(info_salh);
+PREP(isElementValid);
+PREP(registerDefaultHud);
+PREP(registerElement);
+PREP(shouldAdjustHud);
+PREP(showVehicleHud);
diff --git a/addons/missile_hud/XEH_postInit.sqf b/addons/missile_hud/XEH_postInit.sqf
new file mode 100644
index 00000000000..2184a01e20a
--- /dev/null
+++ b/addons/missile_hud/XEH_postInit.sqf
@@ -0,0 +1,31 @@
+#include "script_component.hpp"
+
+if (hasInterface) then {
+ GVAR(pfID) = -1;
+ GVAR(generators) = [];
+
+ GVAR(config) = configFile >> "RscTitles" >> QGVAR(infoDisplay) >> "controlPrefabs";
+ GVAR(config_line) = GVAR(config) >> "line";
+ GVAR(lineHeight) = getNumber (GVAR(config_line) >> "h");
+ GVAR(lineWidth) = getNumber (GVAR(config_line) >> "w");
+ GVAR(itemWidth) = getNumber (GVAR(config) >> "icon" >> "w") / 1.25;
+
+ ["CBA_settingsInitialized", {
+ ["turret", LINKFUNC(showVehicleHud), false] call CBA_fnc_addPlayerEventHandler;
+ ["vehicle", LINKFUNC(showVehicleHud), true] call CBA_fnc_addPlayerEventHandler; // only one of these needs the retro flag
+
+ // Add UAV Control Compatibility
+ ["ACE_controlledUAV", {
+ params ["_UAV", "_seatAI", "_turret", "_position"];
+ TRACE_4("ACE_controlledUAV EH",_UAV,_seatAI,_turret,_position);
+ if (isNull _seatAI) then {
+ [ace_player] call FUNC(showVehicleHud);
+ } else {
+ [_seatAI] call FUNC(showVehicleHud);
+ };
+ }] call CBA_fnc_addEventHandler;
+
+ [] call FUNC(registerDefaultHud);
+ }] call CBA_fnc_addEventHandler;
+};
+
diff --git a/addons/missile_hud/XEH_preInit.sqf b/addons/missile_hud/XEH_preInit.sqf
new file mode 100644
index 00000000000..b47cf6628db
--- /dev/null
+++ b/addons/missile_hud/XEH_preInit.sqf
@@ -0,0 +1,9 @@
+#include "script_component.hpp"
+
+ADDON = false;
+
+PREP_RECOMPILE_START;
+#include "XEH_PREP.hpp"
+PREP_RECOMPILE_END;
+
+ADDON = true;
diff --git a/addons/missile_hud/XEH_preStart.sqf b/addons/missile_hud/XEH_preStart.sqf
new file mode 100644
index 00000000000..022888575ed
--- /dev/null
+++ b/addons/missile_hud/XEH_preStart.sqf
@@ -0,0 +1,3 @@
+#include "script_component.hpp"
+
+#include "XEH_PREP.hpp"
diff --git a/addons/missile_hud/config.cpp b/addons/missile_hud/config.cpp
new file mode 100644
index 00000000000..473766d70cd
--- /dev/null
+++ b/addons/missile_hud/config.cpp
@@ -0,0 +1,24 @@
+#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[] = {"tcvm"};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+ };
+};
+
+#include "CfgEventHandlers.hpp"
+#include "ACE_GuidanceConfig.hpp"
+
+class RscText;
+class RscControlsGroupNoScrollbars;
+class RscPictureKeepAspect;
+
+#include "RscTitles.hpp"
\ No newline at end of file
diff --git a/addons/missile_hud/functions/fnc_createCtrlFromElement.sqf b/addons/missile_hud/functions/fnc_createCtrlFromElement.sqf
new file mode 100644
index 00000000000..b398cf2ddb2
--- /dev/null
+++ b/addons/missile_hud/functions/fnc_createCtrlFromElement.sqf
@@ -0,0 +1,49 @@
+#include "..\script_component.hpp"
+/*
+ * Author: tcvm
+ * Create a UI control to be added to the display.
+ *
+ * Arguments:
+ * 0: Display
+ * 1: Line
+ * 2: Element
+ *
+ * Return Value:
+ * Control
+ *
+ * Example:
+ * [findDisplay 46, ["TEXT", "Hello, world!", [1, 1, 0]]] call ace_missile_hud_fnc_createCtrlFromElement
+ *
+ * Public: No
+ */
+
+params ["_display", "_line", "_element"];
+TRACE_1("createCtrlFromElement",_this);
+
+private _ctrl = controlNull;
+switch (_element select 0) do {
+ case "TEXT": {
+ _element params ["", "_text", "_color"];
+ private _controlConfig = GVAR(config) >> "text";
+ _ctrl = _display ctrlCreate [_controlConfig, -1, _line];
+ _ctrl ctrlSetText _text;
+ if (3 == count _color) then { _color pushBack 1; };
+ _ctrl ctrlSetTextColor _color;
+ };
+ case "ICON": {
+ _element params ["", "_path", "_color"];
+ private _controlConfig = GVAR(config) >> "icon";
+ _ctrl = _display ctrlCreate [_controlConfig, -1, _line];
+ _ctrl ctrlSetText _path;
+ if (3 == count _color) then { _color pushBack 1; };
+ _ctrl ctrlSetTextColor _color;
+ };
+ case "SPACER": {
+ private _controlConfig = GVAR(config) >> "icon";
+ _ctrl = _display ctrlCreate [_controlConfig, -1, _line];
+ _ctrl ctrlSetText "\A3\ui_f\data\map\markers\system\empty_ca.paa";
+ _ctrl ctrlSetTextColor [0, 0, 0, 0];
+ };
+};
+
+_ctrl
\ No newline at end of file
diff --git a/addons/missile_hud/functions/fnc_getCurrentWeapon.sqf b/addons/missile_hud/functions/fnc_getCurrentWeapon.sqf
new file mode 100644
index 00000000000..3629b318c28
--- /dev/null
+++ b/addons/missile_hud/functions/fnc_getCurrentWeapon.sqf
@@ -0,0 +1,29 @@
+#include "..\script_component.hpp"
+/*
+ * Author: tcvm
+ * Get the current weapon of the unit.
+ *
+ * Arguments:
+ * 0: Unit
+ * 1: Vehicle
+ * 2: Turret path
+ *
+ * Return Value:
+ * Current weapon
+ *
+ * Example:
+ * [player, vehicle player, [0]] call ace_missile_hud_fnc_getCurrentWeapon
+ *
+ * Public: No
+ */
+
+params ["_unit", "_vehicle", "_turretPath"];
+TRACE_3("getCurrentWeapon",_unit,_vehicle,_turretPath);
+
+private _currentWeapon = if (_unit isEqualTo _vehicle) then {
+ currentWeapon _unit
+} else {
+ _vehicle currentWeaponTurret _turretPath
+};
+
+_currentWeapon
\ No newline at end of file
diff --git a/addons/missile_hud/functions/fnc_info_salh.sqf b/addons/missile_hud/functions/fnc_info_salh.sqf
new file mode 100644
index 00000000000..dda08969e78
--- /dev/null
+++ b/addons/missile_hud/functions/fnc_info_salh.sqf
@@ -0,0 +1,55 @@
+#include "..\script_component.hpp"
+/*
+ * Author: tcvm
+ * Generates HUD info for SALH seeker.
+ *
+ * Arguments:
+ * 0: Idle display Text
+ * 1: Locked display text
+ * 2: Unit
+ * 3: Vehicle
+ * 4: Ammo Config
+ *
+ * Return Value:
+ * Element array
+ *
+ * Example:
+ * [["TEXT", "My Test", [1, 0.4, 5]]] call ace_missile_hud_fnc_info_salh
+ *
+ * Public: No
+ */
+
+params ["_idleText", "_lockedText", "_unit", "_vehicle", "_ammoConfig"];
+
+private _turretPath = _unit call CBA_fnc_turretPath;
+private _turretConfig = [_vehicle, _turretPath] call CBA_fnc_getTurret;
+private _laserSource = _vehicle modelToWorldWorld (_vehicle selectionPosition getText (_turretConfig >> "memoryPointGunnerOptics"));
+private _laserCode = _vehicle getVariable [QEGVAR(laser,code), ACE_DEFAULT_LASER_CODE];
+private _seekerAngle = getNumber (_ammoConfig >> "seekerAngle");
+private _seekerMaxRange = getNumber (_ammoConfig >> "seekerMaxRange");
+
+private _laserResult = [_laserSource, vectorDir _vehicle, _seekerAngle, _seekerMaxRange, [ACE_DEFAULT_LASER_WAVELENGTH,ACE_DEFAULT_LASER_WAVELENGTH], _laserCode, _vehicle] call EFUNC(laser,seekerFindLaserSpot);
+private _foundTargetPos = _laserResult select 0;
+private _haveLock = !isNil "_foundTargetPos";
+
+private _displayText = [_idleText, _lockedText] select (_haveLock && _lockedText != "");
+private _laserColor = [[1, 0, 0, 0.25], [1, 0, 0, 0.75]] select _haveLock;
+
+if (_displayText == "") then {
+ [
+ ["SPACER", "", []],
+ ["SPACER", "", []],
+ ["SPACER", "", []],
+ ["SPACER", "", []],
+ ["TEXT", format ["CODE: %1", _laserCode], [1, 1, 1]],
+ ["ICON", "\a3\Ui_F_Curator\Data\CfgCurator\laser_ca.paa", _laserColor]
+ ]
+} else {
+ [
+ ["TEXT", _displayText, [1, 1, 1]],
+ ["SPACER", "", []],
+ ["TEXT", format ["CODE: %1", _laserCode], [1, 1, 1]],
+ ["ICON", "\a3\Ui_F_Curator\Data\CfgCurator\laser_ca.paa", _laserColor]
+ ]
+}
+
diff --git a/addons/missile_hud/functions/fnc_isElementValid.sqf b/addons/missile_hud/functions/fnc_isElementValid.sqf
new file mode 100644
index 00000000000..e51263c639e
--- /dev/null
+++ b/addons/missile_hud/functions/fnc_isElementValid.sqf
@@ -0,0 +1,33 @@
+#include "..\script_component.hpp"
+/*
+ * Author: tcvm
+ * Returns if an element array is valid.
+ *
+ * Arguments:
+ * 0: Element array
+ *
+ * Return Value:
+ * If array is valid format
+ *
+ * Example:
+ * [["TEXT", "My Test", [1, 0.4, 5]]] call ace_missile_hud_fnc_isElementValid
+ *
+ * Public: Yes
+ */
+
+params ["_elementArray"];
+TRACE_1("isElementValid",_elementArray);
+
+if !(_elementArray isEqualTypeArray ["", "", []]) exitWith { TRACE_1("Invalid - Types not equal",_elementArray); false };
+_elementArray params ["_type", "_str", "_color"];
+if !(_type in ["TEXT", "ICON", "SPACER"]) exitWith { TRACE_1("Invalid - Element Type not supported",_type); false };
+private _success = if (_type != "SPACER") then {
+ if !((_color isEqualTypeArray [0, 0, 0]) || (_color isEqualTypeArray [0, 0, 0, 0])) exitWith { TRACE_1("Invalid - Color not number",_color); false };
+ if (-1 != _color findIf { _x > 1 || _x < 0 }) exitWith { TRACE_1("Invalid - Color not in range [0, 1]",_color); false };
+ true
+};
+if !(_success) exitWith { false };
+
+TRACE_3("Valid - All checks pass",_type,_str,_color);
+
+true
diff --git a/addons/missile_hud/functions/fnc_registerDefaultHud.sqf b/addons/missile_hud/functions/fnc_registerDefaultHud.sqf
new file mode 100644
index 00000000000..5d8a9880e69
--- /dev/null
+++ b/addons/missile_hud/functions/fnc_registerDefaultHud.sqf
@@ -0,0 +1,94 @@
+#include "..\script_component.hpp"
+/*
+ * Author: tcvm
+ * Register default HUD for most missiles.
+ *
+ * Arguments:
+ * Nothing
+ *
+ * Return Value:
+ * Nothing
+ *
+ * Example:
+ * [] call ace_missile_hud_fnc_registerDefaultHud
+ *
+ * Public: No
+ */
+
+[{
+ params ["_unit", "_vehicle", "_weapon"];
+ private _turretPath = _unit call CBA_fnc_turretPath;
+ if (_unit == driver _vehicle) then {
+ _turretPath = [-1];
+ };
+ private _pylons = (getAllPylonsInfo _vehicle) select { (_x select 2) isEqualTo _turretPath };
+ private _hasAttackMode = false;
+ scopeName "cond";
+ {
+ _x params ["", "", "", "_magazine"];
+ private _ammo = getText (configFile >> "CfgMagazines" >> _magazine >> "ammo");
+ private _ammoConfig = configFile >> "CfgAmmo" >> _ammo >> "ace_missileguidance";
+ private _attackProfiles = getArray (_ammoConfig >> "attackProfiles");
+ private _seeker = getText (_ammoConfig >> "defaultSeekerType");
+ private _hudFnc = getText (configFile >> QEGVAR(missileguidance,SeekerTypes) >> _seeker >> "hudInfo");
+ if (_hudFnc != "") exitWith { _hasAttackMode = true; };
+
+ {
+ private _config = configFile >> QEGVAR(missileguidance,AttackProfiles) >> _x;
+ if (getText (_config >> "name") != "" || getText (_config >> "nameLocked") != "" || _hudFnc != "") exitWith {
+ _hasAttackMode = true;
+ breakTo "cond";
+ }
+ } forEach _attackProfiles;
+ } forEach _pylons;
+ _hasAttackMode
+}, {
+ params ["_unit", "_vehicle", "_weapon"];
+ private _magazineDetails = createHashMap;
+
+ private _turretPath = _unit call CBA_fnc_turretPath;
+ if (_unit == driver _vehicle) then {
+ _turretPath = [-1];
+ };
+ private _pylons = (getAllPylonsInfo _vehicle) select { (_x select 2) isEqualTo _turretPath };
+ {
+ _x params ["", "", "", "_magazine"];
+ private _ammo = getText (configFile >> "CfgMagazines" >> _magazine >> "ammo");
+ private _ammoConfig = configFile >> "CfgAmmo" >> _ammo >> "ace_missileguidance";
+ private _defaultAttackProfile = getText (_ammoConfig >> "defaultAttackProfile");
+ private _attackProfiles = getArray (_ammoConfig >> "attackProfiles");
+ private _seeker = getText (_ammoConfig >> "defaultSeekerType");
+ private _hudFnc = getText (configFile >> QEGVAR(missileguidance,SeekerTypes) >> _seeker >> "hudInfo");
+ private _modes = createHashMap;
+ {
+ private _config = configFile >> QEGVAR(missileguidance,AttackProfiles) >> _x;
+ _modes set [_x, [getText (_config >> "name"), getText (_config >> "nameLocked")]];
+ } forEach _attackProfiles;
+
+ _magazineDetails set [_magazine, [_modes, _defaultAttackProfile, _hudFnc, _ammoConfig]];
+ } forEach _pylons;
+
+ [_magazineDetails]
+}, {
+ params ["_unit", "_vehicle", "_weapon", "_params"];
+ _params params ["_magazineDetails"];
+ private _turretPath = _unit call CBA_fnc_turretPath;
+ if (_unit == driver _vehicle) then {
+ _turretPath = [-1];
+ };
+ private _magazine = _vehicle currentMagazineTurret _turretPath;
+ if !(_magazine in _magazineDetails) exitWith { [] };
+ (_magazineDetails get _magazine) params ["_modes", "_defaultAttackProfile", "_hudFnc", "_ammoConfig"];
+
+ private _mode = _vehicle getVariable [QEGVAR(missileguidance,attackProfile), _defaultAttackProfile];
+ (_modes getOrDefault [_mode, ["", ""]]) params ["_idleDisplay", "_lockedDisplay"];
+ if (_idleDisplay == "" && _hudFnc == "") exitWith { [] };
+
+ private _hud = [];
+ if (_hudFnc != "") then {
+ _hud = [_idleDisplay, _lockedDisplay, _unit, _vehicle, _ammoConfig] call (missionNamespace getVariable [_hudFnc, { [] }]);
+ } else {
+ _hud = ["TEXT", _idleDisplay, [1, 1, 1]];
+ };
+ _hud
+}] call FUNC(registerElement);
\ No newline at end of file
diff --git a/addons/missile_hud/functions/fnc_registerElement.sqf b/addons/missile_hud/functions/fnc_registerElement.sqf
new file mode 100644
index 00000000000..091a30e5c5e
--- /dev/null
+++ b/addons/missile_hud/functions/fnc_registerElement.sqf
@@ -0,0 +1,31 @@
+#include "..\script_component.hpp"
+/*
+ * Author: tcvm
+ * Register an element which will be drawn when the HUD is displayed.
+ *
+ * Setup and condition function are called every time the HUD appears
+ * Arguments to condition and setup function are `[player, vehicle, weapon]`
+ * Arguments to generator function are `[player, vehicle, weapon, additional]` where `additional` is whatever was returned from the setup function
+ * Generator function creates elements of type ["TEXT", "My Text", [r, g, b]] or ["ICON", "/path/to/icon", [r, g, b]]
+ * Generator function returns array of elements which will be grouped on the same line. If the line overflows, the line will break to fit.
+ *
+ * Arguments:
+ * 0: Setup Condition
+ * 1: Setup Function
+ * 2: Generator function
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * [{ params ["_unit", "_vehicle"]; _unit == gunner _vehicle }, { [_this, 123] }, { params ["_vars", "_myVar"]; ["TEXT", format ["Hello, world! %1", _myVar], [1, 0, 0]] }] call ace_missile_hud_fnc_registerElement
+ *
+ * Public: Yes
+ */
+
+params ["_condition", "_setup", "_generator"];
+TRACE_2("registerElement",_condition,_generator);
+
+GVAR(generators) pushBack [_condition, _setup, _generator];
+[ACE_PLAYER] call FUNC(showVehicleHud);
+
diff --git a/addons/missile_hud/functions/fnc_shouldAdjustHud.sqf b/addons/missile_hud/functions/fnc_shouldAdjustHud.sqf
new file mode 100644
index 00000000000..119437fc83f
--- /dev/null
+++ b/addons/missile_hud/functions/fnc_shouldAdjustHud.sqf
@@ -0,0 +1,27 @@
+#include "..\script_component.hpp"
+/*
+ * Author: tcvm
+ * Whether or not we should adjust the HUD element down.
+ *
+ * Arguments:
+ * 0: Player
+ * 1: Vehicle
+ * 2: Turret Path (Optional)
+ *
+ * Return Value:
+ * Whether or not to adjust hud
+ *
+ * Example:
+ * [player, player, [0]] call ace_missile_hud_fnc_shouldAdjustHud
+ *
+ * Public: No
+ */
+params ["_player", "_vehicle", ["_turretPath", [-1]]];
+
+private _adjustDown = false;
+// Flares display will block ours, if present just move ours down a bit
+{
+ if ((getText (configFile >> "CfgWeapons" >> _x >> "simulation")) == "cmlauncher") exitWith {_adjustDown = true};
+} forEach (_vehicle weaponsTurret _turretPath);
+
+_adjustDown
\ No newline at end of file
diff --git a/addons/missile_hud/functions/fnc_showVehicleHud.sqf b/addons/missile_hud/functions/fnc_showVehicleHud.sqf
new file mode 100644
index 00000000000..1468924d691
--- /dev/null
+++ b/addons/missile_hud/functions/fnc_showVehicleHud.sqf
@@ -0,0 +1,148 @@
+#include "..\script_component.hpp"
+/*
+ * Author: PabstMirror, tcvm
+ * Shows the missile info hud when data is available to be shown.
+ *
+ * Arguments:
+ * 0: Player
+ *
+ * Return Value:
+ * Nothing
+ *
+ * Example:
+ * [player] call ace_missile_hud_fnc_showVehicleHud
+ *
+ * Public: No
+ */
+
+params ["_player"];
+TRACE_1("showHud",_player);
+
+if !(alive _player) exitWith {TRACE_1("Disabled - Not Alive",_player);};
+
+private _vehicle = vehicle _player;
+private _turretPath = [-1];
+if (_player != driver _vehicle) then {
+ _turretPath = _player call CBA_fnc_turretPath;
+};
+private _weapon = [_player, _vehicle, _turretPath] call FUNC(getCurrentWeapon);
+private _enabled = -1 != GVAR(generators) findIf { [_player, _vehicle, _weapon] call (_x select 0) };
+
+if ((!_enabled) && (GVAR(pfID) < 0)) exitWith {TRACE_2("Disabled - No Change",_enabled,GVAR(pfID));};
+
+TRACE_2("Cleaning up old pfeh and display",_enabled,GVAR(pfID));
+[GVAR(pfID)] call CBA_fnc_removePerFrameHandler;
+if (!isNull (uiNamespace getVariable [QGVAR(display), displayNull])) then {
+ ([QGVAR(infoDisplay)] call BIS_fnc_rscLayer) cutText ["", "PLAIN"];
+};
+GVAR(pfID) = -1;
+
+if (!_enabled) exitWith {TRACE_2("Disabled - Now Off",_enabled,GVAR(pfID));};
+
+TRACE_2("Enabled - Adding PFEH",_enabled,GVAR(pfID));
+
+private _adjustDown = [_player, _vehicle, _turretPath] call FUNC(shouldAdjustHud);
+
+TRACE_4("",_adjustDown,_player,_vehicle,_turretPath);
+
+private _generators = GVAR(generators) select { [_player, _vehicle] call (_x select 0) };
+_generators = _generators apply {
+ _x params ["", "_setup", "_generator"];
+ [_generator, [_player, _vehicle] call _setup]
+};
+
+TRACE_2("Running - Some generators are valid",count _generators,count GVAR(generators));
+
+private _linePosition = [
+ getNumber (GVAR(config_line) >> "x"),
+ getNumber (GVAR(config_line) >> "y") + GVAR(lineHeight)
+];
+
+GVAR(pfID) = [{
+ params ["_args", "_pfID"];
+ _args params ["_generators", "_adjustDown", "_player", "_vehicle", "_weapon", "_basePosition"];
+
+ // Restart display if null (not just at start, this will happen periodicly)
+ if (isNull (uiNamespace getVariable [QGVAR(display), displayNull])) then {
+ TRACE_1("creating display",_this);
+ ([QGVAR(infoDisplay)] call BIS_fnc_rscLayer) cutRsc [QGVAR(infoDisplay), "PLAIN", 1, false];
+ if (_adjustDown) then {
+ _basePosition set [1, (_basePosition select 1) + GVAR(lineHeight)];
+ _args set [5, _basePosition];
+ };
+ };
+ private _display = uiNamespace getVariable [QGVAR(display), displayNull];
+ if (isNull _display) exitWith {
+ TRACE_1("Aborting - Display is null, somehow?",_display);
+ [_pfID] call CBA_fnc_removePerFrameHandler;
+ };
+ private _lines = _display getVariable [QGVAR(lines), []];
+ {
+ ctrlDelete _x;
+ } forEach _lines;
+
+ private _elements = [];
+ {
+ _x params ["_generator", "_params"];
+ private _group = [_player, _vehicle, _weapon, _params] call _generator;
+
+ if (isNil "_group") then { TRACE_1("Skipping - generator returned null group",_generator); continue; };
+ if !(_group isEqualType []) then { TRACE_1("Skipping - generator did not return array",_group); continue; };
+ if (_group isEqualTo []) then { TRACE_1("Skipping - generator did not return any elements",_group); continue; };
+ if ((_group select 0) isEqualType "") then {
+ if !([_group] call FUNC(isElementValid)) then { TRACE_1("Skipping - Some element is not valid",_group); continue; };
+ _elements pushBack [_group];
+ } else {
+ if (-1 != _group findIf { !([_x] call FUNC(isElementValid)) }) then { TRACE_1("Skipping - Some element is not valid",_group); continue; };
+ _elements pushBack _group;
+ };
+ } forEach _generators;
+
+ _lines = [];
+ private _linePosition = +_basePosition;
+ {
+ // Create new line
+ private _line = _display ctrlCreate [GVAR(config_line), -1];
+ _line ctrlShow true;
+ _line ctrlSetPosition _linePosition;
+ _line ctrlCommit 0;
+
+ private _drawPosition = [0, 0];
+ private _nonOverflowIndex = 0;
+ {
+ private _control = [_display, _line, _x] call FUNC(createCtrlFromElement);
+ private _width = ctrlTextWidth _control;
+ _width = ceil (_width / GVAR(itemWidth)) * GVAR(itemWidth);
+
+ // If we overflow, create a new line for next element
+ // If we are the first element being added, add us to the row. Otherwise, dont
+ if (_forEachIndex != _nonOverflowIndex && (_drawPosition select 0) + _width > GVAR(lineWidth)) then {
+ ctrlDelete _control;
+
+ _linePosition = _linePosition vectorAdd [0, GVAR(lineHeight)];
+ _lines pushBack _line;
+
+ _line = _display ctrlCreate [GVAR(config_line), -1];
+ _line ctrlShow true;
+ _line ctrlSetPosition _linePosition;
+ _line ctrlCommit 0;
+
+ _control = [_display, _line, _x] call FUNC(createCtrlFromElement);
+ _width = ctrlTextWidth _control;
+ _nonOverflowIndex = _forEachIndex + 1;
+
+ _drawPosition = [0, 0];
+ };
+ _control ctrlSetPosition _drawPosition;
+ _control ctrlSetPositionW _width;
+ _control ctrlShow true;
+ _control ctrlCommit 0;
+ _drawPosition = _drawPosition vectorAdd [_width, 0];
+ } forEach _x;
+ _lines pushBack _line;
+
+ _linePosition = _linePosition vectorAdd [0, GVAR(lineHeight)];
+ } forEach _elements;
+
+ _display setVariable [QGVAR(lines), _lines];
+}, (HUD_UPDATE_RATE), [_generators, _adjustDown, _player, _vehicle, _weapon, _linePosition]] call CBA_fnc_addPerFrameHandler;
diff --git a/addons/missile_hud/script_component.hpp b/addons/missile_hud/script_component.hpp
new file mode 100644
index 00000000000..8c5792931e1
--- /dev/null
+++ b/addons/missile_hud/script_component.hpp
@@ -0,0 +1,20 @@
+#define COMPONENT missile_hud
+#define COMPONENT_BEAUTIFIED Missile HUD
+#include "\z\ace\addons\main\script_mod.hpp"
+
+// #define DEBUG_MODE_FULL
+// #define DISABLE_COMPILE_CACHE
+// #define ENABLE_PERFORMANCE_COUNTERS
+
+#ifdef DEBUG_ENABLED_MISSILE_HUD
+ #define DEBUG_MODE_FULL
+#endif
+
+#ifdef DEBUG_SETTINGS_MISSILE_HUD
+ #define DEBUG_SETTINGS DEBUG_SETTINGS_MISSILE_HUD
+#endif
+
+#include "\z\ace\addons\main\script_macros.hpp"
+#include "\a3\ui_f\hpp\defineResincl.inc"
+
+#define HUD_UPDATE_RATE 0.1
\ No newline at end of file
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..35f45f6671f
--- /dev/null
+++ b/addons/missile_manpad/stringtable.xml
@@ -0,0 +1,41 @@
+
+
+
+
+ FIM-92 Stinger [ACE]
+ FIM-92 スティンガー [ACE]
+ FIM-92 Stinger [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 [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 [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 Stinger [ACE]
+ 4x FIM-92 스팅어 [ACE]
+
+
+
diff --git a/addons/missile_sam/$PBOPREFIX$ b/addons/missile_sam/$PBOPREFIX$
new file mode 100644
index 00000000000..eb6208c34cf
--- /dev/null
+++ b/addons/missile_sam/$PBOPREFIX$
@@ -0,0 +1 @@
+z\ace\addons\missile_sam
\ No newline at end of file
diff --git a/addons/missile_sam/CfgAmmo.hpp b/addons/missile_sam/CfgAmmo.hpp
new file mode 100644
index 00000000000..080b2c2e325
--- /dev/null
+++ b/addons/missile_sam/CfgAmmo.hpp
@@ -0,0 +1,32 @@
+class EGVAR(missileguidance,type_Patriot);
+class EGVAR(missileguidance,type_ESSM);
+class EGVAR(missileguidance,type_S400);
+class CfgAmmo {
+ class ammo_Missile_mim145;
+ class GVAR(patriot): ammo_Missile_mim145 {
+ author = "Dani (TCVM)";
+ maneuvrability = 0;
+ class ace_missileguidance: EGVAR(missileguidance,type_Patriot) {
+ enabled = 1;
+ };
+ };
+
+ class ammo_Missile_rim162;
+ class GVAR(RIM162): ammo_Missile_rim162 {
+ author = "Dani (TCVM)";
+ maneuvrability = 0;
+ class ace_missileguidance: EGVAR(missileguidance,type_ESSM) {
+ enabled = 1;
+ };
+ };
+
+ class ammo_Missile_s750;
+ class GVAR(s400): ammo_Missile_s750 {
+ author = "Dani (TCVM)";
+ maneuvrability = 0;
+ class ace_missileguidance: EGVAR(missileguidance,type_S400) {
+ enabled = 1;
+ };
+ };
+};
+
diff --git a/addons/missile_sam/CfgMagazines.hpp b/addons/missile_sam/CfgMagazines.hpp
new file mode 100644
index 00000000000..3aeccfd99af
--- /dev/null
+++ b/addons/missile_sam/CfgMagazines.hpp
@@ -0,0 +1,20 @@
+class CfgMagazines {
+ class magazine_Missile_mim145_x4;
+ class GVAR(patriot): magazine_Missile_mim145_x4 {
+ displayName = CSTRING(patriot_missile);
+ ammo = QGVAR(patriot);
+ };
+
+ class magazine_Missile_rim162_x8;
+ class GVAR(RIM162): magazine_Missile_rim162_x8 {
+ displayName = CSTRING(essm_missile);
+ ammo = QGVAR(RIM162);
+ };
+
+ class magazine_Missile_s750_x4;
+ class GVAR(s400): magazine_Missile_s750_x4 {
+ displayName = CSTRING(s400_missile);
+ ammo = QGVAR(s400);
+ };
+};
+
diff --git a/addons/missile_sam/CfgVehicles.hpp b/addons/missile_sam/CfgVehicles.hpp
new file mode 100644
index 00000000000..8f539ae900f
--- /dev/null
+++ b/addons/missile_sam/CfgVehicles.hpp
@@ -0,0 +1,75 @@
+class CfgVehicles {
+ class LandVehicle;
+ class StaticWeapon: LandVehicle {
+ class Turrets;
+ };
+ class StaticMGWeapon: StaticWeapon {
+ class Turrets: Turrets {
+ class MainTurret;
+ };
+ };
+
+ // RIM-162
+ class SAM_System_02_base_F: StaticMGWeapon {
+ displayName = CSTRING(essm);
+ class AnimationSources {
+ class Missiles_revolving {
+ source = "revolving";
+ weapon = QGVAR(RIM162);
+ };
+ };
+ class Turrets: Turrets {
+ class MainTurret: MainTurret {
+ gunnerName = CSTRING(essm_operator);
+ weapons[] = {
+ QGVAR(RIM162)
+ };
+ magazines[] = {
+ QGVAR(RIM162)
+ };
+ };
+ };
+ };
+ // Patriot
+ class SAM_System_03_base_F: StaticMGWeapon {
+ displayName = CSTRING(patriot);
+ class AnimationSources {
+ class Missiles_revolving {
+ source = "revolving";
+ weapon = QGVAR(patriot);
+ };
+ };
+ class Turrets: Turrets {
+ class MainTurret: MainTurret {
+ gunnerName = CSTRING(patriot_operator);
+ weapons[] = {
+ QGVAR(patriot)
+ };
+ magazines[] = {
+ QGVAR(patriot)
+ };
+ };
+ };
+ };
+ // S-400
+ class SAM_System_04_base_F: StaticMGWeapon {
+ displayName = CSTRING(s400);
+ class AnimationSources {
+ class Missiles_revolving {
+ source = "revolving";
+ weapon = QGVAR(s400);
+ };
+ };
+ class Turrets: Turrets {
+ class MainTurret: MainTurret {
+ gunnerName = CSTRING(s400_operator);
+ weapons[] = {
+ QGVAR(s400)
+ };
+ magazines[] = {
+ QGVAR(s400)
+ };
+ };
+ };
+ };
+};
\ No newline at end of file
diff --git a/addons/missile_sam/CfgWeapons.hpp b/addons/missile_sam/CfgWeapons.hpp
new file mode 100644
index 00000000000..d367e9e0570
--- /dev/null
+++ b/addons/missile_sam/CfgWeapons.hpp
@@ -0,0 +1,26 @@
+class CfgWeapons {
+ class weapon_mim145Launcher;
+ class GVAR(patriot): weapon_mim145Launcher {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(patriot);
+ magazines[] = { QGVAR(patriot) };
+ weaponLockDelay = 0.5;
+ };
+
+ class weapon_rim162Launcher;
+ class GVAR(RIM162): weapon_rim162Launcher {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(essm);
+ magazines[] = { QGVAR(RIM162) };
+ weaponLockDelay = 0.5;
+ };
+
+ class weapon_s750Launcher;
+ class GVAR(s400): weapon_s750Launcher {
+ author = "Dani (TCVM)";
+ displayName = CSTRING(s400);
+ magazines[] = { QGVAR(s400) };
+ weaponLockDelay = 0.5;
+ };
+};
+
diff --git a/addons/missile_sam/README.md b/addons/missile_sam/README.md
new file mode 100644
index 00000000000..ec159b99322
--- /dev/null
+++ b/addons/missile_sam/README.md
@@ -0,0 +1,4 @@
+ace_missile_sam
+===================
+
+Adds MIM-104 Patriot, S-400, and RIM-162 missiles
diff --git a/addons/missile_sam/config.cpp b/addons/missile_sam/config.cpp
new file mode 100644
index 00000000000..d285b08cfc8
--- /dev/null
+++ b/addons/missile_sam/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_sam/script_component.hpp b/addons/missile_sam/script_component.hpp
new file mode 100644
index 00000000000..5e05890671c
--- /dev/null
+++ b/addons/missile_sam/script_component.hpp
@@ -0,0 +1,18 @@
+#define COMPONENT missile_sam
+#define COMPONENT_BEAUTIFIED SAM
+#include "\z\ace\addons\main\script_mod.hpp"
+
+// #define DEBUG_MODE_FULL
+// #define DISABLE_COMPILE_CACHE
+// #define ENABLE_PERFORMANCE_COUNTERS
+
+#ifdef DEBUG_ENABLED_MISSILE_SAM
+ #define DEBUG_MODE_FULL
+#endif
+
+#ifdef DEBUG_SETTINGS_MISSILE_SAM
+ #define DEBUG_SETTINGS DEBUG_SETTINGS_MISSILE_SAM
+#endif
+
+#include "\z\ace\addons\main\script_macros.hpp"
+
diff --git a/addons/missile_sam/stringtable.xml b/addons/missile_sam/stringtable.xml
new file mode 100644
index 00000000000..29cac22004d
--- /dev/null
+++ b/addons/missile_sam/stringtable.xml
@@ -0,0 +1,86 @@
+
+
+
+
+ Mk-29 ESSM
+ 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
+ RIM-162 ESSM
+
+
+ Mk-29 Operator
+ Mk-29 Operator
+ Operatore Mk-29
+ Mk-29 操作員
+ Mk-29 Operator
+ Mk-29 Bediener
+ 마크 29 조작병
+
+
+ MIM-104 Patriot
+ MIM-104 Patriot
+ MIM-104 Patriot
+ MIM-104 ペトリオット
+ MIM-104 Patriot
+ MIM-104 Patriot
+ MIM-104 패트리어트
+
+
+ Patriot Missile
+ Patriot Missile
+ Missile Patriot
+ ペトリオット ミサイル
+ Patriot Missile
+ Patriot Rakete
+ 패트리어트 미사일
+
+
+ MIM-104 Operator
+ MIM-104 Operator
+ Operatore MIM-104
+ MIM-104 操作員
+ MIM-104 Operator
+ MIM-104 Bediener
+ MIM-104 패트리어트 조작병
+
+
+ S-400
+ S-400
+ S-400
+ S-400
+ S-400
+ S-400
+ S-400 트리움프
+
+
+ S-400 Missile
+ S-400 Missile
+ Missile S-400
+ S-400 ミサイル
+ S-400 Missile
+ S-400 Rakete
+ S-400 트리움프 미사일
+
+
+ S-400 Operator
+ S-400 Operator
+ Operatore S-400
+ 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 f1ddb9825a5..5afe7a4bdf5 100644
--- a/addons/missile_vikhr/stringtable.xml
+++ b/addons/missile_vikhr/stringtable.xml
@@ -7,7 +7,8 @@
1x 9k121 Vikhr [ACE]
1x 9k121 Vikhr [ACE]
1x 9k121 Вихрь [ACE]
- 1x 9K121 비흐르 [ACE]
+ 1x 9k121 Vikhr [ACE]
+ 1x 9K121 베프리 [ACE]
1x 9k121 ヴィーフリ [ACE]
@@ -16,7 +17,8 @@
2x 9k121 Vikhr [ACE]
2x 9k121 Vikhr [ACE]
2x 9k121 Вихрь [ACE]
- 2x 9K121 비흐르 [ACE]
+ 2x 9k121 Vikhr [ACE]
+ 2x 9K121 베프리 [ACE]
2x 9k121 ヴィーフリ [ACE]
@@ -25,7 +27,8 @@
3x 9k121 Vikhr [ACE]
3x 9k121 Vikhr [ACE]
3x 9k121 Вихрь [ACE]
- 3x 9K121 비흐르 [ACE]
+ 3x 9k121 Vikhr [ACE]
+ 3x 9K121 베프리 [ACE]
3x 9k121 ヴィーフリ [ACE]
@@ -34,7 +37,8 @@
4x 9k121 Vikhr [ACE]
4x 9k121 Vikhr [ACE]
4x 9k121 Вихрь [ACE]
- 4x 9K121 비흐르 [ACE]
+ 4x 9k121 Vikhr [ACE]
+ 4x 9K121 베프리 [ACE]
4x 9k121 ヴィーフリ [ACE]
@@ -43,7 +47,8 @@
6x 9k121 Vikhr [ACE]
6x 9k121 Vikhr [ACE]
6x 9k121 Вихрь [ACE]
- 6x 9K121 비흐르 [ACE]
+ 6x 9k121 Vikhr [ACE]
+ 6x 9K121 베프리 [ACE]
6x 9k121 ヴィーフリ [ACE]
@@ -52,7 +57,8 @@
8x 9k121 Vikhr [ACE]
8x 9k121 Vikhr [ACE]
8x 9k121 Вихрь [ACE]
- 8x 9K121 비흐르 [ACE]
+ 8x 9k121 Vikhr [ACE]
+ 8x 9K121 베프리 [ACE]
8x 9k121 ヴィーフリ [ACE]
@@ -61,7 +67,8 @@
9k121 Vikhr [ACE]
9k121 Vikhr [ACE]
9k121 Вихрь [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 6917fc0420b..b7af58cdbfd 100644
--- a/addons/missileguidance/ACE_GuidanceConfig.hpp
+++ b/addons/missileguidance/ACE_GuidanceConfig.hpp
@@ -104,6 +104,22 @@ class GVAR(SeekerTypes) {
functionName = QFUNC(seekerType_GPS);
onFired = QFUNC(gps_seekerOnFired);
};
+ class IR {
+ name = "";
+ visualName = "";
+ description = "";
+
+ functionName = QFUNC(seekerType_IR);
+ onFired = QFUNC(IR_onFired);
+ };
+ class DopplerRadar {
+ name = "";
+ visualName = "";
+ description = "";
+
+ functionName = QFUNC(seekerType_Doppler);
+ onFired = QFUNC(doppler_onFired);
+ };
};
class GVAR(NavigationTypes) {
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 68a9586bb88..23cd320c67e 100644
--- a/addons/missileguidance/XEH_PREP.hpp
+++ b/addons/missileguidance/XEH_PREP.hpp
@@ -18,7 +18,7 @@ PREP(doSeekerSearch);
PREP(doHandoff);
PREP(handleHandoff);
-//re-enable after feature merge - PREP(shouldFilterRadarHit);
+PREP(shouldFilterRadarHit);
// Attack Profiles
PREP(attackProfile_AIR);
@@ -46,18 +46,21 @@ PREP(navigationType_direct);
PREP(seekerType_SALH);
PREP(seekerType_Optic);
PREP(seekerType_SACLOS);
-//re-enable after feature merge - PREP(seekerType_Doppler);
+PREP(seekerType_Doppler);
PREP(seekerType_MWR);
PREP(seekerType_GPS);
+PREP(seekerType_IR);
// Attack Profiles OnFired
PREP(wire_onFired);
PREP(gps_attackOnFired);
// Seeker OnFired
+PREP(doppler_onFired);
PREP(SACLOS_onFired);
PREP(mwr_onFired);
PREP(gps_seekerOnFired);
+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_doppler_onFired.sqf b/addons/missileguidance/functions/fnc_doppler_onFired.sqf
new file mode 100644
index 00000000000..7da86afa837
--- /dev/null
+++ b/addons/missileguidance/functions/fnc_doppler_onFired.sqf
@@ -0,0 +1,82 @@
+#include "..\script_component.hpp"
+/*
+ * Author: tcvm
+ * Sets up doppler radar state arrays (called from missileGuidance's onFired).
+ *
+ * Arguments:
+ * Guidance Arg Array
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * [] call ace_missileguidance_fnc_doppler_onFired
+ *
+ * Public: No
+ */
+
+params ["_firedEH", "_launchParams", "", "", "_stateParams"];
+_firedEH params ["_shooter","","","","","","_projectile"];
+_stateParams params ["", "_seekerStateParams"];
+_launchParams params ["","_targetLaunchParams"];
+_targetLaunchParams params ["_target"];
+
+private _vehicle = vehicle _shooter;
+if (isNull _target && isVehicleRadarOn _vehicle) then {
+ _target = cursorTarget;
+};
+// always allow tracking of projectiles
+if !(_target isKindOf "AllVehicles" || { (typeOf _target) isKindOf ["Default", configFile >> "CfgAmmo"] }) then {
+ _target = objNull;
+};
+_launchParams set [0, _target];
+_projectile setMissileTarget objNull; // to emulate a no launch warning
+
+private _projectileConfig = configOf _projectile;
+private _config = _projectileConfig >> "ace_missileguidance";
+
+private _isActive = false;
+private _activeRadarDistance = [_config >> "activeRadarEngageDistance", "NUMBER", 500] call CBA_fnc_getConfigEntry;
+private _projectileThrust = getNumber (_projectileConfig >> "thrust");
+private _projectileThrustTime = getNumber (_projectileConfig >> "thrustTime");
+
+private _lockTypes = [_config >> "lockableTypes", "ARRAY", ["Air", "LandVehicle", "Ship"]] call CBA_fnc_getConfigEntry;
+
+private _minimumFilterSpeed = [_config >> "minimumSpeedFilter", "NUMBER", 30] call CBA_fnc_getConfigEntry;
+private _minimumFilterTime = [_config >> "minimumTimeFilter", "NUMBER", 1e-4] call CBA_fnc_getConfigEntry;
+private _maxTerrainCheck = [_config >> "maxTerrainCheck", "NUMBER", 16000] call CBA_fnc_getConfigEntry;
+
+private _velocityAtImpact = _projectileThrust * _projectileThrustTime;
+private _timeToActive = 0;
+if (!isNull _target && _velocityAtImpact > 0) then {
+ private _distanceUntilActive = (((getPosASL _shooter) vectorDistance (getPosASL _target)) - _activeRadarDistance);
+ _timeToActive = 0 max (_distanceUntilActive / _velocityAtImpact);
+};
+
+if (isNull _target) then {
+ _timeToActive = 0;
+ _isActive = true;
+ _target = objNull;
+};
+
+private _shooterHasActiveRadar = (listVehicleSensors _vehicle) findIf {"ActiveRadarSensorComponent" in _x} != -1;
+
+if !(isVehicleRadarOn _vehicle) then {
+ _isActive = true;
+};
+
+_seekerStateParams set [0, _isActive];
+_seekerStateParams set [1, _activeRadarDistance];
+_seekerStateParams set [2, CBA_missionTime + _timeToActive];
+_seekerStateParams set [3, getPosASL _target];
+_seekerStateParams set [4, CBA_missionTime];
+_seekerStateParams set [5, _shooterHasActiveRadar];
+_seekerStateParams set [6, false];
+_seekerStateParams set [7, [0, 0, 0]];
+_seekerStateParams set [8, CBA_missionTime];
+_seekerStateParams set [9, isNull _target];
+_seekerStateParams set [10, _lockTypes];
+_seekerStateParams set [11, _minimumFilterSpeed];
+_seekerStateParams set [12, _minimumFilterTime];
+_seekerStateParams set [13, _maxTerrainCheck];
+
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
new file mode 100644
index 00000000000..e44ff2081f2
--- /dev/null
+++ b/addons/missileguidance/functions/fnc_seekerType_Doppler.sqf
@@ -0,0 +1,154 @@
+#include "..\script_component.hpp"
+/*
+ * Author: tcvm
+ * doppler radar seeker
+ *
+ * Arguments:
+ * 1: Guidance Arg Array
+ * 2: Seeker State
+ *
+ * Return Value:
+ * Seeker Pos
+ *
+ * Example:
+ * [] call call ace_missileguidance_fnc_seekerType_Doppler;
+ *
+ * Public: No
+ */
+params ["", "_args", "_seekerStateParams", "", "_timestep"];
+_args params ["_firedEH", "_launchParams", "", "_seekerParams", "_stateParams", "_targetData"];
+_firedEH params ["_shooter","","","","","","_projectile"];
+_launchParams params ["_target","","","",""];
+_seekerParams params ["_seekerAngle", "", "_seekerMaxRange"];
+_seekerStateParams params ["_isActive", "_activeRadarEngageDistance", "_timeWhenActive", "_expectedTargetPos", "_lastTargetPollTime", "_shooterHasRadar", "_wasActive", "_lastKnownVelocity", "_lastTimeSeen", "_doesntHaveTarget", "_lockTypes", "_minimumFilterSpeed", "_minimumFilterTime", "_maxTerrainCheck"];
+
+if (_isActive || { CBA_missionTime >= _timeWhenActive }) then {
+ if !(_isActive) then {
+ _seekerStateParams set [0, true];
+ };
+ if !(_wasActive) then {
+ _seekerStateParams set [6, true];
+ TRACE_1("Missile Pitbull",_seekerStateParams);
+ };
+
+ // if we are tracking a projectile, don't bother with radar crap just fly to it
+ if (isNull _target || { !((typeOf _target) isKindOf ["Default", configFile >> "CfgAmmo"]) }) then {
+ // Internal radar homing
+ // For performance reasons only poll for target every so often instead of each frame
+ if ((_lastTargetPollTime + ACTIVE_RADAR_POLL_FREQUENCY) - CBA_missionTime < 0) then {
+ private _searchPos = _expectedTargetPos;
+ if (_searchPos isEqualTo [0, 0, 0] || { _doesntHaveTarget }) then {
+ _seekerStateParams set [9, true];
+ // no target pos - shot without lock. Have the missile's radar search infront of it on the ground
+ _searchPos = (getPosASL _projectile) vectorAdd (_projectile vectorModelToWorld [0, _seekerMaxRange, -((getPos _projectile)#2)]);
+ };
+
+ _target = objNull;
+ _lastTargetPollTime = CBA_missionTime;
+ _seekerStateParams set [4, _lastTargetPollTime];
+ private _distanceToExpectedTarget = _seekerMaxRange min ((getPosASL _projectile) vectorDistance _searchPos);
+
+ // Simulate how much the seeker can see at the ground
+ private _projDir = vectorDir _projectile;
+ private _projYaw = getDir _projectile;
+ private _rotatedYaw = (+(_projDir select 0) * sin _projYaw) + (+(_projDir select 1) * cos _projYaw);
+ if (_rotatedYaw isEqualTo 0) then { _rotatedYaw = 0.001 };
+ private _projPitch = atan ((_projDir select 2) / _rotatedYaw);
+ private _a1 = abs _projPitch;
+ private _a2 = 180 - ((_seekerAngle / 2) + _a1);
+ private _seekerBaseRadiusAtGround = ACTIVE_RADAR_MINIMUM_SCAN_AREA max (_distanceToExpectedTarget / sin(_a2) * sin(_seekerAngle / 2));
+
+ private _seekerBaseRadiusAdjusted = linearConversion [0, _seekerBaseRadiusAtGround, (CBA_missionTime - _lastTimeSeen) * vectorMagnitude _lastKnownVelocity, ACTIVE_RADAR_MINIMUM_SCAN_AREA, _seekerBaseRadiusAtGround, false];
+ if (_doesntHaveTarget) then {
+ _seekerBaseRadiusAdjusted = _seekerBaseRadiusAtGround;
+ };
+ // Look in front of seeker for any targets
+ private _nearestObjects = nearestObjects [ASLToAGL _searchPos, _lockTypes, _seekerBaseRadiusAdjusted, false];
+ _nearestObjects = _nearestObjects select {
+ // If target within angle AND we can see target AND we shouldn't filter target, then target is a candidate
+ [_projectile, getPosASL _x, _seekerAngle] call FUNC(checkSeekerAngle) && {
+ // I check both Line of Sight versions to make sure that a single bush doesnt make the target lock dissapear but at the same
+ // time ensure that this can see through smoke
+ ([_projectile, _x, true] call FUNC(checkLos)) || { ([_projectile, _x, false] call FUNC(checkLos)) }
+ } && {
+ !([_x, _projectile, _minimumFilterSpeed, _minimumFilterTime, _maxTerrainCheck, _seekerAngle] call FUNC(shouldFilterRadarHit))
+ }
+ };
+ // Select closest object to the expected position to be the current radar target
+ if (_nearestObjects isEqualTo []) exitWith {
+ _projectile setMissileTarget objNull;
+ _seekerStateParams set [3, _searchPos];
+ _searchPos
+ };
+ private _closestDistance = _seekerBaseRadiusAtGround;
+ {
+ if ((_x distance2D _searchPos) < _closestDistance) then {
+ _closestDistance = _x distance2D _searchPos;
+ _target = _x;
+ };
+ } forEach _nearestObjects;
+
+ _expectedTargetPos = _searchPos;
+ };
+ };
+} else {
+ if (GVAR(debug_drawGuidanceInfo)) then {
+ _seekerTypeName = "DOPPLER - EXT"; //IGNORE_PRIVATE_WARNING ["_seekerTypeName"]; // from doSeekerSearch
+ };
+ // External radar homing
+ // if the target is in the remote targets for the side, whoever the donor is will "datalink" the target for the hellfire.
+ private _remoteTargets = listRemoteTargets side _shooter;
+ if ((_remoteTargets findIf { (_target in _x) && (_x#1 > 0) }) == -1) then {
+ // I check both Line of Sight versions to make sure that a single bush doesnt make the target lock dissapear but at the same time ensure that this can see through smoke. Should work 80% of the time
+ private _vehicle = vehicle _shooter;
+ if (!_shooterHasRadar || { !isVehicleRadarOn _vehicle } || { !alive _vehicle } || { !([_vehicle, _target, true] call FUNC(checkLOS)) && { !([_vehicle, _target, false] call FUNC(checkLOS)) } }) then {
+ _seekerStateParams set [0, true];
+ _target = objNull; // set up state for active guidance
+ };
+ };
+};
+
+if (GVAR(debug_drawGuidanceInfo)) then {
+ drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,0,1], ASLToAGL _expectedTargetPos, 0.75, 0.75, 0, "expected target pos", 1, 0.025, "TahomaB"];
+};
+
+if !(isNull _target) then {
+ // we check if the target is moving away from us or perpendicular to see if we maintain lock
+ private _centerOfObject = getCenterOfMass _target;
+ private _targetAdjustedPos = _target modelToWorldVisualWorld _centerOfObject;
+ _expectedTargetPos = _targetAdjustedPos;
+
+ if ([_target, _projectile, _minimumFilterSpeed, _minimumFilterTime, _maxTerrainCheck, _seekerAngle] call FUNC(shouldFilterRadarHit)) then {
+ // filter out target
+ _target = objNull;
+ _seekerStateParams set [9, true];
+ } else {
+ private _lineOfSight = vectorDirVisual _projectile;
+ private _realTargetVelocity = velocity _target;
+ private _projectedTargetVelocity = _lineOfSight vectorMultiply (_realTargetVelocity vectorDotProduct _lineOfSight);
+ private _relativeTargetVelocity = _realTargetVelocity vectorDiff _projectedTargetVelocity;
+
+ _seekerStateParams set [7, _relativeTargetVelocity];
+ _seekerStateParams set [8, CBA_missionTime];
+ _seekerStateParams set [9, false];
+
+ _targetData set [2, _projectile distance _target];
+ _targetData set [3, _relativeTargetVelocity];
+
+ if (_timestep != 0) then {
+ private _acceleration = (_relativeTargetVelocity vectorDiff _lastKnownVelocity) vectorMultiply (1 / _timestep);
+ _targetData set [4, _acceleration];
+ };
+ };
+ _projectile setMissileTarget _target;
+};
+
+if (_expectedTargetPos isEqualTo [0, 0, 0]) then {
+ _expectedTargetPos = (getPosASLVisual _projectile) vectorAdd velocity _projectile;
+};
+
+_targetData set [0, (getPosASLVisual _projectile) vectorFromTo _expectedTargetPos];
+
+_seekerStateParams set [3, _expectedTargetPos];
+_launchParams set [0, _target];
+_expectedTargetPos
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
new file mode 100644
index 00000000000..aec7d62a28a
--- /dev/null
+++ b/addons/missileguidance/functions/fnc_shouldFilterRadarHit.sqf
@@ -0,0 +1,122 @@
+#include "..\script_component.hpp"
+/*
+ * Author: tcvm
+ * Whether or not we should filter out this target due to masking. Useful for only doppler radar types
+ *
+ * Arguments:
+ * 0: Target
+ * 1: Projectile
+ * 2: Minimum speed for doppler return to filter out
+ * 3: Minimum time for doppler return to filter out
+ * 4: Maximum distance to check for terrain
+ * 5: Radar seeker angle
+ *
+ * Return Value:
+ * Whether or not to filter out this target
+ *
+ * Example:
+ * [] call call ace_missileguidance_fnc_shouldFilterRadarHit;
+ *
+ * Public: Yes
+ */
+// as defined by lineIntersectsSurfaces
+#define MAX_LINE_DISTANCE 5000
+
+params ["_target", "_projectile", "_minimumSpeed", "_minimumTime", "_maximumTerrainCheck", "_seekerAngle"];
+TRACE_5("should filter target",_projectile,_target,_minimumSpeed,_minimumTime,_maximumTerrainCheck);
+// Theory developed from doppler radar visuals at https://www.mudspike.com/dcs-f-15c-combat-guide-for-beginners/
+
+// helicopter blades will always produce a doppler shift due to their nature. Don't filter
+if (_target isKindOf "Helicopter" && isEngineOn _target) exitWith {
+ TRACE_1("dont filter helicopters",_target);
+ false
+};
+
+private _lineOfSight = (getPosASLVisual _projectile) vectorFromTo (getPosASLVisual _target);
+private _realTargetVelocity = velocity _target;
+private _closingVelocity = _lineOfSight vectorMultiply (_realTargetVelocity vectorDotProduct _lineOfSight);
+private _closingSpeed = vectorMagnitude _closingVelocity;
+
+// if relative target velocity is greather than threshold, we can easily see it. Don't filter
+if (_closingSpeed > _minimumSpeed) exitWith {
+ TRACE_2("dont filter fast objects approaching",_closingSpeed,_minimumSpeed);
+ false
+};
+
+private _projectilePos = getPosASLVisual _projectile;
+
+private _stepDistance = _lineOfSight vectorMultiply (MAX_LINE_DISTANCE min _maximumTerrainCheck);
+
+private _checkPos = _projectilePos;
+private _maskedByGround = false;
+
+// Check for all surfaces until we reach our max range
+for "_i" from 0 to _maximumTerrainCheck step MAX_LINE_DISTANCE do {
+ // determine if target is masked by ground
+ private _endPos = _checkPos vectorAdd _stepDistance;
+ private _groundHit = lineIntersectsSurfaces [_checkPos, _endPos, _projectile, _target];
+
+ _maskedByGround = _groundHit isNotEqualTo [];
+
+ _checkPos = _endPos;
+
+ if (_maskedByGround || (_checkPos select 2) <= 0) then {
+ // for ease assume that we can't check underwater
+ if ((_checkPos select 2) < 0) then {
+ _checkPos set [2, 0];
+ };
+ break
+ };
+};
+
+// looking at sky, target is clear as day. Check for chaff before filtering
+if !(_maskedByGround) exitWith {
+ TRACE_1("dont filter stuff in the sky",_maskedByGround);
+
+ // If there is chaff nearby, check if they will confuse missile
+ private _nearby = _target nearObjects 50;
+ _nearby = _nearby select {
+ // 8 = radar blocking
+ (([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
+ };
+
+ private _foundDecoy = false;
+ {
+ private _considering = false;
+ if !(_foundDecoy) then {
+ _considering = true;
+ if (0.95 <= random 1) then {
+ _foundDecoy = true;
+ };
+ };
+
+ if (GVAR(debug_drawGuidanceInfo)) then {
+ private _chaffPos = ASLToAGL getPosASLVisual _x;
+ private _colour = [1, 0, 0, 1];
+ if (_considering) then {
+ _colour = [0, 1, 0, 1];
+ };
+ if (_foundDecoy) then {
+ _colour = [0, 0, 1, 1];
+ };
+ drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", _colour, _chaffPos, 0.75, 0.75, 0, "C", 1, 0.025, "TahomaB"];
+ };
+ } forEach _nearby;
+
+ _foundDecoy
+};
+
+private _distanceToTerrain = _checkPos vectorDistance _projectilePos;
+private _checkTime = _distanceToTerrain / 3e8;
+
+// Time to ground is large enough to know if we are looking at a target, don't filter
+if (_checkTime > _minimumTime) exitWith {
+ TRACE_2("dont filter targets that we can see in ground clutter",_checkTime,_minimumTime);
+ false
+};
+
+// filter out the target since we can't reasonably see it
+true
+
diff --git a/addons/missileguidance/stringtable.xml b/addons/missileguidance/stringtable.xml
index b2e10623822..e8c7f1c2735 100644
--- a/addons/missileguidance/stringtable.xml
+++ b/addons/missileguidance/stringtable.xml
@@ -136,6 +136,7 @@
12x DAGR [ACE]
12x DAGR [ACE]
12x DAGR [ACE]
+ 12x DAGR [ACE]
12x DAGR [ACE]
12x DAGR [ACE]
@@ -145,6 +146,7 @@
24x DAGR [ACE]
24x DAGR [ACE]
24x DAGR [ACE]
+ 24x DAGR [ACE]
24x DAGR [ACE]
24x DAGR [ACE]
@@ -154,6 +156,7 @@
6x DAGR [ACE]
6x DAGR [ACE]
6x DAGR [ACE]
+ 6x DAGR [ACE]
6x DAGR [ACE]
6x DAGR [ACE]
diff --git a/addons/nightvision/XEH_postInit.sqf b/addons/nightvision/XEH_postInit.sqf
index 8979f3f9ab9..562ef2fb46d 100644
--- a/addons/nightvision/XEH_postInit.sqf
+++ b/addons/nightvision/XEH_postInit.sqf
@@ -37,6 +37,7 @@ GVAR(isUsingMagnification) = false;
["unit", {
// Call manually to update existing value
+ GVAR(playerHMD) = hmd ace_player;
[] call FUNC(refreshGoggleType);
}, true] call CBA_fnc_addPlayerEventHandler;
diff --git a/addons/nightvision/stringtable.xml b/addons/nightvision/stringtable.xml
index c649c526d24..05302735949 100644
--- a/addons/nightvision/stringtable.xml
+++ b/addons/nightvision/stringtable.xml
@@ -254,6 +254,7 @@
NS-Brille (3. Generation, Schwarz, WP)
야투경 (3세대, 검정, 백색광)
NVゴーグル (第3世代、ブラック、白色蛍光)
+ 夜视仪(三代,黑色, 白磷)
NV Goggles (Gen3, Brown)
@@ -283,6 +284,7 @@
NS-Brille (3. Generation, Braun, WP)
야투경 (3세대, 갈색, 백색광)
NVゴーグル (第3世代、ブラウン、白色蛍光)
+ 夜视仪(三代,棕色, 白磷)
NV Goggles (Gen3, Green)
@@ -312,6 +314,7 @@
NS-Brille (3. Generation, Grün, WP)
야투경 (3세대, 녹색, 백색광)
NVゴーグル (第3世代、グリーン、白色蛍光)
+ 夜视仪(三代,绿色, 白磷)
NV Goggles (Gen4, Black)
@@ -337,6 +340,7 @@
NS-Brille (4. Generation, Schwarz, WP)
야투경 (4세대, 검정, 백색광)
NVゴーグル (第4世代、ブラック、白色蛍光)
+ 夜视仪(四代,黑色, 白磷)
NV Goggles (Gen4, Brown)
@@ -362,6 +366,7 @@
NS-Brille (4. Generation, Braun, WP)
야투경 (4세대, 갈색, 백색광)
NVゴーグル (第4世代、ブラウン、白色蛍光)
+ 夜视仪(四代,棕色, 白磷)
NV Goggles (Gen4, Green)
@@ -387,6 +392,7 @@
NS-Brille (4. Generation, Grün, WP)
야투경 (4세대, 녹색, 백색광)
NVゴーグル (第4世代、グリーン、白色蛍光)
+ 夜视仪(四代,绿色, 白磷)
Night Vision Goggles, White Phosphor
@@ -399,6 +405,7 @@
Nachtsichtbrille, weißer Phosphor
백색광 야투경
ナイトビジョン・ゴーグル、白色蛍光
+ 夜视仪, 白磷
NV Goggles (Wide, Black)
@@ -424,6 +431,7 @@
NS-Brille (Weit, Schwarz, WP)
야투경 (넓음, 검정, 백색광)
NVゴーグル (ワイド、ブラック、白色蛍光)
+ 夜视仪(宽,黑色, 白磷)
NV Goggles (Wide, Brown)
@@ -449,6 +457,7 @@
NS-Brille (Weit, Braun, WP)
야투경 (넓음, 갈색, 백색광)
NVゴーグル (ワイド、ブラウン、白色蛍光)
+ 夜视仪(宽,棕色, 白磷)
NV Goggles (Wide, Green)
@@ -474,6 +483,7 @@
NS-Brille (Weit, Grün, WP)
야투경 (넓음, 녹색, 백색광)
NVゴーグル (ワイド、グリーン、白色蛍光)
+ 夜视仪(宽,绿色, 白磷)
Night Vision Generation
@@ -486,6 +496,7 @@
Nachtsicht-Generation
야투경 세대
暗視装置の世代
+ 夜视仪代数
Aim Down Sights Blur
@@ -633,6 +644,7 @@
Gen %1
%1세대
第%1世代
+ 第%1代
diff --git a/addons/novehicleclanlogo/stringtable.xml b/addons/novehicleclanlogo/stringtable.xml
index 2b4ce7adf72..3cae0e65602 100644
--- a/addons/novehicleclanlogo/stringtable.xml
+++ b/addons/novehicleclanlogo/stringtable.xml
@@ -12,6 +12,7 @@
Clan-Logo von Fahrzeugen entfernen
차량에서 클랜 로고 제거
乗り物から部隊ロゴを削除
+ 在载具上移除战队徽标
Prevents clan logo from being displayed on vehicles controlled by players.
@@ -24,6 +25,7 @@
Verhindert, dass das Clan-Logo auf von Spielern kontrollierten Fahrzeugen angezeigt wird.
플레이어가 조종하는 차량에 클랜 로고가 표시되지 않도록 합니다.
プレイヤーが操作する乗り物に部隊ロゴが表示されないようにする。
+ 在玩家控制的载具上移除其所处的战队的徽标
diff --git a/addons/optionsmenu/stringtable.xml b/addons/optionsmenu/stringtable.xml
index fe210fb76d0..1f488a28350 100644
--- a/addons/optionsmenu/stringtable.xml
+++ b/addons/optionsmenu/stringtable.xml
@@ -96,7 +96,7 @@
Mostrar notícias no menu principal
Показывать новости в главном меню
Zeige Neuigkeiten im Hauptmenü
- 메인메뉴에 새 소식을 표시합니다
+ 메인 메뉴에 새 소식을 표시합니다
メイン画面にニュースを表示します
顯示新聞消息於主選單
显示新闻消息于主菜单
diff --git a/addons/overheating/functions/fnc_checkSpareBarrelsTemperatures.sqf b/addons/overheating/functions/fnc_checkSpareBarrelsTemperatures.sqf
index 18879292f94..0c6d6b4ad18 100644
--- a/addons/overheating/functions/fnc_checkSpareBarrelsTemperatures.sqf
+++ b/addons/overheating/functions/fnc_checkSpareBarrelsTemperatures.sqf
@@ -23,7 +23,7 @@ params ["_player"];
// Spawn a progress bar
[
- 5.0,
+ 5,
[_player],
{
params ["_args", "_elapsedTime", "_totalTime", "_errorCode"];
@@ -32,7 +32,7 @@ params ["_player"];
[QGVAR(sendSpareBarrelTemperatureHint), [_player, _player]] call CBA_fnc_serverEvent;
},
{},
- (localize LSTRING(CheckingSpareBarrelsTemperatures)),
+ LLSTRING(CheckingSpareBarrelsTemperatures),
{true},
["isNotInside", "isNotSitting", "isNotSwimming"]
] call EFUNC(common,progressBar);
diff --git a/addons/overheating/functions/fnc_sendSpareBarrelsTemperaturesHint.sqf b/addons/overheating/functions/fnc_sendSpareBarrelsTemperaturesHint.sqf
index 5f75423f2e0..8f0df76b13a 100644
--- a/addons/overheating/functions/fnc_sendSpareBarrelsTemperaturesHint.sqf
+++ b/addons/overheating/functions/fnc_sendSpareBarrelsTemperaturesHint.sqf
@@ -6,19 +6,19 @@
*
* Arguments:
* 0: Target unit of the hint
- * 1: Unit that has the spare barrels
+ * 1: Unit that has the spare barrels
*
* Return Value:
* None
*
* Example:
- * [bob, "bob"] call ace_overheating_fnc_sendSpareBarrelsTemperaturesHint
+ * [player, player] call ace_overheating_fnc_sendSpareBarrelsTemperaturesHint
*
*
* Public: No
*/
-params ["_player","_unit"];
+params ["_player", "_unit"];
// Find all spare barrel the player has
TRACE_2("sendSpareBarrelsTemperatureHunt",_player,_unit);
@@ -49,36 +49,15 @@ private _countHot = {(_x >= 100) && (_x < 200)} count _temps;
private _countVeryHot = {(_x >= 200) && (_x < 600)} count _temps;
private _countExtremelyHot = {_x >= 600} count _temps;
private _output = ["%1 %2%3%4 %5%6%7 %8%9%10 %11%12%13 %14"];
-private _size = 1.0;
-if (_countCool > 0) then {
- _output pushBack _countCool;
- _output pushBack LSTRING(BarrelCool);
- _output pushBack "
";
- _size = _size + 0.5;
-};
-if (_countWarm > 0) then {
- _output pushBack _countWarm;
- _output pushBack LSTRING(BarrelWarm);
- _output pushBack "
";
- _size = _size + 0.5;
-};
-if (_countHot > 0) then {
- _output pushBack _countHot;
- _output pushBack LSTRING(BarrelHot);
- _output pushBack "
";
- _size = _size + 0.5;
-};
-if (_countVeryHot > 0) then {
- _output pushBack _countVeryHot;
- _output pushBack LSTRING(BarrelVeryHot);
- _output pushBack "
";
- _size = _size + 0.5;
-};
-if (_countExtremelyHot > 0) then {
- _output pushBack _countExtremelyHot;
- _output pushBack LSTRING(BarrelExtremelyHot);
- _size = _size + 0.5;
-};
+private _emptyLine = ["", "", ""];
+
+_output append ([_emptyLine, [_countCool, LSTRING(BarrelCool), "
"]] select (_countCool > 0));
+_output append ([_emptyLine, [_countWarm, LSTRING(BarrelWarm), "
"]] select (_countWarm > 0));
+_output append ([_emptyLine, [_countHot, LSTRING(BarrelHot), "
"]] select (_countHot > 0));
+_output append ([_emptyLine, [_countVeryHot, LSTRING(BarrelVeryHot), "
"]] select (_countVeryHot > 0));
+_output append ([_emptyLine, [_countExtremelyHot, LSTRING(BarrelExtremelyHot), "
"]] select (_countExtremelyHot > 0));
+
+private _size = 1 + 0.5 * ({_x isEqualTo "
"} count _output);
TRACE_1("_output",_output);
[QEGVAR(common,displayTextStructured), [_output, _size, _player], [_player]] call CBA_fnc_targetEvent;
diff --git a/addons/overheating/stringtable.xml b/addons/overheating/stringtable.xml
index c5c2bb3e6b9..e966308bebf 100644
--- a/addons/overheating/stringtable.xml
+++ b/addons/overheating/stringtable.xml
@@ -776,6 +776,7 @@
Lauftyp
총열 방식
銃身形式
+ 枪管类型
Non-Removeable
@@ -786,6 +787,7 @@
Nicht entfernbar
제거 불가
取り外し不可
+ 无法移除
Quick Change
@@ -796,6 +798,7 @@
Schnellwechsel
신속 교체
即時交換可
+ 快速更换
Bolt Type
@@ -806,6 +809,7 @@
Art des Verschlusses
노리쇠 방식
遊底(ボルト)形式
+ 枪机类型
Closed Bolt
@@ -816,6 +820,7 @@
Geschlossener Verschluss
클로즈드 볼트
クローズドボルト
+ 闭膛
Open Bolt
@@ -826,6 +831,7 @@
Offener Verschluss
오픈 볼트
オープンボルト
+ 开膛
Coefficient for how much additional heat is added from having a suppressor attached.\nHigher value increases heat, 0 means no additional heat from the suppressor.
@@ -861,8 +867,8 @@
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 +929,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 +941,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/overpressure/stringtable.xml b/addons/overpressure/stringtable.xml
index 2d1e7700ce2..10639b92ce5 100644
--- a/addons/overpressure/stringtable.xml
+++ b/addons/overpressure/stringtable.xml
@@ -22,6 +22,7 @@
Rückstrahl-Entfernung Multiplikator
후폭풍 거리 계수
後方噴射の距離係数
+ 筒子尾焰距离系数
Scales the backblast effect
@@ -32,6 +33,7 @@
Skaliert den Rückstrahl-Effekt
후폭풍 효과의 스케일을 조정합니다
無反動砲による後方噴射の影響範囲の大きさ
+ 调整筒子尾焰距离系数
Overpressure Distance Coefficient
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 19b520a8fea..d398e7cf5a6 100644
--- a/addons/pylons/stringtable.xml
+++ b/addons/pylons/stringtable.xml
@@ -101,7 +101,7 @@
<vazio>
<пусто>
<leer>
- <비어있음>
+ <비어 있음>
<空>
<空>
<空>
@@ -237,7 +237,7 @@
Substituindo pylon %1 de %2...
Замена пилона %1 из %2...
Ersetze Außenlaststation %1 von insgesamt %2
- 교체중 (%2 -> %1)
+ %2개 중 %1번 무장창 교체 중...
%2 個中 %1 番目のパイロンを交換しています・・・
共有%2個派龍架,正在整補%1號派龍架中...
共有%2个发射架,正在整装%1号挂架...
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..44bb2d514c6 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,8 @@
КамАЗ (водоноситель)
KamAS Wasser
카마즈 급수
- KamAZ 給水
+ KamAZ (給水車)
+ "卡玛兹"(水箱)
Typhoon Ammo
@@ -2249,7 +2250,7 @@
Тайфун (боеприпасы)
Typhoon Munition
타이푼 탄약
- タイフーン 弾薬
+ タイフーン (弾薬)
"颱風"卡車 (彈藥)
"台风"(弹药)
Typhoon Cephane
@@ -2266,7 +2267,7 @@
Тайфун (крытый)
Typhoon Transport (bedeckt)
타이푼 수송 (덮개)
- タイフーン 輸送 (幌)
+ タイフーン (輸送、幌付き)
"颱風"卡車 (運輸, 棚布)
"台风"(运输,棚布)
Typhoon Nakil (Kapalı)
@@ -2283,7 +2284,7 @@
Тайфун (устройство)
Typhoon Gerät
타이푼 장치
- タイフーン デバイス
+ タイフーン (デバイス)
"颱風"卡車 (精密設備)
"台风"(装置)
Typhoon Cihaz
@@ -2300,7 +2301,7 @@
Тайфун (топливозаправщик)
Typhoon Treibstoff
타이푼 연료
- タイフーン 燃料
+ タイフーン (燃料)
"颱風"卡車 (燃油)
"台风"(燃油)
Typhoon Yakıt
@@ -2317,7 +2318,7 @@
Тайфун (медицинский)
Typhoon Sanitäter
타이푼 의료
- タイフーン 衛生
+ タイフーン (衛生)
"颱風"卡車 (醫療)
"台风"(医疗)
Typhoon Medikal
@@ -2334,7 +2335,7 @@
Тайфун (ремонтный)
Typhoon Instandsetzung
타이푼 수리
- タイフーン 修理
+ タイフーン (修理)
"颱風"卡車 (維修)
"台风"(维修)
Typhoon Tamir
@@ -2351,7 +2352,7 @@
Тайфун (транспортный)
Typhoon Transport
타이푼 수송
- タイフーン 輸送
+ タイフーン (輸送)
"颱風"卡車 (運輸)
"台风"(运输)
Typhoon Nakil
@@ -3771,6 +3772,7 @@
Type 115 (Schwarz)
115식 보총 (검정)
Type 115 (ブラック)
+ Type 115 (黑色)
Type 115 (Green Hex)
@@ -3782,6 +3784,7 @@
Type 115 (Hex Grün)
115식 보총 (초록육각)
Type 115 (緑六角形迷彩)
+ Type 115 (绿色蜂巢迷彩)
Type 115 (Hex)
@@ -3793,6 +3796,7 @@
Type 115 (Hex)
115식 보총 (육각)
Type 115 (六角形迷彩)
+ Type 115 (蜂巢迷彩)
UTG Defender 126
@@ -3804,6 +3808,7 @@
UTG Defender 126
UTG 디펜더 126
UTG ディフェンダー 126
+ UTG防御者126
Custom Covert II
@@ -5032,6 +5037,7 @@
EOTech MRDS (Schwarz)
이오텍 MRDS (검정)
EOTech MRDS (ブラック)
+ EOTech MRDS (黑色)
CZ 581
@@ -5054,6 +5060,7 @@
CZ 581 (Abgesägt)
CZ 581 (소드오프)
CZ 581 (ソードオフ)
+ CZ 581 (截短)
VS-121
diff --git a/addons/refuel/ACE_Refuel_Positions.hpp b/addons/refuel/ACE_Refuel_Positions.hpp
index 0db8667751f..b1b08459ff7 100644
--- a/addons/refuel/ACE_Refuel_Positions.hpp
+++ b/addons/refuel/ACE_Refuel_Positions.hpp
@@ -16,6 +16,35 @@ class GVAR(positions) {
{"Land_FuelStation_Feed_F", {{10208,2173,0}}}
};
+ gm_weferlingen_summer[] = { /* Weferlingen */ {"land_gm_euro_fuelpump_01_w", {{1687,13572,0},{4101,16172,0},{4832,18717,0},{5929,18330,0},{8132,4394,0},{13055,8670,0},{15580,14705,0},{15755,8845,0},{16672,464,0},{17117,18046,0}}}};
+ gm_weferlingen_winter[] = { /* Weferlingen (Winter) */ {"land_gm_euro_fuelpump_01_w", {{1687,13572,0},{4101,16172,0},{4832,18717,0},{5929,18330,0},{8132,4394,0},{13055,8670,0},{15580,14705,0},{15755,8845,0},{16672,464,0},{17117,18046,0}}}};
+
+ Cam_Lao_Nam[] = { /* Cam Lao Nam */
+ {"Land_vn_b_prop_fueldrum_01", {{2123,4090,0},{2474,4369,1},{12167,17587,0},{12755,17167,0},{14498,15180,0},{14589,15075,0},{14800,14961,0},{14833,6809,0},{14833,14940,1},{15555,6871,0},{15558,6911,0},{15580,6868,0},{15594,6885,0},{15701,6858,0},{15819,6851,0},{15845,6850,0},{15902,8044,2},{15939,8140,2},{15954,7996,0},{16207,6528,0},{16555,7103,0},{16586,7670,0},{16616,7698,0},{16628,7644,0},{16637,7103,0},{17068,7138,0},{18399,8291,0}}},
+ {"Land_vn_fuel_tank_stairs", {{2965,8724,0},{3077,8732,0},{11198,14754,0},{11221,14885,0},{11365,14665,0},{13180,13349,0},{13776,13634,0},{14518,15827,0},{14568,15108,0},{14634,15082,0},{14686,16029,0},{14717,15654,0},{14783,16071,0},{16590,7704,0},{16960,9104,0}}},
+ {"Land_vn_fuelstation_02_pump_f", {{13185,13364,0},{16116,3766,0},{16568,3773,0},{16766,6132,0}}},
+ {"Land_vn_fuelstation_feed_f", {{12421,19276,0},{12748,17178,0},{13277,13475,0},{14334,15896,0},{14889,12801,0},{17515,8729,0},{17617,9358,0},{19812,6989,0}}}
+ };
+ vn_khe_sanh[] = { /* Khe Sanh */
+ {"Land_vn_b_prop_fueldrum_01", {{4841,922,2},{4860,935,2},{10680,3138,0},{10847,3736,0}}},
+ {"Land_vn_fuel_tank_stairs", {{4166,11090,0},{9588,6720,0},{10933,4235,0}}},
+ {"Land_vn_fuelstation_feed_f", {{4166,11083,0},{10942,4230,0},{12872,13284,0}}}
+ };
+ vn_the_bra[] = { /* The Bra */ {"Land_vn_b_prop_fueldrum_01", {{3077,1859,0},{4415,581,0}}}};
+
+ stozec[] = { /* Gabreta */
+ {"Land_FuelStation_03_pump_F", {{2991,389,0},{3228,11033,0},{4051,8221,0},{5206,5771,0},{13368,4719,0}}},
+ {"Land_FuelStation_Feed_F", {{3103,11468,0},{9864,11040,0},{10616,10225,0}}}
+ };
+
+ SefrouRamal[] = { /* Sefrou-Ramal */
+ {"Land_fs_feed_F", {{5523,5058,0}}},
+ {"Land_FuelStation_Feed_F", {{5790,6416,0}}}
+ };
+
+ SPE_Mortain[] = { /* Mortain */ };
+ SPE_Normandy[] = { /* Normandy */ };
+
Bootcamp_ACR[] = { /* CUP Bukovina */ {"Land_A_FuelStation_Feed", {{652,473,0},{2849,1612,0}}}};
Woodland_ACR[] = { /* CUP Bystrica */ {"Land_A_FuelStation_Feed", {{447,1381,0},{1302,2185,0},{1855,6852,0},{4102,1195,0},{4755,4499,0}}}};
chernarus[] = { /* CUP Chernarus (Autumn) */ {"Land_A_FuelStation_Feed", {{2021,2242,0},{2692,5602,0},{2997,7471,0},{3648,8968,0},{4733,6381,0},{5847,2191,0},{5849,10112,0},{6705,2996,0},{7255,7662,0},{9502,2005,0},{10154,5300,0},{10446,8866,0},{10726,10786,0},{12988,10076,0},{13385,6603,0}}}};
diff --git a/addons/refuel/XEH_postInit.sqf b/addons/refuel/XEH_postInit.sqf
index d007266e5ff..cf02e5fd5a1 100644
--- a/addons/refuel/XEH_postInit.sqf
+++ b/addons/refuel/XEH_postInit.sqf
@@ -1,7 +1,64 @@
#include "script_component.hpp"
+// Menus and initSource EH need to be defined before the server raises the EH on the client, otherwise it won't add the actions
+if (hasInterface) then {
+ GVAR(mainAction) = [
+ QGVAR(Refuel),
+ localize LSTRING(Refuel),
+ QPATHTOF(ui\icon_refuel_interact.paa),
+ {},
+ {
+ alive _target
+ && {[_player, _target, [INTERACT_EXCEPTIONS]] call EFUNC(common,canInteractWith)}
+ && {REFUEL_DISABLED_FUEL != ([_target] call FUNC(getCapacity))}
+ },
+ {}, [], [0,0,0],
+ REFUEL_ACTION_DISTANCE
+ ] call EFUNC(interact_menu,createAction);
+
+ GVAR(actions) = [
+ [QGVAR(TakeNozzle),
+ localize LSTRING(TakeNozzle),
+ QPATHTOF(ui\icon_refuel_interact.paa),
+ {[_player, _target] call FUNC(TakeNozzle)},
+ {[_player, _target] call FUNC(canTakeNozzle)},
+ {}, [], [0,0,0],
+ REFUEL_ACTION_DISTANCE
+ ] call EFUNC(interact_menu,createAction),
+ [QGVAR(CheckFuelCounter),
+ localize LSTRING(CheckFuelCounter),
+ QPATHTOF(ui\icon_refuel_interact.paa),
+ {[_player, _target] call FUNC(readFuelCounter)},
+ {true},
+ {}, [], [0,0,0],
+ REFUEL_ACTION_DISTANCE
+ ] call EFUNC(interact_menu,createAction),
+ [QGVAR(CheckFuel),
+ localize LSTRING(CheckFuel),
+ QPATHTOF(ui\icon_refuel_interact.paa),
+ {[_player, _target] call FUNC(checkFuel)},
+ {[_player, _target] call FUNC(canCheckFuel)},
+ {}, [], [0,0,0],
+ REFUEL_ACTION_DISTANCE
+ ] call EFUNC(interact_menu,createAction),
+ [QGVAR(Return),
+ localize LSTRING(Return),
+ QPATHTOF(ui\icon_refuel_interact.paa),
+ {[_player, _target] call FUNC(returnNozzle)},
+ {[_player, _target] call FUNC(canReturnNozzle)},
+ {}, [], [0,0,0],
+ REFUEL_ACTION_DISTANCE
+ ] call EFUNC(interact_menu,createAction)
+ ];
+
+ [QGVAR(initSource), LINKFUNC(initSource)] call CBA_fnc_addEventHandler;
+};
+
["CBA_settingsInitialized", {
- if (!GVAR(enabled)) exitWith {};
+ if (!GVAR(enabled)) exitWith {
+ GVAR(mainAction) = nil;
+ GVAR(actions) = nil;
+ };
["All", "InitPost", {
params ["_vehicle"];
@@ -58,63 +115,12 @@
} forEach _baseStaticClasses;
};
- [QGVAR(initSource), LINKFUNC(initSource)] call CBA_fnc_addEventHandler;
-
if (!hasInterface) exitWith {};
["isNotRefueling", {!((_this select 0) getVariable [QGVAR(isRefueling), false])}] call EFUNC(common,addCanInteractWithCondition);
["MouseButtonDown", LINKFUNC(onMouseButtonDown)] call CBA_fnc_addDisplayHandler;
- GVAR(mainAction) = [
- QGVAR(Refuel),
- localize LSTRING(Refuel),
- QPATHTOF(ui\icon_refuel_interact.paa),
- {},
- {
- alive _target
- && {[_player, _target, [INTERACT_EXCEPTIONS]] call EFUNC(common,canInteractWith)}
- && {REFUEL_DISABLED_FUEL != ([_target] call FUNC(getCapacity))}
- },
- {}, [], [0,0,0],
- REFUEL_ACTION_DISTANCE
- ] call EFUNC(interact_menu,createAction);
-
- GVAR(actions) = [
- [QGVAR(TakeNozzle),
- localize LSTRING(TakeNozzle),
- QPATHTOF(ui\icon_refuel_interact.paa),
- {[_player, _target] call FUNC(TakeNozzle)},
- {[_player, _target] call FUNC(canTakeNozzle)},
- {}, [], [0,0,0],
- REFUEL_ACTION_DISTANCE
- ] call EFUNC(interact_menu,createAction),
- [QGVAR(CheckFuelCounter),
- localize LSTRING(CheckFuelCounter),
- QPATHTOF(ui\icon_refuel_interact.paa),
- {[_player, _target] call FUNC(readFuelCounter)},
- {true},
- {}, [], [0,0,0],
- REFUEL_ACTION_DISTANCE
- ] call EFUNC(interact_menu,createAction),
- [QGVAR(CheckFuel),
- localize LSTRING(CheckFuel),
- QPATHTOF(ui\icon_refuel_interact.paa),
- {[_player, _target] call FUNC(checkFuel)},
- {[_player, _target] call FUNC(canCheckFuel)},
- {}, [], [0,0,0],
- REFUEL_ACTION_DISTANCE
- ] call EFUNC(interact_menu,createAction),
- [QGVAR(Return),
- localize LSTRING(Return),
- QPATHTOF(ui\icon_refuel_interact.paa),
- {[_player, _target] call FUNC(returnNozzle)},
- {[_player, _target] call FUNC(canReturnNozzle)},
- {}, [], [0,0,0],
- REFUEL_ACTION_DISTANCE
- ] call EFUNC(interact_menu,createAction)
- ];
-
private _staticClasses = keys (uiNamespace getVariable QGVAR(cacheRefuelClassesStatic));
private _baseDynamicClasses = keys (uiNamespace getVariable QGVAR(cacheRefuelClassesBaseDynamic));
@@ -125,7 +131,7 @@
{
[_className, 0, ["ACE_MainActions", QGVAR(Refuel)], _x] call EFUNC(interact_menu,addActionToClass);
} forEach GVAR(actions);
- TRACE_1("add menu to static",_x);
+ TRACE_1("add menu to static",_className);
} forEach _staticClasses;
{
@@ -134,7 +140,7 @@
{
[_className, 0, ["ACE_MainActions", QGVAR(Refuel)], _x, true] call EFUNC(interact_menu,addActionToClass);
} forEach GVAR(actions);
- TRACE_1("add menu to dynamic",_x);
+ TRACE_1("add menu to dynamic",_className);
} forEach _baseDynamicClasses;
#ifdef DRAW_HOOKS_POS
diff --git a/addons/refuel/stringtable.xml b/addons/refuel/stringtable.xml
index 7da9bfe154d..78b9523063b 100644
--- a/addons/refuel/stringtable.xml
+++ b/addons/refuel/stringtable.xml
@@ -106,6 +106,7 @@
Treibstoffkanister anschließen
연료통 꽂기
燃料キャニスターを接続する
+ 连接燃料罐
Connecting fuel canister...
@@ -116,6 +117,7 @@
Schließe Treibstoffkanister an...
연료통 꽂는 중...
燃料キャニスターを接続しています・・・
+ 正在连接燃料罐...
Connect
@@ -174,6 +176,7 @@
Treibstoffkanister lösen
연료통 빼기
燃料キャニスターを外します
+ 断开燃料罐
Failed
@@ -394,6 +397,7 @@
연료 재보급 상호작용에 걸리는 시간(초)입니다.
燃料補給に掛かる時間。 (秒単位)
Saniye biriminde yakıt ikmali etkileşimlerinin süresi.
+ 加油动作持续时间(秒)
Pump/Hose Interaction Time
@@ -406,6 +410,7 @@
펌프/호스 상호작용 시간
ポンプ/ホースのインタラクション所要時間
Pompa/Hortum Etkileşim Süresi
+ 加油动作所需时间
How fast should a fuel source's tank be filled?
@@ -417,6 +422,7 @@
Wie schnell sollte der Tank einer Kraftstoffquelle gefüllt werden?
연료 공급처의 저장 탱크를 얼마나 빨리 채웁니까?
どのくらいの速さで給油源へ給油しますか?
+ 燃料罐补充速度
Cargo Flow Rate
@@ -428,6 +434,7 @@
Frachtflussrate
화물 주유량
貨物流量
+ 燃料罐油料流量
How fast should a vehicle be refueled?
@@ -502,6 +509,7 @@
Treibstoffkanister aufheben
연료통 집어들기
燃料キャニスターを持つ
+ 拿起燃料罐
Picking fuel canister up...
@@ -512,6 +520,7 @@
Hebe Treibstoffkanister auf...
연료통 집어드는 중...
燃料キャニスターを持ち上げています・・・
+ 正在拿起燃料罐...
Take fuel nozzle
@@ -587,6 +596,7 @@
Betankung beginnen (Container)
연료 재급유 시작 (컨테이너)
給油を始める (コンテナ)
+ 开始加油(燃料罐)
The fuel volume available for refueling (-1 disable, -10 if infinite)
diff --git a/addons/reload/stringtable.xml b/addons/reload/stringtable.xml
index 465aa675801..4a40e8357d3 100644
--- a/addons/reload/stringtable.xml
+++ b/addons/reload/stringtable.xml
@@ -29,6 +29,7 @@
Gurt wurde angehängt
탄띠가 연결되었습니다
ベルトがリンクされた
+ 弹链已连接
Belt could not be linked
@@ -41,6 +42,7 @@
Gurt konnte nicht angehängt werden
탄띠를 연결할 수 없습니다
ベルトはリンクされなかった
+ 弹链无法连接
Link belt
@@ -115,7 +117,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/reloadlaunchers/stringtable.xml b/addons/reloadlaunchers/stringtable.xml
index abd3e3b10b0..2fd30e0211a 100644
--- a/addons/reloadlaunchers/stringtable.xml
+++ b/addons/reloadlaunchers/stringtable.xml
@@ -29,6 +29,7 @@
Panzerabwehr konnte nicht geladen werden
발사기를 장전할 수 없습니다.
ランチャーを装填できませんでした
+ 发射器无法装填
Load launcher
@@ -75,6 +76,7 @@
%1 hat aufgehört, deine Panzerabwehr zu laden
%1이(가) 당신의 발사기 장전을 멈췄습니다.
%1 がランチャーの装填を中断しました
+ %1已停止给你的发射器装填弹药
Loading launcher...
@@ -104,6 +106,7 @@
%1 lädt deine Panzerabwehr
%1이(가) 당신의 발사기를 장전했습니다.
%1 がランチャーを装填しています
+ %1正在给你的发射器装填弹药
Displays notifications when an assistant loads a gunner's launcher.
@@ -116,6 +119,7 @@
Zeigt Benachrichtigungen an, wenn ein Assistent den Werfer eines Richtschützen lädt.
부사수가 사수의 발사기를 장전할 때 알림을 표시합니다.
助手が射手のランチャーを装填した際に通知を表示します。
+ 当其他人给别人的发射器装填弹药时显示提示
Display notifications for buddy loading
@@ -128,6 +132,7 @@
Buddy Nachlade Nachricht anzeigen
동료의 장전에 대한 알림 표시
バディローディング時の通知表示
+ 显示协助装填提示
Buddy Loading
@@ -140,6 +145,7 @@
Nachladen durch Kamerad
부사수 장전 중
バディローディング
+ 协助装填
diff --git a/addons/repair/stringtable.xml b/addons/repair/stringtable.xml
index 7fcb3f0e995..73d9c8e8e8b 100644
--- a/addons/repair/stringtable.xml
+++ b/addons/repair/stringtable.xml
@@ -496,7 +496,7 @@
Aviônica
Авионику
Avionik
- 항공 전자
+ 항공 전자 기기
アビオニクス
航電系統
航电系统
@@ -512,7 +512,7 @@
Carroceria
Кузов
Fahrgestell
- 몸체
+ 차체
車体
車身
车身
@@ -664,7 +664,7 @@
Estabilizador Horizontal Esquerdo
Левый горизонтальный стабилизатор
Linkes Höhenleitwerk
- 왼쪽 수평안정판
+ 왼쪽 수평안정기
左側水平安定装置
左側懸掛穩定
左侧悬挂稳定
@@ -680,7 +680,7 @@
Estabilizador Horizontal Direito
Правый горизонтальный стабилизатор
Rechtes Höhenleitwerk
- 오른쪽 수평안정판
+ 오른쪽 수평안정기
右側水平安定装置
右側懸掛穩定
右侧悬挂稳定
@@ -713,7 +713,7 @@
Roda Traseira Esquerda
Левое заднее колесо
Linkes Hinterrad
- 왼쪽 뒤쪽 바퀴
+ 왼쪽 뒷바퀴
左後輪
左後輪
左后轮
@@ -729,7 +729,7 @@
Segunda Roda Dianteira Esquerda
Второе переднее левое колесо
Zweites linkes Vorderrad
- 왼쪽 두번째 바퀴
+ 왼쪽 두 번째 앞바퀴
左第二前輪
第二左前輪
第二左前轮
@@ -842,7 +842,7 @@
Tubo de Pitot
Кокпит
Pitotrohr
- 동압관
+ 피토관
ピトー管
空速管
空速管
@@ -858,7 +858,7 @@
Roda Traseira Direita
Правое заднее колесо
Rechtes Hinterrad
- 오른쪽 뒤쪽 바퀴
+ 오른쪽 뒷바퀴
右後輪
右後輪
右后轮
@@ -874,7 +874,7 @@
Segunda Roda Dianteira Direita
Второе правое переднее колесо
Zweites rechtes Vorderrad
- 오른쪽 두번째 바퀴
+ 오른쪽 두 번째 앞바퀴
右第二前輪
第二右前輪
第二右前轮
@@ -955,7 +955,7 @@
Arranque
Стартер
Anlasser
- 점화기
+ 시동 장치
スターター
發動機
发动机
@@ -1035,7 +1035,7 @@
Rotor de Cauda
Рулевой винт
Heckrotor
- 꼬리 로터
+ 테일 로터
テールローター
尾槳
尾桨
@@ -1052,7 +1052,7 @@
Estabilizador Vertical
Вертикальный стабилизатор
Seitenleitwerk
- 수직 안정판
+ 수직안정기
垂直安定装置
垂直穩定
垂直稳定
@@ -1141,6 +1141,7 @@
Rad flicken
바퀴 수리
タイヤを補修する
+ 补胎
Patching Wheel...
@@ -1152,6 +1153,7 @@
Rad flicken...
바퀴 수리 중...
タイヤを補修しています・・・
+ 正在补胎...
Remove Track
@@ -1485,7 +1487,7 @@
Mostra uma notificação quando você repara um veículo
Отображать оповещение каждый раз, когда вы ремонтируете транспорт
Zeige eine Nachricht, wann immer du ein Fahrzeug reparierst
- 수리시 화면에 글자로 알림이 뜹니다
+ 수리 시 화면에 글자로 알림이 뜹니다
車両の修理を始めると、画面に通知を出します
每當維修載具時顯示通知
每当维修载具时显示通知
@@ -1500,7 +1502,7 @@
Mostrar texto quando reparar
Отображать текст при ремонте
Zeige Text bei Reperatur an
- 수리시 화면에 글자 표시
+ 수리 시 화면에 글자 표시
修理時に文章で通知する
顯示維修文本
显示维修文本
@@ -1549,6 +1551,7 @@
Rad
바퀴
タイヤ
+ 轮胎
Items required to remove/replace wheels.
@@ -1818,6 +1821,7 @@
Erlaube Radwechsel
바퀴 교체 허용
タイヤ交換の許可
+ 允许更换轮胎
Anyone
@@ -1940,6 +1944,7 @@
Zeit in Sekunden, um eine Reparatur abzuschließen.
수리를 완료하는 시간(초 단위)
修理完了までの所要時間 (秒単位)
+ 完成维修所需的时间(秒)
Part Repair Time
@@ -1951,6 +1956,7 @@
Teilreparaturzeit
부품 수리 시간
部分修理所要時間
+ 部分维修所需时间
Provides a repair system for all types of vehicles.
@@ -1992,6 +1998,7 @@
Wer kann Radflicken durchführen?
누가 바퀴를 수리할 수 있습니까?
誰がタイヤの補修を出来るようにしますか?
+ 谁可以补胎
Allow Wheel Patching
@@ -2003,6 +2010,7 @@
Erlaube Radflicken
바퀴 수리 허용
タイヤ補修を許可
+ 允许补胎
Where the wheel can be patched.
@@ -2014,6 +2022,7 @@
Wo das Rad geflickt werden kann.
바퀴를 수리할 수 있는 곳입니다.
タイヤを補修することが出来る場所。
+ 允许补胎的地点
Wheel Patch Location
@@ -2025,6 +2034,7 @@
Räder Flick Ort
바퀴 수리 장소
タイヤ補修可能な場所
+ 补胎地点
Maximum damage to which a wheel can be patched.\n0% means all damage can be repaired.
@@ -2036,6 +2046,7 @@
Maximales Level, bis zu dem ein Rad geflickt werden kann.\n0% bedeutet, dass das Rad vollständig repariert werden kann.
바퀴를 수리할 수 있는 최대 레벨입니다.
タイヤをのダメージ補修できる最大の度合い。/n 0%は、すべてのダメージが修復可能であることを意味します。
+ 允许补胎时轮胎所能承受的最大损伤\n0%意味着所有损伤都能补
Patch Wheel Threshold
@@ -2047,6 +2058,7 @@
Rad flicken Schwellenwert
바퀴 수리 한계점
タイヤ補修しきい値
+ 补胎伤害阈值
On the ground
@@ -2058,6 +2070,7 @@
Auf dem Boden
지면 위
地上
+ 在地上
On a vehicle
@@ -2069,6 +2082,7 @@
An einem Fahrzeug
차량
車両上
+ 在车里
Items required to patch a wheel.
@@ -2080,6 +2094,7 @@
Gegenstänge, die zum Reifenflicken benötigt werden.
바퀴를 수리하기 위해 아이템이 필요합니다.
タイヤ補修にアイテムを必要とします。
+ 补胎所需的工具
Wheel Patch Requirements
@@ -2091,6 +2106,7 @@
Bedingungen für die Radflicken
바퀴 수리 아이템 필요
タイヤ補修の要求
+ 补胎工具需求
Time it takes to patch a wheel by 5%.
@@ -2102,6 +2118,7 @@
Zeit, die benötigt wird, um ein Rad um 5 % zu flicken.
바퀴를 5% 수리하는 데 걸리는 시간(초 단위)
タイヤを5%補修するのに掛かる時間。
+ 补胎5%所需的时间
Wheel Patch Time
@@ -2113,6 +2130,7 @@
Zeit um Räder zu flicken
바퀴 수리 시간
タイヤ補修所要時間
+ 补胎时间
Maximum damage to which a part can be repaired by an engineer above the minimum level required for the repair.\n0% means all damage can be repaired.
@@ -2229,6 +2247,7 @@
Ändert, wie lange es dauert, eine vollständige Reparatur durchzuführen.\nDie Reparaturzeit basiert auf der Menge der erforderlichen Reparaturen für jedes Teil, einschließlich derjenigen, die normalerweise nicht zugänglich sind.
전체적인 수리를 수행하는 데 걸리는 시간을 수정합니다.\n수리 시간은 일반적으로 접근할 수 없는 부품을 포함하여 각 부품에 필요한 수리 시간을 기준으로 합니다.
完全修復に掛かる時間を変更します。\n修理所要時間は、通常アクセスできない部品も含め、各部品に必要な修理量に基づいて決定されます。
+ 更改完全维修所需时间\n取决于各零件所需的维修时间总和, 包括一些平常无法维修到的地方
Full Repair Time Coefficient
@@ -2240,6 +2259,7 @@
Vollständiger Reparaturzeitkoeffizient
전체 수리 시간 계수
完全修理所要時間係数
+ 完全维修时间系数
Anywhere
@@ -2266,7 +2286,7 @@
Instalação e veículo de reparo
Только у ремонтного транспорта или ремонтных сооружений
Reperatureinrichtung oder Reperaturfahrzeug
- 수리 시설혹은 차량
+ 수리 시설 혹은 차량
修理施設または車両のみ
維修設施或載具旁
维修设施或载具旁
@@ -2281,6 +2301,7 @@
Zeit in Sekunden, um ein Rad zu entfernen oder zu wechseln.
바퀴를 제거하거나 교체하는 데 걸리는 시간(초 단위)
タイヤの取り外しまたは交換に掛かる時間。 (秒単位)
+ 移除或更换轮胎所需的时间
Wheel Change Time
@@ -2292,6 +2313,7 @@
Radwechselzeit
바퀴 교체 시간
タイヤ交換所要時間
+ 换胎时间
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/scopes/stringtable.xml b/addons/scopes/stringtable.xml
index fad36fa7131..158a413456d 100644
--- a/addons/scopes/stringtable.xml
+++ b/addons/scopes/stringtable.xml
@@ -398,6 +398,7 @@
Zeige Absehenverstellungs-UI im Zielfernrohr
스코프에 조절 UI 보이기
調整UIをスコープ内に表示
+ 开镜时显示调节面板
Uses the 'defaultZeroRange' setting to overwrite the zero range of high power scopes
diff --git a/addons/tagging/stringtable.xml b/addons/tagging/stringtable.xml
index ad9d061a308..af3974e6c45 100644
--- a/addons/tagging/stringtable.xml
+++ b/addons/tagging/stringtable.xml
@@ -233,6 +233,7 @@
Pfeil Runter
화살표(아래)
矢印 (下)
+ 向下的箭头
Left Arrow
@@ -244,6 +245,7 @@
Pfeil Links
화살표(왼쪽)
矢印 (左)
+ 向左的箭头
Right Arrow
@@ -255,6 +257,7 @@
Pfeil Rechts
화살표(오른쪽)
矢印 (右)
+ 向右的箭头
Up Arrow
@@ -266,6 +269,7 @@
Pfeil Hoch
화살표(위)
矢印 (上)
+ 向上的箭头
Circle
@@ -277,6 +281,7 @@
Kreis
원
丸
+ 圆圈
Cross
@@ -288,6 +293,7 @@
Kreuz
십자
十字
+ 十字
A can of spray paint for tagging walls.
@@ -314,6 +320,7 @@
Diamant
마름모
菱形
+ 菱形
Square
@@ -325,6 +332,7 @@
Quadrat
사각형
四角
+ 方形
Filled Square
@@ -336,6 +344,7 @@
Gefülltes Quadrat
채워진 사각형
四角 (塗りつぶし)
+ 实心方形
Vehicle ID Marking
@@ -347,6 +356,7 @@
Fahrzeug ID Markierung
차량 ID 마킹
車両IDマーキング
+ 载具ID标记
Replaces clan tag with stenciled text
@@ -358,6 +368,7 @@
Ersetzt das Clan-Tag durch Schablonentext
클랜 태그를 스텐실 텍스트로 바꿉니다.
部隊タグをステンシルテキストに置き換える
+ 用模板文字代替战队徽标
Triangle
@@ -369,6 +380,7 @@
Dreieck
삼각형
三角
+ 三角形
Triangle Inverted
@@ -380,6 +392,7 @@
Invertiertes Dreieck
역삼각형
三角 (反転)
+ 倒过来的三角形
X
diff --git a/addons/towing/stringtable.xml b/addons/towing/stringtable.xml
index 9be831e83ab..c2c0ae1285b 100644
--- a/addons/towing/stringtable.xml
+++ b/addons/towing/stringtable.xml
@@ -12,6 +12,7 @@
Abschleppseil zum Fahrzeuginventar hinzufügen
차량 소지품에 견인줄 추가
車両のインベントリに牽引ロープを追加する
+ 将牵引绳加入到载具库存
Attach Tow Rope
diff --git a/addons/trenches/stringtable.xml b/addons/trenches/stringtable.xml
index e1dc7352447..c9c31eb0026 100644
--- a/addons/trenches/stringtable.xml
+++ b/addons/trenches/stringtable.xml
@@ -137,7 +137,7 @@
Cavar trincheira grande
Вырыть большой окоп
Grabe großen Schützengraben
- 대형참호 파기
+ 대형 참호 파기
大型の塹壕を掘る
蓋大掩體
挖掘大掩体
@@ -153,7 +153,7 @@
Cavar trincheira pequena
Вырыть малый окоп
Grabe kleinen Schützengraben
- 소형참호 파기
+ 소형 참호 파기
小型塹壕を掘る
蓋小掩體
挖掘小掩体
@@ -185,7 +185,7 @@
Trincheira pessoal grande
Большой персональный окоп
Großer Schützengraben
- 대형 참호
+ 대형 개인참호
大型の個人用塹壕
大型個人掩體
大型个人掩体
@@ -342,7 +342,7 @@
Duração de Escavamento de Trincheira Pequena
Время копания малого окопа
Kleiner Graben - Aushebungsdauer
- 소형참호 건설 시간
+ 소형 참호 건설 시간
小型塹壕造成の所要時間
小型战壕挖掘时间
@@ -368,7 +368,7 @@
Duração de Remoção de Trincheira Pequena
Время удаления малого окопа
Kleiner Graben - Aufschüttdauer
- 소형참호 제거 시간
+ 소형 참호 제거 시간
小型塹壕撤去の所要時間
小型战壕回填时间
diff --git a/addons/ui/stringtable.xml b/addons/ui/stringtable.xml
index ae711e02ec5..4fa1bde03ce 100644
--- a/addons/ui/stringtable.xml
+++ b/addons/ui/stringtable.xml
@@ -374,7 +374,7 @@
Quantidade de Carregadores
Количество магазинов
Magazinanzahl
- 탄창수
+ 탄창 수
弾倉数
彈匣數量
弹匣数量
@@ -728,8 +728,10 @@
Ocultar toda la IU
Nascondi tutta l'IU
Скрыть весь интерфейс
+ Gesamte Benutzeroberfläche ausblenden
모든 UI 숨기기
全ての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/vehicle_damage/stringtable.xml b/addons/vehicle_damage/stringtable.xml
index b979e30ffe4..c8c2bb2a2d1 100644
--- a/addons/vehicle_damage/stringtable.xml
+++ b/addons/vehicle_damage/stringtable.xml
@@ -12,6 +12,7 @@
Aktiviert den Erweiterten Fahrzeugsschaden (Experimentell)
고급 자동차 피해 활성화 (실험용)
車(Car)に対しての高度なダメージ計算を有効化します (試験的機能)
+ 对轻型轮式车辆启用高级车辆损坏(测试阶段)
Enable advanced car damage
@@ -24,6 +25,7 @@
Aktiviert erweiterten Autoschaden
고급 자동차 피해 활성화
高度な車ダメージを有効化
+ 启用高级车辆损坏
ACE Advanced Vehicle Damage
@@ -64,6 +66,7 @@
Aktiviert den Erweiterten Fahrzeugsschaden
고급 차량 피해 활성화
乗り物(Vehicle)に対しての高度なダメージ計算を有効化します
+ 启用高级载具损坏
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 44f67afb464..4c0ef892bdf 100644
--- a/addons/zeus/stringtable.xml
+++ b/addons/zeus/stringtable.xml
@@ -179,6 +179,7 @@
Das Sanitätsmenü ist deaktiviert
의료 메뉴가 비활성화되었습니다
医療メニューは無効になっています
+ 医疗菜单已被关闭
+SHIFT to force (Can only lay N/S or E/W)
@@ -830,6 +832,7 @@
+SHIFT zum Erzwingen (Kann nur nach N/S oder E/W legen)
+ Shift 키로 강제하기 (동서남북 방향으로만 깔 수 있음)
+SHIFTキー で強制的に敷設 (北/南または東/西方向にのみ配置可能)
+ +SHIFT 来强制铺设(只能在南北和东西朝向铺设)
Load into Cargo
@@ -904,7 +907,7 @@
Remover Arsenal
Убрать Арсенал
Entferne Arsenal
- 아스날 제거
+ 전체 기존 아스널 제거
BI 武器庫を削除
移除物件上的虛擬軍火庫
移除物体上的虚拟军火库
@@ -951,7 +954,7 @@
Definir como engenheiro
Назначить инженера
Engineer zuweisen
- 엔지니어 지정
+ 공병 임명
工兵に割り当て
指派工程師
指派工程师
@@ -968,7 +971,7 @@
Habilidade do engenheiro
Инженерное мастерство
Ingenieur Fähigkeit
- 기술자의 기술
+ 공병의 숙련도
工兵のスキル
工程師技能
工程师技能
@@ -1079,6 +1082,7 @@
Schwarz-Weiß
흑색 열원
黒=熱源
+ 黑热模式
Forces the spectator interface preventing the player from closing it with the Escape key
@@ -1089,6 +1093,7 @@
Erzwingt die Zuschauer-Ansicht und verhindert dass der Spieler sie mit der Esc-Taste schließen kann
플레이어가 Esc 키로 관전자 인터페이스를 닫지 못하도록 강제로 관전자 인터페이스를 설정합니다.
観戦インターフェイスを強制し、ユーザがEscキーでも閉じられないようにします。
+ 禁止使用ESC关闭观察者界面
Hide player
@@ -1099,6 +1104,7 @@
Spieler ausblenden
플레이어 숨기기
プレイヤーを隠す
+ 隐藏玩家
Hides the player by making them invisible, invulnerable, muted, and removing them from their group
@@ -1109,6 +1115,7 @@
Blendet den Spieler aus, macht ihn unsichtbar, unverwundbar, stumm und entfernt ihn von seiner Gruppe
플레이어를 투명, 무적, 음소거화하고 그룹에서 제거하여 숨깁니다.
透明化、無敵化、ミュート、グループからの除外を行いプレーヤーを隠します
+ 将玩家隐藏, 并设为无敌 静音, 并从小队内移除
Sets the sides that are available to spectate
@@ -1119,6 +1126,7 @@
Bestimmt die Seiten denen man zuschauen kann
관전 가능한 진영을 설정합니다.
指定の陣営を観戦可能に設定します
+ 设置可以观察的阵营
White Hot
@@ -1129,6 +1137,7 @@
Weiß-Schwarz
백색 열원
白=熱源
+ 白热
Activation Radius
@@ -1480,7 +1489,7 @@
Desguarnecer grupo
Вывести группу из здания
Garnisionsgruppe auflösen
- 주둔해제
+ 그룹 주둔 해제
グループの駐屯解除
解除駐軍駐守狀態
解除驻军驻守状态
@@ -1511,6 +1520,7 @@
Aus Frachtraum ausladen
화물 내리기
貨物室から降ろす
+ 从货舱卸载
None
@@ -1822,6 +1832,7 @@
Alle wechseln
전부 토글
全てを切り替え
+ 切换所有
Toggle Target
diff --git a/docs/src/package-lock.json b/docs/src/package-lock.json
index d0d710b40bd..3a6483dcd79 100644
--- a/docs/src/package-lock.json
+++ b/docs/src/package-lock.json
@@ -7,6 +7,9 @@
"": {
"name": "ace3",
"version": "0.1.0",
+ "dependencies": {
+ "ace3": "file:"
+ },
"devDependencies": {
"@rollup/plugin-terser": "^0.4.4",
"node-sass": "^9.0.0",
@@ -254,6 +257,10 @@
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"dev": true
},
+ "node_modules/ace3": {
+ "resolved": "",
+ "link": true
+ },
"node_modules/acorn": {
"version": "8.10.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
diff --git a/docs/src/package.json b/docs/src/package.json
index a8df663801b..9bbae686608 100644
--- a/docs/src/package.json
+++ b/docs/src/package.json
@@ -11,5 +11,8 @@
"rollup-plugin-scss": "^4.0.0",
"rollup-plugin-svg-icons": "^2.1.2",
"rollup-plugin-svg-sprite-loader": "^0.0.4"
+ },
+ "dependencies": {
+ "ace3": "file:"
}
}
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/frag-framework.md b/docs/wiki/framework/frag-framework.md
index 2c453eb7497..f140f31b8d6 100644
--- a/docs/wiki/framework/frag-framework.md
+++ b/docs/wiki/framework/frag-framework.md
@@ -30,7 +30,7 @@ class CfgAmmo {
ace_frag_metal = 210; // Amount of metal being fragmented (grams) - information below
ace_frag_charge = 185; // Amount of explosive filler (grams) - information below
ace_frag_gurney_c = 2843; // Gurney velocity constant for explosive type - information below
- ace_frag_gurney_k = 3/5; // Gurney shape factor - information below
+ ace_frag_gurney_k = 3/5; // Gurney velocity shape factor - information below
ace_frag_classes[] = {"ACE_frag_large"}; // Type of fragments - information below
ace_frag_skip = 0; // (Optional) Skip fragmentation for this ammo type (0-disabled, 1-enabled) - information below
ace_frag_force = 1; // (Optional) Force fragmentation system (0-disabled, 1-enabled) - information below
@@ -79,13 +79,13 @@ The Gurney constant for explosive force. You can find a list of common explosive
†A rule of thumb from literature is that the Gurney constant is given as 0.338 times the detonation velocity.
-### 2.4 Gurney shape factor
+### 2.4 Gurney velocity shape factor
`ace_frag_gurney_k`
-The shape factor for the explosive configuration. You should choose it based on the general configuration of explosives/metal in the warhead. Most grenades for example are a sphere. Artillery and aircraft bombs are a cylinder. Mines generally a flat plate. Below is a list of the three common shapes and their factors.
+The velocity shape factor for the explosive configuration. You should choose it based on the general configuration of explosives/metal in the warhead. Most grenades for example are a sphere. Artillery and aircraft bombs are a cylinder. Mines generally a flat plate. Below is a list of the three common shapes and their factors.
-| Shape | Factor |
+| Shape | Velocity Factor |
| -------- | ------ |
| Sphere | 3/5 |
| Cylinder | 1/2 |
diff --git a/docs/wiki/framework/hearing-framework.md b/docs/wiki/framework/hearing-framework.md
index a6748b77898..308b37bf4b9 100644
--- a/docs/wiki/framework/hearing-framework.md
+++ b/docs/wiki/framework/hearing-framework.md
@@ -17,10 +17,20 @@ 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)
};
};
```
The protection/muffling is a multiplier and not an absolute value, you can still be deafened/muffled with a value of 1.
+
+```cpp
+class CfgAmmo {
+ class MyAmmo {
+ ace_hearing_hearingDamageFactor = 0; // Allows to tune how much hearing damage the ammo causes when being fired/exploding (default: 1)
+ // Example: Removing hearing damage from throwables such as Molotovs
+ };
+};
+```
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
diff --git a/tools/make.py b/tools/make.py
index 7935d7fbd47..19c9c633544 100644
--- a/tools/make.py
+++ b/tools/make.py
@@ -1352,9 +1352,9 @@ def main(argv):
cmd = [makepboTool, "-P","-A","-X=*.backup", os.path.join(work_drive, prefix, module),os.path.join(module_root, release_dir, project,"addons")]
elif skipPreprocessing:
print_green("addon.toml set [pboProject_noBinConfig = true]. Proceeding with non-binerized config build!")
- cmd = [pboproject, "-B", "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "-S", "+Noisy", "+Clean", "-Warnings", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"]
+ cmd = [pboproject, "-B", "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "+Noisy", "+Clean", "-Warnings", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"]
else:
- cmd = [pboproject, "+B", "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "-S", "+Noisy", "+Clean", "-Warnings", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"]
+ cmd = [pboproject, "+B", "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "+Noisy", "+Clean", "-Warnings", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"]
color("grey")
if quiet:
diff --git a/tools/pDummies/rhsusf/addons/rhsusf_airweapons/proxyammo/rhsusf_m_AGM114K.p3d b/tools/pDummies/rhsusf/addons/rhsusf_airweapons/proxyammo/rhsusf_m_AGM114K.p3d
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tools/pDummies/rhsusf/addons/rhsusf_airweapons/proxyammo/rhsusf_m_AGM114K_fly.p3d b/tools/pDummies/rhsusf/addons/rhsusf_airweapons/proxyammo/rhsusf_m_AGM114K_fly.p3d
new file mode 100644
index 00000000000..e69de29bb2d