Merge branch 'abIntegration' into AdvancedBallistics

Conflicts:
	addons/advanced_ballistics/functions/fnc_displayProtractor.sqf
	addons/advanced_ballistics/functions/fnc_displayWindInfo.sqf
This commit is contained in:
ulteq 2015-04-07 21:59:28 +02:00
commit 2a619b5aeb
53 changed files with 1647 additions and 1616 deletions

View File

@ -1,441 +0,0 @@
class CfgAmmo
{
class BulletBase;
class B_556x45_Ball_Tracer_Red;
class B_762x51_Tracer_Red;
class B_556x45_Ball : BulletBase
{
airFriction=-0.001265;
hit=8;
typicalSpeed=750;
ACE_caliber=0.224;
ACE_bulletLength=0.906;
ACE_bulletMass=62;
ACE_ammoTempMuzzleVelocityShifts[]={-27.20, -26.44, -23.76, -21.00, -17.54, -13.10, -7.95, -1.62, 6.24, 15.48, 27.75};
ACE_ballisticCoefficients[]={0.151};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=7;
ACE_muzzleVelocities[]={723, 764, 796, 825, 843, 866, 878, 892, 906, 915, 922, 900};
ACE_barrelLengths[]={8.3, 9.4, 10.6, 11.8, 13.0, 14.2, 15.4, 16.5, 17.7, 18.9, 20.0, 24.0};
};
class ACE_556x45_Ball_Mk262 : B_556x45_Ball
{
airFriction=-0.001125;
caliber=0.6;
deflecting=18;
hit=11;
typicalSpeed=836;
ACE_caliber=0.224;
ACE_bulletLength=0.906;
ACE_bulletMass=77;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.361};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={624, 816, 832, 838};
ACE_barrelLengths[]={7.5, 14.5, 18, 20};
};
class ACE_556x45_Ball_Mk318 : B_556x45_Ball
{
airFriction=-0.001120;
caliber=0.6;
deflecting=18;
hit=9;
typicalSpeed=886;
ACE_caliber=0.224;
ACE_bulletLength=0.906;
ACE_bulletMass=62;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.307};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={780, 886, 950};
ACE_barrelLengths[]={10, 15.5, 20};
};
class ACE_545x39_Ball_7N6M : B_556x45_Ball
{
airFriction=-0.001162;
caliber=0.5;
deflecting=18;
hit=7;
typicalSpeed=880;
ACE_caliber=0.220;
ACE_bulletLength=0.85;
ACE_bulletMass=52.9;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.168};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=7;
ACE_muzzleVelocities[]={780, 880, 920};
ACE_barrelLengths[]={10, 16.3, 20};
};
class ACE_545x39_Ball_7T3M : B_556x45_Ball_Tracer_Red
{
airFriction=-0.001162;
caliber=0.5;
deflecting=18;
hit=7;
typicalSpeed=883;
ACE_caliber=0.220;
ACE_bulletLength=0.85;
ACE_bulletMass=49.8;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.168};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=7;
ACE_muzzleVelocities[]={785, 883, 925};
ACE_barrelLengths[]={10, 16.3, 20};
};
class B_65x39_Caseless : BulletBase
{
airFriction=-0.000772;
typicalSpeed=800;
ACE_caliber=0.264;
ACE_bulletLength=1.295;
ACE_bulletMass=123;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.263};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ICAO";
ACE_dragModel=7;
ACE_muzzleVelocities[]={760, 788, 800, 805};
ACE_barrelLengths[]={16, 20, 24, 26};
};
class B_762x51_Ball : BulletBase
{
airFriction=-0.001035;
typicalSpeed=833;
hit=14;
ACE_caliber=0.308;
ACE_bulletLength=1.14;
ACE_bulletMass=146;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.2};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ICAO";
ACE_dragModel=7;
ACE_muzzleVelocities[]={700, 800, 820, 833, 845};
ACE_barrelLengths[]={10, 16, 20, 24, 26};
};
class ACE_762x51_Ball_M118LR : B_762x51_Ball
{
airFriction=-0.0008525;
caliber=1.05;
hit=16;
typicalSpeed=790;
ACE_caliber=0.308;
ACE_bulletLength=1.24;
ACE_bulletMass=175;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.505, 0.496, 0.485, 0.485, 0.485};
ACE_velocityBoundaries[]={853, 549, 549, 549};
ACE_standardAtmosphere="ICAO";
ACE_dragModel=1;
ACE_muzzleVelocities[]={750, 780, 790, 794};
ACE_barrelLengths[]={16, 20, 24, 26};
};
class ACE_762x51_Ball_Subsonic : B_762x51_Ball
{
airFriction=-0.000535;
caliber=0.5;
hit=16;
typicalSpeed=790;
ACE_caliber=0.308;
ACE_bulletLength=1.340;
ACE_bulletMass=200;
ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619};
ACE_ballisticCoefficients[]={0.235};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ICAO";
ACE_dragModel=7;
ACE_muzzleVelocities[]={305, 325, 335, 340};
ACE_barrelLengths[]={16, 20, 24, 26};
};
class ACE_762x54_Ball_7N14 : B_762x51_Ball
{
airFriction=-0.001023;
caliber=0.95;
hit=15;
typicalSpeed=820;
ACE_caliber=0.312;
ACE_bulletLength=1.14;
ACE_bulletMass=152;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.4};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ICAO";
ACE_dragModel=1;
ACE_muzzleVelocities[]={700, 800, 820, 833};
ACE_barrelLengths[]={16, 20, 24, 26};
};
class ACE_762x54_Ball_7T2 : B_762x51_Tracer_Red
{
airFriction=-0.001023;
caliber=0.9;
hit=15;
typicalSpeed=800;
ACE_caliber=0.312;
ACE_bulletLength=1.14;
ACE_bulletMass=149;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.395};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ICAO";
ACE_dragModel=1;
ACE_muzzleVelocities[]={680, 750, 798, 800};
ACE_barrelLengths[]={16, 20, 24, 26};
};
class ACE_762x35_Ball : B_762x51_Ball
{
airFriction=-0.000821;
caliber=0.9;
hit=11;
typicalSpeed=790;
ACE_caliber=0.308;
ACE_bulletLength=1.153;
ACE_bulletMass=125;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.349, 0.338, 0.330, 0.310};
ACE_velocityBoundaries[]={792, 610, 488};
ACE_standardAtmosphere="ICAO";
ACE_dragModel=1;
ACE_muzzleVelocities[]={620, 655, 675};
ACE_barrelLengths[]={9, 16, 20};
};
class ACE_762x39_Ball : B_762x51_Ball
{
airFriction=-0.0015168;
hit=12;
typicalSpeed=716;
ACE_caliber=0.308;
ACE_bulletLength=1.14;
ACE_bulletMass=123;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.275};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ICAO";
ACE_dragModel=1;
ACE_muzzleVelocities[]={650, 716, 750};
ACE_barrelLengths[]={10, 16.3, 20};
};
class ACE_762x39_Ball_57N231P : B_762x51_Tracer_Red
{
airFriction=-0.0015168;
hit=12;
typicalSpeed=716;
ACE_caliber=0.308;
ACE_bulletLength=1.14;
ACE_bulletMass=117;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.275};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ICAO";
ACE_dragModel=1;
ACE_muzzleVelocities[]={650, 716, 750};
ACE_barrelLengths[]={10, 16.3, 20};
};
class B_9x21_Ball : BulletBase
{
airFriction=-0.00125;
typicalSpeed=390;
hit=6;
ACE_caliber=0.356;
ACE_bulletLength=0.610;
ACE_bulletMass=115;
ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619};
ACE_ballisticCoefficients[]={0.17};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={350, 390, 420};
ACE_barrelLengths[]={4, 5, 9};
};
class ACE_9x18_Ball_57N181S : B_9x21_Ball
{
hit=5;
airFriction=-0.001234;
typicalSpeed=298;
ACE_caliber=0.365;
ACE_bulletLength=0.610;
ACE_bulletMass=92.6;
ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619};
ACE_ballisticCoefficients[]={0.125};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={298, 330, 350};
ACE_barrelLengths[]={3.8, 5, 9};
};
class ACE_9x19_Ball : B_9x21_Ball
{
airFriction=-0.001234;
typicalSpeed=370;
hit=6;
ACE_caliber=0.355;
ACE_bulletLength=0.610;
ACE_bulletMass=124;
ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619};
ACE_ballisticCoefficients[]={0.165};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={340, 370, 400};
ACE_barrelLengths[]={4, 5, 9};
};
class ACE_10x25_Ball : B_9x21_Ball
{
airFriction=-0.00168;
typicalSpeed=425;
hit=7;
ACE_caliber=0.5;
ACE_bulletLength=0.764;
ACE_bulletMass=165;
ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619};
ACE_ballisticCoefficients[]={0.189};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={360, 400, 430};
ACE_barrelLengths[]={4, 4.61, 9};
};
class ACE_765x17_Ball: B_9x21_Ball
{
airFriction=-0.001213;
typicalSpeed=282;
hit=7;
ACE_caliber=0.3125;
ACE_bulletLength=0.610;
ACE_bulletMass=65;
ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619};
ACE_ballisticCoefficients[]={0.118};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={282, 300, 320};
ACE_barrelLengths[]={4, 5, 9};
};
class ACE_303_Ball : ACE_762x51_Ball_M118LR
{
airFriction=-0.00083;
typicalSpeed=761;
ACE_caliber=0.311;
ACE_bulletLength=1.227;
ACE_bulletMass=174;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.499, 0.493, 0.48};
ACE_velocityBoundaries[]={671, 549};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={748, 761, 765};
ACE_barrelLengths[]={20, 24, 26};
};
class B_408_Ball : BulletBase
{
airFriction=-0.000395;
typicalSpeed=910;
ACE_caliber=0.408;
ACE_bulletLength=2.126;
ACE_bulletMass=410;
ACE_transonicStabilityCoef=1;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.97};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={910};
ACE_barrelLengths[]={29};
};
class ACE_106x83mm_Ball : B_408_Ball
{
ACE_caliber=0.416;
ACE_bulletLength=2.089;
ACE_bulletMass=398;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.72};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={960};
ACE_barrelLengths[]={29};
};
class ACE_338_Ball : B_408_Ball
{
airFriction=-0.000526;
caliber=1.55;
deflecting=12;
hit=20;
typicalSpeed=826;
ACE_caliber=0.338;
ACE_bulletLength=1.70;
ACE_bulletMass=300;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.381};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ICAO";
ACE_dragModel=7;
ACE_muzzleVelocities[]={820, 826, 830};
ACE_barrelLengths[]={24, 26.5, 28};
};
class B_127x99_Ball : BulletBase
{
airFriction=-0.0006;
typicalSpeed=853;
ACE_caliber=0.510;
ACE_bulletLength=2.310;
ACE_bulletMass=647;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.670};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={853};
ACE_barrelLengths[]={29};
};
class ACE_127x99_Ball_AMAX : B_127x99_Ball
{
ACE_caliber=0.510;
ACE_bulletLength=2.540;
ACE_bulletMass=750;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={1.050};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={860};
ACE_barrelLengths[]={29};
};
class B_127x108_Ball : BulletBase
{
typicalSpeed=820;
ACE_caliber=0.511;
ACE_bulletLength=2.520;
ACE_bulletMass=745;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.63};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={820};
ACE_barrelLengths[]={28.7};
};
class B_45ACP_Ball : BulletBase
{
airFriction=-0.0007182;
typicalSpeed=250;
ACE_caliber=0.452;
ACE_bulletLength=0.68;
ACE_bulletMass=230;
ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619};
ACE_ballisticCoefficients[]={0.195};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={230, 250, 285};
ACE_barrelLengths[]={4, 5, 9};
};
};

