From 1644415dd7065841739b28871451f470c5cf3844 Mon Sep 17 00:00:00 2001 From: lambdatiger Date: Sun, 19 Oct 2025 14:54:52 -0500 Subject: [PATCH 1/4] make it spin --- addons/dragon/models/dragon.cfg | 44 ++++++++++++++++++++++++++++++++ addons/dragon/models/dragon.p3d | Bin 189193 -> 192747 bytes 2 files changed, 44 insertions(+) create mode 100644 addons/dragon/models/dragon.cfg diff --git a/addons/dragon/models/dragon.cfg b/addons/dragon/models/dragon.cfg new file mode 100644 index 00000000000..38be8c250cf --- /dev/null +++ b/addons/dragon/models/dragon.cfg @@ -0,0 +1,44 @@ +class CfgSkeletons { + class Default { + isDiscrete = 1; + skeletonInherit = ""; + skeletonBones[] = {}; + }; + + class dragon_skeleton: Default { + skeletonInherit = "Default"; + skeletonBones[] = { + "missile","" + }; + pivotsModel = ""; + isDiscrete = 1; + }; +}; + +class CfgModels { + class Default { + sectionsInherit = ""; + sections[] = {}; + }; + + class dragon: Default { + sectionsInherit = "Default"; + sections[] = {}; + skeletonName = "dragon_skeleton"; + class Animations { + class spin { + type="rotationZ"; + selection="missile"; + sourceAddress = "loop"; + source="time"; + axis=""; + animPeriod=0.5; + initPhase=0; + maxValue=1; + minValue=0; + angle1="rad 720"; + angle0=0; + }; + }; + }; +}; diff --git a/addons/dragon/models/dragon.p3d b/addons/dragon/models/dragon.p3d index 4416a2d7a9268bad330dae7d1c862b7acfd6147b..e601d38149839335bbd3c97e1d23082e8a4792ef 100644 GIT binary patch delta 170 zcmeA?#{K#s_l5<__<~b&Qj<$kQk;Y{0~#xNx@u|q8ZiJd8cn_>es M7^r*CStegm0C%!CzyJUM delta 46 zcmV+}0MY;J;R}hz3$UQ3voEVkmXj~5mxo(L0k>O40%RYzAZG$%0=M960(EY;p4$RV E75I%4yZ`_I From 386e1130ad63c630d83a6e4b01a7ad80b6dbfdea Mon Sep 17 00:00:00 2001 From: lambdatiger Date: Sun, 19 Oct 2025 14:57:46 -0500 Subject: [PATCH 2/4] Attack profile changes --- addons/dragon/CfgAmmo.hpp | 6 ++--- .../functions/fnc_attackProfile_DRAGON.sqf | 24 ++++++------------- addons/dragon/script_component.hpp | 2 +- .../missileguidance/CfgMissileTypesNato.hpp | 4 ++-- 4 files changed, 13 insertions(+), 23 deletions(-) diff --git a/addons/dragon/CfgAmmo.hpp b/addons/dragon/CfgAmmo.hpp index 2f2d2d7eedb..5005af4be10 100644 --- a/addons/dragon/CfgAmmo.hpp +++ b/addons/dragon/CfgAmmo.hpp @@ -7,7 +7,6 @@ class CfgAmmo { caliber = 60; warheadName = "HEAT"; hit = 460; - fuseDistance = 75; }; class GVAR(dragonBase): Rocket_03_AP_F { @@ -22,8 +21,8 @@ class CfgAmmo { sideAirFriction = 0.05; effectsMissile = "missile2"; effectFlare = ""; - airFriction = 0.5; - fuseDistance = 75; + airFriction = 0.3; + fuseDistance = 65; // manual says 65m whistleDist = 2; hit = 100; @@ -51,6 +50,7 @@ class CfgAmmo { enabled = 1; seekerMinRange = 30; seekerMaxRange = 1500; + serviceChargeAcceleration = 13.5; serviceCharges = 60; // how many charges are in this missile }; }; diff --git a/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf b/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf index 6642d7d7de0..5f542a9c1d5 100644 --- a/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf +++ b/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf @@ -1,4 +1,5 @@ #include "..\script_component.hpp" +#define GRAVITY_OFFSET [0, 0, _serviceInterval^2 * 4.9025] /* * Author: tcvm (Code inspired by NouberNou's Dragon Guidance) * Attack profile: Dragon Guidance @@ -51,27 +52,16 @@ if (_distanceToProjectile <= _seekerMinRangeSqr || { _serviceChargeCount <= 0 } if (((_lastTime - CBA_missionTime) <= 0) || {(_lastTime - CBA_missionTime) < (_serviceInterval / 2) && (_projectilePos vectorDistance _seekerTargetPos > 1)}) then { _attackProfileStateParams set [5, CBA_missionTime + _serviceInterval]; - private _vectorToCrosshair = vectorNormalized (_projectile worldToModel (ASLToAGL _seekerTargetPos)); - private _vectorToPos = vectorNormalized (((_projectile vectorWorldToModelVisual (_shooter weaponDirection _weapon)) vectorMultiply (_dragonSpeed * _serviceInterval)) vectorAdd (_vectorToCrosshair vectorMultiply _maxCorrectableDistance)); - - if ((_vectorToPos select 2) < 0) then { - _vectorToPos set [2, 0]; - } else { - private _a = _vectorToPos select 1; - private _b = _vectorToPos select 2; - // The booster has some angle to it, so we introduce that axis if the angle is too low - if (abs(_a) > 0 && { abs(atan (_b / _a)) < DRAGON_BOOSTER_ANGLE }) then { - _vectorToPos set [2, abs(_a)]; - }; - }; - - _projectile setVelocityModelSpace ((velocityModelSpace _projectile) vectorAdd (_vectorToPos vectorMultiply _serviceChargeAcceleration)); + private _vectorToCrosshair = vectorNormalized (_projectile worldToModel (GRAVITY_OFFSET vectorAdd ASLToAGL _seekerTargetPos)); + // Plus or minus since we'll assume the change a charge is at the exact vector is pseudo random + private _angle = ((_vectorToCrosshair#2) atan2 (_vectorToCrosshair#0)) - 22.5 + random 45; + _projectile setVelocityModelSpace ((velocityModelSpace _projectile) vectorAdd ([cos _angle * sin DRAGON_BOOSTER_ANGLE, cos DRAGON_BOOSTER_ANGLE , sin _angle * sin DRAGON_BOOSTER_ANGLE] vectorMultiply _serviceChargeAcceleration)); private _charge = createVehicle [QGVAR(serviceCharge), [0, 0, 0], [], 0, "NONE"]; - _charge setPosASL (_projectilePos vectorAdd ((_vectorToCrosshair vectorMultiply -1) vectorMultiply 0.025)); + _charge setPosASL (_projectilePos vectorAdd (_vectorToCrosshair vectorMultiply -0.025)); + [QEGVAR(common,setShotParents), [_charge] + getShotParents _projectile] call CBA_fnc_serverEvent; // AI should be alerted of popping source _attackProfileStateParams set [7, _serviceChargeCount - 1]; }; _retPos - diff --git a/addons/dragon/script_component.hpp b/addons/dragon/script_component.hpp index 77521b2c6a2..efbbc51df08 100644 --- a/addons/dragon/script_component.hpp +++ b/addons/dragon/script_component.hpp @@ -15,4 +15,4 @@ #endif #include "\z\ace\addons\main\script_macros.hpp" -#define DRAGON_BOOSTER_ANGLE 45 +#define DRAGON_BOOSTER_ANGLE 35 diff --git a/addons/missileguidance/CfgMissileTypesNato.hpp b/addons/missileguidance/CfgMissileTypesNato.hpp index 2a0d4045c45..2bc039b62bb 100644 --- a/addons/missileguidance/CfgMissileTypesNato.hpp +++ b/addons/missileguidance/CfgMissileTypesNato.hpp @@ -127,7 +127,7 @@ class GVAR(type_Dragon) { serviceInterval = 0.33; // how many seconds between pops serviceCharges = 32; // how many charges are in this missile - serviceChargeAcceleration = 6.5; + serviceChargeAcceleration = 6; dragonSpeed = 100; // meters per second defaultAttackProfile = "DRAGON"; @@ -277,7 +277,7 @@ class GVAR(type_Javelin) { seekerAccuracy = 1; // seeker accuracy multiplier seekerMinRange = 0; - seekerMaxRange = 2500; // Range from the missile which the seeker can visually search + seekerMaxRange = 4500; // Range from the missile which the seeker can visually search seekLastTargetPos = 1; // seek last target position [if seeker loses LOS of target, continue to last known pos] From 19cd58780dd8e1fb74c72dde2a8960b56de5d88e Mon Sep 17 00:00:00 2001 From: lambdatiger Date: Sun, 19 Oct 2025 15:21:10 -0500 Subject: [PATCH 3/4] cleanup and adding magazines --- addons/dragon/CfgAmmo.hpp | 28 +++++++++++++++++++ addons/dragon/CfgMagazines.hpp | 8 +++++- addons/dragon/CfgWeapons.hpp | 2 +- .../functions/fnc_attackProfile_DRAGON.sqf | 2 +- addons/dragon/functions/fnc_onFired.sqf | 4 +-- .../missileguidance/CfgMissileTypesNato.hpp | 2 +- 6 files changed, 39 insertions(+), 7 deletions(-) diff --git a/addons/dragon/CfgAmmo.hpp b/addons/dragon/CfgAmmo.hpp index 5005af4be10..46d744fde06 100644 --- a/addons/dragon/CfgAmmo.hpp +++ b/addons/dragon/CfgAmmo.hpp @@ -8,6 +8,14 @@ class CfgAmmo { warheadName = "HEAT"; hit = 460; }; + class GVAR(penetrator_dragon_2): GVAR(penetrator_super) { + caliber = 40; + hit = 400; + }; + class GVAR(penetrator_dragon_1): GVAR(penetrator_super) { + caliber = 22; + hit = 300; + }; class GVAR(dragonBase): Rocket_03_AP_F { EGVAR(frag,skip) = 1; @@ -55,6 +63,26 @@ class CfgAmmo { }; }; + class GVAR(2_M): GVAR(dragonBase) { + submunitionAmmo = QGVAR(penetrator_dragon_2); + submunitionDirectionType = "SubmunitionModelDirection"; + submunitionInitSpeed = 1000; + submunitionParentSpeedCoef = 0; + submunitionInitialOffset[] = { 0, 0, -0.2 }; + + class ace_missileguidance: ace_missileguidance { + enabled = 1; + }; + }; + + class GVAR(1_M): GVAR(2_M) { + submunitionAmmo = QGVAR(penetrator_dragon_1); + + class ace_missileguidance: ace_missileguidance { + enabled = 1; + }; + }; + class ShellBase; class GVAR(serviceCharge): ShellBase { hit = 1; diff --git a/addons/dragon/CfgMagazines.hpp b/addons/dragon/CfgMagazines.hpp index 605501376d5..db5884d090f 100644 --- a/addons/dragon/CfgMagazines.hpp +++ b/addons/dragon/CfgMagazines.hpp @@ -6,11 +6,17 @@ class CfgMagazines { soundHit[] = {}; model = QPATHTOF(models\dragon.p3d); ammo = QGVAR(super); - initSpeed = 120; + initSpeed = 65; scope = 1; displayName = CSTRING(dragonName); displayNameShort = CSTRING(dragonName); descriptionShort = CSTRING(dragonDescription); }; + class GVAR(2): GVAR(super) { + ammo = QGVAR(2_M); + }; + class GVAR(1): GVAR(super) { + ammo = QGVAR(1_M); + }; }; diff --git a/addons/dragon/CfgWeapons.hpp b/addons/dragon/CfgWeapons.hpp index ab29d53e8f8..96cdc10630a 100644 --- a/addons/dragon/CfgWeapons.hpp +++ b/addons/dragon/CfgWeapons.hpp @@ -40,7 +40,7 @@ class CfgWeapons { displayName = CSTRING(dragonName); descriptionShort = CSTRING(dragonDescription); - magazines[] = { QGVAR(super) }; + magazines[] = { QGVAR(super), QGVAR(2), QGVAR(1) }; }; // need a weapon in order to rotate turret diff --git a/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf b/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf index 5f542a9c1d5..fd50c722590 100644 --- a/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf +++ b/addons/dragon/functions/fnc_attackProfile_DRAGON.sqf @@ -20,7 +20,7 @@ params ["_seekerTargetPos", "_args", "_attackProfileStateParams"]; _args params ["_firedEH", "", "", "", "_stateParams"]; _firedEH params ["_shooter","_weapon","","","","","_projectile"]; -_attackProfileStateParams params ["_maxCorrectableDistance", "_wireCut", "_seekerMaxRangeSqr", "_seekerMinRangeSqr", "_wireCutSource", "_lastTime", "_serviceInterval", "_serviceChargeCount", "_serviceChargeAcceleration", "_dragonSpeed"]; +_attackProfileStateParams params ["_maxCorrectableDistance", "_wireCut", "_seekerMaxRangeSqr", "_seekerMinRangeSqr", "_wireCutSource", "_lastTime", "_serviceInterval", "_serviceChargeCount", "_serviceChargeAcceleration"]; private _projectilePos = getPosASL _projectile; private _distanceToProjectile = (getPosASL _shooter) vectorDistanceSqr _projectilePos; diff --git a/addons/dragon/functions/fnc_onFired.sqf b/addons/dragon/functions/fnc_onFired.sqf index 5e56a045081..28fd6acf267 100644 --- a/addons/dragon/functions/fnc_onFired.sqf +++ b/addons/dragon/functions/fnc_onFired.sqf @@ -30,7 +30,6 @@ private _config = configOf _projectile >> "ace_missileguidance"; private _serviceInterval = [_config >> "serviceInterval", "NUMBER", 0.33] call CBA_fnc_getConfigEntry; private _serviceChargeCount = [_config >> "serviceCharges", "NUMBER", 60] call CBA_fnc_getConfigEntry; private _serviceChargeAcceleration = [_config >> "serviceChargeAcceleration", "NUMBER", 6.5] call CBA_fnc_getConfigEntry; -private _dragonSpeed = [_config >> "dragonSpeed", "NUMBER", 100] call CBA_fnc_getConfigEntry; private _maxCorrectableDistance = [_config >> "correctionDistance", "NUMBER", DEFAULT_CORRECTION_DISTANCE] call CBA_fnc_getConfigEntry; private _maxDistanceSqr = _seekerMaxRange * _seekerMaxRange; private _minDistanceSqr = _seekerMinRange * _seekerMinRange; @@ -49,7 +48,6 @@ _attackProfileStateParams append [ CBA_missionTime, _serviceInterval, _serviceChargeCount, - _serviceChargeAcceleration, - _dragonSpeed + _serviceChargeAcceleration ]; diff --git a/addons/missileguidance/CfgMissileTypesNato.hpp b/addons/missileguidance/CfgMissileTypesNato.hpp index 2bc039b62bb..fd505609de7 100644 --- a/addons/missileguidance/CfgMissileTypesNato.hpp +++ b/addons/missileguidance/CfgMissileTypesNato.hpp @@ -128,7 +128,7 @@ class GVAR(type_Dragon) { serviceInterval = 0.33; // how many seconds between pops serviceCharges = 32; // how many charges are in this missile serviceChargeAcceleration = 6; - dragonSpeed = 100; // meters per second + dragonSpeed = 100; // deprecated - meters per second defaultAttackProfile = "DRAGON"; attackProfiles[] = {"DRAGON"}; From 266e5cb597d8b6e84f3be5f6f98f5dc96f0bf8c6 Mon Sep 17 00:00:00 2001 From: lambdatiger Date: Sun, 19 Oct 2025 15:22:41 -0500 Subject: [PATCH 4/4] dragon.cfg cleanup --- addons/dragon/models/dragon.cfg | 2 -- 1 file changed, 2 deletions(-) diff --git a/addons/dragon/models/dragon.cfg b/addons/dragon/models/dragon.cfg index 38be8c250cf..5ec1e152721 100644 --- a/addons/dragon/models/dragon.cfg +++ b/addons/dragon/models/dragon.cfg @@ -10,8 +10,6 @@ class CfgSkeletons { skeletonBones[] = { "missile","" }; - pivotsModel = ""; - isDiscrete = 1; }; };