diff --git a/addons/captives/functions/fnc_doFriskPerson.sqf b/addons/captives/functions/fnc_doFriskPerson.sqf index 14b18ffd0e..dd7cc3c675 100644 --- a/addons/captives/functions/fnc_doFriskPerson.sqf +++ b/addons/captives/functions/fnc_doFriskPerson.sqf @@ -27,7 +27,7 @@ if (_weapon == primaryWeapon _player && {_weapon != ""}) then { _listedItemClasses = []; -_actions = [localize "STR_ACE_Captives_FriskMenuHeader", localize "STR_ACE_Captives_CancelSelection"] call ACE_Interaction_fnc_prepareSelectMenu; +_actions = [localize "STR_ACE_Captives_FriskMenuHeader", ""] call ACE_Interaction_fnc_prepareSelectMenu; _allGear = []; diff --git a/addons/common/CfgVehicles.hpp b/addons/common/CfgVehicles.hpp index 45f384eaf8..eaa585691e 100644 --- a/addons/common/CfgVehicles.hpp +++ b/addons/common/CfgVehicles.hpp @@ -107,4 +107,21 @@ class CfgVehicles { class TransportItems {}; class TransportBackpacks {}; }; + + class Item_Base_F; + class ACE_bananaItem: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = "$STR_ACE_Common_bananaDisplayName"; + author = "$STR_ACE_Common_ACETeam"; + vehicleClass = "Items"; + class TransportItems + { + class ACE_banana + { + name = "ACE_banana"; + count = 1; + }; + }; + }; }; diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 962c91ec0e..3304c4d69a 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -106,31 +106,60 @@ GVAR(OldPlayerWeapon) = currentWeapon ACE_player; // PFH to raise varios events [{ + if(!isNil "ACE_player" && { !isNull ACE_player }) then { + // "playerInventoryChanged" event + _newPlayerInventory = [ACE_player] call FUNC(getAllGear); + if !(_newPlayerInventory isEqualTo GVAR(OldPlayerInventory)) then { + // Raise ACE event locally + GVAR(OldPlayerInventory) = _newPlayerInventory; + ["playerInventoryChanged", [ACE_player, _newPlayerInventory]] call FUNC(localEvent); + }; - // "playerInventoryChanged" event - _newPlayerInventory = [ACE_player] call FUNC(getAllGear); - if !(_newPlayerInventory isEqualTo GVAR(OldPlayerInventory)) then { - // Raise ACE event locally - GVAR(OldPlayerInventory) = _newPlayerInventory; - ["playerInventoryChanged", [ACE_player, _newPlayerInventory]] call FUNC(localEvent); + // "playerVisionModeChanged" event + _newPlayerVisionMode = currentVisionMode ACE_player; + if !(_newPlayerVisionMode isEqualTo GVAR(OldPlayerVisionMode)) then { + // Raise ACE event locally + GVAR(OldPlayerVisionMode) = _newPlayerVisionMode; + ["playerVisionModeChanged", [ACE_player, _newPlayerVisionMode]] call FUNC(localEvent); + }; + + // "inventoryDisplayChanged" event + _newInventoryDisplayIsOpen = !(isNull findDisplay 602); + if !(_newInventoryDisplayIsOpen isEqualTo GVAR(OldInventoryDisplayIsOpen)) then { + // Raise ACE event locally + GVAR(OldInventoryDisplayIsOpen) = _newInventoryDisplayIsOpen; + ["inventoryDisplayChanged", [ACE_player, _newInventoryDisplayIsOpen]] call FUNC(localEvent); + }; + + // "playerVehicleChanged" event + _newPlayerVehicle = vehicle ACE_player; + if !(_newPlayerVehicle isEqualTo GVAR(OldPlayerVehicle)) then { + // Raise ACE event locally + GVAR(OldPlayerVehicle) = _newPlayerVehicle; + ["playerVehicleChanged", [ACE_player, _newPlayerVehicle]] call FUNC(localEvent); + }; + + // "playerTurretChanged" event + _newPlayerTurret = [ACE_player] call FUNC(getTurretIndex); + if !(_newPlayerTurret isEqualTo GVAR(OldPlayerTurret)) then { + // Raise ACE event locally + GVAR(OldPlayerTurret) = _newPlayerTurret; + ["playerTurretChanged", [ACE_player, _newPlayerTurret]] call FUNC(localEvent); + }; + + // "playerWeaponChanged" event + _newPlayerWeapon = currentWeapon ACE_player; + if (_newPlayerWeapon != GVAR(OldPlayerWeapon)) then { + // Raise ACE event locally + GVAR(OldPlayerWeapon) = _newPlayerWeapon; + ["playerWeaponChanged", [ACE_player, _newPlayerWeapon]] call FUNC(localEvent); + }; }; - - // "playerVisionModeChanged" event - _newPlayerVisionMode = currentVisionMode ACE_player; - if !(_newPlayerVisionMode isEqualTo GVAR(OldPlayerVisionMode)) then { - // Raise ACE event locally - GVAR(OldPlayerVisionMode) = _newPlayerVisionMode; - ["playerVisionModeChanged", [ACE_player, _newPlayerVisionMode]] call FUNC(localEvent); - }; - - // "inventoryDisplayChanged" event - _newInventoryDisplayIsOpen = !(isNull findDisplay 602); - if !(_newInventoryDisplayIsOpen isEqualTo GVAR(OldInventoryDisplayIsOpen)) then { - // Raise ACE event locally - GVAR(OldInventoryDisplayIsOpen) = _newInventoryDisplayIsOpen; - ["inventoryDisplayChanged", [ACE_player, _newInventoryDisplayIsOpen]] call FUNC(localEvent); - }; - + + // + // These events can fire on a null player object + // + // "zeusDisplayChanged" event _newZeusDisplayIsOpen = !(isNull findDisplay 312); if !(_newZeusDisplayIsOpen isEqualTo GVAR(OldZeusDisplayIsOpen)) then { @@ -138,7 +167,7 @@ GVAR(OldPlayerWeapon) = currentWeapon ACE_player; GVAR(OldZeusDisplayIsOpen) = _newZeusDisplayIsOpen; ["zeusDisplayChanged", [ACE_player, _newZeusDisplayIsOpen]] call FUNC(localEvent); }; - + // "cameraViewChanged" event _newCameraView = cameraView; if !(_newCameraView isEqualTo GVAR(OldCameraView)) then { @@ -146,31 +175,7 @@ GVAR(OldPlayerWeapon) = currentWeapon ACE_player; GVAR(OldCameraView) = _newCameraView; ["cameraViewChanged", [ACE_player, _newCameraView]] call FUNC(localEvent); }; - - // "playerVehicleChanged" event - _newPlayerVehicle = vehicle ACE_player; - if !(_newPlayerVehicle isEqualTo GVAR(OldPlayerVehicle)) then { - // Raise ACE event locally - GVAR(OldPlayerVehicle) = _newPlayerVehicle; - ["playerVehicleChanged", [ACE_player, _newPlayerVehicle]] call FUNC(localEvent); - }; - - // "playerTurretChanged" event - [ACE_player] call FUNC(getTurretIndex); - if !(_newPlayerTurret isEqualTo GVAR(OldPlayerTurret)) then { - // Raise ACE event locally - GVAR(OldPlayerTurret) = _newPlayerTurret; - ["playerTurretChanged", [ACE_player, _newPlayerTurret]] call FUNC(localEvent); - }; - - // "playerWeaponChanged" event - _newPlayerWeapon = currentWeapon ACE_player; - if (_newPlayerWeapon != GVAR(OldPlayerWeapon)) then { - // Raise ACE event locally - GVAR(OldPlayerWeapon) = _newPlayerWeapon; - ["playerWeaponChanged", [ACE_player, _newPlayerWeapon]] call FUNC(localEvent); - }; - + }, 0, []] call cba_fnc_addPerFrameHandler; [QGVAR(StateArrested),false,true,QUOTE(ADDON)] call FUNC(defineVariable); diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 05322924e0..fe9c8a4c77 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -4,13 +4,11 @@ ADDON = false; // ACE Common Function -PREP(addActionEventHandler); -PREP(addActionMenuEventHandler); + PREP(addCanInteractWithCondition); PREP(addLineToDebugDraw); -PREP(addMapMarkerCreatedEventHandler); -PREP(addScrollWheelEventHandler); PREP(addSetting); +PREP(addToInventory); PREP(adminKick); PREP(ambientBrightness); PREP(applyForceWalkStatus); @@ -55,25 +53,16 @@ PREP(fixPosition); PREP(getAllDefinedSetVariables); PREP(getAllGear); PREP(getCaptivityStatus); -PREP(getConfigCommander); -PREP(getConfigGunner); -PREP(getConfigType); -PREP(getConfigTypeObject); PREP(getDeathAnim); PREP(getDefaultAnim); PREP(getDefinedVariable); PREP(getDefinedVariableDefault); PREP(getDefinedVariableInfo); -PREP(getDoorTurrets); PREP(getFirstObjectIntersection); PREP(getFirstTerrainIntersection); PREP(getForceWalkStatus); PREP(getGunner); -PREP(getHitPoints); -PREP(getHitPointsWithSelections); PREP(getInPosition); -PREP(getItemType); -PREP(getItemTypeWeapon); PREP(getMarkerType); PREP(getName); PREP(getNumberFromMissionSQM); @@ -96,15 +85,12 @@ PREP(getTurretDirection); PREP(getUavControlPosition); PREP(getVehicleCargo); PREP(getVehicleCodriver); -PREP(getVehicleCrew); PREP(getVersion); PREP(getWeaponAzimuthAndInclination); PREP(getWeaponIndex); -PREP(getWeaponModes); -PREP(getWeaponMuzzles); PREP(getWeaponState); -PREP(getWeaponType); PREP(getWindDirection); +PREP(getZoom); PREP(goKneeling); PREP(hadamardProduct); PREP(hasItem); @@ -146,11 +132,7 @@ PREP(progressBar); PREP(queueAnimation); PREP(readSettingFromModule); PREP(receiveRequest); -PREP(removeActionEventHandler); -PREP(removeActionMenuEventHandler); PREP(removeCanInteractWithCondition); -PREP(removeMapMarkerCreatedEventHandler); -PREP(removeScrollWheelEventHandler); PREP(removeSpecificMagazine); PREP(requestCallback); PREP(resetAllDefaults); @@ -193,6 +175,32 @@ PREP(useItem); PREP(useMagazine); PREP(waitAndExecute); +// config items +PREP(getConfigType); +PREP(getItemType); +PREP(getWeaponType); +PREP(getWeaponModes); +PREP(getWeaponMuzzles); + +// config objects +PREP(getConfigTypeObject); +PREP(getConfigGunner); +PREP(getConfigCommander); +PREP(getHitPoints); +PREP(getHitPointsWithSelections); +PREP(getVehicleCrew); + +// turrets +PREP(getTurrets); +PREP(getTurretIndex); +PREP(getTurretConfigPath); +PREP(getTurretGunner); +PREP(getTurretCommander); +PREP(getTurretCopilot); +PREP(getDoorTurrets); +PREP(getTurretsFFV); +PREP(getTurretsOther); + // ACE_Debug PREP(exportConfig); PREP(getChildren); @@ -200,6 +208,7 @@ PREP(getDisplayConfigName); PREP(log); PREP(logControls); PREP(logDisplays); +PREP(logModEntries); PREP(monitor); PREP(showUser); @@ -222,6 +231,17 @@ PREP(localEvent); PREP(removeEventHandler); PREP(removeAlLEventHandlers); +// other eventhandlers +PREP(addActionEventHandler); +PREP(addActionMenuEventHandler); +PREP(addScrollWheelEventHandler); +PREP(addMapMarkerCreatedEventHandler); + +PREP(removeActionEventHandler); +PREP(removeActionMenuEventHandler); +PREP(removeScrollWheelEventHandler); +PREP(removeMapMarkerCreatedEventHandler); + // hashes PREP(hashCreate); PREP(hashSet); diff --git a/addons/common/config.cpp b/addons/common/config.cpp index afd118ff1c..90309af612 100644 --- a/addons/common/config.cpp +++ b/addons/common/config.cpp @@ -2,7 +2,7 @@ class CfgPatches { class ADDON { - units[] = {"ACE_Box_Misc"}; + units[] = {"ACE_Box_Misc", "ACE_bananaItem"}; weapons[] = {"ACE_ItemCore","ACE_FakePrimaryWeapon", "ACE_Banana"}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_main"}; diff --git a/addons/common/functions/fnc__handleNetEvent.sqf b/addons/common/functions/fnc__handleNetEvent.sqf index 8babbbe098..804a0ade78 100644 --- a/addons/common/functions/fnc__handleNetEvent.sqf +++ b/addons/common/functions/fnc__handleNetEvent.sqf @@ -7,7 +7,6 @@ private ["_eventType", "_event", "_eventName", "_eventArgs", "_eventNames", "_ev _eventType = _this select 0; _event = _this select 1; - if(_eventType == "ACEg") then { _eventName = _event select 0; _eventArgs = _event select 1; @@ -16,9 +15,18 @@ if(_eventType == "ACEg") then { _eventIndex = _eventNames find _eventName; if(_eventIndex != -1) then { _events = (GVAR(events) select 1) select _eventIndex; + + #ifdef DEBUG_EVENTS + diag_log text format[ARR_2("* Net Event %1",_eventName)]; + diag_log text format[ARR_2(" args=%1",_eventArgs)]; + #endif + { if(!isNil "_x") then { _eventArgs call CALLSTACK_NAMED(_x, format[ARR_3("Net Event %1 ID: %2",_eventName,_forEachIndex)]); + #ifdef DEBUG_EVENTS_CALLSTACK + diag_log text format[ARR_2(" ID: %1",_forEachIndex)]; + #endif }; } forEach _events; }; diff --git a/addons/common/functions/fnc_addToInventory.sqf b/addons/common/functions/fnc_addToInventory.sqf new file mode 100644 index 0000000000..4e088525fc --- /dev/null +++ b/addons/common/functions/fnc_addToInventory.sqf @@ -0,0 +1,101 @@ +/* + * Author: Garth 'L-H' de Wet + * Adds an item,weapon,magazine to the unit's inventory + * or places it in a weaponHolder if no space. + * + * Arguments: + * 0: Unit (OBJECT) + * 1: Classname (String) + * 2: Container (String, Optional) uniform, vest, backpack + * + * Return Value: + * Array: + * 0: Added to player (Bool) + * 1: weaponholder (OBJECT) + * + * Public: Yes + */ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" + +EXPLODE_2_PVT(_this,_unit,_classname); +private "_addedToPlayer"; +private "_container"; +private "_canAdd"; +private "_type"; + +_canAdd = false; +_addedToPlayer = true; + +if((count _this) > 2) then { + _container = _this select 2; +} else { + _container = nil; +}; + +_type = [_classname] call EFUNC(common,getItemType); + +if(!isNil "_container") then { + switch (_container) do { + case "vest": { _canAdd = _unit canAddItemToVest _classname; }; + case "backpack": { _canAdd = _unit canAddItemToBackpack _classname; }; + case "uniform": { _canAdd = _unit canAddItemToUniform _classname; }; + }; +} else { + _container = ""; + _canAdd = _unit canAdd _classname; +}; + +switch ((_type select 0)) do { + case "weapon": { + if (_canAdd) then { + switch (_container) do { + case "vest": { (vestContainer _unit) addWeaponCargoGlobal [_classname, 1]; }; + case "backpack": { (backpackContainer _unit) addWeaponCargoGlobal [_classname, 1]; }; + case "uniform": { (uniformContainer _unit) addWeaponCargoGlobal [_classname, 1]; }; + default { _unit addWeaponGlobal _classname; }; + }; + } else { + _addedToPlayer = false; + _pos = _unit modelToWorld [0,1,0.05]; + _unit = createVehicle ["WeaponHolder_Single_F",_pos,[],0,"NONE"]; + _unit addWeaponCargoGlobal [_classname,1]; + _unit setPosATL _pos; + }; + }; + case "magazine": { + if (_canAdd) then { + switch (_container) do { + case "vest": { (vestContainer _unit) addMagazineCargoGlobal [_classname, 1]; }; + case "backpack": { (backpackContainer _unit) addMagazineCargoGlobal [_classname, 1]; }; + case "uniform": { (uniformContainer _unit) addMagazineCargoGlobal [_classname, 1]; }; + default { _unit addMagazineGlobal _classname; }; + }; + } else { + _addedToPlayer = false; + _pos = _unit modelToWorld [0,1,0.05]; + _unit = createVehicle ["WeaponHolder_Single_F",_pos,[],0,"NONE"]; + _unit addMagazineCargoGlobal [_classname, 1]; + _unit setPosATL _pos; + }; + }; + case "item": { + if (_canAdd) then { + switch (_container) do { + case "vest": { _unit addItemToVest _classname; }; + case "backpack": { _unit addItemToBackpack _classname; }; + case "uniform": { _unit addItemToUniform _classname; }; + default { _unit addItem _classname; }; + }; + } else { + _addedToPlayer = false; + _pos = _unit modelToWorld [0,1,0.05]; + _unit = createVehicle ["WeaponHolder_Single_F",_pos,[],0,"NONE"]; + _unit addItemCargoGlobal [_classname,1]; + _unit setPosATL _pos; + }; + }; + default {diag_log format ["ACE: Incorrect item type passed to %1, passed: %2",QFUNC(AddToInventory),_type];}; +}; + +[_addedToPlayer,_unit] diff --git a/addons/common/functions/fnc_dumpPerformanceCounters.sqf b/addons/common/functions/fnc_dumpPerformanceCounters.sqf index ded6514c9a..b9afb8f7eb 100644 --- a/addons/common/functions/fnc_dumpPerformanceCounters.sqf +++ b/addons/common/functions/fnc_dumpPerformanceCounters.sqf @@ -2,16 +2,16 @@ #define DEBUG_MODE_FULL #include "script_component.hpp" -/* + diag_log text format["REGISTERED ACE PFH HANDLERS"]; diag_log text format["-------------------------------------------"]; -if(!isNil "ACE_PFH") then { +if(!isNil "ACE_PFH_COUNTER") then { { private["_pfh"]; _pfh = _x select 0; diag_log text format["Registered PFH: id=%1, %1:%2", (_pfh select 0), (_pfh select 1), (_pfh select 2) ]; - } forEach ACE_PFH; -};*/ + } forEach ACE_PFH_COUNTER; +}; diag_log text format["ACE COUNTER RESULTS"]; diag_log text format["-------------------------------------------"]; diff --git a/addons/common/functions/fnc_getGunner.sqf b/addons/common/functions/fnc_getGunner.sqf index 71191083e0..2980246504 100644 --- a/addons/common/functions/fnc_getGunner.sqf +++ b/addons/common/functions/fnc_getGunner.sqf @@ -16,6 +16,8 @@ private ["_vehicle", "_weapon"]; _vehicle = _this select 0; _weapon = _this select 1; +if (gunner _vehicle == _vehicle && {_weapon in weapons _vehicle}) exitWith {gunner _vehicle}; + private "_gunner"; _gunner = objNull; @@ -23,6 +25,6 @@ _gunner = objNull; if (_weapon in (_vehicle weaponsTurret _x)) exitWith { _gunner = _vehicle turretUnit _x; }; -} forEach allTurrets _vehicle; +} forEach allTurrets [_vehicle, true]; _gunner diff --git a/addons/common/functions/fnc_getItemType.sqf b/addons/common/functions/fnc_getItemType.sqf index a6d4a76dd1..20d581f526 100644 --- a/addons/common/functions/fnc_getItemType.sqf +++ b/addons/common/functions/fnc_getItemType.sqf @@ -8,7 +8,7 @@ * * Return value: * Item type. (Array) - * 0: "weapon", "item", "magazine", "unknown" or "" (String) + * 0: "weapon", "item", "magazine" or "" (String) * 1: A description of the item (e.g. "primary" for a weapon or "vest" for a vest item) * */ @@ -20,10 +20,64 @@ _item = _this select 0; _cfgType = [_item] call FUNC(getConfigType); +if (_cfgType == "") exitWith {["",""]}; + if (_cfgType == "CfgGlasses") exitWith {["item","glasses"]}; -if (_cfgType == "CfgMagazines") exitWith { ["magazine", [_item] call FUNC(getItemTypeWeapon) select 1] }; +private ["_config", "_type"]; -if (_cfgType == "CfgWeapons") exitWith { [_item] call FUNC(getItemTypeWeapon) }; +_config = configFile >> _cfgType >> _item; -["",""] +_type = getNumber (_config >> "type"); + +if (isNumber (_config >> "ItemInfo" >> "type")) then { + _type = getNumber (_config >> "ItemInfo" >> "type"); +}; + +private "_default"; +_default = ["item", "magazine"] select (_cfgType == "CfgMagazines"); + +switch (true) do { + case (_type == 0): {[_default,"unknown"]}; + case (_type == 2^0): {["weapon","primary"]}; + case (_type == 2^1): {["weapon","handgun"]}; + case (_type == 2^2): {["weapon","secondary"]}; + case (_type < 2^4): {["weapon","unknown"]}; + case (_type == 2^4): {["magazine","handgun"]}; // handgun + case (_type == 2^8): {["magazine","primary"]}; // rifle + case (_type == 2^9): {["magazine","secondary"]}; // rpg, mg, mines + //case (_type < 2^11): {["magazine","unknown"]}; + + case (_type == 101): {["item","muzzle"]}; + case (_type == 201): {["item","optics"]}; + case (_type == 301): {["item","flashlight"]}; + case (_type == 302): {["item","under"]}; // czech for bipod item + case (_type == 401): {["item","first_aid_kit"]}; + case (_type == 501): {["item","fins"]}; // not implemented + case (_type == 601): {["item","breathing_bomb"]}; // not implemented + case (_type == 603): {["item","goggles"]}; + case (_type == 604): {["item","scuba"]}; // not implemented + case (_type == 605): {["item","headgear"]}; + case (_type == 611): {["item","radio"]}; + case (_type == 616): {["item","hmd"]}; + case (_type == 617): {["item","binocular"]}; + case (_type == 619): {["item","medikit"]}; + case (_type == 620): {["item","toolkit"]}; + case (_type == 621): {["item","uav_terminal"]}; + case (_type == 701): {["item","vest"]}; + case (_type == 801): {["item","uniform"]}; + + case (_type == 2^12): { + switch (toLower getText (_config >> "simulation")) do { + case ("weapon"): {["weapon","binocular"]}; + case ("binocular"): {["weapon","binocular"]}; + case ("nvgoggles"): {["item","nvgoggles"]}; + case ("itemminedetector"): {["item","minedetector"]}; + default {[_default,"unknown"]}; + }; + }; + + case (_type == 2^16): {["weapon","vehicle"]}; + case (_type == 2^17): {[_default,"unknown"]}; // ??? + default {[_default,"unknown"]}; +}; diff --git a/addons/common/functions/fnc_getItemTypeWeapon.sqf b/addons/common/functions/fnc_getItemTypeWeapon.sqf deleted file mode 100644 index 36b0f6d6d8..0000000000 --- a/addons/common/functions/fnc_getItemTypeWeapon.sqf +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Author: commy2 - * - * What kind of item is given classname. Has to be a CfgWeapons. Undefined behavior for CfgMagazine. - * - * Argument: - * 0: Classname of a CfgWeapon. (String) - * - * Return value: - * See ace_common_fnc_getItemType - * - */ -#include "script_component.hpp" - -private "_item"; - -_item = _this select 0; - -private "_config"; -_config = configFile >> [_item] call FUNC(getConfigType) >> _item; - -if (!isClass _config) exitWith {["",""]}; - -private "_type"; -_type = getNumber (_config >> "type"); - -if (isNumber (_config >> "ItemInfo" >> "type")) then { - _type = getNumber (_config >> "ItemInfo" >> "type"); -}; - -switch (true) do { - case (_type == 0): {["unknown","unknown"]}; - case (_type == 2^0): {["weapon","primary"]}; - case (_type == 2^1): {["weapon","handgun"]}; - case (_type == 2^2): {["weapon","secondary"]}; - case (_type < 2^4): {["weapon","unknown"]}; - case (_type == 2^4): {["magazine","handgun"]}; // handgun - case (_type == 2^8): {["magazine","primary"]}; // rifle - case (_type == 2^9): {["magazine","secondary"]}; // rpg, mg, mines - case (_type == 768): {["magazine","secondary"]}; // NLAW - case (_type == 1536): {["magazine","secondary"]}; // titan - - case (_type == 101): {["item","muzzle"]}; - case (_type == 201): {["item","optics"]}; - case (_type == 301): {["item","flashlight"]}; - case (_type == 302): {["item","under"]}; // czech for bipod item - case (_type == 401): {["item","first_aid_kit"]}; - case (_type == 501): {["item","fins"]}; // not implemented - case (_type == 601): {["item","breathing_bomb"]}; // not implemented - case (_type == 603): {["item","goggles"]}; - case (_type == 604): {["item","scuba"]}; // not implemented - case (_type == 605): {["item","headgear"]}; - case (_type == 611): {["item","radio"]}; - case (_type == 616): {["item","hmd"]}; - case (_type == 617): {["item","binocular"]}; - case (_type == 619): {["item","medikit"]}; - case (_type == 620): {["item","toolkit"]}; - case (_type == 621): {["item","uav_terminal"]}; - case (_type == 701): {["item","vest"]}; - case (_type == 801): {["item","uniform"]}; - - case (_type == 2^12): { - switch (toLower getText (_config >> "simulation")) do { - case ("binocular"): {["weapon","binocular"]}; - case ("nvgoggles"): {["item","nvgoggles"]}; - case ("itemminedetector"): {["item","minedetector"]}; - default {["weapon","unknown"]}; - }; - }; - - case (_type == 2^16): {["weapon","vehicle"]}; - case (_type == 2^17): {["item","unknown"]}; // ??? - default {["item","unknown"]}; -}; diff --git a/addons/common/functions/fnc_getZoom.sqf b/addons/common/functions/fnc_getZoom.sqf new file mode 100644 index 0000000000..1f319ac768 --- /dev/null +++ b/addons/common/functions/fnc_getZoom.sqf @@ -0,0 +1,14 @@ +/* + * Author: commy2 + * + * Returns a value depending on current zoom level. + * + * Argument: + * None. + * + * Return value: + * Zoom. (Number) + */ +#include "script_component.hpp" + +(0.5 - ((worldToScreen positionCameraToWorld [0,1,1]) select 1)) * (getResolution select 5) diff --git a/addons/common/functions/fnc_localEvent.sqf b/addons/common/functions/fnc_localEvent.sqf index 85cc63a3b6..cc136d2083 100644 --- a/addons/common/functions/fnc_localEvent.sqf +++ b/addons/common/functions/fnc_localEvent.sqf @@ -19,9 +19,17 @@ _eventNames = GVAR(events) select 0; _eventIndex = _eventNames find _eventName; if(_eventIndex != -1) then { _events = (GVAR(events) select 1) select _eventIndex; + #ifdef DEBUG_EVENTS + diag_log text format[ARR_2("* Local Event: %1",_eventName)]; + diag_log text format[ARR_2(" args=%1",_eventArgs)]; + #endif + { if(!isNil "_x") then { _eventArgs call CALLSTACK_NAMED(_x, format[ARR_3("Local Event %1 ID: %2",_eventName,_forEachIndex)]); + #ifdef DEBUG_EVENTS_CALLSTACK + diag_log text format[ARR_2(" ID: %1",_forEachIndex)]; + #endif }; } forEach _events; }; \ No newline at end of file diff --git a/addons/common/functions/fnc_logModEntries.sqf b/addons/common/functions/fnc_logModEntries.sqf new file mode 100644 index 0000000000..827802ad3f --- /dev/null +++ b/addons/common/functions/fnc_logModEntries.sqf @@ -0,0 +1,17 @@ +// by commy2 + +private ["_configs", "_entries"]; + +_configs = "true" configClasses (configFile >> _this); + +_entries = []; + +{ + { + _name = toLower configName _x; + if !(_name in _entries) then { + diag_log text _name; + _entries pushBack _name; + }; + } forEach configProperties [_x, "toLower configName _x find 'ace' == 0", false]; +} forEach _configs; diff --git a/addons/common/functions/fnc_serverEvent.sqf b/addons/common/functions/fnc_serverEvent.sqf index 5e7ba3f92b..b792323867 100644 --- a/addons/common/functions/fnc_serverEvent.sqf +++ b/addons/common/functions/fnc_serverEvent.sqf @@ -16,6 +16,10 @@ private ["_eventName", "_eventArgs"]; _eventName = _this select 0; _eventArgs = _this select 1; + #ifdef DEBUG_EVENTS + diag_log text format[ARR_2("* Server Event: %1",_eventName)]; + diag_log text format[ARR_2(" args=%1",_eventArgs)]; + #endif ACEg = [_eventName, _eventArgs]; if(!isServer) then { diff --git a/addons/common/functions/fnc_targetEvent.sqf b/addons/common/functions/fnc_targetEvent.sqf index 4984c3d720..7299eeb057 100644 --- a/addons/common/functions/fnc_targetEvent.sqf +++ b/addons/common/functions/fnc_targetEvent.sqf @@ -21,6 +21,11 @@ _eventName = _this select 0; _eventTargets = _this select 1; _eventArgs = _this select 2; +#ifdef DEBUG_EVENTS + diag_log text format[ARR_3("* Target Event: %1 - %2",_eventName,_eventTargets)]; + diag_log text format[ARR_2(" args=%1",_eventArgs)]; +#endif + ACEc = [_eventName, _eventTargets, _eventArgs]; if(!isServer) then { publicVariableServer "ACEc"; diff --git a/addons/interact_menu/XEH_clientInit.sqf b/addons/interact_menu/XEH_clientInit.sqf index 72bea512d6..501cc9eb91 100644 --- a/addons/interact_menu/XEH_clientInit.sqf +++ b/addons/interact_menu/XEH_clientInit.sqf @@ -1,6 +1,8 @@ //XEH_clientInit.sqf #include "script_component.hpp" +if (!hasInterface) exitWith {}; + // Install the render EH on the main display addMissionEventHandler ["Draw3D", DFUNC(render)]; @@ -10,17 +12,17 @@ addMissionEventHandler ["Draw3D", DFUNC(render)]; // Wait until the map display is detected waitUntil {(!isNull findDisplay 12)}; - // Install the render EH on the map screen + // Install the render EH on the map screen ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["Draw", DFUNC(render)]; }; -["ACE3", QGVAR(InteractKey), "Interact Key", +["ACE3", QGVAR(InteractKey), (localize "STR_ACE_Interact_Menu_InteractKey"), {[0] call FUNC(keyDown)}, {[0] call FUNC(keyUp)}, [219, [false, false, false]], false] call cba_fnc_addKeybind; //Left Windows Key -["ACE3", QGVAR(SelfInteractKey), "Self Actions Key", +["ACE3", QGVAR(SelfInteractKey), (localize "STR_ACE_Interact_Menu_SelfInteractKey"), {[1] call FUNC(keyDown)}, {[1] call FUNC(keyUp)}, [219, [false, true, false]], false] call cba_fnc_addKeybind; //Left Windows Key + Ctrl/Strg diff --git a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf index ccdce4dd5c..968b143701 100644 --- a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf @@ -83,11 +83,19 @@ private ["_baseDisplayName", "_baseIcon"]; _baseDisplayName = ""; _baseIcon = ""; if (_objectType isKindOf "CAManBase") then { - _baseDisplayName = "Self Actions"; + _baseDisplayName = localize "STR_ACE_Interact_Menu_SelfActionsRoot"; _baseIcon = "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa"; } else { _baseDisplayName = getText (configFile >> "CfgVehicles" >> _objectType >> "displayName"); + //Alt would be to just use a static text, if veh names end up being too long: + // _baseDisplayName = localize "STR_ACE_Interact_Menu_VehicleActionsRoot"; + + //Pull the icon from the vehicle's config: _baseIcon = getText (configFile >> "CfgVehicles" >> _objectType >> "Icon"); + //icon could be a CfgVehicleIcons + if isText (configFile >> "CfgVehicleIcons" >> _baseIcon) then { + _baseIcon = getText (configFile >> "CfgVehicleIcons" >> _baseIcon); + }; }; // Create a master action to base on self action diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index cecb24fee2..6e5ce8fdb2 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -1,7 +1,21 @@  + Always display cursor for self interaction - + + Interact Key + + + Self Interaction Key + + + Self Actions + + + Vehicle Actions + + + \ No newline at end of file diff --git a/addons/main/script_debug.hpp b/addons/main/script_debug.hpp index 642de3428d..26475fb226 100644 --- a/addons/main/script_debug.hpp +++ b/addons/main/script_debug.hpp @@ -2,6 +2,8 @@ STACK TRACING **/ //#define ENABLE_CALLSTACK +//#define ENABLE_PERFORMANCE_COUNTERS +//#define DEBUG_EVENTS #ifdef ENABLE_CALLSTACK @@ -29,7 +31,7 @@ PERFORMANCE COUNTERS SECTION //#define ENABLE_PERFORMANCE_COUNTERS #ifdef ENABLE_PERFORMANCE_COUNTERS - #define ADDPFH(function, timing, args) call { _ret = [function, timing, args, #function] call EFUNC(sys_sync,perFrame_add); if(isNil "ACE_PFH" ) then { ACE_PFH=[]; }; ACE_PFH pushBack [[_ret, __FILE__, __LINE__], [function, timing, args]]; _ret } + #define CBA_fnc_addPerFrameHandler { _ret = [(_this select 0), (_this select 1), (_this select 2), #function] call CBA_fnc_addPerFrameHandler; if(isNil "ACE_PFH_COUNTER" ) then { ACE_PFH_COUNTER=[]; }; ACE_PFH_COUNTER pushBack [[_ret, __FILE__, __LINE__], [(_this select 0), (_this select 1), (_this select 2)]]; _ret } #define CREATE_COUNTER(x) if(isNil "ACE_COUNTERS" ) then { ACE_COUNTERS=[]; }; GVAR(DOUBLES(x,counter))=[]; GVAR(DOUBLES(x,counter)) set[0, QUOTE(GVAR(DOUBLES(x,counter)))]; GVAR(DOUBLES(x,counter)) set[1, diag_tickTime]; ACE_COUNTERS pushBack GVAR(DOUBLES(x,counter)); #define BEGIN_COUNTER(x) if(isNil QUOTE(GVAR(DOUBLES(x,counter)))) then { CREATE_COUNTER(x) }; GVAR(DOUBLES(x,counter)) set[2, diag_tickTime]; @@ -37,8 +39,6 @@ PERFORMANCE COUNTERS SECTION #define DUMP_COUNTERS ([__FILE__, __LINE__] call ACE_DUMPCOUNTERS_FNC) #else - #define ADDPFH(function, timing, args) [function, timing, args, #function] call EFUNC(sys_sync,perFrame_add) - #define CREATE_COUNTER(x) /* disabled */ #define BEGIN_COUNTER(x) /* disabled */ #define END_COUNTER(x) /* disabled */ diff --git a/addons/microdagr/functions/fnc_appWaypointsButtonSetWP.sqf b/addons/microdagr/functions/fnc_appWaypointsButtonSetWP.sqf index 1836e50da2..881c0b3b5d 100644 --- a/addons/microdagr/functions/fnc_appWaypointsButtonSetWP.sqf +++ b/addons/microdagr/functions/fnc_appWaypointsButtonSetWP.sqf @@ -26,7 +26,6 @@ _waypoints = [] call FUNC(deviceGetWaypoints); if ((_newWpIndex < 0) || (_newWpIndex > ((count _waypoints) - 1))) exitWith { GVAR(currentWaypoint) = -1; - ERROR("out of bounds wp"); }; GVAR(currentWaypoint) = _newWpIndex; diff --git a/addons/overpressure/CfgEventHandlers.hpp b/addons/overpressure/CfgEventHandlers.hpp index fa70cab5ea..439270861b 100644 --- a/addons/overpressure/CfgEventHandlers.hpp +++ b/addons/overpressure/CfgEventHandlers.hpp @@ -43,7 +43,7 @@ class Extended_FiredBIS_EventHandlers { firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0}) then {_this call DFUNC(fireOverpressureZone)}); }; }; - class StaticWeapons { + class StaticWeapon { class ADDON { firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0}) then {_this call DFUNC(fireOverpressureZone)}); }; diff --git a/addons/respawn/CfgVehicles.hpp b/addons/respawn/CfgVehicles.hpp index 082778bf94..f6b8fc64c2 100644 --- a/addons/respawn/CfgVehicles.hpp +++ b/addons/respawn/CfgVehicles.hpp @@ -18,7 +18,7 @@ class CfgVehicles { class No { default = 1; name = "No"; value = 0; }; }; }; - class RemoveDeadBodiesDisonncected { + class RemoveDeadBodiesDisconnected { displayName = "Remove bodies?"; description = "Remove player bodies after disconnect?"; typeName = "BOOL"; diff --git a/addons/scopes/CfgWeapons.hpp b/addons/scopes/CfgWeapons.hpp index 67898fb449..87b5a4073f 100644 --- a/addons/scopes/CfgWeapons.hpp +++ b/addons/scopes/CfgWeapons.hpp @@ -40,4 +40,29 @@ class CfgWeapons { }; }; }; + + class ACE_optic_DMS: optic_DMS { + author = "$STR_ACE_Common_ACETeam"; + _generalMacro = "ACE_optic_DMS"; + displayName = "LOCALIZE ACE DMR"; + //descriptionShort = "$STR_A3_CFGWEAPONS_ACC_DMS1"; + class ItemInfo: ItemInfo { + modelOptics = QUOTE(PATHTOF(ace_shortdot_optics.p3d)); + + class OpticsModes: OpticsModes { + class Snip: Snip { + opticsZoomMin = 0.05; + opticsZoomMax = 0.3; + opticsZoomInit = 0.3; + discretefov[] = {}; + modelOptics[] = {}; + }; + }; + }; + }; +}; + +class SlotInfo; +class CowsSlot: SlotInfo { + compatibleItems[] += {"ACE_optic_DMS"}; }; diff --git a/addons/scopes/RscTitles.hpp b/addons/scopes/RscTitles.hpp index a9c43aedaf..189ff3613f 100644 --- a/addons/scopes/RscTitles.hpp +++ b/addons/scopes/RscTitles.hpp @@ -1,3 +1,6 @@ + +class RscText; + class RscTitles { class ACE_Scopes_Zeroing { idd = -1; @@ -65,6 +68,30 @@ class RscTitles { }; }; }; + + class ACE_Shortdot_Reticle { + idd = -1; + onLoad = "uiNamespace setVariable ['ACE_ctrlShortdotReticle', (_this select 0) displayCtrl 1];"; + duration = 999999; + fadeIn = 0; + fadeOut = 0; + name = "ACE_Shortdot_Reticle"; + + class controlsBackground { + class Debug_RscElement: RscText { + idc = 1; + style = 48; + size = 1; + sizeEx = 0; + font = "TahomaB"; + text = ""; + x = 0; + y = 0; + w = 0; + h = 0; + }; + }; + }; }; class RscInGameUI { diff --git a/addons/scopes/XEH_postInit.sqf b/addons/scopes/XEH_postInit.sqf index 9a1b0e8ef3..559a21a772 100644 --- a/addons/scopes/XEH_postInit.sqf +++ b/addons/scopes/XEH_postInit.sqf @@ -92,3 +92,30 @@ if !(hasInterface) exitWith {}; }, {false}, [201, [false, true, false]], false] call cba_fnc_addKeybind; + +// init shortdot +GVAR(showShortdot) = false; + +["playerInventoryChanged", { + if (_this select 1 isEqualTo []) exitWith {}; //@todo fix eh + + private "_showShortdot"; + _showShortdot = _this select 1 select 9 select 2 == "ACE_optic_DMS"; + + if (GVAR(showShortdot)) then { + if (!_showShortdot) then { + // hide control and turn onDraw handler off + (uiNamespace getVariable ["ACE_ctrlShortdotReticle", controlNull]) ctrlShow false; + GVAR(showShortdot) = false; + }; + } else { + if (_showShortdot) then { + // create control and turn onDraw handler on + ([QGVAR(reticle)] call BIS_fnc_rscLayer) cutRsc ["ACE_Shortdot_Reticle", "PLAIN", 0, false]; + (uiNamespace getVariable "ACE_ctrlShortdotReticle") ctrlSetText QUOTE(PATHTOF(data\reticles\ace_shortdot_reticle_1.paa)); + GVAR(showShortdot) = true; + }; + }; +}] call EFUNC(common,addEventHandler); + +addMissionEventHandler ["Draw3D", {if (GVAR(showShortdot)) then {call FUNC(onDrawShortdot)};}]; diff --git a/addons/scopes/XEH_preInit.sqf b/addons/scopes/XEH_preInit.sqf index e574cc72d4..d33801a510 100644 --- a/addons/scopes/XEH_preInit.sqf +++ b/addons/scopes/XEH_preInit.sqf @@ -7,6 +7,7 @@ PREP(canAdjustScope); PREP(firedEH); PREP(getOptics); PREP(inventoryCheck); +PREP(onDrawShortdot); PREP(showZeroing); GVAR(fadeScript) = scriptNull; diff --git a/addons/scopes/ace_shortdot_optics.p3d b/addons/scopes/ace_shortdot_optics.p3d new file mode 100644 index 0000000000..3d0392346a Binary files /dev/null and b/addons/scopes/ace_shortdot_optics.p3d differ diff --git a/addons/scopes/data/reticles/ace_shortdot_reticle_1.paa b/addons/scopes/data/reticles/ace_shortdot_reticle_1.paa new file mode 100644 index 0000000000..6c3d23668a Binary files /dev/null and b/addons/scopes/data/reticles/ace_shortdot_reticle_1.paa differ diff --git a/addons/scopes/data/reticles/ace_shortdot_reticle_2.paa b/addons/scopes/data/reticles/ace_shortdot_reticle_2.paa new file mode 100644 index 0000000000..beb7a651c9 Binary files /dev/null and b/addons/scopes/data/reticles/ace_shortdot_reticle_2.paa differ diff --git a/addons/scopes/functions/fnc_onDrawShortdot.sqf b/addons/scopes/functions/fnc_onDrawShortdot.sqf new file mode 100644 index 0000000000..78ff0b0f50 --- /dev/null +++ b/addons/scopes/functions/fnc_onDrawShortdot.sqf @@ -0,0 +1,25 @@ +// by commy2 +#include "script_component.hpp" + +private "_control"; +_control = uiNamespace getVariable ["ACE_ctrlShortdotReticle", controlNull]; + +if (cameraView != "GUNNER" || {currentWeapon ACE_player != primaryWeapon ACE_player}) exitWith { + _control ctrlShow false; +}; + +private ["_size", "_sizeX", "_sizeY"]; + +_size = call EFUNC(common,getZoom); + +_sizeX = _size/4; +_sizeY = _sizeX*safezoneW/safezoneH; + +_control ctrlSetPosition [ + safezoneX+0.5*safezoneW-0.5*_sizeX, + safezoneY+0.5*safezoneH-0.5*_sizeY, + _sizeX, + _sizeY +]; +_control ctrlCommit 0; +_control ctrlShow true; diff --git a/addons/winddeflection/CfgVehicles.hpp b/addons/winddeflection/CfgVehicles.hpp index f6e7b38b4f..2371c4b135 100644 --- a/addons/winddeflection/CfgVehicles.hpp +++ b/addons/winddeflection/CfgVehicles.hpp @@ -4,7 +4,7 @@ class CfgVehicles { author = "$STR_ACE_Common_ACETeam"; category = "ACE"; displayName = "Wind Deflection"; - function = FUNC(enableModule); + function = FUNC(initalizeModule); scope = 2; isGlobal = 1; icon = QUOTE(PATHTOF(UI\Icon_Module_Wind_ca.paa));