View File

@ -1,11 +1,10 @@
ace_winddeflection
ace_advanced_ballistics
===============
Wind deflection for projectiles/bullets.
The Advanced Ballistics module introduces advanced external- and internal ballistics to the game.
## Maintainers
The people responsible for merging changes to this component or answering potential questions.
- [Glowbal](https://github.com/Glowbal)
- [Ruthberg] (http://github.com/Ulteq)

View File

@ -1,34 +1,5 @@
class RscTitles
{
class RscWindIntuitive
{
idd=-1;
onLoad="with uiNameSpace do { RscWindIntuitive = _this select 0 };";
movingEnable=0;
duration=60;
fadeIn="false";
fadeOut="false";
class controls
{
class RscWindIntuitive
{
idc=132948;
type=0;
style=48;
font="TahomaB";
colorBackground[]={0,0,0,0};
colorText[]={0,0,0,0};
x="SafeZoneX + 0.001";
y="SafeZoneY + 0.001";
w=0.2;
h=0.2*4/3;
size=0.034;
sizeEx=0.027;
text="";
};
};
};
class RscTurretDial
{
idd=-1;

View File

@ -18,38 +18,8 @@ GVAR(WindInfoStart) = time;
GVAR(Protractor) = false;
GVAR(ProtractorStart) = time;
GVAR(Altitude) = 0;
GVAR(Latitude) = 50;
if (worldName in ["Chernarus", "Bootcamp_ACR", "Woodland_ACR", "utes"]) then { GVAR(Latitude) = 50; GVAR(Altitude) = 0; };
if (worldName in ["Altis", "Stratis"]) then { GVAR(Latitude) = 40; GVAR(Altitude) = 0; };
if (worldName in ["Takistan", "Zargabad", "Mountains_ACR"]) then { GVAR(Latitude) = 35; GVAR(Altitude) = 2000; };
if (worldName in ["Shapur_BAF", "ProvingGrounds_PMC"]) then { GVAR(Latitude) = 35; GVAR(Altitude) = 100; };
if (worldName in ["fallujah"]) then { GVAR(Latitude) = 33; GVAR(Altitude) = 0; };
if (worldName in ["fata", "Abbottabad"]) then { GVAR(Latitude) = 30; GVAR(Altitude) = 1000; };
if (worldName in ["sfp_wamako"]) then { GVAR(Latitude) = 14; GVAR(Altitude) = 0; };
if (worldName in ["sfp_sturko"]) then { GVAR(Latitude) = 56; GVAR(Altitude) = 0; };
if (worldName in ["Bornholm"]) then { GVAR(Latitude) = 55; GVAR(Altitude) = 0; };
if (worldName in ["Imrali"]) then { GVAR(Latitude) = 40; GVAR(Altitude) = 0; };
if (worldName in ["Caribou"]) then { GVAR(Latitude) = 68; GVAR(Altitude) = 0; };
if (worldName in ["Namalsk"]) then { GVAR(Latitude) = 65; GVAR(Altitude) = 0; };
if (worldName in ["MCN_Aliabad"]) then { GVAR(Latitude) = 36; GVAR(Altitude) = 0; };
if (worldName in ["Clafghan"]) then { GVAR(Latitude) = 34; GVAR(Altitude) = 640; };
if (worldName in ["Sangin", "hellskitchen"]) then { GVAR(Latitude) = 32; GVAR(Altitude) = 0; };
if (worldName in ["Sara"]) then { GVAR(Latitude) = 40; GVAR(Altitude) = 0; };
if (worldName in ["reshmaan"]) then { GVAR(Latitude) = 35; GVAR(Altitude) = 2000; };
if (worldName in ["Thirsk"]) then { GVAR(Latitude) = 65; GVAR(Altitude) = 0; };
if (worldName in ["lingor"]) then { GVAR(Latitude) = -4; GVAR(Altitude) = 0; };
if (worldName in ["Panthera3"]) then { GVAR(Latitude) = 46; GVAR(Altitude) = 0; };
// TODO: Remove this hack once the weather engine is up and running
if (isNil QUOTE(EGVAR(weather,currentTemperature))) then { EGVAR(weather,currentTemperature) = 24; };
if (isNil QUOTE(EGVAR(weather,currentHumidity))) then { EGVAR(weather,currentHumidity) = 50; };
GVAR(SimulationPrecision) = 1;
GVAR(INIT_MESSAGE_ENABLED) = true;
GVAR(WindEnabled) = true;
GVAR(SpinDriftEnabled) = true;
GVAR(CoriolisEnabled) = true;
@ -61,6 +31,7 @@ GVAR(BulletTraceEnabled) = true;
GVAR(AtmosphericDensitySimulationEnabled) = true;
GVAR(BarrelLengthInfluenceEnabled) = true;
GVAR(VehicleGunnerEnabled) = true;
GVAR(ExtensionsEnabled) = false;
GVAR(INIT_MESSAGE_ENABLED) = false;
[] call FUNC(initializeTerrainExtension);

View File

@ -11,9 +11,7 @@ PREP(calculateRoughnessLength);
PREP(calculateStabilityFactor);
PREP(calculateWindSpeed);
PREP(displayProtractor);
PREP(displayWindInfo);
PREP(handleFired);
PREP(handleFiredExtension);
PREP(initializeTerrainExtension);
ADDON = true;

View File

@ -5,23 +5,14 @@ class CfgPatches {
units[] = {};
weapons[] = {};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"ACE_common", "ACE_weather"};
versionDesc = "ACE Advanced Ballistics";
version = VERSION;
author[] = {$STR_ACE_Common_ACETeam, "Glowbal", "Ruthberg"};
};
};
class CfgAddons {
class PreloadAddons {
class ADDON {
list[] = {QUOTE(ADDON)};
};
requiredAddons[] = {"ACE_ballistics", "ACE_weather"};
author[] = {"Ruthberg"};
authorUrl = "https://github.com/ulteq";
VERSION_CONFIG;
};
};
#include "CfgEventHandlers.hpp"
#include "CfgAmmo.hpp"
#include "CfgWeapons.hpp"
#include "CfgVehicles.hpp"
#include "RscTitles.hpp"

View File

@ -1,3 +1,19 @@
/*
* Author: Ruthberg
*
* Displays a wind info (colored arrow) in the top left corner of the screen
*
* Arguments:
* 0: temperature - degrees celcius <NUMBER>
* 1: pressure - hPa <NUMBER>
* 2: relativeHumidity - value between 0.0 and 1.0 <NUMBER>
*
* Return Value:
* 0: density of air - kg * m^(-3) <NUMBER>
*
* Return value:
* None
*/
#include "script_component.hpp"
#include "defines.h"

View File

@ -1,3 +1,18 @@
/*
* Author: Ruthberg
*
* Calculates the ammo temperature induced muzzle velocity shift
*
* Arguments:
* 0: ammo - classname <string>
* 1: temperature - degrees celcius <NUMBER>
*
* Return Value:
* 0: muzzle velocity shift - m/s <NUMBER>
*
* Return value:
* None
*/
#include "script_component.hpp"
private ["_ammo", "_temperature", "_muzzleVelocityTable", "_muzzleVelocityShift", "_temperatureIndexA", "_temperatureIndexB", "_temperatureRatio"];

View File

@ -1,3 +1,20 @@
/*
* Author: Ruthberg
*
* Calculates the atmospherically corrected ballistic coefficient
*
* Arguments:
* 0: ballistic coefficient - G1-G7 <NUMBER>
* 1: temperature - degrees celcius <NUMBER>
* 2: pressure - hPa <NUMBER>
* 3: relativeHumidity - value between 0.0 and 1.0 <NUMBER>
* 4: atmosphereModel - ICAO or ASM <STRING>
*
* Return Value:
* corrected ballistic coefficient <NUMBER>
*
* Public: No
*/
#include "script_component.hpp"
#include "defines.h"

View File

@ -1,3 +1,19 @@
/*
* Author: Ruthberg
*
* Calculates the muzzle velocity shift caused by different barrel lengths
*
* Arguments:
* 0: ammo - classname <string>
* 0: weapon - classname <string>
* 1: muzzle velocity - m/s <NUMBER>
*
* Return Value:
* 0: muzzle velocity shift - m/s <NUMBER>
*
* Return value:
* None
*/
#include "script_component.hpp"
private ["_ammo", "_weapon", "_barrelLength", "_muzzleVelocityTable", "_barrelLengthTable", "_muzzleVelocity", "_lowerIndex", "_upperIndex", "_barrelLengthRatio", "_muzzleVelocityNew"];

View File

@ -1,3 +1,16 @@
/*
* Author: Ruthberg
*
* Calculates the terrain hellmann exponent at a given world position
*
* Arguments:
* 0: _this - world position <posASL>
*
* Return Value:
* 0: hellmann exponent <NUMBER>
*
* Public: No
*/
#include "script_component.hpp"
private ["_hellmann_exponents", "_hellmann_index", "_windSource", "_nearObjects", "_isWater"];

View File

@ -1,3 +1,19 @@
/*
* Author: Ruthberg
*
* Calculates the retardation of the bullet
*
* Arguments:
* 0: drag model - 1-7 <integer>
* 1: drag coefficient - bc <NUMBER>
* 2: velocity - m/s <NUMBER>
*
* Return Value:
* 0: retardation - m/(s^2) <NUMBER>
*
* Return value:
* None
*/
#include "script_component.hpp"
// Source: GNU Exterior Ballistics

View File

@ -1,3 +1,16 @@
/*
* Author: Ruthberg
*
* Calculates the terrain roughness length at a given world position
*
* Arguments:
* 0: _this - world position <posASL>
*
* Return Value:
* 0: roughness length <NUMBER>
*
* Public: No
*/
#include "script_component.hpp"
private ["_roughness_lengths", "_windSource", "_nearBuildings", "_isWater"];

View File

@ -1,3 +1,23 @@
/*
* Author: Ruthberg
*
* Calculates the stability factor of a bullet
*
* Arguments:
* 0: caliber - inches <NUMBER>
* 1: bullet length - inches <NUMBER>
* 2: bullet mass - grains <NUMBER>
* 3: barrel twist - inches <NUMBER>
* 4: muzzle velocity shift - m/s <NUMBER>
* 5: temperature - degrees celcius <NUMBER>
* 6: barometric Pressure - hPA <NUMBER>
*
* Return Value:
* 0: stability factor <NUMBER>
*
* Public: No
*/
private ["_caliber", "_bulletLength", "_bulletMass", "_barrelTwist", "_muzzleVelocity", "_temperature", "_barometricPressure", "_l", "_t", "_stabilityFactor"];
_caliber = _this select 0;
_bulletLength = _this select 1;

View File

@ -1,3 +1,16 @@
/*
* Author: Ruthberg
*
* Calculates the true wind speed at a given world position
*
* Arguments:
* 0: _this - world position <posASL>
*
* Return Value:
* 0: wind speed - m/s <NUMBER>
*
* Public: No
*/
#include "script_component.hpp"
private ["_windSpeed", "_windDir", "_height", "_newWindSpeed", "_windSource", "_roughnessLength"];

View File

@ -1,3 +1,14 @@
/*
* Author: Ruthberg
*
* Displays a protractor in the top left corner of the screen
*
* Argument:
* None
*
* Return value:
* None
*/
#include "script_component.hpp"
#define __dsp (uiNamespace getVariable "RscProtractor")
@ -15,19 +26,13 @@ if (weaponLowered ACE_player) exitWith { true };
if (vehicle ACE_player != ACE_player) exitWith { true };
if (currentWeapon ACE_player != primaryWeapon ACE_player) exitWith { true };
[] spawn {
2 cutText ["", "PLAIN"];
GVAR(WindInfo) = false;
0 cutText ["", "PLAIN"];
GVAR(Protractor) = true;
[{
// abort condition
if (!(GVAR(Protractor) && !(weaponLowered ACE_player) && currentWeapon ACE_player == primaryWeapon ACE_player)) exitWith {
GVAR(Protractor) = false;
1 cutText ["", "PLAIN"];
[_this select 1] call CBA_fnc_removePerFrameHandler;
};
while {GVAR(Protractor) && !(weaponLowered ACE_player) && currentWeapon ACE_player == primaryWeapon ACE_player} do {
_refPosition = [SafeZoneX + 0.001, SafeZoneY + 0.001, 0.2, 0.2 * 4/3];
_inclinationAngle = asin((ACE_player weaponDirection currentWeapon ACE_player) select 2);
@ -46,6 +51,11 @@ GVAR(Protractor) = true;
__ctrl2 ctrlSetText QUOTE(PATHTOF(UI\protractor_marker.paa));
__ctrl2 ctrlSetTextColor [1, 1, 1, 1];
}, 0.1, _this select 0] call CBA_fnc_addPerFrameHandler;
sleep 0.1;
};
GVAR(Protractor) = false;
1 cutText ["", "PLAIN"];
};
true

View File

@ -1,65 +0,0 @@
#include "script_component.hpp"
#define __dsp (uiNamespace getVariable "RscWindIntuitive")
#define __ctrl (__dsp displayCtrl 132948)
private ["_windSpeed", "_windDir", "_playerDir", "_windIndex", "_windColor", "_newWindSpeed", "_windSource", "_height"];
if (GVAR(WindInfo)) exitWith {
GVAR(WindInfo) = false;
0 cutText ["", "PLAIN"];
true
};
if (underwater ACE_player) exitWith { true };
if (vehicle ACE_player != ACE_player) exitWith { true };
2 cutText ["", "PLAIN"];
GVAR(Protractor) = false;
1 cutText ["", "PLAIN"];
GVAR(WindInfo) = true;
[{
// abort condition
if (!(GVAR(WindInfo) && !(underwater ACE_player) && vehicle ACE_player == ACE_player)) exitWith {
GVAR(WindInfo) = false;
0 cutText ["", "PLAIN"];
[_this select 1] call CBA_fnc_removePerFrameHandler;
};
_windIndex = 12;
_windColor = [1, 1, 1, 1];
_windSpeed = (eyePos ACE_player) call FUNC(calculateWindSpeed);
if (_windSpeed > 0.2) then {
_playerDir = getDir ACE_player;
_windDir = (wind select 0) atan2 (wind select 1);
_windIndex = round(((_playerDir - _windDir + 360) % 360) / 30);
_windIndex = _windIndex % 12;
};
// Color Codes from https://en.wikipedia.org/wiki/Beaufort_scale#Modern_scale
if (_windSpeed > 0.3) then { _windColor = [0.796, 1, 1, 1]; };
if (_windSpeed > 1.5) then { _windColor = [0.596, 0.996, 0.796, 1]; };
if (_windSpeed > 3.3) then { _windColor = [0.596, 0.996, 0.596, 1]; };
if (_windSpeed > 5.4) then { _windColor = [0.6, 0.996, 0.4, 1]; };
if (_windSpeed > 7.9) then { _windColor = [0.6, 0.996, 0.047, 1]; };
if (_windSpeed > 10.7) then { _windColor = [0.8, 0.996, 0.059, 1]; };
if (_windSpeed > 13.8) then { _windColor = [1, 0.996, 0.067, 1]; };
if (_windSpeed > 17.1) then { _windColor = [1, 0.796, 0.051, 1]; };
if (_windSpeed > 20.7) then { _windColor = [1, 0.596, 0.039, 1]; };
if (_windSpeed > 24.4) then { _windColor = [1, 0.404, 0.031, 1]; };
if (_windSpeed > 28.4) then { _windColor = [1, 0.22, 0.027, 1]; };
if (_windSpeed > 32.6) then { _windColor = [1, 0.078, 0.027, 1]; };
0 cutRsc ["RscWindIntuitive", "PLAIN", 1, false];
__ctrl ctrlSetScale 0.75;
__ctrl ctrlCommit 0;
__ctrl ctrlSetText format[QUOTE(PATHTOF(UI\wind%1.paa)), _windIndex];
__ctrl ctrlSetTextColor _windColor;
}, 0.5, _this select 0] call CBA_fnc_addPerFrameHandler;
true

View File

@ -1,6 +1,7 @@
/*
* Author: Glowbal, Ruthberg
* Handles wind deflection for projectiles.
*
* Handles advanced ballistics for (BulletBase) projectiles
*
* Arguments:
* 0: unit - Object the event handler is assigned to <OBJECT>
@ -14,9 +15,6 @@
* Return Value:
* Nothing
*
* Example:
* [clientFiredBIS-XEH] call ace_winddeflection_fnc_handleFired
*
* Public: No
*/
#include "script_component.hpp"
@ -100,7 +98,7 @@ _stabilityFactor = 1.5;
if (_caliber > 0 && _bulletLength > 0 && _bulletMass > 0 && _barrelTwist > 0) then {
_temperature = GET_TEMPERATURE_AT_HEIGHT((getPosASL _unit) select 2);
_barometricPressure = 1013.25 * exp(-(GVAR(Altitude) + ((getPosASL _bullet) select 2)) / 7990) - 10 * overcast;
_barometricPressure = 1013.25 * exp(-(EGVAR(weather,Altitude) + ((getPosASL _bullet) select 2)) / 7990) - 10 * overcast;
_stabilityFactor = [_caliber, _bulletLength, _bulletMass, _barrelTwist, _muzzleVelocity, _temperature, _barometricPressure] call FUNC(calculateStabilityFactor);
};
@ -145,6 +143,54 @@ if (count GVAR(bulletDatabaseFreeIndices) > 0) then {
GVAR(bulletDatabaseFreeIndices) = GVAR(bulletDatabaseFreeIndices) - [_index];
};
#ifdef USE_ADVANCEDBALLISTICS_DLL
"AdvancedBallistics" callExtension format["new:%1:%2:%3:%4:%5:%6:%7:%8:%9:%10:%11:%12:%13:%14:%15:%16:%17:%18", _index, _airFriction, _ballisticCoefficients, _velocityBoundaries, _atmosphereModel, _dragModel, _stabilityFactor, _twistDirection, _muzzleVelocity, _transonicStabilityCoef, getPosASL _bullet, EGVAR(weather,Latitude), EGVAR(weather,currentTemperature), EGVAR(weather,Altitude), EGVAR(weather,currentHumidity), overcast, floor(time), time - floor(time)];
GVAR(bulletDatabase) set[_index, [_bullet, _caliber, _bulletTraceVisible, _index]];
if ((GVAR(bulletDatabaseOccupiedIndices) pushBack _index) == 0) then {
[{
private ["_bulletDatabaseEntry", "_index", "_bullet", "_caliber", "_bulletTraceVisible", "_bulletVelocity", "_bulletPosition"];
{
_bulletDatabaseEntry = (GVAR(bulletDatabase) select _x);
_bullet = _bulletDatabaseEntry select 0;
_index = _bulletDatabaseEntry select 3;
if (!alive _bullet) then {
GVAR(bulletDatabaseOccupiedIndices) = GVAR(bulletDatabaseOccupiedIndices) - [_index];
GVAR(bulletDatabaseFreeIndices) pushBack _index;
};
true
} count GVAR(bulletDatabaseOccupiedIndices);
if (count GVAR(bulletDatabaseOccupiedIndices) == 0) exitWith {
GVAR(bulletDatabase) = [];
GVAR(bulletDatabaseOccupiedIndices) = [];
GVAR(bulletDatabaseFreeIndices) = [];
[_this select 1] call cba_fnc_removePerFrameHandler;
};
{
_bulletDatabaseEntry = (GVAR(bulletDatabase) select _x);
_bullet = _bulletDatabaseEntry select 0;
_caliber = _bulletDatabaseEntry select 1;
_bulletTraceVisible = _bulletDatabaseEntry select 2;
_index = _bulletDatabaseEntry select 3;
_bulletVelocity = velocity _bullet;
_bulletPosition = getPosASL _bullet;
if (_bulletTraceVisible && vectorMagnitude _bulletVelocity > 600) then {
drop ["\A3\data_f\ParticleEffects\Universal\Refract","","Billboard",1,0.1,getPos _bullet,[0,0,0],0,1.275,1,0,[0.4*_caliber,0.2*_caliber],[[0,0,0,0.6],[0,0,0,0.4]],[1,0],0,0,"","",""];
};
call compile ("AdvancedBallistics" callExtension format["simulate:%1:%2:%3:%4:%5:%6:%7", _index, _bulletVelocity, _bulletPosition, ACE_wind, ASLToATL(_bulletPosition) select 2, floor(time), time - floor(time)]);
true
} count GVAR(bulletDatabaseOccupiedIndices);
}, 0, []] call CBA_fnc_addPerFrameHandler;
};
#else
GVAR(bulletDatabase) set[_index, [_bullet, _caliber, _airFriction, _muzzleVelocity, _stabilityFactor, _transonicStabilityCoef, _twistDirection, _unit, _bulletTraceVisible, _ballisticCoefficients, _velocityBoundaries, _atmosphereModel, _dragModel, _index]];
GVAR(bulletDatabaseStartTime) set[_index, time];
GVAR(bulletDatabaseSpeed) set[_index, 0];
@ -252,7 +298,7 @@ if ((GVAR(bulletDatabaseOccupiedIndices) pushBack _index) == 0) then {
};
if (GVAR(AtmosphericDensitySimulationEnabled)) then {
_pressure = 1013.25 * exp(-(GVAR(Altitude) + (_bulletPosition select 2)) / 7990) - 10 * overcast;
_pressure = 1013.25 * exp(-(EGVAR(weather,Altitude) + (_bulletPosition select 2)) / 7990) - 10 * overcast;
_temperature = GET_TEMPERATURE_AT_HEIGHT(_bulletPosition select 2);
_humidity = EGVAR(weather,currentHumidity);
_airDensity = STD_AIR_DENSITY_ICAO;
@ -279,7 +325,7 @@ if ((GVAR(bulletDatabaseOccupiedIndices) pushBack _index) == 0) then {
_bulletVelocity = _bulletVelocity vectorDiff _accel;
} else {
if (GVAR(AtmosphericDensitySimulationEnabled)) then {
_pressureDeviation = 1013.25 * exp(-(GVAR(Altitude) + (_bulletPosition select 2)) / 7990) - 1013.25 - 10 * overcast;
_pressureDeviation = 1013.25 * exp(-(EGVAR(weather,Altitude) + (_bulletPosition select 2)) / 7990) - 1013.25 - 10 * overcast;
_temperature = GET_TEMPERATURE_AT_HEIGHT(_bulletPosition select 2);
_humidity = EGVAR(weather,currentHumidity);
_airFriction = _airFriction + ((_temperature - 15) * 0.0000015 + _humidity * 0.0000040 + _pressureDeviation * -0.0000009);
@ -297,7 +343,7 @@ if ((GVAR(bulletDatabaseOccupiedIndices) pushBack _index) == 0) then {
};
if (GVAR(CoriolisEnabled) && _bulletSpeedAvg > 0) then {
_horizontalDeflection = 0.0000729 * (_unit distanceSqr _bullet) * sin(GVAR(Latitude)) / _bulletSpeedAvg;
_horizontalDeflection = 0.0000729 * (_unit distanceSqr _bullet) * sin(EGVAR(weather,Latitude)) / _bulletSpeedAvg;
_horizontalDeflectionPartial = _horizontalDeflection - (GVAR(bulletDatabaseHDeflect) select _index);
GVAR(bulletDatabaseHDeflect) set[_index, _horizontalDeflection];
_vect = [sin(_bulletDir + 90) * _horizontalDeflectionPartial, cos(_bulletDir + 90) * _horizontalDeflectionPartial, 0];
@ -308,7 +354,7 @@ if ((GVAR(bulletDatabaseOccupiedIndices) pushBack _index) == 0) then {
/*
// Negligible effect on the trajectory
if (GVAR(EoetvoesEnabled)) then {
_centripetalAccel = 2 * 0.0000729 * (_muzzleVelocity / -32.2) * cos(GVAR(Latitude)) * sin(_bulletDir);
_centripetalAccel = 2 * 0.0000729 * (_muzzleVelocity / -32.2) * cos(EGVAR(weather,Latitude)) * sin(_bulletDir);
_accel = [0, 0, -(_centripetalAccel * _deltaT)];
_bulletVelocity = _bulletVelocity vectorAdd _accel;
@ -344,3 +390,4 @@ if ((GVAR(bulletDatabaseOccupiedIndices) pushBack _index) == 0) then {
}, 0, []] call CBA_fnc_addPerFrameHandler;
};
#endif

View File

@ -1,191 +0,0 @@
/*
* Author: Glowbal, Ruthberg
* Handles wind deflection for projectiles using the advanced ballistics dll extension.
*
* Arguments:
* 0: unit - Object the event handler is assigned to <OBJECT>
* 1: weapon - Fired weapon <STRING>
* 2: muzzle - Muzzle that was used <STRING>
* 3: mode - Current mode of the fired weapon <STRING>
* 4: ammo - Ammo used <STRING>
* 5: magazine - magazine name which was used <STRING>
* 6: projectile - Object of the projectile that was shot <OBJECT>
*
* Return Value:
* Nothing
*
* Example:
* [clientFiredBIS-XEH] call ace_advanced_ballistics_fnc_handleFired
*
* Public: No
*/
#include "script_component.hpp"
#include "defines.h"
private ["_unit", "_weapon", "_mode", "_ammo", "_magazine", "_caliber", "_bullet", "_index", "_opticsName", "_opticType", "_bulletTraceVisible", "_temperature", "_barometricPressure", "_atmosphereModel", "_bulletMass", "_bulletLength", "_bulletTranslation", "_airFriction", "_dragModel", "_velocityBoundaryData", "_muzzleVelocity", "_muzzleVelocityCoef", "_muzzleVelocityShift", "_bulletVelocity", "_bulletSpeed", "_bulletLength", "_bulletWeight", "_barrelTwist", "_twistDirection", "_stabilityFactor", "_transonicStabilityCoef", "_ACE_Elevation", "_ACE_Windage", "_ID"];
_unit = _this select 0;
_weapon = _this select 1;
_mode = _this select 3;
_ammo = _this select 4;
_magazine = _this select 5;
_bullet = _this select 6;
if (isDedicated) exitWith {};
if (!alive _bullet) exitWith {};
if (!([_unit] call EFUNC(common,isPlayer))) exitWith {};
if (underwater _unit) exitWith {};
if (!(_ammo isKindOf "BulletBase")) exitWith {};
if (_unit distanceSqr ACE_player > 9000000) exitWith {};
if (GVAR(ONLY_ACTIVE_FOR_LOCAL_PLAYER) && _unit != ACE_player) exitWith {};
if (!GVAR(VehicleGunnerEnabled) && !(_unit isKindOf "Man")) exitWith {};
if (GVAR(DISABLED_IN_FULL_AUTO_MODE) && getNumber(configFile >> "cfgWeapons" >> _weapon >> _mode >> "autoFire") == 1) exitWith {};
_airFriction = getNumber(configFile >> "cfgAmmo" >> _ammo >> "airFriction");
_muzzleVelocity = getNumber(configFile >> "cfgMagazines" >> _magazine >> "initSpeed");
_muzzleVelocityCoef = getNumber(configFile >> "cfgWeapons" >> _weapon >> "initSpeed");
if (_muzzleVelocityCoef > 0) then {
_muzzleVelocity = _muzzleVelocityCoef;
};
if (_muzzleVelocityCoef < 0) then {
_muzzleVelocity = _muzzleVelocity * (-1 * _muzzleVelocityCoef);
};
switch (currentWeapon _unit) do {
case primaryWeapon _unit: { _muzzleAccessory = (primaryWeaponItems _unit) select 0; };
case handgunWeapon _unit: { _muzzleAccessory = (handgunItems _unit) select 0; };
default { _muzzleAccessory = ""; };
};
if (_muzzleAccessory != "" && isNumber(configFile >> "cfgWeapons" >> _muzzleAccessory >> "ItemInfo" >> "MagazineCoef" >> "initSpeed")) then {
_initSpeedCoef = getNumber(configFile >> "cfgWeapons" >> _muzzleAccessory >> "ItemInfo" >> "MagazineCoef" >> "initSpeed");
_muzzleVelocity = _muzzleVelocity * _initSpeedCoef;
};
if (GVAR(BarrelLengthInfluenceEnabled)) then {
_muzzleVelocityShift = [_ammo, _weapon, _muzzleVelocity] call FUNC(calculateBarrelLengthVelocityShift);
if (_muzzleVelocityShift != 0) then {
_bulletVelocity = velocity _bullet;
_bulletSpeed = vectorMagnitude _bulletVelocity;
_bulletVelocity = _bulletVelocity vectorAdd ((vectorNormalized _bulletVelocity) vectorMultiply (_muzzleVelocityShift * (_bulletSpeed / _muzzleVelocity)));
_bullet setVelocity _bulletVelocity;
_muzzleVelocity = _muzzleVelocity + _muzzleVelocityShift;
};
};
if (GVAR(AmmoTemperatureEnabled)) then {
_temperature = GET_TEMPERATURE_AT_HEIGHT((getPosASL _unit) select 2);
_muzzleVelocityShift = [_ammo, _temperature] call FUNC(calculateAmmoTemperatureVelocityShift);
if (_muzzleVelocityShift != 0) then {
_bulletVelocity = velocity _bullet;
_bulletSpeed = vectorMagnitude _bulletVelocity;
_bulletVelocity = _bulletVelocity vectorAdd ((vectorNormalized _bulletVelocity) vectorMultiply (_muzzleVelocityShift * (_bulletSpeed / _muzzleVelocity)));
_bullet setVelocity _bulletVelocity;
_muzzleVelocity = _muzzleVelocity + _muzzleVelocityShift;
};
};
_bulletTraceVisible = false;
if (GVAR(BulletTraceEnabled) && currentWeapon ACE_player == primaryWeapon ACE_player && count primaryWeaponItems ACE_player > 2) then {
_opticsName = (primaryWeaponItems ACE_player) select 2;
_opticType = getNumber(configFile >> "cfgWeapons" >> _opticsName >> "ItemInfo" >> "opticType");
_bulletTraceVisible = (_opticType == 2 || currentWeapon ACE_player in ["ACE_Vector", "Binocular", "Rangefinder", "Laserdesignator"]) && cameraView == "GUNNER";
};
_caliber = getNumber(configFile >> "cfgAmmo" >> _ammo >> "ACE_caliber");
_bulletLength = getNumber(configFile >> "cfgAmmo" >> _ammo >> "ACE_bulletLength");
_bulletMass = getNumber(configFile >> "cfgAmmo" >> _ammo >> "ACE_bulletMass");
_barrelTwist = getNumber(configFile >> "cfgWeapons" >> _weapon >> "ACE_barrelTwist");
_stabilityFactor = 1.5;
if (_caliber > 0 && _bulletLength > 0 && _bulletMass > 0 && _barrelTwist > 0) then {
_temperature = GET_TEMPERATURE_AT_HEIGHT((getPosASL _unit) select 2);
_barometricPressure = 1013.25 * exp(-(GVAR(Altitude) + ((getPosASL _bullet) select 2)) / 7990) - 10 * overcast;
_stabilityFactor = [_caliber, _bulletLength, _bulletMass, _barrelTwist, _muzzleVelocity, _temperature, _barometricPressure] call FUNC(calculateStabilityFactor);
};
_twistDirection = 1;
if (isNumber(configFile >> "cfgWeapons" >> _weapon >> "ACE_twistDirection")) then {
_twistDirection = getNumber(configFile >> "cfgWeapons" >> _weapon >> "ACE_twistDirection");
if (_twistDirection != -1 && _twistDirection != 0 && _twistDirection != 1) then {
_twistDirection = 1;
};
};
_transonicStabilityCoef = 0.5;
if (isNumber(configFile >> "cfgAmmo" >> _ammo >> "ACE_transonicStabilityCoef")) then {
_transonicStabilityCoef = getNumber(configFile >> "cfgAmmo" >> _ammo >> "ACE_transonicStabilityCoef");
};
_dragModel = 1;
_ballisticCoefficients = [];
_velocityBoundaries = [];
_atmosphereModel = "ICAO";
if (GVAR(AdvancedAirDragEnabled)) then {
if (isNumber(configFile >> "cfgAmmo" >> _ammo >> "ACE_dragModel")) then {
_dragModel = getNumber(configFile >> "cfgAmmo" >> _ammo >> "ACE_dragModel");
if (!(_dragModel in [1, 2, 5, 6, 7, 8])) then {
_dragModel = 1;
};
};
if (isArray(configFile >> "cfgAmmo" >> _ammo >> "ACE_ballisticCoefficients")) then {
_ballisticCoefficients = getArray(configFile >> "cfgAmmo" >> _ammo >> "ACE_ballisticCoefficients");
};
if (isArray(configFile >> "cfgAmmo" >> _ammo >> "ACE_velocityBoundaries")) then {
_velocityBoundaries = getArray(configFile >> "cfgAmmo" >> _ammo >> "ACE_velocityBoundaries");
};
if (isText(configFile >> "cfgAmmo" >> _ammo >> "ACE_standardAtmosphere")) then {
_atmosphereModel = getText(configFile >> "cfgAmmo" >> _ammo >> "ACE_standardAtmosphere");
};
};
_index = count GVAR(bulletDatabase);
if (count GVAR(bulletDatabaseFreeIndices) > 0) then {
_index = GVAR(bulletDatabaseFreeIndices) select 0;
GVAR(bulletDatabaseFreeIndices) = GVAR(bulletDatabaseFreeIndices) - [_index];
};
"AdvancedBallistics" callExtension format["new:%1:%2:%3:%4:%5:%6:%7:%8:%9:%10:%11:%12:%13:%14:%15:%16:%17:%18", _index, _airFriction, _ballisticCoefficients, _velocityBoundaries, _atmosphereModel, _dragModel, _stabilityFactor, _twistDirection, _muzzleVelocity, _transonicStabilityCoef, getPosASL _bullet, GVAR(Latitude), EGVAR(weather,currentTemperature), GVAR(Altitude), EGVAR(weather,currentHumidity), overcast, floor(time), time - floor(time)];
GVAR(bulletDatabase) set[_index, [_bullet, _caliber, _bulletTraceVisible, _index]];
if ((GVAR(bulletDatabaseOccupiedIndices) pushBack _index) == 0) then {
[{
private ["_bulletDatabaseEntry", "_index", "_bullet", "_caliber", "_bulletTraceVisible", "_bulletVelocity", "_bulletPosition"];
{
_bulletDatabaseEntry = (GVAR(bulletDatabase) select _x);
_bullet = _bulletDatabaseEntry select 0;
_index = _bulletDatabaseEntry select 3;
if (!alive _bullet) then {
GVAR(bulletDatabaseOccupiedIndices) = GVAR(bulletDatabaseOccupiedIndices) - [_index];
GVAR(bulletDatabaseFreeIndices) pushBack _index;
};
true
} count GVAR(bulletDatabaseOccupiedIndices);
if (count GVAR(bulletDatabaseOccupiedIndices) == 0) exitWith {
GVAR(bulletDatabase) = [];
GVAR(bulletDatabaseOccupiedIndices) = [];
GVAR(bulletDatabaseFreeIndices) = [];
[_this select 1] call cba_fnc_removePerFrameHandler;
};
{
_bulletDatabaseEntry = (GVAR(bulletDatabase) select _x);
_bullet = _bulletDatabaseEntry select 0;
_caliber = _bulletDatabaseEntry select 1;
_bulletTraceVisible = _bulletDatabaseEntry select 2;
_index = _bulletDatabaseEntry select 3;
_bulletVelocity = velocity _bullet;
_bulletPosition = getPosASL _bullet;
if (_bulletTraceVisible && vectorMagnitude _bulletVelocity > 600) then {
drop ["\A3\data_f\ParticleEffects\Universal\Refract","","Billboard",1,0.1,getPos _bullet,[0,0,0],0,1.275,1,0,[0.4*_caliber,0.2*_caliber],[[0,0,0,0.6],[0,0,0,0.4]],[1,0],0,0,"","",""];
};
call compile ("AdvancedBallistics" callExtension format["simulate:%1:%2:%3:%4:%5:%6:%7", _index, _bulletVelocity, _bulletPosition, ACE_wind, ASLToATL(_bulletPosition) select 2, floor(time), time - floor(time)]);
true
} count GVAR(bulletDatabaseOccupiedIndices);
}, 0, []] call CBA_fnc_addPerFrameHandler;
};

View File

@ -1,15 +1,3 @@
["ACE3", QGVAR(WindInfoKey), localize "STR_ACE_AdvancedBallistics_WindInfoKey",
{
// Conditions: canInteract
if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false};
// Statement
[] call FUNC(displayWindInfo);
false
},
{false},
[37, [true, false, false]], false, 0] call CBA_fnc_addKeybind; // (SHIFT + K)
["ACE3", QGVAR(ProtractorKey), localize "STR_ACE_AdvancedBallistics_ProtractorKey",
{
// Conditions: canInteract

View File

@ -1,6 +1,8 @@
#define COMPONENT advanced_ballistics
#include "\z\ace\addons\main\script_mod.hpp"
#define USE_ADVANCEDBALLISTICS_DLL
#ifdef DEBUG_ENABLED_ADVANCEDBALLISTICS
#define DEBUG_MODE_FULL
#endif

View File

@ -17,4 +17,415 @@ class CfgAmmo {
class B_30mm_AP : BulletBase {
timeToLive = 30;
};
class B_556x45_Ball_Tracer_Red;
class B_762x51_Tracer_Red;
class B_556x45_Ball : BulletBase {
airFriction=-0.001265;
hit=8;
typicalSpeed=750;
ACE_caliber=0.224;
ACE_bulletLength=0.906;
ACE_bulletMass=62;
ACE_ammoTempMuzzleVelocityShifts[]={-27.20, -26.44, -23.76, -21.00, -17.54, -13.10, -7.95, -1.62, 6.24, 15.48, 27.75};
ACE_ballisticCoefficients[]={0.151};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=7;
ACE_muzzleVelocities[]={723, 764, 796, 825, 843, 866, 878, 892, 906, 915, 922, 900};
ACE_barrelLengths[]={8.3, 9.4, 10.6, 11.8, 13.0, 14.2, 15.4, 16.5, 17.7, 18.9, 20.0, 24.0};
};
class ACE_556x45_Ball_Mk262 : B_556x45_Ball {
airFriction=-0.001125;
caliber=0.6;
deflecting=18;
hit=11;
typicalSpeed=836;
ACE_caliber=0.224;
ACE_bulletLength=0.906;
ACE_bulletMass=77;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.361};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={624, 816, 832, 838};
ACE_barrelLengths[]={7.5, 14.5, 18, 20};
};
class ACE_556x45_Ball_Mk318 : B_556x45_Ball {
airFriction=-0.001120;
caliber=0.6;
deflecting=18;
hit=9;
typicalSpeed=886;
ACE_caliber=0.224;
ACE_bulletLength=0.906;
ACE_bulletMass=62;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.307};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={780, 886, 950};
ACE_barrelLengths[]={10, 15.5, 20};
};
class ACE_545x39_Ball_7N6M : B_556x45_Ball {
airFriction=-0.001162;
caliber=0.5;
deflecting=18;
hit=7;
typicalSpeed=880;
ACE_caliber=0.220;
ACE_bulletLength=0.85;
ACE_bulletMass=52.9;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.168};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=7;
ACE_muzzleVelocities[]={780, 880, 920};
ACE_barrelLengths[]={10, 16.3, 20};
};
class ACE_545x39_Ball_7T3M : B_556x45_Ball_Tracer_Red {
airFriction=-0.001162;
caliber=0.5;
deflecting=18;
hit=7;
typicalSpeed=883;
ACE_caliber=0.220;
ACE_bulletLength=0.85;
ACE_bulletMass=49.8;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.168};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=7;
ACE_muzzleVelocities[]={785, 883, 925};
ACE_barrelLengths[]={10, 16.3, 20};
};
class B_65x39_Caseless : BulletBase {
airFriction=-0.000772;
typicalSpeed=800;
ACE_caliber=0.264;
ACE_bulletLength=1.295;
ACE_bulletMass=123;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.263};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ICAO";
ACE_dragModel=7;
ACE_muzzleVelocities[]={760, 788, 800, 805};
ACE_barrelLengths[]={16, 20, 24, 26};
};
class B_762x51_Ball : BulletBase {
airFriction=-0.001035;
typicalSpeed=833;
hit=14;
ACE_caliber=0.308;
ACE_bulletLength=1.14;
ACE_bulletMass=146;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.2};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ICAO";
ACE_dragModel=7;
ACE_muzzleVelocities[]={700, 800, 820, 833, 845};
ACE_barrelLengths[]={10, 16, 20, 24, 26};
};
class ACE_762x51_Ball_M118LR : B_762x51_Ball {
airFriction=-0.0008525;
caliber=1.05;
hit=16;
typicalSpeed=790;
ACE_caliber=0.308;
ACE_bulletLength=1.24;
ACE_bulletMass=175;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.505, 0.496, 0.485, 0.485, 0.485};
ACE_velocityBoundaries[]={853, 549, 549, 549};
ACE_standardAtmosphere="ICAO";
ACE_dragModel=1;
ACE_muzzleVelocities[]={750, 780, 790, 794};
ACE_barrelLengths[]={16, 20, 24, 26};
};
class ACE_762x51_Ball_Subsonic : B_762x51_Ball {
airFriction=-0.000535;
caliber=0.5;
hit=16;
typicalSpeed=790;
ACE_caliber=0.308;
ACE_bulletLength=1.340;
ACE_bulletMass=200;
ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619};
ACE_ballisticCoefficients[]={0.235};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ICAO";
ACE_dragModel=7;
ACE_muzzleVelocities[]={305, 325, 335, 340};
ACE_barrelLengths[]={16, 20, 24, 26};
};
class ACE_762x54_Ball_7N14 : B_762x51_Ball {
airFriction=-0.001023;
caliber=0.95;
hit=15;
typicalSpeed=820;
ACE_caliber=0.312;
ACE_bulletLength=1.14;
ACE_bulletMass=152;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.4};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ICAO";
ACE_dragModel=1;
ACE_muzzleVelocities[]={700, 800, 820, 833};
ACE_barrelLengths[]={16, 20, 24, 26};
};
class ACE_762x54_Ball_7T2 : B_762x51_Tracer_Red {
airFriction=-0.001023;
caliber=0.9;
hit=15;
typicalSpeed=800;
ACE_caliber=0.312;
ACE_bulletLength=1.14;
ACE_bulletMass=149;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.395};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ICAO";
ACE_dragModel=1;
ACE_muzzleVelocities[]={680, 750, 798, 800};
ACE_barrelLengths[]={16, 20, 24, 26};
};
class ACE_762x35_Ball : B_762x51_Ball {
airFriction=-0.000821;
caliber=0.9;
hit=11;
typicalSpeed=790;
ACE_caliber=0.308;
ACE_bulletLength=1.153;
ACE_bulletMass=125;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.349, 0.338, 0.330, 0.310};
ACE_velocityBoundaries[]={792, 610, 488};
ACE_standardAtmosphere="ICAO";
ACE_dragModel=1;
ACE_muzzleVelocities[]={620, 655, 675};
ACE_barrelLengths[]={9, 16, 20};
};
class ACE_762x39_Ball : B_762x51_Ball {
airFriction=-0.0015168;
hit=12;
typicalSpeed=716;
ACE_caliber=0.308;
ACE_bulletLength=1.14;
ACE_bulletMass=123;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.275};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ICAO";
ACE_dragModel=1;
ACE_muzzleVelocities[]={650, 716, 750};
ACE_barrelLengths[]={10, 16.3, 20};
};
class ACE_762x39_Ball_57N231P : B_762x51_Tracer_Red {
airFriction=-0.0015168;
hit=12;
typicalSpeed=716;
ACE_caliber=0.308;
ACE_bulletLength=1.14;
ACE_bulletMass=117;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.275};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ICAO";
ACE_dragModel=1;
ACE_muzzleVelocities[]={650, 716, 750};
ACE_barrelLengths[]={10, 16.3, 20};
};
class B_9x21_Ball : BulletBase {
airFriction=-0.00125;
typicalSpeed=390;
hit=6;
ACE_caliber=0.356;
ACE_bulletLength=0.610;
ACE_bulletMass=115;
ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619};
ACE_ballisticCoefficients[]={0.17};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={350, 390, 420};
ACE_barrelLengths[]={4, 5, 9};
};
class ACE_9x18_Ball_57N181S : B_9x21_Ball {
hit=5;
airFriction=-0.001234;
typicalSpeed=298;
ACE_caliber=0.365;
ACE_bulletLength=0.610;
ACE_bulletMass=92.6;
ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619};
ACE_ballisticCoefficients[]={0.125};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={298, 330, 350};
ACE_barrelLengths[]={3.8, 5, 9};
};
class ACE_9x19_Ball : B_9x21_Ball {
airFriction=-0.001234;
typicalSpeed=370;
hit=6;
ACE_caliber=0.355;
ACE_bulletLength=0.610;
ACE_bulletMass=124;
ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619};
ACE_ballisticCoefficients[]={0.165};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={340, 370, 400};
ACE_barrelLengths[]={4, 5, 9};
};
class ACE_10x25_Ball : B_9x21_Ball {
airFriction=-0.00168;
typicalSpeed=425;
hit=7;
ACE_caliber=0.5;
ACE_bulletLength=0.764;
ACE_bulletMass=165;
ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619};
ACE_ballisticCoefficients[]={0.189};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={360, 400, 430};
ACE_barrelLengths[]={4, 4.61, 9};
};
class ACE_765x17_Ball: B_9x21_Ball {
airFriction=-0.001213;
typicalSpeed=282;
hit=7;
ACE_caliber=0.3125;
ACE_bulletLength=0.610;
ACE_bulletMass=65;
ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619};
ACE_ballisticCoefficients[]={0.118};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={282, 300, 320};
ACE_barrelLengths[]={4, 5, 9};
};
class ACE_303_Ball : ACE_762x51_Ball_M118LR {
airFriction=-0.00083;
typicalSpeed=761;
ACE_caliber=0.311;
ACE_bulletLength=1.227;
ACE_bulletMass=174;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.499, 0.493, 0.48};
ACE_velocityBoundaries[]={671, 549};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={748, 761, 765};
ACE_barrelLengths[]={20, 24, 26};
};
class B_408_Ball : BulletBase {
airFriction=-0.000395;
typicalSpeed=910;
ACE_caliber=0.408;
ACE_bulletLength=2.126;
ACE_bulletMass=410;
ACE_transonicStabilityCoef=1;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.97};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={910};
ACE_barrelLengths[]={29};
};
class ACE_106x83mm_Ball : B_408_Ball {
ACE_caliber=0.416;
ACE_bulletLength=2.089;
ACE_bulletMass=398;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.72};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={960};
ACE_barrelLengths[]={29};
};
class ACE_338_Ball : B_408_Ball {
airFriction=-0.000526;
caliber=1.55;
deflecting=12;
hit=20;
typicalSpeed=826;
ACE_caliber=0.338;
ACE_bulletLength=1.70;
ACE_bulletMass=300;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.381};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ICAO";
ACE_dragModel=7;
ACE_muzzleVelocities[]={820, 826, 830};
ACE_barrelLengths[]={24, 26.5, 28};
};
class B_127x99_Ball : BulletBase {
airFriction=-0.0006;
typicalSpeed=853;
ACE_caliber=0.510;
ACE_bulletLength=2.310;
ACE_bulletMass=647;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.670};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={853};
ACE_barrelLengths[]={29};
};
class ACE_127x99_Ball_AMAX : B_127x99_Ball {
ACE_caliber=0.510;
ACE_bulletLength=2.540;
ACE_bulletMass=750;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={1.050};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={860};
ACE_barrelLengths[]={29};
};
class B_127x108_Ball : BulletBase {
typicalSpeed=820;
ACE_caliber=0.511;
ACE_bulletLength=2.520;
ACE_bulletMass=745;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.63};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={820};
ACE_barrelLengths[]={28.7};
};
class B_45ACP_Ball : BulletBase {
airFriction=-0.0007182;
typicalSpeed=250;
ACE_caliber=0.452;
ACE_bulletLength=0.68;
ACE_bulletMass=230;
ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619};
ACE_ballisticCoefficients[]={0.195};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={230, 250, 285};
ACE_barrelLengths[]={4, 5, 9};
};
};

