Ships Config Guidelines – Arma 3

From Bohemia Interactive Community
Jump to navigation Jump to search
No edit summary
No edit summary
Line 4: Line 4:
==Intro==
==Intro==
'''101 - How to set up a ship for Arma 3'''  
'''101 - How to set up a ship for Arma 3'''  
What's the difference between a boat and a ship? Well, a ship is usually large enough to carry a boat. Subs are also called boats, regardless of size.
For Arma purposes, lets call boats anything shorter than 60m (the geo lod limit of Arma) and ships over 60m. Subs are subs!
There are 2 approaches to ships and boats in Arma 3. Typically boats are modelled and implemented as "vehicles" where as ships historically have been implemented as "static" objects.


Please be aware of our Arma 3 modding license:
Please be aware of our Arma 3 modding license:
Line 20: Line 26:


== Model requirements {p3d} ==
== Model requirements {p3d} ==
* LODs
** Fire Geo
** View Geo
** HitPoints
** Land Contact
** Memory
** Physx
** Bouyancy
** Geo
** View Cargo
** View Pilot
** View Gunner
** Resolution LODs 1-8
** ShadowVolume 0, 10, 1000, 1010


* A new PhysX LOD
* A new PhysX LOD
Line 26: Line 48:
** This lod should contain ship’s hull, and ...
** This lod should contain ship’s hull, and ...


* Memory LOD
* Memory LOD (from Arma 2 example)
** There should be an axis for each propeller named ''????_axis'', the name is defined in selected wheel as '''center'''.
** drivingWheel_axis
** engine1_axis
** engine2_axis
** EngineEffectL
** EngineEffectR
** eye
** fuel_axis
 




