feat(naval-weapons): improve ASM missile exhaust effects

- Use the vanilla CruiseMissile smoke effect.
- Position the emitter using the fire_beg and fire_end memory points.
- Generalize the function for future ASM missiles.
This commit is contained in:
2026-07-31 21:52:36 -03:00
parent 722699d73e
commit 4512f2c67e
4 changed files with 144 additions and 10 deletions
+17
View File
@@ -1,5 +1,22 @@
# Changelog
## 2026-07-30
### Armamentos navais
- O AM39 Exocet foi integrado ao pacote de armamentos navais usando a base de míssil de cruzeiro, com modelo de voo próprio, ignição retardada de 1,5 segundo e animações de estágio de lançamento, cruzeiro e estabilizadores.
- Criadas as definições de munição, magazine, hardpoint e arma do AM39 para emprego aerotransportado.
- Configurada a ejeção do míssil sem velocidade inicial (`initSpeed=0` e `ejectSpeed[]={0,0,0}`), permitindo a queda gravitacional antes da ignição do motor.
- Ajustado o ciclo de efeitos do AM39 para usar o atraso de ignição vanilla: queda gravitacional sem partículas, labareda e emissor contínuo de fumaça branca juntos na ignição por 2 segundos e voo posterior sem efeitos.
### Aeronaves
- O AH-15B Super Cougar (Caracal) recebeu dois pylons dinâmicos para o AM39, um em cada bordo, com presets `Empty` e `AM39 Exocet 2x`.
- O pylon direito foi configurado como posição espelhada do pylon esquerdo e o armamento foi vinculado à estação do Weapons Officer.
- Adicionada a estação `BRAF_AM39_Gunner_Turret`, herdada da Crew Chief Turret, sem função de copiloto ou partida do motor, mantendo o emprego do sensor FLIR/laser designator.
- Os proxies dinâmicos do Caracal foram ajustados para o sistema de pylons.
- O modelo do store do AM39 passou a usar `PylonMissile_1x_Bomb_02_F.p3d`, fazendo o proxy desaparecer corretamente do helicóptero após o disparo.
## 2026-07-19
### Aeronaves
Binary file not shown.
@@ -0,0 +1,85 @@
params [
"_unit",
"_weapon",
"_muzzle",
"_mode",
"_ammo",
"_magazine",
"_projectile"
];
private _ammoConfig = configFile >> "CfgAmmo" >> _ammo;
if (
isNull _projectile ||
{!isClass _ammoConfig} ||
{getNumber (_ammoConfig >> "braf_asm") != 1}
) exitWith {};
[_projectile] spawn
{
params ["_projectile"];
sleep 1.5;
if (isNull _projectile) exitWith {};
private _fireBeg = _projectile selectionPosition ["fire_beg", "Memory"];
private _fireEnd = _projectile selectionPosition ["fire_end", "Memory"];
private _fireDirectionModel = _fireBeg vectorFromTo _fireEnd;
if (vectorMagnitude _fireDirectionModel < 0.01) exitWith {};
private _fireDirectionWorld = _projectile vectorModelToWorld _fireDirectionModel;
private _smoke = "#particlesource" createVehicleLocal [0, 0, 0];
if (isNull _smoke) exitWith {};
_smoke setParticleParams
[
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 12, 8, 0],
"",
"Billboard",
1,
0.6,
"fire_beg",
_fireDirectionWorld vectorMultiply 2,
0,
0,
1.2,
0.5,
[2, 6, 8.8],
[
[0.5, 0.5, 0.5, 0.1],
[0.6, 0.6, 0.6, 0.06],
[0.7, 0.7, 0.7, 0.04],
[0.8, 0.8, 0.8, 0.005],
[0.9, 0.9, 0.9, 0.003]
],
[5],
0.1,
0.1,
"",
"",
_projectile
];
_smoke setParticleRandom
[
0.1,
[0.3, 0.3, 0.3],
[0.25, 0.25, 0.25],
20,
0.15,
[0, 0, 0, 0],
0,
0
];
_smoke setDropInterval 0.003;
_smoke attachTo [_projectile, [0, 0, 0]];
private _endTime = time + 2;
waitUntil
{
sleep 0.01;
isNull _projectile || {time >= _endTime}
};
deleteVehicle _smoke;
};
+40 -8
View File
@@ -7,7 +7,9 @@ class CfgPatches
requiredVersion = 1.82;
requiredAddons[] =
{
"A3_Weapons_F"
"A3_Weapons_F",
"A3_Data_F",
"A3_Data_F_ParticleEffects"
};
units[] = {};
weapons[] =
@@ -16,6 +18,29 @@ class CfgPatches
};
};
};
class CfgFunctions
{
class BRAF
{
class NavalWeapons
{
class ASMEngineSmoke
{
file = "\braf\braf_weapons_naval\braf_functions\fn_ASMEngineSmoke.sqf";
};
};
};
};
class BRAF_ASM_EngineEffects
{
class RocketBackfire1
{
simulation = "particles";
type = "PylonBackfire";
start = "(density interpolate [0.019,0.02,1,0])";
lifeTime = 2;
};
};
class CfgAmmo
{
class ammo_Missile_CruiseBase;
@@ -23,7 +48,12 @@ class CfgAmmo
{
scope = 0;
cameraViewAvailable = 1;
initTime = 0.5;
initTime = 1.5;
coefGravity = 1;
braf_asm = 1;
effectsMissileInit = "BRAF_ASM_EngineEffects";
effectsMissile = "EmptyEffect";
muzzleEffect = "";
};
class braf_ammo_am39_asm: braf_ammo_asm_cruise_base
{
@@ -32,9 +62,6 @@ class CfgAmmo
author = "BRAF TEAM";
model = "braf\braf_weapons_naval\braf_asm\Exocet\AM39\braf_am39_fly.p3d";
proxyShape = "braf\braf_weapons_naval\braf_asm\Exocet\AM39\braf_am39.p3d";
effectsMissileInit = "PylonBackEffects";
effectsMissile = "EmptyEffect";
muzzleEffect = "";
};
};
class CfgMagazines
@@ -56,12 +83,12 @@ class CfgMagazines
displayName = "AM39 Exocet Pylon Store";
author = "BRAF TEAM";
count = 1;
initSpeed = 12;
initSpeed = 0;
model="\A3\Weapons_F\DynamicLoadout\PylonMissile_1x_Bomb_02_F.p3d";
ammo = "braf_ammo_am39_asm";
pylonWeapon = "braf_weapon_am39_asm";
hardpoints[] = {"BRAF_AM39_PYLON"};
ejectSpeed[] = {1,0,0};
ejectSpeed[] = {0,0,0};
};
};
class CfgWeapons
@@ -71,6 +98,7 @@ class CfgWeapons
class braf_weapon_asm_air_base: missiles_SCALPEL
{
scope = 0;
author = "BRAF TEAM";
magazines[] = {};
modes[] = {"Cruise"};
class Cruise: RocketPods
@@ -97,12 +125,16 @@ class CfgWeapons
maxRange = 32000;
maxRangeProbab = 0.92;
};
class EventHandlers
{
fired = "_this call BRAF_fnc_ASMEngineSmoke";
};
};
class braf_weapon_am39_asm: braf_weapon_asm_air_base
{
scope = 2;
displayName = "AM39 Exocet";
author = "BRAF";
author = "BRAF TEAM";
magazines[] =
{
"braf_mag_am39_1rnd",