View File

@ -6,7 +6,7 @@ class CfgPatches {
weapons[] = {};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"ace_common"};
author[] = {"TaoSensai","commy2"};
author[] = {"TaoSensai","commy2","Ruthberg"};
authorUrl = "https://github.com/Taosenai/tmr";
VERSION_CONFIG;
};

View File

@ -193,6 +193,7 @@ PREP(getHitPoints);
PREP(getHitPointsWithSelections);
PREP(getReflectorsWithSelections);
PREP(getLightProperties);
PREP(getLightPropertiesWeapon);
PREP(getVehicleCrew);
// turrets

View File

@ -0,0 +1,58 @@
/*
* Author: commy2
* Read properties of given flashlight. @todo, Can weapons themselves still have flashlights (no attachment)?
*
* Arguments:
* 0: A flashlight (String)
*
* Return Value:
* Stuff from config (Array)
*
*/
#include "script_component.hpp"
private "_weapon";
_weapon = _this select 0;
private "_config";
_config = configFile >> "CfgWeapons" >> _weapon >> "ItemInfo" >> "FlashLight";
private ["_intensity", "_position", "_direction", "_innerAngle", "_outerAngle"];
_intensity = getNumber (_config >> "intensity");
_position = getText (_config >> "position");
_direction = getText (_config >> "direction");
_innerAngle = getNumber (_config >> "innerAngle");
_outerAngle = getNumber (_config >> "outerAngle");
[_intensity, _position, _direction, _innerAngle, _outerAngle]
/*
class FlashLight
{
color[] = {180,156,120};
ambient[] = {0.9,0.78,0.6};
intensity = 20;
size = 1;
innerAngle = 20;
outerAngle = 80;
coneFadeCoef = 5;
position = "flash dir";
direction = "flash";
useFlare = 1;
flareSize = 1.4;
flareMaxDistance = "100.0f";
dayLight = 0;
class Attenuation
{
start = 0.5;
constant = 0;
linear = 0;
quadratic = 1.1;
hardLimitStart = 20;
hardLimitEnd = 30;
};
scale[] = {0};
};
*/

