====== ArmA 2 Custom Artillery ======
[[https://www.pmctactical.org/forum/viewforum.php?f=50|ArmA 2 Forum]], [[:arma2|ArmA 2 Home]], [[arma2:config|ArmA 2 Config]], [[arma2:file_formats|ArmA 2 File Formats]], [[arma2:missions|ArmA 2 Missions]], [[arma2:modeling|ArmA 2 3D Modeling]], [[arma2:scripting|ArmA 2 Scripting]], [[arma2:terrain|ArmA 2 Terrain]], [[arma2:texturing|ArmA 2 Texturing]], [[arma2:tools|ArmA 2 Tools]]
How to create custom artillery. Its difficult, in fact, we haven't been able to create fully custom one yet, we just inherit from M119 for arty and M252 for mortars. Yes it works, but its ugly. Here is our research so far, maybe this helps someone.
====== Modules Arty ======
arma2\modules\arty\config.cpp\\
oa\modules\arty\config.cpp\\
are identical configs (epp diff).
class CfgCloudlets
{
class Default;
class ARTY_ExplosionStreamersSmall: Default
class MLRS: Tank
class GRAD_Base: Ural_Base_withTurret
class D30_Base: StaticCannon
class M119: StaticCannon
class M252: StaticMortar
class 2b14_82mm: StaticMortar
class CfgAmmo
{
class ShellBase;
class ARTY_Sh_Base: ShellBase
{
ARTY_IncomingSounds[] = {};
ARTY_IncomingSoundAlt = 200;
ARTY_IncomingSoundAltError = 50;
ARTY_TrailFX = "\ca\modules\ARTY\data\fx\scripts\shellTrailsMedium.sqf";
whistleOnFire = 2;
};
ARTY_IsArtyVehicle = 1;
class CfgMagazines
class ARTY_30Rnd_105mmHE_M119: VehicleMagazine
{
scope = public;
displayName = "$STR_CfgMagazines_ARTY_30Rnd_105mmHE_M119_DN";
ammo = "ARTY_Sh_105_HE";
count = 30;
initSpeed = 850;
nameSound = "heat";
ARTY_Ballistics = "\ca\modules\arty\data\tables\m119\105mm_ballistics.sqf";
};
class ARTY_8Rnd_81mmHE_M252: VehicleMagazine
{
scope = public;
displayName = "$STR_CfgMagazines_ARTY_8Rnd_81mmHE_M252_DN";
ammo = "ARTY_Sh_81_HE";
count = 8;
initSpeed = 650;
nameSound = "heat";
ARTY_Ballistics = "\ca\modules\arty\data\tables\m252\m821A1_ballistics.sqf";
};
class CfgWeapons
{
class CannonCore;
class M119: CannonCore
{
magazines[] =
{
"30Rnd_105mmHE_M119",
"ARTY_30Rnd_105mmHE_M119",
"ARTY_30Rnd_105mmWP_M119",
"ARTY_30Rnd_105mmSADARM_M119",
"ARTY_30Rnd_105mmLASER_M119",
"ARTY_30Rnd_105mmSMOKE_M119",
"ARTY_30Rnd_105mmILLUM_M119"
};
};
class M252: CannonCore
{
magazines[] =
{
"ARTY_8Rnd_81mmHE_M252",
"ARTY_8Rnd_81mmWP_M252",
"ARTY_8Rnd_81mmILLUM_M252"
};
};
Ballistic things:
ARTY_Ballistics = "\ca\modules\arty\data\tables\m119\105mm_ballistics.sqf";
ARTY_Ballistics = "\ca\modules\arty\data\tables\m252\m821A1_ballistics.sqf";
ARTY_Ballistics = "\ca\modules\arty\data\tables\m270\xm31_ballistics.sqf";
ARTY_Ballistics = "\ca\modules\arty\data\tables\d30\122mm_ballistics.sqf";
ARTY_Ballistics = "\ca\modules\arty\data\tables\2b14\82mm_ballistics.sqf";
ARTY_Ballistics = "\ca\modules\arty\data\tables\bm21\9M28F_HE_ballistics.sqf";
====== OA Bin ======
oa\bin\config.cpp
class ArtilleryRocketCore: RocketCore
class ArtilleryTarget: All
====== OA UI ======
oa\ui\config.cpp
class RscDisplayArtillery: RscStandardDisplay
====== OA Weapons_e ======
oa\weapons_e\config.cpp
class ARTY_Sh_Base: ShellBase{};
class ARTY_Sh_120_HE: ARTY_Sh_Base
class 24Rnd_120mmHE_M120: VehicleMagazine
ammo = "ARTY_Sh_120_HE";
class M119: CannonCore
{
magazines[] =
{
"30Rnd_105mmHE_M119",
"30Rnd_105mmWP_M119",
"30Rnd_105mmSADARM_M119",
"30Rnd_105mmLASER_M119",
"30Rnd_105mmSMOKE_M119",
"30Rnd_105mmILLUM_M119",
"ARTY_30Rnd_105mmHE_M119",
"ARTY_30Rnd_105mmWP_M119",
"ARTY_30Rnd_105mmSADARM_M119",
"ARTY_30Rnd_105mmLASER_M119",
"ARTY_30Rnd_105mmSMOKE_M119",
"ARTY_30Rnd_105mmILLUM_M119"
};
artilleryLock = 1;
artilleryDispersion = 0.35;
artilleryCharge = 0.48;
**Illumination** and **WP** rounds:
// cfgAmmo
class Sh_81_HE: ShellBase
{
hit = 160;
indirectHit = 50;
indirectHitRange = 20;
typicalSpeed = 800;
explosive = 0.8;
cost = 200;
timeToLive = 180;
model = "\ca\Weapons\shell";
CraterEffects = "ArtyShellCrater";
ExplosionEffects = "ARTY_ShellExplosionSmall";
muzzleEffect = "BIS_Effects_HeavyCaliber";
whistleOnFire = 0;
whistleDist = 20;
artilleryLock = 1;
airFriction = 0.0;
sideairFriction = 0.0;
thrust = 0;
};
class Sh_81_WP: Sh_81_HE
{
hit = 35;
indirectHit = 30;
indirectHitRange = 20;
explosive = 0.8;
ExplosionEffects = "WPExplosion";
soundHit[] = {"\ca\weapons\data\sound\explosion\grenade_new1",3.162278,1};
CraterEffects = "";
};
class Sh_81_ILLUM: Sh_81_HE
{
hit = 5;
indirectHit = 0;
indirectHitRange = 0;
explosive = 0;
ExplosionEffects = "";
soundHit[] = {"",0,1};
CraterEffects = "";
whistleDist = 0;
};
class Sh_105_HE: ShellBase
{
artilleryLock = 1;
thrust = 0;
timeToLive = 180;
airFriction = 0;
sideAirFriction = 0;
};
class Sh_105_ILLUM: Sh_105_HE
{
hit = 8;
indirectHit = 0;
indirectHitRange = 0;
explosive = 0;
ExplosionEffects = "";
soundHit[] = {"",0,1};
CraterEffects = "";
whistleDist = 0;
};
class Sh_105_WP: Sh_105_HE
{
hit = 60;
indirectHit = 50;
indirectHitRange = 30;
explosive = 0.8;
ExplosionEffects = "WPExplosion";
CraterEffects = "ExploAmmoCrater";
soundHit[] = {"\ca\weapons\data\sound\explosion\grenade_new1",3.162278,1};
whistleDist = 60;
};
// cfgMagazines
class 8Rnd_81mmHE_M252: VehicleMagazine
{
scope = public;
displayName = "$STR_CfgMagazines_ARTY_8Rnd_81mmHE_M252_DN";
ammo = "Sh_81_HE";
count = 8;
initSpeed = 243;
nameSound = "heat";
};
class 8Rnd_81mmWP_M252: 8Rnd_81mmHE_M252
{
displayName = "$STR_CfgMagazines_ARTY_8Rnd_81mmWP_M252_DN";
ammo = "Sh_81_WP";
};
class 8Rnd_81mmILLUM_M252: 8Rnd_81mmHE_M252
{
displayName = "$STR_CfgMagazines_ARTY_8Rnd_81mmILLUM_M252_DN";
ammo = "Sh_81_ILLUM";
};
class 30Rnd_105mmHE_M119: VehicleMagazine
{
displayNameShort = "$STR_EP1_SN_HE";
initSpeed = 370;
};
class 30Rnd_105mmWP_M119: 30Rnd_105mmHE_M119
{
displayName = "$STR_CfgMagazines_ARTY_30Rnd_105mmWP_M119_DN";
ammo = "Sh_105_WP";
};
class 30Rnd_105mmILLUM_M119: 30Rnd_105mmHE_M119
{
displayName = "$STR_DN_30Rnd_M119_105mmILLUM";
ammo = "Sh_105_ILLUM";
};
====== OA Weapons_e\M119_Howitzer ======
oa\weapons_e\M119_Howitzer\config.cpp
artilleryScanner = 1;
ARTY_IsArtyVehicle = 0;
====== ArmA2\Data\ParticleEffects ======
arma2\Data\ParticleEffects\config.cpp
class ArtyShellCrater
class ArtyShellExplosion
====== Inherit mess ======
M252 as an example:
- arma2\weapons\m252_81mm_mortar\config.cpp is creating the vehicle + weapon.
- arma2\modules\arty\config.cpp adds to that config; magazine "ARTY_8Rnd_81mmHE_M252" and ARTY_IsArtyVehicle = 1;.
====== Summary ======
Adding artilleryScanner = 1; to your arty VEHICLE will activate the artillery computer action menu.
Adding ARTY_IsArtyVehicle = 1; to your vehicle, will activate target artillery action menu.
arma2\weapons\m252_81mm_mortar\config.cpp\\
oa\weapons\m252_81mm_mortar\config.cpp\\
are the same, except arma2 cursor = "Missile"; was replaced by oa's cursor = "\ca\UI\data\cursor_w_tank_gs";
====== bis models analysis ======
bis artillery models analysis
**M252 81mm mortar**
81mortar.p3d
Resolution LOD selections: otochlaven, otocvez, proxys cargo and gunner.
Geometry: very rough box shape, proxys.
Memory:
aimpoint - center of tube.
cargoview - aligned with ground plate, bit to the right.
gun_chamber - almost bottom of tube.
gun_muzzle - end point of tube.
gunnerview - slightly behind and left of ground plate.
konec hlavne - same as gun_chamber.
osahlaven - horizontal two points where tube connects to ground plate.
osaveze - vertical two points where tube connects to ground plate.
otochlaven - gun_muzzle and gun_chamber.
otocvez - osahlaven, cargoview, gunnerview, pos_cargo, pos_cargo_dir, pos_gunner and pos_gunner_dir.
pos_cargo - cargo getin point, back right.
pos_cargo_dir - cargo getin direction (towards model).
pos_gunner - gunner getin point, back left.
pos_gunner_dir - gunner getin direction (towards model).
usti hlavne - end point of tube (gun_muzzle).
zamerny - center of tube (aimpoint).
**podnos 2b14 82mm**
podnos_2b14_82mm.p3d
Pretty much the mirror image technically modelwise as 81mortar.p3d. Only thing worth mentioning is that gun_muzzle looks to be like almost same spot as in M252, which suggests bis just used its memory points "as is".