diff --git a/AUTHORS.txt b/AUTHORS.txt index b5b013d68d..29861f1e50 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -129,6 +129,7 @@ Raspu86 Riccardo Petricca Robert Boklahánics ruPaladin +Rutger "RedBery" Meijering simon84 Skengman2 Sniperwolf572 diff --git a/addons/arsenal/XEH_preInit.sqf b/addons/arsenal/XEH_preInit.sqf index 41f5f4cf88..04d8cbb124 100644 --- a/addons/arsenal/XEH_preInit.sqf +++ b/addons/arsenal/XEH_preInit.sqf @@ -60,4 +60,13 @@ GVAR(modList) = ["","curator","kart","heli","mark","expansion","expansionpremium call FUNC(compileStats); +// compatibility with CBA scripted 2d optics framework +[QGVAR(displayOpened), { + "cba_2doptics_arsenalOpened" call CBA_fnc_localEvent; +}] call CBA_fnc_addEventHandler; + +[QGVAR(displayClosed), { + "cba_2doptics_arsenalClosed" call CBA_fnc_localEvent; +}] call CBA_fnc_addEventHandler; + ADDON = true; diff --git a/addons/ballistics/CfgMagazineWells.hpp b/addons/ballistics/CfgMagazineWells.hpp index 39098f4c28..71d553b4ba 100644 --- a/addons/ballistics/CfgMagazineWells.hpp +++ b/addons/ballistics/CfgMagazineWells.hpp @@ -107,14 +107,14 @@ class CfgMagazineWells { "ACE_30Rnd_65x47_Scenar_mag", "ACE_20Rnd_65x47_Scenar_mag" }; - }; + }; class CBA_338LM_AI { //338 Lapua Magnum Accuracy International ADDON[] = { "ACE_10Rnd_338_300gr_HPBT_Mag", "ACE_10Rnd_338_API526_Mag" }; - }; + }; class CBA_408CT_Inter { ADDON[] = { @@ -122,13 +122,13 @@ class CfgMagazineWells { }; }; - class CBA_50BMG_M107 { + class CBA_50BMG_M107 { ADDON[] = { "ACE_5Rnd_127x99_Mag", "ACE_5Rnd_127x99_API_Mag", "ACE_5Rnd_127x99_AMAX_Mag" }; - }; + }; class CBA_9x19_P226 { // SIG P226 ADDON[] = { @@ -161,30 +161,5 @@ class CfgMagazineWells { "ACE_10Rnd_762x54_Tracer_mag" }; }; - class CBA_762x54R_Mosin { - ADDON[] = { - "ACE_10Rnd_762x54_Tracer_mag" - }; - }; - class CBA_762x54R_SVT { - ADDON[] = { - "ACE_10Rnd_762x54_Tracer_mag" - }; - }; - class CBA_762x54R_DPM { - ADDON[] = { - "ACE_10Rnd_762x54_Tracer_mag" - }; - }; - class CBA_762x54R_DT { - ADDON[] = { - "ACE_10Rnd_762x54_Tracer_mag" - }; - }; - class CBA_762x54R_Maxim { - ADDON[] = { - "ACE_10Rnd_762x54_Tracer_mag" - }; - }; }; diff --git a/addons/common/ACE_Settings.hpp b/addons/common/ACE_Settings.hpp index eeee9c2f37..f7ab86e227 100644 --- a/addons/common/ACE_Settings.hpp +++ b/addons/common/ACE_Settings.hpp @@ -1,4 +1,6 @@ class ACE_Settings { + //IGNORE_STRING_WARNING(STR_ACE_Common_SettingName); + //IGNORE_STRING_WARNING(STR_ACE_Common_SettingDescription); /* * class GVAR(sampleSetting) { * value = 1; // Value diff --git a/addons/common/functions/fnc_cbaSettings_convertHelper.sqf b/addons/common/functions/fnc_cbaSettings_convertHelper.sqf index 4c64da8f0f..8c892bcf13 100644 --- a/addons/common/functions/fnc_cbaSettings_convertHelper.sqf +++ b/addons/common/functions/fnc_cbaSettings_convertHelper.sqf @@ -113,7 +113,7 @@ private _settings = configProperties [configFile >> "ACE_Settings", "(isClass _x _output pushBack ""; _output pushBack format ["["]; _output pushBack format [" QGVAR(%1), ""%2"",", _gvarName, _cbaSettingType]; - _output pushBack format [" [LSTRING(), LSTRING()], // %1, %2", _localizedName, _localizedDescription]; + _output pushBack format [" [LSTRING(), LSTRING()], // %1, %2", _localizedName, _localizedDescription]; //IGNORE_STRING_WARNING(str_ace_common_); _output pushBack format [" ""%1"", // %2", ["localize LSTRING()", _category] select _uncat, _category]; _output pushBack format [" %1, // %2", _cbaValueInfo, _cbaValueInfoHint]; _output pushBack format [" %1, // isGlobal", _cbaIsGlobal]; diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index 2e514bd5e8..edb1b64abe 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -1075,7 +1075,10 @@ - + + Confirm + + Never diff --git a/addons/cookoff/ACE_Settings.hpp b/addons/cookoff/ACE_Settings.hpp index 304aaf48e0..ba4447dba9 100644 --- a/addons/cookoff/ACE_Settings.hpp +++ b/addons/cookoff/ACE_Settings.hpp @@ -1,40 +1,18 @@ class ACE_Settings { class GVAR(enable) { - category = CSTRING(displayName); - displayName = CSTRING(enable_name); - description = CSTRING(enable_tooltip); - value = 0; - typeName = "BOOL"; + movedToSqf = 1; }; class GVAR(enableAmmobox) { - category = CSTRING(displayName); - displayName = CSTRING(enableBoxCookoff_name); - description = CSTRING(enableBoxCookoff_tooltip); - value = 1; - typeName = "BOOL"; + movedToSQF = 1; }; class GVAR(enableAmmoCookoff) { // For CBA Setting Switch: we can eliminate and just use (ammoCookoffDuration == 0) - category = CSTRING(displayName); - displayName = CSTRING(enableAmmoCookoff_name); - description = CSTRING(enableAmmoCookoff_tooltip); - value = 1; - typeName = "BOOL"; + movedToSQF = 1; }; class GVAR(ammoCookoffDuration) { - category = CSTRING(displayName); - displayName = CSTRING(ammoCookoffDuration_name); - description = CSTRING(ammoCookoffDuration_tooltip); - value = 1; - typeName = "SCALAR"; - sliderSettings[] = {0, 5, 1, 1}; + movedToSQF = 1; }; class GVAR(probabilityCoef) { - category = CSTRING(displayName); - displayName = CSTRING(probabilityCoef_name); - description = CSTRING(probabilityCoef_tooltip); - value = 1; - typeName = "SCALAR"; - sliderSettings[] = {0, 5, 1, 1}; + movedToSQF = 1; }; }; diff --git a/addons/cookoff/CfgEden.hpp b/addons/cookoff/CfgEden.hpp index 04e7762a41..caffc6b90b 100644 --- a/addons/cookoff/CfgEden.hpp +++ b/addons/cookoff/CfgEden.hpp @@ -7,8 +7,8 @@ class Cfg3DEN { class GVAR(enable) { property = QGVAR(enable); control = "Checkbox"; - displayName = CSTRING(enable_name); - tooltip = CSTRING(enable_tooltip); + displayName = CSTRING(enable_hd_name); + tooltip = CSTRING(enable_hd_tooltip); expression = QUOTE(if !(_value) then {_this setVariable [ARR_3('%s',_value,true)];};); typeName = "BOOL"; condition = "objectVehicle"; diff --git a/addons/cookoff/XEH_preInit.sqf b/addons/cookoff/XEH_preInit.sqf index b47cf6628d..9361d05015 100644 --- a/addons/cookoff/XEH_preInit.sqf +++ b/addons/cookoff/XEH_preInit.sqf @@ -6,4 +6,6 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +#include "initSettings.sqf" + ADDON = true; diff --git a/addons/cookoff/initSettings.sqf b/addons/cookoff/initSettings.sqf new file mode 100644 index 0000000000..b29d213427 --- /dev/null +++ b/addons/cookoff/initSettings.sqf @@ -0,0 +1,51 @@ +// CBA Settings [ADDON: ace_cookoff]: + +[ + QGVAR(enable), "CHECKBOX", + [LSTRING(enable_hd_name), LSTRING(enable_hd_tooltip)], + LSTRING(category_displayName), + false, // default value + true, // isGlobal + {[QGVAR(enable), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(enableAmmobox), "CHECKBOX", + [LSTRING(enableBoxCookoff_name), LSTRING(enableBoxCookoff_tooltip)], + LSTRING(category_displayName), + true, // default value + true, // isGlobal + {[QGVAR(enableAmmobox), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(enableAmmoCookoff), "CHECKBOX", + [LSTRING(enableAmmoCookoff_name), LSTRING(enableAmmoCookoff_tooltip)], + LSTRING(category_displayName), + true, // default value + true, // isGlobal + {[QGVAR(enableAmmoCookoff), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(ammoCookoffDuration), "SLIDER", + [LSTRING(ammoCookoffDuration_name), LSTRING(ammoCookoffDuration_tooltip)], + LSTRING(category_displayName), + [0,5,1,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] + true, // isGlobal + {[QGVAR(ammoCookoffDuration), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; + +[ + QGVAR(probabilityCoef), "SLIDER", + [LSTRING(probabilityCoef_name), LSTRING(probabilityCoef_tooltip)], + LSTRING(category_displayName), + [0,5,1,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] + true, // isGlobal + {[QGVAR(probabilityCoef), _this] call EFUNC(common,cbaSettings_settingChanged)}, + true // Needs mission restart +] call CBA_settings_fnc_init; diff --git a/addons/cookoff/stringtable.xml b/addons/cookoff/stringtable.xml index b561d0b89b..536700cc87 100644 --- a/addons/cookoff/stringtable.xml +++ b/addons/cookoff/stringtable.xml @@ -1,42 +1,22 @@ - - Cook off - Esplosione - 殉爆效果 - 殉爆效果 - 誘爆 - 쿡오프 - Durchzündung - Cook off - Samozapłon + + ACE Cook off + ACE Esplosione + ACE 殉爆效果 + ACE 殉爆效果 + ACE 誘爆 + ACE 쿡오프 + ACE Durchzündung + ACE Cook off + ACE Samozapłon - - Enable cook off - Durchzündung ermöglichen - Povolit explozi munice - Включить воспламенение - 誘爆を有効化 - 쿡오프 현상 활성화 - Aktywuj efekty samozapłonu amunicji - Activer le cook off - Abilita Esplosione - 開啟殉爆效果 - 开启殉爆效果 + + Damage handling and turret effects - - Enables cook off and related vehicle destruction effects. - Ermöglicht Durchzündung und zugehörige Fahrzeug-Zerstörungseffekte. - Povolí explozi munice a její následné ničivé efekty. - Включает воспламенение и сопутствующие эффекты повреждения техники. - 誘爆を有効化し、車両が誘爆によって破壊されていきます。 - 쿡오프 현상을 활성화 하고 관련된 차량에 폭발 이펙트를 적용합니다. - Aktywuje efekt samozapłonu amunicji na zniszczonych pojazdach. - Active le cook-off (autocombustion des munitions) et les effets de destruction liés. - Abilita l'esplosione e i relativi effetti di distruzione del veicolo. - 開啟此功能後,將使有關載具在損毀時有殉爆的效果 - 开启此功能后,将使有关载具在损毁时有殉爆的效果。 + + Changes damage handling for cook off and turret explosion effects Wreck (Turret) diff --git a/addons/fastroping/CfgVehicles.hpp b/addons/fastroping/CfgVehicles.hpp index 6dfd06ff72..2d03ddcee0 100644 --- a/addons/fastroping/CfgVehicles.hpp +++ b/addons/fastroping/CfgVehicles.hpp @@ -75,8 +75,13 @@ class CfgVehicles { }; class ACE_cutRopes { displayName = CSTRING(Interaction_cutRopes); - condition = [_target] call FUNC(canCutRopes); - statement = [_target] call FUNC(cutRopes); + condition = QUOTE(true); + statement = ""; + class confirmCutRopes { + displayName = ECSTRING(common,confirm); + condition = QUOTE([_target] call FUNC(canCutRopes)); + statement = QUOTE([_target] call FUNC(cutRopes)); + }; }; class ACE_fastRope { displayName = CSTRING(Interaction_fastRope); diff --git a/addons/hellfire/CfgMagazineWells.hpp b/addons/hellfire/CfgMagazineWells.hpp new file mode 100644 index 0000000000..5077d2faa6 --- /dev/null +++ b/addons/hellfire/CfgMagazineWells.hpp @@ -0,0 +1,4 @@ +class CfgMagazineWells { + class GVAR(K) {}; + class GVAR(N) {}; +}; diff --git a/addons/hellfire/CfgWeapons.hpp b/addons/hellfire/CfgWeapons.hpp index 1d7f167aad..b040f67d1d 100644 --- a/addons/hellfire/CfgWeapons.hpp +++ b/addons/hellfire/CfgWeapons.hpp @@ -6,7 +6,7 @@ class CfgWeapons { EGVAR(laser,canSelect) = 1; // can ace_laser lock (allows switching laser code) EGVAR(laser,showHud) = 1; // show attack profile / lock on hud magazines[] = {"6Rnd_ACE_Hellfire_AGM114K", "PylonMissile_1Rnd_ACE_Hellfire_AGM114K", "PylonRack_1Rnd_ACE_Hellfire_AGM114K", "PylonRack_3Rnd_ACE_Hellfire_AGM114K", "PylonRack_4Rnd_ACE_Hellfire_AGM114K"}; - + magazineWell[] = {QGVAR(K)}; autoFire = 0; canLock = 0; weaponLockSystem = 0; @@ -14,7 +14,7 @@ class CfgWeapons { lockedTargetSound[] = {"",0,1}; soundFly[] = {"A3\Sounds_F\weapons\Rockets\rocket_fly_1",1,1.1,700}; nameSound = "MissileLauncher"; - sounds[] = {"StandardSound"}; + sounds[] = {"StandardSound"}; class StandardSound { begin1[] = {"A3\Sounds_F\weapons\Rockets\missile_1",1.12202,1.3,1000}; soundBegin[] = {"begin1",1}; @@ -27,5 +27,6 @@ class CfgWeapons { class GVAR(launcher_N): GVAR(launcher) { displayName = "AGM-114N Hellfire II"; magazines[] = {"6Rnd_ACE_Hellfire_AGM114N", "PylonMissile_1Rnd_ACE_Hellfire_AGM114N", "PylonRack_1Rnd_ACE_Hellfire_AGM114N", "PylonRack_3Rnd_ACE_Hellfire_AGM114N", "PylonRack_4Rnd_ACE_Hellfire_AGM114N"}; + magazineWell[] = {QGVAR(N)}; }; }; diff --git a/addons/hellfire/config.cpp b/addons/hellfire/config.cpp index 8df1594612..911e016d7f 100644 --- a/addons/hellfire/config.cpp +++ b/addons/hellfire/config.cpp @@ -18,5 +18,6 @@ class CfgPatches { #include "CfgAmmo.hpp" #include "CfgEventHandlers.hpp" #include "CfgMagazines.hpp" +#include "CfgMagazineWells.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" diff --git a/addons/interaction/functions/fnc_canPassMagazine.sqf b/addons/interaction/functions/fnc_canPassMagazine.sqf index f25e5da164..5cc1ed96e2 100644 --- a/addons/interaction/functions/fnc_canPassMagazine.sqf +++ b/addons/interaction/functions/fnc_canPassMagazine.sqf @@ -19,11 +19,12 @@ params ["_player", "_target", "_weapon"]; if (!GVAR(enableMagazinePassing)) exitWith {false}; +if (_weapon isEqualTo "") exitWith {false}; if (((vehicle _target) != _target) && {(vehicle _target) != (vehicle _player)}) exitWith {false}; -private _compatibleMags = getArray (configfile >> "CfgWeapons" >> _weapon >> "magazines"); -{ +private _compatibleMags = [_weapon] call CBA_fnc_compatibleMagazines; + +(magazinesAmmoFull _player) findIf { _x params ["_className", "", "_loaded"]; - if ((_className in _compatibleMags) && {!_loaded} && {_target canAdd _className}) exitWith {true}; - false -} foreach (magazinesAmmoFull _player); + (_className in _compatibleMags) && {!_loaded} && {_target canAdd _className} +} > -1 diff --git a/addons/interaction/functions/fnc_passMagazine.sqf b/addons/interaction/functions/fnc_passMagazine.sqf index c52e40e88f..07db3dba3c 100644 --- a/addons/interaction/functions/fnc_passMagazine.sqf +++ b/addons/interaction/functions/fnc_passMagazine.sqf @@ -12,21 +12,24 @@ * None * * Example: - * [_player, _target, "arifle_MX_F"] call ace_interaction_fnc_magToPassazine + * [_player, _target, "arifle_MX_F"] call ace_interaction_fnc_passMagazine * * Public: No */ params ["_player", "_target", "_weapon"]; -private _compatibleMags = getArray (configfile >> "CfgWeapons" >> _weapon >> "magazines"); -private _filteredMags = magazinesAmmoFull _player select {(_x select 0) in _compatibleMags && {!(_x select 2)}}; +private _compatibleMags = [_weapon] call CBA_fnc_compatibleMagazines; +private _filteredMags = magazinesAmmoFull _player select { + _x params ["_className", "", "_loaded"]; + (_className in _compatibleMags) && {!_loaded} && {_target canAdd _className} +}; //select magazine with most ammo private _magToPass = _filteredMags select 0; private _magToPassIndex = 0; { _x params ["_className", "_ammoCount"]; - if ((_ammoCount > (_magToPass select 1)) && (_target canAdd _className)) then { + if (_ammoCount > (_magToPass select 1)) then { _magToPass = _x; _magToPassIndex = _forEachIndex; }; diff --git a/addons/medical/functions/fnc_setUnconscious.sqf b/addons/medical/functions/fnc_setUnconscious.sqf index dcb48ecda5..ab4f944f89 100644 --- a/addons/medical/functions/fnc_setUnconscious.sqf +++ b/addons/medical/functions/fnc_setUnconscious.sqf @@ -14,8 +14,8 @@ * Success? * * Example: - * [bob, true] call ace_medical_status__fnc_setUnconscious; - * [player, true, 5, true] call ace_medical_status_fnc_setUnconscious; + * [bob, true] call ace_medical_fnc_setUnconscious; + * [player, true, 5, true] call ace_medical_fnc_setUnconscious; * * Public: yes */ diff --git a/addons/medical_engine/script_component.hpp b/addons/medical_engine/script_component.hpp index 29d7344f4f..d45c30a024 100644 --- a/addons/medical_engine/script_component.hpp +++ b/addons/medical_engine/script_component.hpp @@ -4,7 +4,7 @@ // #define DEBUG_MODE_FULL // #define DISABLE_COMPILE_CACHE -//#define ENABLE_PERFORMANCE_COUNTERS +// #define ENABLE_PERFORMANCE_COUNTERS #ifdef DEBUG_ENABLED_MEDICAL_ENGINE #define DEBUG_MODE_FULL @@ -19,11 +19,11 @@ #include "\z\ace\addons\medical_engine\script_macros_config.hpp" #define PRELOAD_CLASS(class) \ - diag_log format["Starting preload for ""%1""",class];\ + INFO_1("Starting preload for (%1)",class);\ [{\ 1 preloadObject _this;\ }, {\ - diag_log format ["Preload done for ""%1""",_this];\ + INFO_1("Preload done for (%1)",_this);\ }, class] call CBA_fnc_waitUntilAndExecute #define PRIORITY_HEAD 3 diff --git a/addons/medical_feedback/XEH_postInit.sqf b/addons/medical_feedback/XEH_postInit.sqf index 0dac59dd28..6b339f1993 100644 --- a/addons/medical_feedback/XEH_postInit.sqf +++ b/addons/medical_feedback/XEH_postInit.sqf @@ -24,10 +24,13 @@ GVAR(heartBeatEffectRunning) = false; if (_unit != ACE_player) exitWith {}; // Toggle unconscious player's ability to talk in radio addons - _unit setVariable ["tf_voiceVolume", [1, 0] select _unconscious, true]; - _unit setVariable ["tf_unable_to_use_radio", _unconscious]; // Only used locally - _unit setVariable ["acre_sys_core_isDisabled", _unconscious, true]; - + if (["task_force_radio"] call EFUNC(common,isModLoaded)) then { + _unit setVariable ["tf_voiceVolume", [1, 0] select _unconscious, true]; + _unit setVariable ["tf_unable_to_use_radio", _unconscious]; // Only used locally + }; + if (["acre_main"] call EFUNC(common,isModLoaded)) then { + _unit setVariable ["acre_sys_core_isDisabled", _unconscious, true]; + }; // Greatly reduce player's hearing ability while unconscious (affects radio addons) [QUOTE(ADDON), VOL_UNCONSCIOUS, _unconscious] call EFUNC(common,setHearingCapability); @@ -40,22 +43,29 @@ GVAR(heartBeatEffectRunning) = false; params ["_unit"]; if (_unit != ACE_player) exitWith {}; - - _unit setVariable ["tf_voiceVolume", 1, true]; - _unit setVariable ["tf_unable_to_use_radio", false]; - _unit setVariable ["acre_sys_core_isDisabled", false, true]; + if (["task_force_radio"] call EFUNC(common,isModLoaded)) then { + _unit setVariable ["tf_voiceVolume", 1, true]; + _unit setVariable ["tf_unable_to_use_radio", false]; + }; + if (["acre_main"] call EFUNC(common,isModLoaded)) then { + _unit setVariable ["acre_sys_core_isDisabled", false, true]; + }; [QUOTE(ADDON), 1, false] call EFUNC(common,setHearingCapability); }] call CBA_fnc_addEventHandler; // Update effects to match new unit's current status (this also handles respawn) ["unit", { - params ["_new", "_old"]; + params ["_new"]; private _status = _new getVariable ["ace_unconscious", false]; - _new setVariable ["tf_voiceVolume", [1, 0] select _status, true]; - _new setVariable ["tf_unable_to_use_radio", _status]; - _new setVariable ["acre_sys_core_isDisabled", _status, true]; + if (["task_force_radio"] call EFUNC(common,isModLoaded)) then { + _new setVariable ["tf_voiceVolume", [1, 0] select _status, true]; + _new setVariable ["tf_unable_to_use_radio", _status]; + }; + if (["acre_main"] call EFUNC(common,isModLoaded)) then { + _new setVariable ["acre_sys_core_isDisabled", _status, true]; + }; [QUOTE(ADDON), VOL_UNCONSCIOUS, _status] call EFUNC(common,setHearingCapability); [_status, 0] call FUNC(effectUnconscious); ["unconscious", _status] call EFUNC(common,setDisableUserInputStatus); diff --git a/addons/medical_feedback/functions/fnc_effectHeartBeat.sqf b/addons/medical_feedback/functions/fnc_effectHeartBeat.sqf index ad8a2d7c73..1c5c9ef968 100644 --- a/addons/medical_feedback/functions/fnc_effectHeartBeat.sqf +++ b/addons/medical_feedback/functions/fnc_effectHeartBeat.sqf @@ -4,18 +4,18 @@ * Handles the hear beat sound. * * Arguments: - * 0: Heart rate + * None * * Return Value: * None * * Example: - * [120] call ace_medical_feedback_fnc_effectHeartBeat + * [] call ace_medical_feedback_fnc_effectHeartBeat * * Public: No */ -params ["_heartRate"]; +private _heartRate = GET_HEART_RATE(ACE_player); if (_heartRate == 0) exitWith { TRACE_1("Ending heart beat effect - zero",_heartRate); diff --git a/addons/medical_gui/XEH_postInit.sqf b/addons/medical_gui/XEH_postInit.sqf index 8b17c090b2..c6dd4e2722 100644 --- a/addons/medical_gui/XEH_postInit.sqf +++ b/addons/medical_gui/XEH_postInit.sqf @@ -12,9 +12,19 @@ GVAR(pendingReopen) = false; GVAR(menuPFH) = -1; +GVAR(selfInteractionActions) = []; [] call FUNC(addTreatmentActions); [] call FUNC(collectActions); +[QEGVAR(interact_menu,newControllableObject), { + params ["_type"]; // string of the object's classname + if (!(_type isKindOf "CAManBase")) exitWith {}; + { + _x set [0, _type]; + _x call EFUNC(interact_menu,addActionToClass); + } forEach GVAR(selfInteractionActions); +}] call CBA_fnc_addEventHandler; + ["ace_treatmentSucceded", { if (GVAR(openAfterTreatment) && {GVAR(pendingReopen)}) then { GVAR(pendingReopen) = false; diff --git a/addons/medical_gui/functions/fnc_addTreatmentActions.sqf b/addons/medical_gui/functions/fnc_addTreatmentActions.sqf index 79dde30136..541c308ff0 100644 --- a/addons/medical_gui/functions/fnc_addTreatmentActions.sqf +++ b/addons/medical_gui/functions/fnc_addTreatmentActions.sqf @@ -10,7 +10,7 @@ * None * * Example: - * [] call ace_medical_gui_fnc_addInteractActions + * [] call ace_medical_gui_fnc_addTreatmentActions * * Public: No */ @@ -60,6 +60,6 @@ private _fnc_condition = { ["CAManBase", 0, [_actionPath], _action, true] call EFUNC(interact_menu,addActionToClass); ["CAManBase", 0, ["ACE_MainActions", "ACE_Medical_Radial", _actionPath], _action, true] call EFUNC(interact_menu,addActionToClass); - ["CAManBase", 1, ["ACE_SelfActions", "ACE_Medical", _actionPath], _action, true] call EFUNC(interact_menu,addActionToClass); + GVAR(selfInteractionActions) pushBack ["", 1, ["ACE_SelfActions", "ACE_Medical", _actionPath], _action]; } forEach _allowedBodyParts; } forEach configProperties [_actionsConfig, "isClass _x"]; diff --git a/addons/medical_gui/functions/fnc_canOpenMenu.sqf b/addons/medical_gui/functions/fnc_canOpenMenu.sqf index 4451df4de2..f94c73bb9e 100644 --- a/addons/medical_gui/functions/fnc_canOpenMenu.sqf +++ b/addons/medical_gui/functions/fnc_canOpenMenu.sqf @@ -19,6 +19,7 @@ params ["_player", "_target"]; alive _player +&& {!IS_UNCONSCIOUS(_player)} && {!isNull _target} && {_player distance _target < GVAR(maxDistance) || {vehicle _player == vehicle _target}} && {GVAR(enableMedicalMenu) == 1 || {GVAR(enableMedicalMenu) == 2 && {vehicle _player != _player || {vehicle _target != _target}}}} diff --git a/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp b/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp index 47bc429f1f..e9c79b64f5 100644 --- a/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp +++ b/addons/medical_treatment/ACE_Medical_Treatment_Actions.hpp @@ -277,6 +277,7 @@ class GVAR(actions) { allowSelfTreatment = 0; medicRequired = QGVAR(medicSurgicalKit); treatmentTime = QUOTE(count (_patient getVariable [ARR_2('EGVAR(medical,bandagedWounds)',[])]) * 5); + condition = QFUNC(canStitch); callbackSuccess = ""; callbackProgress = QFUNC(surgicalKitProgress); consumeItem = QGVAR(consumeSurgicalKit); diff --git a/addons/medical_treatment/XEH_PREP.hpp b/addons/medical_treatment/XEH_PREP.hpp index affc5e238a..100850078e 100644 --- a/addons/medical_treatment/XEH_PREP.hpp +++ b/addons/medical_treatment/XEH_PREP.hpp @@ -42,6 +42,7 @@ PREP(addToTriageCard); PREP(bodyCleanupLoop); PREP(calculateBlood); PREP(canBandage); +PREP(canStitch); PREP(findMostEffectiveWound); PREP(getBandageTime); PREP(getTriageStatus); diff --git a/addons/medical_treatment/XEH_postInit.sqf b/addons/medical_treatment/XEH_postInit.sqf index 13d3903a26..5fe9884279 100644 --- a/addons/medical_treatment/XEH_postInit.sqf +++ b/addons/medical_treatment/XEH_postInit.sqf @@ -21,3 +21,7 @@ if (isServer) then { [QGVAR(checkPulseLocal), FUNC(checkPulseLocal)] call CBA_fnc_addEventHandler; [QGVAR(checkBloodPressureLocal), FUNC(checkBloodPressureLocal)] call CBA_fnc_addEventHandler; [QGVAR(actionPlaceInBodyBag), FUNC(actionPlaceInBodyBag)] call CBA_fnc_addEventHandler; + +// log events +[QGVAR(addToMedicalLog), FUNC(addToLog)] call CBA_fnc_addEventHandler; +[QGVAR(addToTriageCard), FUNC(addToTriageCard)] call CBA_fnc_addEventHandler; diff --git a/addons/medical_treatment/functions/fnc_canBandage.sqf b/addons/medical_treatment/functions/fnc_canBandage.sqf index 4674c2cdf1..46c632c649 100644 --- a/addons/medical_treatment/functions/fnc_canBandage.sqf +++ b/addons/medical_treatment/functions/fnc_canBandage.sqf @@ -13,6 +13,9 @@ * Return Value: * Can Bandage * + * Example: + * [player, cursorTarget, "Head", "FieldDressing"] call ace_medical_treatment_fnc_canBandage + * * Public: No */ diff --git a/addons/medical_treatment/functions/fnc_canStitch.sqf b/addons/medical_treatment/functions/fnc_canStitch.sqf new file mode 100644 index 0000000000..d4013d97f1 --- /dev/null +++ b/addons/medical_treatment/functions/fnc_canStitch.sqf @@ -0,0 +1,21 @@ +#include "script_component.hpp" +/* + * Author: Katalam + * Prevents stitch actions from showing if the body is either fully stitched or has no open wounds. + * + * Arguments: + * 0: The medic + * 1: The patient + * + * ReturnValue: + * Can Stitch + * + * Example: + * [player, cursorTarget] call ace_medical_treatment_fnc_canStitch + * + * Public: No + */ + +params ["", "_patient"]; + +!((_patient getVariable [QEGVAR(medical,bandagedWounds), []]) isEqualTo []) diff --git a/addons/medical_treatment/functions/fnc_treatmentFullHealLocal.sqf b/addons/medical_treatment/functions/fnc_treatmentFullHealLocal.sqf index c31423e87a..4dfa555828 100644 --- a/addons/medical_treatment/functions/fnc_treatmentFullHealLocal.sqf +++ b/addons/medical_treatment/functions/fnc_treatmentFullHealLocal.sqf @@ -16,6 +16,17 @@ params ["_target"]; if (!alive _target) exitWith {}; +// Treatment conditions would normally limit this to non-unconc units, but treatment event may be called externally (zeus) +if (_target getVariable [QEGVAR(medical,inCardiacArrest), false]) then { + TRACE_1("exiting cardiac arrest",_target); + [QEGVAR(medical,CPRSucceeded), _target] call CBA_fnc_localEvent; +}; +if (_target getVariable ["ACE_isUnconscious",false]) then { + TRACE_1("waking up",_target); // wake up first or unconc variables will be reset + [QEGVAR(medical,WakeUp), _target] call CBA_fnc_localEvent; +}; + + _target setVariable [VAR_PAIN, 0, true]; _target setVariable [VAR_BLOOD_VOL, DEFAULT_BLOOD_VOLUME, true]; diff --git a/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf b/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf index 5c056757f5..e5fbc51704 100644 --- a/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf +++ b/addons/medical_vitals/functions/fnc_handleUnitVitals.sqf @@ -76,7 +76,9 @@ private _tourniquets = GET_TOURNIQUETS(_unit); _tourniquetPain = _tourniquetPain max (CBA_missionTime - _x - 120) * 0.001; }; } forEach _tourniquets; -[_unit, _tourniquetPain] call EFUNC(medical_status,adjustPainLevel); +if (_tourniquetPain > 0) then { + [_unit, _tourniquetPain] call EFUNC(medical_status,adjustPainLevel); +}; private _heartRate = [_unit, _deltaT, _syncValues] call FUNC(updateHeartRate); [_unit, _deltaT, _syncValues] call FUNC(updatePainSuppress); diff --git a/addons/overheating/functions/fnc_overheat.sqf b/addons/overheating/functions/fnc_overheat.sqf index cff8807003..f1eb7b16c0 100644 --- a/addons/overheating/functions/fnc_overheat.sqf +++ b/addons/overheating/functions/fnc_overheat.sqf @@ -33,12 +33,12 @@ if (isNil "_energyIncrement") then { // If the bullet mass is not configured, estimate it _bulletMass = 3.4334 + 0.5171 * (getNumber (configFile >> "CfgAmmo" >> _ammo >> "hit") + getNumber (configFile >> "CfgAmmo" >> _ammo >> "caliber")); }; - + // Projectile motion is roughly equal to Barrel heat // Ref: https://en.wikipedia.org/wiki/Physics_of_firearms // Muzzle Engergy = 1/2 * m * v^2 = (1/2 * 0.001 g/kg * bulletMass (grams) * v^2) // Multiple by 3 becase we only calc every 3rd bullet: (3 * 1/2 * 0.001) = 0.0015 - private _energyIncrement = 0.0015 * _bulletMass * (vectorMagnitudeSqr velocity _projectile); + _energyIncrement = 0.0015 * _bulletMass * (vectorMagnitudeSqr velocity _projectile); GVAR(cacheAmmoData) setVariable [_ammo, _energyIncrement]; }; diff --git a/addons/repair/functions/fnc_getHitPointString.sqf b/addons/repair/functions/fnc_getHitPointString.sqf index 8394b4f5ac..7439d35c12 100644 --- a/addons/repair/functions/fnc_getHitPointString.sqf +++ b/addons/repair/functions/fnc_getHitPointString.sqf @@ -33,6 +33,7 @@ if (_track) then { }; // Prepare first part of the string from stringtable +//IGNORE_STRING_WARNING(str_ace_repair_hit); private _text = LSTRING(Hit); // Remove "Hit" from hitpoint name if one exists diff --git a/addons/vehicles/XEH_preInit.sqf b/addons/vehicles/XEH_preInit.sqf index b47cf6628d..028a8aec1c 100644 --- a/addons/vehicles/XEH_preInit.sqf +++ b/addons/vehicles/XEH_preInit.sqf @@ -6,4 +6,37 @@ PREP_RECOMPILE_START; #include "XEH_PREP.hpp" PREP_RECOMPILE_END; +#include "initSettings.sqf" + +[ + "AllVehicles", + "initPost", + { + params ["_vehicle"]; + _vehicle setVariable [QGVAR(engineState), isEngineOn _vehicle]; + } +] call CBA_fnc_addClassEventHandler; +[ + "AllVehicles", + "engine", + { + params ["_vehicle", "_state"]; + _vehicle setVariable [QGVAR(engineState), _state]; + } +] call CBA_fnc_addClassEventHandler; +[ + "AllVehicles", + "getout", + { + params ["_vehicle", "_position", "_unit"]; + if (!GVAR(keepEngineRunning)) exitWith {}; + if (_unit == ACE_player && {_position == "driver" && {_vehicle getVariable [QGVAR(engineState), false]}}) then { + [{ + params ["_vehicle"]; + [QEGVAR(common,engineOn), _this, _vehicle] call CBA_fnc_targetEvent; + }, [_vehicle, true]] call CBA_fnc_execNextFrame; + }; + } +] call CBA_fnc_addClassEventHandler; + ADDON = true; diff --git a/addons/vehicles/initSettings.sqf b/addons/vehicles/initSettings.sqf new file mode 100644 index 0000000000..026367a794 --- /dev/null +++ b/addons/vehicles/initSettings.sqf @@ -0,0 +1,9 @@ + +[ + QGVAR(keepEngineRunning), + "CHECKBOX", + [LSTRING(SettingKeepEngineRunningName), LSTRING(SettingKeepEngineRunningDesc)], + localize ELSTRING(common,ACEKeybindCategoryVehicles), + false, // default value + true // isGlobal +] call CBA_settings_fnc_init; diff --git a/addons/vehicles/stringtable.xml b/addons/vehicles/stringtable.xml index b2d282b305..271c788ad3 100644 --- a/addons/vehicles/stringtable.xml +++ b/addons/vehicles/stringtable.xml @@ -67,5 +67,13 @@ 速度制限を減らす Zmniejsz ograniczenie prędkości + + Disable automatic engine shut-off + Motor nach Verlassen laufen lassen + + + Prevent the automatic shut-off of the engine when exiting vehicles. + Verhindere das automatische Abschalten des Motors beim Verlassen des Fahrzeugs. + diff --git a/addons/zeus/functions/fnc_moduleHeal.sqf b/addons/zeus/functions/fnc_moduleHeal.sqf index 647112f67a..287a84ac79 100644 --- a/addons/zeus/functions/fnc_moduleHeal.sqf +++ b/addons/zeus/functions/fnc_moduleHeal.sqf @@ -43,8 +43,9 @@ switch (false) do { }; // Heal validated target -if (["ace_medical"] call EFUNC(common,isModLoaded) && {EGVAR(medical,level) > 0}) then { - [QEGVAR(medical,treatmentAdvanced_fullHealLocal), [_unit, _unit], _unit] call CBA_fnc_targetEvent; +if (["ace_medical"] call EFUNC(common,isModLoaded)) then { + TRACE_1("healing with ace_medical",_unit); + [QEGVAR(medical_treatment,treatmentFullHealLocal), [_unit], _unit] call CBA_fnc_targetEvent; } else { // BI's scripted revive system if ((missionNamespace getVariable ["bis_revive_mode", 0]) != 0) then { diff --git a/addons/zeus/functions/fnc_moduleUnconscious.sqf b/addons/zeus/functions/fnc_moduleUnconscious.sqf index ff1948dd92..9bcec2cdcb 100644 --- a/addons/zeus/functions/fnc_moduleUnconscious.sqf +++ b/addons/zeus/functions/fnc_moduleUnconscious.sqf @@ -37,9 +37,9 @@ if (isNil QEFUNC(medical,setUnconscious)) then { if !(alive _unit) then { [LSTRING(OnlyAlive)] call FUNC(showMessage); } else { - private _conscious = GETVAR(_unit,ACE_isUnconscious,false); + private _unconscious = GETVAR(_unit,ACE_isUnconscious,false); // Function handles locality for me - [_unit, !_conscious, 10e10] call EFUNC(medical,setUnconscious); + [_unit, !_unconscious, 10e10] call EFUNC(medical,setUnconscious); }; }; }; diff --git a/circle.yml b/circle.yml index 77b01ba205..5cd5f0d72d 100644 --- a/circle.yml +++ b/circle.yml @@ -6,8 +6,8 @@ jobs: steps: - checkout - run: - name: Validate SQF and Config style - command: python tools/sqf_validator.py && python tools/config_style_checker.py + name: Validate SQF and Config style and Stringtable entries + command: python tools/sqf_validator.py && python tools/config_style_checker.py && python tools/check_strings.py linting: docker: diff --git a/optionals/compat_rhs_usf3/CfgMagazineWells.hpp b/optionals/compat_rhs_usf3/CfgMagazineWells.hpp new file mode 100644 index 0000000000..7ee767c4a9 --- /dev/null +++ b/optionals/compat_rhs_usf3/CfgMagazineWells.hpp @@ -0,0 +1,8 @@ +class CfgMagazineWells { + class ace_hellfire_K { + ADDON[] = {QGVAR(pylon_mag_2rnd_hellfire_k)}; + }; + class ace_hellfire_N { + ADDON[] = {GVAR(pylon_mag_2rnd_hellfire_n)}; + }; +}; diff --git a/optionals/compat_rhs_usf3/CfgMagazines.hpp b/optionals/compat_rhs_usf3/CfgMagazines.hpp index 9e595fddfb..1f692792f0 100644 --- a/optionals/compat_rhs_usf3/CfgMagazines.hpp +++ b/optionals/compat_rhs_usf3/CfgMagazines.hpp @@ -23,4 +23,17 @@ class cfgMagazines { EGVAR(overpressure,range) = 0; EGVAR(overpressure,damage) = 0; }; + + class rhs_mag_AGM114K_2; + class GVAR(pylon_mag_2rnd_hellfire_k): rhs_mag_AGM114K_2 { + displayName = "2x AGM-114K [ACE]"; + pylonWeapon = "ace_hellfire_launcher"; + ammo = "ACE_Hellfire_AGM114K"; + }; + class GVAR(pylon_mag_2rnd_hellfire_n): rhs_mag_AGM114K_2 { + displayName = "2x AGM-114N [ACE]"; + pylonWeapon = "ace_hellfire_launcher_N"; + ammo = "ACE_Hellfire_AGM114N"; + }; + }; diff --git a/optionals/compat_rhs_usf3/config.cpp b/optionals/compat_rhs_usf3/config.cpp index 5847a2ac40..59aaa625bd 100644 --- a/optionals/compat_rhs_usf3/config.cpp +++ b/optionals/compat_rhs_usf3/config.cpp @@ -17,6 +17,7 @@ class CfgPatches { #include "CfgAmmo.hpp" #include "CfgEventHandlers.hpp" #include "CfgMagazines.hpp" +#include "CfgMagazineWells.hpp" #include "CfgWeapons.hpp" #include "CfgVehicles.hpp" #include "CfgGlasses.hpp" diff --git a/optionals/nocrosshair/CfgInGameUI.hpp b/optionals/nocrosshair/CfgInGameUI.hpp deleted file mode 100644 index cdaf4eba78..0000000000 --- a/optionals/nocrosshair/CfgInGameUI.hpp +++ /dev/null @@ -1,6 +0,0 @@ - -class CfgInGameUI { - class Cursor { - weapon = ""; // "\A3\ui_f\data\igui\cfg\cursors\weapon_ca.paa"; - }; -}; diff --git a/optionals/nocrosshair/CfgWeaponCursors.hpp b/optionals/nocrosshair/CfgWeaponCursors.hpp new file mode 100644 index 0000000000..57cef92ae4 --- /dev/null +++ b/optionals/nocrosshair/CfgWeaponCursors.hpp @@ -0,0 +1,27 @@ +#define EMPTY_TEXTURE(weapon) \ + class weapon: default { \ + texture = ""; \ + } + +class CfgWeaponCursors { + class default; + EMPTY_TEXTURE(arifle); + EMPTY_TEXTURE(mg); + EMPTY_TEXTURE(srifle); + EMPTY_TEXTURE(smg); + EMPTY_TEXTURE(hgun); + EMPTY_TEXTURE(sgun); + EMPTY_TEXTURE(gl); + EMPTY_TEXTURE(throw); + EMPTY_TEXTURE(put); + EMPTY_TEXTURE(missile); + EMPTY_TEXTURE(rocket); + EMPTY_TEXTURE(bomb); + EMPTY_TEXTURE(cannon); + EMPTY_TEXTURE(mortar); + EMPTY_TEXTURE(coil); + EMPTY_TEXTURE(laserdesignator); + // if these classes have empty texture the crosshair appears + // EMPTY_TEXTURE(cursorAim); + // EMPTY_TEXTURE(cursorAimOn); +}; diff --git a/optionals/nocrosshair/config.cpp b/optionals/nocrosshair/config.cpp index b7528917ef..1e5f0f3bc5 100644 --- a/optionals/nocrosshair/config.cpp +++ b/optionals/nocrosshair/config.cpp @@ -15,4 +15,4 @@ class CfgPatches { }; }; -#include "CfgInGameUI.hpp" +#include "CfgWeaponCursors.hpp" diff --git a/tools/check_strings.py b/tools/check_strings.py new file mode 100644 index 0000000000..78ad52b04e --- /dev/null +++ b/tools/check_strings.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 +# PabstMirror +# Checks all strings are defined, run with -u to return all unused strings + +import fnmatch +import os +import re +import sys + +def getDefinedStrings(filepath): + # print("getDefinedStrings {0}".format(filepath)) + with open(filepath, 'r', encoding="latin-1") as file: + content = file.read() + srch = re.compile('Key ID\=\"(STR_ACE_[_a-zA-Z0-9]*)"', re.IGNORECASE) + modStrings = srch.findall(content) + modStrings = [s.lower() for s in modStrings] + return modStrings + +def getStringUsage(filepath): + selfmodule = (re.search('addons[\W]*([_a-zA-Z0-9]*)', filepath)).group(1) + # print("Checking {0} from {1}".format(filepath,selfmodule)) + fileStrings = [] + + with open(filepath, 'r') as file: + content = file.read() + + srch = re.compile('(STR_ACE_[_a-zA-Z0-9]*)', re.IGNORECASE) + fileStrings = srch.findall(content) + + srch = re.compile('[^E][CL]STRING\(([_a-zA-Z0-9]*)\)', re.IGNORECASE) + modStrings = srch.findall(content) + for localString in modStrings: + fileStrings.append("STR_ACE_{0}_{1}".format(selfmodule, localString)) + + srch = re.compile('E[CL]STRING\(([_a-zA-Z0-9]*),([_a-zA-Z0-9]*)\)') + exStrings = srch.findall(content) + for (exModule, exString) in exStrings: + fileStrings.append("STR_ACE_{0}_{1}".format(exModule, exString)) + + srch = re.compile('IGNORE_STRING_WARNING\([\'"]*([_a-zA-Z0-9]*)[\'"]*\)') + ignoreWarnings = srch.findall(content) + + fileStrings = [s.lower() for s in fileStrings] + return [s for s in fileStrings if s not in (i.lower() for i in ignoreWarnings)] + +def main(argv): + print("### check_strings.py {} ###".format(argv)) + sqf_list = [] + xml_list = [] + + allDefinedStrings = [] + allUsedStrings = [] + + # Allow running from root directory as well as from inside the tools directory + rootDir = "../addons" + if (os.path.exists("addons")): + rootDir = "addons" + + for root, dirnames, filenames in os.walk(rootDir): + for filename in fnmatch.filter(filenames, '*.sqf'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.cpp'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.hpp'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.h'): + sqf_list.append(os.path.join(root, filename)) + + for filename in fnmatch.filter(filenames, '*.xml'): + xml_list.append(os.path.join(root, filename)) + + for filename in xml_list: + allDefinedStrings = allDefinedStrings + getDefinedStrings(filename) + for filename in sqf_list: + allUsedStrings = allUsedStrings + getStringUsage(filename) + + allDefinedStrings = list(sorted(set(allDefinedStrings))) + allUsedStrings = list(sorted(set(allUsedStrings))) + + print("-----------") + countUnusedStrings = 0 + countUndefinedStrings = 0 + for s in allDefinedStrings: + if (not (s in allUsedStrings)): + countUnusedStrings = countUnusedStrings + 1; + if ("-u" in argv): + print("String {} defined but not used".format(s)) + print("-----------") + for s in allUsedStrings: + if (not (s in allDefinedStrings)): + print("String {} not defined".format(s)) + countUndefinedStrings = countUndefinedStrings + 1; + print("-----------") + + print("Defined Strings:{0} Used Strings:{1}".format(len(allDefinedStrings),len(allUsedStrings))) + print("Unused Strings:{0} Undefined Strings:{1}".format(countUnusedStrings,countUndefinedStrings)) + + return countUndefinedStrings + +if __name__ == "__main__": + main(sys.argv)