mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
Merge pull request #320 from acemod/AdvancedBallistics
AdvancedBallistics
This commit is contained in:
commit
3fc539bdf3
BIN
ace_advanced_ballistics.dll
Normal file
BIN
ace_advanced_ballistics.dll
Normal file
Binary file not shown.
BIN
ace_fcs.dll
BIN
ace_fcs.dll
Binary file not shown.
64
addons/advanced_ballistics/ACE_Settings.hpp
Normal file
64
addons/advanced_ballistics/ACE_Settings.hpp
Normal file
@ -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;
|
||||
};
|
||||
};
|
19
addons/advanced_ballistics/CfgEventHandlers.hpp
Normal file
19
addons/advanced_ballistics/CfgEventHandlers.hpp
Normal file
@ -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));
|
||||
};
|
||||
};
|
||||
};
|
78
addons/advanced_ballistics/CfgVehicles.hpp
Normal file
78
addons/advanced_ballistics/CfgVehicles.hpp
Normal file
@ -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;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
10
addons/advanced_ballistics/README.md
Normal file
10
addons/advanced_ballistics/README.md
Normal file
@ -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)
|
63
addons/advanced_ballistics/RscTitles.hpp
Normal file
63
addons/advanced_ballistics/RscTitles.hpp
Normal file
@ -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;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
BIN
addons/advanced_ballistics/UI/Icon_Module_Wind_ca.paa
Normal file
BIN
addons/advanced_ballistics/UI/Icon_Module_Wind_ca.paa
Normal file
Binary file not shown.
BIN
addons/advanced_ballistics/UI/protractor.paa
Normal file
BIN
addons/advanced_ballistics/UI/protractor.paa
Normal file
Binary file not shown.
BIN
addons/advanced_ballistics/UI/protractor_marker.paa
Normal file
BIN
addons/advanced_ballistics/UI/protractor_marker.paa
Normal file
Binary file not shown.
45
addons/advanced_ballistics/XEH_postInit.sqf
Normal file
45
addons/advanced_ballistics/XEH_postInit.sqf
Normal file
@ -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);
|
18
addons/advanced_ballistics/XEH_preInit.sqf
Normal file
18
addons/advanced_ballistics/XEH_preInit.sqf
Normal file
@ -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;
|
18
addons/advanced_ballistics/config.cpp
Normal file
18
addons/advanced_ballistics/config.cpp
Normal file
@ -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"
|
11
addons/advanced_ballistics/functions/defines.h
Normal file
11
addons/advanced_ballistics/functions/defines.h
Normal file
@ -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))
|
@ -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 <NUMBER>
|
||||
* 1: pressure - hPa <NUMBER>
|
||||
* 2: relativeHumidity - value between 0.0 and 1.0 <NUMBER>
|
||||
*
|
||||
* Return Value:
|
||||
* 0: density of air - kg * m^(-3) <NUMBER>
|
||||
*
|
||||
* Return value:
|
||||
* None
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
#include "defines.h"
|
||||
|
||||
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))
|
||||
};
|
@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Author: Ruthberg
|
||||
*
|
||||
* Calculates the ammo temperature induced muzzle velocity shift
|
||||
*
|
||||
* Arguments:
|
||||
* 0: ammo - classname <string>
|
||||
* 1: temperature - degrees celcius <NUMBER>
|
||||
*
|
||||
* Return Value:
|
||||
* 0: muzzle velocity shift - m/s <NUMBER>
|
||||
*
|
||||
* Return value:
|
||||
* None
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_ammo", "_temperature", "_muzzleVelocityTable", "_muzzleVelocityShift", "_temperatureIndexA", "_temperatureIndexB", "_temperatureRatio"];
|
||||
_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
|
@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Author: Ruthberg
|
||||
*
|
||||
* Calculates the atmospherically corrected ballistic coefficient
|
||||
*
|
||||
* Arguments:
|
||||
* 0: ballistic coefficient - G1-G7 <NUMBER>
|
||||
* 1: temperature - degrees celcius <NUMBER>
|
||||
* 2: pressure - hPa <NUMBER>
|
||||
* 3: relativeHumidity - value between 0.0 and 1.0 <NUMBER>
|
||||
* 4: atmosphereModel - ICAO or ASM <STRING>
|
||||
*
|
||||
* Return Value:
|
||||
* corrected ballistic coefficient <NUMBER>
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
#include "defines.h"
|
||||
|
||||
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
|
||||
};
|
@ -0,0 +1,66 @@
|
||||
/*
|
||||
* Author: Ruthberg
|
||||
*
|
||||
* Calculates the muzzle velocity shift caused by different barrel lengths
|
||||
*
|
||||
* Arguments:
|
||||
* 0: ammo - classname <string>
|
||||
* 0: weapon - classname <string>
|
||||
* 1: muzzle velocity - m/s <NUMBER>
|
||||
*
|
||||
* Return Value:
|
||||
* 0: muzzle velocity shift - m/s <NUMBER>
|
||||
*
|
||||
* Return value:
|
||||
* None
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_ammo", "_weapon", "_barrelLength", "_muzzleVelocityTable", "_barrelLengthTable", "_muzzleVelocity", "_lowerIndex", "_upperIndex", "_barrelLengthRatio", "_muzzleVelocityNew"];
|
||||
_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
|
@ -0,0 +1,145 @@
|
||||
/*
|
||||
* Author: Ruthberg
|
||||
*
|
||||
* Calculates the retardation of the bullet
|
||||
*
|
||||
* Arguments:
|
||||
* 0: drag model - 1-7 <integer>
|
||||
* 1: drag coefficient - bc <NUMBER>
|
||||
* 2: velocity - m/s <NUMBER>
|
||||
*
|
||||
* Return Value:
|
||||
* 0: retardation - m/(s^2) <NUMBER>
|
||||
*
|
||||
* Return value:
|
||||
* None
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
// Source: GNU Exterior Ballistics
|
||||
|
||||
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
|
@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Author: Ruthberg
|
||||
*
|
||||
* Calculates the terrain roughness length at a given world position
|
||||
*
|
||||
* Arguments:
|
||||
* 0: _this - world position <posASL>
|
||||
*
|
||||
* Return Value:
|
||||
* 0: roughness length <NUMBER>
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_roughness_lengths", "_windSource", "_nearBuildings", "_isWater"];
|
||||
|
||||
// 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))
|
@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Author: Ruthberg
|
||||
*
|
||||
* Calculates the stability factor of a bullet
|
||||
*
|
||||
* Arguments:
|
||||
* 0: caliber - inches <NUMBER>
|
||||
* 1: bullet length - inches <NUMBER>
|
||||
* 2: bullet mass - grains <NUMBER>
|
||||
* 3: barrel twist - inches <NUMBER>
|
||||
* 4: muzzle velocity shift - m/s <NUMBER>
|
||||
* 5: temperature - degrees celcius <NUMBER>
|
||||
* 6: barometric Pressure - hPA <NUMBER>
|
||||
*
|
||||
* Return Value:
|
||||
* 0: stability factor <NUMBER>
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
|
||||
private ["_caliber", "_bulletLength", "_bulletMass", "_barrelTwist", "_muzzleVelocity", "_temperature", "_barometricPressure", "_l", "_t", "_stabilityFactor"];
|
||||
_caliber = _this select 0;
|
||||
_bulletLength = _this select 1;
|
||||
_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
|
@ -0,0 +1,78 @@
|
||||
/*
|
||||
* Author: Ruthberg
|
||||
*
|
||||
* Calculates the true wind speed at a given world position
|
||||
*
|
||||
* Arguments:
|
||||
* 0: _this - world position <posASL>
|
||||
*
|
||||
* Return Value:
|
||||
* 0: wind speed - m/s <NUMBER>
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_windSpeed", "_windDir", "_height", "_newWindSpeed", "_windSource", "_roughnessLength"];
|
||||
|
||||
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
|
@ -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
|
383
addons/advanced_ballistics/functions/fnc_handleFired.sqf
Normal file
383
addons/advanced_ballistics/functions/fnc_handleFired.sqf
Normal file
@ -0,0 +1,383 @@
|
||||
/*
|
||||
* Author: Glowbal, Ruthberg
|
||||
*
|
||||
* Handles advanced ballistics for (BulletBase) projectiles
|
||||
*
|
||||
* Arguments:
|
||||
* 0: unit - Object the event handler is assigned to <OBJECT>
|
||||
* 1: weapon - Fired weapon <STRING>
|
||||
* 2: muzzle - Muzzle that was used <STRING>
|
||||
* 3: mode - Current mode of the fired weapon <STRING>
|
||||
* 4: ammo - Ammo used <STRING>
|
||||
* 5: magazine - magazine name which was used <STRING>
|
||||
* 6: projectile - Object of the projectile that was shot <OBJECT>
|
||||
*
|
||||
* Return Value:
|
||||
* Nothing
|
||||
*
|
||||
* 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
|
@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Author: Glowbal, Ruthberg
|
||||
* Module for adjusting the advanced ballistics settings
|
||||
*
|
||||
* Arguments:
|
||||
* 0: The module logic <LOGIC>
|
||||
* 1: units <ARRAY>
|
||||
* 2: activated <BOOL>
|
||||
*
|
||||
* Return Value:
|
||||
* None <NIL>
|
||||
*
|
||||
* 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;
|
@ -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
|
@ -0,0 +1 @@
|
||||
#include "\z\ace\addons\advanced_ballistics\script_component.hpp"
|
11
addons/advanced_ballistics/initKeybinds.sqf
Normal file
11
addons/advanced_ballistics/initKeybinds.sqf
Normal file
@ -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)
|
14
addons/advanced_ballistics/script_component.hpp
Normal file
14
addons/advanced_ballistics/script_component.hpp
Normal file
@ -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"
|
11
addons/advanced_ballistics/stringtable.xml
Normal file
11
addons/advanced_ballistics/stringtable.xml
Normal file
@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<Project name="ACE">
|
||||
<Package name="AdvancedBallistics">
|
||||
<Key ID="STR_ACE_AdvancedBallistics_WindInfoKey">
|
||||
<English>Show Wind Info</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_AdvancedBallistics_ProtractorKey">
|
||||
<English>Show Protractor</English>
|
||||
</Key>
|
||||
</Package>
|
||||
</Project>
|
@ -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;
|
||||
};
|
||||
};
|
||||
|
||||
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};
|
||||
};
|
||||
};
|
||||
|
138
addons/ballistics/CfgMagazines.hpp
Normal file
138
addons/ballistics/CfgMagazines.hpp
Normal file
@ -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;
|
||||
};
|
||||
};
|
@ -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";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -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"
|
||||
#include "CfgVehicles.hpp"
|
||||
|
@ -715,5 +715,17 @@
|
||||
<German>Kaliber: 9,3x64mm Hartkern<br />Schuss: 150<br />Verwendet für: Navid</German>
|
||||
<Polish>Kaliber: 9,3 x 64 mm AP<br />Pociski: 150<br />Używane w: Navid</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_16Rnd_9x19_mag_Name">
|
||||
</Key>
|
||||
<Key ID="STR_ACE_16Rnd_9x19_mag_NameShort">
|
||||
</Key>
|
||||
<Key ID="STR_ACE_16Rnd_9x19_mag_Description">
|
||||
</Key>
|
||||
<Key ID="STR_ACE_30Rnd_9x19_mag_Name">
|
||||
</Key>
|
||||
<Key ID="STR_ACE_30Rnd_9x19_mag_NameShort">
|
||||
</Key>
|
||||
<Key ID="STR_ACE_30Rnd_9x19_mag_Description">
|
||||
</Key>
|
||||
</Package>
|
||||
</Project>
|
@ -1 +0,0 @@
|
||||
z\ace\addons\magazines
|
@ -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;
|
||||
};
|
||||
};
|
@ -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";
|
||||
};
|
||||
};
|
@ -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);
|
||||
};
|
||||
};
|
||||
};
|
@ -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";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
@ -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)
|
@ -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"
|
@ -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
|
@ -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"
|
@ -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
|
||||
};
|
||||
};
|
||||
|
@ -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);
|
||||
|
31
addons/weather/RscTitles.hpp
Normal file
31
addons/weather/RscTitles.hpp
Normal file
@ -0,0 +1,31 @@
|
||||
class RscTitles
|
||||
{
|
||||
class RscWindIntuitive
|
||||
{
|
||||
idd=-1;
|
||||
onLoad="with uiNameSpace do { RscWindIntuitive = _this select 0 };";
|
||||
movingEnable=0;
|
||||
duration=60;
|
||||
fadeIn="false";
|
||||
fadeOut="false";
|
||||
class controls
|
||||
{
|
||||
class RscWindIntuitive
|
||||
{
|
||||
idc=132948;
|
||||
type=0;
|
||||
style=48;
|
||||
font="TahomaB";
|
||||
colorBackground[]={0,0,0,0};
|
||||
colorText[]={0,0,0,0};
|
||||
x="SafeZoneX + 0.001";
|
||||
y="SafeZoneY + 0.001";
|
||||
w=0.2;
|
||||
h=0.2*4/3;
|
||||
size=0.034;
|
||||
sizeEx=0.027;
|
||||
text="";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
BIN
addons/weather/UI/wind0.paa
Normal file
BIN
addons/weather/UI/wind0.paa
Normal file
Binary file not shown.
BIN
addons/weather/UI/wind1.paa
Normal file
BIN
addons/weather/UI/wind1.paa
Normal file
Binary file not shown.
BIN
addons/weather/UI/wind10.paa
Normal file
BIN
addons/weather/UI/wind10.paa
Normal file
Binary file not shown.
BIN
addons/weather/UI/wind11.paa
Normal file
BIN
addons/weather/UI/wind11.paa
Normal file
Binary file not shown.
BIN
addons/weather/UI/wind12.paa
Normal file
BIN
addons/weather/UI/wind12.paa
Normal file
Binary file not shown.
BIN
addons/weather/UI/wind2.paa
Normal file
BIN
addons/weather/UI/wind2.paa
Normal file
Binary file not shown.
BIN
addons/weather/UI/wind3.paa
Normal file
BIN
addons/weather/UI/wind3.paa
Normal file
Binary file not shown.
BIN
addons/weather/UI/wind4.paa
Normal file
BIN
addons/weather/UI/wind4.paa
Normal file
Binary file not shown.
BIN
addons/weather/UI/wind5.paa
Normal file
BIN
addons/weather/UI/wind5.paa
Normal file
Binary file not shown.
BIN
addons/weather/UI/wind6.paa
Normal file
BIN
addons/weather/UI/wind6.paa
Normal file
Binary file not shown.
BIN
addons/weather/UI/wind7.paa
Normal file
BIN
addons/weather/UI/wind7.paa
Normal file
Binary file not shown.
BIN
addons/weather/UI/wind8.paa
Normal file
BIN
addons/weather/UI/wind8.paa
Normal file
Binary file not shown.
BIN
addons/weather/UI/wind9.paa
Normal file
BIN
addons/weather/UI/wind9.paa
Normal file
Binary file not shown.
@ -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
|
||||
|
@ -4,10 +4,10 @@
|
||||
ADDON = false;
|
||||
LOG(MSG_INIT);
|
||||
|
||||
PREP(serverController);
|
||||
PREP(displayWindInfo);
|
||||
PREP(getMapData);
|
||||
PREP(getWind);
|
||||
|
||||
PREP(serverController);
|
||||
|
||||
|
||||
// Rain variables
|
||||
|
@ -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"
|
||||
|
81
addons/weather/functions/fnc_displayWindInfo.sqf
Normal file
81
addons/weather/functions/fnc_displayWindInfo.sqf
Normal file
@ -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
|
@ -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");
|
||||
|
8
addons/weather/stringtable.xml
Normal file
8
addons/weather/stringtable.xml
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<Project name="ACE">
|
||||
<Package name="Weather">
|
||||
<Key ID="STR_ACE_Weather_WindInfoKey">
|
||||
<English>Show Wind Info</English>
|
||||
</Key>
|
||||
</Package>
|
||||
</Project>
|
14
addons/winddeflection/ACE_Settings.hpp
Normal file
14
addons/winddeflection/ACE_Settings.hpp
Normal file
@ -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;
|
||||
};
|
||||
};
|
@ -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;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -10,5 +10,10 @@
|
||||
|
||||
#include "script_component.hpp"
|
||||
|
||||
ADDON = false;
|
||||
|
||||
PREP(handleFired);
|
||||
PREP(initalizeModule);
|
||||
PREP(updateTrajectoryPFH);
|
||||
PREP(initModuleSettings);
|
||||
|
||||
ADDON = true;
|
||||
|
@ -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"
|
@ -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;
|
28
addons/winddeflection/functions/fnc_initModuleSettings.sqf
Normal file
28
addons/winddeflection/functions/fnc_initModuleSettings.sqf
Normal file
@ -0,0 +1,28 @@
|
||||
/*
|
||||
* Author: Glowbal, Ruthberg
|
||||
* Module for adjusting the wind deflection settings
|
||||
*
|
||||
* Arguments:
|
||||
* 0: The module logic <LOGIC>
|
||||
* 1: units <ARRAY>
|
||||
* 2: activated <BOOL>
|
||||
*
|
||||
* Return Value:
|
||||
* None <NIL>
|
||||
*
|
||||
* 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;
|
@ -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);
|
||||
};
|
50
addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf
Normal file
50
addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf
Normal file
@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Author: Glowbal, Ruthberg
|
||||
* Handles wind deflection for projectiles.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: bullet - Object the event handler is assigned to <OBJECT>
|
||||
* 1: airFriction - air friction of the bullet <NUMBER>
|
||||
*
|
||||
* 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;
|
@ -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}")
|
638
extensions/advanced_ballistics/AdvancedBallistics.cpp
Normal file
638
extensions/advanced_ballistics/AdvancedBallistics.cpp
Normal file
@ -0,0 +1,638 @@
|
||||
#include "ace_common.h"
|
||||
|
||||
#include <time.h>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
|
||||
#define _USE_MATH_DEFINES
|
||||
#include <math.h>
|
||||
|
||||
#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<double> ballisticCoefficients;
|
||||
std::vector<double> velocityBoundaries;
|
||||
char* atmosphereModel;
|
||||
int dragModel;
|
||||
std::vector<double> muzzleVelocities;
|
||||
std::vector<double> barrelLengths;
|
||||
double stabilityFactor;
|
||||
double twistDirection;
|
||||
double transonicStabilityCoef;
|
||||
double muzzleVelocity;
|
||||
std::vector<double> 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<int> gridHeights;
|
||||
std::vector<int> gridBuildingNums;
|
||||
std::vector<int> gridSurfaceIsWater;
|
||||
int mapSize;
|
||||
int mapGrids;
|
||||
};
|
||||
|
||||
std::vector<Bullet> bulletDatabase;
|
||||
std::map<std::string, 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<double> ballisticCoefficients;
|
||||
char* velocityBoundaryArray;
|
||||
char* velocityBoundary;
|
||||
std::vector<double> 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<double> 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;
|
||||
}
|
11
extensions/advanced_ballistics/CMakeLists.txt
Normal file
11
extensions/advanced_ballistics/CMakeLists.txt
Normal file
@ -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()
|
BIN
extras/K4500_Instruction_Manual_English.pdf
Normal file
BIN
extras/K4500_Instruction_Manual_English.pdf
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user