View File

@ -20,12 +20,53 @@ _lightSource = _this select 1;
private "_unitPos";
_unitPos = _unit modelToWorld (_unit selectionPosition "spine3");
private ["_lights", "_lightLevel"];
_lights = [_lightSource] call FUNC(getTurnedOnLights);
private "_lightLevel";
_lightLevel = 0;
if (_lightSource isKindOf "CAManBase") then {
// handle persons with flashlights
private "_weapon";
_weapon = currentWeapon _lightSource;
if !(_lightSource isFlashlightOn _weapon) exitWith {};
private ["_flashlight", "_properties", "_intensity", "_innerAngle", "_outerAngle", "_position", "_direction", "_directionToUnit", "_distance", "_angle"];
_flashlight = switch (_weapon) do {
case (primaryWeapon _lightSource): {
primaryWeaponItems _lightSource select 1
};
case (secondaryWeapon _lightSource): {
secondaryWeaponItems _lightSource select 1
};
case (handgunWeapon _lightSource): {
handgunItems _lightSource select 1
};
default {""};
};
_properties = [_flashlight] call FUNC(getLightPropertiesWeapon);
_innerAngle = (_properties select 3) / 2;
_outerAngle = (_properties select 4) / 2;
_position = _lightSource modelToWorld (_lightSource selectionPosition "rightHand");
_direction = _lightSource weaponDirection _weapon;
_directionToUnit = _position vectorFromTo _unitPos;
_distance = _unitPos distance _position;
_angle = acos (_direction vectorDotProduct _directionToUnit);
_lightLevel = (linearConversion [0, 30, _distance, 1, 0, true]) * (linearConversion [_innerAngle, _outerAngle, _angle, 1, 0, true]);
} else {
// handle any object, strcutures, cars, tanks, etc.
private "_lights";
_lights = [_lightSource] call FUNC(getTurnedOnLights);
{
private ["_properties", "_intensity", "_innerAngle", "_outerAngle", "_position", "_direction", "_directionToUnit", "_distance", "_angle"];
@ -53,4 +94,6 @@ _lightLevel = 0;
} forEach _lights;
};
_lightLevel

