Add localUnits array and use that inside medical statemachines (#4836)

* Added localUnits EH

Code by @Commy2

* Init localUnits Variable

* use localUnits for medical_blood statemachine

* use localUnits for medical_ai statemachine

* Remove bracket hell

* Add Deleted EH

* Run at preInit, move to seperate file

* Handle Respawns, Filter Dead

* Add detection for Fake deleted EH

* Use a getter function

* delete all objNull at deletedEH

* Cleanup header/comments

* Move isBleeding check to inside statemachine

* opps

* debug off
This commit is contained in:
Dedmen Miller 2019-02-27 06:28:16 +01:00 committed by PabstMirror
parent 4792e74b2b
commit 7f04d00b7f
7 changed files with 107 additions and 3 deletions

View File

@ -65,6 +65,7 @@ PREP(getFirstObjectIntersection);
PREP(getFirstTerrainIntersection);
PREP(getGunner);
PREP(getInPosition);
PREP(getLocalUnits);
PREP(getMapData);
PREP(getMapGridData);
PREP(getMapGridFromPos);
@ -156,6 +157,7 @@ PREP(setPitchBankYaw);
PREP(setPlayerOwner);
PREP(setProne);
PREP(setSetting);
PREP(setupLocalUnitsHandler);
PREP(setVariableJIP);
PREP(setVariablePublic);
PREP(setVolume);

View File

@ -27,6 +27,8 @@ GVAR(statusEffect_isGlobal) = [];
GVAR(setHearingCapabilityMap) = [];
[] call FUNC(setupLocalUnitsHandler); // Add local units event handlers (ace_common_localUnits)
//////////////////////////////////////////////////
// Set up PlayerChanged eventhandler for pre init (EH is installed in postInit)
//////////////////////////////////////////////////

View File

@ -0,0 +1,23 @@
#include "script_component.hpp"
/*
* Author: dedmen
* Gets localUnits array filtering out nullObjects.
* If you can handle null objects you can use the array `ace_common_localUnits` directly.
* Should be equivalent to `allUnits select {local _x}`
*
* Arguments:
* Nothing
*
* Return Value:
* Array of local Units <ARRAY>
*
* Example:
* [] call ace_common_fnc_getLocalUnits
*
* Public: Yes
*/
// Remove null objects
GVAR(localUnits) = GVAR(localUnits) - [objNull];
GVAR(localUnits)

View File

@ -0,0 +1,76 @@
#include "script_component.hpp"
/*
* Author: dedmen
* Adds the local unit event handlers.
* Access with function `ace_common_fnc_getLocalUnits` or array `ace_common_localUnits`
*
* Arguments:
* Nothing
*
* Return Value:
* Nothing
*
* Example:
* [] call ace_common_fnc_setupLocalUnitsHandler
*
* Public: No
*/
GVAR(localUnits) = [];
// Eventhandlers to maintain array of localUnits
["CAManBase", "init", {
params ["_unit"];
TRACE_2("unit init",_unit,local _unit);
if (local _unit) then {
if (!alive _unit) exitWith {};
GVAR(localUnits) pushBack _unit;
};
}] call CBA_fnc_addClassEventHandler;
["CAManBase", "respawn", {
params ["_unit"];
TRACE_2("unit respawn",_unit,local _unit);
if (local _unit) then {
if (!alive _unit) exitWith {};
GVAR(localUnits) pushBack _unit;
};
}] call CBA_fnc_addClassEventHandler;
["CAManBase", "local", {
params ["_unit", "_local"];
TRACE_2("unit local",_unit,_local);
if (_local) then {
if (!alive _unit) exitWith {};
GVAR(localUnits) pushBack _unit;
} else {
GVAR(localUnits) deleteAt (GVAR(localUnits) find _unit);
};
}] call CBA_fnc_addClassEventHandler;
["CAManBase", "deleted", {
params ["_unit"];
TRACE_2("unit deleted",_unit,local _unit);
if (local _unit) then {
[{
params ["_unit"];
TRACE_3("unit deleted nextFrame",_unit,local _unit,isNull _unit);
if (isNull _unit) then { // If it is not null then the deleted EH was Fake.
GVAR(localUnits) = GVAR(localUnits) - [objNull];
};
}, [_unit]] call CBA_fnc_execNextFrame;
};
}] call CBA_fnc_addClassEventHandler;
["CAManBase", "killed", {
params ["_unit"];
TRACE_2("unit killed",_unit,local _unit);
if (local _unit) then {
GVAR(localUnits) deleteAt (GVAR(localUnits) find _unit);
};
}] call CBA_fnc_addClassEventHandler;

View File

@ -1,5 +1,5 @@
class GVAR(stateMachine) {
list = "allUnits select {local _x}";
list = QUOTE(call EFUNC(common,getLocalUnits));
skipNull = 1;
class Initial {

View File

@ -28,9 +28,9 @@ if (isServer) then {
if ((GVAR(enabledFor) == 1) && {!hasInterface}) exitWith {}; // 1: enabledFor_OnlyPlayers
private _listcode = if (GVAR(enabledFor) == 1) then {
{[ACE_player] select {[_x] call FUNC(isBleeding)}} // ace_player is only possible local player
{[ACE_player]} // ace_player is only possible local player
} else {
{allUnits select {(local _x) && {[_x] call FUNC(isBleeding)}}}; // filter all local bleeding units
EFUNC(common,getLocalUnits) // filter all local units
};
private _stateMachine = [_listcode, true] call CBA_statemachine_fnc_create;

View File

@ -17,6 +17,7 @@
params ["_unit"];
if (!([_unit] call FUNC(isBleeding))) exitWith {};
if (((vehicle _unit) != _unit) && {!((vehicle _unit) isKindOf "StaticWeapon")}) exitWith {}; // Don't bleed on ground if mounted
private _lastTime = _unit getVariable [QGVAR(lastTime), -10];