Merge pull request #6 from acemod/master

Update master
This commit is contained in:
Grzegorz 2015-04-22 12:04:57 +02:00
commit 48f25b17f7
123 changed files with 7386 additions and 1182 deletions

View File

@ -82,3 +82,4 @@ BlackPixxel
Asgar Serran <piechottaf@web.de>
Kavinsky <nmunozfernandez@gmail.com>
Coren <coren4@gmail.com>
OnkelDisMaster <onkeldismaster@gmail.com>

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -33,6 +33,7 @@ GVAR(AtmosphericDensitySimulationEnabled) = true;
GVAR(currentGrid) = 0;
GVAR(INIT_MESSAGE_ENABLED) = false;
/* @TODO: Remove this until verisoning is in sync with cmake/build versioning
GVAR(extensionVersion) = ("ace_advanced_ballistics" callExtension "version");
GVAR(extensionAvailable) = (GVAR(extensionVersion) == EXTENSION_REQUIRED_VERSION);
if (!GVAR(extensionAvailable)) exitWith {
@ -42,5 +43,5 @@ if (!GVAR(extensionAvailable)) exitWith {
diag_log text "[ACE] ERROR: ace_advanced_ballistics.dll is incompatible";
};
};
*/
[] call FUNC(initializeTerrainExtension);

View File