View File

@ -129,52 +129,3 @@ class CfgWeapons {
ACE_Overheating_JamChance[] = {0, 0.0003, 0.0015, 0.0075};
};
};
class CfgAmmo {
class BulletCore;
class BulletBase : BulletCore {
ACE_BulletMass = 0; // Bullet mass in grams
};
// Rifle and MG rounds
class B_556x45_Ball : BulletBase {
ACE_BulletMass = 4.1; // 5.56x45 NATO
};
class B_65x39_Caseless : BulletBase {
ACE_BulletMass = 8; // 6.5mm Grendel
};
class B_762x51_Ball : BulletBase {
ACE_BulletMass = 10; // 7.62x51 NATO
};
class ACE_B_762x51_M118LR : B_762x51_Ball {
ACE_BulletMass = 11; // 7.62x51 NATO M118
};
class B_127x99_Ball : BulletBase {
ACE_BulletMass = 42; // 12.7×99mm NATO (.50 BMG)
};
class B_127x108_Ball : BulletBase {
ACE_BulletMass = 48.3; // 12.7x108
};
class B_408_Ball : BulletBase {
ACE_BulletMass = 27; // .408 Cheyenne Tactical
};
// Pistol Rounds
class B_9x21_Ball : BulletBase {
ACE_BulletMass = 7.45; // 9×21mm IMI
};
class B_9x19_Ball : B_9x21_Ball {
ACE_BulletMass = 7.45; // 9×19mm Parabellum
};
class B_127x33_Ball : BulletBase {
ACE_BulletMass = 21; // .50 AE
};
class B_45ACP_Ball : BulletBase {
ACE_BulletMass = 12; // .45 ACP
};
};

