diff --git a/ace_advanced_ballistics.dll b/ace_advanced_ballistics.dll new file mode 100644 index 0000000000..568e7c16db Binary files /dev/null and b/ace_advanced_ballistics.dll differ diff --git a/ace_fcs.dll b/ace_fcs.dll index 2cb8b86de2..3385e53463 100644 Binary files a/ace_fcs.dll and b/ace_fcs.dll differ diff --git a/addons/advanced_ballistics/ACE_Settings.hpp b/addons/advanced_ballistics/ACE_Settings.hpp new file mode 100644 index 0000000000..d1462b144f --- /dev/null +++ b/addons/advanced_ballistics/ACE_Settings.hpp @@ -0,0 +1,64 @@ +class ACE_Settings { + class GVAR(enabled) { + displayName = "Advanced Ballistics"; + description = "Enables advanced ballistics"; + typeName = "BOOL"; + value = 0; + }; + class GVAR(alwaysSimulateForSnipers) { + displayName = "Always Enabled For Snipers"; + description = "Always enables advanced ballistics when high power optics are used"; + typeName = "BOOL"; + value = 1; + }; + class GVAR(disabledInFullAutoMode) { + displayName = "Disabled In FullAuto Mode"; + description = "Disables the advanced ballistics during full auto fire"; + typeName = "BOOL"; + value = 0; + }; + class GVAR(onlyActiveForLocalPlayers) { + displayName = "Disabled For Non Local Players"; + description = "Disables the advanced ballistics for bullets coming from other players (enable this if you encounter frame drops during heavy firefights in multiplayer)"; + typeName = "BOOL"; + value = 1; + }; + /* // TODO: We currently do not have firedEHs on vehicles + class GVAR(vehicleGunnerEnabled) { + displayName = "Enabled For Vehicle Gunners"; + description = "Enables advanced ballistics for vehicle gunners"; + typeName = "BOOL"; + value = 0; + }; + */ + class GVAR(ammoTemperatureEnabled) { + displayName = "Enable Ammo Temperature Simulation"; + description = "Muzzle velocity varies with ammo temperature"; + typeName = "BOOL"; + value = 1; + }; + class GVAR(barrelLengthInfluenceEnabled) { + displayName = "Enable Barrel Length Simulation"; + description = "Muzzle velocity varies with barrel length"; + typeName = "BOOL"; + value = 1; + }; + class GVAR(bulletTraceEnabled) { + displayName = "Enable Bullet Trace Effect"; + description = "Enables a bullet trace effect to high caliber bullets (only visible when looking through high power optics)"; + typeName = "BOOL"; + value = 1; + }; + class GVAR(simulationInterval) { + displayName = "Simulation Interval"; + description = "Defines the interval between every calculation step"; + typeName = "SCALAR"; + value = 0.0; + }; + class GVAR(simulationRadius) { + displayName = "Simulation Radius"; + description = "Defines the radius (in meters) in which advanced ballistics are applied"; + typeName = "SCALAR"; + value = 3000; + }; +}; diff --git a/addons/advanced_ballistics/CfgEventHandlers.hpp b/addons/advanced_ballistics/CfgEventHandlers.hpp new file mode 100644 index 0000000000..cc1414eb8f --- /dev/null +++ b/addons/advanced_ballistics/CfgEventHandlers.hpp @@ -0,0 +1,19 @@ +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_preInit) ); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_postInit) ); + }; +}; + +class Extended_FiredBIS_EventHandlers { + class CAManBase { + class ADDON { + firedBIS = QUOTE(_this call FUNC(handleFired)); + }; + }; +}; \ No newline at end of file diff --git a/addons/advanced_ballistics/CfgVehicles.hpp b/addons/advanced_ballistics/CfgVehicles.hpp new file mode 100644 index 0000000000..8e6e40e21e --- /dev/null +++ b/addons/advanced_ballistics/CfgVehicles.hpp @@ -0,0 +1,78 @@ +class CfgVehicles { + class ACE_Module; + class GVAR(ModuleSettings): ACE_Module { + scope = 2; + displayName = "Advanced Ballistics"; + icon = QUOTE(PATHTOF(UI\Icon_Module_Wind_ca.paa)); + category = "ACE"; + function = QUOTE(DFUNC(initModuleSettings)); + functionPriority = 1; + isGlobal = 1; + isTriggerActivated = 0; + author = "Ruthberg"; + class Arguments { + class enabled { + displayName = "Advanced Ballistics"; + description = "Enables advanced ballistics"; + typeName = "BOOL"; + defaultValue = 0; + }; + class alwaysSimulateForSnipers { + displayName = "Always Enabled For Snipers"; + description = "Always enables advanced ballistics when high power optics are used"; + typeName = "BOOL"; + defaultValue = 1; + }; + class disabledInFullAutoMode { + displayName = "Disabled In FullAuto Mode"; + description = "Disables the advanced ballistics during full auto fire"; + typeName = "BOOL"; + defaultValue = 0; + }; + class onlyActiveForLocalPlayers { + displayName = "Disabled For Non Local Players"; + description = "Disables the advanced ballistics for bullets coming from other players (enable this if you encounter frame drops during heavy firefights in multiplayer)"; + typeName = "BOOL"; + defaultValue = 1; + }; + /* // TODO: We currently do not have firedEHs on vehicles + class vehicleGunnerEnabled { + displayName = "Enabled For Vehicle Gunners"; + description = "Enables advanced ballistics for vehicle gunners"; + typeName = "BOOL"; + defaultValue = 0; + }; + */ + class ammoTemperatureEnabled { + displayName = "Enable Ammo Temperature Simulation"; + description = "Muzzle velocity varies with ammo temperature"; + typeName = "BOOL"; + defaultValue = 1; + }; + class barrelLengthInfluenceEnabled { + displayName = "Enable Barrel Length Simulation"; + description = "Muzzle velocity varies with barrel length"; + typeName = "BOOL"; + defaultValue = 1; + }; + class bulletTraceEnabled { + displayName = "Enable Bullet Trace Effect"; + description = "Enables a bullet trace effect to high caliber bullets (only visible when looking through high power optics)"; + typeName = "BOOL"; + defaultValue = 1; + }; + class simulationInterval { + displayName = "Simulation Interval"; + description = "Defines the interval between every calculation step"; + typeName = "NUMBER"; + defaultValue = 0.0; + }; + class simulationRadius { + displayName = "Simulation Radius"; + description = "Defines the radius (in meters) in which advanced ballistics are applied"; + typeName = "NUMBER"; + defaultValue = 3000; + }; + }; + }; +}; diff --git a/addons/advanced_ballistics/README.md b/addons/advanced_ballistics/README.md new file mode 100644 index 0000000000..ef98bcd2b6 --- /dev/null +++ b/addons/advanced_ballistics/README.md @@ -0,0 +1,10 @@ +ace_advanced_ballistics +=============== + +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. + +- [Ruthberg] (http://github.com/Ulteq) \ No newline at end of file diff --git a/addons/advanced_ballistics/RscTitles.hpp b/addons/advanced_ballistics/RscTitles.hpp new file mode 100644 index 0000000000..b62af875d2 --- /dev/null +++ b/addons/advanced_ballistics/RscTitles.hpp @@ -0,0 +1,63 @@ +class RscTitles +{ + class RscTurretDial + { + idd=-1; + onLoad="with uiNameSpace do { RscTurretDial = _this select 0 };"; + movingEnable=0; + duration=5; + fadeIn="false"; + fadeOut="false"; + class controls + { + class RscTurretDial + { + idc=132949; + type=0; + style=128; + font="TahomaB"; + colorBackground[]={0,0,0,0.8}; + colorText[]={1,1,1,1}; + x="SafeZoneX + 0.0025"; + y="SafeZoneY + 0.0025"; + w=0.10; + h=0.05; + sizeEx=0.03; + text=""; + }; + }; + }; + + class RscProtractor + { + idd=-1; + onLoad="with uiNameSpace do { RscProtractor = _this select 0 };"; + movingEnable=0; + duration=60; + fadeIn="false"; + fadeOut="false"; + class controls + { + class RscProtractorBase + { + idc=132950; + type=0; + style=48; + font="TahomaB"; + colorBackground[]={0,0,0,0}; + colorText[]={1,1,1,1}; + x="SafeZoneX + 0.001"; + y="SafeZoneY + 0.001"; + w=0.2; + h=0.2*4/3; + size=0.034; + sizeEx=0.027; + text=""; + }; + class RscProtractorMarker : RscProtractorBase + { + idc=132951; + }; + }; + }; +}; \ No newline at end of file diff --git a/addons/advanced_ballistics/UI/Icon_Module_Wind_ca.paa b/addons/advanced_ballistics/UI/Icon_Module_Wind_ca.paa new file mode 100644 index 0000000000..176fe700a7 Binary files /dev/null and b/addons/advanced_ballistics/UI/Icon_Module_Wind_ca.paa differ diff --git a/addons/advanced_ballistics/UI/protractor.paa b/addons/advanced_ballistics/UI/protractor.paa new file mode 100644 index 0000000000..1114b41826 Binary files /dev/null and b/addons/advanced_ballistics/UI/protractor.paa differ diff --git a/addons/advanced_ballistics/UI/protractor_marker.paa b/addons/advanced_ballistics/UI/protractor_marker.paa new file mode 100644 index 0000000000..a97be42a73 Binary files /dev/null and b/addons/advanced_ballistics/UI/protractor_marker.paa differ diff --git a/addons/advanced_ballistics/XEH_postInit.sqf b/addons/advanced_ballistics/XEH_postInit.sqf new file mode 100644 index 0000000000..783a5be569 --- /dev/null +++ b/addons/advanced_ballistics/XEH_postInit.sqf @@ -0,0 +1,45 @@ +#include "script_component.hpp" + +#include "initKeybinds.sqf" + +GVAR(currentbulletID) = -1; + +GVAR(bulletDatabase) = []; +GVAR(bulletDatabaseStartTime) = []; +GVAR(bulletDatabaseSpeed) = []; +GVAR(bulletDatabaseFrames) = []; +GVAR(bulletDatabaseLastFrame) = []; +GVAR(bulletDatabaseHDeflect) = []; +GVAR(bulletDatabaseSpinDrift) = []; +GVAR(bulletDatabaseOccupiedIndices) = []; +GVAR(bulletDatabaseFreeIndices) = []; + +GVAR(WindInfo) = false; +GVAR(WindInfoStart) = time; + +GVAR(Protractor) = false; +GVAR(ProtractorStart) = time; + +// Those are only used in the pure sqf version (extension free PFH) +GVAR(SimulationPrecision) = 2; +GVAR(WindEnabled) = true; +GVAR(SpinDriftEnabled) = true; +GVAR(CoriolisEnabled) = true; +GVAR(EoetvoesEnabled) = true; +GVAR(AdvancedAirDragEnabled) = true; +GVAR(TransonicRegionEnabled) = true; +GVAR(AtmosphericDensitySimulationEnabled) = true; + +GVAR(currentGrid) = 0; +GVAR(INIT_MESSAGE_ENABLED) = false; + +GVAR(extensionAvailable) = "ace_advanced_ballistics" callExtension "version" == "1.0"; +if (!GVAR(extensionAvailable)) exitWith { + if ("ace_advanced_ballistics" callExtension "version" == "") then { + diag_log text "[ACE] ERROR: ace_advanced_ballistics.dll is missing"; + } else { + diag_log text "[ACE] ERROR: ace_advanced_ballistics.dll is incompatible"; + }; +}; + +[] call FUNC(initializeTerrainExtension); diff --git a/addons/advanced_ballistics/XEH_preInit.sqf b/addons/advanced_ballistics/XEH_preInit.sqf new file mode 100644 index 0000000000..b58a2b88e8 --- /dev/null +++ b/addons/advanced_ballistics/XEH_preInit.sqf @@ -0,0 +1,18 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP(calculateAirDensity); +PREP(calculateAmmoTemperatureVelocityShift); +PREP(calculateAtmosphericCorrection); +PREP(calculateBarrelLengthVelocityShift); +PREP(calculateRetardation); +PREP(calculateRoughnessLength); +PREP(calculateStabilityFactor); +PREP(calculateWindSpeed); +PREP(displayProtractor); +PREP(handleFired); +PREP(initializeTerrainExtension); +PREP(initModuleSettings); + +ADDON = true; diff --git a/addons/advanced_ballistics/config.cpp b/addons/advanced_ballistics/config.cpp new file mode 100644 index 0000000000..32f1406a07 --- /dev/null +++ b/addons/advanced_ballistics/config.cpp @@ -0,0 +1,18 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_ballistics", "ace_weather", "ace_modules"}; + author[] = {"Ruthberg"}; + authorUrl = "https://github.com/ulteq"; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" +#include "RscTitles.hpp" +#include "ACE_Settings.hpp" \ No newline at end of file diff --git a/addons/advanced_ballistics/functions/defines.h b/addons/advanced_ballistics/functions/defines.h new file mode 100644 index 0000000000..0aecbca287 --- /dev/null +++ b/addons/advanced_ballistics/functions/defines.h @@ -0,0 +1,11 @@ +#define GRAVITY 9.80665 +#define ABSOLUTE_ZERO_IN_CELSIUS -273.15 +#define KELVIN(t) (t - ABSOLUTE_ZERO_IN_CELSIUS) +#define CELSIUS(t) (t + ABSOLUTE_ZERO_IN_CELSIUS) +#define UNIVERSAL_GAS_CONSTANT 8.314 +#define WATER_VAPOR_MOLAR_MASS 0.018016 +#define DRY_AIR_MOLAR_MASS 0.028964 +#define SPECIFIC_GAS_CONSTANT_DRY_AIR 287.058 +#define STD_AIR_DENSITY_ICAO 1.22498 +#define STD_AIR_DENSITY_ASM 1.20885 +#define GET_TEMPERATURE_AT_HEIGHT(h) (EGVAR(weather,currentTemperature) - 0.0065 * (h)) \ No newline at end of file diff --git a/addons/advanced_ballistics/functions/fnc_calculateAirDensity.sqf b/addons/advanced_ballistics/functions/fnc_calculateAirDensity.sqf new file mode 100644 index 0000000000..73ebc0f94a --- /dev/null +++ b/addons/advanced_ballistics/functions/fnc_calculateAirDensity.sqf @@ -0,0 +1,37 @@ +/* + * Author: Ruthberg + * + * Displays a wind info (colored arrow) in the top left corner of the screen + * + * Arguments: + * 0: temperature - degrees celcius + * 1: pressure - hPa + * 2: relativeHumidity - value between 0.0 and 1.0 + * + * Return Value: + * 0: density of air - kg * m^(-3) + * + * Return value: + * None + */ +#include "script_component.hpp" +#include "defines.h" + +private ["_temperature", "_pressure", "_relativeHumidity"]; +_temperature = _this select 0; // in C +_pressure = _this select 1; // in hPa +_relativeHumidity = _this select 2; // as ratio 0-1 + +_pressure = _pressure * 100; + +if (_relativeHumidity > 0) then { + private ["_pSat", "_vaporPressure", "_partialPressure"]; + // Saturation vapor pressure calculated according to: http://wahiduddin.net/calc/density_algorithms.htm + _pSat = 6.1078 * 10 ^ ((7.5 * _temperature) / (_temperature + 237.3)); + _vaporPressure = _relativeHumidity * _pSat; + _partialPressure = _pressure - _vaporPressure; + + (_partialPressure * DRY_AIR_MOLAR_MASS + _vaporPressure * WATER_VAPOR_MOLAR_MASS) / (UNIVERSAL_GAS_CONSTANT * KELVIN(_temperature)) +} else { + _pressure / (SPECIFIC_GAS_CONSTANT_DRY_AIR * KELVIN(_temperature)) +}; diff --git a/addons/advanced_ballistics/functions/fnc_calculateAmmoTemperatureVelocityShift.sqf b/addons/advanced_ballistics/functions/fnc_calculateAmmoTemperatureVelocityShift.sqf new file mode 100644 index 0000000000..c92e679a66 --- /dev/null +++ b/addons/advanced_ballistics/functions/fnc_calculateAmmoTemperatureVelocityShift.sqf @@ -0,0 +1,42 @@ +/* + * Author: Ruthberg + * + * Calculates the ammo temperature induced muzzle velocity shift + * + * Arguments: + * 0: ammo - classname + * 1: temperature - degrees celcius + * + * Return Value: + * 0: muzzle velocity shift - m/s + * + * Return value: + * None + */ +#include "script_component.hpp" + +private ["_ammo", "_temperature", "_muzzleVelocityTable", "_muzzleVelocityShift", "_temperatureIndexA", "_temperatureIndexB", "_temperatureRatio"]; +_ammo = _this select 0; +_temperature = _this select 1; + +_muzzleVelocityTable = []; + +if (isArray(configFile >> "cfgAmmo" >> _ammo >> "ACE_ammoTempMuzzleVelocityShifts")) then { + _muzzleVelocityTable = getArray(configFile >> "cfgAmmo" >> _ammo >> "ACE_ammoTempMuzzleVelocityShifts"); +}; + +if (count _muzzleVelocityTable != 11) exitWith { 0 }; + +_temperatureIndexA = floor((_temperature + 15) / 5); +_temperatureIndexA = 0 max _temperatureIndexA; +_temperatureIndexA = _temperatureIndexA min 10; + +_temperatureIndexB = ceil((_temperature + 15) / 5); +_temperatureIndexB = 0 max _temperatureIndexB; +_temperatureIndexB = _temperatureIndexB min 10; + +_temperatureRatio = ((_temperature + 15) / 5) - floor((_temperature + 15) / 5); + +_muzzleVelocityShift = (_muzzleVelocityTable select _temperatureIndexA) * (1 - _temperatureRatio) + (_muzzleVelocityTable select _temperatureIndexB) * _temperatureRatio; + +_muzzleVelocityShift diff --git a/addons/advanced_ballistics/functions/fnc_calculateAtmosphericCorrection.sqf b/addons/advanced_ballistics/functions/fnc_calculateAtmosphericCorrection.sqf new file mode 100644 index 0000000000..0bd6ae6001 --- /dev/null +++ b/addons/advanced_ballistics/functions/fnc_calculateAtmosphericCorrection.sqf @@ -0,0 +1,34 @@ +/* + * Author: Ruthberg + * + * Calculates the atmospherically corrected ballistic coefficient + * + * Arguments: + * 0: ballistic coefficient - G1-G7 + * 1: temperature - degrees celcius + * 2: pressure - hPa + * 3: relativeHumidity - value between 0.0 and 1.0 + * 4: atmosphereModel - ICAO or ASM + * + * Return Value: + * corrected ballistic coefficient + * + * Public: No + */ +#include "script_component.hpp" +#include "defines.h" + +private ["_ballisticCoefficient", "_temperature", "_pressure", "_relativeHumidity", "_atmosphereModel", "_airDensity"]; +_ballisticCoefficient = _this select 0; +_temperature = _this select 1; // in C +_pressure = _this select 2; // in hPa +_relativeHumidity = _this select 3; // as ratio 0-1 +_atmosphereModel = _this select 4; // "ICAO" or "ASM" + +_airDensity = [_temperature, _pressure, _relativeHumidity] call FUNC(calculateAirDensity); + +if (_atmosphereModel == "ICAO") then { + (STD_AIR_DENSITY_ICAO / _airDensity) * _ballisticCoefficient +} else { + (STD_AIR_DENSITY_ASM / _airDensity) * _ballisticCoefficient +}; diff --git a/addons/advanced_ballistics/functions/fnc_calculateBarrelLengthVelocityShift.sqf b/addons/advanced_ballistics/functions/fnc_calculateBarrelLengthVelocityShift.sqf new file mode 100644 index 0000000000..b4cbd5bdc0 --- /dev/null +++ b/addons/advanced_ballistics/functions/fnc_calculateBarrelLengthVelocityShift.sqf @@ -0,0 +1,66 @@ +/* + * Author: Ruthberg + * + * Calculates the muzzle velocity shift caused by different barrel lengths + * + * Arguments: + * 0: ammo - classname + * 0: weapon - classname + * 1: muzzle velocity - m/s + * + * Return Value: + * 0: muzzle velocity shift - m/s + * + * Return value: + * None + */ +#include "script_component.hpp" + +private ["_ammo", "_weapon", "_barrelLength", "_muzzleVelocityTable", "_barrelLengthTable", "_muzzleVelocity", "_lowerIndex", "_upperIndex", "_barrelLengthRatio", "_muzzleVelocityNew"]; +_ammo = _this select 0; +_weapon = _this select 1; +_muzzleVelocity = _this select 2; + +_barrelLength = getNumber(configFile >> "cfgWeapons" >> _weapon >> "ACE_barrelLength"); + +if (_barrelLength == 0) exitWith { 0 }; + +_muzzleVelocityTable = []; +_barrelLengthTable = []; + +if (isArray(configFile >> "cfgAmmo" >> _ammo >> "ACE_muzzleVelocities")) then { + _muzzleVelocityTable = getArray(configFile >> "cfgAmmo" >> _ammo >> "ACE_muzzleVelocities"); +}; +if (isArray(configFile >> "cfgAmmo" >> _ammo >> "ACE_barrelLengths")) then { + _barrelLengthTable = getArray(configFile >> "cfgAmmo" >> _ammo >> "ACE_barrelLengths"); +}; + +if (count _muzzleVelocityTable != count _barrelLengthTable) exitWith { 0 }; +if (count _muzzleVelocityTable == 0 || count _barrelLengthTable == 0) exitWith { 0 }; +if (count _muzzleVelocityTable == 1) exitWith { (_muzzleVelocityTable select 0) - _muzzleVelocity }; + +_lowerIndex = 0; +_upperIndex = (count _barrelLengthTable) - 1; + +if (_barrelLength <= (_barrelLengthTable select _lowerIndex)) exitWith { (_muzzleVelocityTable select _lowerIndex) - _muzzleVelocity }; +if (_barrelLength >= (_barrelLengthTable select _upperIndex)) exitWith { (_muzzleVelocityTable select _upperIndex) - _muzzleVelocity }; + +for "_i" from 0 to (count _barrelLengthTable) - 1 do { + if (_barrelLength >= _barrelLengthTable select _i) then { + _lowerIndex = _i; + }; +}; +for "_i" from (count _barrelLengthTable) - 1 to 0 step -1 do { + if (_barrelLength <= _barrelLengthTable select _i) then { + _upperIndex = _i; + }; +}; + +_barrelLengthRatio = 0; +if ((_barrelLengthTable select _upperIndex) - (_barrelLengthTable select _lowerIndex) > 0) then { + _barrelLengthRatio = ((_barrelLengthTable select _upperIndex) - _barrelLength) / ((_barrelLengthTable select _upperIndex) - (_barrelLengthTable select _lowerIndex)); +}; + +_muzzleVelocityNew = (_muzzleVelocityTable select _lowerIndex) + ((_muzzleVelocityTable select _upperIndex) - (_muzzleVelocityTable select _lowerIndex)) * (1 - _barrelLengthRatio); + +_muzzleVelocityNew - _muzzleVelocity diff --git a/addons/advanced_ballistics/functions/fnc_calculateRetardation.sqf b/addons/advanced_ballistics/functions/fnc_calculateRetardation.sqf new file mode 100644 index 0000000000..433dafbe10 --- /dev/null +++ b/addons/advanced_ballistics/functions/fnc_calculateRetardation.sqf @@ -0,0 +1,145 @@ +/* + * Author: Ruthberg + * + * Calculates the retardation of the bullet + * + * Arguments: + * 0: drag model - 1-7 + * 1: drag coefficient - bc + * 2: velocity - m/s + * + * Return Value: + * 0: retardation - m/(s^2) + * + * Return value: + * None + */ +#include "script_component.hpp" + +// Source: GNU Exterior Ballistics + +private ["_dragModel", "_dragCoefficient", "_velocity", "_A", "_M", "_result"]; +_dragModel = _this select 0; +_dragCoefficient = _this select 1; +_velocity = (_this select 2) * 3.2808399; + +_A = -1; +_M = -1; +_result = 0; + +switch _dragModel do { + case 1: + { + switch true do { + case (_velocity > 4230) : { _A = 0.0001477404177730177; _M = 1.9565; }; + case (_velocity > 3680) : { _A = 0.0001920339268755614; _M = 1.925 ; }; + case (_velocity > 3450) : { _A = 0.0002894751026819746; _M = 1.875 ; }; + case (_velocity > 3295) : { _A = 0.0004349905111115636; _M = 1.825 ; }; + case (_velocity > 3130) : { _A = 0.0006520421871892662; _M = 1.775 ; }; + case (_velocity > 2960) : { _A = 0.0009748073694078696; _M = 1.725 ; }; + case (_velocity > 2830) : { _A = 0.001453721560187286; _M = 1.675 ; }; + case (_velocity > 2680) : { _A = 0.002162887202930376; _M = 1.625 ; }; + case (_velocity > 2460) : { _A = 0.003209559783129881; _M = 1.575 ; }; + case (_velocity > 2225) : { _A = 0.003904368218691249; _M = 1.55 ; }; + case (_velocity > 2015) : { _A = 0.003222942271262336; _M = 1.575 ; }; + case (_velocity > 1890) : { _A = 0.002203329542297809; _M = 1.625 ; }; + case (_velocity > 1810) : { _A = 0.001511001028891904; _M = 1.675 ; }; + case (_velocity > 1730) : { _A = 0.0008609957592468259; _M = 1.75 ; }; + case (_velocity > 1595) : { _A = 0.0004086146797305117; _M = 1.85 ; }; + case (_velocity > 1520) : { _A = 0.0001954473210037398; _M = 1.95 ; }; + case (_velocity > 1420) : { _A = 0.00005431896266462351; _M = 2.125 ; }; + case (_velocity > 1360) : { _A = 0.000008847742581674416; _M = 2.375 ; }; + case (_velocity > 1315) : { _A = 0.000001456922328720298; _M = 2.625 ; }; + case (_velocity > 1280) : { _A = 0.0000002419485191895565; _M = 2.875 ; }; + case (_velocity > 1220) : { _A = 0.00000001657956321067612; _M = 3.25 ; }; + case (_velocity > 1185) : { _A = 0.0000000004745469537157371; _M = 3.75 ; }; + case (_velocity > 1150) : { _A = 0.00000000001379746590025088; _M = 4.25 ; }; + case (_velocity > 1100) : { _A = 0.0000000000004070157961147882; _M = 4.75 ; }; + case (_velocity > 1060) : { _A = 0.00000000000002938236954847331; _M = 5.125 ; }; + case (_velocity > 1025) : { _A = 0.00000000000001228597370774746; _M = 5.25 ; }; + case (_velocity > 980) : { _A = 0.00000000000002916938264100495; _M = 5.125 ; }; + case (_velocity > 945) : { _A = 0.0000000000003855099424807451; _M = 4.75 ; }; + case (_velocity > 905) : { _A = 0.00000000001185097045689854; _M = 4.25 ; }; + case (_velocity > 860) : { _A = 0.0000000003566129470974951; _M = 3.75 ; }; + case (_velocity > 810) : { _A = 0.00000001045513263966272; _M = 3.25 ; }; + case (_velocity > 780) : { _A = 0.0000001291159200846216; _M = 2.875 ; }; + case (_velocity > 750) : { _A = 0.0000006824429329105383; _M = 2.625 ; }; + case (_velocity > 700) : { _A = 0.000003569169672385163; _M = 2.375 ; }; + case (_velocity > 640) : { _A = 0.00001839015095899579; _M = 2.125 ; }; + case (_velocity > 600) : { _A = 0.00005711174688734240; _M = 1.950 ; }; + case (_velocity > 550) : { _A = 0.00009226557091973427; _M = 1.875 ; }; + case (_velocity > 250) : { _A = 0.00009337991957131389; _M = 1.875 ; }; + case (_velocity > 100) : { _A = 0.00007225247327590413; _M = 1.925 ; }; + case (_velocity > 65) : { _A = 0.00005792684957074546; _M = 1.975 ; }; + case (_velocity > 0) : { _A = 0.00005206214107320588; _M = 2.000 ; }; + }; + }; + case 2: + { + switch true do { + case (_velocity > 1674) : { _A = 0.0079470052136733; _M = 1.36999902851493; }; + case (_velocity > 1172) : { _A = 0.00100419763721974; _M = 1.65392237010294; }; + case (_velocity > 1060) : { _A = 0.0000000000000000000000715571228255369; _M = 7.91913562392361; }; + case (_velocity > 949) : { _A = 0.000000000139589807205091; _M = 3.81439537623717; }; + case (_velocity > 670) : { _A = 0.000234364342818625; _M = 1.71869536324748; }; + case (_velocity > 335) : { _A = 0.000177962438921838; _M = 1.76877550388679; }; + case (_velocity > 0) : { _A = 0.0000518033561289704; _M = 1.98160270524632; }; + }; + }; + case 5: + { + switch true do { + case (_velocity > 1730) : { _A = 0.00724854775171929; _M = 1.41538574492812; }; + case (_velocity > 1228) : { _A = 0.0000350563361516117; _M = 2.13077307854948; }; + case (_velocity > 1116) : { _A = 0.000000000000184029481181151; _M = 4.81927320350395; }; + case (_velocity > 1004) : { _A = 0.000000000000000000000134713064017409; _M = 7.8100555281422 ; }; + case (_velocity > 837) : { _A = 0.000000103965974081168; _M = 2.84204791809926; }; + case (_velocity > 335) : { _A = 0.0001093015938698234; _M = 1.81096361579504; }; + case (_velocity > 0) : { _A = 0.0000351963178524273; _M = 2.00477856801111; }; + }; + }; + case 6: + { + switch true do { + case (_velocity > 3236) : { _A = 0.0455384883480781; _M = 1.15997674041274; }; + case (_velocity > 2065) : { _A = 0.07167261849653769; _M = 1.10704436538885; }; + case (_velocity > 1311) : { _A = 0.00166676386084348; _M = 1.60085100195952; }; + case (_velocity > 1144) : { _A = 0.000000101482730119215; _M = 2.9569674731838 ; }; + case (_velocity > 1004) : { _A = 0.00000000000000000431542773103552; _M = 6.34106317069757; }; + case (_velocity > 670) : { _A = 0.0000204835650496866; _M = 2.11688446325998; }; + case (_velocity > 0) : { _A = 0.0000750912466084823; _M = 1.92031057847052; }; + }; + }; + case 7: + { + switch true do { + case (_velocity > 4200) : { _A = 0.00000000129081656775919; _M = 3.24121295355962; }; + case (_velocity > 3000) : { _A = 0.0171422231434847; _M = 1.27907168025204; }; + case (_velocity > 1470) : { _A = 0.00233355948302505; _M = 1.52693913274526; }; + case (_velocity > 1260) : { _A = 0.000797592111627665; _M = 1.67688974440324; }; + case (_velocity > 1110) : { _A = 0.00000000000571086414289273; _M = 4.3212826264889 ; }; + case (_velocity > 960) : { _A = 0.0000000000000000302865108244904; _M = 5.99074203776707; }; + case (_velocity > 670) : { _A = 0.00000752285155782535; _M = 2.1738019851075 ; }; + case (_velocity > 540) : { _A = 0.0000131766281225189; _M = 2.08774690257991; }; + case (_velocity > 0) : { _A = 0.0000134504843776525; _M = 2.08702306738884; }; + }; + }; + case 8: + { + switch true do { + case (_velocity > 3571) : { _A = 0.0112263766252305; _M = 1.33207346655961; }; + case (_velocity > 1841) : { _A = 0.0167252613732636; _M = 1.28662041261785; }; + case (_velocity > 1120) : { _A = 0.00220172456619625; _M = 1.55636358091189; }; + case (_velocity > 1088) : { _A = 0.00000000000000020538037167098; _M = 5.80410776994789; }; + case (_velocity > 976) : { _A = 0.00000000000592182174254121; _M = 4.29275576134191; }; + case (_velocity > 0) : { _A = 0.000043917343795117; _M = 1.99978116283334; }; + }; + }; +}; + +if (_A != -1 && _M != -1 && _velocity > 0 && _velocity < 10000) then { + _result = _A * (_velocity ^ _M) / _dragCoefficient; + _result = _result / 3.2808399; +}; + +_result diff --git a/addons/advanced_ballistics/functions/fnc_calculateRoughnessLength.sqf b/addons/advanced_ballistics/functions/fnc_calculateRoughnessLength.sqf new file mode 100644 index 0000000000..08ae44cc74 --- /dev/null +++ b/addons/advanced_ballistics/functions/fnc_calculateRoughnessLength.sqf @@ -0,0 +1,34 @@ +/* + * Author: Ruthberg + * + * Calculates the terrain roughness length at a given world position + * + * Arguments: + * 0: _this - world position + * + * Return Value: + * 0: roughness length + * + * Public: No + */ +#include "script_component.hpp" + +private ["_roughness_lengths", "_windSource", "_nearBuildings", "_isWater"]; + +// Source: http://es.ucsc.edu/~jnoble/wind/extrap/index.html +_roughness_lengths = [0.0002, 0.0005, 0.0024, 0.03, 0.055, 0.1, 0.2, 0.4, 0.8, 1.6]; + +_windSource = _this vectorDiff ((vectorNormalized ACE_wind) vectorMultiply 25); + +_nearBuildings = count (_windSource nearObjects ["Building", 50]); +_isWater = surfaceIsWater _windSource; + +if (_nearBuildings == 0 && _isWater) exitWith { + 0.0005 +}; + +if (_nearBuildings >= 10) exitWith { + 1.6 +}; + +_roughness_lengths select (2 + (_nearBuildings min 6)) diff --git a/addons/advanced_ballistics/functions/fnc_calculateStabilityFactor.sqf b/addons/advanced_ballistics/functions/fnc_calculateStabilityFactor.sqf new file mode 100644 index 0000000000..81b71aeb3b --- /dev/null +++ b/addons/advanced_ballistics/functions/fnc_calculateStabilityFactor.sqf @@ -0,0 +1,45 @@ +/* + * Author: Ruthberg + * + * Calculates the stability factor of a bullet + * + * Arguments: + * 0: caliber - inches + * 1: bullet length - inches + * 2: bullet mass - grains + * 3: barrel twist - inches + * 4: muzzle velocity shift - m/s + * 5: temperature - degrees celcius + * 6: barometric Pressure - hPA + * + * Return Value: + * 0: stability factor + * + * Public: No + */ + +private ["_caliber", "_bulletLength", "_bulletMass", "_barrelTwist", "_muzzleVelocity", "_temperature", "_barometricPressure", "_l", "_t", "_stabilityFactor"]; +_caliber = _this select 0; +_bulletLength = _this select 1; +_bulletMass = _this select 2; +_barrelTwist = _this select 3; +_muzzleVelocity = _this select 4; +_temperature = _this select 5; +_barometricPressure = _this select 6; + +// Source: http://www.jbmballistics.com/ballistics/bibliography/articles/miller_stability_1.pdf +_t = _barrelTwist / _caliber; +_l = _bulletLength / _caliber; + +_stabilityFactor = 30 * _bulletMass / (_t^2 * _caliber^3 * _l * (1 + _l^2)); + +_muzzleVelocity = _muzzleVelocity * 3.2808399; +if (_muzzleVelocity > 1120) then { + _stabilityFactor = _stabilityFactor * (_muzzleVelocity / 2800) ^ (1/3); +} else { + _stabilityFactor = _stabilityFactor * (_muzzleVelocity / 1120) ^ (1/3); +}; + +_stabilityFactor = _stabilityFactor * (_temperature + 273) / (15 + 273) * 1013.25 / _barometricPressure; + +_stabilityFactor diff --git a/addons/advanced_ballistics/functions/fnc_calculateWindSpeed.sqf b/addons/advanced_ballistics/functions/fnc_calculateWindSpeed.sqf new file mode 100644 index 0000000000..e7b0a322e8 --- /dev/null +++ b/addons/advanced_ballistics/functions/fnc_calculateWindSpeed.sqf @@ -0,0 +1,78 @@ +/* + * Author: Ruthberg + * + * Calculates the true wind speed at a given world position + * + * Arguments: + * 0: _this - world position + * + * Return Value: + * 0: wind speed - m/s + * + * Public: No + */ +#include "script_component.hpp" + +private ["_windSpeed", "_windDir", "_height", "_newWindSpeed", "_windSource", "_roughnessLength"]; + +fnc_polar2vect = { + private ["_mag2D"]; + _mag2D = (_this select 0) * cos((_this select 2)); + [_mag2D * sin((_this select 1)), _mag2D * cos((_this select 1)), (_this select 0) * sin((_this select 2))]; +}; + +_windSpeed = vectorMagnitude ACE_wind; +_windDir = (ACE_wind select 0) atan2 (ACE_wind select 1); + +// Wind gradient +if (_windSpeed > 0.05) then { + _height = (ASLToATL _this) select 2; + _height = 0 max _height min 20; + if (_height < 20) then { + _roughnessLength = _this call FUNC(calculateRoughnessLength); + _windSpeed = _windSpeed * ln(_height / _roughnessLength) / ln(20 / _roughnessLength); + }; +}; + +// Terrain effect on wind +if (_windSpeed > 0.05) then { + _newWindSpeed = 0; + { + _windSource = [100, _windDir + 180, _x] call fnc_polar2vect; + if (!(terrainIntersectASL [_this, _this vectorAdd _windSource])) exitWith { + _newWindSpeed = cos(_x * 9) * _windSpeed; + }; + _windSource = [100, _windDir + 180 + _x, 0] call fnc_polar2vect; + if (!(terrainIntersectASL [_this, _this vectorAdd _windSource])) exitWith { + _newWindSpeed = cos(_x * 9) * _windSpeed; + }; + _windSource = [100, _windDir + 180 - _x, 0] call fnc_polar2vect; + if (!(terrainIntersectASL [_this, _this vectorAdd _windSource])) exitWith { + _newWindSpeed = cos(_x * 9) * _windSpeed; + }; + } forEach [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; + _windSpeed = _newWindSpeed; +}; + +// Obstacle effect on wind +if (_windSpeed > 0.05) then { + _newWindSpeed = 0; + { + _windSource = [20, _windDir + 180, _x] call fnc_polar2vect; + if (!(lineIntersects [_this, _this vectorAdd _windSource])) exitWith { + _newWindSpeed = cos(_x * 2) * _windSpeed; + }; + _windSource = [20, _windDir + 180 + _x, 0] call fnc_polar2vect; + if (!(lineIntersects [_this, _this vectorAdd _windSource])) exitWith { + _newWindSpeed = cos(_x * 2) * _windSpeed; + }; + _windSource = [20, _windDir + 180 - _x, 0] call fnc_polar2vect; + if (!(lineIntersects [_this, _this vectorAdd _windSource])) exitWith { + _newWindSpeed = cos(_x * 2) * _windSpeed; + }; + } forEach [0, 5, 10, 15, 20, 25, 30, 35, 40, 45]; + _windSpeed = _newWindSpeed; +}; +_windSpeed = 0 max _windSpeed; + +_windSpeed diff --git a/addons/advanced_ballistics/functions/fnc_displayProtractor.sqf b/addons/advanced_ballistics/functions/fnc_displayProtractor.sqf new file mode 100644 index 0000000000..2fbe558651 --- /dev/null +++ b/addons/advanced_ballistics/functions/fnc_displayProtractor.sqf @@ -0,0 +1,61 @@ +/* + * 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") +#define __ctrl1 (__dsp displayCtrl 132950) +#define __ctrl2 (__dsp displayCtrl 132951) + +private ["_inclinationAngle", "_refPosition"]; + +if (GVAR(Protractor)) exitWith { + GVAR(Protractor) = false; + 1 cutText ["", "PLAIN"]; + true +}; +if (weaponLowered ACE_player) exitWith { true }; +if (vehicle ACE_player != ACE_player) exitWith { true }; +if (currentWeapon ACE_player != primaryWeapon ACE_player) exitWith { true }; + +2 cutText ["", "PLAIN"]; +EGVAR(weather,WindInfo) = false; +0 cutText ["", "PLAIN"]; +GVAR(Protractor) = true; + +[{ + 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; + }; + + _refPosition = [SafeZoneX + 0.001, SafeZoneY + 0.001, 0.2, 0.2 * 4/3]; + + _inclinationAngle = asin((ACE_player weaponDirection currentWeapon ACE_player) select 2); + _inclinationAngle = -58 max _inclinationAngle min 58; + + 1 cutRsc ["RscProtractor", "PLAIN", 1, false]; + + __ctrl1 ctrlSetScale 0.75; + __ctrl1 ctrlCommit 0; + __ctrl1 ctrlSetText QUOTE(PATHTOF(UI\protractor.paa)); + __ctrl1 ctrlSetTextColor [1, 1, 1, 1]; + + __ctrl2 ctrlSetScale 0.75; + __ctrl2 ctrlSetPosition [(_refPosition select 0), (_refPosition select 1) - 0.0012 * _inclinationAngle, (_refPosition select 2), (_refPosition select 3)]; + __ctrl2 ctrlCommit 0; + __ctrl2 ctrlSetText QUOTE(PATHTOF(UI\protractor_marker.paa)); + __ctrl2 ctrlSetTextColor [1, 1, 1, 1]; + +}, 0.1, []] call CBA_fnc_addPerFrameHandler; + +true diff --git a/addons/advanced_ballistics/functions/fnc_handleFired.sqf b/addons/advanced_ballistics/functions/fnc_handleFired.sqf new file mode 100644 index 0000000000..989710019e --- /dev/null +++ b/addons/advanced_ballistics/functions/fnc_handleFired.sqf @@ -0,0 +1,383 @@ +/* + * Author: Glowbal, Ruthberg + * + * Handles advanced ballistics for (BulletBase) projectiles + * + * Arguments: + * 0: unit - Object the event handler is assigned to + * 1: weapon - Fired weapon + * 2: muzzle - Muzzle that was used + * 3: mode - Current mode of the fired weapon + * 4: ammo - Ammo used + * 5: magazine - magazine name which was used + * 6: projectile - Object of the projectile that was shot + * + * Return Value: + * Nothing + * + * Public: No + */ +#include "script_component.hpp" +#include "defines.h" + +private ["_unit", "_weapon", "_mode", "_ammo", "_magazine", "_caliber", "_bullet", "_abort", "_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; + +_abort = false; +if (!hasInterface) exitWith {}; +if (!alive _bullet) exitWith {}; +if (!GVAR(enabled)) exitWith {}; +if (!([_unit] call EFUNC(common,isPlayer))) exitWith {}; +if (underwater _unit) exitWith {}; +if (!(_ammo isKindOf "BulletBase")) exitWith {}; +if (_unit distance ACE_player > GVAR(simulationRadius)) exitWith {}; +if (GVAR(onlyActiveForLocalPlayers) && _unit != ACE_player) then { _abort = true; }; +//if (!GVAR(vehicleGunnerEnabled) && !(_unit isKindOf "Man")) then { _abort = true; }; // TODO: We currently do not have firedEHs on vehicles +if (GVAR(disabledInFullAutoMode) && getNumber(configFile >> "cfgWeapons" >> _weapon >> _mode >> "autoFire") == 1) then { _abort = true; }; + +if (_abort && alwaysSimulateForSnipers) then { + // The shooter is non local + if (currentWeapon _unit == primaryWeapon _unit && count primaryWeaponItems _unit > 2) then { + _opticsName = (primaryWeaponItems _unit) select 2; + _opticType = getNumber(configFile >> "cfgWeapons" >> _opticsName >> "ItemInfo" >> "opticType"); + _abort = _opticType != 2; // We only abort if the non local shooter is not a sniper + }; +}; +if (_abort || !(GVAR(extensionAvailable))) exitWith { + [_bullet, getNumber(configFile >> "cfgAmmo" >> _ammo >> "airFriction")] call EFUNC(winddeflection,updateTrajectoryPFH); +}; + +_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); +}; + +_muzzleAccessory = ""; +switch (currentWeapon _unit) do { + case primaryWeapon _unit: { _muzzleAccessory = (primaryWeaponItems _unit) select 0; }; + case handgunWeapon _unit: { _muzzleAccessory = (handgunItems _unit) select 0; }; +}; + +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; + }; +}; + +// TODO: Make _bulletTraceVisible global and toggle it with events +_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(-(EGVAR(weather,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"); + }; +}; + +#ifdef USE_ADVANCEDBALLISTICS_DLL + GVAR(currentbulletID) = (GVAR(currentbulletID) + 1) % 10000; + + "ace_advanced_ballistics" callExtension format["new:%1:%2:%3:%4:%5:%6:%7:%8:%9:%10:%11:%12:%13:%14:%15:%16:%17:%18", GVAR(currentbulletID), _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)]; + + [{ + private ["_index", "_bullet", "_caliber", "_bulletTraceVisible", "_bulletVelocity", "_bulletPosition"]; + EXPLODE_4_PVT(_this select 0,_bullet,_caliber,_bulletTraceVisible,_index); + + if (!alive _bullet) exitWith { + [_this select 1] call cba_fnc_removePerFrameHandler; + }; + + _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 ("ace_advanced_ballistics" callExtension format["simulate:%1:%2:%3:%4:%5:%6:%7", _index, _bulletVelocity, _bulletPosition, ACE_wind, ASLToATL(_bulletPosition) select 2, floor(time), time - floor(time)]); + + }, GVAR(simulationInterval), [_bullet, _caliber, _bulletTraceVisible, GVAR(currentbulletID)]] call CBA_fnc_addPerFrameHandler; +#else + _index = count GVAR(bulletDatabase); + if (count GVAR(bulletDatabaseFreeIndices) > 0) then { + _index = GVAR(bulletDatabaseFreeIndices) select 0; + GVAR(bulletDatabaseFreeIndices) = GVAR(bulletDatabaseFreeIndices) - [_index]; + }; + + 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]; + GVAR(bulletDatabaseFrames) set[_index, 1]; + GVAR(bulletDatabaseLastFrame) set[_index, time]; + GVAR(bulletDatabaseHDeflect) set[_index, 0]; + GVAR(bulletDatabaseSpinDrift) set[_index, 0]; + + if ((GVAR(bulletDatabaseOccupiedIndices) pushBack _index) == 0) then { + [{ + private ["_bulletDatabaseEntry", "_bullet", "_caliber", "_muzzleVelocity", "_frames", "_speed", "_airFriction", "_airFrictionRef", "_dragModel", "_atmosphereModel", "_ballisticCoefficient", "_ballisticCoefficients", "_velocityBoundaries", "_airDensity", "_stabilityFactor", "_transonicStabilityCoef", "_twistDirection", "_unit", "_bulletTraceVisible", "_index", "_temperature", "_humidity", "_deltaT", "_TOF", "_bulletPosition", "_bulletVelocity", "_bulletSpeed", "_trueVelocity", "_trueSpeed", "_bulletSpeedAvg", "_wind", "_drag", "_dragRef", "_vect", "_accel", "_accelRef", "_centripetalAccel", "_pressure", "_pressureDeviation", "_windSourceObstacle", "_windSourceTerrain", "_height", "_roughnessLength"]; + + { + _bulletDatabaseEntry = (GVAR(bulletDatabase) select _x); + if (!alive (_bulletDatabaseEntry select 0)) then { + _index = _bulletDatabaseEntry select 13; + GVAR(bulletDatabaseOccupiedIndices) = GVAR(bulletDatabaseOccupiedIndices) - [_index]; + GVAR(bulletDatabaseFreeIndices) pushBack _index; + }; + true + } count GVAR(bulletDatabaseOccupiedIndices); + + if (count GVAR(bulletDatabaseOccupiedIndices) == 0) exitWith { + GVAR(bulletDatabase) = []; + GVAR(bulletDatabaseStartTime) = []; + GVAR(bulletDatabaseSpeed) = []; + GVAR(bulletDatabaseFrames) = []; + GVAR(bulletDatabaseLastFrame) = []; + GVAR(bulletDatabaseHDeflect) = []; + GVAR(bulletDatabaseSpinDrift) = []; + GVAR(bulletDatabaseOccupiedIndices) = []; + GVAR(bulletDatabaseFreeIndices) = []; + [_this select 1] call cba_fnc_removePerFrameHandler; + }; + + { + _bulletDatabaseEntry = GVAR(bulletDatabase) select _x; + _bullet = _bulletDatabaseEntry select 0; + _caliber = _bulletDatabaseEntry select 1; + _airFriction = _bulletDatabaseEntry select 2; + _muzzleVelocity = _bulletDatabaseEntry select 3; + _stabilityFactor = _bulletDatabaseEntry select 4; + _transonicStabilityCoef = _bulletDatabaseEntry select 5; + _twistDirection = _bulletDatabaseEntry select 6; + _unit = _bulletDatabaseEntry select 7; + _bulletTraceVisible = _bulletDatabaseEntry select 8; + _ballisticCoefficients = _bulletDatabaseEntry select 9; + _velocityBoundaries = _bulletDatabaseEntry select 10; + _atmosphereModel = _bulletDatabaseEntry select 11; + _dragModel = _bulletDatabaseEntry select 12; + _index = _bulletDatabaseEntry select 13; + + _TOF = time - (GVAR(bulletDatabaseStartTime) select _index); + + _bulletVelocity = velocity _bullet; + _bulletPosition = getPosASL _bullet; + + _bulletSpeed = vectorMagnitude _bulletVelocity; + _bulletDir = (_bulletVelocity select 0) atan2 (_bulletVelocity select 1); + + _speed = (GVAR(bulletDatabaseSpeed) select _index); + GVAR(bulletDatabaseSpeed) set[_index, _speed + _bulletSpeed]; + + _frames = (GVAR(bulletDatabaseFrames) select _index); + GVAR(bulletDatabaseFrames) set[_index, _frames + 1]; + + _bulletSpeedAvg = (_speed / _frames); + + if ((GVAR(SimulationPrecision) < 2) || {_frames % GVAR(SimulationPrecision) == _index % GVAR(SimulationPrecision)}) then { + _deltaT = time - (GVAR(bulletDatabaseLastFrame) select _index); + GVAR(bulletDatabaseLastFrame) set[_index, time]; + + _trueVelocity = _bulletVelocity; + _trueSpeed = _bulletSpeed; + _wind = [0, 0, 0]; + if (GVAR(WindEnabled) && (vectorMagnitude ACE_wind) > 0) then { + _windSourceObstacle = _bulletPosition vectorDiff ((vectorNormalized ACE_wind) vectorMultiply 10); + _windSourceTerrain = _bulletPosition vectorDiff ((vectorNormalized ACE_wind) vectorMultiply 100); + + if (!(lineIntersects [_bulletPosition, _windSourceObstacle]) && !(terrainIntersectASL [_bulletPosition, _windSourceTerrain])) then { + _wind = ACE_wind; + _height = ASLToATL(_bulletPosition) select 2; + _height = 0 max _height min 20; + if (_height < 20) then { + _roughnessLength = _bulletPosition call FUNC(calculateRoughnessLength); + _wind = _wind vectorMultiply (ln(_height / _roughnessLength) / ln(20 / _roughnessLength)); + }; + + _trueVelocity = _bulletVelocity vectorDiff _wind; + _trueSpeed = vectorMagnitude _trueVelocity; + }; + }; + + _airFrictionRef = _airFriction; + if (GVAR(AdvancedAirDragEnabled) && (count _ballisticCoefficients) == (count _velocityBoundaries) + 1) then { + _dragRef = _deltaT * _airFrictionRef * _bulletSpeed * _bulletSpeed; + _accelRef = (vectorNormalized _bulletVelocity) vectorMultiply (_dragRef); + _bulletVelocity = _bulletVelocity vectorDiff _accelRef; + + _ballisticCoefficient = (_ballisticCoefficients select 0); + for "_i" from (count _velocityBoundaries) - 1 to 0 step -1 do { + if (_bulletSpeed < (_velocityBoundaries select _i)) exitWith { + _ballisticCoefficient = (_ballisticCoefficients select (_i + 1)); + }; + }; + + if (GVAR(AtmosphericDensitySimulationEnabled)) then { + _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; + if (_humidity > 0) then { + private ["_pSat", "_vaporPressure", "_partialPressure"]; + // Saturation vapor pressure calculated according to: http://wahiduddin.net/calc/density_algorithms.htm + _pSat = 6.1078 * 10 ^ ((7.5 * _temperature) / (_temperature + 237.3)); + _vaporPressure = _humidity * _pSat; + _partialPressure = (_pressure * 100)- _vaporPressure; + + _airDensity = (_partialPressure * DRY_AIR_MOLAR_MASS + _vaporPressure * WATER_VAPOR_MOLAR_MASS) / (UNIVERSAL_GAS_CONSTANT * KELVIN(_temperature)); + } else { + _airDensity = (_pressure * 100) / (SPECIFIC_GAS_CONSTANT_DRY_AIR * KELVIN(_temperature)); + }; + if (_atmosphereModel == "ICAO") then { + _ballisticCoefficient = (STD_AIR_DENSITY_ICAO / _airDensity) * _ballisticCoefficient; + } else { + _ballisticCoefficient = (STD_AIR_DENSITY_ASM / _airDensity) * _ballisticCoefficient; + }; + }; + + _drag = _deltaT * ([_dragModel, _ballisticCoefficient, _trueSpeed] call FUNC(calculateRetardation)); + _accel = (vectorNormalized _trueVelocity) vectorMultiply (_drag); + _bulletVelocity = _bulletVelocity vectorDiff _accel; + } else { + if (GVAR(AtmosphericDensitySimulationEnabled)) then { + _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); + }; + + if (_airFriction != _airFrictionRef || vectorMagnitude _wind > 0) then { + _dragRef = _deltaT * _airFrictionRef * _bulletSpeed * _bulletSpeed; + _accelRef = (vectorNormalized _bulletVelocity) vectorMultiply (_dragRef); + _bulletVelocity = _bulletVelocity vectorDiff _accelRef; + + _drag = _deltaT * _airFriction * _trueSpeed * _trueSpeed; + _accel = (vectorNormalized _trueVelocity) vectorMultiply (_drag); + _bulletVelocity = _bulletVelocity vectorAdd _accel; + }; + }; + + if (GVAR(CoriolisEnabled) && _bulletSpeedAvg > 0) then { + _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]; + + _bulletPosition = _bulletPosition vectorAdd _vect; + }; + + /* + // Negligible effect on the trajectory + if (GVAR(EoetvoesEnabled)) then { + _centripetalAccel = 2 * 0.0000729 * (_muzzleVelocity / -32.2) * cos(EGVAR(weather,Latitude)) * sin(_bulletDir); + _accel = [0, 0, -(_centripetalAccel * _deltaT)]; + + _bulletVelocity = _bulletVelocity vectorAdd _accel; + }; + //*/ + + if (GVAR(SpinDriftEnabled)) then { + _spinDrift = _twistDirection * 0.0254 * 1.25 * (_stabilityFactor + 1.2) * _TOF ^ 1.83; + _spinDriftPartial = _spinDrift - (GVAR(bulletDatabaseSpinDrift) select _index); + GVAR(bulletDatabaseSpinDrift) set[_index, _spinDrift]; + _vect = [sin(_bulletDir + 90) * _spinDriftPartial, cos(_bulletDir + 90) * _spinDriftPartial, 0]; + + _bulletPosition = _bulletPosition vectorAdd _vect; + }; + }; + + if (GVAR(TransonicRegionEnabled) && _transonicStabilityCoef < 1) then { + if (_bulletSpeed < 345 && _bulletSpeedAvg > 340 && _bulletSpeed > 335) then { + _accel = [(random 0.8) - 0.4, (random 0.8) - 0.4, (random 0.8) - 0.4]; + _accel = _accel vectorMultiply (1 - _transonicStabilityCoef); + _bulletVelocity = _bulletVelocity vectorAdd _accel; + }; + }; + + if (_bulletTraceVisible && _bulletSpeed > 600 && _bullet distanceSqr _unit > 400) 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,"","",""]; + }; + + _bullet setVelocity _bulletVelocity; + _bullet setPosASL _bulletPosition; + true + } count GVAR(bulletDatabaseOccupiedIndices); + + }, GVAR(simulationInterval), []] call CBA_fnc_addPerFrameHandler; + }; +#endif diff --git a/addons/advanced_ballistics/functions/fnc_initModuleSettings.sqf b/addons/advanced_ballistics/functions/fnc_initModuleSettings.sqf new file mode 100644 index 0000000000..ba7ea31a8f --- /dev/null +++ b/addons/advanced_ballistics/functions/fnc_initModuleSettings.sqf @@ -0,0 +1,35 @@ +/* + * Author: Glowbal, Ruthberg + * Module for adjusting the advanced ballistics settings + * + * Arguments: + * 0: The module logic + * 1: units + * 2: activated + * + * Return Value: + * None + * + * Public: No + */ + +#include "script_component.hpp" + +private ["_logic", "_units", "_activated"]; +_logic = _this select 0; +_units = _this select 1; +_activated = _this select 2; + +if !(_activated) exitWith {}; + +[_logic, QGVAR(enabled), "enabled"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(ammoTemperatureEnabled), "ammoTemperatureEnabled"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(barrelLengthInfluenceEnabled), "barrelLengthInfluenceEnabled"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(bulletTraceEnabled), "bulletTraceEnabled"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(onlyActiveForLocalPlayers), "onlyActiveForLocalPlayers"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(disabledInFullAutoMode), "disabledInFullAutoMode"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(alwaysSimulateForSnipers), "alwaysSimulateForSnipers"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(simulationInterval), "simulationInterval"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(simulationRadius), "simulationRadius"] call EFUNC(common,readSettingFromModule); + +GVAR(simulationInterval) = 0 max GVAR(simulationInterval) min 0.2; diff --git a/addons/advanced_ballistics/functions/fnc_initializeTerrainExtension.sqf b/addons/advanced_ballistics/functions/fnc_initializeTerrainExtension.sqf new file mode 100644 index 0000000000..6791d26350 --- /dev/null +++ b/addons/advanced_ballistics/functions/fnc_initializeTerrainExtension.sqf @@ -0,0 +1,60 @@ +/* + * Author: Ruthberg + * Initializes the advanced ballistics dll extension with terrain data + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Public: No + */ +#include "script_component.hpp" + +if (!hasInterface) exitWith {}; +if (!GVAR(extensionAvailable)) exitWith {}; + +private ["_initStartTime", "_mapSize", "_mapGrids", "_gridCells", "_x", "_y", "_gridCenter", "_gridHeight", "_gridNumObjects", "_gridSurfaceIsWater"]; + +_initStartTime = time; +_mapSize = getNumber (configFile >> "CfgWorlds" >> worldName >> "MapSize"); + +if (("ace_advanced_ballistics" callExtension format["init:%1:%2", worldName, _mapSize]) == "Terrain already initialized") exitWith { + if (GVAR(INIT_MESSAGE_ENABLED)) then { + systemChat "AdvancedBallistics: Terrain already initialized"; + }; +}; + +_mapGrids = ceil(_mapSize / 50) + 1; +_gridCells = _mapGrids * _mapGrids; + +GVAR(currentGrid) = 0; + +[{ + private ["_args", "_mapGrids", "_gridCells", "_initStartTime"]; + _args = _this select 0; + _mapGrids = _args select 0; + _gridCells = _args select 1; + _initStartTime = _args select 2; + + if (GVAR(currentGrid) >= _gridCells) exitWith { + if (GVAR(INIT_MESSAGE_ENABLED)) then { + systemChat format["AdvancedBallistics: Finished terrain initialization in %1 seconds", ceil(time - _initStartTime)]; + }; + [_this select 1] call cba_fnc_removePerFrameHandler; + }; + + for "_i" from 1 to 50 do { + _x = floor(GVAR(currentGrid) / _mapGrids) * 50; + _y = (GVAR(currentGrid) - floor(GVAR(currentGrid) / _mapGrids) * _mapGrids) * 50; + _gridCenter = [_x + 25, _y + 25]; + _gridHeight = round(getTerrainHeightASL _gridCenter); + _gridNumObjects = count (_gridCenter nearObjects ["Building", 50]); + _gridSurfaceIsWater = if (surfaceIsWater _gridCenter) then {1} else {0}; + "ace_advanced_ballistics" callExtension format["set:%1:%2:%3", _gridHeight, _gridNumObjects, _gridSurfaceIsWater]; + GVAR(currentGrid) = GVAR(currentGrid) + 1; + if (GVAR(currentGrid) >= _gridCells) exitWith {}; + }; + +}, 0, [_mapGrids, _gridCells, _initStartTime]] call CBA_fnc_addPerFrameHandler diff --git a/addons/advanced_ballistics/functions/script_component.hpp b/addons/advanced_ballistics/functions/script_component.hpp new file mode 100644 index 0000000000..2c718bf9db --- /dev/null +++ b/addons/advanced_ballistics/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\advanced_ballistics\script_component.hpp" \ No newline at end of file diff --git a/addons/advanced_ballistics/initKeybinds.sqf b/addons/advanced_ballistics/initKeybinds.sqf new file mode 100644 index 0000000000..5649fb943e --- /dev/null +++ b/addons/advanced_ballistics/initKeybinds.sqf @@ -0,0 +1,11 @@ +["ACE3", QGVAR(ProtractorKey), localize "STR_ACE_AdvancedBallistics_ProtractorKey", +{ + // Conditions: canInteract + if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; + + // Statement + [] call FUNC(displayProtractor); + false +}, +{false}, +[37, [true, true, false]], false, 0] call CBA_fnc_addKeybind; // (CTRL + SHIFT + K) diff --git a/addons/advanced_ballistics/script_component.hpp b/addons/advanced_ballistics/script_component.hpp new file mode 100644 index 0000000000..e398f8869c --- /dev/null +++ b/addons/advanced_ballistics/script_component.hpp @@ -0,0 +1,14 @@ +#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 + +#ifdef DEBUG_SETTINGS_ADVANCEDBALLISTICS + #define DEBUG_SETTINGS DEBUG_SETTINGS_ADVANCEDBALLISTICS +#endif + +#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/advanced_ballistics/stringtable.xml b/addons/advanced_ballistics/stringtable.xml new file mode 100644 index 0000000000..7136e89d0f --- /dev/null +++ b/addons/advanced_ballistics/stringtable.xml @@ -0,0 +1,11 @@ + + + + + Show Wind Info + + + Show Protractor + + + diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 79f99c33a4..620484950d 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -1,8 +1,10 @@ + class CfgAmmo { class BulletCore; - + class BulletBase: BulletCore { - timeToLive = 15; // Default: 6, doubleplusgood all munition range. + // Default: 6 | More is good, but too much is bad (especially with wind deflection / advanced ballistics) + timeToLive = 10; }; class B_20mm : BulletBase { @@ -17,4 +19,486 @@ class CfgAmmo { class B_30mm_AP : BulletBase { timeToLive = 30; }; -}; \ No newline at end of file + + 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 B_556x45_Ball_Tracer_Red; + class ACE_B_556x45_Ball_Tracer_Dim: B_556x45_Ball_Tracer_Red { + nvgOnly = 1; + }; + 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[]={730, 760, 788, 800, 810, 830}; + ACE_barrelLengths[]={10, 16, 20, 24, 26, 30}; + }; + class B_65x39_Case_yellow; + class ACE_B_65x39_Caseless_Tracer_Dim : B_65x39_Case_yellow { + nvgOnly = 1; + }; + 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 B_762x51_Tracer_Red; + class ACE_B_762x51_Tracer_Dim: B_762x51_Tracer_Red { + nvgOnly = 1; + }; + 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 B_762x54_Ball : BulletBase { + 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_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[]={440, 460, 480}; + 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_93x64_Ball : BulletBase { + ACE_caliber=0.366; + ACE_bulletLength=1.350; + ACE_bulletMass=230; + 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.368}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={850, 870, 880}; + ACE_barrelLengths[]={20, 24.41, 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_338_Ball : BulletBase { + ACE_caliber=0.338; + ACE_bulletLength=1.558; + ACE_bulletMass=250; + 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.322}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={880, 915, 925}; + ACE_barrelLengths[]={20, 26, 28}; + }; + class B_338_NM_Ball : BulletBase { + 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[]={790, 807, 820}; + ACE_barrelLengths[]={20, 24, 26}; + }; + class B_127x54_Ball : BulletBase { + ACE_caliber=0.50; + ACE_bulletLength=2.540; + ACE_bulletMass=950; + 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[]={1.050}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={300}; + ACE_barrelLengths[]={17.2}; + }; + 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}; + }; +}; diff --git a/addons/ballistics/CfgMagazines.hpp b/addons/ballistics/CfgMagazines.hpp new file mode 100644 index 0000000000..6e6f5a11e8 --- /dev/null +++ b/addons/ballistics/CfgMagazines.hpp @@ -0,0 +1,138 @@ + +class CfgMagazines { + + class CA_Magazine; + class 30Rnd_65x39_caseless_mag: CA_Magazine { + initSpeed = 760; + }; + class 100Rnd_65x39_caseless_mag: CA_Magazine { + initSpeed = 760; + }; + class 100Rnd_65x39_caseless_mag_Tracer: 100Rnd_65x39_caseless_mag { + initSpeed = 760; + }; + class 200Rnd_65x39_cased_Box: 100Rnd_65x39_caseless_mag { + initSpeed = 760; + }; + class 30Rnd_65x39_caseless_mag_Tracer: 30Rnd_65x39_caseless_mag { + }; + class ACE_30Rnd_65x39_caseless_mag_Tracer_Dim: 30Rnd_65x39_caseless_mag_Tracer { + author = "$STR_ACE_Common_ACETeam"; + ammo = "ACE_B_65x39_Caseless_Tracer_Dim"; + displayName = "$STR_ACE_30Rnd_65x39_caseless_mag_Tracer_DimName"; + displayNameShort = "$STR_ACE_30Rnd_65x39_caseless_mag_Tracer_DimNameShort"; + descriptionShort = "$STR_ACE_30Rnd_65x39_caseless_mag_Tracer_DimDescription"; + picture = "\A3\weapons_f\data\ui\m_30stanag_caseless_yellow_CA.paa"; + }; + + class 30Rnd_556x45_Stanag: CA_Magazine { + }; + class 30Rnd_556x45_Stanag_Tracer_Red: 30Rnd_556x45_Stanag { + }; + class ACE_30Rnd_556x45_Stanag_Tracer_Dim: 30Rnd_556x45_Stanag_Tracer_Red { + author = "$STR_ACE_Common_ACETeam"; + ammo = "ACE_B_556x45_Ball_Tracer_Dim"; + displayName = "$STR_ACE_30Rnd_556x45_mag_Tracer_DimName"; + displayNameShort = "$STR_ACE_30Rnd_556x45_mag_Tracer_DimNameShort"; + descriptionShort = "$STR_ACE_30Rnd_556x45_mag_Tracer_DimDescription"; + picture = "\A3\weapons_f\data\ui\m_30stanag_yellow_ca.paa"; + }; + + class 20Rnd_762x51_Mag: CA_Magazine { + initSpeed = 833; + }; + class 10Rnd_762x51_Mag: 20Rnd_762x51_Mag { + initSpeed = 833; + }; + class 150Rnd_762x51_Box: CA_Magazine { + initSpeed = 833; + }; + class 150Rnd_762x51_Box_Tracer: 150Rnd_762x51_Box { + initSpeed = 833; + }; + class ACE_20Rnd_762x51_Mag_Tracer: 20Rnd_762x51_Mag { //@todo Green tracers for opfor and yellow tracers for independent + author = "$STR_ACE_Common_ACETeam"; + ammo = "B_762x51_Tracer_Red"; + displayName = "$STR_ACE_20Rnd_762x51_mag_TracerName"; + displayNameShort = "$STR_ACE_20Rnd_762x51_mag_TracerNameShort"; + descriptionShort = "$STR_ACE_20Rnd_762x51_mag_TracerDescription"; + tracersEvery = 1; + }; + + class ACE_20Rnd_762x51_Mag_Tracer_Dim: ACE_20Rnd_762x51_Mag_Tracer { + author = "$STR_ACE_Common_ACETeam"; + ammo = "ACE_B_762x51_Tracer_Dim"; + displayName = "$STR_ACE_20Rnd_762x51_mag_Tracer_DimName"; + displayNameShort = "$STR_ACE_20Rnd_762x51_mag_Tracer_DimNameShort"; + descriptionShort = "$STR_ACE_20Rnd_762x51_mag_Tracer_DimDescription"; + }; + + class ACE_20Rnd_762x51_Mag_SD: 20Rnd_762x51_Mag { + author = "$STR_ACE_Common_ACETeam"; + ammo = "ACE_762x51_Ball_Subsonic"; + displayName = "$STR_ACE_20Rnd_762x51_mag_SDName"; + displayNameShort = "$STR_ACE_20Rnd_762x51_mag_SDNameShort"; + descriptionShort = "$STR_ACE_20Rnd_762x51_mag_SDDescription"; + initSpeed = 325; + }; + + class 30Rnd_9x21_Mag: CA_Magazine { + initSpeed = 450; + }; + class ACE_30Rnd_9x19_mag: 30Rnd_9x21_Mag { + author = "$STR_ACE_Common_ACETeam"; + ammo = "ACE_9x19_Ball"; + displayName = "$STR_ACE_30Rnd_9x19_mag_Name"; + displayNameShort = "$STR_ACE_30Rnd_9x19_mag_NameShort"; + descriptionShort = "$STR_ACE_30Rnd_9x19_mag_Description"; + initSpeed = 370; + }; + + class 11Rnd_45ACP_Mag: CA_Magazine { + initSpeed = 250; + }; + + class 6Rnd_45ACP_Cylinder : 11Rnd_45ACP_Mag { + initSpeed = 250; + }; + + class 30Rnd_45ACP_Mag_SMG_01: 30Rnd_9x21_Mag { + initSpeed = 250; + }; + + class 9Rnd_45ACP_Mag: 30Rnd_45ACP_Mag_SMG_01 { + initSpeed = 250; + }; + + class 30Rnd_45ACP_Mag_SMG_01_Tracer_Green: CA_Magazine { + initSpeed = 250; + }; + + class 16Rnd_9x21_Mag: 30Rnd_9x21_Mag { + initSpeed = 450; + }; + class ACE_16Rnd_9x19_mag: 16Rnd_9x21_Mag { + author = "$STR_ACE_Common_ACETeam"; + ammo = "ACE_9x19_Ball"; + displayName = "$STR_ACE_16Rnd_9x19_mag_Name"; + displayNameShort = "$STR_ACE_16Rnd_9x19_mag_NameShort"; + descriptionShort = "$STR_ACE_16Rnd_9x19_mag_Description"; + initSpeed = 370; + }; + + class 10Rnd_762x54_Mag: 10Rnd_762x51_Mag { + initSpeed = 800; + }; + + class 150Rnd_762x54_Box: 150Rnd_762x51_Box { + initSpeed = 750; + }; + + class 150Rnd_93x64_Mag: CA_Magazine { + initSpeed = 860; + }; + + class 10Rnd_127x54_Mag: CA_Magazine { + initSpeed = 300; + }; +}; diff --git a/addons/ballistics/CfgWeapons.hpp b/addons/ballistics/CfgWeapons.hpp index 2319f8279b..513829130f 100644 --- a/addons/ballistics/CfgWeapons.hpp +++ b/addons/ballistics/CfgWeapons.hpp @@ -3,11 +3,49 @@ class Mode_SemiAuto; class Mode_FullAuto; class CfgWeapons { - - /* MX */ - + class DMR_02_base_F; + class DMR_03_base_F; + class DMR_04_base_F; + class DMR_05_base_F; + class DMR_06_base_F; + class GM6_base_F; + class LMG_RCWS; + class LRR_base_F; + class MGun; + class MGunCore; + class MMG_01_base_F; + class MMG_02_base_F; class Rifle_Base_F; + class Rifle_Long_Base_F; + class WeaponSlotsInfo; + class MuzzleSlot; + + /* Long Rifles */ + + class EBR_base_F: Rifle_Long_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_B"}; + }; + }; + }; + + class DMR_01_base_F: Rifle_Long_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_B"}; + }; + }; + }; + + /* MX */ + class arifle_MX_Base_F: Rifle_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_H"}; + }; + }; class Single: Mode_SemiAuto { dispersion = 0.000800; // radians. Equal to 2.75 MOA. // Based on widely cited 2 MOA figure for new 5.56 ACR. @@ -17,8 +55,17 @@ class CfgWeapons { dispersion = 0.00147; // radians. Equal to 5.1 MOA. }; }; - class arifle_MX_SW_F: arifle_MX_Base_F { + initSpeed = -1.0; + ACE_barrelTwist=9; + ACE_barrelLength=16.0; + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + // Shit is broken again + //compatibleItems[] += {"ACE_muzzle_mzls_H"}; + compatibleItems[] = {"muzzle_snds_H","muzzle_snds_H_SW","ACE_muzzle_mzls_H"}; + }; + }; class Single: Mode_SemiAuto { dispersion = 0.000800; // radians. Equal to 2.75 MOA. // Based on widely cited 2 MOA figure for new 5.56 ACR. @@ -28,8 +75,10 @@ class CfgWeapons { dispersion = 0.00147; // radians. Equal to 5.1 MOA. }; }; - class arifle_MXM_F: arifle_MX_Base_F { + initSpeed = -1.018; + ACE_barrelTwist=9; + ACE_barrelLength=18; class Single: Single { dispersion = 0.00029; // radians. Equal to 1 MOA. // 6.5mm is easily capable of this in a half-tuned rifle. @@ -42,8 +91,12 @@ class CfgWeapons { /* Katiba */ - class arifle_katiba_Base_F: Rifle_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_H"}; + }; + }; class Single: Mode_SemiAuto { dispersion = 0.000800; // radians. Equal to 2.75 MOA. // Based on widely cited 2 MOA figure for new 5.56 ACR? @@ -57,9 +110,15 @@ class CfgWeapons { /* Other */ - - class Rifle_Long_Base_F: Rifle_Base_F {}; class LMG_Mk200_F: Rifle_Long_Base_F { + initSpeed = -0.9763; + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_H"}; + }; + }; + ACE_barrelTwist=7; + ACE_barrelLength=12.5; class manual: Mode_FullAuto { dispersion = 0.00175; // radians. Equal to 6 MOA. }; @@ -68,8 +127,15 @@ class CfgWeapons { dispersion = 0.00175; // radians. Equal to 6 MOA. }; }; - class LMG_Zafir_F: Rifle_Long_Base_F { + initSpeed = -1.0; + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_B"}; + }; + }; + ACE_barrelTwist=12; + ACE_barrelLength=18.1; class FullAuto: Mode_FullAuto { dispersion = 0.00175; // radians. Equal to 6 MOA. }; @@ -81,19 +147,26 @@ class CfgWeapons { /* Assault Rifles */ - class Tavor_base_F: Rifle_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_L"}; + }; + }; class Single: Mode_SemiAuto { dispersion = 0.000727; // radians. Equal to 2.5 MOA, about the limit of mass-produced M855. - // }; class FullAuto: Mode_FullAuto { dispersion = 0.00147; // radians. Equal to 5.1 MOA. }; }; - class mk20_base_F: Rifle_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_L"}; + }; + }; class Single: Mode_SemiAuto { dispersion = 0.0008727; // radians. Equal to 3 MOA, about the limit of mass-produced M855 plus // some extra for these worn out Greek Army service rifles. @@ -106,8 +179,8 @@ class CfgWeapons { /* SMGs */ - class SDAR_base_F: Rifle_Base_F { + initSpeed = -0.9723; class Single: Mode_SemiAuto { dispersion = 0.0008727; // radians. Equal to 3 MOA, about the limit of mass-produced M855 plus // some extra because Kel-Tec. @@ -117,4 +190,564 @@ class CfgWeapons { dispersion = 0.00147; // radians. Equal to 5.1 MOA. }; }; + class pdw2000_base_F: Rifle_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_smg_02"}; + }; + }; + }; + class SMG_01_Base: Rifle_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_smg_01"}; + }; + }; + }; + class SMG_02_base_F: Rifle_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_smg_02"}; + }; + }; + }; + + /* Pistols */ + + class Pistol; + class Pistol_Base_F: Pistol { + class WeaponSlotsInfo; + }; + + class hgun_P07_F: Pistol_Base_F { + initSpeed = -0.9778; + ACE_barrelTwist=10; + ACE_barrelLength=4; + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + linkProxy = "\A3\data_f\proxies\weapon_slots\MUZZLE"; + compatibleItems[] += {"ACE_muzzle_mzls_smg_02"}; + }; + }; + }; + + class hgun_Rook40_F: Pistol_Base_F { + initSpeed = -1.0; + ACE_barrelTwist=10; + ACE_barrelLength=4.4; + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + linkProxy = "\A3\data_f\proxies\weapon_slots\MUZZLE"; + compatibleItems[] += {"ACE_muzzle_mzls_smg_02"}; + }; + }; + }; + + class hgun_ACPC2_F: Pistol_Base_F { + initSpeed = -1.0; + ACE_barrelTwist=16; + ACE_barrelLength=5; + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_smg_01"}; + }; + }; + }; + + class hgun_Pistol_heavy_01_F: Pistol_Base_F { + initSpeed = -0.96; + ACE_barrelTwist=16; + ACE_barrelLength=4.5; + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_smg_01"}; + }; + }; + }; + + class hgun_Pistol_heavy_02_F: Pistol_Base_F { + initSpeed = -0.92; + ACE_barrelTwist=16; + ACE_barrelLength=3; + /* + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + linkProxy = "\A3\data_f\proxies\weapon_slots\MUZZLE"; + compatibleItems[] += {"ACE_muzzle_mzls_smg_01"}; + }; + }; + */ + }; + class hgun_PDW2000_F: pdw2000_base_F { + initSpeed = -1.157; + ACE_barrelTwist=9; + ACE_barrelLength=7; + }; + class arifle_Katiba_F: arifle_katiba_Base_F { + initSpeed = -1.09; + ACE_barrelTwist=8; + ACE_barrelLength=28.7; + }; + class arifle_Katiba_C_F: arifle_katiba_Base_F { + initSpeed = -1.07; + ACE_barrelTwist=8; + ACE_barrelLength=26.8; + }; + class arifle_Katiba_GL_F: arifle_katiba_Base_F { + initSpeed = -1.09; + ACE_barrelTwist=8; + ACE_barrelLength=28.7; + }; + class arifle_MX_F: arifle_MX_Base_F { + initSpeed = -0.99; + ACE_barrelTwist=9; + ACE_barrelLength=14.5; + }; + class arifle_MX_GL_F: arifle_MX_Base_F { + initSpeed = -0.99; + ACE_barrelTwist=9; + ACE_barrelLength=14.5; + }; + /* + class arifle_MX_SW_F: arifle_MX_Base_F { + ACE_barrelTwist=9; + ACE_barrelLength=16.0; + }; + */ + class arifle_MXC_F: arifle_MX_Base_F { + initSpeed = -0.965; + ACE_barrelTwist=8; + ACE_barrelLength=10.5; + }; + /* + class arifle_MXM_F: arifle_MX_Base_F { + ACE_barrelTwist=9; + ACE_barrelLength=18; + }; + */ + class arifle_SDAR_F: SDAR_base_F { + initSpeed = -0.9723; + ACE_barrelTwist=11.25; + ACE_barrelLength=18; + }; + class SMG_02_F: SMG_02_base_F { + initSpeed = -1.054; + ACE_barrelTwist=10; + ACE_barrelLength=7.7; + }; + class arifle_TRG20_F: Tavor_base_F { + initSpeed = -0.95; + ACE_barrelTwist=7; + ACE_barrelLength=15; + }; + class arifle_TRG21_F: Tavor_base_F { + initSpeed = -0.989; + ACE_barrelTwist=7; + ACE_barrelLength=18.1; + }; + class arifle_TRG21_GL_F: Tavor_base_F { + initSpeed = -0.989; + ACE_barrelTwist=7; + ACE_barrelLength=18.1; + }; + /* + class LMG_Zafir_F: Rifle_Long_Base_F { + ACE_barrelTwist=12; + ACE_barrelLength=18.1; + }; + */ + class arifle_Mk20_F: mk20_base_F { + initSpeed = -0.98; + ACE_barrelTwist=7; + ACE_barrelLength=17.4; + }; + class arifle_Mk20C_F: mk20_base_F { + initSpeed = -0.956; + ACE_barrelTwist=7; + ACE_barrelLength=16; + }; + class arifle_Mk20_GL_F: mk20_base_F { + initSpeed = -0.956; + ACE_barrelTwist=7; + ACE_barrelLength=16; + }; + class SMG_01_F: SMG_01_Base { + initSpeed = -1.016; + ACE_barrelTwist=16; + ACE_barrelLength=5.5; + }; + class srifle_DMR_01_F: DMR_01_base_F { + initSpeed = -1.025; + ACE_barrelTwist=9.5; + ACE_barrelLength=24; + }; + class srifle_EBR_F: EBR_base_F { + initSpeed = -0.9724; + ACE_barrelTwist=12; + ACE_barrelLength=18; + }; + /* + class LMG_Mk200_F: Rifle_Long_Base_F { + initSpeed = -1.0; + ACE_barrelTwist=7; + ACE_barrelLength=12.5; + }; + */ + class srifle_LRR_F: LRR_base_F { + initSpeed = -1.0; + ACE_barrelTwist=13; + ACE_barrelLength=29; + }; + class srifle_GM6_F: GM6_base_F { + initSpeed = -1.0; + ACE_barrelTwist=15; + ACE_barrelLength=43.3; + }; + class srifle_DMR_02_F: DMR_02_base_F { + initSpeed = -1.0; + ACE_barrelTwist=10; + ACE_barrelLength=26; + }; + class srifle_DMR_03_F: DMR_03_base_F { + initSpeed = -0.9843; + ACE_barrelTwist=10; + ACE_barrelLength=20; + }; + class srifle_DMR_04_F: DMR_04_base_F { + initSpeed = -1.0; + ACE_barrelTwist=8; + ACE_barrelLength=17.72; + }; + class srifle_DMR_05_blk_F: DMR_05_base_F { + initSpeed = -1.0; + ACE_barrelTwist=14.17; + ACE_barrelLength=24.41; + }; + class srifle_DMR_06_camo_F: DMR_06_base_F { + initSpeed = -0.9916; + ACE_barrelTwist=12; + ACE_barrelLength=22; + }; + class MMG_01_hex_F: MMG_01_base_F { + initSpeed = -1.0; + ACE_barrelTwist=14.17; + ACE_barrelLength=21.65; + }; + class MMG_02_camo_F: MMG_02_base_F { + initSpeed = -1.0; + ACE_barrelTwist=9.25; + ACE_barrelLength=24; + }; + + class HMG_127 : LMG_RCWS { + }; + class HMG_01: HMG_127 { + }; + class HMG_M2: HMG_01 { + initSpeed = -1.0; + ACE_barrelTwist=12; + ACE_barrelLength=45; + }; + + /* Silencers */ + + class ItemCore; + class InventoryMuzzleItem_Base_F; + + class muzzle_snds_H: ItemCore { + class ItemInfo: InventoryMuzzleItem_Base_F { + class MagazineCoef { + initSpeed = 1.0; + }; + + class AmmoCoef { + hit = 1.0; + visibleFire = 0.5; + audibleFire = 0.1; + visibleFireTime = 0.5; + audibleFireTime = 0.5; + cost = 1.0; + typicalSpeed = 1.0; + airFriction = 1.0; + }; + + class MuzzleCoef { + dispersionCoef = "0.8f"; + artilleryDispersionCoef = "1.0f"; + fireLightCoef = "0.5f"; + recoilCoef = "1.0f"; + recoilProneCoef = "1.0f"; + minRangeCoef = "1.0f"; + minRangeProbabCoef = "1.0f"; + midRangeCoef = "1.0f"; + midRangeProbabCoef = "1.0f"; + maxRangeCoef = "1.0f"; + maxRangeProbabCoef = "1.0f"; + }; + }; + }; + + class muzzle_snds_L: muzzle_snds_H { + class ItemInfo: ItemInfo { + class MagazineCoef { + initSpeed = 1.0; + }; + + class AmmoCoef { + hit = 1.0; + visibleFire = 0.5; + audibleFire = 0.1; + visibleFireTime = 0.5; + audibleFireTime = 0.5; + cost = 1.0; + typicalSpeed = 1.0; + airFriction = 1.0; + }; + + class MuzzleCoef { + dispersionCoef = "0.8f"; + artilleryDispersionCoef = "1.0f"; + fireLightCoef = "0.5f"; + recoilCoef = "1.0f"; + recoilProneCoef = "1.0f"; + minRangeCoef = "1.0f"; + minRangeProbabCoef = "1.0f"; + midRangeCoef = "1.0f"; + midRangeProbabCoef = "1.0f"; + maxRangeCoef = "1.0f"; + maxRangeProbabCoef = "1.0f"; + }; + }; + }; + + class muzzle_snds_M: muzzle_snds_H { + class ItemInfo: ItemInfo { + class MagazineCoef { + initSpeed = 1.0; + }; + + class AmmoCoef { + hit = 1.0; + visibleFire = 0.5; + audibleFire = 0.1; + visibleFireTime = 0.5; + audibleFireTime = 0.5; + cost = 1.0; + typicalSpeed = 1.0; + airFriction = 1.0; + }; + + class MuzzleCoef { + dispersionCoef = "0.8f"; + artilleryDispersionCoef = "1.0f"; + fireLightCoef = "0.5f"; + recoilCoef = "1.0f"; + recoilProneCoef = "1.0f"; + minRangeCoef = "1.0f"; + minRangeProbabCoef = "1.0f"; + midRangeCoef = "1.0f"; + midRangeProbabCoef = "1.0f"; + maxRangeCoef = "1.0f"; + maxRangeProbabCoef = "1.0f"; + }; + }; + }; + + class muzzle_snds_B: muzzle_snds_H { + class ItemInfo: ItemInfo { + class MagazineCoef { + initSpeed = 1.0; + }; + + class AmmoCoef { + hit = 1.0; + visibleFire = 0.5; + audibleFire = 0.1; + visibleFireTime = 0.5; + audibleFireTime = 0.5; + cost = 1.0; + typicalSpeed = 1.0; + airFriction = 1.0; + }; + + class MuzzleCoef { + dispersionCoef = "0.8f"; + artilleryDispersionCoef = "1.0f"; + fireLightCoef = "0.5f"; + recoilCoef = "1.0f"; + recoilProneCoef = "1.0f"; + minRangeCoef = "1.0f"; + minRangeProbabCoef = "1.0f"; + midRangeCoef = "1.0f"; + midRangeProbabCoef = "1.0f"; + maxRangeCoef = "1.0f"; + maxRangeProbabCoef = "1.0f"; + }; + }; + }; + + class muzzle_snds_H_MG: muzzle_snds_H { + class ItemInfo: ItemInfo { + class MagazineCoef { + initSpeed = 1.0; + }; + + class AmmoCoef { + hit = 1.0; + visibleFire = 0.5; + audibleFire = 0.1; + visibleFireTime = 0.5; + audibleFireTime = 0.5; + cost = 1.0; + typicalSpeed = 1.0; + airFriction = 1.0; + }; + + class MuzzleCoef { + dispersionCoef = "0.8f"; + artilleryDispersionCoef = "1.0f"; + fireLightCoef = "0.5f"; + recoilCoef = "1.0f"; + recoilProneCoef = "1.0f"; + minRangeCoef = "1.0f"; + minRangeProbabCoef = "1.0f"; + midRangeCoef = "1.0f"; + midRangeProbabCoef = "1.0f"; + maxRangeCoef = "1.0f"; + maxRangeProbabCoef = "1.0f"; + }; + }; + }; + + class muzzle_snds_H_SW: muzzle_snds_H_MG { + class ItemInfo: ItemInfo { + class MagazineCoef { + initSpeed = 1.0; + }; + + class AmmoCoef { + hit = 1.0; + visibleFire = 0.5; + audibleFire = 0.1; + visibleFireTime = 0.5; + audibleFireTime = 0.5; + cost = 1.0; + typicalSpeed = 1.0; + airFriction = 1.0; + }; + + class MuzzleCoef { + dispersionCoef = "0.8f"; + artilleryDispersionCoef = "1.0f"; + fireLightCoef = "0.5f"; + recoilCoef = "1.0f"; + recoilProneCoef = "1.0f"; + minRangeCoef = "1.0f"; + minRangeProbabCoef = "1.0f"; + midRangeCoef = "1.0f"; + midRangeProbabCoef = "1.0f"; + maxRangeCoef = "1.0f"; + maxRangeProbabCoef = "1.0f"; + }; + }; + }; + + class muzzle_snds_acp: muzzle_snds_H { + class ItemInfo: ItemInfo { + class MagazineCoef { + initSpeed = 1.0; + }; + + class AmmoCoef { + hit = 1; + visibleFire = 0.5; + audibleFire = 0.1; + visibleFireTime = 0.5; + audibleFireTime = 0.5; + cost = 1.0; + typicalSpeed = 1.0; + airFriction = 1.0; + }; + + class MuzzleCoef { + dispersionCoef = "0.8f"; + artilleryDispersionCoef = "1.0f"; + fireLightCoef = "0.5f"; + recoilCoef = "1.0f"; + recoilProneCoef = "1.0f"; + minRangeCoef = "1.0f"; + minRangeProbabCoef = "1.0f"; + midRangeCoef = "1.0f"; + midRangeProbabCoef = "1.0f"; + maxRangeCoef = "1.0f"; + maxRangeProbabCoef = "1.0f"; + }; + }; + }; + + class muzzle_snds_338_black: ItemCore { + class ItemInfo: InventoryMuzzleItem_Base_F { + class MagazineCoef { + initSpeed = 1.0; + }; + + class AmmoCoef { + hit = 1; + visibleFire = 0.5; + audibleFire = 0.1; + visibleFireTime = 0.5; + audibleFireTime = 0.5; + cost = 1.0; + typicalSpeed = 1.0; + airFriction = 1.0; + }; + + class MuzzleCoef { + dispersionCoef = "0.8f"; + artilleryDispersionCoef = "1.0f"; + fireLightCoef = "0.5f"; + recoilCoef = "1.0f"; + recoilProneCoef = "1.0f"; + minRangeCoef = "1.0f"; + minRangeProbabCoef = "1.0f"; + midRangeCoef = "1.0f"; + midRangeProbabCoef = "1.0f"; + maxRangeCoef = "1.0f"; + maxRangeProbabCoef = "1.0f"; + }; + }; + }; + + class muzzle_snds_93mmg: ItemCore { + class ItemInfo: InventoryMuzzleItem_Base_F { + class MagazineCoef { + initSpeed = 1.0; + }; + + class AmmoCoef { + hit = 1.0; + visibleFire = 0.5; + audibleFire = 0.1; + visibleFireTime = 0.5; + audibleFireTime = 0.5; + cost = 1.0; + typicalSpeed = 1.0; + airFriction = 1.0; + }; + + class MuzzleCoef { + dispersionCoef = "0.8f"; + artilleryDispersionCoef = "1.0f"; + fireLightCoef = "0.5f"; + recoilCoef = "1.0f"; + recoilProneCoef = "1.0f"; + minRangeCoef = "1.0f"; + minRangeProbabCoef = "1.0f"; + midRangeCoef = "1.0f"; + midRangeProbabCoef = "1.0f"; + maxRangeCoef = "1.0f"; + maxRangeProbabCoef = "1.0f"; + }; + }; + }; }; diff --git a/addons/ballistics/config.cpp b/addons/ballistics/config.cpp index 4b9944364c..8ea75e4460 100644 --- a/addons/ballistics/config.cpp +++ b/addons/ballistics/config.cpp @@ -6,12 +6,13 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common"}; - author[] = {"TaoSensai","commy2"}; + author[] = {"TaoSensai","commy2","Ruthberg"}; authorUrl = "https://github.com/Taosenai/tmr"; VERSION_CONFIG; }; }; -#include "CfgVehicles.hpp" +#include "CfgAmmo.hpp" +#include "CfgMagazines.hpp" #include "CfgWeapons.hpp" -#include "CfgAmmo.hpp" \ No newline at end of file +#include "CfgVehicles.hpp" diff --git a/addons/magazines/stringtable.xml b/addons/ballistics/stringtable.xml similarity index 99% rename from addons/magazines/stringtable.xml rename to addons/ballistics/stringtable.xml index 8257e48936..261a6a8ea1 100644 --- a/addons/magazines/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -715,5 +715,17 @@ Kaliber: 9,3x64mm Hartkern<br />Schuss: 150<br />Verwendet für: Navid Kaliber: 9,3 x 64 mm AP<br />Pociski: 150<br />Używane w: Navid + + + + + + + + + + + + \ No newline at end of file diff --git a/addons/magazines/$PBOPREFIX$ b/addons/magazines/$PBOPREFIX$ deleted file mode 100644 index dee71053cc..0000000000 --- a/addons/magazines/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -z\ace\addons\magazines \ No newline at end of file diff --git a/addons/magazines/CfgAmmo.hpp b/addons/magazines/CfgAmmo.hpp deleted file mode 100644 index 8a9a3ec209..0000000000 --- a/addons/magazines/CfgAmmo.hpp +++ /dev/null @@ -1,177 +0,0 @@ - -class CfgAmmo { - - /* 6.5x39mm Grendel */ - - // IR Dim - class B_65x39_Caseless_yellow; - class ACE_B_65x39_Caseless_Tracer_Dim: B_65x39_Caseless_yellow { - nvgOnly = 1; - }; - - class B_65x39_Case_yellow; - class ACE_B_65x39_Case_Tracer_Dim: B_65x39_Case_yellow { - nvgOnly = 1; - }; - - // sub sonic - class B_65x39_Caseless; - class ACE_B_65x39_Caseless_SD: B_65x39_Caseless { - airFriction = -0.00054; - hit = 8.75; - supersonicCrackFar[] = {}; - supersonicCrackNear[] = {}; - typicalSpeed = 320; - audibleFire = 0.8; - visibleFire = 2.5; - }; - - class B_65x39_Case; - class ACE_B_65x39_Case_SD: B_65x39_Case { - airFriction = -0.00054; - hit = 8.75; - supersonicCrackFar[] = {}; - supersonicCrackNear[] = {}; - typicalSpeed = 320; - audibleFire = 0.8; - visibleFire = 2.5; - }; - - // armor piercing - class ACE_B_65x39_Caseless_AP: B_65x39_Caseless { - caliber = 1.8; - hit = 10.5; - }; - - class ACE_B_65x39_Case_AP: B_65x39_Case { - caliber = 1.8; - hit = 10.5; - }; - - - /* 5.56x45mm NATO */ - - // IR Dim - class B_556x45_Ball_Tracer_Red; - class ACE_B_556x45_Ball_Tracer_Dim: B_556x45_Ball_Tracer_Red { - nvgOnly = 1; - }; - - // sub sonic - class B_556x45_Ball; - class ACE_B_556x45_Ball_SD: B_556x45_Ball { - airFriction = -0.0006; - hit = 7; - supersonicCrackFar[] = {}; - supersonicCrackNear[] = {}; - typicalSpeed = 320; - audibleFire = 0.6; - visibleFire = 2.0; - }; - - // armor piercing - class ACE_B_556x45_Ball_AP: B_556x45_Ball { - caliber = 1.4; - hit = 8.4; - }; - - - /* 7.62x51mm NATO */ - - // IR Dim - class B_762x51_Tracer_Red; - class ACE_B_762x51_Tracer_Dim: B_762x51_Tracer_Red { - nvgOnly = 1; - }; - - // sub sonic - class B_762x51_Ball; - class ACE_B_762x51_Ball_SD: B_762x51_Ball { - airFriction = -0.00048; - hit = 10.5; - supersonicCrackFar[] = {}; - supersonicCrackNear[] = {}; - typicalSpeed = 320; - audibleFire = 0.9; - visibleFire = 3.0; - }; - - // armor piercing - class ACE_B_762x51_Ball_AP: B_762x51_Ball { - caliber = 2.4; - hit = 12.6; - }; - - // M118 LR - class ACE_B_762x51_M118LR: B_762x51_Ball { - //typicalspeed = 792; - //airfriction = -0.0008577; - }; - - - /* .338 Lapua Magnum */ - - // IR Dim - class B_338_Ball; - class ACE_B_338_Ball_Tracer_Dim: B_338_Ball { - nvgOnly = 1; - }; - - //AP - class ACE_B_338_Ball_AP: B_338_Ball { - caliber = 3.6; - hit = 18.9; - }; - - //SD - class ACE_B_338_Ball_SD: B_338_Ball { - airFriction = -0.00036; - hit = 15.75; - supersonicCrackFar[] = {}; - supersonicCrackNear[] = {}; - typicalSpeed = 320; - audibleFire = 1.2; - visibleFire = 4.0; - }; - - - /* .338 Norma Magnum */ - - //IR Dim - class B_338_NM_Ball; - class ACE_B_338_NM_Ball_Tracer_Dim: B_338_NM_Ball { - nvgOnly = 1; - }; - - //AP - class ACE_B_338_NM_Ball_AP: B_338_NM_Ball { - caliber = 3.2; - hit = 16.8; - }; - - - /* 9.3x64mm */ - - //IR Dim - class B_93x64_Ball; - class ACE_B_93x64_Ball_Tracer_Dim: B_93x64_Ball { - nvgOnly = 1; - }; - - //AP - class ACE_B_93x64_Ball_AP: B_93x64_Ball { - caliber = 4.0; - hit = 21; - }; - - //SD - class ACE_B_93x64_Ball_SD: B_93x64_Ball { - airFriction = -0.00042; - hit = 17.5; - supersonicCrackFar[] = {}; - supersonicCrackNear[] = {}; - typicalSpeed = 320; - audibleFire = 1.2; - visibleFire = 4.0; - }; -}; diff --git a/addons/magazines/CfgMagazines.hpp b/addons/magazines/CfgMagazines.hpp deleted file mode 100644 index cea8c31004..0000000000 --- a/addons/magazines/CfgMagazines.hpp +++ /dev/null @@ -1,266 +0,0 @@ - -class CfgMagazines { - - /* 6.5x39mm Grendel - MX */ - - class 30Rnd_65x39_caseless_mag_Tracer; - class ACE_30Rnd_65x39_caseless_mag_Tracer_Dim: 30Rnd_65x39_caseless_mag_Tracer { - author = "$STR_ACE_Common_ACETeam"; - ammo = "ACE_B_65x39_Caseless_Tracer_Dim"; - displayName = "$STR_ACE_30Rnd_65x39_caseless_mag_Tracer_DimName"; - displayNameShort = "$STR_ACE_30Rnd_65x39_caseless_mag_Tracer_DimNameShort"; - descriptionShort = "$STR_ACE_30Rnd_65x39_caseless_mag_Tracer_DimDescription"; - picture = "\A3\weapons_f\data\ui\m_30stanag_caseless_yellow_CA.paa"; - }; - - class 30Rnd_65x39_caseless_mag; - class ACE_30Rnd_65x39_caseless_mag_SD: 30Rnd_65x39_caseless_mag { - author = "$STR_ACE_Common_ACETeam"; - ammo = "ACE_B_65x39_Caseless_SD"; - displayName = "$STR_ACE_30Rnd_65x39_caseless_mag_SDName"; - displayNameShort = "$STR_ACE_30Rnd_65x39_caseless_mag_SDNameShort"; - descriptionShort = "$STR_ACE_30Rnd_65x39_caseless_mag_SDDescription"; - picture = "\A3\weapons_f\data\ui\m_30stanag_caseless_green_CA.paa"; - initSpeed = 320; - }; - - class ACE_30Rnd_65x39_caseless_mag_AP: 30Rnd_65x39_caseless_mag { - author = "$STR_ACE_Common_ACETeam"; - ammo = "ACE_B_65x39_Caseless_AP"; - displayName = "$STR_ACE_30Rnd_65x39_caseless_mag_APName"; - displayNameShort = "$STR_ACE_30Rnd_65x39_caseless_mag_APNameShort"; - descriptionShort = "$STR_ACE_30Rnd_65x39_caseless_mag_APDescription"; - }; - - - /* 6.5x39mm Grendel - Katiba */ - - class 100Rnd_65x39_caseless_mag; - class 200Rnd_65x39_cased_Box: 100Rnd_65x39_caseless_mag { - initSpeed = 691; - }; - - class 30Rnd_65x39_caseless_green_mag_Tracer; - class ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim: 30Rnd_65x39_caseless_green_mag_Tracer { - author = "$STR_ACE_Common_ACETeam"; - ammo = "ACE_B_65x39_Caseless_Tracer_Dim"; - displayName = "$STR_ACE_30Rnd_65x39_caseless_green_mag_Tracer_DimName"; - displayNameShort = "$STR_ACE_30Rnd_65x39_caseless_green_mag_Tracer_DimNameShort"; - descriptionShort = "$STR_ACE_30Rnd_65x39_caseless_green_mag_Tracer_DimDescription"; - }; - - class 30Rnd_65x39_caseless_green; - class ACE_30Rnd_65x39_caseless_green_mag_SD: 30Rnd_65x39_caseless_green { - author = "$STR_ACE_Common_ACETeam"; - ammo = "ACE_B_65x39_Caseless_SD"; - displayName = "$STR_ACE_30Rnd_65x39_caseless_green_mag_SDName"; - displayNameShort = "$STR_ACE_30Rnd_65x39_caseless_green_mag_SDNameShort"; - descriptionShort = "$STR_ACE_30Rnd_65x39_caseless_green_mag_SDDescription"; - initSpeed = 320; - }; - - class ACE_30Rnd_65x39_caseless_green_mag_AP: 30Rnd_65x39_caseless_green { - author = "$STR_ACE_Common_ACETeam"; - ammo = "ACE_B_65x39_Caseless_AP"; - displayName = "$STR_ACE_30Rnd_65x39_caseless_green_mag_APName"; - displayNameShort = "$STR_ACE_30Rnd_65x39_caseless_green_mag_APNameShort"; - descriptionShort = "$STR_ACE_30Rnd_65x39_caseless_green_mag_APDescription"; - }; - - - /* 5.56x45mm NATO */ - - class 30Rnd_556x45_Stanag_Tracer_Red; //picture = "\A3\weapons_f\data\ui\m_30stanag_red_ca.paa"; - class ACE_30Rnd_556x45_Stanag_Tracer_Dim: 30Rnd_556x45_Stanag_Tracer_Red { - author = "$STR_ACE_Common_ACETeam"; - ammo = "ACE_B_556x45_Ball_Tracer_Dim"; - displayName = "$STR_ACE_30Rnd_556x45_mag_Tracer_DimName"; - displayNameShort = "$STR_ACE_30Rnd_556x45_mag_Tracer_DimNameShort"; - descriptionShort = "$STR_ACE_30Rnd_556x45_mag_Tracer_DimDescription"; - picture = "\A3\weapons_f\data\ui\m_30stanag_yellow_ca.paa"; - }; - - class 30Rnd_556x45_Stanag; - class ACE_30Rnd_556x45_Stanag_SD: 30Rnd_556x45_Stanag { - author = "$STR_ACE_Common_ACETeam"; - ammo = "ACE_B_556x45_Ball_SD"; - displayName = "$STR_ACE_30Rnd_556x45_mag_SDName"; - displayNameShort = "$STR_ACE_30Rnd_556x45_mag_SDNameShort"; - descriptionShort = "$STR_ACE_30Rnd_556x45_mag_SDDescription"; - initSpeed = 320; - picture = "\A3\weapons_f\data\ui\m_30stanag_green_ca.paa"; - }; - - class ACE_30Rnd_556x45_Stanag_AP: 30Rnd_556x45_Stanag { - author = "$STR_ACE_Common_ACETeam"; - ammo = "ACE_B_556x45_Ball_AP"; - displayName = "$STR_ACE_30Rnd_556x45_mag_APName"; - displayNameShort = "$STR_ACE_30Rnd_556x45_mag_APNameShort"; - descriptionShort = "$STR_ACE_30Rnd_556x45_mag_APDescription"; - }; - - - /* 7.62x51mm NATO */ - - class 20Rnd_762x51_Mag; - class ACE_20Rnd_762x51_Mag_Tracer: 20Rnd_762x51_Mag { //@todo Green tracers for opfor and yellow tracers for independent - author = "$STR_ACE_Common_ACETeam"; - ammo = "B_762x51_Tracer_Red"; - displayName = "$STR_ACE_20Rnd_762x51_mag_TracerName"; - displayNameShort = "$STR_ACE_20Rnd_762x51_mag_TracerNameShort"; - descriptionShort = "$STR_ACE_20Rnd_762x51_mag_TracerDescription"; - tracersEvery = 1; - }; - - class ACE_20Rnd_762x51_Mag_Tracer_Dim: ACE_20Rnd_762x51_Mag_Tracer { - author = "$STR_ACE_Common_ACETeam"; - ammo = "ACE_B_762x51_Tracer_Dim"; - displayName = "$STR_ACE_20Rnd_762x51_mag_Tracer_DimName"; - displayNameShort = "$STR_ACE_20Rnd_762x51_mag_Tracer_DimNameShort"; - descriptionShort = "$STR_ACE_20Rnd_762x51_mag_Tracer_DimDescription"; - }; - - class ACE_20Rnd_762x51_Mag_SD: 20Rnd_762x51_Mag { - author = "$STR_ACE_Common_ACETeam"; - ammo = "ACE_B_762x51_Ball_SD"; - displayName = "$STR_ACE_20Rnd_762x51_mag_SDName"; - displayNameShort = "$STR_ACE_20Rnd_762x51_mag_SDNameShort"; - descriptionShort = "$STR_ACE_20Rnd_762x51_mag_SDDescription"; - initSpeed = 320; - }; - - class ACE_20Rnd_762x51_Mag_AP: 20Rnd_762x51_Mag { - author = "$STR_ACE_Common_ACETeam"; - ammo = "ACE_B_762x51_Ball_AP"; - displayName = "$STR_ACE_20Rnd_762x51_mag_APName"; - displayNameShort = "$STR_ACE_20Rnd_762x51_mag_APNameShort"; - descriptionShort = "$STR_ACE_20Rnd_762x51_mag_APDescription"; - }; - - - /* 338 Lapua Magnum */ - class 10Rnd_338_Mag; - class ACE_10Rnd_338_Mag_Tracer: 10Rnd_338_Mag { - author = "$STR_ACE_Common_ACETeam"; - displayName = "$STR_ACE_10Rnd_338_Mag_TracerName"; - displayNameShort = "$STR_ACE_10Rnd_338_Mag_TracerNameShort"; - descriptionShort = "$STR_ACE_10Rnd_338_Mag_TracerDescription"; - tracersEvery = 1; - }; - - class ACE_10Rnd_338_Mag_Tracer_Dim: ACE_10Rnd_338_Mag_Tracer { - author = "$STR_ACE_Common_ACETeam"; - ammo = "ACE_B_338_Ball_Tracer_Dim"; - displayName = "$STR_ACE_10Rnd_388_Mag_Tracer_DimName"; - displayNameShort = "$STR_ACE_10Rnd_338_Mag_Tracer_DimNameShort"; - descriptionShort = "$STR_ACE_10Rnd_338_Mag_Tracer_DimDescription"; - }; - - class ACE_10Rnd_338_Mag_AP: 10Rnd_338_Mag { - author = "$STR_ACE_Common_ACETeam"; - ammo ="ACE_B_338_Ball_AP"; - displayName = "$STR_ACE_10Rnd_338_Mag_APName"; - displayNameShort = "$STR_ACE_10Rnd_338_Mag_APNameShort"; - descriptionShort = "$STR_ACE_10Rnd_338_Mag_APDescription"; - }; - - class ACE_10Rnd_338_Mag_SD: 10Rnd_338_Mag { - author = "$STR_ACE_Common_ACETeam"; - ammo = "ACE_B_338_Ball_SD"; - displayName = "$STR_ACE_10Rnd_338_Mag_SDName"; - displayNameShort = "$STR_ACE_10Rnd_338_Mag_SDNameShort"; - descriptionShort = "$STR_ACE_10Rnd_338_Mag_SDDescription"; - initSpeed = 320; - }; - - - /* .333 Norma Magnum */ - - class 130Rnd_338_Mag; - class ACE_130Rnd_338_Mag_Tracer: 130Rnd_338_Mag { - author = "$STR_ACE_Common_ACETeam"; - displayName = "$STR_ACE_130Rnd_338_Mag_TracerName"; - displayNameShort = "$STR_ACE_130Rnd_338_Mag_TracerNameShort"; - descriptionShort = "$STR_ACE_130Rnd_338_Mag_TracerDescription"; - tracersEvery = 1; - }; - - class ACE_130Rnd_338_Mag_Tracer_Dim: ACE_130Rnd_338_Mag_Tracer { - author = "$STR_ACE_Common_ACETeam"; - ammo = "ACE_B_338_NM_Ball_Tracer_Dim"; - displayName = "$STR_ACE_130Rnd_338_Mag_Tracer_DimName"; - displayNameShort = "$STR_ACE_130Rnd_338_Mag_Tracer_DimNameShort"; - descriptionShort = "$STR_ACE_130Rnd_338_Mag_Tracer_DimDescription"; - }; - - class ACE_130Rnd_338_Mag_AP: 130Rnd_338_Mag { - author = "$STR_ACE_Common_ACETeam"; - ammo = "ACE_B_338_NM_Ball_AP"; - displayName = "$STR_ACE_130Rnd_338_Mag_APName"; - displayNameShort = "$STR_ACE_130Rnd_338_Mag_APNameShort"; - descriptionShort = "$STR_ACE_130Rnd_338_Mag_APDescription"; - }; - - - /* 9.3x64mm */ - //10Rnd Mags - - class 10Rnd_93x64_DMR_05_Mag; - class ACE_10Rnd_93x64_DMR_05_Mag_Tracer: 10Rnd_93x64_DMR_05_Mag { - author = "$STR_ACE_Common_ACEETeam"; - displayName = "$STR_ACE_10Rnd_93x64_DMR_05_Mag_TracerName"; - displayNameShort = "$STR_ACE_10Rnd_93x64_DMR_05_Mag_TracerNameShort"; - descriptionShort = "$STR_ACE_10Rnd_93x64_DMR_05_Mag_TracerDescription"; - tracersEvery = 1; - }; - - class ACE_10Rnd_93x64_DMR_05_Mag_Tracer_Dim: ACE_10Rnd_93x64_DMR_05_Mag_Tracer { - author = "$STR_ACE_Common_ACEETeam"; - ammo ="ACE_B_93x64_Ball_Tracer_Dim"; - displayName = "$STR_ACE_10Rnd_93x64_DMR_05_Mag_Tracer_DimName"; - displayNameShort = "$STR_ACE_10Rnd_93x64_DMR_05_Mag_Tracer_DimNameShort"; - descriptionShort = "$STR_ACE_10Rnd_93x64_DMR_05_Mag_Tracer_DimDescription"; - }; - - class ACE_10Rnd_93x64_DMR_05_Mag_AP: 10Rnd_93x64_DMR_05_Mag { - author = "$STR_ACE_Common_ACEETeam"; - ammo = "ACE_B_93x64_Ball_AP"; - displayName = "$STR_ACE_10Rnd_93x64_DMR_05_Mag_APName"; - displayNameShort = "$STR_ACE_10Rnd_93x64_DMR_05_Mag_APNameShort"; - descriptionShort = "$STR_ACE_10Rnd_93x64_DMR_05_Mag_APDescription"; - }; - - class ACE_10Rnd_93x64_DMR_05_Mag_SD: 10Rnd_93x64_DMR_05_Mag { - author = "$STR_ACE_Common_ACEETeam"; - ammo = "ACE_B_93x64_Ball_SD"; - displayName = "$STR_ACE_10Rnd_93x64_DMR_05_Mag_SDName"; - displayNameShort = "$STR_ACE_10Rnd_93x64_DMR_05_Mag_SDNameShort"; - descriptionShort = "$STR_ACE_10Rnd_93x64_DMR_05_Mag_SDDescription"; - initSpeed = 320; - }; - //150Rnd Belt - class 150Rnd_93x64_Mag; - class ACE_150Rnd_93x64_Mag_Tracer: 150Rnd_93x64_Mag { - author = "$STR_ACE_Common_ACEETeam"; - displayName = "$STR_ACE_150Rnd_93x64_Mag_TracerName"; - displayNameShort = "$STR_ACE_150Rnd_93x64_Mag_TracerNameShort"; - descriptionShort = "$STR_ACE_150Rnd_93x64_Mag_TracerDescription"; - tracersEvery = 1; - }; - - class ACE_150Rnd_93x64_Mag_Tracer_Dim: ACE_150Rnd_93x64_Mag_Tracer { - author = "$STR_ACE_Common_ACEETeam"; - ammo ="ACE_B_93x64_Ball_Tracer_Dim"; - displayName = "$STR_ACE_150Rnd_93x64_Mag_Tracer_DimName"; - displayNameShort = "$STR_ACE_150Rnd_93x64_Mag_Tracer_DimNameShort"; - descriptionShort = "$STR_ACE_150Rnd_93x64_Mag_Tracer_DimDescription"; - }; - - class ACE_150Rnd_93x64_Mag_AP: 150Rnd_93x64_Mag { - author = "$STR_ACE_Common_ACEETeam"; - ammo = "ACE_B_93x64_Ball_AP"; - displayName = "$STR_ACE_150Rnd_93x64_Mag_APName"; - displayNameShort = "$STR_ACE_150Rnd_93x64_Mag_APNameShort"; - descriptionShort = "$STR_ACE_150Rnd_93x64_Mag_APDescription"; - }; -}; diff --git a/addons/magazines/CfgVehicles.hpp b/addons/magazines/CfgVehicles.hpp deleted file mode 100644 index 66e63cfa09..0000000000 --- a/addons/magazines/CfgVehicles.hpp +++ /dev/null @@ -1,172 +0,0 @@ - -class CfgVehicles { - class NATO_Box_Base; - class Box_NATO_Wps_F: NATO_Box_Base { - class TransportMagazines { - MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_mag_AP,2); - }; - }; - - class Box_NATO_WpsSpecial_F: NATO_Box_Base { - class TransportMagazines { - MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_mag_Tracer_Dim,2); - MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_Tracer_Dim,1); - }; - }; - - class Box_NATO_Ammo_F: NATO_Box_Base { - class TransportMagazines { - MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_mag_AP,2); - MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_mag_SD,2); - }; - }; - - class Box_NATO_Support_F: NATO_Box_Base { - class TransportMagazines { - MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_mag_SD,6); - MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_SD,3); - }; - }; - - class ReammoBox_F; - class B_supplyCrate_F: ReammoBox_F { - class TransportMagazines { - MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_mag_AP,2); - MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_mag_SD,2); - }; - }; - - class EAST_Box_Base; - class Box_East_Wps_F: EAST_Box_Base { - class TransportMagazines { - MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_green_mag_AP,2); - }; - }; - - class Box_East_WpsSpecial_F: EAST_Box_Base { - class TransportMagazines { - MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim,2); - MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_Tracer_Dim,1); - }; - }; - - class Box_East_Ammo_F: EAST_Box_Base { - class TransportMagazines { - MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_green_mag_AP,2); - MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_green_mag_SD,2); - }; - }; - - class Box_East_Support_F: EAST_Box_Base { - class TransportMagazines { - MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_green_mag_SD,6); - MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_SD,3); - }; - }; - - class O_supplyCrate_F: B_supplyCrate_F { - class TransportMagazines { - MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_green_mag_AP,2); - MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_green_mag_SD,2); - }; - }; - - class IND_Box_Base; - class Box_IND_Wps_F: IND_Box_Base { - class TransportMagazines { - MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_AP,2); - }; - }; - - class Box_IND_WpsSpecial_F: IND_Box_Base { - class TransportMagazines { - MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_Tracer_Dim,2); - }; - }; - - class Box_IND_Ammo_F: IND_Box_Base { - class TransportMagazines { - MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_AP,2); - MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_SD,2); - }; - }; - - class Box_IND_Support_F: IND_Box_Base { - class TransportMagazines { - MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_SD,6); - }; - }; - - class FIA_Box_Base_F; - class Box_FIA_Wps_F: FIA_Box_Base_F { - class TransportMagazines { - MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_AP,2); - }; - }; - - class Box_FIA_Ammo_F: FIA_Box_Base_F { - class TransportMagazines { - MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_AP,2); - MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_SD,2); - }; - }; - - class Box_FIA_Support_F: FIA_Box_Base_F { - class TransportMagazines { - MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_SD,6); - }; - }; - - class I_supplyCrate_F: B_supplyCrate_F { - class TransportMagazines { - MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_AP,2); - MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_SD,2); - }; - }; - - class IG_supplyCrate_F: ReammoBox_F { - class TransportMagazines { - MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_AP,2); - MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_SD,2); - }; - }; - - class C_supplyCrate_F: ReammoBox_F { - class TransportMagazines { - MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_green_mag_AP,2); - MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_green_mag_SD,2); - }; - }; - - class ACE_Box_Misc: Box_NATO_Support_F { - class TransportMagazines { - MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_mag_Tracer_Dim,2); - MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_mag_SD,2); - MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_mag_AP,2); - MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim,2); - MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_green_mag_SD,2); - MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_green_mag_AP,2); - MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_Tracer_Dim,2); - MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_SD,2); - MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_AP,2); - /*MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_Tracer,2); - MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_Tracer_Dim,2); - MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_SD,2); - MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_AP,2);*/ - MACRO_ADDMAGAZINE(ACE_10Rnd_338_Mag_Tracer,2); - MACRO_ADDMAGAZINE(ACE_10Rnd_338_Mag_Tracer_Dim,2); - MACRO_ADDMAGAZINE(ACE_10Rnd_338_Mag_AP,2); - MACRO_ADDMAGAZINE(ACE_10Rnd_338_Mag_SD,2); - MACRO_ADDMAGAZINE(ACE_130Rnd_338_Mag_Tracer,2); - MACRO_ADDMAGAZINE(ACE_130Rnd_338_Mag_Tracer_Dim,2); - MACRO_ADDMAGAZINE(ACE_130Rnd_338_Mag_AP,2); - MACRO_ADDMAGAZINE(ACE_10Rnd_93x64_DMR_05_Mag_Tracer,2); - MACRO_ADDMAGAZINE(ACE_10Rnd_93x64_DMR_05_Mag_Tracer_Dim,2); - MACRO_ADDMAGAZINE(ACE_10Rnd_93x64_DMR_05_Mag_AP,2); - MACRO_ADDMAGAZINE(ACE_10Rnd_93x64_DMR_05_Mag_SD,2); - MACRO_ADDMAGAZINE(ACE_150Rnd_93x64_Mag_Tracer,2); - MACRO_ADDMAGAZINE(ACE_150Rnd_93x64_Mag_Tracer_Dim,2); - MACRO_ADDMAGAZINE(ACE_150Rnd_93x64_Mag_AP,2); - }; - }; -}; diff --git a/addons/magazines/CfgWeapons.hpp b/addons/magazines/CfgWeapons.hpp deleted file mode 100644 index 787867070e..0000000000 --- a/addons/magazines/CfgWeapons.hpp +++ /dev/null @@ -1,408 +0,0 @@ - -class CfgWeapons { - - /* MX */ - - class Rifle_Base_F; - class arifle_MX_Base_F: Rifle_Base_F { - magazines[] += { - "ACE_30Rnd_65x39_caseless_mag_Tracer_Dim", - "ACE_30Rnd_65x39_caseless_mag_SD", - "ACE_30Rnd_65x39_caseless_mag_AP", - "100Rnd_65x39_caseless_mag", - "100Rnd_65x39_caseless_mag_Tracer" - }; - }; - - class arifle_MX_SW_F: arifle_MX_Base_F { - magazines[] += { - "30Rnd_65x39_caseless_mag", - "30Rnd_65x39_caseless_mag_Tracer" - }; - }; - - class arifle_MXM_F: arifle_MX_Base_F { - magazines[] += { - "30Rnd_65x39_caseless_mag", - "30Rnd_65x39_caseless_mag_Tracer" - }; - }; - - - /* Katiba */ - class Rifle_Long_Base_F; - class arifle_katiba_Base_F: Rifle_Base_F { - magazines[] += { - "ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim", - "ACE_30Rnd_65x39_caseless_green_mag_SD", - "ACE_30Rnd_65x39_caseless_green_mag_AP" - }; - }; - - class DMR_02_base_F: Rifle_Long_Base_F { - magazines[] += { - "ACE_10Rnd_338_Mag_Tracer", - "ACE_10Rnd_338_Mag_Tracer_Dim", - "ACE_10Rnd_338_Mag_AP", - "ACE_10Rnd_338_Mag_SD" - }; - }; - - class MMG_02_base_F: Rifle_Long_Base_F { - magazines[] += { - "ACE_130Rnd_338_Mag_Tracer", - "ACE_130Rnd_338_Mag_Tracer_Dim", - "ACE_130Rnd_338_Mag_AP" - }; - }; - - class DMR_05_base_F: Rifle_Long_Base_F { - magazines[] += { - "ACE_10Rnd_93x64_DMR_05_Mag_Tracer", - "ACE_10Rnd_93x64_DMR_05_Mag_Tracer_Dim", - "ACE_10Rnd_93x64_DMR_05_Mag_AP", - "ACE_10Rnd_93x64_DMR_05_Mag_SD" - }; - }; - - class MMG_01_base_F: Rifle_Long_Base_F { - magazines[] += { - "ACE_150Rnd_93x64_Mag_Tracer", - "ACE_150Rnd_93x64_Mag_Tracer_Dim", - "ACE_150Rnd_93x64_Mag_AP" - }; - }; - - - /* Assault Rifles */ - - class Tavor_base_F: Rifle_Base_F { - magazines[] += { - "ACE_30Rnd_556x45_Stanag_Tracer_Dim", - "ACE_30Rnd_556x45_Stanag_SD", - "ACE_30Rnd_556x45_Stanag_AP" - }; - }; - - class mk20_base_F: Rifle_Base_F { - magazines[] += { - "ACE_30Rnd_556x45_Stanag_Tracer_Dim", - "ACE_30Rnd_556x45_Stanag_SD", - "ACE_30Rnd_556x45_Stanag_AP" - }; - }; - - - /* SMGs */ - - class SDAR_base_F: Rifle_Base_F { - magazines[] += { - "ACE_30Rnd_556x45_Stanag_Tracer_Dim", - "ACE_30Rnd_556x45_Stanag_SD", - "ACE_30Rnd_556x45_Stanag_AP" - }; - }; - - - /* Silencers */ - - class ItemCore; - class InventoryMuzzleItem_Base_F; - - class muzzle_snds_H: ItemCore { - class ItemInfo: InventoryMuzzleItem_Base_F { - class MagazineCoef { - initSpeed = 1.05; - }; - - class AmmoCoef { - hit = 0.9; - visibleFire = 0.5; - audibleFire = 0.1; - visibleFireTime = 0.5; - audibleFireTime = 0.5; - cost = 1.0; - typicalSpeed = 1.0; - airFriction = 1.0; - }; - - class MuzzleCoef { - dispersionCoef = "0.8f"; - artilleryDispersionCoef = "1.0f"; - fireLightCoef = "0.5f"; - recoilCoef = "1.0f"; - recoilProneCoef = "1.0f"; - minRangeCoef = "1.0f"; - minRangeProbabCoef = "1.0f"; - midRangeCoef = "1.0f"; - midRangeProbabCoef = "1.0f"; - maxRangeCoef = "1.0f"; - maxRangeProbabCoef = "1.0f"; - }; - }; - }; - - class muzzle_snds_L: muzzle_snds_H { - class ItemInfo: ItemInfo { - class MagazineCoef { - initSpeed = 1.05; - }; - - class AmmoCoef { - hit = 0.9; - visibleFire = 0.5; - audibleFire = 0.1; - visibleFireTime = 0.5; - audibleFireTime = 0.5; - cost = 1.0; - typicalSpeed = 1.0; - airFriction = 1.0; - }; - - class MuzzleCoef { - dispersionCoef = "0.8f"; - artilleryDispersionCoef = "1.0f"; - fireLightCoef = "0.5f"; - recoilCoef = "1.0f"; - recoilProneCoef = "1.0f"; - minRangeCoef = "1.0f"; - minRangeProbabCoef = "1.0f"; - midRangeCoef = "1.0f"; - midRangeProbabCoef = "1.0f"; - maxRangeCoef = "1.0f"; - maxRangeProbabCoef = "1.0f"; - }; - }; - }; - - class muzzle_snds_M: muzzle_snds_H { - class ItemInfo: ItemInfo { - class MagazineCoef { - initSpeed = 1.05; - }; - - class AmmoCoef { - hit = 0.9; - visibleFire = 0.5; - audibleFire = 0.1; - visibleFireTime = 0.5; - audibleFireTime = 0.5; - cost = 1.0; - typicalSpeed = 1.0; - airFriction = 1.0; - }; - - class MuzzleCoef { - dispersionCoef = "0.8f"; - artilleryDispersionCoef = "1.0f"; - fireLightCoef = "0.5f"; - recoilCoef = "1.0f"; - recoilProneCoef = "1.0f"; - minRangeCoef = "1.0f"; - minRangeProbabCoef = "1.0f"; - midRangeCoef = "1.0f"; - midRangeProbabCoef = "1.0f"; - maxRangeCoef = "1.0f"; - maxRangeProbabCoef = "1.0f"; - }; - }; - }; - - class muzzle_snds_B: muzzle_snds_H { - class ItemInfo: ItemInfo { - class MagazineCoef { - initSpeed = 1.05; - }; - - class AmmoCoef { - hit = 0.9; - visibleFire = 0.5; - audibleFire = 0.1; - visibleFireTime = 0.5; - audibleFireTime = 0.5; - cost = 1.0; - typicalSpeed = 1.0; - airFriction = 1.0; - }; - - class MuzzleCoef { - dispersionCoef = "0.8f"; - artilleryDispersionCoef = "1.0f"; - fireLightCoef = "0.5f"; - recoilCoef = "1.0f"; - recoilProneCoef = "1.0f"; - minRangeCoef = "1.0f"; - minRangeProbabCoef = "1.0f"; - midRangeCoef = "1.0f"; - midRangeProbabCoef = "1.0f"; - maxRangeCoef = "1.0f"; - maxRangeProbabCoef = "1.0f"; - }; - }; - }; - - class muzzle_snds_H_MG: muzzle_snds_H { - class ItemInfo: ItemInfo { - class MagazineCoef { - initSpeed = 1.05; - }; - - class AmmoCoef { - hit = 0.9; - visibleFire = 0.5; - audibleFire = 0.1; - visibleFireTime = 0.5; - audibleFireTime = 0.5; - cost = 1.0; - typicalSpeed = 1.0; - airFriction = 1.0; - }; - - class MuzzleCoef { - dispersionCoef = "0.8f"; - artilleryDispersionCoef = "1.0f"; - fireLightCoef = "0.5f"; - recoilCoef = "1.0f"; - recoilProneCoef = "1.0f"; - minRangeCoef = "1.0f"; - minRangeProbabCoef = "1.0f"; - midRangeCoef = "1.0f"; - midRangeProbabCoef = "1.0f"; - maxRangeCoef = "1.0f"; - maxRangeProbabCoef = "1.0f"; - }; - }; - }; - - class muzzle_snds_H_SW: muzzle_snds_H_MG { - class ItemInfo: ItemInfo { - class MagazineCoef { - initSpeed = 1.05; - }; - - class AmmoCoef { - hit = 0.9; - visibleFire = 0.5; - audibleFire = 0.1; - visibleFireTime = 0.5; - audibleFireTime = 0.5; - cost = 1.0; - typicalSpeed = 1.0; - airFriction = 1.0; - }; - - class MuzzleCoef { - dispersionCoef = "0.8f"; - artilleryDispersionCoef = "1.0f"; - fireLightCoef = "0.5f"; - recoilCoef = "1.0f"; - recoilProneCoef = "1.0f"; - minRangeCoef = "1.0f"; - minRangeProbabCoef = "1.0f"; - midRangeCoef = "1.0f"; - midRangeProbabCoef = "1.0f"; - maxRangeCoef = "1.0f"; - maxRangeProbabCoef = "1.0f"; - }; - }; - }; - - class muzzle_snds_acp: muzzle_snds_H { - class ItemInfo: ItemInfo { - class MagazineCoef { - initSpeed = 1.05; - }; - - class AmmoCoef { - hit = 0.9; - visibleFire = 0.5; - audibleFire = 0.1; - visibleFireTime = 0.5; - audibleFireTime = 0.5; - cost = 1.0; - typicalSpeed = 1.0; - airFriction = 1.0; - }; - - class MuzzleCoef { - dispersionCoef = "0.8f"; - artilleryDispersionCoef = "1.0f"; - fireLightCoef = "0.5f"; - recoilCoef = "1.0f"; - recoilProneCoef = "1.0f"; - minRangeCoef = "1.0f"; - minRangeProbabCoef = "1.0f"; - midRangeCoef = "1.0f"; - midRangeProbabCoef = "1.0f"; - maxRangeCoef = "1.0f"; - maxRangeProbabCoef = "1.0f"; - }; - }; - }; - - class muzzle_snds_338_black: ItemCore { - class ItemInfo: InventoryMuzzleItem_Base_F { - class MagazineCoef { - initSpeed = 1.05; - }; - - class AmmoCoef { - hit = 0.9; - visibleFire = 0.5; - audibleFire = 0.1; - visibleFireTime = 0.5; - audibleFireTime = 0.5; - cost = 1.0; - typicalSpeed = 1.0; - airFriction = 1.0; - }; - - class MuzzleCoef { - dispersionCoef = "0.8f"; - artilleryDispersionCoef = "1.0f"; - fireLightCoef = "0.5f"; - recoilCoef = "1.0f"; - recoilProneCoef = "1.0f"; - minRangeCoef = "1.0f"; - minRangeProbabCoef = "1.0f"; - midRangeCoef = "1.0f"; - midRangeProbabCoef = "1.0f"; - maxRangeCoef = "1.0f"; - maxRangeProbabCoef = "1.0f"; - }; - }; - }; - - class muzzle_snds_93mmg: ItemCore { - class ItemInfo: InventoryMuzzleItem_Base_F { - class MagazineCoef { - initSpeed = 1.05; - }; - - class AmmoCoef { - hit = 0.9; - visibleFire = 0.5; - audibleFire = 0.1; - visibleFireTime = 0.5; - audibleFireTime = 0.5; - cost = 1.0; - typicalSpeed = 1.0; - airFriction = 1.0; - }; - - class MuzzleCoef { - dispersionCoef = "0.8f"; - artilleryDispersionCoef = "1.0f"; - fireLightCoef = "0.5f"; - recoilCoef = "1.0f"; - recoilProneCoef = "1.0f"; - minRangeCoef = "1.0f"; - minRangeProbabCoef = "1.0f"; - midRangeCoef = "1.0f"; - midRangeProbabCoef = "1.0f"; - maxRangeCoef = "1.0f"; - maxRangeProbabCoef = "1.0f"; - }; - }; - }; -}; diff --git a/addons/magazines/README.md b/addons/magazines/README.md deleted file mode 100644 index 041a562268..0000000000 --- a/addons/magazines/README.md +++ /dev/null @@ -1,12 +0,0 @@ -ace_magazines -============= - -Adds new types of ammunition, such as sub-sonic rounds. - - -## Maintainers - -The people responsible for merging changes to this component or answering potential questions. - -- [KoffeinFlummi](https://github.com/KoffeinFlummi) -- [commy2](https://github.com/commy2) diff --git a/addons/magazines/config.cpp b/addons/magazines/config.cpp deleted file mode 100644 index c757d62f5c..0000000000 --- a/addons/magazines/config.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "script_component.hpp" - -class CfgPatches { - class ADDON { - units[] = {}; - weapons[] = {}; - requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_common"}; - author[] = {"commy2"}; - authorUrl = "https://github.com/commy2"; - VERSION_CONFIG; - }; -}; - -#include "CfgAmmo.hpp" -#include "CfgMagazines.hpp" -#include "CfgVehicles.hpp" -#include "CfgWeapons.hpp" diff --git a/addons/magazines/newclasses.txt b/addons/magazines/newclasses.txt deleted file mode 100644 index 0c40a1b904..0000000000 --- a/addons/magazines/newclasses.txt +++ /dev/null @@ -1,67 +0,0 @@ - -// CFGAmmo - -ACE_B_65x39_Caseless_Tracer_Dim -ACE_B_65x39_Caseless_SD -ACE_B_65x39_Caseless_AP - -ACE_B_65x39_Case_Tracer_Dim -ACE_B_65x39_Case_SD -ACE_B_65x39_Case_AP - -ACE_B_556x45_Ball_Tracer_Dim -ACE_B_556x45_Ball_SD -ACE_B_556x45_Ball_AP - -ACE_B_762x51_Tracer_Dim -ACE_B_762x51_Ball_SD -ACE_B_762x51_Ball_AP -ACE_B_762x51_M118LR - -ACE_B_338_Ball_Tracer_Dim -ACE_B_338_Ball_AP -ACE_B_338_Ball_SD - -ACE_B_338_NM_Ball_Tracer_Dim -ACE_B_338_NM_Ball_AP - -ACE_B_93x64_Ball_Tracer_Dim -ACE_B_93x64_Ball_AP -ACE_B_93x64_Ball_SD - -// CFGMagazines - -ACE_30Rnd_65x39_caseless_mag_Tracer_Dim -ACE_30Rnd_65x39_caseless_mag_SD -ACE_30Rnd_65x39_caseless_mag_AP - -ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim -ACE_30Rnd_65x39_caseless_green_mag_SD -ACE_30Rnd_65x39_caseless_green_mag_AP - -ACE_30Rnd_556x45_Stanag_Tracer_Dim -ACE_30Rnd_556x45_Stanag_SD -ACE_30Rnd_556x45_Stanag_AP - -ACE_20Rnd_762x51_Mag_Tracer -ACE_20Rnd_762x51_Mag_Tracer_Dim -ACE_20Rnd_762x51_Mag_SD -ACE_20Rnd_762x51_Mag_AP - -ACE_10Rnd_338_Mag_Tracer -ACE_10Rnd_338_Mag_Tracer_Dim -ACE_10Rnd_338_Mag_AP -ACE_10Rnd_338_Mag_SD - -ACE_130Rnd_338_Mag_Tracer -ACE_130Rnd_338_Mag_Tracer_Dim -ACE_130Rnd_338_Mag_AP - -ACE_10Rnd_93x64_DMR_05_Mag_Tracer -ACE_10Rnd_93x64_DMR_05_Mag_Tracer_Dim -ACE_10Rnd_93x64_DMR_05_Mag_AP -ACE_10Rnd_93x64_DMR_05_Mag_SD - -ACE_150Rnd_93x64_Mag_Tracer -ACE_150Rnd_93x64_Mag_Tracer_Dim -ACE_150Rnd_93x64_Mag_AP \ No newline at end of file diff --git a/addons/magazines/script_component.hpp b/addons/magazines/script_component.hpp deleted file mode 100644 index 2fa1b774f5..0000000000 --- a/addons/magazines/script_component.hpp +++ /dev/null @@ -1,12 +0,0 @@ -#define COMPONENT magazines -#include "\z\ace\addons\main\script_mod.hpp" - -#ifdef DEBUG_ENABLED_MAGAZINES - #define DEBUG_MODE_FULL -#endif - -#ifdef DEBUG_ENABLED_MAGAZINES - #define DEBUG_SETTINGS DEBUG_ENABLED_MAGAZINES -#endif - -#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/overheating/CfgWeapons.hpp b/addons/overheating/CfgWeapons.hpp index fff251f096..12ec43024f 100644 --- a/addons/overheating/CfgWeapons.hpp +++ b/addons/overheating/CfgWeapons.hpp @@ -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 - }; -}; diff --git a/addons/overheating/functions/fnc_overheat.sqf b/addons/overheating/functions/fnc_overheat.sqf index d1f7a737d9..2468265f8f 100644 --- a/addons/overheating/functions/fnc_overheat.sqf +++ b/addons/overheating/functions/fnc_overheat.sqf @@ -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); diff --git a/addons/weather/RscTitles.hpp b/addons/weather/RscTitles.hpp new file mode 100644 index 0000000000..aedebdabfc --- /dev/null +++ b/addons/weather/RscTitles.hpp @@ -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=""; + }; + }; + }; +}; \ No newline at end of file diff --git a/addons/weather/UI/wind0.paa b/addons/weather/UI/wind0.paa new file mode 100644 index 0000000000..c049caf47e Binary files /dev/null and b/addons/weather/UI/wind0.paa differ diff --git a/addons/weather/UI/wind1.paa b/addons/weather/UI/wind1.paa new file mode 100644 index 0000000000..47d996fe67 Binary files /dev/null and b/addons/weather/UI/wind1.paa differ diff --git a/addons/weather/UI/wind10.paa b/addons/weather/UI/wind10.paa new file mode 100644 index 0000000000..a9bcd49c1b Binary files /dev/null and b/addons/weather/UI/wind10.paa differ diff --git a/addons/weather/UI/wind11.paa b/addons/weather/UI/wind11.paa new file mode 100644 index 0000000000..469cdedada Binary files /dev/null and b/addons/weather/UI/wind11.paa differ diff --git a/addons/weather/UI/wind12.paa b/addons/weather/UI/wind12.paa new file mode 100644 index 0000000000..11e19553ff Binary files /dev/null and b/addons/weather/UI/wind12.paa differ diff --git a/addons/weather/UI/wind2.paa b/addons/weather/UI/wind2.paa new file mode 100644 index 0000000000..585944af45 Binary files /dev/null and b/addons/weather/UI/wind2.paa differ diff --git a/addons/weather/UI/wind3.paa b/addons/weather/UI/wind3.paa new file mode 100644 index 0000000000..16b823a9f3 Binary files /dev/null and b/addons/weather/UI/wind3.paa differ diff --git a/addons/weather/UI/wind4.paa b/addons/weather/UI/wind4.paa new file mode 100644 index 0000000000..a5bd119889 Binary files /dev/null and b/addons/weather/UI/wind4.paa differ diff --git a/addons/weather/UI/wind5.paa b/addons/weather/UI/wind5.paa new file mode 100644 index 0000000000..43398e2960 Binary files /dev/null and b/addons/weather/UI/wind5.paa differ diff --git a/addons/weather/UI/wind6.paa b/addons/weather/UI/wind6.paa new file mode 100644 index 0000000000..3bd9a9c676 Binary files /dev/null and b/addons/weather/UI/wind6.paa differ diff --git a/addons/weather/UI/wind7.paa b/addons/weather/UI/wind7.paa new file mode 100644 index 0000000000..a7bb1d5942 Binary files /dev/null and b/addons/weather/UI/wind7.paa differ diff --git a/addons/weather/UI/wind8.paa b/addons/weather/UI/wind8.paa new file mode 100644 index 0000000000..e51ad530c5 Binary files /dev/null and b/addons/weather/UI/wind8.paa differ diff --git a/addons/weather/UI/wind9.paa b/addons/weather/UI/wind9.paa new file mode 100644 index 0000000000..016ca49f7c Binary files /dev/null and b/addons/weather/UI/wind9.paa differ diff --git a/addons/weather/XEH_postInit.sqf b/addons/weather/XEH_postInit.sqf index caed3aa254..ff78eeb727 100644 --- a/addons/weather/XEH_postInit.sqf +++ b/addons/weather/XEH_postInit.sqf @@ -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 diff --git a/addons/weather/XEH_preInit.sqf b/addons/weather/XEH_preInit.sqf index f542c522f3..2751e77226 100644 --- a/addons/weather/XEH_preInit.sqf +++ b/addons/weather/XEH_preInit.sqf @@ -4,10 +4,10 @@ ADDON = false; LOG(MSG_INIT); -PREP(serverController); +PREP(displayWindInfo); PREP(getMapData); PREP(getWind); - +PREP(serverController); // Rain variables diff --git a/addons/weather/config.cpp b/addons/weather/config.cpp index 3f2bb4e15a..13e5a0cab2 100644 --- a/addons/weather/config.cpp +++ b/addons/weather/config.cpp @@ -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" diff --git a/addons/weather/functions/fnc_displayWindInfo.sqf b/addons/weather/functions/fnc_displayWindInfo.sqf new file mode 100644 index 0000000000..da1b8be267 --- /dev/null +++ b/addons/weather/functions/fnc_displayWindInfo.sqf @@ -0,0 +1,81 @@ +/* + * 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) + +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"]; +EGVAR(advanced_ballistics,Protractor) = false; +1 cutText ["", "PLAIN"]; +GVAR(WindInfo) = true; + +[{ + private ["_windSpeed", "_windDir", "_playerDir", "_windIndex", "_windColor", "_newWindSpeed", "_windSource", "_height"]; + + 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]; + + // 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; + +}, 0.5, []] call CBA_fnc_addPerFrameHandler; + +true diff --git a/addons/weather/functions/fnc_getMapData.sqf b/addons/weather/functions/fnc_getMapData.sqf index ebd37053e3..86a05fb225 100644 --- a/addons/weather/functions/fnc_getMapData.sqf +++ b/addons/weather/functions/fnc_getMapData.sqf @@ -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"); diff --git a/addons/weather/stringtable.xml b/addons/weather/stringtable.xml new file mode 100644 index 0000000000..cd0a3e8445 --- /dev/null +++ b/addons/weather/stringtable.xml @@ -0,0 +1,8 @@ + + + + + Show Wind Info + + + diff --git a/addons/winddeflection/ACE_Settings.hpp b/addons/winddeflection/ACE_Settings.hpp new file mode 100644 index 0000000000..89235fe5af --- /dev/null +++ b/addons/winddeflection/ACE_Settings.hpp @@ -0,0 +1,14 @@ +class ACE_Settings { + class GVAR(simulationInterval) { + displayName = "Simulation Interval"; + description = "Defines the interval between every calculation step"; + typeName = "SCALAR"; + value = 0.05; + }; + class GVAR(simulationRadius) { + displayName = "Simulation Radius"; + description = "Defines the radius (in meters) in which advanced ballistics are applied"; + typeName = "SCALAR"; + value = 3000; + }; +}; diff --git a/addons/winddeflection/CfgVehicles.hpp b/addons/winddeflection/CfgVehicles.hpp index 2371c4b135..f9362a2711 100644 --- a/addons/winddeflection/CfgVehicles.hpp +++ b/addons/winddeflection/CfgVehicles.hpp @@ -1,19 +1,27 @@ class CfgVehicles { - class Module_F; - class GVAR(Module): Module_F { - author = "$STR_ACE_Common_ACETeam"; - category = "ACE"; - displayName = "Wind Deflection"; - function = FUNC(initalizeModule); + class ACE_Module; + class GVAR(ModuleSettings): ACE_Module { scope = 2; - isGlobal = 1; + displayName = "Wind Deflection"; icon = QUOTE(PATHTOF(UI\Icon_Module_Wind_ca.paa)); + category = "ACE"; + function = QUOTE(DFUNC(initModuleSettings)); + functionPriority = 1; + isGlobal = 1; + isTriggerActivated = 0; + author = "$STR_ACE_Common_ACETeam"; class Arguments { - class EnableForAI { - displayName = "Enable for AI"; - description = "Should the module be enabled for AI"; - typeName = "BOOL"; - defaultValue = 0; + class simulationInterval { + displayName = "Simulation Interval"; + description = "Defines the interval between every calculation step"; + typeName = "NUMBER"; + defaultValue = 0.05; + }; + class simulationRadius { + displayName = "Simulation Radius"; + description = "Defines the radius (in meters) in which advanced ballistics are applied"; + typeName = "NUMBER"; + defaultValue = 3000; }; }; }; diff --git a/addons/winddeflection/XEH_preInit.sqf b/addons/winddeflection/XEH_preInit.sqf index 05a606fbc2..bac6a8323a 100644 --- a/addons/winddeflection/XEH_preInit.sqf +++ b/addons/winddeflection/XEH_preInit.sqf @@ -10,5 +10,10 @@ #include "script_component.hpp" +ADDON = false; + PREP(handleFired); -PREP(initalizeModule); +PREP(updateTrajectoryPFH); +PREP(initModuleSettings); + +ADDON = true; diff --git a/addons/winddeflection/config.cpp b/addons/winddeflection/config.cpp index f515640f12..e0c77420cf 100644 --- a/addons/winddeflection/config.cpp +++ b/addons/winddeflection/config.cpp @@ -21,13 +21,6 @@ class CfgAddons { }; }; -class ACE_Settings { - class GVAR(EnableForAI) { - value = 0; - typeName = "BOOL"; - isClientSetable = 0; - }; -}; - #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" +#include "ACE_Settings.hpp" \ No newline at end of file diff --git a/addons/winddeflection/functions/fnc_handleFired.sqf b/addons/winddeflection/functions/fnc_handleFired.sqf index 36b177ae0a..5ee22ecf4f 100644 --- a/addons/winddeflection/functions/fnc_handleFired.sqf +++ b/addons/winddeflection/functions/fnc_handleFired.sqf @@ -15,53 +15,23 @@ * Nothing * * Example: - * [clientFiredBIS-XEH] call ace_winddeflection_fnc_handleFired + * [clientFiredBIS-XEH] call ace_advanced_ballistics_fnc_handleFired * * Public: No */ #include "script_component.hpp" -private ["_unit", "_weapon", "_ammo", "_bullet", "_airFriction", "_index"]; -_unit = _this select 0; +if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) exitWith {false}; -if (_unit distance ACE_player > 3000) exitWith {false}; // Large enough distance to not simulate any wind deflection. -if (!GVAR(EnableForAI) && !([_unit] call EFUNC(common,isPlayer))) exitWith {false}; +private ["_unit", "_bullet"]; +_unit = _this select 0; _bullet = _this select 6; -if (_bullet isKindOf "BulletBase") then { - [{ - private ["_bullet", "_airFriction", "_args", "_deltaT", "_bulletVelocity", "_bulletSpeed", "_trueVelocity", "_trueVelocity", "_dragRef", "_drag", "_accelRef", "_accel"]; +if (!hasInterface) exitWith {false}; +if (!(_bullet isKindOf "BulletBase")) exitWith {false}; +if (_unit distance ACE_player > GVAR(simulationRadius)) exitWith {false}; +if (!([_unit] call EFUNC(common,isPlayer))) exitWith {false}; - _args = _this select 0; - _bullet = _args select 0; - _airFriction = _args select 1; - _time = _args select 2; +[_bullet, getNumber(configFile >> "cfgAmmo" >> (_this select 4) >> "airFriction")] call FUNC(updateTrajectoryPFH); - if (!alive _bullet) exitwith { - [_this select 1] call cba_fnc_removePerFrameHandler; - }; - - _deltaT = time - _time; - _args set[2, time]; - - _bulletVelocity = velocity _bullet; - _bulletSpeed = vectorMagnitude _bulletVelocity; - - if (vectorMagnitude ACE_wind > 0) then { - _trueVelocity = _bulletVelocity vectorDiff ACE_wind; - _trueSpeed = vectorMagnitude _trueVelocity; - - _dragRef = _deltaT * _airFriction * _bulletSpeed * _bulletSpeed; - _accelRef = (vectorNormalized _bulletVelocity) vectorMultiply (_dragRef); - _bulletVelocity = _bulletVelocity vectorDiff _accelRef; - - _drag = _deltaT * _airFriction * _trueSpeed; - _accel = _trueVelocity vectorMultiply (_drag); - _bulletVelocity = _bulletVelocity vectorAdd _accel; - }; - _bullet setVelocity _bulletVelocity; - // TODO expand with advanced ballistics functionality. - - }, 0, [_bullet, getNumber(configFile >> "cfgAmmo" >> (_this select 4) >> "airFriction"), time]] call CBA_fnc_addPerFrameHandler; -}; true; \ No newline at end of file diff --git a/addons/winddeflection/functions/fnc_initModuleSettings.sqf b/addons/winddeflection/functions/fnc_initModuleSettings.sqf new file mode 100644 index 0000000000..4cf75c885a --- /dev/null +++ b/addons/winddeflection/functions/fnc_initModuleSettings.sqf @@ -0,0 +1,28 @@ +/* + * Author: Glowbal, Ruthberg + * Module for adjusting the wind deflection settings + * + * Arguments: + * 0: The module logic + * 1: units + * 2: activated + * + * Return Value: + * None + * + * Public: No + */ + +#include "script_component.hpp" + +private ["_logic", "_units", "_activated"]; +_logic = _this select 0; +_units = _this select 1; +_activated = _this select 2; + +if !(_activated) exitWith {}; + +[_logic, QGVAR(simulationInterval), "simulationInterval"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(simulationRadius), "simulationRadius"] call EFUNC(common,readSettingFromModule); + +GVAR(simulationInterval) = 0 max GVAR(simulationInterval) min 0.2; diff --git a/addons/winddeflection/functions/fnc_initalizeModule.sqf b/addons/winddeflection/functions/fnc_initalizeModule.sqf deleted file mode 100644 index 85d61e3bcc..0000000000 --- a/addons/winddeflection/functions/fnc_initalizeModule.sqf +++ /dev/null @@ -1,19 +0,0 @@ -/** - * fnc_initalizeModule.sqf - * @Descr: N/A - * @Author: Glowbal - * - * @Arguments: [] - * @Return: - * @PublicAPI: false - */ - -#include "script_component.hpp" - -if (!hasInterface) exitwith {}; // No need for this module on HC or dedicated server. - -private ["_logic"]; -_logic = [_this,0,objNull,[objNull]] call BIS_fnc_param; -if (!isNull _logic) then { - [_logic, QGVAR(EnableForAI), "EnableForAI" ] call EFUNC(common,readSettingFromModule); -}; \ No newline at end of file diff --git a/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf b/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf new file mode 100644 index 0000000000..9859f330dd --- /dev/null +++ b/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf @@ -0,0 +1,50 @@ +/* + * Author: Glowbal, Ruthberg + * Handles wind deflection for projectiles. + * + * Arguments: + * 0: bullet - Object the event handler is assigned to + * 1: airFriction - air friction of the bullet + * + * Return Value: + * Nothing + * + * Example: + * + * Public: No + */ +#include "script_component.hpp" + +[{ + private ["_bullet", "_airFriction", "_args", "_deltaT", "_bulletVelocity", "_bulletSpeed", "_trueVelocity", "_trueVelocity", "_dragRef", "_drag", "_accelRef", "_accel"]; + + _args = _this select 0; + _bullet = _args select 0; + _airFriction = _args select 1; + _time = _args select 2; + + if (!alive _bullet) exitwith { + [_this select 1] call cba_fnc_removePerFrameHandler; + }; + + _deltaT = time - _time; + _args set[2, time]; + + _bulletVelocity = velocity _bullet; + _bulletSpeed = vectorMagnitude _bulletVelocity; + + if (vectorMagnitude ACE_wind > 0) then { + _trueVelocity = _bulletVelocity vectorDiff ACE_wind; + _trueSpeed = vectorMagnitude _trueVelocity; + + _dragRef = _deltaT * _airFriction * _bulletSpeed * _bulletSpeed; + _accelRef = (vectorNormalized _bulletVelocity) vectorMultiply (_dragRef); + _bulletVelocity = _bulletVelocity vectorDiff _accelRef; + + _drag = _deltaT * _airFriction * _trueSpeed; + _accel = _trueVelocity vectorMultiply (_drag); + _bulletVelocity = _bulletVelocity vectorAdd _accel; + }; + _bullet setVelocity _bulletVelocity; + +}, GVAR(simulationInterval), [_this select 0, _this select 1, time]] call CBA_fnc_addPerFrameHandler; \ No newline at end of file diff --git a/extensions/CMakeLists.txt b/extensions/CMakeLists.txt index f0e21e9207..c50501c770 100644 --- a/extensions/CMakeLists.txt +++ b/extensions/CMakeLists.txt @@ -27,5 +27,6 @@ include_directories(AFTER "common") # Add extensions to build here add_subdirectory(fcs) +add_subdirectory(advanced_ballistics) message("Build Type: ${CMAKE_BUILD_TYPE}") \ No newline at end of file diff --git a/extensions/advanced_ballistics/AdvancedBallistics.cpp b/extensions/advanced_ballistics/AdvancedBallistics.cpp new file mode 100644 index 0000000000..2851d6576b --- /dev/null +++ b/extensions/advanced_ballistics/AdvancedBallistics.cpp @@ -0,0 +1,638 @@ +#include "ace_common.h" + +#include +#include +#include +#include + +#define _USE_MATH_DEFINES +#include + +#define GRAVITY 9.80665 +#define ABSOLUTE_ZERO_IN_CELSIUS -273.15 +#define KELVIN(t) (t - ABSOLUTE_ZERO_IN_CELSIUS) +#define CELSIUS(t) (t + ABSOLUTE_ZERO_IN_CELSIUS) +#define UNIVERSAL_GAS_CONSTANT 8.314 +#define WATER_VAPOR_MOLAR_MASS 0.018016 +#define DRY_AIR_MOLAR_MASS 0.028964 +#define SPECIFIC_GAS_CONSTANT_DRY_AIR 287.058 +#define STD_AIR_DENSITY_ICAO 1.22498 +#define STD_AIR_DENSITY_ASM 1.20885 + +static char version[] = "1.0"; + +struct Bullet { + double airFriction; + double caliber; + double bulletLength; + double bulletMass; + std::vector ballisticCoefficients; + std::vector velocityBoundaries; + char* atmosphereModel; + int dragModel; + std::vector muzzleVelocities; + std::vector barrelLengths; + double stabilityFactor; + double twistDirection; + double transonicStabilityCoef; + double muzzleVelocity; + std::vector origin; + double latitude; + double temperature; + double altitude; + double humidity; + double overcast; + double startTime; + double speed; + double frames; + double lastFrame; + double hDeflection; + double spinDrift; +}; + +struct Map { + std::vector gridHeights; + std::vector gridBuildingNums; + std::vector gridSurfaceIsWater; + int mapSize; + int mapGrids; +}; + +std::vector bulletDatabase; +std::map mapDatabase; +std::string worldName = ""; +Map* map = &mapDatabase[""]; + +double calculateRoughnessLength(double posX, double posY) { + // Source: http://es.ucsc.edu/~jnoble/wind/extrap/index.html + double roughness_lengths[10] = {0.0002, 0.0005, 0.0024, 0.03, 0.055, 0.1, 0.2, 0.4, 0.8, 1.6}; + double roughnessLength = 0.0024; + + int gridX = (int)floor(posX / 50); + int gridY = (int)floor(posY / 50); + int gridCell = gridX * map->mapGrids + gridY; + + if (gridCell >= 0 && (std::size_t)gridCell < map->gridHeights.size() && (std::size_t)gridCell < map->gridBuildingNums.size()) { + int nearBuildings = map->gridBuildingNums[gridCell]; + int surfaceIsWater = map->gridSurfaceIsWater[gridCell]; + + if (nearBuildings == 0 && surfaceIsWater == 1) { + return 0.0005; + } + + if (nearBuildings >= 10) { + return 1.6; + } + + return roughness_lengths[2 + min(nearBuildings, 6)]; + } + + return 0.0024; +} + +double calculateAirDensity(double temperature, double pressure, double relativeHumidity) { + pressure = pressure * 100; + + if (relativeHumidity > 0) { + double _pSat = 6.1078 * pow(10, ((7.5 * temperature) / (temperature + 237.3))); + double vaporPressure = relativeHumidity * _pSat; + double partialPressure = pressure - vaporPressure; + + return (partialPressure * 0.028964 + vaporPressure * 0.018016) / (8.314 * (273.15 + temperature)); + } + else { + return pressure / (287.058 * (273.15 + temperature)); + } +} + +double calculateAtmosphericCorrection(double ballisticCoefficient, double temperature, double pressure, double relativeHumidity, const char *atmosphereModel) { + double airDensity = calculateAirDensity(temperature, pressure, relativeHumidity); + + if (!strcmp(atmosphereModel, "ICAO")) { + return (1.22498 / airDensity) * ballisticCoefficient; + } + else { + return (1.20885 / airDensity) * ballisticCoefficient; + } +} + +double calculateRetard(int DragFunction, double DragCoefficient, double Velocity) { + + double vel = Velocity * 3.2808399; + double val = -1; + double A = -1; + double M = -1; + + switch (DragFunction) { + case 1: + if (vel> 4230) { A = 1.477404177730177e-04; M = 1.9565; } + else if (vel> 3680) { A = 1.920339268755614e-04; M = 1.925; } + else if (vel> 3450) { A = 2.894751026819746e-04; M = 1.875; } + else if (vel> 3295) { A = 4.349905111115636e-04; M = 1.825; } + else if (vel> 3130) { A = 6.520421871892662e-04; M = 1.775; } + else if (vel> 2960) { A = 9.748073694078696e-04; M = 1.725; } + else if (vel> 2830) { A = 1.453721560187286e-03; M = 1.675; } + else if (vel> 2680) { A = 2.162887202930376e-03; M = 1.625; } + else if (vel> 2460) { A = 3.209559783129881e-03; M = 1.575; } + else if (vel> 2225) { A = 3.904368218691249e-03; M = 1.55; } + else if (vel> 2015) { A = 3.222942271262336e-03; M = 1.575; } + else if (vel> 1890) { A = 2.203329542297809e-03; M = 1.625; } + else if (vel> 1810) { A = 1.511001028891904e-03; M = 1.675; } + else if (vel> 1730) { A = 8.609957592468259e-04; M = 1.75; } + else if (vel> 1595) { A = 4.086146797305117e-04; M = 1.85; } + else if (vel> 1520) { A = 1.954473210037398e-04; M = 1.95; } + else if (vel> 1420) { A = 5.431896266462351e-05; M = 2.125; } + else if (vel> 1360) { A = 8.847742581674416e-06; M = 2.375; } + else if (vel> 1315) { A = 1.456922328720298e-06; M = 2.625; } + else if (vel> 1280) { A = 2.419485191895565e-07; M = 2.875; } + else if (vel> 1220) { A = 1.657956321067612e-08; M = 3.25; } + else if (vel> 1185) { A = 4.745469537157371e-10; M = 3.75; } + else if (vel> 1150) { A = 1.379746590025088e-11; M = 4.25; } + else if (vel> 1100) { A = 4.070157961147882e-13; M = 4.75; } + else if (vel> 1060) { A = 2.938236954847331e-14; M = 5.125; } + else if (vel> 1025) { A = 1.228597370774746e-14; M = 5.25; } + else if (vel> 980) { A = 2.916938264100495e-14; M = 5.125; } + else if (vel> 945) { A = 3.855099424807451e-13; M = 4.75; } + else if (vel> 905) { A = 1.185097045689854e-11; M = 4.25; } + else if (vel> 860) { A = 3.566129470974951e-10; M = 3.75; } + else if (vel> 810) { A = 1.045513263966272e-08; M = 3.25; } + else if (vel> 780) { A = 1.291159200846216e-07; M = 2.875; } + else if (vel> 750) { A = 6.824429329105383e-07; M = 2.625; } + else if (vel> 700) { A = 3.569169672385163e-06; M = 2.375; } + else if (vel> 640) { A = 1.839015095899579e-05; M = 2.125; } + else if (vel> 600) { A = 5.71117468873424e-05; M = 1.950; } + else if (vel> 550) { A = 9.226557091973427e-05; M = 1.875; } + else if (vel> 250) { A = 9.337991957131389e-05; M = 1.875; } + else if (vel> 100) { A = 7.225247327590413e-05; M = 1.925; } + else if (vel> 65) { A = 5.792684957074546e-05; M = 1.975; } + else if (vel> 0) { A = 5.206214107320588e-05; M = 2.000; } + break; + + case 2: + if (vel> 1674) { A = .0079470052136733; M = 1.36999902851493; } + else if (vel> 1172) { A = 1.00419763721974e-03; M = 1.65392237010294; } + else if (vel> 1060) { A = 7.15571228255369e-23; M = 7.91913562392361; } + else if (vel> 949) { A = 1.39589807205091e-10; M = 3.81439537623717; } + else if (vel> 670) { A = 2.34364342818625e-04; M = 1.71869536324748; } + else if (vel> 335) { A = 1.77962438921838e-04; M = 1.76877550388679; } + else if (vel> 0) { A = 5.18033561289704e-05; M = 1.98160270524632; } + break; + + case 5: + if (vel> 1730) { A = 7.24854775171929e-03; M = 1.41538574492812; } + else if (vel> 1228) { A = 3.50563361516117e-05; M = 2.13077307854948; } + else if (vel> 1116) { A = 1.84029481181151e-13; M = 4.81927320350395; } + else if (vel> 1004) { A = 1.34713064017409e-22; M = 7.8100555281422; } + else if (vel> 837) { A = 1.03965974081168e-07; M = 2.84204791809926; } + else if (vel> 335) { A = 1.09301593869823e-04; M = 1.81096361579504; } + else if (vel> 0) { A = 3.51963178524273e-05; M = 2.00477856801111; } + break; + + case 6: + if (vel> 3236) { A = 0.0455384883480781; M = 1.15997674041274; } + else if (vel> 2065) { A = 7.167261849653769e-02; M = 1.10704436538885; } + else if (vel> 1311) { A = 1.66676386084348e-03; M = 1.60085100195952; } + else if (vel> 1144) { A = 1.01482730119215e-07; M = 2.9569674731838; } + else if (vel> 1004) { A = 4.31542773103552e-18; M = 6.34106317069757; } + else if (vel> 670) { A = 2.04835650496866e-05; M = 2.11688446325998; } + else if (vel> 0) { A = 7.50912466084823e-05; M = 1.92031057847052; } + break; + + case 7: + if (vel> 4200) { A = 1.29081656775919e-09; M = 3.24121295355962; } + else if (vel> 3000) { A = 0.0171422231434847; M = 1.27907168025204; } + else if (vel> 1470) { A = 2.33355948302505e-03; M = 1.52693913274526; } + else if (vel> 1260) { A = 7.97592111627665e-04; M = 1.67688974440324; } + else if (vel> 1110) { A = 5.71086414289273e-12; M = 4.3212826264889; } + else if (vel> 960) { A = 3.02865108244904e-17; M = 5.99074203776707; } + else if (vel> 670) { A = 7.52285155782535e-06; M = 2.1738019851075; } + else if (vel> 540) { A = 1.31766281225189e-05; M = 2.08774690257991; } + else if (vel> 0) { A = 1.34504843776525e-05; M = 2.08702306738884; } + break; + + case 8: + if (vel> 3571) { A = .0112263766252305; M = 1.33207346655961; } + else if (vel> 1841) { A = .0167252613732636; M = 1.28662041261785; } + else if (vel> 1120) { A = 2.20172456619625e-03; M = 1.55636358091189; } + else if (vel> 1088) { A = 2.0538037167098e-16; M = 5.80410776994789; } + else if (vel> 976) { A = 5.92182174254121e-12; M = 4.29275576134191; } + else if (vel> 0) { A = 4.3917343795117e-05; M = 1.99978116283334; } + break; + + default: + break; + + } + + if (A != -1 && M != -1 && vel > 0 && vel < 10000) { + val = A * pow(vel, M) / DragCoefficient; + val = val / 3.2808399; + return val; + } + + return 0.0; +} + +extern "C" +{ + __declspec (dllexport) void __stdcall RVExtension(char *output, int outputSize, const char *function); +} + +void __stdcall RVExtension(char *output, int outputSize, const char *function) +{ + if (!strcmp(function, "version")) + { + int n = sprintf_s(output, outputSize, "%s", version); + return; + } + + char* input = _strdup(function); + char* token = NULL; + char* next_token = NULL; + char* mode = strtok_s(input, ":", &next_token); + + if (!strcmp(mode, "retard")) { + double ballisticCoefficient = 1.0; + int dragModel = 1; + double velocity = 0.0; + double retard = 0.0; + + dragModel = strtol(strtok_s(NULL, ":", &next_token), NULL, 10); + ballisticCoefficient = strtod(strtok_s(NULL, ":", &next_token), NULL); + velocity = strtod(strtok_s(NULL, ":", &next_token), NULL); + + retard = calculateRetard(dragModel, ballisticCoefficient, velocity); + int n = sprintf_s(output, outputSize, "%f", retard); + return; + } + else if (!strcmp(mode, "atmosphericCorrection")) { + double ballisticCoefficient = 1.0; + double temperature = 15.0; + double pressure = 1013.25; + double humidity = 0.0; + char* atmosphereModel; + + ballisticCoefficient = strtod(strtok_s(NULL, ":", &next_token), NULL); + temperature = strtod(strtok_s(NULL, ":", &next_token), NULL); + pressure = strtod(strtok_s(NULL, ":", &next_token), NULL); + humidity = strtod(strtok_s(NULL, ":", &next_token), NULL); + atmosphereModel = strtok_s(NULL, ":", &next_token); + + ballisticCoefficient = calculateAtmosphericCorrection(ballisticCoefficient, temperature, pressure, humidity, atmosphereModel); + int n = sprintf_s(output, outputSize, "%f", ballisticCoefficient); + return; + } + else if (!strcmp(mode, "new")) { + unsigned int index = 0; + double airFriction = 0.0; + char* ballisticCoefficientArray; + char* ballisticCoefficient; + std::vector ballisticCoefficients; + char* velocityBoundaryArray; + char* velocityBoundary; + std::vector velocityBoundaries; + char* atmosphereModel; + int dragModel = 1; + double stabilityFactor = 1.5; + int twistDirection = 1; + double transonicStabilityCoef = 1; + double muzzleVelocity = 850; + char* originArray; + char* originEntry; + std::vector origin; + double latitude = 0.0; + double temperature = 0.0; + double altitude = 0.0; + double humidity = 0.0; + double overcast = 0.0; + double tickTime = 0.0; + + index = strtol(strtok_s(NULL, ":", &next_token), NULL, 10); + airFriction = strtod(strtok_s(NULL, ":", &next_token), NULL); + ballisticCoefficientArray = strtok_s(NULL, ":", &next_token); + ballisticCoefficientArray++; + ballisticCoefficientArray[strlen(ballisticCoefficientArray) - 1] = 0; + ballisticCoefficient = strtok_s(ballisticCoefficientArray, ",", &token); + while (ballisticCoefficient != NULL) + { + ballisticCoefficients.push_back(strtod(ballisticCoefficient, NULL)); + ballisticCoefficient = strtok_s(NULL, ",", &token); + } + velocityBoundaryArray = strtok_s(NULL, ":", &next_token); + velocityBoundaryArray++; + velocityBoundaryArray[strlen(velocityBoundaryArray) - 1] = 0; + velocityBoundary = strtok_s(velocityBoundaryArray, ",", &token); + while (velocityBoundary != NULL) + { + velocityBoundaries.push_back(strtod(velocityBoundary, NULL)); + velocityBoundary = strtok_s(NULL, ",", &token); + } + atmosphereModel = strtok_s(NULL, ":", &next_token); + dragModel = strtol(strtok_s(NULL, ":", &next_token), NULL, 10); + stabilityFactor = strtod(strtok_s(NULL, ":", &next_token), NULL); + twistDirection = strtol(strtok_s(NULL, ":", &next_token), NULL, 10); + muzzleVelocity = strtod(strtok_s(NULL, ":", &next_token), NULL); + transonicStabilityCoef = strtod(strtok_s(NULL, ":", &next_token), NULL); + originArray = strtok_s(NULL, ":", &next_token); + originArray++; + originArray[strlen(originArray) - 1] = 0; + originEntry = strtok_s(originArray, ",", &token); + while (originEntry != NULL) + { + origin.push_back(strtod(originEntry, NULL)); + originEntry = strtok_s(NULL, ",", &token); + } + latitude = strtod(strtok_s(NULL, ":", &next_token), NULL); + temperature = strtod(strtok_s(NULL, ":", &next_token), NULL); + altitude = strtod(strtok_s(NULL, ":", &next_token), NULL); + humidity = strtod(strtok_s(NULL, ":", &next_token), NULL); + overcast = strtod(strtok_s(NULL, ":", &next_token), NULL); + tickTime = strtod(strtok_s(NULL, ":", &next_token), NULL); + tickTime += strtod(strtok_s(NULL, ":", &next_token), NULL); + + while (index >= bulletDatabase.size()) { + Bullet bullet; + bulletDatabase.push_back(bullet); + } + + bulletDatabase[index].airFriction = airFriction; + bulletDatabase[index].ballisticCoefficients = ballisticCoefficients; + bulletDatabase[index].velocityBoundaries = velocityBoundaries; + bulletDatabase[index].atmosphereModel = atmosphereModel; + bulletDatabase[index].dragModel = dragModel; + bulletDatabase[index].stabilityFactor = stabilityFactor; + bulletDatabase[index].twistDirection = twistDirection; + bulletDatabase[index].transonicStabilityCoef = transonicStabilityCoef; + bulletDatabase[index].muzzleVelocity = muzzleVelocity; + bulletDatabase[index].origin = origin; + bulletDatabase[index].latitude = latitude / 180 * M_PI; + bulletDatabase[index].temperature = temperature; + bulletDatabase[index].altitude = altitude; + bulletDatabase[index].humidity = humidity; + bulletDatabase[index].overcast = overcast; + bulletDatabase[index].startTime = tickTime; + bulletDatabase[index].lastFrame = tickTime; + bulletDatabase[index].hDeflection = 0.0; + bulletDatabase[index].spinDrift = 0.0; + bulletDatabase[index].speed = 0.0; + bulletDatabase[index].frames = 0.0; + + int n = sprintf_s(output, outputSize, "%s", ""); + return; + } + else if (!strcmp(mode, "simulate")) { + // simulate:0:[-0.109985,542.529,-3.98301]:[3751.57,5332.23,214.252]:[0.598153,2.38829,0]:28.6:0:0.481542:0:215.16 + unsigned int index = 0; + char* velocityArray; + double velocity[3] = { 0.0, 0.0, 0.0 }; + char* positionArray; + double position[3] = { 0.0, 0.0, 0.0 }; + char* windArray; + double wind[3]; + double heightAGL = 0.0; + double tickTime = 0.0; + + index = strtol(strtok_s(NULL, ":", &next_token), NULL, 10); + velocityArray = strtok_s(NULL, ":", &next_token); + velocityArray++; + velocityArray[strlen(velocityArray) - 1] = 0; + velocity[0] = strtod(strtok_s(velocityArray, ",", &token), NULL); + velocity[1] = strtod(strtok_s(NULL, ",", &token), NULL); + velocity[2] = strtod(strtok_s(NULL, ",", &token), NULL); + positionArray = strtok_s(NULL, ":", &next_token); + positionArray++; + positionArray[strlen(positionArray) - 1] = 0; + position[0] = strtod(strtok_s(positionArray, ",", &token), NULL); + position[1] = strtod(strtok_s(NULL, ",", &token), NULL); + position[2] = strtod(strtok_s(NULL, ",", &token), NULL); + windArray = strtok_s(NULL, ":", &next_token); + windArray++; + windArray[strlen(windArray) - 1] = 0; + wind[0] = strtod(strtok_s(windArray, ",", &token), NULL); + wind[1] = strtod(strtok_s(NULL, ",", &token), NULL); + wind[2] = strtod(strtok_s(NULL, ",", &token), NULL); + heightAGL = strtod(strtok_s(NULL, ":", &next_token), NULL); + tickTime = strtod(strtok_s(NULL, ":", &next_token), NULL); + tickTime += strtod(strtok_s(NULL, ":", &next_token), NULL); + + double ballisticCoefficient = 1.0; + double dragRef = 0.0; + double drag = 0.0; + double accelRef[3] = { 0.0, 0.0, 0.0 }; + double accel[3] = { 0.0, 0.0, 0.0 }; + double TOF = 0.0; + double deltaT = 0.0; + double bulletSpeed; + double bulletDir; + double bulletSpeedAvg = 0.0; + double trueVelocity[3] = { 0.0, 0.0, 0.0 }; + double trueSpeed = 0.0; + double temperature = 0.0; + double windSpeed = 0.0; + double windAttenuation = 1.0; + double velocityOffset[3] = { 0.0, 0.0, 0.0 }; + double positionOffset[3] = { 0.0, 0.0, 0.0 }; + + TOF = tickTime - bulletDatabase[index].startTime; + + deltaT = tickTime - bulletDatabase[index].lastFrame; + bulletDatabase[index].lastFrame = tickTime; + + bulletSpeed = sqrt(pow(velocity[0], 2) + pow(velocity[1], 2) + pow(velocity[2], 2)); + bulletDir = atan2(velocity[0], velocity[1]); + + bulletDatabase[index].speed += bulletSpeed; + bulletDatabase[index].frames += 1; + bulletSpeedAvg = (bulletDatabase[index].speed / bulletDatabase[index].frames); + + windSpeed = sqrt(pow(wind[0], 2) + pow(wind[1], 2) + pow(wind[2], 2)); + if (windSpeed > 0.1) + { + double windSourceTerrain[3]; + + windSourceTerrain[0] = position[0] - wind[0] / windSpeed * 100; + windSourceTerrain[1] = position[1] - wind[1] / windSpeed * 100; + windSourceTerrain[2] = position[2] - wind[2] / windSpeed * 100; + + int gridX = (int)floor(windSourceTerrain[0] / 50); + int gridY = (int)floor(windSourceTerrain[1] / 50); + int gridCell = gridX * map->mapGrids + gridY; + + if (gridCell >= 0 && (std::size_t)gridCell < map->gridHeights.size() && (std::size_t)gridCell < map->gridBuildingNums.size()) { + double gridHeight = map->gridHeights[gridCell]; + + if (gridHeight > position[2]) { + double angle = atan((gridHeight - position[2]) / 100); + windAttenuation *= pow(cos(angle), 2); + } + } + } + + if (windSpeed > 0.1) + { + double windSourceObstacles[3]; + + windSourceObstacles[0] = position[0] - wind[0] / windSpeed * 25; + windSourceObstacles[1] = position[1] - wind[1] / windSpeed * 25; + windSourceObstacles[2] = position[2] - wind[2] / windSpeed * 25; + + if (heightAGL > 0 && heightAGL < 20) { + double roughnessLength = calculateRoughnessLength(windSourceObstacles[0], windSourceObstacles[1]); + windAttenuation *= (log(heightAGL / roughnessLength) / log(20 / roughnessLength)); + } + } + + if (windAttenuation < 1) + { + wind[0] *= windAttenuation; + wind[1] *= windAttenuation; + wind[2] *= windAttenuation; + windSpeed = sqrt(pow(wind[0], 2) + pow(wind[1], 2) + pow(wind[2], 2)); + } + + trueVelocity[0] = velocity[0] - wind[0]; + trueVelocity[1] = velocity[1] - wind[1]; + trueVelocity[2] = velocity[2] - wind[2]; + trueSpeed = sqrt(pow(trueVelocity[0], 2) + pow(trueVelocity[1], 2) + pow(trueVelocity[2], 2)); + + temperature = bulletDatabase[index].temperature - 0.0065 * position[2]; + + if (bulletDatabase[index].ballisticCoefficients.size() == bulletDatabase[index].velocityBoundaries.size() + 1) { + double pressure = 1013.25 * exp(-(bulletDatabase[index].altitude + position[2]) / 7990) - 10 * bulletDatabase[index].overcast; + + dragRef = deltaT * bulletDatabase[index].airFriction * bulletSpeed * bulletSpeed; + + accelRef[0] = (velocity[0] / bulletSpeed) * dragRef; + accelRef[1] = (velocity[1] / bulletSpeed) * dragRef; + accelRef[2] = (velocity[2] / bulletSpeed) * dragRef; + + velocityOffset[0] -= accelRef[0]; + velocityOffset[1] -= accelRef[1]; + velocityOffset[2] -= accelRef[2]; + + ballisticCoefficient = bulletDatabase[index].ballisticCoefficients[0]; + for (int i = (int)bulletDatabase[index].velocityBoundaries.size() - 1; i >= 0; i = i - 1) + { + if (bulletSpeed < bulletDatabase[index].velocityBoundaries[i]) + { + ballisticCoefficient = bulletDatabase[index].ballisticCoefficients[i + 1]; + break; + } + } + + ballisticCoefficient = calculateAtmosphericCorrection(ballisticCoefficient, temperature, pressure, bulletDatabase[index].humidity, bulletDatabase[index].atmosphereModel); + drag = deltaT * calculateRetard(bulletDatabase[index].dragModel, ballisticCoefficient, trueSpeed); + accel[0] = (trueVelocity[0] / trueSpeed) * drag; + accel[1] = (trueVelocity[1] / trueSpeed) * drag; + accel[2] = (trueVelocity[2] / trueSpeed) * drag; + + velocityOffset[0] -= accel[0]; + velocityOffset[1] -= accel[1]; + velocityOffset[2] -= accel[2]; + } + else { + double pressureDeviation = 1013.25 * exp(-(bulletDatabase[index].altitude + position[2]) / 7990) - 1013.25 - 10 * bulletDatabase[index].overcast; + double airFriction = bulletDatabase[index].airFriction + ((temperature - 15) * 0.0000015 + bulletDatabase[index].humidity * 0.0000040 + pressureDeviation * -0.0000009); + + if (airFriction != bulletDatabase[index].airFriction || windSpeed > 0) { + dragRef = deltaT * bulletDatabase[index].airFriction * bulletSpeed * bulletSpeed; + + accelRef[0] = (velocity[0] / bulletSpeed) * dragRef; + accelRef[1] = (velocity[1] / bulletSpeed) * dragRef; + accelRef[2] = (velocity[2] / bulletSpeed) * dragRef; + + velocityOffset[0] -= accelRef[0]; + velocityOffset[1] -= accelRef[1]; + velocityOffset[2] -= accelRef[2]; + + drag = deltaT * airFriction * trueSpeed * trueSpeed; + accel[0] = (trueVelocity[0] / trueSpeed) * drag; + accel[1] = (trueVelocity[1] / trueSpeed) * drag; + accel[2] = (trueVelocity[2] / trueSpeed) * drag; + + velocityOffset[0] += accel[0]; + velocityOffset[1] += accel[1]; + velocityOffset[2] += accel[2]; + } + } + + if (bulletSpeedAvg > 0) { + double distanceSqr = pow(bulletDatabase[index].origin[0] - position[0], 2) + pow(bulletDatabase[index].origin[1] - position[1], 2) + pow(bulletDatabase[index].origin[2] - position[2], 2); + double horizontalDeflection = 0.0000729 * distanceSqr * sin(bulletDatabase[index].latitude) / bulletSpeedAvg; + double horizontalDeflectionPartial = horizontalDeflection - bulletDatabase[index].hDeflection; + bulletDatabase[index].hDeflection = horizontalDeflection; + + positionOffset[0] += sin(bulletDir + M_PI / 2) * horizontalDeflectionPartial; + positionOffset[1] += cos(bulletDir + M_PI / 2) * horizontalDeflectionPartial; + } + + double centripetalAccel = 2 * 0.0000729 * (bulletDatabase[index].muzzleVelocity / -32.2) * cos(bulletDatabase[index].latitude) * sin(bulletDir); + velocityOffset[2] -= centripetalAccel * deltaT; + + double spinDrift = bulletDatabase[index].twistDirection * 0.0254 * 1.25 * (bulletDatabase[index].stabilityFactor + 1.2) * pow(TOF, 1.83); + double spinDriftPartial = spinDrift - bulletDatabase[index].spinDrift; + bulletDatabase[index].spinDrift = spinDrift; + + positionOffset[0] += sin(bulletDir + M_PI / 2) * spinDriftPartial; + positionOffset[1] += cos(bulletDir + M_PI / 2) * spinDriftPartial; + + if (bulletSpeed < 345 && bulletSpeedAvg > 340 && bulletSpeed > 335) + { + srand((unsigned)time(NULL)); + velocityOffset[0] += (((double)rand() / (RAND_MAX)) * 0.4 - 0.2) * (1 - bulletDatabase[index].transonicStabilityCoef); + velocityOffset[1] += (((double)rand() / (RAND_MAX)) * 0.4 - 0.2) * (1 - bulletDatabase[index].transonicStabilityCoef); + velocityOffset[2] += (((double)rand() / (RAND_MAX)) * 0.4 - 0.2) * (1 - bulletDatabase[index].transonicStabilityCoef); + }; + + int n = sprintf_s(output, outputSize, "_bullet setVelocity (_bulletVelocity vectorAdd [%f, %f, %f]); _bullet setPosASL (_bulletPosition vectorAdd [%f, %f, %f]);", velocityOffset[0], velocityOffset[1], velocityOffset[2], positionOffset[0], positionOffset[1], positionOffset[2]); + return; + } + else if (!strcmp(mode, "set")) { + int height = 0; + int numObjects = 0; + int surfaceIsWater = 0; + + height = strtol(strtok_s(NULL, ":", &next_token), NULL, 10); + numObjects = strtol(strtok_s(NULL, ":", &next_token), NULL, 10); + surfaceIsWater = strtol(strtok_s(NULL, ":", &next_token), NULL, 10); + + map->gridHeights.push_back(height); + map->gridBuildingNums.push_back(numObjects); + map->gridSurfaceIsWater.push_back(surfaceIsWater); + + int n = sprintf_s(output, outputSize, "%s", ""); + return; + } + else if (!strcmp(mode, "init")) { + int mapSize = 0; + int mapGrids = 0; + int gridCells = 0; + + worldName = strtok_s(NULL, ":", &next_token); + mapSize = strtol(strtok_s(NULL, ":", &next_token), NULL, 10); + + mapGrids = (int)ceil((double)mapSize / 50.0) + 1; + gridCells = mapGrids * mapGrids; + + map = &mapDatabase[worldName]; + if (map->gridHeights.size() == gridCells) { + int n = sprintf_s(output, outputSize, "%s", "Terrain already initialized"); + return; + } + + map->mapSize = mapSize; + map->mapGrids = mapGrids; + map->gridHeights.clear(); + map->gridBuildingNums.clear(); + map->gridSurfaceIsWater.clear(); + map->gridHeights.reserve(gridCells); + map->gridBuildingNums.reserve(gridCells); + map->gridSurfaceIsWater.reserve(gridCells); + + int n = sprintf_s(output, outputSize, "%s", ""); + return; + } + + int n = sprintf_s(output, outputSize, "%s", ""); + return; +} diff --git a/extensions/advanced_ballistics/CMakeLists.txt b/extensions/advanced_ballistics/CMakeLists.txt new file mode 100644 index 0000000000..f579339a04 --- /dev/null +++ b/extensions/advanced_ballistics/CMakeLists.txt @@ -0,0 +1,11 @@ +set(ACE_EXTENSION_NAME "ace_advanced_ballistics") + +file(GLOB SOURCES *.h *.hpp *.c *.cpp) +add_library( ${ACE_EXTENSION_NAME} SHARED ${SOURCES}) +add_dependencies(${ACE_EXTENSION_NAME} ace_common) +SET_TARGET_PROPERTIES(${ACE_EXTENSION_NAME} PROPERTIES PREFIX "") + +if(CMAKE_COMPILER_IS_GNUCXX) + set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES LINK_SEARCH_START_STATIC 1) + set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES LINK_SEARCH_END_STATIC 1) +endif() \ No newline at end of file diff --git a/extras/K4500_Instruction_Manual_English.pdf b/extras/K4500_Instruction_Manual_English.pdf new file mode 100644 index 0000000000..a3096109c6 Binary files /dev/null and b/extras/K4500_Instruction_Manual_English.pdf differ