Line 34: Line 63:
* Similarly to PhysX related changes, you will mostly need to change:
* Similarly to PhysX related changes, you will mostly need to change:
** Example:  
** Example:  
class cfgSkeletons
{
class Default
{
isDiscrete = 1;
skeletonInherit = "";
skeletonBones[] = {};
};
class Boat_Armed_01_hmg_F : default
{
SkeletonBones[]=
{
"damagehide", "",
"rearturret", "damagehide",
"reargun", "damagehide",
"drivewheel", "damagehide",
"otocvez", "",
"otochlaven", "otocvez",
"commanderview", "otochlaven",
"zasleh_gmg", "otochlaven",
"volant", "",
"radar", "",
"kompas", "",
"fuel", "",
"mph", "",
"rpm", "",
"amps", "",
"oil", "",
"trim", "",
"tmp", "",
"volt", "",
"otocvez2", "",
"otochlaven2", "otocvez2",
"otochlaven2_shake", "otochlaven2",
"z_gatlingr", "otochlaven2_shake",
"recoil", "otochlaven2",
"bolt", "recoil",
"gunnerview2", "otochlaven2",
"magazine", "otochlaven2",
"ammo_belt2", "magazine",
"bullet006", "ammo_belt2",
"bullet005", "bullet006",
"bullet004", "bullet005",
"bullet003", "bullet004",
"bullet002", "bullet003",
"bullet001", "bullet002",
"zasleh2", "otochlaven2",
"otochlaven2_static", "otocvez2",
"positionlights", ""
};
};
};
class CfgModels
{
class Default
{
sections[] = {};
sectionsInherit="";
skeletonName = "";
};
class Boat_Armed_01_hmg_F:Default
{
skeletonName="Boat_Armed_01_hmg_F";
sections[]=
{
"otochlaven",
"otochlaven2",
"engine",
"p svetlo",
"camo",
"camo2",
"camo3",
"zbytek"
};
/*potential axis=
otochlaven
otocvez2
otochlaven2
magazine
recoil2
damagehide
otochlaven2_shake
engine
karoserie
p svetlo
konec hlavne
usti hlavne
recoilhlaven_axis
osahlavne
osaveze2
konec hlavne2
usti hlavne2
eye2
osahlavne2
bolt_axis2
marker_light1
magazine2
gunnerview2
pilot2
ammo_belt_axis2
drivewheel_axis
watereffectl
watereffectr
engineeffectl
engineeffectr
pos driver
pos driver dir
pos cargo
pos cargo dir
pos gunner
pos gunner dir
commanderview
mph_axis
rpm_axis
tmp_axis
amps_axis
volt_axis
oil_axis
fuel_axis
trim_axis
marker_light2
pip0_pos
pip0_dir
pip3_pos
pip3_dir
pip2_pos
pip2_dir
konec p svetla
machinegun_eject_pos
machinegun_eject_dir
positionlight_red_1_pos
positionlight_green_1_pos
slingloadcargox
slingloadcargo1
slingloadcargo2
slingloadcargo3
slingloadcargo4
slingloadcargo5
slingloadcargo6
otocvez
drivewheel
mph
rpm
tmp
amps
volt
oil
fuel
trim
recoil
camo
camo2
camo3
zbytek
zasleh2
zasleh_gmg
positionlights
bolt
bullet001
bullet002
bullet003
bullet004
bullet005
bullet006
ammo_belt2
*/
class Animations
{
class Damagehide
{
type="hide";
source="damage";
selection="damagehide";
// sourceAddress = clamp;// (default)
minValue = 0.0;//rad 0.0
maxValue = 1.0;//rad 57.29578
hideValue = 1.0;
// unHideValue = -1.0;//(default)
animPeriod = 0.0;
initPhase = 0.0;
};
class Barrel_recoil
{
type="translation";
source="ReloadAnim";
selection="recoil";
axis="recoil_axis";//*probably*
sourceAddress = mirror;
minValue = 0.0;//rad 0.0
maxValue = 0.5;//rad 28.64789
offset0 = 0.0;
offset1 = -0.05;
animPeriod = 2.8026e-045/*#DEN*/;
initPhase = 0.0;
// memory = true;//(default assumed)
};
class Bolt_recoil
{
type="translation";
source="ReloadAnim";
selection="bolt";
axis="bolt_axis";//*probably*
sourceAddress = mirror;
minValue = 0.0;//rad 0.0
maxValue = 0.5;//rad 28.64789
offset0 = 0.0;
offset1 = -0.25;
animPeriod = 2.8026e-045/*#DEN*/;
initPhase = 0.0;
// memory = true;//(default assumed)
};
class Turret_shake
{
type="translation";
source="ReloadAnim";
selection="otochlaven2_shake";
axis="otochlaven2_shake_axis";//*probably*
sourceAddress = mirror;
minValue = 0.0;//rad 0.0
maxValue = -0.2;//rad -11.459156
offset0 = 0.0;
offset1 = 0.2;
animPeriod = 2.8026e-045/*#DEN*/;
initPhase = 0.0;
// memory = true;//(default assumed)
};
class Turret_shake_aside
{
type="translation";
source="ReloadAnim";
selection="otochlaven2_shake";
axis="otochlaven2_shake_axis";//*probably*
sourceAddress = mirror;
minValue = 0.0;//rad 0.0
maxValue = 0.65;//rad 37.242256
offset0 = 0.0;
offset1 = 0.2;
animPeriod = 2.8026e-045/*#DEN*/;
initPhase = 0.0;
// memory = true;//(default assumed)
};
class Magazine_hide
{
type="hide";
source="reloadMagazine";
selection="magazine";
// sourceAddress = clamp;// (default)
minValue = 0.0;//rad 0.0
maxValue = 1.0;//rad 57.29578
hideValue = 0.28;
unHideValue = 0.72;
animPeriod = 0.0;
initPhase = 0.0;
};
class MainTurret
{
type="rotationY";
source="mainTurret";
selection="otocvez";
axis="otocvez_axis";//*probably*
// sourceAddress = clamp;// (default)
minValue = -6.2831855;//rad -360.0
maxValue = 6.2831855;//rad 360.0
angle0 = -6.2831855;//rad -360.0;
angle1 = 6.2831855;//rad 360.0;
animPeriod = 0.0;
initPhase = 0.0;
// memory = true;//(default assumed)
};
class DamageHideOtocVez
{
type="hide";
source="damage";
selection="otocvez";
// sourceAddress = clamp;// (default)
minValue = 0.0;//rad 0.0
maxValue = 1.0;//rad 57.29578
hideValue = 1.0;
// unHideValue = -1.0;//(default)
animPeriod = 0.0;
initPhase = 0.0;
};
class MainGun
{
type="rotationX";
source="mainGun";
selection="otochlaven";
axis="otochlaven_axis";//*probably*
// sourceAddress = clamp;// (default)
minValue = -6.2831855;//rad -360.0
maxValue = 6.2831855;//rad 360.0
angle0 = -6.2831855;//rad -360.0;
angle1 = 6.2831855;//rad 360.0;
animPeriod = 0.0;
initPhase = 0.0;
// memory = true;//(default assumed)
};
class DamageHideOtocHlaven
{
type="hide";
source="damage";
selection="otochlaven";
// sourceAddress = clamp;// (default)
minValue = 0.0;//rad 0.0
maxValue = 1.0;//rad 57.29578
hideValue = 1.0;
// unHideValue = -1.0;//(default)
animPeriod = 0.0;
initPhase = 0.0;
};
class RearTurret
{
type="rotationY";
source="rearTurret";
selection="otocvez2";
axis="otocvez2_axis";//*probably*
// sourceAddress = clamp;// (default)
minValue = -6.2831855;//rad -360.0
maxValue = 6.2831855;//rad 360.0
angle0 = -6.2831855;//rad -360.0;
angle1 = 6.2831855;//rad 360.0;
animPeriod = 0.0;
initPhase = 0.0;
// memory = true;//(default assumed)
};
class RearGun
{
type="rotationX";
source="RearGun";
selection="otochlaven2";
axis="otochlaven2_axis";//*probably*
// sourceAddress = clamp;// (default)
minValue = -6.2831855;//rad -360.0
maxValue = 6.2831855;//rad 360.0
angle0 = -6.2831855;//rad -360.0;
angle1 = 6.2831855;//rad 360.0;
animPeriod = 0.0;
initPhase = 0.0;
// memory = true;//(default assumed)
};
class muzzleFlash
{
type="hide";
source="muzzle_source";
selection="zasleh_gmg";
// sourceAddress = clamp;// (default)
minValue = 0.0;//rad 0.0
maxValue = 1.0;//rad 57.29578
hideValue = 0.0;
unHideValue = 0.1;
animPeriod = 0.0;
initPhase = 0.0;
};
class zaslehROT
{
type="rotationZ";
source="muzzle_source_rot";
selection="zasleh_gmg";
axis="zasleh_gmg_axis";//*probably*
sourceAddress = loop;
minValue = 0.0;//rad 0.0
maxValue = 4.0;//rad 229.18312
angle0 = 0.0;//rad 0.0;
angle1 = 6.2831855;//rad 360.0;
animPeriod = 1.4013e-045/*#DEN*/;
initPhase = 0.0;
// memory = true;//(default assumed)
};
class muzzleFlash2
{
type="hide";
source="muzzle2_source";
selection="zasleh2";
// sourceAddress = clamp;// (default)
minValue = 0.0;//rad 0.0
maxValue = 1.0;//rad 57.29578
hideValue = 0.0;
unHideValue = 0.8;
animPeriod = 0.0;
initPhase = 0.0;
};
class zasleh2ROT
{
type="rotationZ";
source="muzzle2_source_rot";
selection="zasleh2";
axis="zasleh2_axis";//*probably*
sourceAddress = loop;
minValue = 0.0;//rad 0.0
maxValue = 4.0;//rad 229.18312
angle0 = 0.0;//rad 0.0;
angle1 = 6.2831855;//rad 360.0;
animPeriod = 1.4013e-045/*#DEN*/;
initPhase = 0.0;
// memory = true;//(default assumed)
};
class fuel
{
type="rotation";
source="fuel";
selection="fuel";
axis="fuel_axis";//*probably*
// sourceAddress = clamp;// (default)
minValue = 0.0;//rad 0.0
maxValue = 1.0;//rad 57.29578
angle0 = 0.5235988;//rad 30.0;
angle1 = -0.5235988;//rad -30.0;
animPeriod = 0.0;
initPhase = 0.0;
// memory = true;//(default assumed)
};
class mph
{
type="rotation";
source="speed";
selection="mph";
axis="mph_axis";//*probably*
// sourceAddress = clamp;// (default)
minValue = 2.0;//rad 114.59156
maxValue = 25.0;//rad 1432.3945
angle0 = 2.7925267;//rad 160.0;
angle1 = -2.7925267;//rad -160.0;
animPeriod = 0.0;
initPhase = 0.0;
// memory = true;//(default assumed)
};
class rpm
{
type="rotation";
source="rpm";
selection="rpm";
axis="rpm_axis";//*probably*
// sourceAddress = clamp;// (default)
minValue = 0.0;//rad 0.0
maxValue = 1.0;//rad 57.29578
angle0 = 2.7925267;//rad 160.0;
angle1 = -2.7925267;//rad -160.0;
animPeriod = 0.0;
initPhase = 0.0;
// memory = true;//(default assumed)
};
class amps_random
{
type="rotation";
source="rpm";
selection="amps";
axis="amps_axis";//*probably*
// sourceAddress = clamp;// (default)
minValue = 0.0;//rad 0.0
maxValue = 1.0;//rad 57.29578
angle0 = 0.17453292;//rad 10.0;
angle1 = -0.17453292;//rad -10.0;
animPeriod = 0.0;
initPhase = 0.0;
// memory = true;//(default assumed)
};
class oil_random
{
type="rotation";
source="rpm";
selection="oil";
axis="oil_axis";//*probably*
// sourceAddress = clamp;// (default)
minValue = 0.0;//rad 0.0
maxValue = 1.0;//rad 57.29578
angle0 = -0.17453292;//rad -10.0;
angle1 = 0.17453292;//rad 10.0;
animPeriod = 0.0;
initPhase = 0.0;
// memory = true;//(default assumed)
};
class trim_random
{
type="rotation";
source="speed";
selection="trim";
axis="trim_axis";//*probably*
// sourceAddress = clamp;// (default)
minValue = 0.0;//rad 0.0
maxValue = 1.0;//rad 57.29578
angle0 = 0.08726646;//rad 5.0;
angle1 = -0.08726646;//rad -5.0;
animPeriod = 0.0;
initPhase = 0.0;
// memory = true;//(default assumed)
};
class tmp_random
{
type="rotation";
source="rpm";
selection="tmp";
axis="tmp_axis";//*probably*
// sourceAddress = clamp;// (default)
minValue = 0.0;//rad 0.0
maxValue = 1.0;//rad 57.29578
angle0 = -0.08726646;//rad -5.0;
angle1 = 0.08726646;//rad 5.0;
animPeriod = 0.0;
initPhase = 0.0;
// memory = true;//(default assumed)
};
class volt_random
{
type="rotation";
source="speed";
selection="volt";
axis="volt_axis";//*probably*
// sourceAddress = clamp;// (default)
minValue = 0.0;//rad 0.0
maxValue = 1.0;//rad 57.29578
angle0 = 0.2617994;//rad 15.0;
angle1 = -0.2617994;//rad -15.0;
animPeriod = 0.0;
initPhase = 0.0;
// memory = true;//(default assumed)
};
class DrivingWheel
{
type="rotation";
source="drivingWheel";
selection="drivewheel";
axis="drivewheel_axis";//*probably*
// sourceAddress = clamp;// (default)
minValue = -1.0;//rad -57.29578
maxValue = 1.0;//rad 57.29578
angle0 = 2.000147;//rad 114.59999;
angle1 = -2.000147;//rad -114.59999;
animPeriod = 0.0;
initPhase = 0.0;
// memory = true;//(default assumed)
};
class Ammo_Belt_2_Rotation_prep
{
type="translation";
source="ReloadAnim";
selection="ammo_belt2";
axis="ammo_belt2_axis";//*probably*
// sourceAddress = clamp;// (default)
minValue = 0.0;//rad 0.0
maxValue = 0.0001;//rad 0.005729578
offset0 = -1.0;
offset1 = 0.0;
animPeriod = 0.0;
initPhase = 0.0;
// memory = true;//(default assumed)
};
class Ammo_Belt_2_Rotation_main
{
type="translation";
source="ReloadAnim";
selection="ammo_belt2";
axis="ammo_belt2_axis";//*probably*
// sourceAddress = clamp;// (default)
minValue = 0.3;//rad 17.188734
maxValue = 0.999;//rad 57.238483
offset0 = 0.0;
offset1 = -1.0;
animPeriod = 0.0;
initPhase = 0.0;
// memory = true;//(default assumed)
};
class Ammobelt_Hide
{
type="hide";
source="reloadMagazine";
selection="ammo_belt2";
// sourceAddress = clamp;// (default)
minValue = 0.0;//rad 0.0
maxValue = 1.0;//rad 57.29578
hideValue = 0.09;
unHideValue = 1.0;
animPeriod = 0.0;
initPhase = 0.0;
};
class Bullet001_2_Hide
{
type="hide";
source="revolving";
selection="bullet001";
sourceAddress = mirror;
minValue = -1.0;//rad -57.29578
maxValue = 0.0;//rad 0.0
hideValue = 0.975;
// unHideValue = -1.0;//(default)
animPeriod = 2.8026e-045/*#DEN*/;
initPhase = 0.0;
};
class Bullet002_2_Hide
{
type="hide";
source="revolving";
selection="bullet002";
sourceAddress = mirror;
minValue = -1.0;//rad -57.29578
maxValue = 0.0;//rad 0.0
hideValue = 0.98;
// unHideValue = -1.0;//(default)
animPeriod = 2.8026e-045/*#DEN*/;
initPhase = 0.0;
};
class Bullet003_2_Hide
{
type="hide";
source="revolving";
selection="bullet003";
sourceAddress = mirror;
minValue = -1.0;//rad -57.29578
maxValue = 0.0;//rad 0.0
hideValue = 0.985;
// unHideValue = -1.0;//(default)
animPeriod = 2.8026e-045/*#DEN*/;
initPhase = 0.0;
};
class Bullet004_2_Hide
{
type="hide";
source="revolving";
selection="bullet004";
sourceAddress = mirror;
minValue = -1.0;//rad -57.29578
maxValue = 0.0;//rad 0.0
hideValue = 0.99;
// unHideValue = -1.0;//(default)
animPeriod = 2.8026e-045/*#DEN*/;
initPhase = 0.0;
};
class Bullet005_2_Hide
{
type="hide";
source="revolving";
selection="bullet005";
sourceAddress = mirror;
minValue = -1.0;//rad -57.29578
maxValue = 0.0;//rad 0.0
hideValue = 0.995;
// unHideValue = -1.0;//(default)
animPeriod = 2.8026e-045/*#DEN*/;
initPhase = 0.0;
};
class Bullet006_2_Hide
{
type="hide";
source="revolving";
selection="bullet006";
sourceAddress = mirror;
minValue = -1.0;//rad -57.29578
maxValue = 0.0;//rad 0.0
hideValue = 1.0;
// unHideValue = -1.0;//(default)
animPeriod = 2.8026e-045/*#DEN*/;
initPhase = 0.0;
};
class Muzzle1_shake
{
type="translation";
source="ReloadAnim";
selection="recoil";
axis="recoil_axis";//*probably*
// sourceAddress = clamp;// (default)
minValue = 0.85;//rad 48.701412
maxValue = 1.0;//rad 57.29578
offset0 = -1.0;
offset1 = 0.0;
animPeriod = 0.0;
initPhase = 0.0;
// memory = true;//(default assumed)
};
class Muzzle1_shake_back
{
type="translation";
source="ReloadAnim";
selection="recoil";
axis="recoil_axis";//*probably*
// sourceAddress = clamp;// (default)
minValue = 0.0;//rad 0.0
maxValue = 0.85;//rad 48.701412
offset0 = 0.0;
offset1 = -1.0;
animPeriod = 0.0;
initPhase = 0.0;
// memory = true;//(default assumed)
};
class Bolt_move_2
{
type="translation";
source="ReloadAnim";
selection="bolt";
axis="bolt_axis";//*probably*
sourceAddress = mirror;
minValue = 0.0;//rad 0.0
maxValue = 1.0;//rad 57.29578
offset0 = 0.0;
offset1 = 0.5;
animPeriod = 2.8026e-045/*#DEN*/;
initPhase = 0.0;
// memory = true;//(default assumed)
};
class PositionLights
{
type="hide";
source="collisionLights";
selection="positionlights";
// sourceAddress = clamp;// (default)
minValue = 0.0;//rad 0.0
maxValue = 1.0;//rad 57.29578
hideValue = 0.0;
unHideValue = 1.0;
animPeriod = 0.0;
initPhase = 0.0;
};
};//Animations
};//modelclass
};//CfgModels


