manual merge

This commit is contained in:
commy2 2015-04-20 18:22:17 +02:00
commit 14214090dc
285 changed files with 2981 additions and 1612 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -2,7 +2,6 @@
ADDON = false;
PREP(calculateAirDensity);
PREP(calculateAmmoTemperatureVelocityShift);
PREP(calculateAtmosphericCorrection);
PREP(calculateBarrelLengthVelocityShift);

View File

@ -1,7 +1,7 @@
/*
* Author: Ruthberg
*
* Displays a wind info (colored arrow) in the top left corner of the screen
* Calculates the air density
*
* Arguments:
* 0: temperature - degrees celcius <NUMBER>

View File

@ -24,7 +24,7 @@ _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);
_airDensity = [_temperature, _pressure, _relativeHumidity] call EFUNC(weather,calculateAirDensity);
if (_atmosphereModel == "ICAO") then {
(STD_AIR_DENSITY_ICAO / _airDensity) * _ballisticCoefficient

View File

@ -110,7 +110,7 @@ _stabilityFactor = 1.5;
if (_caliber > 0 && _bulletLength > 0 && _bulletMass > 0 && _barrelTwist > 0) then {
_temperature = GET_TEMPERATURE_AT_HEIGHT((getPosASL _unit) select 2);
_barometricPressure = 1013.25 * exp(-(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);
};
@ -288,7 +288,7 @@ if (GVAR(AdvancedAirDragEnabled)) 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);
_humidity = EGVAR(weather,currentHumidity);
_airDensity = STD_AIR_DENSITY_ICAO;
@ -315,7 +315,7 @@ if (GVAR(AdvancedAirDragEnabled)) then {
_bulletVelocity = _bulletVelocity vectorDiff _accel;
} else {
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);
_humidity = EGVAR(weather,currentHumidity);
_airFriction = _airFriction + ((_temperature - 15) * 0.0000015 + _humidity * 0.0000040 + _pressureDeviation * -0.0000009);

View File

@ -7,8 +7,9 @@
<Polish>Pokaż inf. o wietrze</Polish>
<Italian>Mostra indicazioni del vento</Italian>
<Russian>Показать информацию о ветре</Russian>
<French>Afficher les info du vent</French>
<French>Afficher les info sur le vent</French>
<Spanish>Mostrar información del viento</Spanish>
<German>Windinformationen anzeigen</German>
</Key>
<Key ID="STR_ACE_AdvancedBallistics_ProtractorKey">
<English>Show Protractor</English>
@ -17,6 +18,7 @@
<Russian>Показать транспортир</Russian>
<French>Afficher le rapporteur</French>
<Spanish>Mostrar transportador</Spanish>
<German>Winkelmesser anzeigen</German>
</Key>
</Package>
</Project>
</Project>

View File

@ -133,40 +133,6 @@ class ATragMX_RscListNBox: ATragMX_RscListBox {
idcLeft=-1;
idcRight=-1;
};
class ATragMX_RscControlsGroup {
type=15;
idc=-1;
style=16;
x=0;
y=0;
w=1;
h=1;
shadow=0;
class VScrollbar {
color[]={1,1,1,0.6};
width=0.021;
autoScrollSpeed=-1;
autoScrollDelay=5;
autoScrollRewind=0;
shadow=0;
};
class HScrollbar {
color[]={1,1,1,0.6};
height=0.028;
shadow=0;
};
class ScrollBar {
color[]={1,1,1,0.6};
colorActive[]={1,1,1,1};
colorDisabled[]={1,1,1,0.3};
thumb="#(argb,8,8,3)color(1,1,1,1)";
arrowEmpty="#(argb,8,8,3)color(1,1,1,1)";
arrowFull="#(argb,8,8,3)color(1,1,1,1)";
border="#(argb,8,8,3)color(1,1,1,1)";
};
class Controls {
};
};
class ATragMX_RscLineBreak {
idc=-1;
type=98;
@ -263,7 +229,31 @@ class ATragMX_Display {
idc=-1;
x=0.55*safezoneW+safezoneX+0.315;
};
class TEXT_GUN_FRAME: ATragMX_RscText {
idc=1001;
style=64;
x=0.550*safezoneW+safezoneX+0.11;
y=0.265*safezoneH+safezoneY+0.25;
w=0.0925;
h=0.205;
text="";
};
class TEXT_ATMOSPHERE_FRAME: TEXT_GUN_FRAME {
idc=1002;
x=0.550*safezoneW+safezoneX+0.205;
};
class TEXT_TARGET_FRAME: TEXT_GUN_FRAME {
idc=1003;
x=0.550*safezoneW+safezoneX+0.3;
};
class TEXT_RESULT_FRAME: TEXT_GUN_FRAME {
idc=1004;
x=0.550*safezoneW+safezoneX+0.11;
y=0.265*safezoneH+safezoneY+0.46;
w=0.2825;
h=0.15;
};
class TEXT_GUN_PROFILE: ATragMX_RscText {
idc=1000;
x=0.550*safezoneW+safezoneX+0.11;
@ -438,13 +428,13 @@ class ATragMX_Display {
text="B";
action=QUOTE(1 call FUNC(change_target_slot));
};
class TEXT_TARGET_C: TEXT_TARGET_B {
class TEXT_TARGET_C: TEXT_TARGET_A {
idc=502;
x=0.550*safezoneW+safezoneX+0.2512;
text="C";
action=QUOTE(2 call FUNC(change_target_slot));
};
class TEXT_TARGET_D: TEXT_TARGET_B {
class TEXT_TARGET_D: TEXT_TARGET_A {
idc=503;
x=0.550*safezoneW+safezoneX+0.2743;
text="D";
@ -511,7 +501,7 @@ class ATragMX_Display {
class TEXT_ELEVATION: TEXT_GUN_PROFILE {
idc=40;
w=0.05;
x=0.550*safezoneW+safezoneX+0.11;
x=0.550*safezoneW+safezoneX+0.115;
y=0.265*safezoneH+safezoneY+0.50;
text="Elev";
};
@ -570,10 +560,10 @@ class ATragMX_Display {
class TEXT_LEAD: TEXT_GUN {
idc=42;
w=0.05;
x=0.550*safezoneW+safezoneX+0.11;
x=0.550*safezoneW+safezoneX+0.115;
y=0.265*safezoneH+safezoneY+0.57;
text="Lead";
action="";
action=QUOTE(GVAR(showWind2) = !GVAR(showWind2); call FUNC(update_result); call FUNC(update_target));
};
class TEXT_LEAD_OUTPUT: TEXT_ELEVATION_OUTPUT_ABSOLUTE {
idc=420;
@ -679,6 +669,7 @@ class ATragMX_Display {
h=0.45;
x=0.550*safezoneW+safezoneX+0.11;
y=0.265*safezoneH+safezoneY+0.24;
sizeEx=0.025;
colorSelectBackground[]={0.15,0.21,0.23,0.3};
colorSelectBackground2[]={0.15,0.21,0.23,0.3};
onMouseButtonDblClick=QUOTE(true call FUNC(toggle_gun_list));
@ -1124,6 +1115,13 @@ class ATragMX_Display {
idc=120060;
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 {
idc=12008;
action=QUOTE(1 call FUNC(toggle_gun_ammo_data));
@ -1213,6 +1211,12 @@ class ATragMX_Display {
class TEXT_ATMO_ENV_DATA_NEXT: TEXT_TARGET_SPEED_ASSIST_NEXT {
idc=13010;
};
class TEXT_ATMO_ENV_DATA_CALC_METHOD: TEXT_GUN_AMMO_DATA_BORE_HEIGHT {
idc=13011;
x=0.550*safezoneW+safezoneX+0.24;
y=0.265*safezoneH+safezoneY+0.29;
text="Calc Method";
};
class TEXT_TARGET_DATA_LATITUDE: TEXT_BORE_HEIGHT {
idc=14000;
@ -1237,15 +1241,31 @@ class ATragMX_Display {
};
class TEXT_TARGET_DATA_WIND_SPEED: TEXT_TARGET_DATA_LATITUDE {
idc=14002;
w=1.2;
y=0.265*safezoneH+safezoneY+0.360;
text="Wind Speed (m/s)";
};
class TEXT_TARGET_DATA_WIND_SPEED_1: TEXT_TARGET_DATA_LATITUDE {
idc=141020;
colorText[]={0,0,0,0.6};
w=0.05;
h=0.03;
sizeEx=0.025;
x=0.550*safezoneW+safezoneX+0.270;
y=0.265*safezoneH+safezoneY+0.357;
text="1";
};
class TEXT_TARGET_DATA_WIND_SPEED_INPUT_1: TEXT_TARGET_DATA_LATITUDE_INPUT {
idc=140020;
w=0.045;
x=0.550*safezoneW+safezoneX+0.300;
x=0.550*safezoneW+safezoneX+0.290;
y=0.265*safezoneH+safezoneY+0.360;
};
class TEXT_TARGET_DATA_WIND_SPEED_2: TEXT_TARGET_DATA_WIND_SPEED_1 {
idc=141021;
x=0.550*safezoneW+safezoneX+0.330;
text="2";
};
class TEXT_TARGET_DATA_WIND_SPEED_INPUT_2: TEXT_TARGET_DATA_LATITUDE_INPUT {
idc=140021;
w=0.045;
@ -1263,20 +1283,38 @@ class ATragMX_Display {
};
class TEXT_TARGET_DATA_INCLINATION_ANGLE: TEXT_TARGET_DATA_LATITUDE {
idc=14004;
w=1.2;
y=0.265*safezoneH+safezoneY+0.440;
text="Inclination Angle";
};
class TEXT_TARGET_DATA_INCLINATION_ANGLE_COSINE: TEXT_TARGET_DATA_LATITUDE {
idc=141041;
colorText[]={0,0,0,0.6};
w=0.05;
h=0.03;
sizeEx=0.025;
x=0.550*safezoneW+safezoneX+0.270;
y=0.265*safezoneH+safezoneY+0.437;
text="c";
};
class TEXT_TARGET_DATA_INCLINATION_ANGLE_INPUT_COSINE: TEXT_TARGET_DATA_LATITUDE_INPUT {
idc=140041;
w=0.045;
x=0.550*safezoneW+safezoneX+0.300;
x=0.550*safezoneW+safezoneX+0.290;
y=0.265*safezoneH+safezoneY+0.440;
onKeyUp=QUOTE(if (_this select 1 == 28) then {0 call FUNC(update_inclination_angle)});
};
class TEXT_TARGET_DATA_INCLINATION_ANGLE_DEGREE: TEXT_TARGET_DATA_INCLINATION_ANGLE_COSINE {
idc=141040;
x=0.550*safezoneW+safezoneX+0.330;
text="d";
};
class TEXT_TARGET_DATA_INCLINATION_ANGLE_INPUT_DEGREE: TEXT_TARGET_DATA_LATITUDE_INPUT {
idc=140040;
w=0.045;
x=0.550*safezoneW+safezoneX+0.350;
y=0.265*safezoneH+safezoneY+0.440;
onKeyUp=QUOTE(if (_this select 1 == 28) then {1 call FUNC(update_inclination_angle)});
};
class TEXT_TARGET_DATA_TARGET_SPEED: TEXT_TARGET_DATA_LATITUDE {
idc=14005;
@ -1296,6 +1334,13 @@ class ATragMX_Display {
idc=140060;
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 {
idc=14008;
action=QUOTE(1 call FUNC(toggle_target_data));

View File

@ -2,43 +2,44 @@
#include "initKeybinds.sqf"
if (count (profileNamespace getVariable ["ACE_ATragMX_gunList", []]) > 0) then {
if ((profileNamespace getVariable ["ACE_ATragMX_profileNamespaceVersion", 0]) == ATRAGMX_PROFILE_NAMESPACE_VERSION && count (profileNamespace getVariable ["ACE_ATragMX_gunList", []]) > 0) then {
GVAR(gunList) = profileNamespace getVariable "ACE_ATragMX_gunList";
} else {
// Profile Name, Muzzle Velocity, Zero Range, Scope Base Angle, AirFriction, Bore Height, Scope Unit, Elevation Scope Step, Windage Scope Step, 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, 0.338, 0.338, 120, 0, 0, 48.28, 12.7, 38.10, 0.630, 1, "ASM" ],
// 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.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, 0.338, 0.338, 120, 0, 0, 48.60, 12.7, 38.10, 1.050, 1, "ASM" ],
["12.7x99mm" , 853, 100, 0.0623, -0.0008600, 3.81, 0, 0.338, 0.338, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 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.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, 0.338, 0.338, 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, 0.338, 0.338, 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, 0.338, 0.338, 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, 0.338, 0.338, 120, 0, 0, 16.20, 8.58, 25.40, 0.322, 7, "ICAO"],
[".338LM 300gr" , 800, 100, 0.0677, -0.0005350, 3.81, 0, 0.338, 0.338, 120, 0, 0, 19.44, 8.58, 25.40, 0.381, 7, "ICAO"],
[".338LM API526" , 880, 100, 0.0601, -0.0006730, 3.81, 0, 0.338, 0.338, 120, 0, 0, 16.39, 8.58, 25.40, 0.290, 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 API526" , 880, 100, 0.0601, -0.0006730, 3.81, 0, 2, 10, 120, 0, 0, 16.39, 8.58, 25.40, 0.290, 7, "ICAO"],
[".300WM Mk248 Mod 0", 900, 100, 0.0584, -0.0008300, 3.81, 0, 0.338, 0.338, 120, 0, 0, 13.31, 7.80, 25.40, 0.268, 7, "ICAO"],
[".300WM Mk248 Mod 1", 867, 100, 0.0611, -0.0008150, 3.81, 0, 0.338, 0.338, 120, 0, 0, 14.26, 7.80, 25.40, 0.310, 7, "ICAO"],
[".300WM Berger OTM" , 853, 100, 0.0622, -0.0007600, 3.81, 0, 0.338, 0.338, 120, 0, 0, 14.90, 7.80, 25.40, 0.368, 7, "ICAO"],
[".300WM Mk248 Mod 0", 900, 100, 0.0584, -0.0008300, 3.81, 0, 2, 10, 120, 0, 0, 13.31, 7.80, 25.40, 0.268, 7, "ICAO"],
[".300WM Mk248 Mod 1", 867, 100, 0.0611, -0.0008150, 3.81, 0, 2, 10, 120, 0, 0, 14.26, 7.80, 25.40, 0.310, 7, "ICAO"],
[".300WM Berger OTM" , 853, 100, 0.0622, -0.0007600, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 7.80, 25.40, 0.368, 7, "ICAO"],
["7.62x54mmR" , 800, 100, 0.0692, -0.0010230, 3.81, 0, 0.338, 0.338, 120, 0, 0, 9.849, 7.92, 24.13, 0.400, 1, "ICAO"],
["7.62x54mmR" , 800, 100, 0.0692, -0.0010230, 3.81, 0, 2, 10, 120, 0, 0, 9.849, 7.92, 24.13, 0.400, 1, "ICAO"],
["7.62x51mm M80" , 810, 100, 0.0679, -0.0010350, 3.81, 0, 0.338, 0.338, 120, 0, 0, 9.525, 7.82, 25.40, 0.200, 7, "ICAO"],
["7.62x51mm M118LR" , 820, 100, 0.0662, -0.0008525, 3.81, 0, 0.338, 0.338, 120, 0, 0, 11.34, 7.82, 25.40, 0.243, 7, "ICAO"],
["7.62x51mm Mk319" , 820, 100, 0.0670, -0.0010300, 3.81, 0, 0.338, 0.338, 120, 0, 0, 8.424, 7.82, 25.40, 0.377, 1, "ICAO"],
["7.62x51mm Subsonic", 320, 100, 0.3060, -0.0004910, 3.81, 0, 0.338, 0.338, 120, 0, 0, 12.96, 7.82, 25.40, 0.235, 7, "ICAO"],
["7.62x51mm M80" , 810, 100, 0.0679, -0.0010350, 3.81, 0, 2, 10, 120, 0, 0, 9.525, 7.82, 25.40, 0.200, 7, "ICAO"],
["7.62x51mm M118LR" , 820, 100, 0.0662, -0.0008525, 3.81, 0, 2, 10, 120, 0, 0, 11.34, 7.82, 25.40, 0.243, 7, "ICAO"],
["7.62x51mm Mk319" , 820, 100, 0.0670, -0.0010300, 3.81, 0, 2, 10, 120, 0, 0, 8.424, 7.82, 25.40, 0.377, 1, "ICAO"],
["7.62x51mm Subsonic", 320, 100, 0.3060, -0.0004910, 3.81, 0, 2, 10, 120, 0, 0, 12.96, 7.82, 25.40, 0.235, 7, "ICAO"],
["6.5x39mm" , 800, 100, 0.0683, -0.0007850, 3.81, 0, 0.338, 0.338, 120, 0, 0, 7.970, 6.71, 22.86, 0.263, 7, "ICAO"],
["6.5x47mm Lapua" , 800, 100, 0.0682, -0.0007710, 3.81, 0, 0.338, 0.338, 120, 0, 0, 9.007, 6.71, 22.86, 0.290, 7, "ICAO"],
["6.5x39mm" , 800, 100, 0.0683, -0.0007850, 3.81, 0, 2, 10, 120, 0, 0, 7.970, 6.71, 22.86, 0.263, 7, "ICAO"],
["6.5x47mm Lapua" , 800, 100, 0.0682, -0.0007710, 3.81, 0, 2, 10, 120, 0, 0, 9.007, 6.71, 22.86, 0.290, 7, "ICAO"],
["5.56x45mm M855" , 870, 100, 0.0626, -0.0012650, 3.81, 0, 0.338, 0.338, 120, 0, 0, 4.018, 5.70, 17.78, 0.151, 7, "ASM" ],
["5.56x45mm Mk262" , 820, 100, 0.0671, -0.0011250, 3.81, 0, 0.338, 0.338, 120, 0, 0, 4.990, 5.70, 17.78, 0.361, 1, "ASM" ],
["5.56x45mm Mk318" , 880, 100, 0.0616, -0.0011200, 3.81, 0, 0.338, 0.338, 120, 0, 0, 4.018, 5.70, 17.78, 0.307, 1, "ASM" ]];
["5.56x45mm M855" , 870, 100, 0.0626, -0.0012650, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.151, 7, "ASM" ],
["5.56x45mm Mk262" , 820, 100, 0.0671, -0.0011250, 3.81, 0, 2, 10, 120, 0, 0, 4.990, 5.70, 17.78, 0.361, 1, "ASM" ],
["5.56x45mm Mk318" , 880, 100, 0.0616, -0.0011200, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.307, 1, "ASM" ]];
[] call FUNC(clear_user_data);
profileNamespace setVariable ["ACE_ATragMX_gunList", GVAR(gunList)];
};

View File

@ -12,6 +12,7 @@ PREP(calculate_target_speed_assist);
PREP(can_show);
PREP(change_gun);
PREP(change_target_slot);
PREP(clear_user_data);
PREP(create_dialog);
PREP(cycle_gun_list);
PREP(cycle_image_size_units);
@ -53,6 +54,7 @@ PREP(update_atmo_env_data);
PREP(update_atmo_selection);
PREP(update_gun);
PREP(update_gun_ammo_data);
PREP(update_inclination_angle);
PREP(update_range_card);
PREP(update_relative_click_memory);
PREP(update_result);

View File

@ -60,18 +60,15 @@ if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false])
};
};
private ["_latitude", "_directionOfFire", "_windSpeed", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange"];
private ["_latitude", "_directionOfFire", "_windSpeed1", "_windSpeed2", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange"];
_latitude = GVAR(latitude) select GVAR(currentTarget);
_directionOfFire = GVAR(directionOfFire) select GVAR(currentTarget);
_windSpeed = (GVAR(windSpeed1) select GVAR(currentTarget));
_windSpeed1 = (GVAR(windSpeed1) select GVAR(currentTarget));
_windSpeed2 = (GVAR(windSpeed2) select GVAR(currentTarget));
_windDirection = (GVAR(windDirection) select GVAR(currentTarget));
_inclinationAngle = (GVAR(inclinationAngle) select GVAR(currentTarget));
_targetSpeed = (GVAR(targetSpeed) select GVAR(currentTarget));
_targetRange = GVAR(rangeCardEndRange);
if (GVAR(currentUnit) != 2) then {
_windSpeed = _windSpeed / 2.23693629;
_targetSpeed = _targetSpeed / 2.23693629;
};
if (GVAR(currentUnit) == 1) then {
_targetRange = _targetRange / 1.0936133;
};
@ -80,4 +77,4 @@ GVAR(rangeCardData) = [];
private ["_result"];
_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000,
_windSpeed, _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);

View File

@ -35,6 +35,6 @@ _barometricPressure = 1013.25;
_relativeHumidity = 0;
private ["_result"];
_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, 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

View File

@ -12,7 +12,7 @@
* 6: barometric pressure <NUMBER>
* 7: relative humidity <NUMBER>
* 8: simulation steps <NUMBER>
* 9: wind speed <NUMBER>
* 9: wind speed <ARRAY>
* 10: wind direction <NUMBER>
* 11: inclination angle <NUMBER>
* 12: target speed <NUMBER>
@ -26,15 +26,15 @@
* 20: Latitude <NUMBER>
*
* Return Value:
* 0: Elevation <NUMBER>
* 1: Windage <NUMBER>
* 2: Lead <NUMBER>
* 3: Time of fligth <NUMBER>
* 4: Remaining velocity <NUMBER>
* 5: Remaining kinetic energy <NUMBER>
* 6: Vertical coriolis drift <NUMBER>
* 7: Horizontal coriolis drift <NUMBER>
* 8: Spin drift <NUMBER>
* 0: Elevation (MOA) <NUMBER>
* 1: Windage (MOA) <ARRAY>
* 2: Lead (MOA) <NUMBER>
* 3: Time of fligth (SECONDS) <NUMBER>
* 4: Remaining velocity (m/s) <NUMBER>
* 5: Remaining kinetic energy (ft·lb) <NUMBER>
* 6: Vertical coriolis drift (MOA) <NUMBER>
* 7: Horizontal coriolis drift (MOA) <NUMBER>
* 8: Spin drift (MOA) <NUMBER>
*
* Example:
* call ace_atragmx_calculate_target_range_assist
@ -43,7 +43,7 @@
*/
#include "script_component.hpp"
private ["_scopeBaseAngle", "_bulletMass", "_boreHeight", "_airFriction", "_muzzleVelocity", "_temperature", "_barometricPressure", "_relativeHumidity", "_simSteps", "_windSpeed", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange", "_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;
_bulletMass = _this select 1;
_boreHeight = _this select 2;
@ -53,7 +53,8 @@ _temperature = _this select 5;
_barometricPressure = _this select 6;
_relativeHumidity = _this select 7;
_simSteps = _this select 8;
_windSpeed = _this select 9;
_windSpeed1 = (_this select 9) select 0;
_windSpeed2 = (_this select 9) select 1;
_windDirection = _this select 10;
_inclinationAngle = _this select 11;
_targetSpeed = _this select 12;
@ -65,6 +66,7 @@ _storeRangeCardData = _this select 17;
_stabilityFactor = _this select 18;
_twistDirection = _this select 19;
_latitude = _this select 20;
_directionOfFire = _this select 21;
private ["_bulletPos", "_bulletVelocity", "_bulletAccel", "_bulletSpeed", "_gravity", "_deltaT"];
_bulletPos = [0, 0, 0];
@ -74,9 +76,10 @@ _bulletSpeed = 0;
_gravity = [0, sin(_scopeBaseAngle + _inclinationAngle) * -9.80665, cos(_scopeBaseAngle + _inclinationAngle) * -9.80665];
_deltaT = 1 / _simSteps;
private ["_elevation", "_windage", "_lead", "_TOF", "_trueVelocity", "_trueSpeed", "_kineticEnergy", "_verticalCoriolis", "_verticalDeflection", "_horizontalCoriolis", "_horizontalDeflection", "_spinDrift", "_spinDeflection"];
private ["_elevation", "_windage1", "_windage2", "_lead", "_TOF", "_trueVelocity", "_trueSpeed", "_kineticEnergy", "_verticalCoriolis", "_verticalDeflection", "_horizontalCoriolis", "_horizontalDeflection", "_spinDrift", "_spinDeflection"];
_elevation = 0;
_windage = 0;
_windage1 = 0;
_windage2 = 0;
_lead = 0;
_TOF = 0;
_trueVelocity = [0, 0, 0];
@ -99,8 +102,10 @@ if (_storeRangeCardData) then {
GVAR(rangeCardData) = [];
};
private ["_wind"];
_wind = [cos(270 - _windDirection * 30) * _windSpeed, sin(270 - _windDirection * 30) * _windSpeed, 0];
private ["_wind1", "_wind2", "_windDrift"];
_wind1 = [cos(270 - _windDirection * 30) * _windSpeed1, sin(270 - _windDirection * 30) * _windSpeed1, 0];
_wind2 = [cos(270 - _windDirection * 30) * _windSpeed2, sin(270 - _windDirection * 30) * _windSpeed2, 0];
_windDrift = 0;
if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,AdvancedAirDragEnabled), false])) then {
_bc = [_bc, _temperature, _barometricPressure, _relativeHumidity, _atmosphereModel] call EFUNC(advanced_ballistics,calculateAtmosphericCorrection);
};
@ -110,6 +115,12 @@ _speedTotal = 0;
_stepsTotal = 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;
_bulletPos set [0, 0];
@ -127,12 +138,11 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do {
_stepsTotal = _stepsTotal + 1;
_speedAverage = (_speedTotal / _stepsTotal);
_trueVelocity = _bulletVelocity vectorDiff _wind;
_trueVelocity = _bulletVelocity vectorDiff _wind1;
_trueSpeed = vectorMagnitude _trueVelocity;
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then {
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,AdvancedAirDragEnabled), false]) then {
private ["_drag"];
_drag = if (missionNamespace getVariable [QEGVAR(advanced_ballistics,extensionAvailable), false]) then {
parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3", _dragModel, _bc, _trueSpeed]))
} else {
@ -156,7 +166,9 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do {
if ((_bulletPos select 1) * _rangeFactor >= _range && _range <= GVAR(rangeCardEndRange)) then {
if ((_bulletPos select 1) > 0) then {
_elevation = - atan((_bulletPos select 2) / (_bulletPos select 1));
_windage = - atan((_bulletPos select 0) / (_bulletPos select 1));
_windage1 = - atan((_bulletPos select 0) / (_bulletPos select 1));
_windDrift = (_wind2 select 0) * (_TOF - (_range / _rangeFactor) / _muzzleVelocity);
_windage2 = - atan(_windDrift / (_bulletPos select 1));
};
if (_range != 0) then {
_lead = (_targetSpeed * _TOF) / (Tan(3.38 / 60) * _range);
@ -164,22 +176,27 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do {
_kineticEnergy = 0.5 * (_bulletMass / 1000 * (_bulletSpeed ^ 2));
_kineticEnergy = _kineticEnergy * 0.737562149;
if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,CoriolisEnabled), false])) then {
if ((_bulletPos select 1) > 0) then {
_horizontalDeflection = 0.0000729 * ((_bulletPos select 0) ^ 2) * sin(_latitude) / _speedAverage;
if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (_bulletPos select 1) > 0) then {
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,CoriolisEnabled), false]) then {
_horizontalDeflection = 0.0000729 * ((_bulletPos select 1) ^ 2) * sin(_latitude) / _speedAverage;
_horizontalCoriolis = - atan(_horizontalDeflection / (_bulletPos select 1));
_windage = _windage + _horizontalCoriolis;
_windage1 = _windage1 + _horizontalCoriolis;
_windage2 = _windage2 + _horizontalCoriolis;
};
};
if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,SpinDriftEnabled), false])) then {
if ((_bulletPos select 1) > 0) then {
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,EoetvoesEnabled), false]) then {
_verticalDeflection = (_bulletPos select 2) * _eoetvoesMultiplier;
_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;
_spinDrift = - atan(_spinDeflection / (_bulletPos select 1));
_windage = _windage + _spinDrift;
_windage1 = _windage1 + _spinDrift;
_windage2 = _windage2 + _spinDrift;
};
};
GVAR(rangeCardData) set [_n, [_range, _elevation * 60, _windage * 60, _lead, _TOF, _bulletSpeed, _kineticEnergy]];
GVAR(rangeCardData) set [_n, [_range, _elevation * 60, [_windage1 * 60, _windage2 * 60], _lead, _TOF, _bulletSpeed, _kineticEnergy]];
_n = _n + 1;
};
};
@ -187,7 +204,9 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do {
if ((_bulletPos select 1) > 0) then {
_elevation = - atan((_bulletPos select 2) / (_bulletPos select 1));
_windage = - atan((_bulletPos select 0) / (_bulletPos select 1));
_windage1 = - atan((_bulletPos select 0) / (_bulletPos select 1));
_windDrift = (_wind2 select 0) * (_TOF - _targetRange / _muzzleVelocity);
_windage2 = - atan(_windDrift / (_bulletPos select 1));
};
if (_targetRange != 0) then {
@ -197,19 +216,24 @@ if (_targetRange != 0) then {
_kineticEnergy = 0.5 * (_bulletMass / 1000 * (_bulletSpeed ^ 2));
_kineticEnergy = _kineticEnergy * 0.737562149;
if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,CoriolisEnabled), false])) then {
if ((_bulletPos select 1) > 0) then {
_horizontalDeflection = 0.0000729 * ((_bulletPos select 0) ^ 2) * sin(_latitude) / _speedAverage;
if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (_bulletPos select 1) > 0) then {
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,CoriolisEnabled), false]) then {
_horizontalDeflection = 0.0000729 * ((_bulletPos select 1) ^ 2) * sin(_latitude) / _speedAverage;
_horizontalCoriolis = - atan(_horizontalDeflection / (_bulletPos select 1));
_windage = _windage + _horizontalCoriolis;
_windage1 = _windage1 + _horizontalCoriolis;
_windage2 = _windage2 + _horizontalCoriolis;
};
};
if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,SpinDriftEnabled), false])) then {
if ((_bulletPos select 1) > 0) then {
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,EoetvoesEnabled), false]) then {
_verticalDeflection = (_bulletPos select 2) * _eoetvoesMultiplier;
_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;
_spinDrift = - atan(_spinDeflection / (_bulletPos select 1));
_windage = _windage + _spinDrift;
_windage1 = _windage1 + _spinDrift;
_windage2 = _windage2 + _spinDrift;
};
};
[_elevation * 60, _windage * 60, _lead, _TOF, _bulletSpeed, _kineticEnergy, _verticalCoriolis, _horizontalCoriolis, _spinDrift]
[_elevation * 60, [_windage1 * 60, _windage2 * 60], _lead, _TOF, _bulletSpeed, _kineticEnergy, _verticalCoriolis * 60, _horizontalCoriolis * 60, _spinDrift * 60]

