Merge branch 'master' into release-3.16.0

This commit is contained in:
PabstMirror 2023-10-11 16:00:33 -05:00
commit 0b22c981e9
167 changed files with 2190 additions and 318 deletions

View File

@ -24,7 +24,7 @@ exclude = [
"/initsettings.sqf",
"/initkeybinds.sqf",
"/xeh_prep.sqf",
"dev",
"/dev/",
"medical_ai/statemachine.sqf",
"common/functions/fnc_dummy.sqf",
]

View File

@ -113,6 +113,7 @@ havena <silveredenis@gmail.com>
Hawkins
Head <brobergsebastian@gmail.com>
Hybrid V
Hypoxic <martini_a@outlook.com>
JasperRab <jasper@jasperrab.eu>
JDT
john681611 <john681611@hotmail.com>

View File

@ -85,11 +85,13 @@
<English>Auto-Equip NVGs</English>
<Polish>Automatyczne zakładanie NVG</Polish>
<German>Automatisch NVGs ausrüsten</German>
<Korean>야투경 자동 창착</Korean>
</Key>
<Key ID="STR_ACE_AI_AssignNVG_Description">
<English>Equips NVG in inventory during night time and unequips it during day time.\nDoes not add NVGs to inventory!</English>
<Polish>Zakłada NVG w nocy i zdejmuje je w ciągu dnia.\nNie dodaje NVG do ekwipunku!</Polish>
<German>Rüstet NVG nachts aus dem Inventar aus und entfernt es tagsüber.\nFügt keine NVGs zum Inventar hinzu!</German>
<Korean>야간에는 야투경을 소지품에 장착하고 주간에는 장착을 해제합니다.\n주의! 소지품에 야투경을 추가하는 것이 아닙니다!</Korean>
</Key>
</Package>
</Project>

View File

@ -270,16 +270,16 @@ for "_index" from IDX_VIRT_OPTICS_ATTACHMENTS to IDX_VIRT_BIPOD_ATTACHMENTS do {
};
// This contains config case entries only
uiNamespace setVariable [QGVAR(configItems), _configItems];
uiNamespace setVariable [QGVAR(configItemsFlat), _configItemsFlat];
uiNamespace setVariable [QGVAR(faceCache), _faceCache];
uiNamespace setVariable [QGVAR(voiceCache), _voiceCache];
uiNamespace setVariable [QGVAR(insigniaCache), _insigniaCache];
uiNamespace setVariable [QGVAR(grenadeCache), _grenadeList];
uiNamespace setVariable [QGVAR(putCache), _putList];
uiNamespace setVariable [QGVAR(magazineMiscItems), _magazineMiscItems];
uiNamespace setVariable [QGVAR(CBAdisposableLaunchers), _launchers];
uiNamespace setVariable [QGVAR(configItemsTools), _toolList];
uiNamespace setVariable [QGVAR(configItems), compileFinal _configItems];
uiNamespace setVariable [QGVAR(configItemsFlat), compileFinal _configItemsFlat];
uiNamespace setVariable [QGVAR(faceCache), compileFinal _faceCache];
uiNamespace setVariable [QGVAR(voiceCache), compileFinal (_voiceCache createHashMapFromArray [])];
uiNamespace setVariable [QGVAR(insigniaCache), compileFinal (_insigniaCache createHashMapFromArray [])];
uiNamespace setVariable [QGVAR(grenadeCache), compileFinal _grenadeList];
uiNamespace setVariable [QGVAR(putCache), compileFinal _putList];
uiNamespace setVariable [QGVAR(magazineMiscItems), compileFinal _magazineMiscItems];
uiNamespace setVariable [QGVAR(CBAdisposableLaunchers), compileFinal _launchers];
uiNamespace setVariable [QGVAR(configItemsTools), compileFinal _toolList];
// Compatibility: Override baseWeapon for RHS optics
// No good way to do this via script for other attachments, needs manual compat

View File

@ -1561,12 +1561,14 @@
<Japanese>下降</Japanese>
<Polish>Malejąco</Polish>
<German>Absteigend</German>
<Korean>내림차순</Korean>
</Key>
<Key ID="STR_ACE_Arsenal_sortAscending">
<English>Ascending</English>
<Japanese>昇順</Japanese>
<Polish>Rosnąco</Polish>
<German>Aufsteigend</German>
<Korean>오름차순</Korean>
</Key>
<Key ID="STR_ACE_Arsenal_toolsTab">
<English>Tools</English>
@ -1589,36 +1591,42 @@
<Japanese>弾薬数</Japanese>
<Polish>Ilość amunicji</Polish>
<German>Munitionszahl</German>
<Korean>장탄 수</Korean>
</Key>
<Key ID="STR_ACE_Arsenal_defaultToFavoritesSetting">
<English>Default to Favorites</English>
<Japanese>お気に入りをデフォルト</Japanese>
<Polish>Domyślnie do Ulubionych</Polish>
<German>Standardmäßig auf Favoriten eingestellt</German>
<Korean>즐겨찾기 기본값</Korean>
</Key>
<Key ID="STR_ACE_Arsenal_defaultToFavoritesTooltip">
<English>Controls whether the ACE Arsenal defaults to showing all items or favorites.</English>
<Japanese>ACE Arsenalがデフォルトで全てのアイテムを表示するか、お気に入りを表示するかを制御します。</Japanese>
<Polish>Kontroluje, czy ACE Arsenal domyślnie wyświetla wszystkie przedmioty, czy tylko ulubione.</Polish>
<German>Steuert, ob das ACE Arsenal standardmäßig alle Gegenstände oder nur Favoriten anzeigt.</German>
<Korean>ACE 아스널이 기본적으로 모든 아이템 또는 즐겨찾기를 표시할 지 여부를 조정합니다.</Korean>
</Key>
<Key ID="STR_ACE_Arsenal_favoritesColorSetting">
<English>Favorites Color</English>
<Japanese>お気に入りの色</Japanese>
<Polish>Kolor Ulubionych</Polish>
<German>Favoritenfarbe</German>
<Korean>즐겨찾기 색상</Korean>
</Key>
<Key ID="STR_ACE_Arsenal_favoritesColorTooltip">
<English>Highlight color for favorited items.</English>
<Japanese>お気に入りアイテムのハイライト色。</Japanese>
<Polish>Kolor podświetlenia ulubionych elementów.</Polish>
<German>Hervorhebungsfarbe für Lieblingsgegenstände.</German>
<Korean>즐겨찾기한 아이템을 색상으로 강조합니다.</Korean>
</Key>
<Key ID="STR_ACE_Arsenal_buttonFavoritesTooltip">
<English>Switch between displaying all items or your favorites.\nDouble click while holding Shift to add or remove an item.</English>
<Japanese>Shiftを押しながらダブルクリックするとアイテムを追加・削除できます。</Japanese>
<Polish>Przełączanie między wyświetlaniem wszystkich przedmiotów lub tylko ulubionych. \nKliknij dwukrotnie, przytrzymując Shift, aby dodać lub usunąć przedmiot.</Polish>
<German>Wechseln Sie zwischen der Anzeige aller Elemente oder Ihrer Favoriten.\nDoppelklicken Sie bei gedrückter Umschalttaste, um ein Element hinzuzufügen oder zu entfernen.</German>
<Korean>모든 아이템을 표시하거나 즐겨찾기를 표시할 때 전환합니다\nShift 키를 누른 상태에서 두 번 클릭하여 아이템을 추가하거나 제거합니다.</Korean>
</Key>
</Package>
</Project>

View File

@ -13,36 +13,43 @@
* Public: No
*/
params ["", "_config"];
params ["", "_configMagazine"];
if (EGVAR(arsenal,currentLeftPanel) == 2002) then {
private _primaryMag = primaryWeaponMagazine EGVAR(arsenal,center);
[primaryWeapon EGVAR(arsenal,center), configName _config]
[primaryWeapon EGVAR(arsenal,center), _primaryMag param [0, ""]]
} else {
private _primaryMag = handgunMagazine EGVAR(arsenal,center);
[handgunWeapon EGVAR(arsenal,center), configName _config]
[handgunWeapon EGVAR(arsenal,center), _primaryMag param [0, ""]]
} params ["_weapon", "_magazine"];
if (_magazine isEqualTo "") then {
localize "str_empty";
} else {
private _weaponCfg = configFile >> "CfgWeapons" >> _weapon;
private _ammoCfg = (configFile >> "CfgAmmo" >> (getText (configFile >> "CfgMagazines" >> _magazine >> "ammo")));
private _barrelLength = getNumber (_weaponCfg >> "ACE_barrelLength");
private _muzzleVelocityTable = getArray (_ammoCfg >> "ACE_muzzleVelocities");
private _barrelLengthTable = getArray (_ammoCfg >> "ACE_barrelLengths");
// we might be looking at random mags not related to our weapon
private _magIsForCurrentWeapon = (configName _configMagazine == _magazine) && {_weapon != ""};
private _configWeapon = configNull;
if (_barrelLength != 0 && {count _muzzleVelocityTable > 0} && {count _barrelLengthTable > 0}) then {
private _muzzleVelocity = if (["ace_advanced_ballistics"] call EFUNC(common,isModLoaded)) then {
[_barrelLength, _muzzleVelocityTable, _barrelLengthTable, 0] call EFUNC(advanced_ballistics,calculateBarrelLengthVelocityShift);
} else {
getNumber (_config >> "initSpeed")
};
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;
};
format ["%1 m/s (%2 ft/s)", _muzzleVelocity toFixed 0, (_muzzleVelocity * 3.28084) toFixed 0]
} else {
localize "str_empty";
private _abAdjustText = "";
if (_magIsForCurrentWeapon && {["ace_advanced_ballistics"] call EFUNC(common,isModLoaded)}) 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]

View File

@ -13,35 +13,40 @@
* Public: No
*/
params ["", "_config"];
params ["", "_configWeapon"];
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 (_magazine isEqualTo "") then {
localize "str_empty";
} else {
private _ammoCfg = (configFile >> "CfgAmmo" >> (getText (configFile >> "CfgMagazines" >> _magazine >> "ammo")));
private _barrelLength = getNumber (_config >> "ACE_barrelLength");
private _muzzleVelocityTable = getArray (_ammoCfg >> "ACE_muzzleVelocities");
private _barrelLengthTable = getArray (_ammoCfg >> "ACE_barrelLengths");
if (_barrelLength != 0 && {count _muzzleVelocityTable > 0} && {count _barrelLengthTable > 0}) then {
private _muzzleVelocity = if (["ace_advanced_ballistics"] call EFUNC(common,isModLoaded)) then {
[_barrelLength, _muzzleVelocityTable, _barrelLengthTable, 0] call EFUNC(advanced_ballistics,calculateBarrelLengthVelocityShift);
} else {
getNumber (configFile >> "CfgMagazines" >> _magazine >> "initSpeed")
};
format ["%1 m/s (%2 ft/s)", _muzzleVelocity toFixed 0, (_muzzleVelocity * 3.28084) toFixed 0]
} else {
localize "str_empty";
private _configMagazine = configFile >> "CfgMagazines" >> _magazine;
private _muzzleVelocity = getNumber (_configMagazine >> "initSpeed");
private _initSpeedCoef = getNumber (_configWeapon >> "initSpeed");
if (_initSpeedCoef < 0) then {
_muzzleVelocity = _muzzleVelocity * -_initSpeedCoef;
};
if (_initSpeedCoef > 0) then {
_muzzleVelocity = _initSpeedCoef;
};
private _abAdjustText = "";
if (["ace_advanced_ballistics"] call EFUNC(common,isModLoaded)) 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]
};

View File

@ -3516,42 +3516,49 @@
<Japanese>AIの使用</Japanese>
<Polish>Wykorzystanie przez AI</Polish>
<German>KI Verwendet</German>
<Korean>인공지능 사용</Korean>
</Key>
<Key ID="STR_ACE_Ballistics_ammoUsageShort_illumination">
<English>Illum</English>
<Japanese>照明弾</Japanese>
<Polish>Flary</Polish>
<German>Leuchtmittel</German>
<Korean>조명탄</Korean>
</Key>
<Key ID="STR_ACE_Ballistics_ammoUsageShort_concealment">
<English>Smoke</English>
<Japanese>発煙弾</Japanese>
<Polish>Granaty dymne</Polish>
<German>Rauch</German>
<Korean>연막탄</Korean>
</Key>
<Key ID="STR_ACE_Ballistics_ammoUsageShort_infantry">
<English>Inf</English>
<Japanese>歩兵</Japanese>
<Polish>Piechota</Polish>
<German>Infanterie</German>
<Korean>보병</Korean>
</Key>
<Key ID="STR_ACE_Ballistics_ammoUsageShort_lightVehicle">
<English>Veh</English>
<Japanese>車両</Japanese>
<Polish>Pojazdy</Polish>
<German>Fahrzeug</German>
<Korean>차량</Korean>
</Key>
<Key ID="STR_ACE_Ballistics_ammoUsageShort_armor">
<English>Armor</English>
<Japanese>機甲</Japanese>
<Polish>Pojazdy opancerzone</Polish>
<German>Panzerung</German>
<Korean>기갑</Korean>
</Key>
<Key ID="STR_ACE_Ballistics_ammoUsageShort_aircraft">
<English>Air</English>
<Japanese>航空</Japanese>
<Polish>Lotnictwo</Polish>
<German>Luft</German>
<Korean>항공</Korean>
</Key>
</Package>
</Project>

View File

@ -8,7 +8,7 @@ PREP_RECOMPILE_END;
GVAR(captivityEnabled) = false;
GVAR(restraints) = call (uiNamespace getVariable QGVAR(restraints));
GVAR(restraints) = keys (uiNamespace getVariable QGVAR(restraints));
GVAR(blindfolds) = keys (uiNamespace getVariable QGVAR(blindfolds));
#include "initSettings.sqf"

View File

@ -3,7 +3,7 @@
#include "XEH_PREP.hpp"
private _restraints = (QUOTE(getNumber (_x >> QQGVAR(restraint)) > 0) configClasses (configFile >> "CfgWeapons") apply {configName _x});
uiNamespace setVariable [QGVAR(restraints), compileFinal str _restraints];
uiNamespace setVariable [QGVAR(restraints), compileFinal (_restraints createHashMapFromArray [])];
private _blindfolds = (QUOTE(getNumber (_x >> QQGVAR(blindfold)) > 0) configClasses (configFile >> "CfgGlasses") apply {configName _x});
uiNamespace setVariable [QGVAR(blindfolds), compileFinal (_blindfolds createHashMapFromArray [])];

View File

@ -22,7 +22,5 @@ params ["_unit", "_target"];
(_target getVariable [QGVAR(isHandcuffed), false]) &&
{isNull (attachedTo _target)} &&
{alive _target} &&
{isNull objectParent _unit} &&
{isNull objectParent _target} &&
{(GVAR(blindfolds) findAny (_unit call EFUNC(common,uniqueItems))) != -1} &&
{!((goggles _target) in GVAR(blindfolds))}

View File

@ -22,6 +22,4 @@ params ["_unit", "_target"];
(_target getVariable [QGVAR(isHandcuffed), false]) &&
{isNull (attachedTo _target)} &&
{alive _target} &&
{isNull objectParent _unit} &&
{isNull objectParent _target} &&
{(goggles _target) in GVAR(blindfolds)}

View File

