From 78bbe80f54ab5d33f3dde1da5ed1e6081cc93099 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 16 Jul 2016 22:57:55 +0200 Subject: [PATCH 1/6] addPerFrameHandlerLogic --- addons/common/CfgFunctions.hpp | 1 + .../common/fnc_createPerFrameHandlerLogic.sqf | 140 ++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 addons/common/fnc_createPerFrameHandlerLogic.sqf diff --git a/addons/common/CfgFunctions.hpp b/addons/common/CfgFunctions.hpp index 4ecb35b9e..615f67e26 100644 --- a/addons/common/CfgFunctions.hpp +++ b/addons/common/CfgFunctions.hpp @@ -111,6 +111,7 @@ class CfgFunctions { class Misc { F_FILEPATH(addPerFrameHandler); F_FILEPATH(removePerFrameHandler); + F_FILEPATH(createPerFrameHandlerLogic); F_FILEPATH(addPlayerAction); F_FILEPATH(removePlayerAction); F_FILEPATH(createNamespace); diff --git a/addons/common/fnc_createPerFrameHandlerLogic.sqf b/addons/common/fnc_createPerFrameHandlerLogic.sqf new file mode 100644 index 000000000..7d7b9689f --- /dev/null +++ b/addons/common/fnc_createPerFrameHandlerLogic.sqf @@ -0,0 +1,140 @@ +/* ---------------------------------------------------------------------------- +Function: CBA_fnc_createPerFrameHandlerLogic + +Description: + Creates a PFH object, that will execute code every frame, or every x number of seconds. + +Parameters: + _function - The function you wish to execute. + _delay - The amount of time in seconds between executions, 0 for every frame. (optional, default: 0) + _args - Parameters passed to the function executing. (optional) + _start - Function that is executed when the PFH is added. (optional) + _end - Function that is executed when the PFH is removed. (optional) + _runCondition - Condition that has to return true for the PFH to be executed. (optional, default {true}) + _exitCondition - Condition that has to return true to delete the PFH object. (optional, default {false}) + _private - List of local variables that are serialized between executions. (optional) + +Passed Arguments: + _this - The PFH logic. + + More variables are attached to this PFH logic than can be retrieved via 'getVariable'. (_this getVariable "params") + It is not advised to overwrite these variables with 'setVariable'! + + "params" - Parameters passed by this function. Same as _args from above. + "handle" - A number representing the handle of the PFH. + "private" - List of local variables that are serialized between executions. Same as _private from above. + "start" - Same as _start from above. + "end" - Same as _end from above. + "run" - Same as _function from above. + "run_condition" - Same as _runCondition from above. + "exit_condition" - Same as _exitCondition from above. + "serialize" - Internal reserved variable. + "deserialize" - Internal reserved variable. + + The PFH logic can be used to store additional custom variables. + +Returns: + _logic - The PFH logic. + +Examples: + (begin example) + [ + { systemChat format ["frame! params: %1", _this getVariable "params"]; }, + 0, + ["some_params", [1,2,3]], + { systemChat format ["start! params: %1", _this getVariable "params"]; _test = 127; }, + { systemChat format ["end! params: %1", _this getVariable "params"]; systemChat str [_test] }, + { random 1 > 0.5 }, + { random 1 > 0.8 }, + "_test" + ] call CBA_fnc_createPerFrameHandlerLogic; + (end) + +Author: + Nou & Jaynus, donated from ACRE project code for use by the community; commy2 +---------------------------------------------------------------------------- */ +#include "script_component.hpp" + +params [ + ["_function", {}, [{}]], + ["_delay", 0, [0]], + ["_args", [], [[]]], + ["_start", {}, [{}]], + ["_end", {}, [{}]], + ["_runCondition", {true}, [{}]], + ["_exitCondition", {false}, [{}]], + ["_private", [], ["", []]] +]; + +if (_private isEqualType "") then { + _private = [_private]; +}; + +private _logic = call CBA_fnc_createNamespace; + +_logic setVariable ["start", _start]; +_logic setVariable ["run_condition", _runCondition]; +_logic setVariable ["exit_condition", _exitCondition]; +_logic setVariable ["run", _function]; +_logic setVariable ["end", _end]; +_logic setVariable ["params", _args]; +_logic setVariable ["private", _private]; + +// prepare serialization and deserialization code +private _serialize = []; + +{ + _serialize pushBack compile format ["_logic setVariable ['%1', %1]", _x]; +} forEach (_logic getVariable "private"); + +private _deserialize = []; + +{ + _deserialize pushBack compile format ["%1 = _logic getVariable '%1'", _x]; +} forEach (_logic getVariable "private"); + +_logic setVariable ["serialize", _serialize]; +_logic setVariable ["deserialize", _deserialize]; + +// add per frame handler +private _handle = [{ + // all functions get _logic as _this param. Params inside: _logic getVariable "params"; + params ["_logic"]; + + if (isNil "_logic" || {isNull _logic}) exitWith { + (_logic getVariable "handle") call CBA_fnc_removePerFrameHandler; + }; + + // deserialize + private (_logic getVariable "private"); + { call _x } forEach (_logic getVariable "deserialize"); + + // check exit condition - exit if false + if (_logic call (_logic getVariable "exit_condition")) exitWith { + // execute end code + _logic call (_logic getVariable "end"); + + (_logic getVariable "handle") call CBA_fnc_removePerFrameHandler; + _logic call CBA_fnc_deleteNamespace; + }; + + // check Run Condition - only continue if true + if (_logic call (_logic getVariable "run_condition")) then { + // execute code + _logic call (_logic getVariable "run"); + + // serialize + { call _x } forEach (_logic getVariable "serialize"); + }; +}, _delay, _logic] call CBA_fnc_addPerFrameHandler; + +_logic setVariable ["handle", _handle]; + +// run start code +private (_logic getVariable "private"); +_logic call (_logic getVariable "start"); + +// serialize +{ call _x } forEach (_logic getVariable "serialize"); + +_logic // returns logic because you can get the handle from it, and much more From a9bea44c91b7bbe1e729d2d15e252d3c0f2afd3d Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 17 Jul 2016 22:09:40 +0200 Subject: [PATCH 2/6] don't require array for _args --- addons/common/fnc_createPerFrameHandlerLogic.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/common/fnc_createPerFrameHandlerLogic.sqf b/addons/common/fnc_createPerFrameHandlerLogic.sqf index 7d7b9689f..bf414175c 100644 --- a/addons/common/fnc_createPerFrameHandlerLogic.sqf +++ b/addons/common/fnc_createPerFrameHandlerLogic.sqf @@ -58,7 +58,7 @@ Author: params [ ["_function", {}, [{}]], ["_delay", 0, [0]], - ["_args", [], [[]]], + ["_args", []], ["_start", {}, [{}]], ["_end", {}, [{}]], ["_runCondition", {true}, [{}]], From 517cc401b10589299cc1028bd5853e96287b71ec Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 17 Jul 2016 23:48:38 +0200 Subject: [PATCH 3/6] rename 'Logic' to 'Object' --- addons/common/CfgFunctions.hpp | 2 +- ...meHandlerLogic.sqf => fnc_createPerFrameHandlerObject.sqf} | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename addons/common/{fnc_createPerFrameHandlerLogic.sqf => fnc_createPerFrameHandlerObject.sqf} (98%) diff --git a/addons/common/CfgFunctions.hpp b/addons/common/CfgFunctions.hpp index 615f67e26..883b6fdb5 100644 --- a/addons/common/CfgFunctions.hpp +++ b/addons/common/CfgFunctions.hpp @@ -111,7 +111,7 @@ class CfgFunctions { class Misc { F_FILEPATH(addPerFrameHandler); F_FILEPATH(removePerFrameHandler); - F_FILEPATH(createPerFrameHandlerLogic); + F_FILEPATH(createPerFrameHandlerObject); F_FILEPATH(addPlayerAction); F_FILEPATH(removePlayerAction); F_FILEPATH(createNamespace); diff --git a/addons/common/fnc_createPerFrameHandlerLogic.sqf b/addons/common/fnc_createPerFrameHandlerObject.sqf similarity index 98% rename from addons/common/fnc_createPerFrameHandlerLogic.sqf rename to addons/common/fnc_createPerFrameHandlerObject.sqf index bf414175c..c7d870faa 100644 --- a/addons/common/fnc_createPerFrameHandlerLogic.sqf +++ b/addons/common/fnc_createPerFrameHandlerObject.sqf @@ -1,5 +1,5 @@ /* ---------------------------------------------------------------------------- -Function: CBA_fnc_createPerFrameHandlerLogic +Function: CBA_fnc_createPerFrameHandlerObject Description: Creates a PFH object, that will execute code every frame, or every x number of seconds. @@ -47,7 +47,7 @@ Examples: { random 1 > 0.5 }, { random 1 > 0.8 }, "_test" - ] call CBA_fnc_createPerFrameHandlerLogic; + ] call CBA_fnc_createPerFrameHandlerObject; (end) Author: From 80bd99ab80d36b7cf265879f2bbdbd2dbae24183 Mon Sep 17 00:00:00 2001 From: commy2 Date: Mon, 18 Jul 2016 10:39:28 +0200 Subject: [PATCH 4/6] add function to delete pfh object --- addons/common/CfgFunctions.hpp | 1 + .../fnc_deletePerFrameHandlerObject.sqf | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 addons/common/fnc_deletePerFrameHandlerObject.sqf diff --git a/addons/common/CfgFunctions.hpp b/addons/common/CfgFunctions.hpp index 883b6fdb5..879e7c961 100644 --- a/addons/common/CfgFunctions.hpp +++ b/addons/common/CfgFunctions.hpp @@ -112,6 +112,7 @@ class CfgFunctions { F_FILEPATH(addPerFrameHandler); F_FILEPATH(removePerFrameHandler); F_FILEPATH(createPerFrameHandlerObject); + F_FILEPATH(deletePerFrameHandlerObject); F_FILEPATH(addPlayerAction); F_FILEPATH(removePlayerAction); F_FILEPATH(createNamespace); diff --git a/addons/common/fnc_deletePerFrameHandlerObject.sqf b/addons/common/fnc_deletePerFrameHandlerObject.sqf new file mode 100644 index 000000000..21016b012 --- /dev/null +++ b/addons/common/fnc_deletePerFrameHandlerObject.sqf @@ -0,0 +1,30 @@ +/* ---------------------------------------------------------------------------- +Function: CBA_fnc_deletePerFrameHandlerObject + +Description: + Deletes a PFH object that was previously created via CBA_fnc_createPerFrameHandlerObject + +Parameters: + _logic - The PFH object + +Returns: + None + +Examples: + (begin example) + _pfhLogic call CBA_fnc_deletePerFrameHandlerObject; + (end) + +Author: + commy2 +---------------------------------------------------------------------------- */ +#include "script_component.hpp" + +params [["_logic", locationNull, [locationNull]]]; + +if (!isNull _logic) then { + _logic call (_logic getVariable "end"); + + (_logic getVariable "handle") call CBA_fnc_removePerFrameHandler; + _logic call CBA_fnc_deleteNamespace; +}; From c1fa6065bb606cb8c67a22a551b64598dde6816d Mon Sep 17 00:00:00 2001 From: commy2 Date: Mon, 18 Jul 2016 11:23:16 +0200 Subject: [PATCH 5/6] fix a comment --- addons/common/fnc_createPerFrameHandlerObject.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/common/fnc_createPerFrameHandlerObject.sqf b/addons/common/fnc_createPerFrameHandlerObject.sqf index c7d870faa..272112717 100644 --- a/addons/common/fnc_createPerFrameHandlerObject.sqf +++ b/addons/common/fnc_createPerFrameHandlerObject.sqf @@ -109,7 +109,7 @@ private _handle = [{ private (_logic getVariable "private"); { call _x } forEach (_logic getVariable "deserialize"); - // check exit condition - exit if false + // check exit condition - exit if true if (_logic call (_logic getVariable "exit_condition")) exitWith { // execute end code _logic call (_logic getVariable "end"); From 70e4343aa47390c22d07519f29a2006000e71541 Mon Sep 17 00:00:00 2001 From: commy2 Date: Mon, 18 Jul 2016 11:24:46 +0200 Subject: [PATCH 6/6] make PFH object exit itself --- addons/common/fnc_deletePerFrameHandlerObject.sqf | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/addons/common/fnc_deletePerFrameHandlerObject.sqf b/addons/common/fnc_deletePerFrameHandlerObject.sqf index 21016b012..1e0a7b679 100644 --- a/addons/common/fnc_deletePerFrameHandlerObject.sqf +++ b/addons/common/fnc_deletePerFrameHandlerObject.sqf @@ -22,9 +22,4 @@ Author: params [["_logic", locationNull, [locationNull]]]; -if (!isNull _logic) then { - _logic call (_logic getVariable "end"); - - (_logic getVariable "handle") call CBA_fnc_removePerFrameHandler; - _logic call CBA_fnc_deleteNamespace; -}; +_logic setVariable ["exit_condition", {true}];