From 2bfa0bfaaf4634e7e6ca6e7b37882a06a98a3c55 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 14 May 2016 21:14:41 +0200 Subject: [PATCH 1/4] add 'CBA_fnc_addPlayerEventHandler' --- addons/common/CfgFunctions.hpp | 1 + addons/common/fnc_currentUnit.sqf | 20 ++++++ addons/events/CfgFunctions.hpp | 4 ++ addons/events/fnc_addPlayerEventHandler.sqf | 71 +++++++++++++++++++++ 4 files changed, 96 insertions(+) create mode 100644 addons/common/fnc_currentUnit.sqf create mode 100644 addons/events/fnc_addPlayerEventHandler.sqf diff --git a/addons/common/CfgFunctions.hpp b/addons/common/CfgFunctions.hpp index 4e2f4d7a5..ea7b8ca73 100644 --- a/addons/common/CfgFunctions.hpp +++ b/addons/common/CfgFunctions.hpp @@ -36,6 +36,7 @@ class CfgFunctions { F_FILEPATH(canUseWeapon); F_FILEPATH(selectWeapon); F_FILEPATH(switchPlayer); + F_FILEPATH(currentUnit); }; class Vehicles { diff --git a/addons/common/fnc_currentUnit.sqf b/addons/common/fnc_currentUnit.sqf new file mode 100644 index 000000000..10aad5f8c --- /dev/null +++ b/addons/common/fnc_currentUnit.sqf @@ -0,0 +1,20 @@ +/* ---------------------------------------------------------------------------- +Function: CBA_fnc_currentUnit + +Description: + Returns the currently controlled unit. + Different from "player" when remote controlling units via zeus. + +Parameters: + None + +Returns: + Currently controlled unit + +Author: + commy2 +---------------------------------------------------------------------------- */ +#include "script_component.hpp" +SCRIPT(currentUnit); + +missionNamespace getVariable ["bis_fnc_moduleRemoteControl_unit", player] diff --git a/addons/events/CfgFunctions.hpp b/addons/events/CfgFunctions.hpp index b784dab1a..a46367ebd 100644 --- a/addons/events/CfgFunctions.hpp +++ b/addons/events/CfgFunctions.hpp @@ -6,6 +6,10 @@ class CfgFunctions { description = "Adds an event handler with arguments."; file = "\x\cba\addons\events\fnc_addBISEventHandler.sqf"; }; + class addPlayerEventHandler { + description = "Adds a player event handler."; + file = "\x\cba\addons\events\fnc_addPlayerEventHandler.sqf"; + }; class addDisplayHandler { description = "Adds an action to the main display."; file = "\x\cba\addons\events\fnc_addDisplayHandler.sqf"; diff --git a/addons/events/fnc_addPlayerEventHandler.sqf b/addons/events/fnc_addPlayerEventHandler.sqf new file mode 100644 index 000000000..aecf89403 --- /dev/null +++ b/addons/events/fnc_addPlayerEventHandler.sqf @@ -0,0 +1,71 @@ +/* ---------------------------------------------------------------------------- +Function: CBA_fnc_addPlayerEventHandler + +Description: + Adds a player event handler. + +Parameters: + _type - Event handler type. + _function - Function to add to event. + +Returns: + _id - The ID of the event handler. Same as _thisID + +Examples: + (begin example) + _id = ["unit", {systemChat str _this}] call CBA_fnc_addPlayerEventHandler; + (end) + +Author: + commy2 +---------------------------------------------------------------------------- */ +#include "script_component.hpp" +SCRIPT(addPlayerEventHandler); + +params [["_type", "", [""]], ["_function", {}, [{}]]]; + +_type = toLower _type; + +if (isNil QGVAR(addedPlayerEvents)) then { + GVAR(addedPlayerEvents) = [] call CBA_fnc_createNamespace; +}; + +switch (_type) do { +case ("unit"): { + // add loop for polling if it doesn't exist yet + if (isNil {GVAR(addedPlayerEvents) getVariable _type}) then { + GVAR(oldUnit) = objNull; + GVAR(addedPlayerEvents) setVariable [_type, + addMissionEventHandler ["EachFrame", { + private _data = call CBA_fnc_currentUnit; + if !(_data isEqualTo GVAR(oldUnit)) then { + GVAR(oldUnit) = _data; + [QGVAR(unitEvent), _data] call CBA_fnc_localEvent; + }; + }] + ]; + }; + + // add event + [QGVAR(unitEvent), _function] call CBA_fnc_addEventHandler // return id +}; +case ("weapon"): { + // add loop for polling if it doesn't exist yet + if (isNil {GVAR(addedPlayerEvents) getVariable _type}) then { + GVAR(oldWeapon) = ""; + GVAR(addedPlayerEvents) setVariable [_type, + addMissionEventHandler ["EachFrame", { + private _data = currentWeapon (call CBA_fnc_currentUnit); + if !(_data isEqualTo GVAR(oldWeapon)) then { + GVAR(oldWeapon) = _data; + [QGVAR(weaponEvent), _data] call CBA_fnc_localEvent; + }; + }] + ]; + }; + + // add event + [QGVAR(weaponEvent), _function] call CBA_fnc_addEventHandler // return id +}; +default {-1}; +}; From a43e4c774970d99a9e75fc750c6d75b89127bce7 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 14 May 2016 22:37:12 +0200 Subject: [PATCH 2/4] add 'CBA_fnc_removePlayerEventHandler', add more events --- addons/events/CfgFunctions.hpp | 4 + addons/events/fnc_addPlayerEventHandler.sqf | 171 +++++++++++++++--- .../events/fnc_removePlayerEventHandler.sqf | 60 ++++++ 3 files changed, 212 insertions(+), 23 deletions(-) create mode 100644 addons/events/fnc_removePlayerEventHandler.sqf diff --git a/addons/events/CfgFunctions.hpp b/addons/events/CfgFunctions.hpp index a46367ebd..6c71a359b 100644 --- a/addons/events/CfgFunctions.hpp +++ b/addons/events/CfgFunctions.hpp @@ -10,6 +10,10 @@ class CfgFunctions { description = "Adds a player event handler."; file = "\x\cba\addons\events\fnc_addPlayerEventHandler.sqf"; }; + class removePlayerEventHandler { + description = "Removes a player event handler."; + file = "\x\cba\addons\events\fnc_removePlayerEventHandler.sqf"; + }; class addDisplayHandler { description = "Adds an action to the main display."; file = "\x\cba\addons\events\fnc_addDisplayHandler.sqf"; diff --git a/addons/events/fnc_addPlayerEventHandler.sqf b/addons/events/fnc_addPlayerEventHandler.sqf index aecf89403..59df17418 100644 --- a/addons/events/fnc_addPlayerEventHandler.sqf +++ b/addons/events/fnc_addPlayerEventHandler.sqf @@ -4,12 +4,22 @@ Function: CBA_fnc_addPlayerEventHandler Description: Adds a player event handler. + Possible events: + "unit" - player controlled unit changed + "weapon" - currently selected weapon change + "loadout" - players loadout changed + "vehicle" - players current vehicle changed + "turret" - position in vehicle changed + "visionMode" - player changed to normal/night/thermal view + "cameraView" - camera mode changed ("Internal", "External", "Gunner" etc.) + "visibleMap" - opened or closed map + Parameters: _type - Event handler type. _function - Function to add to event. Returns: - _id - The ID of the event handler. Same as _thisID + _id - The ID of the event handler. Examples: (begin example) @@ -22,50 +32,165 @@ Author: #include "script_component.hpp" SCRIPT(addPlayerEventHandler); -params [["_type", "", [""]], ["_function", {}, [{}]]]; +#define PLAYER_UNIT (missionNamespace getVariable ["bis_fnc_moduleRemoteControl_unit", player]) -_type = toLower _type; +params [["_type", "", [""]], ["_function", {}, [{}]]]; if (isNil QGVAR(addedPlayerEvents)) then { GVAR(addedPlayerEvents) = [] call CBA_fnc_createNamespace; }; -switch (_type) do { +switch (toLower _type) do { case ("unit"): { // add loop for polling if it doesn't exist yet if (isNil {GVAR(addedPlayerEvents) getVariable _type}) then { GVAR(oldUnit) = objNull; - GVAR(addedPlayerEvents) setVariable [_type, - addMissionEventHandler ["EachFrame", { - private _data = call CBA_fnc_currentUnit; - if !(_data isEqualTo GVAR(oldUnit)) then { - GVAR(oldUnit) = _data; - [QGVAR(unitEvent), _data] call CBA_fnc_localEvent; - }; - }] - ]; + GVAR(addedPlayerEvents) setVariable [_type, addMissionEventHandler ["EachFrame", { + private _data = PLAYER_UNIT; + if !(_data isEqualTo GVAR(oldUnit)) then { + GVAR(oldUnit) = _data; + [QGVAR(unitEvent), [_data]] call CBA_fnc_localEvent; + }; + }]]; }; // add event [QGVAR(unitEvent), _function] call CBA_fnc_addEventHandler // return id }; + case ("weapon"): { // add loop for polling if it doesn't exist yet if (isNil {GVAR(addedPlayerEvents) getVariable _type}) then { - GVAR(oldWeapon) = ""; - GVAR(addedPlayerEvents) setVariable [_type, - addMissionEventHandler ["EachFrame", { - private _data = currentWeapon (call CBA_fnc_currentUnit); - if !(_data isEqualTo GVAR(oldWeapon)) then { - GVAR(oldWeapon) = _data; - [QGVAR(weaponEvent), _data] call CBA_fnc_localEvent; - }; - }] - ]; + GVAR(oldWeapon) = ""; + GVAR(addedPlayerEvents) setVariable [_type, addMissionEventHandler ["EachFrame", { + private _data = currentWeapon PLAYER_UNIT; + if !(_data isEqualTo GVAR(oldWeapon)) then { + GVAR(oldWeapon) = _data; + [QGVAR(weaponEvent), [PLAYER_UNIT, _data]] call CBA_fnc_localEvent; + }; + }]]; }; // add event [QGVAR(weaponEvent), _function] call CBA_fnc_addEventHandler // return id }; + +case ("loadout"): { + // add loop for polling if it doesn't exist yet + if (isNil {GVAR(addedPlayerEvents) getVariable _type}) then { + GVAR(oldLoadout) = []; + GVAR(oldLoadoutNoAmmo) = []; + GVAR(addedPlayerEvents) setVariable [_type, addMissionEventHandler ["EachFrame", { + private _data = getUnitLoadout PLAYER_UNIT; + if !(_data isEqualTo GVAR(oldLoadout)) then { + GVAR(oldLoadout) = _data; + + // we don't want to trigger this just because your ammo counter decreased. + _data = + GVAR(oldLoadout); + + { + private _weaponInfo = _data param [_forEachIndex, []]; + if !(_weaponInfo isEqualTo []) then { + _weaponInfo set [4, _x]; + _weaponInfo deleteAt 5; + }; + } forEach [primaryWeaponMagazine PLAYER_UNIT, secondaryWeaponMagazine PLAYER_UNIT, handgunMagazine PLAYER_UNIT]; + + if !(_data isEqualTo GVAR(oldLoadoutNoAmmo)) then { + GVAR(oldLoadoutNoAmmo) = _data; + [QGVAR(loadoutEvent), [PLAYER_UNIT, GVAR(oldLoadout)]] call CBA_fnc_localEvent; + }; + }; + }]]; + }; + + // add event + [QGVAR(loadoutEvent), _function] call CBA_fnc_addEventHandler // return id +}; + +case ("vehicle"): { + // add loop for polling if it doesn't exist yet + if (isNil {GVAR(addedPlayerEvents) getVariable _type}) then { + GVAR(oldVehicle) = objNull; + GVAR(addedPlayerEvents) setVariable [_type, addMissionEventHandler ["EachFrame", { + private _data = vehicle PLAYER_UNIT; + if !(_data isEqualTo GVAR(oldVehicle)) then { + GVAR(oldVehicle) = _data; + [QGVAR(vehicleEvent), [PLAYER_UNIT, _data]] call CBA_fnc_localEvent; + }; + }]]; + }; + + // add event + [QGVAR(vehicleEvent), _function] call CBA_fnc_addEventHandler // return id +}; + +case ("turret"): { + // add loop for polling if it doesn't exist yet + if (isNil {GVAR(addedPlayerEvents) getVariable _type}) then { + GVAR(oldTurret) = []; + GVAR(addedPlayerEvents) setVariable [_type, addMissionEventHandler ["EachFrame", { + private _data = PLAYER_UNIT call CBA_fnc_turretPath; + if !(_data isEqualTo GVAR(oldTurret)) then { + GVAR(oldTurret) = _data; + [QGVAR(turretEvent), [PLAYER_UNIT, _data]] call CBA_fnc_localEvent; + }; + }]]; + }; + + // add event + [QGVAR(turretEvent), _function] call CBA_fnc_addEventHandler // return id +}; + +case ("visionmode"): { + // add loop for polling if it doesn't exist yet + if (isNil {GVAR(addedPlayerEvents) getVariable _type}) then { + GVAR(oldVisionMode) = -1; + GVAR(addedPlayerEvents) setVariable [_type, addMissionEventHandler ["EachFrame", { + private _data = currentVisionMode PLAYER_UNIT; + if !(_data isEqualTo GVAR(oldVisionMode)) then { + GVAR(oldVisionMode) = _data; + [QGVAR(visionModeEvent), [PLAYER_UNIT, _data]] call CBA_fnc_localEvent; + }; + }]]; + }; + + // add event + [QGVAR(visionModeEvent), _function] call CBA_fnc_addEventHandler // return id +}; + +case ("cameraview"): { + // add loop for polling if it doesn't exist yet + if (isNil {GVAR(addedPlayerEvents) getVariable _type}) then { + GVAR(oldCameraView) = ""; + GVAR(addedPlayerEvents) setVariable [_type, addMissionEventHandler ["EachFrame", { + private _data = cameraView; + if !(_data isEqualTo GVAR(oldCameraView)) then { + GVAR(oldCameraView) = _data; + [QGVAR(cameraViewEvent), [PLAYER_UNIT, _data]] call CBA_fnc_localEvent; + }; + }]]; + }; + + // add event + [QGVAR(cameraViewEvent), _function] call CBA_fnc_addEventHandler // return id +}; + +case ("visiblemap"): { + // add loop for polling if it doesn't exist yet + if (isNil {GVAR(addedPlayerEvents) getVariable _type}) then { + GVAR(oldVisibleMap) = false; + GVAR(addedPlayerEvents) setVariable [_type, addMissionEventHandler ["EachFrame", { + private _data = visibleMap; + if !(_data isEqualTo GVAR(oldVisibleMap)) then { + GVAR(oldVisibleMap) = _data; + [QGVAR(visibleMapEvent), [PLAYER_UNIT, _data]] call CBA_fnc_localEvent; + }; + }]]; + }; + + // add event + [QGVAR(visibleMapEvent), _function] call CBA_fnc_addEventHandler // return id +}; default {-1}; }; diff --git a/addons/events/fnc_removePlayerEventHandler.sqf b/addons/events/fnc_removePlayerEventHandler.sqf new file mode 100644 index 000000000..364c6763e --- /dev/null +++ b/addons/events/fnc_removePlayerEventHandler.sqf @@ -0,0 +1,60 @@ +/* ---------------------------------------------------------------------------- +Function: CBA_fnc_removePlayerEventHandler + +Description: + Removes a player event handler. + +Parameters: + _type - Event handler type. + _id - The ID of the event handler. + +Returns: + None + +Examples: + (begin example) + ["unit", _id] call CBA_fnc_removePlayerEventHandler; + (end) + +Author: + commy2 +---------------------------------------------------------------------------- */ +#include "script_component.hpp" +SCRIPT(removePlayerEventHandler); + +params [["_type", "", [""]], ["_id", -1, [0]]]; + +switch (toLower _type) do { +case ("unit"): { + [QGVAR(unitEvent), _id] call CBA_fnc_removeEventHandler; +}; + +case ("weapon"): { + [QGVAR(weaponEvent), _id] call CBA_fnc_removeEventHandler; +}; + +case ("loadout"): { + [QGVAR(loadoutEvent), _id] call CBA_fnc_removeEventHandler; +}; + +case ("vehicle"): { + [QGVAR(vehicleEvent), _id] call CBA_fnc_removeEventHandler; +}; + +case ("turret"): { + [QGVAR(turretEvent), _id] call CBA_fnc_removeEventHandler; +}; + +case ("visionmode"): { + [QGVAR(visionModeEvent), _id] call CBA_fnc_removeEventHandler; +}; + +case ("cameraview"): { + [QGVAR(cameraViewEvent), _id] call CBA_fnc_removeEventHandler; +}; + +case ("visiblemap"): { + [QGVAR(visibleMapEvent), _id] call CBA_fnc_removeEventHandler; +}; +default {nil}; +}; From 36a40db4fed6fd3e3c1267b260264626a53156e4 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 15 May 2016 08:10:42 +0200 Subject: [PATCH 3/4] move all checks in one loop --- addons/events/fnc_addPlayerEventHandler.sqf | 217 +++++++----------- .../events/fnc_removePlayerEventHandler.sqf | 7 - 2 files changed, 83 insertions(+), 141 deletions(-) diff --git a/addons/events/fnc_addPlayerEventHandler.sqf b/addons/events/fnc_addPlayerEventHandler.sqf index 59df17418..b9cc64d87 100644 --- a/addons/events/fnc_addPlayerEventHandler.sqf +++ b/addons/events/fnc_addPlayerEventHandler.sqf @@ -32,165 +32,114 @@ Author: #include "script_component.hpp" SCRIPT(addPlayerEventHandler); -#define PLAYER_UNIT (missionNamespace getVariable ["bis_fnc_moduleRemoteControl_unit", player]) - params [["_type", "", [""]], ["_function", {}, [{}]]]; -if (isNil QGVAR(addedPlayerEvents)) then { - GVAR(addedPlayerEvents) = [] call CBA_fnc_createNamespace; -}; - -switch (toLower _type) do { +private _id = switch (toLower _type) do { case ("unit"): { - // add loop for polling if it doesn't exist yet - if (isNil {GVAR(addedPlayerEvents) getVariable _type}) then { - GVAR(oldUnit) = objNull; - GVAR(addedPlayerEvents) setVariable [_type, addMissionEventHandler ["EachFrame", { - private _data = PLAYER_UNIT; - if !(_data isEqualTo GVAR(oldUnit)) then { - GVAR(oldUnit) = _data; - [QGVAR(unitEvent), [_data]] call CBA_fnc_localEvent; - }; - }]]; - }; - - // add event [QGVAR(unitEvent), _function] call CBA_fnc_addEventHandler // return id }; - case ("weapon"): { - // add loop for polling if it doesn't exist yet - if (isNil {GVAR(addedPlayerEvents) getVariable _type}) then { - GVAR(oldWeapon) = ""; - GVAR(addedPlayerEvents) setVariable [_type, addMissionEventHandler ["EachFrame", { - private _data = currentWeapon PLAYER_UNIT; - if !(_data isEqualTo GVAR(oldWeapon)) then { - GVAR(oldWeapon) = _data; - [QGVAR(weaponEvent), [PLAYER_UNIT, _data]] call CBA_fnc_localEvent; - }; - }]]; - }; - - // add event [QGVAR(weaponEvent), _function] call CBA_fnc_addEventHandler // return id }; - case ("loadout"): { - // add loop for polling if it doesn't exist yet - if (isNil {GVAR(addedPlayerEvents) getVariable _type}) then { - GVAR(oldLoadout) = []; - GVAR(oldLoadoutNoAmmo) = []; - GVAR(addedPlayerEvents) setVariable [_type, addMissionEventHandler ["EachFrame", { - private _data = getUnitLoadout PLAYER_UNIT; - if !(_data isEqualTo GVAR(oldLoadout)) then { - GVAR(oldLoadout) = _data; - - // we don't want to trigger this just because your ammo counter decreased. - _data = + GVAR(oldLoadout); - - { - private _weaponInfo = _data param [_forEachIndex, []]; - if !(_weaponInfo isEqualTo []) then { - _weaponInfo set [4, _x]; - _weaponInfo deleteAt 5; - }; - } forEach [primaryWeaponMagazine PLAYER_UNIT, secondaryWeaponMagazine PLAYER_UNIT, handgunMagazine PLAYER_UNIT]; - - if !(_data isEqualTo GVAR(oldLoadoutNoAmmo)) then { - GVAR(oldLoadoutNoAmmo) = _data; - [QGVAR(loadoutEvent), [PLAYER_UNIT, GVAR(oldLoadout)]] call CBA_fnc_localEvent; - }; - }; - }]]; - }; - - // add event [QGVAR(loadoutEvent), _function] call CBA_fnc_addEventHandler // return id }; - case ("vehicle"): { - // add loop for polling if it doesn't exist yet - if (isNil {GVAR(addedPlayerEvents) getVariable _type}) then { - GVAR(oldVehicle) = objNull; - GVAR(addedPlayerEvents) setVariable [_type, addMissionEventHandler ["EachFrame", { - private _data = vehicle PLAYER_UNIT; - if !(_data isEqualTo GVAR(oldVehicle)) then { - GVAR(oldVehicle) = _data; - [QGVAR(vehicleEvent), [PLAYER_UNIT, _data]] call CBA_fnc_localEvent; - }; - }]]; - }; - - // add event [QGVAR(vehicleEvent), _function] call CBA_fnc_addEventHandler // return id }; - case ("turret"): { - // add loop for polling if it doesn't exist yet - if (isNil {GVAR(addedPlayerEvents) getVariable _type}) then { - GVAR(oldTurret) = []; - GVAR(addedPlayerEvents) setVariable [_type, addMissionEventHandler ["EachFrame", { - private _data = PLAYER_UNIT call CBA_fnc_turretPath; - if !(_data isEqualTo GVAR(oldTurret)) then { - GVAR(oldTurret) = _data; - [QGVAR(turretEvent), [PLAYER_UNIT, _data]] call CBA_fnc_localEvent; - }; - }]]; - }; - - // add event [QGVAR(turretEvent), _function] call CBA_fnc_addEventHandler // return id }; - case ("visionmode"): { - // add loop for polling if it doesn't exist yet - if (isNil {GVAR(addedPlayerEvents) getVariable _type}) then { - GVAR(oldVisionMode) = -1; - GVAR(addedPlayerEvents) setVariable [_type, addMissionEventHandler ["EachFrame", { - private _data = currentVisionMode PLAYER_UNIT; - if !(_data isEqualTo GVAR(oldVisionMode)) then { - GVAR(oldVisionMode) = _data; - [QGVAR(visionModeEvent), [PLAYER_UNIT, _data]] call CBA_fnc_localEvent; - }; - }]]; - }; - - // add event [QGVAR(visionModeEvent), _function] call CBA_fnc_addEventHandler // return id }; - case ("cameraview"): { - // add loop for polling if it doesn't exist yet - if (isNil {GVAR(addedPlayerEvents) getVariable _type}) then { - GVAR(oldCameraView) = ""; - GVAR(addedPlayerEvents) setVariable [_type, addMissionEventHandler ["EachFrame", { - private _data = cameraView; - if !(_data isEqualTo GVAR(oldCameraView)) then { - GVAR(oldCameraView) = _data; - [QGVAR(cameraViewEvent), [PLAYER_UNIT, _data]] call CBA_fnc_localEvent; - }; - }]]; - }; - - // add event [QGVAR(cameraViewEvent), _function] call CBA_fnc_addEventHandler // return id }; - case ("visiblemap"): { - // add loop for polling if it doesn't exist yet - if (isNil {GVAR(addedPlayerEvents) getVariable _type}) then { - GVAR(oldVisibleMap) = false; - GVAR(addedPlayerEvents) setVariable [_type, addMissionEventHandler ["EachFrame", { - private _data = visibleMap; - if !(_data isEqualTo GVAR(oldVisibleMap)) then { - GVAR(oldVisibleMap) = _data; - [QGVAR(visibleMapEvent), [PLAYER_UNIT, _data]] call CBA_fnc_localEvent; - }; - }]]; - }; - - // add event [QGVAR(visibleMapEvent), _function] call CBA_fnc_addEventHandler // return id }; default {-1}; }; + +// add loop for polling if it doesn't exist yet +if (isNil QGVAR(pollingLoopAdded) && {_id != -1}) then { + GVAR(pollingLoopAdded) = true; + + GVAR(oldUnit) = objNull; + GVAR(oldWeapon) = ""; + GVAR(oldLoadout) = []; + GVAR(oldLoadoutNoAmmo) = []; + GVAR(oldVehicle) = objNull; + GVAR(oldTurret) = []; + GVAR(oldVisionMode) = -1; + GVAR(oldCameraView) = ""; + GVAR(oldVisibleMap) = false; + + addMissionEventHandler ["EachFrame", { + private _player = call CBA_fnc_currentUnit; + if !(_player isEqualTo GVAR(oldUnit)) then { + GVAR(oldUnit) = _player; + [QGVAR(unitEvent), [_player]] call CBA_fnc_localEvent; + }; + + private _data = currentWeapon _player; + if !(_data isEqualTo GVAR(oldWeapon)) then { + GVAR(oldWeapon) = _data; + [QGVAR(weaponEvent), [_player, _data]] call CBA_fnc_localEvent; + }; + + _data = getUnitLoadout _player; + if !(_data isEqualTo GVAR(oldLoadout)) then { + GVAR(oldLoadout) = _data; + + // we don't want to trigger this just because your ammo counter decreased. + _data = + GVAR(oldLoadout); + + { + private _weaponInfo = _data param [_forEachIndex, []]; + if !(_weaponInfo isEqualTo []) then { + _weaponInfo set [4, _x]; + _weaponInfo deleteAt 5; + }; + } forEach [primaryWeaponMagazine _player, secondaryWeaponMagazine _player, handgunMagazine _player]; + + if !(_data isEqualTo GVAR(oldLoadoutNoAmmo)) then { + GVAR(oldLoadoutNoAmmo) = _data; + [QGVAR(loadoutEvent), [_player, GVAR(oldLoadout)]] call CBA_fnc_localEvent; + }; + }; + + _data = vehicle _player; + if !(_data isEqualTo GVAR(oldVehicle)) then { + GVAR(oldVehicle) = _data; + [QGVAR(vehicleEvent), [_player, _data]] call CBA_fnc_localEvent; + }; + + _data = _player call CBA_fnc_turretPath; + if !(_data isEqualTo GVAR(oldTurret)) then { + GVAR(oldTurret) = _data; + [QGVAR(turretEvent), [_player, _data]] call CBA_fnc_localEvent; + }; + + _data = currentVisionMode _player; + if !(_data isEqualTo GVAR(oldVisionMode)) then { + GVAR(oldVisionMode) = _data; + [QGVAR(visionModeEvent), [_player, _data]] call CBA_fnc_localEvent; + }; + + _data = cameraView; + if !(_data isEqualTo GVAR(oldCameraView)) then { + GVAR(oldCameraView) = _data; + [QGVAR(cameraViewEvent), [_player, _data]] call CBA_fnc_localEvent; + }; + + _data = visibleMap; + if !(_data isEqualTo GVAR(oldVisibleMap)) then { + GVAR(oldVisibleMap) = _data; + [QGVAR(visibleMapEvent), [_player, _data]] call CBA_fnc_localEvent; + }; + }]; +}; + +_id diff --git a/addons/events/fnc_removePlayerEventHandler.sqf b/addons/events/fnc_removePlayerEventHandler.sqf index 364c6763e..851b94aeb 100644 --- a/addons/events/fnc_removePlayerEventHandler.sqf +++ b/addons/events/fnc_removePlayerEventHandler.sqf @@ -28,31 +28,24 @@ switch (toLower _type) do { case ("unit"): { [QGVAR(unitEvent), _id] call CBA_fnc_removeEventHandler; }; - case ("weapon"): { [QGVAR(weaponEvent), _id] call CBA_fnc_removeEventHandler; }; - case ("loadout"): { [QGVAR(loadoutEvent), _id] call CBA_fnc_removeEventHandler; }; - case ("vehicle"): { [QGVAR(vehicleEvent), _id] call CBA_fnc_removeEventHandler; }; - case ("turret"): { [QGVAR(turretEvent), _id] call CBA_fnc_removeEventHandler; }; - case ("visionmode"): { [QGVAR(visionModeEvent), _id] call CBA_fnc_removeEventHandler; }; - case ("cameraview"): { [QGVAR(cameraViewEvent), _id] call CBA_fnc_removeEventHandler; }; - case ("visiblemap"): { [QGVAR(visibleMapEvent), _id] call CBA_fnc_removeEventHandler; }; From 0c3c2bdef17059f72ecf48dcebd078777bd39368 Mon Sep 17 00:00:00 2001 From: commy2 Date: Mon, 16 May 2016 09:36:11 +0200 Subject: [PATCH 4/4] remove EachFrame handler if all events are removed --- addons/common/fnc_currentUnit.sqf | 3 +- addons/events/fnc_addPlayerEventHandler.sqf | 158 +++++++++--------- .../events/fnc_removePlayerEventHandler.sqf | 15 +- 3 files changed, 97 insertions(+), 79 deletions(-) diff --git a/addons/common/fnc_currentUnit.sqf b/addons/common/fnc_currentUnit.sqf index 10aad5f8c..61834a80a 100644 --- a/addons/common/fnc_currentUnit.sqf +++ b/addons/common/fnc_currentUnit.sqf @@ -2,8 +2,7 @@ Function: CBA_fnc_currentUnit Description: - Returns the currently controlled unit. - Different from "player" when remote controlling units via zeus. + Returns the controlled unit. ("player" or remote controlled unit via zeus) Parameters: None diff --git a/addons/events/fnc_addPlayerEventHandler.sqf b/addons/events/fnc_addPlayerEventHandler.sqf index b9cc64d87..daf585b63 100644 --- a/addons/events/fnc_addPlayerEventHandler.sqf +++ b/addons/events/fnc_addPlayerEventHandler.sqf @@ -34,7 +34,9 @@ SCRIPT(addPlayerEventHandler); params [["_type", "", [""]], ["_function", {}, [{}]]]; -private _id = switch (toLower _type) do { +_type = toLower _type; + +private _id = switch (_type) do { case ("unit"): { [QGVAR(unitEvent), _function] call CBA_fnc_addEventHandler // return id }; @@ -62,84 +64,88 @@ case ("visiblemap"): { default {-1}; }; -// add loop for polling if it doesn't exist yet -if (isNil QGVAR(pollingLoopAdded) && {_id != -1}) then { - GVAR(pollingLoopAdded) = true; - - GVAR(oldUnit) = objNull; - GVAR(oldWeapon) = ""; - GVAR(oldLoadout) = []; - GVAR(oldLoadoutNoAmmo) = []; - GVAR(oldVehicle) = objNull; - GVAR(oldTurret) = []; - GVAR(oldVisionMode) = -1; - GVAR(oldCameraView) = ""; - GVAR(oldVisibleMap) = false; - - addMissionEventHandler ["EachFrame", { - private _player = call CBA_fnc_currentUnit; - if !(_player isEqualTo GVAR(oldUnit)) then { - GVAR(oldUnit) = _player; - [QGVAR(unitEvent), [_player]] call CBA_fnc_localEvent; - }; - - private _data = currentWeapon _player; - if !(_data isEqualTo GVAR(oldWeapon)) then { - GVAR(oldWeapon) = _data; - [QGVAR(weaponEvent), [_player, _data]] call CBA_fnc_localEvent; - }; - - _data = getUnitLoadout _player; - if !(_data isEqualTo GVAR(oldLoadout)) then { - GVAR(oldLoadout) = _data; - - // we don't want to trigger this just because your ammo counter decreased. - _data = + GVAR(oldLoadout); - - { - private _weaponInfo = _data param [_forEachIndex, []]; - if !(_weaponInfo isEqualTo []) then { - _weaponInfo set [4, _x]; - _weaponInfo deleteAt 5; +if (_id != -1) then { + // add loop for polling if it doesn't exist yet + if (isNil QGVAR(playerEHInfo)) then { + GVAR(playerEHInfo) = []; + + GVAR(oldUnit) = objNull; + GVAR(oldWeapon) = ""; + GVAR(oldLoadout) = []; + GVAR(oldLoadoutNoAmmo) = []; + GVAR(oldVehicle) = objNull; + GVAR(oldTurret) = []; + GVAR(oldVisionMode) = -1; + GVAR(oldCameraView) = ""; + GVAR(oldVisibleMap) = false; + + GVAR(playerEHInfo) pushBack addMissionEventHandler ["EachFrame", { + private _player = call CBA_fnc_currentUnit; + if !(_player isEqualTo GVAR(oldUnit)) then { + GVAR(oldUnit) = _player; + [QGVAR(unitEvent), [_player]] call CBA_fnc_localEvent; + }; + + private _data = currentWeapon _player; + if !(_data isEqualTo GVAR(oldWeapon)) then { + GVAR(oldWeapon) = _data; + [QGVAR(weaponEvent), [_player, _data]] call CBA_fnc_localEvent; + }; + + _data = getUnitLoadout _player; + if !(_data isEqualTo GVAR(oldLoadout)) then { + GVAR(oldLoadout) = _data; + + // we don't want to trigger this just because your ammo counter decreased. + _data = + GVAR(oldLoadout); + + { + private _weaponInfo = _data param [_forEachIndex, []]; + if !(_weaponInfo isEqualTo []) then { + _weaponInfo set [4, _x]; + _weaponInfo deleteAt 5; + }; + } forEach [primaryWeaponMagazine _player, secondaryWeaponMagazine _player, handgunMagazine _player]; + + if !(_data isEqualTo GVAR(oldLoadoutNoAmmo)) then { + GVAR(oldLoadoutNoAmmo) = _data; + [QGVAR(loadoutEvent), [_player, GVAR(oldLoadout)]] call CBA_fnc_localEvent; }; - } forEach [primaryWeaponMagazine _player, secondaryWeaponMagazine _player, handgunMagazine _player]; + }; - if !(_data isEqualTo GVAR(oldLoadoutNoAmmo)) then { - GVAR(oldLoadoutNoAmmo) = _data; - [QGVAR(loadoutEvent), [_player, GVAR(oldLoadout)]] call CBA_fnc_localEvent; + _data = vehicle _player; + if !(_data isEqualTo GVAR(oldVehicle)) then { + GVAR(oldVehicle) = _data; + [QGVAR(vehicleEvent), [_player, _data]] call CBA_fnc_localEvent; }; - }; - - _data = vehicle _player; - if !(_data isEqualTo GVAR(oldVehicle)) then { - GVAR(oldVehicle) = _data; - [QGVAR(vehicleEvent), [_player, _data]] call CBA_fnc_localEvent; - }; - - _data = _player call CBA_fnc_turretPath; - if !(_data isEqualTo GVAR(oldTurret)) then { - GVAR(oldTurret) = _data; - [QGVAR(turretEvent), [_player, _data]] call CBA_fnc_localEvent; - }; - - _data = currentVisionMode _player; - if !(_data isEqualTo GVAR(oldVisionMode)) then { - GVAR(oldVisionMode) = _data; - [QGVAR(visionModeEvent), [_player, _data]] call CBA_fnc_localEvent; - }; - - _data = cameraView; - if !(_data isEqualTo GVAR(oldCameraView)) then { - GVAR(oldCameraView) = _data; - [QGVAR(cameraViewEvent), [_player, _data]] call CBA_fnc_localEvent; - }; - - _data = visibleMap; - if !(_data isEqualTo GVAR(oldVisibleMap)) then { - GVAR(oldVisibleMap) = _data; - [QGVAR(visibleMapEvent), [_player, _data]] call CBA_fnc_localEvent; - }; - }]; + + _data = _player call CBA_fnc_turretPath; + if !(_data isEqualTo GVAR(oldTurret)) then { + GVAR(oldTurret) = _data; + [QGVAR(turretEvent), [_player, _data]] call CBA_fnc_localEvent; + }; + + _data = currentVisionMode _player; + if !(_data isEqualTo GVAR(oldVisionMode)) then { + GVAR(oldVisionMode) = _data; + [QGVAR(visionModeEvent), [_player, _data]] call CBA_fnc_localEvent; + }; + + _data = cameraView; + if !(_data isEqualTo GVAR(oldCameraView)) then { + GVAR(oldCameraView) = _data; + [QGVAR(cameraViewEvent), [_player, _data]] call CBA_fnc_localEvent; + }; + + _data = visibleMap; + if !(_data isEqualTo GVAR(oldVisibleMap)) then { + GVAR(oldVisibleMap) = _data; + [QGVAR(visibleMapEvent), [_player, _data]] call CBA_fnc_localEvent; + }; + }]; + }; + + GVAR(playerEHInfo) pushBack [_type, _id]; }; _id diff --git a/addons/events/fnc_removePlayerEventHandler.sqf b/addons/events/fnc_removePlayerEventHandler.sqf index 851b94aeb..2fe679bf7 100644 --- a/addons/events/fnc_removePlayerEventHandler.sqf +++ b/addons/events/fnc_removePlayerEventHandler.sqf @@ -24,7 +24,9 @@ SCRIPT(removePlayerEventHandler); params [["_type", "", [""]], ["_id", -1, [0]]]; -switch (toLower _type) do { +_type = toLower _type; + +switch (_type) do { case ("unit"): { [QGVAR(unitEvent), _id] call CBA_fnc_removeEventHandler; }; @@ -51,3 +53,14 @@ case ("visiblemap"): { }; default {nil}; }; + +if (!isNil QGVAR(playerEHInfo)) then { + GVAR(playerEHInfo) deleteAt (GVAR(playerEHInfo) find [_type, _id]); + + if (count GVAR(playerEHInfo) == 1) then { + removeMissionEventHandler ["EachFrame", GVAR(playerEHInfo) select 0]; + GVAR(playerEHInfo) = nil; + }; +}; + +nil