@ -66,10 +66,16 @@ if (_state) then { // Blindfold target
removeGoggles _target;
};
// Handle for things that need to be dropped to the ground
// Handle for things that need to be dropped to the ground or in a vehicle inventory
if (_dropGoggles) then {
private _weaponHolder = nearestObject [_target, "WeaponHolder"];
if (isNull _weaponHolder || {_target distance _weaponHolder > 2}) then {
// if _target is in a vehicle, use vehicle inventory as container
private _inVehicle = !isNull objectParent _target;
if (_inVehicle) then {
_weaponHolder = objectParent _target;
};
if (!_inVehicle && {isNull _weaponHolder || {_target distance _weaponHolder > 2}}) then {
_weaponHolder = createVehicle ["GroundWeaponHolder", [0, 0, 0], [], 0, "NONE"];
_weaponHolder setPosASL getPosASL _target;
};

View File

@ -142,12 +142,16 @@
<French>Bandeau sur les yeux du captif</French>
<Portuguese>Vendar prisioneiro</Portuguese>
<Italian>Benda gli occhi</Italian>
<Polish>Załóż opaskę na oczy</Polish>
<Korean>포로 눈 가리기</Korean>
</Key>
<Key ID="STR_ACE_Captives_RemoveBlindfoldCaptive">
<English>Remove blindfold</English>
<German>Augenbinde entfernen</German>
<French>Enlever bandeau sur les yeux</French>
<Italian>Rimuovi la benda per gli occhi</Italian>
<Polish>Zdejmij opaskę z oczu</Polish>
<Korean>눈가리개 풀기</Korean>
</Key>
<Key ID="STR_ACE_Captives_CableTie">
<English>Cable Tie</English>

View File

@ -153,7 +153,8 @@ private _objectClassesAddClassEH = call (uiNamespace getVariable [QGVAR(objectCl
if (isServer) then {
["ace_placedInBodyBag", {
params ["_target", "_bodyBag"];
params ["_target", "_bodyBag", "_isGrave"];
if (_isGrave) exitWith {}; // assume graves aren't cargo
_bodyBag setVariable [QGVAR(customName), [_target, false, true] call EFUNC(common,getName), true];
}] call CBA_fnc_addEventHandler;
};

View File

@ -10,6 +10,10 @@ class vn_mine_m18_x3_ammo: vn_mine_m18_ammo {
EGVAR(explosives,explosive) = "vn_mine_m18_x3_ammo_scripted";
};
class vn_mine_m18_wp_ammo: vn_mine_m18_ammo {
EGVAR(explosives,explosive) = "vn_mine_m18_wp_ammo_scripted";
};
class vn_mine_m16_base;
class vn_mine_tripwire_m16_02_ammo: vn_mine_m16_base {
EGVAR(explosives,defuseObjectPosition)[] = {0, -0.01, 0.088};

View File

@ -12,3 +12,6 @@ class vn_m16_mag_base;
class vn_m63a_100_mag: vn_m16_mag_base {
ACE_isBelt = 1;
};
class vn_mg42_50_mag: vn_lmgmag_base {
ACE_isBelt = 1;
};

View File

@ -28,6 +28,18 @@ 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);
@ -51,6 +63,42 @@ class vn_mine_m18_x3_range_mag: vn_mine_m18_x3_mag {
};
};
// WP Claymore (Remote)
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)
class vn_mine_m18_wp_range_mag: vn_mine_m18_wp_mag {
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
digDistance = -0.05;
};
};
};
// 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);

View File

@ -30,6 +30,12 @@ class EXPLOSIVES_PLACE(m18_x3): EGVAR(explosives,Place) {
};
};
// WP Claymore
class EXPLOSIVES_PLACE(m18_wp): EXPLOSIVES_PLACE(m18) {
displayName = "$STR_VN_MINE_M18_WP_MAG_DN";
model = "vn\weapons_f_vietnam_04\mines\m18\vn_mine_m18_wp";
};
// Toe-Popper
class EXPLOSIVES_PLACE(m14): EGVAR(explosives,Place) {
displayName = "$STR_VN_MINE_M14_MAG_DN";

View File

@ -13,6 +13,12 @@ class vn_pk: vn_lmg {
class vn_m60: vn_lmg {
EGVAR(overheating,allowSwapBarrel) = 1;
};
class vn_mg42: vn_lmg {
EGVAR(overheating,allowSwapBarrel) = 1;
};
class vn_l4: vn_lmg {
EGVAR(overheating,allowSwapBarrel) = 1;
};
class vn_smg: vn_rifle {
EGVAR(overheating,closedBolt) = 0;

View File

@ -3,96 +3,127 @@
<Package name="Compat_WS_RealisticNames">
<Key ID="STR_ACE_Compat_WS_RealisticNames_AA40_Name">
<English>AA12</English>
<Korean>AA-12</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_AA40_Tan_Name">
<English>AA12 (Sand)</English>
<Korean>AA-12 (모래)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_AA40_Snake_Name">
<English>AA12 (Snake)</English>
<Korean>AA-12 (뱀 위장)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_Galat_Name">
<English>Galil ARM</English>
<Korean>갈릴 ARM</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_Galat_Old_Name">
<English>Galil ARM (Old)</English>
<Korean>갈릴 ARM (낡음)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_GLX_Name">
<English>GLX 160</English>
<Korean>GLX-160</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_GLX_Snake_Name">
<English>GLX 160 (Snake)</English>
<Korean>GLX-160 (뱀 위장)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_GLX_Hex_Name">
<English>GLX 160 (Hex)</English>
<Korean>GLX-160 (육각)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_GLX_GreenHex_Name">
<English>GLX 160 (Green Hex)</English>
<Korean>GLX-160 (초록육각)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_GLX_Camo_Name">
<English>GLX 160 (Camo)</English>
<Korean>GLX-160 (위장)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_GLX_Tan_Name">
<English>GLX 160 (Sand)</English>
<Korean>GLX-160 (모래)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_EBR_Black_Name">
<English>Mk14 Mod 1 EBR (Black)</English>
<Korean>Mk.14 Mod 1 EBR (검정)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_EBR_Snake_Name">
<English>Mk14 Mod 1 EBR (Snake)</English>
<Korean>Mk.14 Mod 1 EBR (뱀 위장)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_S77_Name">
<English>Vektor SS-77</English>
<Korean>벡터 SS-77</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_S77_AAF_Name">
<English>Vektor SS-77 (Camo)</English>
<Korean>벡터 SS-77 (위장)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_S77_Hex_Name">
<English>Vektor SS-77 (Hex)</English>
<Korean>벡터 SS-77 (육각)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_S77_GreenHex_Name">
<English>Vektor SS-77 (Green Hex)</English>
<Korean>벡터 SS-77 (초록육각)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_S77_Desert_Name">
<English>Vektor SS-77 (Desert)</English>
<Korean>벡터 SS-77 (사막)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_S77_Compact_Name">
<English>Vektor SS-77 Compact</English>
<Korean>벡터 SS-77 단축형</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_S77_Compact_Snake_Name">
<English>Vektor SS-77 Compact (Snake)</English>
<Korean>벡터 SS-77 단축형 (뱀 위장)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_SLR_Wood_Name">
<English>FN FAL 50.00 (Wood)</English>
<Korean>FN FAL 50.00 (목재)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_SLR_GL_Wood_Name">
<English>FN FAL 50.00 GL (Wood)</English>
<Korean>FN FAL 50.00 GL (목재)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_SLR_Name">
<English>FN FAL 50.00</English>
<Korean>FN FAL 50.00</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_SLR_GL_Name">
<English>FN FAL 50.00 GL</English>
<Korean>FN FAL 50.00 GL</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_SLR_Desert_Name">
<English>FN FAL 50.00 (Desert)</English>
<Korean>FN FAL 50.00 (사막)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_SLR_Camo_Name">
<English>FN FAL 50.00 (Jungle)</English>
<Korean>FN FAL 50.00 (정글)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_Velko_R4_Name">
<English>Vektor R4</English>
<Korean>벡터 R4</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_Velko_R5_Name">
<English>Vektor R5 Carbine</English>
<Korean>벡터 R5 카빈</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_Velko_R5_GL_Name">
<English>Vektor R5 Carbine GL</English>
<Korean>벡터 R5 카빈 GL</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_Velko_R5_Snake_Name">
<English>Vektor R5 Carbine (Snake)</English>
<Korean>벡터 R5 카빈 (뱀 위장)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_Velko_R5_GL_Snake_Name">
<English>Vektor R5 Carbine GL (Snake)</English>
<Korean>벡터 R5 카빈 GL (뱀 위장)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_XMS_Name">
<English>XMS</English>
@ -103,6 +134,7 @@
<Spanish>XMS</Spanish>
<Chinesesimp>XMS</Chinesesimp>
<Russian>XMS</Russian>
<Korean>XMS</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_XMS_Khaki_Name">
<English>XMS (Khaki)</English>
@ -113,6 +145,7 @@
<Spanish>XMS (caqui)</Spanish>
<Chinesesimp>XMS卡其色</Chinesesimp>
<Russian>XMS (хаки)</Russian>
<Korean>XMS (카키)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_XMS_Sand_Name">
<English>XMS (Sand)</English>
@ -123,6 +156,7 @@
<Spanish>XMS (arena)</Spanish>
<Chinesesimp>XMS沙色</Chinesesimp>
<Russian>XMS (песочный)</Russian>
<Korean>XMS (모래)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_XMS_GL_Name">
<English>XMS GL</English>
@ -133,6 +167,7 @@
<Spanish>XMS GL</Spanish>
<Chinesesimp>XMS GL</Chinesesimp>
<Russian>XMS GL</Russian>
<Korean>XMS GL</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_XMS_GL_Khaki_Name">
<English>XMS GL (Khaki)</English>
@ -143,6 +178,7 @@
<Spanish>XMS GL (caqui)</Spanish>
<Chinesesimp>XMS GL卡其色</Chinesesimp>
<Russian>XMS GL (хаки)</Russian>
<Korean>XMS GL (카키)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_XMS_GL_Sand_Name">
<English>XMS GL (Sand)</English>
@ -153,6 +189,7 @@
<Spanish>XMS GL (arena)</Spanish>
<Chinesesimp>XMS GL沙色</Chinesesimp>
<Russian>XMS GL (песочный)</Russian>
<Korean>XMS GL (모래)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_XMS_SG_Name">
<English>XMS SG</English>
@ -163,6 +200,7 @@
<Spanish>XMS SG</Spanish>
<Chinesesimp>XMS SG</Chinesesimp>
<Russian>XMS SG</Russian>
<Korean>XMS SG</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_XMS_SG_Khaki_Name">
<English>XMS SG (Khaki)</English>
@ -173,6 +211,7 @@
<Spanish>XMS SG (caqui)</Spanish>
<Chinesesimp>XMS SG卡其色</Chinesesimp>
<Russian>XMS SG (хаки)</Russian>
<Korean>XMS SG (카키)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_XMS_SG_Sand_Name">
<English>XMS SG (Sand)</English>
@ -183,6 +222,7 @@
<Spanish>XMS SG (arena)</Spanish>
<Chinesesimp>XMS SG沙色</Chinesesimp>
<Russian>XMS SG (песочный)</Russian>
<Korean>XMS SG (모래)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_XMS_SW_Name">
<English>XMS SW</English>
@ -193,6 +233,7 @@
<Spanish>XMS SW</Spanish>
<Chinesesimp>XMS SW</Chinesesimp>
<Russian>XMS SW</Russian>
<Korean>XMS SW</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_XMS_SW_Khaki_Name">
<English>XMS SW (Khaki)</English>
@ -203,6 +244,7 @@
<Spanish>XMS SW (caqui)</Spanish>
<Chinesesimp>XMS SW卡其色</Chinesesimp>
<Russian>XMS SW (хаки)</Russian>
<Korean>XMS SW (카키)</Korean>
</Key>
<Key ID="STR_ACE_Compat_WS_RealisticNames_XMS_SW_Sand_Name">
<English>XMS SW (Sand)</English>
@ -213,6 +255,7 @@
<Spanish>XMS SW (arena)</Spanish>
<Chinesesimp>XMS SW沙色</Chinesesimp>
<Russian>XMS SW (песочный)</Russian>
<Korean>XMS SW (모래)</Korean>
</Key>
</Package>
</Project>

View File

@ -30,7 +30,7 @@
<Hungarian>Concertina wire coil</Hungarian>
<Portuguese>Bobina de arame farpado</Portuguese>
<Japanese>鉄条網コイル</Japanese>
<Korean>형 철조망</Korean>
<Korean>코일형 철조망</Korean>
<Chinese>鐵絲網捲</Chinese>
<Chinesesimp>铁丝网卷</Chinesesimp>
<Turkish>Bıçaklı Tel Rulo</Turkish>

View File

@ -181,6 +181,7 @@
<Japanese>誘爆後に車両を破壊するかどうかを設定する。</Japanese>
<Polish>Kontroluje, czy pojazdy będą zawsze niszczone po samozapłonie.</Polish>
<German>Steuert, ob Fahrzeuge nach dem Durchzünden immer zerstört werden.</German>
<Korean>쿸오프 후 차량이 항상 파괴되는지 여부를 조정합니다.</Korean>
</Key>
<Key ID="STR_ACE_CookOff_enableFire_name">
<English>Enable Cook-Off Vehicle Fire</English>

View File

@ -29,7 +29,6 @@ if (_putDownAnim != "") exitWith { false };
(alive _target) &&
{(abs (speed _target)) < 1} &&
{(vehicle _target) == _target} &&
{(_target getVariable ["ACE_isUnconscious", false]) ||
{_target getVariable [QEGVAR(captives,isHandcuffed), false]} ||
{_target getVariable [QEGVAR(captives,isSurrendering), false]}}

View File

@ -39,6 +39,11 @@ if (_doNotDropAmmo && {({_x in _listOfItemsToRemove} count (magazines _target))
private _holder = objNull;
// if _target is in a vehicle, use vehicle inventory as container
if (!isNull objectParent _target) then {
_holder = objectParent _target;
};
//If not dropping ammo, don't use an existing container
if (!_doNotDropAmmo) then {
{

View File

@ -32,7 +32,8 @@ if (["ACE_Medical"] call EFUNC(common,isModLoaded)) then {
if (isServer) then {
["ace_placedInBodyBag", {
params ["_target", "_bodyBag"];
params ["_target", "_bodyBag", "_isGrave"];
if (_isGrave) exitWith {};
TRACE_2("ace_placedInBodyBag eh",_target,_bodyBag);
private _dogTagData = [_target] call FUNC(getDogtagData);

View File

@ -152,24 +152,28 @@
<Japanese>軽量物を持って走れるようにする</Japanese>
<Polish>Zezwól na Bieganie z Lekkimi Obiektami</Polish>
<German>Erlauben das Sprinten mit leichten Gegenständen</German>
<Korean>가벼운 개체 들고 달리기 허용</Korean>
</Key>
<Key ID="STR_ACE_Dragging_allowRunWithLightweight_Description">
<English>Allow the player to run when carrying lightweight objects.</English>
<Japanese>プレイヤーが軽量オブジェクトを持ち運んでいるときに走れるようにする。</Japanese>
<Polish>Zezwalaj graczowi na bieganie podczas przenoszenia lekkich przedmiotów.</Polish>
<German>Erlauben Sie dem Spieler, zu rennen, wenn er leichte Gegenstände trägt.</German>
<Korean>가벼운 개체를 들고 다닐 때 플레이어가 뛸 수 있도록 허용합니다.</Korean>
</Key>
<Key ID="STR_ACE_Dragging_skipContainerWeight_DisplayName">
<English>Skip Object Weight</English>
<Japanese>オブジェクトの重量を無視</Japanese>
<Polish>Pomiń Wagę Obiektu</Polish>
<German>Objektgewicht überspringen</German>
<Korean>개체 무게 무시</Korean>
</Key>
<Key ID="STR_ACE_Dragging_skipContainerWeight_Description">
<English>Determines whether object's weight is added onto weight calculations.</English>
<Japanese>重量計算にオブジェクトの重量を追加するかどうかを決定します。</Japanese>
<Polish>Określa, czy waga obiektu jest dodawana do obliczeń ciężaru.</Polish>
<German>Legt fest, ob das Gewicht des Objekts zu den Gewichtsberechnungen hinzugefügt wird.</German>
<Korean>무게 계산에 개체의 무게를 추가할 지 여부를 결정합니다.</Korean>
</Key>
</Package>
</Project>

View File

@ -13,6 +13,6 @@ PREP_RECOMPILE_END;
GVAR(detonationHandlers) = [];
GVAR(excludedMines) = [];
GVAR(defusalKits) = call (uiNamespace getVariable QGVAR(defusalKits));
GVAR(defusalKits) = keys (uiNamespace getVariable QGVAR(defusalKits));
ADDON = true;

View File

@ -3,4 +3,4 @@
#include "XEH_PREP.hpp"
private _defusalKits = (QUOTE(getNumber (_x >> QQGVAR(defusalKit)) > 0) configClasses (configFile >> "CfgWeapons") apply {configName _x});
uiNamespace setVariable [QGVAR(defusalKits), compileFinal str _defusalKits];
uiNamespace setVariable [QGVAR(defusalKits), compileFinal (_defusalKits createHashMapFromArray [])];

View File

@ -319,12 +319,14 @@
<Polish>Automatycznie Zamontuj FRIES</Polish>
<Japanese>FRIESの自動装備</Japanese>
<German>FRIES automatisch ausrüsten</German>
<Korean>FRIES 로프 자동 장착</Korean>
</Key>
<Key ID="STR_ACE_Fastroping_setting_autoAddFRIES_description">
<English>Automatically add FRIES to helicopters that support them.</English>
<Polish>Automatycznie dodawaj FRIES do śmigłowców które je wspierają.</Polish>
<Japanese>FRIESをサポートするヘリコプターに自動的にFRIESを追加します。</Japanese>
<German>FRIES automatisch Helikoptern hinzufügen, die es unterstützen</German>
<Korean>로프를 지원하는 헬기에 자동으로 FRIES 로프를 추가합니다.</Korean>
</Key>
</Package>
</Project>

View File

@ -31,4 +31,4 @@ private _fnc_isFieldRationItem = toString {
_list set [configName _x, ""];
} forEach (_fnc_isFieldRationItem configClasses _cfgMagazines);
uiNamespace setVariable [QXGVAR(fieldRationItems), compileFinal str _list];
uiNamespace setVariable [QXGVAR(fieldRationItems), compileFinal _list];

View File

@ -34,4 +34,4 @@
#define IDC_DRAINING_HUD_HUNGER_GROUP 7840
#define IDC_DRAINING_HUD_HUNGER_ICON 7850
#define FIELD_RATIONS_ITEMS (createHashMapFromArray (call (uiNamespace getVariable [QXGVAR(fieldRationItems), {createHashMap}])))
#define FIELD_RATIONS_ITEMS (uiNamespace getVariable QXGVAR(fieldRationItems))

View File

@ -0,0 +1 @@
z\ace\addons\fieldmanual

View File

@ -0,0 +1,5 @@
class Extended_PreStart_EventHandlers {
class ADDON {
init = QUOTE(call COMPILE_SCRIPT(XEH_preStart));
};
};

View File

@ -0,0 +1,5 @@
class CfgHintCategories {
class ACE_FieldManual {
displayName = CSTRING(HintCategory_FieldManual_DisplayName);
};
};

View File

@ -0,0 +1,330 @@
/*
Preferred Image Size = 256x256
Can Embed Images Into Description = 1024x512
- Shadow = '0'
- Size = '9'
*/
class CfgHints {
class ACE_FieldManual_Base {
arguments[] = {
// INDENT - %11
"' '",
// SELF INTERACT KEYBIND - %12
QUOTE([ARR_2('ACE3 Common', QQEGVAR(interact_menu,selfInteractKey))] call FUNC(getKeybindName)),
// INTERACT KEYBIND - %13
QUOTE([ARR_2('ACE3 Common', QQEGVAR(interact_menu,interactKey))] call FUNC(getKeybindName))
};
image = "\z\ace\addons\common\data\logo_ace3_ca.paa";
tip = "<a href='https://ace3.acemod.org/'>ACE Wiki</a>";
};
class ACE_Items {
displayName = CSTRING(Items_DisplayName);
category = "ACE_FieldManual";
class ACE_ATragMX: ACE_FieldManual_Base {
logicalOrder = 1;
arguments[] += {QUOTE('ACE_ATragMX' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_ATragMX_ShortName);
description = CSTRING(Items_ATragMX_Description);
tip = "<a href='https://ace3.acemod.org/wiki/feature/atragmx'>ATragMX Wiki</a>";
};
class ACE_BodyBag: ACE_FieldManual_Base {
logicalOrder = 2;
arguments[] += {QUOTE('ACE_BodyBag' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_BodyBag_ShortName);
description = CSTRING(Items_BodyBag_Description);
};
class ACE_CableTie: ACE_FieldManual_Base {
logicalOrder = 3;
arguments[] += {QUOTE('ACE_CableTie' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_CableTie_ShortName);
description = CSTRING(Items_CableTie_Description);
tip = "<a href='https://ace3.acemod.org/wiki/feature/captives'>Captives Wiki</a>";
};
class ACE_Cellphone: ACE_FieldManual_Base {
logicalOrder = 4;
arguments[] += {QUOTE('ACE_Cellphone' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_Cellphone_ShortName);
description = CSTRING(Items_Cellphone_Description);
tip = "<a href='https://ace3.acemod.org/wiki/feature/explosives'>Explosives Wiki</a>";
};
class ACE_Chemlight_Shield: ACE_FieldManual_Base {
logicalOrder = 5;
arguments[] += {QUOTE('ACE_Chemlight_Shield' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_Chemlight_Shield_ShortName);
description = CSTRING(Items_Chemlight_Shield_Description);
tip = "<a href='https://ace3.acemod.org/wiki/feature/chemlights'>Chemlights Wiki</a>";
};
class ACE_Clackers: ACE_FieldManual_Base {
logicalOrder = 6;
arguments[] += {QUOTE('ACE_Clacker' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_Clackers_ShortName);
description = CSTRING(Items_Clackers_Description);
tip = "<a href='https://ace3.acemod.org/wiki/feature/explosives'>Explosives Wiki</a>";
};
class ACE_DAGR: ACE_FieldManual_Base {
logicalOrder = 7;
arguments[] += {QUOTE('ACE_DAGR' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_DAGR_ShortName);
description = CSTRING(Items_DAGR_Description);
tip = "<a href='https://ace3.acemod.org/wiki/feature/dagr'>DAGR Wiki</a>";
};
class ACE_DeadManSwitch: ACE_FieldManual_Base {
logicalOrder = 8;
arguments[] += {QUOTE('ACE_DeadManSwitch' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_DeadManSwitch_ShortName);
description = CSTRING(Items_DeadManSwitch_Description);
tip = "<a href='https://ace3.acemod.org/wiki/feature/explosives'>Explosives Wiki</a>";
};
class ACE_DefusalKit: ACE_FieldManual_Base {
logicalOrder = 9;
arguments[] += {QUOTE('ACE_DefusalKit' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_DefusalKit_ShortName);
description = CSTRING(Items_DefusalKit_Description);
tip = "<a href='https://ace3.acemod.org/wiki/feature/explosives'>Explosives Wiki</a>";
};
class ACE_EarPlugs: ACE_FieldManual_Base {
logicalOrder = 10;
arguments[] += {QUOTE('ACE_EarPlugs' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_EarPlugs_ShortName);
description = CSTRING(Items_EarPlugs_Description);
tip = "<a href='https://ace3.acemod.org/wiki/feature/hearing'>Hearing Wiki</a>";
};
class ACE_EntrenchingTool: ACE_FieldManual_Base {
logicalOrder = 11;
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;
displayName = CSTRING(Items_Flashlights_DisplayName);
displayNameShort = CSTRING(Items_Flashlights_ShortName);
description = CSTRING(Items_Flashlights_Description);
tip = "<a href='https://ace3.acemod.org/wiki/feature/flashlights'>Flashlights Wiki</a>";
};
class ACE_FortifyTool: ACE_FieldManual_Base {
logicalOrder = 13;
arguments[] += {QUOTE('ACE_HuntIR_Monitor' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_FortifyTool_ShortName);
description = CSTRING(Items_FortifyTool_Description);
tip = "<a href='https://ace3.acemod.org/wiki/feature/fortify'>Fortify Wiki</a>";
};
class ACE_HuntIR_Monitor: ACE_FieldManual_Base {
logicalOrder = 14;
arguments[] += {QUOTE('ACE_CableTie' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_HuntIR_Monitor_ShortName);
description = CSTRING(Items_HuntIR_Monitor_Description);
tip = "<a href='https://ace3.acemod.org/wiki/feature/huntir'>HuntIR Wiki</a>";
};
class ACE_IR_Strobe: ACE_FieldManual_Base {
logicalOrder = 15;
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;
arguments[] += {QUOTE('ACE_Kestrel4500' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_Kestrel4500_ShortName);
description = CSTRING(Items_Kestrel4500_Description);
tip = "<a href='https://ace3.acemod.org/wiki/feature/kestrel4500'>Kestrel 4500 Wiki</a>";
};
class ACE_Lockpick: ACE_FieldManual_Base {
logicalOrder = 17;
arguments[] += {QUOTE('ACE_key_lockpick' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_Lockpick_ShortName);
description = CSTRING(Items_Lockpick_Description);
tip = "<a href='https://ace3.acemod.org/wiki/framework/vehiclelock-framework.html'>Vehicle Lock Wiki</a>";
};
class ACE_MapTools: ACE_FieldManual_Base {
logicalOrder = 18;
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;
arguments[] += {QUOTE('ACE_microDAGR' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_MicroDAGR_ShortName);
description = CSTRING(Items_MicroDAGR_Description);
tip = "<a href='https://ace3.acemod.org/wiki/feature/microdagr.html'>MicroDAGR Wiki</a>";
};
// Combine all range tables under one roof [mortar, artillery, rifle]
class ACE_RangeTables: ACE_FieldManual_Base {
logicalOrder = 20;
displayName = CSTRING(Items_RangeTables_DisplayName);
displayNameShort = CSTRING(Items_RangeTables_ShortName);
description = CSTRING(Items_RangeTables_Description);
tip = "<a href='https://ace3.acemod.org/wiki/feature/rangecard'>Rangecard Wiki</a>";
};
class ACE_Ropes: ACE_FieldManual_Base {
logicalOrder = 21;
displayName = CSTRING(Items_Ropes_DisplayName);
displayNameShort = CSTRING(Items_Ropes_ShortName);
description = CSTRING(Items_Ropes_Description);
};
class ACE_Sandbag: ACE_FieldManual_Base {
logicalOrder = 22;
arguments[] += {QUOTE('ACE_Sandbag_empty' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_Sandbag_ShortName);
description = CSTRING(Items_Sandbag_Description);
tip = "<a href='https://ace3.acemod.org/wiki/feature/sandbags'>Sandbag Wiki</a>";
};
class ACE_SpareBarrels: ACE_FieldManual_Base {
logicalOrder = 23;
arguments[] += {QUOTE('ACE_SpareBarrel_Item' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_SpareBarrels_ShortName);
description = CSTRING(Items_SpareBarrels_Description);
tip = "<a href='https://ace3.acemod.org/wiki/feature/overheating'>Overheating Wiki</a>";
};
class ACE_SprayPaint: ACE_FieldManual_Base {
logicalOrder = 24;
displayName = CSTRING(Items_SprayPaint_DisplayName);
displayNameShort = CSTRING(Items_SprayPaint_ShortName);
description = CSTRING(Items_SprayPaint_Description);
tip = "<a href='https://ace3.acemod.org/wiki/feature/tagging'>Tagging Wiki</a>";
};
class ACE_Tripod: ACE_FieldManual_Base {
logicalOrder = 25;
arguments[] += {QUOTE('ACE_Tripod' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_Tripod_ShortName);
description = CSTRING(Items_Tripod_Description);
tip = "<a href='https://ace3.acemod.org/wiki/feature/tripod'>Tripod Wiki</a>";
};
class ACE_UAVBattery: ACE_FieldManual_Base {
logicalOrder = 26;
arguments[] += {QUOTE('ACE_UAVBattery' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_UAVBattery_ShortName);
description = CSTRING(Items_UAVBattery_Description);
tip = "<a href='https://ace3.acemod.org/wiki/feature/logistics-uavbattery'>UAV Battery Wiki</a>";
};
class ACE_VehicleKey: ACE_FieldManual_Base {
logicalOrder = 27;
displayName = CSTRING(Items_VehicleKey_DisplayName);
displayNameShort = CSTRING(Items_VehicleKey_ShortName);
description = CSTRING(Items_VehicleKey_Description);
tip = "<a href='https://ace3.acemod.org/wiki/framework/vehiclelock-framework.html'>Vehicle Lock Wiki</a>";
};
class ACE_Wirecutter: ACE_FieldManual_Base {
logicalOrder = 28;
arguments[] += {QUOTE('ACE_wirecutter' call FUNC(getItemName))};
displayName = "%14";
displayNameShort = CSTRING(Items_Wirecutter_ShortName);
description = CSTRING(Items_Wirecutter_Description);
tip = "<a href='https://ace3.acemod.org/wiki/feature/logistics-wirecutter'>Wirecutter Wiki</a>";
};
};
// ACE Field Rations
class ACE_Field_Rations {
displayName = CSTRING(Field_Rations_DisplayName);
category = "ACE_FieldManual";
class ACE_Field_Rations_Base: ACE_FieldManual_Base {
tip = "<a href='https://ace3.acemod.org/wiki/framework/field-rations-framework'>Field Rations Wiki</a>";
};
class Hunger: ACE_Field_Rations_Base {
logicalOrder = 1;
displayName = CSTRING(Field_Rations_Hunger_DisplayName);
description = CSTRING(Field_Rations_Hunger_Description);
};
class Thirst: ACE_Field_Rations_Base {
logicalOrder = 2;
displayName = CSTRING(Field_Rations_Thirst_DisplayName);
description = CSTRING(Field_Rations_Thirst_Description);
};
};
// ACE Medical
class ACE_Medical_Treatment {
displayName = CSTRING(Medical_Treatment_DisplayName);
category = "ACE_FieldManual";
class ACE_Medical_Treatment_Base: ACE_FieldManual_Base {
arguments[] += {
// MEDICAL MENU KEYBIND - %14
QUOTE([ARR_2('ACE3 Common', QQEGVAR(medical_gui,openMedicalMenuKey))] call FUNC(getKeybindName))
};
tip = "<a href='https://ace3.acemod.org/wiki/feature/medical-system'>Medical Wiki</a>";
};
class ACE_Adenosine: ACE_Medical_Treatment_Base {
logicalOrder = 1;
arguments[] += {QUOTE('ACE_adenosine' call FUNC(getItemName))};
displayName = "%15";
displayNameShort = CSTRING(Medical_Treatment_Adenosine_ShortName);
description = CSTRING(Medical_Treatment_Adenosine_Description);
};
class ACE_Bandages: ACE_Medical_Treatment_Base {
logicalOrder = 2;
displayName = CSTRING(Medical_Treatment_Bandages_DisplayName);
displayNameShort = CSTRING(Medical_Treatment_Bandages_ShortName);
description = CSTRING(Medical_Treatment_Bandages_Description);
};
class ACE_Fluids: ACE_Medical_Treatment_Base {
logicalOrder = 3;
displayName = CSTRING(Medical_Treatment_IVFluids_DisplayName);
displayNameShort = CSTRING(Medical_Treatment_IVFluids_ShortName);
description = CSTRING(Medical_Treatment_IVFluids_Description);
};
class ACE_Epinephrine: ACE_Medical_Treatment_Base {
logicalOrder = 4;
arguments[] += {QUOTE('ACE_epinephrine' call FUNC(getItemName))};
displayName = "%15";
displayNameShort = CSTRING(Medical_Treatment_Epinephrine_ShortName);
description = CSTRING(Medical_Treatment_Epinephrine_Description);
};
class ACE_PAK: ACE_Medical_Treatment_Base {
logicalOrder = 5;
arguments[] += {QUOTE('ACE_personalAidKit' call FUNC(getItemName))};
displayName = "%15";
displayNameShort = CSTRING(Medical_Treatment_PAK_ShortName);
description = CSTRING(Medical_Treatment_PAK_Description);
};
class ACE_Splint: ACE_Medical_Treatment_Base {
logicalOrder = 6;
arguments[] += {QUOTE('ACE_splint' call FUNC(getItemName))};
displayName = "%15";
displayNameShort = CSTRING(Medical_Treatment_Splint_ShortName);
description = CSTRING(Medical_Treatment_Splint_Description);
};
class ACE_SurgicalKit: ACE_Medical_Treatment_Base {
logicalOrder = 7;
arguments[] += {QUOTE('ACE_surgicalKit' call FUNC(getItemName))};
displayName = "%15";
displayNameShort = CSTRING(Medical_Treatment_SurgicalKit_ShortName);
description = CSTRING(Medical_Treatment_SurgicalKit_Description);
};
class ACE_Tourniquet: ACE_Medical_Treatment_Base {
logicalOrder = 8;
arguments[] += {QUOTE('ACE_tourniquet' call FUNC(getItemName))};
displayName = "%15";
displayNameShort = CSTRING(Medical_Treatment_CAT_ShortName);
description = CSTRING(Medical_Treatment_CAT_Description);
};
};
};

View File

@ -0,0 +1,4 @@
TRACE_1("",QUOTE(ADDON));
PREP(getItemName);
PREP(getKeybindName);

View File

@ -0,0 +1,3 @@
#include "script_component.hpp"
#include "XEH_PREP.hpp"

View File

@ -0,0 +1,2 @@
[preprocess]
enabled = false

View File

@ -0,0 +1,19 @@
#include "script_component.hpp"
class CfgPatches {
class ADDON {
name = COMPONENT_NAME;
units[] = {};
weapons[] = {};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"ace_common"};
author = ECSTRING(common,ACETeam);
authors[] = {"Hypoxic"};
url = ECSTRING(main,URL);
VERSION_CONFIG;
};
};
#include "CfgEventHandlers.hpp"
#include "CfgHintCategories.hpp"
#include "CfgHints.hpp"

View File

@ -0,0 +1,23 @@
#include "..\script_component.hpp"
/*
* Author: PabstMirror
* Gets item's localized name or indicates if not availabe
*
* Arguments:
* 0: Classname <STRING>
*
* Return Value:
* <STRING>
*
* Example:
* "ACE_Banana" call ace_fieldmanual_fnc_getItemName
*
* Public: No
*/
params ["_classname"];
private _config = configFile >> "CfgWeapons" >> _classname;
if (isClass _config) then {
getText (_config >> "displayName")
} else {
format ["[N/A] - %1", _classname]
};

View File

@ -0,0 +1,34 @@
#include "..\script_component.hpp"
/*
* Author: Hypoxic, PabstMirror
* Gets keybind name from CBA
*
* Arguments:
* 0: Addon <STRING>
* 1: Key Name <STRING>
*
* Return Value:
* <STRING>
*
* Example:
* ["ACE3 Common", "ace_interact_menu_selfInteractKey"] call ace_fieldmanual_fnc_getKeybindName
*
* Public: No
*/
params ["_addon", "_keyName"];
private _return = _keyName;
with missionNamespace do { // hint is calling from uiNamespace
private _keyInfo = [_addon, _keyName] call CBA_fnc_getKeybind;
if (!isNil "_keyInfo") then {
private _localizeInfo = _keyInfo select 8 param [0, []];
if (_localizeInfo isEqualTo []) then {
_return = format ["%1 -> %2", _addon, _keyInfo select 2];
} else {
_return = format ["%1 -> %2 (%3)", _addon, _keyInfo select 2, _localizeInfo call CBA_fnc_localizeKey];
};
};
};
_return

View File

@ -0,0 +1,19 @@
#define COMPONENT fieldmanual
#define COMPONENT_BEAUTIFIED Field Manual
#include "\z\ace\addons\main\script_mod.hpp"
// #define DEBUG_MODE_FULL
// #define DISABLE_COMPILE_CACHE
// #define ENABLE_PERFORMANCE_COUNTERS
#ifdef DEBUG_ENABLED_FIELDMANUAL
#define DEBUG_MODE_FULL
#endif
#ifdef DEBUG_SETTINGS_FIELDMANUAL
#define DEBUG_SETTINGS DEBUG_SETTINGS_FIELDMANUAL
#endif
#include "\z\ace\addons\main\script_macros.hpp"
#include "\a3\ui_f\hpp\defineDIKCodes.inc"

View File

@ -0,0 +1,293 @@
<?xml version="1.0" encoding="utf-8"?>
<Project name="ACE">
<Package name="FieldManual">
<Key ID="STR_ACE_FieldManual_Field_Rations_DisplayName">
<English>Field Rations</English>
<Chinese>戰地口糧</Chinese>
<Chinesesimp>野战军粮</Chinesesimp>
<Czech>Poměrové pole</Czech>
<French>Rations sur le terrain</French>
<German>Feld Rationen</German>
<Hungarian>Terepi adagok</Hungarian>
<Italian>Razioni di campo</Italian>
<Japanese>フィールド レーション</Japanese>
<Korean>전투식량</Korean>
<Polish>Racje polowe</Polish>
<Portuguese>Rações de campo</Portuguese>
<Russian>Полевые рационы</Russian>
<Spanish>Raciones de campo</Spanish>
<Turkish>Gıda Ihtiyaçları</Turkish>
</Key>
<Key ID="STR_ACE_FieldManual_Field_Rations_Hunger_DisplayName">
<English>Hunger</English>
</Key>
<Key ID="STR_ACE_FieldManual_Field_Rations_Hunger_Description">
<English>%3Hunger%4 increases linearly with soldier's movement speed. Restore by eating food.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Pick up food.&lt;br/&gt;%2Use [%3%12%4] and select %3Survival%4.&lt;br/&gt;%2Choose an item to consume.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Field_Rations_Thirst_DisplayName">
<English>Thirst</English>
</Key>
<Key ID="STR_ACE_FieldManual_Field_Rations_Thirst_Description">
<English>%3Thirst%4 increases linearly with soldier's movement speed. Restore by drinking liquids.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Pick up a drink.&lt;br/&gt;%2Use [%3%12%4] and select %3Survival%4.&lt;br/&gt;%2Choose an item to consume.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_DisplayName">
<English>Medical Treatment</English>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_Adenosine_ShortName">
<English>Decrease Heart Rate</English>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_Adenosine_Description">
<English>%3Adenosine%4 is used to decrease heart rate.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Use [%3%13%4] or [%3%14%4] and select an appendage.&lt;br/&gt;%2Inject %3Adenosine%4.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_Bandages_DisplayName">
<English>Bandages</English>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_Bandages_ShortName">
<English>Close Wounds</English>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_Bandages_Description">
<English>%3Bandages%4 stop bleeding and close wounds. Depending on your settings, bandages may reopen if surgery is not performed.&lt;br/&gt;&lt;br/&gt;%2%3Field Dressing:%4&lt;br/&gt;%11&lt;t color='#D9D900'&gt;Average&lt;/t&gt; In All Categories&lt;br/&gt;%2%3Packing Bandage:%4&lt;br/&gt;%11&lt;t color='#D9D900'&gt;Average&lt;/t&gt; Treatment&lt;br/&gt;%11&lt;t color='#E60000'&gt;Higher&lt;/t&gt; Reopen Chance&lt;br/&gt;%11&lt;t color='#00CC00'&gt;Longer&lt;/t&gt; Reopen Delay&lt;br/&gt;%2%3Elastic Bandage:%4&lt;br/&gt;%11&lt;t color='#00CC00'&gt;Higher&lt;/t&gt; Treatment&lt;br/&gt;%11&lt;t color='#E60000'&gt;Higher&lt;/t&gt; Reopen Chance&lt;br/&gt;%11&lt;t color='#E60000'&gt;Shorter&lt;/t&gt; Reopen Delay&lt;br/&gt;%2%3Quickclot:%4&lt;br/&gt;%11&lt;t color='#E60000'&gt;Lower&lt;/t&gt; Treatment&lt;br/&gt;%11&lt;t color='#00CC00'&gt;Lower&lt;/t&gt; Reopen Chance&lt;br/&gt;%11&lt;t color='#00CC00'&gt;Longer&lt;/t&gt; Reopening Delay&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Use [%3%13%4] or [%3%14%4] and select a injured body part.&lt;br/&gt;%2Bandage body part by selecting desired %3Bandage%4 type.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_IVFluids_DisplayName">
<English>IV Fluids</English>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_IVFluids_ShortName">
<English>Restore Blood Volume</English>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_IVFluids_Description">
<English>%3IV fluids%4 restore lost blood volume. Blood, Plasma, and Saline are functionally the same.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Use [%3%13%4] or [%3%14%4] and select an appendage.&lt;br/&gt;%2Restore blood volume by selecting desired %3IV Fluid%4 type.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_Epinephrine_ShortName">
<English>Increase Heart Rate | Wake Up Faster</English>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_Epinephrine_Description">
<English>%3Epinephrine%4 increases a patient's pulse as well as potentially decreasing the time between consciousnesss checks (effectively reducing the time needed for the patient to wake up).&lt;br/&gt;&lt;br/&gt;%3Usage%4&lt;br/&gt;%2Use [%3%13%4] or [%3%14%4] and select an appendage.&lt;br/&gt;%2Inject %3Epinephrine%4.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_PAK_ShortName">
<English>Restore Like New</English>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_PAK_Description">
<English>The %3Personal Aid Kit%4 is an item that allows a soldier to be fully healed. Independent of %3ACE Settings%4, it requires that the patient is in %3Stable Condition%4 before use.&lt;br/&gt;&lt;br/&gt;%3Stable Condition%4 qualifies as:&lt;br/&gt;%2Unit is %3Alive%4.&lt;br/&gt;%2Unit is %3Conscious%4.&lt;br/&gt;%2Unit has no active %3Bleeding%4.&lt;br/&gt;%2Heart Rate &gt;= 40.&lt;br/&gt;%2Systolic BP &gt;= 60.&lt;br/&gt;%2Diastolic BP &gt;= 50.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Move to appropriate location depending on %3ACE Settings%4.&lt;br/&gt;%2Use [%3%13%4] or [%3%14%4] and select %3Advanced Treatments%4&lt;br/&gt;%2Select %3Use Personal Aid Kit%4.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_Splint_ShortName">
<English>Fix Fractures</English>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_Splint_Description">
<English>A %3Splint%4 is used to fix fractures. The %3Splint%4 is consumed when used.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Use [%3%13%4] or [%3%14%4] and select an affected appendage.&lt;br/&gt;%2Select %3Apply Splint%4.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_SurgicalKit_ShortName">
<English>Prevent Wounds From Reopening</English>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_SurgicalKit_Description">
<English>A %3Surgical Kit%4 is used to prevent wounds from reopening after being bandaged. Depending on settings, it can also clear trauma.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Use [%3%13%4] or [%3%14%4] and select %3Advanced Treatment%4.&lt;br/&gt;%2Select %3Use Surgical Kit%4.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_CAT_ShortName">
<English>Stop Bleeding</English>
</Key>
<Key ID="STR_ACE_FieldManual_Medical_Treatment_CAT_Description">
<English>A %3Tourniquet%4 stops bleeding temporarily so that a wound(s) can be bandaged. Can only be used on limbs.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Use [%3%13%4] or [%3%14%4] and select an affected appendage.&lt;br/&gt;%2Select %3Apply Tourniquet%4.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_ATragMX_ShortName">
<English>Portable, Precise, Rugged</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_ATragMX_Description">
<English>The %3Horus ATragMX%4 considers atmospheric conditions, gun data, ammunition, range, speed, and muzzle velocity to calculate precise aiming solutions with %3Come-Up%4 results - and even accounts for %3Coriolis%4 and %3Spin Drift%4 effects. %3ATragMX%4, loaded on a handheld computer made by %3TDS Recon%4, is easy to use and lightning fast. The %3Recon%4 meets the rigorous %3MIL-STD-810F%4 military standard for drops, vibration, humidity, altitude and extreme temperatures.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;Please visit the wiki page for more information.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_BodyBag_ShortName">
<English>Bring Out Your Dead</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_BodyBag_Description">
<English>%3Body Bags%4 are used to transport dead bodies. They can be dragged and loaded into vehicles.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Approach a dead body.&lt;br/&gt;%2Use [%3%13%4] or [%3%14%4] and select %3Place Body In Bodybag%4.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_CableTie_ShortName">
<English>Take Prisoners</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_CableTie_Description">
<English>%3Cable Ties%4 enable a soldier to capture and detain another soldier. Once apprehended, the captor gains the ability to inspect the prisoner's belongings, set them free, or accompany them to an alternate area. Transporting escorted prisoners is also possible, including loading them into vehicles if needed. Depending on your settings, units may need to surrender before being taken captive.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Approach the unit and use the [%3%13%4].&lt;br/&gt;%2The interaction is located around the hands in the form of a handcuffs icon.&lt;br/&gt;%2Repeat to release.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Cellphone_ShortName">
<English>Phone In An Explosion</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Cellphone_Description">
<English>The %3Cellphone%4 is functionally a %3Clacker%4. Use it to connect and detonate an explosive device. Multiple devices can be linked to the cellphone and called within the phonebook.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Place an explosive.&lt;br/&gt;%2Use [%3%13%4], select %3Explosives%4, and select %3Cellphone%4.&lt;br/&gt;%2Open the cellphone interface with [%3%12%4].&lt;br/&gt;%2Navigate the phone book with the arrows and select your calling number.&lt;br/&gt;%2Call the number to detonate.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Chemlight_Shield_ShortName">
<English>Portable Reading Lights</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Chemlight_Shield_Description">
<English>%3Chemlight Shields%4 give you the ability to read your map, even in dark environments. However, when using %3Chemlight Shields%4, you will have a slight glow around you.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Use [%3%12%4] and select %3Equipment%4.&lt;br/&gt;%2elect %3Chemlights%4 and %3Prepare Chemlight Shield (Color)%4.&lt;br/&gt;%2Open %3Map%4.&lt;br/&gt;%2Use [%3%12%4] and select %3Flashlights%4 where you will find your chemlight shield.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Clackers_ShortName">
<English>Remote Detonation</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Clackers_Description">
<English>Use %3Clackers%4 to connect and detonate an explosive device. Multiple devices can be linked to a clacker and detonated on different channels.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Place an explosive.&lt;br/&gt;%2Use [%3%13%4], select %3Explosives%4, and select the %3Clacker%4 you wish to link to.&lt;br/&gt;%2Open the ACE interface with [%3%12%4].&lt;br/&gt;%2Select %3Explosives%4 and select a %3Clacker%4.&lt;br/&gt;%2Select the %3Explosive%4 you wish to detonate.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_DAGR_ShortName">
<English>Navigate</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_DAGR_Description">
<English>The %3DAGR%4 is a simpler version of the %3MicroDAGR GPS%4. It has similar features but lacks the topographic and satellite imaging functions of the %3MicroDAGR GPS%4.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Equip a %3DAGR%4.&lt;br/&gt;%2Use [%3%12%4] and select %3Configure%4 or %3Toggle%4.&lt;br/&gt;&lt;br/&gt;The following menus are available when configuring your %3DAGR:%4&lt;br/&gt;%11%2Data View: WIP&lt;br/&gt;%11%2GoTo WP: Select a waypoint to track.&lt;br/&gt;%11%2WP List: Add/Edit/Remove waypoints.&lt;br/&gt;%11%2Connect To: Connect %3DAGR%4 to the %3Vector 21 Rangefinder%4.&lt;br/&gt;%11%2Options</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_DeadManSwitch_ShortName">
<English>Explosive Revenge</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_DeadManSwitch_Description">
<English>The %3Dead Man's Switch%4 is a device that allows a soldier to detonate an %3Explosive%4 when the soldier dies.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Use [%3%12%4] and select %3Explosives%4.&lt;br/&gt;%2Select %3Dead Man's Switch%4 and connect the desired %3Explosive%4.&lt;br/&gt;%2Repeat the process and disconnect to reverse.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_DefusalKit_Description">
<English>The %3Defusal Kit%4 allows defusal of explosives.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Equip a %3Defusal Kit%4.&lt;br/&gt;%2Safely approach an %3Explosive%4.&lt;br/&gt;%2Use [%3%13%4] and select %3Defuse%4.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_DefusalKit_ShortName">
<English>Defuse Explosives</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_EarPlugs_ShortName">
<English>Protect Your Hearing</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_EarPlugs_Description">
<English>%3Ear Plugs%4 help prevent hearing damage from repeat loud noises near a soldier. Insert %3Ear Plugs%4 to lower volume of a soldier's environment and prevent %3Combat Deafness%4.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Use [%3%12%4] and select %3Equipment%4.&lt;br/&gt;%2Insert %3Ear Plugs%4.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_EntrenchingTool_ShortName">
<English>Get To Cover</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_EntrenchingTool_Description">
<English>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.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Equip an %3Entrenching Tool%4.&lt;br/&gt;%2Use [%3%12%4] and select %3Equipment%4.&lt;br/&gt;%2Select the type of trench you wish to build.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Flashlights_DisplayName">
<English>Flashlights</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Flashlights_ShortName">
<English>Illuminate Your Map</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Flashlights_Description">
<English>%3Flashlights%4 give you the ability to read your map, even in dark environments. However, when using %3Flashlights%4, you will have a slight glow around you.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2On the map screen, use [%3%12%4] and select %3Flashlights%4.&lt;br/&gt;%2Select the %3Flashlight%4 you want to use and select %3On%4.&lt;br/&gt;&lt;br/&gt;%3Available Flashlight Items%4:&lt;br/&gt;%2 Fulton MX-991&lt;br/&gt;%2 KSF-1&lt;br/&gt;%2 Maglite XL50&lt;br/&gt;&lt;br/&gt;%3NOTE:%4&lt;br/&gt;Flashlight states are persistent.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_HuntIR_Monitor_ShortName">
<English>Observe From The Skies</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_HuntIR_Monitor_Description">
<English>The %3High-Altitude Unit Navigated Tactical Imaging Round (HuntIR)%4 is designed to be fired from a grenade launcher. After being fired in the air, the built-in parachute will be deployed and the IR CMOS camera will activate, providing a video stream until it touches the ground or is shot down.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Equip a %3HuntIR Monitor%4 and compatible ammunition.&lt;br/&gt;%2Fire the %3HuntIR Round%4 as high as possible over the area you want to observe.&lt;br/&gt;%2Open the %3HuntIR Monitor%4.&lt;br/&gt;%2Use [%3%12%4], select %3Equipment%4.&lt;br/&gt;%2Select %3Activate HuntIR Monitor%4.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_IR_Strobe_ShortName">
<English>Track Your Team With Stealth</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_IR_Strobe_Description">
<English>The %3IR Strobe%4 is a throwable that emits an IR light pulse intermittently. The %3IR Strobe%4 can also be attached to a soldier, making it useful for tracking teammates under night vision devices.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Use [%3%12%4] and select %3Equipment%4.&lt;br/&gt;%2Select %3Attach%4 and select the %3IR Strobe%4.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Kestrel4500_ShortName">
<English>Pocket Weatherstation</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Kestrel4500_Description">
<English> The %3Kestrel 4500 Pocket Weather Tracker%4 is a mini weather station useful for collecting the the following weather data:&lt;br/&gt;%2Heading and wind direction&lt;br/&gt;%2Crosswind and headwind&lt;br/&gt;%2Altitude and barometric pressure&lt;br/&gt;%2Wet bulb temperature&lt;br/&gt;%2Humidity and dewpoint&lt;br/&gt;%2Density altitude&lt;br/&gt;%2Wind chill and temperature&lt;br/&gt;%2Time and date&lt;br/&gt;%2Minimum, maximum, and average values&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Equip a %3Kestrel%4.&lt;br/&gt;%2Use [%3%12%4] and select %3Equipment%4.&lt;br/&gt;%2Select %3Open%4.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_MapTools_ShortName">
<English>Triangulate Your Position</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_MapTools_Description">
<English>The %3Map Tools%4 are a set of tools that allows a soldier to measure distances and angles. Useful for land, and calculating firing solutions for artillery.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Open %3Map%4.&lt;br/&gt;%2Use [%3%12%4] and select %3Map Tools%4.&lt;br/&gt;%2 The Tool can be moved by dragging with [%3Left-Click%4] while holding [%3ALT%4].</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_MicroDAGR_ShortName">
<English>Advanced DAGR</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_MicroDAGR_Description">
<English>The %3MicroDAGR GPS%4 is an advanced version of the %3DAGR%4. It provides position, navigation, and timing (PNT) data to include:&lt;br/&gt;%2Compass and heading&lt;br/&gt;%2Date and hour synced to the mission&lt;br/&gt;%2Elevation (relative to sea level)&lt;br/&gt;%2Current speed&lt;br/&gt;%2GPS with topographic and satellite view&lt;br/&gt;%2Creating, naming, and deleting waypoints&lt;br/&gt;%2Friendly identification (Requires ACE BLUFOR Tracker Setting)&lt;br/&gt;Connection to the Vector-21 Rangefinder for data import (waypoint creation and grid reference of ranged targets)&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2For usage instructions, please visit the dedicated %3MicroDAGR%4 wiki.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_RangeTables_DisplayName">
<English>Range Tables</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_RangeTables_ShortName">
<English>Get A Firing Solution</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_RangeTables_Description">
<English>%3Range Tables%4 allow for a soldier to estimate accurate shot placement on direct or indirect targets (depending on asset). The %3Range Table%4 will automatically fill depending on the soldiers selected weapon/vehicle.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Use [%3%12%4] and select %3Equipment%4.&lt;br/&gt;%2Select the desired %3Range Table%4.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Ropes_DisplayName">
<English>Ropes</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Ropes_ShortName">
<English>Tow With Ease</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Ropes_Description">
<English>%3Ropes%4 have multiple uses including %3Towing%4 vehicles and %3Fast Roping%4 from helicopters.&lt;br/&gt;&lt;br/&gt;%3Towing:%4&lt;br/&gt;%2Approach a vehicle.&lt;br/&gt;%2Use [%3%13%4] and select %3Towing%4.&lt;br/&gt;%2Select rope length.&lt;br/&gt;%2Select attachment point on towing vehicle.&lt;br/&gt;%2Select attachment on towed vehicle.&lt;br/&gt;&lt;br/&gt;%3Available Rope Lengths:%4&lt;br/&gt;%2 3.2 meters&lt;br/&gt;%2 6.2 meters&lt;br/&gt;%2 12.2 meters&lt;br/&gt;%2 15.2 meters&lt;br/&gt;%2 18.3 meters&lt;br/&gt;%2 27.4 meters&lt;br/&gt;%2 36.6 meters</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Sandbag_ShortName">
<English>Expand Your Fortifications</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Sandbag_Description">
<English>%3Sandbags%4 are sacks made of sturdy material, filled with sand, used for a variety of purposes such as creating barriers or providing stability in construction projects. Useful in expanding larger placed fortifications.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Equip a %3Sandbag (Empty)%4.&lt;br/&gt;%2Use [%3%12%4] and select %3Deploy Sandbag%4.&lt;br/&gt;%2Follow on-screen instructions for placement.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_SpareBarrels_ShortName">
<English>Lower Firearm Temperature</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_SpareBarrels_Description">
<English>%3Spare Barrels%4 allow a soldier to reduce their weapon's heat significantly. After a short delay, the weapon's barrel will be swapped and its heat reduced. A soldier may also check the temperature of any barrels within their inventory. Not all weapons support swapping barrels.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Use [%3%12%4] and select %3Equipment%4.&lt;br/&gt;%2Select %3Swap Barrel%4.&lt;br/&gt;%2Resume operation after barrel swap is complete.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_SprayPaint_DisplayName">
<English>Spray Paint</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_SprayPaint_ShortName">
<English>Tag Your Territory</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_SprayPaint_Description">
<English>%3Spray Paint%4 is used to tag surfaces with various symbols.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Move close to a surface (wall, vehicle, ground, etc).&lt;br/&gt;%2Use [%3%12%4] and select %3Tag%4.&lt;br/&gt;%2Choose a symbol.&lt;br/&gt;&lt;br/&gt;%3Available Colors:%4&lt;br/&gt;%2Black&lt;br/&gt;%2Blue&lt;br/&gt;%2Green&lt;br/&gt;%2Red</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Tripod_ShortName">
<English>Brace From Anywhere</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Tripod_Description">
<English>The %3SSWT Kit%4 is a deployable tripod that allows a soldier to brace their aim when deployed. Use it when you need an elevated shooting position and there are no other objects around.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Use [%3%12%4] and select %3Equipment%4.&lt;br/&gt;%2Select %3SSWT Kit%4 and follow the on screen prompts to place.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_UAVBattery_ShortName">
<English>Keep Eyes In The Sky</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_UAVBattery_Description">
<English>%3UAV Batteries%4 are used to recharge a UAV's energy storage. Especially useful for small UAVs.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Equip a %3UAV Battery%4&lt;br/&gt;%2Approach a %3UAV%4 with its %3Engine Off%4.&lt;br/&gt;%2Use [%3%13%4] and select %3Recharge%4.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Wirecutter_ShortName">
<English>Making An Entrance</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Wirecutter_Description">
<English>%3Wirecutters%4 are a tool that allows a soldier to bypass wired fencing. Useful for creating backdoor entrances into secure areas.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Move close to a fence.&lt;br/&gt;%2Use [%3%12%4] and select %3Cut Fence%4.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_DisplayName">
<English>Items</English>
<Chinese>物品</Chinese>
<French>Objets</French>
<Spanish>Objetos</Spanish>
<Italian>Oggetti</Italian>
<Polish>Przedmioty</Polish>
<Russian>Предметы</Russian>
<German>Gegenstände</German>
<Czech>Předměty</Czech>
<Portuguese>Itens</Portuguese>
<Korean>물품</Korean>
<Chinesesimp>物品</Chinesesimp>
<Japanese>アイテム</Japanese>
<Turkish>Eşyalar</Turkish>
</Key>
<Key ID="STR_ACE_FieldManual_HintCategory_FieldManual_DisplayName">
<English>ACE3</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_FortifyTool_ShortName">
<English>Build Fortifications</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_FortifyTool_Description">
<English>The %3Fortify Tool%4 allows soldiers to build fortifications provided by their mission creator.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Pick up a %3FortifyTool%4.&lt;br/&gt;%2Use [%3%12%4] and select %3Fortify%4.&lt;br/&gt;%2Select an available fortification and follow the on screen prompts for placement.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Lockpick_ShortName">
<English>Breaking and Entering</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_Lockpick_Description">
<English>%3Lockpicks%4 are used to gain access to locked vehicles.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Equip a %3Lockpick%4.&lt;br/&gt;%2Approach a %3Locked%4 vehicle.&lt;br/&gt;Use [%3%13%4] and select %3Lockpick Vehicle%4.&lt;br/&gt;&lt;br/&gt;&lt;t underline='1'&gt;%3Note:%4&lt;/t&gt; Lockpicks and keys are only available via scripting or ACE Vehicle Key modules.</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_VehicleKey_DisplayName">
<English>Vehicle Keys</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_VehicleKey_ShortName">
<English>Lock/Unlock Vehicles</English>
</Key>
<Key ID="STR_ACE_FieldManual_Items_VehicleKey_Description">
<English>%3Vehicle Keys%4 are used to lock/unlock your vehicles. Vehicle keys can exist for the whole side, or keys can be created for a particular vehicle itself.&lt;br/&gt;&lt;br/&gt;%3Usage:%4&lt;br/&gt;%2Equip a %3Vehicle Key%4.&lt;br/&gt;%2Approach the vehicle that the key belongs to.&lt;br/&gt;Use [%3%13%4] and select %3Lock/Unlock Vehicle%4.&lt;br/&gt;&lt;br/&gt;&lt;t underline='1'&gt;%3Note:%4&lt;/t&gt; Lockpicks and keys are only available via scripting or ACE Vehicle Key modules.</English>
</Key>
</Package>
</Project>

View File

@ -23,6 +23,7 @@ if (GVAR(openedMenuType) < 0) exitWith {true};
if (uiNamespace getVariable [QGVAR(cursorMenuOpened),false]) then {
(findDisplay 91919) closeDisplay 2;
};
if ((!isNull curatorCamera) && {!isNull (findDisplay 91919)}) then { closeDialog 2; };
if (GVAR(actionSelected)) then {
private _player = ACE_Player;

View File

@ -4,58 +4,86 @@
<Key ID="STR_ACE_IRLight_DBAL_A3_Red">
<English>DBAL-A3 (red)</English>
<German>DBAL-A3 (rot)</German>
<Polish>DBAL-A3 (czerwony)</Polish>
<Korean>DBAL-A3 (빨강)</Korean>
</Key>
<Key ID="STR_ACE_IRLight_DBAL_A3_Green">
<English>DBAL-A3 (green)</English>
<German>DBAL-A3 (grün)</German>
<Polish>DBAL-A3 (zielony)</Polish>
<Korean>DBAL-A3 (녹색)</Korean>
</Key>
<Key ID="STR_ACE_IRLight_DBAL_A3_DescriptionUse">
<English>&lt;t color='#9cf953'&gt;Use: &lt;/t&gt;Turn Laser ON/OFF&lt;br&gt;Double click to switch mode</English>
<German>&lt;t color='#9cf953'&gt;Benutzen: &lt;/t&gt;Laser EIN/AUS&lt;br&gt;Doppelklick um Modus zu wechseln</German>
<Polish>&lt;t color='#9cf953'&gt;Użycie: &lt;/t&gt;Laser WŁ/WYŁ&lt;br&gt;Kliknij dwukrotnie, aby zmienić tryb</Polish>
<Korean>&lt;t color='#9cf953'&gt;사용: &lt;/t&gt;레이저 켜기/끄기&lt;br&gt;터블 클릭으로 모드 전환</Korean>
</Key>
<Key ID="STR_ACE_IRLight_DBAL_A3_DescriptionShort">
<English>Dual Beam Aiming Laser</English>
<German>Doppelstrahllaservisier</German>
<Polish>Laser Celowniczy z Podwójną Wiązką</Polish>
<Korean>이중 빔 조준 레이저</Korean>
</Key>
<Key ID="STR_ACE_IRLight_Mode_VisiblePointer">
<English>Visible Laser</English>
<German>Sichtbarer Laser</German>
<Polish>Laser Widzialny</Polish>
<Korean>가시 레이저</Korean>
</Key>
<Key ID="STR_ACE_IRLight_Mode_IRPointer">
<English>IR Laser</English>
<German>IR-Laser</German>
<Polish>Laser IR</Polish>
<Korean>적외선 레이저</Korean>
</Key>
<Key ID="STR_ACE_IRLight_Mode_IRIlluminator">
<English>IR Illuminator</English>
<German>IR-Taschenlampe</German>
<Polish>Iluminator IR</Polish>
<Korean>적외선 조명</Korean>
</Key>
<Key ID="STR_ACE_IRLight_Mode_IRDual">
<English>IR Laser and Illuminator</English>
<German>IR-Laser und -Licht</German>
<Polish>Laser IR i Iluminator</Polish>
<Korean>적외선 레이저와 조명</Korean>
</Key>
<Key ID="STR_ACE_IRLight_Mode_Wide">
<English>Wide Beam</English>
<German>Breiter Lichtstrahl</German>
<Polish>Szeroka Wiązka</Polish>
<Korean>넓은 빔</Korean>
</Key>
<Key ID="STR_ACE_IRLight_Mode_Medium">
<English>Medium Beam</English>
<German>Mittlerer Lichtstrahl</German>
<Polish>Średnia Wiązka</Polish>
<Korean>중간 빔</Korean>
</Key>
<Key ID="STR_ACE_IRLight_Mode_Narrow">
<English>Narrow Beam</English>
<German>Schmaler Lichtstrahl</German>
<Polish>Wąska Wiązka</Polish>
<Korean>좁은 빔</Korean>
</Key>
<Key ID="STR_ACE_IRLight_SPIR_DescriptionUse">
<English>&lt;t color='#9cf953'&gt;Use: &lt;/t&gt;Turn Light ON/OFF&lt;br&gt;Double click to switch mode</English>
<German>&lt;t color='#9cf953'&gt;Benutzen: &lt;/t&gt;Licht EIN/AUS&lt;br&gt;Doppelklick um Modus zu wechseln</German>
<Polish>&lt;t color='#9cf953'&gt;Użycie: &lt;/t&gt;Iluminator WŁ/WYŁ&lt;br&gt;Kliknij dwukrotnie, aby zmienić tryb</Polish>
<Korean>&lt;t color='#9cf953'&gt;사용: &lt;/t&gt;조명 켜기/끄기&lt;br&gt;더블 클릭으로 모드 전환</Korean>
</Key>
<Key ID="STR_ACE_IRLight_SPIR_DescriptionShort">
<English>Special Purpose IR LED Illuminator</English>
<German>Infrarot LED Taschenlampe</German>
<Polish>Iluminator IR LED Specjalnego Przeznaczenia</Polish>
<Korean>특수목적 적외선 LED 조명</Korean>
</Key>
<Key ID="STR_ACE_IRLight_MomentarySwitch">
<English>Illuminator / Laser Momentary Switch</English>
<German>Licht / Laser Tastschalter</German>
<Polish>Przełącznik Chwilowy Iluminator / Laser</Polish>
<Korean>조명/레이저 빠르게 스위치</Korean>
</Key>
</Package>
</Project>

View File

@ -1,4 +1,5 @@
#include "script_component.hpp"
#include "\a3\ui_f\hpp\defineDIKCodes.inc"
if (hasInterface) then {
#include "initKeybinds.sqf"
@ -57,15 +58,33 @@ if (hasInterface) then {
};
}] call CBA_fnc_addEventHandler;
["AllVehicles", "init", {
["Air", "init", {
params ["_unit"];
if (hasPilotCamera _unit) then {
if (!alive _unit) exitWith {};
// some helicopters just have a static downward camera for cargo loading
if ((getNumber ((configOf _unit) >> "pilotCamera" >> "controllable")) == 0) exitWith {};
_unit setVariable [QGVAR(hasLaserSpotTracker), true];
_unit setVariable [QGVAR(laserSpotTrackerOn), false];
private _actionOff = ["LSTOff", localize LSTRING(LSTOff), "", {[_this select 0] call FUNC(toggleLST)}, {(_this select 0) getVariable [QGVAR(laserSpotTrackerOn), false]}] call ace_interact_menu_fnc_createAction;
[_unit, 1, ["ACE_SelfActions"], _actionOff] call ace_interact_menu_fnc_addActionToObject;
private _actionOn = ["LSTOn", localize LSTRING(LSTOn), "", {[_this select 0] call FUNC(toggleLST)}, {!((_this select 0) getVariable [QGVAR(laserSpotTrackerOn), false])}] call ace_interact_menu_fnc_createAction;
[_unit, 1, ["ACE_SelfActions"], _actionOn] call ace_interact_menu_fnc_addActionToObject;
private _condition = {
//IGNORE_PRIVATE_WARNING ["_target", "_player"];
(_player == driver _target)
&& {(_target getVariable [QGVAR(laserSpotTrackerOn), false])}
&& {[_player, _target, []] call EFUNC(common,canInteractWith)}
};
private _actionOff = ["LSTOff", localize LSTRING(LSTOff), "", {[_this select 0] call FUNC(toggleLST)}, _condition] call EFUNC(interact_menu,createAction);
[_unit, 1, ["ACE_SelfActions"], _actionOff] call EFUNC(interact_menu,addActionToObject);
private _condition = {
//IGNORE_PRIVATE_WARNING ["_target", "_player"];
(_player == driver _target)
&& {!(_target getVariable [QGVAR(laserSpotTrackerOn), false])}
&& {[_player, _target, []] call EFUNC(common,canInteractWith)}
};
private _actionOn = ["LSTOn", localize LSTRING(LSTOn), "", {[_this select 0] call FUNC(toggleLST)}, _condition] call EFUNC(interact_menu,createAction);
[_unit, 1, ["ACE_SelfActions"], _actionOn] call EFUNC(interact_menu,addActionToObject);
};
}, true, [], true] call CBA_fnc_addClassEventHandler;

View File

@ -7,8 +7,8 @@ PREP_RECOMPILE_START;
PREP_RECOMPILE_END;
// Laser default variables
ACE_DEFAULT_LASER_CODE = 1111;
ACE_DEFAULT_LASER_WAVELENGTH = 1550;
ACE_DEFAULT_LASER_CODE = 1688;
ACE_DEFAULT_LASER_WAVELENGTH = 1064;
ACE_DEFAULT_LASER_BEAMSPREAD = 1;
GVAR(laserEmitters) = createHashMap;

View File

@ -18,7 +18,7 @@
// Dev Debug Function
// Displays lasers and attempts to lock on to codes 1111 and 1112 from a target vehicle's view
// Displays lasers and attempts to lock on to codes 1111 and 1688 from a target vehicle's view
// On Screen Debug:
// Red - Vanilla Laser Targets
// Yellow - Array (vehicle pos/weapon) Laser Targets
@ -31,14 +31,14 @@ private _testSeekerPosASL = _seekerVehicle modelToWorldVisualWorld [0,0,1];
private _testSeekerDir = vectorDirVisual _seekerVehicle;
{
private _code = _x;
private _results = [_testSeekerPosASL, _testSeekerDir, 45, 10000, [1550,1550], _code, _seekerVehicle] call FUNC(seekerFindLaserSpot);
private _results = [_testSeekerPosASL, _testSeekerDir, 45, 10000, [ACE_DEFAULT_LASER_WAVELENGTH, ACE_DEFAULT_LASER_WAVELENGTH], _code, _seekerVehicle] call FUNC(seekerFindLaserSpot);
private _resultPos = _results select 0;
if (!isNil "_resultPos") then {
// Draw lock results
drawLine3D [ASLtoAGL _testSeekerPosASL, ASLtoAGL _resultPos, [0,0,1,1]];
drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa", [0,0,1,1], (ASLtoAGL _resultPos), 1.5, 1.5, 45, format ["%1 from %2", _code, _results select 1], 0.5, 0.025, "TahomaB"];
};
} forEach [1111, 1112]; // Scan at codes 1111 and 1112
} forEach [1111, ACE_DEFAULT_LASER_CODE]; // Scan at codes 1111 and 1688
// Draw all lasers

View File

@ -50,16 +50,27 @@ if (
) exitWith {false};
private _oldLaserCode = _currentShooter getVariable [QGVAR(code), ACE_DEFAULT_LASER_CODE];
private _newLaserCode = _oldLaserCode;
private _newLaserCode = 0;
// "Four-digit code equipment settings range from 1111 to 1788"
// While there is a 0 or 9 in code, keep adding change
if (((_codeChange < 0) && {_oldLaserCode > ACE_DEFAULT_LASER_CODE}) || {(_codeChange > 0) && {_oldLaserCode < 1788}}) then {
_newLaserCode = _oldLaserCode + _codeChange;
while {(((str _newLaserCode) find "0") >= 0) || {((str _newLaserCode) find "9") >= 0}} do {
_newLaserCode = _newLaserCode + _codeChange;
_codeChange = floor((_codeChange max 0) min 2);
private _placeValue = 10 ^ _codeChange;
private _oldDigit = (floor(_oldLaserCode / _placeValue)) % 10;
private _newDigit = _oldDigit + 1;
private _limit = 8;
if (_codeChange == 2) then {_limit = 7};
if (_newDigit > _limit) then {_newDigit = 1};
for "_i" from 0 to 3 step 1 do {
private _digit = floor(_oldLaserCode / (10 ^ _i)) mod 10;
if (_i == _codeChange) then {
_digit = _newDigit;
};
_newLaserCode = _newLaserCode + (_digit * 10 ^ _i);
};
TRACE_2("",_oldLaserCode,_newLaserCode);

View File

@ -7,7 +7,7 @@
* 0: Emitter <OBJECT>
* 1: Owner <OBJECT>
* 2: Method, can be code, which emitter and owner are passed to, a string function name, an array with a position memory point and weapon name, or an array with a position memory point, a vector begining memory point, and vector ending memory point. <STRING><CODE><ARRAY>
* 3: Wavelength (1550nm is common eye safe) <NUMBER>
* 3: Wavelength (1064nm is typical) <NUMBER>
* 4: Laser code <NUMBER>
* 5: Beam divergence (in mils off beam center) <NUMBER>
* 6: Method Args <ANY> (default: nil)
@ -16,8 +16,8 @@
* UUID for sending to laserOff function <STRING>
*
* Example:
* [hmg, hmg, [[0,0,1], "HMG_static"], 1550, 1111, 1] call ace_laser_fnc_laserOn
* [player, player, "ace_laser_fnc_findLaserSource", 1550, 1111, 1, ["pilot"]] call ace_laser_fnc_laserOn
* [hmg, hmg, [[0,0,1], "HMG_static"], 1064, 1688, 1] call ace_laser_fnc_laserOn
* [player, player, "ace_laser_fnc_findLaserSource", 1064, 1688, 1, ["pilot"]] call ace_laser_fnc_laserOn
*
* Public: No
*/

View File

@ -9,7 +9,7 @@
* 1: Direction vector (will be normalized) <ARRAY>
* 2: Seeker FOV in degrees <NUMBER>
* 3: Seeker max distance in meters <NUMBER>
* 4: Seeker wavelength sensitivity range, [1550,1550] is common eye safe <ARRAY>
* 4: Seeker wavelength sensitivity range, [1064,1064] is common <ARRAY>
* 5: Seeker laser code. <NUMBER>
* 6: Ignore 1 (e.g. Player's vehicle) <OBJECT> (default: objNull)
* 7: Ignore 2 (e.g. Attached object) <OBJECT> (default: objNull)
@ -19,7 +19,7 @@
* [Strongest compatible laser spot ASL pos, owner object] Nil array values if nothing found <ARRAY>
*
* Example:
* [getPosASL player, [0,1,0], 90, [1500, 1500], 1111, player] call ace_laser_fnc_seekerFindLaserSpot
* [getPosASL player, [0,1,0], 90, [1064, 1064], 1688, player] call ace_laser_fnc_seekerFindLaserSpot
*
* Public: No
*/

View File

@ -1,16 +1,23 @@
["ACE3 Equipment", QGVAR(LaserCodeUp), localize LSTRING(laserCodeUp),
["ACE3 Equipment", QGVAR(LaserCodeUpHundreds), localize LSTRING(laserCodeUpHundreds),
{
[2] call FUNC(keyLaserCodeChange);
},
{false},
[DIK_Q, [false, true, true]], false, 0] call CBA_fnc_addKeybind; // (ALT+CTRL+Q)
["ACE3 Equipment", QGVAR(LaserCodeUpTens), localize LSTRING(laserCodeUpTens),
{
[1] call FUNC(keyLaserCodeChange);
},
{false},
[16, [false, true, true]], false, 0] call CBA_fnc_addKeybind; // (ALT+CTRL+Q)
[DIK_W, [false, true, true]], false, 0] call CBA_fnc_addKeybind; // (ALT+CTRL+W)
["ACE3 Equipment", QGVAR(LaserCodeDown), localize LSTRING(laserCodeDown),
["ACE3 Equipment", QGVAR(LaserCodeUpOnes), localize LSTRING(laserCodeUpOnes),
{
[-1] call FUNC(keyLaserCodeChange);
[0] call FUNC(keyLaserCodeChange);
},
{false},
[18, [false, true, true]], false, 0] call CBA_fnc_addKeybind; // (ALT+CTRL+E)
[DIK_E, [false, true, true]], false, 0] call CBA_fnc_addKeybind; // (ALT+CTRL+E)

View File

@ -51,22 +51,56 @@
<Chinese>雷射碼</Chinese>
<Turkish>Lazer Kod</Turkish>
</Key>
<Key ID="STR_ACE_Laser_laserCodeUp">
<English>Laser - Cycle Code Up</English>
<German>Lasercode +</German>
<Polish>Laser - Następny kod</Polish>
<French>Code laser +</French>
<Russian>Лазер - увеличить частоту</Russian>
<Portuguese>Laser - Alternar Código para Cima</Portuguese>
<Hungarian>Lézer - kódciklus növelése</Hungarian>
<Spanish>Láser - Aumentar código</Spanish>
<Czech>Laser - Kód +</Czech>
<Italian>Laser - Cambia codice +</Italian>
<Japanese>レーザ - コードの数値を増やす</Japanese>
<Korean>레이저 - 코드 순환 위</Korean>
<Chinesesimp>激光—循环切换激光码 上</Chinesesimp>
<Chinese>雷射 - 循環切換雷射碼 上</Chinese>
<Turkish>Lazer - Çevrim Kodu Yukarı</Turkish>
<Key ID="STR_ACE_Laser_laserCodeUpOnes">
<English>Laser - Cycle Code Up - XXX#</English>
<German>Lasercode +XXX#</German>
<Polish>Laser - Następny kod - XXX#</Polish>
<French>Code laser +XXX#</French>
<Russian>Лазер - увеличить частоту - XXX#</Russian>
<Portuguese>Laser - Alternar Código para Cima - XXX#</Portuguese>
<Hungarian>Lézer - kódciklus növelése - XXX#</Hungarian>
<Spanish>Láser - Aumentar código - XXX#</Spanish>
<Czech>Laser - Kód +XXX#</Czech>
<Italian>Laser - Cambia codice - XXX#</Italian>
<Japanese>レーザ - コードの数値を増やす - XXX#</Japanese>
<Korean>레이저 - 코드 순환 위 - XXX#</Korean>
<Chinesesimp>激光—循环切换激光码 上 - XXX#</Chinesesimp>
<Chinese>雷射 - 循環切換雷射碼 上 - XXX#</Chinese>
<Turkish>Lazer - Çevrim Kodu Yukarı - XXX#</Turkish>
</Key>
<Key ID="STR_ACE_Laser_laserCodeUpTens">
<English>Laser - Cycle Code Up - XX#X</English>
<German>Lasercode +XX#X</German>
<Polish>Laser - Następny kod - XX#X</Polish>
<French>Code laser +XX#X</French>
<Russian>Лазер - увеличить частоту - XX#X</Russian>
<Portuguese>Laser - Alternar Código para Cima - XX#X</Portuguese>
<Hungarian>Lézer - kódciklus növelése - XX#X</Hungarian>
<Spanish>Láser - Aumentar código - 1##X</Spanish>
<Czech>Laser - Kód +XX#X</Czech>
<Italian>Laser - Cambia codice - XX#X</Italian>
<Japanese>レーザ - コードの数値を増やす - XX#X</Japanese>
<Korean>레이저 - 코드 순환 위 - 1##X</Korean>
<Chinesesimp>激光—循环切换激光码 上 - XX#X</Chinesesimp>
<Chinese>雷射 - 循環切換雷射碼 上 - XX#X</Chinese>
<Turkish>Lazer - Çevrim Kodu Yukarı - XX#X</Turkish>
</Key>
<Key ID="STR_ACE_Laser_laserCodeUpHundreds">
<English>Laser - Cycle Code Up - X#XX</English>
<German>Lasercode +X#XX</German>
<Polish>Laser - Następny kod - X#XX</Polish>
<French>Code laser +X#XX</French>
<Russian>Лазер - увеличить частоту - X#XX</Russian>
<Portuguese>Laser - Alternar Código para Cima - X#XX</Portuguese>
<Hungarian>Lézer - kódciklus növelése - X#XX</Hungarian>
<Spanish>Láser - Aumentar código - X#XX</Spanish>
<Czech>Laser - Kód +X#XX</Czech>
<Italian>Laser - Cambia codice - X#XX</Italian>
<Japanese>レーザ - コードの数値を増やす - X#XX</Japanese>
<Korean>레이저 - 코드 순환 위 - X#XX</Korean>
<Chinesesimp>激光—循环切换激光码 上 - X#XX</Chinesesimp>
<Chinese>雷射 - 循環切換雷射碼 上 - X#XX</Chinese>
<Turkish>Lazer - Çevrim Kodu Yukarı - X#XX</Turkish>
</Key>
<Key ID="STR_ACE_Laser_laserCodeDown">
<English>Laser - Cycle Code Down</English>
@ -90,12 +124,14 @@
<Japanese>レーザースポットトラッカー: オン</Japanese>
<Polish>Laserowe Śledzenie Punktu: Wł.</Polish>
<German>Laserziel Verfolgung: An</German>
<Korean>레이저 스팟 추적기: 켬</Korean>
</Key>
<Key ID="STR_ACE_Laser_LSTOff">
<English>Laser Spot Tracker: Off</English>
<Japanese>レーザースポットトラッカー: オフ</Japanese>
<Polish>Laserowe Śledzenie Punktu: Wył.</Polish>
<German>Laserziel Verfolgung: Aus</German>
<Korean>레이저 스팟 추적기: 끔</Korean>
</Key>
<Key ID="STR_ACE_Laser_showLaserOnMap">
<English>Draw Laser on Map</English>

View File

@ -24,7 +24,7 @@ if (_finishTime > 0) exitWith {
if (CBA_missionTime >= _finishTime) then {
TRACE_5("treatment finished",_finishTime,_treatmentTarget,_treatmentEvent,_treatmentArgs,_treatmentItem);
_healer setVariable [QGVAR(currentTreatment), nil];
if ((GVAR(requireItems)) && {_treatmentItem != ""}) then {
if ((GVAR(requireItems) > 0) && {_treatmentItem != ""}) then {
([_healer, _treatmentItem] call FUNC(itemCheck)) params ["_itemOk", "_itemClassname", "_treatmentClass"];
if (!_itemOk) exitWith { _treatmentEvent = "#fail"; }; // no item after delay
_healer removeItem _itemClassname;

View File

@ -18,7 +18,7 @@
* Public: No
*/
if (!GVAR(requireItems)) exitWith { [true] };
if (GVAR(requireItems) == 0) exitWith { [true] };
params ["_healer", "_treatementType"];

View File

@ -15,11 +15,25 @@ private _categoryArray = [ELSTRING(medical,Category), "STR_TEAM_SWITCH_AI"];
] call CBA_fnc_addSetting;
[
QGVAR(requireItems), "CHECKBOX",
QGVAR(requireItems), "LIST",
[LSTRING(requireItems_title), LSTRING(requireItems_desc)],
_categoryArray,
false,
[
[0, 1, 2],
[LELSTRING(Common,Disabled), LELSTRING(Common,Enabled), format ["%1 - %2", LELSTRING(Common,Enabled), LLSTRING(requireItems_autoReplaceItems)]],
0
],
true, // isGlobal
{},
{
if (GVAR(requireItems) != 2) exitWith {};
["CAManBase", "initPost", {
[{
params ["_unit"];
if ((!local _unit) || {!alive _unit} || {isPlayer _unit}) exitWith {};
TRACE_2("replacing medical items on AI",_unit,typeOf _unit);
[_unit] call EFUNC(common,replaceRegisteredItems);
}, _this] call CBA_fnc_execNextFrame; // need to delay a frame before modifying items in a backpack
}, nil, [IGNORE_BASE_UAVPILOTS], true] call CBA_fnc_addClassEventHandler;
},
true // Needs mission restart
] call CBA_fnc_addSetting;

View File

@ -52,11 +52,16 @@
<English>Require Items</English>
<Polish>Wymagane Przedmioty</Polish>
<German>Erfordere Gegenstände</German>
<Korean>아이템 필요</Korean>
</Key>
<Key ID="STR_ACE_Medical_AI_requireItems_desc">
<English>AI will only perform medical treatment if they have the necessary items in their inventory.\nRequires custom AI loadouts!</English>
<Polish>AI będzie wykonywać zabiegi medyczne tylko wtedy, gdy ma w ekwipunku niezbędne przedmioty. \nWymaga niestandardowego wyposażenia AI!</Polish>
<German>Die KI führt nur dann medizinische Behandlungen durch, wenn sie die erforderlichen Gegenstände in ihrem Inventar hat.\nErfordert benutzerdefinierte KI-Ausrüstungen!</German>
<English>AI will only perform medical treatment if they have the necessary items in their inventory.</English>
<Polish>AI będzie wykonywać zabiegi medyczne tylko wtedy, gdy ma w ekwipunku niezbędne przedmioty.</Polish>
<German>Die KI führt nur dann medizinische Behandlungen durch, wenn sie die erforderlichen Gegenstände in ihrem Inventar hat.</German>
<Korean>소지품에 필요한 아이템이 있을 경우에만 인공지능이 치료를 진행합니다.</Korean>
</Key>
<Key ID="STR_ACE_Medical_AI_requireItems_autoReplaceItems">
<English>Auto Convert Items for AI</English>
</Key>
</Package>
</Project>

View File

@ -97,8 +97,8 @@ class ACE_Medical_Injuries {
weighting[] = {{0.35, 0}, {0.35, 1}};
// bruises caused by bullets hitting the plate are big
sizeMultiplier = 3.2;
// tone down the pain a tiny bit to compensate
painMultiplier = 0.8;
// increase the pain to allow for bruises to actually knock out on repeated hits
painMultiplier = 2.2;
};
class VelocityWound {
// velocity wounds are only in the 0.35-1.5 range

View File

@ -784,6 +784,7 @@
<Japanese>気絶する痛みのしきい値</Japanese>
<Polish>Próg Nieprzytomności od Bólu</Polish>
<German>Schmerz-Bewusstlosigkeit-Grenze</German>
<Korean>고통 기절 한계점</Korean>
</Key>
<Key ID="STR_ACE_Medical_Damage_PainUnconsciousThreshold_Description">
<English>Sets the threshold for severe pain, above which a person can fall unconscious upon receiving damage.</English>
@ -792,6 +793,7 @@
<Japanese>激しい痛みのしきい値を設定します。このしきい値を超えた状態でダメージを受けると意識を失う可能性があります。</Japanese>
<Polish>Ustawia próg silnego bólu, powyżej którego osoba może stracić przytomność po otrzymaniu obrażeń.</Polish>
<German>Legt die Grenze für starke Schmerzen fest, oberhalb derer eine Person bei erlittenem Schaden bewusstlos werden kann.</German>
<Korean>사람이 데미지를 입었을 때 의식불명 상태가 될 수 있는 심각한 고통의 한계점을 설정합니다.</Korean>
</Key>
<Key ID="STR_ACE_Medical_Damage_DeathChance_DisplayName">
<English>Fatal Injury Death Chance</English>

View File

@ -76,6 +76,13 @@
#define DAMAGE_BLUE_THRESHOLD 0.8
#define DAMAGE_TOTAL_COLORS 10
// Qualitative bleed rate thresholds as a fraction of knock out blood loss
// Note that half of knock out blood loss is considered unstable, and knock out blood loss is considered critical
#define BLEED_RATE_SLOW 0.1 // Slow - One fifth of unstable blood loss
#define BLEED_RATE_MODERATE 0.5 // Moderate - Vitals considered stable
#define BLEED_RATE_SEVERE 1.0 // Severe - Vitals considered unstable
// Massive - Vitals considered critical
// Pain above which a unit can go unconscious upon receiving damage
#define PAIN_UNCONSCIOUS EGVAR(medical,painUnconsciousThreshold)

View File

@ -25,9 +25,13 @@
</Key>
<Key ID="STR_ACE_Medical_Engine_damagePassThroughEffect_displayName">
<English>Armor PassThrough Effect</English>
<Polish>Efekt penetracji pancerza</Polish>
<Korean>방어구 PassThrough 효과</Korean>
</Key>
<Key ID="STR_ACE_Medical_Engine_damagePassThroughEffect_description">
<English>Controls effect of armor 'passThrough' on final damage. Makes high armor values, like ones used in GL rigs, less effective.\nUse 0% for pre 3.16.0 armor behavior.\nOnly touch this if you know what you're doing!</English>
<Polish>Kontroluje wpływ "penetracji" pancerza na ostateczne obrażenia. Sprawia, że wysokie wartości pancerza, takie jak te używane w kamizelkach GL, są mniej skuteczne.\nUżyj 0% dla zachowania pancerza sprzed wersji 3.16.0.\nZmień wartość tylko jeśli wiesz co robisz!</Polish>
<Korean>최종 데미지에 대한 방어구의 'PassThrough' 효과를 조정합니다. GL 리그에 사용되는 것과 같은 높은 방호값을 덜 효과적으로 만듭니다\n3.16.0 이전의 방어구 동작에는 0%를 사용하십시오.\n당신이 뭘 하고 있는지 알고 있는 경우에만 이걸 설정하세요!</Korean>
</Key>
</Package>
</Project>

View File

@ -12,6 +12,9 @@ GVAR(pendingReopen) = false;
GVAR(menuPFH) = -1;
GVAR(peekLastOpenedOn) = -1;
GVAR(peekOnHitLastOpenedOn) = -1;
GVAR(selfInteractionActions) = [];
[] call FUNC(addTreatmentActions);
[] call FUNC(collectActions);
@ -71,8 +74,43 @@ GVAR(selfInteractionActions) = [];
false
}, [DIK_H, [false, false, false]], false, 0] call CBA_fnc_addKeybind;
["ACE3 Common", QGVAR(peekMedicalInfoKey), localize LSTRING(PeekMedicalInfo),
{
// Conditions: canInteract
if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false};
// Statement
[ACE_player, 0] call FUNC(displayPatientInformation);
false
}, {
if (CBA_missionTime - GVAR(peekLastOpenedOn) > GVAR(peekMedicalInfoReleaseDelay)) then {
[{
CBA_missionTime - GVAR(peekLastOpenedOn) > GVAR(peekMedicalInfoReleaseDelay)
}, {QGVAR(RscPatientInfo) cutFadeOut 0.3}] call CBA_fnc_waitUntilAndExecute;
};
GVAR(peekLastOpenedOn) = CBA_missionTime;
false
}, [DIK_H, [false, true, false]], false, 0] call CBA_fnc_addKeybind;
// Close patient information display when interaction menu is closed
["ace_interactMenuClosed", {
QGVAR(RscPatientInfo) cutFadeOut 0.3;
}] call CBA_fnc_addEventHandler;
[QEGVAR(medical,woundReceived), {
params ["_unit", "_allDamages", ""];
if !(GVAR(peekMedicalOnHit) && {_unit == ACE_player}) exitWith {};
private _bodypart = toLower (_allDamages select 0 select 1);
private _bodypartIndex = ALL_BODY_PARTS find _bodypart;
[ACE_player, _bodypartIndex] call FUNC(displayPatientInformation);
if (CBA_missionTime - GVAR(peekOnHitLastOpenedOn) > GVAR(peekMedicalOnHitDuration)) then {
[{
CBA_missionTime - GVAR(peekOnHitLastOpenedOn) > GVAR(peekMedicalOnHitDuration)
}, {QGVAR(RscPatientInfo) cutFadeOut 0.3}] call CBA_fnc_waitUntilAndExecute;
};
GVAR(peekOnHitLastOpenedOn) = CBA_missionTime;
}] call CBA_fnc_addEventHandler;

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -45,7 +45,7 @@ if (isNull _display) then {
// Update body image
private _ctrlBodyImage = _display displayCtrl IDC_BODY_GROUP;
[_ctrlBodyImage, _target] call FUNC(updateBodyImage);
[_ctrlBodyImage, _target, _selectionN] call FUNC(updateBodyImage);
// Update injury list
private _ctrlInjuries = _display displayCtrl IDC_INJURIES;

View File

@ -40,7 +40,7 @@ private _ctrlInjuries = _display displayCtrl IDC_INJURIES;
// Update body image
private _ctrlBodyImage = _display displayCtrl IDC_BODY_GROUP;
[_ctrlBodyImage, GVAR(target)] call FUNC(updateBodyImage);
[_ctrlBodyImage, GVAR(target), GVAR(selectedBodyPart)] call FUNC(updateBodyImage);
// Update activity and quick view logs
private _ctrlActivityLog = _display displayCtrl IDC_ACTIVITY;

View File

@ -6,17 +6,18 @@
* Arguments:
* 0: Body image controls group <CONTROL>
* 1: Target <OBJECT>
* 2: Body part <NUMBER>
*
* Return Value:
* None
*
* Example:
* [CONTROL, _target] call ace_medical_gui_fnc_updateBodyImage
* [CONTROL, _target, 0] call ace_medical_gui_fnc_updateBodyImage
*
* Public: No
*/
params ["_ctrlGroup", "_target"];
params ["_ctrlGroup", "_target", "_selectionN"];
// Get tourniquets, damage, and blood loss for target
private _tourniquets = GET_TOURNIQUETS(_target);
@ -34,7 +35,12 @@ private _bodyPartBloodLoss = [0, 0, 0, 0, 0, 0];
} forEach GET_OPEN_WOUNDS(_target);
{
_x params ["_bodyPartIDC", ["_tourniquetIDC", -1], ["_fractureIDC", -1]];
_x params ["_bodyPartIDC", "_selectedIDC", ["_tourniquetIDC", -1], ["_fractureIDC", -1]];
private _selected = _forEachIndex == _selectionN;
private _ctrlSelected = _ctrlGroup controlsGroupCtrl _selectedIDC;
_ctrlSelected ctrlSetTextColor GVAR(bodypartOutlineColor);
_ctrlSelected ctrlShow _selected;
// Show or hide the tourniquet icon
if (_tourniquetIDC != -1) then {
@ -92,10 +98,10 @@ private _bodyPartBloodLoss = [0, 0, 0, 0, 0, 0];
private _ctrlBodyPart = _ctrlGroup controlsGroupCtrl _bodyPartIDC;
_ctrlBodyPart ctrlSetTextColor _bodyPartColor;
} forEach [
[IDC_BODY_HEAD],
[IDC_BODY_TORSO],
[IDC_BODY_ARMLEFT, IDC_BODY_ARMLEFT_T, IDC_BODY_ARMLEFT_B],
[IDC_BODY_ARMRIGHT, IDC_BODY_ARMRIGHT_T, IDC_BODY_ARMRIGHT_B],
[IDC_BODY_LEGLEFT, IDC_BODY_LEGLEFT_T, IDC_BODY_LEGLEFT_B],
[IDC_BODY_LEGRIGHT, IDC_BODY_LEGRIGHT_T, IDC_BODY_LEGRIGHT_B]
[IDC_BODY_HEAD, IDC_BODY_HEAD_S],
[IDC_BODY_TORSO, IDC_BODY_TORSO_S],
[IDC_BODY_ARMLEFT, IDC_BODY_ARMLEFT_S, IDC_BODY_ARMLEFT_T, IDC_BODY_ARMLEFT_B],
[IDC_BODY_ARMRIGHT, IDC_BODY_ARMRIGHT_S, IDC_BODY_ARMRIGHT_T, IDC_BODY_ARMRIGHT_B],
[IDC_BODY_LEGLEFT, IDC_BODY_LEGLEFT_S, IDC_BODY_LEGLEFT_T, IDC_BODY_LEGLEFT_B],
[IDC_BODY_LEGRIGHT, IDC_BODY_LEGRIGHT_S, IDC_BODY_LEGRIGHT_T, IDC_BODY_LEGRIGHT_B]
];

View File

@ -20,6 +20,89 @@
params ["_ctrl", "_target", "_selectionN"];
private _entries = [];
private _nonissueColor = [1, 1, 1, 0.33];
// Indicate if unit is bleeding at all
if (IS_BLEEDING(_target)) then {
// Give a qualitative description of the rate of bleeding
private _cardiacOutput = [_target] call EFUNC(medical_status,getCardiacOutput);
private _bleedRate = GET_BLOOD_LOSS(_target);
private _bleedRateKO = BLOOD_LOSS_KNOCK_OUT_THRESHOLD * (_cardiacOutput max 0.05);
// Use nonzero minimum cardiac output to prevent all bleeding showing as massive during cardiac arrest
switch (true) do {
case (_bleedRate < _bleedRateKO * BLEED_RATE_SLOW): {
_entries pushBack [localize LSTRING(Bleed_Rate1), [1, 1, 0, 1]];
};
case (_bleedRate < _bleedRateKO * BLEED_RATE_MODERATE): {
_entries pushBack [localize LSTRING(Bleed_Rate2), [1, 0.67, 0, 1]];
};
case (_bleedRate < _bleedRateKO * BLEED_RATE_SEVERE): {
_entries pushBack [localize LSTRING(Bleed_Rate3), [1, 0.33, 0, 1]];
};
default {
_entries pushBack [localize LSTRING(Bleed_Rate4), [1, 0, 0, 1]];
};
};
} else {
_entries pushBack [localize LSTRING(Status_Nobleeding), _nonissueColor];
};
if (GVAR(showBloodlossEntry)) then {
// Give a qualitative description of the blood volume lost
switch (GET_HEMORRHAGE(_target)) do {
case 0: {
_entries pushBack [localize LSTRING(Lost_Blood0), _nonissueColor];
};
case 1: {
_entries pushBack [localize LSTRING(Lost_Blood1), [1, 1, 0, 1]];
};
case 2: {
_entries pushBack [localize LSTRING(Lost_Blood2), [1, 0.67, 0, 1]];
};
case 3: {
_entries pushBack [localize LSTRING(Lost_Blood3), [1, 0.33, 0, 1]];
};
case 4: {
_entries pushBack [localize LSTRING(Lost_Blood4), [1, 0, 0, 1]];
};
};
};
// Show receiving IV volume remaining
private _totalIvVolume = 0;
{
_x params ["_volumeRemaining"];
_totalIvVolume = _totalIvVolume + _volumeRemaining;
} forEach (_target getVariable [QEGVAR(medical,ivBags), []]);
if (_totalIvVolume >= 1) then {
_entries pushBack [format [localize ELSTRING(medical_treatment,receivingIvVolume), floor _totalIvVolume], [1, 1, 1, 1]];
} else {
_entries pushBack [localize ELSTRING(medical_treatment,Status_NoIv), _nonissueColor];
};
// Indicate the amount of pain the unit is in
if (_target call EFUNC(common,isAwake)) then {
private _pain = GET_PAIN_PERCEIVED(_target);
if (_pain > 0) then {
private _painText = switch (true) do {
case (_pain > PAIN_UNCONSCIOUS): {
ELSTRING(medical_treatment,Status_SeverePain);
};
case (_pain > (PAIN_UNCONSCIOUS / 5)): {
ELSTRING(medical_treatment,Status_Pain);
};
default {
ELSTRING(medical_treatment,Status_MildPain);
};
};
_entries pushBack [localize _painText, [1, 1, 1, 1]];
} else {
_entries pushBack [localize ELSTRING(medical_treatment,Status_NoPain), _nonissueColor];
};
};
_entries pushBack ["", [1, 1, 1, 1]];
// Add selected body part name
private _bodyPartName = [
@ -70,29 +153,6 @@ if (GVAR(showDamageEntry)) then {
};
};
// Indicate if unit is bleeding at all
if (IS_BLEEDING(_target)) then {
_entries pushBack [localize LSTRING(Status_Bleeding), [1, 0, 0, 1]];
};
if (GVAR(showBloodlossEntry)) then {
// Give a qualitative description of the blood volume lost
switch (GET_HEMORRHAGE(_target)) do {
case 1: {
_entries pushBack [localize LSTRING(Lost_Blood1), [1, 1, 0, 1]];
};
case 2: {
_entries pushBack [localize LSTRING(Lost_Blood2), [1, 0.67, 0, 1]];
};
case 3: {
_entries pushBack [localize LSTRING(Lost_Blood3), [1, 0.33, 0, 1]];
};
case 4: {
_entries pushBack [localize LSTRING(Lost_Blood4), [1, 0, 0, 1]];
};
};
};
// Indicate if a tourniquet is applied
if (HAS_TOURNIQUET_APPLIED_ON(_target,_selectionN)) then {
_entries pushBack [localize LSTRING(Status_Tourniquet_Applied), [0.77, 0.51, 0.08, 1]];
@ -110,36 +170,6 @@ switch (GET_FRACTURES(_target) select _selectionN) do {
};
};
// Indicate the amount of pain the unit is in
if (_target call EFUNC(common,isAwake)) then {
private _pain = GET_PAIN_PERCEIVED(_target);
if (_pain > 0) then {
private _painText = switch (true) do {
case (_pain > PAIN_UNCONSCIOUS): {
ELSTRING(medical_treatment,Status_SeverePain);
};
case (_pain > (PAIN_UNCONSCIOUS / 5)): {
ELSTRING(medical_treatment,Status_Pain);
};
default {
ELSTRING(medical_treatment,Status_MildPain);
};
};
_entries pushBack [localize _painText, [1, 1, 1, 1]];
};
};
// Show receiving IV volume remaining
private _totalIvVolume = 0;
{
_x params ["_volumeRemaining"];
_totalIvVolume = _totalIvVolume + _volumeRemaining;
} forEach (_target getVariable [QEGVAR(medical,ivBags), []]);
if (_totalIvVolume >= 1) then {
_entries pushBack [format [localize ELSTRING(medical_treatment,receivingIvVolume), floor _totalIvVolume], [1, 1, 1, 1]];
};
// Add entries for open, bandaged, and stitched wounds
private _woundEntries = [];
@ -174,7 +204,7 @@ private _fnc_processWounds = {
// Handle no wound entries
if (_woundEntries isEqualTo []) then {
_entries pushBack [localize ELSTRING(medical_treatment,NoInjuriesBodypart), [1, 1, 1, 1]];
_entries pushBack [localize ELSTRING(medical_treatment,NoInjuriesBodypart), _nonissueColor];
} else {
_entries append _woundEntries;
};

View File

@ -82,6 +82,32 @@ class GVAR(BodyImage): RscControlsGroupNoScrollbars {
idc = IDC_BODY_LEGRIGHT_T;
text = QPATHTOF(data\body_image\leg_right_t.paa);
};
class HeadS: Background {
idc = IDC_BODY_HEAD_S;
text = QPATHTOF(data\body_image\head_s.paa);
colorText[] = {1.0, 1.0, 1.0, 1.0};
show = 0;
};
class TorsoS: HeadS {
idc = IDC_BODY_TORSO_S;
text = QPATHTOF(data\body_image\torso_s.paa);
};
class ArmLeftS: HeadS {
idc = IDC_BODY_ARMLEFT_S;
text = QPATHTOF(data\body_image\arm_left_s.paa);
};
class ArmRightS: HeadS {
idc = IDC_BODY_ARMRIGHT_S;
text = QPATHTOF(data\body_image\arm_right_s.paa);
};
class LegLeftS: HeadS {
idc = IDC_BODY_LEGLEFT_S;
text = QPATHTOF(data\body_image\leg_left_s.paa);
};
class LegRightS: HeadS {
idc = IDC_BODY_LEGRIGHT_S;
text = QPATHTOF(data\body_image\leg_right_s.paa);
};
};
};
@ -584,6 +610,30 @@ class RscTitles {
w = QUOTE(POS_W(8.5));
h = QUOTE(POS_H(8.5));
};
class HeadS: HeadS {
w = QUOTE(POS_W(8.5));
h = QUOTE(POS_H(8.5));
};
class TorsoS: TorsoS {
w = QUOTE(POS_W(8.5));
h = QUOTE(POS_H(8.5));
};
class ArmLeftS: ArmLeftS {
w = QUOTE(POS_W(8.5));
h = QUOTE(POS_H(8.5));
};
class ArmRightS: ArmRightS {
w = QUOTE(POS_W(8.5));
h = QUOTE(POS_H(8.5));
};
class LegLeftS: LegLeftS {
w = QUOTE(POS_W(8.5));
h = QUOTE(POS_H(8.5));
};
class LegRightS: LegRightS {
w = QUOTE(POS_W(8.5));
h = QUOTE(POS_H(8.5));
};
};
};
class InjuriesLabel: RscText {

View File

@ -57,7 +57,7 @@
* See: https://gka.github.io/palettes
*/
private _bloodLossColors = [
[1.00, 1.00, 1.00, 1],
[0.00, 0.00, 0.00, 1],
[1.00, 0.95, 0.64, 1],
[1.00, 0.87, 0.46, 1],
[1.00, 0.80, 0.33, 1],
@ -74,7 +74,7 @@ private _bloodLossColors = [
* See: https://gka.github.io/palettes
*/
private _damageColors = [
[1.00, 1.00, 1.00, 1],
[0.00, 0.00, 0.00, 1],
[0.75, 0.95, 1.00, 1],
[0.62, 0.86, 1.00, 1],
[0.54, 0.77, 1.00, 1],
@ -126,3 +126,39 @@ private _categoryColors = [ELSTRING(medical,Category), format ["| %1 |", LELSTRI
true,
true // isGlobal
] call CBA_fnc_addSetting;
[
QGVAR(bodyPartOutlineColor),
"COLOR",
[LSTRING(bodyPartOutlineColor_DisplayName), LSTRING(bodyPartOutlineColor_Description)],
[ELSTRING(medical,Category), LSTRING(SubCategory)],
[1.00, 1.00, 1.00, 1],
false
] call CBA_fnc_addSetting;
[
QGVAR(peekMedicalInfoReleaseDelay),
"TIME",
[LSTRING(PeekMedicalInfoReleaseDelay_DisplayName), LSTRING(PeekMedicalInfoReleaseDelay_Description)],
[ELSTRING(medical,Category), LSTRING(SubCategory)],
[0, 5, 1],
false
] call CBA_fnc_addSetting;
[
QGVAR(peekMedicalOnHit),
"CHECKBOX",
[LSTRING(PeekMedicalOnHit_DisplayName), LSTRING(PeekMedicalOnHit_Description)],
[ELSTRING(medical,Category), LSTRING(SubCategory)],
false,
false // isGlobal
] call CBA_fnc_addSetting;
[
QGVAR(peekMedicalOnHitDuration),
"TIME",
[LSTRING(PeekMedicalOnHitDuration_DisplayName), LSTRING(PeekMedicalOnHitDuration_Description)],
[ELSTRING(medical,Category), LSTRING(SubCategory)],
[0, 5, 1],
false
] call CBA_fnc_addSetting;

View File

@ -68,6 +68,13 @@
#define IDC_BODY_ARMRIGHT_B 6060
#define IDC_BODY_LEGLEFT_B 6065
#define IDC_BODY_LEGRIGHT_B 6070
#define IDC_BODY_GROUP_S 6075
#define IDC_BODY_HEAD_S 6080
#define IDC_BODY_TORSO_S 6085
#define IDC_BODY_ARMLEFT_S 6090
#define IDC_BODY_ARMRIGHT_S 6095
#define IDC_BODY_LEGLEFT_S 6100
#define IDC_BODY_LEGRIGHT_S 6105
#define IDC_TRIAGE_STATUS 7000
#define IDC_TRIAGE_SELECT 7100

View File

@ -282,6 +282,15 @@
<Chinese>開起醫療選單</Chinese>
<Turkish>Medikal Menüyü Aç</Turkish>
</Key>
<Key ID="STR_ACE_Medical_GUI_PeekMedicalInfo">
<English>Peek Medical Info</English>
</Key>
<Key ID="STR_ACE_Medical_GUI_PeekMedicalInfoReleaseDelay_DisplayName">
<English>Medical Peek Duration</English>
</Key>
<Key ID="STR_ACE_Medical_GUI_PeekMedicalInfoReleaseDelay_Description">
<English>How long the medical info peek remains open after releasing the key.</English>
</Key>
<Key ID="STR_ACE_Medical_GUI_LoadPatient">
<English>Load Patient</English>
<Spanish>Cargar al paciente en</Spanish>
@ -957,6 +966,21 @@
<Chinese>出血中</Chinese>
<Turkish>Kanama var</Turkish>
</Key>
<Key ID="STR_ACE_Medical_GUI_STATUS_NOBLEEDING">
<English>No bleeding</English>
</Key>
<Key ID="STR_ACE_Medical_GUI_Bleed_Rate1">
<English>Slow bleeding</English>
</Key>
<Key ID="STR_ACE_Medical_GUI_Bleed_Rate2">
<English>Moderate bleeding</English>
</Key>
<Key ID="STR_ACE_Medical_GUI_Bleed_Rate3">
<English>Severe bleeding</English>
</Key>
<Key ID="STR_ACE_Medical_GUI_Bleed_Rate4">
<English>Massive bleeding</English>
</Key>
<Key ID="STR_ACE_Medical_GUI_STATUS_PAIN">
<English>in Pain</English>
<German>hat Schmerzen</German>
@ -1021,6 +1045,9 @@
<German>Schiene angelegt</German>
<Korean>부목 적용함</Korean>
</Key>
<Key ID="STR_ACE_Medical_GUI_Lost_Blood0">
<English>No blood loss</English>
</Key>
<!--Strings above match Blood2 but seem to differ in some languages, determine which is best to use-->
<Key ID="STR_ACE_Medical_GUI_Lost_Blood1">
<English>Lost some blood</English>
@ -1250,12 +1277,25 @@
<Russian>Показывать тяжесть кровопотери в списке ранений.</Russian>
<Spanish>Mostrar la pérdida de sangre cualitativa en la lista de heridas.</Spanish>
</Key>
<Key ID="STR_ACE_Medical_GUI_PeekMedicalOnHit_DisplayName">
<English>Peek Medical Info on Hit</English>
</Key>
<Key ID="STR_ACE_Medical_GUI_PeekMedicalOnHit_Description">
<English>Temporarily show medical info when injured.</English>
</Key>
<Key ID="STR_ACE_Medical_GUI_PeekMedicalOnHitDuration_DisplayName">
<English>Medical Peek Duration on Hit</English>
</Key>
<Key ID="STR_ACE_Medical_GUI_PeekMedicalOnHitDuration_Description">
<English>How long the medical info peek remains open after being injured.</English>
</Key>
<Key ID="STR_ACE_Medical_GUI_showDamageEntry_DisplayName">
<English>Show Trauma Sustained</English>
<Portuguese>Mostrar Traumatismo Sofrido</Portuguese>
<Japanese>外傷の表示</Japanese>
<Polish>Pokaż Doznane Urazy</Polish>
<German>Zeigen Sie das erlittene Trauma</German>
<Korean>외상 지속 표시</Korean>
</Key>
<Key ID="STR_ACE_Medical_GUI_showDamageEntry_Description">
<English>Show trauma sustained in the injury list.</English>
@ -1263,6 +1303,13 @@
<Japanese>負傷リストに外傷を表示する。</Japanese>
<Polish>Pokaż odniesione obrażenia na liście obrażeń.</Polish>
<German>Zeigen Sie das erlittene Trauma in der Verletzungsliste an.</German>
<Korean>부상 목록에 발생한 외상을 표시합니다.</Korean>
</Key>
<Key ID="STR_ACE_Medical_GUI_bodyPartOutlineColor_DisplayName">
<English>Body Part Outline Color</English>
</Key>
<Key ID="STR_ACE_Medical_GUI_bodyPartOutlineColor_Description">
<English>Color of outline around selected body part.</English>
</Key>
<Key ID="STR_ACE_Medical_GUI_traumaSustained1">
<English>Minor Trauma</English>
@ -1270,6 +1317,7 @@
<Japanese>軽度の外傷</Japanese>
<Polish>Niewielki Uraz</Polish>
<German>Kleineres Trauma</German>
<Korean>약한 외상</Korean>
</Key>
<Key ID="STR_ACE_Medical_GUI_traumaSustained2">
<English>Major Trauma</English>
@ -1277,6 +1325,7 @@
<Japanese>中度の外傷</Japanese>
<Polish>Poważny Uraz</Polish>
<German>Großes Trauma</German>
<Korean>중간 외상</Korean>
</Key>
<Key ID="STR_ACE_Medical_GUI_traumaSustained3">
<English>Severe Trauma</English>
@ -1284,6 +1333,7 @@
<Japanese>重度の外傷</Japanese>
<Polish>Ciężki Uraz</Polish>
<German>Schweres Trauma</German>
<Korean>강한 외상</Korean>
</Key>
<Key ID="STR_ACE_Medical_GUI_traumaSustained4">
<English>Chronic Trauma</English>
@ -1291,6 +1341,7 @@
<Japanese>慢性的な外傷</Japanese>
<Polish>Przewlekły Uraz</Polish>
<German>Chronisches Trauma</German>
<Korean>심각한 외상</Korean>
</Key>
</Package>
</Project>

Binary file not shown.

View File

@ -121,11 +121,13 @@
<English>Weapon Drop Chance</English>
<Polish>Szansa Upuszczenia Broni</Polish>
<German>Wahrscheinlichkeit, die Waffe fallen zu lassen</German>
<Korean>무기 떨어뜨릴 확률</Korean>
</Key>
<Key ID="STR_ACE_Medical_Status_DropWeaponUnconsciousChance_Description">
<English>Chance for a player to drop their weapon when going unconscious.\nHas no effect on AI.</English>
<Polish>Szansa na upuszczenie broni przez gracza, przy utracie przytomności. \nNie ma wpływu na AI.</Polish>
<German>Chance für einen Spieler, seine Waffe fallen zu lassen, wenn er bewusstlos wird.\nHat keine Auswirkung auf die KI.</German>
<Korean>플레이어가 기절할 때 무기를 떨어뜨릴 확률입니다.\nAI는 영향을 받지 않습니다.</Korean>
</Key>
</Package>
</Project>

View File

@ -154,7 +154,7 @@ class ADDON {
};
};
class PackingBandage: fieldDressing {
class PackingBandage: FieldDressing {
class Abrasion {
effectiveness = 3;
reopeningChance = 0.6;
@ -289,7 +289,7 @@ class ADDON {
};
};
class ElasticBandage: fieldDressing {
class ElasticBandage: FieldDressing {
class Abrasion {
effectiveness = 4;
reopeningChance = 0.6;

View File

@ -256,7 +256,7 @@ class GVAR(actions) {
class Grave: BodyBag {
displayName = CSTRING(DigGrave);
displayNameProgress = CSTRING(DiggingGrave);
icon = QPATHTOEF(medical_gui,ui\cross_grave.paa);
icon = QPATHTOEF(medical_gui,ui\grave.paa);
treatmentTime = QGVAR(treatmentTimeGrave);
condition = QFUNC(canDigGrave);
callbackSuccess = QFUNC(placeInGrave);

View File

@ -29,10 +29,25 @@ class CfgVehicles {
statement = "";
icon = "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa";
selection = "";
class GVAR(buryBodyBag) {
displayName = CSTRING(DigGrave);
condition = QUOTE([ARR_2(_this#1, _this#0)] call FUNC(canDigGrave));
statement = QUOTE(_this call FUNC(placeBodyBagInGrave));
icon = QPATHTOEF(medical_gui,ui\grave.paa);
};
};
};
};
// Grave vehicle
class Land_Grave_dirt_F;
class ACE_Grave: Land_Grave_dirt_F {
model = QPATHTOF(data\ACE_grave.p3d);
hiddenSelections[] = {"camo"};
hiddenSelectionsTextures[] = {QPATHTOF(data\Grave_co.paa)};
};
// Medical litter classes
class Thing;
class ACE_MedicalLitterBase: Thing {

View File

@ -47,6 +47,7 @@ PREP(loadUnit);
PREP(medication);
PREP(medicationLocal);
PREP(onMedicationUsage);
PREP(placeBodyBagInGrave);
PREP(placeInBodyBag);
PREP(placeInBodyBagOrGrave);
PREP(placeInGrave);

View File

@ -67,28 +67,33 @@ if (["ace_trenches"] call EFUNC(common,isModLoaded)) then {
private _checkHeadstoneAction = [
QGVAR(checkHeadstone),
LLSTRING(checkHeadstoneName),
QPATHTOEF(medical_gui,ui\cross_grave.paa),
QPATHTOEF(medical_gui,ui\grave.paa),
{
[
[_target getVariable QGVAR(headstoneData)],
true
] call CBA_fnc_notify;
},
{!isNil {_target getVariable QGVAR(headstoneData)}},
{},
[],
[1.05, 0.02, 0.3] //position in centre of cross
{!isNil {_target getVariable QGVAR(headstoneData)}}
] call EFUNC(interact_menu,createAction);
["Land_Grave_dirt_F", 0, [], _checkHeadstoneAction] call EFUNC(interact_menu,addActionToClass);
[missionNameSpace getVariable [QGVAR(graveClassname), "ACE_Grave"], 0, [], _checkHeadstoneAction] call EFUNC(interact_menu,addActionToClass);
};
if (isServer) then {
["ace_placedInBodyBag", {
params ["_target", "_restingPlace"];
TRACE_2("ace_placedInBodyBag eh",_target,_restingPlace);
if (isNull _restingPlace) exitWith {};
private _targetName = [_target, false, true] call EFUNC(common,getName);
private _targetName = "";
if (_target isKindOf "ACE_bodyBagObject") then {
_targetName = _target getVariable [QGVAR(headstoneData), ""];
} else {
_targetName = [_target, false, true] call EFUNC(common,getName);
};
if (_targetName == "") exitWith {};
_restingPlace setVariable [QGVAR(headstoneData), _targetName, true];
}] call CBA_fnc_addEventHandler;
};

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,82 @@
class StageTI
{
texture="a3\data_f\default_ti_ca.paa";
};
ambient[]={1,1,1,1};
diffuse[]={1,1,1,1};
forcedDiffuse[]={0,0,0,0};
emmisive[]={0,0,0,1};
specular[]={0.3,0.3,0.3,1};
specularPower=10;
PixelShaderID="Super";
VertexShaderID="Super";
class Stage1
{
texture="z\ace\addons\medical_treatment\data\grave_nohq.paa";
uvSource="tex";
class uvTransform
{
aside[]={1,0,0};
up[]={0,1,0};
dir[]={0,0,0};
pos[]={0,0,0};
};
};
class Stage2
{
texture="#(argb,8,8,3)color(0.5,0.5,0.5,1,DT)";
uvSource="tex";
class uvTransform
{
aside[]={0,9,0};
up[]={4.5,0,0};
dir[]={0,0,0};
pos[]={0,0,0};
};
};
class Stage3
{
texture="#(argb,8,8,3)color(0,0,0,0)";
uvSource="tex";
class uvTransform
{
aside[]={1,0,0};
up[]={0,1,0};
dir[]={0,0,0};
pos[]={0,0,0};
};
};
class Stage4
{
texture="z\ace\addons\medical_treatment\data\grave_as.paa";
uvSource="tex";
class uvTransform
{
aside[]={1,0,0};
up[]={0,1,0};
dir[]={0,0,0};
pos[]={0,0,0};
};
};
class Stage5
{
texture="z\ace\addons\medical_treatment\data\grave_smdi.paa";
uvSource="tex";
class uvTransform
{
aside[]={1,0,0};
up[]={0,1,0};
dir[]={0,0,0};
pos[]={0,0,0};
};
};
class Stage6
{
texture="#(ai,64,64,1)fresnel(3.21,4.01)";
uvSource="none";
};
class Stage7
{
texture="a3\data_f\env_land_co.paa";
uvSource="none";
};

View File

@ -58,6 +58,8 @@ class CfgModels {
class IVBag_500ml: IVBagBase {};
class IVBag_1000ml: IVBagBase {};
class ACE_grave: IVBagBase {};
class littergeneric: Default {};
class littergeneric_adenosine: Default {};
class littergeneric_atropine: Default {};

View File

@ -1,7 +1,7 @@
#include "..\script_component.hpp"
/*
* Author: Glowbal, esteldunedain
* Handles cleaning up bodies that were replaced by body bags.
* Handles cleaning up bodies or body bags that were replaced by body bags or put in grave.
*
* Arguments:
* None

View File

@ -20,4 +20,7 @@ params ["_medic", "_patient"];
if !(["ace_trenches"] call EFUNC(common,isModLoaded)) exitWith {false};
(GVAR(allowGraveDigging) > 0) && {_patient call EFUNC(common,canDig)} && {_medic call EFUNC(trenches,hasEntrenchingTool)}
(GVAR(allowGraveDigging) > 0)
&& {!((_patient isKindOf "CaManBase") && {_patient call EFUNC(common,isAwake)})}
&& {_patient call EFUNC(common,canDig)}
&& {_medic call EFUNC(trenches,hasEntrenchingTool)}

View File

@ -0,0 +1,39 @@
#include "..\script_component.hpp"
/*
* Author: drofseh
* Places a body bag inside a grave.
*
* Arguments:
* 0: Medic <OBJECT>
* 1: Patient <OBJECT>
*
* Return Value:
* None
*
* Example:
* [cursorObject, player] call ace_medical_treatment_fnc_placeBodyBagInGrave
*
* Public: No
*/
params ["_bodybag", "_medic"];
TRACE_2("placeBodyBagInGrave",_bodybag,_medic);
[
GVAR(treatmentTimeGrave),
_this,
{
TRACE_1("finished",_this);
(_this#0) params ["_bodybag","_medic"];
private _graveClassname = "";
if (GVAR(graveDiggingMarker)) then {
_graveClassname = missionNamespace getVariable [QGVAR(graveClassname), "ACE_Grave"];
};
private _graveRotation = missionNameSpace getVariable [QGVAR(graveRotation), 0];
[[_medic, _bodybag], _graveClassname, [0,0,0], _graveRotation, true] call FUNC(placeInBodyBagOrGrave);
},
{TRACE_1("failed",_this);},
LLSTRING(DiggingGrave)
// ToDo: check FUNC(canDigGrave)? - what if body dragged/burried by someone else
] call EFUNC(common,progressBar);

View File

@ -10,6 +10,7 @@
* 1: Resting Place Classname <STRING>
* 2: Offset <ARRAY> (default: [0,0,0])
* 3: Rotation <NUMBER> (default: 0)
* 4: Is Grave <BOOL> (default: false)
*
* Return Value:
* None
@ -20,24 +21,33 @@
* Public: No
*/
params ["_args", "_restingPlaceClass", ["_offset", [0,0,0]], ["_rotation", 0]];
params ["_args", "_restingPlaceClass", ["_offset", [0,0,0]], ["_rotation", 0], ["_isGrave", false]];
_args params ["_medic", "_patient"];
TRACE_1("placeInBodyBagOrGrave",_patient);
if (!local _patient) exitWith {
private _isHuman = _patient isKindOf "CaManBase";
if (_isHuman && {!local _patient}) exitWith {
TRACE_1("Calling where local",local _patient);
[QGVAR(placeInBodyBagOrGrave), _this, _patient] call CBA_fnc_targetEvent;
};
if (alive _patient) then {
if (_isHuman && {alive _patient}) then {
TRACE_1("Manually killing with setDead",_patient);
[_patient, "buried_alive", _medic] call EFUNC(medical_status,setDead);
};
private _headPos = _patient modelToWorldVisual (_patient selectionPosition "head");
private _spinePos = _patient modelToWorldVisual (_patient selectionPosition "Spine3");
private _direction = (_headPos vectorFromTo _spinePos) call CBA_fnc_vectDir;
private _position = getPosASL _patient;
private _direction = 0;
if (_isHuman) then {
private _headPos = _patient modelToWorldVisual (_patient selectionPosition "head");
private _spinePos = _patient modelToWorldVisual (_patient selectionPosition "Spine3");
_direction = (_headPos vectorFromTo _spinePos) call CBA_fnc_vectDir;
} else {
_direction = getDir _patient;
};
// apply adjustments
_position = _position vectorAdd _offset;
_direction = _direction + _rotation;
@ -47,11 +57,18 @@ _direction = _direction + _rotation;
// This setPosASL seems to need to be called where the unit is local
_patient setPosASL [-5000, -5000, 0];
// Create the body bag object, set its position to prevent it from flipping
private _restingPlace = createVehicle [_restingPlaceClass, [0, 0, 0], [], 0, "NONE"];
_restingPlace setPosASL _position;
_restingPlace setDir _direction;
private _restingPlace = objNull;
if (_restingPlaceClass != "") then {
// Create the body bag object, set its position to prevent it from flipping
_restingPlace = createVehicle [_restingPlaceClass, [0, 0, 0], [], 0, "NONE"];
_restingPlace setPosASL _position;
_restingPlace setDir _direction;
};
// Server will handle hiding and deleting the body
// Keep event name as body bag only to avoid breaking things for others
["ace_placedInBodyBag", [_patient, _restingPlace]] call CBA_fnc_globalEvent;
["ace_placedInBodyBag", [_patient, _restingPlace, _isGrave]] call CBA_fnc_globalEvent;
if (_isGrave) then {
["ace_placedInGrave", [_patient, _restingPlace]] call CBA_fnc_globalEvent;
};

View File

@ -23,9 +23,11 @@ if ((alive _patient) && {GVAR(allowGraveDigging) < 2}) exitWith {
[LSTRING(bodybagWhileStillAlive)] call EFUNC(common,displayTextStructured);
};
private _graveClassname = missionNameSpace getVariable [QGVAR(graveClassname), "Land_Grave_dirt_F"];
// Land_Grave_dirt_F needs to be rotated 90 degrees to line up with the body
private _graveRotation = missionNameSpace getVariable [QGVAR(graveRotation), 90];
private _graveClassname = "";
if (GVAR(graveDiggingMarker)) then {
_graveClassname = missionNamespace getVariable [QGVAR(graveClassname), "ACE_Grave"];
};
private _graveRotation = missionNameSpace getVariable [QGVAR(graveRotation), 0];
[_this, _graveClassname, [0,0,0], _graveRotation] call FUNC(placeInBodyBagOrGrave);
[_this, _graveClassname, [0,0,0], _graveRotation, true] call FUNC(placeInBodyBagOrGrave)

View File

@ -5,7 +5,7 @@
* However, player bodies cannot be deleted until they respawn, so it is hidden and deleted later.
*
* Arguments:
* 0: Body <OBJECT>
* 0: Body or Bodybag <OBJECT>
*
* Return Value:
* None

View File

@ -35,4 +35,4 @@ private _fnc_isMedicalItem = toString {
_list pushBack (configName _x);
} forEach (_fnc_isMedicalItem configClasses (configFile >> "CfgMagazines"));
uiNamespace setVariable [QGVAR(treatmentItems), compileFinal str (_list arrayIntersect _list)]
uiNamespace setVariable [QGVAR(treatmentItems), compileFinal (_list createHashMapFromArray [])]

View File

@ -317,9 +317,18 @@
[
QGVAR(allowGraveDigging),
"LIST",
[LSTRING(AllowGaveDigging_DisplayName), LSTRING(AllowGaveDigging_Description)],
[LSTRING(AllowGraveDigging_DisplayName), LSTRING(AllowGraveDigging_Description)],
[ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)],
[[0, 1, 2], [ELSTRING(common,Disabled), LSTRING(AllowGaveDigging_graveOnlyDead), ELSTRING(common,Yes)], 1],
[[0, 1, 2], [ELSTRING(common,Disabled), LSTRING(AllowGraveDigging_graveOnlyDead), ELSTRING(common,Yes)], 1],
true
] call CBA_fnc_addSetting;
[
QGVAR(graveDiggingMarker),
"CHECKBOX",
[LSTRING(GraveDiggingMarker_DisplayName), LSTRING(GraveDiggingMarker_Description)],
[ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)],
true,
true
] call CBA_fnc_addSetting;

Some files were not shown because too many files have changed in this diff Show More