View File

@ -36,9 +36,10 @@ _temperature = _overheat select 0;
_time = _overheat select 1;
// Get physical parameters
_bulletMass = getNumber (configFile >> "CfgAmmo" >> _ammo >> "ACE_BulletMass");
// Bullet mass is read from config in grains and converted to grams
_bulletMass = (getNumber (configFile >> "CfgAmmo" >> _ammo >> "ACE_BulletMass")) * 0.06480;
if (_bulletMass == 0) then {
// If the bullet mass is not configured, estimate it
// If the bullet mass is not configured, estimate it directly in grams
_bulletMass = 3.4334 + 0.5171 * (getNumber (configFile >> "CfgAmmo" >> _ammo >> "hit") + getNumber (configFile >> "CfgAmmo" >> _ammo >> "caliber"));
};
_energyIncrement = 0.75 * 0.0005 * _bulletMass * (vectorMagnitudeSqr _velocity);

View File

@ -0,0 +1,31 @@
class RscTitles
{
class RscWindIntuitive
{
idd=-1;
onLoad="with uiNameSpace do { RscWindIntuitive = _this select 0 };";
movingEnable=0;
duration=60;
fadeIn="false";
fadeOut="false";
class controls
{
class RscWindIntuitive
{
idc=132948;
type=0;
style=48;
font="TahomaB";
colorBackground[]={0,0,0,0};
colorText[]={0,0,0,0};
x="SafeZoneX + 0.001";
y="SafeZoneY + 0.001";
w=0.2;
h=0.2*4/3;
size=0.034;
sizeEx=0.027;
text="";
};
};
};
};