== New config parameters {config.cpp} ==
== New config parameters {config.cpp} ==
Base class is Ship. There are 2 child classes SmallShip and BigShip.


===Basic parameters===
===Basic parameters===

Revision as of 22:16, 9 November 2014

Intro

101 - How to set up a ship for Arma 3

What's the difference between a boat and a ship? Well, a ship is usually large enough to carry a boat. Subs are also called boats, regardless of size.

For Arma purposes, lets call boats anything shorter than 60m (the geo lod limit of Arma) and ships over 60m. Subs are subs!

There are 2 approaches to ships and boats in Arma 3. Typically boats are modelled and implemented as "vehicles" where as ships historically have been implemented as "static" objects.

Please be aware of our Arma 3 modding license: http://community.bistudio.com/wiki/Arma_3_Modding_License

Comparison to A2/OA ships

  • PhysX support
  • Improved penetration materials
  • More detailed Fire Geometry LODs
  • Improved tweakability of HitPoints LODs

About Shipx and Submarinex

Model requirements {p3d}

  • LODs
    • Fire Geo
    • View Geo
    • HitPoints
    • Land Contact
    • Memory
    • Physx
    • Bouyancy
    • Geo
    • View Cargo
    • View Pilot
    • View Gunner
    • Resolution LODs 1-8
    • ShadowVolume 0, 10, 1000, 1010
  • A new PhysX LOD
    • There needs to be a lod (4e13) consisting of convex components as simple as possible.
      • Current public Oxygen version doesn't support showing correct name of this lod and displays only Geometry instead. Don't be afraid of having two geometries, it's going to be fixed with new tools.
    • This lod should contain ship’s hull, and ...
  • Memory LOD (from Arma 2 example)
    • drivingWheel_axis
    • engine1_axis
    • engine2_axis
    • EngineEffectL
    • EngineEffectR
    • eye
    • fuel_axis


