diff --git a/README.md b/README.md
index b461bfe520..4951848123 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@
-
+
diff --git a/addons/arsenal/XEH_preInit.sqf b/addons/arsenal/XEH_preInit.sqf
index df4da91338..7002886f77 100644
--- a/addons/arsenal/XEH_preInit.sqf
+++ b/addons/arsenal/XEH_preInit.sqf
@@ -12,57 +12,10 @@ PREP_RECOMPILE_END;
#include "initSettings.inc.sqf"
// Arsenal events
-[QGVAR(statsToggle), {
- params ["_display", "_showStats"];
-
- private _statsCtrlGroupCtrl = _display displayCtrl IDC_statsBox;
- private _statsPreviousPageCtrl = _display displayCtrl IDC_statsPreviousPage;
- private _statsNextPageCtrl = _display displayCtrl IDC_statsNextPage;
- private _statsCurrentPageCtrl = _display displayCtrl IDC_statsCurrentPage;
-
- {
- _x ctrlShow (GVAR(showStats) && {_showStats});
- } forEach [
- _statsCtrlGroupCtrl,
- _statsPreviousPageCtrl,
- _statsNextPageCtrl,
- _statsCurrentPageCtrl
- ];
-}] call CBA_fnc_addEventHandler;
-
-[QGVAR(statsChangePage), {
- _this call FUNC(buttonStatsPage);
-}] call CBA_fnc_addEventHandler;
-
-[QGVAR(displayStats), {
- _this call FUNC(handleStats);
-}] call CBA_fnc_addEventHandler;
-
-[QGVAR(actionsChangePage), {
- _this call FUNC(buttonActionsPage);
-}] call CBA_fnc_addEventHandler;
-
-[QGVAR(displayActions), {
- _this call FUNC(handleActions);
-}] call CBA_fnc_addEventHandler;
-
-[QGVAR(actionsToggle), {
- params ["_display", "_showActions"];
-
- private _actionsCtrlGroupCtrl = _display displayCtrl IDC_actionsBox;
- private _actionsPreviousPageCtrl = _display displayCtrl IDC_actionsPreviousPage;
- private _actionsNextPageCtrl = _display displayCtrl IDC_actionsNextPage;
- private _actionsCurrentPageCtrl = _display displayCtrl IDC_actionsCurrentPage;
-
- {
- _x ctrlShow (GVAR(showActions) && {_showActions});
- } forEach [
- _actionsCtrlGroupCtrl,
- _actionsPreviousPageCtrl,
- _actionsNextPageCtrl,
- _actionsCurrentPageCtrl
- ];
-}] call CBA_fnc_addEventHandler;
+[QGVAR(statsChangePage), LINKFUNC(buttonStatsPage)] call CBA_fnc_addEventHandler;
+[QGVAR(displayStats), LINKFUNC(handleStats)] call CBA_fnc_addEventHandler;
+[QGVAR(actionsChangePage), LINKFUNC(buttonActionsPage)] call CBA_fnc_addEventHandler;
+[QGVAR(displayActions), LINKFUNC(handleActions)] call CBA_fnc_addEventHandler;
call FUNC(compileActions);
call FUNC(compileSorts);
@@ -86,5 +39,4 @@ call FUNC(compileStats);
// Setup Tools tab
[keys (uiNamespace getVariable [QGVAR(configItemsTools), createHashMap]), LLSTRING(toolsTab), TOOLS_TAB_ICON, -1, true] call FUNC(addRightPanelButton);
-
ADDON = true;
diff --git a/addons/arsenal/functions/fnc_buttonActionsPage.sqf b/addons/arsenal/functions/fnc_buttonActionsPage.sqf
index 17da357100..d135cc6a80 100644
--- a/addons/arsenal/functions/fnc_buttonActionsPage.sqf
+++ b/addons/arsenal/functions/fnc_buttonActionsPage.sqf
@@ -2,12 +2,12 @@
#include "..\defines.hpp"
/*
* Author: Brett Mayson
- * Handles the previous / next page buttons for actions
+ * Handles the previous / next page buttons for actions.
*
* Arguments:
* 0: Arsenal display
- * 1: Actions control
- * 2: Previous or next (false = previous, true = next)
+ * 1: Actions page
+ * 2: Previous (false) or next (true) page
*
* Return Value:
* None
@@ -23,4 +23,5 @@ if !(ctrlEnabled _control) exitWith {};
GVAR(currentActionPage) = GVAR(currentActionPage) + ([-1, 1] select _nextPage);
GVAR(actionsInfo) params ["_panelControl", "_curSel", "_itemCfg"];
+
[QGVAR(displayActions), [_display, _panelControl, _curSel, _itemCfg]] call CBA_fnc_localEvent;
diff --git a/addons/arsenal/functions/fnc_buttonHide.sqf b/addons/arsenal/functions/fnc_buttonHide.sqf
index 6b6c84da93..d1bb5657b0 100644
--- a/addons/arsenal/functions/fnc_buttonHide.sqf
+++ b/addons/arsenal/functions/fnc_buttonHide.sqf
@@ -52,10 +52,20 @@ private _ctrl = controlNull;
IDC_buttonCurrentMag2,
IDC_iconBackgroundCurrentMag,
IDC_iconBackgroundCurrentMag2,
+ IDC_statsBox,
IDC_statsPreviousPage,
IDC_statsNextPage,
- IDC_statsCurrentPage
+ IDC_statsCurrentPage,
+ IDC_actionsBox,
+ IDC_actionsPreviousPage,
+ IDC_actionsNextPage,
+ IDC_actionsCurrentPage
];
-[QGVAR(statsToggle), [_display, _showToggle]] call CBA_fnc_localEvent;
-[QGVAR(actionsToggle), [_display, _showToggle]] call CBA_fnc_localEvent;
+if (!_showToggle) exitWith {};
+
+// When showing the stats/actions again, update them to fit with currently selected item
+GVAR(actionsInfo) params ["_control", "_curSel", "_itemCfg"];
+
+[QGVAR(displayStats), [_display, _control, _curSel, _itemCfg]] call CBA_fnc_localEvent;
+[QGVAR(displayActions), [_display, _control, _curSel, _itemCfg]] call CBA_fnc_localEvent;
diff --git a/addons/arsenal/functions/fnc_buttonStatsPage.sqf b/addons/arsenal/functions/fnc_buttonStatsPage.sqf
index bef2631f8c..a03aa6958a 100644
--- a/addons/arsenal/functions/fnc_buttonStatsPage.sqf
+++ b/addons/arsenal/functions/fnc_buttonStatsPage.sqf
@@ -20,8 +20,8 @@ params ["_display", "_control", "_nextPage"];
TRACE_1("control enabled", ctrlEnabled _control);
if !(ctrlEnabled _control) exitWith {};
-GVAR(currentStatPage) = [GVAR(currentStatPage) - 1, GVAR(currentStatPage) + 1] select _nextPage;
+GVAR(currentStatPage) = GVAR(currentStatPage) + ([-1, 1] select _nextPage);
-GVAR(statsInfo) params ["_isLeftPanel", "_panelControl", "_curSel", "_itemCfg"];
+GVAR(statsInfo) params ["", "_panelControl", "_curSel", "_itemCfg"];
[QGVAR(displayStats), [_display, _panelControl, _curSel, _itemCfg]] call CBA_fnc_localEvent;
diff --git a/addons/arsenal/functions/fnc_onArsenalClose.sqf b/addons/arsenal/functions/fnc_onArsenalClose.sqf
index bc862f2de0..2cce9b13ee 100644
--- a/addons/arsenal/functions/fnc_onArsenalClose.sqf
+++ b/addons/arsenal/functions/fnc_onArsenalClose.sqf
@@ -115,12 +115,11 @@ GVAR(currentVoice) = nil;
GVAR(currentInsignia) = nil;
GVAR(currentAction) = nil;
-GVAR(showStats) = nil;
GVAR(currentStatPage) = nil;
GVAR(statsInfo) = nil;
-GVAR(showActions) = nil;
GVAR(currentActionPage) = nil;
+GVAR(actionsInfo) = nil;
profileNamespace setVariable [QGVAR(favorites), GVAR(favorites)];
GVAR(favoritesOnly) = nil;
diff --git a/addons/arsenal/functions/fnc_onArsenalOpen.sqf b/addons/arsenal/functions/fnc_onArsenalOpen.sqf
index bcc91c133a..9077a13a7a 100644
--- a/addons/arsenal/functions/fnc_onArsenalOpen.sqf
+++ b/addons/arsenal/functions/fnc_onArsenalOpen.sqf
@@ -74,12 +74,11 @@ GVAR(currentInsignia) = GVAR(center) call BIS_fnc_getUnitInsignia;
GVAR(currentAction) = "Stand";
GVAR(shiftState) = false;
-GVAR(showStats) = true;
GVAR(currentStatPage) = 0;
GVAR(statsInfo) = [true, controlNull, nil, nil];
-GVAR(showActions) = true;
GVAR(currentActionPage) = 0;
+GVAR(actionsInfo) = [controlNull, nil, nil];
// Update current item list
call FUNC(updateCurrentItemsList);
diff --git a/addons/arsenal/functions/fnc_statTextStatement_scopeVisionMode.sqf b/addons/arsenal/functions/fnc_statTextStatement_scopeVisionMode.sqf
index dca83cb381..b4de06e772 100644
--- a/addons/arsenal/functions/fnc_statTextStatement_scopeVisionMode.sqf
+++ b/addons/arsenal/functions/fnc_statTextStatement_scopeVisionMode.sqf
@@ -67,7 +67,9 @@ if (!_primaryNVGSupported && {(_opticsModes select {_x select 1}) isEqualTo _opt
_primaryNVGSupported = true;
};
-if (_primaryNVGIntegrated) exitWith {LLSTRING(statVisionMode_IntPrim)};
+if (_primaryTiIntegrated && _primaryNVGIntegrated) exitWith {LLSTRING(statVisionMode_intPrimTi)};
+if (_primaryTiIntegrated) exitWith {LLSTRING(statVisionMode_ti)};
+if (_primaryNVGIntegrated) exitWith {LLSTRING(statVisionMode_intPrim)};
if (_primaryNVGSupported) exitWith {LLSTRING(statVisionMode_supPrim)};
if (_secondaryNVGSupported) exitWith {LLSTRING(statVisionMode_supSec)};
diff --git a/addons/arsenal/stringtable.xml b/addons/arsenal/stringtable.xml
index 7f6947d913..230795609f 100644
--- a/addons/arsenal/stringtable.xml
+++ b/addons/arsenal/stringtable.xml
@@ -1223,7 +1223,7 @@
Vedlejší část hledí podporuje
보조무기 지원여부
-
+
Primary integrated
Primaria integrada
Primär Integriert
@@ -1238,6 +1238,12 @@
Integrováno do hlavní části hledí
주무기 내장여부
+
+ Thermal integrated
+
+
+ Thermal & Primary integrated
+
Not Supported
No soportada
diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf
index f69a1e04a6..36c26871d6 100644
--- a/addons/common/XEH_postInit.sqf
+++ b/addons/common/XEH_postInit.sqf
@@ -29,7 +29,7 @@
["blockRadio", false, [QEGVAR(captives,Handcuffed), QEGVAR(captives,Surrendered), "ace_unconscious"]] call FUNC(statusEffect_addType);
["blockSpeaking", false, ["ace_unconscious"]] call FUNC(statusEffect_addType);
["disableWeaponAssembly", false, ["ace_common", "ace_common_lockVehicle", "ace_csw"]] call FUNC(statusEffect_addType);
-["lockInventory", true, []] call FUNC(statusEffect_addType);
+["lockInventory", true, [], true] call FUNC(statusEffect_addType);
[QGVAR(forceWalk), {
params ["_object", "_set"];
diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf
index 78c08d5e42..9b5d27d12c 100644
--- a/addons/common/XEH_preInit.sqf
+++ b/addons/common/XEH_preInit.sqf
@@ -32,6 +32,7 @@ ACE_COUNTERS = [];
GVAR(statusEffect_Names) = [];
GVAR(statusEffect_isGlobal) = [];
+GVAR(statusEffect_sendJIP) = [];
GVAR(setHearingCapabilityMap) = [];
diff --git a/addons/common/functions/fnc_getVehicleUAVCrew.sqf b/addons/common/functions/fnc_getVehicleUAVCrew.sqf
index 0ac91e644a..f991e08d57 100644
--- a/addons/common/functions/fnc_getVehicleUAVCrew.sqf
+++ b/addons/common/functions/fnc_getVehicleUAVCrew.sqf
@@ -17,4 +17,4 @@
params [["_vehicle", objNull, [objNull]]];
-crew _vehicle select {getText (configOf _x >> "simulation") == "UAVPilot"} // return
+(crew _vehicle) select {unitIsUAV _x} // return
diff --git a/addons/common/functions/fnc_statusEffect_addType.sqf b/addons/common/functions/fnc_statusEffect_addType.sqf
index 959ae8c2ef..44b39b10c9 100644
--- a/addons/common/functions/fnc_statusEffect_addType.sqf
+++ b/addons/common/functions/fnc_statusEffect_addType.sqf
@@ -5,8 +5,9 @@
*
* Arguments:
* 0: Status Effect Name, this should match a corresponding event name
- * 1: Send event globaly
+ * 1: Send event globally
* 2: Common Effect Reaons to pre-seed durring init
+ * 3: Send event to JIP (requires sending event globally)
*
* Return Value:
* None
@@ -17,14 +18,16 @@
* Public: No
*/
-params [["_name", "", [""]], ["_isGlobal", false, [false]], ["_commonReasonsArray", [], [[]]]];
+params [["_name", "", [""]], ["_isGlobal", false, [false]], ["_commonReasonsArray", [], [[]]], ["_sendJIP", false, [false]]];
TRACE_3("params",_name,_isGlobal,_commonReasonsArray);
if (_name == "") exitWith {ERROR_1("addStatusEffect - Bad Name %1", _this)};
if (_name in GVAR(statusEffect_Names)) exitWith {WARNING_1("addStatusEffect - Effect Already Added (note, will not update global bit) %1", _this)};
+if (_sendJIP && !_isGlobal) exitWith {WARNING_1("addStatusEffect - Trying to add non-global JIP effect %1",_this)};
GVAR(statusEffect_Names) pushBack _name;
GVAR(statusEffect_isGlobal) pushBack _isGlobal;
+GVAR(statusEffect_sendJIP) pushBack _sendJIP;
//We add reasons at any time, but more efficenet to add all common ones at one time during init
if (isServer && {_commonReasonsArray isNotEqualTo []}) then {
diff --git a/addons/common/functions/fnc_statusEffect_sendEffects.sqf b/addons/common/functions/fnc_statusEffect_sendEffects.sqf
index 10f7ffb30c..bae2807782 100644
--- a/addons/common/functions/fnc_statusEffect_sendEffects.sqf
+++ b/addons/common/functions/fnc_statusEffect_sendEffects.sqf
@@ -30,12 +30,21 @@ if (isNull _object) exitWith {};
TRACE_2("checking if event is nil",_x,_effectNumber);
if (_effectNumber != -1) then {
private _eventName = format [QGVAR(%1), _x];
- if (GVAR(statusEffect_isGlobal) select _forEachIndex) then {
- TRACE_2("Sending Global Event", _object, _effectNumber);
- [_eventName, [_object, _effectNumber]] call CBA_fnc_globalEvent;
- } else {
- TRACE_2("Sending Target Event", _object, _effectNumber);
- [_eventName, [_object, _effectNumber], _object] call CBA_fnc_targetEvent;
+ switch (true) do {
+ case (GVAR(statusEffect_sendJIP) select _forEachIndex): {
+ TRACE_2("Sending Global JIP Event", _object, _effectNumber);
+ private _jipID = format [QGVAR(effect_%1_%2), _eventName, hashValue _object];
+ [_eventName, [_object, _effectNumber], _jipID] call CBA_fnc_globalEventJIP;
+ [_jipID, _object] call CBA_fnc_removeGlobalEventJIP;
+ };
+ case (GVAR(statusEffect_isGlobal) select _forEachIndex): {
+ TRACE_2("Sending Global Event", _object, _effectNumber);
+ [_eventName, [_object, _effectNumber]] call CBA_fnc_globalEvent;
+ };
+ default {
+ TRACE_2("Sending Target Event", _object, _effectNumber);
+ [_eventName, [_object, _effectNumber], _object] call CBA_fnc_targetEvent;
+ };
};
};
};
diff --git a/addons/compat_cup_units/$PBOPREFIX$ b/addons/compat_cup_units/$PBOPREFIX$
new file mode 100644
index 0000000000..7a3dc51ddd
--- /dev/null
+++ b/addons/compat_cup_units/$PBOPREFIX$
@@ -0,0 +1 @@
+z\ace\addons\compat_cup_units
diff --git a/addons/compat_cup_units/CfgWeapons.hpp b/addons/compat_cup_units/CfgWeapons.hpp
new file mode 100644
index 0000000000..37a210db9d
--- /dev/null
+++ b/addons/compat_cup_units/CfgWeapons.hpp
@@ -0,0 +1,87 @@
+#define HEARING(CLASSNAME) \
+ class CLASSNAME: ItemCore { \
+ ace_hearing_protection = 0.75; \
+ ace_hearing_lowerVolume = 0; \
+ }
+
+#define HEARING_PARENT(CLASSNAME,PARENT) \
+ class CLASSNAME: PARENT { \
+ ace_hearing_protection = 0.75; \
+ ace_hearing_lowerVolume = 0; \
+ }
+
+class CfgWeapons {
+ class ItemCore;
+ class CUP_H_PMC_Beanie_Khaki;
+
+ HEARING(CUP_H_BAF_DDPM_Mk6_CREW_PRR);
+ HEARING(CUP_H_BAF_DPM_Mk6_CREW_PRR);
+ HEARING(CUP_H_BAF_MTP_Mk6_CREW_PRR);
+ HEARING(CUP_H_CZ_Cap_Headphones);
+ HEARING(CUP_H_CZ_Cap_Headphones_des);
+ HEARING(CUP_H_CZ_Helmet05);
+ HEARING(CUP_H_CZ_Helmet07);
+ HEARING(CUP_H_CZ_Helmet08);
+ HEARING(CUP_H_CZ_Helmet09);
+ HEARING(CUP_H_CZ_Helmet10);
+ HEARING(CUP_H_FR_ECH);
+ HEARING(CUP_H_Ger_Beret_TankCommander_Blk);
+ HEARING(CUP_H_Ger_Beret_TankCommander_Grn);
+ HEARING(CUP_H_Ger_Cap_EP_Grn1);
+ HEARING(CUP_H_Ger_Cap_EP_Grn2);
+ HEARING(CUP_H_Ger_Cap_EP_Tan1);
+ HEARING(CUP_H_Ger_Cap_EP_Tan2);
+ HEARING(CUP_H_OpsCore_Black);
+ HEARING(CUP_H_OpsCore_Black_SF);
+ HEARING(CUP_H_OpsCore_Covered_AAF);
+ HEARING(CUP_H_OpsCore_Covered_AAF_SF);
+ HEARING(CUP_H_OpsCore_Covered_Fleck);
+ HEARING(CUP_H_OpsCore_Covered_Fleck_SF);
+ HEARING(CUP_H_OpsCore_Covered_MCAM);
+ HEARING(CUP_H_OpsCore_Covered_MCAM_SF);
+ HEARING(CUP_H_OpsCore_Covered_MCAM_US);
+ HEARING(CUP_H_OpsCore_Covered_MCAM_US_SF);
+ HEARING(CUP_H_OpsCore_Covered_MTP);
+ HEARING(CUP_H_OpsCore_Covered_MTP_SF);
+ HEARING(CUP_H_OpsCore_Covered_Tigerstripe);
+ HEARING(CUP_H_OpsCore_Covered_Tigerstripe_SF);
+ HEARING(CUP_H_OpsCore_Covered_Tropen);
+ HEARING(CUP_H_OpsCore_Covered_Tropen_SF);
+ HEARING(CUP_H_OpsCore_Covered_UCP);
+ HEARING(CUP_H_OpsCore_Covered_UCP_SF);
+ HEARING(CUP_H_OpsCore_Green);
+ HEARING(CUP_H_OpsCore_Green_SF);
+ HEARING(CUP_H_OpsCore_Grey);
+ HEARING(CUP_H_OpsCore_Grey_SF);
+ HEARING(CUP_H_OpsCore_Spray);
+ HEARING(CUP_H_OpsCore_Spray_SF);
+ HEARING(CUP_H_OpsCore_Spray_US);
+ HEARING(CUP_H_OpsCore_Spray_US_SF);
+ HEARING(CUP_H_OpsCore_Tan);
+ HEARING(CUP_H_OpsCore_Tan_SF);
+ HEARING_PARENT(CUP_H_PMC_Beanie_Headphones_Khaki,CUP_H_PMC_Beanie_Khaki);
+ HEARING_PARENT(CUP_H_PMC_Beanie_Headphones_Black,CUP_H_PMC_Beanie_Headphones_Khaki);
+ HEARING_PARENT(CUP_H_PMC_Beanie_Headphones_Winter,CUP_H_PMC_Beanie_Headphones_Khaki);
+ HEARING(CUP_H_PMC_Cap_Back_EP_Grey);
+ HEARING(CUP_H_PMC_Cap_Back_EP_Tan);
+ HEARING(CUP_H_PMC_Cap_EP_Grey);
+ HEARING(CUP_H_PMC_Cap_EP_Tan);
+ HEARING(CUP_H_PMC_EP_Headset);
+ HEARING(CUP_H_USArmy_HelmetMICH_earpro);
+ HEARING(CUP_H_USArmy_HelmetMICH_earpro_DCU);
+ HEARING(CUP_H_USArmy_HelmetMICH_earpro_ess);
+ HEARING(CUP_H_USArmy_HelmetMICH_earpro_ess_DCU);
+ HEARING(CUP_H_USArmy_HelmetMICH_earpro_ess_wdl);
+ HEARING(CUP_H_USArmy_HelmetMICH_earpro_wdl);
+ HEARING(CUP_H_USArmy_Helmet_ECH1_Black);
+ HEARING(CUP_H_USArmy_Helmet_ECH1_Green);
+ HEARING(CUP_H_USArmy_Helmet_ECH1_Sand);
+ HEARING(CUP_H_USArmy_Helmet_ECH2_Black);
+ HEARING(CUP_H_USArmy_Helmet_ECH2_GREEN);
+ HEARING(CUP_H_USArmy_Helmet_ECH2_Sand);
+ HEARING(CUP_H_USMC_Crew_Helmet);
+ HEARING(CUP_H_USMC_MICH2000_DEF_DES);
+ HEARING(CUP_H_USMC_MICH2000_DEF_ESS_DES);
+ HEARING(CUP_H_USMC_MICH2000_DEF_ESS_WDL);
+ HEARING(CUP_H_USMC_MICH2000_DEF_WDL);
+};
diff --git a/addons/compat_cup_units/compat_cup_nouniformrestrictions/CfgVehicles.hpp b/addons/compat_cup_units/compat_cup_nouniformrestrictions/CfgVehicles.hpp
new file mode 100644
index 0000000000..386cc7df0b
--- /dev/null
+++ b/addons/compat_cup_units/compat_cup_nouniformrestrictions/CfgVehicles.hpp
@@ -0,0 +1,86 @@
+class CfgVehicles {
+ class SoldierWB;
+ class Civilian_F;
+
+ class CUP_BAF_Soldier_DPM_Base: SoldierWB {
+ modelSides[] = {6};
+ };
+ class CUP_BAF_Soldier_DDPM_Base: SoldierWB {
+ modelSides[] = {6};
+ };
+ class CUP_BAF_Soldier_MTP_Base: SoldierWB {
+ modelSides[] = {6};
+ };
+ class CUP_Creatures_Military_GER_Soldier_Base: SoldierWB {
+ modelSides[] = {6};
+ };
+ class CUP_Creatures_Military_NAPA_Soldier_Base: SoldierWB {
+ modelSides[] = {6};
+ };
+ class CUP_Creatures_Military_PMC_Soldier_Base: SoldierWB {
+ modelSides[] = {6};
+ };
+ class CUP_Creatures_Military_PMC_Soldier_Winter_Base: SoldierWB {
+ modelSides[] = {6};
+ };
+ class CUP_Creatures_Military_RUS_Soldier_Base: SoldierWB {
+ modelSides[] = {6};
+ };
+ class CUP_Creatures_Military_TK_Soldier_Base: SoldierWB {
+ modelSides[] = {6};
+ };
+ class CUP_Creatures_Military_TKI_Insurgent_Base: SoldierWB {
+ modelSides[] = {6};
+ };
+ class CUP_Creatures_Military_TKG_Guerrilla_Base: SoldierWB {
+ modelSides[] = {6};
+ };
+ class CUP_Creatures_Military_USMC_Soldier_Base: SoldierWB {
+ modelSides[] = {6};
+ };
+ class CUP_Creatures_Military_FR_Soldier_Base: SoldierWB {
+ modelSides[] = {6};
+ };
+ class CUP_Creatures_Civil_Chernarus_Base: Civilian_F {
+ modelSides[] = {6};
+ };
+ class CUP_Creatures_Civil_Takistan_Base: Civilian_F {
+ modelSides[] = {6};
+ };
+ class CUP_Creatures_Military_ACR_Soldier_Base: SoldierWB {
+ modelSides[] = {6};
+ };
+ class CUP_Creatures_Military_CDF_Soldier_Base: SoldierWB {
+ modelSides[] = {6};
+ };
+ class CUP_Creatures_Military_UNO_Soldier_Base: SoldierWB {
+ modelSides[] = {6};
+ };
+ class CUP_Creatures_Military_OPFINS_Soldier_Base: SoldierWB {
+ modelSides[] = {6};
+ };
+ class CUP_Creatures_Military_RACS_Soldier_Base: SoldierWB {
+ modelSides[] = {6};
+ };
+ class CUP_Creatures_Military_SLA_Soldier_Base: SoldierWB {
+ modelSides[] = {6};
+ };
+ class CUP_Creatures_Military_USA_Soldier_ACU_Base: SoldierWB {
+ modelSides[] = {6};
+ };
+ class CUP_Creatures_Military_USA_Soldier_Base: SoldierWB {
+ modelSides[] = {6};
+ };
+ class CUP_Creatures_Military_HIL_Reservist_Base: SoldierWB {
+ modelSides[] = {6};
+ };
+ class CUP_Creatures_Military_HIL_Recon_Base: SoldierWB {
+ modelSides[] = {6};
+ };
+ class CUP_Creatures_Military_HIL_Man_Base: SoldierWB {
+ modelSides[] = {6};
+ };
+ class CUP_Creatures_Military_HIL_SF_Base: SoldierWB {
+ modelSides[] = {6};
+ };
+};
diff --git a/addons/compat_cup_units/compat_cup_nouniformrestrictions/config.cpp b/addons/compat_cup_units/compat_cup_nouniformrestrictions/config.cpp
new file mode 100644
index 0000000000..826f796226
--- /dev/null
+++ b/addons/compat_cup_units/compat_cup_nouniformrestrictions/config.cpp
@@ -0,0 +1,21 @@
+#include "script_component.hpp"
+
+class CfgPatches {
+ class SUBADDON {
+ name = COMPONENT_NAME;
+ units[] = {};
+ weapons[] = {};
+ requiredVersion = REQUIRED_VERSION;
+ requiredAddons[] = {
+ "CUP_Creatures_People_LoadOrder",
+ "ace_nouniformrestrictions"
+ };
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ authors[] = {"Mike", "Jonpas"};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+ };
+};
+
+#include "CfgVehicles.hpp"
diff --git a/addons/compat_cup_units/compat_cup_nouniformrestrictions/script_component.hpp b/addons/compat_cup_units/compat_cup_nouniformrestrictions/script_component.hpp
new file mode 100644
index 0000000000..0b98185fa0
--- /dev/null
+++ b/addons/compat_cup_units/compat_cup_nouniformrestrictions/script_component.hpp
@@ -0,0 +1,3 @@
+#define SUBCOMPONENT nouniformrestrictions
+#define SUBCOMPONENT_BEAUTIFIED No Uniform Restrictions
+#include "..\script_component.hpp"
diff --git a/addons/compat_cup_units/config.cpp b/addons/compat_cup_units/config.cpp
new file mode 100644
index 0000000000..bde1052a11
--- /dev/null
+++ b/addons/compat_cup_units/config.cpp
@@ -0,0 +1,18 @@
+#include "script_component.hpp"
+
+class CfgPatches {
+ class ADDON {
+ name = COMPONENT_NAME;
+ units[] = {};
+ weapons[] = {};
+ requiredVersion = REQUIRED_VERSION;
+ requiredAddons[] = {"CUP_Creatures_People_LoadOrder"};
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ authors[] = {"Mike", "Jonpas"};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+ };
+};
+
+#include "CfgWeapons.hpp"
diff --git a/addons/compat_cup_units/script_component.hpp b/addons/compat_cup_units/script_component.hpp
new file mode 100644
index 0000000000..46e1542b50
--- /dev/null
+++ b/addons/compat_cup_units/script_component.hpp
@@ -0,0 +1,5 @@
+#define COMPONENT compat_cup_units
+#define COMPONENT_BEAUTIFIED CUP Units Compatibility
+
+#include "\z\ace\addons\main\script_mod.hpp"
+#include "\z\ace\addons\main\script_macros.hpp"
diff --git a/addons/cookoff/functions/fnc_cookOff.sqf b/addons/cookoff/functions/fnc_cookOff.sqf
index 1d598cdb96..57cde71682 100644
--- a/addons/cookoff/functions/fnc_cookOff.sqf
+++ b/addons/cookoff/functions/fnc_cookOff.sqf
@@ -36,7 +36,7 @@ _vehicle setVariable [QGVAR(isCookingOff), true, true];
// limit maximum value of intensity to prevent very long cook-off times
_intensity = _intensity min _maxIntensity;
-private _config = _vehicle call CBA_fnc_getObjectConfig;
+private _config = configOf _vehicle;
private _positions = getArray (_config >> QGVAR(cookoffSelections)) select {(_vehicle selectionPosition _x) isNotEqualTo [0,0,0]};
if (_positions isEqualTo []) then {
diff --git a/addons/cookoff/functions/fnc_cookOffEffect.sqf b/addons/cookoff/functions/fnc_cookOffEffect.sqf
index a907f67606..44282f2f6b 100644
--- a/addons/cookoff/functions/fnc_cookOffEffect.sqf
+++ b/addons/cookoff/functions/fnc_cookOffEffect.sqf
@@ -40,7 +40,7 @@ if (isServer) then {
if (_ring) then {
private _intensity = 6;
private _radius = 1.5 * ((boundingBoxReal _obj) select 2);
- [QEGVAR(fire,addFireSource), [_obj, _radius, _intensity, _obj]] call CBA_fnc_localEvent;
+ [QEGVAR(fire,addFireSource), [_obj, _radius, _intensity, format [QGVAR(%1), hashValue _obj]]] call CBA_fnc_localEvent;
};
};
@@ -52,7 +52,7 @@ if (isServer) then {
deleteVehicle _light;
deleteVehicle _sound;
if (isServer) then {
- [QEGVAR(fire,removeFireSource), [_obj]] call CBA_fnc_localEvent;
+ [QEGVAR(fire,removeFireSource), [format [QGVAR(%1), hashValue _obj]]] call CBA_fnc_localEvent;
};
[_pfh] call CBA_fnc_removePerFrameHandler;
};
@@ -198,4 +198,3 @@ if (isServer) then {
];
}, 0, [_obj, _jet, _ring, _time, CBA_missionTime, _light, _fireSelection, _sound, _intensity]] call CBA_fnc_addPerFrameHandler;
-
diff --git a/addons/dragging/functions/fnc_startCarryLocal.sqf b/addons/dragging/functions/fnc_startCarryLocal.sqf
index af889cd358..b4fb05c7a9 100644
--- a/addons/dragging/functions/fnc_startCarryLocal.sqf
+++ b/addons/dragging/functions/fnc_startCarryLocal.sqf
@@ -20,7 +20,7 @@
params ["_unit", "_target", "_claimed"];
TRACE_3("params",_unit,_target,_claimed);
-if (!_claimed) exitWith {};
+if (!_claimed) exitWith { WARNING_1("already claimed %1",_this) };
// Exempt from weight check if object has override variable set
private _weight = 0;
diff --git a/addons/dragging/functions/fnc_startDragLocal.sqf b/addons/dragging/functions/fnc_startDragLocal.sqf
index d0e5e0e2e9..e969fb0f79 100644
--- a/addons/dragging/functions/fnc_startDragLocal.sqf
+++ b/addons/dragging/functions/fnc_startDragLocal.sqf
@@ -20,7 +20,7 @@
params ["_unit", "_target", "_claimed"];
TRACE_3("params",_unit,_target,_claimed);
-if (!_claimed) exitWith {};
+if (!_claimed) exitWith { WARNING_1("already claimed %1",_this) };
// Exempt from weight check if object has override variable set
private _weight = 0;
diff --git a/addons/gforces/XEH_postInit.sqf b/addons/gforces/XEH_postInit.sqf
index a2f69dd608..d0d58488d3 100644
--- a/addons/gforces/XEH_postInit.sqf
+++ b/addons/gforces/XEH_postInit.sqf
@@ -12,8 +12,7 @@ GVAR(playerIsVirtual) = false;
["unit", { // Add unit changed EH to check if player is either virtual (logic) or a UAV AI
params ["_unit"];
- GVAR(playerIsVirtual) = ((getNumber (configOf _unit >> "isPlayableLogic")) == 1) ||
- {(getText (configOf _unit >> "simulation")) == "UAVPilot"};
+ GVAR(playerIsVirtual) = unitIsUAV _unit || {(getNumber (configOf _unit >> "isPlayableLogic")) == 1};
TRACE_3("unit changed",_unit,typeOf _unit,GVAR(playerIsVirtual));
}, true] call CBA_fnc_addPlayerEventHandler;
diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp
index e233476016..c94b9e6193 100644
--- a/addons/main/script_version.hpp
+++ b/addons/main/script_version.hpp
@@ -1,4 +1,4 @@
#define MAJOR 3
#define MINOR 16
-#define PATCHLVL 1
-#define BUILD 74
+#define PATCHLVL 3
+#define BUILD 79
diff --git a/addons/marker_flags/CfgWeapons.hpp b/addons/marker_flags/CfgWeapons.hpp
index b4c2f88125..13a1632f4f 100644
--- a/addons/marker_flags/CfgWeapons.hpp
+++ b/addons/marker_flags/CfgWeapons.hpp
@@ -14,7 +14,7 @@ class CfgWeapons {
mapSize = 0.2;
class ItemInfo: CBA_MiscItem_ItemInfo {
- mass = 1;
+ mass = 0.5;
};
};
diff --git a/addons/medical_engine/XEH_postInit.sqf b/addons/medical_engine/XEH_postInit.sqf
index 6455904f95..81de63775b 100644
--- a/addons/medical_engine/XEH_postInit.sqf
+++ b/addons/medical_engine/XEH_postInit.sqf
@@ -16,9 +16,8 @@
while {(_allHitPoints param [0, ""]) select [0,1] == "#"} do { WARNING_1("Ignoring Reflector hitpoint %1", _allHitPoints deleteAt 0); };
if (_allHitPoints param [0, ""] != "ACE_HDBracket") then {
- private _config = configOf _unit;
- if (getText (_config >> "simulation") == "UAVPilot") exitWith {TRACE_1("ignore UAV AI",typeOf _unit);};
- if (getNumber (_config >> "isPlayableLogic") == 1) exitWith {TRACE_1("ignore logic unit",typeOf _unit)};
+ if (unitIsUAV _unit) exitWith {TRACE_1("ignore UAV AI",typeOf _unit);};
+ if (getNumber ((configOf _unit) >> "isPlayableLogic") == 1) exitWith {TRACE_1("ignore logic unit",typeOf _unit)};
ERROR_1("Bad hitpoints for unit type ""%1""",typeOf _unit);
} else {
// Calling this function inside curly brackets allows the usage of
diff --git a/addons/medical_engine/functions/fnc_handleDamage.sqf b/addons/medical_engine/functions/fnc_handleDamage.sqf
index 8db9950a86..755b8ad552 100644
--- a/addons/medical_engine/functions/fnc_handleDamage.sqf
+++ b/addons/medical_engine/functions/fnc_handleDamage.sqf
@@ -32,6 +32,11 @@ if (_hitPoint isEqualTo "") then {
if !(isDamageAllowed _unit && {_unit getVariable [QEGVAR(medical,allowDamage), true]}) exitWith {_oldDamage};
private _newDamage = _damage - _oldDamage;
+
+// Happens occasionally for vehiclehit events (see line 80 onwards)
+// Just exit early to save some frametime
+if (_newDamage == 0 && {_hitpoint isNotEqualTo "ace_hdbracket"}) exitWith {_oldDamage};
+
// Get scaled armor value of hitpoint and calculate damage before armor
// We scale using passThrough to handle explosive-resistant armor properly (#9063)
// We need realDamage to determine which limb was hit correctly
diff --git a/addons/medical_status/XEH_preInit.sqf b/addons/medical_status/XEH_preInit.sqf
index e3c82d5788..82146d82e1 100644
--- a/addons/medical_status/XEH_preInit.sqf
+++ b/addons/medical_status/XEH_preInit.sqf
@@ -12,9 +12,8 @@ PREP_RECOMPILE_END;
["CAManBase", "init", {
params ["_unit"];
- private _config = configOf _unit;
- if (getText (_config >> "simulation") == "UAVPilot") exitWith {TRACE_1("ignore UAV AI",typeOf _unit);};
- if (getNumber (_config >> "isPlayableLogic") == 1) exitWith {TRACE_1("ignore logic unit",typeOf _unit)};
+ if (unitIsUAV _unit) exitWith {TRACE_1("ignore UAV AI",typeOf _unit);};
+ if (getNumber ((configOf _unit) >> "isPlayableLogic") == 1) exitWith {TRACE_1("ignore logic unit",typeOf _unit)};
// Hopefully this EH gets added first as it can only effect other EH called after it
private _ehIndex = _unit addEventHandler ["Killed", {_this call FUNC(handleKilled)}];
diff --git a/addons/viewrestriction/XEH_clientInit.sqf b/addons/viewrestriction/XEH_clientInit.sqf
index 21455af21b..1ed4f008da 100644
--- a/addons/viewrestriction/XEH_clientInit.sqf
+++ b/addons/viewrestriction/XEH_clientInit.sqf
@@ -19,7 +19,7 @@ if !(hasInterface) exitWith {};
};
// Exit if third person view is not available
- if (difficultyOption "thirdPersonView" == 0) exitWith {
+ if (difficultyOption "thirdPersonView" != 1) exitWith {
WARNING("View Restriction is enabled, but 3rd person is disabled with server difficulty.");
};
diff --git a/docs/_config.yml b/docs/_config.yml
index 52ba8da828..bc7440eee3 100644
--- a/docs/_config.yml
+++ b/docs/_config.yml
@@ -9,8 +9,8 @@ ace:
version:
major: 3
minor: 16
- patch: 1
- build: 74
+ patch: 3
+ build: 79
markdown: kramdown
diff --git a/docs/_config_dev.yml b/docs/_config_dev.yml
index 67de48f2f6..0d0cf1b7fc 100644
--- a/docs/_config_dev.yml
+++ b/docs/_config_dev.yml
@@ -9,8 +9,8 @@ ace:
version:
major: 3
minor: 16
- patch: 1
- build: 74
+ patch: 3
+ build: 79
markdown: kramdown