mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
commit
5d2d13ec00
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
ADDON = false;
|
ADDON = false;
|
||||||
|
|
||||||
PREP(calculateAirDensity);
|
|
||||||
PREP(calculateAmmoTemperatureVelocityShift);
|
PREP(calculateAmmoTemperatureVelocityShift);
|
||||||
PREP(calculateAtmosphericCorrection);
|
PREP(calculateAtmosphericCorrection);
|
||||||
PREP(calculateBarrelLengthVelocityShift);
|
PREP(calculateBarrelLengthVelocityShift);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Author: Ruthberg
|
* Author: Ruthberg
|
||||||
*
|
*
|
||||||
* Displays a wind info (colored arrow) in the top left corner of the screen
|
* Calculates the air density
|
||||||
*
|
*
|
||||||
* Arguments:
|
* Arguments:
|
||||||
* 0: temperature - degrees celcius <NUMBER>
|
* 0: temperature - degrees celcius <NUMBER>
|
||||||
|
@ -24,7 +24,7 @@ _pressure = _this select 2; // in hPa
|
|||||||
_relativeHumidity = _this select 3; // as ratio 0-1
|
_relativeHumidity = _this select 3; // as ratio 0-1
|
||||||
_atmosphereModel = _this select 4; // "ICAO" or "ASM"
|
_atmosphereModel = _this select 4; // "ICAO" or "ASM"
|
||||||
|
|
||||||
_airDensity = [_temperature, _pressure, _relativeHumidity] call FUNC(calculateAirDensity);
|
_airDensity = [_temperature, _pressure, _relativeHumidity] call EFUNC(weather,calculateAirDensity);
|
||||||
|
|
||||||
if (_atmosphereModel == "ICAO") then {
|
if (_atmosphereModel == "ICAO") then {
|
||||||
(STD_AIR_DENSITY_ICAO / _airDensity) * _ballisticCoefficient
|
(STD_AIR_DENSITY_ICAO / _airDensity) * _ballisticCoefficient
|
||||||
|
@ -110,7 +110,7 @@ _stabilityFactor = 1.5;
|
|||||||
|
|
||||||
if (_caliber > 0 && _bulletLength > 0 && _bulletMass > 0 && _barrelTwist > 0) then {
|
if (_caliber > 0 && _bulletLength > 0 && _bulletMass > 0 && _barrelTwist > 0) then {
|
||||||
_temperature = GET_TEMPERATURE_AT_HEIGHT((getPosASL _unit) select 2);
|
_temperature = GET_TEMPERATURE_AT_HEIGHT((getPosASL _unit) select 2);
|
||||||
_barometricPressure = 1013.25 * exp(-(EGVAR(weather,Altitude) + ((getPosASL _bullet) select 2)) / 7990) - 10 * overcast;
|
_barometricPressure = ((getPosASL _bullet) select 2) call EFUNC(weather,calculateBarometricPressure);
|
||||||
_stabilityFactor = [_caliber, _bulletLength, _bulletMass, _barrelTwist, _muzzleVelocity, _temperature, _barometricPressure] call FUNC(calculateStabilityFactor);
|
_stabilityFactor = [_caliber, _bulletLength, _bulletMass, _barrelTwist, _muzzleVelocity, _temperature, _barometricPressure] call FUNC(calculateStabilityFactor);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -288,7 +288,7 @@ if (GVAR(AdvancedAirDragEnabled)) then {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (GVAR(AtmosphericDensitySimulationEnabled)) then {
|
if (GVAR(AtmosphericDensitySimulationEnabled)) then {
|
||||||
_pressure = 1013.25 * exp(-(EGVAR(weather,Altitude) + (_bulletPosition select 2)) / 7990) - 10 * overcast;
|
_pressure = (_bulletPosition select 2) call EFUNC(weather,calculateBarometricPressure);
|
||||||
_temperature = GET_TEMPERATURE_AT_HEIGHT(_bulletPosition select 2);
|
_temperature = GET_TEMPERATURE_AT_HEIGHT(_bulletPosition select 2);
|
||||||
_humidity = EGVAR(weather,currentHumidity);
|
_humidity = EGVAR(weather,currentHumidity);
|
||||||
_airDensity = STD_AIR_DENSITY_ICAO;
|
_airDensity = STD_AIR_DENSITY_ICAO;
|
||||||
@ -315,7 +315,7 @@ if (GVAR(AdvancedAirDragEnabled)) then {
|
|||||||
_bulletVelocity = _bulletVelocity vectorDiff _accel;
|
_bulletVelocity = _bulletVelocity vectorDiff _accel;
|
||||||
} else {
|
} else {
|
||||||
if (GVAR(AtmosphericDensitySimulationEnabled)) then {
|
if (GVAR(AtmosphericDensitySimulationEnabled)) then {
|
||||||
_pressureDeviation = 1013.25 * exp(-(EGVAR(weather,Altitude) + (_bulletPosition select 2)) / 7990) - 1013.25 - 10 * overcast;
|
_pressureDeviation = (_bulletPosition select 2) call EFUNC(weather,calculateBarometricPressure) - 1013.25;
|
||||||
_temperature = GET_TEMPERATURE_AT_HEIGHT(_bulletPosition select 2);
|
_temperature = GET_TEMPERATURE_AT_HEIGHT(_bulletPosition select 2);
|
||||||
_humidity = EGVAR(weather,currentHumidity);
|
_humidity = EGVAR(weather,currentHumidity);
|
||||||
_airFriction = _airFriction + ((_temperature - 15) * 0.0000015 + _humidity * 0.0000040 + _pressureDeviation * -0.0000009);
|
_airFriction = _airFriction + ((_temperature - 15) * 0.0000015 + _humidity * 0.0000040 + _pressureDeviation * -0.0000009);
|
||||||
|
@ -1115,6 +1115,13 @@ class ATragMX_Display {
|
|||||||
idc=120060;
|
idc=120060;
|
||||||
y=0.265*safezoneH+safezoneY+0.520;
|
y=0.265*safezoneH+safezoneY+0.520;
|
||||||
};
|
};
|
||||||
|
class TEXT_GUN_AMMO_DATA_ZERO_RANGE_METER_INDICATOR: TEXT_GUN_AMMO_DATA_BORE_HEIGHT {
|
||||||
|
idc=120061;
|
||||||
|
w=0.05;
|
||||||
|
x=0.550*safezoneW+safezoneX+0.315;
|
||||||
|
y=0.265*safezoneH+safezoneY+0.520;
|
||||||
|
text="";
|
||||||
|
};
|
||||||
class TEXT_GUN_AMMO_DATA_DONE: TEXT_TARGET_SPEED_ASSIST_DONE {
|
class TEXT_GUN_AMMO_DATA_DONE: TEXT_TARGET_SPEED_ASSIST_DONE {
|
||||||
idc=12008;
|
idc=12008;
|
||||||
action=QUOTE(1 call FUNC(toggle_gun_ammo_data));
|
action=QUOTE(1 call FUNC(toggle_gun_ammo_data));
|
||||||
@ -1327,6 +1334,13 @@ class ATragMX_Display {
|
|||||||
idc=140060;
|
idc=140060;
|
||||||
y=0.265*safezoneH+safezoneY+0.520;
|
y=0.265*safezoneH+safezoneY+0.520;
|
||||||
};
|
};
|
||||||
|
class TEXT_TARGET_DATA_TARGET_RANGE_METER_INDICATOR: TEXT_TARGET_DATA_LATITUDE {
|
||||||
|
idc=140061;
|
||||||
|
w=0.05;
|
||||||
|
x=0.550*safezoneW+safezoneX+0.315;
|
||||||
|
y=0.265*safezoneH+safezoneY+0.520;
|
||||||
|
text="";
|
||||||
|
};
|
||||||
class TEXT_TARGET_DATA_DONE: TEXT_TARGET_SPEED_ASSIST_DONE {
|
class TEXT_TARGET_DATA_DONE: TEXT_TARGET_SPEED_ASSIST_DONE {
|
||||||
idc=14008;
|
idc=14008;
|
||||||
action=QUOTE(1 call FUNC(toggle_target_data));
|
action=QUOTE(1 call FUNC(toggle_target_data));
|
||||||
|
@ -6,16 +6,16 @@ if ((profileNamespace getVariable ["ACE_ATragMX_profileNamespaceVersion", 0]) ==
|
|||||||
GVAR(gunList) = profileNamespace getVariable "ACE_ATragMX_gunList";
|
GVAR(gunList) = profileNamespace getVariable "ACE_ATragMX_gunList";
|
||||||
} else {
|
} else {
|
||||||
// Profile Name, Muzzle Velocity, Zero Range, Scope Base Angle, AirFriction, Bore Height, Scope Unit, Scope Click Unit, Scope Click Number, Maximum Elevation, Dialed Elevation, Dialed Windage, Mass, Bullet Diameter, Rifle Twist, BC, Drag Model, Atmosphere Model
|
// Profile Name, Muzzle Velocity, Zero Range, Scope Base Angle, AirFriction, Bore Height, Scope Unit, Scope Click Unit, Scope Click Number, Maximum Elevation, Dialed Elevation, Dialed Windage, Mass, Bullet Diameter, Rifle Twist, BC, Drag Model, Atmosphere Model
|
||||||
GVAR(gunList) = [["12.7x108mm" , 820, 100, 0.0659, -0.0008600, 3.81, 0, 2, 10, 120, 0, 0, 48.28, 12.7, 38.10, 0.630, 1, "ASM" ],
|
GVAR(gunList) = [["12.7x108mm" , 820, 100, 0.0657, -0.0006400, 3.81, 0, 2, 10, 120, 0, 0, 48.28, 12.7, 38.10, 0.630, 1, "ASM" ],
|
||||||
|
|
||||||
["12.7x99mm AMAX" , 860, 100, 0.0612, -0.0008600, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 38.10, 1.050, 1, "ASM" ],
|
["12.7x99mm AMAX" , 860, 100, 0.0612, -0.0003740, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 38.10, 1.050, 1, "ASM" ],
|
||||||
["12.7x99mm" , 853, 100, 0.0623, -0.0008600, 3.81, 0, 2, 10, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM" ],
|
["12.7x99mm" , 853, 100, 0.0623, -0.0006000, 3.81, 0, 2, 10, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM" ],
|
||||||
|
|
||||||
["12.7x54mm" , 300, 100, 0.3394, -0.0014000, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 24.13, 1.050, 1, "ASM" ],
|
["12.7x54mm" , 300, 100, 0.3395, -0.0001400, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 24.13, 1.050, 1, "ASM" ],
|
||||||
|
|
||||||
[".408 Chey Tac" , 910, 100, 0.0569, -0.0004800, 3.81, 0, 2, 10, 120, 0, 0, 27.15, 10.4, 33.02, 0.970, 1, "ASM" ],
|
[".408 Chey Tac" , 910, 100, 0.0571, -0.0003950, 3.81, 0, 2, 10, 120, 0, 0, 27.15, 10.4, 33.02, 0.970, 1, "ASM" ],
|
||||||
|
|
||||||
["9.3×64mm" , 870, 100, 0.0619, -0.0007500, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 9.30, 35.56, 0.368, 1, "ASM" ],
|
["9.3×64mm" , 870, 100, 0.0619, -0.0010600, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 9.30, 35.56, 0.368, 1, "ASM" ],
|
||||||
|
|
||||||
[".338LM 250gr" , 880, 100, 0.0598, -0.0006060, 3.81, 0, 2, 10, 120, 0, 0, 16.20, 8.58, 25.40, 0.322, 7, "ICAO"],
|
[".338LM 250gr" , 880, 100, 0.0598, -0.0006060, 3.81, 0, 2, 10, 120, 0, 0, 16.20, 8.58, 25.40, 0.322, 7, "ICAO"],
|
||||||
[".338LM 300gr" , 800, 100, 0.0677, -0.0005350, 3.81, 0, 2, 10, 120, 0, 0, 19.44, 8.58, 25.40, 0.381, 7, "ICAO"],
|
[".338LM 300gr" , 800, 100, 0.0677, -0.0005350, 3.81, 0, 2, 10, 120, 0, 0, 19.44, 8.58, 25.40, 0.381, 7, "ICAO"],
|
||||||
|
@ -77,4 +77,4 @@ GVAR(rangeCardData) = [];
|
|||||||
|
|
||||||
private ["_result"];
|
private ["_result"];
|
||||||
_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000,
|
_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000,
|
||||||
[_windSpeed1, _windSpeed2], _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, true, _stabilityFactor, _twistDirection, _latitude] call FUNC(calculate_solution);
|
[_windSpeed1, _windSpeed2], _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, true, _stabilityFactor, _twistDirection, _latitude, _directionOfFire] call FUNC(calculate_solution);
|
||||||
|
@ -35,6 +35,6 @@ _barometricPressure = 1013.25;
|
|||||||
_relativeHumidity = 0;
|
_relativeHumidity = 0;
|
||||||
|
|
||||||
private ["_result"];
|
private ["_result"];
|
||||||
_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, [0, 0], 0, 0, 0, _zeroRange, _airFriction, 1, "ICAO", false, 1.5, 0, 0] call FUNC(calculate_solution);
|
_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, [0, 0], 0, 0, 0, _zeroRange, _airFriction, 1, "ICAO", false, 1.5, 0, 0, 0] call FUNC(calculate_solution);
|
||||||
|
|
||||||
_scopeBaseAngle + (_result select 0) / 60
|
_scopeBaseAngle + (_result select 0) / 60
|
||||||
|
@ -43,7 +43,7 @@
|
|||||||
*/
|
*/
|
||||||
#include "script_component.hpp"
|
#include "script_component.hpp"
|
||||||
|
|
||||||
private ["_scopeBaseAngle", "_bulletMass", "_boreHeight", "_airFriction", "_muzzleVelocity", "_temperature", "_barometricPressure", "_relativeHumidity", "_simSteps", "_windSpeed1", "_windSpeed2", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange", "_drag", "_bc", "_dragModel", "_atmosphereModel", "_storeRangeCardData", "_stabilityFactor", "_twistDirection", "_latitude"];
|
private ["_scopeBaseAngle", "_bulletMass", "_boreHeight", "_airFriction", "_muzzleVelocity", "_temperature", "_barometricPressure", "_relativeHumidity", "_simSteps", "_windSpeed1", "_windSpeed2", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange", "_drag", "_bc", "_dragModel", "_atmosphereModel", "_storeRangeCardData", "_stabilityFactor", "_twistDirection", "_latitude", "_directionOfFire"];
|
||||||
_scopeBaseAngle = _this select 0;
|
_scopeBaseAngle = _this select 0;
|
||||||
_bulletMass = _this select 1;
|
_bulletMass = _this select 1;
|
||||||
_boreHeight = _this select 2;
|
_boreHeight = _this select 2;
|
||||||
@ -66,6 +66,7 @@ _storeRangeCardData = _this select 17;
|
|||||||
_stabilityFactor = _this select 18;
|
_stabilityFactor = _this select 18;
|
||||||
_twistDirection = _this select 19;
|
_twistDirection = _this select 19;
|
||||||
_latitude = _this select 20;
|
_latitude = _this select 20;
|
||||||
|
_directionOfFire = _this select 21;
|
||||||
|
|
||||||
private ["_bulletPos", "_bulletVelocity", "_bulletAccel", "_bulletSpeed", "_gravity", "_deltaT"];
|
private ["_bulletPos", "_bulletVelocity", "_bulletAccel", "_bulletSpeed", "_gravity", "_deltaT"];
|
||||||
_bulletPos = [0, 0, 0];
|
_bulletPos = [0, 0, 0];
|
||||||
@ -114,6 +115,12 @@ _speedTotal = 0;
|
|||||||
_stepsTotal = 0;
|
_stepsTotal = 0;
|
||||||
_speedAverage = 0;
|
_speedAverage = 0;
|
||||||
|
|
||||||
|
private ["_eoetvoesMultiplier"];
|
||||||
|
_eoetvoesMultiplier = 0;
|
||||||
|
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,EoetvoesEnabled), false]) then {
|
||||||
|
_eoetvoesMultiplier = 2 * (0.0000729 * _muzzleVelocity / -9.80665) * cos(_latitude) * sin(_directionOfFire);
|
||||||
|
};
|
||||||
|
|
||||||
_TOF = 0;
|
_TOF = 0;
|
||||||
|
|
||||||
_bulletPos set [0, 0];
|
_bulletPos set [0, 0];
|
||||||
@ -169,16 +176,19 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do {
|
|||||||
_kineticEnergy = 0.5 * (_bulletMass / 1000 * (_bulletSpeed ^ 2));
|
_kineticEnergy = 0.5 * (_bulletMass / 1000 * (_bulletSpeed ^ 2));
|
||||||
_kineticEnergy = _kineticEnergy * 0.737562149;
|
_kineticEnergy = _kineticEnergy * 0.737562149;
|
||||||
|
|
||||||
if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,CoriolisEnabled), false])) then {
|
if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (_bulletPos select 1) > 0) then {
|
||||||
if ((_bulletPos select 1) > 0) then {
|
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,CoriolisEnabled), false]) then {
|
||||||
_horizontalDeflection = 0.0000729 * ((_bulletPos select 1) ^ 2) * sin(_latitude) / _speedAverage;
|
_horizontalDeflection = 0.0000729 * ((_bulletPos select 1) ^ 2) * sin(_latitude) / _speedAverage;
|
||||||
_horizontalCoriolis = - atan(_horizontalDeflection / (_bulletPos select 1));
|
_horizontalCoriolis = - atan(_horizontalDeflection / (_bulletPos select 1));
|
||||||
_windage1 = _windage1 + _horizontalCoriolis;
|
_windage1 = _windage1 + _horizontalCoriolis;
|
||||||
_windage2 = _windage2 + _horizontalCoriolis;
|
_windage2 = _windage2 + _horizontalCoriolis;
|
||||||
};
|
};
|
||||||
};
|
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,EoetvoesEnabled), false]) then {
|
||||||
if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,SpinDriftEnabled), false])) then {
|
_verticalDeflection = (_bulletPos select 2) * _eoetvoesMultiplier;
|
||||||
if ((_bulletPos select 1) > 0) then {
|
_verticalCoriolis = - atan(_verticalDeflection / (_bulletPos select 1));
|
||||||
|
_elevation = _elevation + _verticalCoriolis;
|
||||||
|
};
|
||||||
|
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,SpinDriftEnabled), false]) then {
|
||||||
_spinDeflection = _twistDirection * 0.0254 * 1.25 * (_stabilityFactor + 1.2) * _TOF ^ 1.83;
|
_spinDeflection = _twistDirection * 0.0254 * 1.25 * (_stabilityFactor + 1.2) * _TOF ^ 1.83;
|
||||||
_spinDrift = - atan(_spinDeflection / (_bulletPos select 1));
|
_spinDrift = - atan(_spinDeflection / (_bulletPos select 1));
|
||||||
_windage1 = _windage1 + _spinDrift;
|
_windage1 = _windage1 + _spinDrift;
|
||||||
@ -206,16 +216,19 @@ if (_targetRange != 0) then {
|
|||||||
_kineticEnergy = 0.5 * (_bulletMass / 1000 * (_bulletSpeed ^ 2));
|
_kineticEnergy = 0.5 * (_bulletMass / 1000 * (_bulletSpeed ^ 2));
|
||||||
_kineticEnergy = _kineticEnergy * 0.737562149;
|
_kineticEnergy = _kineticEnergy * 0.737562149;
|
||||||
|
|
||||||
if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,CoriolisEnabled), false])) then {
|
if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (_bulletPos select 1) > 0) then {
|
||||||
if ((_bulletPos select 1) > 0) then {
|
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,CoriolisEnabled), false]) then {
|
||||||
_horizontalDeflection = 0.0000729 * ((_bulletPos select 1) ^ 2) * sin(_latitude) / _speedAverage;
|
_horizontalDeflection = 0.0000729 * ((_bulletPos select 1) ^ 2) * sin(_latitude) / _speedAverage;
|
||||||
_horizontalCoriolis = - atan(_horizontalDeflection / (_bulletPos select 1));
|
_horizontalCoriolis = - atan(_horizontalDeflection / (_bulletPos select 1));
|
||||||
_windage1 = _windage1 + _horizontalCoriolis;
|
_windage1 = _windage1 + _horizontalCoriolis;
|
||||||
_windage2 = _windage2 + _horizontalCoriolis;
|
_windage2 = _windage2 + _horizontalCoriolis;
|
||||||
};
|
};
|
||||||
};
|
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,EoetvoesEnabled), false]) then {
|
||||||
if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,SpinDriftEnabled), false])) then {
|
_verticalDeflection = (_bulletPos select 2) * _eoetvoesMultiplier;
|
||||||
if ((_bulletPos select 1) > 0) then {
|
_verticalCoriolis = - atan(_verticalDeflection / (_bulletPos select 1));
|
||||||
|
_elevation = _elevation + _verticalCoriolis;
|
||||||
|
};
|
||||||
|
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,SpinDriftEnabled), false]) then {
|
||||||
_spinDeflection = _twistDirection * 0.0254 * 1.25 * (_stabilityFactor + 1.2) * _TOF ^ 1.83;
|
_spinDeflection = _twistDirection * 0.0254 * 1.25 * (_stabilityFactor + 1.2) * _TOF ^ 1.83;
|
||||||
_spinDrift = - atan(_spinDeflection / (_bulletPos select 1));
|
_spinDrift = - atan(_spinDeflection / (_bulletPos select 1));
|
||||||
_windage1 = _windage1 + _spinDrift;
|
_windage1 = _windage1 + _spinDrift;
|
||||||
|
@ -72,7 +72,7 @@ _targetRange = GVAR(targetRange) select GVAR(currentTarget);
|
|||||||
|
|
||||||
private ["_result"];
|
private ["_result"];
|
||||||
_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000,
|
_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000,
|
||||||
[_windSpeed1, _windSpeed2], _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, false, _stabilityFactor, _twistDirection, _latitude] call FUNC(calculate_solution);
|
[_windSpeed1, _windSpeed2], _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, false, _stabilityFactor, _twistDirection, _latitude, _directionOfFire] call FUNC(calculate_solution);
|
||||||
|
|
||||||
GVAR(elevationOutput) set [GVAR(currentTarget), _result select 0];
|
GVAR(elevationOutput) set [GVAR(currentTarget), _result select 0];
|
||||||
GVAR(windage1Output) set [GVAR(currentTarget), (_result select 1) select 0];
|
GVAR(windage1Output) set [GVAR(currentTarget), (_result select 1) select 0];
|
||||||
|
@ -4,7 +4,8 @@
|
|||||||
*
|
*
|
||||||
* Arguments:
|
* Arguments:
|
||||||
* gunID <number>
|
* gunID <number>
|
||||||
* update solution <BOOL>
|
* restore workingMemory from gunList <BOOL>
|
||||||
|
* update display <BOOL>
|
||||||
*
|
*
|
||||||
* Return Value:
|
* Return Value:
|
||||||
* Nothing
|
* Nothing
|
||||||
@ -16,23 +17,30 @@
|
|||||||
*/
|
*/
|
||||||
#include "script_component.hpp"
|
#include "script_component.hpp"
|
||||||
|
|
||||||
private ["_gunID", "_updateSolution"];
|
private ["_gunID", "_restoreMemory", "_updateDisplay"];
|
||||||
_gunID = _this select 0;
|
_gunID = _this select 0;
|
||||||
_updateSolution = _this select 1;
|
_restoreMemory = _this select 1;
|
||||||
|
_updateDisplay = _this select 2;
|
||||||
|
|
||||||
if (_gunID < 0 || _gunID > (count GVAR(gunList)) - 1) exitWith {};
|
if (_gunID < 0 || _gunID > (count GVAR(gunList)) - 1) exitWith {};
|
||||||
|
|
||||||
GVAR(workingMemory) = +(GVAR(gunList) select _gunID);
|
if (_restoreMemory) then {
|
||||||
|
GVAR(workingMemory) = +(GVAR(gunList) select _gunID);
|
||||||
|
};
|
||||||
GVAR(currentGun) = _gunID;
|
GVAR(currentGun) = _gunID;
|
||||||
|
|
||||||
lbSetCurSel [6000, GVAR(currentGun)];
|
if (_updateDisplay) then {
|
||||||
|
lbSetCurSel [6000, GVAR(currentGun)];
|
||||||
|
};
|
||||||
|
|
||||||
GVAR(currentScopeUnit) = 0 max (GVAR(workingMemory) select 6) min 3;
|
GVAR(currentScopeUnit) = 0 max (GVAR(workingMemory) select 6) min 3;
|
||||||
GVAR(currentScopeClickUnit) = 0 max (GVAR(workingMemory) select 7) min 2;
|
GVAR(currentScopeClickUnit) = 0 max (GVAR(workingMemory) select 7) min 2;
|
||||||
GVAR(currentScopeClickNumber) = 1 max (GVAR(workingMemory) select 8) min 10;
|
GVAR(currentScopeClickNumber) = 1 max (GVAR(workingMemory) select 8) min 10;
|
||||||
|
|
||||||
[] call FUNC(update_gun);
|
if (_updateDisplay) then {
|
||||||
[] call FUNC(update_gun_ammo_data);
|
[] call FUNC(update_gun);
|
||||||
|
[] call FUNC(update_gun_ammo_data);
|
||||||
|
};
|
||||||
|
|
||||||
GVAR(elevationOutput) set [GVAR(currentTarget), 0];
|
GVAR(elevationOutput) set [GVAR(currentTarget), 0];
|
||||||
GVAR(windage1Output) set [GVAR(currentTarget), 0];
|
GVAR(windage1Output) set [GVAR(currentTarget), 0];
|
||||||
@ -41,6 +49,6 @@ GVAR(leadOutput) set [GVAR(currentTarget), 0];
|
|||||||
GVAR(tofOutput) set [GVAR(currentTarget), 0];
|
GVAR(tofOutput) set [GVAR(currentTarget), 0];
|
||||||
GVAR(velocityOutput) set [GVAR(currentTarget), 0];
|
GVAR(velocityOutput) set [GVAR(currentTarget), 0];
|
||||||
|
|
||||||
if (_updateSolution) then {
|
if (_updateDisplay) then {
|
||||||
[] call FUNC(calculate_target_solution);
|
[] call FUNC(calculate_target_solution);
|
||||||
};
|
};
|
||||||
|
@ -40,7 +40,7 @@ GVAR(showTargetRangeAssist) call FUNC(show_target_range_assist);
|
|||||||
GVAR(showTargetSpeedAssist) call FUNC(show_target_speed_assist);
|
GVAR(showTargetSpeedAssist) call FUNC(show_target_speed_assist);
|
||||||
GVAR(showTargetSpeedAssistTimer) call FUNC(show_target_speed_assist_timer);
|
GVAR(showTargetSpeedAssistTimer) call FUNC(show_target_speed_assist_timer);
|
||||||
|
|
||||||
[GVAR(currentGun), false] call FUNC(change_gun);
|
[GVAR(currentGun), false, true] call FUNC(change_gun);
|
||||||
|
|
||||||
{
|
{
|
||||||
lbAdd [6000, _x select 0];
|
lbAdd [6000, _x select 0];
|
||||||
|
@ -17,4 +17,4 @@
|
|||||||
|
|
||||||
if (!(GVAR(showMainPage) || GVAR(showGunList))) exitWith {};
|
if (!(GVAR(showMainPage) || GVAR(showGunList))) exitWith {};
|
||||||
|
|
||||||
[(GVAR(currentGun) + (count GVAR(gunList)) + _this) % (count GVAR(gunList)), true] call FUNC(change_gun);
|
[(GVAR(currentGun) + (count GVAR(gunList)) + _this) % (count GVAR(gunList)), true, true] call FUNC(change_gun);
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
#include "script_component.hpp"
|
#include "script_component.hpp"
|
||||||
|
|
||||||
GVAR(currentUnit) = 0 max (profileNamespace getVariable ["ACE_ATragMX_currentUnit", 2]) min 2;
|
GVAR(currentUnit) = 0 max (profileNamespace getVariable ["ACE_ATragMX_currentUnit", 2]) min 2;
|
||||||
GVAR(currentGun) = 0 max (profileNamespace getVariable ["ACE_ATragMX_currentGun", 0]);
|
[(profileNamespace getVariable ["ACE_ATragMX_currentGun", 0]), true, false] call FUNC(change_gun);
|
||||||
GVAR(currentTarget) = 0 max (profileNamespace getVariable ["ACE_ATragMX_currentTarget", 0]) min 3;
|
GVAR(currentTarget) = 0 max (profileNamespace getVariable ["ACE_ATragMX_currentTarget", 0]) min 3;
|
||||||
GVAR(currentScopeUnit) = 0 max (profileNamespace getVariable ["ACE_ATragMX_currentScopeUnit", 0]) min 3;
|
GVAR(currentScopeUnit) = 0 max (profileNamespace getVariable ["ACE_ATragMX_currentScopeUnit", 0]) min 3;
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
GVAR(showGunAmmoData) = _this;
|
GVAR(showGunAmmoData) = _this;
|
||||||
|
|
||||||
{ctrlShow [_x, _this]} forEach [12000, 120000, 12001, 120010, 12002, 120020, 12003, 120030, 12004, 120040, 12005, 120050, 12006, 120060, 12007, 12008, 12009, 12010, 12011];
|
{ctrlShow [_x, _this]} forEach [12000, 120000, 12001, 120010, 12002, 120020, 12003, 120030, 12004, 120040, 12005, 120050, 12006, 120060, 120061, 12007, 12008, 12009, 12010, 12011];
|
||||||
|
|
||||||
if (_this) then {
|
if (_this) then {
|
||||||
[] call FUNC(update_gun_ammo_data);
|
[] call FUNC(update_gun_ammo_data);
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
GVAR(showTargetData) = _this;
|
GVAR(showTargetData) = _this;
|
||||||
|
|
||||||
{ctrlShow [_x, _this]} forEach [14000, 140000, 14001, 140010, 14002, 141020, 140020, 141021, 140021, 14003, 140030, 14004, 140040, 141040, 141041, 140041, 14005, 140050, 14006, 140060, 14007, 14008, 14009, 14010, 14011];
|
{ctrlShow [_x, _this]} forEach [14000, 140000, 14001, 140010, 14002, 141020, 140020, 141021, 140021, 14003, 140030, 14004, 140040, 141040, 141041, 140041, 14005, 140050, 14006, 140060, 140061, 14007, 14008, 14009, 14010, 14011];
|
||||||
|
|
||||||
if (_this) then {
|
if (_this) then {
|
||||||
[] call FUNC(update_target_data);
|
[] call FUNC(update_target_data);
|
||||||
|
@ -20,7 +20,7 @@ if (ctrlVisible 6000) then {
|
|||||||
true call FUNC(show_main_page);
|
true call FUNC(show_main_page);
|
||||||
|
|
||||||
if (_this) then {
|
if (_this) then {
|
||||||
[lbCurSel 6000, true] call FUNC(change_gun);
|
[lbCurSel 6000, true, true] call FUNC(change_gun);
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
false call FUNC(show_main_page);
|
false call FUNC(show_main_page);
|
||||||
|
@ -47,10 +47,15 @@ if (GVAR(currentUnit) != 2) then {
|
|||||||
} else {
|
} else {
|
||||||
ctrlSetText [120050, Str(Round(GVAR(workingMemory) select 1))];
|
ctrlSetText [120050, Str(Round(GVAR(workingMemory) select 1))];
|
||||||
};
|
};
|
||||||
if (GVAR(currentUnit) == 2) then {
|
if (GVAR(currentUnit) == 1) then {
|
||||||
ctrlSetText [120060, Str(Round(GVAR(workingMemory) select 2))];
|
|
||||||
} else {
|
|
||||||
ctrlSetText [120060, Str(Round((GVAR(workingMemory) select 2) * 1.0936133))];
|
ctrlSetText [120060, Str(Round((GVAR(workingMemory) select 2) * 1.0936133))];
|
||||||
|
} else {
|
||||||
|
ctrlSetText [120060, Str(Round(GVAR(workingMemory) select 2))];
|
||||||
|
};
|
||||||
|
if (GVAR(currentUnit) == 0) then {
|
||||||
|
ctrlSetText [120061, "*"];
|
||||||
|
} else {
|
||||||
|
ctrlSetText [120061, ""];
|
||||||
};
|
};
|
||||||
|
|
||||||
if (GVAR(currentUnit) == 2) then {
|
if (GVAR(currentUnit) == 2) then {
|
||||||
|
@ -37,6 +37,11 @@ if (GVAR(currentUnit) == 1) then {
|
|||||||
} else {
|
} else {
|
||||||
ctrlSetText [140060, Str(Round((GVAR(targetRange) select GVAR(currentTarget))))];
|
ctrlSetText [140060, Str(Round((GVAR(targetRange) select GVAR(currentTarget))))];
|
||||||
};
|
};
|
||||||
|
if (GVAR(currentUnit) == 0) then {
|
||||||
|
ctrlSetText [140061, "*"];
|
||||||
|
} else {
|
||||||
|
ctrlSetText [140061, ""];
|
||||||
|
};
|
||||||
|
|
||||||
if (GVAR(currentUnit) == 2) then {
|
if (GVAR(currentUnit) == 2) then {
|
||||||
ctrlSetText [14002, "Wind Speed (m/s)"];
|
ctrlSetText [14002, "Wind Speed (m/s)"];
|
||||||
|
@ -44,7 +44,7 @@ _barometricPressure = GVAR(barometricPressure);
|
|||||||
_relativeHumidity = GVAR(relativeHumidity);
|
_relativeHumidity = GVAR(relativeHumidity);
|
||||||
|
|
||||||
private ["_result"];
|
private ["_result"];
|
||||||
_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, [0, 0], 0, 0, 0, _zeroRange, _bc, _dragModel, _atmosphereModel, false, 1.5, 0, 0] call FUNC(calculate_solution);
|
_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, [0, 0], 0, 0, 0, _zeroRange, _bc, _dragModel, _atmosphereModel, false, 1.5, 0, 0, 0] call FUNC(calculate_solution);
|
||||||
|
|
||||||
GVAR(workingMemory) set [2, _zeroRange];
|
GVAR(workingMemory) set [2, _zeroRange];
|
||||||
GVAR(workingMemory) set [3, _scopeBaseAngle + (_result select 0) / 60];
|
GVAR(workingMemory) set [3, _scopeBaseAngle + (_result select 0) / 60];
|
||||||
|
@ -11,4 +11,4 @@
|
|||||||
|
|
||||||
#include "\z\ace\addons\main\script_macros.hpp"
|
#include "\z\ace\addons\main\script_macros.hpp"
|
||||||
|
|
||||||
#define ATRAGMX_PROFILE_NAMESPACE_VERSION 1.1
|
#define ATRAGMX_PROFILE_NAMESPACE_VERSION 1.2
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!-- Edited with tabler. -->
|
|
||||||
<Project name="ACE">
|
<Project name="ACE">
|
||||||
<Package name="Attach">
|
<Package name="Attach">
|
||||||
<Key ID="STR_ACE_Attach_AttachDetach">
|
<Key ID="STR_ACE_Attach_AttachDetach">
|
||||||
@ -205,4 +204,4 @@
|
|||||||
<Russian>%1<br/>отсоединен(-а)</Russian>
|
<Russian>%1<br/>отсоединен(-а)</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
</Package>
|
</Package>
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!-- Edited with tabler. -->
|
|
||||||
<Project name="ACE">
|
<Project name="ACE">
|
||||||
<Package name="Captives">
|
<Package name="Captives">
|
||||||
<Key ID="STR_ACE_Captives_SetCaptive">
|
<Key ID="STR_ACE_Captives_SetCaptive">
|
||||||
@ -189,4 +188,4 @@
|
|||||||
<Italian>Niente selezionato</Italian>
|
<Italian>Niente selezionato</Italian>
|
||||||
</Key>
|
</Key>
|
||||||
</Package>
|
</Package>
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!-- Edited with tabler. -->
|
|
||||||
<Project name="ACE">
|
<Project name="ACE">
|
||||||
<Package name="Dragging">
|
<Package name="Dragging">
|
||||||
<Key ID="STR_ACE_Dragging_Drag">
|
<Key ID="STR_ACE_Dragging_Drag">
|
||||||
@ -51,4 +50,4 @@
|
|||||||
<Russian>Нести</Russian>
|
<Russian>Нести</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
</Package>
|
</Package>
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!-- Edited with tabler. -->
|
|
||||||
<Project name="ACE">
|
<Project name="ACE">
|
||||||
<Package name="Explosives">
|
<Package name="Explosives">
|
||||||
<Key ID="STR_ACE_Explosives_Menu">
|
<Key ID="STR_ACE_Explosives_Menu">
|
||||||
@ -503,4 +502,4 @@
|
|||||||
<Italian>Raccogli</Italian>
|
<Italian>Raccogli</Italian>
|
||||||
</Key>
|
</Key>
|
||||||
</Package>
|
</Package>
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -49,4 +49,7 @@ GVAR(expandedTime) = diag_tickTime;
|
|||||||
GVAR(iconCtrls) = [];
|
GVAR(iconCtrls) = [];
|
||||||
GVAR(iconCount) = 0;
|
GVAR(iconCount) = 0;
|
||||||
|
|
||||||
|
GVAR(foundActions) = [];
|
||||||
|
GVAR(lastTimeSearchedActions) = -1000;
|
||||||
|
|
||||||
ADDON = true;
|
ADDON = true;
|
||||||
|
@ -29,6 +29,7 @@ if (_menuType == 0) then {
|
|||||||
};
|
};
|
||||||
GVAR(keyDownTime) = diag_tickTime;
|
GVAR(keyDownTime) = diag_tickTime;
|
||||||
GVAR(openedMenuType) = _menuType;
|
GVAR(openedMenuType) = _menuType;
|
||||||
|
GVAR(lastTimeSearchedActions) = -1000;
|
||||||
|
|
||||||
GVAR(useCursorMenu) = (vehicle ACE_player != ACE_player) ||
|
GVAR(useCursorMenu) = (vehicle ACE_player != ACE_player) ||
|
||||||
visibleMap ||
|
visibleMap ||
|
||||||
|
@ -24,6 +24,9 @@ _fnc_renderNearbyActions = {
|
|||||||
_cameraPos = (positionCameraToWorld [0, 0, 0]) call EFUNC(common,positionToASL);
|
_cameraPos = (positionCameraToWorld [0, 0, 0]) call EFUNC(common,positionToASL);
|
||||||
_cameraDir = ((positionCameraToWorld [0, 0, 1]) call EFUNC(common,positionToASL)) vectorDiff _cameraPos;
|
_cameraDir = ((positionCameraToWorld [0, 0, 1]) call EFUNC(common,positionToASL)) vectorDiff _cameraPos;
|
||||||
|
|
||||||
|
GVAR(foundActions) = [];
|
||||||
|
GVAR(lastTimeSearchedActions) = diag_tickTime;
|
||||||
|
|
||||||
_numInteractObjects = 0;
|
_numInteractObjects = 0;
|
||||||
_nearestObjects = nearestObjects [ACE_player, ["All"], 13];
|
_nearestObjects = nearestObjects [ACE_player, ["All"], 13];
|
||||||
{
|
{
|
||||||
@ -46,6 +49,7 @@ _fnc_renderNearbyActions = {
|
|||||||
_action = _x;
|
_action = _x;
|
||||||
if ([_target, _action] call FUNC(renderBaseMenu)) then {
|
if ([_target, _action] call FUNC(renderBaseMenu)) then {
|
||||||
_numInteractions = _numInteractions + 1;
|
_numInteractions = _numInteractions + 1;
|
||||||
|
GVAR(foundActions) pushBack [_target, _action];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
} forEach GVAR(objectActionList);
|
} forEach GVAR(objectActionList);
|
||||||
@ -57,6 +61,7 @@ _fnc_renderNearbyActions = {
|
|||||||
// Try to render the menu
|
// Try to render the menu
|
||||||
if ([_target, _action] call FUNC(renderBaseMenu)) then {
|
if ([_target, _action] call FUNC(renderBaseMenu)) then {
|
||||||
_numInteractions = _numInteractions + 1;
|
_numInteractions = _numInteractions + 1;
|
||||||
|
GVAR(foundActions) pushBack [_target, _action];
|
||||||
};
|
};
|
||||||
} forEach _classActions;
|
} forEach _classActions;
|
||||||
|
|
||||||
@ -71,7 +76,11 @@ _fnc_renderNearbyActions = {
|
|||||||
} forEach _nearestObjects;
|
} forEach _nearestObjects;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
_fnc_renderLastFrameActions = {
|
||||||
|
{
|
||||||
|
_x call FUNC(renderBaseMenu);
|
||||||
|
} forEach GVAR(foundActions);
|
||||||
|
};
|
||||||
|
|
||||||
_fnc_renderSelfActions = {
|
_fnc_renderSelfActions = {
|
||||||
_target = _this;
|
_target = _this;
|
||||||
@ -109,7 +118,13 @@ _fnc_renderSelfActions = {
|
|||||||
if (GVAR(openedMenuType) == 0) then {
|
if (GVAR(openedMenuType) == 0) then {
|
||||||
|
|
||||||
if (vehicle ACE_player == ACE_player) then {
|
if (vehicle ACE_player == ACE_player) then {
|
||||||
call _fnc_renderNearbyActions;
|
if (diag_tickTime > GVAR(lastTimeSearchedActions) + 0.20) then {
|
||||||
|
// Once every 0.2 secs, collect nearby objects active and visible action points and render them
|
||||||
|
call _fnc_renderNearbyActions;
|
||||||
|
} else {
|
||||||
|
// The rest of the frames just draw the same action points rendered the last frame
|
||||||
|
call _fnc_renderLastFrameActions;
|
||||||
|
};
|
||||||
} else {
|
} else {
|
||||||
(vehicle ACE_player) call _fnc_renderSelfActions;
|
(vehicle ACE_player) call _fnc_renderSelfActions;
|
||||||
};
|
};
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!-- Edited with tabler. -->
|
|
||||||
<Project name="ACE">
|
<Project name="ACE">
|
||||||
<Package name="Interaction">
|
<Package name="Interaction">
|
||||||
<Key ID="STR_ACE_Interaction_MainAction">
|
<Key ID="STR_ACE_Interaction_MainAction">
|
||||||
@ -735,4 +734,4 @@
|
|||||||
<Italian>Passeggeri</Italian>
|
<Italian>Passeggeri</Italian>
|
||||||
</Key>
|
</Key>
|
||||||
</Package>
|
</Package>
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -19,7 +19,7 @@ private ["_playerDir", "_windSpeed", "_windDir", "_crosswind", "_headwind", "_hu
|
|||||||
if (isNil QGVAR(MIN) || isNil QGVAR(MAX)) then {
|
if (isNil QGVAR(MIN) || isNil QGVAR(MAX)) then {
|
||||||
_temperature = GET_TEMPERATURE_AT_HEIGHT((getPosASL ACE_player) select 2);
|
_temperature = GET_TEMPERATURE_AT_HEIGHT((getPosASL ACE_player) select 2);
|
||||||
_humidity = EGVAR(weather,currentHumidity);
|
_humidity = EGVAR(weather,currentHumidity);
|
||||||
_barometricPressure = 1013.25 * exp(-(EGVAR(weather,Altitude) + ((getPosASL ACE_player) select 2)) / 7990) - 10 * overcast;
|
_barometricPressure = ((getPosASL ACE_player) select 2) call EFUNC(weather,calculateBarometricPressure);
|
||||||
_altitude = EGVAR(weather,Altitude) + ((getPosASL ACE_player) select 2);
|
_altitude = EGVAR(weather,Altitude) + ((getPosASL ACE_player) select 2);
|
||||||
GVAR(MIN) = [0, 0, 0, 0, _temperature, _humidity, _barometricPressure, _altitude];
|
GVAR(MIN) = [0, 0, 0, 0, _temperature, _humidity, _barometricPressure, _altitude];
|
||||||
GVAR(MAX) = [0, 0, 0, 0, _temperature, _humidity, _barometricPressure, _altitude];
|
GVAR(MAX) = [0, 0, 0, 0, _temperature, _humidity, _barometricPressure, _altitude];
|
||||||
@ -82,7 +82,7 @@ GVAR(MAX) set [5, _humidity max (GVAR(MAX) select 5)];
|
|||||||
GVAR(TOTAL) set [5, (GVAR(TOTAL) select 5) + _humidity];
|
GVAR(TOTAL) set [5, (GVAR(TOTAL) select 5) + _humidity];
|
||||||
|
|
||||||
// BARO
|
// BARO
|
||||||
_barometricPressure = 1013.25 * exp(-(EGVAR(weather,Altitude) + ((getPosASL ACE_player) select 2)) / 7990) - 10 * overcast;
|
_barometricPressure = ((getPosASL ACE_player) select 2) call EFUNC(weather,calculateBarometricPressure);
|
||||||
GVAR(MIN) set [6, (GVAR(MIN) select 6) min _barometricPressure];
|
GVAR(MIN) set [6, (GVAR(MIN) select 6) min _barometricPressure];
|
||||||
GVAR(MAX) set [6, _barometricPressure max (GVAR(MAX) select 6)];
|
GVAR(MAX) set [6, _barometricPressure max (GVAR(MAX) select 6)];
|
||||||
GVAR(TOTAL) set [6, (GVAR(TOTAL) select 6) + _barometricPressure];
|
GVAR(TOTAL) set [6, (GVAR(TOTAL) select 6) + _barometricPressure];
|
||||||
|
@ -174,7 +174,7 @@ switch (GVAR(Menu)) do {
|
|||||||
};
|
};
|
||||||
case 6: { // BARO
|
case 6: { // BARO
|
||||||
if (!GVAR(MinAvgMax)) then {
|
if (!GVAR(MinAvgMax)) then {
|
||||||
_textCenterBig = Str(round((1013.25 * exp(-(EGVAR(weather,Altitude) + ((getPosASL ACE_player) select 2)) / 7990) - 10 * overcast) * 10) / 10);
|
_textCenterBig = Str(round((((getPosASL ACE_player) select 2) call EFUNC(weather,calculateBarometricPressure)) * 10) / 10);
|
||||||
} else {
|
} else {
|
||||||
_textCenterLine1Left = "Min";
|
_textCenterLine1Left = "Min";
|
||||||
_textCenterLine2Left = "Avg";
|
_textCenterLine2Left = "Avg";
|
||||||
|
@ -79,7 +79,11 @@ class ACE_Settings {
|
|||||||
displayName = "$STR_ACE_Medical_litterSimulationDetail";
|
displayName = "$STR_ACE_Medical_litterSimulationDetail";
|
||||||
description = "$STR_ACE_Medical_litterSimulationDetail_Desc";
|
description = "$STR_ACE_Medical_litterSimulationDetail_Desc";
|
||||||
typeName = "SCALAR";
|
typeName = "SCALAR";
|
||||||
value = 500;
|
|
||||||
|
value = 3;
|
||||||
|
values[] = {"Off", "Low", "Medium", "High", "Ultra"};
|
||||||
|
_values[] = { 0, 50, 100, 1000, 5000 };
|
||||||
|
|
||||||
isClientSettable = 1;
|
isClientSettable = 1;
|
||||||
};
|
};
|
||||||
class GVAR(litterCleanUpDelay) {
|
class GVAR(litterCleanUpDelay) {
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
if(!hasInterface) exitWith { false };
|
if(!hasInterface) exitWith { false };
|
||||||
|
|
||||||
PARAMS_3(_litterClass,_position,_direction);
|
PARAMS_3(_litterClass,_position,_direction);
|
||||||
private["_litterObject"];
|
private["_litterObject", "_maxLitterCount"];
|
||||||
|
|
||||||
if (isNil QGVAR(allCreatedLitter)) then {
|
if (isNil QGVAR(allCreatedLitter)) then {
|
||||||
GVAR(allCreatedLitter) = [];
|
GVAR(allCreatedLitter) = [];
|
||||||
@ -14,7 +14,8 @@ if (isNil QGVAR(allCreatedLitter)) then {
|
|||||||
_litterObject = _litterClass createVehicleLocal _position;
|
_litterObject = _litterClass createVehicleLocal _position;
|
||||||
_litterObject setDir _direction;
|
_litterObject setDir _direction;
|
||||||
|
|
||||||
if((count GVAR(allCreatedLitter)) > GVAR(litterSimulationDetail) ) then {
|
_maxLitterCount = getArray (configFile >> "ACE_Settings" >> QGVAR(litterSimulationDetail) >> "_values") select GVAR(litterSimulationDetail);
|
||||||
|
if((count GVAR(allCreatedLitter)) > _maxLitterCount ) then {
|
||||||
// gank the first litter object, and spawn ours.
|
// gank the first litter object, and spawn ours.
|
||||||
private["_oldLitter"];
|
private["_oldLitter"];
|
||||||
_oldLitter = GVAR(allCreatedLitter) deleteAt 0;
|
_oldLitter = GVAR(allCreatedLitter) deleteAt 0;
|
||||||
|
@ -477,7 +477,7 @@
|
|||||||
<English>Minor</English>
|
<English>Minor</English>
|
||||||
<German>Gering</German>
|
<German>Gering</German>
|
||||||
<Spanish>Menor</Spanish>
|
<Spanish>Menor</Spanish>
|
||||||
<Russian>Легкие ранения</Russian>
|
<Russian>Несрочная помощь</Russian>
|
||||||
<Polish>Normalny</Polish>
|
<Polish>Normalny</Polish>
|
||||||
<French>Léger</French>
|
<French>Léger</French>
|
||||||
<Czech>Minimální</Czech>
|
<Czech>Minimální</Czech>
|
||||||
@ -487,7 +487,7 @@
|
|||||||
<Key ID="STR_ACE_MEDICAL_TRIAGE_STATUS_DELAYED">
|
<Key ID="STR_ACE_MEDICAL_TRIAGE_STATUS_DELAYED">
|
||||||
<English>Delayed</English>
|
<English>Delayed</English>
|
||||||
<Spanish>Retrasado</Spanish>
|
<Spanish>Retrasado</Spanish>
|
||||||
<Russian>Средние ранения</Russian>
|
<Russian>Срочная помощь</Russian>
|
||||||
<Polish>Opóźniony</Polish>
|
<Polish>Opóźniony</Polish>
|
||||||
<French>Différé</French>
|
<French>Différé</French>
|
||||||
<German>Verzögert</German>
|
<German>Verzögert</German>
|
||||||
@ -498,7 +498,7 @@
|
|||||||
<Key ID="STR_ACE_MEDICAL_TRIAGE_STATUS_IMMEDIATE">
|
<Key ID="STR_ACE_MEDICAL_TRIAGE_STATUS_IMMEDIATE">
|
||||||
<English>Immediate</English>
|
<English>Immediate</English>
|
||||||
<Spanish>Inmediato</Spanish>
|
<Spanish>Inmediato</Spanish>
|
||||||
<Russian>Тяжелые ранения</Russian>
|
<Russian>Неотложная помощь</Russian>
|
||||||
<Polish>Natychmiastowy</Polish>
|
<Polish>Natychmiastowy</Polish>
|
||||||
<French>Urgence Immédiate</French>
|
<French>Urgence Immédiate</French>
|
||||||
<German>Sofort</German>
|
<German>Sofort</German>
|
||||||
@ -1529,7 +1529,7 @@
|
|||||||
<English>Heavily wounded</English>
|
<English>Heavily wounded</English>
|
||||||
<German>Schwer verwundet:</German>
|
<German>Schwer verwundet:</German>
|
||||||
<Polish>Ciężko ranny</Polish>
|
<Polish>Ciężko ranny</Polish>
|
||||||
<Russian>Сильные ранения</Russian>
|
<Russian>Тяжелые ранения</Russian>
|
||||||
<Italian>Gravemente ferito</Italian>
|
<Italian>Gravemente ferito</Italian>
|
||||||
<Spanish>Gravemente herido</Spanish>
|
<Spanish>Gravemente herido</Spanish>
|
||||||
<French>Lourdement blessé</French>
|
<French>Lourdement blessé</French>
|
||||||
@ -1610,7 +1610,7 @@
|
|||||||
<English>Pain Effect Type</English>
|
<English>Pain Effect Type</English>
|
||||||
<German>Schmerzeffekt-Typ</German>
|
<German>Schmerzeffekt-Typ</German>
|
||||||
<Polish>Rodzaj efektu bólu</Polish>
|
<Polish>Rodzaj efektu bólu</Polish>
|
||||||
<Russian>Эффект боли</Russian>
|
<Russian>Визуальный эффект боли</Russian>
|
||||||
<Italian>Pain Effect Type</Italian>
|
<Italian>Pain Effect Type</Italian>
|
||||||
<Spanish>Tipo de efecto de dolor</Spanish>
|
<Spanish>Tipo de efecto de dolor</Spanish>
|
||||||
<French>Type d'effet de douleur</French>
|
<French>Type d'effet de douleur</French>
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!-- Edited with tabler. -->
|
|
||||||
<Project name="ACE">
|
<Project name="ACE">
|
||||||
<Package name="microdagr">
|
<Package name="microdagr">
|
||||||
<Key ID="STR_ACE_microdagr_itemName">
|
<Key ID="STR_ACE_microdagr_itemName">
|
||||||
@ -280,4 +279,4 @@
|
|||||||
<Italian>Chiudi MicroDAGR</Italian>
|
<Italian>Chiudi MicroDAGR</Italian>
|
||||||
</Key>
|
</Key>
|
||||||
</Package>
|
</Package>
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
<Czech>Zobrazit jména hráčů</Czech>
|
<Czech>Zobrazit jména hráčů</Czech>
|
||||||
<Portuguese>Mostrar nomes de jogadores</Portuguese>
|
<Portuguese>Mostrar nomes de jogadores</Portuguese>
|
||||||
<Italian>Mostra i nomi dei giocatori</Italian>
|
<Italian>Mostra i nomi dei giocatori</Italian>
|
||||||
<Russian>Показать имена игроков</Russian>
|
<Russian>Показывать имена игроков (включить имена)</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_NameTags_ShowPlayerNamesOnlyOnCursor">
|
<Key ID="STR_ACE_NameTags_ShowPlayerNamesOnlyOnCursor">
|
||||||
<English>Show player name only on cursor (requires player names)</English>
|
<English>Show player name only on cursor (requires player names)</English>
|
||||||
@ -34,7 +34,7 @@
|
|||||||
<Italian>Mostra i nomi solo se puntati (richiede mostra nomi abilitato)</Italian>
|
<Italian>Mostra i nomi solo se puntati (richiede mostra nomi abilitato)</Italian>
|
||||||
<Portuguese>Mostrar nome de jogador somente no cursor (requer nome de jogadores)</Portuguese>
|
<Portuguese>Mostrar nome de jogador somente no cursor (requer nome de jogadores)</Portuguese>
|
||||||
<Hungarian>Játékosok nevének mutatása csak a kurzoron (a nevek mutatása szükséges)</Hungarian>
|
<Hungarian>Játékosok nevének mutatása csak a kurzoron (a nevek mutatása szükséges)</Hungarian>
|
||||||
<Russian>Показать имена игроков только под курсором (требует имен игроков)</Russian>
|
<Russian>Показать имена игроков только под курсором (при включенных именах)</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_NameTags_ShowPlayerNamesOnlyOnKeyPress">
|
<Key ID="STR_ACE_NameTags_ShowPlayerNamesOnlyOnKeyPress">
|
||||||
<English>Show player name only on keypress (requires player names)</English>
|
<English>Show player name only on keypress (requires player names)</English>
|
||||||
@ -44,7 +44,7 @@
|
|||||||
<Czech>Zobrazit jména hráčů jen na klávesu (vyžaduje jména hráčů)</Czech>
|
<Czech>Zobrazit jména hráčů jen na klávesu (vyžaduje jména hráčů)</Czech>
|
||||||
<Polish>Pokaż imiona graczy tylko po przytrzymaniu klawisza (wymagana opcja Pokaż imiona graczy)</Polish>
|
<Polish>Pokaż imiona graczy tylko po przytrzymaniu klawisza (wymagana opcja Pokaż imiona graczy)</Polish>
|
||||||
<Hungarian>Játékosnevek mutatása csak gombnyomásra (a nevek mutatása szükséges)</Hungarian>
|
<Hungarian>Játékosnevek mutatása csak gombnyomásra (a nevek mutatása szükséges)</Hungarian>
|
||||||
<Russian>Показать имена игроков только по нажатию клавиши (требует имен игроков)</Russian>
|
<Russian>Показать имена игроков только по нажатию клавиши (при включенных именах)</Russian>
|
||||||
<Italian>Mostra i nomi solo se si preme il tasto (richiede mostra nomi abilitato)</Italian>
|
<Italian>Mostra i nomi solo se si preme il tasto (richiede mostra nomi abilitato)</Italian>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_NameTags_ShowPlayerRanks">
|
<Key ID="STR_ACE_NameTags_ShowPlayerRanks">
|
||||||
@ -57,7 +57,7 @@
|
|||||||
<Italian>Mostra i gradi (richiede mostra nomi abilitato)</Italian>
|
<Italian>Mostra i gradi (richiede mostra nomi abilitato)</Italian>
|
||||||
<Portuguese>Mostrar patente de jogadores (requer nome de jogadores)</Portuguese>
|
<Portuguese>Mostrar patente de jogadores (requer nome de jogadores)</Portuguese>
|
||||||
<Hungarian>Játékosok rendfokozatának mutatása (a nevek mutatása szükséges)</Hungarian>
|
<Hungarian>Játékosok rendfokozatának mutatása (a nevek mutatása szükséges)</Hungarian>
|
||||||
<Russian>Показывать звания игроков (требует имен игроков)</Russian>
|
<Russian>Показывать звания игроков (при вкл. именах)</Russian>
|
||||||
</Key>
|
</Key>
|
||||||
<Key ID="STR_ACE_NameTags_ShowVehicleCrewInfo">
|
<Key ID="STR_ACE_NameTags_ShowVehicleCrewInfo">
|
||||||
<English>Show vehicle crew info</English>
|
<English>Show vehicle crew info</English>
|
||||||
@ -74,7 +74,7 @@
|
|||||||
<English>Show name tags for AI units</English>
|
<English>Show name tags for AI units</English>
|
||||||
<German>Zeige Namen für KI Einheiten</German>
|
<German>Zeige Namen für KI Einheiten</German>
|
||||||
<Spanish>Mostrar etiquetas de nombre para unidades IA </Spanish>
|
<Spanish>Mostrar etiquetas de nombre para unidades IA </Spanish>
|
||||||
<Russian>Показывать именые метки ИИ</Russian>
|
<Russian>Показывать имена ботов</Russian>
|
||||||
<Czech>Zobrazit jména AI</Czech>
|
<Czech>Zobrazit jména AI</Czech>
|
||||||
<Polish>Wyświetl imiona jednostek AI</Polish>
|
<Polish>Wyświetl imiona jednostek AI</Polish>
|
||||||
<French>Afficher les noms des IA</French>
|
<French>Afficher les noms des IA</French>
|
||||||
@ -85,7 +85,7 @@
|
|||||||
<English>Show SoundWaves (requires player names)</English>
|
<English>Show SoundWaves (requires player names)</English>
|
||||||
<German>Zeigen Schallwellen (benötigt Spielernamen)</German>
|
<German>Zeigen Schallwellen (benötigt Spielernamen)</German>
|
||||||
<Spanish>Mostrar onda sonora (requiere Mostrar nombres de jugadores)</Spanish>
|
<Spanish>Mostrar onda sonora (requiere Mostrar nombres de jugadores)</Spanish>
|
||||||
<Russian>Показывать звуковые волны (требует имен игроков)</Russian>
|
<Russian>Индикатор разговора (при вкл. именах)</Russian>
|
||||||
<Czech>Zobrazit SoundWaves (vyžaduje jména hráčů)</Czech>
|
<Czech>Zobrazit SoundWaves (vyžaduje jména hráčů)</Czech>
|
||||||
<Polish>Pokaż fale dźwiękowe (wymagana opcja Pokaż imiona graczy)</Polish>
|
<Polish>Pokaż fale dźwiękowe (wymagana opcja Pokaż imiona graczy)</Polish>
|
||||||
<French>Afficher "qui parle" (si noms affichés)</French>
|
<French>Afficher "qui parle" (si noms affichés)</French>
|
||||||
|
@ -1,6 +1,36 @@
|
|||||||
//XEH_postInit.sqf
|
|
||||||
//#define DEBUG_MODE_FULL
|
|
||||||
#include "script_component.hpp"
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
// Rain variables
|
||||||
|
GVAR(enableRain) = true;
|
||||||
|
GVAR(rain_next_period) = -1;
|
||||||
|
GVAR(rain_period_count) = 0;
|
||||||
|
GVAR(rain_initial_rain) = 0;
|
||||||
|
if(overcast >= 0.7) then {
|
||||||
|
GVAR(rain_initial_rain) = (random ((overcast-0.7)/0.3));
|
||||||
|
};
|
||||||
|
GVAR(current_rain) = GVAR(rain_initial_rain);
|
||||||
|
GVAR(rain_current_range) = -1+(random 2);
|
||||||
|
GVAR(overcast_multiplier) = 1;
|
||||||
|
|
||||||
|
// Wind Variables
|
||||||
|
ACE_wind = [0, 0, 0];
|
||||||
|
GVAR(wind_initial_dir) = (random 360);
|
||||||
|
GVAR(wind_initial_speed) = (overcast*5)+(random (overcast*5)) max 1;
|
||||||
|
GVAR(wind_mean_speed) = GVAR(wind_initial_speed);
|
||||||
|
GVAR(wind_mean_dir) = GVAR(wind_initial_dir);
|
||||||
|
GVAR(wind_current_speed) = GVAR(wind_initial_speed);
|
||||||
|
GVAR(wind_current_dir) = GVAR(wind_initial_dir);
|
||||||
|
GVAR(wind_current_range_speed) = -1+(random 2);
|
||||||
|
GVAR(wind_current_range_dir) = -1+(random 2);
|
||||||
|
GVAR(wind_next_period) = -1; //ceil((2+random(5))/(GVAR(overcast_multiplier)/10));
|
||||||
|
GVAR(wind_next_major_period) = -1;
|
||||||
|
GVAR(wind_period_count) = 0;
|
||||||
|
GVAR(wind_major_period_count) = 0;
|
||||||
|
GVAR(wind_total_time) = 0;
|
||||||
|
GVAR(wind_period_start_time) = time;
|
||||||
|
|
||||||
|
call FUNC(getMapData);
|
||||||
|
|
||||||
"ACE_WIND_PARAMS" addPublicVariableEventHandler { GVAR(wind_period_start_time) = time; };
|
"ACE_WIND_PARAMS" addPublicVariableEventHandler { GVAR(wind_period_start_time) = time; };
|
||||||
"ACE_RAIN_PARAMS" addPublicVariableEventHandler { GVAR(rain_period_start_time) = time; };
|
"ACE_RAIN_PARAMS" addPublicVariableEventHandler { GVAR(rain_period_start_time) = time; };
|
||||||
"ACE_MISC_PARAMS" addPublicVariableEventHandler {
|
"ACE_MISC_PARAMS" addPublicVariableEventHandler {
|
||||||
@ -22,66 +52,9 @@
|
|||||||
{false},
|
{false},
|
||||||
[37, [true, false, false]], false, 0] call CBA_fnc_addKeybind; // (SHIFT + K)
|
[37, [true, false, false]], false, 0] call CBA_fnc_addKeybind; // (SHIFT + K)
|
||||||
|
|
||||||
// Update Wind
|
|
||||||
simulWeatherSync;
|
simulWeatherSync;
|
||||||
_fnc_updateWind = {
|
|
||||||
ACE_wind = [] call FUNC(getWind);
|
|
||||||
setWind [ACE_wind select 0, ACE_wind select 1, true];
|
|
||||||
2 setGusts 0;
|
|
||||||
|
|
||||||
// Set waves: 0 when no wind, 1 when wind >= 16 m/s
|
[FUNC(updateTemperature), 20, []] call CBA_fnc_addPerFrameHandler;
|
||||||
1 setWaves (((vectorMagnitude ACE_wind) / 16.0) min 1.0);
|
[FUNC(updateHumidity), 20, []] call CBA_fnc_addPerFrameHandler;
|
||||||
|
[FUNC(updateWind), 1, []] call CBA_fnc_addPerFrameHandler;
|
||||||
//systemChat format ["w:%1 %2,ACE_w:%1 %2, w", [wind select 0, wind select 1, ACE_wind select 0, ACE_wind select 1]];
|
[FUNC(updateRain), 2, []] call CBA_fnc_addPerFrameHandler;
|
||||||
};
|
|
||||||
[_fnc_updateWind, 1, []] call CBA_fnc_addPerFrameHandler;
|
|
||||||
|
|
||||||
|
|
||||||
// Update Rain
|
|
||||||
_fnc_updateRain = {
|
|
||||||
private ["_oldStrength","_rainStrength","_transitionTime","_periodPosition","_periodPercent"];
|
|
||||||
if(GVAR(enableRain)) then {
|
|
||||||
if(!isNil "ACE_RAIN_PARAMS" && {!isNil QGVAR(rain_period_start_time)}) then {
|
|
||||||
_oldStrength = ACE_RAIN_PARAMS select 0;
|
|
||||||
_rainStrength = ACE_RAIN_PARAMS select 1;
|
|
||||||
_transitionTime = ACE_RAIN_PARAMS select 2;
|
|
||||||
_periodPosition = (time - GVAR(rain_period_start_time)) min _transitionTime;
|
|
||||||
_periodPercent = (_periodPosition/_transitionTime) min 1;
|
|
||||||
|
|
||||||
0 setRain ((_periodPercent*(_rainStrength-_oldStrength))+_oldStrength);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
[_fnc_updateRain, 2, []] call CBA_fnc_addPerFrameHandler;
|
|
||||||
|
|
||||||
|
|
||||||
// Update Temperature
|
|
||||||
_fnc_updateTemperature = {
|
|
||||||
private ["_time","_month","_hourlyCoef","_avgTemperature","_pS1","_pS2"];
|
|
||||||
_time = daytime;
|
|
||||||
_month = date select 1;
|
|
||||||
|
|
||||||
// Temperature
|
|
||||||
_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) - 2 * humidity - 4 * overcast;
|
|
||||||
GVAR(currentTemperature) = round(GVAR(currentTemperature) * 10) / 10;
|
|
||||||
|
|
||||||
// Humidity
|
|
||||||
GVAR(currentHumidity) = (GVAR(Humidity) select _month) / 100;
|
|
||||||
|
|
||||||
if (rain > 0 && overcast > 0.7) then {
|
|
||||||
GVAR(currentHumidity) = 1;
|
|
||||||
} else {
|
|
||||||
_avgTemperature = ((GVAR(TempDay) select (_month - 1)) + (GVAR(TempNight) select (_month - 1))) / 2;
|
|
||||||
_pS1 = 6.112 * exp((17.62 * _avgTemperature) / (243.12 + _avgTemperature));
|
|
||||||
_PS2 = 6.112 * exp((17.62 * GVAR(currentTemperature)) / (243.12 + GVAR(currentTemperature)));
|
|
||||||
GVAR(currentHumidity) = GVAR(currentHumidity) * _PS1 / _PS2;
|
|
||||||
};
|
|
||||||
GVAR(currentHumidity) = 0 max GVAR(currentHumidity) min 1;
|
|
||||||
|
|
||||||
// @todo: take altitude and humidity into account
|
|
||||||
GVAR(currentRelativeDensity) = (273.15 + 20) / (273.15 + GVAR(currentTemperature));
|
|
||||||
};
|
|
||||||
[_fnc_updateTemperature, 20, []] call CBA_fnc_addPerFrameHandler;
|
|
@ -2,44 +2,16 @@
|
|||||||
#include "script_component.hpp"
|
#include "script_component.hpp"
|
||||||
|
|
||||||
ADDON = false;
|
ADDON = false;
|
||||||
LOG(MSG_INIT);
|
|
||||||
|
|
||||||
|
PREP(calculateAirDensity);
|
||||||
|
PREP(calculateBarometricPressure);
|
||||||
PREP(displayWindInfo);
|
PREP(displayWindInfo);
|
||||||
PREP(getMapData);
|
PREP(getMapData);
|
||||||
PREP(getWind);
|
PREP(getWind);
|
||||||
PREP(serverController);
|
PREP(serverController);
|
||||||
|
PREP(updateHumidity);
|
||||||
|
PREP(updateRain);
|
||||||
// Rain variables
|
PREP(updateTemperature);
|
||||||
GVAR(enableRain) = true;
|
PREP(updateWind);
|
||||||
GVAR(rain_next_period) = -1;
|
|
||||||
GVAR(rain_period_count) = 0;
|
|
||||||
GVAR(rain_initial_rain) = 0;
|
|
||||||
if(overcast >= 0.7) then {
|
|
||||||
GVAR(rain_initial_rain) = (random ((overcast-0.7)/0.3));
|
|
||||||
};
|
|
||||||
GVAR(current_rain) = GVAR(rain_initial_rain);
|
|
||||||
GVAR(rain_current_range) = -1+(random 2);
|
|
||||||
GVAR(overcast_multiplier) = 1;
|
|
||||||
|
|
||||||
// Wind Variables
|
|
||||||
ACE_wind = [0, 0, 0];
|
|
||||||
GVAR(wind_initial_dir) = (random 360);
|
|
||||||
GVAR(wind_initial_speed) = (overcast*5)+(random (overcast*5)) max 1;
|
|
||||||
GVAR(wind_mean_speed) = GVAR(wind_initial_speed);
|
|
||||||
GVAR(wind_mean_dir) = GVAR(wind_initial_dir);
|
|
||||||
GVAR(wind_current_speed) = GVAR(wind_initial_speed);
|
|
||||||
GVAR(wind_current_dir) = GVAR(wind_initial_dir);
|
|
||||||
GVAR(wind_current_range_speed) = -1+(random 2);
|
|
||||||
GVAR(wind_current_range_dir) = -1+(random 2);
|
|
||||||
GVAR(wind_next_period) = -1; //ceil((2+random(5))/(GVAR(overcast_multiplier)/10));
|
|
||||||
GVAR(wind_next_major_period) = -1;
|
|
||||||
GVAR(wind_period_count) = 0;
|
|
||||||
GVAR(wind_major_period_count) = 0;
|
|
||||||
GVAR(wind_total_time) = 0;
|
|
||||||
GVAR(wind_period_start_time) = time;
|
|
||||||
|
|
||||||
// Init weather variables, in case they are needed before postInit
|
|
||||||
call FUNC(getMapData);
|
|
||||||
|
|
||||||
ADDON = true;
|
ADDON = true;
|
||||||
|
36
addons/weather/functions/fnc_calculateAirDensity.sqf
Normal file
36
addons/weather/functions/fnc_calculateAirDensity.sqf
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Author: Ruthberg
|
||||||
|
*
|
||||||
|
* Calculates the air density
|
||||||
|
*
|
||||||
|
* 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"
|
||||||
|
|
||||||
|
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))
|
||||||
|
};
|
20
addons/weather/functions/fnc_calculateBarometricPressure.sqf
Normal file
20
addons/weather/functions/fnc_calculateBarometricPressure.sqf
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* Author: Ruthberg
|
||||||
|
*
|
||||||
|
* Calculates the barometric pressure based on altitude and weather
|
||||||
|
*
|
||||||
|
* Arguments:
|
||||||
|
* 0: altitude - meters <NUMBER>
|
||||||
|
*
|
||||||
|
* Return Value:
|
||||||
|
* 0: barometric pressure - hPA <NUMBER>
|
||||||
|
*
|
||||||
|
* Return value:
|
||||||
|
* None
|
||||||
|
*/
|
||||||
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
private ["_altitude"];
|
||||||
|
_altitude = _this;
|
||||||
|
|
||||||
|
(1013.25 * exp(-(GVAR(Altitude) + _altitude) / 7990) - 10 * overcast)
|
@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Author: Ruthberg
|
* Author: Ruthberg
|
||||||
|
*
|
||||||
* Displays a wind info (colored arrow) in the top left corner of the screen
|
* Displays a wind info (colored arrow) in the top left corner of the screen
|
||||||
*
|
*
|
||||||
* Argument:
|
* Argument:
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Author: Ruthberg, esteldunedain
|
* Author: Ruthberg, esteldunedain
|
||||||
|
*
|
||||||
* Get the weather data for the current map
|
* Get the weather data for the current map
|
||||||
*
|
*
|
||||||
* Argument:
|
* Argument:
|
||||||
@ -109,3 +110,6 @@ if (worldName in ["Imrali"]) exitWith {
|
|||||||
GVAR(TempDay) = [1, 3, 9, 14, 19, 23, 25, 24, 21, 13, 7, 2];
|
GVAR(TempDay) = [1, 3, 9, 14, 19, 23, 25, 24, 21, 13, 7, 2];
|
||||||
GVAR(TempNight) = [-4, -3, 0, 4, 9, 12, 14, 14, 10, 6, 2, -2];
|
GVAR(TempNight) = [-4, -3, 0, 4, 9, 12, 14, 14, 10, 6, 2, -2];
|
||||||
GVAR(Humidity) = [82, 80, 78, 70, 71, 72, 70, 73, 78, 80, 83, 82];
|
GVAR(Humidity) = [82, 80, 78, 70, 71, 72, 70, 73, 78, 80, 83, 82];
|
||||||
|
|
||||||
|
GVAR(currentTemperature) = 20;
|
||||||
|
GVAR(currentHumidity) = 0.5;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Author: ACE2 Team
|
* Author: ACE2 Team
|
||||||
|
*
|
||||||
* Calculate current wind locally from the data broadcasted by the server
|
* Calculate current wind locally from the data broadcasted by the server
|
||||||
*
|
*
|
||||||
* Argument:
|
* Argument:
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Author: ACE2 Team, esteldunedain
|
* Author: ACE2 Team, esteldunedain
|
||||||
|
*
|
||||||
* Calculate the wind and rain evolution on the server. Broadcast the current and next values to the clients
|
* Calculate the wind and rain evolution on the server. Broadcast the current and next values to the clients
|
||||||
*
|
*
|
||||||
* Argument:
|
* Argument:
|
||||||
|
28
addons/weather/functions/fnc_updateHumidity.sqf
Normal file
28
addons/weather/functions/fnc_updateHumidity.sqf
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* Author: ACE2 Team
|
||||||
|
*
|
||||||
|
* Updates GVAR(currentHumidity) based on
|
||||||
|
*
|
||||||
|
* Argument:
|
||||||
|
* Nothing
|
||||||
|
*
|
||||||
|
* Return value:
|
||||||
|
* Nothing
|
||||||
|
*/
|
||||||
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
private ["_month", "_avgTemperature", "_pS1", "_pS2"];
|
||||||
|
_month = date select 1;
|
||||||
|
|
||||||
|
GVAR(currentHumidity) = (GVAR(Humidity) select _month) / 100;
|
||||||
|
|
||||||
|
if (rain > 0 && overcast > 0.7) then {
|
||||||
|
GVAR(currentHumidity) = 1;
|
||||||
|
} else {
|
||||||
|
_avgTemperature = ((GVAR(TempDay) select (_month - 1)) + (GVAR(TempNight) select (_month - 1))) / 2;
|
||||||
|
_pS1 = 6.112 * exp((17.62 * _avgTemperature) / (243.12 + _avgTemperature));
|
||||||
|
_PS2 = 6.112 * exp((17.62 * GVAR(currentTemperature)) / (243.12 + GVAR(currentTemperature)));
|
||||||
|
GVAR(currentHumidity) = GVAR(currentHumidity) * _PS1 / _PS2;
|
||||||
|
};
|
||||||
|
|
||||||
|
GVAR(currentHumidity) = 0 max GVAR(currentHumidity) min 1;
|
26
addons/weather/functions/fnc_updateRain.sqf
Normal file
26
addons/weather/functions/fnc_updateRain.sqf
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* Author: ACE2 Team
|
||||||
|
*
|
||||||
|
* Updates rain based on ACE_RAIN_PARAMS
|
||||||
|
*
|
||||||
|
* Argument:
|
||||||
|
* Nothing
|
||||||
|
*
|
||||||
|
* Return value:
|
||||||
|
* Nothing
|
||||||
|
*/
|
||||||
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
private ["_oldStrength", "_rainStrength", "_transitionTime", "_periodPosition", "_periodPercent"];
|
||||||
|
|
||||||
|
if (!GVAR(enableRain)) exitWith {};
|
||||||
|
|
||||||
|
if (!isNil "ACE_RAIN_PARAMS" && {!isNil QGVAR(rain_period_start_time)}) then {
|
||||||
|
_oldStrength = ACE_RAIN_PARAMS select 0;
|
||||||
|
_rainStrength = ACE_RAIN_PARAMS select 1;
|
||||||
|
_transitionTime = ACE_RAIN_PARAMS select 2;
|
||||||
|
_periodPosition = (time - GVAR(rain_period_start_time)) min _transitionTime;
|
||||||
|
_periodPercent = (_periodPosition/_transitionTime) min 1;
|
||||||
|
|
||||||
|
0 setRain ((_periodPercent*(_rainStrength-_oldStrength))+_oldStrength);
|
||||||
|
};
|
22
addons/weather/functions/fnc_updateTemperature.sqf
Normal file
22
addons/weather/functions/fnc_updateTemperature.sqf
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* Author: ACE2 Team
|
||||||
|
*
|
||||||
|
* Updates GVAR(currentTemperature) based on the map data
|
||||||
|
*
|
||||||
|
* Argument:
|
||||||
|
* Nothing
|
||||||
|
*
|
||||||
|
* Return value:
|
||||||
|
* Nothing
|
||||||
|
*/
|
||||||
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
private ["_time", "_month", "_hourlyCoef"];
|
||||||
|
_time = daytime;
|
||||||
|
_month = date select 1;
|
||||||
|
|
||||||
|
_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) - 2 * humidity - 4 * overcast;
|
||||||
|
GVAR(currentTemperature) = round(GVAR(currentTemperature) * 10) / 10;
|
21
addons/weather/functions/fnc_updateWind.sqf
Normal file
21
addons/weather/functions/fnc_updateWind.sqf
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* Author: ACE2 Team
|
||||||
|
*
|
||||||
|
* Updates wind, gusts and waves based on ACE_wind
|
||||||
|
*
|
||||||
|
* Argument:
|
||||||
|
* Nothing
|
||||||
|
*
|
||||||
|
* Return value:
|
||||||
|
* Nothing
|
||||||
|
*/
|
||||||
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
ACE_wind = [] call FUNC(getWind);
|
||||||
|
setWind [ACE_wind select 0, ACE_wind select 1, true];
|
||||||
|
2 setGusts 0;
|
||||||
|
|
||||||
|
// Set waves: 0 when no wind, 1 when wind >= 16 m/s
|
||||||
|
1 setWaves (((vectorMagnitude ACE_wind) / 16.0) min 1.0);
|
||||||
|
|
||||||
|
//hintSilent format["Wind: %1\nACE_wind: %2\nDeviation: %3 (m/s)", wind, ACE_wind, Round((vectorMagnitude (ACE_wind vectorDiff wind)) * 1000) / 1000];
|
@ -10,3 +10,11 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "\z\ace\addons\main\script_macros.hpp"
|
#include "\z\ace\addons\main\script_macros.hpp"
|
||||||
|
|
||||||
|
#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
|
||||||
|
Loading…
Reference in New Issue
Block a user