mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
Optimize Laserpointer (#4859)
* only process one unit every 0.1 seconds * exitWith to keep indentation low * use event to determine isIR and isTI * correctly remove units with turned on lights from their arrays * handle weaponAccessories command reporting nil
This commit is contained in:
parent
3ce0865913
commit
97a0624375
@ -1,4 +1,5 @@
|
|||||||
|
|
||||||
PREP(drawLaserpoint);
|
PREP(drawLaserpoint);
|
||||||
|
PREP(getNearUnits);
|
||||||
PREP(onDraw);
|
PREP(onDraw);
|
||||||
PREP(switchLaserLightMode);
|
PREP(switchLaserLightMode);
|
||||||
|
@ -7,32 +7,75 @@
|
|||||||
if (!hasInterface) exitWith {};
|
if (!hasInterface) exitWith {};
|
||||||
|
|
||||||
GVAR(nearUnits) = [];
|
GVAR(nearUnits) = [];
|
||||||
|
GVAR(index) = -1;
|
||||||
|
GVAR(laserClassesCache) = [] call CBA_fnc_createNamespace;
|
||||||
|
GVAR(redLaserUnits) = [];
|
||||||
|
GVAR(greenLaserUnits) = [];
|
||||||
|
|
||||||
#include "initKeybinds.sqf"
|
#include "initKeybinds.sqf"
|
||||||
|
|
||||||
["ace_settingsInitialized", {
|
["ace_settingsInitialized", {
|
||||||
//If not enabled, dont't add draw eventhandler or PFEH (for performance)
|
// if not enabled, dont't add draw eventhandler or PFEH (for performance)
|
||||||
if (!GVAR(enabled)) exitWith {};
|
if !(GVAR(enabled)) exitWith {};
|
||||||
|
|
||||||
// @todo. Maybe move to common?
|
|
||||||
[{
|
[{
|
||||||
// handle RHS / bugged vehicle slots
|
private _oldNearUnits = GVAR(nearUnits);
|
||||||
private _camPosAGL = positionCameraToWorld [0,0,0];
|
GVAR(nearUnits) = call FUNC(getNearUnits);
|
||||||
if !((_camPosAGL select 0) isEqualType 0) exitWith {};
|
|
||||||
|
|
||||||
private _nearUnits = [];
|
// remove units that moved away
|
||||||
{
|
{
|
||||||
_nearUnits append crew _x;
|
GVAR(redLaserUnits) deleteAt (GVAR(redLaserUnits) find _x);
|
||||||
if (count _nearUnits > 10) exitWith {
|
GVAR(greenLaserUnits) deleteAt (GVAR(greenLaserUnits) find _x);
|
||||||
_nearUnits resize 10;
|
} forEach (_oldNearUnits - GVAR(nearUnits));
|
||||||
|
}, 5, []] call CBA_fnc_addPerFrameHandler;
|
||||||
|
|
||||||
|
|
||||||
|
private _fnc_processUnit = {
|
||||||
|
params ["_unit"];
|
||||||
|
|
||||||
|
private _weapon = currentWeapon _unit;
|
||||||
|
private _laser = [(_unit weaponAccessories _weapon) select 1] param [0, ""];
|
||||||
|
|
||||||
|
if (_laser isEqualTo "") exitWith {};
|
||||||
|
|
||||||
|
private _laserID = GVAR(laserClassesCache) getVariable _laser;
|
||||||
|
|
||||||
|
if (isNil "_laserID") then {
|
||||||
|
_laserID = getNumber (configFile >> "CfgWeapons" >> _laser >> "ACE_laserpointer");
|
||||||
|
GVAR(laserClassesCache) setVariable [_laser, _laserID];
|
||||||
};
|
};
|
||||||
} forEach nearestObjects [_camPosAGL, ["AllVehicles"], 50]; // when moving this, search also for units inside vehicles. currently breaks the laser in FFV
|
|
||||||
|
|
||||||
GVAR(nearUnits) = _nearUnits;
|
if (_unit isFlashlightOn _weapon) then {
|
||||||
|
if (_laserID isEqualTo 1) exitWith {
|
||||||
|
GVAR(redLaserUnits) pushBackUnique _unit;
|
||||||
|
GVAR(greenLaserUnits) deleteAt (GVAR(greenLaserUnits) find _unit);
|
||||||
|
};
|
||||||
|
|
||||||
} , 5, []] call CBA_fnc_addPerFrameHandler;
|
if (_laserID isEqualTo 2) exitWith {
|
||||||
|
GVAR(greenLaserUnits) pushBackUnique _unit;
|
||||||
|
GVAR(redLaserUnits) deleteAt (GVAR(redLaserUnits) find _unit);
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
GVAR(redLaserUnits) deleteAt (GVAR(redLaserUnits) find _unit);
|
||||||
|
GVAR(greenLaserUnits) deleteAt (GVAR(greenLaserUnits) find _unit);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
addMissionEventHandler ["Draw3D", {
|
// custom scheduler
|
||||||
call FUNC(onDraw);
|
[{
|
||||||
}];
|
params ["_fnc_processUnit"];
|
||||||
|
|
||||||
|
ACE_player call _fnc_processUnit;
|
||||||
|
|
||||||
|
GVAR(index) = GVAR(index) + 1;
|
||||||
|
private _unit = GVAR(nearUnits) param [GVAR(index), objNull];
|
||||||
|
|
||||||
|
if (isNull _unit) exitWith {
|
||||||
|
GVAR(index) = -1;
|
||||||
|
};
|
||||||
|
|
||||||
|
_unit call _fnc_processUnit;
|
||||||
|
}, 0.1, _fnc_processUnit] call CBA_fnc_addPerFrameHandler;
|
||||||
|
|
||||||
|
addMissionEventHandler ["Draw3D", FUNC(onDraw)];
|
||||||
}] call CBA_fnc_addEventHandler;
|
}] call CBA_fnc_addEventHandler;
|
||||||
|
@ -6,4 +6,11 @@ PREP_RECOMPILE_START;
|
|||||||
#include "XEH_PREP.hpp"
|
#include "XEH_PREP.hpp"
|
||||||
PREP_RECOMPILE_END;
|
PREP_RECOMPILE_END;
|
||||||
|
|
||||||
|
["visionMode", {
|
||||||
|
params ["", "_visionMode"];
|
||||||
|
|
||||||
|
GVAR(isIR) = _visionMode isEqualTo 1;
|
||||||
|
GVAR(isTI) = _visionMode isEqualTo 2;
|
||||||
|
}] call CBA_fnc_addPlayerEventHandler;
|
||||||
|
|
||||||
ADDON = true;
|
ADDON = true;
|
||||||
|
26
addons/laserpointer/functions/fnc_getNearUnits.sqf
Normal file
26
addons/laserpointer/functions/fnc_getNearUnits.sqf
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* Author: commy2
|
||||||
|
* Reports near units.
|
||||||
|
*
|
||||||
|
* Arguments:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
* Return Value:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
* Public: No
|
||||||
|
*/
|
||||||
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
private _camPosAGL = positionCameraToWorld [0, 0, 0];
|
||||||
|
|
||||||
|
// handle RHS / bugged vehicle slots
|
||||||
|
if !((_camPosAGL select 0) isEqualType 0) exitWith {};
|
||||||
|
|
||||||
|
private _nearUnits = [];
|
||||||
|
|
||||||
|
{
|
||||||
|
_nearUnits append crew _x;
|
||||||
|
} forEach nearestObjects [_camPosAGL, ["AllVehicles"], MAX_LASER_RANGE];
|
||||||
|
|
||||||
|
_nearUnits
|
@ -12,30 +12,17 @@
|
|||||||
*/
|
*/
|
||||||
#include "script_component.hpp"
|
#include "script_component.hpp"
|
||||||
|
|
||||||
private _isIR = currentVisionMode ACE_player;
|
// no lasers in thermal mode
|
||||||
|
if !(GVAR(isTI)) then {
|
||||||
|
private _brightness = 2 - call EFUNC(common,ambientBrightness);
|
||||||
|
|
||||||
if (_isIR == 2) exitWith {};
|
{
|
||||||
|
// red laser. draw green dot anyway in IR mode
|
||||||
|
[_x, 100, GVAR(isIR), _brightness] call FUNC(drawLaserpoint);
|
||||||
|
} count GVAR(redLaserUnits);
|
||||||
|
|
||||||
_isIR = _isIR == 1;
|
{
|
||||||
|
// green laser
|
||||||
private _brightness = 2 - call EFUNC(common,ambientBrightness);
|
[_x, 100, true, _brightness] call FUNC(drawLaserpoint);
|
||||||
|
} count GVAR(greenLaserUnits);
|
||||||
{
|
};
|
||||||
private _weapon = currentWeapon _x;
|
|
||||||
private _laser = (_x weaponAccessories _weapon) select 1;
|
|
||||||
|
|
||||||
if (_laser != "") then {
|
|
||||||
private _cacheName = format [QGVAR(laser_%1), _laser];
|
|
||||||
private _laserID = missionNamespace getVariable [_cacheName, -1];
|
|
||||||
|
|
||||||
if (missionNamespace getVariable [_cacheName, -1] == -1) then {
|
|
||||||
_laserID = getNumber (configFile >> "CfgWeapons" >> _laser >> "ACE_laserpointer");
|
|
||||||
missionNamespace setVariable [_cacheName, _laserID];
|
|
||||||
};
|
|
||||||
|
|
||||||
if (_laserID > 0 && {_x isFlashlightOn _weapon}) then {
|
|
||||||
[_x, 100, (_laserID == 2 || _isIR), _brightness] call FUNC(drawLaserpoint);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
false
|
|
||||||
} count GVAR(nearUnits);
|
|
||||||
|
@ -15,3 +15,5 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "\z\ace\addons\main\script_macros.hpp"
|
#include "\z\ace\addons\main\script_macros.hpp"
|
||||||
|
|
||||||
|
#define MAX_LASER_RANGE 50
|
||||||
|
Loading…
Reference in New Issue
Block a user