View File

@ -60,28 +60,23 @@ if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false])
};
};
private ["_latitude", "_directionOfFire", "_windSpeed", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange"];
private ["_latitude", "_directionOfFire", "_windSpeed1", "_windSpeed2", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange"];
_latitude = GVAR(latitude) select GVAR(currentTarget);
_directionOfFire = GVAR(directionOfFire) select GVAR(currentTarget);
_windSpeed = GVAR(windSpeed1) select GVAR(currentTarget);
_windSpeed1 = GVAR(windSpeed1) select GVAR(currentTarget);
_windSpeed2 = GVAR(windSpeed2) select GVAR(currentTarget);
_windDirection = GVAR(windDirection) select GVAR(currentTarget);
_inclinationAngle = GVAR(inclinationAngle) select GVAR(currentTarget);
_targetSpeed = GVAR(targetSpeed) select GVAR(currentTarget);
_targetRange = GVAR(targetRange) select GVAR(currentTarget);
if (GVAR(currentUnit) != 2) then {
_windSpeed = _windSpeed / 2.23693629;
_targetSpeed = _targetSpeed / 2.23693629;
};
if (GVAR(currentUnit) == 1) then {
_targetRange = _targetRange / 1.0936133;
};
private ["_result"];
_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000,
_windSpeed, _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(windageOutput) set [GVAR(currentTarget), _result select 1];
GVAR(windage1Output) set [GVAR(currentTarget), (_result select 1) select 0];
GVAR(windage2Output) set [GVAR(currentTarget), (_result select 1) select 1];
GVAR(leadOutput) set [GVAR(currentTarget), _result select 2];
GVAR(tofOutput) set [GVAR(currentTarget), _result select 3];
GVAR(velocityOutput) set [GVAR(currentTarget), _result select 4];

View File

@ -4,7 +4,8 @@
*
* Arguments:
* gunID <number>
* update solution <BOOL>
* restore workingMemory from gunList <BOOL>
* update display <BOOL>
*
* Return Value:
* Nothing
@ -16,30 +17,38 @@
*/
#include "script_component.hpp"
private ["_gunID", "_updateSolution"];
_gunID = _this select 0;
_updateSolution = _this select 1;
private ["_gunID", "_restoreMemory", "_updateDisplay"];
_gunID = _this select 0;
_restoreMemory = _this select 1;
_updateDisplay = _this select 2;
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;
lbSetCurSel [6000, GVAR(currentGun)];
if ((GVAR(scopeUnits) select GVAR(currentScopeUnit)) != "Clicks") then {
GVAR(currentScopeUnit) = GVAR(workingMemory) select 6;
if (_updateDisplay) then {
lbSetCurSel [6000, GVAR(currentGun)];
};
[] call FUNC(update_gun);
[] call FUNC(update_gun_ammo_data);
GVAR(currentScopeUnit) = 0 max (GVAR(workingMemory) select 6) min 3;
GVAR(currentScopeClickUnit) = 0 max (GVAR(workingMemory) select 7) min 2;
GVAR(currentScopeClickNumber) = 1 max (GVAR(workingMemory) select 8) min 10;
if (_updateDisplay) then {
[] call FUNC(update_gun);
[] call FUNC(update_gun_ammo_data);
};
GVAR(elevationOutput) set [GVAR(currentTarget), 0];
GVAR(windageOutput) set [GVAR(currentTarget), 0];
GVAR(windage1Output) set [GVAR(currentTarget), 0];
GVAR(windage2Output) set [GVAR(currentTarget), 0];
GVAR(leadOutput) set [GVAR(currentTarget), 0];
GVAR(tofOutput) set [GVAR(currentTarget), 0];
GVAR(velocityOutput) set [GVAR(currentTarget), 0];
if (_updateSolution) then {
if (_updateDisplay) then {
[] call FUNC(calculate_target_solution);
};

View File

@ -0,0 +1,44 @@
/*
* Author: Ruthberg
* Removes all user data from the profileNamespace
*
* Arguments:
* Nothing
*
* Return Value:
* Nothing
*
* Example:
* call ace_atragmx_fnc_clear_user_data
*
* Public: No
*/
#include "script_component.hpp"
profileNamespace setVariable ["ACE_ATragMX_gunList", nil];
profileNamespace setVariable ["ACE_ATragMX_currentUnit", nil];
profileNamespace setVariable ["ACE_ATragMX_currentGun", nil];
profileNamespace setVariable ["ACE_ATragMX_currentTarget", nil];
profileNamespace setVariable ["ACE_ATragMX_currentScopeUnit", nil];
profileNamespace setVariable ["ACE_ATragMX_atmosphereModeTBH", nil];
profileNamespace setVariable ["ACE_ATragMX_altitude", nil];
profileNamespace setVariable ["ACE_ATragMX_temperature", nil];
profileNamespace setVariable ["ACE_ATragMX_barometricPressure", nil];
profileNamespace setVariable ["ACE_ATragMX_relativeHumidity", nil];
profileNamespace setVariable ["ACE_ATragMX_showWind2", nil];
profileNamespace setVariable ["ACE_ATragMX_latitude", nil];
profileNamespace setVariable ["ACE_ATragMX_directionOfFire", nil];
profileNamespace setVariable ["ACE_ATragMX_windSpeed1", nil];
profileNamespace setVariable ["ACE_ATragMX_windSpeed2", nil];
profileNamespace setVariable ["ACE_ATragMX_windDirection", nil];
profileNamespace setVariable ["ACE_ATragMX_inclinationAngle", nil];
profileNamespace setVariable ["ACE_ATragMX_targetSpeed", nil];
profileNamespace setVariable ["ACE_ATragMX_targetRange", nil];
profileNamespace setVariable ["ACE_ATragMX_rangeCardStartRange", nil];
profileNamespace setVariable ["ACE_ATragMX_rangeCardEndRange", nil];
profileNamespace setVariable ["ACE_ATragMX_rangeCardIncrement", nil];
profileNamespace setVariable ["ACE_ATragMX_rangeCardCurrentColumn", nil];

View File

@ -40,6 +40,8 @@ GVAR(showTargetRangeAssist) call FUNC(show_target_range_assist);
GVAR(showTargetSpeedAssist) call FUNC(show_target_speed_assist);
GVAR(showTargetSpeedAssistTimer) call FUNC(show_target_speed_assist_timer);
[GVAR(currentGun), false, true] call FUNC(change_gun);
{
lbAdd [6000, _x select 0];
} forEach GVAR(gunList);

View File

@ -15,4 +15,6 @@
*/
#include "script_component.hpp"
[(GVAR(currentGun) + (count GVAR(gunList)) + _this) % (count GVAR(gunList)), true] call FUNC(change_gun);
if (!(GVAR(showMainPage) || GVAR(showGunList))) exitWith {};
[(GVAR(currentGun) + (count GVAR(gunList)) + _this) % (count GVAR(gunList)), true, true] call FUNC(change_gun);

View File

@ -18,6 +18,7 @@
GVAR(workingMemory) = +(GVAR(gunList) select 0);
GVAR(scopeUnits) = ["MILs", "TMOA", "SMOA", "Clicks"];
GVAR(scopeClickUnits) = ["TMOA", "SMOA", "MILs"];
GVAR(rangeCardStartRange) = 200;
GVAR(rangeCardEndRange) = 2000;
@ -40,6 +41,8 @@ GVAR(currentUnit) = 2;
GVAR(currentGun) = 0;
GVAR(currentTarget) = 0;
GVAR(currentScopeUnit) = 0;
GVAR(currentScopeClickUnit) = 2;
GVAR(currentScopeClickNumber) = 10;
GVAR(atmosphereModeTBH) = true;
GVAR(altitude) = 0;
@ -56,8 +59,10 @@ GVAR(inclinationAngle) = [0, 0, 0, 0];
GVAR(targetSpeed) = [0, 0, 0, 0];
GVAR(targetRange) = [0, 0, 0, 0];
GVAR(showWind2) = false;
GVAR(elevationOutput) = [0, 0, 0, 0];
GVAR(windageOutput) = [0, 0, 0, 0];
GVAR(windage1Output) = [0, 0, 0, 0];
GVAR(windage2Output) = [0, 0, 0, 0];
GVAR(leadOutput) = [0, 0, 0, 0];
GVAR(tofOutput) = [0, 0, 0, 0];
GVAR(velocityOutput) = [0, 0, 0, 0];

View File

@ -17,22 +17,39 @@
GVAR(altitude) = -1000 max parseNumber(ctrlText 130030) min 20000;
GVAR(temperature) = -50 max parseNumber(ctrlText 130040) min 160;
GVAR(barometricPressure) = 0 max parseNumber(ctrlText 130050) min 1350;
GVAR(barometricPressure) = 10 max parseNumber(ctrlText 130050) min 1350;
GVAR(relativeHumidity) = (0 max parseNumber(ctrlText 130060) min 100) / 100;
if (GVAR(currentUnit) == 1) then {
if (GVAR(currentUnit) != 2) then {
GVAR(altitude) = GVAR(altitude) * 0.3048;
GVAR(temperature) = (GVAR(temperature) - 32) / 1.8;
GVAR(barometricPressure) = GVAR(barometricPressure) * 33.86389;
};
private ["_inclinationAngleCosine", "_inclinationAngleDegree"];
GVAR(latitude) set [GVAR(currentTarget), -90 max Round(parseNumber(ctrlText 140000)) min 90];
GVAR(directionOfFire) set [GVAR(currentTarget), 0 max abs(Round(parseNumber(ctrlText 140010))) min 359];
GVAR(windSpeed1) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140020)) min 50];
GVAR(windSpeed2) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140021)) min 50];
GVAR(windDirection) set [GVAR(currentTarget), 1 max Round(parseNumber(ctrlText 140030)) min 12];
GVAR(inclinationAngle) set [GVAR(currentTarget), -60 max parseNumber(ctrlText 140040) min 60];
GVAR(targetSpeed) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140050)) min 50];
_inclinationAngleCosine = 0.5 max parseNumber(ctrlText 140041) min 1;
_inclinationAngleDegree = -60 max round(parseNumber(ctrlText 140040)) min 60;
if (_inclinationAngleDegree != GVAR(inclinationAngle) select GVAR(currentTarget)) then {
GVAR(inclinationAngle) set [GVAR(currentTarget), _inclinationAngleDegree];
} else {
if (_inclinationAngleCosine != Round(cos(GVAR(inclinationAngle) select GVAR(currentTarget)) * 100) / 100) then {
GVAR(inclinationAngle) set [GVAR(currentTarget), round(acos(_inclinationAngleCosine))];
};
};
GVAR(targetSpeed) set [GVAR(currentTarget), -50 max abs(parseNumber(ctrlText 140050)) min 50];
GVAR(targetRange) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140060)) min 4000];
if (GVAR(currentUnit) != 2) then {
GVAR(windSpeed1) set [GVAR(currentTarget), (GVAR(windSpeed1) select GVAR(currentTarget)) * 0.44704];
GVAR(windSpeed2) set [GVAR(currentTarget), (GVAR(windSpeed2) select GVAR(currentTarget)) * 0.44704];
GVAR(targetSpeed) set [GVAR(currentTarget), (GVAR(targetSpeed) select GVAR(currentTarget)) * 0.44704];
};
if (GVAR(currentUnit) == 1) then {
GVAR(targetRange) set [GVAR(currentTarget), (GVAR(targetRange) select GVAR(currentTarget)) * 0.9144];
};
private ["_boreHeight", "_bulletMass", "_bulletDiameter", "_airFriction", "_rifleTwist", "_muzzleVelocity", "_zeroRange"];
_boreHeight = parseNumber(ctrlText 120000);
@ -103,5 +120,6 @@ GVAR(workingMemory) set [11, _windageCur];
[] call FUNC(update_atmosphere);
[] call FUNC(update_atmo_env_data);
[] call FUNC(update_target);
[] call FUNC(update_target_data);
[] call FUNC(store_user_data);

View File

