diff --git a/addons/killers/XEH_PREP.hpp b/addons/killers/XEH_PREP.hpp index 287b612..981d9ba 100644 --- a/addons/killers/XEH_PREP.hpp +++ b/addons/killers/XEH_PREP.hpp @@ -11,6 +11,7 @@ PREP(initConfig); PREP(initKillersBase); PREP(initKillersStashes); PREP(initStartPositions); +PREP(isKiller); PREP(killerHandcuffed); PREP(killerKilled); PREP(killerRespawned); diff --git a/addons/killers/XEH_postInit.sqf b/addons/killers/XEH_postInit.sqf index a9227b8..a936ce6 100644 --- a/addons/killers/XEH_postInit.sqf +++ b/addons/killers/XEH_postInit.sqf @@ -59,7 +59,7 @@ if (hasInterface) then { if (!(local (_this select 0))) exitWith {}; INFO("Killer player was killed"); - [QGVAR(killerKilled), _this] call CBA_fnc_serverEvent; + [QGVAR(killerKilled), _this] call CBA_fnc_globalEvent; [{alive player}, { INFO("Killer player has respawned"); diff --git a/addons/killers/functions/fnc_isKiller.sqf b/addons/killers/functions/fnc_isKiller.sqf new file mode 100644 index 0000000..0a1f721 --- /dev/null +++ b/addons/killers/functions/fnc_isKiller.sqf @@ -0,0 +1,20 @@ +#include "script_component.hpp" +/* + * Author: 3Mydlo3 + * Function checks if given unit is a killer. + * + * Arguments: + * 0: Unit to check if it's a killer + * + * Return Value: + * True if unit is a killer + * + * Example: + * [player] call afsk_killers_fnc_isKiller + * + * Public: No + */ + +params ["_unit"]; + +_unit getVariable [QEGVAR(common,side), side _unit] isEqualTo EAST diff --git a/addons/markers/XEH_PREP.hpp b/addons/markers/XEH_PREP.hpp index d2356c4..95e7af6 100644 --- a/addons/markers/XEH_PREP.hpp +++ b/addons/markers/XEH_PREP.hpp @@ -4,5 +4,6 @@ PREP(createKillerMarker); PREP(createOrUpdateKillerMarker); PREP(deleteUnitMarker); PREP(markerDecay); +PREP(markerDecayLocal); PREP(markerDecayLoop); PREP(loop); diff --git a/addons/markers/XEH_postInit.sqf b/addons/markers/XEH_postInit.sqf index 70d871d..c23e7e7 100644 --- a/addons/markers/XEH_postInit.sqf +++ b/addons/markers/XEH_postInit.sqf @@ -16,14 +16,6 @@ if (isServer) then { }; }; -[QEGVAR(killers,killerKilled), { - _this call FUNC(deleteUnitMarker); -}] call CBA_fnc_addEventHandler; - -[QEGVAR(police,copKilled), { - _this call FUNC(deleteUnitMarker); -}] call CBA_fnc_addEventHandler; - [QGVAR(playerDisconnected), { params ["_unit", "_id", "_uid", "_name"]; [_unit] call FUNC(deleteUnitMarker); @@ -35,4 +27,20 @@ if (isServer) then { if (hasInterface) then { call FUNC(loop); + + if (playerSide isEqualTo WEST) exitWith { + [QEGVAR(killers,killerKilled), { + [QGVAR(deleteUnitMarker), [_this select 0]] call CBA_fnc_localEvent; + }] call CBA_fnc_addEventHandler; + + [QEGVAR(police,copKilled), { + [_this select 0, 1] call FUNC(markerDecayLocal); + }] call CBA_fnc_addEventHandler; + }; + + if (playerSide isEqualTo EAST) exitWith { + [QEGVAR(killers,killerKilled), { + [_this select 0] call FUNC(markerDecayLocal); + }] call CBA_fnc_addEventHandler; + }; }; diff --git a/addons/markers/XEH_preInit.sqf b/addons/markers/XEH_preInit.sqf index 8cf778f..51574b7 100644 --- a/addons/markers/XEH_preInit.sqf +++ b/addons/markers/XEH_preInit.sqf @@ -7,4 +7,6 @@ ADDON = false; // Killswitch if (!EGVAR(common,enabled)) exitWith {}; +GVAR(markersToDelete) = []; + ADDON = true; diff --git a/addons/markers/functions/fnc_deleteUnitMarker.sqf b/addons/markers/functions/fnc_deleteUnitMarker.sqf index 22fdf2a..7c5e47d 100644 --- a/addons/markers/functions/fnc_deleteUnitMarker.sqf +++ b/addons/markers/functions/fnc_deleteUnitMarker.sqf @@ -1,7 +1,8 @@ #include "script_component.hpp" /* * Author: 3Mydlo3 - * Function deletes unit marker. + * Function schedules deletion of the unit marker. + * This is done in that way to avoid leaking information via disappearing markers outside of refresh frame. * * Arguments: * 0: Unit to remove it's marker @@ -18,5 +19,5 @@ params ["_unit"]; private _marker = _unit getVariable [QGVAR(marker), ""]; -deleteMarkerLocal _marker; +GVAR(markersToDelete) pushBack _marker; _unit setVariable [QGVAR(marker), nil]; diff --git a/addons/markers/functions/fnc_loop.sqf b/addons/markers/functions/fnc_loop.sqf index a3e0178..438151e 100644 --- a/addons/markers/functions/fnc_loop.sqf +++ b/addons/markers/functions/fnc_loop.sqf @@ -15,6 +15,11 @@ * Public: No */ +{ + deleteMarkerLocal _x; +} forEach GVAR(markersToDelete); +GVAR(markersToDelete) = []; + // Move marker for every civilian { private _civilian = _x; @@ -43,13 +48,16 @@ if (playerSide isEqualTo WEST) then { } else { _marker setMarkerPosLocal (position _cop); }; - } forEach (allPlayers select {side _x isEqualTo WEST}); + } forEach (allPlayers select {[_x] call EFUNC(police,isCop)}); }; // Move marker for every killer { private _killer = _x; private _hidden = !([_killer] call EFUNC(common,appearsArmed)); + private _isInPrison = [_killer] call EFUNC(jail,isHandcuffed); + + if (_isInPrison) exitWith {}; // Check if player should be able to see killer's marker // Player must: @@ -59,18 +67,15 @@ if (playerSide isEqualTo WEST) then { if (playerSide isEqualTo EAST) then { [_killer, _hidden] call FUNC(createOrUpdateKillerMarker); } else { - private _isOrWasImprisoned = [_killer] call EFUNC(jail,isHandcuffed) - || {_killer getVariable [QEGVAR(jail,wasImprisonedRecently), false]}; + private _recentlyReleasedFromPrison = _killer getVariable [QEGVAR(jail,wasImprisonedRecently), false]; - if (_hidden && {!_isOrWasImprisoned}) exitWith { + if (_hidden && {!_recentlyReleasedFromPrison}) exitWith { [_killer, _hidden] call FUNC(createOrUpdateKillerMarker); }; - if !(_marker isEqualTo "") then { - [_killer] call FUNC(deleteUnitMarker); - }; + [_killer] call FUNC(deleteUnitMarker); }; -} forEach (allPlayers select {side _x isEqualTo EAST}); +} forEach (allPlayers select {[_x] call EFUNC(killers,isKiller)}); // Schedule next loop [FUNC(loop), [], GVAR(refreshRate)] call CBA_fnc_waitAndExecute; diff --git a/addons/markers/functions/fnc_markerDecay.sqf b/addons/markers/functions/fnc_markerDecay.sqf index 407c775..516b13d 100644 --- a/addons/markers/functions/fnc_markerDecay.sqf +++ b/addons/markers/functions/fnc_markerDecay.sqf @@ -2,10 +2,12 @@ /* * Author: 3Mydlo3 * Function starts marker decay loop with given time (in minutes) to decay by half. + * If an object is passed, it's assigned marker is retrieved. * * Arguments: - * 0: Marker + * 0: Object or marker * 1: Time to decay by half (in minutes) + * 2: Is marker local * * Return Value: * None @@ -16,10 +18,18 @@ * Public: No */ -params ["_marker", ["_decayHalfTime", 10], ["_local", false]]; +params ["_unitOrMarker", ["_decayHalfTime", 10], ["_local", false]]; // How much decay will be applied every 15 seconds private _decayRate = 1/(_decayHalfTime * 4 * 2); private _currentAlpha = markerAlpha _marker; +private _marker = if (_unitOrMarker isEqualType objNull) then { + _unitOrMarker getVariable [QGVAR(marker), ""] +} else { + _unitOrMarker +}; + +if (_marker isEqualTo "") exitWith {}; + [_marker, _decayRate, _currentAlpha, _local] call FUNC(markerDecayLoop); diff --git a/addons/markers/functions/fnc_markerDecayLocal.sqf b/addons/markers/functions/fnc_markerDecayLocal.sqf new file mode 100644 index 0000000..f9044c0 --- /dev/null +++ b/addons/markers/functions/fnc_markerDecayLocal.sqf @@ -0,0 +1,22 @@ +#include "script_component.hpp" +/* + * Author: 3Mydlo3 + * Function starts local marker decay loop with given time (in minutes) to decay by half. + * If an object is passed, it's assigned marker is retrieved. + * + * Arguments: + * 0: Object or marker + * 1: Time to decay by half (in minutes) + * + * Return Value: + * None + * + * Example: + * ["my_marker"] call afsk_common_fnc_markerDecayLocal + * + * Public: No + */ + +params ["_unitOrMarker", ["_decayHalfTime", 10]]; + +[_unitOrMarker, _decayHalfTime, true] call FUNC(markerDecay); diff --git a/addons/police/XEH_postInit.sqf b/addons/police/XEH_postInit.sqf index 19125f0..eb40ef7 100644 --- a/addons/police/XEH_postInit.sqf +++ b/addons/police/XEH_postInit.sqf @@ -76,7 +76,7 @@ if (hasInterface) then { }] call CBA_fnc_waitUntilAndExecute; player addEventHandler ["Killed", { - [QGVAR(copKilled), _this] call CBA_fnc_serverEvent; + [QGVAR(copKilled), _this] call CBA_fnc_globalEvent; }]; player addEventHandler ["Respawn", { player setUnitLoadout EGVAR(common,playerLoadout); diff --git a/addons/police/functions/fnc_isCop.sqf b/addons/police/functions/fnc_isCop.sqf index 3439aae..e5a089b 100644 --- a/addons/police/functions/fnc_isCop.sqf +++ b/addons/police/functions/fnc_isCop.sqf @@ -4,7 +4,7 @@ * Function checks whether given unit is a cop. * * Arguments: - * 0: Unit + * 0: Unit to check if it's a cop * * Return Value: * True if unit is a cop @@ -19,4 +19,4 @@ params ["_unit"]; if (isNull _unit) exitWith { false }; -_unit getVariable [QEGVAR(common,side), CIVILIAN] isEqualTo WEST +_unit getVariable [QEGVAR(common,side), side _unit] isEqualTo WEST