Model config changes {model.cfg}

  • Similarly to PhysX related changes, you will mostly need to change:
    • Example:

class cfgSkeletons { class Default { isDiscrete = 1; skeletonInherit = ""; skeletonBones[] = {}; }; class Boat_Armed_01_hmg_F : default { SkeletonBones[]= { "damagehide", "", "rearturret", "damagehide", "reargun", "damagehide", "drivewheel", "damagehide", "otocvez", "", "otochlaven", "otocvez", "commanderview", "otochlaven", "zasleh_gmg", "otochlaven", "volant", "", "radar", "", "kompas", "", "fuel", "", "mph", "", "rpm", "", "amps", "", "oil", "", "trim", "", "tmp", "", "volt", "", "otocvez2", "", "otochlaven2", "otocvez2", "otochlaven2_shake", "otochlaven2", "z_gatlingr", "otochlaven2_shake", "recoil", "otochlaven2", "bolt", "recoil", "gunnerview2", "otochlaven2", "magazine", "otochlaven2", "ammo_belt2", "magazine", "bullet006", "ammo_belt2", "bullet005", "bullet006", "bullet004", "bullet005", "bullet003", "bullet004", "bullet002", "bullet003", "bullet001", "bullet002", "zasleh2", "otochlaven2", "otochlaven2_static", "otocvez2", "positionlights", "" }; }; };