@ -16,7 +16,7 @@
#include "script_component.hpp"
GVAR(currentUnit) = 0 max (profileNamespace getVariable ["ACE_ATragMX_currentUnit", 2]) min 2;
[profileNamespace getVariable ["ACE_ATragMX_currentGun", 0], false] call FUNC(change_gun);
[(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(currentScopeUnit) = 0 max (profileNamespace getVariable ["ACE_ATragMX_currentScopeUnit", 0]) min 3;
@ -26,6 +26,7 @@ GVAR(temperature) = -50 max (profileNamespace getVariable ["ACE_ATragMX_temperat
GVAR(barometricPressure) = 340 max (profileNamespace getVariable ["ACE_ATragMX_barometricPressure", 1013.25]) min 1350;
GVAR(relativeHumidity) = 0 max (profileNamespace getVariable ["ACE_ATragMX_relativeHumidity", 0.5]) min 1;
GVAR(showWind2) = profileNamespace getVariable ["ACE_ATragMX_showWind2", false];
GVAR(latitude) = profileNamespace getVariable ["ACE_ATragMX_latitude", [38, 38, 38, 38]];
GVAR(directionOfFire) = profileNamespace getVariable ["ACE_ATragMX_directionOfFire", [0, 0, 0, 0]];
GVAR(windSpeed1) = profileNamespace getVariable ["ACE_ATragMX_windSpeed1", [0, 0, 0, 0]];
@ -34,3 +35,8 @@ GVAR(windDirection) = profileNamespace getVariable ["ACE_ATragMX_windDirection",
GVAR(inclinationAngle) = profileNamespace getVariable ["ACE_ATragMX_inclinationAngle", [0, 0, 0, 0]];
GVAR(targetSpeed) = profileNamespace getVariable ["ACE_ATragMX_targetSpeed", [0, 0, 0, 0]];
GVAR(targetRange) = profileNamespace getVariable ["ACE_ATragMX_targetRange", [0, 0, 0, 0]];
GVAR(rangeCardStartRange) = 0 max (profileNamespace getVariable ["ACE_ATragMX_rangeCardStartRange", 200]) min 3000;
GVAR(rangeCardEndRange) = 0 max (profileNamespace getVariable ["ACE_ATragMX_rangeCardEndRange", 2000]) min 3000;
GVAR(rangeCardIncrement) = 1 max (profileNamespace getVariable ["ACE_ATragMX_rangeCardIncrement", 50]) min 3000;
GVAR(rangeCardCurrentColumn) = 0 max (profileNamespace getVariable ["ACE_ATragMX_rangeCardCurrentColumn", 3]) min 3;

View File

@ -17,7 +17,7 @@
GVAR(showAtmoEnvData) = _this;
{ctrlShow [_x, _this]} forEach [13000, 13001, 13002, 13003, 130030, 13004, 130040, 13005, 130050, 13006, 130060, 13007, 13008, 13009, 13010];
{ctrlShow [_x, _this]} forEach [13000, 13001, 13002, 13003, 130030, 13004, 130040, 13005, 130050, 13006, 130060, 13007, 13008, 13009, 13010, 13011];
if (_this) then {
[] call FUNC(update_atmo_selection);

View File

@ -17,7 +17,7 @@
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 {
[] call FUNC(update_gun_ammo_data);

View File

@ -18,7 +18,7 @@
GVAR(showMainPage) = _this;
{ctrlShow [_x, _this]} forEach [10, 100, 11, 110, 12, 120, 13, 130, 14, 140, 20, 200, 21, 210, 22, 220, 23, 230, 30, 300, 31, 310, 32, 320, 33, 330, 34, 340, 40, 400, 401, 402, 403, 41, 410, 411, 412, 42, 420,
500, 501, 502, 503, 600, 601, 602, 603, 1000, 2000, 3000, 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008];
500, 501, 502, 503, 600, 601, 602, 603, 1000, 1001, 1002, 1003, 1004, 2000, 3000, 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008];
if (_this) then {
if (GVAR(atmosphereModeTBH)) then {

View File

@ -17,7 +17,7 @@
GVAR(showTargetData) = _this;
{ctrlShow [_x, _this]} forEach [14000, 140000, 14001, 140010, 14002, 140020, 140021, 14003, 140030, 14004, 140040, 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 {
[] call FUNC(update_target_data);

View File

@ -22,6 +22,6 @@ _slopeDistance = _this select 0;
_azimuth = _this select 1;
_inclination = _this select 2;
//_inclination = asin((ACE_player weaponDirection currentWeapon ACE_player) select 2);
GVAR(inclinationAngle) set [GVAR(currentTarget), _inclination];
GVAR(targetRange) set [GVAR(currentTarget), _slopeDistance];
GVAR(inclinationAngle) set [GVAR(currentTarget), round(_inclination)];
GVAR(directionOfFire) set [GVAR(currentTarget), round(_azimuth)];
GVAR(targetRange) set [GVAR(currentTarget), round(_slopeDistance)];

View File

@ -15,6 +15,8 @@
*/
#include "script_component.hpp"
profileNamespace setVariable ["ACE_ATragMX_profileNamespaceVersion", ATRAGMX_PROFILE_NAMESPACE_VERSION];
profileNamespace setVariable ["ACE_ATragMX_currentUnit", GVAR(currentUnit)];
profileNamespace setVariable ["ACE_ATragMX_currentGun", GVAR(currentGun)];
profileNamespace setVariable ["ACE_ATragMX_currentTarget", GVAR(currentTarget)];
@ -26,11 +28,17 @@ profileNamespace setVariable ["ACE_ATragMX_temperature", GVAR(temperature)];
profileNamespace setVariable ["ACE_ATragMX_barometricPressure", GVAR(barometricPressure)];
profileNamespace setVariable ["ACE_ATragMX_relativeHumidity", GVAR(relativeHumidity)];
profileNamespace setVariable ["latitude", GVAR(latitude)];
profileNamespace setVariable ["directionOfFire", GVAR(directionOfFire)];
profileNamespace setVariable ["ACE_ATragMX_showWind2", GVAR(showWind2)];
profileNamespace setVariable ["ACE_ATragMX_latitude", GVAR(latitude)];
profileNamespace setVariable ["ACE_ATragMX_directionOfFire", GVAR(directionOfFire)];
profileNamespace setVariable ["ACE_ATragMX_windSpeed1", GVAR(windSpeed1)];
profileNamespace setVariable ["ACE_ATragMX_windSpeed2", GVAR(windSpeed2)];
profileNamespace setVariable ["ACE_ATragMX_windDirection", GVAR(windDirection)];
profileNamespace setVariable ["ACE_ATragMX_inclinationAngle", GVAR(inclinationAngle)];
profileNamespace setVariable ["ACE_ATragMX_targetSpeed", GVAR(targetSpeed)];
profileNamespace setVariable ["ACE_ATragMX_targetRange", GVAR(targetRange)];
profileNamespace setVariable ["ACE_ATragMX_rangeCardStartRange", GVAR(rangeCardStartRange)];
profileNamespace setVariable ["ACE_ATragMX_rangeCardEndRange", GVAR(rangeCardEndRange)];
profileNamespace setVariable ["ACE_ATragMX_rangeCardIncrement", GVAR(rangeCardIncrement)];
profileNamespace setVariable ["ACE_ATragMX_rangeCardCurrentColumn", GVAR(rangeCardCurrentColumn)];

View File

@ -20,7 +20,7 @@ if (ctrlVisible 6000) then {
true call FUNC(show_main_page);
if (_this) then {
[lbCurSel 6000, true] call FUNC(change_gun);
[lbCurSel 6000, true, true] call FUNC(change_gun);
};
} else {
false call FUNC(show_main_page);

View File

@ -21,9 +21,13 @@ if (ctrlVisible 8000) then {
if (_this == 1) then {
[] call FUNC(calculate_target_speed_assist);
ctrlSetText [330, Str(parseNumber(ctrlText 8007))];
ctrlSetText [140050, Str(parseNumber(ctrlText 8007))];
[] call FUNC(calculate_target_solution);
private ["_targetSpeed"];
_targetSpeed = parseNumber(ctrlText 8007);
if (_targetSpeed != 0) then {
ctrlSetText [330, Str(_targetSpeed)];
ctrlSetText [140050, Str(_targetSpeed)];
[] call FUNC(calculate_target_solution);
};
};
} else {
false call FUNC(show_main_page);

View File

@ -17,18 +17,18 @@
ctrlSetFocus ((uiNamespace getVariable "ATragMX_Display") displayCtrl 13007);
if (GVAR(currentUnit) != 1) then {
if (GVAR(currentUnit) == 2) then {
ctrlSetText [130040, Str(Round(GVAR(temperature) * 10) / 10)];
} else {
ctrlSetText [130040, Str(Round((GVAR(temperature) * 1.8 + 32) * 10) / 10)];
};
if (GVAR(currentUnit) != 1) then {
if (GVAR(currentUnit) == 2) then {
ctrlSetText [130050, Str(Round(GVAR(barometricPressure)))];
} else {
ctrlSetText [130050, Str(Round(GVAR(barometricPressure) / 33.8638866667 * 100) / 100)];
};
ctrlSetText [130060, Str(Round(GVAR(relativeHumidity) * 100 * 10) / 10)];
if (GVAR(currentUnit) != 1) then {
if (GVAR(currentUnit) == 2) then {
ctrlSetText [130030, Str(Round(GVAR(altitude)))];
} else {
ctrlSetText [130030, Str(Round(GVAR(altitude) * 3.2808399))];

View File

@ -15,18 +15,18 @@
*/
#include "script_component.hpp"
if (GVAR(currentUnit) != 1) then {
if (GVAR(currentUnit) == 2) then {
ctrlSetText [200, Str(Round(GVAR(temperature) * 10) / 10)];
} else {
ctrlSetText [200, Str(Round((GVAR(temperature) * 1.8 + 32) * 10) / 10)];
};
if (GVAR(currentUnit) != 1) then {
if (GVAR(currentUnit) == 2) then {
ctrlSetText [210, Str(Round(GVAR(barometricPressure)))];
} else {
ctrlSetText [210, Str(Round(GVAR(barometricPressure) / 33.8638866667 * 100) / 100)];
};
ctrlSetText [220, Str(Round(GVAR(relativeHumidity) * 100 * 10) / 10)];
if (GVAR(currentUnit) != 1) then {
if (GVAR(currentUnit) == 2) then {
ctrlSetText [230, Str(Round(GVAR(altitude)))];
} else {
ctrlSetText [230, Str(Round(GVAR(altitude) * 3.2808399))];

View File

@ -36,10 +36,15 @@ if (GVAR(currentUnit) != 2) then {
} else {
ctrlSetText [130, Str(Round(GVAR(workingMemory) select 1))];
};
if (GVAR(currentUnit) != 1) then {
ctrlSetText [140, Str(Round(GVAR(workingMemory) select 2))];
} else {
ctrlSetText [140, Str(Round((GVAR(workingMemory) select 2) * 1.0936133))];
switch (GVAR(currentUnit)) do {
case 0: {
ctrlSetText [140, format["*%1", Round(GVAR(workingMemory) select 2)]];
};
case 1: {
ctrlSetText [140, Str(Round((GVAR(workingMemory) select 2) * 1.0936133))];
};
case 2: {
ctrlSetText [140, Str(Round(GVAR(workingMemory) select 2))];
};
};
[] call FUNC(update_scope_unit);

View File

@ -47,10 +47,15 @@ if (GVAR(currentUnit) != 2) then {
} else {
ctrlSetText [120050, Str(Round(GVAR(workingMemory) select 1))];
};
if (GVAR(currentUnit) == 2) then {
ctrlSetText [120060, Str(Round(GVAR(workingMemory) select 2))];
} else {
if (GVAR(currentUnit) == 1) then {
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 {

View File

@ -0,0 +1,26 @@
/*
* Author: Ruthberg
* Updates the inclination angle input fields
*
* Arguments:
* Reference input field ID <NUMBER>
*
* Return Value:
* Nothing
*
* Example:
* 0 call ace_atragmx_fnc_update_inclination_angle
*
* Public: No
*/
#include "script_component.hpp"
private ["_inclinationAngleCosine", "_inclinationAngleDegree"];
_inclinationAngleCosine = 0.5 max parseNumber(ctrlText 140041) min 1;
_inclinationAngleDegree = -60 max parseNumber(ctrlText 140040) min 60;
if (_this == 0) then {
ctrlSetText [140040, Str(round(acos(_inclinationAngleCosine)))];
} else {
ctrlSetText [140041, Str(round(cos(_inclinationAngleDegree) * 100) / 100)];
};

View File

@ -15,10 +15,14 @@
*/
#include "script_component.hpp"
private ["_range", "_elevation", "_windage", "_elevationScopeStep", "_windageScopeStep", "_lead", "_TOF", "_velocity", "_kineticEnergy", "_rangeOutput", "_elevationOutput", "_windageOutput", "_lastColumnOutput"];
private ["_range", "_elevation", "_windage1", "_windage2", "_elevationScopeStep", "_windageScopeStep", "_lead", "_TOF", "_velocity", "_kineticEnergy", "_rangeOutput", "_elevationOutput", "_windageOutput", "_lastColumnOutput"];
_lastColumnOutput = "";
ctrlSetText [5006, (GVAR(rangeCardLastColumns) select GVAR(rangeCardCurrentColumn))];
if (GVAR(showWind2) && GVAR(rangeCardCurrentColumn) == 0) then {
ctrlSetText [5006, "Wind2"];
} else {
ctrlSetText [5006, (GVAR(rangeCardLastColumns) select GVAR(rangeCardCurrentColumn))];
};
if (GVAR(currentUnit) == 1) then {
ctrlSetText [5003, "Yards"];
@ -31,7 +35,8 @@ lnbClear 5007;
{
_range = _x select 0;
_elevation = _x select 1;
_windage = _x select 2;
_windage1 = (_x select 2) select 0;
_windage2 = (_x select 2) select 1;
_lead = _x select 3;
_TOF = _x select 4;
_velocity = _x select 5;
@ -40,23 +45,26 @@ lnbClear 5007;
switch (GVAR(currentScopeUnit)) do {
case 0: {
_elevation = _elevation / 3.38;
_windage = _windage / 3.38;
};
_windage1 = _windage1 / 3.38;
_windage2 = _windage2 / 3.38;
};
case 2: {
_elevation = _elevation * 1.047;
_windage = _windage * 1.047;
_windage1 = _windage1 * 1.047;
_windage2 = _windage2 * 1.047;
};
case 3: {
_elevationScopeStep = (GVAR(workingMemory) select 7);
_windageScopeStep = (GVAR(workingMemory) select 8);
_elevation = Round(_elevation / _elevationScopeStep);
_windage = Round(_windage / _windageScopeStep);
_windage1 = Round(_windage1 / _windageScopeStep);
_windage2 = Round(_windage2 / _windageScopeStep);
};
};
_elevationOutput = Str(Round(_elevation * 100) / 100);
_windageOutput = Str(Round(_windage * 100) / 100);
_windageOutput = Str(Round(_windage1 * 100) / 100);
_rangeOutput = Str(_range);
if (_velocity < 340.29) then {
@ -69,7 +77,11 @@ lnbClear 5007;
switch (GVAR(rangeCardCurrentColumn)) do {
case 0: {
_lastColumnOutput = Str(Round(_lead * 100) / 100);
if (GVAR(showWind2)) then {
_lastColumnOutput = Str(Round(_windage2 * 100) / 100);
} else {
_lastColumnOutput = Str(Round(_lead * 100) / 100);
};
};
case 1: {
_lastColumnOutput = Str(Round(_velocity));

View File

@ -16,6 +16,6 @@
#include "script_component.hpp"
GVAR(workingMemory) set [10, (GVAR(elevationOutput) select GVAR(currentTarget))];
GVAR(workingMemory) set [11, (GVAR(windageOutput) select GVAR(currentTarget))];
GVAR(workingMemory) set [11, (GVAR(windage1Output) select GVAR(currentTarget))];
[] call FUNC(update_result);

View File

@ -15,9 +15,11 @@
*/
#include "script_component.hpp"
private ["_elevationAbs", "_elevationRel", "_elevationCur", "_windageAbs", "_windageRel", "_windageCur", "_lead", "_elevationScopeStep", "_windageScopeStep"];
_elevationAbs = (GVAR(elevationOutput) select GVAR(currentTarget));
_windageAbs = (GVAR(windageOutput) select GVAR(currentTarget));
private ["_elevationAbs", "_elevationRel", "_elevationCur", "_windageAbs", "_wind2", "_windageRel", "_windageCur", "_lead", "_elevationScopeStep", "_windageScopeStep"];
_elevationAbs = GVAR(elevationOutput) select GVAR(currentTarget);
_windageAbs = GVAR(windage1Output) select GVAR(currentTarget);
_wind2 = GVAR(windage2Output) select GVAR(currentTarget);
_elevationCur = GVAR(workingMemory) select 10;
_windageCur = GVAR(workingMemory) select 11;
@ -25,13 +27,15 @@ _windageCur = GVAR(workingMemory) select 11;
_elevationRel = _elevationAbs - _elevationCur;
_windageRel = _windageAbs - _windageCur;
_lead = (GVAR(leadOutput) select GVAR(currentTarget));
_lead = GVAR(leadOutput) select GVAR(currentTarget);
switch (GVAR(currentScopeUnit)) do {
case 0: {
_elevationAbs = _elevationAbs / 3.38;
_windageAbs = _windageAbs / 3.38;
_wind2 = _wind2 / 3.38;
_elevationRel = _elevationRel / 3.38;
_windageRel = _windageRel / 3.38;
@ -42,6 +46,8 @@ switch (GVAR(currentScopeUnit)) do {
_elevationAbs = _elevationAbs * 1.047;
_windageAbs = _windageAbs * 1.047;
_wind2 = _wind2 / 1.047;
_elevationRel = _elevationRel * 1.047;
_windageRel = _windageRel * 1.047;
@ -55,6 +61,8 @@ switch (GVAR(currentScopeUnit)) do {
_elevationAbs = Round(_elevationAbs / _elevationScopeStep);
_windageAbs = Round(_windageAbs / _windageScopeStep);
_wind2 = Round(_wind2 / _windageScopeStep);
_elevationRel = Round(_elevationRel / _elevationScopeStep);
_windageRel = Round(_windageRel / _windageScopeStep);
@ -63,6 +71,12 @@ switch (GVAR(currentScopeUnit)) do {
};
};
if (GVAR(showWind2)) then {
ctrlSetText [42, "Wind2"];
} else {
ctrlSetText [42, "Lead"];
};
ctrlSetText [400, Str(Round(_elevationAbs * 100) / 100)];
ctrlSetText [401, Str(Round(_elevationRel * 100) / 100)];
ctrlSetText [402, Str(Round(_elevationCur * 100) / 100)];
@ -71,4 +85,8 @@ ctrlSetText [410, Str(Round(_windageAbs * 100) / 100)];
ctrlSetText [411, Str(Round(_windageRel * 100) / 100)];
ctrlSetText [412, Str(Round(_windageCur * 100) / 100)];
ctrlSetText [420, Str(Round(_lead * 100) / 100)];
if (GVAR(showWind2)) then {
ctrlSetText [420, Str(Round(_wind2 * 100) / 100)];
} else {
ctrlSetText [420, Str(Round(_lead * 100) / 100)];
};

View File

@ -15,5 +15,10 @@
*/
#include "script_component.hpp"
ctrlSetText [2000, GVAR(scopeUnits) select GVAR(currentScopeUnit)];
ctrlSetText [5000, GVAR(scopeUnits) select GVAR(currentScopeUnit)];
if (GVAR(currentScopeUnit) == 3) then {
ctrlSetText [2000, format["Clicks=%1", GVAR(currentScopeClickNumber)]];
ctrlSetText [5000, format["Clicks=%1", GVAR(currentScopeClickNumber)]];
} else {
ctrlSetText [2000, GVAR(scopeUnits) select GVAR(currentScopeUnit)];
ctrlSetText [5000, GVAR(scopeUnits) select GVAR(currentScopeUnit)];
};

View File

@ -15,8 +15,34 @@
*/
#include "script_component.hpp"
ctrlSetText [300, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 100) / 100)];
if (GVAR(showWind2)) then {
if (GVAR(currentUnit) != 2) then {
ctrlSetText [300, format["%1/%2", Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 2.23693629), Round((GVAR(windSpeed2) select GVAR(currentTarget)) * 2.23693629)]];
} else {
ctrlSetText [300, format["%1/%2", Round(GVAR(windSpeed1) select GVAR(currentTarget)), Round(GVAR(windSpeed2) select GVAR(currentTarget))]];
};
} else {
if (GVAR(currentUnit) != 2) then {
ctrlSetText [300, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 2.23693629 * 100) / 100)];
} else {
ctrlSetText [300, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 100) / 100)];
};
};
ctrlSetText [310, Str(Round((GVAR(windDirection) select GVAR(currentTarget))))];
ctrlSetText [320, Str(Round((GVAR(inclinationAngle) select GVAR(currentTarget))))];
ctrlSetText [330, Str(Round((GVAR(targetSpeed) select GVAR(currentTarget)) * 100) / 100)];
ctrlSetText [340, Str(Round((GVAR(targetRange) select GVAR(currentTarget))))];
if (GVAR(currentUnit) != 2) then {
ctrlSetText [330, Str(Round((GVAR(targetSpeed) select GVAR(currentTarget)) * 2.23693629 * 100) / 100)];
} else {
ctrlSetText [330, Str(Round((GVAR(targetSpeed) select GVAR(currentTarget)) * 100) / 100)];
};
switch (GVAR(currentUnit)) do {
case 0: {
ctrlSetText [340, format["*%1", Round((GVAR(targetRange) select GVAR(currentTarget)))]];
};
case 1: {
ctrlSetText [340, Str(Round((GVAR(targetRange) select GVAR(currentTarget)) * 1.0936133))];
};
case 2: {
ctrlSetText [340, Str(Round((GVAR(targetRange) select GVAR(currentTarget))))];
};
};

View File

@ -17,13 +17,31 @@
ctrlSetText [140000, Str(Round((GVAR(latitude) select GVAR(currentTarget)) * 100) / 100)];
ctrlSetText [140010, Str(Round((GVAR(directionOfFire) select GVAR(currentTarget)) * 100) / 100)];
ctrlSetText [140020, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 100) / 100)];
ctrlSetText [140021, Str(Round((GVAR(windSpeed2) select GVAR(currentTarget)) * 100) / 100)];
if (GVAR(currentUnit) != 2) then {
ctrlSetText [140020, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 2.23693629 * 100) / 100)];
ctrlSetText [140021, Str(Round((GVAR(windSpeed2) select GVAR(currentTarget)) * 2.23693629 * 100) / 100)];
} else {
ctrlSetText [140020, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 100) / 100)];
ctrlSetText [140021, Str(Round((GVAR(windSpeed2) select GVAR(currentTarget)) * 100) / 100)];
};
ctrlSetText [140030, Str(Round((GVAR(windDirection) select GVAR(currentTarget))))];
ctrlSetText [140040, Str(Round((GVAR(inclinationAngle) select GVAR(currentTarget))))];
ctrlSetText [140041, Str(floor(cos(GVAR(inclinationAngle) select GVAR(currentTarget)) * 100) / 100)];
ctrlSetText [140050, Str(Round((GVAR(targetSpeed) select GVAR(currentTarget)) * 100) / 100)];
ctrlSetText [140060, Str(Round((GVAR(targetRange) select GVAR(currentTarget))))];
ctrlSetText [140041, Str(Round(cos(GVAR(inclinationAngle) select GVAR(currentTarget)) * 100) / 100)];
if (GVAR(currentUnit) != 2) then {
ctrlSetText [140050, Str(Round((GVAR(targetSpeed) select GVAR(currentTarget)) * 2.23693629 * 100) / 100)];
} else {
ctrlSetText [140050, Str(Round((GVAR(targetSpeed) select GVAR(currentTarget)) * 100) / 100)];
};
if (GVAR(currentUnit) == 1) then {
ctrlSetText [140060, Str(Round((GVAR(targetRange) select GVAR(currentTarget)) * 1.0936133))];
} else {
ctrlSetText [140060, Str(Round((GVAR(targetRange) select GVAR(currentTarget))))];
};
if (GVAR(currentUnit) == 0) then {
ctrlSetText [140061, "*"];
} else {
ctrlSetText [140061, ""];
};
if (GVAR(currentUnit) == 2) then {
ctrlSetText [14002, "Wind Speed (m/s)"];

View File

@ -44,7 +44,7 @@ _barometricPressure = GVAR(barometricPressure);
_relativeHumidity = GVAR(relativeHumidity);
private ["_result"];
_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, 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 [3, _scopeBaseAngle + (_result select 0) / 60];

View File

@ -10,3 +10,5 @@
#endif
#include "\z\ace\addons\main\script_macros.hpp"
#define ATRAGMX_PROFILE_NAMESPACE_VERSION 1.2

View File

@ -19,18 +19,23 @@
<Polish>Otwórz ATragMX</Polish>
<Russian>Открыть ATragMX</Russian>
<Spanish>Abrir ATragMX</Spanish>
<French>Ouvrir ATragMX</French>
<German>ATragMX öffnen</German>
</Key>
<Key ID="STR_ACE_ATragMX_Description">
<English>Rugged PDA with ATragMX</English>
<Polish>Przenośny PDA z kalkulatorem balistycznym ATragMX</Polish>
<Russian>Защищенный КПК с ATragMX</Russian>
<Spanish>PDA rugerizada con ATragMX</Spanish>
<German>Robuster PDA mit ATragMX</German>
</Key>
<Key ID="STR_ACE_ATragMX_ATragMXDialogKey">
<English>Open ATragMX</English>
<Polish>Otwórz ATragMX</Polish>
<Russian>Открыть ATragMX</Russian>
<Spanish>Abrir ATragMX</Spanish>
<French>Ouvrir ATragMX</French>
<German>ATragMX öffnen</German>
</Key>
</Package>
</Project>

View File

@ -42,7 +42,7 @@
<German>IR-Stroboskop befestigt</German>
<Spanish>Marcador IR acoplado</Spanish>
<Polish>Przyczepiono stroboskop IR</Polish>
<French>Strobe IR attaché</French>
<French>Balise IR attachée</French>
<Czech>IR Značkovač připnutý</Czech>
<Portuguese>Marcador IV Acoplado</Portuguese>
<Italian>Strobo IR attaccata</Italian>
@ -54,7 +54,7 @@
<German>IR-Stroboskop entfernt</German>
<Spanish>Marcador IR quitado</Spanish>
<Polish>Odczepiono stroboskop IR</Polish>
<French>Strobe IR détaché</French>
<French>Balise IR détachée</French>
<Czech>IR Značkovač odepnutý</Czech>
<Portuguese>Marcador IV Separado</Portuguese>
<Italian>Strobo IR staccata</Italian>
@ -126,7 +126,7 @@
<German>IR-Stroboskop</German>
<Spanish>Marcador IR</Spanish>
<Polish>Stroboskop IR</Polish>
<French>Strobe IR</French>
<French>Balise IR</French>
<Czech>IR Značkovač</Czech>
<Portuguese>Marcador IV</Portuguese>
<Italian>Strobo IR</Italian>
@ -138,7 +138,7 @@
<German>Das IR-Stroboskop erlaubt es dir deine Position mit einem blinkenden Leuchtfeuer zu signalisieren, welches nur mit Nachtsichtgerät zu erkennen ist.</German>
<Polish>Stroboskop światła podczerwieni umożliwia oznaczenie swojej pozycji pulsacyjnym światłem widocznym tylko przez optykę noktowizyjną i gogle noktowizyjne.</Polish>
<Spanish>El Marcador IR permite señalizar su posisición a través de una baliza visible solo a través de dispositivos de visión nocturna. </Spanish>
<French>Le Strobe IR permet de signaler votre position grace à un clignotement visible par des JVN.</French>
<French>La balise IR permet de signaler votre position grace à un clignotement visible par des JVN.</French>
<Czech>IR Značkovač je Infračerveně zářící stroboskop umožňující signalizaci vaší pozice díky blikajícímu světlu, které je vidět pouze při užití noktovizoru.</Czech>
<Portuguese>O Marcador IV permite que você sinalize sua posição através de um pulso visível somente com equipamento de visão noturna.</Portuguese>
<Italian>La Strobo IR è una luce stroboscopica che ti permette di segnalare la tua posizione grazie all'emissione di impulsi ad infrarossi visibili solo con i visori notturni.</Italian>
@ -183,25 +183,25 @@
<English>%1&lt;br/&gt;Attached</English>
<German>%1&lt;br/&gt;befestigt</German>
<Spanish>%1&lt;br/&gt;acoplada</Spanish>
<Polish>%1&lt;br/&gt;Przyczepiono</Polish>
<Polish>%1&lt;br/&gt;przyczepiono</Polish>
<French>%1&lt;br/&gt;attachée</French>
<Czech>%1&lt;br/&gt;Připnutý</Czech>
<Portuguese>%1&lt;br/&gt;Acoplada</Portuguese>
<Italian>%1&lt;br/&gt;attaccata</Italian>
<Hungarian>%1&lt;br/&gt;hozzácsatolva</Hungarian>
<Russian>%1&lt;br/&gt;присоединена</Russian>
<Russian>%1&lt;br/&gt;присоединен(-а)</Russian>
</Key>
<Key ID="STR_ACE_Attach_Item_Detached">
<English>%1&lt;br/&gt;Detached</English>
<German>%1&lt;br/&gt;entfernt</German>
<Spanish>%1&lt;br/&gt;quitada</Spanish>
<Polish>%1&lt;br/&gt;Odczepiono</Polish>
<Polish>%1&lt;br/&gt;odczepiono</Polish>
<French>%1&lt;br/&gt;détachée</French>
<Czech>%1&lt;br/&gt;Odepnutý</Czech>
<Portuguese>%1&lt;br/&gt;Separada</Portuguese>
<Italian>%1&lt;br/&gt;staccata</Italian>
<Hungarian>%1&lt;br/&gt;lecsatolva</Hungarian>
<Russian>%1&lt;br/&gt;отсоединена</Russian>
<Russian>%1&lt;br/&gt;отсоединен(-а)</Russian>
</Key>
</Package>
</Project>

View File

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Edited with tabler. -->
<Project name="ACE">
<Package name="Magazines">
<!-- MX -->
@ -13,7 +12,7 @@
<Czech>6.5mm 30ks Svítící IR-DIM Zásobník</Czech>
<Portuguese>Carregador de 30 projéteis traçantes IR-DIM de 6,5mm</Portuguese>
<Italian>Caricatore 6.5mm 30Rnd Traccianti IR-DIM</Italian>
<Russian>Магазин из 30-ти 6.5 мм трассирующих под ПНВ</Russian>
<Russian>Магазин из 30-ти 6,5 мм ИК-трассирующих</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_65x39_caseless_mag_Tracer_DimNameShort">
<English>6.5mm IR-DIM</English>
@ -25,7 +24,7 @@
<Czech>6.5mm IR-DIM</Czech>
<Portuguese>6,5mm IR-DIM</Portuguese>
<Italian>6.5 IR-DIM</Italian>
<Russian>6.5 мм ИК-трассирующие</Russian>
<Russian>6,5 мм ИК-трассирующие</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_65x39_caseless_mag_Tracer_DimDescription">
<English>Caliber: 6.5x39 mm Tracer IR-DIM&lt;br /&gt;Rounds: 30&lt;br /&gt;Used in: MX/C/M/SW/3GL</English>
@ -37,7 +36,7 @@
<Czech>Ráže: 6.5x39 mm Svítící IR-DIM&lt;br /&gt;Munice: 30&lt;br /&gt;Použití: MX/C/M/SW/3GL</Czech>
<Portuguese>Calibre: 6,5x39 mm Traçante IR-DIM&lt;br /&gt;Projéteis: 30&lt;br /&gt;Usado em: MX/C/M/SW/3GL</Portuguese>
<Italian>Calibro: 6.5x39 mm Traccianti IR-DIM &lt;br /&gt;Munizioni: 30&lt;br /&gt;In uso su: MX/C/M/SW/3GL</Italian>
<Russian>Калибр: 6.5x39 мм трассирующие под ПНВ&lt;br /&gt;Патронов: 30&lt;br /&gt;Применимы в: MX/C/M/SW/3GL</Russian>
<Russian>Калибр: 6,5x39 мм ИК-трассирующие&lt;br /&gt;Патронов: 30&lt;br /&gt;Используются с: MX/C/M/SW/3GL</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_65x39_caseless_mag_SDName">
<English>6.5mm 30Rnd SD Mag</English>
@ -49,7 +48,7 @@
<Czech>6.5mm 30ks SD Zásobník</Czech>
<Portuguese>Carregador de 30 projéteis SD de 6,5mm</Portuguese>
<Italian>Caricatore 6.5mm 30Rnd Sil.</Italian>
<Russian>Магазин из 30-ти 6.5 мм дозвуковых</Russian>
<Russian>Магазин из 30-ти 6,5 мм дозвуковых</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_65x39_caseless_mag_SDNameShort">
<English>6.5mm SD</English>
@ -61,7 +60,7 @@
<Czech>6.5mm SD</Czech>
<Portuguese>6,5mm SD</Portuguese>
<Italian>6.5mm Sil.</Italian>
<Russian>6.5 мм дозвуковые</Russian>
<Russian>6,5 мм дозвуковые</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_65x39_caseless_mag_SDDescription">
<English>Caliber: 6.5x39 mm SD&lt;br /&gt;Rounds: 30&lt;br /&gt;Used in: MX/C/M/SW/3GL</English>
@ -73,7 +72,7 @@
<Czech>Ráže: 6.5x39 mm SD&lt;br /&gt;Munice: 30&lt;br /&gt;Použití: MX/C/M/SW/3GL</Czech>
<Portuguese>Calibre: 6,5x39 mm SD&lt;br /&gt;Projéteis: 30&lt;br /&gt;Usado em: MX/C/M/SW/3GL</Portuguese>
<Italian>Calibro: 6.5x39 mm Sil.&lt;br /&gt;Munizioni: 30&lt;br /&gt;In uso su: MX/C/M/SW/3GL </Italian>
<Russian>Калибр: 6.5x39 мм дозвуковые&lt;br /&gt;Патронов: 30&lt;br /&gt;Применимы в: MX/C/M/SW/3GL</Russian>
<Russian>Калибр: 6,5x39 мм дозвуковые&lt;br /&gt;Патронов: 30&lt;br /&gt;Используются с: MX/C/M/SW/3GL</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_65x39_caseless_mag_APName">
<English>6.5mm 30Rnd AP Mag</English>
@ -85,7 +84,7 @@
<Czech>6.5mm 30ks AP Zásobník</Czech>
<Portuguese>Carregador de 30 projéteis AP de 6,5mm</Portuguese>
<Italian>Caricatore 6.5mm 30Rnd AP</Italian>
<Russian>Магазин из 30-ти 6.5 мм бронебойных</Russian>
<Russian>Магазин из 30-ти 6,5 мм бронебойных</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_65x39_caseless_mag_APNameShort">
<English>6.5mm AP</English>
@ -97,7 +96,7 @@
<Czech>6.5mm AP</Czech>
<Portuguese>6,5mm AP</Portuguese>
<Italian>6.5mm AP</Italian>
<Russian>6.5 мм бронебойные</Russian>
<Russian>6,5 мм бронебойные</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_65x39_caseless_mag_APDescription">
<English>Caliber: 6.5x39 mm AP&lt;br /&gt;Rounds: 30&lt;br /&gt;Used in: MX/C/M/SW/3GL</English>
@ -109,7 +108,7 @@
<Czech>Ráže: 6.5x39 mm AP&lt;br /&gt;Munice: 30&lt;br /&gt;Použití: MX/C/M/SW/3GL</Czech>
<Portuguese>Calibre: 6,5x39 mm AP&lt;br /&gt;Projéteis: 30&lt;br /&gt;Usado em: MX/C/M/SW/3GL</Portuguese>
<Italian>Calibro: 6.5x39 mm AP&lt;br /&gt;Munizioni: 30&lt;br /&gt;In uso su: MX/C/M/SW/3GL</Italian>
<Russian>Калибр: 6.5x39 мм бронебойные&lt;br /&gt;Патронов: 30&lt;br /&gt;Применимы в: MX/C/M/SW/3GL</Russian>
<Russian>Калибр: 6,5x39 мм бронебойные&lt;br /&gt;Патронов: 30&lt;br /&gt;Используются с: MX/C/M/SW/3GL</Russian>
</Key>
<!-- KATIBA -->
<Key ID="STR_ACE_30Rnd_65x39_caseless_green_mag_Tracer_DimName">
@ -122,7 +121,7 @@
<Czech>6.5mm 30ks Svítící IR-DIM Zásobník</Czech>
<Portuguese>Carregador de 30 projéteis traçantes IR-DIM de 6,5mm</Portuguese>
<Italian>Caricatore 6.5mm 30Rnd Traccianti IR-DIM</Italian>
<Russian>Магазин из 30-ти 6.5 мм трассирующих под ПНВ</Russian>
<Russian>Магазин из 30-ти 6,5 мм ИК-трассирующих</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_65x39_caseless_green_mag_Tracer_DimNameShort">
<English>6.5mm IR-DIM</English>
@ -134,7 +133,7 @@
<Czech>6.5mm IR-DIM</Czech>
<Portuguese>6,5mm IR-DIM</Portuguese>
<Italian>6.5mm IR-DIM</Italian>
<Russian>6.5 мм ИК-трассирующие</Russian>
<Russian>6,5 мм ИК-трассирующие</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_65x39_caseless_green_mag_Tracer_DimDescription">
<English>Caliber: 6.5x39 mm Tracer IR-DIM&lt;br /&gt;Rounds: 30&lt;br /&gt;Used in: Katiba</English>
@ -146,7 +145,7 @@
<Czech>Ráže: 6.5x39 mm Svítící IR-DIM&lt;br /&gt;Munice: 30&lt;br /&gt;Použití: Katiba</Czech>
<Portuguese>Calibre: 6,5x39 mm Traçante IR-DIM&lt;br /&gt;Projéteis: 30&lt;br /&gt;Usado em: Katiba</Portuguese>
<Italian>Calibro: 6.5x39 mm Tracciant IR-DIM&lt;br /&gt;Munizioni: 30&lt;br /&gt;In uso su: Katiba</Italian>
<Russian>Калибр: 6.5x39 мм трассирующие под ПНВ&lt;br /&gt;Патронов: 30&lt;br /&gt;Применимы в: Katiba</Russian>
<Russian>Калибр: 6,5x39 мм ИК-трассирующие&lt;br /&gt;Патронов: 30&lt;br /&gt;Используются с: Katiba</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_65x39_caseless_green_mag_SDName">
<English>6.5mm 30Rnd SD Mag</English>
@ -158,7 +157,7 @@
<Czech>6.5mm 30ks SD Zásobník</Czech>
<Portuguese>Carregador de 30 projéteis SD de 6,5mm</Portuguese>
<Italian>Caricatore 6.5mm 30Rnd Sil.</Italian>
<Russian>Магазин из 30-ти 6.5 мм дозвуковых</Russian>
<Russian>Магазин из 30-ти 6,5 мм дозвуковых</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_65x39_caseless_green_mag_SDNameShort">
<English>6.5mm SD</English>
@ -170,7 +169,7 @@
<Czech>6.5mm SD</Czech>
<Portuguese>6,5mm SD</Portuguese>
<Italian>6.5mm Sil.</Italian>
<Russian>6.5 мм дозвуковые</Russian>
<Russian>6,5 мм дозвуковые</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_65x39_caseless_green_mag_SDDescription">
<English>Caliber: 6.5x39 mm SD&lt;br /&gt;Rounds: 30&lt;br /&gt;Used in: Katiba</English>
@ -182,7 +181,7 @@
<Czech>Ráže: 6.5x39 mm SD&lt;br /&gt;Munice: 30&lt;br /&gt;Použití: Katiba</Czech>
<Portuguese>Calibre: 6,5x39 mm SD&lt;br /&gt;Projéteis: 30&lt;br /&gt;Usado em: Katiba</Portuguese>
<Italian>Calibro: 6.5x39 mm Sil.&lt;br /&gt;Munizioni: 30&lt;br /&gt;In uso su: Katiba</Italian>
<Russian>Калибр: 6.5x39 мм дозвуковые&lt;br /&gt;Патронов: 30&lt;br /&gt;Применимы в: Katiba</Russian>
<Russian>Калибр: 6,5x39 мм дозвуковые&lt;br /&gt;Патронов: 30&lt;br /&gt;Используются с: Katiba</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_65x39_caseless_green_mag_APName">
<English>6.5mm 30Rnd AP Mag</English>
@ -194,7 +193,7 @@
<Czech>6.5mm 30ks AP Zásobník</Czech>
<Portuguese>Carregador de 30 projéteis AP de 6,5mm</Portuguese>
<Italian>Caricatore 6.5mm 30Rnd AP</Italian>
<Russian>Магазин из 30-ти 6.5 мм бронебойных</Russian>
<Russian>Магазин из 30-ти 6,5 мм бронебойных</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_65x39_caseless_green_mag_APNameShort">
<English>6.5mm AP</English>
@ -206,7 +205,7 @@
<Czech>6.5mm AP</Czech>
<Portuguese>6,5mm AP</Portuguese>
<Italian>6.5mm AP</Italian>
<Russian>6.5 мм бронебойные</Russian>
<Russian>6,5 мм бронебойные</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_65x39_caseless_green_mag_APDescription">
<English>Caliber: 6.5x39 mm AP&lt;br /&gt;Rounds: 30&lt;br /&gt;Used in: Katiba</English>
@ -218,7 +217,7 @@
<Czech>Ráže: 6.5x39 mm AP&lt;br /&gt;Munice: 30&lt;br /&gt;Použití: Katiba</Czech>
<Portuguese>Calibre: 6,5x39 mm AP&lt;br /&gt;Projéteis: 30&lt;br /&gt;Usado em: Katiba</Portuguese>
<Italian>Calibro: 6.5x39 mm AP&lt;br /&gt;Munizioni: 30&lt;br /&gt;In uso su: Katiba</Italian>
<Russian>Калибр: 6.5x39 мм бронебойные&lt;br /&gt;Патронов: 30&lt;br /&gt;Применимы в: Katiba</Russian>
<Russian>Калибр: 6,5x39 мм бронебойные&lt;br /&gt;Патронов: 30&lt;br /&gt;Используются с: Katiba</Russian>
</Key>
<!-- 5.56x45mm -->
<Key ID="STR_ACE_30Rnd_556x45_mag_Tracer_DimName">
@ -231,7 +230,7 @@
<Czech>5.56mm 30ks Svítící IR-DIM Zásobník</Czech>
<Portuguese>Carregador de 30 projéteis traçantes IR-DIM de 5,56mm</Portuguese>
<Italian>Caricatore 5.56mm 30rnd Traccianti IR-DIM</Italian>
<Russian>Магазин из 30-ти 5.56 мм трассирующих под ПНВ</Russian>
<Russian>Магазин из 30-ти 5,56 мм ИК-трассирующих</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_556x45_mag_Tracer_DimNameShort">
<English>5.56mm IR-DIM</English>
@ -243,7 +242,7 @@
<Czech>5.56mm IR-DIM</Czech>
<Portuguese>5,56mm IR-DIM</Portuguese>
<Italian>5.56mm IR-DIM</Italian>
<Russian>5.56 мм ИК-трассирующие</Russian>
<Russian>5,56 мм ИК-трассирующие</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_556x45_mag_Tracer_DimDescription">
<English>Caliber: 5.56x45 mm Tracer IR-DIM&lt;br /&gt;Rounds: 30&lt;br /&gt;Used in: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR</English>
@ -255,7 +254,7 @@
<Czech>Ráže: 5.56x45 mm Svítící IR-DIM&lt;br /&gt;Munice: 30&lt;br /&gt;Použití: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR</Czech>
<Portuguese>Calibre: 5,56x45 mm Traçante IR-DIM&lt;br /&gt;Projéteis: 30&lt;br /&gt;Usado em: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR</Portuguese>
<Italian>Calibro: 5.56x45 mm Traccianti IR-DIM&lt;br /&gt;Munizioni: 30&lt;br /&gt;In uso su: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR</Italian>
<Russian>Калибр: 5.56x45 мм трассирующие под ПНВ&lt;br /&gt;Патронов: 30&lt;br /&gt;Применимы в: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR</Russian>
<Russian>Калибр: 5,56x45 мм ИК-трассирующие&lt;br /&gt;Патронов: 30&lt;br /&gt;Используются с: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_556x45_mag_APName">
<English>5.56mm 30Rnd AP Mag</English>
@ -267,7 +266,7 @@
<Czech>5.56mm 30ks AP Zásobník</Czech>
<Portuguese>Carregador de 30 projéteis AP de 5,56mm</Portuguese>
<Italian>Caricatore 5.56mm 30Rnd AP</Italian>
<Russian>Магазин из 30-ти 5.56 мм бронебойных</Russian>
<Russian>Магазин из 30-ти 5,56 мм бронебойных</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_556x45_mag_APNameShort">
<English>5.56mm AP</English>
@ -279,7 +278,7 @@
<Czech>5.56mm AP</Czech>
<Portuguese>5,56mm AP</Portuguese>
<Italian>5.56mm AP</Italian>
<Russian>5.56 мм бронебойные</Russian>
<Russian>5,56 мм бронебойные</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_556x45_mag_APDescription">
<English>Caliber: 5.56x45 mm AP&lt;br /&gt;Rounds: 30&lt;br /&gt;Used in: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR</English>
@ -291,7 +290,7 @@
<Czech>Ráže: 5.56x45 mm AP&lt;br /&gt;Munice: 30&lt;br /&gt;Použití: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR</Czech>
<Portuguese>Calibre: 5,56x45 mm AP&lt;br /&gt;Projéteis: 30&lt;br /&gt;Usado em: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR</Portuguese>
<Italian>Calibro: 5.56x45 mm AP&lt;br /&gt;Munizioni: 30&lt;br /&gt;In uso su: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR</Italian>
<Russian>Калибр: 5.56x45 мм бронебойные&lt;br /&gt;Патронов: 30&lt;br /&gt;Применимы в: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR</Russian>
<Russian>Калибр: 5,56x45 мм бронебойные&lt;br /&gt;Патронов: 30&lt;br /&gt;Используются с: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR</Russian>
</Key>
<!-- 7.62x51mm -->
<Key ID="STR_ACE_20Rnd_762x51_mag_TracerName">
@ -304,7 +303,7 @@
<Czech>7.62mm 20ks Svítící Zásobník</Czech>
<Portuguese>Carregador de 20 projéteis traçantes de 7,62mm</Portuguese>
<Italian>Caricatore 7.62mm 20Rnd Traccianti</Italian>
<Russian>Магазин из 20-ти 7.62 мм трассирующих</Russian>
<Russian>Магазин из 20-ти 7,62 мм трассирующих</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_mag_TracerNameShort">
<English>7.62mm Tracer</English>
@ -316,7 +315,7 @@
<Czech>7.62mm Svítící</Czech>
<Portuguese>7,62mm Traçante</Portuguese>
<Italian>7.62mm Traccianti</Italian>
<Russian>7.62 мм трассирущие</Russian>
<Russian>7,62 мм трассирущие</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_mag_TracerDescription">
<English>Caliber: 7.62x51 mm Tracer&lt;br /&gt;Rounds: 20&lt;br /&gt;Used in: Mk18 ABR</English>
@ -328,7 +327,7 @@
<Czech>Ráže: 7.62x51 mm Svítící&lt;br /&gt;Munice: 20&lt;br /&gt;Použití: Mk18 ABR</Czech>
<Portuguese>Calibre: 7,62x51 mm Traçante&lt;br /&gt;Projéteis: 20&lt;br /&gt;Usado em: Mk18 ABR</Portuguese>
<Italian>Calibro: 7.62x51 mm Traccianti&lt;br /&gt;Munizioni: 20&lt;br /&gt;In uso su: Mk18 ABR</Italian>
<Russian>Калибр: 7.62x51 мм трассирующие&lt;br /&gt;Патронов: 20&lt;br /&gt;Применимы в: Mk18 ABR</Russian>
<Russian>Калибр: 7,62x51 мм трассирующие&lt;br /&gt;Патронов: 20&lt;br /&gt;Используются с: Mk18 ABR</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_mag_Tracer_DimName">
<English>7.62mm 20rnd Tracer IR-DIM Mag</English>
@ -340,7 +339,7 @@
<Czech>7.62mm 20ks Svítící IR-DIM Zásobník</Czech>
<Portuguese>Carregador de 20 projéteis IR-DIM de 7,62mm</Portuguese>
<Italian>Caricatore 7.62mm 20rnd Traccianti IR-DIM</Italian>
<Russian>Магазин из 20-ти 7.62 мм трассирующих под ПНВ</Russian>
<Russian>Магазин из 20-ти 7,62 мм ИК-трассирующих</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_mag_Tracer_DimNameShort">
<English>7.62mm IR-DIM</English>
@ -352,7 +351,7 @@
<Czech>7.62mm IR-DIM</Czech>
<Portuguese>7,62mm IR-DIM</Portuguese>
<Italian>7.62mm IR-DIM</Italian>
<Russian>7.62 мм ИК-трассирующие</Russian>
<Russian>7,62 мм ИК-трассирующие</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_mag_Tracer_DimDescription">
<English>Caliber: 7.62x51 mm Tracer IR-DIM&lt;br /&gt;Rounds: 20&lt;br /&gt;Used in: Mk18 ABR</English>
@ -364,7 +363,7 @@
<Czech>Ráže: 7.62x51 mm Svítící IR-DIM&lt;br /&gt;Munice: 20&lt;br /&gt;Použití: Mk18 ABR</Czech>
<Portuguese>Calibre: 7,62x51 mm Traçante IR-DIM&lt;br /&gt;Projéteis: 20&lt;br /&gt;Usado em: Mk18 ABR</Portuguese>
<Italian>Calibro: 7.62x51 mm Traccianti IR-DIM&lt;br /&gt;Munizioni: 20&lt;br /&gt;In uso su: Mk18 ABR</Italian>
<Russian>Калибр: 7.62x51 мм трассирующие под ПНВ&lt;br /&gt;Патронов: 20&lt;br /&gt;Применимы в: Mk18 ABR</Russian>
<Russian>Калибр: 7,62x51 мм ИК-трассирующие&lt;br /&gt;Патронов: 20&lt;br /&gt;Используются с: Mk18 ABR</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_mag_SDName">
<English>7.62mm 20Rnd SD Mag</English>
@ -376,7 +375,7 @@
<Czech>7.62mm 20ks SD Zásobník</Czech>
<Portuguese>Carregador de 20 projéteis SD de 7,62mm</Portuguese>
<Italian>Caricatore 7.62mm 20Rnd Sil.</Italian>
<Russian>Магазин из 20-ти 7.62 мм дозвуковых</Russian>
<Russian>Магазин из 20-ти 7,62 мм дозвуковых</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_mag_SDNameShort">
<English>7.62mm SD</English>
@ -388,7 +387,7 @@
<Czech>7.62mm SD</Czech>
<Portuguese>7,62mm SD</Portuguese>
<Italian>7.62mm Sil.</Italian>
<Russian>7.62 мм дозвуковые</Russian>
<Russian>7,62 мм дозвуковые</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_mag_SDDescription">
<English>Caliber: 7.62x51 mm SD&lt;br /&gt;Rounds: 20&lt;br /&gt;Used in: Mk18 ABR</English>
@ -400,7 +399,7 @@
<Czech>Ráže: 7.62x51 mm SD&lt;br /&gt;Munice: 20&lt;br /&gt;Použití: Mk18 ABR</Czech>
<Portuguese>Calibre: 7,62x51 mm SD&lt;br /&gt;Projéteis: 20&lt;br /&gt;Usado em: Mk18 ABR</Portuguese>
<Italian>Calibro: 7.62x51 mm Sil.&lt;br /&gt;Munizioni: 20&lt;br /&gt;In uso su: Mk18 ABR</Italian>
<Russian>Калибр: 7.62x51 мм дозвуковые&lt;br /&gt;Патронов: 20&lt;br /&gt;Применимы в: Mk18 ABR</Russian>
<Russian>Калибр: 7,62x51 мм дозвуковые&lt;br /&gt;Патронов: 20&lt;br /&gt;Используются с: Mk18 ABR</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_mag_APName">
<English>7.62mm 20Rnd AP Mag</English>
@ -412,7 +411,7 @@
<Czech>7.62mm 20ks AP Zásobník</Czech>
<Portuguese>Carregador de 20 projéteis AP de 7,62mm</Portuguese>
<Italian>Caricatore 7.62mm 20Rnd AP</Italian>
<Russian>Магазин из 20-ти 7.62 мм бронебойных</Russian>
<Russian>Магазин из 20-ти 7,62 мм бронебойных</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_mag_APNameShort">
<English>7.62mm AP</English>
@ -424,7 +423,7 @@
<Czech>7.62mm AP</Czech>
<Portuguese>7,62mm AP</Portuguese>
<Italian>7.62mm AP</Italian>
<Russian>7.62 мм бронебойные</Russian>
<Russian>7,62 мм бронебойные</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_mag_APDescription">
<English>Caliber: 7.62x51 mm AP&lt;br /&gt;Rounds: 20&lt;br /&gt;Used in: Mk18 ABR</English>
@ -436,7 +435,7 @@
<Czech>Ráže: 7.62x51 mm AP&lt;br /&gt;Munice: 20&lt;br /&gt;Použití: Mk18 ABR</Czech>
<Portuguese>Calibre: 7,62x51 mm AP&lt;br /&gt;Projéteis: 20&lt;br /&gt;Usado em: Mk18 ABR</Portuguese>
<Italian>Calibro: 7.62x51 mm AP&lt;br /&gt;Munizioni: 20&lt;br /&gt;In uso su: Mk18 ABR</Italian>
<Russian>Калибр: 7.62x51 мм дозвуковые&lt;br /&gt;Патронов: 20&lt;br /&gt;Применимы в: Mk18 ABR</Russian>
<Russian>Калибр: 7,62x51 мм дозвуковые&lt;br /&gt;Патронов: 20&lt;br /&gt;Используются с: Mk18 ABR</Russian>
</Key>
<!-- .338 Norma Magnum -->
<Key ID="STR_ACE_130Rnd_338_Mag_TracerName">
@ -445,6 +444,7 @@
<Polish>Taśma .338 NM 130rd Smugacz</Polish>
<French>Bande .338 NM 130Cps Traçante</French>
<Spanish>Cinta de 130 balas trazadoras de .338 NM</Spanish>
<Russian>Лента из 130-ти .338 NM трассирующих</Russian>
</Key>
<Key ID="STR_ACE_130Rnd_338_Mag_TracerNameShort">
<English>.338 NM Tracer</English>
@ -453,6 +453,7 @@
<Czech>.338 NM Svítící</Czech>
<French>.338 NM Traçante</French>
<Spanish>.338 NM trazadora</Spanish>
<Russian>.338 NM трассирующие</Russian>
</Key>
<Key ID="STR_ACE_130Rnd_338_Mag_TracerDescription">
<English>Caliber: .338 Norma Magnum Tracer&lt;br /&gt;Rounds: 130&lt;br /&gt;Used in: SPMG</English>
@ -460,6 +461,7 @@
<Polish>Kaliber: .338 Norma Magnum Smugacz&lt;br /&gt;Pociski: 130&lt;br /&gt;Używany w: SPMG</Polish>
<French>Calibre: .338 Norma Magnum Traçante&lt;br /&gt;Cartouches: 130&lt;br /&gt;Utilisé dans: SPMG</French>
<Spanish>Calibre: .338 Norma Magnum trazadora&lt;br /&gt;Balas: 130&lt;br /&gt;Se usa en: SPMG</Spanish>
<Russian>Калибр: .338 Norma Magnum трассирующие&lt;br /&gt;Патронов: 130&lt;br /&gt;Используются в: SPMG</Russian>
</Key>
<Key ID="STR_ACE_130Rnd_338_Mag_Tracer_DimName">
<English>.338 NM 130Rnd IR-DIM Belt</English>
@ -467,6 +469,7 @@
<Polish>Taśma .338 NM 130rd IR-DIM</Polish>
<French>Bande .338 NM 130Cps IR-DIM</French>
<Spanish>Cinta de 130 balas IR-DIM de .338 NM</Spanish>
<Russian>Лента из 130-ти .338 NM ИК-трассирующих</Russian>
</Key>
<Key ID="STR_ACE_130Rnd_338_Mag_Tracer_DimNameShort">
<English>.338 NM IR-DIM</English>
@ -475,6 +478,7 @@
<Czech>.338 NM IR-DIM</Czech>
<French>.338 NM IR-DIM</French>
<Spanish>.338 NM IR-DIM</Spanish>
<Russian>.338 NM ИК-трассирующие</Russian>
</Key>
<Key ID="STR_ACE_130Rnd_338_Mag_Tracer_DimDescription">
<English>Caliber: .338 Norma Magnum Tracer IR-DIM&lt;br /&gt;Rounds: 130&lt;br /&gt;Used in: SPMG</English>
@ -482,6 +486,7 @@
<Polish>Kaliber: .338 Norma Magnum Smugacz IR-DIM&lt;br /&gt;Pociski: 130&lt;br /&gt;Używany w: SPMG</Polish>
<French>Calibre: .338 Norma Magnum Traçante IR-DIM&lt;br /&gt;Cartouches: 130&lt;br /&gt;Utilisé dans: SPMG</French>
<Spanish>Calibre: .338 Norma Magnum trazadora IR-DIM&lt;br /&gt;Balas: 130&lt;br /&gt;Se usa en: SPMG</Spanish>
<Russian>Калибр: .338 Norma Magnum ИК-трассирующие&lt;br /&gt;Патронов: 130&lt;br /&gt;Используются с: SPMG</Russian>
</Key>
<Key ID="STR_ACE_130Rnd_338_Mag_APName">
<English>.338 NM 130Rnd AP Belt</English>
@ -489,6 +494,7 @@
<Polish>Taśma .338 NM 130rd AP</Polish>
<French>Bande .338 NM 130Cps AP</French>
<Spanish>Cinta de 130 balas AP de .338 NM</Spanish>
<Russian>Лента из 130-ти .338 NM бронебойных</Russian>
</Key>
<Key ID="STR_ACE_130Rnd_338_Mag_APNameShort">
<English>.338 NM AP</English>
@ -497,6 +503,7 @@
<Czech>.338 NM AP</Czech>
<French>.338 NM AP</French>
<Spanish>.338 NM AP</Spanish>
<Russian>.338 NM бронебойные</Russian>
</Key>
<Key ID="STR_ACE_130Rnd_338_Mag_APDescription">
<English>Caliber: .338 Norma Magnum AP&lt;br /&gt;Rounds: 130&lt;br /&gt;Used in: SPMG</English>
@ -504,6 +511,7 @@
<Polish>Kaliber: .338 Norma Magnum AP&lt;br /&gt;Pociski: 130&lt;br /&gt;Używane w: SPMG</Polish>
<French>Calibre: .338 Norma Magnum AP&lt;br /&gt;Cartouches: 130&lt;br /&gt;Utilisé dans: SPMG</French>
<Spanish>Calibre: .338 Norma Magnum AP&lt;br /&gt;Balas: 130&lt;br /&gt;Se usa en: SPMG</Spanish>
<Russian>Калибр: .338 Norma Magnum бронебойные&lt;br /&gt;Патронов: 130&lt;br /&gt;Используются с: SPMG</Russian>
</Key>
<!-- 9.3x64mm 10Rnd -->
<Key ID="STR_ACE_10Rnd_93x64_DMR_05_Mag_TracerName">
@ -512,6 +520,7 @@
<Polish>Magazynek 9.3mm 10rd Smugacz</Polish>
<French>Chargeur 9.3mm 10Cps Traçante</French>
<Spanish>Cargador de 10 balas trazadoras de 9.3mm</Spanish>
<Russian>Магазин из 10-ти 9,3 мм трассирующих</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_93x64_DMR_05_Mag_TracerNameShort">
<English>9.3mm Tracer</English>
@ -520,6 +529,7 @@
<Czech>9.3mm Svítící</Czech>
<French>9.3mm Traçante</French>
<Spanish>9.3mm trazadora</Spanish>
<Russian>9,3 мм трассирующие</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_93x64_DMR_05_Mag_TracerDescription">
<English>Caliber: 9.3x64mm Tracer&lt;br /&gt;Rounds: 10&lt;br /&gt;Used in: Cyrus</English>
@ -527,6 +537,7 @@
<Polish>Kaliber: 9,3x64 mm Smugacz&lt;br /&gt;Pociski: 10&lt;br /&gt;Używany w: Cyrus</Polish>
<French>Calibre: 9.3x64mm Traçante&lt;br /&gt;Cartouches: 10&lt;br /&gt;Utilisé dans: Cyrus</French>
<Spanish>Calibre: 9.3x64mm trazadora&lt;br /&gt;Balas: 10&lt;br /&gt;Se usa en: Cyrus</Spanish>
<Russian>Калибр: 9,3x64 мм трассирующие&lt;br /&gt;Патронов: 10&lt;br /&gt;Используются с: Cyrus</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_93x64_DMR_05_Mag_Tracer_DimName">
<English>9.3mm 10Rnd Tracer IR-DIM Mag</English>
@ -534,6 +545,7 @@
<Polish>Magazynek 9,3mm 10rd Smugacz IR-DIM</Polish>
<French>Chargeur 9.3mm 10Cps Traçante IR-DIM</French>
<Spanish>Cargador de 10 balas trazadoras IR-DIM de 9.3mm</Spanish>
<Russian>Магазин из 10-ти 9,3 мм ИК-трассирующих</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_93x64_DMR_05_Mag_Tracer_DimNameShort">
<English>9.3mm IR-DIM</English>
@ -542,6 +554,7 @@
<Czech>9.3mm IR-DIM</Czech>
<French>9.3mm IR-DIM</French>
<Spanish>9.3mm IR-DIM</Spanish>
<Russian>9,3 мм ИК-трассирующие</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_93x64_DMR_05_Mag_Tracer_DimDescription">
<English>Caliber: 9.3x64mm Tracer IR-DIM&lt;br /&gt;Rounds: 10&lt;br /&gt;Used in: Cyrus</English>
@ -549,6 +562,7 @@
<Polish>Kaliber: 9,3x64 mm Smugacz IR-DIM&lt;br /&gt;Pociski: 10&lt;br /&gt;Używany w: Cyrus</Polish>
<French>Calibre: 9.3x64mm Traçante IR-DIM&lt;br /&gt;Cartouches: 10&lt;br /&gt;Utilisé dans: Cyrus</French>
<Spanish>Calibre: 9.3x64mm trazadora IR-DIM&lt;br /&gt;Balas: 10&lt;br /&gt;Se usa en: Cyrus</Spanish>
<Russian>Калибр: 9,3x64 мм ИК-трассирующие&lt;br /&gt;Патронов: 10&lt;br /&gt;Используются с: Cyrus</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_93x64_DMR_05_Mag_APName">
<English>9.3mm 10Rnd AP Mag</English>
@ -556,6 +570,7 @@
<Polish>Magazynek 9,3mm 10rd AP</Polish>
<French>Chargeur 9.3mm 10Cps AP</French>
<Spanish>Cargador de 10 balas AP de 9.3mm</Spanish>
<Russian>Магазин из 10-ти 9,3 мм бронебойных</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_93x64_DMR_05_Mag_APNameShort">
<English>9.3mm AP</English>
@ -564,6 +579,7 @@
<Czech>9.3mm AP</Czech>
<French>9.3mm AP</French>
<Spanish>9.3mm AP</Spanish>
<Russian>9,3 мм бронебойные</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_93x64_DMR_05_Mag_APDescription">
<English>Caliber: 9.3x64mm AP&lt;br /&gt;Rounds: 10&lt;br /&gt;Used in: Cyrus</English>
@ -571,6 +587,7 @@
<Polish>Kaliber: 9,3x64 mm AP&lt;br /&gt;Pociski: 10&lt;br /&gt;Używany w: Cyrus</Polish>
<French>Calibre: 9.3x64mm AP&lt;br /&gt;Cartouches: 10&lt;br /&gt;Utilisé dans: Cyrus</French>
<Spanish>Calibre: 9.3x64mm AP&lt;br /&gt;Balas: 10&lt;br /&gt;Se usa en: Cyrus</Spanish>
<Russian>Калибр: 9,3x64 мм бронебойные&lt;br /&gt;Патронов: 10&lt;br /&gt;Используются с: Cyrus</Russian>
</Key>
<!-- 9.3x64mm 150Rnd Belt-->
<Key ID="STR_ACE_150Rnd_93x64_Mag_TracerName">
@ -579,6 +596,7 @@
<Polish>Taśma 9,3mm 150rd Smugacz</Polish>
<French>Bande 9.3mm 150Cps Traçante</French>
<Spanish>Cinta de 150 balas trazadoras de 9.3mm</Spanish>
<Russian>Лента из 150-ти 9,3 мм трассирующих</Russian>
</Key>
<Key ID="STR_ACE_150Rnd_93x64_Mag_TracerNameShort">
<English>9.3mm Tracer</English>
@ -587,6 +605,7 @@
<Czech>9.3mm Svítící</Czech>
<French>9.3mm Traçante</French>
<Spanish>9.3mm trazadora</Spanish>
<Russian>9,3 мм трассирующие</Russian>
</Key>
<Key ID="STR_ACE_150Rnd_93x64_Mag_TracerDescription">
<English>Caliber: 9.3x64mm Tracer&lt;br /&gt;Rounds: 150&lt;br /&gt;Used in: Navid</English>
@ -594,6 +613,7 @@
<Polish>Kaliber: 9,3x64 mm Smugacz&lt;br /&gt;Pociski: 150&lt;br /&gt;Używane w: Navid</Polish>
<French>Calibre: 9.3x64mm Traçante&lt;br /&gt;Cartouches: 150&lt;br /&gt;Utilisé dans: Navid</French>
<Spanish>Calibre: 9.3x64mm trazadora&lt;br /&gt;Balas: 150&lt;br /&gt;Se usa en: Navid</Spanish>
<Russian>Калибр: 9,3x64 мм трассирующие&lt;br /&gt;Патронов: 150&lt;br /&gt;Используются с: Навид</Russian>
</Key>
<Key ID="STR_ACE_150Rnd_93x64_Mag_Tracer_DimName">
<English>9.3mm 150Rnd Tracer IR-DIM Belt</English>
@ -601,6 +621,7 @@
<Polish>Taśma 9,3mm 150rd Smugacz IR-DIM</Polish>
<French>Bande 9.3mm 150Cps Traçante IR-DIM</French>
<Spanish>Cinta de 150 balas trazadoras IR-DIM de 9.3mm</Spanish>
<Russian>Лента из 150-ти 9,3 мм ИК-трассирующих</Russian>
</Key>
<Key ID="STR_ACE_150Rnd_93x64_Mag_Tracer_DimNameShort">
<English>9.3mm IR-DIM</English>
@ -609,6 +630,7 @@
<Czech>9.3mm IR-DIM</Czech>
<French>9.3mm IR-DIM</French>
<Spanish>9.3mm IR-DIM</Spanish>
<Russian>9,3 мм ИК-трассирующие</Russian>
</Key>
<Key ID="STR_ACE_150Rnd_93x64_Mag_Tracer_DimDescription">
<English>Caliber: 9.3x64mm Tracer IR-DIM&lt;br /&gt;Rounds: 150&lt;br /&gt;Used in: Navid</English>
@ -616,6 +638,7 @@
<Polish>Kaliber: 9,3x64 mm Smugacz IR-DIM&lt;br /&gt;Pociski: 150&lt;br /&gt;Używane w: Navid</Polish>
<French>Calibre: 9.3x64mm Traçante IR-DIM&lt;br /&gt;Cartouches: 150&lt;br /&gt;Utilisé dans: Navid</French>
<Spanish>Calibre: 9.3x64mm trazadora IR-DIM&lt;br /&gt;Balas: 150&lt;br /&gt;Se usa en: Navid</Spanish>
<Russian>Калибр: 9,3x64 мм ИК-трассирующие&lt;br /&gt;Патронов: 150&lt;br /&gt;Используются с: Навид</Russian>
</Key>
<Key ID="STR_ACE_150Rnd_93x64_Mag_APName">
<English>9.3mm 150Rnd AP Belt</English>
@ -623,6 +646,7 @@
<Polish>Taśma 9,3mm 150rd AP</Polish>
<French>Bande 9.3mm 150Cps AP</French>
<Spanish>Cinta de 150 balas AP de 9.3mm</Spanish>
<Russian>Лента из 150-ти 9,3 мм бронебойных</Russian>
</Key>
<Key ID="STR_ACE_150Rnd_93x64_Mag_APNameShort">
<English>9.3mm AP</English>
@ -631,6 +655,7 @@
<Czech>9.3mm AP</Czech>
<French>9.3mm AP</French>
<Spanish>9.3mm AP</Spanish>
<Russian>9,3 мм бронебойные</Russian>
</Key>
<Key ID="STR_ACE_150Rnd_93x64_Mag_APDescription">
<English>Caliber: 9.3x64mm AP&lt;br /&gt;Rounds: 150&lt;br /&gt;Used in: Navid</English>
@ -638,348 +663,406 @@
<Polish>Kaliber: 9,3x64 mm AP&lt;br /&gt;Pociski: 150&lt;br /&gt;Używane w: Navid</Polish>
<French>Calibre: 9.3x64mm AP&lt;br /&gt;Cartouches: 150&lt;br /&gt;Utilisé dans: Navid</French>
<Spanish>Calibre: 9.3x64mm AP&lt;br /&gt;Balas: 150&lt;br /&gt;Se usa en: Navid</Spanish>
<Russian>Калибр: 9,3x64 мм бронебойные&lt;br /&gt;Патронов: 150&lt;br /&gt;Используются с: Навид</Russian>
</Key>
<Key ID="STR_ACE_16Rnd_9x19_mag_Name">
<English>9x19mm 16Rnd Mag</English>
<Polish>Magazynek 9x19mm 16rd</Polish>
<French>Chargeur 9x19mm 16Cps</French>
<Spanish>Cargador de 16 balas de 9x19mm</Spanish>
<Russian>Магазин из 16-ти 9х19 мм</Russian>
</Key>
<Key ID="STR_ACE_16Rnd_9x19_mag_NameShort">
<English>9x19mm</English>
<Polish>9x19mm</Polish>
<French>9x19mm</French>
<Spanish>9x19mm</Spanish>
<Russian>9х19 мм</Russian>
</Key>
<Key ID="STR_ACE_16Rnd_9x19_mag_Description">
<English>9x19mm 30Rnd Mag</English>
<Polish>Magazynek 9x19mm 16rd</Polish>
<French>9x19mm 30Cps</French>
<Spanish>Cargador de 16 balas de 9x19mm</Spanish>
<Russian>Магазин из 16-ти 9х19 мм</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_9x19_mag_Name">
<English>9x19mm 30Rnd Mag</English>
<Polish>Magazynek 9x19mm 30rd</Polish>
<French>9x19mm 30Cps</French>
<Spanish>Cargador de 30 balas de 9x19mm</Spanish>
<Russian>Магазин из 30-ти 9х19 мм</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_9x19_mag_NameShort">
<English>9x19mm</English>
<Polish>9x19mm</Polish>
<French>9x19mm</French>
<Spanish>9x19mm</Spanish>
<Russian>9х19 мм</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_9x19_mag_Description">
<English>9x19mm 30Rnd Mag</English>
<Polish>Magazynek 9x19mm 30rd</Polish>
<French>9x19mm 30Cps</French>
<Spanish>Cargador de 30 balas de 9x19mm</Spanish>
<Russian>Магазин из 30-ти 9х19 мм</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_762x54_Tracer_mag_Name">
<English>7.62x54mm 10Rnd Tracer IR-DIM Mag</English>
<Polish>Magazynek 7,62x54 mm 10rd Smugacz IR-DIM</Polish>
<French>Chargeur 7.62x54mm 10Rnd Traçante IR-DIM</French>
<Spanish>Cargador de 10 balas trazadoras IR-DIM de 7.62x54mm</Spanish>
<Russian>Магазин из 10-ти 7,62 мм ИК-трассирующих</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_762x54_Tracer_mag_NameShort">
<English>7.62mm IR-DIM</English>
<Polish>7,62mm IR-DIM</Polish>
<French>7.62mm IR-DIM</French>
<Spanish>7.62mm IR-DIM</Spanish>
<Russian>7,62 мм ИК-трассирующие</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_762x54_Tracer_mag_Description">
<English>7.62x54mm 10Rnd Tracer IR-DIM Mag</English>
<Polish>Magazynek 7,62x54 mm 10rd Smugacz IR-DIM</Polish>
<French>Chargeur 7.62x54mm 10Cps Traçante IR-DIM</French>
<Spanish>Cargador de 10 balas trazadoras IR-DIM de 7.62x54mm</Spanish>
<Russian>Магазин из 10-ти 7,62 мм ИК-трассирующих</Russian>
</Key>
<Key ID="STR_ACE_100Rnd_65x39_caseless_mag_Tracer_DimName">
<English>6.5mm 100Rnd Tracer IR-DIM Mag</English>
<Polish>Magazynek 6,5mm 100rd Smugacz IR-DIM</Polish>
<French>Chargeur 6.5mm 100Rnd Traçante IR-DIM</French>
<Spanish>Cargador de 100 balas trazadoras IR-DIM de 6.5mm</Spanish>
<Russian>Магазин из 100 6,5 мм ИК-трассирующих</Russian>
</Key>
<Key ID="STR_ACE_100Rnd_65x39_caseless_mag_Tracer_DimNameShort">
<English>6.5mm IR-DIM</English>
<Polish>6,5mm IR-DIM</Polish>
<French>6.5mm IR-DIM</French>
<Spanish>6.5mm IR-DIM</Spanish>
<Russian>6,5 мм ИК-трассирующие</Russian>
</Key>
<Key ID="STR_ACE_100Rnd_65x39_caseless_mag_Tracer_DimDescription">
<English>6.5mm 100Rnd Tracer IR-DIM Mag</English>
<Polish>Magazynek 6,5mm 100rd Smugacz IR-DIM</Polish>
<French>Chargeur 6.5mm 100Rnd Traçante IR-DIM</French>
<Spanish>Cargador de 100 balas trazadoras IR-DIM de 6.5mm</Spanish>
<Russian>Магазин из 100 6,5 мм ИК-трассирующих</Russian>
</Key>
<Key ID="STR_ACE_200Rnd_65x39_cased_Box_Tracer_DimName">
<English>6.5mm 200Rnd Tracer IR-DIM Belt</English>
<Polish>Magazynek 6,5mm 200rd Smugacz IR-DIM</Polish>
<French>Bande 6.5mm 200Rnd Traçante IR-DIM</French>
<Spanish>Cinta de 200 balas trazadoras IR-DIM de 6.5mm</Spanish>
<Russian>Магазин из 200-т 6,5 мм ИК-трассирующих</Russian>
</Key>
<Key ID="STR_ACE_200Rnd_65x39_cased_Box_Tracer_DimNameShort">
<English>6.5mm IR-DIM</English>
<Polish>6,5mm IR-DIM</Polish>
<French>6.5mm IR-DIM</French>
<Spanish>6.5mm IR-DIM</Spanish>
<Russian>6,5 мм ИК-трассирующие</Russian>
</Key>
<Key ID="STR_ACE_200Rnd_65x39_cased_Box_Tracer_DimDescription">
<English>6.5mm 200Rnd Tracer IR-DIM Belt</English>
<Polish>Magazynek 6,5mm 200rd Smugacz IR-DIM</Polish>
<French>Bande 6.5mm 200Cps Traçante IR-DIM</French>
<Spanish>Cinta de 200 balas trazadoras IR-DIM de 6.5mm</Spanish>
<Russian>Магазин из 200-т 6,5 мм ИК-трассирующих</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_556x45_Stanag_Mk262_mag_Name">
<English>5.56mm 30Rnd Mag (Mk262)</English>
<Polish>Magazynek 5,56mm 30rd Mk262</Polish>
<French>5.56mm 30Cps (Mk262)</French>
<Spanish>Cargador de 30 balas de 5.56mm (Mk262)</Spanish>
<Russian>Магазин из 30-ти 5.56 мм Mk262</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_556x45_Stanag_Mk262_mag_NameShort">
<English>5.56mm Mk262</English>
<Polish>5,56mm Mk262</Polish>
<French>5.56mm Mk262</French>
<Spanish>5.56mm (Mk262)</Spanish>
<Russian>5,56 мм Mk262</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_556x45_Stanag_Mk262_mag_Description">
<English>Caliber: 5.56x45 mm NATO (Mk262)&lt;br /&gt;Rounds: 30</English>
<Polish>Kaliber: 5,56x45 mm NATO (Mk262)&lt;br /&gt;Pociski: 30</Polish>
<French>Calibre: 5.56x45 mm NATO (Mk262)&lt;br /&gt;Cartouches: 30</French>
<Spanish>Calibre: 5.56x45 mm NATO (Mk262)&lt;br /&gt;Balas: 30</Spanish>
<Russian>Калибр: 5,56x45 мм NATO (Mk262)&lt;br /&gt;Патронов: 30</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_556x45_Stanag_Mk318_mag_Name">
<English>5.56mm 30Rnd Mag (Mk318)</English>
<Polish>Magazynek 5,56mm 30rd Mk318</Polish>
<French>5.56mm 30Cps (Mk318)</French>
<Spanish>Cargador de 30 balas de 5.56mm (Mk318)</Spanish>
<Russian>Магазин из 30-ти 5.56 мм Mk318</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_556x45_Stanag_Mk318_mag_NameShort">
<English>5.56mm Mk318</English>
<Polish>5,56mm Mk318</Polish>
<French>5.56mm Mk318</French>
<Spanish>5.56mm (Mk318)</Spanish>
<Russian>5.56 мм Mk318</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_556x45_Stanag_Mk318_mag_Description">
<English>Caliber: 5.56x45 mm NATO (Mk318)&lt;br /&gt;Rounds: 30</English>
<Polish>Kaliber: 5,56x45 mm NATO (Mk318)&lt;br /&gt;Pociski: 30</Polish>
<French>Calibre: 5.56x45 mm NATO (Mk318)&lt;br /&gt;Cartouches: 30</French>
<Spanish>Calibre: 5.56x45 mm NATO (Mk318)&lt;br /&gt;Balas: 30</Spanish>
<Russian>Калибр: 5,56x45 мм NATO (Mk318)&lt;br /&gt;Патронов: 30</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_762x51_M118LR_Mag_Name">
<English>7.62mm 10Rnd Mag (M118LR)</English>
<Polish>Magazynek 7,62mm 10rd (M118LR)</Polish>
<French>7.62mm 10Cps (M118LR)</French>
<Spanish>Cargador de 10 balas de 7.62mm (M118LR)</Spanish>
<Russian>Магазин из 10-ти 7,62 мм (M118LR)</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_762x51_M118LR_Mag_NameShort">
<English>7.62mm M118LR</English>
<Polish>7,62mm M118LR</Polish>
<French>7.62mm M118LR</French>
<Spanish>7.62mm (M118LR)</Spanish>
<Russian>7,62 мм M118LR</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_762x51_M118LR_Mag_Description">
<English>Caliber: 7.62x51 mm NATO (M118LR)&lt;br /&gt;Rounds: 10</English>
<Polish>Kaliber: 7,62x51 mm NATO (M118LR)&lt;br /&gt;Pociski: 10</Polish>
<French>Calibre: 7.62x51 mm NATO (M118LR)&lt;br /&gt;Cartouches: 10</French>
<Spanish>Calibre: 7.62x51 mm NATO (M118LR)&lt;br /&gt;Balas: 10</Spanish>
<Russian>Калибр: 7,62x51 мм NATO (M118LR)&lt;br /&gt;Патронов: 10</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_M118LR_Mag_Name">
<English>7.62mm 20Rnd Mag (M118LR)</English>
<Polish>Magazynek 7,62mm 20rd (M118LR)</Polish>
<French>7.62mm 20Cps (M118LR)</French>
<Spanish>Cargador de 20 balas de 7.62mm (M118LR)</Spanish>
<Russian>Магазин из 20-ти 7,62 мм (M118LR)</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_M118LR_Mag_NameShort">
<English>7.62mm M118LR</English>
<Polish>7,62mm M118LR</Polish>
<French>7.62mm M118LR</French>
<Spanish>7.62mm (M118LR)</Spanish>
<Russian>7,62 мм M118LR</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_M118LR_Mag_Description">
<English>Caliber: 7.62x51 mm NATO (M118LR)&lt;br /&gt;Rounds: 20</English>
<Polish>Kaliber: 7,62x51 mm NATO (M118LR)&lt;br /&gt;Pociski: 20</Polish>
<French>Calibre: 7.62x51 mm NATO (M118LR)&lt;br /&gt;Cartouches: 20</French>
<Spanish>Calibre: 7.62x51 mm NATO (M118LR)&lt;br /&gt;Balas: 20</Spanish>
<Russian>Калибр: 7,62x51 мм NATO (M118LR)&lt;br /&gt;Патронов: 20</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_762x51_Mk319_Mod_0_Mag_Name">
<English>7.62mm 10Rnd Mag (Mk319 Mod 0)</English>
<Polish>Magazynek 7,62mm 10rd (Mk319 Mod 0)</Polish>
<French>7.62mm 10Cps (Mk319 Mod 0)</French>
<Spanish>Cargador de 10 balas de 7.62mm (Mk319 Mod 0)</Spanish>
<Russian>Магазин из 10-ти 7,62 мм (Mk319 Mod 0)</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_762x51_Mk319_Mod_0_Mag_NameShort">
<English>7.62mm Mk319</English>
<Polish>7,62mm Mk319</Polish>
<French>7.62mm Mk319</French>
<Spanish>7.62mm Mk319</Spanish>
<Russian>7,62mm Mk319</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_762x51_Mk319_Mod_0_Mag_Description">
<English>Caliber: 7.62x51 mm NATO (Mk319 Mod 0)&lt;br /&gt;Rounds: 10</English>
<Polish>Kaliber: 7,62x51 mm NATO (Mk319 Mod 0)&lt;br /&gt;Pociski: 10</Polish>
<French>Calibre: 7.62x51 mm NATO (Mk319 Mod 0)&lt;br /&gt;Cartouches: 10</French>
<Spanish>Calibre: 7.62x51 mm NATO (Mk319 Mod 0)&lt;br /&gt;Balas: 10</Spanish>
<Russian>Калибр: 7,62x51 мм NATO (Mk319 Mod 0)&lt;br /&gt;Патронов: 10</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_Mk319_Mod_0_Mag_Name">
<English>7.62mm 20Rnd Mag (Mk319 Mod 0)</English>
<Polish>Magazynek 7,62mm 20rd (Mk319 Mod 0)</Polish>
<French>7.62mm 20Cps (Mk319 Mod 0)</French>
<Spanish>Cargador de 20 balas de 7.62mm (Mk319 Mod 0)</Spanish>
<Russian>Магазин из 20-ти 7,62 мм (Mk319 Mod 0)</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_Mk319_Mod_0_Mag_NameShort">
<English>7.62mm Mk319</English>
<Polish>7,62mm Mk319</Polish>
<French>7.62mm Mk319</French>
<Spanish>7.62mm Mk319</Spanish>
<Russian>7,62 мм Mk319</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_Mk319_Mod_0_Mag_Description">
<English>Caliber: 7.62x51 mm NATO (Mk319 Mod 0)&lt;br /&gt;Rounds: 20</English>
<Polish>Kaliber: 7,62x51 mm NATO (Mk319 Mod 0)&lt;br /&gt;Pociski: 20</Polish>
<French>Calibre: 7.62x51 mm NATO (Mk319 Mod 0)&lt;br /&gt;Cartouches: 20</French>
<Spanish>Calibre: 7.62x51 mm NATO (Mk319 Mod 0)&lt;br /&gt;Balas: 20</Spanish>
<Russian>Калибр: 7,62x51 мм NATO (Mk319 Mod 0)&lt;br /&gt;Патронов: 20</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x67_Mk248_Mod_0_Mag_Name">
<English>7.62mm 20Rnd Mag (Mk248 Mod 0)</English>
<Polish>Magazynek 7,62mm 20rd (Mk248 Mod 0)</Polish>
<French>7.62mm 20Cps (Mk248 Mod 0)</French>
<Spanish>Cargador de 20 balas de 7.62mm (Mk248 Mod 0)</Spanish>
<Russian>Магазин из 20-ти 7,62 мм (Mk248 Mod 0)</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x67_Mk248_Mod_0_Mag_NameShort">
<English>7.62mm (Mk248 Mod 0)</English>
<Polish>7,62mm (Mk248 Mod 0)</Polish>
<French>7.62mm (Mk248 Mod 0)</French>
<Spanish>7.62mm (Mk248 Mod 0)</Spanish>
<Russian>7,62 мм (Mk248 Mod 0)</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x67_Mk248_Mod_0_Mag_Description">
<English>Caliber: 7.62x67 mm NATO (Mk248 Mod 0)&lt;br /&gt;Rounds: 20</English>
<Polish>Kaliber: 7,62x67 mm NATO (Mk248 Mod 0)&lt;br /&gt;Pociski: 20</Polish>
<French>Calibre: 7.62x67mm NATO (Mk248 Mod 0)&lt;br /&gt;Cartouches: 20</French>
<Spanish>Calibre: 7.62x67 mm NATO (Mk248 Mod 0)&lt;br /&gt;Balas: 20</Spanish>
<Russian>Калибр: 7,62x67 мм NATO (Mk248 Mod 0)&lt;br /&gt;Патронов: 20</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x67_Mk248_Mod_1_Mag_Name">
<English>7.62mm 20Rnd Mag (Mk248 Mod 1)</English>
<Polish>Magazynek 7,62mm 20rd (Mk248 Mod 1)</Polish>
<French>7.62mm 20Cps (Mk248 Mod 1)</French>
<Spanish>Cargador de 20 balas de 7.62mm (Mk248 Mod 1)</Spanish>
<Russian>Магазин из 20-ти 7,62 мм (Mk248 Mod 1)</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x67_Mk248_Mod_1_Mag_NameShort">
<English>7.62mm (Mk248 Mod 1)</English>
<Polish>7,62mm (Mk248 Mod 1)</Polish>
<French>7.62mm (Mk248 Mod 1)</French>
<Spanish>7.62mm (Mk248 Mod 1)</Spanish>
<Russian>7,62 мм (Mk248 Mod 1)</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x67_Mk248_Mod_1_Mag_Description">
<English>Caliber: 7.62x67 mm NATO (Mk248 Mod 1)&lt;br /&gt;Rounds: 20</English>
<Polish>Kaliber: 7,62x67 mm NATO (Mk248 Mod 1)&lt;br /&gt;Pociski: 20</Polish>
<French>Calibre: 7.62x67mm NATO (Mk248 Mod 1)&lt;br /&gt;Cartouches: 20</French>
<Spanish>Calibre: 7.62x67 mm NATO (Mk248 Mod 1)&lt;br /&gt;Balas: 20</Spanish>
<Russian>Калибр: 7,62x67 мм NATO (Mk248 Mod 1)&lt;br /&gt;Патронов: 20</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x67_Berger_Hybrid_OTM_Mag_Name">
<English>7.62mm 20Rnd Mag (Berger Hybrid OTM)</English>
<Polish>Magazynek 7,62mm 20rd (Berger Hybrid OTM)</Polish>
<French>7.62 20Cps (Berger Hybrid OTM)</French>
<Spanish>Cargador de 20 balas de 7.62mm (Berger Hybrid OTM)</Spanish>
<Russian>Магазин из 20-ти 7,62 мм (Berger Hybrid OTM)</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x67_Berger_Hybrid_OTM_Mag_NameShort">
<English>7.62mm (OTM)</English>
<Polish>7,62mm (OTM)</Polish>
<French>7.62mm (OTM)</French>
<Spanish>7.62mm (OTM)</Spanish>
<Russian>7,62 мм (OTM)</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x67_Berger_Hybrid_OTM_Mag_Description">
<English>Caliber: 7.62x67 mm NATO (Berger Hybrid OTM)&lt;br /&gt;Rounds: 20</English>
<Polish>Kaliber: 7,62x67 mm NATO (Berger Hybrid OTM)&lt;br /&gt;Pociski: 20</Polish>
<French>Calibre: 7.62x67mm NATO (Berger Hybrid OTM)&lt;br /&gt;Cartouches: 20</French>
<Spanish>Calibre: 7.62x67 mm NATO (Berger Hybrid OTM)&lt;br /&gt;Balas: 20</Spanish>
<Russian>Калибр: 7,62x67 мм NATO (Berger Hybrid OTM)&lt;br /&gt;Патронов: 20</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_65x47_Scenar_mag_Name">
<English>6.5x47mm 30Rnd Mag (HPBT Scenar)</English>
<French>6.5x47mm 30Cps (HPBT Scenar)</French>
<Spanish>Cargador de 30 balas de 6.5x47mm (HPBT Scenar)</Spanish>
<Polish>Magazynek 6,5x47 mm 30rd (HPBT Scenar)</Polish>
<Russian>Магазин из 30-ти 6,5x47 мм (HPBT Scenar)</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_65x47_Scenar_mag_NameShort">
<English>6.5mm Scenar</English>
<French>6.5mm Scenar</French>
<Spanish>6.5mm Scenar</Spanish>
<Polish>6,5mm Scenar</Polish>
<Russian>6,5 мм Scenar</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_65x47_Scenar_mag_Description">
<English>Caliber: 6.5x47mm (HPBT Scenar)&lt;br /&gt;Rounds: 30</English>
<French>Calibre: 6.5x47mm (HPBT Scenar)&lt;br /&gt;Cartouches: 30</French>
<Spanish>Calibre: 6.5x47mm (HPBT Scenar)&lt;br /&gt;Balas: 30</Spanish>
<Polish>Kaliber: 6,5x47 mm (HPBT Scenar)&lt;br /&gt;Pociski: 30</Polish>
<Russian>Калибр: 6,5x47 мм (HPBT Scenar)&lt;br /&gt;Патронов: 30</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_338_300gr_HPBT_Mag_Name">
<English>.338 10Rnd Mag (300gr Sierra MatchKing HPBT)</English>
<French>.338 10 Cps (300gr Sierra MatchKing HPBT)</French>
<Spanish>Cargador de 10 balas de 8.6x70mm (300gr Sierra MatchKing HPBT)</Spanish>
<Polish>Magazynek .338 10rd (300gr Sierra MatchKing HPBT)</Polish>
<Russian>Магазин из 10-ти .338 (300 гран Sierra MatchKing HPBT)</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_338_300gr_HPBT_Mag_NameShort">
<English>.338 (HPBT)</English>
<French>.338 (HPBT)</French>
<Spanish>.338 (HPBT)</Spanish>
<Polish>.338 (HPBT)</Polish>
<Russian>.338 (HPBT)</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_338_300gr_HPBT_Mag_Description">
<English>Caliber: 8.6x70mm (300gr Sierra MatchKing HPBT)&lt;br /&gt;Rounds: 10</English>
<French>Calibre: 8.6x70mm (300gr Sierra MatchKing HPBT)&lt;br /&gt;Cartouches: 10</French>
<Spanish>Calibre: 8.6x70mm (300gr Sierra MatchKing HPBT)&lt;br /&gt;Balas: 10</Spanish>
<Polish>Kaliber: 8,6x70 mm (300gr Sierra MatchKing HPBT)&lt;br /&gt;Pociski: 10</Polish>
<Russian>Калибр: .338 (300 гран Sierra MatchKing HPBT)&lt;br /&gt;Патронов: 10</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_338_API526_Mag_Name">
<English>.338 10Rnd Mag (API526)</English>
<French>.338 10Cps (API526)</French>
<Spanish>Cargador de 10 balas de .338 (API526)</Spanish>
<Polish>Magazynek .338 10rd (API526)</Polish>
<Russian>Магазин из 10-ти .338 (API526)</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_338_API526_Mag_NameShort">
<English>.338 AP</English>
<French>.338 AP</French>
<Spanish>.338 AP</Spanish>
<Polish>.338 AP</Polish>
<Russian>.338 бронебойные</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_338_API526_Mag_Description">
<English>Caliber: 8.6x70mm (API526)&lt;br /&gt;Rounds: 10</English>
<French>Calibre: 8.6x70mm (API526)&lt;br /&gt;Cartouches: 10</French>
<Spanish>Calibre: 8.6x70mm (API526)&lt;br /&gt;Balas: 10</Spanish>
<Polish>Kaliber: 8,6x70 mm (API526)&lt;br /&gt;Pociski: 10</Polish>
<Russian>Калибр: .338 (API526)&lt;br /&gt;Патронов: 10</Russian>
</Key>
<Key ID="STR_ACE_5Rnd_127x99_Mag_Name">
<English>12.7x99mm 5Rnd Mag</English>
<French>12.7x99mm 5Cps</French>
<Spanish>Cargador de 5 balas de 12.7x99mm</Spanish>
<Polish>Magazynek 12,7x99 mm 5rd</Polish>
<Russian>Магазин из 5-ти 12,7x99 мм</Russian>
</Key>
<Key ID="STR_ACE_5Rnd_127x99_Mag_NameShort">
<English>12.7mm</English>
<French>12.7mm</French>
<Spanish>12.7mm</Spanish>
<Polish>12,7mm</Polish>
<Russian>12,7 мм</Russian>
</Key>
<Key ID="STR_ACE_5Rnd_127x99_Mag_Description">
<English>Caliber: 12.7x99mm&lt;br /&gt;Rounds: 5</English>
<French>Calibre: 12.7x99mm&lt;br /&gt;Cartouches: 5</French>
<Spanish>Calibre: 12.7x99mm&lt;br /&gt;Balas: 5</Spanish>
<Polish>Kaliber: 12,7x99 mm&lt;br /&gt;Pociski: 5</Polish>
<Russian>Калибр: 12,7x99 мм&lt;br /&gt;Патронов: 5</Russian>
</Key>
<Key ID="STR_ACE_5Rnd_127x99_AMAX_Mag_Name">
<English>12.7x99mm 5Rnd Mag (AMAX)</English>
<French>12.7x99mm 5Rnd Mag (AMAX)</French>
<Spanish>Cargador de 5 balas de 12.7x99mm (AMAX)</Spanish>
<Polish>Magazynek 12,7x99 mm 5rd (AMAX)</Polish>
<Russian>Магазин из 5-ти 12,7x99 мм (A-MAX)</Russian>
</Key>
<Key ID="STR_ACE_5Rnd_127x99_AMAX_Mag_NameShort">
<English>12.7mm</English>
<French>12.7mm</French>
<Spanish>12.7mm</Spanish>
<Polish>12,7mm</Polish>
<Russian>12,7 мм</Russian>
</Key>
<Key ID="STR_ACE_5Rnd_127x99_AMAX_Mag_Description">
<English>Caliber: 12.7x99mm (AMAX)&lt;br /&gt;Rounds: 5</English>
<French>Calibre: 12.7x99mm (AMAX)&lt;br /&gt;Cartouches: 5</French>
<Spanish>Calibre: 12.7x99mm (AMAX)&lt;br /&gt;Balas: 5</Spanish>
<Polish>Kaliber: 12,7x99 mm (AMAX)&lt;br /&gt;Pociski: 5</Polish>
<Russian>Калибр: 12,7x99 мм (A-MAX)&lt;br /&gt;Патронов: 5</Russian>
</Key>
</Package>
</Project>
</Project>

View File

@ -6,7 +6,7 @@
<German>Gefangen nehmen</German>
<Spanish>Tomar prisionero</Spanish>
<French>Capturer le prisonnier</French>
<Polish>Weź więźnia</Polish>
<Polish>Aresztuj</Polish>
<Czech>Zajmout Osobu</Czech>
<Italian>Arresta il Prigioniero</Italian>
<Portuguese>Tomar Prisioneiro</Portuguese>
@ -53,7 +53,7 @@
<English>You need to take him as prisoner first!</English>
<German>Du musst ihn zuerst gefangen nehmen.</German>
<Spanish>Necesitas hacerle prisionero primero!</Spanish>
<Polish>Najpierw musisz wziąć go jako więźnia!</Polish>
<Polish>Najpierw musisz go aresztować!</Polish>
<French>Vous devez d'abord le capturer!</French>
<Czech>Musíš ho nejdříve zajmout!</Czech>
<Italian>Prima devi arrestarlo!</Italian>
@ -134,7 +134,7 @@
</Key>
<Key ID="STR_ACE_Captives_StartSurrendering">
<English>Surrender</English>
<French>Capituler</French>
<French>Se rendre</French>
<German>Kapitulieren</German>
<Spanish>Rendirse</Spanish>
<Czech>Vzdát se</Czech>
@ -156,7 +156,7 @@
</Key>
<Key ID="STR_ACE_Captives_Zeus_OnlyAlive">
<English>Only use on alive units</English>
<French>Utiliser uniquement sur unité vivante</French>
<French>Utiliser uniquement sur une unité vivante</French>
<German>Nur bei lebenden Einheiten verwendbar</German>
<Spanish>Utilizar solo en unidades vivas</Spanish>
<Czech>Použitelné jen na živé jednotky</Czech>
@ -167,7 +167,7 @@
</Key>
<Key ID="STR_ACE_Captives_Zeus_OnlyInfantry">
<English>Only use on dismounted inf</English>
<French>Utiliser uniquement sur personnel à pied</French>
<French>Utiliser uniquement sur du personnel à pied</French>
<German>Nur bei abgesessener Infanterie verwendbar</German>
<Spanish>Utilizar solo en infanteria desmontada</Spanish>
<Czech>Použitelné jen na pěsích jednotkách</Czech>
@ -178,7 +178,7 @@
</Key>
<Key ID="STR_ACE_Captives_Zeus_NothingSelected">
<English>Nothing under mouse</English>
<French>Rien sous la souris</French>
<French>Rien sous le curseur</French>
<German>Es wurde nichts ausgewählt</German>
<Spanish>Nada bajo el ratón</Spanish>
<Czech>Nic není vybráno</Czech>

View File

@ -4,6 +4,7 @@
// Load settings from profile
if (hasInterface) then {
call FUNC(loadSettingsFromProfile);
call FUNC(loadSettingsLocalizedText);
};
// Listens for global "SettingChanged" events, to update the force status locally
@ -65,9 +66,31 @@ if (_currentVersion != _previousVersion) then {
0 spawn COMPILE_FILE(scripts\Version\checkVersionNumber);
// ACE events
"ACEg" addPublicVariableEventHandler { _this call FUNC(_handleNetEvent); };
"ACEc" addPublicVariableEventHandler { _this call FUNC(_handleNetEvent); };
// Synced ACE events
// Handle JIP scenario
if(!isServer) then {
["PlayerJip", {
diag_log text format["[ACE] * JIP event synchronization initialized"];
["SEH_all", [player]] call FUNC(serverEvent);
}] call FUNC(addEventHandler);
} else {
["SEH_all", FUNC(_handleRequestAllSyncedEvents)] call FUNC(addEventHandler);
};
["SEH", FUNC(_handleSyncedEvent)] call FUNC(addEventHandler);
["SEH_s", FUNC(_handleRequestSyncedEvent)] call FUNC(addEventHandler);
[FUNC(syncedEventPFH), 0.5, []] call cba_fnc_addPerFrameHandler;
/***************************************************************/
/***************************************************************/
/***************************************************************/
/***************************************************************/
/***************************************************************/
// everything that only player controlled machines need, goes below this
if (!hasInterface) exitWith {};
@ -87,7 +110,7 @@ enableCamShake true;
// Set the name for the current player
["playerChanged", {
EXPLODE_2_PVT(_this,_newPlayer,_oldPlayer);
if (alive _newPlayer) then {
[_newPlayer] call FUNC(setName)
};
@ -107,7 +130,6 @@ GVAR(OldPlayerWeapon) = currentWeapon ACE_player;
// PFH to raise varios events
[{
// "playerInventoryChanged" event
_newPlayerInventory = [ACE_player] call FUNC(getAllGear);
if !(_newPlayerInventory isEqualTo GVAR(OldPlayerInventory)) then {
@ -174,6 +196,31 @@ GVAR(OldPlayerWeapon) = currentWeapon ACE_player;
}, 0, []] call cba_fnc_addPerFrameHandler;
// PFH to raise camera created event. Only works on these cams by BI.
#define ALL_CAMERAS [ \
missionNamespace getVariable ["BIS_DEBUG_CAM", objNull], \
missionNamespace getVariable ["BIS_fnc_camera_cam", objNull], \
uiNamespace getVariable ["BIS_fnc_arsenal_cam", objNull], \
uiNamespace getVariable ["BIS_fnc_animViewer_cam", objNull], \
missionNamespace getVariable ["BIS_fnc_establishingShot_fakeUAV", objNull] \
]
GVAR(OldIsCamera) = false;
[{
// "activeCameraChanged" event
_isCamera = {!isNull _x} count ALL_CAMERAS > 0;
if !(_isCamera isEqualTo GVAR(OldIsCamera)) then {
// Raise ACE event locally
GVAR(OldIsCamera) = _isCamera;
["activeCameraChanged", [ACE_player, _isCamera]] call FUNC(localEvent);
};
}, 1, []] call cba_fnc_addPerFrameHandler; // feel free to decrease the sleep time if you need it.
[QGVAR(StateArrested),false,true,QUOTE(ADDON)] call FUNC(defineVariable);
["displayTextStructured", FUNC(displayTextStructured)] call FUNC(addEventhandler);
@ -189,6 +236,18 @@ GVAR(OldPlayerWeapon) = currentWeapon ACE_player;
{!((_this select 0) isEqualTo (_this select 1)) && {vehicle (_this select 0) == vehicle (_this select 1)}}
}] call FUNC(addCanInteractWithCondition);
// Lastly, do JIP events
// JIP Detection and event trigger. Run this at the very end, just in case anything uses it
if(isMultiplayer && { time > 0 || isNull player } ) then {
// We are jipping! Get ready and wait, and throw the event
[{
if(!(isNull player)) then {
["PlayerJip", [player] ] call FUNC(localEvent);
[(_this select 1)] call cba_fnc_removePerFrameHandler;
};
}, 0, []] call cba_fnc_addPerFrameHandler;
};
// check dlls
{
if (_x callExtension "version" == "") then {
@ -198,4 +257,4 @@ GVAR(OldPlayerWeapon) = currentWeapon ACE_player;
diag_log text format ["[ACE] ERROR: %1", _errorMsg];
["[ACE] ERROR", _errorMsg, {findDisplay 46 closeDisplay 0}] call FUNC(errorMessage);
};
} forEach ["ace_breakLine", "ace_advanced_ballistics", "ace_fcs"];
} forEach ACE_DLLS;

View File

@ -120,6 +120,7 @@ PREP(loadPerson);
PREP(loadPersonLocal);
PREP(loadSettingsFromProfile);
PREP(loadSettingsOnServer);
PREP(loadSettingsLocalizedText);
PREP(map);
PREP(moduleCheckPBOs);
PREP(moduleLSDVehicles);
@ -270,6 +271,21 @@ PREP(hashListSelect);
PREP(hashListSet);
PREP(hashListPush);
// Synchronized Events
PREP(syncedEventPFH);
PREP(addSyncedEventHandler);
PREP(removeSyncedEventHandler);
PREP(requestSyncedEvent);
PREP(syncedEvent);
PREP(_handleSyncedEvent);
PREP(_handleRequestSyncedEvent);
PREP(_handleRequestAllSyncedEvents);
GVAR(syncedEvents) = HASH_CREATE;
// @TODO: Generic local-managed global-synced objects (createVehicleLocal)
//Debug
ACE_COUNTERS = [];

View File

@ -0,0 +1,25 @@
/*
* Author: jaynus
*
* Handles a server-side request for synchronization ALL events on JIP to a client.
*
* Argument:
* 0: client (object)
*
* Return value:
* Boolean of success
*/
//#define DEBUG_MODE_FULL
#include "script_component.hpp"
PARAMS_1(_client);
{
private["_eventName", "_eventEntry", "_eventLog"];
_eventName = _x;
_eventEntry = HASH_GET(GVAR(syncedEvents),_eventName);
_eventLog = _eventEntry select 1;
["SEH_s", _client, [_eventName, _eventLog] ] call FUNC(targetEvent);
} forEach (GVAR(syncedEvents) select 0);
true

View File

@ -0,0 +1,45 @@
/*
* Author: jaynus
*
* Receives either requests for synchronization from clients, or the synchronization data from the server.
*
* Arguments [Client] :
* 0: eventName (String)
* 1: eventLog (Array)
*
* Arguments [Server] :
* 0: eventName (String)
* 1: client (Object)
*
* Return value:
* Boolean of success
*/
//#define DEBUG_MODE_FULL
#include "script_component.hpp"
//SEH_s
if(isServer) then {
// Find the event name, and shovel out the events to the client
PARAMS_2(_eventName,_client);
private["_eventEntry", "_eventLog"];
if(!HASH_HASKEY(GVAR(syncedEvents),_eventName)) exitWith {
diag_log text format["[ACE] Error, request for synced event - key not found."];
false
};
_eventEntry = HASH_GET(GVAR(syncedEvents),_eventName);
_eventLog = _eventEntry select 1;
["SEH_s", _client, [_eventName, _eventLog] ] call FUNC(targetEvent);
} else {
PARAMS_2(_eventName,_eventLog);
// This is the client handling the response from the server
// Start running the events
{
_eventArgs = _x select 1;
[_eventName, _eventArgs, (_x select 2)] call FUNC(_handleSyncedEvent);
} forEach _eventLog;
diag_log text format["[ACE] + [%1] synchronized", _eventName];
};
true

View File

@ -0,0 +1,36 @@
/*
* Author: jaynus
*
* Handles synced events being received. Server will log them, and server/client will execute them.
*
* Arguments [Client] :
* 0: eventName (String)
* 1: arguments (Array)
* 2: ttl (Scalar)
*
* Return value:
* Boolean of success
*/
//#define DEBUG_MODE_FULL
#include "script_component.hpp"
PARAMS_3(_name,_args,_ttl);
private["_internalData", "_eventLog", "_eventCode"];
if(!HASH_HASKEY(GVAR(syncedEvents),_name)) exitWith {
diag_log text format["[ACE] Error, synced event key not found."];
false
};
_internalData = HASH_GET(GVAR(syncedEvents),_name);
if(isServer) then {
// Server needs to internally log it for synchronization
if(_ttl > -1) then {
_internalData = HASH_GET(GVAR(syncedEvents),_name);
_eventLog = _internalData select 1;
_eventLog pushback [diag_tickTime, _args, _ttl];
};
};
_eventCode = _internalData select 0;
_args call _eventCode;

View File

@ -0,0 +1,32 @@
/*
* Author: jaynus
*
* Register an event handler for an ACE synced event
*
* Argument:
* 0: Name (String)
* 1: Handler (Code)
* 2: TTL (Number or Code) [Optional]
*
* Return value:
* Boolean of success
*/
//#define DEBUG_MODE_FULL
#include "script_component.hpp"
PARAMS_2(_name,_handler);
private["_ttl", "_eventId", "_data"];
if( (count _this) > 2) then {
_ttl = _this select 2;
} else {
_ttl = 0;
};
if(HASH_HASKEY(GVAR(syncedEvents),_name)) exitWith {
diag_log text format["[ACE] Error, duplicate synced event creation."];
false
};
_eventId = [_name, FUNC(_handleSyncedEvent)] call FUNC(addEventHandler);
_data = [_handler,[],_ttl,_eventId];
HASH_SET(GVAR(syncedEvents),_name,_data);

View File

@ -13,6 +13,8 @@
*/
#include "script_component.hpp"
private ["_name", "_isClientSetable", "_isForced", "_profileValue"];
// Iterate through settings
{
_name = _x select 0;
@ -34,4 +36,5 @@
};
};
};
} forEach GVAR(settings);

View File

@ -0,0 +1,48 @@
/*
* Author: Glowbal
* Parse all settings and load the localized displayName and description for all text
*
* Arguments:
* None
*
* Return Value:
* None
*
* Public: No
*/
#include "script_component.hpp"
private ["_parseConfigForDisplayNames", "_name"];
_parseConfigForDisplayNames = {
private "_optionEntry";
_optionEntry = _this select 0;
if !(isClass _optionEntry) exitwith {false};
_x set [3, getText (_optionEntry >> "displayName")];
_x set [4, getText (_optionEntry >> "description")];
private "_values";
_values = _x select 5;
{
private "_text";
_text = _x;
if (((typeName _text) == "STRING") && {(count _text) > 1} && {(_text select [0,1]) == "$"}) then {
_text = localize (_text select [1, ((count _text) - 1)]); //chop off the leading $
_values set [_forEachIndex, _text];
};
} forEach _values;
true;
};
// Iterate through settings
{
_name = _x select 0;
if !([configFile >> "ACE_Settings" >> _name] call _parseConfigForDisplayNames) then {
if !([configFile >> "ACE_ServerSettings" >> _name] call _parseConfigForDisplayNames) then {
[missionConfigFile >> "ACE_Settings" >> _name] call _parseConfigForDisplayNames;
};
};
} forEach GVAR(settings);

View File

@ -0,0 +1,24 @@
/*
* Author: jaynus
*
* Remove a synced event handler
*
* Argument:
* 0: Name (String)
*
* Return value:
* Boolean of success
*/
#include "script_component.hpp"
PARAMS_1(_name);
if(!HASH_HASKEY(GVAR(syncedEvents),_name)) exitWith {
diag_log text format["[ACE] Error, synced event key not found."];
false
};
_data = HASH_GET(GVAR(syncedEvents),_name);
_eventId = _data select 3;
[_eventId] call ace_common_fnc_removeEventHandler;
HASH_REM(GVAR(syncedEvents),_name);

View File

@ -0,0 +1,19 @@
/*
* Author: jaynus
*
* Send a request to synchronize an event name from the client->server. Execute on client only.
*
* Argument:
* 0: eventName (String)
*
* Return value:
* Boolean of success
*/
//#define DEBUG_MODE_FULL
#include "script_component.hpp"
PARAMS_1(_eventName);
// Only JIP machines on initialization send this off, requesting sync on events with the serverCommand
if(isServer) exitWith { false };
["SEH_s", [_eventName, ACE_player] ] call ace_common_fnc_serverEvent;

View File

@ -76,6 +76,18 @@ if (isNil _name) then {
_value
];
//Strings in the values array won't be localized from the config, so just do that now:
/*private "_values";
_values = _settingData select 5;
{
_text = _x;
if (((typeName _text) == "STRING") && {(count _text) > 1} && {(_text select [0,1]) == "$"}) then {
_text = localize (_text select [1, ((count _text) - 1)]); //chop off the leading $
_values set [_forEachIndex, _text];
};
} forEach _values;*/
GVAR(settings) pushBack _settingData;
} else {

View File

@ -0,0 +1,31 @@
/*
* Author: jaynus
*
* Call and propegate a synced event
*
* Argument:
* 0: Name (String)
* 1: Arguments (Array)
* 2: TTL (Number or Code) [Optional] for this specific event call
*
* Return value:
* Boolean of success
*/
//#define DEBUG_MODE_FULL
#include "script_component.hpp"
PARAMS_2(_name,_args);
private["_ttl", "_eventData", "_internalData", "_eventLog"];
if( (count _this) > 2) then {
_ttl = _this select 2;
} else {
_ttl = 0;
};
if(!HASH_HASKEY(GVAR(syncedEvents),_name)) exitWith {
diag_log text format["[ACE] Error, synced event key not found."];
false
};
_eventData = [_name, _args,_ttl];
["SEH", _eventData] call FUNC(globalEvent);

View File

@ -0,0 +1,52 @@
//#define DEBUG_MODE_FULL
#include "script_component.hpp"
if(!isServer) exitWith { false };
// Walk through the local synced events and clean up anything thats already EOL
// @TODO: This should be iteration limited to prevent FPS lag
private["_data"];
{
private["_data", "_ttl", "_eventLog", "_newEventLog", "_name"];
_name = _x;
_data = HASH_GET(GVAR(syncedEvents),_name);
_eventLog = _data select 1;
_globalEventTTL = _data select 2;
_newEventLog = [];
// @TODO: This should be iteration limited to prevent FPS lag
{
private["_eventEntry", "_ttlReturn"];
_eventEntry = _x;
_ttlReturn = true;
if(typeName _globalEventTTL == "CODE") then {
_ttlReturn = [(_data select 0),_eventEntry] call _globalEventTTL;
} else {
_ttlReturn = call { _globalEventTTL < 1 || {diag_tickTime < (_eventEntry select 0) + _globalEventTTL} };
};
if(_ttlReturn) then {
// Do event based TTL check
private["_eventTTL"];
_eventTTL = _eventEntry select 2;
if(typeName _eventTTL == "CODE") then {
_ttlReturn = [(_data select 0),_eventEntry] call _eventTTL;
} else {
_ttlReturn = call { _eventTTL < 1 || {diag_tickTime < (_eventEntry select 0) + _eventTTL} };
};
};
// Finally drop it if the TTL check fails
if(_ttlReturn) then {
_newEventLog pushBack _x;
};
} forEach _eventLog;
_data set[1, _newEventLog];
} forEach (GVAR(syncedEvents) select 0);
// @TODO: Next, detect if we had a new request from a JIP player, and we need to continue syncing events

View File

@ -40,12 +40,13 @@ if (true) then {
{
_ppos = worldToScreen (_object modelToWorld _x);
_pposX = _ppos select 0;
_pposY = _ppos select 1;
if (_pposX < _minX) then {_minX = _pposX};
if (_pposX > _maxX) then {_maxX = _pposX};
if (_pposY < _minY) then {_minY = _pposY};
if (_pposY > _maxY) then {_maxY = _pposY};
if (count _ppos >= 2) then {
EXPLODE_2_PVT(_ppos,_pposX,_pposY);
if (_pposX < _minX) then {_minX = _pposX};
if (_pposX > _maxX) then {_maxX = _pposX};
if (_pposY < _minY) then {_minY = _pposY};
if (_pposY > _maxY) then {_maxY = _pposY};
}; //else - what to do if it is offscreen?
} forEach _boundsCorners;
};

View File

@ -12,3 +12,5 @@
#endif
#include "\z\ace\addons\main\script_macros.hpp"
#define ACE_DLLS ["ace_breakLine","ace_advanced_ballistics","ace_fcs"]

View File

@ -272,7 +272,7 @@
<Spanish>Desactivar menú de mando</Spanish>
<Polish>Wyłącz menu dowodzenia</Polish>
<Czech>Vypnout velící menu</Czech>
<French>Désactiver Menu Commande</French>
<French>Désactiver menu commande</French>
<Russian>Выключить командное меню</Russian>
<Hungarian>Parancsnoki menü kikapcsolása</Hungarian>
<Italian>Disabilita Menù di comando</Italian>
@ -329,7 +329,7 @@
<Italian>Accetta le richieste degli altri giocatori. Queste possono riguardare l'uso o la condivisione dell'equipaggiamento, o di determinate azioni.</Italian>
<Czech>Přijimutí žádosti poslané jinými hráči. Mohou to být žádosti k použítí/sdílení vybavení nebo k vykonání určité činnosti.</Czech>
<Russian>Принять запросы, отправленные другими игроками. Например, запросы на использование/совместное использование снаряжения, выполнение определенных действий</Russian>
<French>Accepter les requêtes d'autres joueurs. Comme l'utilisation / l'échange d'équipement, la réalistion d'actions.</French>
<French>Accepter les requêtes d'autres joueurs. Comme l'utilisation / l'échange d'équipement, la réalisation d'actions.</French>
<Hungarian>Más játékosok általi kérések elfogadása. Ezek a kérések vonatkozhatnak a felszerelés használatára/megosztására, valamint különböző cselekményekre.</Hungarian>
</Key>
<Key ID="STR_ACE_ACTION_DECLINE_REQUEST_KEY_TOOLTIP">
@ -340,7 +340,7 @@
<Italian>Rifiuta le richieste degli altri giocatori. Queste possono riguardare l'uso o la condivisione dell'equipaggiamento, o di determinate azioni.</Italian>
<Czech>Zamítnutí žádostii poslané jinými hráči. Mohou to být žádosti k použítí/sdílení vybavení nebo k vykonání určité činnosti.</Czech>
<Russian>Отклонить запросы, отправленные другими игроками. Например, запросы на использование/совместное использование снаряжения, выполнение определенных действий</Russian>
<French>Rejeter les requêtes d'autres joueurs. Comme l'utilisation / l'échange d'équipement, la réalistion d'actions.</French>
<French>Rejeter les requêtes d'autres joueurs. Comme l'utilisation / l'échange d'équipement, la réalisation d'actions.</French>
<Hungarian>Más játékosok általi kérések elutasítása. Ezek a kérések vonatkozhatnak a felszerelés használatára/megosztására, valamint különböző cselekményekre.</Hungarian>
</Key>
<Key ID="STR_ACE_Common_SettingFeedbackIconsName">
@ -383,7 +383,7 @@
<Italian>Modifica la posizione su schermo della barra di avanzamento.</Italian>
<Russian>Установите желаемое положение строки состояния на экране.</Russian>
<Polish>Ustaw pożądaną lokalizację paska postępu na ekranie</Polish>
<French>Appliquer la postion de la barre de progression sur l'écran</French>
<French>Appliquer la position de la barre de progression sur l'écran</French>
<Czech>Nastavuje pozici ukazetele průběhu činnosti na vaší obrazovce.</Czech>
<Hungarian>Itt beállítható az állapotjelző sáv képernyődön lévő helyzete.</Hungarian>
</Key>
@ -405,7 +405,7 @@
<Italian>Il colore di sfondo dei suggerimenti dell'ACE.</Italian>
<Russian>Цвет фона всплывающих подсказок АСЕ.</Russian>
<Polish>Kolor tła dla powiadomień ACE</Polish>
<French>Notifications ACE: couleur de l'arrière plan</French>
<French>Notification ACE: couleur de l'arrière plan</French>
<Czech>Barva pozadí ACE nápověd.</Czech>
<Hungarian>Az ACE-súgók hátterének színe.</Hungarian>
</Key>
@ -427,7 +427,7 @@
<Italian>Il colore del testo dei suggerimenti dell'ACE. Questo è il colore standard per tutti i caratteri mostrati dal sistema di suggerimenti dell'ACE, se questo non è altrimenti specificato.</Italian>
<Russian>Цвет шрифта текста всплывающих подсказок АСЕ. Этот цвет является стандартным для всего текста, транслирующегося через систему подсказок АСЕ, если не установлено другого цвета для текста подсказок.</Russian>
<Polish>Kolor tekstu dla powiadomień ACE. Ten kolor jest domyślnym dla wszystkich tekstów wyświetlanych poprzez System Powiadomień ACE, jeżeli dla powiadomienia nie określono innego koloru.</Polish>
<French>Notification ACE: couleur du texte. C'est la couleur par défaut de tout texte afficher dans les notifications ACE, si aucune couleur n'est spécifiée pour les notifications</French>
<French>Notification ACE: couleur du texte. C'est la couleur par défaut de tout texte affiché dans les notifications ACE, si aucune couleur n'est spécifiée pour les notifications</French>
<Czech>Barva fontu ACE nápověd. Toto je standardní barva pro všechen text zobrazovaný ACE nápovědami, pokud nemá nápověda žádnou specifikanou barvu.</Czech>
<Hungarian>Az ACE-súgók betűkészletének színek. Ez a szín alapértelmezett az összes szövegre az ACE-súgórendszerben, ha a súgószöveg maga nem ad meg más színt.</Hungarian>
</Key>
@ -454,4 +454,4 @@
<French>Une banane est un fruit qui, d'un point de vue botanique, fait partie du groupe des baies. Produite par plusieurs sortes de grandes plantes à fleurs herbacées du type Musa.</French>
</Key>
</Package>
</Project>
</Project>

View File

@ -9,6 +9,7 @@
<Spanish>Abrir inventario</Spanish>
<Russian>Открыть инвентарь</Russian>
<Italian>Apri l'inventario</Italian>
<French>Ouvrir l'inventaire</French>
</Key>
</Package>
</Project>
</Project>

View File

@ -0,0 +1,10 @@
// by commy2
// The Arma InventoryOpened EH fires actually before the inventory dialog is opened (findDisplay 602 => displayNull).
#include "script_component.hpp"
["inventoryDisplayLoaded",{
[ACE_player] call FUNC(takeLoadedATWeapon);
[ACE_player, (_this select 0)] call FUNC(updateInventoryDisplay);
}] call EFUNC(common,addEventHandler);

View File

@ -31,7 +31,7 @@
<Polish>Wstępnie załadowana atrapa pocisku</Polish>
<Spanish>Preloaded Missile Dummy</Spanish>
<Hungarian>Előtöltött műrakéta</Hungarian>
<Russian>Заряженная ракетная пустышка</Russian>
<Russian>Предзаряженная ракетная болванка</Russian>
<Italian>Missile stupido precaricato</Italian>
</Key>
</Package>

View File

@ -26,14 +26,14 @@
<Hungarian>Elengedés</Hungarian>
</Key>
<Key ID="STR_ACE_Dragging_UnableToDrag">
<English>Item to heavy</English>
<English>Item too heavy</English>
<German>Gegenstand ist zu schwer</German>
<Spanish>Articulo demasiado pesado</Spanish>
<Polish>Przedmiot zbyt ciężki</Polish>
<Polish>Przedmiot jest zbyt ciężki</Polish>
<French>Objet trop lourd</French>
<Portuguese>Não é possível carregar o item devido a seu peso</Portuguese>
<Italian>Non è possibile trascinare l'oggetto a causa del suo peso</Italian>
<Russian>Слишком тяжело</Russian>
<Russian>Предмет слишком тяжёлый</Russian>
<Czech>Moc težké</Czech>
<Hungarian>Az objektum túl nehéz</Hungarian>
</Key>

View File

@ -114,7 +114,7 @@
<German>Mobiltelefon</German>
<Spanish>Télefono móvil</Spanish>
<Polish>Telefon komórkowy</Polish>
<French>Téléphone Portable</French>
<French>Téléphone portable</French>
<Czech>Telefon</Czech>
<Italian>Cellulare</Italian>
<Hungarian>Mobiltelefon</Hungarian>
@ -203,7 +203,7 @@
<Italian>Consente la disattivazione degli ordigni esplosivi</Italian>
<Hungarian>Robbanóanyagok hatástalanítását teszi lehetővé</Hungarian>
<Portuguese>Permite o desarme de explosivos</Portuguese>
<Russian>Позволяет обезвреживать ВУ</Russian>
<Russian>Позволяет обезвреживать взрывчатку</Russian>
</Key>
<Key ID="STR_ACE_Explosives_Phone_AddToSpeedDial">
<English>Add to Speed Dial</English>
@ -215,7 +215,7 @@
<Italian>Aggiungi alla selezione rapida</Italian>
<Hungarian>Hozzáadás a gyorstárcsázóhoz</Hungarian>
<Portuguese>Adicionar à ligação rápida</Portuguese>
<Russian>Добавить в ускоренный набор</Russian>
<Russian>Добавить в быстрый вызов</Russian>
</Key>
<Key ID="STR_ACE_Explosives_Clear">
<English>Clear</English>
@ -233,7 +233,7 @@
<English>Dial</English>
<German>Wählen</German>
<Spanish>Marcar</Spanish>
<Polish>Wybierz mumer</Polish>
<Polish>Wybierz numer</Polish>
<French>Composer</French>
<Czech>Vytočit</Czech>
<Italian>Composizione numero</Italian>
@ -281,7 +281,7 @@
<English>Detonate Menu</English>
<German>"Zünden"-Menü</German>
<Spanish>Menú de detonación</Spanish>
<Polish>Menu detonowania</Polish>
<Polish>Menu detonacji</Polish>
<French>Menu de mise à feu</French>
<Czech>Menu Detonace</Czech>
<Italian>Menù di detonazione</Italian>
@ -294,12 +294,12 @@
<German>"Platzieren"-Menü</German>
<Spanish>Menú de colocación</Spanish>
<Polish>Menu umieszczania</Polish>
<French>Menu Placement</French>
<French>Menu placement</French>
<Czech>Menu Umístění</Czech>
<Italian>Menù di collocamento</Italian>
<Hungarian>Elhelyezési menü</Hungarian>
<Portuguese>Menu de posicionamento</Portuguese>
<Russian>Меню детонации</Russian>
<Russian>Меню установки</Russian>
</Key>
<Key ID="STR_ACE_Explosives_Defuse">
<English>Defuse</English>
@ -395,7 +395,7 @@
<Italian>Piastra a Pressione</Italian>
<Hungarian>Nyomólap</Hungarian>
<Portuguese>Placa de pressão</Portuguese>
<Russian>Давление</Russian>
<Russian>Нажимная плита</Russian>
</Key>
<Key ID="STR_ACE_Explosives_TripWire">
<English>Tripwire</English>
@ -443,19 +443,19 @@
<Italian>Sensore IR (Attacco laterale)</Italian>
<Hungarian>Infravörös szenzor (Side Attack)</Hungarian>
<Portuguese>Sensor infravermelho (ataque lateral)</Portuguese>
<Russian>ИК (детонация вбок)</Russian>
<Russian>ИК сенсор (детонация вбок)</Russian>
</Key>
<Key ID="STR_ACE_Explosives_SLAME_Magnetic">
<English>Magnetic Influence Sensor (Bottom Attack)</English>
<Polish>Czujnik magnetyczny (wybuch w górę)</Polish>
<Spanish>Sensor IM (ataque inferior)</Spanish>
<German>Magnetfeldsensor (Bodenangriff)</German>
<French>Capteur Magnétique (par le bas)</French>
<French>Capteur magnétique (par le bas)</French>
<Czech>Magnetický Senzor (Výbuch ze spoda)</Czech>
<Italian>Sensore Magnetico di Prossimità (Attacco inferiore)</Italian>
<Hungarian>Mágneses mező érzékelő (Bottom Attack)</Hungarian>
<Portuguese>Influência magnética (ataque inferior)</Portuguese>
<Russian>Магнитный (детонация вверх)</Russian>
<Russian>Магнитный сенсор (детонация вверх)</Russian>
</Key>
<Key ID="STR_ACE_Explosives_NoExplosivesAvailable">
<English>No explosives on trigger.</English>
@ -467,7 +467,7 @@
<Hungarian>Nincs robbanóanyag a gyújtóeszközhöz kötve.</Hungarian>
<Polish>Brak ładunków na zapalnik.</Polish>
<Portuguese>Nenhum explosivo no gatilho.</Portuguese>
<Russian>Нет доступных ВУ для взрывателя.</Russian>
<Russian>Взрыватель не подсоединён к взрывчатке</Russian>
</Key>
<Key ID="STR_ACE_Explosives_DeadManSwitch_displayName">
<English>Dead Man's Switch</English>
@ -477,14 +477,14 @@
<Polish>Czuwak</Polish>
<Spanish>Detonador de hombre muerto</Spanish>
<Hungarian>Dead Man's Switch</Hungarian>
<Russian>Ловушка мертвеца</Russian>
<Russian>Кнопка мертвеца</Russian>
</Key>
<Key ID="STR_ACE_Explosives_DeadManSwitch_description">
<English>Used to remotely trigger explosives when released.</English>
<German>Zündet Sprengladungen wenn losgelassen.</German>
<French>Déclenche la mise à feu d'un explosif lorsqu'il est libéré.</French>
<Czech>Používaný k vzdálenému odpálení, při uvolnění odpálí výbušniny</Czech>
<Polish>Używany w celu zdalnej detonacji ładunków kiedy jego operator zostanie zabity.</Polish>
<Polish>Używany w celu zdalnej detonacji ładunków, kiedy jego operator zostanie zabity.</Polish>
<Spanish>Utilizado para detonar explosivos remotamente al soltarlo.</Spanish>
<Hungarian>Robbanóanyagok távoli robbantásához való, elengedéskor gyújt.</Hungarian>
<Russian>Используется для дистанционного подрыва, после смерти оператора.</Russian>

View File

@ -35,13 +35,6 @@ class RscInGameUI {
};
};
};
class RscOptics_LaserDesignator {
class CA_IGUI_elements_group: RscControlsGroup {
class controls {
MACRO_RANGEFINDER
};
};
};
class RscWeaponRangeFinderMAAWS {
class CA_IGUI_elements_group: RscControlsGroup {
class controls {

View File

@ -13,6 +13,8 @@
*/
#include "script_component.hpp"
private ["_interval", "_player", "_newVel", "_accel", "_currentGForce", "_average", "_sum", "_classCoef", "_suitCoef", "_gBlackOut", "_gRedOut", "_g", "_gBO", "_coef", "_strength"];
EXPLODE_2_PVT(_this,_params,_pfhId);
_interval = time - GVAR(lastUpdateTime);

View File

@ -56,6 +56,7 @@ FUNC(CheckGlasses) = {
};
player addEventHandler ["Explosion", {
private "_effects";
if (alive ace_player) then {
call FUNC(ApplyDirtEffect);
if (GETBROKEN) exitWith {};

View File

@ -16,7 +16,7 @@
#include "script_component.hpp"
if (cameraOn != ace_player || {call FUNC(externalCamera)}) exitWith{false};
private "_dirtImage";
private ["_dirtImage", "_applied", "_effects"];
_effects = GETGLASSES(ace_player);
_effects set [DIRT, true];
SETGLASSES(ace_player,_effects);

View File

@ -16,7 +16,8 @@
*/
#include "script_component.hpp"
private "_broken";
private ["_broken", "_effects"];
_broken = GETBROKEN;
_effects = GLASSESDEFAULT;
_effects set [BROKEN, _broken];

View File

@ -9,7 +9,7 @@
* The rating [0-3] <NUMBER>
*
* Example:
* _rating = 0.05 call ace_goggles_fnc_getExplosionIndex;
* 0.05 call ace_goggles_fnc_getExplosionIndex;
*
* Public: No
*/

View File

@ -14,8 +14,10 @@
* Public: Yes
*/
#include "script_component.hpp"
private ["_currentGlasses", "_result", "_unit"];
_unit = _this select 0;
PARAMS_1(_unit);
private ["_currentGlasses", "_result", "_position", "_visible"];
_currentGlasses = goggles _unit;
_result = false;

View File

@ -15,7 +15,7 @@
*/
#include "script_component.hpp"
private ["_affected", "_strength", "_posGrenade", "_posUnit", "_angleGrenade", "_angleView", "_angleDiff", "_light", "_losCount"];
private ["_affected", "_strength", "_posGrenade", "_posUnit", "_angleGrenade", "_angleView", "_angleDiff", "_light", "_losCount", "_dirToUnitVector", "_eyeDir", "_eyePos"];
PARAMS_1(_grenade);

View File

@ -19,7 +19,8 @@ PARAMS_1(_projectile);
if (alive _projectile) then {
playSound3D ["A3\Sounds_F\weapons\Explosion\explosion_mine_1.wss", _projectile, false, getPosASL _projectile, 5, 1.2, 400];
private "_affected";
_affected = _projectile nearEntities ["CAManBase", 50];
["flashbangExplosion", _affected, [_projectile]] call EFUNC(common,targetEvent);
};

View File

@ -20,7 +20,7 @@
<Spanish>Lanzamiento normal</Spanish>
<Polish>Normalny rzut</Polish>
<Czech>Normální hod</Czech>
<French>Lancer Normal</French>
<French>Lancer normal</French>
<Russian>Нормальный бросок</Russian>
<Hungarian>Normál dobás</Hungarian>
<Italian>Lancio normale</Italian>
@ -32,7 +32,7 @@
<Spanish>Lanzamiento alto</Spanish>
<Polish>Wysoki rzut</Polish>
<Czech>Vysoký hod</Czech>
<French>Lancer Haut</French>
<French>Lancer haut</French>
<Russian>Высокий бросок</Russian>
<Hungarian>Magas dobás</Hungarian>
<Italian>Lancio verso l'alto</Italian>
@ -44,7 +44,7 @@
<Spanish>Lanzamiento preciso</Spanish>
<Polish>Precyzyjny rzut</Polish>
<Czech>Přesný hod</Czech>
<French>Lancer Précis</French>
<French>Lancer précis</French>
<Russian>Точный бросок</Russian>
<Hungarian>Pontos dobás</Hungarian>
<Italian>Lancio preciso</Italian>
@ -56,7 +56,7 @@
<Spanish>Rodar granada</Spanish>
<Polish>Po ziemi</Polish>
<Czech>Po zemi</Czech>
<French>Lancer Roulé</French>
<French>Lancer roulé</French>
<Russian>Катить гранату</Russian>
<Hungarian>Gránát gurítása</Hungarian>
<Italian>Fai rotolare la granata</Italian>
@ -78,7 +78,7 @@
<English>M84 Stun Grenade</English>
<German>M84 Blendgranate</German>
<Spanish>Granada aturdidora M84</Spanish>
<French>M84 Grenade Incapacitante</French>
<French>M84 Grenade incapacitante</French>
<Polish>Granat hukowy M84</Polish>
<Czech>Omračující granát M84</Czech>
<Russian>M84 светозвуковая граната</Russian>
@ -243,4 +243,4 @@
<Spanish>M127A1 (Amarilla)</Spanish>
</Key>
</Package>
</Project>
</Project>

View File

@ -21,7 +21,7 @@
*/
#include "script_component.hpp"
private ["_unit", "_firer", "_distance", "_weapon", "_muzzle", "_mode", "_ammo", "_silencer", "_audibleFireCoef", "_loudness", "_strength"];
private ["_unit", "_firer", "_distance", "_weapon", "_muzzle", "_mode", "_ammo", "_silencer", "_audibleFireCoef", "_loudness", "_strength", "_audibleFire", "_audibleFireTime", "_audibleFireTimeCoef"];
_unit = _this select 0;
_firer = _this select 1;

View File

@ -10,8 +10,7 @@
*/
#include "script_component.hpp"
_logic = _this select 0;
_activated = _this select 2;
PARAMS_3(_logic,_units,_activated);
if !(_activated) exitWith {};

View File

@ -18,6 +18,8 @@
#define STRENGHTODEAFNESS 3
#define MAXDEAFNESS 1.1
private ["_recoverRate", "_volume"];
// Exit if combat deafness is disabled
if !(GVAR(enableCombatDeafness)) exitWith {};

View File

@ -19,7 +19,7 @@
<Spanish>Los tapones para los oídos permiten al usuario operar armamento ruidoso sin sufrir pérdida de audición.</Spanish>
<Polish>Stopery do uszu umożliwiają użytkownikowi przebywać w pobliżu głośnej broni bez poniesienia konsekwencji jaką jest utrata słuchu.</Polish>
<Czech>Ochranné špunty umožňují uživateli, aby neutrpěl zranění jeho sluchu v blízkosti hlasitých zbraní.</Czech>
<Russian>Беруши позволяют избежать потери слуха при близкой громкой стрельбе.</Russian>
<Russian>Беруши позволяют носителю находиться возле громкого вооружения без потери слуха.</Russian>
<French>Bouchons Anti-Bruits pour la prévention des traumatismes sonores aigus.</French>
<Hungarian>Erősebb hanghatásoktól védő füldugó, megakadályozza a nagy hanggal járó fegyverzettől való halláskárosodást.</Hungarian>
<Portuguese>Protetor para ouvidos permitem que o usuário esteja próximo a ruídos sem danificar sua audição.</Portuguese>
@ -31,7 +31,7 @@
<Spanish>Poner tapones</Spanish>
<Polish>Włóż stopery</Polish>
<Czech>Dát špunty do uší</Czech>
<Russian>Беруши надеты</Russian>
<Russian>Надеть беруши</Russian>
<French>Bouchons mis</French>
<Hungarian>Füldugó berakva</Hungarian>
<Portuguese>Protetores colocados</Portuguese>
@ -43,7 +43,7 @@
<Spanish>Quitar tapones</Spanish>
<Polish>Wyjmij stopery</Polish>
<Czech>Vyndat špunty z uší</Czech>
<Russian>Беруши сняты</Russian>
<Russian>Снять беруши</Russian>
<French>Bouchons enlevés</French>
<Hungarian>Füldugó kivéve</Hungarian>
<Portuguese>Protetores retirados</Portuguese>
@ -80,7 +80,7 @@
<Polish>Nie masz stoperów</Polish>
<Czech>Nemáš žádné špunty</Czech>
<Russian>У вас нет беруш</Russian>
<French>Vous n'avez pas de Bouchons Anti-Bruits</French>
<French>Vous n'avez pas de bouchons anti-bruits</French>
<Hungarian>Nincsen füldugód</Hungarian>
<Portuguese>Você não possui protetores auriculares</Portuguese>
<Italian>Non hai i tappi auricolari</Italian>

View File

@ -49,4 +49,7 @@ GVAR(expandedTime) = diag_tickTime;
GVAR(iconCtrls) = [];
GVAR(iconCount) = 0;
GVAR(foundActions) = [];
GVAR(lastTimeSearchedActions) = -1000;
ADDON = true;

View File

@ -22,6 +22,13 @@ private ["_target","_player","_fullPath","_activeChildren","_dynamicChildren","_
_target = _object;
_player = ACE_player;
// Check if the function should be modified first
if !((_origActionData select 10) isEqualTo {}) then {
// It should, so make a copy and pass it to the modifierFunction
_origActionData = +_origActionData;
[_target, ACE_player, _origActionData select 6, _origActionData] call (_origActionData select 10);
};
// Return nothing if the action itself is not active
if !([_target, ACE_player, _origActionData select 6] call (_origActionData select 4)) exitWith {
[]

View File

@ -27,7 +27,7 @@ if !(isNil {missionNamespace getVariable [_actionsVarName, nil]}) exitWith {};
private "_recurseFnc";
_recurseFnc = {
private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_selection", "_condition", "_showDisabled",
"_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_insertChildren"];
"_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_insertChildren", "_modifierFunction"];
EXPLODE_1_PVT(_this,_actionsCfg);
_actions = [];
@ -56,6 +56,7 @@ _recurseFnc = {
_condition = _condition + format [QUOTE( && {[ARR_3(ACE_player, _target, %1)] call EFUNC(common,canInteractWith)} ), getArray (_entryCfg >> "exceptions")];
_insertChildren = compile (getText (_entryCfg >> "insertChildren"));
_modifierFunction = compile (getText (_entryCfg >> "modifierFunction"));
_showDisabled = (getNumber (_entryCfg >> "showDisabled")) > 0;
_enableInside = (getNumber (_entryCfg >> "enableInside")) > 0;
@ -76,7 +77,8 @@ _recurseFnc = {
[],
_selection,
_distance,
[_showDisabled,_enableInside,_canCollapse,_runOnHover]
[_showDisabled,_enableInside,_canCollapse,_runOnHover],
_modifierFunction
],
_children
];

View File

@ -27,7 +27,7 @@ if !(isNil {missionNamespace getVariable [_actionsVarName, nil]}) exitWith {};
private "_recurseFnc";
_recurseFnc = {
private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_selection", "_condition", "_showDisabled",
"_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_insertChildren"];
"_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_insertChildren", "_modifierFunction"];
EXPLODE_1_PVT(_this,_actionsCfg);
_actions = [];
@ -46,6 +46,7 @@ _recurseFnc = {
_condition = _condition + format [QUOTE( && {[ARR_3(ACE_player, _target, %1)] call EFUNC(common,canInteractWith)} ), getArray (_entryCfg >> "exceptions")];
_insertChildren = compile (getText (_entryCfg >> "insertChildren"));
_modifierFunction = compile (getText (_entryCfg >> "modifierFunction"));
_showDisabled = (getNumber (_entryCfg >> "showDisabled")) > 0;
_enableInside = (getNumber (_entryCfg >> "enableInside")) > 0;
@ -66,7 +67,8 @@ _recurseFnc = {
[],
[0,0,0],
10, //distace
[_showDisabled,_enableInside,_canCollapse,_runOnHover]
[_showDisabled,_enableInside,_canCollapse,_runOnHover],
_modifierFunction
],
_children
];

View File

@ -14,6 +14,7 @@
* 7: Position (Position or Selection Name) <POSITION> or <STRING> (Optional)
* 8: Distance <NUMBER> (Optional)
* 9: Other parameters <ARRAY> (Optional)
* 10: Modifier function <CODE> (Optional)
*
* Return value:
* Action <ARRAY>
@ -27,7 +28,7 @@
EXPLODE_5_PVT(_this,_actionName,_displayName,_icon,_statement,_condition);
private ["_insertChildren","_customParams","_position","_distance","_params"];
private ["_insertChildren","_customParams","_position","_distance","_params", "_modifierFunction"];
_insertChildren = if (count _this > 5) then {
_this select 5
@ -59,6 +60,12 @@ _params = if (count _this > 9) then {
[false,false,false,false]
};
_modifierFunction = if (count _this > 10) then {
_this select 10
} else {
{}
};
[
_actionName,
_displayName,
@ -70,5 +77,6 @@ _params = if (count _this > 9) then {
_customParams,
_position,
_distance,
_params
_params,
_modifierFunction
]

View File

@ -29,6 +29,7 @@ if (_menuType == 0) then {
};
GVAR(keyDownTime) = diag_tickTime;
GVAR(openedMenuType) = _menuType;
GVAR(lastTimeSearchedActions) = -1000;
GVAR(useCursorMenu) = (vehicle ACE_player != ACE_player) ||
visibleMap ||

View File

@ -24,8 +24,11 @@ _fnc_renderNearbyActions = {
_cameraPos = (positionCameraToWorld [0, 0, 0]) call EFUNC(common,positionToASL);
_cameraDir = ((positionCameraToWorld [0, 0, 1]) call EFUNC(common,positionToASL)) vectorDiff _cameraPos;
GVAR(foundActions) = [];
GVAR(lastTimeSearchedActions) = diag_tickTime;
_numInteractObjects = 0;
_nearestObjects = nearestObjects [((getPosASL ACE_player) vectorAdd (_cameraDir vectorMultiply 5)) call EFUNC(common,ASLToPosition), ["All"], 8];
_nearestObjects = nearestObjects [ACE_player, ["All"], 13];
{
_target = _x;
@ -46,6 +49,7 @@ _fnc_renderNearbyActions = {
_action = _x;
if ([_target, _action] call FUNC(renderBaseMenu)) then {
_numInteractions = _numInteractions + 1;
GVAR(foundActions) pushBack [_target, _action];
};
};
} forEach GVAR(objectActionList);
@ -57,6 +61,7 @@ _fnc_renderNearbyActions = {
// Try to render the menu
if ([_target, _action] call FUNC(renderBaseMenu)) then {
_numInteractions = _numInteractions + 1;
GVAR(foundActions) pushBack [_target, _action];
};
} forEach _classActions;
@ -71,7 +76,11 @@ _fnc_renderNearbyActions = {
} forEach _nearestObjects;
};
_fnc_renderLastFrameActions = {
{
_x call FUNC(renderBaseMenu);
} forEach GVAR(foundActions);
};
_fnc_renderSelfActions = {
_target = _this;
@ -109,7 +118,13 @@ _fnc_renderSelfActions = {
if (GVAR(openedMenuType) == 0) 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 {
(vehicle ACE_player) call _fnc_renderSelfActions;
};

View File

@ -5,7 +5,7 @@
<English>Always display cursor for self interaction</English>
<German>Immer den Cursor für Selbst-Interaktionen anzeigen.</German>
<Spanish>Mostrar siempre el cursor para la interacción propia</Spanish>
<Russian>Всегда показывать курсор для взаимодействия с собой</Russian>
<Russian>Показывать курсор (взаимодействия с собой)</Russian>
<Czech>Zobrazit kurzor v menu pro vlastní interakci</Czech>
<Polish>Zawsze wyświetlaj kursor dla własnej interakcji</Polish>
<French>Toujours afficher le curseur pour les interactions sur soi-même</French>
@ -15,10 +15,11 @@
<Key ID="STR_ACE_Interact_Menu_UseListMenu">
<English>Display interaction menus as lists</English>
<Spanish>Mostrar los menus de interacción como listas</Spanish>
<Russian>Показывать меню взаимодействия в виде списка</Russian>
<French>Afficher le menu d'interaction au format liste</French>
<Russian>Меню взаимодействий в виде списка</Russian>
<French>Afficher le menu d'interaction sous forme de liste</French>
<Italian>Mostra il menù di interazione come lista</Italian>
<Polish>Wyświetlaj menu interakcji jako listę</Polish>
<German>Interaktionsmenü in Listen anzeigen</German>
</Key>
<Key ID="STR_ACE_Interact_Menu_InteractKey">
<English>Interact Key</English>

View File

@ -430,7 +430,7 @@
<Spanish>Te tocaron el hombro DERECHO</Spanish>
<German>Dir wurde auf die rechte Schulter geklopft</German>
<French>On te tape sur l'épaule droite</French>
<Polish>Zostałeś klepnięty po ramieniu</Polish>
<Polish>Zostałeś klepnięty w prawe ramię</Polish>
<Hungarian>Megveregették a JOBB válladat.</Hungarian>
<Czech>Někdo tě poklepal na PRAVÉ rameno</Czech>
<Russian>Вас похлопали по ПРАВОМУ плечу</Russian>
@ -442,7 +442,7 @@
<Spanish>Te tocaron el hombro IZQUIERDO.</Spanish>
<German>Dir wurde auf die linke Schulter geklopft</German>
<French>On te tape sur l'épaule gauche</French>
<Polish>Zostałeś klepnięty po ramieniu</Polish>
<Polish>Zostałeś klepnięty w lewe ramię</Polish>
<Hungarian>Megveregették a BAL válladat.</Hungarian>
<Czech>Někdo tě poklepal na LEVÉ rameno</Czech>
<Russian>Вас похлопали по ЛЕВОМУ плечу</Russian>

View File

@ -21,7 +21,7 @@ class ACE_Settings {
isClientSettable = 1;
displayName = "$STR_ACE_Inventory_SettingName";
description = "$STR_ACE_Inventory_SettingDescription";
values[] = {"Normal (Default Size)", "Medium", "Bigger"};
values[] = {"$str_medium", "$str_large", "$str_very_large"};
};
};

View File

@ -5,7 +5,7 @@
<English>Make Inventory Display Bigger</English>
<German>Erhöhe die angezeigte Inventargröße</German>
<Spanish>Hacer la pantalla de inventario mas grande</Spanish>
<Russian>Сделать окно инвентаря больше</Russian>
<Russian>Изменить размер окна инвентаря</Russian>
<Czech>Zvětšit zobrazení inventáře</Czech>
<Polish>Powiększ UI ekwipunku</Polish>
<French>Agrandir la taille d'affichage de l'inventaire</French>
@ -16,7 +16,7 @@
<English>Normally inventory display is scaled by UI size. This allows scaling the Inventory UI size up, but doesn't increase font size allowing more rows displayed.</English>
<German>Im Regelfall wird die Inventargröße durch die Größe der Nutzeroberfläche bestimmt. Diese Einstellung erlaubt es das Inventar unter Ausschluss der Schriftgröße zu vergrößern. Dadurch können mehr Gegenstände angezeigt werden.</German>
<Spanish>Normalmente la pantalla de inventario se escala por el tamaño de la interfaz de usuario. Esto permite ampliar el tamaño de la interfaz de usuario de inventario, pero no aumenta el tamaño de fuente, permitiendo mostrar más filas.</Spanish>
<Russian>Обычно, окно инвентаря зависит от размеров пользовательского интерфейса. Эта настройка позволяет увеличить размер окна инвентаря в пользовательском интерфейсе, не увеличивая размера шрифтов, так что отображется большее количество строк.</Russian>
<Russian>Обычно, размер окна инвентаря зависит от размеров пользовательского интерфейса. Эта настройка позволяет увеличить размер окна инвентаря, не увеличивая размеры шрифтов, так что отображется большее количество строк.</Russian>
<Czech>Normálně se velikost invetáře škáluje s velikostí UI. Toto nastavení dovoluje škálování velikost inventáře ale nežvětšuje velikost fontu. To dovoluje zobrazení více řad v inventáři.</Czech>
<Polish>Ekwipunek skalowany jest poprzez rozmiar UI. Ta opcja pozwala powiększyć rozmiar UI ekwipunku, lecz nie zwiększa rozmiaru fontu pozwalając na wyświetlanie większej ilości wierszy.</Polish>
<French>L'inventaire est normalement affiché en fonction de la taille de l'UI. Cette option permet d'agrandir l'affichage de l'inventaire, mais n'a aucun effet sur la taille des polices permettant d'afficher plus de ligne</French>

View File

@ -0,0 +1,32 @@
class CfgVehicles {
class LandVehicle;
class StaticWeapon : LandVehicle {
class Turrets;
};
class StaticMGWeapon : StaticWeapon {
class Turrets : Turrets {
class MainTurret;
};
};
class AT_01_base_F: StaticMGWeapon {
class Turrets : Turrets {
class MainTurret : MainTurret {
weapons[] = { "missiles_titan_static_at" };
magazines[] = {"1Rnd_GAT_missiles","1Rnd_GAT_missiles","1Rnd_GAT_missiles","1Rnd_GAT_missiles"};
turretInfoType = "ACE_RscOptics_javelin";
gunnerOpticsModel = PATHTOF(data\reticle_titan.p3d);
opticsZoomMin = 0.08333;
opticsZoomMax = 0.04167;
opticsZoomInit = 0.08333;
opticsPPEffects[] = {"OpticsCHAbera1","OpticsBlur1"};
opticsFlare = 0;
discretefov[] = {0.08333,0.04167};
discreteInitIndex = 0;
};
};
};
};

View File

@ -1,17 +1,38 @@
class CfgWeapons {
class Launcher;
class MissileLauncher;
class Launcher_Base_F : Launcher {
class WeaponSlotsInfo;
};
};
// @TODO: AA by default, motherfuckers
class missiles_titan : MissileLauncher {
};
class launch_Titan_base : Launcher_Base_F {
class missiles_titan_at : missiles_titan {
weaponInfoType = "ACE_RscOptics_javelin";
modelOptics = PATHTOF(data\reticle_titan.p3d);
canLock = 1;
canLock = 0;
magazines[] = {"1Rnd_GAT_missiles"};
lockingTargetSound[] = {"",0,1};
lockedTargetSound[] = {"",0,1};
};
class missiles_titan_static_at : missiles_titan_at { };
// @TODO: AA by default, motherfuckers
class launch_Titan_base : Launcher_Base_F {};
class launch_Titan_short_base : launch_Titan_base {
weaponInfoType = "ACE_RscOptics_javelin";
modelOptics = PATHTOF(data\reticle_titan.p3d);
canLock = 0;
lockingTargetSound[] = {"",0,1};
lockedTargetSound[] = {"",0,1};
lockedTargetSound[] = {"",0,1};
};
};

View File

@ -255,9 +255,9 @@ class RscInGameUI {
idc = 6999;
x = "SafezoneX";
y = "SafezoneY";
w = "SafezoneW";
h = "SafezoneH";
y = "SafezoneY";
w = "SafezoneW";
h = "SafezoneH";
enabled = 0;
class Controls {

View File

@ -13,4 +13,5 @@ class CfgPatches {
#include "CfgEventhandlers.hpp"
#include "RscInGameUI.hpp"
#include "CfgSounds.hpp"
#include "CfgWeapons.hpp"
#include "CfgWeapons.hpp"
#include "CfgVehicles.hpp"

View File

@ -6,7 +6,10 @@ PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile);
// Bail on not missile
if( _shooter != ACE_player) exitWith { false };
if( ! ([ (configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)) ), "launch_Titan_base"] call EFUNC(common,inheritsFrom)) ) exitWith { };
if( ! ([ (configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)) ), "launch_Titan_short_base"] call EFUNC(common,inheritsFrom))
&&
{ ! ([ (configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)) ), "missiles_titan_at"] call EFUNC(common,inheritsFrom)) }
) exitWith { };
_pfh_handle = uiNamespace getVariable ["ACE_RscOptics_javelin_PFH", nil];
if(!isNil "_pfh_handle") then {

View File

@ -5,12 +5,15 @@ TRACE_1("enter", _this);
#define __TRACKINTERVAL 0 // how frequent the check should be.
#define __LOCKONTIME 3 // Lock on won't occur sooner
private["_apos", "_aposX", "_aposY", "_args", "_boundsInput", "_bpos", "_canFire", "_constraintBottom"];
private["_constraintLeft", "_constraintRight", "_constraintTop", "_currentTarget", "_fireDisabledEH"];
private["_firedEH", "_fov", "_lastTick", "_lockTime", "_maxX", "_maxY", "_minX", "_minY", "_newTarget"];
private["_offsetX", "_offsetY", "_pos", "_randomLockInterval", "_randomPosWithinBounds", "_range"];
private["_runTime", "_soundTime", "_targetArray", "_zamerny"];
#define __OffsetX ((ctrlPosition __JavelinIGUITargetingLineV) select 0) - 0.5
#define __OffsetY ((ctrlPosition __JavelinIGUITargetingLineH) select 1) - 0.5
private["_isJavelin", "_args", "_lastTick", "_runTime", "_soundTime", "_lockTime", "_newTarget", "_currentTarget", "_range", "_pos", "_targetArray"];
// Reset arguments if we havnt rendered in over a second
_args = uiNamespace getVariable[QGVAR(arguments), [] ];
if( (count _args) > 0) then {
@ -30,13 +33,18 @@ _soundTime = _args select 4;
_randomLockInterval = _args select 5;
_fireDisabledEH = _args select 6;
if( ! ([ (configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)) ), "launch_Titan_base"] call EFUNC(common,inheritsFrom)) ) exitWith {
if( ! ([ (configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)) ), "launch_Titan_short_base"] call EFUNC(common,inheritsFrom))
&&
{ ! ([ (configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)) ), "missiles_titan_at"] call EFUNC(common,inheritsFrom)) }
) exitWith {
__JavelinIGUITargeting ctrlShow false;
__JavelinIGUITargetingGate ctrlShow false;
__JavelinIGUITargetingLines ctrlShow false;
__JavelinIGUITargetingConstraints ctrlShow false;
_fireDisabledEH = [_fireDisabledEH] call FUNC(enableFire);
if(!isNil "_fireDisabledEH") then {
_fireDisabledEH = [_fireDisabledEH] call FUNC(enableFire);
};
[(_this select 1)] call cba_fnc_removePerFrameHandler;
uiNamespace setVariable["ACE_RscOptics_javelin_PFH", nil];
@ -55,13 +63,21 @@ if ((velocity ACE_player) distance [0,0,0] > 0.5 && {cameraView == "GUNNER"} &&
// bail on not loaded
if (ACE_player ammo (currentWeapon ACE_player) == 0) exitWith { };
if( (vehicle ACE_player) != ACE_player) then {
if( (vehicle player) magazineTurretAmmo ["1Rnd_GAT_missiles", [0]] < 1) exitWith {
TRACE_1("No turret ammo, exit", "");
};
} else {
if (ACE_player ammo (currentWeapon ACE_player) < 1 ) exitWith {
TRACE_1("No ammo, exit", "");
};
};
_range = parseNumber (ctrlText __JavelinIGUIRangefinder);
TRACE_1("Viewing range", _range);
if (_range > 50 && {_range < 2500}) then {
_pos = positionCameraToWorld [0,0,_range];
_targetArray = _pos nearEntities ["AllVehicles", _range/25];
_targetArray = _pos nearEntities ["AllVehicles", _range/100];
TRACE_1("Searching at range", _targetArray);
if (count (_targetArray) > 0) then {
_newTarget = _targetArray select 0;
@ -144,6 +160,8 @@ if (isNull _newTarget) then {
// Disallow fire
_fireDisabledEH = [_fireDisabledEH] call FUNC(disableFire);
} else {
_fov = [] call CBA_fnc_getFoV;
TRACE_1("FOV", _fov);
if (_newTarget distance ACE_player < 2500
&& {(call CBA_fnc_getFoV) select 1 > 9}
&& { (currentVisionMode ACE_player == 2)}

View File

@ -1,6 +1,7 @@
//#define DEBUG_MODE_FULL
#include "script_component.hpp"
TRACE_1("enter", _this);
private["_args", "_disableFireEH", "_pfh"];
uiNameSpace setVariable ['ACE_RscOptics_javelin',nil];

Some files were not shown because too many files have changed in this diff Show More