From 36f148ded450ad3359bbdd9ea475f4f14c45804a Mon Sep 17 00:00:00 2001 From: Brandon Danyluk Date: Sat, 11 Dec 2021 21:24:55 -0700 Subject: [PATCH] Allow multiple cameras to exist at once. Fix script error --- addons/spike/XEH_PREP.hpp | 1 - addons/spike/XEH_postInit.sqf | 2 +- addons/spike/functions/fnc_camera_destroy.sqf | 1 + ...amera_getCameraNamespaceFromProjectile.sqf | 24 ------------------- addons/spike/functions/fnc_camera_init.sqf | 8 +++---- addons/spike/functions/fnc_camera_update.sqf | 3 +-- .../fnc_camera_updateTargetingGate.sqf | 3 +++ .../functions/fnc_camera_userInCamera.sqf | 2 +- addons/spike/functions/fnc_onFired.sqf | 12 ++++++---- addons/spike/functions/fnc_seeker.sqf | 2 +- 10 files changed, 18 insertions(+), 40 deletions(-) delete mode 100644 addons/spike/functions/fnc_camera_getCameraNamespaceFromProjectile.sqf diff --git a/addons/spike/XEH_PREP.hpp b/addons/spike/XEH_PREP.hpp index a459b6ff1d..0db716b40a 100644 --- a/addons/spike/XEH_PREP.hpp +++ b/addons/spike/XEH_PREP.hpp @@ -1,7 +1,6 @@ PREP(camera_changeZoom); PREP(camera_cycleViewMode); PREP(camera_destroy); -PREP(camera_getCameraNamespaceFromProjectile); PREP(camera_handleKeyPress); PREP(camera_init); PREP(camera_preTrack); diff --git a/addons/spike/XEH_postInit.sqf b/addons/spike/XEH_postInit.sqf index e1b13fc4fd..56c96c5031 100644 --- a/addons/spike/XEH_postInit.sqf +++ b/addons/spike/XEH_postInit.sqf @@ -21,7 +21,7 @@ if (hasInterface) then { }*/] call EFUNC(interact_menu,createAction); ["CAManBase", 1, ["ACE_SelfActions"], _switchToCameraAction, true] call EFUNC(interact_menu,addActionToClass); - GVAR(projectileCameraHash) = [[], objNull] call CBA_fnc_hashCreate; GVAR(activeCamera) = objNull; + GVAR(projectileHashMap) = createHashMap; // used in the seeker to get the namespace for the associated projectile }; diff --git a/addons/spike/functions/fnc_camera_destroy.sqf b/addons/spike/functions/fnc_camera_destroy.sqf index 960fe63dd7..bd89752e8b 100644 --- a/addons/spike/functions/fnc_camera_destroy.sqf +++ b/addons/spike/functions/fnc_camera_destroy.sqf @@ -19,6 +19,7 @@ params ["_cameraNamespace"]; private _userInThisCamera = [_cameraNamespace] call FUNC(camera_userInCamera); private _userCamera = ACE_PLAYER getVariable [QGVAR(missileCamera), objNull]; + if (_userInThisCamera || { _userCamera isEqualTo _cameraNamespace }) then { ACE_PLAYER setVariable [QGVAR(missileCamera), objNull]; }; diff --git a/addons/spike/functions/fnc_camera_getCameraNamespaceFromProjectile.sqf b/addons/spike/functions/fnc_camera_getCameraNamespaceFromProjectile.sqf deleted file mode 100644 index 1f1f6cfc9e..0000000000 --- a/addons/spike/functions/fnc_camera_getCameraNamespaceFromProjectile.sqf +++ /dev/null @@ -1,24 +0,0 @@ -#include "script_component.hpp" -/* - * Author: Brandon (TCVM) - * Switches away from the currently controlled camera - * - * Arguments: - * 0: Guidance Arg Array - * 1: PFID - * - * Return Value: - * None - * - * Example: - * [[], 0] call ace_missileguidance_fnc_guidancePFH; - * - * Public: No - */ -params ["_projectile"]; - -[GVAR(projectileCameraHash), { - !((isNil "_key") || { isNull _key }) -}] call CBA_fnc_hashFilter; -[GVAR(projectileCameraHash), _projectile] call CBA_fnc_hashGet; - diff --git a/addons/spike/functions/fnc_camera_init.sqf b/addons/spike/functions/fnc_camera_init.sqf index f90003b5e0..8f9ef06fbe 100644 --- a/addons/spike/functions/fnc_camera_init.sqf +++ b/addons/spike/functions/fnc_camera_init.sqf @@ -8,7 +8,7 @@ * 1: PFID * * Return Value: - * None + * The camera * * Example: * [[], 0] call ace_missileguidance_fnc_guidancePFH; @@ -94,8 +94,6 @@ if (_preTrack) then { _activeCameraNamespace setVariable [QGVAR(logic), _logic]; _activeCameraNamespace setVariable [QGVAR(missile), objNull]; _activeCameraNamespace setVariable [QGVAR(logicPos), _shooter worldToModelVisual _logicPosition]; - - [GVAR(projectileCameraHash), _shooter, _activeCameraNamespace] call CBA_fnc_hashSet; } else { private _pos = getPosASL _projectile; @@ -127,10 +125,10 @@ if (_preTrack) then { _activeCameraNamespace setVariable [QGVAR(missile), _projectile]; _activeCameraNamespace setVariable [QGVAR(logicPos), _projectile vectorModelToWorldVisual _logicPosition]; - [GVAR(projectileCameraHash), _projectile, _activeCameraNamespace] call CBA_fnc_hashSet; - if (_switchOnFire) then { [_activeCameraNamespace] call FUNC(camera_switchTo); }; }; +_activeCameraNamespace + diff --git a/addons/spike/functions/fnc_camera_update.sqf b/addons/spike/functions/fnc_camera_update.sqf index c8578db1a8..2d093e5f78 100644 --- a/addons/spike/functions/fnc_camera_update.sqf +++ b/addons/spike/functions/fnc_camera_update.sqf @@ -15,13 +15,12 @@ * * Public: No */ -params ["_cameraArray", "_projectile", "_deltaTime"]; +params ["_cameraArray", "_projectile", "_deltaTime", "_cameraNamespace"]; _extractedInfo params ["", "", "", "", "", "", "", "_miscManeuvering", "", "_miscSeeker", "", "", "_cameraArray"]; _cameraArray params ["_hasCamera", "", "", "", "", "", "", "", "_viewData", "_gimbalData", "", "_designating", "_canStopDesignating"]; _viewData params ["_lookDir", "_groundPos", "_pointPos", "_movingCameraX", "_movingCameraY"]; _gimbalData params ["_hasGimbal", "_maxGimbalX", "_maxGimbalY", "_gimbalSpeedX", "_gimbalSpeedY", "", "", "_gimbalZoomSpeedModifiers", "_stabilizeWhenMoving", "_designateWhenStationary", "_trackLockedPosition"]; -private _cameraNamespace = [_projectile] call FUNC(camera_getCameraNamespaceFromProjectile); if (!_hasCamera || { _cameraNamespace isEqualTo objNull }) exitWith {}; if ([_cameraNamespace] call FUNC(camera_userInCamera)) then { diff --git a/addons/spike/functions/fnc_camera_updateTargetingGate.sqf b/addons/spike/functions/fnc_camera_updateTargetingGate.sqf index b11b85a3e2..df9a16d290 100644 --- a/addons/spike/functions/fnc_camera_updateTargetingGate.sqf +++ b/addons/spike/functions/fnc_camera_updateTargetingGate.sqf @@ -48,6 +48,9 @@ if (_seekerTargetPos isEqualTo [0, 0, 0]) then { if (_reticleMovesWithTrack) then { _seekerPositionScreen = worldToScreen ASLtoAGL _seekerTargetPos; + if (_seekerPositionScreen isEqualTo []) then { + _seekerPositionScreen = [0, 0]; + }; _seekerPositionScreen set [0, _seekerPositionScreen#0 - 0.5]; _seekerPositionScreen set [1, _seekerPositionScreen#1 - 0.5]; }; diff --git a/addons/spike/functions/fnc_camera_userInCamera.sqf b/addons/spike/functions/fnc_camera_userInCamera.sqf index 8935dd5b76..e4127c5cef 100644 --- a/addons/spike/functions/fnc_camera_userInCamera.sqf +++ b/addons/spike/functions/fnc_camera_userInCamera.sqf @@ -19,5 +19,5 @@ params [["_cameraNamespace", objNull]]; if (isNil QGVAR(activeCamera)) exitWith { false }; -(!(GVAR(activeCamera) isEqualTo objNull)) && { (_cameraNamespace isEqualTo objNull) || (_cameraNamespace isEqualTo GVAR(activeCamera)) }; +(GVAR(activeCamera) isNotEqualTo objNull) && { (_cameraNamespace isEqualTo objNull) || (_cameraNamespace isEqualTo GVAR(activeCamera)) }; diff --git a/addons/spike/functions/fnc_onFired.sqf b/addons/spike/functions/fnc_onFired.sqf index e89a199133..de5361d9c2 100644 --- a/addons/spike/functions/fnc_onFired.sqf +++ b/addons/spike/functions/fnc_onFired.sqf @@ -67,19 +67,21 @@ if (!(_cameraConfig isEqualTo configNull) && { (getNumber (_cameraConfig >> "ena _cameraArray set [12, (getNumber (_cameraConfig >> "canStopDesignating")) == 1]; }; -[_projectile, _cameraArray, _shooter, false] call FUNC(camera_init); +private _camera = [_projectile, _cameraArray, _shooter, false] call FUNC(camera_init); +GVAR(projectileHashMap) set [hashValue _projectile, _camera]; [{ params ["_args", "_pfID"]; - _args params ["_firedEH", "_cameraArray", "_lastUpdate"]; + _args params ["_firedEH", "_cameraArray", "_lastUpdate", "_camera", "_projectileHash"]; _firedEH params ["_shooter","_weapon","_muzzle","_mode","_ammo","_magazine","_projectile"]; if (!alive _projectile || isNull _projectile || isNull _shooter) exitWith { - [[_projectile] call FUNC(camera_getCameraNamespaceFromProjectile)] call FUNC(camera_destroy); + GVAR(projectileHashMap) deleteAt _projectileHash; + [_camera] call FUNC(camera_destroy); [_pfID] call CBA_fnc_removePerFrameHandler; }; - [_cameraArray, _projectile, CBA_missionTime - _lastUpdate] call FUNC(camera_update); + [_cameraArray, _projectile, CBA_missionTime - _lastUpdate, _camera] call FUNC(camera_update); _args set [2, CBA_missionTime]; -}, 0, [_this, _cameraArray, CBA_missionTime]] call CBA_fnc_addPerFrameHandler; +}, 0, [_this, _cameraArray, CBA_missionTime, _camera, hashValue _projectile]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/spike/functions/fnc_seeker.sqf b/addons/spike/functions/fnc_seeker.sqf index df3d2a93e2..86cd182075 100644 --- a/addons/spike/functions/fnc_seeker.sqf +++ b/addons/spike/functions/fnc_seeker.sqf @@ -23,7 +23,7 @@ _launchParams params ["", "_targetParams"]; _targetParams params ["_target"]; _seekerParams params ["_seekerAngle", "", "_seekerMaxRange"]; -private _cameraNamespace = [_projectile] call FUNC(camera_getCameraNamespaceFromProjectile); +private _cameraNamespace = GVAR(projectileHashMap) get hashValue _projectile; private _seekerTargetPos = _cameraNamespace getVariable [QGVAR(seekerTargetPos), [0, 0, 0]]; private _cameraPos = _cameraNamespace getVariable [QGVAR(cameraPos), [0, 0, 0]]; private _logicPos = _cameraNamespace getVariable [QGVAR(logicPos), [0, 0, 0]];