Skip to content

Commit

Permalink
missile_manpad - add MANPADs and IR seeker (#10031)
Browse files Browse the repository at this point in the history
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: TyroneMF <[email protected]>
Co-authored-by: Filip Maciejewski <[email protected]>
Co-authored-by: Kyle Mckay <[email protected]>
Co-authored-by: jonpas <[email protected]>
Co-authored-by: Elgin675 <[email protected]>
Co-authored-by: Blutze <[email protected]>
Co-authored-by: Jo David <[email protected]>
Co-authored-by: BaerMitUmlaut <[email protected]>
Co-authored-by: commy2 <[email protected]>
Co-authored-by: PabstMirror <[email protected]>
Co-authored-by: Dabako <[email protected]>
Co-authored-by: Pascal Dunaj <[email protected]>
Co-authored-by: Brett <[email protected]>
Co-authored-by: Dystopian <[email protected]>
Co-authored-by: R3voA3 <[email protected]>
Co-authored-by: Steve Zhao <[email protected]>
Co-authored-by: Kyle J. McKeown <[email protected]>
Co-authored-by: Salluci <[email protected]>
Co-authored-by: Dániel Boros <[email protected]>
Co-authored-by: Laid3acK <[email protected]>
Co-authored-by: frankplow <[email protected]>
Co-authored-by: JoramD <[email protected]>
Co-authored-by: Dabako <[email protected]>
Co-authored-by: Abogado <[email protected]>
Co-authored-by: Dedmen Miller <[email protected]>
Co-authored-by: Lupus the Canine <[email protected]>
Co-authored-by: Drofseh <[email protected]>
Co-authored-by: LorenLuke <[email protected]>
Co-authored-by: SzwedzikPL <[email protected]>
Co-authored-by: BrettMayson <[email protected]>
Co-authored-by: Grim <[email protected]>
  • Loading branch information
1 parent ce56d87 commit 745dc0c
Show file tree
Hide file tree
Showing 12 changed files with 274 additions and 18 deletions.
1 change: 1 addition & 0 deletions addons/missile_manpad/$PBOPREFIX$
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
z\ace\addons\missile_manpad
34 changes: 34 additions & 0 deletions addons/missile_manpad/CfgAmmo.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
class EGVAR(missileguidance,type_RAM);
class EGVAR(missileguidance,type_Stinger);
class CfgAmmo {
class ammo_Missile_rim116;
class GVAR(rim116): ammo_Missile_rim116 {
maneuvrability = 0;
missileLockMaxSpeed = 2000;

missileLockCone = 3; // caged lock
missileKeepLockedCone = 45;
missileLockMaxDistance = 5000;
missileLockMinDistance = 250;

class ace_missileguidance: EGVAR(missileguidance,type_RAM) {
enabled = 1;
};
};

class M_70mm_SAAMI;
class GVAR(stinger): M_70mm_SAAMI {
maneuvrability = 0;
missileLockMaxSpeed = 2000;

missileLockCone = 3; // caged lock
missileKeepLockedCone = 45;
missileLockMaxDistance = 5000;
missileLockMinDistance = 250;

class ace_missileguidance: EGVAR(missileguidance,type_Stinger) {
enabled = 1;
};
};
};

22 changes: 22 additions & 0 deletions addons/missile_manpad/CfgMagazines.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
class CfgMagazines {
class magazine_Missile_rim116_x21;
class GVAR(rim116): magazine_Missile_rim116_x21 {
author = "Dani (TCVM)";
displayName = CSTRING(rim116_21x);
ammo = QGVAR(rim116);
};

class 4Rnd_70mm_SAAMI_missiles;
class GVAR(stinger): 4Rnd_70mm_SAAMI_missiles {
author = "Dani (TCVM)";
displayName = CSTRING(stinger_4x);
ammo = QGVAR(stinger);
};

class Titan_AA;
class GVAR(stinger_man): Titan_AA {
author = "Dani (TCVM)";
displayName = CSTRING(stinger);
ammo = QGVAR(stinger);
};
};
108 changes: 108 additions & 0 deletions addons/missile_manpad/CfgVehicles.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
class CfgVehicles {
class LandVehicle;
class StaticWeapon: LandVehicle {
class Turrets;
};
class StaticMGWeapon: StaticWeapon {
class Turrets: Turrets {
class MainTurret;
};
};

class SAM_System_01_base_F: StaticMGWeapon {
class AnimationSources {
class Missiles_revolving {
source = "revolving";
weapon = QGVAR(rim116);
};
};

class Turrets: Turrets {
class MainTurret: MainTurret {
weapons[] = {QGVAR(rim116)};
magazines[] = {QGVAR(rim116)};
};
};
};

class Tank;
class Tank_F: Tank {
class Turrets {
class MainTurret;
};
};
class LT_01_base_F: Tank_F {
class AnimationSources;
class Turrets: Turrets {};
};

class LT_01_AA_base_F: LT_01_base_F {
class AnimationSources: AnimationSources {
class Missiles_revolving {
source = "revolving";
weapon = QGVAR(FIM92);
};
};

class Turrets: Turrets {
class MainTurret: MainTurret {
weapons[] = {"SmokeLauncher", QGVAR(FIM92), "HMG_127"};
magazines[] = {
"SmokeLauncherMag",
QGVAR(stinger),
QGVAR(stinger),
"100Rnd_127x99_mag_Tracer_Red",
"100Rnd_127x99_mag_Tracer_Red",
"100Rnd_127x99_mag_Tracer_Red",
"100Rnd_127x99_mag_Tracer_Red"
};
};
};
};

class APC_Tracked_01_base_F: Tank_F {
class Turrets: Turrets {
class MainTurret: MainTurret {};
};
};
class B_APC_Tracked_01_base_F: APC_Tracked_01_base_F {
class AnimationSources;
};
class B_APC_Tracked_01_AA_F: B_APC_Tracked_01_base_F {
class AnimationSources: AnimationSources {
class Missiles_revolving {
source = "revolving";
weapon = QGVAR(FIM92);
};
};
class Turrets: Turrets {
class MainTurret: MainTurret {
weapons[] = {"autocannon_35mm", QGVAR(FIM92)};
magazines[] = {"680Rnd_35mm_AA_shells_Tracer_Red", QGVAR(stinger), QGVAR(stinger)};
};
};
};

class APC_Tracked_02_base_F: Tank_F {
class Turrets: Turrets {
class MainTurret: MainTurret {};
};
};
class O_APC_Tracked_02_base_F: APC_Tracked_02_base_F {
class AnimationSources;
};
class O_APC_Tracked_02_AA_F: O_APC_Tracked_02_base_F {
class AnimationSources: AnimationSources {
class Missiles_revolving {
source = "revolving";
weapon = QGVAR(FIM92);
};
};
class Turrets: Turrets {
class MainTurret: MainTurret {
weapons[] = {"autocannon_35mm", QGVAR(FIM92)};
magazines[] = {"680Rnd_35mm_AA_shells_Tracer_Green", QGVAR(stinger), QGVAR(stinger)};
};
};
};
};
23 changes: 23 additions & 0 deletions addons/missile_manpad/CfgWeapons.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
class CfgWeapons {
class weapon_rim116Launcher;
class GVAR(rim116): weapon_rim116Launcher {
author = "Dani (TCVM)";
displayName = CSTRING(rim116);
magazines[] = { QGVAR(rim116) };
weaponLockDelay = 0.5;
};

class missiles_SAAMI;
class GVAR(FIM92): missiles_SAAMI {
author = "Dani (TCVM)";
displayName = CSTRING(stinger);
magazines[] = { QGVAR(stinger) };
weaponLockDelay = 0.5;
};

class Launcher_Base_F;
class launch_Titan_base: Launcher_Base_F {
magazines[] = {QGVAR(stinger_man)};
};
};

12 changes: 12 additions & 0 deletions addons/missile_manpad/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
ace_missile_manpad
===================

Adds missile guidance to all vanilla MANPAD systems


## Maintainers

The people responsible for merging changes to this component or answering potential questions.

- [Dani-TCVM](https://github.com/TheCandianVendingMachine)

21 changes: 21 additions & 0 deletions addons/missile_manpad/config.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#include "script_component.hpp"

class CfgPatches {
class ADDON {
name = COMPONENT_NAME;
units[] = {};
weapons[] = {};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"ace_common","ace_missileguidance"};
author = ECSTRING(common,ACETeam);
authors[] = {"Dani (TCVM)"};
url = ECSTRING(main,URL);
VERSION_CONFIG;
};
};

#include "CfgAmmo.hpp"
#include "CfgMagazines.hpp"
#include "CfgWeapons.hpp"
#include "CfgVehicles.hpp"

18 changes: 18 additions & 0 deletions addons/missile_manpad/script_component.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#define COMPONENT missile_manpad
#define COMPONENT_BEAUTIFIED MANPAD
#include "\z\ace\addons\main\script_mod.hpp"

// #define DEBUG_MODE_FULL
// #define DISABLE_COMPILE_CACHE
// #define ENABLE_PERFORMANCE_COUNTERS

#ifdef DEBUG_ENABLED_MISSILE_MANPAD
#define DEBUG_MODE_FULL
#endif

#ifdef DEBUG_SETTINGS_MISSILE_MANPAD
#define DEBUG_SETTINGS DEBUG_SETTINGS_MISSILE_MANPAD
#endif

#include "\z\ace\addons\main\script_macros.hpp"

17 changes: 17 additions & 0 deletions addons/missile_manpad/stringtable.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<Project name="ACE">
<Package name="MISSILE_MANPAD">
<Key ID="STR_ACE_MISSILE_MANPAD_stinger">
<English>FIM-92 Stinger [ACE]</English>
</Key>
<Key ID="STR_ACE_MISSILE_MANPAD_rim116">
<English>RIM-116 [ACE]</English>
</Key>
<Key ID="STR_ACE_MISSILE_MANPAD_rim116_21x">
<English>21x RIM-116 [ACE]</English>
</Key>
<Key ID="STR_ACE_MISSILE_MANPAD_stinger_4x">
<English>4x FIM-92 Stinger [ACE]</English>
</Key>
</Package>
</Project>
11 changes: 6 additions & 5 deletions addons/missileguidance/CfgMissileTypesNato.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -579,8 +579,8 @@ class GVAR(type_RBS70) {
class GVAR(type_Redeye) {
enabled = 0;

pitchRate = 27; // Minium flap deflection for guidance
yawRate = 27; // Maximum flap deflection for guidance
pitchRate = 40; // Minium flap deflection for guidance
yawRate = 40; // Maximum flap deflection for guidance

canVanillaLock = 1; // Can this default vanilla lock? Only applicable to non-cadet mode

Expand All @@ -594,8 +594,9 @@ class GVAR(type_Redeye) {
defaultSeekerLockMode = "LOBL";
seekerLockModes[] = { "LOBL" };

defaultNavigationType = "ProportionalNavigation";
navigationTypes[] = { "ProportionalNavigation" };
defaultNavigationType = "LineOfSight";
navigationTypes[] = { "LineOfSight" };
navigationGain = 3;

seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
seekerAngle = 45; // Angle from the shooter's view that can track the missile
Expand Down Expand Up @@ -713,4 +714,4 @@ class GVAR(type_TOW) {
// Attack profile type selection
defaultAttackProfile = "WIRE";
attackProfiles[] = {"WIRE"};
};
};
1 change: 1 addition & 0 deletions addons/missileguidance/XEH_PREP.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ PREP(mwr_onFired);
PREP(IR_onFired);

// Navigation OnFired
PREP(navigationType_lineOfSight);
PREP(proNav_onFired);
PREP(line_onFired);

24 changes: 11 additions & 13 deletions addons/missileguidance/functions/fnc_navigationType_lineOfSight.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -18,31 +18,29 @@ params ["_args", "_timestep", "_seekerTargetPos", "_profileAdjustedTargetPos"];
_args params ["_firedEH", "", "", "", "_stateParams", "_targetData"];
_firedEH params ["","","","","","","_projectile"];
_stateParams params ["", "", "", "","_navigationParams"];
_navigationParams params ["_onLaunch"];
_onLaunch params ["_lastLineOfSight"];
_targetData params ["_targetDirection", "_attackProfileDirection", "", "_targetVelocity", ""];
_navigationParams params ["_lastMissileFrame", "_navigationGain"];
_lastMissileFrame params ["_lastLineOfSight"];
_targetData params ["_targetDirection", "_attackProfileDirection"];

// Semi-proportional navigation implemented via "Fundamentals of proportional navigation" by Stephen Murtaugh and Harry Criel

// the los rate is tiny, so we multiply by a constant of a power of ten to get more aggressive acceleration
// this is just due to how we measure our LOS delta, the vectors involved are _tiny_
private _losDelta = _attackProfileDirection vectorDiff _lastLineOfSight;
private _losDelta = (vectorNormalized _attackProfileDirection) vectorDiff (vectorNormalized _lastLineOfSight);
private _losRate = if (_timestep == 0) then {
0
} else {
10 * (vectorMagnitude _losDelta) / _timestep;
1 * (vectorMagnitude _losDelta) / _timestep;
};

private _closingVelocity = _targetVelocity vectorDiff (velocity _projectile);
private _lateralAcceleration = _navigationGain * _losRate;
private _commandedAcceleration = _attackProfileDirection vectorMultiply _lateralAcceleration;

private _commandedAcceleration = _closingVelocity vectorMultiply _losRate;
private _missileDirection = vectorNormalized velocity _projectile;

// we need acceleration normal to our LOS
private _commandedAccelerationProjected = _attackProfileDirection vectorMultiply (_commandedAcceleration vectorDotProduct _attackProfileDirection);
private _commandedAccelerationProjected = _missileDirection vectorMultiply (_commandedAcceleration vectorDotProduct _missileDirection);
_commandedAcceleration = _commandedAcceleration vectorDiff _commandedAccelerationProjected;

if (accTime > 0) then {
_navigationParams set [0, [_attackProfileDirection]];
_navigationParams set [0, [_seekerTargetPos]];
};

_targetDirection
_commandedAcceleration

0 comments on commit 745dc0c

Please sign in to comment.