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.