View File

@ -10,8 +10,18 @@
30 setFog (ACE_MISC_PARAMS select 2);
};
};
ACE_wind = wind;
if (true) exitwith {};
["ACE3", QGVAR(WindInfoKey), localize "STR_ACE_Weather_WindInfoKey",
{
// Conditions: canInteract
if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false};
// Statement
[] call FUNC(displayWindInfo);
false
},
{false},
[37, [true, false, false]], false, 0] call CBA_fnc_addKeybind; // (SHIFT + K)
// Update Wind
simulWeatherSync;
@ -54,7 +64,7 @@ _fnc_updateTemperature = {
_hourlyCoef = -0.5 * sin(360 * ((3 + (date select 3))/24 + (date select 4)/1440));
GVAR(currentTemperature) = (GVAR(TempDay) select (_month - 1)) * (1 - _hourlyCoef) + (GVAR(TempNight) select (_month - 1)) * _hourlyCoef;
GVAR(currentTemperature) = GVAR(currentTemperature) + GVAR(currentTemperature) - 2 * humidity - 4 * overcast;
GVAR(currentTemperature) = GVAR(currentTemperature) - 2 * humidity - 4 * overcast;
GVAR(currentTemperature) = round(GVAR(currentTemperature) * 10) / 10;
// Humidity

View File

@ -4,10 +4,10 @@
ADDON = false;
LOG(MSG_INIT);
PREP(serverController);
PREP(displayWindInfo);
PREP(getMapData);
PREP(getWind);
PREP(serverController);
// Rain variables

View File

@ -6,11 +6,11 @@ class CfgPatches {
weapons[] = {};// "ACE_Kestrel4500" };
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"ace_common"};
author[] = {"q1184", "Rocko", "esteldunedain"};
author[] = {"q1184", "Rocko", "esteldunedain","Ruthberg"};
VERSION_CONFIG;
};
};
#include "CfgEventhandlers.hpp"
#include "CfgWorlds.hpp"
#include "RscTitles.hpp"

