mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
Working configuration based guidance framework.
This commit is contained in:
parent
6f9203262a
commit
cf876116a9
19
addons/missileguidance/ACE_GuidanceConfig.hpp
Normal file
19
addons/missileguidance/ACE_GuidanceConfig.hpp
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
class GVAR(AttackProfiles) {
|
||||||
|
class LIN {
|
||||||
|
name = "";
|
||||||
|
visualName = "";
|
||||||
|
description = "";
|
||||||
|
|
||||||
|
functionName = QFUNC(attackProfile_LIN);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
class GVAR(SeekerTypes) {
|
||||||
|
class SALH {
|
||||||
|
name = "";
|
||||||
|
visualName = "";
|
||||||
|
description = "";
|
||||||
|
|
||||||
|
functionName = QFUNC(seekerType_SALH);
|
||||||
|
};
|
||||||
|
};
|
@ -48,14 +48,14 @@ class CfgAmmo {
|
|||||||
|
|
||||||
// Guidance type for munitions
|
// Guidance type for munitions
|
||||||
defaultSeekerType = "SALH";
|
defaultSeekerType = "SALH";
|
||||||
seekerTypes[] = { "SALH", "LIDAR", "SARH", "Optic", "Thermal", "GPS", "SACLOS", "MCLOS", };
|
seekerTypes[] = { "SALH", "LIDAR", "SARH", "Optic", "Thermal", "GPS", "SACLOS", "MCLOS" };
|
||||||
seekerAngle = 90; // Angle in front of the missile which can be searched
|
seekerAngle = 90; // Angle in front of the missile which can be searched
|
||||||
seekerAccuracy = 1; // seeker accuracy multiplier
|
seekerAccuracy = 1; // seeker accuracy multiplier
|
||||||
seekerMaxRange = 2500; // Range from the missile which the seeker can visually search
|
seekerMaxRange = 2500; // Range from the missile which the seeker can visually search
|
||||||
|
|
||||||
// Attack profile type selection
|
// Attack profile type selection
|
||||||
defaultAttackProfile = "LOAL-LIN";
|
defaultAttackProfile = "LIN";
|
||||||
attackProfiles[] = { "LOBL-LIN", "LOBL-DIR", "LOBL-MID", "LOBL-HI", "LOBL-TOP-DOWN", "LOAL-LIN", "LOAL-DIR", "LOAL-MID", "LOAL-HI", "LOAL-TOP-DOWN" };
|
attackProfiles[] = { "LIN", "DIR", "MID", "HI", "TOP" };
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -12,6 +12,13 @@ PREP(guidancePFH);
|
|||||||
PREP(doAttackProfile);
|
PREP(doAttackProfile);
|
||||||
PREP(doSeekerSearch);
|
PREP(doSeekerSearch);
|
||||||
|
|
||||||
// Probably to be renamed
|
// Attack Profiles
|
||||||
PREP(attackProfile_linear);
|
PREP(attackProfile_LIN);
|
||||||
PREP(guidance_LGB);
|
//PREP(attackProfile_HI);
|
||||||
|
//PREP(attackProfile_DIR);
|
||||||
|
//PREP(attackProfile_MID);
|
||||||
|
//PREP(attackProfile_TOP);
|
||||||
|
|
||||||
|
|
||||||
|
// Seeker search functions
|
||||||
|
PREP(seekerType_SALH);
|
@ -9,7 +9,10 @@ class CfgPatches {
|
|||||||
VERSION_CONFIG;
|
VERSION_CONFIG;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#include "ACE_GuidanceConfig.hpp"
|
||||||
#include "ACE_Settings.hpp"
|
#include "ACE_Settings.hpp"
|
||||||
|
|
||||||
#include "CfgEventhandlers.hpp"
|
#include "CfgEventhandlers.hpp"
|
||||||
#include "CfgAmmo.hpp"
|
#include "CfgAmmo.hpp"
|
||||||
#include "CfgMagazines.hpp"
|
#include "CfgMagazines.hpp"
|
||||||
|
28
addons/missileguidance/functions/fnc_attackProfile_LIN.sqf
Normal file
28
addons/missileguidance/functions/fnc_attackProfile_LIN.sqf
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
#define DEBUG_MODE_FULL
|
||||||
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
EXPLODE_7_PVT(((_this select 1) select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile);
|
||||||
|
private["_target", "_seekerTargetPos", "_launchParams", "_targetLaunchParams", "_targetPos", "_projectilePos"];
|
||||||
|
|
||||||
|
_seekerTargetPos = _this select 0;
|
||||||
|
_launchParams = _this select 1;
|
||||||
|
|
||||||
|
_target = _launchParams select 0;
|
||||||
|
_targetLaunchParams = _launchParams select 1;
|
||||||
|
|
||||||
|
_shooterPos = getPosASL _shooter;
|
||||||
|
_projectilePos = getPosASL _projectile;
|
||||||
|
|
||||||
|
_distanceToTarget = _projectilePos vectorDistance _seekerTargetPos;
|
||||||
|
_distanceToShooter = _projectilePos vectorDistance _shooterPos;
|
||||||
|
|
||||||
|
_addHeight = [0,0,(_projectilePos distance _seekerTargetPos)*0.02];
|
||||||
|
|
||||||
|
_seekerTargetPos = _seekerTargetPos vectorAdd _addHeight;
|
||||||
|
|
||||||
|
#ifdef DEBUG_MODE_FULL
|
||||||
|
drawLine3D [(ASLtoATL _seekerTargetPos) vectorAdd _addHeight, ASLtoATL _seekerTargetPos, [0,1,0,1]];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
TRACE_1("Adjusted target position", _seekerTargetPos);
|
||||||
|
_seekerTargetPos;
|
@ -2,27 +2,30 @@
|
|||||||
#include "script_component.hpp"
|
#include "script_component.hpp"
|
||||||
|
|
||||||
EXPLODE_7_PVT(((_this select 1) select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile);
|
EXPLODE_7_PVT(((_this select 1) select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile);
|
||||||
private["_target", "_seekerTargetPos", "_launchParams", "_targetLaunchParams", "_targetPos", "_projectilePos"];
|
private["_attackProfilePos"];
|
||||||
|
|
||||||
_launchParams = _this select 1;
|
_launchParams = ((_this select 1) select 1);
|
||||||
_seekerTargetPos = _this select 0;
|
_attackProfileName = _launchParams select 3;
|
||||||
|
|
||||||
_target = _launchParams select 0;
|
TRACE_1("Attacking profile", _attackProfileName);
|
||||||
_targetLaunchParams = _launchParams select 1;
|
|
||||||
|
|
||||||
_shooterPos = getPosASL _shooter;
|
_attackProfilesCfg = ( configFile >> QGVAR(AttackProfiles) );
|
||||||
_projectilePos = getPosASL _projectile;
|
|
||||||
|
|
||||||
_distanceToTarget = _projectilePos vectorDistance _seekerTargetPos;
|
_attackProfile = nil;
|
||||||
_distanceToShooter = _projectilePos vectorDistance _shooterPos;
|
for [{_i=0}, {_i< (count _attackProfilesCfg) }, {_i=_i+1}] do {
|
||||||
|
_testProfile = _attackProfilesCfg select _i;
|
||||||
|
_testName = configName _testProfile;
|
||||||
|
TRACE_3("", _testName, _testProfile, _attackProfilesCfg);
|
||||||
|
|
||||||
_addHeight = [0,0,(_projectilePos distance _seekerTargetPos)*0.02];
|
if( _testName == _attackProfileName) exitWith {
|
||||||
|
_attackProfile = _attackProfilesCfg select _i;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
_seekerTargetPos = _seekerTargetPos vectorAdd _addHeight;
|
_attackProfilePos = [0,0,0];
|
||||||
|
if(!isNil "_attackProfile") then {
|
||||||
|
_attackProfileExecCode = "_this call " + getText (_attackProfile >> "functionName");
|
||||||
|
_attackProfilePos = call compile _attackProfileExecCode;
|
||||||
|
};
|
||||||
|
|
||||||
#ifdef DEBUG_MODE_FULL
|
_attackProfilePos;
|
||||||
drawLine3D [(ASLtoATL _seekerTargetPos) vectorAdd _addHeight, ASLtoATL _seekerTargetPos, [0,1,0,1]];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
TRACE_1("Adjusted target position", _seekerTargetPos);
|
|
||||||
_seekerTargetPos;
|
|
@ -1,17 +1,31 @@
|
|||||||
#define DEBUG_MODE_FULL
|
#define DEBUG_MODE_FULL
|
||||||
#include "script_component.hpp"
|
#include "script_component.hpp"
|
||||||
|
|
||||||
EXPLODE_7_PVT((_this select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile);
|
EXPLODE_7_PVT(((_this select 1) select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile);
|
||||||
private["_targets", "_foundTargetPos", "_launchParams", "_seekerParams", "_targetLaunchParams"];
|
private["_seekerProfilePos"];
|
||||||
|
|
||||||
_launchParams = _this select 1;
|
_launchParams = ((_this select 1) select 1);
|
||||||
_targetLaunchParams = _launchParams select 1;
|
_seekerTypeName = _launchParams select 2;
|
||||||
|
|
||||||
_seekerParams = _this select 3;
|
TRACE_1("Seeker type", _seekerTypeName);
|
||||||
|
|
||||||
// TODO: this needs to be shootCone/findStrongestRay after testing
|
_seekerTypesCfg = ( configFile >> QGVAR(SeekerTypes) );
|
||||||
_targets = [_projectile, ACE_DEFAULT_LASER_CODE, (_seekerParams select 0)] call ace_laser_fnc_findLaserDesignator;
|
|
||||||
_foundTargetPos = getPosASL (_targets select 1);
|
|
||||||
|
|
||||||
TRACE_1("Seeker return target pos", _foundTargetPos);
|
_seekerType = nil;
|
||||||
_foundTargetPos;
|
for [{_i=0}, {_i< (count _seekerTypesCfg) }, {_i=_i+1}] do {
|
||||||
|
_testProfile = _seekerTypesCfg select _i;
|
||||||
|
_testName = configName _testProfile;
|
||||||
|
TRACE_3("", _testName, _testProfile, _seekerTypesCfg);
|
||||||
|
|
||||||
|
if( _testName == _seekerTypeName) exitWith {
|
||||||
|
_seekerType = _seekerTypesCfg select _i;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
_seekerProfilePos = [0,0,0];
|
||||||
|
if(!isNil "_seekerType") then {
|
||||||
|
_seekerProfileExecCode = "_this call " + getText (_seekerType >> "functionName");
|
||||||
|
_seekerProfilePos = call compile _seekerProfileExecCode;
|
||||||
|
};
|
||||||
|
|
||||||
|
_seekerProfilePos;
|
@ -16,7 +16,8 @@ if(!alive _projectile || isNull _projectile || isNull _shooter) exitWith {
|
|||||||
[(_this select 1)] call cba_fnc_removePerFrameHandler;
|
[(_this select 1)] call cba_fnc_removePerFrameHandler;
|
||||||
};
|
};
|
||||||
|
|
||||||
_seekerTargetPos = _args call FUNC(doSeekerSearch);
|
// TODO: placeholder for "last seek target position"
|
||||||
|
_seekerTargetPos = [ [0,0,0], _args] call FUNC(doSeekerSearch);
|
||||||
if(!isNil "_seekerTargetPos") then {
|
if(!isNil "_seekerTargetPos") then {
|
||||||
|
|
||||||
_profileAdjustedTargetPos = [_seekerTargetPos,_args] call FUNC(doAttackProfile);
|
_profileAdjustedTargetPos = [_seekerTargetPos,_args] call FUNC(doAttackProfile);
|
||||||
|
@ -1,109 +0,0 @@
|
|||||||
#define DEBUG_MODE_FULL
|
|
||||||
#include "script_component.hpp"
|
|
||||||
|
|
||||||
FUNC(guidance_LGB_LOAL_PFH) = {
|
|
||||||
//TRACE_1("enter", _this);
|
|
||||||
_args = _this select 0;
|
|
||||||
//PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile);
|
|
||||||
_lgb = _args select 6;
|
|
||||||
_curVelocity = velocity _lgb;
|
|
||||||
|
|
||||||
if(!alive _lgb) exitWith {
|
|
||||||
[(_this select 1)] call cba_fnc_removePerFrameHandler;
|
|
||||||
};
|
|
||||||
|
|
||||||
_targets = [_lgb, ACE_DEFAULT_LASER_CODE, 70, _curVelocity] call uo_laser_fnc_findLaserDesignator;
|
|
||||||
//TRACE_2("Targets", _target, _targets);
|
|
||||||
|
|
||||||
if((_targets select 0)) then {
|
|
||||||
_target = _targets select 1;
|
|
||||||
|
|
||||||
// player sideChat "FUCK!";
|
|
||||||
// drop ["\a3\data_f\Cl_basic","","Billboard",1,20,(getPos _lgb),[0,0,0],1,1.275,1.0,0.0,[5],[[1,0,0,1]],[0],0.0,2.0,"","",""];
|
|
||||||
|
|
||||||
|
|
||||||
_yVec = vectorDir _lgb;
|
|
||||||
_zVec = vectorUp _lgb;
|
|
||||||
_xVec = vectorNormalized (_yVec vectorCrossProduct _zVec);
|
|
||||||
|
|
||||||
_lgbPos = getPosASL _lgb;
|
|
||||||
// player sideChat "G!";
|
|
||||||
_targetPos = getPosASL _target;
|
|
||||||
if((count _targetPos) > 0) then {
|
|
||||||
// player sideChat format["f: %1", _targetPos];
|
|
||||||
_addHeight = [0,0,(_lgbPos distance _targetPos)*0.06];
|
|
||||||
// drawLine3D [(ASLtoATL _targetPos) vectorAdd _addHeight, ASLtoATL _targetPos, [0,1,0,1]];
|
|
||||||
_targetPos = _targetPos vectorAdd _addHeight;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
_def = 0.0025;
|
|
||||||
|
|
||||||
_targetVectorSeeker = [_lgb, [_xVec, _yVec, _zVec], _targetPos] call FUNC(translateToWeaponSpace);
|
|
||||||
// _targetVectorSeeker = _lgb worldToModel (ASLtoATL _targetPos);
|
|
||||||
// _targetVectorSeeker = [0,0,0] vectorFromTo _targetVectorSeeker;
|
|
||||||
_yaw = 0.0;
|
|
||||||
if((_targetVectorSeeker select 0) < 0) then {
|
|
||||||
_yaw = -_def;
|
|
||||||
} else {
|
|
||||||
if((_targetVectorSeeker select 0) > 0) then {
|
|
||||||
_yaw = _def;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
_pitch = 0.0;
|
|
||||||
if((_targetVectorSeeker select 2) < 0) then {
|
|
||||||
_pitch = -_def;
|
|
||||||
} else {
|
|
||||||
if((_targetVectorSeeker select 2) > 0) then {
|
|
||||||
_pitch = _def;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
#ifdef DEBUG_MODE_FULL
|
|
||||||
drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,1,1,1], ASLtoATL _lgbPos, 0.75, 0.75, 0, str _vectorTo, 1, 0.025, "TahomaB"];
|
|
||||||
drawLine3D [ASLtoATL _lgbPos, ASLtoATL _targetPos, [1,0,0,1]];
|
|
||||||
|
|
||||||
_distance = ([getPos startPos, _lgbPos] call BIS_fnc_distance2D);
|
|
||||||
_marker = createMarkerLocal [format["m%1", MARKERCOUNT], [_distance, _lgbPos select 2]];
|
|
||||||
_marker setMarkerTypeLocal "mil_dot";
|
|
||||||
_marker setMarkerColorLocal "ColorRed";
|
|
||||||
|
|
||||||
MARKERCOUNT = MARKERCOUNT + 1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if(accTime > 0) then {
|
|
||||||
_outVector = [_lgb, [_xVec, _yVec, _zVec], [_yaw, 1/accTime, _pitch]] call FUNC(translateToModelSpace);
|
|
||||||
// _outVector = _lgb modelToWorldVisual [_yaw, 1, _pitch];
|
|
||||||
// _outVector = ATLtoASL _outVector;
|
|
||||||
_vectorTo = _lgbPos vectorFromTo _outVector;
|
|
||||||
|
|
||||||
// hintSilent format["v: %1", _vectorTo];
|
|
||||||
|
|
||||||
// _lgb setVectorDir _vectorTo;
|
|
||||||
_lgb setVectorDirAndUp [_vectorTo, vectorUp _lgb];
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef DEBUG_MODE_FULL
|
|
||||||
hintSilent format["d: %1", _lgbPos vectorDistance _targetPos];
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
FUNC(guidance_LGB_LOAL) = {
|
|
||||||
PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile);
|
|
||||||
|
|
||||||
[FUNC(guidance_LGB_LOAL_PFH), 0, _this] call cba_fnc_addPerFrameHandler;
|
|
||||||
};
|
|
||||||
|
|
||||||
PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile);
|
|
||||||
_fireMode = _shooter getVariable [QGVAR(attackProfile), ACE_DEFAULT_FIRE_SELECTION];
|
|
||||||
|
|
||||||
switch (_fireMode select 0) do {
|
|
||||||
// Default to FIREMODE_DIRECT_LOAL
|
|
||||||
// FIREMODE_DIRECT_LOAL
|
|
||||||
default {
|
|
||||||
LOG("Initiating FIREMODE_DIRECT_LOAL");
|
|
||||||
_this call FUNC(guidance_LGB_LOAL);
|
|
||||||
};
|
|
||||||
};
|
|
17
addons/missileguidance/functions/fnc_seekerType_SALH.sqf
Normal file
17
addons/missileguidance/functions/fnc_seekerType_SALH.sqf
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#define DEBUG_MODE_FULL
|
||||||
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
EXPLODE_7_PVT(((_this select 1) select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile);
|
||||||
|
private["_targets", "_foundTargetPos", "_launchParams", "_seekerParams", "_targetLaunchParams"];
|
||||||
|
|
||||||
|
_seekerTargetPos = _this select 0;
|
||||||
|
|
||||||
|
_launchParams = _this select 1;
|
||||||
|
_seekerParams = _launchParams select 3;
|
||||||
|
|
||||||
|
// TODO: this needs to be shootCone/findStrongestRay after testing
|
||||||
|
_targets = [_projectile, ACE_DEFAULT_LASER_CODE, (_seekerParams select 0)] call ace_laser_fnc_findLaserDesignator;
|
||||||
|
_foundTargetPos = getPosASL (_targets select 1);
|
||||||
|
|
||||||
|
TRACE_1("Seeker return target pos", _foundTargetPos);
|
||||||
|
_foundTargetPos;
|
Loading…
Reference in New Issue
Block a user