diff --git a/addons/interact_menu/config.cpp b/addons/interact_menu/config.cpp
index bb1b09cc20..f87062bf6f 100644
--- a/addons/interact_menu/config.cpp
+++ b/addons/interact_menu/config.cpp
@@ -26,7 +26,7 @@ class ACE_Settings {
class GVAR(UseListMenu) {
value = 0;
typeName = "BOOL";
- isClientSetable = 1;
+ isClientSettable = 1;
displayName = "$STR_ACE_Interact_Menu_UseListMenu";
};
};
diff --git a/addons/missileguidance/ACE_Settings.hpp b/addons/missileguidance/ACE_Settings.hpp
index 060bde199b..0ecd4b8cbc 100644
--- a/addons/missileguidance/ACE_Settings.hpp
+++ b/addons/missileguidance/ACE_Settings.hpp
@@ -2,8 +2,15 @@ class ACE_Settings {
class GVAR(enabled) {
value = 1;
typeName = "BOOL";
- isClientSetable = 1;
+ isClientSettable = 1;
displayName = "$STR_ACE_MissileGuidance";
description = "$STR_ACE_MissileGuidance_Desc";
};
+ class GVAR(enabledForAI) {
+ value = 1;
+ typeName = "BOOL";
+ isClientSettable = 1;
+ displayName = "$STR_ACE_MissileGuidance_AI";
+ description = "$STR_ACE_MissileGuidance_AI_Desc";
+ };
};
\ No newline at end of file
diff --git a/addons/missileguidance/CfgEventhandlers.hpp b/addons/missileguidance/CfgEventhandlers.hpp
index 49f067ff46..8afeb9245e 100644
--- a/addons/missileguidance/CfgEventhandlers.hpp
+++ b/addons/missileguidance/CfgEventhandlers.hpp
@@ -12,6 +12,12 @@ class Extended_PostInit_EventHandlers {
class Extended_FiredBIS_EventHandlers {
class All {
- ADDON = QUOTE(_this call FUNC(fired));
+ ADDON = QUOTE(_this call FUNC(onFired));
+ };
+};
+
+class Extended_IncomingMissile_EventHandlers {
+ class All {
+ ADDON = QUOTE(_this call FUNC(onIncomingMissile));
};
};
\ No newline at end of file
diff --git a/addons/missileguidance/XEH_pre_init.sqf b/addons/missileguidance/XEH_pre_init.sqf
index 8d277bc3b0..d19b8475c9 100644
--- a/addons/missileguidance/XEH_pre_init.sqf
+++ b/addons/missileguidance/XEH_pre_init.sqf
@@ -7,7 +7,8 @@ PREP(changeMissileDirection);
PREP(checkSeekerAngle);
PREP(checkLos);
-PREP(fired);
+PREP(onFired);
+PREP(onIncomingMissile);
PREP(guidancePFH);
PREP(doAttackProfile);
diff --git a/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf b/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf
index da01b7d900..822afd7f1b 100644
--- a/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf
+++ b/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf
@@ -43,12 +43,8 @@ switch( (_state select 0) ) do {
};
case STAGE_CLIMB: {
TRACE_1("STAGE_CLIMB","");
- _cruisAlt = 60;
- if(_distanceShooterToTarget < w) then {
- _cruisAlt = 60 * (_distanceShooterToTarget/2000);
- TRACE_1("_cruisAlt", _cruisAlt);
- };
-
+ _cruisAlt = 60 * (_distanceShooterToTarget/2000);
+
if( ((ASLToATL _projectilePos) select 2) - ((ASLToATL _seekerTargetPos) select 2) >= _cruisAlt) then {
_state set[0, STAGE_TERMINAL];
} else {
diff --git a/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf b/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf
index 4e83e046ff..dc8b9b8e9d 100644
--- a/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf
+++ b/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf
@@ -57,7 +57,8 @@ switch( (_state select 0) ) do {
};
case STAGE_COAST: {
TRACE_1("STAGE_COAST","");
- if(_distanceShooterToTarget < 1250 || _distanceToTarget < ( ((ASLToATL _projectilePos) select 2) - (( ASLToATL _seekerTargetPos) select 2) )) then {
+ TRACE_1("", ((ASLToATL _projectilePos) select 2) - (( ASLToATL _seekerTargetPos) select 2) );
+ if(_distanceShooterToTarget < 1250 || _distanceToTarget < ( ((ASLToATL _projectilePos) select 2) - (( ASLToATL _seekerTargetPos) select 2) ) * 1.5) then {
_state set[0, STAGE_TERMINAL];
};
_returnTargetPos = _seekerTargetPos vectorAdd [0,0,(_projectilePos select 2)];
diff --git a/addons/missileguidance/functions/fnc_fired.sqf b/addons/missileguidance/functions/fnc_onFired.sqf
similarity index 74%
rename from addons/missileguidance/functions/fnc_fired.sqf
rename to addons/missileguidance/functions/fnc_onFired.sqf
index 8b90b2353f..dea8d256f1 100644
--- a/addons/missileguidance/functions/fnc_fired.sqf
+++ b/addons/missileguidance/functions/fnc_onFired.sqf
@@ -2,10 +2,10 @@
#include "script_component.hpp"
// Bail if guidance is disabled
-if(!GVAR(enabled)) exitWith { false };
-
// Bail on locality of the projectile, it should be local to us
-if(!local _projectile) exitWith { false };
+if(!GVAR(enabled) || {!local _projectile} ) exitWith { false };
+
+if(!GVAR(enableForAI) && {!isPlayer _shooter} ) exitWith { false };
private["_config", "_enabled", "_target", "_seekerType", "_attackProfile"];
PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile);
@@ -20,10 +20,13 @@ _enabled = getNumber ( _config >> "enabled");
if(isNil "_enabled" || {_enabled != 1}) exitWith { false };
_target = (vehicle _shooter) getVariable [QGVAR(target), nil];
+_targetPos = (vehicle _shooter) getVariable [QGVAR(targetPosition), nil];
_seekerType = (vehicle _shooter) getVariable [QGVAR(seekerType), nil];
_attackProfile = (vehicle _shooter) getVariable [QGVAR(attackProfile), nil];
_lockMode = (vehicle _shooter) getVariable [QGVAR(lockMode), nil];
+_launchPos = getPosASL (vehicle _shooter);
+
TRACE_3("Begin guidance", _target, _seekerType, _attackProfile);
if ( isNil "_seekerType" || { ! ( _seekerType in (getArray (_config >> "seekerTypes" ) ) ) } ) then {
@@ -38,21 +41,28 @@ if ( isNil "_lockMode" || { ! ( _lockMode in (getArray (_config >> "seekerLockMo
// If we didn't get a target, try to fall back on tab locking
if(isNil "_target") then {
- _canUseLock = getNumber (_config >> "canVanillaLock");
- if(_canUseLock > 0) then {
- // @TODO: Get vanilla target
- _vanillaTarget = cursorTarget;
-
- TRACE_1("Using Vanilla Locking", _vanillaTarget);
- if(!isNil "_vanillaTarget") then {
- _target = _vanillaTarget;
+
+ if(!isPlayer _shooter) then {
+ // This was an AI shot, lets still guide it on the AI target
+ _target = _shooter getVariable[QGVAR(vanilla_target), nil];
+ TRACE_1("Detected AI Shooter!", _target);
+ } else {
+ _canUseLock = getNumber (_config >> "canVanillaLock");
+ if(_canUseLock > 0) then {
+ // @TODO: Get vanilla target
+ _vanillaTarget = cursorTarget;
+
+ TRACE_1("Using Vanilla Locking", _vanillaTarget);
+ if(!isNil "_vanillaTarget") then {
+ _target = _vanillaTarget;
+ };
};
};
};
TRACE_4("Beginning ACE guidance system",_target,_ammo,_seekerType,_attackProfile);
[FUNC(guidancePFH), 0, [_this,
- [ACE_player,
+ [_shooter,
[_target, _targetPos, _launchPos],
_seekerType,
_attackProfile,
diff --git a/addons/missileguidance/functions/fnc_onIncomingMissile.sqf b/addons/missileguidance/functions/fnc_onIncomingMissile.sqf
new file mode 100644
index 0000000000..f819a97562
--- /dev/null
+++ b/addons/missileguidance/functions/fnc_onIncomingMissile.sqf
@@ -0,0 +1,7 @@
+//#define DEBUG_MODE_FULL
+#include "script_component.hpp"
+PARAMS_3(_target,_ammo,_shooter);
+
+if !(local (gunner _shooter) || {local _shooter}) exitWith {};
+
+_shooter setVariable [QGVAR(vanilla_target),_target, false];
\ No newline at end of file
diff --git a/addons/missileguidance/functions/fnc_seekerType_SALH.sqf b/addons/missileguidance/functions/fnc_seekerType_SALH.sqf
index b6ed8d65a4..07f997a041 100644
--- a/addons/missileguidance/functions/fnc_seekerType_SALH.sqf
+++ b/addons/missileguidance/functions/fnc_seekerType_SALH.sqf
@@ -8,10 +8,14 @@ _launchParams = _this select 1;
_seekerParams = _launchParams select 3;
_angleFov = _seekerParams select 0;
-_laserResult = [(getPosASL _projectile), (velocity _projectile), _angleFov, [ACE_DEFAULT_LASER_WAVELENGTH,ACE_DEFAULT_LASER_WAVELENGTH], ACE_DEFAULT_LASER_CODE] call EFUNC(laser,seekerFindLaserSpot);
-_foundTargetPos = _laserResult select 0;
-TRACE_1("Search", _laserResult);
-
+if(!isNil "_target") then {
+ // Handle AI or moving vanilla lasers
+ _foundTargetPos = getPosASL _target;
+} else {
+ _laserResult = [(getPosASL _projectile), (velocity _projectile), _angleFov, [ACE_DEFAULT_LASER_WAVELENGTH,ACE_DEFAULT_LASER_WAVELENGTH], ACE_DEFAULT_LASER_CODE] call EFUNC(laser,seekerFindLaserSpot);
+ _foundTargetPos = _laserResult select 0;
+ TRACE_1("Search", _laserResult);
+};
if(!isNil "_foundTargetPos") then {
//_canSeeTarget = [_projectile, _foundTargetPos, _angleFov] call FUNC(checkSeekerAngle);
diff --git a/addons/missileguidance/stringtable.xml b/addons/missileguidance/stringtable.xml
index 3ee166a6ff..5c136388ba 100644
--- a/addons/missileguidance/stringtable.xml
+++ b/addons/missileguidance/stringtable.xml
@@ -12,6 +12,12 @@
Avançado Missile Guidance
Részletes rakéta irányító
Расширенный ракетой
+
+
+ Advanced Missile Guidance for AI
+
+
+ Enables advanced guidance on AI units.
Enables advanced guidance mechanics and selection for different missiles and fire modes.