Added MavLink mocked drone support as client side feature

This commit is contained in:
2026-05-05 07:48:54 -03:00
parent 753dcab26e
commit 99f8d991be
11 changed files with 204 additions and 0 deletions

View File

@@ -0,0 +1,16 @@
#include "..\script_component.hpp"
if (!hasInterface) exitWith {};
private _existingPfh = player getVariable [QGVAR(mavlinkPFH), -1];
if (_existingPfh >= 0) then {
[_existingPfh] call CBA_fnc_removePerFrameHandler;
};
player setVariable [QGVAR(broadcastingUav), objNull];
private _pfh = [{
call FUNC(updateMavlinkBroadcast);
}, 0.5, []] call CBA_fnc_addPerFrameHandler;
player setVariable [QGVAR(mavlinkPFH), _pfh];

View File

@@ -0,0 +1,16 @@
#include "..\script_component.hpp"
if (!hasInterface) exitWith {};
private _existingPfh = player getVariable [QGVAR(mavlinkPFH), -1];
if (_existingPfh >= 0) then {
[_existingPfh] call CBA_fnc_removePerFrameHandler;
player setVariable [QGVAR(mavlinkPFH), -1];
};
private _broadcastingUav = player getVariable [QGVAR(broadcastingUav), objNull];
if (!isNull _broadcastingUav) then {
systemChat "UAV broadcasting stopped";
};
player setVariable [QGVAR(broadcastingUav), objNull];

View File

@@ -0,0 +1,97 @@
#include "..\script_component.hpp"
if !(player getVariable [QEGVAR(client,eudConnected), false]) exitWith {};
private _uav = getConnectedUAV player;
private _broadcastingUav = player getVariable [QGVAR(broadcastingUav), objNull];
if (isNull _uav) exitWith {
if (!isNull _broadcastingUav) then {
player setVariable [QGVAR(broadcastingUav), objNull];
systemChat "UAV broadcasting stopped";
"armatak" callExtension ["log", [["info", "UAV broadcasting stopped because player is no longer connected to a UAV"]]];
};
};
if (_broadcastingUav isNotEqualTo _uav) then {
player setVariable [QGVAR(broadcastingUav), _uav];
private _callsign = [_uav] call armatak_fnc_extract_marker_callsign;
systemChat format ["Broadcasting UAV %1", _callsign];
"armatak" callExtension ["log", [["info", format ["Broadcasting UAV %1 via MAVLink mock to %2", _callsign, player getVariable [QEGVAR(client,mavlink_address), ""]]]]];
};
private _mavlinkAddress = player getVariable [QEGVAR(client,mavlink_address), ""];
if (_mavlinkAddress isEqualTo "") exitWith {};
private _pos = [_uav] call EFUNC(client,extractClientPosition);
private _dir = vectorDir _uav;
private _up = vectorUp _uav;
private _yaw = getDir _uav;
private _pitch = asin (((_dir select 2) max -1) min 1);
private _roll = asin (((_up select 0) max -1) min 1);
private _relAlt = ((getPosATL _uav) select 2) max 0;
private _uavType = if (_uav isKindOf "Plane") then {1} else {[2, 3] select (_uav isKindOf "Helicopter")};
private _bodyPayload = [
_mavlinkAddress,
1,
1,
_uavType,
_pos select 1,
_pos select 2,
_pos select 3,
_relAlt,
_pos select 5,
_pos select 6,
_roll,
_pitch,
_yaw,
parseNumber isEngineOn _uav
];
"armatak" callExtension ["mavlink_mock:send_uas_telemetry", [_bodyPayload]];
private _laser = laserTarget _uav;
if (!isNull _laser) then {
private _originASL = getPosASL _uav;
private _targetWorld = getPosWorld _laser;
private _targetAslZ = (getPosASL _laser) select 2;
private _spiASL = [_targetWorld select 0, _targetWorld select 1, _targetAslZ];
private _los = _spiASL vectorDiff _originASL;
private _losMag = vectorMagnitude _los;
if (_losMag > 0) then {
_los = _los vectorMultiply (1 / _losMag);
private _dirX = _los select 0;
private _dirY = _los select 1;
private _dirZ = _los select 2;
private _horizontalMag = sqrt ((_dirX * _dirX) + (_dirY * _dirY));
private _camYaw = ((_dirX atan2 _dirY) + 360) mod 360;
private _camPitch = _dirZ atan2 (_horizontalMag max 0.001);
private _spiAgl = ASLToAGL _spiASL;
private _camRelAlt = (_spiAgl select 2) max 0;
private _camPayload = [
_mavlinkAddress,
2,
1,
_uavType,
_pos select 1,
_pos select 2,
_pos select 3,
_camRelAlt,
_camYaw,
0,
0,
_camPitch,
_camYaw,
1
];
"armatak" callExtension ["mavlink_mock:send_uas_telemetry", [_camPayload]];
};
};