View File

@ -0,0 +1,82 @@
/*
* Author: Ruthberg
*
* Displays a wind info (colored arrow) in the top left corner of the screen
*
* Argument:
* None
*
* Return value:
* None
*/
#include "script_component.hpp"
#define __dsp (uiNamespace getVariable "RscWindIntuitive")
#define __ctrl (__dsp displayCtrl 132948)
private ["_windSpeed", "_windDir", "_playerDir", "_windIndex", "_windColor", "_newWindSpeed", "_windSource", "_height"];
if (GVAR(WindInfo)) exitWith {
GVAR(WindInfo) = false;
0 cutText ["", "PLAIN"];
true
};
if (underwater ACE_player) exitWith { true };
if (vehicle ACE_player != ACE_player) exitWith { true };
[] spawn {
2 cutText ["", "PLAIN"];
GVAR(Protractor) = false;
1 cutText ["", "PLAIN"];
GVAR(WindInfo) = true;
while {GVAR(WindInfo) && !(underwater ACE_player) && vehicle ACE_player == ACE_player} do {
_windIndex = 12;
_windColor = [1, 1, 1, 1];
// Toogle behaviour depending on ace_advanced_ballistics being used or not
// @todo, check ACE_AB is actually enabled
_windSpeed = if (isClass (configFile >> "CfgPatches" >> "ACE_Advanced_Ballistics")) then {
(eyePos ACE_player) call EFUNC(advanced_ballistics,calculateWindSpeed);
} else {
vectorMagnitude ACE_wind;
};
if (_windSpeed > 0.2) then {
_playerDir = getDir ACE_player;
_windDir = (ACE_wind select 0) atan2 (ACE_wind select 1);
_windIndex = round(((_playerDir - _windDir + 360) % 360) / 30);
_windIndex = _windIndex % 12;
};
// Color Codes from https://en.wikipedia.org/wiki/Beaufort_scale#Modern_scale
if (_windSpeed > 0.3) then { _windColor = [0.796, 1, 1, 1]; };
if (_windSpeed > 1.5) then { _windColor = [0.596, 0.996, 0.796, 1]; };
if (_windSpeed > 3.3) then { _windColor = [0.596, 0.996, 0.596, 1]; };
if (_windSpeed > 5.4) then { _windColor = [0.6, 0.996, 0.4, 1]; };
if (_windSpeed > 7.9) then { _windColor = [0.6, 0.996, 0.047, 1]; };
if (_windSpeed > 10.7) then { _windColor = [0.8, 0.996, 0.059, 1]; };
if (_windSpeed > 13.8) then { _windColor = [1, 0.996, 0.067, 1]; };
if (_windSpeed > 17.1) then { _windColor = [1, 0.796, 0.051, 1]; };
if (_windSpeed > 20.7) then { _windColor = [1, 0.596, 0.039, 1]; };
if (_windSpeed > 24.4) then { _windColor = [1, 0.404, 0.031, 1]; };
if (_windSpeed > 28.4) then { _windColor = [1, 0.22, 0.027, 1]; };
if (_windSpeed > 32.6) then { _windColor = [1, 0.078, 0.027, 1]; };
0 cutRsc ["RscWindIntuitive", "PLAIN", 1, false];
__ctrl ctrlSetScale 0.75;
__ctrl ctrlCommit 0;
__ctrl ctrlSetText format[QUOTE(PATHTOF(UI\wind%1.paa)), _windIndex];
__ctrl ctrlSetTextColor _windColor;
sleep 0.5;
};
GVAR(WindInfo) = false;
0 cutText ["", "PLAIN"];
};
true

View File

@ -11,6 +11,30 @@
*/
#include "script_component.hpp"
GVAR(Altitude) = getNumber(configFile >> "CfgWorlds" >> worldName >> "elevationOffset");
GVAR(Latitude) = getNumber(configFile >> "CfgWorlds" >> worldName >> "latitude");
if (worldName in ["Chernarus", "Bootcamp_ACR", "Woodland_ACR", "utes"]) then { GVAR(Latitude) = 50; GVAR(Altitude) = 0; };
if (worldName in ["Altis", "Stratis"]) then { GVAR(Latitude) = 40; GVAR(Altitude) = 0; };
if (worldName in ["Takistan", "Zargabad", "Mountains_ACR"]) then { GVAR(Latitude) = 35; GVAR(Altitude) = 2000; };
if (worldName in ["Shapur_BAF", "ProvingGrounds_PMC"]) then { GVAR(Latitude) = 35; GVAR(Altitude) = 100; };
if (worldName in ["fallujah"]) then { GVAR(Latitude) = 33; GVAR(Altitude) = 0; };
if (worldName in ["fata", "Abbottabad"]) then { GVAR(Latitude) = 30; GVAR(Altitude) = 1000; };
if (worldName in ["sfp_wamako"]) then { GVAR(Latitude) = 14; GVAR(Altitude) = 0; };
if (worldName in ["sfp_sturko"]) then { GVAR(Latitude) = 56; GVAR(Altitude) = 0; };
if (worldName in ["Bornholm"]) then { GVAR(Latitude) = 55; GVAR(Altitude) = 0; };
if (worldName in ["Imrali"]) then { GVAR(Latitude) = 40; GVAR(Altitude) = 0; };
if (worldName in ["Caribou"]) then { GVAR(Latitude) = 68; GVAR(Altitude) = 0; };
if (worldName in ["Namalsk"]) then { GVAR(Latitude) = 65; GVAR(Altitude) = 0; };
if (worldName in ["MCN_Aliabad"]) then { GVAR(Latitude) = 36; GVAR(Altitude) = 0; };
if (worldName in ["Clafghan"]) then { GVAR(Latitude) = 34; GVAR(Altitude) = 640; };
if (worldName in ["Sangin", "hellskitchen"]) then { GVAR(Latitude) = 32; GVAR(Altitude) = 0; };
if (worldName in ["Sara"]) then { GVAR(Latitude) = 40; GVAR(Altitude) = 0; };
if (worldName in ["reshmaan"]) then { GVAR(Latitude) = 35; GVAR(Altitude) = 2000; };
if (worldName in ["Thirsk"]) then { GVAR(Latitude) = 65; GVAR(Altitude) = 0; };
if (worldName in ["lingor"]) then { GVAR(Latitude) = -4; GVAR(Altitude) = 0; };
if (worldName in ["Panthera3"]) then { GVAR(Latitude) = 46; GVAR(Altitude) = 0; };
// Check if the weather data is defined in the map config
if (isArray (configFile >> "CfgWorlds" >> worldName >> "ACE_TempDay")) exitWith {
GVAR(TempDay) = getArray (configFile >> "CfgWorlds" >> worldName >> "ACE_TempDay");

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8" ?>
<Project name="ACE">
<Package name="Weather">
<Key ID="STR_ACE_Weather_WindInfoKey">
<English>Show Wind Info</English>
</Key>
</Package>
</Project>

View File

@ -576,33 +576,25 @@ See the make.cfg file for additional build options.
if build_tool == "pboproject":
try:
#PABST: Convert config (run the macro'd config.cpp through CfgConvert twice to produce a de-macro'd cpp that pboProject can read without fucking up:
os.chdir(os.path.join(arma3tools_path, "CfgConvert"))
shutil.copyfile(os.path.join(work_drive, prefix, module, "config.cpp"), os.path.join(work_drive, prefix, module, "config.backup"))
ret = subprocess.call(["cfgConvertGUI.exe", os.path.join(work_drive, prefix, module, "config.cpp")])
if ret != 0:
print_error("cfgConvertGUI (bin) return code == " + str(ret))
input("Press Enter to continue...")
#PABST: Need micro sleeps because cfgConvertGUI can return before it's finished procressing
time.sleep(0.05)
ret = subprocess.call(["cfgConvertGUI.exe", os.path.join(work_drive, prefix, module, "config.bin")])
if ret != 0:
print_error("cfgConvertGUI (txt) return code == " + str(ret))
input("Press Enter to continue...")
time.sleep(0.05)
#cmd = [rapifyTool, "-L", "-P", os.path.join(work_drive, prefix, module, "config.cpp")];
#ret = subprocess.call(cmd)
#if ret != 0:
# print_error("rapifyTool return code == " + str(ret) + str(cmd))
# input("Press Enter to continue...")
# Call pboProject
os.chdir("P:\\")
cmd = [os.path.join(work_drive, "CfgConvert", "CfgConvert.exe"), "-bin", "-dst", os.path.join(work_drive, prefix, module, "config.bin"), os.path.join(work_drive, prefix, module, "config.cpp")]
ret = subprocess.call(cmd)
#ret = subprocess.call(["cfgConvertGUI.exe", os.path.join(work_drive, prefix, module, "config.cpp")])
if ret != 0:
print_error("CfgConvert -bin return code == " + str(ret))
input("Press Enter to continue...")
cmd = [os.path.join(work_drive, "CfgConvert", "CfgConvert.exe"), "-txt", "-dst", os.path.join(work_drive, prefix, module, "config.cpp"), os.path.join(work_drive, prefix, module, "config.bin")]
ret = subprocess.call(cmd)
if ret != 0:
print_error("CfgConvert -txt) return code == " + str(ret))
input("Press Enter to continue...")
if os.path.isfile(os.path.join(work_drive, prefix, module, "$NOBIN$")):
print_green("$NOBIN$ Found. Proceeding with non-binarizing!")
cmd = [makepboTool, "-P","-A","-L","-N","-G", os.path.join(work_drive, prefix, module),os.path.join(module_root, release_dir, project,"Addons")]