@ -15,4 +15,8 @@ class CfgPatches {
#include "CfgEventHandlers.hpp"
#include "CfgVehicles.hpp"
#include "RscTitles.hpp"
#include "ACE_Settings.hpp"
#include "ACE_Settings.hpp"
class ACE_Extensions {
extensions[] += {"ace_advanced_ballistics"};
};

View File

@ -891,6 +891,25 @@ class Heli_Attack_01_base_F: Helicopter_Base_F {
class OpticsIn
{
class WideUnstabalized
{
opticsDisplayName = "WU";
initAngleX = 0;
minAngleX = -35;
maxAngleX = 10;
initAngleY = 0;
minAngleY = -100;
maxAngleY = 100;
initFov = 0.466;
minFov = 0.466;
maxFov = 0.466;
visionMode[] = {"Normal","Ti"};
thermalMode[] = {0,1};
gunnerOpticsColor[] = {0,0,0,1};
directionStabilized = 0;
horizontallyStabilized = 1;
gunnerOpticsModel = "\A3\Weapons_F_Beta\Reticle\Heli_Attack_01_Optics_Gunner_wide_F";
};
class Wide
{
opticsDisplayName = "W";

View File

@ -128,7 +128,7 @@ class ATragMX_RscListBox {
class ATragMX_RscListNBox: ATragMX_RscListBox {
idc=-1;
type=102;
columns[]={0.0, 0.225, 0.475, 0.725};
columns[]={0.0, 0.225, 0.475, 0.7};
drawSideArrows=0;
idcLeft=-1;
idcRight=-1;
@ -523,9 +523,12 @@ class ATragMX_Display {
x=0.550*safezoneW+safezoneX+0.32;
text="Cur";
};
class TEXT_ELEVATION_OUTPUT_ABSOLUTE: ATragMX_RscEdit {
class TEXT_ELEVATION_OUTPUT_ABSOLUTE: ATragMX_RscText {
idc=400;
w=0.07;
style=160;
sizeEx=0.025;
w=0.065;
h=0.032;
x=0.550*safezoneW+safezoneX+0.17;
y=0.265*safezoneH+safezoneY+0.50;
text="";
@ -537,7 +540,6 @@ class ATragMX_Display {
class TEXT_ELEVATION_INPUT_CURRENT: TEXT_ELEVATION_OUTPUT_ABSOLUTE {
idc=402;
x=0.550*safezoneW+safezoneX+0.323;
onKeyUp=QUOTE(if (_this select 1 == 28) then {call FUNC(parse_input); call FUNC(update_result)});
};
class TEXT_WINDAGE: TEXT_ELEVATION {
idc=41;
@ -555,7 +557,6 @@ class ATragMX_Display {
class TEXT_WINDAGE_INPUT_CURRENT: TEXT_WINDAGE_OUTPUT_ABSOLUTE {
idc=412;
x=0.550*safezoneW+safezoneX+0.323;
onKeyUp=QUOTE(if (_this select 1 == 28) then {call FUNC(parse_input); call FUNC(update_result)});
};
class TEXT_LEAD: TEXT_GUN {
idc=42;
@ -595,11 +596,20 @@ class ATragMX_Display {
class TEXT_SCOPE_UNIT: TEXT_GUN_LIST {
idc=2000;
style=ST_CENTER;
w=0.06;
x=0.550*safezoneW+safezoneX+0.205;
colorBackground[]={0,0,0,0};
text="TMOA";
action=QUOTE(call FUNC(cycle_scope_unit));
};
class TEXT_SCOPE_CLICK_NUMBER: TEXT_GUN_LIST {
idc=2001;
style=ST_CENTER;
w=0.03;
x=0.550*safezoneW+safezoneX+0.27;
text="4";
action=QUOTE(call FUNC(toggle_solution_setup));
};
class TEXT_CALCULATE: TEXT_SCOPE_UNIT {
idc=3000;
style=ST_RIGHT;
@ -1213,7 +1223,10 @@ class ATragMX_Display {
};
class TEXT_ATMO_ENV_DATA_CALC_METHOD: TEXT_GUN_AMMO_DATA_BORE_HEIGHT {
idc=13011;
x=0.550*safezoneW+safezoneX+0.24;
style=64;
w=0.14;
h=0.07;
x=0.550*safezoneW+safezoneX+0.235;
y=0.265*safezoneH+safezoneY+0.29;
text="Calc Method";
};
@ -1325,6 +1338,16 @@ class ATragMX_Display {
idc=140050;
y=0.265*safezoneH+safezoneY+0.480;
};
class TEXT_TARGET_DATA_TARGET_SPEED_DIRECTION: ATragMX_RscButton {
idc=140051;
colorBackground[]={0.15,0.21,0.23,0.3};
colorFocused[]={0.15,0.21,0.23,0.2};
w=0.0231;
x=0.550*safezoneW+safezoneX+0.305;
y=0.265*safezoneH+safezoneY+0.480;
text=">";
action=QUOTE(call FUNC(cycle_target_speed_direction));
};
class TEXT_TARGET_DATA_TARGET_RANGE: TEXT_TARGET_DATA_LATITUDE {
idc=14006;
y=0.265*safezoneH+safezoneY+0.520;
@ -1355,5 +1378,94 @@ class ATragMX_Display {
class TEXT_TARGET_DATA_NEXT: TEXT_TARGET_SPEED_ASSIST_NEXT {
idc=14011;
};
class TEXT_SOLUTION_SETUP_SHOW_RESULT_IN: TEXT_GUN_AMMO_DATA_BORE_HEIGHT {
idc=15000;
style=64;
w=0.25;
h=0.07;
x=0.550*safezoneW+safezoneX+0.13;
y=0.265*safezoneH+safezoneY+0.32;
text="Show result in";
};
class TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_1: TEXT_TARGET_A {
idc=15001;
w=0.04;
x=0.550*safezoneW+safezoneX+0.14;
y=0.265*safezoneH+safezoneY+0.35;
text="1";
action=QUOTE(GVAR(currentScopeClickNumberTemp) = 1; call FUNC(update_solution_setup));
};
class TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_2: TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_1 {
idc=15002;
x=0.550*safezoneW+safezoneX+0.18;
text="2";
action=QUOTE(GVAR(currentScopeClickNumberTemp) = 2; call FUNC(update_solution_setup));
};
class TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_3: TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_1 {
idc=15003;
x=0.550*safezoneW+safezoneX+0.22;
text="3";
action=QUOTE(GVAR(currentScopeClickNumberTemp) = 3; call FUNC(update_solution_setup));
};
class TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_4: TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_1 {
idc=15004;
x=0.550*safezoneW+safezoneX+0.26;
text="4";
action=QUOTE(GVAR(currentScopeClickNumberTemp) = 4; call FUNC(update_solution_setup));
};
class TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_8: TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_1 {
idc=15005;
x=0.550*safezoneW+safezoneX+0.30;
text="8";
action=QUOTE(GVAR(currentScopeClickNumberTemp) = 8; call FUNC(update_solution_setup));
};
class TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_10: TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_1 {
idc=15006;
x=0.550*safezoneW+safezoneX+0.34;
text="10";
action=QUOTE(GVAR(currentScopeClickNumberTemp) = 10; call FUNC(update_solution_setup));
};
class TEXT_SOLUTION_SETUP_CLICKS_PER: TEXT_GUN_AMMO_DATA_BORE_HEIGHT {
idc=15007;
style=64;
w=0.25;
h=0.07;
x=0.550*safezoneW+safezoneX+0.13;
y=0.265*safezoneH+safezoneY+0.42;
text="Clicks per";
};
class TEXT_SOLUTION_SETUP_CLICKS_PER_TMOA: TEXT_TARGET_A {
idc=15008;
w=0.05;
x=0.550*safezoneW+safezoneX+0.15;
y=0.265*safezoneH+safezoneY+0.45;
text="TMOA";
action=QUOTE(GVAR(currentScopeClickUnitTemp) = 0; call FUNC(update_solution_setup));
};
class TEXT_SOLUTION_SETUP_CLICKS_PER_SMOA: TEXT_SOLUTION_SETUP_CLICKS_PER_TMOA {
idc=15009;
x=0.550*safezoneW+safezoneX+0.23;
text="SMOA";
action=QUOTE(GVAR(currentScopeClickUnitTemp) = 1; call FUNC(update_solution_setup));
};
class TEXT_SOLUTION_SETUP_CLICKS_PER_MILS: TEXT_SOLUTION_SETUP_CLICKS_PER_TMOA {
idc=15010;
x=0.550*safezoneW+safezoneX+0.31;
text="MILS";
action=QUOTE(GVAR(currentScopeClickUnitTemp) = 2; call FUNC(update_solution_setup));
};
class TEXT_SOLUTION_SETUP_DONE: TEXT_TARGET_SPEED_ASSIST_DONE {
idc=15011;
x=0.550*safezoneW+safezoneX+0.18;
y=0.265*safezoneH+safezoneY+0.55;
action=QUOTE(1 call FUNC(toggle_solution_setup));
};
class TEXT_SOLUTION_SETUP_CANCEL: TEXT_TARGET_SPEED_ASSIST_CANCEL {
idc=15012;
x=0.550*safezoneW+safezoneX+0.26;
y=0.265*safezoneH+safezoneY+0.55;
action=QUOTE(0 call FUNC(toggle_solution_setup));
};
};
};

View File

@ -20,6 +20,7 @@ PREP(cycle_num_ticks_units);
PREP(cycle_range_card_columns);
PREP(cycle_scope_unit);
PREP(cycle_target_size_units);
PREP(cycle_target_speed_direction);
PREP(delete_gun);
PREP(init);
PREP(parse_input);
@ -34,6 +35,7 @@ PREP(show_gun_list);
PREP(show_main_page);
PREP(show_range_card);
PREP(show_range_card_setup);
PREP(show_solution_setup);
PREP(show_target_data);
PREP(show_target_range_assist);
PREP(show_target_speed_assist);
@ -46,6 +48,7 @@ PREP(toggle_gun_ammo_data);
PREP(toggle_gun_list);
PREP(toggle_range_card);
PREP(toggle_range_card_setup);
PREP(toggle_solution_setup);
PREP(toggle_target_data);
PREP(toggle_target_range_assist);
PREP(toggle_target_speed_assist);
@ -59,6 +62,7 @@ PREP(update_range_card);
PREP(update_relative_click_memory);
PREP(update_result);
PREP(update_scope_unit);
PREP(update_solution_setup);
PREP(update_target);
PREP(update_target_data);
PREP(update_target_selection);

View File

@ -19,7 +19,7 @@ private ["_gunName", "_gunProfileEntry"];
_gunName = ctrlText 11001;
if (_gunName != "") then {
_gunProfileEntry = [_gunName, 850, 500, 0.280, -0.0010000, 3.81, 0, 0.338, 0.338, 120, 0, 0, 9.460, "", "", 0.393, 1, "ICAO"];
_gunProfileEntry = [_gunName, 810, 100, 0.0679, -0.0010350, 3.81, 0, 2, 10, 120, 0, 0, 9.525, 7.82, 25.40, 0.393, 1, "ICAO"],
GVAR(gunList) = GVAR(gunList) + [_gunProfileEntry];

View File

@ -36,6 +36,7 @@ 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_targetSpeedDirection", nil];
profileNamespace setVariable ["ACE_ATragMX_targetRange", nil];
profileNamespace setVariable ["ACE_ATragMX_rangeCardStartRange", nil];

View File

@ -35,6 +35,7 @@ if (GVAR(showRangeCard)) then {
[] call FUNC(update_range_card);
};
GVAR(showRangeCardSetup) call FUNC(show_range_card_setup);
GVAR(showSolutionSetup) call FUNC(show_solution_setup);
GVAR(showTargetData) call FUNC(show_target_data);
GVAR(showTargetRangeAssist) call FUNC(show_target_range_assist);
GVAR(showTargetSpeedAssist) call FUNC(show_target_speed_assist);

View File

@ -18,6 +18,7 @@
[] call FUNC(parse_input);
GVAR(currentScopeUnit) = (GVAR(currentScopeUnit) + 1) % (count GVAR(scopeUnits));
GVAR(workingMemory) set [6, GVAR(currentScopeUnit)];
[] call FUNC(update_scope_unit);
[] call FUNC(update_result);

View File

@ -0,0 +1,22 @@
/*
* Author: Ruthberg
* Cycles through the target directions left/right
*
* Arguments:
* Nothing
*
* Return Value:
* Nothing
*
* Example:
* call ace_atragmx_cycle_target_direction
*
* Public: No
*/
#include "script_component.hpp"
if ((ctrlText 140051) == ">") then {
ctrlSetText [140051, "<"];
} else {
ctrlSetText [140051, ">"];
};

View File

@ -42,7 +42,9 @@ GVAR(currentGun) = 0;
GVAR(currentTarget) = 0;
GVAR(currentScopeUnit) = 0;
GVAR(currentScopeClickUnit) = 2;
GVAR(currentScopeClickUnitTemp) = 2;
GVAR(currentScopeClickNumber) = 10;
GVAR(currentScopeClickNumberTemp) = 10;
GVAR(atmosphereModeTBH) = true;
GVAR(altitude) = 0;
@ -57,6 +59,7 @@ GVAR(windSpeed2) = [0, 0, 0, 0];
GVAR(windDirection) = [12, 12, 12, 12];
GVAR(inclinationAngle) = [0, 0, 0, 0];
GVAR(targetSpeed) = [0, 0, 0, 0];
GVAR(targetSpeedDirection) = [1, 1, 1, 1];
GVAR(targetRange) = [0, 0, 0, 0];
GVAR(showWind2) = false;
@ -74,6 +77,7 @@ GVAR(showGunAmmoData) = false;
GVAR(showGunList) = false;
GVAR(showRangeCard) = false;
GVAR(showRangeCardSetup) = false;
GVAR(showSolutionSetup) = false;
GVAR(showTargetData) = false;
GVAR(showTargetRangeAssist) = false;
GVAR(showTargetSpeedAssist) = false;

View File

@ -40,7 +40,12 @@ if (_inclinationAngleDegree != GVAR(inclinationAngle) select GVAR(currentTarget)
GVAR(inclinationAngle) set [GVAR(currentTarget), round(acos(_inclinationAngleCosine))];
};
};
GVAR(targetSpeed) set [GVAR(currentTarget), -50 max abs(parseNumber(ctrlText 140050)) min 50];
GVAR(targetSpeed) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140050)) min 50];
if ((ctrlText 140051) == ">") then {
GVAR(targetSpeedDirection) set [GVAR(currentTarget), +1];
} else {
GVAR(targetSpeedDirection) set [GVAR(currentTarget), -1];
};
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];
@ -90,9 +95,9 @@ if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false])
GVAR(workingMemory) set [1, _muzzleVelocity];
GVAR(workingMemory) set [2, _zeroRange];
private ["_elevationCur", "_windageCur", "_elevationScopeStep", "_windageScopeStep"];
_elevationCur = parseNumber(ctrlText 402);
_windageCur = parseNumber(ctrlText 412);
private ["_elevationCur", "_windageCur", "_clickSize", "_clickNumber", "_clickInterval"];
_elevationCur = GVAR(workingMemory) select 10;
_windageCur = GVAR(workingMemory) select 11;
switch (GVAR(currentScopeUnit)) do {
case 0: {
@ -104,11 +109,16 @@ switch (GVAR(currentScopeUnit)) do {
_windageCur = _windageCur / 1.047;
};
case 3: {
_elevationScopeStep = (GVAR(workingMemory) select 7);
_windageScopeStep = (GVAR(workingMemory) select 8);
switch (GVAR(workingMemory) select 7) do {
case 0: { _clickSize = 1; };
case 1: { _clickSize = 1 / 1.047; };
case 2: { _clickSize = 3.38; };
};
_clickNumber = GVAR(workingMemory) select 8;
_clickInterval = _clickSize / _clickNumber;
_elevationCur = _elevationCur * _elevationScopeStep;
_windageCur = _windageCur * _windageScopeStep;
_elevationCur = Round(_elevationCur / _clickInterval);
_windageCur = Round(_windageCur / _clickInterval);
};
};

View File

@ -18,7 +18,6 @@
GVAR(currentUnit) = 0 max (profileNamespace getVariable ["ACE_ATragMX_currentUnit", 2]) min 2;
[(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;
GVAR(atmosphereModeTBH) = profileNamespace getVariable ["ACE_ATragMX_atmosphereModeTBH", true];
GVAR(altitude) = -1000 max (profileNamespace getVariable ["ACE_ATragMX_altitude", 0]) min 20000;
@ -34,6 +33,7 @@ GVAR(windSpeed2) = profileNamespace getVariable ["ACE_ATragMX_windSpeed2", [0, 0
GVAR(windDirection) = profileNamespace getVariable ["ACE_ATragMX_windDirection", [12, 12, 12, 12]];
GVAR(inclinationAngle) = profileNamespace getVariable ["ACE_ATragMX_inclinationAngle", [0, 0, 0, 0]];
GVAR(targetSpeed) = profileNamespace getVariable ["ACE_ATragMX_targetSpeed", [0, 0, 0, 0]];
GVAR(targetSpeedDirection) = profileNamespace getVariable ["ACE_ATragMX_targetSpeedDirection", [1, 1, 1, 1]];
GVAR(targetRange) = profileNamespace getVariable ["ACE_ATragMX_targetRange", [0, 0, 0, 0]];
GVAR(rangeCardStartRange) = 0 max (profileNamespace getVariable ["ACE_ATragMX_rangeCardStartRange", 200]) min 3000;

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, 1001, 1002, 1003, 1004, 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, 2001, 3000, 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008];
if (_this) then {
if (GVAR(atmosphereModeTBH)) then {
@ -26,4 +26,7 @@ if (_this) then {
} else {
{ctrlShow [_x, false]} forEach [21, 210, 22, 220];
};
if (GVAR(currentScopeUnit) != 3) then {
{ctrlShow [_x, false]} forEach [2001];
};
};

View File

@ -0,0 +1,20 @@
/*
* Author: Ruthberg
* Shows/Hides the solution setup controls
*
* Arguments:
* visible - <BOOL>
*
* Return Value:
* Nothing
*
* Example:
* false call ace_atragmx_fnc_show_solution_setup
*
* Public: No
*/
#include "script_component.hpp"
GVAR(showSolutionSetup) = _this;
{ctrlShow [_x, _this]} forEach [15000, 15001, 15002, 15003, 15004, 15005, 15006, 15007, 15008, 15009, 15010, 15011, 15012];

View File

@ -17,7 +17,7 @@
GVAR(showTargetData) = _this;
{ctrlShow [_x, _this]} forEach [14000, 140000, 14001, 140010, 14002, 141020, 140020, 141021, 140021, 14003, 140030, 14004, 140040, 141040, 141041, 140041, 14005, 140050, 14006, 140060, 140061, 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, 140051, 14006, 140060, 140061, 14007, 14008, 14009, 14010, 14011];
if (_this) then {
[] call FUNC(update_target_data);

View File

@ -20,7 +20,6 @@ profileNamespace setVariable ["ACE_ATragMX_profileNamespaceVersion", ATRAGMX_PRO
profileNamespace setVariable ["ACE_ATragMX_currentUnit", GVAR(currentUnit)];
profileNamespace setVariable ["ACE_ATragMX_currentGun", GVAR(currentGun)];
profileNamespace setVariable ["ACE_ATragMX_currentTarget", GVAR(currentTarget)];
profileNamespace setVariable ["ACE_ATragMX_currentScopeUnit", GVAR(currentScopeUnit)];
profileNamespace setVariable ["ACE_ATragMX_atmosphereModeTBH", GVAR(atmosphereModeTBH)];
profileNamespace setVariable ["ACE_ATragMX_altitude", GVAR(altitude)];
@ -36,6 +35,7 @@ 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_targetSpeedDirection", GVAR(targetSpeedDirection)];
profileNamespace setVariable ["ACE_ATragMX_targetRange", GVAR(targetRange)];
profileNamespace setVariable ["ACE_ATragMX_rangeCardStartRange", GVAR(rangeCardStartRange)];

View File

@ -0,0 +1,38 @@
/*
* Author: Ruthberg
* Toggles the solution setup screen on/off
*
* Arguments:
* Apply new data? <NUMBER>
*
* Return Value:
* Nothing
*
* Example:
* 1 call ace_atragmx_fnc_toggle_solution_setup
*
* Public: No
*/
#include "script_component.hpp"
if (ctrlVisible 15000) then {
false call FUNC(show_solution_setup);
true call FUNC(show_main_page);
if (_this == 1) then {
GVAR(currentScopeClickUnit) = GVAR(currentScopeClickUnitTemp);
GVAR(currentScopeClickNumber) = GVAR(currentScopeClickNumberTemp);
GVAR(workingMemory) set [7, GVAR(currentScopeClickUnit)];
GVAR(workingMemory) set [8, GVAR(currentScopeClickNumber)];
[] call FUNC(update_scope_unit);
[] call FUNC(update_result);
};
} else {
true call FUNC(show_solution_setup);
false call FUNC(show_main_page);
GVAR(currentScopeClickUnitTemp) = GVAR(currentScopeClickUnit);
GVAR(currentScopeClickNumberTemp) = GVAR(currentScopeClickNumber);
[] call FUNC(update_solution_setup);
};

View File

@ -15,7 +15,7 @@
*/
#include "script_component.hpp"
private ["_range", "_elevation", "_windage1", "_windage2", "_elevationScopeStep", "_windageScopeStep", "_lead", "_TOF", "_velocity", "_kineticEnergy", "_rangeOutput", "_elevationOutput", "_windageOutput", "_lastColumnOutput"];
private ["_range", "_elevation", "_windage1", "_windage2", "_clickSize", "_clickNumber", "_clickInterval", "_lead", "_TOF", "_velocity", "_kineticEnergy", "_rangeOutput", "_elevationOutput", "_windageOutput", "_lastColumnOutput"];
_lastColumnOutput = "";
if (GVAR(showWind2) && GVAR(rangeCardCurrentColumn) == 0) then {
@ -54,12 +54,17 @@ lnbClear 5007;
_windage2 = _windage2 * 1.047;
};
case 3: {
_elevationScopeStep = (GVAR(workingMemory) select 7);
_windageScopeStep = (GVAR(workingMemory) select 8);
switch (GVAR(workingMemory) select 7) do {
case 0: { _clickSize = 1; };
case 1: { _clickSize = 1 / 1.047; };
case 2: { _clickSize = 3.38; };
};
_clickNumber = GVAR(workingMemory) select 8;
_clickInterval = _clickSize / _clickNumber;
_elevation = Round(_elevation / _elevationScopeStep);
_windage1 = Round(_windage1 / _windageScopeStep);
_windage2 = Round(_windage2 / _windageScopeStep);
_elevation = Round(_elevation / _clickInterval);
_windage1 = Round(_windage1 / _clickInterval);
_windage2 = Round(_windage2 / _clickInterval);
};
};

View File

@ -15,7 +15,7 @@
*/
#include "script_component.hpp"
private ["_elevationAbs", "_elevationRel", "_elevationCur", "_windageAbs", "_wind2", "_windageRel", "_windageCur", "_lead", "_elevationScopeStep", "_windageScopeStep"];
private ["_elevationAbs", "_elevationRel", "_elevationCur", "_windageAbs", "_wind2", "_windageRel", "_windageCur", "_lead", "_clickSize", "_clickNumber", "_clickInterval"];
_elevationAbs = GVAR(elevationOutput) select GVAR(currentTarget);
_windageAbs = GVAR(windage1Output) select GVAR(currentTarget);
@ -55,19 +55,24 @@ switch (GVAR(currentScopeUnit)) do {
_windageCur = _windageCur * 1.047;
};
case 3: {
_elevationScopeStep = (GVAR(workingMemory) select 7);
_windageScopeStep = (GVAR(workingMemory) select 8);
switch (GVAR(workingMemory) select 7) do {
case 0: { _clickSize = 1; };
case 1: { _clickSize = 1 / 1.047; };
case 2: { _clickSize = 3.38; };
};
_clickNumber = GVAR(workingMemory) select 8;
_clickInterval = _clickSize / _clickNumber;
_elevationAbs = Round(_elevationAbs / _elevationScopeStep);
_windageAbs = Round(_windageAbs / _windageScopeStep);
_elevationAbs = Round(_elevationAbs / _clickInterval);
_windageAbs = Round(_windageAbs / _clickInterval);
_wind2 = Round(_wind2 / _windageScopeStep);
_wind2 = Round(_wind2 / _clickInterval);
_elevationRel = Round(_elevationRel / _elevationScopeStep);
_windageRel = Round(_windageRel / _windageScopeStep);
_elevationRel = Round(_elevationRel / _clickInterval);
_windageRel = Round(_windageRel / _clickInterval);
_elevationCur = Round(_elevationCur / _elevationScopeStep);
_windageCur = Round(_windageCur / _windageScopeStep);
_elevationCur = Round(_elevationCur / _clickInterval);
_windageCur = Round(_windageCur / _clickInterval);
};
};
@ -77,16 +82,88 @@ if (GVAR(showWind2)) then {
ctrlSetText [42, "Lead"];
};
ctrlSetText [400, Str(Round(_elevationAbs * 100) / 100)];
ctrlSetText [401, Str(Round(_elevationRel * 100) / 100)];
ctrlSetText [402, Str(Round(_elevationCur * 100) / 100)];
_elevationAbs = Round(_elevationAbs * 100) / 100;
if (_elevationAbs > 0) then {
ctrlSetText [400, format["%1", abs(_elevationAbs)]];
} else {
if (_elevationAbs < 0) then {
ctrlSetText [400, format["%1D", abs(_elevationAbs)]];
} else {
ctrlSetText [400, "0.0"];
};
};
_elevationRel = Round(_elevationRel * 100) / 100;
if (_elevationRel > 0) then {
ctrlSetText [401, format["%1", abs(_elevationRel)]];
} else {
if (_elevationRel < 0) then {
ctrlSetText [401, format["%1D", abs(_elevationRel)]];
} else {
ctrlSetText [401, "0.0"];
};
};
_elevationCur = Round(_elevationCur * 100) / 100;
if (_elevationCur > 0) then {
ctrlSetText [402, format["%1", abs(_elevationCur)]];
} else {
if (_elevationCur < 0) then {
ctrlSetText [402, format["%1D", abs(_elevationCur)]];
} else {
ctrlSetText [402, "0.0"];
};
};
ctrlSetText [410, Str(Round(_windageAbs * 100) / 100)];
ctrlSetText [411, Str(Round(_windageRel * 100) / 100)];
ctrlSetText [412, Str(Round(_windageCur * 100) / 100)];
_windageAbs = Round(_windageAbs * 100) / 100;
if (_windageAbs > 0) then {
ctrlSetText [410, format["%1R", abs(_windageAbs)]];
} else {
if (_windageAbs < 0) then {
ctrlSetText [410, format["%1L", abs(_windageAbs)]];
} else {
ctrlSetText [410, "0.0"];
};
};
_windageRel = Round(_windageRel * 100) / 100;
if (_windageRel > 0) then {
ctrlSetText [411, format["%1R", abs(_windageRel)]];
} else {
if (_windageRel < 0) then {
ctrlSetText [411, format["%1L", abs(_windageRel)]];
} else {
ctrlSetText [411, "0.0"];
};
};
_windageCur = Round(_windageCur * 100) / 100;
if (_windageCur > 0) then {
ctrlSetText [412, format["%1R", abs(_windageCur)]];
} else {
if (_windageCur < 0) then {
ctrlSetText [412, format["%1L", abs(_windageCur)]];
} else {
ctrlSetText [412, "0.0"];
};
};
if (GVAR(showWind2)) then {
ctrlSetText [420, Str(Round(_wind2 * 100) / 100)];
_wind2 = Round(_wind2 * 100) / 100;
if (_wind2 > 0) then {
ctrlSetText [420, format["%1R", abs(_wind2)]];
} else {
if (_wind2 < 0) then {
ctrlSetText [420, format["%1L", abs(_wind2)]];
} else {
ctrlSetText [420, "0.0"];
};
};
} else {
ctrlSetText [420, Str(Round(_lead * 100) / 100)];
_lead = Round(_lead * 100) / 100;
if (_lead > 0) then {
if ((GVAR(targetSpeedDirection) select GVAR(currentTarget)) == 1) then {
ctrlSetText [420, format["%1R", abs(_lead)]];
} else {
ctrlSetText [420, format["%1L", abs(_lead)]];
};
} else {
ctrlSetText [420, "0.0"];
};
};

View File

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

View File

@ -0,0 +1,31 @@
/*
* Author: Ruthberg
* Updates all solution setup input fields
*
* Arguments:
* Nothing
*
* Return Value:
* Nothing
*
* Example:
* call ace_atragmx_fnc_update_solution_setup
*
* Public: No
*/
#include "script_component.hpp"
{((uiNamespace getVariable "ATragMX_Display") displayCtrl _x) ctrlEnable true} forEach [15001, 15002, 15003, 15004, 15005, 15006, 15008, 15009, 15010];
switch (GVAR(currentScopeClickNumberTemp)) do {
case 1: { ((uiNamespace getVariable "ATragMX_Display") displayCtrl 15001) ctrlEnable false; };
case 2: { ((uiNamespace getVariable "ATragMX_Display") displayCtrl 15002) ctrlEnable false; };
case 3: { ((uiNamespace getVariable "ATragMX_Display") displayCtrl 15003) ctrlEnable false; };
case 4: { ((uiNamespace getVariable "ATragMX_Display") displayCtrl 15004) ctrlEnable false; };
case 8: { ((uiNamespace getVariable "ATragMX_Display") displayCtrl 15005) ctrlEnable false; };
case 10: { ((uiNamespace getVariable "ATragMX_Display") displayCtrl 15006) ctrlEnable false; };
};
((uiNamespace getVariable "ATragMX_Display") displayCtrl (15008 + GVAR(currentScopeClickUnitTemp))) ctrlEnable false;
ctrlSetFocus ((uiNamespace getVariable "ATragMX_Display") displayCtrl 15011);

View File

@ -32,6 +32,11 @@ if (GVAR(currentUnit) != 2) then {
} else {
ctrlSetText [140050, Str(Round((GVAR(targetSpeed) select GVAR(currentTarget)) * 100) / 100)];
};
if ((GVAR(targetSpeedDirection) select GVAR(currentTarget)) == 1) then {
ctrlSetText [140051, ">"];
} else {
ctrlSetText [140051, "<"];
};
if (GVAR(currentUnit) == 1) then {
ctrlSetText [140060, Str(Round((GVAR(targetRange) select GVAR(currentTarget)) * 1.0936133))];
} else {

View File

@ -15,10 +15,7 @@
*/
#include "script_component.hpp"
((uiNamespace getVariable "ATragMX_Display") displayCtrl 500) ctrlEnable true;
((uiNamespace getVariable "ATragMX_Display") displayCtrl 501) ctrlEnable true;
((uiNamespace getVariable "ATragMX_Display") displayCtrl 502) ctrlEnable true;
((uiNamespace getVariable "ATragMX_Display") displayCtrl 503) ctrlEnable true;
{((uiNamespace getVariable "ATragMX_Display") displayCtrl _x) ctrlEnable true} forEach [500, 501, 502, 503];
((uiNamespace getVariable "ATragMX_Display") displayCtrl 500 + GVAR(currentTarget)) ctrlEnable false;

View File

@ -129,10 +129,10 @@ class CfgAmmo {
class ACE_65x39_Caseless_green_Tracer_Dim : B_65x39_Caseless_green {
nvgOnly = 1;
};
class ACE_65x47_Ball_Scenar: B_65x39_Caseless
{
class ACE_65x47_Ball_Scenar: B_65x39_Caseless {
airFriction=-0.00078;
typicalSpeed=820 ;
caliber=0.6;
ACE_caliber=0.264;
ACE_bulletLength=1.364;
ACE_bulletMass=139;
@ -144,6 +144,21 @@ class CfgAmmo {
ACE_muzzleVelocities[]={730, 760, 790, 820, 830};
ACE_barrelLengths[]={10, 16, 20, 24, 26};
};
class ACE_65_Creedmor_Ball: B_65x39_Caseless {
airFriction=-0.00078;
typicalSpeed=860 ;
caliber=0.7;
ACE_caliber=0.264;
ACE_bulletLength=1.426;
ACE_bulletMass=140;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.317};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ICAO";
ACE_dragModel=7;
ACE_muzzleVelocities[]={750, 830, 850, 860, 865};
ACE_barrelLengths[]={10, 16, 20, 24, 26};
};
class B_762x51_Ball : BulletBase {
airFriction=-0.001035;
typicalSpeed=833;
@ -211,6 +226,54 @@ class CfgAmmo {
ACE_muzzleVelocities[]={305, 325, 335, 340};
ACE_barrelLengths[]={16, 20, 24, 26};
};
class ACE_30_06_M1_Ball : B_762x51_Ball {
airFriction=-0.0009;
typicalSpeed=800;
caliber=1.3;
hit=10;
ACE_caliber=0.308;
ACE_bulletLength=1.21;
ACE_bulletMass=174;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.494};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={700, 785, 800, 830, 840};
ACE_barrelLengths[]={10, 16, 20, 24, 26};
};
class ACE_7_Remington_Magnum_Ball : B_762x51_Ball {
airFriction=-0.0008;
typicalSpeed=820;
caliber=1.4;
hit=8;
ACE_caliber=0.284;
ACE_bulletLength=1.529;
ACE_bulletMass=180;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.345};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ICAO";
ACE_dragModel=7;
ACE_muzzleVelocities[]={720, 780, 812, 822, 830};
ACE_barrelLengths[]={10, 16, 20, 24, 26};
};
class ACE_243_Winchester_Ball : B_762x51_Ball {
airFriction=-0.00095;
typicalSpeed=915;
caliber=0.8;
hit=6;
ACE_caliber=0.243;
ACE_bulletLength=1.282;
ACE_bulletMass=180;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.278};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ICAO";
ACE_dragModel=7;
ACE_muzzleVelocities[]={830, 875, 900, 915, 920};
ACE_barrelLengths[]={10, 16, 20, 24, 26};
};
class ACE_762x67_Ball_Mk248_Mod_0 : B_762x51_Ball {
airFriction=-0.000830;
caliber=1.08;

View File

@ -42,9 +42,9 @@ class CfgMagazines {
class ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim: 30Rnd_65x39_caseless_green_mag_Tracer {
author = "$STR_ACE_Common_ACETeam";
ammo = "ACE_65x39_Caseless_green_Tracer_Dim";
displayName = "$STR_ACE_30Rnd_65x39_caseless_mag_Tracer_DimName";
displayNameShort = "$STR_ACE_30Rnd_65x39_caseless_mag_Tracer_DimNameShort";
descriptionShort = "$STR_ACE_30Rnd_65x39_caseless_mag_Tracer_DimDescription";
displayName = "$STR_ACE_30Rnd_65x39_caseless_green_mag_Tracer_DimName";
displayNameShort = "$STR_ACE_30Rnd_65x39_caseless_green_mag_Tracer_DimNameShort";
descriptionShort = "$STR_ACE_30Rnd_65x39_caseless_green_mag_Tracer_DimDescription";
};
class 30Rnd_556x45_Stanag: CA_Magazine {
@ -179,6 +179,13 @@ class CfgMagazines {
displayNameShort = "$STR_ACE_30Rnd_65x47_Scenar_mag_NameShort";
descriptionShort = "$STR_ACE_30Rnd_65x47_Scenar_mag_Description";
};
class ACE_30Rnd_65_Creedmor_mag: 30Rnd_65x39_caseless_mag {
author = "$STR_ACE_Common_ACETeam";
ammo = "ACE_65_Creedmor_Ball";
displayName = "$STR_ACE_30Rnd_65_Creedmor_mag_Name";
displayNameShort = "$STR_ACE_30Rnd_65_Creedmor_mag_NameShort";
descriptionShort = "$STR_ACE_30Rnd_65_Creedmor_mag_Description";
};
class 10Rnd_338_Mag;
class ACE_10Rnd_338_300gr_HPBT_Mag: 10Rnd_338_Mag {
author = "$STR_ACE_Common_ACETeam";

View File

@ -14,6 +14,7 @@ class CfgVehicles {
class Box_NATO_Wps_F: NATO_Box_Base {
class TransportMagazines {
MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4);
};
};
@ -33,6 +34,7 @@ class CfgVehicles {
class Box_NATO_Ammo_F: NATO_Box_Base {
class TransportMagazines {
MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4);
MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_M118LR_Mag,4);
MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_M118LR_Mag,4);
MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_Mk319_Mod_0_Mag,4);
@ -64,6 +66,7 @@ class CfgVehicles {
class B_supplyCrate_F: ReammoBox_F {
class TransportMagazines {
MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4);
MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_M118LR_Mag,4);
MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_M118LR_Mag,4);
MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_Mk319_Mod_0_Mag,4);
@ -76,6 +79,7 @@ class CfgVehicles {
class Box_East_Wps_F: EAST_Box_Base {
class TransportMagazines {
MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4);
MACRO_ADDMAGAZINE(ACE_10Rnd_762x54_Tracer_mag,4);
};
};
@ -85,6 +89,7 @@ class CfgVehicles {
MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_Tracer_Dim,1);
MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4);
MACRO_ADDMAGAZINE(ACE_10Rnd_762x54_Tracer_mag,4);
};
};
@ -92,6 +97,7 @@ class CfgVehicles {
class Box_East_Ammo_F: EAST_Box_Base {
class TransportMagazines {
MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4);
MACRO_ADDMAGAZINE(ACE_10Rnd_762x54_Tracer_mag,4);
};
};
@ -99,6 +105,7 @@ class CfgVehicles {
class Box_East_Support_F: EAST_Box_Base {
class TransportMagazines {
MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,6);
MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4);
MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_SD,3);
MACRO_ADDMAGAZINE(ACE_10Rnd_762x54_Tracer_mag,4);
};
@ -157,6 +164,7 @@ class CfgVehicles {
class C_supplyCrate_F: ReammoBox_F {
class TransportMagazines {
MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4);
};
};
@ -164,7 +172,7 @@ class CfgVehicles {
scope = 2;
accuracy = 1000;
displayName = "[ACE] Ammo Supply Crate";
// TODO: model = "...";
model = "\A3\weapons_F\AmmoBoxes\AmmoBox_F";
author = "$STR_ACE_Common_ACETeam";
class TransportMagazines {
MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_SD,4);
@ -185,6 +193,7 @@ class CfgVehicles {
MACRO_ADDMAGAZINE(ACE_100Rnd_65x39_caseless_mag_Tracer_Dim,4);
MACRO_ADDMAGAZINE(ACE_200Rnd_65x39_cased_Box_Tracer_Dim,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4);
MACRO_ADDMAGAZINE(ACE_10Rnd_338_300gr_HPBT_Mag,4);
MACRO_ADDMAGAZINE(ACE_10Rnd_338_API526_Mag,4);
MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_Mag,4);

View File

@ -88,7 +88,8 @@ class CfgWeapons {
"30Rnd_65x39_caseless_mag",
"30Rnd_65x39_caseless_mag_Tracer",
"ACE_30Rnd_65x39_caseless_mag_Tracer_Dim",
"ACE_30Rnd_65x47_Scenar_mag"
"ACE_30Rnd_65x47_Scenar_mag",
"ACE_30Rnd_65_Creedmor_mag"
};
initSpeed = -1.018;
ACE_barrelTwist=9;

View File

@ -743,7 +743,7 @@
<Russian>6,5 мм ИК-трассирующие</Russian>
</Key>
<Key ID="STR_ACE_100Rnd_65x39_caseless_mag_Tracer_DimDescription">
<English>6.5mm 100Rnd Tracer IR-DIM Mag</English>
<English>6.5mm 100Rnd Tracer IR-DIM Mag&lt;br /&gt;Rounds: 100&lt;br /&gt;Used in: MX LSW</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>
@ -764,7 +764,7 @@
<Russian>6,5 мм ИК-трассирующие</Russian>
</Key>
<Key ID="STR_ACE_200Rnd_65x39_cased_Box_Tracer_DimDescription">
<English>6.5mm 200Rnd Tracer IR-DIM Belt</English>
<English>6.5mm 200Rnd Tracer IR-DIM Belt&lt;br /&gt;Rounds: 200&lt;br /&gt;Used in: Stoner 99 LMG</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>
@ -967,19 +967,32 @@
<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>
<English>6.5mm Lapua</English>
<French>6.5mm Lapua</French>
<Spanish>6.5mm Lapua</Spanish>
<Polish>6,5mm Lapua</Polish>
<Russian>6,5 мм Lapua</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_65x47_Scenar_mag_Description">
<English>Caliber: 6.5x47mm (HPBT Scenar)&lt;br /&gt;Rounds: 30</English>
<English>Caliber: 6.5x47mm (HPBT Scenar)&lt;br /&gt;Rounds: 30&lt;br /&gt;Used in: MXM</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_30Rnd_65_Creedmor_mag_Name">
<English>6.5mm Creedmor 30Rnd Mag</English>
</Key>
<Key ID="STR_ACE_30Rnd_65_Creedmor_mag_NameShort">
<English>6.5mm CM</English>
<French>6.5mm CM</French>
<Spanish>6.5mm CM</Spanish>
<Polish>6,5mm CM</Polish>
<Russian>6,5 мм CM</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_65_Creedmor_mag_Description">
<English>Caliber: 6.5mm Creedmor&lt;br /&gt;Rounds: 30&lt;br /&gt;Used in: MXM</English>
</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>

View File

@ -248,5 +248,13 @@ if(isMultiplayer && { time > 0 || isNull player } ) then {
}, 0, []] call cba_fnc_addPerFrameHandler;
};
// check dlls
{
if (_x callExtension "version" == "") then {
private "_errorMsg";
_errorMsg = format ["Extension %1.dll not installed.", _x];
diag_log text format ["[ACE] ERROR: %1", _errorMsg];
["[ACE] ERROR", _errorMsg, {findDisplay 46 closeDisplay 0}] call FUNC(errorMessage);
};
} forEach getArray (configFile >> "ACE_Extensions" >> "extensions");

View File

@ -42,6 +42,7 @@ PREP(doAnimation);
PREP(dropBackpack);
PREP(endRadioTransmission);
PREP(eraseCache);
PREP(errorMessage);
PREP(execNextFrame);
PREP(execPersistentFnc);
PREP(execRemoteFnc);

View File

@ -152,3 +152,15 @@ class CfgUIGrids {
};
};
};
/*
// check dll
class RscStandardDisplay;
class RscDisplayMain: RscStandardDisplay {
onLoad = QUOTE([ARR_4(""onLoad"",_this,""RscDisplayMain"",'GUI')] call (uinamespace getvariable 'BIS_fnc_initDisplay'); [ARR_5('header','tail',{0},{},_this select 0)] call COMPILE_FILE(functions\fnc_errorMessage));
};
*/
class ACE_Extensions {
extensions[] = {};
};

View File

@ -27,7 +27,7 @@ if ((local _unit) && {!([_unit] call EFUNC(common,isPlayer))}) then {
_unit disableConversation true;
} else {
//Sanity check to make sure we don't enable unconsious AI
if (_unit getVariable ["ace_isunconscious", false]) exitWith {ERROR("Enabling AI for unconsious unit");};
if (_unit getVariable ["ace_isunconscious", false] && alive _unit) exitWith {ERROR("Enabling AI for unconsious unit");};
_unit enableAI "MOVE";
_unit enableAI "TARGET";
_unit enableAI "AUTOTARGET";

View File

@ -1,14 +1,16 @@
/*
* Author: commy2
*
* Disables key input. ESC can still be pressed to open the menu.
*
* Argument:
* 0: True to disable key inputs, false to re-enable them (Bool)
* Arguments:
* 0: True to disable key inputs, false to re-enable them <BOOL>
*
* Return value:
* Nothing
*
* Public: Yes
*/
#include "script_component.hpp"
private ["_state", "_dlg"];
@ -16,76 +18,93 @@ private ["_state", "_dlg"];
_state = _this select 0;
if (_state) then {
disableSerialization;
disableSerialization;
if (!isNull (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull])) exitWith {};
if ("ACE_DisableUserInput" in ([BIS_stackedEventHandlers_onEachFrame, {_this select 0}] call FUNC(map))) exitWith {};
if (!isNull (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull])) exitWith {};
if ("ACE_DisableUserInput" in ([BIS_stackedEventHandlers_onEachFrame, {_this select 0}] call FUNC(map))) exitWith {};
// end TFAR and ACRE2 radio transmissions
0 spawn FUNC(endRadioTransmission);
// end TFAR and ACRE2 radio transmissions
call FUNC(endRadioTransmission);
// Close map
if (visibleMap && {!(player getVariable ["ACE_canSwitchUnits", false])}) then {openMap false};
// Close map
if (visibleMap && {!(player getVariable ["ACE_canSwitchUnits", false])}) then {
openMap false;
};
closeDialog 0;
createDialog QGVAR(DisableMouse_Dialog);
closeDialog 0;
createDialog QGVAR(DisableMouse_Dialog);
_dlg = uiNamespace getVariable QGVAR(dlgDisableMouse);
_dlg = uiNamespace getVariable QGVAR(dlgDisableMouse);
_dlg displayAddEventHandler ["KeyDown", {
_key = _this select 1;
if (_key == 1 && {alive player}) then {
createDialog (["RscDisplayInterrupt", "RscDisplayMPInterrupt"] select isMultiplayer);
disableSerialization;
_dlg = finddisplay 49;
_dlg displayAddEventHandler ["KeyDown", {
_dlg displayAddEventHandler ["KeyDown", {
_key = _this select 1;
!(_key == 1)
}];
for "_index" from 100 to 2000 do {
(_dlg displayCtrl _index) ctrlEnable false;
};
if (_key == 1 && {alive player}) then {
createDialog (["RscDisplayInterrupt", "RscDisplayMPInterrupt"] select isMultiplayer);
_ctrl = _dlg displayctrl 103;
_ctrl ctrlSetEventHandler ["buttonClick", QUOTE(while {!isNull (uiNamespace getVariable [ARR_2(QUOTE(QGVAR(dlgDisableMouse)),displayNull)])} do {closeDialog 0}; failMission 'LOSER'; [false] call DFUNC(disableUserInput);)];
_ctrl ctrlEnable true;
_ctrl ctrlSetText "ABORT";
_ctrl ctrlSetTooltip "Abort.";
disableSerialization;
_dlg = finddisplay 49;
_dlg displayAddEventHandler ["KeyDown", {
_key = _this select 1;
!(_key == 1)
}];
_ctrl = _dlg displayctrl ([104, 1010] select isMultiplayer);
_ctrl ctrlSetEventHandler ["buttonClick", QUOTE(closeDialog 0; player setDamage 1; [false] call DFUNC(disableUserInput);)];
_ctrl ctrlEnable (call {_config = missionConfigFile >> "respawnButton"; !isNumber _config || {getNumber _config == 1}});
_ctrl ctrlSetText "RESPAWN";
_ctrl ctrlSetTooltip "Respawn.";
};
for "_index" from 100 to 2000 do {
(_dlg displayCtrl _index) ctrlEnable false;
};
if (_key in actionKeys "TeamSwitch" && {teamSwitchEnabled}) then {(uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; teamSwitch};//_acc = accTime; teamSwitch; setAccTime _acc};
if (_key in actionKeys "CuratorInterface" && {getAssignedCuratorLogic player in allCurators}) then {(uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; openCuratorInterface};
if (_key in actionKeys "ShowMap" && {player getVariable ["ACE_canSwitchUnits", false]}) then {(uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; openMap true};
_ctrl = _dlg displayctrl 103;
_ctrl ctrlSetEventHandler ["buttonClick", QUOTE(while {!isNull (uiNamespace getVariable [ARR_2(QUOTE(QGVAR(dlgDisableMouse)),displayNull)])} do {closeDialog 0}; failMission 'LOSER'; [false] call DFUNC(disableUserInput);)];
_ctrl ctrlEnable true;
_ctrl ctrlSetText "ABORT";
_ctrl ctrlSetTooltip "Abort.";
if (serverCommandAvailable "#missions" || {player getVariable ["ACE_isUnconscious", false] && {(call FUNC(player)) getVariable [QEGVAR(medical,AllowChatWhileUnconscious), missionNamespace getVariable [QEGVAR(medical,AllowChatWhileUnconscious), false]]}}) then {
if (!(_key in (actionKeys "DefaultAction" + actionKeys "Throw")) && {_key in (actionKeys "Chat" + actionKeys "PrevChannel" + actionKeys "NextChannel")}) then {
_key = 0;
};
};
_ctrl = _dlg displayctrl ([104, 1010] select isMultiplayer);
_ctrl ctrlSetEventHandler ["buttonClick", QUOTE(closeDialog 0; player setDamage 1; [false] call DFUNC(disableUserInput);)];
_ctrl ctrlEnable (call {_config = missionConfigFile >> "respawnButton"; !isNumber _config || {getNumber _config == 1}});
_ctrl ctrlSetText "RESPAWN";
_ctrl ctrlSetTooltip "Respawn.";
};
_key > 0
}];
_dlg displayAddEventHandler ["KeyUp", {true}];
if (_key in actionKeys "TeamSwitch" && {teamSwitchEnabled}) then {
(uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0;
_acc = accTime;
teamSwitch;
setAccTime _acc;
};
if (_key in actionKeys "CuratorInterface" && {getAssignedCuratorLogic player in allCurators}) then {
(uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0;
openCuratorInterface;
};
if (_key in actionKeys "ShowMap" && {player getVariable ["ACE_canSwitchUnits", false]}) then {
(uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0;
openMap true;
};
if (serverCommandAvailable "#missions" || {player getVariable ["ACE_isUnconscious", false] && {(call FUNC(player)) getVariable [QEGVAR(medical,AllowChatWhileUnconscious), missionNamespace getVariable [QEGVAR(medical,AllowChatWhileUnconscious), false]]}}) then {
if (!(_key in (actionKeys "DefaultAction" + actionKeys "Throw")) && {_key in (actionKeys "Chat" + actionKeys "PrevChannel" + actionKeys "NextChannel")}) then {
_key = 0;
};
};
_key > 0
}];
_dlg displayAddEventHandler ["KeyUp", {true}];
["ACE_DisableUserInput", "onEachFrame", {
if (isNull (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) && {!visibleMap && isNull findDisplay 49 && isNull findDisplay 312 && isNull findDisplay 632}) then {
["ACE_DisableUserInput", "onEachFrame"] call BIS_fnc_removeStackedEventHandler;
[true] call FUNC(disableUserInput);
};
}] call BIS_fnc_addStackedEventHandler;
["ACE_DisableUserInput", "onEachFrame", {
if (isNull (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) && {!visibleMap && isNull findDisplay 49 && isNull findDisplay 312 && isNull findDisplay 632}) then {
["ACE_DisableUserInput", "onEachFrame"] call BIS_fnc_removeStackedEventHandler;
[true] call FUNC(disableUserInput);
};
}] call BIS_fnc_addStackedEventHandler;
} else {
if ("ACE_DisableUserInput" in ([BIS_stackedEventHandlers_onEachFrame, {_this select 0}] call FUNC(map))) then {
["ACE_DisableUserInput", "onEachFrame"] call BIS_fnc_removeStackedEventHandler;
};
if ("ACE_DisableUserInput" in ([BIS_stackedEventHandlers_onEachFrame, {_this select 0}] call FUNC(map))) then {
["ACE_DisableUserInput", "onEachFrame"] call BIS_fnc_removeStackedEventHandler;
};
(uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0;
(uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0;
};

View File

@ -0,0 +1,144 @@
/*
* Author: commy2, based on BIS_fnc_errorMsg and BIS_fnc_guiMessage by Karel Moricky (BI)
* Stops simulation and opens a textbox with error message.
*
* Arguments:
* ?
*
* Return Value:
* None
*
* Public: No
*/
#include "script_component.hpp"
disableSerialization;
endLoadingScreen;
private ["_textHeader", "_textMessage", "_onOK", "_onCancel"];
_textHeader = _this select 0;
_textMessage = _this select 1;
_onOK = ARR_SELECT(_this,2,{});
_onCancel = ARR_SELECT(_this,3,{});
if (typeName _textMessage == "STRING") then {
_textMessage = parseText _textMessage;
};
(ARR_SELECT(_this,4,call BIS_fnc_displayMission)) createDisplay "RscDisplayCommonMessagePause";
private ["_display", "_ctrlRscMessageBox", "_ctrlBcgCommonTop", "_ctrlBcgCommon", "_ctrlText", "_ctrlBackgroundButtonOK", "_ctrlBackgroundButtonMiddle", "_ctrlBackgroundButtonCancel", "_ctrlButtonOK", "_ctrlButtonCancel"];
_display = uiNamespace getVariable "RscDisplayCommonMessage_display";
_ctrlRscMessageBox = _display displayCtrl 2351;
_ctrlBcgCommonTop = _display displayCtrl 235100;
_ctrlBcgCommon = _display displayCtrl 235101;
_ctrlText = _display displayCtrl 235102;
_ctrlBackgroundButtonOK = _display displayCtrl 235103;
_ctrlBackgroundButtonMiddle = _display displayCtrl 235104;
_ctrlBackgroundButtonCancel = _display displayCtrl 235105;
_ctrlButtonOK = _display displayCtrl 235106;
_ctrlButtonCancel = _display displayCtrl 235107;
_ctrlBcgCommonTop ctrlSetText _textHeader;
private ["_ctrlButtonOKPos", "_ctrlBcgCommonPos", "_bottomSpaceY", "_ctrlTextPos", "_marginX", "_marginY"];
_ctrlButtonOKPos = ctrlPosition _ctrlButtonOK;
_ctrlBcgCommonPos = ctrlPosition _ctrlBcgCommon;
_bottomSpaceY = (_ctrlButtonOKPos select 1) - ((_ctrlBcgCommonPos select 1) + (_ctrlBcgCommonPos select 3));
_ctrlTextPos = ctrlPosition _ctrlText;
_marginX = (_ctrlTextPos select 0) - (_ctrlBcgCommonPos select 0);
_marginY = (_ctrlTextPos select 1) - (_ctrlBcgCommonPos select 1);
private ["_ctrlTextPosH", "_bottomPosY"];
_ctrlText ctrlSetStructuredText _textMessage;
_ctrlTextPosH = ctrlTextHeight _ctrlText;
_ctrlBcgCommon ctrlSetPosition [
_ctrlBcgCommonPos select 0,
_ctrlBcgCommonPos select 1,
_ctrlBcgCommonPos select 2,
_ctrlTextPosH + _marginY * 2
];
_ctrlBcgCommon ctrlCommit 0;
_ctrlText ctrlSetPosition [
(_ctrlBcgCommonPos select 0) + _marginX,
(_ctrlBcgCommonPos select 1) + _marginY,
(_ctrlBcgCommonPos select 2) - _marginX * 2,
_ctrlTextPosH
];
_ctrlText ctrlCommit 0;
_bottomPosY = (_ctrlBcgCommonPos select 1) + _ctrlTextPosH + (_marginY * 2) + _bottomSpaceY;
{
private "_xPos";
_xPos = ctrlPosition _x;
_xPos set [1, _bottomPosY];
_x ctrlSetPosition _xPos;
_x ctrlCommit 0;
} foreach [
_ctrlBackgroundButtonOK,
_ctrlBackgroundButtonMiddle,
_ctrlBackgroundButtonCancel,
_ctrlButtonOK,
_ctrlButtonCancel
];
private ["_ctrlRscMessageBoxPos", "_ctrlRscMessageBoxPosH"];
_ctrlRscMessageBoxPos = ctrlPosition _ctrlRscMessageBox;
_ctrlRscMessageBoxPosH = _bottomPosY + (_ctrlButtonOKPos select 3);
_ctrlRscMessageBox ctrlSetPosition [
0.5 - (_ctrlBcgCommonPos select 2) / 2,
0.5 - _ctrlRscMessageBoxPosH / 2,
(_ctrlBcgCommonPos select 2) + 0.5,
_ctrlRscMessageBoxPosH
];
_ctrlRscMessageBox ctrlEnable true;
_ctrlRscMessageBox ctrlCommit 0;
if (_onOK isEqualTo {}) then {
_ctrlButtonOK ctrlEnable false;
_ctrlButtonOK ctrlSetFade 0;
_ctrlButtonOK ctrlSetText "";
_ctrlButtonOK ctrlCommit 0;
} else {
_ctrlButtonOK ctrlEnable true;
_ctrlButtonOK ctrlSetFade 0;
_ctrlButtonOK ctrlSetText localize "STR_DISP_OK";
_ctrlButtonOK ctrlCommit 0;
ctrlSetFocus _ctrlButtonOK;
};
if (_onCancel isEqualTo {}) then {
_ctrlButtonCancel ctrlEnable false;
_ctrlButtonCancel ctrlSetFade 0;
_ctrlButtonCancel ctrlSetText "";
_ctrlButtonCancel ctrlCommit 0;
} else {
_ctrlButtonCancel ctrlEnable true;
_ctrlButtonCancel ctrlSetFade 0;
_ctrlButtonCancel ctrlSetText localize "STR_DISP_CANCEL";
_ctrlButtonCancel ctrlCommit 0;
ctrlSetFocus _ctrlButtonCancel;
};
_ctrlButtonOK ctrlAddEventHandler ["buttonClick", {(ctrlParent (_this select 0)) closeDisplay 1; true}];
_ctrlButtonCancel ctrlAddEventHandler ["buttonClick", {(ctrlParent (_this select 0)) closeDisplay 2; true}];
GVAR(errorOnOK) = _onOK;
GVAR(errorOnCancel) = _onCancel;
_display displayAddEventHandler ["unload", {call ([{}, GVAR(errorOnOK), GVAR(errorOnCancel)] select (_this select 1))}];
_display displayAddEventHandler ["keyDown", {_this select 1 == 1}];

View File

@ -11,4 +11,4 @@
#define DEBUG_SETTINGS DEBUG_SETTINGS_COMMON
#endif
#include "\z\ace\addons\main\script_macros.hpp"
#include "\z\ace\addons\main\script_macros.hpp"

View File

@ -22,4 +22,4 @@ if !([_unit, _target, []] call EFUNC(common,canInteractWith)) exitWith {false};
// a static weapon has to be empty for dragging
if ((typeOf _target) isKindOf "StaticWeapon" && {count crew _target > 0}) exitWith {false};
alive _target && {_target getVariable [QGVAR(canCarry), false]} && {animationState _target in ["", "unconscious"] || (_target getvariable ["ACE_isUnconscious", false]) || (_target isKindOf "CAManBase" && {(_target getHitPointDamage "HitLeftLeg") + (_target getHitPointDamage "HitRightLeg") > 0.4})}
alive _target && {_target getVariable [QGVAR(canCarry), false]} && {animationState _target in ["", "unconscious"] || (_target getvariable ["ACE_isUnconscious", false]) || (_target isKindOf "CAManBase" && {(_target getHitPointDamage "HitLegs") > 0.4})}

View File

@ -22,4 +22,4 @@ if !([_unit, _target, []] call EFUNC(common,canInteractWith)) exitWith {false};
// a static weapon has to be empty for dragging
if ((typeOf _target) isKindOf "StaticWeapon" && {count crew _target > 0}) exitWith {false};
alive _target && {_target getVariable [QGVAR(canDrag), false]} && {animationState _target in ["", "unconscious"] || (_target getvariable ["ACE_isUnconscious", false]) || (_target isKindOf "CAManBase" && {(_target getHitPointDamage "HitLeftLeg") + (_target getHitPointDamage "HitRightLeg") > 0.4})};
alive _target && {_target getVariable [QGVAR(canDrag), false]} && {animationState _target in ["", "unconscious"] || (_target getvariable ["ACE_isUnconscious", false]) || (_target isKindOf "CAManBase" && {(_target getHitPointDamage "HitLegs") > 0.4})};

View File

@ -9,8 +9,6 @@ _isUnconscious = _this select 1;
private "_player";
_player = ACE_player;
if ((_unit getHitPointDamage "HitLeftLeg") + (_unit getHitPointDamage "HitRightLeg") > 0.4) exitwith {};
if (_player getVariable [QGVAR(isDragging), false]) then {
private "_draggedObject";
@ -22,9 +20,9 @@ if (_player getVariable [QGVAR(isDragging), false]) then {
};
// handle waking up dragged unit
if (_unit == _draggedObject) then {
[_player, _draggedObject] call FUNC(dropObject);
};
//if (_unit == _draggedObject) then {
// [_player, _draggedObject] call FUNC(dropObject);
//};
};
@ -39,8 +37,8 @@ if (_player getVariable [QGVAR(isCarrying), false]) then {
};
// handle waking up dragged unit
if (_unit == _carriedObject) then {
[_player, _carriedObject] call FUNC(dropObject_carry);
};
//if (_unit == _carriedObject) then {
// [_player, _carriedObject] call FUNC(dropObject_carry);
//};
};

View File

@ -20,3 +20,7 @@ class CfgPatches {
#include "CfgWeapons.hpp"
#include "CfgOptics.hpp"
class ACE_Extensions {
extensions[] += {"ace_fcs"};
};

View File

@ -1,6 +1,7 @@
class CfgMagazines {
class HandGrenade;
class ACE_HandFlare_Base: HandGrenade {
scope = 1;
value = 2;
nameSoundWeapon = "smokeshell";
nameSound = "smokeshell";
@ -8,6 +9,8 @@ class CfgMagazines {
initSpeed = 22;
};
class ACE_HandFlare_White: ACE_HandFlare_Base {
author = "$STR_ACE_Common_ACETeam";
scope = 2;
ammo = "ACE_F_Hand_White";
displayname = "$STR_ACE_Grenades_M127A1_White_Name";
descriptionshort = "$STR_ACE_Grenades_M127A1_White_Description";
@ -16,6 +19,8 @@ class CfgMagazines {
picture = "\A3\Weapons_F\Data\UI\gear_flare_white_ca.paa";
};
class ACE_HandFlare_Red: ACE_HandFlare_Base {
author = "$STR_ACE_Common_ACETeam";
scope = 2;
ammo = "ACE_F_Hand_Red";
displayname = "$STR_ACE_Grenades_M127A1_Red_Name";
descriptionshort = "$STR_ACE_Grenades_M127A1_Red_Description";
@ -24,6 +29,8 @@ class CfgMagazines {
picture = "\A3\Weapons_F\Data\UI\gear_flare_red_ca.paa";
};
class ACE_HandFlare_Green: ACE_HandFlare_Base {
author = "$STR_ACE_Common_ACETeam";
scope = 2;
ammo = "ACE_F_Hand_Green";
displayname = "$STR_ACE_Grenades_M127A1_Green_Name";
descriptionshort = "$STR_ACE_Grenades_M127A1_Green_Description";
@ -32,6 +39,8 @@ class CfgMagazines {
picture = "\A3\Weapons_F\Data\UI\gear_flare_green_ca.paa";
};
class ACE_HandFlare_Yellow: ACE_HandFlare_Base {
author = "$STR_ACE_Common_ACETeam";
scope = 2;
ammo = "ACE_F_Hand_Yellow";
displayname = "$STR_ACE_Grenades_M127A1_Yellow_Name";
descriptionshort = "$STR_ACE_Grenades_M127A1_Yellow_Description";
@ -40,20 +49,24 @@ class CfgMagazines {
picture = "\A3\Weapons_F\Data\UI\gear_flare_yellow_ca.paa";
};
class ACE_M84: HandGrenade {
author = "$STR_ACE_Common_ACETeam";
ammo = "ACE_G_M84";
displayname = "$STR_ACE_Grenades_M84_Name";
descriptionshort = "$STR_ACE_Grenades_M84_Description";
displayNameShort = "M84";
mass = 4;
model = PATHTOF(models\ACE_m84.p3d);
picture = PATHTOF(UI\ACE_m84_x_ca.paa);
};
class 3Rnd_UGL_FlareGreen_F;
class 6Rnd_GreenSignal_F: 3Rnd_UGL_FlareGreen_F {
author = "$STR_ACE_Common_ACETeam";
ammo = "F_40mm_Green";
initSpeed = 120;
};
class 6Rnd_RedSignal_F: 6Rnd_GreenSignal_F {
author = "$STR_ACE_Common_ACETeam";
ammo = "F_40mm_Red";
initSpeed = 120;
};

View File

@ -80,7 +80,7 @@ _affected = _grenade nearEntities ["CAManBase", 20];
//Add ace_medical pain effect:
if ((isClass (configFile >> "CfgPatches" >> "ACE_Medical")) && {_strength > 0}) then {
if ((isClass (configFile >> "CfgPatches" >> "ACE_Medical")) && {_strength > 0.1}) then {
[ACE_player, (_strength / 2)] call EFUNC(medical,adjustPainLevel);
};

View File

@ -0,0 +1,7 @@
class CfgActions {
class None;
class OpenBag: None {
showWindow = 0;
};
};

View File

@ -3,6 +3,15 @@
if (!hasInterface) exitWith {};
//Setup text/shadow color matrix
[] call FUNC(setupTextColors);
["SettingChanged", {
PARAMS_2(_name,_value);
if ((_name == QGVAR(colorTextMax)) || {_name == QGVAR(colorTextMin)} || {_name == QGVAR(colorShadowMax)} || {_name == QGVAR(colorShadowMin)}) then {
[] call FUNC(setupTextColors);
};
}] call EFUNC(common,addEventhandler);
// Install the render EH on the main display
addMissionEventHandler ["Draw3D", DFUNC(render)];

View File

@ -21,6 +21,7 @@ PREP(renderBaseMenu);
PREP(renderIcon);
PREP(renderMenu);
PREP(renderSelector);
PREP(setupTextColors);
PREP(splitPath);
GVAR(keyDown) = false;

View File

@ -14,6 +14,8 @@ class CfgPatches {
#include "CfgEventHandlers.hpp"
#include "CfgActions.hpp"
#include "CursorMenus.hpp"
class ACE_Settings {
@ -23,10 +25,44 @@ class ACE_Settings {
isClientSettable = 1;
displayName = "$STR_ACE_Interact_Menu_AlwaysUseCursorSelfInteraction";
};
class GVAR(AlwaysUseCursorInteraction) {
value = 0;
typeName = "BOOL";
isClientSettable = 1;
displayName = "$STR_ACE_Interact_Menu_AlwaysUseCursorInteraction";
};
class GVAR(UseListMenu) {
value = 0;
typeName = "BOOL";
isClientSettable = 1;
displayName = "$STR_ACE_Interact_Menu_UseListMenu";
};
class GVAR(colorTextMax) {
value[] = {1, 1, 1, 1};
typeName = "COLOR";
isClientSettable = 1;
displayName = "$STR_ACE_Interact_Menu_ColorTextMax";
};
class GVAR(colorTextMin) {
value[] = {1, 1, 1, 0.25};
typeName = "COLOR";
isClientSettable = 1;
displayName = "$STR_ACE_Interact_Menu_ColorTextMin";
};
class GVAR(colorShadowMax) {
value[] = {1, 1, 1, 1};
typeName = "COLOR";
isClientSettable = 1;
displayName = "$STR_ACE_Interact_Menu_ColorShadowMax";
};
class GVAR(colorShadowMin) {
value[] = {1, 1, 1, 0.25};
typeName = "COLOR";
isClientSettable = 1;
displayName = "$STR_ACE_Interact_Menu_ColorShadowMin";
};
};
class ACE_Extensions {
extensions[] += {"ace_breakLine"};
};

View File

@ -33,7 +33,9 @@ GVAR(lastTimeSearchedActions) = -1000;
GVAR(useCursorMenu) = (vehicle ACE_player != ACE_player) ||
visibleMap ||
{(_menuType == 1) && {(isWeaponDeployed ACE_player) || GVAR(AlwaysUseCursorSelfInteraction) || {cameraView == "GUNNER"}}};
{(_menuType == 1) && {(isWeaponDeployed ACE_player) || GVAR(AlwaysUseCursorSelfInteraction) || {cameraView == "GUNNER"}}} ||
{(_menuType == 0) && GVAR(AlwaysUseCursorInteraction)};
if (GVAR(useCursorMenu)) then {
createDialog QGVAR(cursorMenu);
// The dialog sets:

View File

@ -4,12 +4,11 @@
*
* Argument:
* 0: Text <STRING>
* 1: Color <STRING>
* 1: Icon <STRING>
* 2: 2d position <ARRAY>
* 3: ?
* 4: ?
* 5: ?
* 6: Icon <STRING>
* 3: Color <STRING>
* 4: Shadow Color <STRING>
* 5: Icon Color <STRING>
*
* Return value:
* None
@ -18,11 +17,8 @@
*/
#include "script_component.hpp"
#define DEFAULT_ICON QUOTE(\z\ace\addons\interaction\ui\dot_ca.paa)
private ["_color", "_sPos", "_ctrl", "_icon"];
_text = _this select 0;
_color = _this select 1;
_sPos = _this select 2;
_icon = _this select 6;
private ["_ctrl"];
PARAMS_6(_text,_icon,_sPos,_textColor,_shadowColor,_iconColor);
//systemChat format ["Icon %1 - %2,%3", _text, _sPos select 0, _sPos select 1];
@ -37,16 +33,15 @@ if(_icon == "") then {
};
_text = if (GVAR(UseListMenu)) then {
format ["<img image='%1' color='%2' align='left'/><t color='%3' size='0.80' shadow='1' shadowColor='#000000' shadowOffset='0.07'>%4</t>", _icon, _color, _color, _text]
format ["<img image='%1' color='%2' align='left'/><t color='%3' size='0.80' shadow='1' shadowColor='%4' shadowOffset='0.06'>%5</t>", _icon, _iconColor, _textColor, _shadowColor, _text]
} else {
format ["<img image='%1' color='%2' align='center'/><br/><t color='%3' size='0.80' align='center' shadow='1' shadowColor='#000000' shadowOffset='0.07'>%4</t>", _icon, _color, _color, "ace_breakLine" callExtension _text];
format ["<img image='%1' color='%2' align='center'/><br/><t color='%3' size='0.80' align='center' shadow='1' shadowColor='%4' shadowOffset='0.06'>%5</t>", _icon, _iconColor, _textColor, _shadowColor, "ace_breakLine" callExtension _text];
};
_ctrl ctrlSetStructuredText (parseText _text);
_text = if (GVAR(UseListMenu)) then {
_ctrl ctrlSetPosition [(_sPos select 0)-(0.0095*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.20*SafeZoneW, 0.035*SafeZoneW];
_ctrl ctrlSetPosition [(_sPos select 0)-(0.0095*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.20*SafeZoneW, 0.035*SafeZoneW];
} else {
_ctrl ctrlSetPosition [(_sPos select 0)-(0.0750*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.15*SafeZoneW, 0.100*SafeZoneW];
_ctrl ctrlSetPosition [(_sPos select 0)-(0.0750*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.15*SafeZoneW, 0.100*SafeZoneW];
};
//_ctrl ctrlSetBackgroundColor [0, 1, 0, 0.1];
_ctrl ctrlCommit 0;

View File

@ -45,19 +45,17 @@ _menuInSelectedPath = true;
// Render icon
// ARGB Color (First Hex Pair is transparancy)
_color = "#FFFFFFFF";
_textColor = GVAR(colorSelected);
_shadowColor = GVAR(colorSelectedShadow);
if(!_menuInSelectedPath) then {
if (_menuDepth > 0) then {
_color = format ["#%1FFFFFF", [255 * ((((count _path) - 1)/_menuDepth) max 0.25)] call EFUNC(common,toHex)];
} else {
_color = format ["#%1FFFFFF", [255 * 0.75] call EFUNC(common,toHex)];
};
_textColor = (GVAR(colorNotSelectedMatrix) select (count _path)) select _menuDepth;
_shadowColor = (GVAR(colorShadowNotSelectedMatrix) select (count _path)) select _menuDepth;
};
//END_COUNTER(constructing_colors);
//BEGIN_COUNTER(fnc_renderIcons);
[_actionData select 1, _color, _sPos, 1, 1, 0, _actionData select 2, 0.5, 0.025, "TahomaB"] call FUNC(renderIcon);
[_actionData select 1, _actionData select 2, _sPos, _textColor, _shadowColor, "#FFFFFFFF"] call FUNC(renderIcon);
//END_COUNTER(fnc_renderIcons);

View File

@ -0,0 +1,52 @@
/*
* Author: PabstMirror
* Builds color strings needed for displaying interaction text
*
* Argument:
* None
*
* Return value:
* None
*
* Public: No
*/
#include "script_component.hpp"
private ["_mixColor", "_rowT", "_rowS", "_menuDepth", "_pathCount", "_menuInSelectedPath", "_color", "_path"];
//Mixes 2 colors (number arrays) and makes a color string "#AARRGGBB" for structured text
_mixColor = {
PARAMS_3(_color1,_color2,_ratio);
private ["_return", "_mix", "_index"];
_return = "";
for "_index" from 0 to 3 do {
_mix = linearConversion [0, 1, _ratio, (_color1 select _index), (_color2 select _index)];
if (_index != 3) then {
_return = _return + ([255 * _mix] call EFUNC(common,toHex));
} else {
_return = "#" + ([255 * _mix] call EFUNC(common,toHex)) + _return;
};
};
_return
};
GVAR(colorSelected) = [GVAR(colorTextMin), GVAR(colorTextMax), 1] call _mixColor;
GVAR(colorSelectedShadow) = [GVAR(colorShadowMin), GVAR(colorShadowMax), 1] call _mixColor;
GVAR(colorNotSelectedMatrix) = [];
GVAR(colorShadowNotSelectedMatrix) = [];
for "_pathCount" from 0 to 15 do {
_rowT = [];
_rowS = [];
for "_menuDepth" from 0 to 15 do {
if (_menuDepth > 0) then {
_rowT pushBack ([GVAR(colorTextMin), GVAR(colorTextMax), (((_pathCount - 1) / _menuDepth) max 0.25)] call _mixColor);
_rowS pushBack ([GVAR(colorShadowMin), GVAR(colorShadowMax), (((_pathCount - 1) / _menuDepth) max 0.25)] call _mixColor);
} else {
_rowT pushBack ([GVAR(colorTextMin), GVAR(colorTextMax), 0] call _mixColor);
_rowS pushBack ([GVAR(colorShadowMin), GVAR(colorShadowMax), 0] call _mixColor);
};
};
GVAR(colorNotSelectedMatrix) pushBack _rowT;
GVAR(colorShadowNotSelectedMatrix) pushBack _rowS;
};

View File

@ -12,6 +12,12 @@
<Hungarian>Mindig legyen a saját cselekvés kurzorja látható</Hungarian>
<Italian>Mostra sempre il cursore per le auto interazioni</Italian>
</Key>
<Key ID="STR_ACE_Interact_Menu_AlwaysUseCursorInteraction">
<English>Always display cursor for interaction</English>
<Spanish>Mostrar siempre el cursor para la interacción</Spanish>
<French>Toujours afficher le curseur pour les interactions</French>
<Italian>Mostra sempre il cursore per le interazioni</Italian>
</Key>
<Key ID="STR_ACE_Interact_Menu_UseListMenu">
<English>Display interaction menus as lists</English>
<Spanish>Mostrar los menus de interacción como listas</Spanish>
@ -65,5 +71,17 @@
<Hungarian>Járműves cselekvések</Hungarian>
<Italian>Interazioni con veicoli</Italian>
</Key>
<Key ID="STR_ACE_Interact_Menu_ColorTextMax">
<English>Interaction - Text Max</English>
</Key>
<Key ID="STR_ACE_Interact_Menu_ColorTextMin">
<English>Interaction - Text Min</English>
</Key>
<Key ID="STR_ACE_Interact_Menu_ColorShadowMax">
<English>Interaction - Shadow Max</English>
</Key>
<Key ID="STR_ACE_Interact_Menu_ColorShadowMin">
<English>Interaction - Shadow Min</English>
</Key>
</Package>
</Project>
</Project>

View File

@ -24,6 +24,10 @@ _actionTrees = missionNamespace getVariable [_varName, []];
_actions = [];
// Mount unit MainActions menu
_actions pushBack [(_actionTrees select 0) select 0, (_actionTrees select 0) select 1, _unit];
{
EXPLODE_2_PVT(_x,_actionData,_children);
_actions pushBack [_actionData, _children, _unit];
} forEach ((_actionTrees select 0) select 1);
_actions

View File

@ -72,7 +72,7 @@ _vehicle = vehicle _unit;
// Do not obscure the map if the player is on a enclosed vehicle (assume internal illumination)
if (_vehicle != _unit) then {
// Player is in a vehicle
if (isTurnedOut _unit && {_vehicle isKindOf "Tank" || {_vehicle isKindOf "Wheeled_APC"}}) then {
if (isTurnedOut _unit && { _vehicle isKindOf "Tank" || { ( _vehicle isKindOf "Helicopter" || _vehicle isKindOf "Plane" ) && { (driver _vehicle) == _unit || { (gunner _vehicle) == _unit } } } || {_vehicle isKindOf "Wheeled_APC"}}) then {
_isEnclosed = true;
};
};

View File

@ -3,6 +3,7 @@ class ACE_Head {
displayName = "$STR_ACE_Interaction_Head";
runOnHover = 1;
statement = QUOTE([ARR_3(_target, true, 0)] call DFUNC(displayPatientInformation));
condition = "true";
EXCEPTIONS
icon = PATHTOF(UI\icons\medical_cross.paa);
distance = MEDICAL_ACTION_DISTANCE;
@ -74,6 +75,7 @@ class ACE_Torso {
displayName = "$STR_ACE_Interaction_Torso";
runOnHover = 1;
statement = QUOTE([ARR_3(_target, true, 1)] call DFUNC(displayPatientInformation));
condition = "true";
EXCEPTIONS
icon = PATHTOF(UI\icons\medical_cross.paa);
distance = MEDICAL_ACTION_DISTANCE;
@ -173,6 +175,7 @@ class ACE_ArmLeft {
displayName = "$STR_ACE_Interaction_ArmLeft";
runOnHover = 1;
statement = QUOTE([ARR_3(_target, true, 2)] call DFUNC(displayPatientInformation));
condition = "true";
EXCEPTIONS
icon = PATHTOF(UI\icons\medical_cross.paa);
distance = MEDICAL_ACTION_DISTANCE;
@ -329,6 +332,7 @@ class ACE_ArmRight {
displayName = "$STR_ACE_Interaction_ArmRight";
runOnHover = 1;
statement = QUOTE([ARR_3(_target, true, 3)] call DFUNC(displayPatientInformation));
condition = "true";
EXCEPTIONS
icon = PATHTOF(UI\icons\medical_cross.paa);
distance = MEDICAL_ACTION_DISTANCE;
@ -423,8 +427,8 @@ class ACE_ArmRight {
};
class PlasmaIV: BloodIV {
displayName = "$STR_ACE_MEDICAL_ACTIONS_Plasma4_1000";
condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'BloodIV')] call DFUNC(canTreatCached));
statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'BloodIV')] call DFUNC(treatment));
condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'PlasmaIV')] call DFUNC(canTreatCached));
statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'PlasmaIV')] call DFUNC(treatment));
EXCEPTIONS
};
class PlasmaIV_500: PlasmaIV {
@ -482,6 +486,7 @@ class ACE_LegLeft {
displayName = "$STR_ACE_Interaction_LegLeft";
runOnHover = 1;
statement = QUOTE([ARR_3(_target, true, 4)] call DFUNC(displayPatientInformation));
condition = "true";
EXCEPTIONS
icon = PATHTOF(UI\icons\medical_cross.paa);
distance = MEDICAL_ACTION_DISTANCE;
@ -578,8 +583,8 @@ class ACE_LegLeft {
};
class PlasmaIV: BloodIV {
displayName = "$STR_ACE_MEDICAL_ACTIONS_Plasma4_1000";
condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'BloodIV')] call DFUNC(canTreatCached));
statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'BloodIV')] call DFUNC(treatment));
condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'PlasmaIV')] call DFUNC(canTreatCached));
statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'PlasmaIV')] call DFUNC(treatment));
EXCEPTIONS
};
class PlasmaIV_500: PlasmaIV {
@ -623,6 +628,7 @@ class ACE_LegRight {
displayName = "$STR_ACE_Interaction_LegRight";
runOnHover = 1;
statement = QUOTE([ARR_3(_target, true, 5)] call DFUNC(displayPatientInformation));
condition = "true";
EXCEPTIONS
icon = PATHTOF(UI\icons\medical_cross.paa);
distance = MEDICAL_ACTION_DISTANCE;
@ -718,8 +724,8 @@ class ACE_LegRight {
};
class PlasmaIV: BloodIV {
displayName = "$STR_ACE_MEDICAL_ACTIONS_Plasma4_1000";
condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'BloodIV')] call DFUNC(canTreatCached));
statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'BloodIV')] call DFUNC(treatment));
condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'PlasmaIV')] call DFUNC(canTreatCached));
statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'PlasmaIV')] call DFUNC(treatment));
EXCEPTIONS
};
class PlasmaIV_500: PlasmaIV {

View File

@ -4,6 +4,7 @@ class Medical {
hotkey = "M";
exceptions[] = {"isNotInside"};
statement = QUOTE([ARR_3(_target, true, 0)] call DFUNC(displayPatientInformation));
condition = "true";
icon = PATHTOF(UI\icons\medical_cross.paa);
class ACE_Head {
@ -11,6 +12,7 @@ class Medical {
icon = PATHTOF(UI\icons\medical_cross.paa);
exceptions[] = {"isNotInside"};
statement = QUOTE([ARR_3(_target, true, 0)] call DFUNC(displayPatientInformation));
condition = "true";
runOnHover = 1;
class Bandage {
@ -146,6 +148,7 @@ class Medical {
runOnHover = 1;
exceptions[] = {"isNotInside"};
statement = QUOTE([ARR_3(_target, true, 2)] call DFUNC(displayPatientInformation));
condition = "true";
icon = PATHTOF(UI\icons\medical_cross.paa);
class Bandage {
@ -246,6 +249,7 @@ class Medical {
runOnHover = 1;
exceptions[] = {"isNotInside"};
statement = QUOTE([ARR_3(_target, true, 3)] call DFUNC(displayPatientInformation));
condition = "true";
icon = PATHTOF(UI\icons\medical_cross.paa);
class Bandage {
@ -342,6 +346,7 @@ class Medical {
runOnHover = 1;
exceptions[] = {"isNotInside"};
statement = QUOTE([ARR_3(_target, true, 4)] call DFUNC(displayPatientInformation));
condition = "true";
icon = PATHTOF(UI\icons\medical_cross.paa);
class Bandage {
@ -427,6 +432,7 @@ class Medical {
runOnHover = 1;
exceptions[] = {"isNotInside"};
statement = QUOTE([ARR_3(_target, true, 5)] call DFUNC(displayPatientInformation));
condition = "true";
icon = PATHTOF(UI\icons\medical_cross.paa);
class Bandage {

View File

@ -79,16 +79,16 @@ class ACE_Settings {
displayName = "$STR_ACE_Medical_litterSimulationDetail";
description = "$STR_ACE_Medical_litterSimulationDetail_Desc";
typeName = "SCALAR";
value = 3;
values[] = {"Off", "Low", "Medium", "High", "Ultra"};
_values[] = { 0, 50, 100, 1000, 5000 };
isClientSettable = 1;
};
class GVAR(litterCleanUpDelay) {
typeName = "SCALAR";
value = 0;
value = 0;
};
class GVAR(medicSetting_PAK) {
typeName = "SCALAR";
@ -135,4 +135,12 @@ class ACE_Settings {
values[] = {"$STR_ACE_Medical_painEffect_Flash", "$STR_ACE_Medical_painEffect_Chroma"};
isClientSettable = 1;
};
class GVAR(allowUnconsciousAnimationOnTreatment) {
typeName = "BOOL";
value = 0;
};
class GVAR(moveUnitsFromGroupOnUnconscious) {
typeName = "BOOL";
value = 0;
};
};

View File

@ -6,5 +6,5 @@ _unit = _this select 0;
_unit addEventHandler ["HandleDamage", {_this call FUNC(handleDamage)}];
if (local _unit) then {
[_unit] call FUNC(init);
[_unit] call FUNC(init);
};

View File

@ -241,7 +241,7 @@ if (USE_WOUND_EVENT_SYNC) then {
// We are only pulling the wounds for the units in the player group. Anything else will come when the unit interacts with them.
{
[_x, _newPlayer] call FUNC(requestWoundSync);
}foreach units group player;
}foreach units group _newPlayer;
};
}] call EFUNC(common,addEventhandler);
};

View File

@ -96,6 +96,7 @@ PREP(moduleAssignMedicalFacility);
PREP(moduleTreatmentConfiguration);
PREP(copyDeadBody);
PREP(requestWoundSync);
PREP(unconsciousPFH);
// Networked litter
PREP(createLitter);

View File

@ -6,7 +6,6 @@ _unit = _this select 0;
if !(local _unit) exitWith {};
diag_log "running respawn";
[_unit] call FUNC(init);
//Reset captive status for respawning unit

View File

@ -23,10 +23,10 @@ if ([_target] call EFUNC(common,isAwake)) exitwith {
["displayTextStructured", [_caller], [["This person (%1) is awake and cannot be loaded", [_target] call EFUNC(common,getName)], 1.5, _caller]] call EFUNC(common,targetEvent);
};
if ([_target] call FUNC(isBeingCarried)) then {
[_caller, _target] call FUNC(dropObject_carry);
[_caller, _target] call FUNC(dropObject_carry);
};
if ([_target] call FUNC(isBeingDragged)) then {
[_caller, _target] call FUNC(dropObject);
[_caller, _target] call FUNC(dropObject);
};
_vehicle = [_caller, _target] call EFUNC(common,loadPerson);

View File

@ -19,4 +19,4 @@
#define MAX_DURATION_CACHE 2
// parameters, function, namespace, uid
[_this, DFUNC(canTreat), _this select 0, format[QGVAR(canTreat_%1_%2), _this select 2, _this select 3], MAX_DURATION_CACHE, "clearConditionCaches"] call EFUNC(common,cachedCall);
[_this, DFUNC(canTreat), _this select 1, format[QGVAR(canTreat_%1_%2), _this select 2, _this select 3], MAX_DURATION_CACHE, "clearConditionCaches"] call EFUNC(common,cachedCall);

View File

@ -21,10 +21,10 @@ if ((vehicle _unit != _unit) && {!alive (vehicle _unit)}) exitwith { true };
// Find the correct Damage threshold for unit.
_damageThreshold = [1,1,1];
if (isPlayer _unit) then {
//_damageThreshold =_unit getvariable[QGVAR(unitDamageThreshold), [GVAR(damageThreshold_Players), GVAR(damageThreshold_Players), GVAR(damageThreshold_Players) * 1.7]];
if ([_unit] call EFUNC(common,IsPlayer)) then {
_damageThreshold =_unit getvariable[QGVAR(unitDamageThreshold), [GVAR(playerDamageThreshold), GVAR(playerDamageThreshold), GVAR(playerDamageThreshold) * 1.7]];
} else {
//_damageThreshold =_unit getvariable[QGVAR(unitDamageThreshold), [GVAR(damageThreshold_AI), GVAR(damageThreshold_AI), GVAR(damageThreshold_AI) * 1.7]];
_damageThreshold =_unit getvariable[QGVAR(unitDamageThreshold), [GVAR(AIDamageThreshold), GVAR(AIDamageThreshold), GVAR(AIDamageThreshold) * 1.7]];
};
_damageBodyPart = ((_unit getvariable [QGVAR(bodyPartStatus),[0, 0, 0, 0, 0, 0]]) select _part) + _withDamage;

View File

@ -59,20 +59,30 @@ if (isClass (_config >> _className)) then {
_bandagedWounds = _target getvariable [QGVAR(bandagedWounds), []];
_exist = false;
_injuryId = _injury select 0;
_bandagedInjury = [];
{
if ((_x select 0) == _injuryId) exitwith {
_exist = true;
_existingInjury = _x;
_existingInjury set [3, (_existingInjury select 3) + _impact];
_bandagedWounds set [_foreachIndex, _existingInjury];
_bandagedInjury = _existingInjury;
};
}foreach _bandagedWounds;
if !(_exist) then {
// [ID, classID, bodypart, percentage treated, bloodloss rate]
_bandagedWounds pushback [_injuryId, _injury select 1, _injury select 2, _impact, _injury select 4];
_bandagedInjury = [_injuryId, _injury select 1, _injury select 2, _impact, _injury select 4];
_bandagedWounds pushback _bandagedInjury;
};
_target setvariable [QGVAR(bandagedWounds), _bandagedWounds, !USE_WOUND_EVENT_SYNC];
if (USE_WOUND_EVENT_SYNC) then {
// sync _bandagedInjury
};
_target setvariable [QGVAR(bandagedWounds), _bandagedWounds, true];
// Check if we are ever going to reopen this
if (random(1) <= _reopeningChance) then {
@ -109,7 +119,7 @@ if (random(1) <= _reopeningChance) then {
}foreach _bandagedWounds;
if (_exist) then {
_target setvariable [QGVAR(bandagedWounds), _bandagedWounds, true];
_target setvariable [QGVAR(bandagedWounds), _bandagedWounds, !USE_WOUND_EVENT_SYNC];
};
};
// Otherwise something went wrong, we we don't reopen them..

View File

@ -57,6 +57,12 @@ if (GVAR(level) >= 2) then {
_minLethalDamage = GVAR(minLethalDamages) select _typeIndex;
};
if (vehicle _unit != _unit && {!(vehicle _unit isKindOf "StaticWeapon")} && {isNull _source} && {_projectile == ""} && {_selection == ""}) then {
if (GVAR(enableVehicleCrashes)) then {
_selection = GVAR(SELECTIONS) select (floor(random(count GVAR(SELECTIONS))));
};
};
if ((_minLethalDamage <= _newDamage) && {[_unit, [_selection] call FUNC(selectionNameToNumber), _newDamage] call FUNC(determineIfFatal)} && {_selection in ["", "head", "body"]}) then {
if ([_unit] call FUNC(setDead)) then {
_damageReturn = 1;

View File

@ -33,10 +33,12 @@ if (isNull _sourceOfDamage && {_typeOfProjectile == ""} && {vehicle _unit == _un
};
_typeOfDamage = [_typeOfProjectile] call FUNC(getTypeOfDamage);
_part = [_selectionName] call FUNC(selectionNameToNumber);
if (_part < 0) exitwith {};
_hitPoints = ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"];
// Sorting out the damage
_damageBodyParts = _unit getvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]];
_damageBodyParts set [_part, (_damageBodyParts select _part) + _newDamage];
_unit setvariable [QGVAR(bodyPartStatus), _damageBodyParts, true];

View File

@ -38,7 +38,7 @@ if (_selectionName in _hitSelections) then {
// Check for vehicle crash
if (vehicle _unit != _unit && {!(vehicle _unit isKindOf "StaticWeapon")} && {isNull _source} && {_projectile == ""} && {_selectionName == ""}) then {
if (missionNamespace getvariable [QGVAR(allowVehicleCrashDamage), true]) then {
if (GVAR(enableVehicleCrashes)) then {
_selectionName = _hitSelections select (floor(random(count _hitSelections)));
_projectile = "vehiclecrash";
};

View File

@ -133,7 +133,6 @@ if (count _woundsCreated > 0) then {
};
if (USE_WOUND_EVENT_SYNC) then {
// TODO Should this be done in a single broadcast?
// Broadcast the new injuries across the net in parts. One broadcast per injury. Prevents having to broadcast one massive array of injuries.
{
["medical_propagateWound", [_unit, _x]] call EFUNC(common,globalEvent);

View File

@ -22,4 +22,14 @@ if (_local) then {
if (_unit getvariable[QGVAR(addedToUnitLoop),false]) then {
[_unit, true] call FUNC(addToInjuredCollection);
};
if ((_unit getvariable ["ACE_isUnconscious",false]) && {count (_unit getvariable [QGVAR(unconsciousArguments), []]) >= 7}) then {
private "_arguments";
_arguments = (_unit getvariable [QGVAR(unconsciousArguments), []]);
_arguments set [ 3, time];
[DFUNC(unconsciousPFH), 0.1, _arguments ] call CBA_fnc_addPerFrameHandler;
_unit setvariable [QGVAR(unconsciousArguments), nil, true];
};
};

View File

@ -94,7 +94,7 @@ if (GVAR(level) >= 2) then {
if ([_unit] call EFUNC(common,isAwake)) then {
if (_bloodVolume < 60) then {
if (random(1) > 0.9) then {
[_unit] call FUNC(setUnconscious);
[_unit, true, 15 + random(20)] call FUNC(setUnconscious);
};
};
};
@ -136,7 +136,7 @@ if (GVAR(level) >= 2) then {
if (!(_unit getvariable [QGVAR(inCardiacArrest),false])) then {
if (_heartRate < 10 || _bloodPressureH < 30 || _bloodVolume < 20) then {
[_unit] call FUNC(setUnconscious); // safety check to ensure unconsciousness for units if they are not dead already.
[_unit, true, 10+ random(20)] call FUNC(setUnconscious); // safety check to ensure unconsciousness for units if they are not dead already.
};
if (_bloodPressureH > 260) then {

View File

@ -13,7 +13,7 @@
#include "script_component.hpp"
private ["_unit", "_allUsedMedication", "_logs"];
private ["_unit", "_allUsedMedication", "_logs", "_forceNew"];
_unit = _this select 0;
@ -28,6 +28,7 @@ _unit setvariable [QGVAR(tourniquets), [0,0,0,0,0,0], true];
_unit setvariable [QGVAR(openWounds), [], true];
_unit setvariable [QGVAR(bandagedWounds), [], true];
_unit setVariable [QGVAR(internalWounds), [], true];
_unit setvariable [QGVAR(lastUniqueWoundID), 1, true];
// vitals
_unit setVariable [QGVAR(heartRate), 80];
@ -36,24 +37,24 @@ _unit setvariable [QGVAR(bloodPressure), [80, 120]];
_unit setVariable [QGVAR(peripheralResistance), 100];
// fractures
_unit setVariable [QGVAR(fractures), []];
_unit setVariable [QGVAR(fractures), [], true];
// triage card and logs
_unit setvariable [QGVAR(triageLevel), 0, true];
_unit setvariable [QGVAR(triageCard), [], true];
// IVs
_unit setVariable [QGVAR(salineIVVolume), 0];
_unit setVariable [QGVAR(plasmaIVVolume), 0];
_unit setVariable [QGVAR(bloodIVVolume), 0];
_unit setVariable [QGVAR(salineIVVolume), 0, true];
_unit setVariable [QGVAR(plasmaIVVolume), 0, true];
_unit setVariable [QGVAR(bloodIVVolume), 0, true];
// damage storage
_unit setvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0], true];
// airway
_unit setvariable [QGVAR(airwayStatus), 100, true];
_unit setVariable [QGVAR(airwayOccluded), false, true];
_unit setvariable [QGVAR(airwayCollapsed), false, true];
_unit setvariable [QGVAR(airwayStatus), 100];
_unit setVariable [QGVAR(airwayOccluded), false];
_unit setvariable [QGVAR(airwayCollapsed), false];
// generic medical admin
_unit setvariable [QGVAR(addedToUnitLoop), false, true];
@ -69,11 +70,11 @@ _allUsedMedication = _unit getVariable [QGVAR(allUsedMedication), []];
{
_unit setvariable [_x select 0, nil];
} foreach _allUsedMedication;
_unit setVariable [QGVAR(allUsedMedication), []];
_unit setVariable [QGVAR(allUsedMedication), [], true];
_logs = _unit getvariable [QGVAR(allLogs), []];
{
_unit setvariable [_x, nil, true];
_unit setvariable [_x, nil];
} foreach _logs;
_unit setvariable [QGVAR(allLogs), [], true];

View File

@ -1,11 +1,10 @@
/*
* Author: Glowbal
* Enabled the vitals loop for a unit.
* Handles an wound update request.
*
* Arguments:
* 0: The Unit <OBJECT>
* 1: the last known ID <NUMBER>
* 2: Origin object <OBJECT>
* 1: Origin object <OBJECT>
*
* ReturnValue:
* <NIL>
@ -14,12 +13,11 @@
*/
#include "script_component.hpp"
private ["_unit", "_lastId", "_openWounds"];
private ["_unit", "_openWounds"];
_unit = _this select 0;
_lastId = _this select 1;
_originOfrequest = _this select 2;
_originOfrequest = _this select 1;
if (local _unit) then {
if (local _unit && !(local _originOfrequest)) then {
_openWounds = _unit getvariable [QGVAR(openWounds), []];
{
["medical_propagateWound", [_originOfrequest], [_unit, _x]] call EFUNC(common,targetEvent);

View File

@ -14,11 +14,11 @@
#include "script_component.hpp"
private [ "_target", "_caller", "_openWounds","_lastId"];
private [ "_target", "_caller", "_openWounds"];
_target = _this select 0;
_caller = _this select 1;
if (local _target || GVAR(level) < 2) exitwith {}; // if the target is local, we already got the most update to date information
if (_target getvariable [QGVAR(isWoundSynced), false]) exitwith {};
_target setvariable [QGVAR(isWoundSynced), true];
["medical_woundUpdateRequest", [_target], [_target, _lastId, _caller]] call EFUNC(common,targetEvent);
["medical_woundUpdateRequest", [_target], [_target, _caller]] call EFUNC(common,targetEvent);

View File

@ -23,7 +23,7 @@ _set = if (count _this > 1) then {_this select 1} else {true};
_minWaitingTime = if (count _this > 2) then {_this select 2} else {DEFAULT_DELAY};
if !(_set) exitwith {
_unit setvariable ["ACE_isUnconscious", false,true];
_unit setvariable ["ACE_isUnconscious", false, true];
};
if !(!(isNull _unit) && {(_unit isKindOf "CaManBase") && ([_unit] call EFUNC(common,isAwake))}) exitwith{};
@ -37,7 +37,14 @@ _unit setUnconscious true;
if (_unit == ACE_player) then {
if (visibleMap) then {openMap false};
closeDialog 0;
while {dialog} do {
closeDialog 0;
};
};
// if we have unconsciousness for AI disabled, we will kill the unit instead
if (!([_unit] call EFUNC(common,IsPlayer)) && (GVAR(enableUnsconsiousnessAI) == 0 || (GVAR(enableUnsconsiousnessAI) == 2 && random(1) <= 0.5))) exitwith {
[_unit, true] call FUNC(setDead); // force, to avoid getting into a loop in case revive is enabled.
};
// If a unit has the launcher out, it will sometimes start selecting the primairy weapon while unconscious,
@ -68,73 +75,15 @@ _unit setUnitPos "DOWN";
// So the AI does not get stuck, we are moving the unit to a temp group on its own.
//Unconscious units shouldn't be put in another group #527:
// [_unit, true, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide);
if (GVAR(moveUnitsFromGroupOnUnconscious)) then {
[_unit, true, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide);
};
[_unit, QGVAR(unconscious), true] call EFUNC(common,setCaptivityStatus);
[_unit, [_unit] call EFUNC(common,getDeathAnim), 1, true] call EFUNC(common,doAnimation);
_startingTime = time;
[{
private ["_unit", "_vehicleOfUnit","_minWaitingTime", "_oldAnimation", "_captiveSwitch", "_hasMovedOut"];
_args = _this select 0;
_unit = _args select 0;
_oldAnimation = _args select 1;
_originalPos = _args select 2;
_startingTime = _args select 3;
_minWaitingTime = _args select 4;
_hasMovedOut = _args select 5;
if (!alive _unit) exitwith {
[(_this select 1)] call cba_fnc_removePerFrameHandler;
};
// In case the unit is no longer in an unconscious state, we are going to check if we can already reset the animation
if !(_unit getvariable ["ACE_isUnconscious",false]) exitwith {
// TODO, handle this with carry instead, so we can remove the PFH here.
// Wait until the unit isn't being carried anymore, so we won't end up with wierd animations
if !(([_unit] call FUNC(isBeingCarried)) || ([_unit] call FUNC(isBeingDragged))) then {
if (vehicle _unit == _unit) then {
if (animationState _unit == "AinjPpneMstpSnonWrflDnon") then {
[_unit,"AinjPpneMstpSnonWrflDnon_rolltofront", 2] call EFUNC(common,doAnimation);
[_unit,"amovppnemstpsnonwnondnon", 1] call EFUNC(common,doAnimation);
} else {
[_unit,"amovppnemstpsnonwnondnon", 2] call EFUNC(common,doAnimation);
};
} else {
// Switch to the units original animation, assuming
// TODO: what if the unit switched vehicle?
[_unit, _oldAnimation, 2] call EFUNC(common,doAnimation);
};
// EXIT PFH
[(_this select 1)] call cba_fnc_removePerFrameHandler;
};
if (!_hasMovedOut) then {
// Reset the unit back to the previous captive state.
[_unit, QGVAR(unconscious), false] call EFUNC(common,setCaptivityStatus);
// Swhich the unit back to its original group
//Unconscious units shouldn't be put in another group #527:
// [_unit, false, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide);
[_unit, false] call EFUNC(common,disableAI);
_unit setUnitPos _originalPos; // This is not position but stance (DOWN, MIDDLE, UP)
_unit setUnconscious false;
["medical_onUnconscious", [_unit, false]] call EFUNC(common,globalEvent);
// ensure this statement runs only once
_args set [5, true];
};
};
// Ensure we are waiting at least a minimum period before checking if we can wake up the unit again, allows for temp knock outs
if ((time - _startingTime) >= _minWaitingTime) exitwith {
if (!([_unit] call FUNC(getUnconsciousCondition))) then {
_unit setvariable ["ACE_isUnconscious", false, true];
};
};
}, 0.1, [_unit,_animState, _originalPos, _startingTime, _minWaitingTime, false] ] call CBA_fnc_addPerFrameHandler;
[DFUNC(unconsciousPFH), 0.1, [_unit,_animState, _originalPos, _startingTime, _minWaitingTime, false, vehicle _unit isKindOf "ParachuteBase"] ] call CBA_fnc_addPerFrameHandler;
["medical_onUnconscious", [_unit, true]] call EFUNC(common,globalEvent);

View File

@ -129,7 +129,7 @@ if (isNil _callbackProgress) then {
// Patient Animation
_patientAnim = getText (_config >> "animationPatient");
if (_target getvariable ["ACE_isUnconscious", false]) then {
if (_target getvariable ["ACE_isUnconscious", false] && GVAR(allowUnconsciousAnimationOnTreatment)) then {
if !(animationState _target in (getArray (_config >> "animationPatientUnconsciousExcludeOn"))) then {
_patientAnim = getText (_config >> "animationPatientUnconscious");
};
@ -149,6 +149,8 @@ if (_caller == _target) then {
_callerAnim = [getText (_config >> "animationCallerSelf"), getText (_config >> "animationCallerSelfProne")] select (stance _caller == "PRONE");
};
_caller setvariable [QGVAR(selectedWeaponOnTreatment), currentWeapon _caller];
// Cannot use secondairy weapon for animation
if (currentWeapon _caller == secondaryWeapon _caller) then {
_caller selectWeapon (primaryWeapon _caller);

View File

@ -15,7 +15,7 @@
#include "script_component.hpp"
private ["_target", "_bandage", "_part", "_selectionName", "_openWounds", "_config", "_effectiveness","_mostEffectiveInjury", "_mostEffectiveSpot", "_woundEffectivenss", "_mostEffectiveInjury", "_impact", "_exit"];
private ["_target", "_bandage", "_part", "_selectionName", "_openWounds", "_config", "_effectiveness","_mostEffectiveInjury", "_mostEffectiveSpot", "_woundEffectivenss", "_mostEffectiveInjury", "_impact", "_exit", "_specificClass", "_classID", "_effectivenessFound"];
_target = _this select 0;
_bandage = _this select 1;
_selectionName = _this select 2;

View File

@ -17,7 +17,7 @@
#include "script_component.hpp"
private ["_caller", "_target","_selectionName","_className","_config","_callback", "_usersOfItems"];
private ["_caller", "_target","_selectionName","_className","_config","_callback", "_usersOfItems", "_weaponSelect"];
_args = _this select 0;
_caller = _args select 0;
@ -34,6 +34,13 @@ if (vehicle _caller == _caller) then {
};
_caller setvariable [QGVAR(treatmentPrevAnimCaller), nil];
_weaponSelect = (_caller getvariable [QGVAR(selectedWeaponOnTreatment), ""]);
if (_weaponSelect != "") then {
_caller selectWeapon _weaponSelect;
} else {
_caller action ["SwitchWeapon", _caller, _caller, 99];
};
{
(_x select 0) addItem (_x select 1);
}foreach _usersOfItems;

View File

@ -17,7 +17,7 @@
#include "script_component.hpp"
private ["_caller", "_target","_selectionName","_className","_config","_callback"];
private ["_caller", "_target","_selectionName","_className","_config","_callback", "_weaponSelect"];
_args = _this select 0;
_caller = _args select 0;
_target = _args select 1;
@ -32,6 +32,13 @@ if (vehicle _caller == _caller) then {
};
_caller setvariable [QGVAR(treatmentPrevAnimCaller), nil];
_weaponSelect = (_caller getvariable [QGVAR(selectedWeaponOnTreatment), ""]);
if (_weaponSelect != "") then {
_caller selectWeapon _weaponSelect;
} else {
_caller action ["SwitchWeapon", _caller, _caller, 99];
};
// Record specific callback
_config = (configFile >> "ACE_Medical_Actions" >> "Basic" >> _className);
if (GVAR(level) >= 2) then {

View File

@ -0,0 +1,97 @@
/*
* Author: Glowbal
* PFH logic for unconscious state
*
* Arguments:
* 0: The unit that will be put in an unconscious state <OBJECT>
*
* ReturnValue:
* nil
*
* Public: yes
*/
#include "script_component.hpp"
private ["_unit", "_vehicleOfUnit","_minWaitingTime", "_oldAnimation", "_captiveSwitch", "_hasMovedOut", "_parachuteCheck"];
_args = _this select 0;
_unit = _args select 0;
_oldAnimation = _args select 1;
_originalPos = _args select 2;
_startingTime = _args select 3;
_minWaitingTime = _args select 4;
_hasMovedOut = _args select 5;
_parachuteCheck = _args select 6;
if (!alive _unit) exitwith {
if (GVAR(moveUnitsFromGroupOnUnconscious)) then {
[_unit, false, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide);
};
[_unit, QGVAR(unconscious), false] call EFUNC(common,setCaptivityStatus);
[_unit, false] call EFUNC(common,disableAI);
//_unit setUnitPos _originalPos;
_unit setUnconscious false;
["medical_onUnconscious", [_unit, false]] call EFUNC(common,globalEvent);
[(_this select 1)] call cba_fnc_removePerFrameHandler;
};
// In case the unit is no longer in an unconscious state, we are going to check if we can already reset the animation
if !(_unit getvariable ["ACE_isUnconscious",false]) exitwith {
// TODO, handle this with carry instead, so we can remove the PFH here.
// Wait until the unit isn't being carried anymore, so we won't end up with wierd animations
if !(([_unit] call FUNC(isBeingCarried)) || ([_unit] call FUNC(isBeingDragged))) then {
if (vehicle _unit == _unit) then {
if (animationState _unit == "AinjPpneMstpSnonWrflDnon") then {
[_unit,"AinjPpneMstpSnonWrflDnon_rolltofront", 2] call EFUNC(common,doAnimation);
[_unit,"amovppnemstpsnonwnondnon", 1] call EFUNC(common,doAnimation);
} else {
[_unit,"amovppnemstpsnonwnondnon", 2] call EFUNC(common,doAnimation);
};
} else {
// Switch to the units original animation, assuming
// TODO: what if the unit switched vehicle?
[_unit, _oldAnimation, 2] call EFUNC(common,doAnimation);
};
["medical_onUnconscious", [_unit, false]] call EFUNC(common,globalEvent);
// EXIT PFH
[(_this select 1)] call cba_fnc_removePerFrameHandler;
};
if (!_hasMovedOut) then {
// Reset the unit back to the previous captive state.
[_unit, QGVAR(unconscious), false] call EFUNC(common,setCaptivityStatus);
// Swhich the unit back to its original group
//Unconscious units shouldn't be put in another group #527:
if (GVAR(moveUnitsFromGroupOnUnconscious)) then {
[_unit, false, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide);
};
[_unit, false] call EFUNC(common,disableAI);
_unit setUnitPos _originalPos; // This is not position but stance (DOWN, MIDDLE, UP)
_unit setUnconscious false;
// ensure this statement runs only once
_args set [5, true];
};
};
if (_parachuteCheck) then {
if !(vehicle _unit isKindOf "ParachuteBase") then {
[_unit, [_unit] call EFUNC(common,getDeathAnim), 1, true] call EFUNC(common,doAnimation);
_args set [6, false];
};
};
if (!local _unit) exitwith {
_args set [ 4, _minWaitingTime - (time - _startingTime)];
_unit setvariable [QGVAR(unconsciousArguments), _args, true];
[(_this select 1)] call cba_fnc_removePerFrameHandler;
};
// Ensure we are waiting at least a minimum period before checking if we can wake up the unit again, allows for temp knock outs
if ((time - _startingTime) >= _minWaitingTime) exitwith {
if (!([_unit] call FUNC(getUnconsciousCondition))) then {
_unit setvariable ["ACE_isUnconscious", false, true];
};
};

View File

@ -1,13 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<Project name="ACE">
<Package name="Medical">
<Key ID="TR_ACE_Medical_litterSimulationDetail">
<Key ID="STR_ACE_Medical_litterSimulationDetail">
<English>Litter Simulation Detail</English>
<Polish>Detale zużytych medykamentów</Polish>
<Spanish>Detalle de simulación de basura</Spanish>
</Key>
<Key ID="TR_ACE_Medical_litterSimulationDetail_Desc">
<Key ID="STR_ACE_Medical_litterSimulationDetail_Desc">
<English>Litter simulation detail level sets the number of litter items which will be locally spawned in the client. Excessive amounts in local areas could cause FPS lag, so this is a client only setting.</English>
<Polish>Opcja ta ustawia liczbę zużytych medykamentów, jakie pojawiają się lokalnie wokół gracza. Ich zbyt duża ilość może spowodować spadki FPS, dlatego jest to ustawienie tylko po stronie klienta.</Polish>
<Spanish>Detalle simulación de basura establece el número de artículos de basura que se generan a nivel local en el cliente. Las cantidades excesivas en áreas locales podrían causar caída de rendimiento, así que esto es un ajuste de cliente únicamente.</Spanish>
</Key>
<Key ID="STR_ACE_Medical_Inject_Atropine">
<English>Inject Atropine</English>
@ -1634,4 +1636,4 @@
<French>Aberration chromatique</French>
</Key>
</Package>
</Project>
</Project>

View File

@ -49,11 +49,11 @@ if (GVAR(currentApplicationPage) == 1) then {
} else { //Map Mode:
if (GVAR(mapAutoTrackPosition)) then {
_theMap ctrlMapAnimAdd [0, (GVAR(mapZoom)/_mapSize), GVAR(gpsPositionASL)];
_theMap ctrlMapAnimAdd [0, (GVAR(mapZoom)/_mapSize), (getPosASL ace_player)];
ctrlMapAnimCommit _theMap;
};
_size = 48 * _mapSize;
_theMap drawIcon [QUOTE(PATHTO_R(images\icon_self.paa)), [0.533,0.769,0.76,0.75], GVAR(gpsPositionASL), _size, _size, (getDir ace_player), '', 0 ];
_theMap drawIcon [QUOTE(PATHTO_R(images\icon_self.paa)), [0.533,0.769,0.76,0.75], (getPosASL ace_player), _size, _size, (getDir ace_player), '', 0 ];
if (GVAR(settingShowAllWaypointsOnMap)) then {
_size = 32 * _mapSize;

View File

@ -83,7 +83,6 @@ if ((_oldShowMode == DISPLAY_MODE_CLOSED) && {GVAR(currentShowMode) != DISPLAY_M
};
[_pfID] call CBA_fnc_removePerFrameHandler;
} else {
GVAR(gpsPositionASL) = getPosAsl ace_player;
if (GVAR(currentShowMode) == DISPLAY_MODE_HIDDEN) then {
//If display is hidden, and we can show, then swithc modes:
if ([DISPLAY_MODE_DISPLAY] call FUNC(canShow)) then {

View File

@ -44,7 +44,7 @@ case (APP_MODE_INFODISPLAY): {
(_display displayCtrl IDC_MODEDISPLAY_NORTHING) ctrlSetText _northingText;
//Elevation:
_numASL = (GVAR(gpsPositionASL) select 2) + GVAR(mapAltitude);
_numASL = ((getPosASL ace_player) select 2) + GVAR(mapAltitude);
_aboveSeaLevelText = [_numASL, 5, 0] call CBA_fnc_formatNumber;
_aboveSeaLevelText = if (_numASL > 0) then {"+" + _aboveSeaLevelText + " MSL"} else {_aboveSeaLevelText + " MSL"};
(_display displayCtrl IDC_MODEDISPLAY_ELEVATIONNUM) ctrlSetText _aboveSeaLevelText;
@ -88,13 +88,13 @@ case (APP_MODE_INFODISPLAY): {
};
if (!(_targetPosLocationASL isEqualTo [])) then {
_bearing = [GVAR(gpsPositionASL), _targetPosLocationASL] call BIS_fnc_dirTo;
_bearing = [(getPosASL ace_player), _targetPosLocationASL] call BIS_fnc_dirTo;
_bearingText = if (GVAR(settingUseMils)) then {
[(floor ((6400 / 360) * (_bearing))), 4, 0] call CBA_fnc_formatNumber;
} else {
([(floor (_bearing)), 3, 1] call CBA_fnc_formatNumber) + "°" //degree symbol is in UTF-8
};
_2dDistanceKm = ((GVAR(gpsPositionASL) select [0,2]) distance (_targetPosLocationASL select [0,2])) / 1000;
_2dDistanceKm = (((getPosASL ace_player) select [0,2]) distance (_targetPosLocationASL select [0,2])) / 1000;
_rangeText = format ["%1km", ([_2dDistanceKm, 1, 1] call CBA_fnc_formatNumber)];
_numASL = (_targetPosLocationASL select 2) + GVAR(mapAltitude);
_aboveSeaLevelText = [_numASL, 5, 0] call CBA_fnc_formatNumber;
@ -125,7 +125,7 @@ case (APP_MODE_COMPASS): {
(_display displayCtrl IDC_MODECOMPASS_RANGE) ctrlSetText "";
(_display displayCtrl IDC_MODECOMPASS_TARGET) ctrlSetText "";
} else {
_playerPos2d = GVAR(gpsPositionASL) select [0,2];
_playerPos2d = (getPosASL ace_player) select [0,2];
_targetPosName = "";
_targetPosLocationASL = [];
@ -145,13 +145,13 @@ case (APP_MODE_COMPASS): {
_rangeText = "---";
if (!(_targetPosLocationASL isEqualTo [])) then {
_bearing = [GVAR(gpsPositionASL), _targetPosLocationASL] call BIS_fnc_dirTo;
_bearing = [(getPosASL ace_player), _targetPosLocationASL] call BIS_fnc_dirTo;
_bearingText = if (GVAR(settingUseMils)) then {
[(floor ((6400 / 360) * (_bearing))), 4, 0] call CBA_fnc_formatNumber;
} else {
([(floor (_bearing)), 3, 1] call CBA_fnc_formatNumber) + "°" //degree symbol is in UTF-8
};
_2dDistanceKm = ((GVAR(gpsPositionASL) select [0,2]) distance (_targetPosLocationASL select [0,2])) / 1000;
_2dDistanceKm = (((getPosASL ace_player) select [0,2]) distance (_targetPosLocationASL select [0,2])) / 1000;
_rangeText = format ["%1km", ([_2dDistanceKm, 1, 1] call CBA_fnc_formatNumber)];
};
@ -169,7 +169,7 @@ case (APP_MODE_WAYPOINTS): {
{
EXPLODE_2_PVT(_x,_wpName,_wpPos);
_wpListBox lbAdd _wpName;
_2dDistanceKm = ((GVAR(gpsPositionASL) select [0,2]) distance (_wpPos select [0,2])) / 1000;
_2dDistanceKm = (((getPosASL ace_player) select [0,2]) distance (_wpPos select [0,2])) / 1000;
_wpListBox lbSetTextRight [_forEachIndex, (format ["%1km", ([_2dDistanceKm, 1, 1] call CBA_fnc_formatNumber)])];
} forEach _waypoints;

View File

@ -17,6 +17,7 @@
<Key ID="STR_ACE_MissileGuidance_Desc">
<English>Advanced missile guidance, or AMG, provides multiple enhancements to missile locking and firing. It is also a framework required for missile weapon types.</English>
<Polish>Zaawansowane namierzanie rakiet, lub ZNR, dostarcza wiele poprawek do systemu namierzania rakiet oraz dodaje nowe tryby strzału. Jest to wymagana opcja dla broni rakietowych.</Polish>
<Spanish>Guía de misiles avanzada, o AMG en sus siglas en inglés, ofrece múltiples mejoras en el fijado y disparo de misiles. Es también un framework requerido para armas de tipo misil.</Spanish>
</Key>
<Key ID="STR_ACE_Hydra70_DAGR">
<English>Hydra-70 DAGR Missile</English>

View File

@ -5,10 +5,35 @@ class CfgMovesBasic {
};
class Actions {
class RifleStandActionsNoAdjust;
class RifleLowStandActionsNoAdjust;
class RifleBaseStandActions;
class RifleKneelActions: RifleBaseStandActions {
Civil = "AmovPknlMstpSnonWnonDnon";
};
class RifleProneActions: RifleBaseStandActions {
Civil = "AmovPpneMstpSnonWnonDnon";
SecondaryWeapon = "AmovPpneMstpSrasWlnrDnon";
};
class PistolStandActions;
class PistolProneActions: PistolStandActions {
SecondaryWeapon = "AmovPpneMstpSrasWlnrDnon";
};
class LauncherKneelActions;
/*class LauncherStandActions: LauncherKneelActions {
PlayerProne = "AmovPpneMstpSrasWlnrDnon";
Down = "AmovPpneMstpSrasWlnrDnon";
};*/
class LauncherProneActions: LauncherKneelActions {
TurnL = "AmovPpneMstpSrasWlnrDnon_turnl";
TurnLRelaxed = "AmovPpneMstpSrasWlnrDnon_turnl";
TurnR = "AmovPpneMstpSrasWlnrDnon_turnr";
TurnRRelaxed = "AmovPpneMstpSrasWlnrDnon_turnr";
};
// WEAPON RAISED - RUNNING
class RifleStandActionsNoAdjust;
class RifleStandActionsRunF: RifleStandActionsNoAdjust {
getOver = "AovrPercMrunSrasWrflDf";
};
@ -18,6 +43,7 @@ class CfgMovesBasic {
class RifleStandActionsRunFR: RifleStandActionsNoAdjust {
getOver = "AovrPercMrunSrasWrflDf";
};
// WEAPON RAISED - SPRINTING
class RifleStandEvasiveActionsF: RifleStandActionsNoAdjust {
getOver = "AovrPercMrunSrasWrflDf";
@ -28,7 +54,9 @@ class CfgMovesBasic {
class RifleStandEvasiveActionsFR: RifleStandActionsNoAdjust {
getOver = "AovrPercMrunSrasWrflDf";
};
// WEAPON LOWERED - RUNNING
class RifleLowStandActionsNoAdjust;
class RifleLowStandActionsRunF: RifleLowStandActionsNoAdjust {
getOver = "AovrPercMrunSrasWrflDf";
};

View File

@ -218,6 +218,7 @@
<English>Option Menu UI Scaling</English>
<French>Menu option: taille de l'UI</French>
<Polish>Skalowanie UI menu ustawień</Polish>
<Spanish>Opción de escalado del menú UI</Spanish>
</Key>
</Package>
</Project>
</Project>

View File

@ -208,7 +208,7 @@ class CfgWeapons {
class srifle_DMR_02_sniper_F: srifle_DMR_02_F {
displayName = "$STR_ACE_RealisticNames_srifle_DMR_02_sniper"; //MAR-10 .338 (Sand)";
};
*/
class DMR_03_base_F: Rifle_Long_Base_F {
displayName = "$STR_ACE_RealisticNames_DMR_03"; //Mk-I EMR 7.62 mm";
};
@ -236,7 +236,7 @@ class CfgWeapons {
class srifle_DMR_03_spotter_F: srifle_DMR_03_F {
displayName = "$STR_ACE_RealisticNames_srifle_DMR_03_spotter"; //NATO DMR (provisional) spotter";
};
/*
class DMR_04_base_F: Rifle_Long_Base_F {
displayName = "$STR_ACE_RealisticNames_DMR_04"; //ASP-1 Kir 12.7 mm";
};
@ -264,7 +264,7 @@ class CfgWeapons {
class srifle_DMR_05_tan_f: srifle_DMR_05_blk_F {
displayName = "$STR_ACE_RealisticNames_srifle_DMR_05_tan"; //Cyrus 9.3 mm (Tan)";
};
*/
class DMR_06_base_F: Rifle_Long_Base_F {
displayName = "$STR_ACE_RealisticNames_DMR_06"; //Mk14 7.62 mm";
};
@ -278,6 +278,7 @@ class CfgWeapons {
};
// marksmen mgs
/*
class MMG_01_base_F: Rifle_Long_Base_F {
displayName = "$STR_ACE_RealisticNames_MMG_01"; //Navid 9.3 mm";
};
@ -289,7 +290,7 @@ class CfgWeapons {
class MMG_01_tan_F: MMG_01_hex_F {
displayName = "$STR_ACE_RealisticNames_MMG_01_tan"; //Navid 9.3 mm (Tan)";
};
*/
class MMG_02_base_F: Rifle_Long_Base_F {
displayName = "$STR_ACE_RealisticNames_MMG_02"; //SPMG .338";
};
@ -304,7 +305,7 @@ class CfgWeapons {
class MMG_02_sand_F: MMG_02_camo_F {
displayName = "$STR_ACE_RealisticNames_MMG_02_sand"; //SPMG .338 (Sand)";
};*/
};
// vehicle weapons

View File

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Edited with tabler. -->
<Project name="ACE">
<Package name="RealisticNames">
<Key ID="STR_ACE_RealisticNames_HMG_01_Name">
@ -520,7 +519,7 @@
<English>Punisher (GMG)</English>
<German>Punisher (GMW)</German>
<Spanish>Punisher (GMG)</Spanish>
<Polish>Punisher (GMG)</Polish>
<Polish>Punisher (CKM)</Polish>
<Czech>Punisher (granátomet)</Czech>
<French>Punisher (GMG)</French>
<Russian>Kаратель (Гранатомет)</Russian>
@ -1136,7 +1135,7 @@
<English>Mini-Spike (AT)</English>
<German>Mini-Spike (PALR)</German>
<Czech>Mini-Spike (PT)</Czech>
<Polish>Mini-Spike (AT)</Polish>
<Polish>Mini-Spike (AA)</Polish>
<French>Mini-Spike (AT)</French>
<Hungarian>Mini-Spike (Tankelhárító)</Hungarian>
<Spanish>Mini-Spike (AT)</Spanish>
@ -1511,53 +1510,53 @@
<Russian>TODO: MAR-10 .338 (песочный)</Russian>
</Key>
<Key ID="STR_ACE_RealisticNames_DMR_03">
<English>TODO: Mk-I EMR 7.62 mm</English>
<Czech>TODO: Mk-I EMR 7.62 mm</Czech>
<French>Mk-l EMR 7.62 mm</French>
<Spanish>TODO: Mk-I EMR 7.62 mm</Spanish>
<Russian>TODO: Mk-I EMR 7.62 мм</Russian>
<English>SG 556 7.62 mm</English>
<Czech>SG 556 7.62 mm</Czech>
<French>SG 556 7.62 mm</French>
<Spanish>SG 556 7.62 mm</Spanish>
<Russian>SG 556 7.62 мм</Russian>
</Key>
<Key ID="STR_ACE_RealisticNames_srifle_DMR_03">
<English>TODO: Mk-I EMR 7.62 mm (Black)</English>
<Czech>TODO: Mk-I EMR 7.62 mm (Black)</Czech>
<French>Mk-l EMR 7.62 mm (Noir)</French>
<Spanish>TODO: Mk-I EMR 7.62 mm (Negro)</Spanish>
<Russian>TODO: Mk-I EMR 7.62 мм (черный)</Russian>
<English>SG 556 7.62 mm (Black)</English>
<Czech>SG 556 7.62 mm (Black)</Czech>
<French>SG 556 7.62 mm (Noir)</French>
<Spanish>SG 556 7.62 mm (Negro)</Spanish>
<Russian>SG 556 7.62 мм (черный)</Russian>
</Key>
<Key ID="STR_ACE_RealisticNames_srifle_DMR_03_khaki">
<English>TODO: Mk-I EMR 7.62 mm (Khaki)</English>
<Czech>TODO: Mk-I EMR 7.62 mm (Khaki)</Czech>
<French>Mk-l EMR 7.62 mm (Kaki)</French>
<Spanish>TODO: Mk-I EMR 7.62 mm (Caqui)</Spanish>
<Russian>TODO: Mk-I EMR 7.62 мм (хаки)</Russian>
<English>SG 556 7.62 mm (Khaki)</English>
<Czech>SG 556 7.62 mm (Khaki)</Czech>
<French>SG 556 7.62 mm (Kaki)</French>
<Spanish>SG 556 7.62 mm (Caqui)</Spanish>
<Russian>SG 556 7.62 мм (хаки)</Russian>
</Key>
<Key ID="STR_ACE_RealisticNames_srifle_DMR_03_tan">
<English>TODO: Mk-I EMR 7.62 mm (Sand)</English>
<Czech>TODO: Mk-I EMR 7.62 mm (Sand)</Czech>
<French>Mk-l EMR 7.62 mm (Beige)</French>
<Spanish>TODO: Mk-I EMR 7.62 mm (Arena)</Spanish>
<Russian>TODO: Mk-I EMR 7.62 мм (песочный)</Russian>
<English>SG 556 7.62 mm (Sand)</English>
<Czech>SG 556 7.62 mm (Sand)</Czech>
<French>SG 556 7.62 mm (Beige)</French>
<Spanish>SG 556 7.62 mm (Arena)</Spanish>
<Russian>SG 556 7.62 мм (песочный)</Russian>
</Key>
<Key ID="STR_ACE_RealisticNames_srifle_DMR_03_multicam">
<English>TODO: Mk-I EMR 7.62 mm (Camo)</English>
<Czech>TODO: Mk-I EMR 7.62 mm (Camo)</Czech>
<French>Mk-l EMR 7.62 mm (Camo)</French>
<Spanish>TODO: Mk-I EMR 7.62 mm (Camuflaje)</Spanish>
<Russian>TODO: Mk-I EMR 7.62 мм (камо)</Russian>
<English>SG 556 7.62 mm (Camo)</English>
<Czech>SG 556 7.62 mm (Camo)</Czech>
<French>SG 556 7.62 mm (Camo)</French>
<Spanish>SG 556 7.62 mm (Camuflaje)</Spanish>
<Russian>SG 556 7.62 мм (камо)</Russian>
</Key>
<Key ID="STR_ACE_RealisticNames_srifle_DMR_03_woodland">
<English>TODO: Mk-I EMR 7.62 mm (Woodland)</English>
<Czech>TODO: Mk-I EMR 7.62 mm (Woodland)</Czech>
<French>Mk-l EMR 7.62 mm (Woodland)</French>
<Spanish>TODO: Mk-I EMR 7.62 mm (Bosque)</Spanish>
<Russian>TODO: Mk-I EMR 7.62 мм (лесной)</Russian>
<English>SG 556 7.62 mm (Woodland)</English>
<Czech>SG 556 7.62 mm (Woodland)</Czech>
<French>SG 556 7.62 mm (Woodland)</French>
<Spanish>SG 556 7.62 mm (Bosque)</Spanish>
<Russian>SG 556 7.62 мм (лесной)</Russian>
</Key>
<Key ID="STR_ACE_RealisticNames_srifle_DMR_03_spotter">
<English>TODO: NATO DMR (provisional) spotter</English>
<Czech>TODO: NATO DMR (provisional) spotter</Czech>
<French>NATO DMR (provisoire) observateur</French>
<Spanish>TODO: NATO DMR (provisional) observador</Spanish>
<Russian>TODO: NATO DMR (provisional) корректировщик</Russian>
<English>SG 556 7.62 mm (provisional) spotter</English>
<Czech>SG 556 7.62 mm (provisional) spotter</Czech>
<French>SG 556 7.62 mm (provisoire) Observateur</French>
<Spanish>SG 556 7.62 mm (provisional) observador</Spanish>
<Russian>SG 556 7.62 мм (provisional) корректировщик</Russian>
</Key>
<Key ID="STR_ACE_RealisticNames_DMR_04">
<English>TODO: ASP-1 Kir 12.7 mm</English>
@ -1609,25 +1608,25 @@
<Russian>TODO: Cyrus 9.3 мм (бронза)</Russian>
</Key>
<Key ID="STR_ACE_RealisticNames_DMR_06">
<English>TODO: Mk14 7.62 mm</English>
<Czech>TODO: Mk14 7.62 mm</Czech>
<French>Mk 14 7.62 mm</French>
<Spanish>TODO: Mk14 7.62 mm</Spanish>
<Russian>TODO: Mk14 7.62 мм</Russian>
<English>M14 7.62 mm</English>
<Czech>M14 7.62 mm</Czech>
<French>M14 7.62 mm</French>
<Spanish>M14 7.62 mm</Spanish>
<Russian>M14 7.62 мм</Russian>
</Key>
<Key ID="STR_ACE_RealisticNames_srifle_DMR_06_camo">
<English>TODO: Mk14 7.62 mm (Camo)</English>
<Czech>TODO: Mk14 7.62 mm (Camo)</Czech>
<French>Mk 14 7.62 mm (Camo)</French>
<Spanish>TODO: Mk14 7.62 mm (Camuflaje)</Spanish>
<Russian>TODO: Mk14 7.62 мм (камо)</Russian>
<English>M14 7.62 mm (Camo)</English>
<Czech>M14 7.62 mm (Camo)</Czech>
<French>M14 7.62 mm (Camo)</French>
<Spanish>M14 7.62 mm (Camuflaje)</Spanish>
<Russian>M14 7.62 мм (Камо)</Russian>
</Key>
<Key ID="STR_ACE_RealisticNames_srifle_DMR_06_olive">
<English>TODO: Mk14 7.62 mm (Olive)</English>
<Czech>TODO: Mk14 7.62 mm (Olive)</Czech>
<French>Mk 14 7.62 mm (Olive)</French>
<Spanish>TODO: Mk14 7.62 mm (Oliva)</Spanish>
<Russian>TODO: Mk14 7.62 мм (олива)</Russian>
<English>M14 7.62 mm (Olive)</English>
<Czech>M14 7.62 mm (Olive)</Czech>
<French>M14 7.62 mm (Olive)</French>
<Spanish>M14 7.62 mm (Oliva)</Spanish>
<Russian>M14 7.62 мм (Олива)</Russian>
</Key>
<Key ID="STR_ACE_RealisticNames_MMG_01">
<English>TODO: Navid 9.3 mm</English>
@ -1651,32 +1650,32 @@
<Russian>TODO: Navid 9.3 мм (бронза)</Russian>
</Key>
<Key ID="STR_ACE_RealisticNames_MMG_02">
<English>TODO: SPMG .338</English>
<Czech>TODO: SPMG .338</Czech>
<French>SPMG .338</French>
<Spanish>TODO: SPMG .338</Spanish>
<Russian>TODO: SPMG .338</Russian>
<English>LWMMG .338</English>
<Czech>LWMMG .338</Czech>
<French>LWMMG .338</French>
<Spanish>LWMMG .338</Spanish>
<Russian>LWMMG .338</Russian>
</Key>
<Key ID="STR_ACE_RealisticNames_MMG_02_camo">
<English>TODO: SPMG .338 (MTP)</English>
<Czech>TODO: SPMG .338 (MTP)</Czech>
<French>SPMG .338 (MTP)</French>
<Spanish>TODO: SPMG .338 (MTP)</Spanish>
<Russian>TODO: SPMG .338 (MTP)</Russian>
<English>LWMMG .338 (MTP)</English>
<Czech>LWMMG .338 (MTP)</Czech>
<French>LWMMG .338 (MTP)</French>
<Spanish>LWMMG .338 (MTP)</Spanish>
<Russian>LWMMG .338 (MTP)</Russian>
</Key>
<Key ID="STR_ACE_RealisticNames_MMG_02_black">
<English>TODO: SPMG .338 (Black)</English>
<Czech>TODO: SPMG .338 (Black)</Czech>
<French>SPMG .338 (Noir)</French>
<Spanish>TODO: SPMG .338 (Negro)</Spanish>
<Russian>TODO: SPMG .338 (черный)</Russian>
<English>LWMMG .338 (Black)</English>
<Czech>LWMMG .338 (Black)</Czech>
<French>LWMMG .338 (Noir)</French>
<Spanish>LWMMG .338 (Negro)</Spanish>
<Russian>LWMMG .338 (Черный)</Russian>
</Key>
<Key ID="STR_ACE_RealisticNames_MMG_02_sand">
<English>TODO: SPMG .338 (Sand)</English>
<Czech>TODO: SPMG .338 (Sand)</Czech>
<English>LWMMG .338 (Sand)</English>
<Czech>LWMMG .338 (Sand)</Czech>
<French>SPMG .338 (Beige)</French>
<Spanish>TODO: SPMG .338 (Arena)</Spanish>
<Russian>TODO: SPMG .338 (песочный)</Russian>
<Spanish>LWMMG .338 (Arena)</Spanish>
<Russian>LWMMG .338 (Песочный)</Russian>
</Key>
</Package>
</Project>
</Project>

View File

@ -0,0 +1 @@
z\ace\addons\recoil

View File

@ -0,0 +1,255 @@
#define KICKBACK 1.6
#define MUZZLETEMP 1
#define MUZZLEPERM 0.1
#define MUZZLECLIMB_POS 1
#define MUZZLERIGHT_POS 0.4
#define MUZZLECLIMB_MAG 1
#define MUZZLERIGHT_MAG 1
class CfgRecoils {
class Default {
// doc: http://forums.bistudio.com/showthread.php?188999-Recoil-Overhaul-Feedback&s=dba8590ec07adb5ffa87f72d38dde6fc&p=2886744&viewfull=1#post2886744
// {horizontal axis position, vertical axis position, horizontal magnitude, vertical magnitude}
muzzleOuter[] = {0*MUZZLERIGHT_POS,0.4*MUZZLECLIMB_POS,0.5*MUZZLERIGHT_MAG,0.6*MUZZLECLIMB_MAG};
// restricted area inside the outer ellipse where the recoil cannot end
muzzleInner[] = {0,0.05,0.2,0.2};
// minimum and maximum interval for backward force
kickBack[] = {0.05*KICKBACK,0.1*KICKBACK};
permanent = 0.1*MUZZLEPERM;
temporary = 0.01*MUZZLETEMP;
};
class recoil_default: Default {
muzzleOuter[] = {0.3*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG};
muzzleInner[] = {0,0,0.1,0.1};
kickBack[] = {0.03*KICKBACK,0.06*KICKBACK};
permanent = 0.1*MUZZLEPERM;
temporary = 0.01*MUZZLETEMP;
};
class recoil_mk20: recoil_default {
muzzleOuter[] = {0.2*MUZZLERIGHT_POS,0.6*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG};
kickBack[] = {0.01*KICKBACK,0.03*KICKBACK};
temporary = 0.01*MUZZLETEMP;
};
class recoil_mk20c: recoil_default {
muzzleOuter[] = {0.2*MUZZLERIGHT_POS,0.8*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG};
kickBack[] = {0.02*KICKBACK,0.04*KICKBACK};
temporary = 0.015*MUZZLETEMP;
};
class recoil_trg20: recoil_default {
muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.02*KICKBACK,0.04*KICKBACK};
temporary = 0.015*MUZZLETEMP;
};
class recoil_trg21: recoil_default {
muzzleOuter[] = {0.2*MUZZLERIGHT_POS,0.8*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG};
kickBack[] = {0.01*KICKBACK,0.03*KICKBACK};
temporary = 0.01*MUZZLETEMP;
};
class recoil_mx: recoil_default {
muzzleOuter[] = {0.3*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.4*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.02*KICKBACK,0.04*KICKBACK};
temporary = 0.01*MUZZLETEMP;
};
class recoil_mxc: recoil_default {
muzzleOuter[] = {0.3*MUZZLERIGHT_POS,1.2*MUZZLECLIMB_POS,0.4*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.03*KICKBACK,0.06*KICKBACK};
temporary = 0.015*MUZZLETEMP;
};
class recoil_sw: recoil_default {
muzzleOuter[] = {0.3*MUZZLERIGHT_POS,0.8*MUZZLECLIMB_POS,0.5*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG};
kickBack[] = {0.02*KICKBACK,0.04*KICKBACK};
temporary = 0.005*MUZZLETEMP;
};
class recoil_mxm: recoil_default {
muzzleOuter[] = {0.3*MUZZLERIGHT_POS,0.8*MUZZLECLIMB_POS,0.4*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.02*KICKBACK,0.04*KICKBACK};
temporary = 0.01*MUZZLETEMP;
};
class recoil_ktb: recoil_default {
muzzleOuter[] = {0.3*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.02*KICKBACK,0.04*KICKBACK};
temporary = 0.01*MUZZLETEMP;
};
class recoil_ktbc: recoil_default {
muzzleOuter[] = {0.3*MUZZLERIGHT_POS,1.2*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.03*KICKBACK,0.06*KICKBACK};
temporary = 0.015*MUZZLETEMP;
};
class recoil_smg_01: recoil_default {
muzzleOuter[] = {0.1*MUZZLERIGHT_POS,0.8*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG};
kickBack[] = {0.01*KICKBACK,0.03*KICKBACK};
temporary = 0.015*MUZZLETEMP;
};
class recoil_smg_02: recoil_default {
muzzleOuter[] = {0.1*MUZZLERIGHT_POS,0.6*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG};
kickBack[] = {0.01*KICKBACK,0.02*KICKBACK};
temporary = 0.01*MUZZLETEMP;
};
class recoil_pdw: recoil_default {
muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.02*KICKBACK,0.04*KICKBACK};
temporary = 0.02*MUZZLETEMP;
};
class recoil_sdar: recoil_default {
muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.02*KICKBACK,0.04*KICKBACK};
temporary = 0.01*MUZZLETEMP;
};
class recoil_pistol_p07: recoil_default {
muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.03*KICKBACK,0.06*KICKBACK};
temporary = 0.03*MUZZLETEMP;
};
class recoil_pistol_rook40: recoil_default {
muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.03*KICKBACK,0.06*KICKBACK};
temporary = 0.02*MUZZLETEMP;
};
class recoil_pistol_acpc2: recoil_default {
muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.04*KICKBACK,0.08*KICKBACK};
temporary = 0.04*MUZZLETEMP;
};
class recoil_pistol_4five: recoil_default {
muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.04*KICKBACK,0.08*KICKBACK};
temporary = 0.06*MUZZLETEMP;
};
class recoil_pistol_zubr: recoil_default {
muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.04*KICKBACK,0.08*KICKBACK};
temporary = 0.08*MUZZLETEMP;
};
class recoil_pistol_signal: recoil_default {
muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.02*KICKBACK,0.04*KICKBACK};
temporary = 0.02*MUZZLETEMP;
};
class recoil_rpg: recoil_default {
muzzleOuter[] = {2*MUZZLERIGHT_POS,3*MUZZLECLIMB_POS,1*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG};
kickBack[] = {0.08*KICKBACK,0.1*KICKBACK};
temporary = 0.1*MUZZLETEMP;
};
class recoil_nlaw: recoil_default {
muzzleOuter[] = {2*MUZZLERIGHT_POS,3*MUZZLECLIMB_POS,1*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG};
kickBack[] = {0.06*KICKBACK,0.08*KICKBACK};
temporary = 0.08*MUZZLETEMP;
};
class recoil_titan_long: recoil_default {
muzzleOuter[] = {2*MUZZLERIGHT_POS,3*MUZZLECLIMB_POS,1*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG};
kickBack[] = {0.1*KICKBACK,0.12*KICKBACK};
temporary = 0.15*MUZZLETEMP;
};
class recoil_titan_short: recoil_default {
muzzleOuter[] = {2*MUZZLERIGHT_POS,3*MUZZLECLIMB_POS,1*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG};
kickBack[] = {0.1*KICKBACK,0.12*KICKBACK};
temporary = 0.12*MUZZLETEMP;
};
class recoil_mk200: recoil_default {
muzzleOuter[] = {0.4*MUZZLERIGHT_POS,0.6*MUZZLECLIMB_POS,0.6*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG};
kickBack[] = {0.03*KICKBACK,0.06*KICKBACK};
temporary = 0.005*MUZZLETEMP;
};
class recoil_zafir: recoil_default {
muzzleOuter[] = {0.5*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.7*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.02*KICKBACK,0.08*KICKBACK};
temporary = 0.005*MUZZLETEMP;
};
class recoil_m320: recoil_default {
muzzleOuter[] = {1*MUZZLERIGHT_POS,3*MUZZLECLIMB_POS,0.5*MUZZLERIGHT_MAG,0.6*MUZZLECLIMB_MAG};
kickBack[] = {0.08*KICKBACK,0.1*KICKBACK};
temporary = 0.02*MUZZLETEMP;
};
class recoil_gm6: recoil_default {
muzzleOuter[] = {1.4*MUZZLERIGHT_POS,3.5*MUZZLECLIMB_POS,0.7*MUZZLERIGHT_MAG,0.8*MUZZLECLIMB_MAG};
kickBack[] = {0.1*KICKBACK,0.12*KICKBACK};
temporary = 0.025*MUZZLETEMP;
};
class recoil_ebr: recoil_default {
muzzleOuter[] = {0.4*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.6*MUZZLERIGHT_MAG,0.4*MUZZLECLIMB_MAG};
kickBack[] = {0.04*KICKBACK,0.07*KICKBACK};
temporary = 0.01*MUZZLETEMP;
};
class recoil_dmr_01: recoil_default {
muzzleOuter[] = {0.5*MUZZLERIGHT_POS,2*MUZZLECLIMB_POS,0.5*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG};
kickBack[] = {0.03*KICKBACK,0.08*KICKBACK};
temporary = 0.015*MUZZLETEMP;
};
class recoil_dmr_02: recoil_default {
muzzleOuter[] = {0.5*MUZZLERIGHT_POS,2.5*MUZZLECLIMB_POS,0.6*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG};
kickBack[] = {0.06*KICKBACK,0.08*KICKBACK};
temporary = 0.01*MUZZLETEMP;
};
class recoil_dmr_03: recoil_default {
muzzleOuter[] = {0.3*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.5*MUZZLERIGHT_MAG,0.4*MUZZLECLIMB_MAG};
kickBack[] = {0.03*KICKBACK,0.06*KICKBACK};
temporary = 0.005*MUZZLETEMP;
};
class recoil_dmr_04: recoil_default {
muzzleOuter[] = {0.4*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.5*MUZZLERIGHT_MAG,0.4*MUZZLECLIMB_MAG};
kickBack[] = {0.02*KICKBACK,0.04*KICKBACK};
temporary = 0.015*MUZZLETEMP;
};
class recoil_dmr_05: recoil_default {
muzzleOuter[] = {0.5*MUZZLERIGHT_POS,2.5*MUZZLECLIMB_POS,0.8*MUZZLERIGHT_MAG,0.6*MUZZLECLIMB_MAG};
kickBack[] = {0.08*KICKBACK,0.1*KICKBACK};
temporary = 0.01*MUZZLETEMP;
};
class recoil_dmr_06: recoil_default {
muzzleOuter[] = {0.5*MUZZLERIGHT_POS,2*MUZZLECLIMB_POS,0.7*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG};
kickBack[] = {0.05*KICKBACK,0.1*KICKBACK};
temporary = 0.01*MUZZLETEMP;
};
class recoil_mmg_01: recoil_default {
muzzleOuter[] = {0.6*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.8*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG};
kickBack[] = {0.02*KICKBACK,0.08*KICKBACK};
temporary = 0.005*MUZZLETEMP;
};
class recoil_mmg_02: recoil_default {
muzzleOuter[] = {0.5*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.6*MUZZLERIGHT_MAG,0.4*MUZZLECLIMB_MAG};
kickBack[] = {0.04*KICKBACK,0.08*KICKBACK};
temporary = 0.005*MUZZLETEMP;
};
};

15
addons/recoil/config.cpp Normal file
View File

@ -0,0 +1,15 @@
#include "script_component.hpp"
class CfgPatches {
class ADDON {
units[] = {};
weapons[] = {};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"ace_common"};
author[] = {"commy2"};
authorUrl = "";
VERSION_CONFIG;
};
};
#include "CfgRecoils.hpp"

View File

@ -0,0 +1,12 @@
#define COMPONENT recoil
#include "\z\ace\addons\main\script_mod.hpp"
#ifdef DEBUG_ENABLED_RECOIL
#define DEBUG_MODE_FULL
#endif
#ifdef DEBUG_ENABLED_RECOIL
#define DEBUG_SETTINGS DEBUG_ENABLED_RECOIL
#endif
#include "\z\ace\addons\main\script_macros.hpp"

View File

@ -1,4 +1,3 @@
class CfgActions {
class LoadMagazine;
class LoadEmptyMagazine : LoadMagazine {

View File

@ -1,4 +1,3 @@
class Extended_PreInit_EventHandlers {
class ADDON {
init = QUOTE(call COMPILE_FILE(XEH_preInit));

View File

@ -3,13 +3,13 @@ class CfgVehicles {
class CAManBase: Man {
class ACE_Actions {
class ACE_Weapon {
class ACE_LinkBelt {
class GVAR(LinkBelt) {
displayName = "$STR_ACE_Reload_LinkBelt";
distance = 2.0;
condition = QUOTE([ARR_2(_player, _target)] call FUNC(canLinkBelt));
statement = QUOTE([ARR_2(_player, _target)] call FUNC(startLinkingBelt));
};
class ACE_CheckAmmo {
class GVAR(CheckAmmo) {
displayName = "$STR_ACE_Reload_checkAmmo";
distance = 2.0;
condition = QUOTE([ARR_2(_player, _target)] call FUNC(canCheckAmmo));
@ -23,7 +23,7 @@ class CfgVehicles {
class StaticWeapon: LandVehicle {
class ACE_Actions {
class ACE_MainActions {
class ACE_CheckAmmo {
class GVAR(CheckAmmo) {
displayName = "$STR_ACE_Reload_checkAmmo";
distance = 2.0;
condition = QUOTE([ARR_2(_player, _target)] call FUNC(canCheckAmmo));

View File

@ -7,10 +7,9 @@ if !(hasInterface) exitWith {};
["ACE3", QGVAR(checkAmmo), localize "STR_ACE_Reload_checkAmmo",
{
// Conditions: canInteract
if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false};
if !([ACE_player, (vehicle ACE_player), ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false};
// Conditions: specific
if !([ACE_player] call EFUNC(common,canUseWeapon) ||
{(vehicle ACE_player) isKindOf 'StaticWeapon'}) exitWith {false};
if !([ACE_player] call EFUNC(common,canUseWeapon) || {(vehicle ACE_player) isKindOf "StaticWeapon"}) exitWith {false};
// Statement
[ACE_player] call FUNC(checkAmmo);

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