class CfgModels { class Default { sections[] = {}; sectionsInherit=""; skeletonName = ""; }; class Boat_Armed_01_hmg_F:Default { skeletonName="Boat_Armed_01_hmg_F"; sections[]= { "otochlaven", "otochlaven2", "engine", "p svetlo", "camo", "camo2", "camo3", "zbytek" }; /*potential axis= otochlaven otocvez2 otochlaven2 magazine recoil2 damagehide otochlaven2_shake engine karoserie p svetlo konec hlavne usti hlavne recoilhlaven_axis osahlavne osaveze2 konec hlavne2 usti hlavne2 eye2 osahlavne2 bolt_axis2 marker_light1 magazine2 gunnerview2 pilot2 ammo_belt_axis2 drivewheel_axis watereffectl watereffectr engineeffectl engineeffectr pos driver pos driver dir pos cargo pos cargo dir pos gunner pos gunner dir commanderview mph_axis rpm_axis tmp_axis amps_axis volt_axis oil_axis fuel_axis trim_axis marker_light2 pip0_pos pip0_dir pip3_pos pip3_dir pip2_pos pip2_dir konec p svetla machinegun_eject_pos machinegun_eject_dir positionlight_red_1_pos positionlight_green_1_pos slingloadcargox slingloadcargo1 slingloadcargo2 slingloadcargo3 slingloadcargo4 slingloadcargo5 slingloadcargo6 otocvez drivewheel mph rpm tmp amps volt oil fuel trim recoil camo camo2 camo3 zbytek zasleh2 zasleh_gmg positionlights bolt bullet001 bullet002 bullet003 bullet004 bullet005 bullet006 ammo_belt2

  • /

class Animations { class Damagehide { type="hide"; source="damage"; selection="damagehide"; // sourceAddress = clamp;// (default) minValue = 0.0;//rad 0.0 maxValue = 1.0;//rad 57.29578 hideValue = 1.0; // unHideValue = -1.0;//(default) animPeriod = 0.0; initPhase = 0.0; }; class Barrel_recoil { type="translation"; source="ReloadAnim"; selection="recoil"; axis="recoil_axis";//*probably* sourceAddress = mirror; minValue = 0.0;//rad 0.0 maxValue = 0.5;//rad 28.64789 offset0 = 0.0; offset1 = -0.05; animPeriod = 2.8026e-045/*#DEN*/; initPhase = 0.0; // memory = true;//(default assumed) }; class Bolt_recoil { type="translation"; source="ReloadAnim"; selection="bolt"; axis="bolt_axis";//*probably* sourceAddress = mirror; minValue = 0.0;//rad 0.0 maxValue = 0.5;//rad 28.64789 offset0 = 0.0; offset1 = -0.25; animPeriod = 2.8026e-045/*#DEN*/; initPhase = 0.0; // memory = true;//(default assumed) }; class Turret_shake { type="translation"; source="ReloadAnim"; selection="otochlaven2_shake"; axis="otochlaven2_shake_axis";//*probably* sourceAddress = mirror; minValue = 0.0;//rad 0.0 maxValue = -0.2;//rad -11.459156 offset0 = 0.0; offset1 = 0.2; animPeriod = 2.8026e-045/*#DEN*/; initPhase = 0.0; // memory = true;//(default assumed) }; class Turret_shake_aside { type="translation"; source="ReloadAnim"; selection="otochlaven2_shake"; axis="otochlaven2_shake_axis";//*probably* sourceAddress = mirror; minValue = 0.0;//rad 0.0 maxValue = 0.65;//rad 37.242256 offset0 = 0.0; offset1 = 0.2; animPeriod = 2.8026e-045/*#DEN*/; initPhase = 0.0; // memory = true;//(default assumed) }; class Magazine_hide { type="hide"; source="reloadMagazine"; selection="magazine"; // sourceAddress = clamp;// (default) minValue = 0.0;//rad 0.0 maxValue = 1.0;//rad 57.29578 hideValue = 0.28; unHideValue = 0.72; animPeriod = 0.0; initPhase = 0.0; }; class MainTurret { type="rotationY"; source="mainTurret"; selection="otocvez"; axis="otocvez_axis";//*probably* // sourceAddress = clamp;// (default) minValue = -6.2831855;//rad -360.0 maxValue = 6.2831855;//rad 360.0 angle0 = -6.2831855;//rad -360.0; angle1 = 6.2831855;//rad 360.0; animPeriod = 0.0; initPhase = 0.0; // memory = true;//(default assumed) }; class DamageHideOtocVez { type="hide"; source="damage"; selection="otocvez"; // sourceAddress = clamp;// (default) minValue = 0.0;//rad 0.0 maxValue = 1.0;//rad 57.29578 hideValue = 1.0; // unHideValue = -1.0;//(default) animPeriod = 0.0; initPhase = 0.0; }; class MainGun { type="rotationX"; source="mainGun"; selection="otochlaven"; axis="otochlaven_axis";//*probably* // sourceAddress = clamp;// (default) minValue = -6.2831855;//rad -360.0 maxValue = 6.2831855;//rad 360.0 angle0 = -6.2831855;//rad -360.0; angle1 = 6.2831855;//rad 360.0; animPeriod = 0.0; initPhase = 0.0; // memory = true;//(default assumed) }; class DamageHideOtocHlaven { type="hide"; source="damage"; selection="otochlaven"; // sourceAddress = clamp;// (default) minValue = 0.0;//rad 0.0 maxValue = 1.0;//rad 57.29578 hideValue = 1.0; // unHideValue = -1.0;//(default) animPeriod = 0.0; initPhase = 0.0; }; class RearTurret { type="rotationY"; source="rearTurret"; selection="otocvez2"; axis="otocvez2_axis";//*probably* // sourceAddress = clamp;// (default) minValue = -6.2831855;//rad -360.0 maxValue = 6.2831855;//rad 360.0 angle0 = -6.2831855;//rad -360.0; angle1 = 6.2831855;//rad 360.0; animPeriod = 0.0; initPhase = 0.0; // memory = true;//(default assumed) }; class RearGun { type="rotationX"; source="RearGun"; selection="otochlaven2"; axis="otochlaven2_axis";//*probably* // sourceAddress = clamp;// (default) minValue = -6.2831855;//rad -360.0 maxValue = 6.2831855;//rad 360.0 angle0 = -6.2831855;//rad -360.0; angle1 = 6.2831855;//rad 360.0; animPeriod = 0.0; initPhase = 0.0; // memory = true;//(default assumed) }; class muzzleFlash { type="hide"; source="muzzle_source"; selection="zasleh_gmg"; // sourceAddress = clamp;// (default) minValue = 0.0;//rad 0.0 maxValue = 1.0;//rad 57.29578 hideValue = 0.0; unHideValue = 0.1; animPeriod = 0.0; initPhase = 0.0; }; class zaslehROT { type="rotationZ"; source="muzzle_source_rot"; selection="zasleh_gmg"; axis="zasleh_gmg_axis";//*probably* sourceAddress = loop; minValue = 0.0;//rad 0.0 maxValue = 4.0;//rad 229.18312 angle0 = 0.0;//rad 0.0; angle1 = 6.2831855;//rad 360.0; animPeriod = 1.4013e-045/*#DEN*/; initPhase = 0.0; // memory = true;//(default assumed) }; class muzzleFlash2 { type="hide"; source="muzzle2_source"; selection="zasleh2"; // sourceAddress = clamp;// (default) minValue = 0.0;//rad 0.0 maxValue = 1.0;//rad 57.29578 hideValue = 0.0; unHideValue = 0.8; animPeriod = 0.0; initPhase = 0.0; }; class zasleh2ROT { type="rotationZ"; source="muzzle2_source_rot"; selection="zasleh2"; axis="zasleh2_axis";//*probably* sourceAddress = loop; minValue = 0.0;//rad 0.0 maxValue = 4.0;//rad 229.18312 angle0 = 0.0;//rad 0.0; angle1 = 6.2831855;//rad 360.0; animPeriod = 1.4013e-045/*#DEN*/; initPhase = 0.0; // memory = true;//(default assumed) }; class fuel { type="rotation"; source="fuel"; selection="fuel"; axis="fuel_axis";//*probably* // sourceAddress = clamp;// (default) minValue = 0.0;//rad 0.0 maxValue = 1.0;//rad 57.29578 angle0 = 0.5235988;//rad 30.0; angle1 = -0.5235988;//rad -30.0; animPeriod = 0.0; initPhase = 0.0; // memory = true;//(default assumed) }; class mph { type="rotation"; source="speed"; selection="mph"; axis="mph_axis";//*probably* // sourceAddress = clamp;// (default) minValue = 2.0;//rad 114.59156 maxValue = 25.0;//rad 1432.3945 angle0 = 2.7925267;//rad 160.0; angle1 = -2.7925267;//rad -160.0; animPeriod = 0.0; initPhase = 0.0; // memory = true;//(default assumed) }; class rpm { type="rotation"; source="rpm"; selection="rpm"; axis="rpm_axis";//*probably* // sourceAddress = clamp;// (default) minValue = 0.0;//rad 0.0 maxValue = 1.0;//rad 57.29578 angle0 = 2.7925267;//rad 160.0; angle1 = -2.7925267;//rad -160.0; animPeriod = 0.0; initPhase = 0.0; // memory = true;//(default assumed) }; class amps_random { type="rotation"; source="rpm"; selection="amps"; axis="amps_axis";//*probably* // sourceAddress = clamp;// (default) minValue = 0.0;//rad 0.0 maxValue = 1.0;//rad 57.29578 angle0 = 0.17453292;//rad 10.0; angle1 = -0.17453292;//rad -10.0; animPeriod = 0.0; initPhase = 0.0; // memory = true;//(default assumed) }; class oil_random { type="rotation"; source="rpm"; selection="oil"; axis="oil_axis";//*probably* // sourceAddress = clamp;// (default) minValue = 0.0;//rad 0.0 maxValue = 1.0;//rad 57.29578 angle0 = -0.17453292;//rad -10.0; angle1 = 0.17453292;//rad 10.0; animPeriod = 0.0; initPhase = 0.0; // memory = true;//(default assumed) }; class trim_random { type="rotation"; source="speed"; selection="trim"; axis="trim_axis";//*probably* // sourceAddress = clamp;// (default) minValue = 0.0;//rad 0.0 maxValue = 1.0;//rad 57.29578 angle0 = 0.08726646;//rad 5.0; angle1 = -0.08726646;//rad -5.0; animPeriod = 0.0; initPhase = 0.0; // memory = true;//(default assumed) }; class tmp_random { type="rotation"; source="rpm"; selection="tmp"; axis="tmp_axis";//*probably* // sourceAddress = clamp;// (default) minValue = 0.0;//rad 0.0 maxValue = 1.0;//rad 57.29578 angle0 = -0.08726646;//rad -5.0; angle1 = 0.08726646;//rad 5.0; animPeriod = 0.0; initPhase = 0.0; // memory = true;//(default assumed) }; class volt_random { type="rotation"; source="speed"; selection="volt"; axis="volt_axis";//*probably* // sourceAddress = clamp;// (default) minValue = 0.0;//rad 0.0 maxValue = 1.0;//rad 57.29578 angle0 = 0.2617994;//rad 15.0; angle1 = -0.2617994;//rad -15.0; animPeriod = 0.0; initPhase = 0.0; // memory = true;//(default assumed) }; class DrivingWheel { type="rotation"; source="drivingWheel"; selection="drivewheel"; axis="drivewheel_axis";//*probably* // sourceAddress = clamp;// (default) minValue = -1.0;//rad -57.29578 maxValue = 1.0;//rad 57.29578 angle0 = 2.000147;//rad 114.59999; angle1 = -2.000147;//rad -114.59999; animPeriod = 0.0; initPhase = 0.0; // memory = true;//(default assumed) }; class Ammo_Belt_2_Rotation_prep { type="translation"; source="ReloadAnim"; selection="ammo_belt2"; axis="ammo_belt2_axis";//*probably* // sourceAddress = clamp;// (default) minValue = 0.0;//rad 0.0 maxValue = 0.0001;//rad 0.005729578 offset0 = -1.0; offset1 = 0.0; animPeriod = 0.0; initPhase = 0.0; // memory = true;//(default assumed) }; class Ammo_Belt_2_Rotation_main { type="translation"; source="ReloadAnim"; selection="ammo_belt2"; axis="ammo_belt2_axis";//*probably* // sourceAddress = clamp;// (default) minValue = 0.3;//rad 17.188734 maxValue = 0.999;//rad 57.238483 offset0 = 0.0; offset1 = -1.0; animPeriod = 0.0; initPhase = 0.0; // memory = true;//(default assumed) }; class Ammobelt_Hide { type="hide"; source="reloadMagazine"; selection="ammo_belt2"; // sourceAddress = clamp;// (default) minValue = 0.0;//rad 0.0 maxValue = 1.0;//rad 57.29578 hideValue = 0.09; unHideValue = 1.0; animPeriod = 0.0; initPhase = 0.0; }; class Bullet001_2_Hide { type="hide"; source="revolving"; selection="bullet001"; sourceAddress = mirror; minValue = -1.0;//rad -57.29578 maxValue = 0.0;//rad 0.0 hideValue = 0.975; // unHideValue = -1.0;//(default) animPeriod = 2.8026e-045/*#DEN*/; initPhase = 0.0; }; class Bullet002_2_Hide { type="hide"; source="revolving"; selection="bullet002"; sourceAddress = mirror; minValue = -1.0;//rad -57.29578 maxValue = 0.0;//rad 0.0 hideValue = 0.98; // unHideValue = -1.0;//(default) animPeriod = 2.8026e-045/*#DEN*/; initPhase = 0.0; }; class Bullet003_2_Hide { type="hide"; source="revolving"; selection="bullet003"; sourceAddress = mirror; minValue = -1.0;//rad -57.29578 maxValue = 0.0;//rad 0.0 hideValue = 0.985; // unHideValue = -1.0;//(default) animPeriod = 2.8026e-045/*#DEN*/; initPhase = 0.0; }; class Bullet004_2_Hide { type="hide"; source="revolving"; selection="bullet004"; sourceAddress = mirror; minValue = -1.0;//rad -57.29578 maxValue = 0.0;//rad 0.0 hideValue = 0.99; // unHideValue = -1.0;//(default) animPeriod = 2.8026e-045/*#DEN*/; initPhase = 0.0; }; class Bullet005_2_Hide { type="hide"; source="revolving"; selection="bullet005"; sourceAddress = mirror; minValue = -1.0;//rad -57.29578 maxValue = 0.0;//rad 0.0 hideValue = 0.995; // unHideValue = -1.0;//(default) animPeriod = 2.8026e-045/*#DEN*/; initPhase = 0.0; }; class Bullet006_2_Hide { type="hide"; source="revolving"; selection="bullet006"; sourceAddress = mirror; minValue = -1.0;//rad -57.29578 maxValue = 0.0;//rad 0.0 hideValue = 1.0; // unHideValue = -1.0;//(default) animPeriod = 2.8026e-045/*#DEN*/; initPhase = 0.0; }; class Muzzle1_shake { type="translation"; source="ReloadAnim"; selection="recoil"; axis="recoil_axis";//*probably* // sourceAddress = clamp;// (default) minValue = 0.85;//rad 48.701412 maxValue = 1.0;//rad 57.29578 offset0 = -1.0; offset1 = 0.0; animPeriod = 0.0; initPhase = 0.0; // memory = true;//(default assumed) }; class Muzzle1_shake_back { type="translation"; source="ReloadAnim"; selection="recoil"; axis="recoil_axis";//*probably* // sourceAddress = clamp;// (default) minValue = 0.0;//rad 0.0 maxValue = 0.85;//rad 48.701412 offset0 = 0.0; offset1 = -1.0; animPeriod = 0.0; initPhase = 0.0; // memory = true;//(default assumed) }; class Bolt_move_2 { type="translation"; source="ReloadAnim"; selection="bolt"; axis="bolt_axis";//*probably* sourceAddress = mirror; minValue = 0.0;//rad 0.0 maxValue = 1.0;//rad 57.29578 offset0 = 0.0; offset1 = 0.5; animPeriod = 2.8026e-045/*#DEN*/; initPhase = 0.0; // memory = true;//(default assumed) }; class PositionLights { type="hide"; source="collisionLights"; selection="positionlights"; // sourceAddress = clamp;// (default) minValue = 0.0;//rad 0.0 maxValue = 1.0;//rad 57.29578 hideValue = 0.0; unHideValue = 1.0; animPeriod = 0.0; initPhase = 0.0; }; };//Animations };//modelclass };//CfgModels

New config parameters {config.cpp}

Base class is Ship. There are 2 child classes SmallShip and BigShip.


Basic parameters

Engine parameters

Damage handling

Boats/Ships offer differing protection levels for themselves and crew inside, depending on place you hit them. Balancing damage is usually most time-consuming task for armored vehicles.

Basic config

Armour plates setup

Hitpoints

Hitpoints represent weak points in structure of ships: turret servos, ammo storages, engine. They can also improve internal penetration handling.

Hitpoint categories

There are 3 common hitpoint categories in Arma 3's vehicles:

  • HitHull, handling internal penetration - when damaged over 0.9, vehicle will explode.
  • HitEngine, handling damage of engine

Turrets have their own class HitPoints, coontaining info about how easy it is to damage given turret:

  • HitTurret, horizontal rotation
  • HitGun, vertical rotation - this should handle any event that renders tank guns inoperable, f.e. hit to servos

New attributes

Hitpoints gained two important config attributes in Arma 3:

  • radius, defining size of “hitpoint sphere” around each vertice in Hit Points LOD assigned to given hitpoint’s selection
  • explosionShielding, multiplying damage inflicted by indirect damage. The smaller it is, the less damage hitpoint will receive.

Internal damage

Internal damage is handled by HitHull class. When KE round penetrates the armor plates, it passes the damage to HitHull hitpoints array as seen in example model. The hitpoint vertices are set up in such way that the nearest distance between them equals RADIUS attribute in HitHull class, and they cannot be activated by rounds that fail to penetrate armor.

During implementation of internal damage handling it is important to tweak following attributes:

  • armor
  • explosionShielding
  • radius

If the results of config tweaking are not satisfying, consider adding greater detail to Hit Points and Fire Geometry LODs.