diff --git a/.hemtt/project.toml b/.hemtt/project.toml index bc721dfe84..793ff11c23 100644 --- a/.hemtt/project.toml +++ b/.hemtt/project.toml @@ -24,7 +24,7 @@ exclude = [ "/initsettings.sqf", "/initkeybinds.sqf", "/xeh_prep.sqf", - "dev", + "/dev/", "medical_ai/statemachine.sqf", "common/functions/fnc_dummy.sqf", ] diff --git a/AUTHORS.txt b/AUTHORS.txt index c51fbe52fc..5e7d48af55 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -113,6 +113,7 @@ havena Hawkins Head Hybrid V +Hypoxic JasperRab JDT john681611 diff --git a/addons/ai/stringtable.xml b/addons/ai/stringtable.xml index 27097eee7a..dedc339d09 100644 --- a/addons/ai/stringtable.xml +++ b/addons/ai/stringtable.xml @@ -85,11 +85,13 @@ Auto-Equip NVGs Automatyczne zakładanie NVG Automatisch NVGs ausrüsten + 야투경 자동 창착 Equips NVG in inventory during night time and unequips it during day time.\nDoes not add NVGs to inventory! Zakłada NVG w nocy i zdejmuje je w ciągu dnia.\nNie dodaje NVG do ekwipunku! Rüstet NVG nachts aus dem Inventar aus und entfernt es tagsüber.\nFügt keine NVGs zum Inventar hinzu! + 야간에는 야투경을 소지품에 장착하고 주간에는 장착을 해제합니다.\n주의! 소지품에 야투경을 추가하는 것이 아닙니다! diff --git a/addons/arsenal/functions/fnc_scanConfig.sqf b/addons/arsenal/functions/fnc_scanConfig.sqf index 8110f33b5f..8f11b6fc47 100644 --- a/addons/arsenal/functions/fnc_scanConfig.sqf +++ b/addons/arsenal/functions/fnc_scanConfig.sqf @@ -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 diff --git a/addons/arsenal/stringtable.xml b/addons/arsenal/stringtable.xml index 452ba160a1..1b0ef2a6cf 100644 --- a/addons/arsenal/stringtable.xml +++ b/addons/arsenal/stringtable.xml @@ -1561,12 +1561,14 @@ 下降 Malejąco Absteigend + 내림차순 Ascending 昇順 Rosnąco Aufsteigend + 오름차순 Tools @@ -1589,36 +1591,42 @@ 弾薬数 Ilość amunicji Munitionszahl + 장탄 수 Default to Favorites お気に入りをデフォルト Domyślnie do Ulubionych Standardmäßig auf Favoriten eingestellt + 즐겨찾기 기본값 Controls whether the ACE Arsenal defaults to showing all items or favorites. ACE Arsenalがデフォルトで全てのアイテムを表示するか、お気に入りを表示するかを制御します。 Kontroluje, czy ACE Arsenal domyślnie wyświetla wszystkie przedmioty, czy tylko ulubione. Steuert, ob das ACE Arsenal standardmäßig alle Gegenstände oder nur Favoriten anzeigt. + ACE 아스널이 기본적으로 모든 아이템 또는 즐겨찾기를 표시할 지 여부를 조정합니다. Favorites Color お気に入りの色 Kolor Ulubionych Favoritenfarbe + 즐겨찾기 색상 Highlight color for favorited items. お気に入りアイテムのハイライト色。 Kolor podświetlenia ulubionych elementów. Hervorhebungsfarbe für Lieblingsgegenstände. + 즐겨찾기한 아이템을 색상으로 강조합니다. Switch between displaying all items or your favorites.\nDouble click while holding Shift to add or remove an item. Shiftを押しながらダブルクリックするとアイテムを追加・削除できます。 Przełączanie między wyświetlaniem wszystkich przedmiotów lub tylko ulubionych. \nKliknij dwukrotnie, przytrzymując Shift, aby dodać lub usunąć przedmiot. Wechseln Sie zwischen der Anzeige aller Elemente oder Ihrer Favoriten.\nDoppelklicken Sie bei gedrückter Umschalttaste, um ein Element hinzuzufügen oder zu entfernen. + 모든 아이템을 표시하거나 즐겨찾기를 표시할 때 전환합니다\nShift 키를 누른 상태에서 두 번 클릭하여 아이템을 추가하거나 제거합니다. diff --git a/addons/ballistics/functions/fnc_statTextStatement_magazineMuzzleVelocity.sqf b/addons/ballistics/functions/fnc_statTextStatement_magazineMuzzleVelocity.sqf index 49eb43302e..04e9f4d327 100644 --- a/addons/ballistics/functions/fnc_statTextStatement_magazineMuzzleVelocity.sqf +++ b/addons/ballistics/functions/fnc_statTextStatement_magazineMuzzleVelocity.sqf @@ -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] diff --git a/addons/ballistics/functions/fnc_statTextStatement_weaponMuzzleVelocity.sqf b/addons/ballistics/functions/fnc_statTextStatement_weaponMuzzleVelocity.sqf index a720935c74..4f6bdd0412 100644 --- a/addons/ballistics/functions/fnc_statTextStatement_weaponMuzzleVelocity.sqf +++ b/addons/ballistics/functions/fnc_statTextStatement_weaponMuzzleVelocity.sqf @@ -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] }; diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index 00d5f6f068..4b88d9fd5e 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -3516,42 +3516,49 @@ AIの使用 Wykorzystanie przez AI KI Verwendet + 인공지능 사용 Illum 照明弾 Flary Leuchtmittel + 조명탄 Smoke 発煙弾 Granaty dymne Rauch + 연막탄 Inf 歩兵 Piechota Infanterie + 보병 Veh 車両 Pojazdy Fahrzeug + 차량 Armor 機甲 Pojazdy opancerzone Panzerung + 기갑 Air 航空 Lotnictwo Luft + 항공 diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf index d66df57f00..09ea454f03 100644 --- a/addons/captives/XEH_preInit.sqf +++ b/addons/captives/XEH_preInit.sqf @@ -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" diff --git a/addons/captives/XEH_preStart.sqf b/addons/captives/XEH_preStart.sqf index 7cc9038599..f1101979c6 100644 --- a/addons/captives/XEH_preStart.sqf +++ b/addons/captives/XEH_preStart.sqf @@ -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 [])]; diff --git a/addons/captives/functions/fnc_canBlindfoldCaptive.sqf b/addons/captives/functions/fnc_canBlindfoldCaptive.sqf index 892ed5b5df..7020b1a9a6 100644 --- a/addons/captives/functions/fnc_canBlindfoldCaptive.sqf +++ b/addons/captives/functions/fnc_canBlindfoldCaptive.sqf @@ -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))} diff --git a/addons/captives/functions/fnc_canRemoveBlindfoldCaptive.sqf b/addons/captives/functions/fnc_canRemoveBlindfoldCaptive.sqf index b509197fea..b01f62e26c 100644 --- a/addons/captives/functions/fnc_canRemoveBlindfoldCaptive.sqf +++ b/addons/captives/functions/fnc_canRemoveBlindfoldCaptive.sqf @@ -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)} diff --git a/addons/captives/functions/fnc_doBlindfoldCaptive.sqf b/addons/captives/functions/fnc_doBlindfoldCaptive.sqf index aff7444909..e4463909e6 100644 --- a/addons/captives/functions/fnc_doBlindfoldCaptive.sqf +++ b/addons/captives/functions/fnc_doBlindfoldCaptive.sqf @@ -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; }; diff --git a/addons/captives/stringtable.xml b/addons/captives/stringtable.xml index 99b0c38ec1..1a6fbf2fd8 100644 --- a/addons/captives/stringtable.xml +++ b/addons/captives/stringtable.xml @@ -142,12 +142,16 @@ Bandeau sur les yeux du captif Vendar prisioneiro Benda gli occhi + Załóż opaskę na oczy + 포로 눈 가리기 Remove blindfold Augenbinde entfernen Enlever bandeau sur les yeux Rimuovi la benda per gli occhi + Zdejmij opaskę z oczu + 눈가리개 풀기 Cable Tie diff --git a/addons/cargo/XEH_postInit.sqf b/addons/cargo/XEH_postInit.sqf index 5ade83b41c..6146f2c862 100644 --- a/addons/cargo/XEH_postInit.sqf +++ b/addons/cargo/XEH_postInit.sqf @@ -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; }; diff --git a/addons/compat_sog/CfgAmmo/explosives.hpp b/addons/compat_sog/CfgAmmo/explosives.hpp index 1c4e5ff65b..849f7e6948 100644 --- a/addons/compat_sog/CfgAmmo/explosives.hpp +++ b/addons/compat_sog/CfgAmmo/explosives.hpp @@ -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}; diff --git a/addons/compat_sog/CfgMagazines/belts.hpp b/addons/compat_sog/CfgMagazines/belts.hpp index 0a8d6a1d28..f46d6eec0c 100644 --- a/addons/compat_sog/CfgMagazines/belts.hpp +++ b/addons/compat_sog/CfgMagazines/belts.hpp @@ -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; +}; diff --git a/addons/compat_sog/CfgMagazines/explosives.hpp b/addons/compat_sog/CfgMagazines/explosives.hpp index 8da412d6e2..7e25609fc8 100644 --- a/addons/compat_sog/CfgMagazines/explosives.hpp +++ b/addons/compat_sog/CfgMagazines/explosives.hpp @@ -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); diff --git a/addons/compat_sog/CfgVehicles/explosives.hpp b/addons/compat_sog/CfgVehicles/explosives.hpp index 0ff596451b..81a3fd514d 100644 --- a/addons/compat_sog/CfgVehicles/explosives.hpp +++ b/addons/compat_sog/CfgVehicles/explosives.hpp @@ -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"; diff --git a/addons/compat_sog/CfgWeapons/weapons.hpp b/addons/compat_sog/CfgWeapons/weapons.hpp index a9aac4fa9b..e1cf5f6485 100644 --- a/addons/compat_sog/CfgWeapons/weapons.hpp +++ b/addons/compat_sog/CfgWeapons/weapons.hpp @@ -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; diff --git a/addons/compat_ws/compat_ws_realisticnames/stringtable.xml b/addons/compat_ws/compat_ws_realisticnames/stringtable.xml index 265603c564..210e4446b5 100644 --- a/addons/compat_ws/compat_ws_realisticnames/stringtable.xml +++ b/addons/compat_ws/compat_ws_realisticnames/stringtable.xml @@ -3,96 +3,127 @@ AA12 + AA-12 AA12 (Sand) + AA-12 (모래) AA12 (Snake) + AA-12 (뱀 위장) Galil ARM + 갈릴 ARM Galil ARM (Old) + 갈릴 ARM (낡음) GLX 160 + GLX-160 GLX 160 (Snake) + GLX-160 (뱀 위장) GLX 160 (Hex) + GLX-160 (육각) GLX 160 (Green Hex) + GLX-160 (초록육각) GLX 160 (Camo) + GLX-160 (위장) GLX 160 (Sand) + GLX-160 (모래) Mk14 Mod 1 EBR (Black) + Mk.14 Mod 1 EBR (검정) Mk14 Mod 1 EBR (Snake) + Mk.14 Mod 1 EBR (뱀 위장) Vektor SS-77 + 벡터 SS-77 Vektor SS-77 (Camo) + 벡터 SS-77 (위장) Vektor SS-77 (Hex) + 벡터 SS-77 (육각) Vektor SS-77 (Green Hex) + 벡터 SS-77 (초록육각) Vektor SS-77 (Desert) + 벡터 SS-77 (사막) Vektor SS-77 Compact + 벡터 SS-77 단축형 Vektor SS-77 Compact (Snake) + 벡터 SS-77 단축형 (뱀 위장) FN FAL 50.00 (Wood) + FN FAL 50.00 (목재) FN FAL 50.00 GL (Wood) + FN FAL 50.00 GL (목재) FN FAL 50.00 + FN FAL 50.00 FN FAL 50.00 GL + FN FAL 50.00 GL FN FAL 50.00 (Desert) + FN FAL 50.00 (사막) FN FAL 50.00 (Jungle) + FN FAL 50.00 (정글) Vektor R4 + 벡터 R4 Vektor R5 Carbine + 벡터 R5 카빈 Vektor R5 Carbine GL + 벡터 R5 카빈 GL Vektor R5 Carbine (Snake) + 벡터 R5 카빈 (뱀 위장) Vektor R5 Carbine GL (Snake) + 벡터 R5 카빈 GL (뱀 위장) XMS @@ -103,6 +134,7 @@ XMS XMS XMS + XMS XMS (Khaki) @@ -113,6 +145,7 @@ XMS (caqui) XMS(卡其色) XMS (хаки) + XMS (카키) XMS (Sand) @@ -123,6 +156,7 @@ XMS (arena) XMS(沙色) XMS (песочный) + XMS (모래) XMS GL @@ -133,6 +167,7 @@ XMS GL XMS GL XMS GL + XMS GL XMS GL (Khaki) @@ -143,6 +178,7 @@ XMS GL (caqui) XMS GL(卡其色) XMS GL (хаки) + XMS GL (카키) XMS GL (Sand) @@ -153,6 +189,7 @@ XMS GL (arena) XMS GL(沙色) XMS GL (песочный) + XMS GL (모래) XMS SG @@ -163,6 +200,7 @@ XMS SG XMS SG XMS SG + XMS SG XMS SG (Khaki) @@ -173,6 +211,7 @@ XMS SG (caqui) XMS SG(卡其色) XMS SG (хаки) + XMS SG (카키) XMS SG (Sand) @@ -183,6 +222,7 @@ XMS SG (arena) XMS SG(沙色) XMS SG (песочный) + XMS SG (모래) XMS SW @@ -193,6 +233,7 @@ XMS SW XMS SW XMS SW + XMS SW XMS SW (Khaki) @@ -203,6 +244,7 @@ XMS SW (caqui) XMS SW(卡其色) XMS SW (хаки) + XMS SW (카키) XMS SW (Sand) @@ -213,6 +255,7 @@ XMS SW (arena) XMS SW(沙色) XMS SW (песочный) + XMS SW (모래) diff --git a/addons/concertina_wire/stringtable.xml b/addons/concertina_wire/stringtable.xml index 069c74ffa5..e0fd904086 100644 --- a/addons/concertina_wire/stringtable.xml +++ b/addons/concertina_wire/stringtable.xml @@ -30,7 +30,7 @@ Concertina wire coil Bobina de arame farpado 鉄条網コイル - 윤형 철조망 + 코일형 철조망 鐵絲網捲 铁丝网卷 Bıçaklı Tel Rulo diff --git a/addons/cookoff/stringtable.xml b/addons/cookoff/stringtable.xml index eff7d4ddbe..7974e2f9bb 100644 --- a/addons/cookoff/stringtable.xml +++ b/addons/cookoff/stringtable.xml @@ -181,6 +181,7 @@ 誘爆後に車両を破壊するかどうかを設定する。 Kontroluje, czy pojazdy będą zawsze niszczone po samozapłonie. Steuert, ob Fahrzeuge nach dem Durchzünden immer zerstört werden. + 쿸오프 후 차량이 항상 파괴되는지 여부를 조정합니다. Enable Cook-Off Vehicle Fire diff --git a/addons/disarming/functions/fnc_canBeDisarmed.sqf b/addons/disarming/functions/fnc_canBeDisarmed.sqf index 25d072f1e5..4fde1597c4 100644 --- a/addons/disarming/functions/fnc_canBeDisarmed.sqf +++ b/addons/disarming/functions/fnc_canBeDisarmed.sqf @@ -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]}} diff --git a/addons/disarming/functions/fnc_disarmDropItems.sqf b/addons/disarming/functions/fnc_disarmDropItems.sqf index d43d3542f7..26e00dfa5f 100644 --- a/addons/disarming/functions/fnc_disarmDropItems.sqf +++ b/addons/disarming/functions/fnc_disarmDropItems.sqf @@ -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 { { diff --git a/addons/dogtags/XEH_postInit.sqf b/addons/dogtags/XEH_postInit.sqf index d7476345c9..ea8e9bbd38 100644 --- a/addons/dogtags/XEH_postInit.sqf +++ b/addons/dogtags/XEH_postInit.sqf @@ -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); diff --git a/addons/dragging/stringtable.xml b/addons/dragging/stringtable.xml index 5c54e87288..ba76b7f87a 100644 --- a/addons/dragging/stringtable.xml +++ b/addons/dragging/stringtable.xml @@ -152,24 +152,28 @@ 軽量物を持って走れるようにする Zezwól na Bieganie z Lekkimi Obiektami Erlauben das Sprinten mit leichten Gegenständen + 가벼운 개체 들고 달리기 허용 Allow the player to run when carrying lightweight objects. プレイヤーが軽量オブジェクトを持ち運んでいるときに走れるようにする。 Zezwalaj graczowi na bieganie podczas przenoszenia lekkich przedmiotów. Erlauben Sie dem Spieler, zu rennen, wenn er leichte Gegenstände trägt. + 가벼운 개체를 들고 다닐 때 플레이어가 뛸 수 있도록 허용합니다. Skip Object Weight オブジェクトの重量を無視 Pomiń Wagę Obiektu Objektgewicht überspringen + 개체 무게 무시 Determines whether object's weight is added onto weight calculations. 重量計算にオブジェクトの重量を追加するかどうかを決定します。 Określa, czy waga obiektu jest dodawana do obliczeń ciężaru. Legt fest, ob das Gewicht des Objekts zu den Gewichtsberechnungen hinzugefügt wird. + 무게 계산에 개체의 무게를 추가할 지 여부를 결정합니다. diff --git a/addons/explosives/XEH_preInit.sqf b/addons/explosives/XEH_preInit.sqf index ff908106a7..6970d2b7f4 100644 --- a/addons/explosives/XEH_preInit.sqf +++ b/addons/explosives/XEH_preInit.sqf @@ -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; diff --git a/addons/explosives/XEH_preStart.sqf b/addons/explosives/XEH_preStart.sqf index c62a1e1d3c..4eb48f6388 100644 --- a/addons/explosives/XEH_preStart.sqf +++ b/addons/explosives/XEH_preStart.sqf @@ -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 [])]; diff --git a/addons/fastroping/stringtable.xml b/addons/fastroping/stringtable.xml index a155f67664..0ea0e8aafb 100644 --- a/addons/fastroping/stringtable.xml +++ b/addons/fastroping/stringtable.xml @@ -319,12 +319,14 @@ Automatycznie Zamontuj FRIES FRIESの自動装備 FRIES automatisch ausrüsten + FRIES 로프 자동 장착 Automatically add FRIES to helicopters that support them. Automatycznie dodawaj FRIES do śmigłowców które je wspierają. FRIESをサポートするヘリコプターに自動的にFRIESを追加します。 FRIES automatisch Helikoptern hinzufügen, die es unterstützen + 로프를 지원하는 헬기에 자동으로 FRIES 로프를 추가합니다. diff --git a/addons/field_rations/functions/fnc_scanFieldRations.sqf b/addons/field_rations/functions/fnc_scanFieldRations.sqf index 96c64bb4cd..f252071df4 100644 --- a/addons/field_rations/functions/fnc_scanFieldRations.sqf +++ b/addons/field_rations/functions/fnc_scanFieldRations.sqf @@ -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]; diff --git a/addons/field_rations/script_component.hpp b/addons/field_rations/script_component.hpp index bcde75fe9c..534306b6be 100644 --- a/addons/field_rations/script_component.hpp +++ b/addons/field_rations/script_component.hpp @@ -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)) diff --git a/addons/fieldmanual/$PBOPREFIX$ b/addons/fieldmanual/$PBOPREFIX$ new file mode 100644 index 0000000000..b080a6d6b7 --- /dev/null +++ b/addons/fieldmanual/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\fieldmanual diff --git a/addons/fieldmanual/CfgEventHandlers.hpp b/addons/fieldmanual/CfgEventHandlers.hpp new file mode 100644 index 0000000000..0afdef638f --- /dev/null +++ b/addons/fieldmanual/CfgEventHandlers.hpp @@ -0,0 +1,5 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; diff --git a/addons/fieldmanual/CfgHintCategories.hpp b/addons/fieldmanual/CfgHintCategories.hpp new file mode 100644 index 0000000000..3a917c9c9c --- /dev/null +++ b/addons/fieldmanual/CfgHintCategories.hpp @@ -0,0 +1,5 @@ +class CfgHintCategories { + class ACE_FieldManual { + displayName = CSTRING(HintCategory_FieldManual_DisplayName); + }; +}; diff --git a/addons/fieldmanual/CfgHints.hpp b/addons/fieldmanual/CfgHints.hpp new file mode 100644 index 0000000000..7b86ba89b6 --- /dev/null +++ b/addons/fieldmanual/CfgHints.hpp @@ -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 = "ACE Wiki"; + }; + 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 = "ATragMX Wiki"; + }; + 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 = "Captives Wiki"; + }; + 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 = "Explosives Wiki"; + }; + 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 = "Chemlights Wiki"; + }; + 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 = "Explosives Wiki"; + }; + 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 = "DAGR Wiki"; + }; + 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 = "Explosives Wiki"; + }; + 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 = "Explosives Wiki"; + }; + 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 = "Hearing Wiki"; + }; + 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 = "Flashlights Wiki"; + }; + 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 = "Fortify Wiki"; + }; + 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 = "HuntIR Wiki"; + }; + 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 = "Kestrel 4500 Wiki"; + }; + 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 = "Vehicle Lock Wiki"; + }; + 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 = "MicroDAGR Wiki"; + }; + // 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 = "Rangecard Wiki"; + }; + 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 = "Sandbag Wiki"; + }; + 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 = "Overheating Wiki"; + }; + class ACE_SprayPaint: ACE_FieldManual_Base { + logicalOrder = 24; + displayName = CSTRING(Items_SprayPaint_DisplayName); + displayNameShort = CSTRING(Items_SprayPaint_ShortName); + description = CSTRING(Items_SprayPaint_Description); + tip = "Tagging Wiki"; + }; + class ACE_Tripod: ACE_FieldManual_Base { + logicalOrder = 25; + arguments[] += {QUOTE('ACE_Tripod' call FUNC(getItemName))}; + displayName = "%14"; + displayNameShort = CSTRING(Items_Tripod_ShortName); + description = CSTRING(Items_Tripod_Description); + tip = "Tripod Wiki"; + }; + 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 = "UAV Battery Wiki"; + }; + class ACE_VehicleKey: ACE_FieldManual_Base { + logicalOrder = 27; + displayName = CSTRING(Items_VehicleKey_DisplayName); + displayNameShort = CSTRING(Items_VehicleKey_ShortName); + description = CSTRING(Items_VehicleKey_Description); + tip = "Vehicle Lock Wiki"; + }; + class ACE_Wirecutter: ACE_FieldManual_Base { + logicalOrder = 28; + arguments[] += {QUOTE('ACE_wirecutter' call FUNC(getItemName))}; + displayName = "%14"; + displayNameShort = CSTRING(Items_Wirecutter_ShortName); + description = CSTRING(Items_Wirecutter_Description); + tip = "Wirecutter Wiki"; + }; + }; + // ACE Field Rations + class ACE_Field_Rations { + displayName = CSTRING(Field_Rations_DisplayName); + category = "ACE_FieldManual"; + + class ACE_Field_Rations_Base: ACE_FieldManual_Base { + tip = "Field Rations Wiki"; + }; + + 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 = "Medical Wiki"; + }; + + 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); + }; + }; +}; diff --git a/addons/fieldmanual/XEH_PREP.hpp b/addons/fieldmanual/XEH_PREP.hpp new file mode 100644 index 0000000000..425e79b6e9 --- /dev/null +++ b/addons/fieldmanual/XEH_PREP.hpp @@ -0,0 +1,4 @@ +TRACE_1("",QUOTE(ADDON)); + +PREP(getItemName); +PREP(getKeybindName); diff --git a/addons/fieldmanual/XEH_preStart.sqf b/addons/fieldmanual/XEH_preStart.sqf new file mode 100644 index 0000000000..022888575e --- /dev/null +++ b/addons/fieldmanual/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/fieldmanual/addon.toml b/addons/fieldmanual/addon.toml new file mode 100644 index 0000000000..7cfef775ee --- /dev/null +++ b/addons/fieldmanual/addon.toml @@ -0,0 +1,2 @@ +[preprocess] +enabled = false diff --git a/addons/fieldmanual/config.cpp b/addons/fieldmanual/config.cpp new file mode 100644 index 0000000000..19cdbcbf17 --- /dev/null +++ b/addons/fieldmanual/config.cpp @@ -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" diff --git a/addons/fieldmanual/functions/fnc_getItemName.sqf b/addons/fieldmanual/functions/fnc_getItemName.sqf new file mode 100644 index 0000000000..ed795ebd2c --- /dev/null +++ b/addons/fieldmanual/functions/fnc_getItemName.sqf @@ -0,0 +1,23 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Gets item's localized name or indicates if not availabe + * + * Arguments: + * 0: Classname + * + * Return Value: + * + * + * 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] +}; diff --git a/addons/fieldmanual/functions/fnc_getKeybindName.sqf b/addons/fieldmanual/functions/fnc_getKeybindName.sqf new file mode 100644 index 0000000000..726d411620 --- /dev/null +++ b/addons/fieldmanual/functions/fnc_getKeybindName.sqf @@ -0,0 +1,34 @@ +#include "..\script_component.hpp" +/* + * Author: Hypoxic, PabstMirror + * Gets keybind name from CBA + * + * Arguments: + * 0: Addon + * 1: Key Name + * + * Return Value: + * + * + * 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 diff --git a/addons/fieldmanual/script_component.hpp b/addons/fieldmanual/script_component.hpp new file mode 100644 index 0000000000..35a77d25f9 --- /dev/null +++ b/addons/fieldmanual/script_component.hpp @@ -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" diff --git a/addons/fieldmanual/stringtable.xml b/addons/fieldmanual/stringtable.xml new file mode 100644 index 0000000000..73bff03d1c --- /dev/null +++ b/addons/fieldmanual/stringtable.xml @@ -0,0 +1,293 @@ + + + + + Field Rations + 戰地口糧 + 野战军粮 + Poměrové pole + Rations sur le terrain + Feld Rationen + Terepi adagok + Razioni di campo + フィールド レーション + 전투식량 + Racje polowe + Rações de campo + Полевые рационы + Raciones de campo + Gıda Ihtiyaçları + + + Hunger + + + %3Hunger%4 increases linearly with soldier's movement speed. Restore by eating food.<br/><br/>%3Usage:%4<br/>%2Pick up food.<br/>%2Use [%3%12%4] and select %3Survival%4.<br/>%2Choose an item to consume. + + + Thirst + + + %3Thirst%4 increases linearly with soldier's movement speed. Restore by drinking liquids.<br/><br/>%3Usage:%4<br/>%2Pick up a drink.<br/>%2Use [%3%12%4] and select %3Survival%4.<br/>%2Choose an item to consume. + + + Medical Treatment + + + Decrease Heart Rate + + + %3Adenosine%4 is used to decrease heart rate.<br/><br/>%3Usage:%4<br/>%2Use [%3%13%4] or [%3%14%4] and select an appendage.<br/>%2Inject %3Adenosine%4. + + + Bandages + + + Close Wounds + + + %3Bandages%4 stop bleeding and close wounds. Depending on your settings, bandages may reopen if surgery is not performed.<br/><br/>%2%3Field Dressing:%4<br/>%11<t color='#D9D900'>Average</t> In All Categories<br/>%2%3Packing Bandage:%4<br/>%11<t color='#D9D900'>Average</t> Treatment<br/>%11<t color='#E60000'>Higher</t> Reopen Chance<br/>%11<t color='#00CC00'>Longer</t> Reopen Delay<br/>%2%3Elastic Bandage:%4<br/>%11<t color='#00CC00'>Higher</t> Treatment<br/>%11<t color='#E60000'>Higher</t> Reopen Chance<br/>%11<t color='#E60000'>Shorter</t> Reopen Delay<br/>%2%3Quickclot:%4<br/>%11<t color='#E60000'>Lower</t> Treatment<br/>%11<t color='#00CC00'>Lower</t> Reopen Chance<br/>%11<t color='#00CC00'>Longer</t> Reopening Delay<br/><br/>%3Usage:%4<br/>%2Use [%3%13%4] or [%3%14%4] and select a injured body part.<br/>%2Bandage body part by selecting desired %3Bandage%4 type. + + + IV Fluids + + + Restore Blood Volume + + + %3IV fluids%4 restore lost blood volume. Blood, Plasma, and Saline are functionally the same.<br/><br/>%3Usage:%4<br/>%2Use [%3%13%4] or [%3%14%4] and select an appendage.<br/>%2Restore blood volume by selecting desired %3IV Fluid%4 type. + + + Increase Heart Rate | Wake Up Faster + + + %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).<br/><br/>%3Usage%4<br/>%2Use [%3%13%4] or [%3%14%4] and select an appendage.<br/>%2Inject %3Epinephrine%4. + + + Restore Like New + + + 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.<br/><br/>%3Stable Condition%4 qualifies as:<br/>%2Unit is %3Alive%4.<br/>%2Unit is %3Conscious%4.<br/>%2Unit has no active %3Bleeding%4.<br/>%2Heart Rate >= 40.<br/>%2Systolic BP >= 60.<br/>%2Diastolic BP >= 50.<br/><br/>%3Usage:%4<br/>%2Move to appropriate location depending on %3ACE Settings%4.<br/>%2Use [%3%13%4] or [%3%14%4] and select %3Advanced Treatments%4<br/>%2Select %3Use Personal Aid Kit%4. + + + Fix Fractures + + + A %3Splint%4 is used to fix fractures. The %3Splint%4 is consumed when used.<br/><br/>%3Usage:%4<br/>%2Use [%3%13%4] or [%3%14%4] and select an affected appendage.<br/>%2Select %3Apply Splint%4. + + + Prevent Wounds From Reopening + + + A %3Surgical Kit%4 is used to prevent wounds from reopening after being bandaged. Depending on settings, it can also clear trauma.<br/><br/>%3Usage:%4<br/>%2Use [%3%13%4] or [%3%14%4] and select %3Advanced Treatment%4.<br/>%2Select %3Use Surgical Kit%4. + + + Stop Bleeding + + + A %3Tourniquet%4 stops bleeding temporarily so that a wound(s) can be bandaged. Can only be used on limbs.<br/><br/>%3Usage:%4<br/>%2Use [%3%13%4] or [%3%14%4] and select an affected appendage.<br/>%2Select %3Apply Tourniquet%4. + + + Portable, Precise, Rugged + + + 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.<br/><br/>%3Usage:%4<br/>Please visit the wiki page for more information. + + + Bring Out Your Dead + + + %3Body Bags%4 are used to transport dead bodies. They can be dragged and loaded into vehicles.<br/><br/>%3Usage:%4<br/>%2Approach a dead body.<br/>%2Use [%3%13%4] or [%3%14%4] and select %3Place Body In Bodybag%4. + + + Take Prisoners + + + %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.<br/><br/>%3Usage:%4<br/>%2Approach the unit and use the [%3%13%4].<br/>%2The interaction is located around the hands in the form of a handcuffs icon.<br/>%2Repeat to release. + + + Phone In An Explosion + + + 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.<br/><br/>%3Usage:%4<br/>%2Place an explosive.<br/>%2Use [%3%13%4], select %3Explosives%4, and select %3Cellphone%4.<br/>%2Open the cellphone interface with [%3%12%4].<br/>%2Navigate the phone book with the arrows and select your calling number.<br/>%2Call the number to detonate. + + + Portable Reading Lights + + + %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.<br/><br/>%3Usage:%4<br/>%2Use [%3%12%4] and select %3Equipment%4.<br/>%2elect %3Chemlights%4 and %3Prepare Chemlight Shield (Color)%4.<br/>%2Open %3Map%4.<br/>%2Use [%3%12%4] and select %3Flashlights%4 where you will find your chemlight shield. + + + Remote Detonation + + + Use %3Clackers%4 to connect and detonate an explosive device. Multiple devices can be linked to a clacker and detonated on different channels.<br/><br/>%3Usage:%4<br/>%2Place an explosive.<br/>%2Use [%3%13%4], select %3Explosives%4, and select the %3Clacker%4 you wish to link to.<br/>%2Open the ACE interface with [%3%12%4].<br/>%2Select %3Explosives%4 and select a %3Clacker%4.<br/>%2Select the %3Explosive%4 you wish to detonate. + + + Navigate + + + 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.<br/><br/>%3Usage:%4<br/>%2Equip a %3DAGR%4.<br/>%2Use [%3%12%4] and select %3Configure%4 or %3Toggle%4.<br/><br/>The following menus are available when configuring your %3DAGR:%4<br/>%11%2Data View: WIP<br/>%11%2GoTo WP: Select a waypoint to track.<br/>%11%2WP List: Add/Edit/Remove waypoints.<br/>%11%2Connect To: Connect %3DAGR%4 to the %3Vector 21 Rangefinder%4.<br/>%11%2Options + + + Explosive Revenge + + + The %3Dead Man's Switch%4 is a device that allows a soldier to detonate an %3Explosive%4 when the soldier dies.<br/><br/>%3Usage:%4<br/>%2Use [%3%12%4] and select %3Explosives%4.<br/>%2Select %3Dead Man's Switch%4 and connect the desired %3Explosive%4.<br/>%2Repeat the process and disconnect to reverse. + + + The %3Defusal Kit%4 allows defusal of explosives.<br/><br/>%3Usage:%4<br/>%2Equip a %3Defusal Kit%4.<br/>%2Safely approach an %3Explosive%4.<br/>%2Use [%3%13%4] and select %3Defuse%4. + + + Defuse Explosives + + + Protect Your Hearing + + + %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.<br/><br/>%3Usage:%4<br/>%2Use [%3%12%4] and select %3Equipment%4.<br/>%2Insert %3Ear Plugs%4. + + + Get To Cover + + + The %3Entrenching Tool%4 allows soldiers to dig trenches to help defend their position. The soldier must be on soil in order to dig a trench.<br/><br/>%3Usage:%4<br/>%2Equip an %3Entrenching Tool%4.<br/>%2Use [%3%12%4] and select %3Equipment%4.<br/>%2Select the type of trench you wish to build. + + + Flashlights + + + Illuminate Your Map + + + %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.<br/><br/>%3Usage:%4<br/>%2On the map screen, use [%3%12%4] and select %3Flashlights%4.<br/>%2Select the %3Flashlight%4 you want to use and select %3On%4.<br/><br/>%3Available Flashlight Items%4:<br/>%2 Fulton MX-991<br/>%2 KSF-1<br/>%2 Maglite XL50<br/><br/>%3NOTE:%4<br/>Flashlight states are persistent. + + + Observe From The Skies + + + 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.<br/><br/>%3Usage:%4<br/>%2Equip a %3HuntIR Monitor%4 and compatible ammunition.<br/>%2Fire the %3HuntIR Round%4 as high as possible over the area you want to observe.<br/>%2Open the %3HuntIR Monitor%4.<br/>%2Use [%3%12%4], select %3Equipment%4.<br/>%2Select %3Activate HuntIR Monitor%4. + + + Track Your Team With Stealth + + + 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.<br/><br/>%3Usage:%4<br/>%2Use [%3%12%4] and select %3Equipment%4.<br/>%2Select %3Attach%4 and select the %3IR Strobe%4. + + + Pocket Weatherstation + + + The %3Kestrel 4500 Pocket Weather Tracker%4 is a mini weather station useful for collecting the the following weather data:<br/>%2Heading and wind direction<br/>%2Crosswind and headwind<br/>%2Altitude and barometric pressure<br/>%2Wet bulb temperature<br/>%2Humidity and dewpoint<br/>%2Density altitude<br/>%2Wind chill and temperature<br/>%2Time and date<br/>%2Minimum, maximum, and average values<br/><br/>%3Usage:%4<br/>%2Equip a %3Kestrel%4.<br/>%2Use [%3%12%4] and select %3Equipment%4.<br/>%2Select %3Open%4. + + + Triangulate Your Position + + + 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.<br/><br/>%3Usage:%4<br/>%2Open %3Map%4.<br/>%2Use [%3%12%4] and select %3Map Tools%4.<br/>%2 The Tool can be moved by dragging with [%3Left-Click%4] while holding [%3ALT%4]. + + + Advanced DAGR + + + The %3MicroDAGR GPS%4 is an advanced version of the %3DAGR%4. It provides position, navigation, and timing (PNT) data to include:<br/>%2Compass and heading<br/>%2Date and hour synced to the mission<br/>%2Elevation (relative to sea level)<br/>%2Current speed<br/>%2GPS with topographic and satellite view<br/>%2Creating, naming, and deleting waypoints<br/>%2Friendly identification (Requires ACE BLUFOR Tracker Setting)<br/>Connection to the Vector-21 Rangefinder for data import (waypoint creation and grid reference of ranged targets)<br/><br/>%3Usage:%4<br/>%2For usage instructions, please visit the dedicated %3MicroDAGR%4 wiki. + + + Range Tables + + + Get A Firing Solution + + + %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.<br/><br/>%3Usage:%4<br/>%2Use [%3%12%4] and select %3Equipment%4.<br/>%2Select the desired %3Range Table%4. + + + Ropes + + + Tow With Ease + + + %3Ropes%4 have multiple uses including %3Towing%4 vehicles and %3Fast Roping%4 from helicopters.<br/><br/>%3Towing:%4<br/>%2Approach a vehicle.<br/>%2Use [%3%13%4] and select %3Towing%4.<br/>%2Select rope length.<br/>%2Select attachment point on towing vehicle.<br/>%2Select attachment on towed vehicle.<br/><br/>%3Available Rope Lengths:%4<br/>%2 3.2 meters<br/>%2 6.2 meters<br/>%2 12.2 meters<br/>%2 15.2 meters<br/>%2 18.3 meters<br/>%2 27.4 meters<br/>%2 36.6 meters + + + Expand Your Fortifications + + + %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.<br/><br/>%3Usage:%4<br/>%2Equip a %3Sandbag (Empty)%4.<br/>%2Use [%3%12%4] and select %3Deploy Sandbag%4.<br/>%2Follow on-screen instructions for placement. + + + Lower Firearm Temperature + + + %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.<br/><br/>%3Usage:%4<br/>%2Use [%3%12%4] and select %3Equipment%4.<br/>%2Select %3Swap Barrel%4.<br/>%2Resume operation after barrel swap is complete. + + + Spray Paint + + + Tag Your Territory + + + %3Spray Paint%4 is used to tag surfaces with various symbols.<br/><br/>%3Usage:%4<br/>%2Move close to a surface (wall, vehicle, ground, etc).<br/>%2Use [%3%12%4] and select %3Tag%4.<br/>%2Choose a symbol.<br/><br/>%3Available Colors:%4<br/>%2Black<br/>%2Blue<br/>%2Green<br/>%2Red + + + Brace From Anywhere + + + 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.<br/><br/>%3Usage:%4<br/>%2Use [%3%12%4] and select %3Equipment%4.<br/>%2Select %3SSWT Kit%4 and follow the on screen prompts to place. + + + Keep Eyes In The Sky + + + %3UAV Batteries%4 are used to recharge a UAV's energy storage. Especially useful for small UAVs.<br/><br/>%3Usage:%4<br/>%2Equip a %3UAV Battery%4<br/>%2Approach a %3UAV%4 with its %3Engine Off%4.<br/>%2Use [%3%13%4] and select %3Recharge%4. + + + Making An Entrance + + + %3Wirecutters%4 are a tool that allows a soldier to bypass wired fencing. Useful for creating backdoor entrances into secure areas.<br/><br/>%3Usage:%4<br/>%2Move close to a fence.<br/>%2Use [%3%12%4] and select %3Cut Fence%4. + + + Items + 物品 + Objets + Objetos + Oggetti + Przedmioty + Предметы + Gegenstände + Předměty + Itens + 물품 + 物品 + アイテム + Eşyalar + + + ACE3 + + + Build Fortifications + + + The %3Fortify Tool%4 allows soldiers to build fortifications provided by their mission creator.<br/><br/>%3Usage:%4<br/>%2Pick up a %3FortifyTool%4.<br/>%2Use [%3%12%4] and select %3Fortify%4.<br/>%2Select an available fortification and follow the on screen prompts for placement. + + + Breaking and Entering + + + %3Lockpicks%4 are used to gain access to locked vehicles.<br/><br/>%3Usage:%4<br/>%2Equip a %3Lockpick%4.<br/>%2Approach a %3Locked%4 vehicle.<br/>Use [%3%13%4] and select %3Lockpick Vehicle%4.<br/><br/><t underline='1'>%3Note:%4</t> Lockpicks and keys are only available via scripting or ACE Vehicle Key modules. + + + Vehicle Keys + + + Lock/Unlock Vehicles + + + %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.<br/><br/>%3Usage:%4<br/>%2Equip a %3Vehicle Key%4.<br/>%2Approach the vehicle that the key belongs to.<br/>Use [%3%13%4] and select %3Lock/Unlock Vehicle%4.<br/><br/><t underline='1'>%3Note:%4</t> Lockpicks and keys are only available via scripting or ACE Vehicle Key modules. + + + diff --git a/addons/interact_menu/functions/fnc_keyUp.sqf b/addons/interact_menu/functions/fnc_keyUp.sqf index 3f80201c03..a12a404da7 100644 --- a/addons/interact_menu/functions/fnc_keyUp.sqf +++ b/addons/interact_menu/functions/fnc_keyUp.sqf @@ -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; diff --git a/addons/irlight/stringtable.xml b/addons/irlight/stringtable.xml index 50d93bcd56..2167aee5d3 100644 --- a/addons/irlight/stringtable.xml +++ b/addons/irlight/stringtable.xml @@ -4,58 +4,86 @@ DBAL-A3 (red) DBAL-A3 (rot) + DBAL-A3 (czerwony) + DBAL-A3 (빨강) DBAL-A3 (green) DBAL-A3 (grün) + DBAL-A3 (zielony) + DBAL-A3 (녹색) <t color='#9cf953'>Use: </t>Turn Laser ON/OFF<br>Double click to switch mode <t color='#9cf953'>Benutzen: </t>Laser EIN/AUS<br>Doppelklick um Modus zu wechseln + <t color='#9cf953'>Użycie: </t>Laser WŁ/WYŁ<br>Kliknij dwukrotnie, aby zmienić tryb + <t color='#9cf953'>사용: </t>레이저 켜기/끄기<br>터블 클릭으로 모드 전환 Dual Beam Aiming Laser Doppelstrahllaservisier + Laser Celowniczy z Podwójną Wiązką + 이중 빔 조준 레이저 Visible Laser Sichtbarer Laser + Laser Widzialny + 가시 레이저 IR Laser IR-Laser + Laser IR + 적외선 레이저 IR Illuminator IR-Taschenlampe + Iluminator IR + 적외선 조명 IR Laser and Illuminator IR-Laser und -Licht + Laser IR i Iluminator + 적외선 레이저와 조명 Wide Beam Breiter Lichtstrahl + Szeroka Wiązka + 넓은 빔 Medium Beam Mittlerer Lichtstrahl + Średnia Wiązka + 중간 빔 Narrow Beam Schmaler Lichtstrahl + Wąska Wiązka + 좁은 빔 <t color='#9cf953'>Use: </t>Turn Light ON/OFF<br>Double click to switch mode <t color='#9cf953'>Benutzen: </t>Licht EIN/AUS<br>Doppelklick um Modus zu wechseln + <t color='#9cf953'>Użycie: </t>Iluminator WŁ/WYŁ<br>Kliknij dwukrotnie, aby zmienić tryb + <t color='#9cf953'>사용: </t>조명 켜기/끄기<br>더블 클릭으로 모드 전환 Special Purpose IR LED Illuminator Infrarot LED Taschenlampe + Iluminator IR LED Specjalnego Przeznaczenia + 특수목적 적외선 LED 조명 Illuminator / Laser Momentary Switch Licht / Laser Tastschalter + Przełącznik Chwilowy Iluminator / Laser + 조명/레이저 빠르게 스위치 diff --git a/addons/laser/XEH_postInit.sqf b/addons/laser/XEH_postInit.sqf index 364e9a682f..ec6b6aca2d 100644 --- a/addons/laser/XEH_postInit.sqf +++ b/addons/laser/XEH_postInit.sqf @@ -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; diff --git a/addons/laser/XEH_preInit.sqf b/addons/laser/XEH_preInit.sqf index 4fe49c5db4..b5ce16a3b0 100644 --- a/addons/laser/XEH_preInit.sqf +++ b/addons/laser/XEH_preInit.sqf @@ -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; diff --git a/addons/laser/functions/fnc_dev_drawVisibleLaserTargets.sqf b/addons/laser/functions/fnc_dev_drawVisibleLaserTargets.sqf index c56412512a..7f05f38bbe 100644 --- a/addons/laser/functions/fnc_dev_drawVisibleLaserTargets.sqf +++ b/addons/laser/functions/fnc_dev_drawVisibleLaserTargets.sqf @@ -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 diff --git a/addons/laser/functions/fnc_keyLaserCodeChange.sqf b/addons/laser/functions/fnc_keyLaserCodeChange.sqf index 73b9160daf..1477fe75c1 100644 --- a/addons/laser/functions/fnc_keyLaserCodeChange.sqf +++ b/addons/laser/functions/fnc_keyLaserCodeChange.sqf @@ -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); diff --git a/addons/laser/functions/fnc_laserOn.sqf b/addons/laser/functions/fnc_laserOn.sqf index 268ce1b289..9af89ce91b 100644 --- a/addons/laser/functions/fnc_laserOn.sqf +++ b/addons/laser/functions/fnc_laserOn.sqf @@ -7,7 +7,7 @@ * 0: Emitter * 1: Owner * 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. - * 3: Wavelength (1550nm is common eye safe) + * 3: Wavelength (1064nm is typical) * 4: Laser code * 5: Beam divergence (in mils off beam center) * 6: Method Args (default: nil) @@ -16,8 +16,8 @@ * UUID for sending to laserOff function * * 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 */ diff --git a/addons/laser/functions/fnc_seekerFindLaserSpot.sqf b/addons/laser/functions/fnc_seekerFindLaserSpot.sqf index 1019eb4770..5c5fbe3aa5 100644 --- a/addons/laser/functions/fnc_seekerFindLaserSpot.sqf +++ b/addons/laser/functions/fnc_seekerFindLaserSpot.sqf @@ -9,7 +9,7 @@ * 1: Direction vector (will be normalized) * 2: Seeker FOV in degrees * 3: Seeker max distance in meters - * 4: Seeker wavelength sensitivity range, [1550,1550] is common eye safe + * 4: Seeker wavelength sensitivity range, [1064,1064] is common * 5: Seeker laser code. * 6: Ignore 1 (e.g. Player's vehicle) (default: objNull) * 7: Ignore 2 (e.g. Attached object) (default: objNull) @@ -19,7 +19,7 @@ * [Strongest compatible laser spot ASL pos, owner object] Nil array values if nothing found * * 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 */ diff --git a/addons/laser/initKeybinds.sqf b/addons/laser/initKeybinds.sqf index 418b062fec..465c4a35c2 100644 --- a/addons/laser/initKeybinds.sqf +++ b/addons/laser/initKeybinds.sqf @@ -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) diff --git a/addons/laser/stringtable.xml b/addons/laser/stringtable.xml index a04d339441..5428315435 100644 --- a/addons/laser/stringtable.xml +++ b/addons/laser/stringtable.xml @@ -51,22 +51,56 @@ 雷射碼 Lazer Kod - - Laser - Cycle Code Up - Lasercode + - Laser - Następny kod - Code laser + - Лазер - увеличить частоту - Laser - Alternar Código para Cima - Lézer - kódciklus növelése - Láser - Aumentar código - Laser - Kód + - Laser - Cambia codice + - レーザ - コードの数値を増やす - 레이저 - 코드 순환 위 - 激光—循环切换激光码 上 - 雷射 - 循環切換雷射碼 上 - Lazer - Çevrim Kodu Yukarı + + Laser - Cycle Code Up - XXX# + Lasercode +XXX# + Laser - Następny kod - XXX# + Code laser +XXX# + Лазер - увеличить частоту - XXX# + Laser - Alternar Código para Cima - XXX# + Lézer - kódciklus növelése - XXX# + Láser - Aumentar código - XXX# + Laser - Kód +XXX# + Laser - Cambia codice - XXX# + レーザ - コードの数値を増やす - XXX# + 레이저 - 코드 순환 위 - XXX# + 激光—循环切换激光码 上 - XXX# + 雷射 - 循環切換雷射碼 上 - XXX# + Lazer - Çevrim Kodu Yukarı - XXX# + + + Laser - Cycle Code Up - XX#X + Lasercode +XX#X + Laser - Następny kod - XX#X + Code laser +XX#X + Лазер - увеличить частоту - XX#X + Laser - Alternar Código para Cima - XX#X + Lézer - kódciklus növelése - XX#X + Láser - Aumentar código - 1##X + Laser - Kód +XX#X + Laser - Cambia codice - XX#X + レーザ - コードの数値を増やす - XX#X + 레이저 - 코드 순환 위 - 1##X + 激光—循环切换激光码 上 - XX#X + 雷射 - 循環切換雷射碼 上 - XX#X + Lazer - Çevrim Kodu Yukarı - XX#X + + + Laser - Cycle Code Up - X#XX + Lasercode +X#XX + Laser - Następny kod - X#XX + Code laser +X#XX + Лазер - увеличить частоту - X#XX + Laser - Alternar Código para Cima - X#XX + Lézer - kódciklus növelése - X#XX + Láser - Aumentar código - X#XX + Laser - Kód +X#XX + Laser - Cambia codice - X#XX + レーザ - コードの数値を増やす - X#XX + 레이저 - 코드 순환 위 - X#XX + 激光—循环切换激光码 上 - X#XX + 雷射 - 循環切換雷射碼 上 - X#XX + Lazer - Çevrim Kodu Yukarı - X#XX Laser - Cycle Code Down @@ -90,12 +124,14 @@ レーザースポットトラッカー: オン Laserowe Śledzenie Punktu: Wł. Laserziel Verfolgung: An + 레이저 스팟 추적기: 켬 Laser Spot Tracker: Off レーザースポットトラッカー: オフ Laserowe Śledzenie Punktu: Wył. Laserziel Verfolgung: Aus + 레이저 스팟 추적기: 끔 Draw Laser on Map diff --git a/addons/medical_ai/functions/fnc_healingLogic.sqf b/addons/medical_ai/functions/fnc_healingLogic.sqf index c9c5fdd483..fa35b49284 100644 --- a/addons/medical_ai/functions/fnc_healingLogic.sqf +++ b/addons/medical_ai/functions/fnc_healingLogic.sqf @@ -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; diff --git a/addons/medical_ai/functions/fnc_itemCheck.sqf b/addons/medical_ai/functions/fnc_itemCheck.sqf index e93af9953c..6d91594ce4 100644 --- a/addons/medical_ai/functions/fnc_itemCheck.sqf +++ b/addons/medical_ai/functions/fnc_itemCheck.sqf @@ -18,7 +18,7 @@ * Public: No */ -if (!GVAR(requireItems)) exitWith { [true] }; +if (GVAR(requireItems) == 0) exitWith { [true] }; params ["_healer", "_treatementType"]; diff --git a/addons/medical_ai/initSettings.sqf b/addons/medical_ai/initSettings.sqf index 4a5bc5d691..a2b06519a4 100644 --- a/addons/medical_ai/initSettings.sqf +++ b/addons/medical_ai/initSettings.sqf @@ -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; diff --git a/addons/medical_ai/stringtable.xml b/addons/medical_ai/stringtable.xml index bfefa3bd18..0ae751dec7 100644 --- a/addons/medical_ai/stringtable.xml +++ b/addons/medical_ai/stringtable.xml @@ -52,11 +52,16 @@ Require Items Wymagane Przedmioty Erfordere Gegenstände + 아이템 필요 - AI will only perform medical treatment if they have the necessary items in their inventory.\nRequires custom AI loadouts! - AI będzie wykonywać zabiegi medyczne tylko wtedy, gdy ma w ekwipunku niezbędne przedmioty. \nWymaga niestandardowego wyposażenia AI! - Die KI führt nur dann medizinische Behandlungen durch, wenn sie die erforderlichen Gegenstände in ihrem Inventar hat.\nErfordert benutzerdefinierte KI-Ausrüstungen! + AI will only perform medical treatment if they have the necessary items in their inventory. + AI będzie wykonywać zabiegi medyczne tylko wtedy, gdy ma w ekwipunku niezbędne przedmioty. + Die KI führt nur dann medizinische Behandlungen durch, wenn sie die erforderlichen Gegenstände in ihrem Inventar hat. + 소지품에 필요한 아이템이 있을 경우에만 인공지능이 치료를 진행합니다. + + + Auto Convert Items for AI diff --git a/addons/medical_damage/ACE_Medical_Injuries.hpp b/addons/medical_damage/ACE_Medical_Injuries.hpp index 8117a2c56f..e3ffb7bfde 100644 --- a/addons/medical_damage/ACE_Medical_Injuries.hpp +++ b/addons/medical_damage/ACE_Medical_Injuries.hpp @@ -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 diff --git a/addons/medical_damage/stringtable.xml b/addons/medical_damage/stringtable.xml index 256516a47d..1b8ec6b113 100644 --- a/addons/medical_damage/stringtable.xml +++ b/addons/medical_damage/stringtable.xml @@ -784,6 +784,7 @@ 気絶する痛みのしきい値 Próg Nieprzytomności od Bólu Schmerz-Bewusstlosigkeit-Grenze + 고통 기절 한계점 Sets the threshold for severe pain, above which a person can fall unconscious upon receiving damage. @@ -792,6 +793,7 @@ 激しい痛みのしきい値を設定します。このしきい値を超えた状態でダメージを受けると意識を失う可能性があります。 Ustawia próg silnego bólu, powyżej którego osoba może stracić przytomność po otrzymaniu obrażeń. Legt die Grenze für starke Schmerzen fest, oberhalb derer eine Person bei erlittenem Schaden bewusstlos werden kann. + 사람이 데미지를 입었을 때 의식불명 상태가 될 수 있는 심각한 고통의 한계점을 설정합니다. Fatal Injury Death Chance diff --git a/addons/medical_engine/script_macros_medical.hpp b/addons/medical_engine/script_macros_medical.hpp index 1f1f2c5aba..56c1eec401 100644 --- a/addons/medical_engine/script_macros_medical.hpp +++ b/addons/medical_engine/script_macros_medical.hpp @@ -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) diff --git a/addons/medical_engine/stringtable.xml b/addons/medical_engine/stringtable.xml index aa6c3556c9..09b27103cc 100644 --- a/addons/medical_engine/stringtable.xml +++ b/addons/medical_engine/stringtable.xml @@ -25,9 +25,13 @@ Armor PassThrough Effect + Efekt penetracji pancerza + 방어구 PassThrough 효과 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! + 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! + 최종 데미지에 대한 방어구의 'PassThrough' 효과를 조정합니다. GL 리그에 사용되는 것과 같은 높은 방호값을 덜 효과적으로 만듭니다\n3.16.0 이전의 방어구 동작에는 0%를 사용하십시오.\n당신이 뭘 하고 있는지 알고 있는 경우에만 이걸 설정하세요! diff --git a/addons/medical_gui/XEH_postInit.sqf b/addons/medical_gui/XEH_postInit.sqf index 6127a1a013..7f89dca28c 100644 --- a/addons/medical_gui/XEH_postInit.sqf +++ b/addons/medical_gui/XEH_postInit.sqf @@ -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; diff --git a/addons/medical_gui/data/body_image/arm_left_s.paa b/addons/medical_gui/data/body_image/arm_left_s.paa new file mode 100644 index 0000000000..58682a5a73 Binary files /dev/null and b/addons/medical_gui/data/body_image/arm_left_s.paa differ diff --git a/addons/medical_gui/data/body_image/arm_right_s.paa b/addons/medical_gui/data/body_image/arm_right_s.paa new file mode 100644 index 0000000000..613ff387ff Binary files /dev/null and b/addons/medical_gui/data/body_image/arm_right_s.paa differ diff --git a/addons/medical_gui/data/body_image/head_s.paa b/addons/medical_gui/data/body_image/head_s.paa new file mode 100644 index 0000000000..f4daa0a9b6 Binary files /dev/null and b/addons/medical_gui/data/body_image/head_s.paa differ diff --git a/addons/medical_gui/data/body_image/leg_left_s.paa b/addons/medical_gui/data/body_image/leg_left_s.paa new file mode 100644 index 0000000000..71f25cba8c Binary files /dev/null and b/addons/medical_gui/data/body_image/leg_left_s.paa differ diff --git a/addons/medical_gui/data/body_image/leg_right_s.paa b/addons/medical_gui/data/body_image/leg_right_s.paa new file mode 100644 index 0000000000..1b9bf0ba64 Binary files /dev/null and b/addons/medical_gui/data/body_image/leg_right_s.paa differ diff --git a/addons/medical_gui/data/body_image/torso_s.paa b/addons/medical_gui/data/body_image/torso_s.paa new file mode 100644 index 0000000000..4af858e089 Binary files /dev/null and b/addons/medical_gui/data/body_image/torso_s.paa differ diff --git a/addons/medical_gui/functions/fnc_displayPatientInformation.sqf b/addons/medical_gui/functions/fnc_displayPatientInformation.sqf index 07294f1218..83ab7ba3f0 100644 --- a/addons/medical_gui/functions/fnc_displayPatientInformation.sqf +++ b/addons/medical_gui/functions/fnc_displayPatientInformation.sqf @@ -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; diff --git a/addons/medical_gui/functions/fnc_menuPFH.sqf b/addons/medical_gui/functions/fnc_menuPFH.sqf index 53d6545a52..803d03e070 100644 --- a/addons/medical_gui/functions/fnc_menuPFH.sqf +++ b/addons/medical_gui/functions/fnc_menuPFH.sqf @@ -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; diff --git a/addons/medical_gui/functions/fnc_updateBodyImage.sqf b/addons/medical_gui/functions/fnc_updateBodyImage.sqf index 11454e2dfd..a7e579d193 100644 --- a/addons/medical_gui/functions/fnc_updateBodyImage.sqf +++ b/addons/medical_gui/functions/fnc_updateBodyImage.sqf @@ -6,17 +6,18 @@ * Arguments: * 0: Body image controls group * 1: Target + * 2: Body part * * 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] ]; diff --git a/addons/medical_gui/functions/fnc_updateInjuryList.sqf b/addons/medical_gui/functions/fnc_updateInjuryList.sqf index 85c87cec7e..8a09647740 100644 --- a/addons/medical_gui/functions/fnc_updateInjuryList.sqf +++ b/addons/medical_gui/functions/fnc_updateInjuryList.sqf @@ -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; }; diff --git a/addons/medical_gui/gui.hpp b/addons/medical_gui/gui.hpp index e0f836f058..cb7ba0f402 100644 --- a/addons/medical_gui/gui.hpp +++ b/addons/medical_gui/gui.hpp @@ -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 { diff --git a/addons/medical_gui/initSettings.sqf b/addons/medical_gui/initSettings.sqf index c1d02d7131..1d87de401e 100644 --- a/addons/medical_gui/initSettings.sqf +++ b/addons/medical_gui/initSettings.sqf @@ -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; diff --git a/addons/medical_gui/script_component.hpp b/addons/medical_gui/script_component.hpp index 62c38447ee..eb46b19aed 100644 --- a/addons/medical_gui/script_component.hpp +++ b/addons/medical_gui/script_component.hpp @@ -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 diff --git a/addons/medical_gui/stringtable.xml b/addons/medical_gui/stringtable.xml index a8b1a69241..3224c0fc43 100644 --- a/addons/medical_gui/stringtable.xml +++ b/addons/medical_gui/stringtable.xml @@ -282,6 +282,15 @@ 開起醫療選單 Medikal Menüyü Aç + + Peek Medical Info + + + Medical Peek Duration + + + How long the medical info peek remains open after releasing the key. + Load Patient Cargar al paciente en @@ -957,6 +966,21 @@ 出血中 Kanama var + + No bleeding + + + Slow bleeding + + + Moderate bleeding + + + Severe bleeding + + + Massive bleeding + in Pain hat Schmerzen @@ -1021,6 +1045,9 @@ Schiene angelegt 부목 적용함 + + No blood loss + Lost some blood @@ -1250,12 +1277,25 @@ Показывать тяжесть кровопотери в списке ранений. Mostrar la pérdida de sangre cualitativa en la lista de heridas. + + Peek Medical Info on Hit + + + Temporarily show medical info when injured. + + + Medical Peek Duration on Hit + + + How long the medical info peek remains open after being injured. + Show Trauma Sustained Mostrar Traumatismo Sofrido 外傷の表示 Pokaż Doznane Urazy Zeigen Sie das erlittene Trauma + 외상 지속 표시 Show trauma sustained in the injury list. @@ -1263,6 +1303,13 @@ 負傷リストに外傷を表示する。 Pokaż odniesione obrażenia na liście obrażeń. Zeigen Sie das erlittene Trauma in der Verletzungsliste an. + 부상 목록에 발생한 외상을 표시합니다. + + + Body Part Outline Color + + + Color of outline around selected body part. Minor Trauma @@ -1270,6 +1317,7 @@ 軽度の外傷 Niewielki Uraz Kleineres Trauma + 약한 외상 Major Trauma @@ -1277,6 +1325,7 @@ 中度の外傷 Poważny Uraz Großes Trauma + 중간 외상 Severe Trauma @@ -1284,6 +1333,7 @@ 重度の外傷 Ciężki Uraz Schweres Trauma + 강한 외상 Chronic Trauma @@ -1291,6 +1341,7 @@ 慢性的な外傷 Przewlekły Uraz Chronisches Trauma + 심각한 외상 diff --git a/addons/medical_gui/ui/cross_grave.paa b/addons/medical_gui/ui/cross_grave.paa deleted file mode 100644 index ca18f3d081..0000000000 Binary files a/addons/medical_gui/ui/cross_grave.paa and /dev/null differ diff --git a/addons/medical_gui/ui/grave.paa b/addons/medical_gui/ui/grave.paa new file mode 100644 index 0000000000..ccd786d73c Binary files /dev/null and b/addons/medical_gui/ui/grave.paa differ diff --git a/addons/medical_status/stringtable.xml b/addons/medical_status/stringtable.xml index a6f95a3634..a388fb53fa 100644 --- a/addons/medical_status/stringtable.xml +++ b/addons/medical_status/stringtable.xml @@ -121,11 +121,13 @@ Weapon Drop Chance Szansa Upuszczenia Broni Wahrscheinlichkeit, die Waffe fallen zu lassen + 무기 떨어뜨릴 확률 Chance for a player to drop their weapon when going unconscious.\nHas no effect on AI. Szansa na upuszczenie broni przez gracza, przy utracie przytomności. \nNie ma wpływu na AI. Chance für einen Spieler, seine Waffe fallen zu lassen, wenn er bewusstlos wird.\nHat keine Auswirkung auf die KI. + 플레이어가 기절할 때 무기를 떨어뜨릴 확률입니다.\nAI는 영향을 받지 않습니다. diff --git a/addons/medical_treatment/ACE_Medical_Treatment.hpp b/addons/medical_treatment/ACE_Medical_Treatment.hpp index f3a498c8e2..57625623d0 100644 --- a/addons/medical_treatment/ACE_Medical_Treatment.hpp +++ b/addons/medical_treatment/ACE_Medical_Treatment.hpp @@ -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; diff --git a/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp b/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp index 9ed1b2998e..b7fd0ac3bd 100644 --- a/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp +++ b/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp @@ -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); diff --git a/addons/medical_treatment/CfgVehicles.hpp b/addons/medical_treatment/CfgVehicles.hpp index bb9ea8054f..ea9e47cb91 100644 --- a/addons/medical_treatment/CfgVehicles.hpp +++ b/addons/medical_treatment/CfgVehicles.hpp @@ -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 { diff --git a/addons/medical_treatment/XEH_PREP.hpp b/addons/medical_treatment/XEH_PREP.hpp index 11fabc5440..9222b0bd8b 100644 --- a/addons/medical_treatment/XEH_PREP.hpp +++ b/addons/medical_treatment/XEH_PREP.hpp @@ -47,6 +47,7 @@ PREP(loadUnit); PREP(medication); PREP(medicationLocal); PREP(onMedicationUsage); +PREP(placeBodyBagInGrave); PREP(placeInBodyBag); PREP(placeInBodyBagOrGrave); PREP(placeInGrave); diff --git a/addons/medical_treatment/XEH_postInit.sqf b/addons/medical_treatment/XEH_postInit.sqf index e943b0c8c3..4c7a780fc3 100644 --- a/addons/medical_treatment/XEH_postInit.sqf +++ b/addons/medical_treatment/XEH_postInit.sqf @@ -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; }; diff --git a/addons/medical_treatment/data/ACE_grave.p3d b/addons/medical_treatment/data/ACE_grave.p3d new file mode 100644 index 0000000000..10b1d4e9f8 Binary files /dev/null and b/addons/medical_treatment/data/ACE_grave.p3d differ diff --git a/addons/medical_treatment/data/Grave_as.paa b/addons/medical_treatment/data/Grave_as.paa new file mode 100644 index 0000000000..f34c503618 Binary files /dev/null and b/addons/medical_treatment/data/Grave_as.paa differ diff --git a/addons/medical_treatment/data/Grave_co.paa b/addons/medical_treatment/data/Grave_co.paa new file mode 100644 index 0000000000..79e61db1bb Binary files /dev/null and b/addons/medical_treatment/data/Grave_co.paa differ diff --git a/addons/medical_treatment/data/Grave_nohq.paa b/addons/medical_treatment/data/Grave_nohq.paa new file mode 100644 index 0000000000..0ddce42bbc Binary files /dev/null and b/addons/medical_treatment/data/Grave_nohq.paa differ diff --git a/addons/medical_treatment/data/Grave_smdi.paa b/addons/medical_treatment/data/Grave_smdi.paa new file mode 100644 index 0000000000..0586c5dbc2 Binary files /dev/null and b/addons/medical_treatment/data/Grave_smdi.paa differ diff --git a/addons/medical_treatment/data/grave.rvmat b/addons/medical_treatment/data/grave.rvmat new file mode 100644 index 0000000000..9a28f4af13 --- /dev/null +++ b/addons/medical_treatment/data/grave.rvmat @@ -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"; +}; diff --git a/addons/medical_treatment/data/model.cfg b/addons/medical_treatment/data/model.cfg index 344141e28e..8546ed7cfd 100644 --- a/addons/medical_treatment/data/model.cfg +++ b/addons/medical_treatment/data/model.cfg @@ -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 {}; diff --git a/addons/medical_treatment/functions/fnc_bodyCleanupLoop.sqf b/addons/medical_treatment/functions/fnc_bodyCleanupLoop.sqf index e66513a19d..d35dcc452c 100644 --- a/addons/medical_treatment/functions/fnc_bodyCleanupLoop.sqf +++ b/addons/medical_treatment/functions/fnc_bodyCleanupLoop.sqf @@ -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 diff --git a/addons/medical_treatment/functions/fnc_canDigGrave.sqf b/addons/medical_treatment/functions/fnc_canDigGrave.sqf index 85c76382ec..444fb5ff3c 100644 --- a/addons/medical_treatment/functions/fnc_canDigGrave.sqf +++ b/addons/medical_treatment/functions/fnc_canDigGrave.sqf @@ -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)} diff --git a/addons/medical_treatment/functions/fnc_placeBodyBagInGrave.sqf b/addons/medical_treatment/functions/fnc_placeBodyBagInGrave.sqf new file mode 100644 index 0000000000..82cd2bc080 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_placeBodyBagInGrave.sqf @@ -0,0 +1,39 @@ +#include "..\script_component.hpp" +/* + * Author: drofseh + * Places a body bag inside a grave. + * + * Arguments: + * 0: Medic + * 1: Patient + * + * 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); diff --git a/addons/medical_treatment/functions/fnc_placeInBodyBagOrGrave.sqf b/addons/medical_treatment/functions/fnc_placeInBodyBagOrGrave.sqf index 33a577da81..f1900108c6 100644 --- a/addons/medical_treatment/functions/fnc_placeInBodyBagOrGrave.sqf +++ b/addons/medical_treatment/functions/fnc_placeInBodyBagOrGrave.sqf @@ -10,6 +10,7 @@ * 1: Resting Place Classname * 2: Offset (default: [0,0,0]) * 3: Rotation (default: 0) + * 4: Is Grave (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; +}; diff --git a/addons/medical_treatment/functions/fnc_placeInGrave.sqf b/addons/medical_treatment/functions/fnc_placeInGrave.sqf index f9ebf582f3..6bea5c6db9 100644 --- a/addons/medical_treatment/functions/fnc_placeInGrave.sqf +++ b/addons/medical_treatment/functions/fnc_placeInGrave.sqf @@ -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) diff --git a/addons/medical_treatment/functions/fnc_removeBody.sqf b/addons/medical_treatment/functions/fnc_removeBody.sqf index 5380b7e8f1..7be154e89c 100644 --- a/addons/medical_treatment/functions/fnc_removeBody.sqf +++ b/addons/medical_treatment/functions/fnc_removeBody.sqf @@ -5,7 +5,7 @@ * However, player bodies cannot be deleted until they respawn, so it is hidden and deleted later. * * Arguments: - * 0: Body + * 0: Body or Bodybag * * Return Value: * None diff --git a/addons/medical_treatment/functions/fnc_scanMedicalItems.sqf b/addons/medical_treatment/functions/fnc_scanMedicalItems.sqf index 0501dc5eb5..ef8229afbe 100644 --- a/addons/medical_treatment/functions/fnc_scanMedicalItems.sqf +++ b/addons/medical_treatment/functions/fnc_scanMedicalItems.sqf @@ -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 [])] diff --git a/addons/medical_treatment/initSettings.sqf b/addons/medical_treatment/initSettings.sqf index 18e28608a8..0193a44546 100644 --- a/addons/medical_treatment/initSettings.sqf +++ b/addons/medical_treatment/initSettings.sqf @@ -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; diff --git a/addons/medical_treatment/script_component.hpp b/addons/medical_treatment/script_component.hpp index 36173d4ac1..6a334ed72a 100644 --- a/addons/medical_treatment/script_component.hpp +++ b/addons/medical_treatment/script_component.hpp @@ -55,4 +55,4 @@ // Animations that would be played faster than this are instead skipped. (= Progress bar too quick for animation). #define ANIMATION_SPEED_MAX_COEFFICIENT 2.5 -#define MEDICAL_TREATMENT_ITEMS (call (uiNamespace getVariable [QGVAR(treatmentItems), {[]}])) +#define MEDICAL_TREATMENT_ITEMS (keys (uiNamespace getVariable QGVAR(treatmentItems))) diff --git a/addons/medical_treatment/stringtable.xml b/addons/medical_treatment/stringtable.xml index 8f91fefc7c..0c0a20e2f8 100644 --- a/addons/medical_treatment/stringtable.xml +++ b/addons/medical_treatment/stringtable.xml @@ -414,9 +414,11 @@ Grave Digging Time + 무덤 파는 시간 Time, in seconds, required to dig a grave for a body. + 시신의 무덤을 파는 데 필요한 시간(초 단위). Allow Epinephrine @@ -726,6 +728,8 @@ Legt fest, ob etwas nach der Anwendung verwendet werden soll. Qué debe ser consumido despues de su uso. 縫合キットの使用後に消費するかどうかを決定します。 + Co powinno zostać zużyte po zastosowaniu. + 봉합키트를 1회성 소모품으로 설정할 지 여부를 결정합니다. Self Stitching @@ -831,14 +835,36 @@ 能够将昏迷的伤员装入尸袋中。 기절상태의 인원을 시체운반용부대에 옮겨 담을 수 있는지를 정합니다. - + Allow Grave Digging + Zezwalaj na kopanie grobów + 무덤 파기 허용 + Erlaube Graben von Gräbern + Permitir cavar tumbas - + Enables digging graves to dispose of corpses. + Umożliwia kopanie grobów w celu pozbycia się zwłok. + 시체를 처리하기 위해 무덤을 파는 것을 허용합니다. + Erlaubt das Graben von Gräbern um Leichen zu entsorgen. + Habilita cavar tumbas para deshacerse de los cadáveres. - + Only if dead + Tylko kiedy martwy + 죽었을 때에만 + Nur wenn tot + Solo si está muerto + + + Create Grave Markers + Erstelle Grabmal + Crear Tumba + + + Enables the creation of grave markers when digging graves. + Erstellt Grabmale beim Graben von Gräbern. + Habilita la creación de Tumbas al cavar tumbas. Allow IV Transfusion @@ -2342,18 +2368,24 @@ Naht Sutura 縫合糸 + Szew + 봉합술 Surgical Suture for stitching injuries. Chirurgisches Nahtmaterial zum Nähen von Wunden. Sutura quirúrjica para heridas de puntos. 傷害縫合用の外科縫合糸。 + Szew chirurgiczny do zszywania ran. + 상처를 꿰메는 수술용 봉합술. Surgical Suture for stitching injuries. Chirurgisches Nahtmaterial zum Nähen von Wunden. Sutura quirúrjica para heridas de puntos. 傷害縫合用の外科縫合糸。 + Szew chirurgiczny do zszywania ran. + 상처를 꿰메는 수술용 봉합술. Bodybag @@ -3385,6 +3417,9 @@ 呼吸極弱 Neredeyse nefes almıyor + + No pain + In mild pain Hat leichte Schmerzen @@ -3464,6 +3499,9 @@ 正在接受静脉注射 [%1毫升] 接收靜脈注射液中 [%1毫升] + + No IV + Blood Pressure Tension artérielle @@ -4462,9 +4500,11 @@ Dig grave for body + 시체를 위해 무덤 파기 Digging grave for body... + 시체를 위한 무덤 파는 중... %1 has bandaged patient @@ -4709,26 +4749,32 @@ Check name on headstone + Sprawdź imię na grobie + 묘비 이름 확인 Bandage Rollover Bandażowanie Wielu Ran Verbandüberschlag + 붕대 모두 감기 If enabled, bandages can close different types of wounds on the same body part.\nBandaging multiple injuries will scale bandaging time accordingly. Jeśli opcja jest włączona, bandaże mogą zamykać różne rodzaje ran na tej samej części ciała. \nOpatrywanie wielu ran będzie adekwatnie skalować czas bandażowania. Wenn diese Option aktiviert ist, können Verbände verschiedene Arten von Wunden am selben Körperteil schließen.\nBeim Verbinden mehrerer Verletzungen wird die Verbandszeit entsprechend skaliert. + 활성회된 경우 붕대로 동일한 신체 부위에 있는 다른 유형에 상처를 막을 수 있습니다.\n여러 부상을 붕대로 감으면 붕대 감는 시간이 그만큼 늘어납니다. Bandage Effectiveness Coefficient Współczynnik Efektywności Bandażowania Verbandswirksamkeitskoeffizient + 붕대 효과 계수 Determines how effective bandages are at closing wounds. Określa skuteczność bandaży w zamykaniu ran. Bestimmt, wie wirksam Bandagen beim Verschließen von Wunden sind. + 붕대가 상처를 치료하는 데 얼마나 효과적으로 지속되는지 결정합니다. diff --git a/addons/nightvision/stringtable.xml b/addons/nightvision/stringtable.xml index c7d9e6e913..b1d9ebf54a 100644 --- a/addons/nightvision/stringtable.xml +++ b/addons/nightvision/stringtable.xml @@ -36,7 +36,7 @@ Gogle noktowizyjne (Gen 1, Czarne) NS-Brille (1. Gen., schwarz) 夜视仪(一代,黑色) - 아투경 (1세대, 검정색) + 아투경 (1세대, 검정) Gafas de visión nocturna (Gen1, Negro) @@ -69,7 +69,7 @@ Gogle noktowizyjne (Gen 2, Czarne) NS-Brille (2. Gen., schwarz) 夜视仪(二代,黑色) - 아투경 (2세대, 검정색) + 아투경 (2세대, 검정) Gafas de visión nocturna (Gen2, Negro) @@ -122,12 +122,14 @@ 暗視装置 (第3世代、ブラウン) Gogle noktowizyjne (Gen3, Brązowe, WP) NS-Brille (3. Generation, Braun, WP) + 야투경 (3세대, 갈색, 백색광) Night Vision Goggles, White Phosphor 暗視装置、白色蛍光体 Gogle noktowizyjne, Biały Fosfor Nachtsichtbrille, weißer Phosphor + 백색광 야투경 NV Goggles (Gen3, Green) @@ -151,6 +153,7 @@ 暗視装置 (第3世代、グリーン、白色蛍光) Gogle noktowizyjne (Gen3, Zielone, WP) NS-Brille (3. Generation, Grün, WP) + 야투경 (3세대, 녹색, 백색광) NV Goggles (Gen3, Black) @@ -174,6 +177,7 @@ 暗視装置 (第3世代、ブラック、白色蛍光) Gogle noktowizyjne (Gen3, Czarne, WP) NS-Brille (3. Generation, Schwarz, WP) + 야투경 (3세대, 검정, 백색광) NV Goggles (Gen4, Brown) @@ -191,6 +195,7 @@ 暗視装置 (第4世代、ブラウン、白色蛍光) Gogle noktowizyjne (Gen 4, Brązowe, WP) NS-Brille (4. Generation, Braun, WP) + 야투경 (4세대, 갈색, 백색광) NV Goggles (Gen4, Black) @@ -208,6 +213,7 @@ 暗視装置 (第3世代、ブラック、白色蛍光) Gogle noktowizyjne (Gen 4, Czarne, WP) NS-Brille (4. Generation, Schwarz, WP) + 야투경 (4세대, 검정, 백색광) NV Goggles (Gen4, Green) @@ -225,6 +231,7 @@ 暗視装置 (第3世代、グリーン、白色蛍光) Gogle noktowizyjne (Gen 4, Zielone, WP) NS-Brille (4. Generation, Grün, WP) + 야투경 (4세대, 녹색, 백색광) NV Goggles (Wide, Brown) @@ -242,6 +249,7 @@ 暗視装置 (ワイド、ブラウン、白色蛍光) Gogle noktowizyjne (Szerokie, Brązowe, WP) NS-Brille (Weit, Braun, WP) + 야투경 (넓음, 갈색, 백색광) NV Goggles (Wide, Black) @@ -259,6 +267,7 @@ 暗視装置 (ワイド、ブラック、白色蛍光) Gogle noktowizyjne (Szerokie, Czarne, WP) NS-Brille (Weit, Schwarz, WP) + 야투경 (넓음, 검정, 백색광) NV Goggles (Wide, Green) @@ -276,6 +285,7 @@ 暗視装置 (ワイド、グリーン、白色蛍光) Gogle noktowizyjne (Szerokie, Zielone, WP) NS-Brille (Weit, Grün, WP) + 야투경 (넓음, 녹색, 백색광) Brightness: %1 @@ -531,12 +541,14 @@ 暗視装置の世代 Generacja gogli noktowizyjnych Nachtsicht-Generation + 야투경 세대 Gen %1 第%1世代 Gen %1 Gen %1 + %1세대 diff --git a/addons/pylons/stringtable.xml b/addons/pylons/stringtable.xml index efdb7ab271..b17bdec970 100644 --- a/addons/pylons/stringtable.xml +++ b/addons/pylons/stringtable.xml @@ -55,7 +55,7 @@ ACE 파일런 ACE Außenlaststationen ACE Pylônes - Pylony ACE + ACE Pylony ACE Пилоны ACE Pylons ACE Pylony diff --git a/addons/realisticnames/CfgWeapons.hpp b/addons/realisticnames/CfgWeapons.hpp index efa6a1662f..2c57bdd7a8 100644 --- a/addons/realisticnames/CfgWeapons.hpp +++ b/addons/realisticnames/CfgWeapons.hpp @@ -148,7 +148,7 @@ class CfgWeapons { class SMG_03C_TR_hex: SMG_03C_TR_black { displayName = CSTRING(P90_TR_Hex_Name); }; - class SMG_03C_black: SMG_03C_Base { + class SMG_03C_black: SMG_03C_BASE { displayName = CSTRING(P90_Black_Name); }; class SMG_03C_khaki: SMG_03C_black { @@ -709,7 +709,7 @@ class CfgWeapons { //attachments - class Itemcore; + class ItemCore; class acc_flashlight: ItemCore { displayName = "UTG Defender 126"; diff --git a/addons/reload/ACE_Arsenal_Stats.hpp b/addons/reload/ACE_Arsenal_Stats.hpp new file mode 100644 index 0000000000..44de05e949 --- /dev/null +++ b/addons/reload/ACE_Arsenal_Stats.hpp @@ -0,0 +1,13 @@ +class EGVAR(arsenal,stats) { + class statBase; + class ACE_isBelt: statBase { + scope = 2; + priority = -1; + stats[] = {"ACE_isBelt"}; + displayName = CSTRING(LinkBelt); + showText = 1; + textStatement = QUOTE(localize QUOTE(ELSTRING(Common,Enabled))); + condition = QUOTE(params[ARR_2('_stat', '_config')]; (getNumber (_config >> _stat select 0)) == 1); + tabs[] = {{}, {4}}; + }; +}; diff --git a/addons/reload/config.cpp b/addons/reload/config.cpp index 21e28d35f5..1cd11c5b17 100644 --- a/addons/reload/config.cpp +++ b/addons/reload/config.cpp @@ -14,6 +14,7 @@ class CfgPatches { }; }; +#include "ACE_Arsenal_Stats.hpp" #include "CfgVehicles.hpp" #include "CfgMagazines.hpp" #include "CfgEventHandlers.hpp" diff --git a/addons/reload/stringtable.xml b/addons/reload/stringtable.xml index 7747f5c3a2..9aa239a2f9 100644 --- a/addons/reload/stringtable.xml +++ b/addons/reload/stringtable.xml @@ -109,7 +109,7 @@ Attacca la tracolla Ligar cintos de munição ベルトを繋げる - 벨트 연결 + 탄띠 연결 连接弹链 連接彈鏈 @@ -125,7 +125,7 @@ Attaccando la tracolla... Ligando cintos... ベルトを繋げています・・・ - 벨트 연결 중... + 탄띠 연결 중... 正在连接弹链... 連接彈鏈中... @@ -135,6 +135,7 @@ Gurt wurde angehängt ベルトがリンクされた Taśma została połączona + 탄띠가 연결되었습니다 Belt could not be linked @@ -142,6 +143,7 @@ Gurt konnte nicht angehängt werden ベルトはリンクされなかった Taśma nie mogła być połączona + 탄띠를 연결할 수 없습니다 diff --git a/addons/reloadlaunchers/ACE_Arsenal_Stats.hpp b/addons/reloadlaunchers/ACE_Arsenal_Stats.hpp new file mode 100644 index 0000000000..b894042d68 --- /dev/null +++ b/addons/reloadlaunchers/ACE_Arsenal_Stats.hpp @@ -0,0 +1,13 @@ +class EGVAR(arsenal,stats) { + class statBase; + class ADDON: statBase { + scope = 2; + priority = -1; + stats[] = {QGVAR(enabled)}; + displayName = CSTRING(featureDescription); + showText = 1; + textStatement = QUOTE(localize QUOTE(ELSTRING(Common,Enabled))); + condition = QUOTE(params[ARR_2('_stat', '_config')]; (getNumber (_config >> _stat select 0)) == 1); + tabs[] = {{2}, {}}; + }; +}; diff --git a/addons/reloadlaunchers/config.cpp b/addons/reloadlaunchers/config.cpp index bf9a5fa928..30407c4d7b 100644 --- a/addons/reloadlaunchers/config.cpp +++ b/addons/reloadlaunchers/config.cpp @@ -14,6 +14,7 @@ class CfgPatches { }; }; +#include "ACE_Arsenal_Stats.hpp" #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" diff --git a/addons/reloadlaunchers/stringtable.xml b/addons/reloadlaunchers/stringtable.xml index a74f33fdb0..4c6430f323 100644 --- a/addons/reloadlaunchers/stringtable.xml +++ b/addons/reloadlaunchers/stringtable.xml @@ -6,12 +6,14 @@ バディ装填時の通知表示 Wyświetlanie powiadomień o ładowaniu przez asystenta Buddy Nachlade Nachricht anzeigen + 동료의 장전에 대한 알림 표시 Displays notifications when an assistant loads a gunner's launcher. 助手が射手のランチャーを装填した際に通知を表示します。 Wyświetla powiadomienie, gdy asystent ładuje wyrzutnię. Zeigt Benachrichtigungen an, wenn ein Assistent den Werfer eines Richtschützen lädt. + 부사수가 사수의 발사기를 장전할 때 알림을 표시합니다. Load launcher @@ -36,6 +38,7 @@ %1 charge ton lanceur %1 がランチャーを装填しています %1 ładuje twoją wyrzutnię + %1이(가) 당신의 발사기를 장전했습니다. %1 stopped loading your launcher @@ -43,6 +46,7 @@ %1 a arrêté de charger ton lanceur %1 がランチャーの装填を中断しました %1 przestał ładować twoją wyrzutnię + %1이(가) 당신의 발사기 장전을 멈췄습니다. Loading launcher... @@ -101,6 +105,10 @@ Lanceur n'a pas pu être chargé ランチャーを装填できませんでした Wyrzutnia nie mogła być załadowana + 발사기를 장전할 수 없습니다. + + + Buddy Loading diff --git a/addons/repair/stringtable.xml b/addons/repair/stringtable.xml index ff9139d73f..015719bce0 100644 --- a/addons/repair/stringtable.xml +++ b/addons/repair/stringtable.xml @@ -41,6 +41,7 @@ Rueda タイヤ Koło + 바퀴 Change Wheel @@ -273,12 +274,14 @@ 完全修理時間係数 Współczynnik Czasu Pełnej Naprawy Vollständiger Reparaturzeitkoeffizient + 전체 수리 시간 계수 Modifies how long it takes to perform a Full Repair.\nThe repair time is based on the amount of repairs needed for each part, including those normally inaccessible. 完全修復にかかる時間を変更します。\n修理時間は、通常アクセスできない部品も含め、各部品に必要な修理量に基づいて決定されます。 Modyfikuje czas potrzebny do wykonania Pełnej Naprawy. Czas naprawy jest oparty na ilości napraw potrzebnych dla każdej części, w tym tych normalnie niedostępnych. Ändert, wie lange es dauert, eine vollständige Reparatur durchzuführen.\nDie Reparaturzeit basiert auf der Menge der erforderlichen Reparaturen für jedes Teil, einschließlich derjenigen, die normalerweise nicht zugänglich sind. + 전체적인 수리를 수행하는 데 걸리는 시간을 수정합니다.\n수리 시간은 일반적으로 접근할 수 없는 부품을 포함하여 각 부품에 필요한 수리 시간을 기준으로 합니다. Boost engineer training when in repair vehicles or facilities. Untrained becomes engineer, engineer becomes advanced engineer. @@ -1230,6 +1233,7 @@ Wymiana kół Разрешить замену колес タイヤ交換の許可 + 바퀴 교체 허용 Who can remove and replace wheels? @@ -1251,12 +1255,14 @@ Erlaube Radflicken タイヤ補修を許可 Zezwól na Łatanie Kół + 바퀴 수리 허용 Who can patch wheels? Wer kann Radflicken durchführen? 誰がタイヤの補修を出来るようにしますか? Kto może łatać koła? + 누가 바퀴를 수리할 수 있습니까? Allow Repair @@ -1913,12 +1919,14 @@ Bedingungen für die Radflicken タイヤ補修の要求 Wymagania do Łatania Koła + 바퀴 수리 아이템 필요 Items required to patch a wheel. Gegenstänge, die zum Reifenflicken benötigt werden. タイヤ補修にアイテムを必要としますか? Przedmioty wymagane do załatania koła + 바퀴를 수리하기 위해 아이템이 필요합니다. Misc Repair Requirements @@ -2090,84 +2098,98 @@ 部分修理時間 Czas Naprawy Części Teilreparaturzeit + 부품 수리 시간 Time in seconds to complete a repair. 修理完了までの時間 Czas w sekundach do przeprowadzenia naprawy Zeit in Sekunden, um eine Reparatur abzuschließen. + 수리를 완료하는 시간(초 단위) Wheel Change Time タイヤ交換時間 Czas Zmiany Koła Radwechselzeit + 바퀴 교체 시간 Time in seconds to remove or change a wheel. タイヤの取り外しまたは交換にかかる時間。 Czas w sekundach do zdjęcia lub zmienienia koła. Zeit in Sekunden, um ein Rad zu entfernen oder zu wechseln. + 바퀴를 제거하거나 교체하는 데 걸리는 시간(초 단위) Patch Wheel Rad flicken タイヤを補修する Załataj Koło + 바퀴 수리 Patching Wheel... Rad flicken... タイヤを補修しています・・・ Łatanie Koła... + 바퀴 수리 중... Wheel Patch Time タイヤ補修時間 Czas Łatania Koła Zeit um Räder zu flicken + 바퀴 수리 시간 Time it takes to patch a wheel by 5%. タイヤを5%補修するのにかかる時間。 Czas potrzebny na załatanie koła o 5%. Zeit, die benötigt wird, um ein Rad um 5 % zu flicken. + 바퀴를 5% 수리하는 데 걸리는 시간(초 단위) Patch Wheel Threshold タイヤ補修しきい値 Próg Łatania Koła Rad flicken Schwellenwert + 바퀴 수리 한계점 Maximum level to which a wheel can be patched. タイヤを補修できる最大の度合い。 Maksymalny poziom, do którego koło może zostać załatane. Maximales Level, bis zu dem ein Rad geflickt werden kann. + 바퀴를 수리할 수 있는 최대 레벨입니다. Wheel Patch Location タイヤ補修場所 Miejsce Łatania Koła Räder Flick Ort + 바퀴 수리 장소 Where the wheel can be patched. タイヤを補修できる場所。 Gdzie można załatać koło. Wo das Rad geflickt werden kann. + 바퀴를 수리할 수 있는 곳입니다. On the ground Auf dem Boden 地上 Na ziemi + 지면 위 On a vehicle An einem Fahrzeug 車両上 Na pojeździe + 차량 diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml index 5b92878c98..54444c3b16 100644 --- a/addons/spectator/stringtable.xml +++ b/addons/spectator/stringtable.xml @@ -25,7 +25,7 @@ ACE Spectateur ACE 旁观者 ACE 旁觀者 - Obserwator ACE + ACE Obserwator ACE 관전자 ACE Зритель ACE Espectador diff --git a/addons/tagging/ACE_Tags.hpp b/addons/tagging/ACE_Tags.hpp index ce4df78f51..806dfdf5dd 100644 --- a/addons/tagging/ACE_Tags.hpp +++ b/addons/tagging/ACE_Tags.hpp @@ -8,29 +8,41 @@ class ACE_Tags { class ACE_XBlack { - displayName = CSTRING(XBlack); + displayName = CSTRING(x); requiredItem = "ACE_SpraypaintBlack"; textures[] = {QPATHTOF(UI\tags\black\0.paa), QPATHTOF(UI\tags\black\1.paa), QPATHTOF(UI\tags\black\2.paa)}; icon = QPATHTOF(UI\tags\black\0.paa); }; class ACE_XRed { - displayName = CSTRING(XRed); + displayName = CSTRING(x); requiredItem = "ACE_SpraypaintRed"; textures[] = {QPATHTOF(UI\tags\red\0.paa), QPATHTOF(UI\tags\red\1.paa), QPATHTOF(UI\tags\red\2.paa)}; icon = QPATHTOF(UI\tags\red\0.paa); }; class ACE_XGreen { - displayName = CSTRING(XGreen); + displayName = CSTRING(x); requiredItem = "ACE_SpraypaintGreen"; textures[] = {QPATHTOF(UI\tags\green\0.paa), QPATHTOF(UI\tags\green\1.paa), QPATHTOF(UI\tags\green\2.paa)}; icon = QPATHTOF(UI\tags\green\0.paa); }; class ACE_XBlue { - displayName = CSTRING(XBlue); + displayName = CSTRING(x); requiredItem = "ACE_SpraypaintBlue"; textures[] = {QPATHTOF(UI\tags\blue\0.paa), QPATHTOF(UI\tags\blue\1.paa), QPATHTOF(UI\tags\blue\2.paa)}; icon = QPATHTOF(UI\tags\blue\0.paa); }; + class ACE_XYellow { + displayName = CSTRING(x); + requiredItem = "ACE_SpraypaintYellow"; + textures[] = {QPATHTOF(UI\tags\yellow\0.paa), QPATHTOF(UI\tags\yellow\1.paa), QPATHTOF(UI\tags\yellow\2.paa)}; + icon = QPATHTOF(UI\tags\yellow\0.paa); + }; + class ACE_XWhite { + displayName = CSTRING(x); + requiredItem = "ACE_SpraypaintWhite"; + textures[] = {QPATHTOF(UI\tags\white\0.paa), QPATHTOF(UI\tags\white\1.paa), QPATHTOF(UI\tags\white\2.paa)}; + icon = QPATHTOF(UI\tags\white\0.paa); + }; TAG(arrow_up,Black); TAG(arrow_down,Black); @@ -40,6 +52,7 @@ class ACE_Tags { TAG(cross,Black); TAG(diamond,Black); TAG(square,Black); + TAG(square_filled,Black); TAG(triangle,Black); TAG(triangle_inverted,Black); @@ -51,6 +64,7 @@ class ACE_Tags { TAG(cross,Blue); TAG(diamond,Blue); TAG(square,Blue); + TAG(square_filled,Blue); TAG(triangle,Blue); TAG(triangle_inverted,Blue); @@ -62,6 +76,7 @@ class ACE_Tags { TAG(cross,Green); TAG(diamond,Green); TAG(square,Green); + TAG(square_filled,Green); TAG(triangle,Green); TAG(triangle_inverted,Green); @@ -73,6 +88,31 @@ class ACE_Tags { TAG(cross,Red); TAG(diamond,Red); TAG(square,Red); + TAG(square_filled,Red); TAG(triangle,Red); TAG(triangle_inverted,Red); + + TAG(arrow_up,Yellow); + TAG(arrow_down,Yellow); + TAG(arrow_left,Yellow); + TAG(arrow_right,Yellow); + TAG(circle,Yellow); + TAG(cross,Yellow); + TAG(diamond,Yellow); + TAG(square,Yellow); + TAG(square_filled,Yellow); + TAG(triangle,Yellow); + TAG(triangle_inverted,Yellow); + + TAG(arrow_up,White); + TAG(arrow_down,White); + TAG(arrow_left,White); + TAG(arrow_right,White); + TAG(circle,White); + TAG(cross,White); + TAG(diamond,White); + TAG(square,White); + TAG(square_filled,White); + TAG(triangle,White); + TAG(triangle_inverted,White); }; diff --git a/addons/tagging/CfgVehicles.hpp b/addons/tagging/CfgVehicles.hpp index 8eef5c004c..9263573425 100644 --- a/addons/tagging/CfgVehicles.hpp +++ b/addons/tagging/CfgVehicles.hpp @@ -94,6 +94,18 @@ class CfgVehicles { MACRO_ADDITEM(ACE_SpraypaintBlue,1); }; }; + class ACE_Item_SpraypaintYellow: ACE_Item_SpraypaintBlack { + displayName = CSTRING(SpraypaintYellow); + class TransportItems { + MACRO_ADDITEM(ACE_SpraypaintYellow,1); + }; + }; + class ACE_Item_SpraypaintWhite: ACE_Item_SpraypaintBlack { + displayName = CSTRING(SpraypaintWhite); + class TransportItems { + MACRO_ADDITEM(ACE_SpraypaintWhite,1); + }; + }; class Box_NATO_Support_F; class ACE_Box_Misc: Box_NATO_Support_F { @@ -102,6 +114,8 @@ class CfgVehicles { MACRO_ADDITEM(ACE_SpraypaintRed,5); MACRO_ADDITEM(ACE_SpraypaintBlue,5); MACRO_ADDITEM(ACE_SpraypaintGreen,5); + MACRO_ADDITEM(ACE_SpraypaintYellow,5); + MACRO_ADDITEM(ACE_SpraypaintWhite,5); }; }; }; diff --git a/addons/tagging/CfgWeapons.hpp b/addons/tagging/CfgWeapons.hpp index 05200dd3ef..906b990f81 100644 --- a/addons/tagging/CfgWeapons.hpp +++ b/addons/tagging/CfgWeapons.hpp @@ -34,4 +34,16 @@ class CfgWeapons { hiddenSelectionsTextures[] = {QPATHTOF(data\spraycanBlue_co.paa)}; GVAR(textColor) = "0000FFFE"; }; + class ACE_SpraypaintYellow: ACE_SpraypaintBlack { + displayname = CSTRING(spraypaintYellow); + picture = QPATHTOF(UI\items\itemSpraypaintYellow.paa); + hiddenSelectionsTextures[] = {QPATHTOF(data\spraycanYellow_co.paa)}; + GVAR(textColor) = "FFFF00FE"; + }; + class ACE_SpraypaintWhite: ACE_SpraypaintBlack { + displayname = CSTRING(spraypaintWhite); + picture = QPATHTOF(UI\items\itemSpraypaintWhite.paa); + hiddenSelectionsTextures[] = {QPATHTOF(data\spraycanWhite_co.paa)}; + GVAR(textColor) = "FFFFFFFE"; + }; }; diff --git a/addons/tagging/UI/icons/iconTaggingWhite.paa b/addons/tagging/UI/icons/iconTaggingWhite.paa new file mode 100644 index 0000000000..8d97ddca06 Binary files /dev/null and b/addons/tagging/UI/icons/iconTaggingWhite.paa differ diff --git a/addons/tagging/UI/icons/iconTaggingYellow.paa b/addons/tagging/UI/icons/iconTaggingYellow.paa new file mode 100644 index 0000000000..46a0624da8 Binary files /dev/null and b/addons/tagging/UI/icons/iconTaggingYellow.paa differ diff --git a/addons/tagging/UI/items/itemSpraypaintWhite.paa b/addons/tagging/UI/items/itemSpraypaintWhite.paa new file mode 100644 index 0000000000..0e7e16af78 Binary files /dev/null and b/addons/tagging/UI/items/itemSpraypaintWhite.paa differ diff --git a/addons/tagging/UI/items/itemSpraypaintYellow.paa b/addons/tagging/UI/items/itemSpraypaintYellow.paa new file mode 100644 index 0000000000..59d9fb2ba2 Binary files /dev/null and b/addons/tagging/UI/items/itemSpraypaintYellow.paa differ diff --git a/addons/tagging/UI/tags/black/square_filled.paa b/addons/tagging/UI/tags/black/square_filled.paa new file mode 100644 index 0000000000..a4d2c37bab Binary files /dev/null and b/addons/tagging/UI/tags/black/square_filled.paa differ diff --git a/addons/tagging/UI/tags/blue/square_filled.paa b/addons/tagging/UI/tags/blue/square_filled.paa new file mode 100644 index 0000000000..81af837a01 Binary files /dev/null and b/addons/tagging/UI/tags/blue/square_filled.paa differ diff --git a/addons/tagging/UI/tags/green/square_filled.paa b/addons/tagging/UI/tags/green/square_filled.paa new file mode 100644 index 0000000000..d08edea5d5 Binary files /dev/null and b/addons/tagging/UI/tags/green/square_filled.paa differ diff --git a/addons/tagging/UI/tags/red/square_filled.paa b/addons/tagging/UI/tags/red/square_filled.paa new file mode 100644 index 0000000000..815f6a2df9 Binary files /dev/null and b/addons/tagging/UI/tags/red/square_filled.paa differ diff --git a/addons/tagging/UI/tags/white/0.paa b/addons/tagging/UI/tags/white/0.paa new file mode 100644 index 0000000000..2a710e60f5 Binary files /dev/null and b/addons/tagging/UI/tags/white/0.paa differ diff --git a/addons/tagging/UI/tags/white/1.paa b/addons/tagging/UI/tags/white/1.paa new file mode 100644 index 0000000000..efa7d12c17 Binary files /dev/null and b/addons/tagging/UI/tags/white/1.paa differ diff --git a/addons/tagging/UI/tags/white/2.paa b/addons/tagging/UI/tags/white/2.paa new file mode 100644 index 0000000000..569cb118bc Binary files /dev/null and b/addons/tagging/UI/tags/white/2.paa differ diff --git a/addons/tagging/UI/tags/white/arrow_down.paa b/addons/tagging/UI/tags/white/arrow_down.paa new file mode 100644 index 0000000000..1b9f47390e Binary files /dev/null and b/addons/tagging/UI/tags/white/arrow_down.paa differ diff --git a/addons/tagging/UI/tags/white/arrow_left.paa b/addons/tagging/UI/tags/white/arrow_left.paa new file mode 100644 index 0000000000..7934c9caa1 Binary files /dev/null and b/addons/tagging/UI/tags/white/arrow_left.paa differ diff --git a/addons/tagging/UI/tags/white/arrow_right.paa b/addons/tagging/UI/tags/white/arrow_right.paa new file mode 100644 index 0000000000..9873324716 Binary files /dev/null and b/addons/tagging/UI/tags/white/arrow_right.paa differ diff --git a/addons/tagging/UI/tags/white/arrow_up.paa b/addons/tagging/UI/tags/white/arrow_up.paa new file mode 100644 index 0000000000..f388f29c30 Binary files /dev/null and b/addons/tagging/UI/tags/white/arrow_up.paa differ diff --git a/addons/tagging/UI/tags/white/circle.paa b/addons/tagging/UI/tags/white/circle.paa new file mode 100644 index 0000000000..769b96e15a Binary files /dev/null and b/addons/tagging/UI/tags/white/circle.paa differ diff --git a/addons/tagging/UI/tags/white/cross.paa b/addons/tagging/UI/tags/white/cross.paa new file mode 100644 index 0000000000..bbc2e44240 Binary files /dev/null and b/addons/tagging/UI/tags/white/cross.paa differ diff --git a/addons/tagging/UI/tags/white/diamond.paa b/addons/tagging/UI/tags/white/diamond.paa new file mode 100644 index 0000000000..3b2b17b424 Binary files /dev/null and b/addons/tagging/UI/tags/white/diamond.paa differ diff --git a/addons/tagging/UI/tags/white/square.paa b/addons/tagging/UI/tags/white/square.paa new file mode 100644 index 0000000000..680603d6d3 Binary files /dev/null and b/addons/tagging/UI/tags/white/square.paa differ diff --git a/addons/tagging/UI/tags/white/square_filled.paa b/addons/tagging/UI/tags/white/square_filled.paa new file mode 100644 index 0000000000..ffbe7eee81 Binary files /dev/null and b/addons/tagging/UI/tags/white/square_filled.paa differ diff --git a/addons/tagging/UI/tags/white/triangle.paa b/addons/tagging/UI/tags/white/triangle.paa new file mode 100644 index 0000000000..5d4bb9c6a9 Binary files /dev/null and b/addons/tagging/UI/tags/white/triangle.paa differ diff --git a/addons/tagging/UI/tags/white/triangle_inverted.paa b/addons/tagging/UI/tags/white/triangle_inverted.paa new file mode 100644 index 0000000000..ed543ec29b Binary files /dev/null and b/addons/tagging/UI/tags/white/triangle_inverted.paa differ diff --git a/addons/tagging/UI/tags/yellow/0.paa b/addons/tagging/UI/tags/yellow/0.paa new file mode 100644 index 0000000000..6b441ab22d Binary files /dev/null and b/addons/tagging/UI/tags/yellow/0.paa differ diff --git a/addons/tagging/UI/tags/yellow/1.paa b/addons/tagging/UI/tags/yellow/1.paa new file mode 100644 index 0000000000..5e4d2da5ef Binary files /dev/null and b/addons/tagging/UI/tags/yellow/1.paa differ diff --git a/addons/tagging/UI/tags/yellow/2.paa b/addons/tagging/UI/tags/yellow/2.paa new file mode 100644 index 0000000000..0e03b827f0 Binary files /dev/null and b/addons/tagging/UI/tags/yellow/2.paa differ diff --git a/addons/tagging/UI/tags/yellow/arrow_down.paa b/addons/tagging/UI/tags/yellow/arrow_down.paa new file mode 100644 index 0000000000..d547bba0f2 Binary files /dev/null and b/addons/tagging/UI/tags/yellow/arrow_down.paa differ diff --git a/addons/tagging/UI/tags/yellow/arrow_left.paa b/addons/tagging/UI/tags/yellow/arrow_left.paa new file mode 100644 index 0000000000..4a3e05bd2b Binary files /dev/null and b/addons/tagging/UI/tags/yellow/arrow_left.paa differ diff --git a/addons/tagging/UI/tags/yellow/arrow_right.paa b/addons/tagging/UI/tags/yellow/arrow_right.paa new file mode 100644 index 0000000000..aad867960b Binary files /dev/null and b/addons/tagging/UI/tags/yellow/arrow_right.paa differ diff --git a/addons/tagging/UI/tags/yellow/arrow_up.paa b/addons/tagging/UI/tags/yellow/arrow_up.paa new file mode 100644 index 0000000000..df2b2c505d Binary files /dev/null and b/addons/tagging/UI/tags/yellow/arrow_up.paa differ diff --git a/addons/tagging/UI/tags/yellow/circle.paa b/addons/tagging/UI/tags/yellow/circle.paa new file mode 100644 index 0000000000..d7d67b4b15 Binary files /dev/null and b/addons/tagging/UI/tags/yellow/circle.paa differ diff --git a/addons/tagging/UI/tags/yellow/cross.paa b/addons/tagging/UI/tags/yellow/cross.paa new file mode 100644 index 0000000000..1cfcfef9b4 Binary files /dev/null and b/addons/tagging/UI/tags/yellow/cross.paa differ diff --git a/addons/tagging/UI/tags/yellow/diamond.paa b/addons/tagging/UI/tags/yellow/diamond.paa new file mode 100644 index 0000000000..d2448d5f62 Binary files /dev/null and b/addons/tagging/UI/tags/yellow/diamond.paa differ diff --git a/addons/tagging/UI/tags/yellow/square.paa b/addons/tagging/UI/tags/yellow/square.paa new file mode 100644 index 0000000000..fea44ea538 Binary files /dev/null and b/addons/tagging/UI/tags/yellow/square.paa differ diff --git a/addons/tagging/UI/tags/yellow/square_filled.paa b/addons/tagging/UI/tags/yellow/square_filled.paa new file mode 100644 index 0000000000..f16e270fa4 Binary files /dev/null and b/addons/tagging/UI/tags/yellow/square_filled.paa differ diff --git a/addons/tagging/UI/tags/yellow/triangle.paa b/addons/tagging/UI/tags/yellow/triangle.paa new file mode 100644 index 0000000000..0fc6917962 Binary files /dev/null and b/addons/tagging/UI/tags/yellow/triangle.paa differ diff --git a/addons/tagging/UI/tags/yellow/triangle_inverted.paa b/addons/tagging/UI/tags/yellow/triangle_inverted.paa new file mode 100644 index 0000000000..ad6a3726f4 Binary files /dev/null and b/addons/tagging/UI/tags/yellow/triangle_inverted.paa differ diff --git a/addons/tagging/data/spraycanWhite_co.paa b/addons/tagging/data/spraycanWhite_co.paa new file mode 100644 index 0000000000..85b86532a7 Binary files /dev/null and b/addons/tagging/data/spraycanWhite_co.paa differ diff --git a/addons/tagging/data/spraycanYellow_co.paa b/addons/tagging/data/spraycanYellow_co.paa new file mode 100644 index 0000000000..adff701bb8 Binary files /dev/null and b/addons/tagging/data/spraycanYellow_co.paa differ diff --git a/addons/tagging/stringtable.xml b/addons/tagging/stringtable.xml index 797e1c9918..b6090e983d 100644 --- a/addons/tagging/stringtable.xml +++ b/addons/tagging/stringtable.xml @@ -20,7 +20,7 @@ Configure how the tagging system will operate by default. Настройка работы системы спрей-маркеров по умолчанию. - 標準で開くタグ付けシステムの設定を行います。 + タグ付けシステムの標準動作を設定します。 Skonfiguruj zachowanie systemu tagowania. Konfiguriert, wie das Markieren standardmäßig funktioniert. 태그 시스템의 기본사항을 설정합니다. @@ -35,7 +35,7 @@ Spray Paint - Quick Tag Быстрый маркер - クイック タグ + スプレーペイント - クイックタグ Szybkie tagowanie Schnelle Markierung (Spraydose) 스프레이 페인트 - 빠른 태그 @@ -51,7 +51,7 @@ Action performed on main tag interaction point. Действие, выполняемое при выборе главного пункта меню маркировки. - インタラクション ポイントにむけてタグ付けをします。 + メインのインタラクションポイント(タグ)を選択した際に行われる動作。 Akcja wykonywana na głównym punkcie interakcji tagu. Aktion, die am Haupt-Interaktionspunkt ausgeführt werden soll. 상호작용 시 표시할 낙서를 고릅니다. @@ -66,7 +66,7 @@ Last Used Повторить последний - 前回と同じ + 最後に使用したタグ Ostatnio użyte Zuletzt benutzt 최근 사용 @@ -120,80 +120,32 @@ Označit Marcar Маркер - タグ + タグ (スプレーペイント) 태그 Tag 喷漆 噴漆 Işaretle - - X black - Schwarz X - X en negro - X na czarno - X noir - X nero - X černě - X em preto - Черный Х + + X + X + X + X + X + X + X + X + Х X印 - 검정 X - 黑色X标记 - 黑色X標記 - X Siyah - - - X red - Rot X - X en rojo - X na czerwono - X rouge - X rosso - X červeně - X em vermelho - Красный Х - X印 - 빨간 X - 红色X标记 - 紅色X標記 - X Red - - - X green - Grün X - X en verde - X na zielono - X vert - X verde - X zeleně - X em verde - Зелёный Х - X印 - 초록 X - 绿色X标记 - 綠色X標記 - X Yeşil - - - X blue - Blau X - X en azul - X na niebiesko - X bleu - X blu - X modře - X em azul - Синий Х - X印 - 파랑 X - 蓝色X标记 - 藍色X標記 - X Mavi + X + X标记 + X標記 + X Up Arrow - 上矢印 + 矢印 (上) Strzałka w górę 화살표(위) Стрелка вверх @@ -202,7 +154,7 @@ Down Arrow - 下矢印 + 矢印 (下) Strzałka w dół 화살표(아래) Стрелка вниз @@ -211,7 +163,7 @@ Left Arrow - 左矢印 + 矢印 (左) Strzałka w lewo 화살표(왼쪽) Стрелка влево @@ -220,7 +172,7 @@ Right Arrow - 右矢印 + 矢印 (右) Strzałka w prawo 화살표(오른쪽) Стрелка вправо @@ -263,9 +215,18 @@ Cuadrado Quadrat + + Filled Square + 四角 (塗りつぶし) + Wypełniony Kwadrat + 채워진 사각형 + Заполненный Квадрат + Cuadrado Lleno + Gefülltes Quadrat + Triangle - 三角形 + 三角 Trójkąt 삼각형 Треугольник @@ -274,7 +235,7 @@ Triangle Inverted - 三角形 (反転) + 三角 (反転) Odwrócony trójkąt 역삼각형 Обратный треугольник @@ -291,7 +252,7 @@ Černý sprej Spray de tinta preta Черный спрей - スプレー缶 (黒) + ペイントスプレー缶 (黒色) 검정 스프레이 黑色喷漆 黑色噴漆 @@ -307,7 +268,7 @@ Červený sprej Spray de tinta vermelha Красный спрей - スプレー缶 (赤) + ペイントスプレー缶 (赤色) 빨강 스프레이 红色喷漆 紅色噴漆 @@ -323,7 +284,7 @@ Zelený sprej Spray de tinta verde Зелёный спрей - スプレー缶 (緑) + ペイントスプレー缶 (緑色) 초록 스프레이 绿色喷漆 綠色噴漆 @@ -339,12 +300,44 @@ Modrý sprej Spray de tinta azul Синий спрей - スプレー缶 (青) + ペイントスプレー缶 (青色) 파랑 스프레이 蓝色喷漆 藍色噴漆 Sprey Boya (Mavi) + + Spray Paint (Yellow) + Sprühfarbe (Gelb) + Pintura amarilla + Farba w Sprayu (Żółta) + Peinture en spray (Jaune) + Bomboletta spray gialla + Žlutý sprej + Spray de tinta amarela + Желтый спрей + ペイントスプレー缶 (黄色) + 노랑 스프레이 + 黄色喷漆 + 黃色噴漆 + Sprey Boya (Sarı) + + + Spray Paint (White) + Sprühfarbe (Weiß) + Pintura blanca + Farba w Sprayu (Biała) + Peinture en spray (Blanc) + Bomboletta spray bianca + Bílý sprej + Spray de tinta branca + Белый спрей + ペイントスプレー缶 (白色) + 하양 스프레이 + 白色喷漆 + 白色噴漆 + Sprey Boya (Beyaz) + A can of spray paint for tagging walls. Eine Farbsprühdose um Wände zu markieren. @@ -355,7 +348,7 @@ Plechovka se sprejem k vytváření značek. Uma lata de tinta spray para marcar paredes. Балончик спрея для рисования маркеров на стенах. - スプレー缶は壁にタグ付できます。 + 壁にタグを描くためのペイントスプレー缶。 벽에 낙서할 수 있는 스프레이캔 입니다. 喷漆可喷涂在墙壁上 噴漆可噴塗在牆壁上 @@ -365,12 +358,14 @@ 車両IDマーキング Oznaczenie identyfikacyjne pojazdu Fahrzeug ID Markierung + 차량 ID 마킹 Replaces clan tag with stenciled text 部隊タグをステンシルテキストに置き換える Zastępuje tag klanu tekstem z szablonu Ersetzt das Clan-Tag durch Schablonentext + 클랜 태그를 스텐실 텍스트로 바꿉니다. diff --git a/addons/trenches/XEH_PREP.hpp b/addons/trenches/XEH_PREP.hpp index 05eb403fd8..340cfe482d 100644 --- a/addons/trenches/XEH_PREP.hpp +++ b/addons/trenches/XEH_PREP.hpp @@ -1,4 +1,5 @@ +PREP(blockTrench_place); PREP(camouflageTrench); PREP(canCamouflageTrench); PREP(canContinueDiggingTrench); diff --git a/addons/trenches/XEH_postInit.sqf b/addons/trenches/XEH_postInit.sqf index 1fbfa24116..ea8ff7e24f 100644 --- a/addons/trenches/XEH_postInit.sqf +++ b/addons/trenches/XEH_postInit.sqf @@ -3,6 +3,17 @@ if (isServer) then { // Cancel dig on hard disconnection. Function is identical to killed addMissionEventHandler ["HandleDisconnect", {_this call FUNC(handleKilled)}]; + + // Wrapper for blockTrench_place, on failure send hint back to source + [QGVAR(layTrenchline), { + params [["_source", objNull, [objNull]], ["_args", [], [[]]]]; + private _return = _args call FUNC(blockTrench_place); + TRACE_3("layTrenchline EH",_source,_args,_return); + _return params ["_success", "_reason", ["_info", ""]]; + if ((!_success) && {!isNull _source}) then { + [QEGVAR(common,displayTextStructured), [["%1:
%2
%3", "str_mis_state_failed", _reason, _info], 3], [_source]] call CBA_fnc_targetEvent; + }; + }] call CBA_fnc_addEventHandler; }; if (!hasInterface) exitWith {}; diff --git a/addons/trenches/functions/fnc_blockTrench_place.sqf b/addons/trenches/functions/fnc_blockTrench_place.sqf new file mode 100644 index 0000000000..f602a871e0 --- /dev/null +++ b/addons/trenches/functions/fnc_blockTrench_place.sqf @@ -0,0 +1,173 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Dig trenchline + * + * Arguments: + * 0: Position + * 1: Position + * 2: Force - ignoring saftey checks (optional: false) + * 3: Cut Grass (optional: false) + * 4: Dry Run - Just test if possible (can run on clients) + * + * Return Value: + * + * 0: Success + * 1: Failure reason + * 2: Extra info + * + * Example: + * [a, b] call ace_trenches_fnc_blockTrench_place + * + * Public: No + */ + +params [["_start2d", [], [[]]], ["_end2d", [], [[]]], ["_force", false, [false]], ["_cutGrass", false, [false]], ["_dryRun", false, [false]]]; +TRACE_4("blockTrench_place",_start2d,_end2d,_force,_dryRun); + +if ((!isServer) && {!_dryRun}) exitWith { ERROR("function must be called on server"); [false, "server-only"]; }; + +scopeName "main"; + +// get maths +getTerrainInfo params ["", "", "_cellsize"]; +if ((_cellsize < 1) || {_cellsize > 10}) exitWith { [false, "world cellsize"] breakOut "main" }; // malden is 12.5 + +// for Land_Trench_01_forest_F +private _modelX = 2.1; +private _modelZ = 1.1; +private _modelSize = 3.75; + +private _landAdjust = -1.7; // how deep we dig into the terrain +private _trenchDepth = -1; // how deep the floor is +private _trenchWidth = 1; // offset for each side from center +private _blockAdjust = -0.45; // get block to sit flush +private _blockScale = _cellsize / _modelSize; // scale up block to fit cellsize + +private _xOffset = _trenchWidth + _blockScale * _modelX; +private _zOffset = _blockAdjust - (_blockScale - 1) * _modelZ; +private _testRadius = 1 * _blockScale * _modelSize; + +// convert to terrain grid +_start2d = (_start2d select [0,2]) apply {_cellsize * round (_x / _cellsize)}; +_end2d = (_end2d select [0,2]) apply {_cellsize * round (_x / _cellsize)}; +_start2d params ["_ax", "_ay"]; +_end2d params ["_bx", "_by"]; +{ // make sure points aren't outside terrain + if (_x < _cellsize || {_x > (worldSize - _cellsize)}) exitWith { [false, "outside map boundry"] breakOut "main" }; +} forEach [_ax, _ay, _bx, _by]; +TRACE_3("adjusted",_cellsize,_start2d,_end2d); + +// get direction and start/end +private _east = (abs (_ax - _bx)) >= (abs (_ay - _by)); +private _origin2D = []; +private _length = 0; +if (_east) then { + _origin2D = if (_ax < _bx) then { _start2d } else { _end2d }; + _length = (abs (_ax - _bx)) / _cellsize; +} else { + _origin2D = if (_ay < _by) then { _start2d } else { _end2d }; + _length = (abs (_ay - _by)) / _cellsize; +}; +TRACE_3("",_east,_origin2D,_length); +if (_length < 2) exitWith { [false, "too short"] breakOut "main" }; + +if (_dryRun) exitWith { // return an array of block positions + private _positions = []; + for "_i" from 0 to _length do { // intentionally inclusive + _positions pushBack (_origin2D vectorAdd (if (_east) then {[(_i + 0.5) * _cellsize, 0]} else {[0, (_i + 0.5) * _cellsize]})); + }; + [true, "dry run", _positions] +}; + + +// Test and get block data +private _blockData = []; +for "_i" from 0 to _length do { // intentionally inclusive + private _posCenter = _origin2D; + private _posLeft = _origin2D; + private _posRight = _origin2D; + private _direction = []; + if (_east) then { + _posCenter = _posCenter vectorAdd [(_i + 0.5) * _cellsize, 0]; + _posLeft = _posCenter vectorAdd [0, _xOffset]; + _posRight = _posCenter vectorAdd [0, -_xOffset]; + _direction = [0,-1,0]; + } else { + _posCenter = _posCenter vectorAdd [0, (_i + 0.5) * _cellsize]; + _posLeft = _posCenter vectorAdd [_xOffset, 0]; + _posRight = _posCenter vectorAdd [-_xOffset, 0]; + _direction = [-1,0,0]; + }; + + { // Test if each point is valid + private _pos2d = _x; + // check water + if ((!_force) && {(getTerrainHeightASL _pos2D) < 0}) then { [false, "water"] breakOut "main" }; + // check canDig (surface type) + if ((!_force) && {!([_pos2d] call EFUNC(common,canDig))}) then { [false, "canDig surface"] breakOut "main" }; + // check canDig (surface type) + if ((!_force) && {isOnRoad _pos2D}) then { [false, "road"] breakOut "main" }; + // check terrain objects + private _terrainObjects = nearestTerrainObjects [_pos2d, [], _testRadius, false, true]; + // todo: want to avoid touching trees and large rocks but could allow some small shrubs to be overlapped + if (_terrainObjects isNotEqualTo []) then { + if (_force) then { + WARNING_1("overlapping terrainObjects %1",_terrainObjects); + } else { + [false, "terrain object", _terrainObjects] breakOut "main"; + }; + }; + // check mission objects + private _missionObjects = nearestObjects [_origin2D, ["All"], _testRadius, true]; + _missionObjects = _missionObjects select { !(_x isKindOf "Logic") }; + if (_missionObjects isNotEqualTo []) then { + _missionObjects = _missionObjects apply {typeOf _x}; + if (_force) then { + WARNING_1("blocking missionObjects %1",_missionObjects); + } else { + [false, "mission object", _missionObjects] breakOut "main"; + }; + }; + } forEach [_posCenter, _posLeft, _posRight]; + + _posCenter set [2, (getTerrainHeightASL _posCenter) + _zOffset + _trenchDepth]; + _posLeft set [2, (getTerrainHeightASL _posLeft) + _zOffset]; + _posRight set [2, (getTerrainHeightASL _posRight) + _zOffset]; + + if (_cutGrass && {_i != 0} && {_i != _length}) then { + _blockData pushBack ["Land_ClutterCutter_medium_F", _blockScale, _posCenter, [0,1,0], surfaceNormal _posCenter]; + }; + // todo: there also is a snow textured block or do it right and make our own re-texturable model + _blockData pushBack ["Land_Trench_01_forest_F", _blockScale, _posCenter, _direction, surfaceNormal _posCenter]; + _blockData pushBack ["Land_Trench_01_forest_F", _blockScale, _posLeft, _direction, surfaceNormal _posLeft]; + _blockData pushBack ["Land_Trench_01_forest_F", _blockScale, _posRight, _direction vectorMultiply -1, surfaceNormal _posRight]; +}; + + +// Adjust terrain heights +private _terrainData = []; +for "_i" from 1 to (_length - 1) do { // skip first and last + private _posCenter = _origin2D; + if (_east) then { + _posCenter = _posCenter vectorAdd [_i * _cellsize, 0]; + } else { + _posCenter = _posCenter vectorAdd [0, _i * _cellsize]; + }; + + _posCenter set [2, (getTerrainHeight _posCenter) + _landAdjust]; + _terrainData pushBack _posCenter +}; +TRACE_1("setTerrainHeight",count _terrainData); +setTerrainHeight [_terrainData, true]; + + +// Place blocks +{ + _x params ["_xClass", "_xScale", "_xPosASL", "_xDir", "_xUp"]; + private _block = createSimpleObject [_xClass, _xPosASL]; + _block setVectorDirAndUp [_xDir, _xUp]; + if (_xScale != 1) then { _block setObjectScale _xScale; }; +} forEach _blockData; + +[true, "", _length] diff --git a/addons/zeus/CfgVehicles.hpp b/addons/zeus/CfgVehicles.hpp index 737f2acc09..4ae07fdedc 100644 --- a/addons/zeus/CfgVehicles.hpp +++ b/addons/zeus/CfgVehicles.hpp @@ -179,6 +179,11 @@ class CfgVehicles { function = QFUNC(moduleHeal); icon = QPATHTOF(ui\Icon_Module_Zeus_Heal_ca.paa); }; + class GVAR(moduleLayTrench): GVAR(moduleBase) { + category = QGVAR(Utility); + displayName = CSTRING(ModuleLayTrenchline_DisplayName); + function = QFUNC(moduleLayTrench); + }; class GVAR(moduleLoadIntoCargo): GVAR(moduleBase) { curatorCanAttach = 1; category = QGVAR(Utility); diff --git a/addons/zeus/XEH_PREP.hpp b/addons/zeus/XEH_PREP.hpp index c92c98b211..46cbbeb446 100644 --- a/addons/zeus/XEH_PREP.hpp +++ b/addons/zeus/XEH_PREP.hpp @@ -21,6 +21,7 @@ PREP(moduleGarrison); PREP(moduleGlobalSetSkill); PREP(moduleGroupSide); PREP(moduleHeal); +PREP(moduleLayTrench); PREP(moduleLoadIntoCargo); PREP(moduleRemoveArsenal); PREP(moduleRemoveAceArsenal); diff --git a/addons/zeus/config.cpp b/addons/zeus/config.cpp index 3856828230..8b752771b7 100644 --- a/addons/zeus/config.cpp +++ b/addons/zeus/config.cpp @@ -92,6 +92,11 @@ class CfgPatches { QGVAR(moduleBurn) }; }; + class GVAR(trenches): ADDON { + units[] = { + QGVAR(moduleLayTrench) + }; + }; }; class ACE_Curator { @@ -104,6 +109,7 @@ class ACE_Curator { GVAR(pylons) = "ace_pylons"; GVAR(arsenal) = "ace_arsenal"; GVAR(fire) = "ace_fire"; + GVAR(trenches) = "ace_trenches"; }; #include "CfgFactionClasses.hpp" diff --git a/addons/zeus/functions/fnc_bi_moduleCurator.sqf b/addons/zeus/functions/fnc_bi_moduleCurator.sqf index 47b67a8cf9..c597955a23 100644 --- a/addons/zeus/functions/fnc_bi_moduleCurator.sqf +++ b/addons/zeus/functions/fnc_bi_moduleCurator.sqf @@ -73,7 +73,8 @@ if (_activated) then { _class = _cfgPatches select _i; if (isclass _class) then {_addons set [count _addons,configname _class];}; }; - _addons call bis_fnc_activateaddons; + // Modified by ace_zeus - bis_fnc_activateaddons will error if time > 0 so only call if at start + if (time <= 0) then { _addons call bis_fnc_activateaddons; }; removeallcuratoraddons _logic; _logic addcuratoraddons _addons; }; @@ -249,7 +250,8 @@ if (_activated) then { } foreach _paramAddons; }; } foreach (synchronizedobjects _logic); - _addons call bis_fnc_activateaddons; + // Modified by ace_zeus - bis_fnc_activateaddons will error if time > 0 so only call if at start + if (time <= 0) then { _addons call bis_fnc_activateaddons; }; }; //--- Player diff --git a/addons/zeus/functions/fnc_getModuleDestination.sqf b/addons/zeus/functions/fnc_getModuleDestination.sqf index bc939445dc..b328201d6c 100644 --- a/addons/zeus/functions/fnc_getModuleDestination.sqf +++ b/addons/zeus/functions/fnc_getModuleDestination.sqf @@ -8,7 +8,7 @@ * 1: Code to run when position is ready (will be passed the following array) * - 0: Successful * - 1: Object - * - 2: Position ASL + * - 2: Mouse Pos ASL * - 3: State of Shift * - 4: State of Ctrl * - 5: State of Alt @@ -16,6 +16,9 @@ * 3: Icon image file (default: "\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa") * 4: Icon color (default: [1,0,0,1]) * 5: Icon Angle (default: 0) + * 6: Draw Code (default: {}) + * - 0: Object + * - 1: Mouse Pos ASL * * Return Value: * None @@ -26,7 +29,7 @@ * Public: No */ -params ["_object", "_code", ["_text", ""], ["_icon", "\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa"], ["_color", [1,0,0,1]], ["_angle", 0]]; +params ["_object", "_code", ["_text", ""], ["_icon", "\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa"], ["_color", [1,0,0,1]], ["_angle", 0], ["_drawCode", {}]]; if (missionNamespace getVariable [QGVAR(moduleDestination_running), false]) exitWith { [false, _object, [0,0,0], false, false, false] call _code; @@ -95,7 +98,7 @@ GVAR(moduleDestination_mapDrawEH) = [((findDisplay 312) displayCtrl 50), "draw", // Add draw EH for 3D camera view - draws the 3D icon and line [{ - (_this select 0) params ["_object", "_code", "_text", "_icon", "_color", "_angle"]; + (_this select 0) params ["_object", "_code", "_text", "_icon", "_color", "_angle", "_drawCode"]; if ((isNull _object) || {isNull findDisplay 312} || {!isNull findDisplay 49}) then { TRACE_3("null-exit",isNull _object,isNull findDisplay 312,isNull findDisplay 49); GVAR(moduleDestination_running) = false; @@ -104,6 +107,7 @@ GVAR(moduleDestination_mapDrawEH) = [((findDisplay 312) displayCtrl 50), "draw", if (GVAR(moduleDestination_running)) then { // Draw the 3d icon and line private _mousePosAGL = screenToWorld getMousePosition; + [_object, AGLToASL _mousePosAGL] call _drawCode; drawIcon3D [_icon, _color, _mousePosAGL, 1.5, 1.5, _angle, _text]; drawLine3D [_mousePosAGL, ASLtoAGL (getPosASL _object), _color];; } else { @@ -116,4 +120,4 @@ GVAR(moduleDestination_mapDrawEH) = [((findDisplay 312) displayCtrl 50), "draw", GVAR(moduleDestination_displayEHKeyboard) = nil; GVAR(moduleDestination_mapDrawEH) = nil; }; -}, 0, [_object, _code, _text, _icon, _color, _angle]] call CBA_fnc_addPerFrameHandler; +}, 0, [_object, _code, _text, _icon, _color, _angle, _drawCode]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/zeus/functions/fnc_moduleLayTrench.sqf b/addons/zeus/functions/fnc_moduleLayTrench.sqf new file mode 100644 index 0000000000..e92725138f --- /dev/null +++ b/addons/zeus/functions/fnc_moduleLayTrench.sqf @@ -0,0 +1,57 @@ +#include "..\script_component.hpp" +/* + * PabstMirror + * Dig trenchline + * + * Arguments: + * 0: Module logic + * 1: Synchronized units + * 2: Activated + * + * Return Value: + * None + * + * Example: + * [LOGIC, [], true] call ace_zeus_fnc_moduleLayTrench + * + * Public: No + */ +if (canSuspend) exitWith {[FUNC(moduleLayTrench), _this] call CBA_fnc_directCall;}; + +params ["_logic", "_units", "_activated"]; +if !(_activated && {local _logic}) exitWith {}; +TRACE_1("",_logic); + +if !(["ace_trenches"] call EFUNC(common,isModLoaded)) exitWith { + deleteVehicle _logic; + [LSTRING(RequiresAddon)] call FUNC(showMessage); +}; + +private _drawCode = { + params ["_object", "_mousePos"]; + private _startPos = getPos _object; + ([_startPos, _mousePos, false, false, true] call EFUNC(trenches,blockTrench_place)) params ["_valid", "_reason", "_extra"]; + if (_valid) then { + { + drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa", [0,0,1,1], (_x select [0,2]) + [0], 1.5, 1.5, 0, ""]; + } forEach _extra; + } else { + drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa", [1,0,1,1], (_startPos select [0,2]) + [0], 1.5, 1.5, 0, ""]; + drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa", [1,0,1,1], (_mousePos select [0,2]) + [0], 1.5, 1.5, 0, ""]; + }; +}; + +private _text = format ["%1 %2", LELSTRING(trenches,ConfirmDig), LLSTRING(ModuleLayTrenchline_Tooltip)]; +[_logic, { + params ["_successful", "_logic", "_mousePosASL", "_shift"]; + TRACE_4("getModuleDestination",_successful,_logic,_mousePosASL,_shift); + + if (isNull _logic) exitWith { WARNING("logic missing"); }; + private _startPosASL = getPosASL _logic; + deleteVehicle _logic; + if (!_successful) exitWith { TRACE_1("exit",_successful); }; + + private _args = [_startPosASL, _mousePosASL, _shift]; + TRACE_1("sending event",_args); + [QEGVAR(trenches,layTrenchline), [ace_player, _args]] call CBA_fnc_serverEvent; +}, _text, "\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa", [0, 1, 0, 1], 45, _drawCode] call FUNC(getModuleDestination); diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml index 4769f897ca..b32b09692b 100644 --- a/addons/zeus/stringtable.xml +++ b/addons/zeus/stringtable.xml @@ -1933,5 +1933,11 @@ Поджечь юнита Quemar a unidad + + Lay Trenchline + + + +SHIFT to force (Can only lay N/S or E/W) + diff --git a/docs/wiki/framework/events-framework.md b/docs/wiki/framework/events-framework.md index 99752735c0..7244271520 100644 --- a/docs/wiki/framework/events-framework.md +++ b/docs/wiki/framework/events-framework.md @@ -36,7 +36,8 @@ The vehicle events will also have the following local variables available `_gunn | Event Key | Parameters | Locality | Type | Description | |----------|---------|---------|---------|---------|---------| |`ace_unconscious` | [_unit, _state(BOOL)] | Global | Listen | Unit's unconscious state changed -|`ace_placedInBodyBag` | [_target, _bodyBag] | Global | Listen | Target placed into a bodybag Note: (Target will soon be deleted) +|`ace_placedInBodyBag` | [_target, _bodyBag, _isGrave] | Global | Listen | Target placed into a bodybag Note: (Target will soon be deleted, target could be a bodybag) +|`ace_placedInGrave` | [_target, _grave] | Global | Listen | Target placed into a grave, _grave will be objNull if `Create Grave Markers` is disabled Note: (Target will soon be deleted) |`ace_treatmentStarted` | [_caller, _target, _selectionName, _className, _itemUser, _usedItem] | Local | Listen | Treatment action has started (local on the _caller) |`ace_treatmentSucceded` | [_caller, _target, _selectionName, _className, _itemUser, _usedItem] | Local | Listen | Treatment action is completed (local on the _caller) |`ace_treatmentFailed` | [_caller, _target, _selectionName, _className, _itemUser, _usedItem] | Local | Listen | Treatment action has been interrupted (local on the _caller) diff --git a/tools/pDummies/vn/weapons_f_vietnam_04/mines/m18/vn_mine_m18_wp b/tools/pDummies/vn/weapons_f_vietnam_04/mines/m18/vn_mine_m18_wp new file mode 100644 index 0000000000..e69de29bb2