From 623ab02a125b29fbcb4b878625df3b539cbf65ff Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 8 Apr 2015 13:06:06 +0200 Subject: [PATCH 001/305] fix falling over static weapons --- addons/vehicles/CfgEventHandlers.hpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/addons/vehicles/CfgEventHandlers.hpp b/addons/vehicles/CfgEventHandlers.hpp index 049b154088..2725e526bc 100644 --- a/addons/vehicles/CfgEventHandlers.hpp +++ b/addons/vehicles/CfgEventHandlers.hpp @@ -18,3 +18,12 @@ class Extended_Engine_EventHandlers { }; }; }; + +class Extended_Init_EventHandlers { + class StaticWeapon { + class ACE_FixMass { + init = QUOTE(if (local (_this select 0)) then {(_this select 0) setMass (getMass (_this select 0) max 250)};); + exclude[] = {"TargetSoldierBase","Static_Designator_01_base_F","Static_Designator_02_base_F","Pod_Heli_Transport_04_base_F"}; + }; + }; +}; From d7bdb48547492d3b2a2fbfb7de04b4b0d0e73a01 Mon Sep 17 00:00:00 2001 From: Clon1998 Date: Fri, 10 Apr 2015 01:15:20 +0200 Subject: [PATCH 002/305] Update stringtable.xml --- addons/interaction/stringtable.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index dcd87056e2..6e82383964 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -4,27 +4,35 @@ Interactions + Interaktionen Torso + Körper Head + Kopf Left Arm + Linker Arm Right Arm + Rechter Arm Left Leg + Linker Arm Right Leg + Rechter Arm Weapon + Waffe Interaction Menu @@ -655,6 +663,7 @@ Passengers + Passagiere From e7b5218d52189599d1bcb95c72dcd091186d04ea Mon Sep 17 00:00:00 2001 From: Tenga Date: Sat, 11 Apr 2015 00:14:06 +0200 Subject: [PATCH 003/305] Altimeter fix, division by zero when no time has passed (game paused, etc.) --- addons/parachute/functions/fnc_showAltimeter.sqf | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/addons/parachute/functions/fnc_showAltimeter.sqf b/addons/parachute/functions/fnc_showAltimeter.sqf index a8200fb2ca..45816cc883 100644 --- a/addons/parachute/functions/fnc_showAltimeter.sqf +++ b/addons/parachute/functions/fnc_showAltimeter.sqf @@ -14,19 +14,24 @@ * Public: Yes */ #include "script_component.hpp" + private ["_unit"]; + _unit = _this select 0; -(["ACE_Altimeter"] call BIS_fnc_rscLayer) cutRsc ["ACE_Altimeter", "PLAIN",0,true]; + +(["ACE_Altimeter"] call BIS_fnc_rscLayer) cutRsc ["ACE_Altimeter", "PLAIN", 0, true]; if (isNull (uiNamespace getVariable ["ACE_Altimeter", displayNull])) exitWith {}; GVAR(AltimeterActive) = true; + [{ - if (!GVAR(AltimeterActive)) exitWith {[_this select 1] call CALLSTACK(cba_fnc_removePerFrameEventHandler);}; + if (!GVAR(AltimeterActive)) exitWith {[_this select 1] call CALLSTACK(cba_fnc_removePerFrameEventHandler)}; disableSerialization; EXPLODE_4_PVT(_this select 0,_display,_unit,_oldHeight,_prevTime); - if !("ACE_Altimeter" in assignedItems _unit) exitWith {[_this select 1] call CALLSTACK(cba_fnc_removePerFrameEventHandler);call FUNC(hideAltimeter);}; + if !("ACE_Altimeter" in assignedItems _unit) exitWith {[_this select 1] call CALLSTACK(cba_fnc_removePerFrameEventHandler); call FUNC(hideAltimeter)}; + + private ["_height", "_hour", "_minute", "_descentRate","_HeightText", "_DecendRate", "_TimeText", "_curTime", "_timeDiff"]; - private ["_height", "_hour", "_minute", "_descentRate","_HeightText", "_DecendRate", "_TimeText", "_curTime"]; _HeightText = _display displayCtrl 1100; _DecendRate = _display displayCtrl 1000; _TimeText = _display displayCtrl 1001; @@ -35,7 +40,8 @@ GVAR(AltimeterActive) = true; _height = (getPosASL _unit) select 2; _curTime = time; - _descentRate = floor ((_oldHeight - _height) / (_curTime - _prevTime)); + _timeDiff = _curTime - _prevTime; + _descentRate = if(_timeDiff > 0) then {floor((_oldHeight - _height) / _timeDiff)} else {0}; _TimeText ctrlSetText (format ["%1:%2",[_hour, 2] call EFUNC(common,numberToDigitsString),[_minute, 2] call EFUNC(common,numberToDigitsString)]); _HeightText ctrlSetText (format ["%1", floor(_height)]); From 4bb9f0cf77b5a54b779098f4ad0147ec06731099 Mon Sep 17 00:00:00 2001 From: Legolasindar Date: Sun, 12 Apr 2015 14:27:42 +0200 Subject: [PATCH 004/305] Update stringtable.xml added spanish translate --- addons/disarming/stringtable.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/disarming/stringtable.xml b/addons/disarming/stringtable.xml index 845d0c286e..f4d324bfcd 100644 --- a/addons/disarming/stringtable.xml +++ b/addons/disarming/stringtable.xml @@ -4,6 +4,7 @@ Open Inventory + Abrir inventario - \ No newline at end of file + From 2c0e93271c8ade8cb5e77029f8ca6e5dfe8a0d4a Mon Sep 17 00:00:00 2001 From: Legolasindar Date: Sun, 12 Apr 2015 14:29:47 +0200 Subject: [PATCH 005/305] Update stringtable.xml added spanish translate --- addons/laserpointer/stringtable.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/addons/laserpointer/stringtable.xml b/addons/laserpointer/stringtable.xml index 279fdeb5e8..0479f8474b 100644 --- a/addons/laserpointer/stringtable.xml +++ b/addons/laserpointer/stringtable.xml @@ -6,16 +6,19 @@ Laser Pointer (red) Laserpointer (rot) Лазерный прицел (красный) + Puntero láser (rojo) Laser Pointer (green) Laserpointer (grün) Лазерный прицел (зелёный) + Puntero láser (verde) Emits visible light. Strahlt sichtbares Licht aus. Испускает узкий пучок видимого света. + Emite luz visible. <t color='#9cf953'>Use: </t>Turn Laser ON/OFF @@ -29,4 +32,4 @@ <t color='#9cf953'>Usar: </t>encender/apagar láser - \ No newline at end of file + From e7a8dde782642fd83ea95f5dabb693a196e76af0 Mon Sep 17 00:00:00 2001 From: Ivan Navarro Cabello Date: Sun, 12 Apr 2015 14:41:50 +0200 Subject: [PATCH 006/305] update stringtable for spanish added new spanish terms --- addons/realisticnames/stringtable.xml | 2670 +++++++++++++------------ 1 file changed, 1371 insertions(+), 1299 deletions(-) diff --git a/addons/realisticnames/stringtable.xml b/addons/realisticnames/stringtable.xml index 29fb5a736b..28133d6644 100644 --- a/addons/realisticnames/stringtable.xml +++ b/addons/realisticnames/stringtable.xml @@ -1,1302 +1,1374 @@  - + - - - XM312 - XM312 - XM312 - XM312 - XM312 - XM312 - XM312 - XM312 - XM312 - XM312A - - - XM312A - XM312A - XM312 - XM312A - XM312A - XM312A - XM312A - XM312A - XM312A - XM312A - - - XM312 (High) - XM312 (Hoch) - XM312 (Alto) - XM312 (Haut) - XM312 (Vysoký) - XM312 (Wysoki) - XM312 (Высокий) - XM312 (Alta) - XM312 (Magasított) - XM312 (Alta) - - - XM307 - XM307 - XM307 - XM307 - XM307 - XM307 - XM307 - XM307 - XM307 - XM307 - - - XM307A - XM307A - XM307A - XM307A - XM307A - XM307A - XM307A - XM307A - XM307A - XM307A - - - XM307 (High) - XM307 (Hoch) - XM307 (Alto) - XM307 (Haut) - XM307 (Vysoký) - XM307 (Wysoki) - XM307 (Высокий) - XM307 (Alta) - XM307 (Magasított) - XM307 (Alta) - - - Mini-Spike Launcher (AT) - Mini-Spike Lenkflugkörper (AT) - Lanzador Mini-Spike (AT) - Poste de tir Mini-Spike (AC) - Mini-Spike Odpalovač (AT) - Wyrzutnia Mini-Spike (AT) - Mini-Spike Пусковое устройство (ПТРК) - Lança-mísseis Mini-Spike (AC) - Mini-Spike rakétarendszer (páncéltörő) - Lanciatore Mini-Spike (AC) - - - Mini-Spike Launcher (AA) - Mini-Spike Lenkflugkörper (AA) - Lanzador Mini-Spike (AA) - Poste de tir Mini-Spike (AA) - Mini-Spike Odpalovač (AA) - Wyrzutnia Mini-Spike (AA) - Mini-Spike Пусковое устройство (ВВ) - Lança-mísseis Mini-Spike (AA) - Mini-Spike rakétarendszer (légvédelmi) - Lanciatore Mini-Spike (AA) - - - YABHON-R3 - YABHON-R3 - YABHON-R3 - YABHON-R3 - YABHON-R3 - YABHON-R3 - YABHON-R3 - YABHON-R3 - YABHON-R3 - YABHON-R3 - - - YABHON-R3 (CAS) - YABHON-R3 (Luftnahunterstützung) - YABHON-R3 (CAS) - YABHON-R3 (CAS) - YABHON-R3 (CAS) - YABHON-R3 (штурмовик) - - - M-ATV - M-ATV - M-ATV - M-ATV - M-ATV - M-ATV - M-ATV - M-ATV - M-ATV - M-ATV - - - M-ATV (HMG) - M-ATV (SMG) - M-ATV (HMG) - M-ATV (CKM) - M-ATV (TK) - M-ATV (HMG) - M-ATV (Пулемет) - M-ATV (HMG) - M-ATV (HMG) - M-ATV (HMG) - - - M-ATV (GMG) - M-ATV (GMW) - M-ATV (GMG) - M-ATV (GMG) - M-ATV (Granátomet) - M-ATV (GMG) - M-ATV (Гранатомет) - M-ATV (GMG) - M-ATV (GMG) - M-ATV (GMG) - - - Merkava Mk IV M - Merkava Mk IV M - Merkava Mk IV M - Merkawa Mk IV M - Merkava Mk IV M - Merkava Mk IV M - Меркава Mk IV M - Merkava Mk IV M - Merkava Mk IV M - Merkava Mk IV M - - - Merkava Mk IV LIC - Merkava Mk IV LIC - Merkava Mk IV LIC - Merkawa Mk IV LIC - Merkava Mk IV LIC - Merkava Mk IV LIC - Меркава Mk IV LIC - Merkava Mk IV LIC - Merkava Mk IV LIC - Merkava Mk IV LIC - - - Sholef - Sholef - Sholef - Sholef - Sholef - Sholef - Шолеф - Sholef - Sholef - Sholef - - - Seara - Seara - Seara - Seara - Seara - Seara - Seara - Seara - Seara - Seara - - - Namer - Namer - Namer - Namer - Namer - Namer - Намер - Namer - Namer - Namer - - - Bardelas - Bardelas - Bardelas - Bardelas - Bardelas - Bardelas - Bardelas - Bardelas - Bardelas - Bardelas - - - Patria AMV - Patria AMV - Patria AMV - Patria AMV - Patria AMV - Patria AMV - Patria AMV - Patria AMV - Patria AMV - Patria AMV - - - Nemmera - Nemmera - Nemmera - Nemmera - Nemmera - Nemmera - Nemmera - Nemmera - Nemmera - Nemmera - - - HEMTT Transport - HEMTT Transport - HEMTT de transporte - HEMTT Transportowy - HEMTT Valník - HEMTT Transport - HEMTT Транспортный - HEMTT Transporte - HEMTT szállítójármű - HEMTT da trasporto - - - HEMTT Transport (covered) - HEMTT Transport (bedeckt) - HEMTT de transporte (cubierto) - HEMTT Transportowy (zakryty) - HEMTT Valník (krytý) - HEMTT Transport (bâché) - HEMTT Транспортный (крытый) - HEMTT Transporte (coberto) - HEMTT szállítójármű (ponyvás) - HEMTT da trasporto (coperto) - - - HEMTT - HEMTT - HEMTT - HEMTT - HEMTT - HEMTT Tracteur - HEMTT - HEMTT - HEMTT - HEMTT - - - HEMTT Container - HEMTT Container - HEMTT de contenedor - HEMTT Kontener - HEMTT Skříňový - HEMTT Conteneur - HEMTT Контейнер - HEMTT Contêiner - HEMTT Konténer - HEMTT portacontainer - - - HEMTT Medical - HEMTT Sanitäter - HEMTT médico - HEMTT Medyczny - HEMTT Zdravotnický - HEMTT Sanitaire - HEMTT Медицинский - HEMTT Médico - HEMTT (egészségügyi) - HEMTT Medico - - - HEMTT Ammo - HEMTT Munition - HEMTT de munición - HEMTT Amunicyjny - HEMTT Muniční - HEMTT Munitions - HEMTT Боеприпасы - HEMTT Munições - HEMTT (lőszerszállító) - HEMTT di rifornimento munizioni - - - HEMTT Fuel - HEMTT Treibstoff - HEMTT de combustible - HEMTT Cysterna - HEMTT Cisterna - HEMTT Citerne - HEMTT Заправщик - HEMTT Combustível - HEMTT (üzemanyag-szállító) - HEMTT di rifornimento carburante - - - HEMTT Repair - HEMTT Instandsetzung - HEMTT de reparación - HEMTT Naprawczy - HEMTT Opravárenský - HEMTT Réparation - HEMTT Ремонтный - HEMTT Reparador - HEMTT (szerelő-jármű) - HEMTT Riparatore - - - Fennek - Fennek - Fennek - Fennek - Fennek - Fennek - Феннек - Fennek - Fennek - Fennek - - - Fennek (HMG) - Fennek (SMG) - Fennek (HMG) - Fennek (CKM) - Fennek (TK) - Fennek (HMG) - Феннек (Пулемет) - Fennek (HMG) - Fennek (HMG) - Fennek (HMG) - - - Fennek (GMG) - Fennek (GMW) - Fennek (GMG) - Fennek (GMG) - Fennek (granátomet) - Fennek (GMG) - Феннек (Гранатомет) - Fennek (GMG) - Fennek (GMG) - Fennek (GMG) - - - Leopard 2SG - Leopard 2SG - Leopard 2SG - Leopard 2SG - Leopard 2SG - Leopard 2SG - Леопард 2SG - Leopard 2SG - Leopard 2SG - Leopard 2SG - - - FV510 Warrior - FV510 Warrior - FV510 Warrior - FV510 Warrior - FV510 Warrior - FV510 Warrior - FV510 Уорриор - FV510 Warrior - FV510 Warrior - FV510 Warrior - - - Pandur II - Pandur II - Pandur II - Pandur II - Pandur II - Pandur II - Pandur II - Pandur II - Pandur II - Pandur II - - - KamAZ Transport - KamAZ Transport - KamAZ de transporte - KamAZ transportowy - KAMAZ Valník - KamAZ Transport - КамАЗ Траспортный - KamAZ Transporte - KamAZ szállítójármű - KamAZ da trasporto - - - KamAZ Transport (covered) - KamAZ Transport (bedeckt) - KamAZ de transporte (cubierto) - KamAZ Transportowy (zakryty) - KAMAZ Valník (krytý) - KamAZ Transport (bâché) - КамАЗ Траспортный (Крытый) - KamAZ Transporte (coberto) - KamAZ szállítójármű (ponyvás) - KamAZ da trasporto (coperto) - - - KamAZ Ammo - KamAZ Munition - KamAZ de munición - KamAZ Amunicyjny - KAMAZ Muniční - KamAZ Munitions - КамАЗ Боеприпасы - KamAZ Munições - KamAZ (lőszerszállító) - KamAZ di rifornimento munizioni - - - KamAZ Fuel - KamAZ Treibstoff - KamAZ de combustible - KamAZ cysterna - KAMAZ Cisterna - KamAZ Citerne - КамАЗ Заправщик - KamAZ Combustível - KamAZ (üzemanyag-szállító) - KamAZ di rifornimento carburante - - - KamAZ Repair - KamAZ Instandsetzung - KamAZ de reparación - KamAZ Naprawczy - KAMAZ Opravárenský - KamAZ Réparation - КамАЗ Ремонтный - KamAZ Reparador - KamAZ (szerelő-jármű) - KamAZ riparatore - - - KamAZ Medical - KamAZ Sanitäter - KamAZ médico - KamAZ Medyczny - KAMAZ Zdravotnický - KamAZ Sanitaire - КамАЗ Медицинский - KamAZ Médico - KamAZ (egészségügyi) - KamAZ Medico - - - Punisher - Punisher - Punisher - Punisher - Punisher - Punisher - Kаратель - Punisher - Punisher - Punisher - - - Punisher (HMG) - Punisher (SMG) - Punisher (HMG) - Punisher (CKM) - Punisher (TK) - Punisher (HMG) - Kаратель (Пулемет) - Punisher (HMG) - Punisher (HMG) - Punisher (HMG) - - - Punisher (GMG) - Punisher (GMW) - Punisher (GMG) - Punisher (CKM) - Punisher (granátomet) - Punisher (GMG) - Kаратель (Гранатомет) - Punisher (GMG) - Punisher (GMG) - Punisher (GMG) - - - T100 Black Eagle - T100 Black Eagle - T100 Black Eagle - T100 Black Eagle - T100 Black Eagle - T100 Black Eagle - T100 Черный Орел - T100 Black Eagle - T100 Black Eagle - T100 Black Eagle - - - 2S9 Sochor - 2S9 Sochor - 2S9 Sochor - 259 Sochor - 2S9 Sochor - 2S9 Sochor - 2S9 Сокор - 2S9 Sochor - 2S9 Sochor - 2S9 Sochor - - - BM-2T Stalker - BM-2T Stalker - BM-2T Stalker - BM-2T Stalker - BM-2T Stalker - BM-2T Stalker - БМ-2Т Сталкер - BM-2T Stalker - BM-2T Stalker - BM-2T Stalker - - - ZSU-35 Tigris - ZSU-35 Tigris - ZSU-35 Tigris - ZSU-35 Tigris - ZSU-35 Tigris - ZSU-35 Tigris - ЗСУ-35 Tigris - ZSU-35 Tigris - ZSU-35 Tigris - ZSU-35 Tigris - - - Otokar ARMA - Otokar ARMA - Otokar ARMA - Otokar ARMA - Otokar ARMA - Otokar ARMA - Otokar ARMA - Otokar ARMA - Otokar ARMA - Otokar ARMA - - - Typhoon Transport - Typhoon Transport - Typhoon de transporte - Typhoon Transportowy - Typhoon Valník - Typhoon Transport - Тайфун Транспортный - Typhoon Transporte - Typhoon szállítójármű - Typhoon da trasporto - - - Typhoon Transport (covered) - Typhoon Transport (bedeckt) - Typhoon de transporte (cubierto) - Typhoon Transportowy (przykryty) - Typhoon Valník (krytý) - Typhoon Transport (bâché) - Тайфун Транспортный (kрытый) - Typhoon Transporte (coberto) - Typhoon szállítójármű (ponyvás) - Typhoon da trasporto (coperto) - - - Typhoon Device - Typhoon Gerät - Typhoon de dispositivo - Typhoon Urządzenie - Typhoon Zařízení - Typhoon Dispositif - Тайфун Устройство - Typhoon Dispositivo - Typhoon (szerkezet) - Typhoon per dispositivo - - - Typhoon Ammo - Typhoon Munition - Typhoon de munición - Typhoon Amunicyjny - Typhoon Muniční - Typhoon Munitions - Тайфун Боеприпасы - Typhoon Munições - Typhoon (lőszerszállító) - Typhoon di rifornimento munizioni - - - Typhoon Fuel - Typhoon Treibstoff - Typhoon de combustible - Typhoon Cysterna - Typhoon Cisterna - Typhoon Citerne - Тайфун Заправщик - Typhoon Combustível - Typhoon (üzemanyag-szállító) - Typhoon di rifornimento carburante - - - Typhoon Repair - Typhoon Instandsetzung - Typhoon de reparación - Typhoon Naprawczy - Typhoon Opravárenský - Typhoon Réparation - Тайфун Ремонтный - Typhoon Reparador - Typhoon (szerelő-jármű) - Typhoon riparatore - - - Typhoon Medical - Typhoon Sanitäter - Typhoon médico - Typhoon Medyczny - Typhoon Zdravotnický - Typhoon Sanitaire - Тайфун Медицинский - Typhoon Médico - Typhoon (egészségügyi) - Typhoon medico - - - RAH-66 Comanche - RAH-66 Comanche - RAH-66 Comanche - RAH-66 Comanche - RAH-66 Comanche - RAH-66 Commanche - RAH-66 Команч - RAH-66 Comanche - RAH-66 Comanche - RAH-66 Comanche - - - MH-6 Little Bird - MH-6 Little Bird - MH-6 Litte Bird - MH-6 Little Bird - MH-6 Little Bird - MH-6 Little Bird - MH-6 Little Bird - MH-6 Little Bird - MH-6 Little Bird - MH-6 Little Bird - - - AH-6 Little Bird - AH-6 Little Bird - AH-6 Little Bird - AH-6 Little Bird - AH-6 Little Bird - AH-6 Little Bird - AH-6 Little Bird - AH-6 Little Bird - AH-6 Little Bird - AH-6 Little Bird - - - CH-47I Chinook - CH-47I Chinook - CH-47I Chinook - CH-47I Chinook - CH-47I Chinook - CH-47I Chinook - CH-47I Chinook - CH-47I Chinook - CH-47I Chinook - CH-47I Chinook - - - CH-47I Chinook (unarmed) - CH-47I Chinook (unbewaffnet) - CH-47I Chinnok (Desarmado) - CH-47I Chinook (nieuzbrojony) - CH-47I Chinook (невооруженный) - CH-47I Chinook (Neozbrojený) - - - A-10D Thunderbolt II - A-10D Thunderbolt II - A-10D Thunderbolt II - A-10D Thunderbolt II - A-10D Thunderbolt II - A-10D Thunderbolt II - A-10D Тандерболт II - A-10D Thunderbolt II - A-10D Thunderbolt II - A-10D Thunderbolt II - - - AW159 Wildcat - AW159 Wildcat - AW159 Wildcat - AW159 Wildcat - AW159 Wildcat - AW159 Wildcat - AW159 Wildcat - AW159 Wildcat - AW159 Wildcat - AW159 Wildcat - - - AW159 Wildcat (unarmed) - AW159 Wildcat (unbewaffnet) - AW159 Wildcat (desarmado) - AW159 Wildcat (nieuzbrojony) - AW159 Wildcat (neozbrojený) - AW159 Wildcat (non-armé) - AW159 Wildcat (невооруженный) - AW159 Wildcat (desarmado) - AW159 Wildcat (fegyvertelen) - AW159 Wildcat (disarmato) - - - AW101 Merlin - AW101 Merlin - AW101 Merlin - AW101 Merlin - AW101 Merlin - AW101 Merlin - AW101 Мерлин - AW101 Merlin - AW101 Merlin - AW101 Merlin - - - L-159 ALCA (CAS) - L-159 ALCA (CAS) - L-159 ALCA (CAS) - L-159 ALCA (CAS) - L-159 ALCA (CAS) - L-159 ALCA (CAS) - L-159 Альбатрос (CAS) - L-159 ALCA (CAS) - L-159 ALCA (CAS) - L-159 ALCA (CAS) - - - L-159 ALCA (AA) - L-159 ALCA (AA) - L-159 ALCA (AA) - L-159 ALCA (AA) - L-159 ALCA (AA) - L-159 ALCA (AA) - L-159 Альбатрос (AA) - L-159 ALCA (ВВ) - L-159 ALCA (AA) - L-159 ALCA (AA) - - - Ka-60 Kasatka - Ka-60 Kasatka - Ka-60 Kasatka - Ka-60 Kasatka - Ka-60 Kasatka - Ka-60 Kasatka - Ka-60 Касатка - Ka-60 Kasatka - Ka-60 Kasatka - Ka-60 Kasatka - - - Ka-60 Kasatka (unarmed) - Ka-60 Kasatka (unbewaffnet) - Ka-60 Kasatka (desarmado) - Ka-60 Kasatka (nieuzbrojony) - Ka-60 Kasatka (neozbrojená) - Ka-60 Kasatka (non-armé) - Ka-60 Касатка (невооруженный) - Ka-60 Kasatka (desarmado) - Ka-60 Kasatka (fegyvertelen) - Ka-60 Kasatka (disarmato) - - - Yak-130 - Yak-130 - Yak-130 - Jak-130 - Jak-130 - Yak-130 - Як-130 - Yak-130 - Jak-130 - Yak-130 - - - MD 500 - MD 500 - MD 500 - MD 500 - MD 500 - MD 500 - MD 500 - MD 500 - MD 500 - MD 500 - - - M4A1 SLAM - M4A1 SLAM - M4A1 SLAM - M4A1 SLAM - M4A1 SLAM - M4A1 SLAM - M4A1 SLAM - M4A1 SLAM - M4A1 SLAM - M4A1 SLAM - - - M18A1 Claymore - M18A1 Claymore - M18A1 Claymore - Mina kierunkowa M18A1 Claymore - M18A1 Mina Claymore - M18A1 Claymore Mine antipersonnel à effet dirigé - M18A1 Клеймор - M18A1 Claymore - M18A1 Claymore akna - M18A1 Claymore Mina antiuomo - - - M183 Demolition Charge Assembly - M183 Geballte Sprengladung - Conjunto de carga de demolición M183 - Ładunek burzący M183 - M183 Demoliční nálož - M183 Charge de Démolition - M183 Комплектный подрывной заряд - M183 Sacola de Demolição - M183 romboló töltet - M183 Demolition Charge Assembly - - - M112 Demolition Block - M112 Sprengladung - Bloque de demolición M112 - Ładunek burzący M112 - M112 Výbušná nálož - Pétard M112 - M112 подрывной заряд - M112 Carga de Demolição - M112 romboló töltet - M112 Demolition Block - - - M67 Fragmentation Grenade - M67 Splittergranate - Granada de fragmentación M67 - Granat obronny M67 - M67 Granát - M67 Grenade à fragmentation - M67 ручная осколочная граната - M67 Granada de fragmentação - M67 repeszgránát - M67 Granata a frammentazione - - - M83 Smoke Grenade (White) - M83 Rauchgranate (Weiss) - Granada de humo M83 (Blanco) - Granat dymny M83 (Biały) - M83 Kouřový Granát (Bílý) - M83 Grenade fumigène (Blanche) - M83 дымовая граната (Белый) - M83 Granada de fumaça (Branca) - M83 füstgránát (Fehér) - M83 Granata fumogena (Bianco) - - - M18 Smoke Grenade (Blue) - M18 Rauchgranate (Blau) - Granada de humo M18 (Azul) - Granat dymny M18 (Niebieski) - M18 Kouřový Granát (Modrý) - M18 Grenade fumigène (Bleue) - M18 дымовая граната (Синий) - M18 Granada de fumaça (Azul) - M18 füstgránát (Kék) - M18 Granata fumogena (Blu) - - - M18 Smoke Grenade (Green) - M18 Rauchgranate (Grün) - Granada de humo M18 (Verde) - Granat dymny M18 (Zielony) - M18 Kouřový Granát (Zelený) - M18 Grenade fumigène (Verte) - M18 дымовая граната (Зелёный) - M18 Granada de fumaça (Verde) - M18 füstgránát (Zöld) - M18 Granata fumogena (Verde) - - - M18 Smoke Grenade (Orange) - M18 Rauchgranate (Orange) - Granada de humo M18 (Naranja) - Granat dymny M18 (Pomarańczowy) - M18 Kouřový Granát (Oranžový) - M18 Grenade fumigène (Orange) - M18 дымовая граната (Оранжевый) - M18 Granada de fumaça (Laranja) - M18 füstgránát (Narancssárga) - M18 Granata fumogena (Arancione) - - - M18 Smoke Grenade (Purple) - M18 Rauchgranate (Violett) - Granada de humo M18 (Púrpura) - Granat dymny M18 (Fioletowy) - M18 Kouřový Granát (Fialový) - M18 Grenade fumigène (Pourpre) - M18 дымовая граната (Пурпурный) - M18 Granada de fumaça (Roxa) - M18 füstgránát (Lila) - M18 Granata fumogena (Viola) - - - M18 Smoke Grenade (Red) - M18 Rauchgranate (Rot) - Granada de humo M18 (Rojo) - Granat dymny M18 (Czerwony) - M18 Kouřový Granát (Červený) - M18 Grenade fumigène (Rouge) - M18 дымовая граната (Красный) - M18 Granada de fumaça (Vermelha) - M18 füstgránát (Piros) - M18 Granata fumogena (Rosso) - - - M18 Smoke Grenade (Yellow) - M18 Rauchgranate (Gelb) - Granada de humo M18 (Amarillo) - Granat dymny M18 (Żółty) - M18 Kouřový Granát (Žlutý) - M18 Grenade fumigène (Jaune) - M183 дымовая граната (Жёлтые) - M18 Granada de fumaça (Amarela) - M18 füstgránát (Sárga) - M18 Granata fumogena (Giallo) - - - M15 Anti-Tank Mine - M15 Panzerabwehrmine - Mina antitanque M15 - Mina przeciwpancerna M15 - M15 Protitanková Mina - M15 Mine antichar - M15 противотанковая мина - M15 Mina anticarro - M15 harckocsiakna - M15 Mine anticarro - - - VS-50 Anti-Personnel Mine - VS-50 Antipersonenmine - Mina antipersona VS-50 - Mina przeciwpiechotna VS-50 - VS-50 Protipěchotní Mina - VS-50 Mine antipersonnel à pression - VS-50 Противопехотная мина - VS-50 Mina antipessoal - VS-50 gyalogsági taposóakna - VS-50 Mine antiuomo - - - M26 Anti-Personnel Bounding Mine - M26 Antipersonensprungmine - Mina antipersona M26 - Mina przeciwpiechotna M26 - M26 Šrapnelová Mina - M26 Mine antipersonnel bondissante - M26 Противопехотная мина - M26 Mina saltadora antipessoal - M26 gyalogsági ugróakna - M26 Mine saltanti antiuomo - - - PMR-3 Anti-Personnel Tripwire Mine - PMR-3 Antipersonenstolperdrahtmine - Mina antipersona de alambre PMR-3 - Mina przeciwpiechotna PMR-3 - PMR-3 Nástražná Mina - PMR-3 Mine antipersonnel à traction - PMR-3 Противопехотная мина - PMR-3 Mina antipessoal (armadilha) - PMR-3 botlódrótos gyalogsági akna - PMR-3 Mine antiuomo - - - P99 - P99 - - - MP-443 Grach - MP-443 Grach - - - ACP-C2 - ACP-C2 - - - FNX-45 Tactical - FNX-45 Tactical - - - Chiappa Rhino 60DS - Chiappa Rhino 60DS - - - Taurus Judge - Taurus Judge - - - NLAW - NLAW - - - RPG-32 - RPG-32 - - - Mini-Spike (AA) - Mini-Spike (AA) - - - Mini-Spike (AT) - Mini-Spike (AT) - - - MX - MX - - - MX (Black) - MX (Black) - - - MXC - MXC - - - MXC (Black) - MXC (Black) - - - MX 3GL - MX 3GL - - - MX 3GL (Black) - MX 3GL (Black) - - - MX LSW - MX LSW - - - MX LSW (Black) - MX LSW (Black) - - - MXM - MXM - - - MXM (Black) - MXM (Black) - - - KT2002 Katiba - KT2002 Katiba - - - KT2002C Katiba - KT2002C Katiba - - - KT2002 Katiba KGL - KT2002 Katiba KGL - - - F2000 (Camo) - F2000 (Camo) - - - F2000 - F2000 - - - F2000 Tactical (Camo) - F2000 Tactical (Camo) - - - F2000 Tactical - F2000 Tactical - - - F2000 EGLM (Camo) - F2000 EGLM (Camo) - - - F2000 EGLM - F2000 EGLM - - - TAR-21 - TAR-21 - - - CTAR-21 - CTAR-21 - - - TAR-21 EGLM - TAR-21 EGLM - - - Vector SMG - Vector SMG - - - Scorpion Evo 3 A1 - Scorpion Evo 3 A1 - - - CPW - CPW - - - RFB SDAR - RFB SDAR - - - Stoner 99 LMG - Stoner 99 LMG - - - Negev NG7 - Negev NG7 - - - Mk14 Mod 1 EBR - Mk14 Mod 1 EBR - - - GM6 Lynx - GM6 Lynx - - - GM6 Lynx (Camo) - GM6 Lynx (Camo) - - - M200 Intervention - M200 Intervention - - - M200 Intervention (Camo) - M200 Intervention (Camo) - - - VS-121 - VS-121 - - - TODO: MAR-10 .338 - - - TODO: MAR-10 .338 (Black) - - - TODO: MAR-10 .338 (Camo) - - - TODO: MAR-10 .338 (Sand) - - - TODO: Mk-I EMR 7.62 mm - - - TODO: Mk-I EMR 7.62 mm (Black) - - - TODO: Mk-I EMR 7.62 mm (Khaki) - - - TODO: Mk-I EMR 7.62 mm (Sand) - - - TODO: Mk-I EMR 7.62 mm (Camo) - - - TODO: Mk-I EMR 7.62 mm (Woodland) - - - TODO: NATO DMR (provisional) spotter - - - TODO: ASP-1 Kir 12.7 mm - - - TODO: ASP-1 Kir 12.7 mm (Black) - - - TODO: ASP-1 Kir 12.7 mm (Tan) - - - TODO: Cyrus 9.3 mm - - - TODO: Cyrus 9.3 mm (Black) - - - TODO: Cyrus 9.3 mm (Hex) - - - TODO: Cyrus 9.3 mm (Tan) - - - TODO: Mk14 7.62 mm - - - TODO: Mk14 7.62 mm (Camo) - - - TODO: Mk14 7.62 mm (Olive) - - - TODO: Navid 9.3 mm - - - TODO: Navid 9.3 mm (Hex) - - - TODO: Navid 9.3 mm (Tan) - - - TODO: SPMG .338 - - - TODO: SPMG .338 (MTP) - - - TODO: SPMG .338 (Black) - - - TODO: SPMG .338 (Sand) - - + + + XM312 + XM312 + XM312 + XM312 + XM312 + XM312 + XM312 + XM312 + XM312 + XM312A + + + XM312A + XM312A + XM312 + XM312A + XM312A + XM312A + XM312A + XM312A + XM312A + XM312A + + + XM312 (High) + XM312 (Hoch) + XM312 (Alto) + XM312 (Haut) + XM312 (Vysoký) + XM312 (Wysoki) + XM312 (Высокий) + XM312 (Alta) + XM312 (Magasított) + XM312 (Alta) + + + XM307 + XM307 + XM307 + XM307 + XM307 + XM307 + XM307 + XM307 + XM307 + XM307 + + + XM307A + XM307A + XM307A + XM307A + XM307A + XM307A + XM307A + XM307A + XM307A + XM307A + + + XM307 (High) + XM307 (Hoch) + XM307 (Alto) + XM307 (Haut) + XM307 (Vysoký) + XM307 (Wysoki) + XM307 (Высокий) + XM307 (Alta) + XM307 (Magasított) + XM307 (Alta) + + + Mini-Spike Launcher (AT) + Mini-Spike Lenkflugkörper (AT) + Lanzador Mini-Spike (AT) + Poste de tir Mini-Spike (AC) + Mini-Spike Odpalovač (AT) + Wyrzutnia Mini-Spike (AT) + Mini-Spike Пусковое устройство (ПТРК) + Lança-mísseis Mini-Spike (AC) + Mini-Spike rakétarendszer (páncéltörő) + Lanciatore Mini-Spike (AC) + + + Mini-Spike Launcher (AA) + Mini-Spike Lenkflugkörper (AA) + Lanzador Mini-Spike (AA) + Poste de tir Mini-Spike (AA) + Mini-Spike Odpalovač (AA) + Wyrzutnia Mini-Spike (AA) + Mini-Spike Пусковое устройство (ВВ) + Lança-mísseis Mini-Spike (AA) + Mini-Spike rakétarendszer (légvédelmi) + Lanciatore Mini-Spike (AA) + + + YABHON-R3 + YABHON-R3 + YABHON-R3 + YABHON-R3 + YABHON-R3 + YABHON-R3 + YABHON-R3 + YABHON-R3 + YABHON-R3 + YABHON-R3 + + + YABHON-R3 (CAS) + YABHON-R3 (Luftnahunterstützung) + YABHON-R3 (CAS) + YABHON-R3 (CAS) + YABHON-R3 (CAS) + YABHON-R3 (штурмовик) + + + M-ATV + M-ATV + M-ATV + M-ATV + M-ATV + M-ATV + M-ATV + M-ATV + M-ATV + M-ATV + + + M-ATV (HMG) + M-ATV (SMG) + M-ATV (HMG) + M-ATV (CKM) + M-ATV (TK) + M-ATV (HMG) + M-ATV (Пулемет) + M-ATV (HMG) + M-ATV (HMG) + M-ATV (HMG) + + + M-ATV (GMG) + M-ATV (GMW) + M-ATV (GMG) + M-ATV (GMG) + M-ATV (Granátomet) + M-ATV (GMG) + M-ATV (Гранатомет) + M-ATV (GMG) + M-ATV (GMG) + M-ATV (GMG) + + + Merkava Mk IV M + Merkava Mk IV M + Merkava Mk IV M + Merkawa Mk IV M + Merkava Mk IV M + Merkava Mk IV M + Меркава Mk IV M + Merkava Mk IV M + Merkava Mk IV M + Merkava Mk IV M + + + Merkava Mk IV LIC + Merkava Mk IV LIC + Merkava Mk IV LIC + Merkawa Mk IV LIC + Merkava Mk IV LIC + Merkava Mk IV LIC + Меркава Mk IV LIC + Merkava Mk IV LIC + Merkava Mk IV LIC + Merkava Mk IV LIC + + + Sholef + Sholef + Sholef + Sholef + Sholef + Sholef + Шолеф + Sholef + Sholef + Sholef + + + Seara + Seara + Seara + Seara + Seara + Seara + Seara + Seara + Seara + Seara + + + Namer + Namer + Namer + Namer + Namer + Namer + Намер + Namer + Namer + Namer + + + Bardelas + Bardelas + Bardelas + Bardelas + Bardelas + Bardelas + Bardelas + Bardelas + Bardelas + Bardelas + + + Patria AMV + Patria AMV + Patria AMV + Patria AMV + Patria AMV + Patria AMV + Patria AMV + Patria AMV + Patria AMV + Patria AMV + + + Nemmera + Nemmera + Nemmera + Nemmera + Nemmera + Nemmera + Nemmera + Nemmera + Nemmera + Nemmera + + + HEMTT Transport + HEMTT Transport + HEMTT de transporte + HEMTT Transportowy + HEMTT Valník + HEMTT Transport + HEMTT Транспортный + HEMTT Transporte + HEMTT szállítójármű + HEMTT da trasporto + + + HEMTT Transport (covered) + HEMTT Transport (bedeckt) + HEMTT de transporte (cubierto) + HEMTT Transportowy (zakryty) + HEMTT Valník (krytý) + HEMTT Transport (bâché) + HEMTT Транспортный (крытый) + HEMTT Transporte (coberto) + HEMTT szállítójármű (ponyvás) + HEMTT da trasporto (coperto) + + + HEMTT + HEMTT + HEMTT + HEMTT + HEMTT + HEMTT Tracteur + HEMTT + HEMTT + HEMTT + HEMTT + + + HEMTT Container + HEMTT Container + HEMTT de contenedor + HEMTT Kontener + HEMTT Skříňový + HEMTT Conteneur + HEMTT Контейнер + HEMTT Contêiner + HEMTT Konténer + HEMTT portacontainer + + + HEMTT Medical + HEMTT Sanitäter + HEMTT médico + HEMTT Medyczny + HEMTT Zdravotnický + HEMTT Sanitaire + HEMTT Медицинский + HEMTT Médico + HEMTT (egészségügyi) + HEMTT Medico + + + HEMTT Ammo + HEMTT Munition + HEMTT de munición + HEMTT Amunicyjny + HEMTT Muniční + HEMTT Munitions + HEMTT Боеприпасы + HEMTT Munições + HEMTT (lőszerszállító) + HEMTT di rifornimento munizioni + + + HEMTT Fuel + HEMTT Treibstoff + HEMTT de combustible + HEMTT Cysterna + HEMTT Cisterna + HEMTT Citerne + HEMTT Заправщик + HEMTT Combustível + HEMTT (üzemanyag-szállító) + HEMTT di rifornimento carburante + + + HEMTT Repair + HEMTT Instandsetzung + HEMTT de reparación + HEMTT Naprawczy + HEMTT Opravárenský + HEMTT Réparation + HEMTT Ремонтный + HEMTT Reparador + HEMTT (szerelő-jármű) + HEMTT Riparatore + + + Fennek + Fennek + Fennek + Fennek + Fennek + Fennek + Феннек + Fennek + Fennek + Fennek + + + Fennek (HMG) + Fennek (SMG) + Fennek (HMG) + Fennek (CKM) + Fennek (TK) + Fennek (HMG) + Феннек (Пулемет) + Fennek (HMG) + Fennek (HMG) + Fennek (HMG) + + + Fennek (GMG) + Fennek (GMW) + Fennek (GMG) + Fennek (GMG) + Fennek (granátomet) + Fennek (GMG) + Феннек (Гранатомет) + Fennek (GMG) + Fennek (GMG) + Fennek (GMG) + + + Leopard 2SG + Leopard 2SG + Leopard 2SG + Leopard 2SG + Leopard 2SG + Leopard 2SG + Леопард 2SG + Leopard 2SG + Leopard 2SG + Leopard 2SG + + + FV510 Warrior + FV510 Warrior + FV510 Warrior + FV510 Warrior + FV510 Warrior + FV510 Warrior + FV510 Уорриор + FV510 Warrior + FV510 Warrior + FV510 Warrior + + + Pandur II + Pandur II + Pandur II + Pandur II + Pandur II + Pandur II + Pandur II + Pandur II + Pandur II + Pandur II + + + KamAZ Transport + KamAZ Transport + KamAZ de transporte + KamAZ transportowy + KAMAZ Valník + KamAZ Transport + КамАЗ Траспортный + KamAZ Transporte + KamAZ szállítójármű + KamAZ da trasporto + + + KamAZ Transport (covered) + KamAZ Transport (bedeckt) + KamAZ de transporte (cubierto) + KamAZ Transportowy (zakryty) + KAMAZ Valník (krytý) + KamAZ Transport (bâché) + КамАЗ Траспортный (Крытый) + KamAZ Transporte (coberto) + KamAZ szállítójármű (ponyvás) + KamAZ da trasporto (coperto) + + + KamAZ Ammo + KamAZ Munition + KamAZ de munición + KamAZ Amunicyjny + KAMAZ Muniční + KamAZ Munitions + КамАЗ Боеприпасы + KamAZ Munições + KamAZ (lőszerszállító) + KamAZ di rifornimento munizioni + + + KamAZ Fuel + KamAZ Treibstoff + KamAZ de combustible + KamAZ cysterna + KAMAZ Cisterna + KamAZ Citerne + КамАЗ Заправщик + KamAZ Combustível + KamAZ (üzemanyag-szállító) + KamAZ di rifornimento carburante + + + KamAZ Repair + KamAZ Instandsetzung + KamAZ de reparación + KamAZ Naprawczy + KAMAZ Opravárenský + KamAZ Réparation + КамАЗ Ремонтный + KamAZ Reparador + KamAZ (szerelő-jármű) + KamAZ riparatore + + + KamAZ Medical + KamAZ Sanitäter + KamAZ médico + KamAZ Medyczny + KAMAZ Zdravotnický + KamAZ Sanitaire + КамАЗ Медицинский + KamAZ Médico + KamAZ (egészségügyi) + KamAZ Medico + + + Punisher + Punisher + Punisher + Punisher + Punisher + Punisher + Kаратель + Punisher + Punisher + Punisher + + + Punisher (HMG) + Punisher (SMG) + Punisher (HMG) + Punisher (CKM) + Punisher (TK) + Punisher (HMG) + Kаратель (Пулемет) + Punisher (HMG) + Punisher (HMG) + Punisher (HMG) + + + Punisher (GMG) + Punisher (GMW) + Punisher (GMG) + Punisher (CKM) + Punisher (granátomet) + Punisher (GMG) + Kаратель (Гранатомет) + Punisher (GMG) + Punisher (GMG) + Punisher (GMG) + + + T100 Black Eagle + T100 Black Eagle + T100 Black Eagle + T100 Black Eagle + T100 Black Eagle + T100 Black Eagle + T100 Черный Орел + T100 Black Eagle + T100 Black Eagle + T100 Black Eagle + + + 2S9 Sochor + 2S9 Sochor + 2S9 Sochor + 259 Sochor + 2S9 Sochor + 2S9 Sochor + 2S9 Сокор + 2S9 Sochor + 2S9 Sochor + 2S9 Sochor + + + BM-2T Stalker + BM-2T Stalker + BM-2T Stalker + BM-2T Stalker + BM-2T Stalker + BM-2T Stalker + БМ-2Т Сталкер + BM-2T Stalker + BM-2T Stalker + BM-2T Stalker + + + ZSU-35 Tigris + ZSU-35 Tigris + ZSU-35 Tigris + ZSU-35 Tigris + ZSU-35 Tigris + ZSU-35 Tigris + ЗСУ-35 Tigris + ZSU-35 Tigris + ZSU-35 Tigris + ZSU-35 Tigris + + + Otokar ARMA + Otokar ARMA + Otokar ARMA + Otokar ARMA + Otokar ARMA + Otokar ARMA + Otokar ARMA + Otokar ARMA + Otokar ARMA + Otokar ARMA + + + Typhoon Transport + Typhoon Transport + Typhoon de transporte + Typhoon Transportowy + Typhoon Valník + Typhoon Transport + Тайфун Транспортный + Typhoon Transporte + Typhoon szállítójármű + Typhoon da trasporto + + + Typhoon Transport (covered) + Typhoon Transport (bedeckt) + Typhoon de transporte (cubierto) + Typhoon Transportowy (przykryty) + Typhoon Valník (krytý) + Typhoon Transport (bâché) + Тайфун Транспортный (kрытый) + Typhoon Transporte (coberto) + Typhoon szállítójármű (ponyvás) + Typhoon da trasporto (coperto) + + + Typhoon Device + Typhoon Gerät + Typhoon de dispositivo + Typhoon Urządzenie + Typhoon Zařízení + Typhoon Dispositif + Тайфун Устройство + Typhoon Dispositivo + Typhoon (szerkezet) + Typhoon per dispositivo + + + Typhoon Ammo + Typhoon Munition + Typhoon de munición + Typhoon Amunicyjny + Typhoon Muniční + Typhoon Munitions + Тайфун Боеприпасы + Typhoon Munições + Typhoon (lőszerszállító) + Typhoon di rifornimento munizioni + + + Typhoon Fuel + Typhoon Treibstoff + Typhoon de combustible + Typhoon Cysterna + Typhoon Cisterna + Typhoon Citerne + Тайфун Заправщик + Typhoon Combustível + Typhoon (üzemanyag-szállító) + Typhoon di rifornimento carburante + + + Typhoon Repair + Typhoon Instandsetzung + Typhoon de reparación + Typhoon Naprawczy + Typhoon Opravárenský + Typhoon Réparation + Тайфун Ремонтный + Typhoon Reparador + Typhoon (szerelő-jármű) + Typhoon riparatore + + + Typhoon Medical + Typhoon Sanitäter + Typhoon médico + Typhoon Medyczny + Typhoon Zdravotnický + Typhoon Sanitaire + Тайфун Медицинский + Typhoon Médico + Typhoon (egészségügyi) + Typhoon medico + + + RAH-66 Comanche + RAH-66 Comanche + RAH-66 Comanche + RAH-66 Comanche + RAH-66 Comanche + RAH-66 Commanche + RAH-66 Команч + RAH-66 Comanche + RAH-66 Comanche + RAH-66 Comanche + + + MH-6 Little Bird + MH-6 Little Bird + MH-6 Litte Bird + MH-6 Little Bird + MH-6 Little Bird + MH-6 Little Bird + MH-6 Little Bird + MH-6 Little Bird + MH-6 Little Bird + MH-6 Little Bird + + + AH-6 Little Bird + AH-6 Little Bird + AH-6 Little Bird + AH-6 Little Bird + AH-6 Little Bird + AH-6 Little Bird + AH-6 Little Bird + AH-6 Little Bird + AH-6 Little Bird + AH-6 Little Bird + + + CH-47I Chinook + CH-47I Chinook + CH-47I Chinook + CH-47I Chinook + CH-47I Chinook + CH-47I Chinook + CH-47I Chinook + CH-47I Chinook + CH-47I Chinook + CH-47I Chinook + + + CH-47I Chinook (unarmed) + CH-47I Chinook (unbewaffnet) + CH-47I Chinnok (Desarmado) + CH-47I Chinook (nieuzbrojony) + CH-47I Chinook (невооруженный) + CH-47I Chinook (Neozbrojený) + + + A-10D Thunderbolt II + A-10D Thunderbolt II + A-10D Thunderbolt II + A-10D Thunderbolt II + A-10D Thunderbolt II + A-10D Thunderbolt II + A-10D Тандерболт II + A-10D Thunderbolt II + A-10D Thunderbolt II + A-10D Thunderbolt II + + + AW159 Wildcat + AW159 Wildcat + AW159 Wildcat + AW159 Wildcat + AW159 Wildcat + AW159 Wildcat + AW159 Wildcat + AW159 Wildcat + AW159 Wildcat + AW159 Wildcat + + + AW159 Wildcat (unarmed) + AW159 Wildcat (unbewaffnet) + AW159 Wildcat (desarmado) + AW159 Wildcat (nieuzbrojony) + AW159 Wildcat (neozbrojený) + AW159 Wildcat (non-armé) + AW159 Wildcat (невооруженный) + AW159 Wildcat (desarmado) + AW159 Wildcat (fegyvertelen) + AW159 Wildcat (disarmato) + + + AW101 Merlin + AW101 Merlin + AW101 Merlin + AW101 Merlin + AW101 Merlin + AW101 Merlin + AW101 Мерлин + AW101 Merlin + AW101 Merlin + AW101 Merlin + + + L-159 ALCA (CAS) + L-159 ALCA (CAS) + L-159 ALCA (CAS) + L-159 ALCA (CAS) + L-159 ALCA (CAS) + L-159 ALCA (CAS) + L-159 Альбатрос (CAS) + L-159 ALCA (CAS) + L-159 ALCA (CAS) + L-159 ALCA (CAS) + + + L-159 ALCA (AA) + L-159 ALCA (AA) + L-159 ALCA (AA) + L-159 ALCA (AA) + L-159 ALCA (AA) + L-159 ALCA (AA) + L-159 Альбатрос (AA) + L-159 ALCA (ВВ) + L-159 ALCA (AA) + L-159 ALCA (AA) + + + Ka-60 Kasatka + Ka-60 Kasatka + Ka-60 Kasatka + Ka-60 Kasatka + Ka-60 Kasatka + Ka-60 Kasatka + Ka-60 Касатка + Ka-60 Kasatka + Ka-60 Kasatka + Ka-60 Kasatka + + + Ka-60 Kasatka (unarmed) + Ka-60 Kasatka (unbewaffnet) + Ka-60 Kasatka (desarmado) + Ka-60 Kasatka (nieuzbrojony) + Ka-60 Kasatka (neozbrojená) + Ka-60 Kasatka (non-armé) + Ka-60 Касатка (невооруженный) + Ka-60 Kasatka (desarmado) + Ka-60 Kasatka (fegyvertelen) + Ka-60 Kasatka (disarmato) + + + Yak-130 + Yak-130 + Yak-130 + Jak-130 + Jak-130 + Yak-130 + Як-130 + Yak-130 + Jak-130 + Yak-130 + + + MD 500 + MD 500 + MD 500 + MD 500 + MD 500 + MD 500 + MD 500 + MD 500 + MD 500 + MD 500 + + + M4A1 SLAM + M4A1 SLAM + M4A1 SLAM + M4A1 SLAM + M4A1 SLAM + M4A1 SLAM + M4A1 SLAM + M4A1 SLAM + M4A1 SLAM + M4A1 SLAM + + + M18A1 Claymore + M18A1 Claymore + M18A1 Claymore + Mina kierunkowa M18A1 Claymore + M18A1 Mina Claymore + M18A1 Claymore Mine antipersonnel à effet dirigé + M18A1 Клеймор + M18A1 Claymore + M18A1 Claymore akna + M18A1 Claymore Mina antiuomo + + + M183 Demolition Charge Assembly + M183 Geballte Sprengladung + Conjunto de carga de demolición M183 + Ładunek burzący M183 + M183 Demoliční nálož + M183 Charge de Démolition + M183 Комплектный подрывной заряд + M183 Sacola de Demolição + M183 romboló töltet + M183 Demolition Charge Assembly + + + M112 Demolition Block + M112 Sprengladung + Bloque de demolición M112 + Ładunek burzący M112 + M112 Výbušná nálož + Pétard M112 + M112 подрывной заряд + M112 Carga de Demolição + M112 romboló töltet + M112 Demolition Block + + + M67 Fragmentation Grenade + M67 Splittergranate + Granada de fragmentación M67 + Granat obronny M67 + M67 Granát + M67 Grenade à fragmentation + M67 ручная осколочная граната + M67 Granada de fragmentação + M67 repeszgránát + M67 Granata a frammentazione + + + M83 Smoke Grenade (White) + M83 Rauchgranate (Weiss) + Granada de humo M83 (Blanco) + Granat dymny M83 (Biały) + M83 Kouřový Granát (Bílý) + M83 Grenade fumigène (Blanche) + M83 дымовая граната (Белый) + M83 Granada de fumaça (Branca) + M83 füstgránát (Fehér) + M83 Granata fumogena (Bianco) + + + M18 Smoke Grenade (Blue) + M18 Rauchgranate (Blau) + Granada de humo M18 (Azul) + Granat dymny M18 (Niebieski) + M18 Kouřový Granát (Modrý) + M18 Grenade fumigène (Bleue) + M18 дымовая граната (Синий) + M18 Granada de fumaça (Azul) + M18 füstgránát (Kék) + M18 Granata fumogena (Blu) + + + M18 Smoke Grenade (Green) + M18 Rauchgranate (Grün) + Granada de humo M18 (Verde) + Granat dymny M18 (Zielony) + M18 Kouřový Granát (Zelený) + M18 Grenade fumigène (Verte) + M18 дымовая граната (Зелёный) + M18 Granada de fumaça (Verde) + M18 füstgránát (Zöld) + M18 Granata fumogena (Verde) + + + M18 Smoke Grenade (Orange) + M18 Rauchgranate (Orange) + Granada de humo M18 (Naranja) + Granat dymny M18 (Pomarańczowy) + M18 Kouřový Granát (Oranžový) + M18 Grenade fumigène (Orange) + M18 дымовая граната (Оранжевый) + M18 Granada de fumaça (Laranja) + M18 füstgránát (Narancssárga) + M18 Granata fumogena (Arancione) + + + M18 Smoke Grenade (Purple) + M18 Rauchgranate (Violett) + Granada de humo M18 (Púrpura) + Granat dymny M18 (Fioletowy) + M18 Kouřový Granát (Fialový) + M18 Grenade fumigène (Pourpre) + M18 дымовая граната (Пурпурный) + M18 Granada de fumaça (Roxa) + M18 füstgránát (Lila) + M18 Granata fumogena (Viola) + + + M18 Smoke Grenade (Red) + M18 Rauchgranate (Rot) + Granada de humo M18 (Rojo) + Granat dymny M18 (Czerwony) + M18 Kouřový Granát (Červený) + M18 Grenade fumigène (Rouge) + M18 дымовая граната (Красный) + M18 Granada de fumaça (Vermelha) + M18 füstgránát (Piros) + M18 Granata fumogena (Rosso) + + + M18 Smoke Grenade (Yellow) + M18 Rauchgranate (Gelb) + Granada de humo M18 (Amarillo) + Granat dymny M18 (Żółty) + M18 Kouřový Granát (Žlutý) + M18 Grenade fumigène (Jaune) + M183 дымовая граната (Жёлтые) + M18 Granada de fumaça (Amarela) + M18 füstgránát (Sárga) + M18 Granata fumogena (Giallo) + + + M15 Anti-Tank Mine + M15 Panzerabwehrmine + Mina antitanque M15 + Mina przeciwpancerna M15 + M15 Protitanková Mina + M15 Mine antichar + M15 противотанковая мина + M15 Mina anticarro + M15 harckocsiakna + M15 Mine anticarro + + + VS-50 Anti-Personnel Mine + VS-50 Antipersonenmine + Mina antipersona VS-50 + Mina przeciwpiechotna VS-50 + VS-50 Protipěchotní Mina + VS-50 Mine antipersonnel à pression + VS-50 Противопехотная мина + VS-50 Mina antipessoal + VS-50 gyalogsági taposóakna + VS-50 Mine antiuomo + + + M26 Anti-Personnel Bounding Mine + M26 Antipersonensprungmine + Mina antipersona M26 + Mina przeciwpiechotna M26 + M26 Šrapnelová Mina + M26 Mine antipersonnel bondissante + M26 Противопехотная мина + M26 Mina saltadora antipessoal + M26 gyalogsági ugróakna + M26 Mine saltanti antiuomo + + + PMR-3 Anti-Personnel Tripwire Mine + PMR-3 Antipersonenstolperdrahtmine + Mina antipersona de alambre PMR-3 + Mina przeciwpiechotna PMR-3 + PMR-3 Nástražná Mina + PMR-3 Mine antipersonnel à traction + PMR-3 Противопехотная мина + PMR-3 Mina antipessoal (armadilha) + PMR-3 botlódrótos gyalogsági akna + PMR-3 Mine antiuomo + + + P99 + P99 + P99 + + + MP-443 Grach + MP-443 Grach + MP-443 Grach + + + ACP-C2 + ACP-C2 + ACP-C2 + + + FNX-45 Tactical + FNX-45 Tactical + FNX-45 Tactical + + + Chiappa Rhino 60DS + Chiappa Rhino 60DS + Chiappa Rhino 60DS + + + Taurus Judge + Taurus Judge + Taurus Judge + + + NLAW + NLAW + NLAW + + + RPG-32 + RPG-32 + RPG-32 + + + Mini-Spike (AA) + Mini-Spike (AA) + Mini-Spike (AA) + + + Mini-Spike (AT) + Mini-Spike (AT) + Mini-Spike (AT) + + + MX + MX + MX + + + MX (Black) + MX (Black) + MX (Negro) + + + MXC + MXC + MXC + + + MXC (Black) + MXC (Black) + MXC (Negro) + + + MX 3GL + MX 3GL + MX 3GL + + + MX 3GL (Black) + MX 3GL (Black) + MX 3GL (Negro) + + + MX LSW + MX LSW + MX LSW + + + MX LSW (Black) + MX LSW (Black) + MX LSW (Negro) + + + MXM + MXM + MXM + + + MXM (Black) + MXM (Black) + MXM (Negro) + + + KT2002 Katiba + KT2002 Katiba + KT2002 Katiba + + + KT2002C Katiba + KT2002C Katiba + KT2002C Katiba + + + KT2002 Katiba KGL + KT2002 Katiba KGL + KT2002 Katiba KGL + + + F2000 (Camo) + F2000 (Camo) + F2000 (Camuflaje) + + + F2000 + F2000 + F2000 + + + F2000 Tactical (Camo) + F2000 Tactical (Camo) + F2000 Tactical (Camuflaje) + + + F2000 Tactical + F2000 Tactical + F2000 Tactical + + + F2000 EGLM (Camo) + F2000 EGLM (Camo) + F2000 EGLM (Camuflaje) + + + F2000 EGLM + F2000 EGLM + F2000 EGLM + + + TAR-21 + TAR-21 + TAR-21 + + + CTAR-21 + CTAR-21 + CTAR-21 + + + TAR-21 EGLM + TAR-21 EGLM + TAR-21 EGLM + + + Vector SMG + Vector SMG + Vector SMG + + + Scorpion Evo 3 A1 + Scorpion Evo 3 A1 + Scorpion Evo 3 A1 + + + CPW + CPW + CPW + + + RFB SDAR + RFB SDAR + RFB SDAR + + + Stoner 99 LMG + Stoner 99 LMG + Stoner 99 LMG + + + Negev NG7 + Negev NG7 + Negev NG7 + + + Mk14 Mod 1 EBR + Mk14 Mod 1 EBR + Mk14 Mod 1 EBR + + + GM6 Lynx + GM6 Lynx + GM6 Lynx + + + GM6 Lynx (Camo) + GM6 Lynx (Camo) + GM6 Lynx (Camuflaje) + + + M200 Intervention + M200 Intervention + M200 Intervention + + + M200 Intervention (Camo) + M200 Intervention (Camo) + M200 Intervention (Camuflaje) + + + VS-121 + VS-121 + VS-121 + + + TODO: MAR-10 .338 + TODO: MAR-10 .338 + + + TODO: MAR-10 .338 (Black) + TODO: MAR-10 .338 (Negro) + + + TODO: MAR-10 .338 (Camo) + TODO: MAR-10 .338 (Camuflaje) + + + TODO: MAR-10 .338 (Sand) + TODO: MAR-10 .338 (Arena) + + + TODO: Mk-I EMR 7.62 mm + TODO: Mk-I EMR 7.62 mm + + + TODO: Mk-I EMR 7.62 mm (Black) + TODO: Mk-I EMR 7.62 mm (Negro) + + + TODO: Mk-I EMR 7.62 mm (Khaki) + TODO: Mk-I EMR 7.62 mm (Caqui) + + + TODO: Mk-I EMR 7.62 mm (Sand) + TODO: Mk-I EMR 7.62 mm (Arena) + + + TODO: Mk-I EMR 7.62 mm (Camo) + TODO: Mk-I EMR 7.62 mm (Camuflaje) + + + TODO: Mk-I EMR 7.62 mm (Woodland) + TODO: Mk-I EMR 7.62 mm (Bosque) + + + TODO: NATO DMR (provisional) spotter + TODO: NATO DMR (provisional) observador + + + TODO: ASP-1 Kir 12.7 mm + TODO: ASP-1 Kir 12.7 mm + + + TODO: ASP-1 Kir 12.7 mm (Black) + TODO: ASP-1 Kir 12.7 mm (Negro) + + + TODO: ASP-1 Kir 12.7 mm (Tan) + TODO: ASP-1 Kir 12.7 mm (Tan) + + + TODO: Cyrus 9.3 mm + TODO: Cyrus 9.3 mm + + + TODO: Cyrus 9.3 mm (Black) + TODO: Cyrus 9.3 mm (Negro) + + + TODO: Cyrus 9.3 mm (Hex) + TODO: Cyrus 9.3 mm (Hex) + + + TODO: Cyrus 9.3 mm (Tan) + TODO: Cyrus 9.3 mm (Tan) + + + TODO: Mk14 7.62 mm + TODO: Mk14 7.62 mm + + + TODO: Mk14 7.62 mm (Camo) + TODO: Mk14 7.62 mm (Camuflaje) + + + TODO: Mk14 7.62 mm (Olive) + TODO: Mk14 7.62 mm (Oliva) + + + TODO: Navid 9.3 mm + TODO: Navid 9.3 mm + + + TODO: Navid 9.3 mm (Hex) + TODO: Navid 9.3 mm (Hex) + + + TODO: Navid 9.3 mm (Tan) + TODO: Navid 9.3 mm (Tan) + + + TODO: SPMG .338 + TODO: SPMG .338 + + + TODO: SPMG .338 (MTP) + TODO: SPMG .338 (MTP) + + + TODO: SPMG .338 (Black) + TODO: SPMG .338 (Negro) + + + TODO: SPMG .338 (Sand) + TODO: SPMG .338 (Arena) + + \ No newline at end of file From 7c6b84b1f106f5870b95398a10790472d72e33cb Mon Sep 17 00:00:00 2001 From: jaynus Date: Sun, 12 Apr 2015 16:52:10 -0700 Subject: [PATCH 007/305] Begin laserdesignator UI changes. --- addons/laser/RscInGameUI.hpp | 113 ++++++++++++++++++++++++++++++++++- addons/laser/config.cpp | 3 +- 2 files changed, 114 insertions(+), 2 deletions(-) diff --git a/addons/laser/RscInGameUI.hpp b/addons/laser/RscInGameUI.hpp index 457d320520..15a0ea015d 100644 --- a/addons/laser/RscInGameUI.hpp +++ b/addons/laser/RscInGameUI.hpp @@ -1 +1,112 @@ -// TODO: RscOptics_LaserDesignator for laser code designation \ No newline at end of file +class RscInGameUI { + class RscOptics_LaserDesignator { + idd = 300; + controls[] = {"CA_IGUI_elements_group"}; + class CA_IGUI_elements_group: RscControlsGroup { + idc = 170; + class VScrollbar: VScrollbar { + width = 0; + }; + class HScrollbar: HScrollbar { + height = 0; + }; + x = "0 * (0.01875 * SafezoneH) + (SafezoneX + ((SafezoneW - SafezoneH) / 2))"; + y = "0 * (0.025 * SafezoneH) + (SafezoneY)"; + w = "53.5 * (0.01875 * SafezoneH)"; + h = "40 * (0.025 * SafezoneH)"; + class controls { + class CA_OpticsZoom: RscText { + idc = 180; + style = 1; + colorText[] = {0.706,0.0745,0.0196,1}; + sizeEx = "0.038*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "4.5"; + x = "43.85 * (0.01875 * SafezoneH)"; + y = "19.6 * (0.025 * SafezoneH)"; + w = "4.5 * (0.01875 * SafezoneH)"; + h = "1.1 * (0.025 * SafezoneH)"; + }; + class CA_Distance: RscText { + idc = 151; + style = 0; + sizeEx = "0.038*SafezoneH"; + colorText[] = {0.706,0.0745,0.0196,1}; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "2456"; + x = "24.5 * (0.01875 * SafezoneH)"; + y = "3 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.5 * (0.025 * SafezoneH)"; + }; + class CA_Elev: RscText { + idc = 175; + style = 1; + sizeEx = "0.038*SafezoneH"; + colorText[] = {0.706,0.0745,0.0196,1}; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "80.5"; + x = "32.7 * (0.01875 * SafezoneH)"; + y = "3 * (0.025 * SafezoneH)"; + w = "5 * (0.01875 * SafezoneH)"; + h = "1.5 * (0.025 * SafezoneH)"; + }; + class CA_VisionMode: RscText { + idc = 179; + style = 0; + sizeEx = "0.038*SafezoneH"; + colorText[] = {0.706,0.0745,0.0196,1}; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "VIS"; + x = "6.5 * (0.01875 * SafezoneH)"; + y = "19.6 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.1 * (0.025 * SafezoneH)"; + }; + class CA_Laser: RscText { + idc = 158; + style = "0x30 + 0x800"; + sizeEx = "0.038*SafezoneH"; + colorText[] = {0.706,0.0745,0.0196,1}; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics\laser_designator_iconLaserOn.paa"; + x = "29.2 * (0.01875 * SafezoneH)"; + y = "3 * (0.025 * SafezoneH)"; + w = "3.5 * (0.01875 * SafezoneH)"; + h = "1.5 * (0.025 * SafezoneH)"; + }; + class CA_Heading: RscText { + idc = 156; + style = 0; + sizeEx = "0.038*SafezoneH"; + colorText[] = {0.706,0.0745,0.0196,1}; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "023"; + x = "16.1 * (0.01875 * SafezoneH)"; + y = "3 * (0.025 * SafezoneH)"; + w = "3.5 * (0.01875 * SafezoneH)"; + h = "1.6 * (0.025 * SafezoneH)"; + }; + + class ACE_LaserCode : RscText { + idc = 123001; + style = 0; + sizeEx = "0.038*SafezoneH"; + colorText[] = {0.706,0.0745,0.0196,1}; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "Code: 1001"; + x = "20.1 * (0.01875 * SafezoneH)"; + y = "3 * (0.025 * SafezoneH)"; + w = "3.5 * (0.01875 * SafezoneH)"; + h = "1.6 * (0.025 * SafezoneH)"; + }; + }; + }; + }; \ No newline at end of file diff --git a/addons/laser/config.cpp b/addons/laser/config.cpp index 3f430619ef..ad368cdc2d 100644 --- a/addons/laser/config.cpp +++ b/addons/laser/config.cpp @@ -12,4 +12,5 @@ class CfgPatches { #include "CfgEventhandlers.hpp" #include "CfgVehicles.hpp" -#include "CfgWeapons.hpp" \ No newline at end of file +#include "CfgWeapons.hpp" +#include "RscInGameUI.hpp" \ No newline at end of file From f94b4befef50ef1c4c82c64ec762e19fc72161be Mon Sep 17 00:00:00 2001 From: commy2 Date: Mon, 13 Apr 2015 13:04:23 +0200 Subject: [PATCH 008/305] initial commit --- addons/respawn/CfgVehicles.hpp | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/addons/respawn/CfgVehicles.hpp b/addons/respawn/CfgVehicles.hpp index f6b8fc64c2..4b763074c2 100644 --- a/addons/respawn/CfgVehicles.hpp +++ b/addons/respawn/CfgVehicles.hpp @@ -69,7 +69,9 @@ class CfgVehicles { }; // static - class ACE_Rallypoint_West : Flag_NATO_F { + class ACE_Rallypoint_West: Flag_NATO_F { + XEH_ENABLED; + author = "$STR_ACE_Common_ACETeam"; displayName = "Rallypoint West Base"; vehicleClass = QGVAR(Rallypoints); @@ -94,7 +96,9 @@ class CfgVehicles { }; }; - class ACE_Rallypoint_East : Flag_CSAT_F { + class ACE_Rallypoint_East: Flag_CSAT_F { + XEH_ENABLED; + author = "$STR_ACE_Common_ACETeam"; displayName = "Rallypoint East Base"; vehicleClass = QGVAR(Rallypoints); @@ -119,7 +123,9 @@ class CfgVehicles { }; }; - class ACE_Rallypoint_Independent : Flag_AAF_F { + class ACE_Rallypoint_Independent: Flag_AAF_F { + XEH_ENABLED; + author = "$STR_ACE_Common_ACETeam"; displayName = "Rallypoint Independent Base"; vehicleClass = QGVAR(Rallypoints); @@ -145,7 +151,9 @@ class CfgVehicles { }; // moveable - class ACE_RallypointExit_West : Flag_NATO_F { + class ACE_RallypointExit_West: Flag_NATO_F { + XEH_ENABLED; + author = "$STR_ACE_Common_ACETeam"; displayName = "Rallypoint West"; vehicleClass = QGVAR(Rallypoints); @@ -170,7 +178,9 @@ class CfgVehicles { }; }; - class ACE_RallypointExit_East : Flag_CSAT_F { + class ACE_RallypointExit_East: Flag_CSAT_F { + XEH_ENABLED; + author = "$STR_ACE_Common_ACETeam"; displayName = "Rallypoint East"; vehicleClass = QGVAR(Rallypoints); @@ -195,7 +205,9 @@ class CfgVehicles { }; }; - class ACE_RallypointExit_Independent : Flag_AAF_F { + class ACE_RallypointExit_Independent: Flag_AAF_F { + XEH_ENABLED; + author = "$STR_ACE_Common_ACETeam"; displayName = "Rallypoint Independent"; vehicleClass = QGVAR(Rallypoints); From 83c8abb3ba7f4423349476bf8f4336f501db7bcd Mon Sep 17 00:00:00 2001 From: Coren4 Date: Tue, 14 Apr 2015 12:41:35 +0200 Subject: [PATCH 009/305] Update stringtable.xml --- addons/safemode/stringtable.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/safemode/stringtable.xml b/addons/safemode/stringtable.xml index cb74ef060e..41d45a4d6f 100644 --- a/addons/safemode/stringtable.xml +++ b/addons/safemode/stringtable.xml @@ -27,7 +27,7 @@ Mettre le cran de sureté Waffe gesichert Poner seguro - Zabezpiecz broń + Zabezpieczono broń Přepnout pojistku Veszélytelenitve Поставить на предохранитель From f85fc12fc8392c1377fbf4d7eb7a0bd66854b289 Mon Sep 17 00:00:00 2001 From: jaynus Date: Tue, 14 Apr 2015 14:24:50 -0700 Subject: [PATCH 010/305] string overflow fix, perf fix for pass-by-ref. --- extensions/breakLine/ace_breakLine.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/extensions/breakLine/ace_breakLine.cpp b/extensions/breakLine/ace_breakLine.cpp index 74a32cc66d..fb5775b861 100644 --- a/extensions/breakLine/ace_breakLine.cpp +++ b/extensions/breakLine/ace_breakLine.cpp @@ -19,13 +19,13 @@ #define MAXCHARACTERS 14 -static char version[] = "1.0"; +static char VERSION[] = "1.0"; extern "C" { __declspec (dllexport) void __stdcall RVExtension(char *output, int outputSize, const char *function); }; -std::vector splitString(std::string input) { +std::vector splitString(const std::string & input) { std::istringstream ss(input); std::string token; @@ -38,10 +38,10 @@ std::vector splitString(std::string input) { } std::string addLineBreaks(const std::vector &words) { - std::stringstream sstream; int numChar = 0; int i = 0; + while (i < words.size()) { if (numChar == 0) { sstream << words[i]; @@ -58,6 +58,7 @@ std::string addLineBreaks(const std::vector &words) { } } } + return sstream.str(); } @@ -66,12 +67,10 @@ std::string addLineBreaks(const std::vector &words) { #pragma warning( disable : 4996 ) void __stdcall RVExtension(char *output, int outputSize, const char *function) { - //strncpy(output, function, outputSize); - if (!strcmp(function, "version")) { - strncpy(output, version, outputSize); + strncpy(output, VERSION, outputSize); } else { - strcpy(output, addLineBreaks(splitString(function)).c_str()); + strncpy(output, addLineBreaks(splitString(function)).c_str(), outputSize); output[outputSize - 1] = '\0'; } } From 971566fc3ea075b845b197f0019362a17a607b68 Mon Sep 17 00:00:00 2001 From: jaynus Date: Tue, 14 Apr 2015 16:05:01 -0700 Subject: [PATCH 011/305] Laser code dialog entry. ACTUALLY HIDE THE DAMN LASER --- addons/laser/CfgVehicles.hpp | 22 +++------------- addons/laser/RscInGameUI.hpp | 26 ++++++++++++------- .../functions/fnc_drawVisibleLaserTargets.sqf | 10 ++++++- 3 files changed, 30 insertions(+), 28 deletions(-) diff --git a/addons/laser/CfgVehicles.hpp b/addons/laser/CfgVehicles.hpp index f4e2ed42ab..361f3e1867 100644 --- a/addons/laser/CfgVehicles.hpp +++ b/addons/laser/CfgVehicles.hpp @@ -4,30 +4,16 @@ class CfgVehicles { class LaserTarget: All { // @TODO: Changing the model and simulation hides it, but THEN IT DOESNT SPAWN WTF!? model = "\A3\Weapons_F\empty.p3d"; - simulation = "nvmarker"; - nvTarget = 1; - //simulation = "laserTarget"; - //threat[] = {0,0,0}; + simulation = "house"; + class EventHandlers { init = QUOTE(_this call FUNC(laser_init)); }; - - diffuse[] = {0,0,0}; - ambient[] = {0,0,0}; - brightness = 0; - name = "pozicni blik"; - drawLight = 0; - drawLightSize = 0; - drawLightCenterSize = 0; - activeLight = 0; - blinking = 0; - dayLight = 0; - onlyInNvg = 0; - useFlare = 0; }; // Visual laserTarget override class ACE_LaserTarget_Visual : LaserTarget { - //model = "\A3\Weapons_f\laserTgt.p3d"; + simulation = "LaserTarget"; + model = "\A3\Weapons_f\laserTgt.p3d"; }; }; \ No newline at end of file diff --git a/addons/laser/RscInGameUI.hpp b/addons/laser/RscInGameUI.hpp index 15a0ea015d..366d779fde 100644 --- a/addons/laser/RscInGameUI.hpp +++ b/addons/laser/RscInGameUI.hpp @@ -1,20 +1,27 @@ +class RscControlsGroup; +class VScrollbar; +class HScrollbar; +class RscText; + class RscInGameUI { class RscOptics_LaserDesignator { idd = 300; controls[] = {"CA_IGUI_elements_group"}; + class CA_IGUI_elements_group: RscControlsGroup { idc = 170; + + x = "0 * (0.01875 * SafezoneH) + (SafezoneX + ((SafezoneW - SafezoneH) / 2))"; + y = "0 * (0.025 * SafezoneH) + (SafezoneY)"; + w = "53.5 * (0.01875 * SafezoneH)"; + h = "40 * (0.025 * SafezoneH)"; class VScrollbar: VScrollbar { width = 0; }; class HScrollbar: HScrollbar { height = 0; }; - x = "0 * (0.01875 * SafezoneH) + (SafezoneX + ((SafezoneW - SafezoneH) / 2))"; - y = "0 * (0.025 * SafezoneH) + (SafezoneY)"; - w = "53.5 * (0.01875 * SafezoneH)"; - h = "40 * (0.025 * SafezoneH)"; - class controls { + class controls { class CA_OpticsZoom: RscText { idc = 180; style = 1; @@ -102,11 +109,12 @@ class RscInGameUI { shadow = 0; font = "EtelkaMonospacePro"; text = "Code: 1001"; - x = "20.1 * (0.01875 * SafezoneH)"; - y = "3 * (0.025 * SafezoneH)"; - w = "3.5 * (0.01875 * SafezoneH)"; + x = "32.7 * (0.01875 * SafezoneH)"; + y = "35.5 * (0.025 * SafezoneH)"; + w = "12 * (0.01875 * SafezoneH)"; h = "1.6 * (0.025 * SafezoneH)"; }; }; }; - }; \ No newline at end of file + }; +}; \ No newline at end of file diff --git a/addons/laser/functions/fnc_drawVisibleLaserTargets.sqf b/addons/laser/functions/fnc_drawVisibleLaserTargets.sqf index 161364c0f2..10d5f1e1b6 100644 --- a/addons/laser/functions/fnc_drawVisibleLaserTargets.sqf +++ b/addons/laser/functions/fnc_drawVisibleLaserTargets.sqf @@ -1 +1,9 @@ -// @TODO: This is to draw the actual LaserTarget positions to utilize for laser shooting. \ No newline at end of file +// This is a debug function for displaying visible lasers for ourselves +#include "script_component.hpp" + +diag_log text format["[ACE]: Laser Emitter Dump"]; + +{ + diag_log text format[" %1", _x]; + diag_log text format[" %2", HASH_GET(GVAR(laserEmitters), _x)]; +} forEach GVAR(laserEmitters) select 0; \ No newline at end of file From 2ec74a6a3e07935cc8eddd6c50a52b84546394c5 Mon Sep 17 00:00:00 2001 From: jaynus Date: Tue, 14 Apr 2015 16:20:03 -0700 Subject: [PATCH 012/305] align correctly, create event, remove FCS from laserDesignator. --- addons/fcs/CfgOptics.hpp | 7 ------- addons/javelin/CfgWeapons.hpp | 1 + addons/laser/CfgVehicles.hpp | 1 + addons/laser/RscInGameUI.hpp | 13 ++++++++++++- addons/laser/XEH_pre_init.sqf | 2 ++ .../laser/functions/fnc_onLaserDesignatorDraw.sqf | 5 +++++ addons/laser/script_component.hpp | 6 +++++- 7 files changed, 26 insertions(+), 9 deletions(-) create mode 100644 addons/laser/functions/fnc_onLaserDesignatorDraw.sqf diff --git a/addons/fcs/CfgOptics.hpp b/addons/fcs/CfgOptics.hpp index c9704081f9..91f83dd6f6 100644 --- a/addons/fcs/CfgOptics.hpp +++ b/addons/fcs/CfgOptics.hpp @@ -35,13 +35,6 @@ class RscInGameUI { }; }; }; - class RscOptics_LaserDesignator { - class CA_IGUI_elements_group: RscControlsGroup { - class controls { - MACRO_RANGEFINDER - }; - }; - }; class RscWeaponRangeFinderMAAWS { class CA_IGUI_elements_group: RscControlsGroup { class controls { diff --git a/addons/javelin/CfgWeapons.hpp b/addons/javelin/CfgWeapons.hpp index cef967e32e..8573218048 100644 --- a/addons/javelin/CfgWeapons.hpp +++ b/addons/javelin/CfgWeapons.hpp @@ -10,5 +10,6 @@ class CfgWeapons { lockingTargetSound[] = {"",0,1}; lockedTargetSound[] = {"",0,1}; + }; }; \ No newline at end of file diff --git a/addons/laser/CfgVehicles.hpp b/addons/laser/CfgVehicles.hpp index 361f3e1867..1e83f66cc9 100644 --- a/addons/laser/CfgVehicles.hpp +++ b/addons/laser/CfgVehicles.hpp @@ -4,6 +4,7 @@ class CfgVehicles { class LaserTarget: All { // @TODO: Changing the model and simulation hides it, but THEN IT DOESNT SPAWN WTF!? model = "\A3\Weapons_F\empty.p3d"; + destrType = "DestructNo"; simulation = "house"; class EventHandlers { diff --git a/addons/laser/RscInGameUI.hpp b/addons/laser/RscInGameUI.hpp index 366d779fde..770c2104b6 100644 --- a/addons/laser/RscInGameUI.hpp +++ b/addons/laser/RscInGameUI.hpp @@ -2,12 +2,17 @@ class RscControlsGroup; class VScrollbar; class HScrollbar; class RscText; +class RscMapControl; class RscInGameUI { class RscOptics_LaserDesignator { idd = 300; controls[] = {"CA_IGUI_elements_group"}; + onLoad = "uiNameSpace setVariable ['ACE_RscOptics_LaserDesignator',(_this select 0)];"; + onUnload = "uiNameSpace setVariable ['ACE_RscOptics_LaserDesignator',nil];"; + + class CA_IGUI_elements_group: RscControlsGroup { idc = 170; @@ -43,7 +48,7 @@ class RscInGameUI { shadow = 0; font = "EtelkaMonospacePro"; text = "2456"; - x = "24.5 * (0.01875 * SafezoneH)"; + x = "24.6 * (0.01875 * SafezoneH)"; y = "3 * (0.025 * SafezoneH)"; w = "4 * (0.01875 * SafezoneH)"; h = "1.5 * (0.025 * SafezoneH)"; @@ -101,6 +106,12 @@ class RscInGameUI { h = "1.6 * (0.025 * SafezoneH)"; }; + class ACE_LaserCode_Helper : RscMapControl { + idc = -1; + onDraw = QUOTE(_this call FUNC(onLaserDesignatorDraw)); + w = 0; + h = 0; + }; class ACE_LaserCode : RscText { idc = 123001; style = 0; diff --git a/addons/laser/XEH_pre_init.sqf b/addons/laser/XEH_pre_init.sqf index e160a533f2..de56274759 100644 --- a/addons/laser/XEH_pre_init.sqf +++ b/addons/laser/XEH_pre_init.sqf @@ -11,6 +11,8 @@ PREP(findStrongestRay); PREP(translateToModelSpace); PREP(translateToWeaponSpace); +PREP(onLaserDesignatorDraw); + PREP(seekerFindLaserSpot); PREP(laserOn); PREP(laserOff); diff --git a/addons/laser/functions/fnc_onLaserDesignatorDraw.sqf b/addons/laser/functions/fnc_onLaserDesignatorDraw.sqf new file mode 100644 index 0000000000..3f756443fa --- /dev/null +++ b/addons/laser/functions/fnc_onLaserDesignatorDraw.sqf @@ -0,0 +1,5 @@ +#define DEBUG_MODE_FULL +#include "script_component.hpp" + + +TRACE_1("", _this); \ No newline at end of file diff --git a/addons/laser/script_component.hpp b/addons/laser/script_component.hpp index 2be1e9e14b..6bd4063f4e 100644 --- a/addons/laser/script_component.hpp +++ b/addons/laser/script_component.hpp @@ -12,4 +12,8 @@ #include "\z\ace\Addons\main\script_macros.hpp" -#define FIREMODE_DIRECT_LOAL 1 \ No newline at end of file +#define FIREMODE_DIRECT_LOAL 1 + + +#define __LaserDesignatorIGUI (uiNamespace getVariable ["ACE_RscOptics_LaserDesignator", nil]) +#define __LaserDesignatorIGUI_LaserCode (__LaserDesignatorIGUI displayCtrl 123001) \ No newline at end of file From 934f2ce097637ac140eeb5b994b66c4b32f01bea Mon Sep 17 00:00:00 2001 From: jaynus Date: Tue, 14 Apr 2015 16:29:49 -0700 Subject: [PATCH 013/305] Display current laser code. Standardize GVARs --- addons/laser/XEH_post_init.sqf | 1 + addons/laser/functions/fnc_onLaserDesignatorDraw.sqf | 8 ++++++-- .../functions/fnc_laserHudDesignateOn.sqf | 10 +++++----- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/addons/laser/XEH_post_init.sqf b/addons/laser/XEH_post_init.sqf index fb189d5041..f868ef9895 100644 --- a/addons/laser/XEH_post_init.sqf +++ b/addons/laser/XEH_post_init.sqf @@ -2,3 +2,4 @@ ["laser_laserOn", {_this call DFUNC(handleLaserOn)}] call EFUNC(common,addEventHandler); ["laser_laserOff", {_this call DFUNC(handleLaserOff)}] call EFUNC(common,addEventHandler); + diff --git a/addons/laser/functions/fnc_onLaserDesignatorDraw.sqf b/addons/laser/functions/fnc_onLaserDesignatorDraw.sqf index 3f756443fa..a5da33b236 100644 --- a/addons/laser/functions/fnc_onLaserDesignatorDraw.sqf +++ b/addons/laser/functions/fnc_onLaserDesignatorDraw.sqf @@ -1,5 +1,9 @@ #define DEBUG_MODE_FULL #include "script_component.hpp" +TRACE_1("", _this); +private["_laserCode"]; - -TRACE_1("", _this); \ No newline at end of file +_laserCode = ACE_player getVariable[QGVAR(code), ACE_DEFAULT_LASER_CODE]; +if(!isNil "_laserCode") then { + __LaserDesignatorIGUI_LaserCode ctrlSetText format["Code: %1", [_laserCode, 4, 0, false] call CBA_fnc_formatNumber]; +}; \ No newline at end of file diff --git a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf index c480c051bb..6301f6f5e4 100644 --- a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf +++ b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf @@ -43,8 +43,8 @@ FUNC(laserHudDesignatePFH) = { _turretInfo = [_vehicle, _gunnerInfo select 1] call EFUNC(common,getTurretDirection); _povPos = _turretInfo select 0; - _laserCode = (vehicle ACE_player) getVariable[QGVAR(currentCode), ACE_DEFAULT_LASER_CODE]; - _waveLength = (vehicle ACE_player) getVariable[QGVAR(currentWaveLength), ACE_DEFAULT_LASER_WAVELENGTH]; + _laserCode = (vehicle ACE_player) getVariable["ace_laser_code", ACE_DEFAULT_LASER_CODE]; + _waveLength = (vehicle ACE_player) getVariable["ace_laser_waveLength", ACE_DEFAULT_LASER_WAVELENGTH]; _laserResult = [_povPos, [_waveLength,_waveLength], _laserCode] call EFUNC(laser,seekerFindLaserSpot); @@ -73,9 +73,9 @@ if(!GVAR(active)) then { TRACE_1("Activating laser", ""); // Get the self-designation variables, or use defaults - _laserCode = (vehicle ACE_player) getVariable[QGVAR(currentCode), ACE_DEFAULT_LASER_CODE]; - _waveLength = (vehicle ACE_player) getVariable[QGVAR(currentWaveLength), ACE_DEFAULT_LASER_WAVELENGTH]; - _beamSpread = (vehicle ACE_player) getVariable[QGVAR(currentBeamSpread), ACE_DEFAULT_LASER_BEAMSPREAD]; + _laserCode = (vehicle ACE_player) getVariable["ace_laser_code", ACE_DEFAULT_LASER_CODE]; + _waveLength = (vehicle ACE_player) getVariable["ace_laser_waveLength", ACE_DEFAULT_LASER_WAVELENGTH]; + _beamSpread = (vehicle ACE_player) getVariable["ace_laser_beamSpread", ACE_DEFAULT_LASER_BEAMSPREAD]; _laserUuid = [(vehicle ACE_player), ACE_player, QFUNC(findLaserSource), _waveLength, _laserCode, _beamSpread] call EFUNC(laser,laserOn); From 4cdf61ab9eb0bfe89b8c40fb0da390c638229a57 Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 15 Apr 2015 01:50:58 +0200 Subject: [PATCH 014/305] fix misc issues with rallypoints --- addons/respawn/CfgEventHandlers.hpp | 43 ++- addons/respawn/CfgVehicles.hpp | 330 ++++++++---------- .../respawn/functions/fnc_moveRallypoint.sqf | 6 +- addons/respawn/functions/fnc_restoreGear.sqf | 14 + .../functions/fnc_teleportToRallypoint.sqf | 23 +- 5 files changed, 210 insertions(+), 206 deletions(-) diff --git a/addons/respawn/CfgEventHandlers.hpp b/addons/respawn/CfgEventHandlers.hpp index c4a50615d1..7b00950931 100644 --- a/addons/respawn/CfgEventHandlers.hpp +++ b/addons/respawn/CfgEventHandlers.hpp @@ -6,15 +6,54 @@ class Extended_PreInit_EventHandlers { class Extended_Killed_EventHandlers { class CAManBase { - class GVAR(HandleGear) { + class ADDON { killed = QUOTE(_this call FUNC(handleKilled)); }; }; }; + class Extended_Respawn_EventHandlers { class CAManBase { - class GVAR(HandleGear) { + class ADDON { respawn = QUOTE(_this call FUNC(handleRespawn)); }; }; }; + +class Extended_Init_EventHandlers { + class ACE_Rallypoint_West { + class ADDON { + init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_nato_CO.paa'; _this call FUNC(initRallypoint)); + }; + }; + + class ACE_Rallypoint_East { + class ADDON { + init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_CSAT_CO.paa'; _this call FUNC(initRallypoint)); + }; + }; + + class ACE_Rallypoint_Independent { + class ADDON { + init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_AAF_CO.paa'; _this call FUNC(initRallypoint)); + }; + }; + + class ACE_Rallypoint_West_Base { + class ADDON { + init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_nato_CO.paa'; _this call FUNC(initRallypoint)); + }; + }; + + class ACE_Rallypoint_East_Base { + class ADDON { + init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_CSAT_CO.paa'; _this call FUNC(initRallypoint)); + }; + }; + + class ACE_Rallypoint_Independent_Base { + class ADDON { + init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_AAF_CO.paa'; _this call FUNC(initRallypoint)); + }; + }; +}; diff --git a/addons/respawn/CfgVehicles.hpp b/addons/respawn/CfgVehicles.hpp index 4b763074c2..c8ca4f9216 100644 --- a/addons/respawn/CfgVehicles.hpp +++ b/addons/respawn/CfgVehicles.hpp @@ -1,6 +1,6 @@ class CfgVehicles { class Module_F; - class ACE_ModuleRespawn : Module_F { + class ACE_ModuleRespawn: Module_F { author = "$STR_ACE_Common_ACETeam"; category = "ACE"; displayName = "Respawn System"; @@ -8,20 +8,24 @@ class CfgVehicles { scope = 2; isGlobal = 1; icon = QUOTE(PATHTOF(UI\Icon_Module_Respawn_ca.paa)); + class Arguments { class SavePreDeathGear { displayName = "Save Gear?"; description = "Respawn with the gear a soldier had just before his death?"; typeName = "BOOL"; + class values { class Yes { name = "Yes"; value = 1; }; class No { default = 1; name = "No"; value = 0; }; }; }; + class RemoveDeadBodiesDisconnected { displayName = "Remove bodies?"; description = "Remove player bodies after disconnect?"; typeName = "BOOL"; + class values { class Yes { default = 1; name = "Yes"; value = 1; }; class No { name = "No"; value = 0; }; @@ -30,7 +34,7 @@ class CfgVehicles { }; }; - class ACE_ModuleFriendlyFire : Module_F { + class ACE_ModuleFriendlyFire: Module_F { author = "$STR_ACE_Common_ACETeam"; category = "ACE"; displayName = "Friendly Fire Messages"; @@ -38,11 +42,11 @@ class CfgVehicles { scope = 2; isGlobal = 1; icon = QUOTE(PATHTOF(UI\Icon_Module_FriendlyFire_ca.paa)); - class Arguments { - }; + + class Arguments {}; }; - class ACE_ModuleRallypoint : Module_F { + class ACE_ModuleRallypoint: Module_F { author = "$STR_ACE_Common_ACETeam"; category = "ACE"; displayName = "Rallypoint System"; @@ -50,186 +54,8 @@ class CfgVehicles { scope = 2; isGlobal = 1; icon = QUOTE(PATHTOF(UI\Icon_Module_Rallypoint_ca.paa)); - class Arguments { - }; - }; - // rallypoints - class FlagCarrier; - class Flag_NATO_F : FlagCarrier { - class ACE_Actions; - }; - - class Flag_CSAT_F : FlagCarrier { - class ACE_Actions; - }; - - class Flag_AAF_F : FlagCarrier { - class ACE_Actions; - }; - - // static - class ACE_Rallypoint_West: Flag_NATO_F { - XEH_ENABLED; - - author = "$STR_ACE_Common_ACETeam"; - displayName = "Rallypoint West Base"; - vehicleClass = QGVAR(Rallypoints); - - class EventHandlers { - init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_nato_CO.paa'; _this call FUNC(initRallypoint)); - }; - class ACE_Actions : ACE_Actions { - class ACE_MainActions { - distance = 5; - condition = "true"; - selection = ""; - class ACE_Teleport { - displayName = "Teleport to Rallypoint"; - distance = 4; - condition = QUOTE(side group _player == west); - statement = QUOTE([ARR_3(_player, side group _player, false)] call FUNC(teleportToRallypoint)); - showDisabled = 1; - priority = 1; - }; - }; - }; - }; - - class ACE_Rallypoint_East: Flag_CSAT_F { - XEH_ENABLED; - - author = "$STR_ACE_Common_ACETeam"; - displayName = "Rallypoint East Base"; - vehicleClass = QGVAR(Rallypoints); - - class EventHandlers { - init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_CSAT_CO.paa'; _this call FUNC(initRallypoint)); - }; - class ACE_Actions : ACE_Actions { - class ACE_MainActions { - distance = 5; - condition = "true"; - selection = ""; - class ACE_Teleport { - displayName = "Teleport to Rallypoint"; - distance = 4; - condition = QUOTE(side group _player == east); - statement = QUOTE([ARR_3(_player, side group _player, false)] call FUNC(teleportToRallypoint)); - showDisabled = 1; - priority = 1; - }; - }; - }; - }; - - class ACE_Rallypoint_Independent: Flag_AAF_F { - XEH_ENABLED; - - author = "$STR_ACE_Common_ACETeam"; - displayName = "Rallypoint Independent Base"; - vehicleClass = QGVAR(Rallypoints); - - class EventHandlers { - init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_AAF_CO.paa'; _this call FUNC(initRallypoint)); - }; - class ACE_Actions : ACE_Actions { - class ACE_MainActions { - distance = 5; - condition = "true"; - selection = ""; - class ACE_Teleport { - displayName = "Teleport to Rallypoint"; - distance = 4; - condition = QUOTE(side group _player == independent); - statement = QUOTE([ARR_3(_player, side group _player, false)] call FUNC(teleportToRallypoint)); - showDisabled = 1; - priority = 1; - }; - }; - }; - }; - - // moveable - class ACE_RallypointExit_West: Flag_NATO_F { - XEH_ENABLED; - - author = "$STR_ACE_Common_ACETeam"; - displayName = "Rallypoint West"; - vehicleClass = QGVAR(Rallypoints); - - class EventHandlers { - init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_nato_CO.paa'; _this call FUNC(initRallypoint)); - }; - class ACE_Actions : ACE_Actions { - class ACE_MainActions { - distance = 5; - condition = "true"; - selection = ""; - class ACE_Teleport { - displayName = "Teleport to Base"; - distance = 4; - condition = QUOTE(side group _player == west); - statement = QUOTE([ARR_3(_player, side group _player, true)] call FUNC(teleportToRallypoint)); - showDisabled = 1; - priority = 1; - }; - }; - }; - }; - - class ACE_RallypointExit_East: Flag_CSAT_F { - XEH_ENABLED; - - author = "$STR_ACE_Common_ACETeam"; - displayName = "Rallypoint East"; - vehicleClass = QGVAR(Rallypoints); - - class EventHandlers { - init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_CSAT_CO.paa'; _this call FUNC(initRallypoint)); - }; - class ACE_Actions : ACE_Actions { - class ACE_MainActions { - distance = 5; - condition = "true"; - selection = ""; - class ACE_Teleport { - displayName = "Teleport to Base"; - distance = 4; - condition = QUOTE(side group _player == east); - statement = QUOTE([ARR_3(_player, side group _player, true)] call FUNC(teleportToRallypoint)); - showDisabled = 1; - priority = 1; - }; - }; - }; - }; - - class ACE_RallypointExit_Independent: Flag_AAF_F { - XEH_ENABLED; - - author = "$STR_ACE_Common_ACETeam"; - displayName = "Rallypoint Independent"; - vehicleClass = QGVAR(Rallypoints); - - class EventHandlers { - init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_AAF_CO.paa'; _this call FUNC(initRallypoint)); - }; - class ACE_Actions : ACE_Actions { - class ACE_MainActions { - distance = 5; - condition = "true"; - selection = ""; - class ACE_Teleport { - displayName = "Teleport to Base"; - distance = 4; - condition = QUOTE(side group _player == independent); - statement = QUOTE([ARR_3(_player, side group _player, true)] call FUNC(teleportToRallypoint)); - showDisabled = 1; - priority = 1; - }; - }; - }; + class Arguments {}; }; // team leader @@ -245,4 +71,140 @@ class CfgVehicles { }; }; }; + + // rallypoints + class FlagCarrier; + class Flag_NATO_F: FlagCarrier { + class ACE_Actions; + }; + + class Flag_CSAT_F: FlagCarrier { + class ACE_Actions; + }; + + class Flag_AAF_F: FlagCarrier { + class ACE_Actions; + }; + + // static + class ACE_Rallypoint_West_Base: Flag_NATO_F { + XEH_ENABLED; + + author = "$STR_ACE_Common_ACETeam"; + displayName = "Rallypoint West Base"; + vehicleClass = QGVAR(Rallypoints); + + class ACE_Actions: ACE_Actions { + class ACE_Teleport { + displayName = "$STR_ACE_Respawn_TeleportedToRallypoint"; + distance = 4; + condition = QUOTE(side group _player == west); + statement = QUOTE([ARR_3(_player,side group _player,'ACE_Rallypoint_West')] call FUNC(teleportToRallypoint)); + position[] = {0,0,-1}; + showDisabled = 1; + priority = 1; + }; + }; + }; + + class ACE_Rallypoint_East_Base: Flag_CSAT_F { + XEH_ENABLED; + + author = "$STR_ACE_Common_ACETeam"; + displayName = "Rallypoint East Base"; + vehicleClass = QGVAR(Rallypoints); + + class ACE_Actions: ACE_Actions { + class ACE_Teleport { + displayName = "$STR_ACE_Respawn_TeleportedToRallypoint"; + distance = 4; + condition = QUOTE(side group _player == east); + statement = QUOTE([ARR_3(_player,side group _player,'ACE_Rallypoint_East')] call FUNC(teleportToRallypoint)); + position[] = {0,0,-1}; + showDisabled = 1; + priority = 1; + }; + }; + }; + + class ACE_Rallypoint_Independent_Base: Flag_AAF_F { + XEH_ENABLED; + + author = "$STR_ACE_Common_ACETeam"; + displayName = "Rallypoint Independent Base"; + vehicleClass = QGVAR(Rallypoints); + + class ACE_Actions: ACE_Actions { + class ACE_Teleport { + displayName = "$STR_ACE_Respawn_TeleportedToRallypoint"; + distance = 4; + condition = QUOTE(side group _player == independent); + statement = QUOTE([ARR_3(_player,side group _player,'ACE_Rallypoint_Independent')] call FUNC(teleportToRallypoint)); + position[] = {0,0,-1}; + showDisabled = 1; + priority = 1; + }; + }; + }; + + // moveable + class ACE_Rallypoint_West: Flag_NATO_F { + XEH_ENABLED; + + author = "$STR_ACE_Common_ACETeam"; + displayName = "Rallypoint West"; + vehicleClass = QGVAR(Rallypoints); + + class ACE_Actions: ACE_Actions { + class ACE_Teleport { + displayName = "$STR_ACE_Respawn_TeleportedToBase"; + distance = 4; + condition = QUOTE(side group _player == west); + statement = QUOTE([ARR_3(_player,side group _player,'ACE_Rallypoint_West_Base')] call FUNC(teleportToRallypoint)); + position[] = {0,0,-1}; + showDisabled = 1; + priority = 1; + }; + }; + }; + + class ACE_Rallypoint_East: Flag_CSAT_F { + XEH_ENABLED; + + author = "$STR_ACE_Common_ACETeam"; + displayName = "Rallypoint East"; + vehicleClass = QGVAR(Rallypoints); + + class ACE_Actions: ACE_Actions { + class ACE_Teleport { + displayName = "$STR_ACE_Respawn_TeleportedToBase"; + distance = 4; + condition = QUOTE(side group _player == east); + statement = QUOTE([ARR_3(_player,side group _player,'ACE_Rallypoint_East_Base')] call FUNC(teleportToRallypoint)); + position[] = {0,0,-1}; + showDisabled = 1; + priority = 1; + }; + }; + }; + + class ACE_Rallypoint_Independent: Flag_AAF_F { + XEH_ENABLED; + + author = "$STR_ACE_Common_ACETeam"; + displayName = "Rallypoint Independent"; + vehicleClass = QGVAR(Rallypoints); + + class ACE_Actions: ACE_Actions { + class ACE_Teleport { + displayName = "$STR_ACE_Respawn_TeleportedToBase"; + distance = 4; + condition = QUOTE(side group _player == independent); + statement = QUOTE([ARR_3(_player,side group _player,'ACE_Rallypoint_Independent_Base')] call FUNC(teleportToRallypoint)); + position[] = {0,0,-1}; + showDisabled = 1; + priority = 1; + }; + }; + }; }; diff --git a/addons/respawn/functions/fnc_moveRallypoint.sqf b/addons/respawn/functions/fnc_moveRallypoint.sqf index dcd4810844..d937363310 100644 --- a/addons/respawn/functions/fnc_moveRallypoint.sqf +++ b/addons/respawn/functions/fnc_moveRallypoint.sqf @@ -26,8 +26,8 @@ _this spawn { _rallypoint = [ objNull, missionNamespace getVariable ["ACE_Rallypoint_West", objNull], - missionNamespace getVariable ["ACE_RallypointExit_East", objNull], - missionNamespace getVariable ["ACE_RallypointExit_Independent", objNull] + missionNamespace getVariable ["ACE_Rallypoint_East", objNull], + missionNamespace getVariable ["ACE_Rallypoint_Independent", objNull] ] select ([west, east, independent] find _side) + 1; if (isNull _rallypoint) exitWith {}; @@ -50,5 +50,5 @@ _this spawn { _marker setMarkerTextLocal format ["%1:%2", [date select 3, 2, 0] call CBA_fnc_FORMATNumber, [date select 4, 2, 0] call CBA_fnc_FORMATNumber]; */ - [localize "STR_ACE_Respawn_Deploy"] call EFUNC(common,displayTextStructured); + [localize "STR_ACE_Respawn_Deployed"] call EFUNC(common,displayTextStructured); }; diff --git a/addons/respawn/functions/fnc_restoreGear.sqf b/addons/respawn/functions/fnc_restoreGear.sqf index 18afba344b..5a00e3425c 100644 --- a/addons/respawn/functions/fnc_restoreGear.sqf +++ b/addons/respawn/functions/fnc_restoreGear.sqf @@ -76,6 +76,8 @@ if (_goggles != "") then { _unit addItemToVest _x; }forEach _vestitems; +private "_flagRemoveDummyBag"; +_flagRemoveDummyBag = false; if(format["%1", _backpack] != "") then { _unit addBackpack _backpack; @@ -87,6 +89,12 @@ if(format["%1", _backpack] != "") then { { _unit addItemToBackpack _x; } forEach _backpackitems; + +} else { + // dummy backpack to ensure mags being loaded + _unit addBackpack "B_Kitbag_Base"; + + _flagRemoveDummyBag = true; }; @@ -138,6 +146,12 @@ if (_handgunweapon != "") then { }; +// remove dummy bagpack +if (_flagRemoveDummyBag) then { + removeBackpack _unit; +}; + + _assignedItems = _assignedItems - [_binocular]; // items diff --git a/addons/respawn/functions/fnc_teleportToRallypoint.sqf b/addons/respawn/functions/fnc_teleportToRallypoint.sqf index 8d898441ee..82a1d68e05 100644 --- a/addons/respawn/functions/fnc_teleportToRallypoint.sqf +++ b/addons/respawn/functions/fnc_teleportToRallypoint.sqf @@ -18,30 +18,19 @@ #include "script_component.hpp" -private ["_unit", "_side", "_toBase", "_rallypoint"]; +private ["_unit", "_side", "_rallypoint", "_toBase"]; _unit = _this select 0; _side = _this select 1; -_toBase = _this select 2; +_rallypoint = _this select 2; // rallypoint names are defined in CfgVehicles.hpp -_rallypoint = ([ - [ - objNull, - missionNamespace getVariable ["ACE_RallypointExit_West", objNull], - missionNamespace getVariable ["ACE_RallypointExit_East", objNull], - missionNamespace getVariable ["ACE_RallypointExit_Independent", objNull] - ], - [ - objNull, - missionNamespace getVariable ["ACE_Rallypoint_West", objNull], - missionNamespace getVariable ["ACE_Rallypoint_East", objNull], - missionNamespace getVariable ["ACE_Rallypoint_Independent", objNull] - ] -] select _toBase) select ([west, east, independent] find _side) + 1; +_toBase = _rallypoint find "_Base" != -1; + +_rallypoint = missionNamespace getVariable [_rallypoint, objNull], if (isNull _rallypoint) exitWith {}; -_unit setPosASL (getPosASL _rallypoint); +_unit setPosASL getPosASL _rallypoint; [[localize "STR_ACE_Respawn_TeleportedToRallypoint", localize "STR_ACE_Respawn_TeleportedToBase"] select _toBase] call EFUNC(common,displayTextStructured); From fb6553a7a7b68968508f6fef5042029cae63f763 Mon Sep 17 00:00:00 2001 From: jaynus Date: Tue, 14 Apr 2015 16:57:01 -0700 Subject: [PATCH 015/305] Only show distance if laser is on. --- addons/laser/RscInGameUI.hpp | 17 +++++++++++++++-- .../functions/fnc_onLaserDesignatorDraw.sqf | 10 ++++++++-- addons/laser/script_component.hpp | 5 ++++- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/addons/laser/RscInGameUI.hpp b/addons/laser/RscInGameUI.hpp index 770c2104b6..d3dfaa5d43 100644 --- a/addons/laser/RscInGameUI.hpp +++ b/addons/laser/RscInGameUI.hpp @@ -40,8 +40,8 @@ class RscInGameUI { w = "4.5 * (0.01875 * SafezoneH)"; h = "1.1 * (0.025 * SafezoneH)"; }; - class CA_Distance: RscText { - idc = 151; + class ACE_Distance: RscText { + idc = 123002; style = 0; sizeEx = "0.038*SafezoneH"; colorText[] = {0.706,0.0745,0.0196,1}; @@ -53,6 +53,19 @@ class RscInGameUI { w = "4 * (0.01875 * SafezoneH)"; h = "1.5 * (0.025 * SafezoneH)"; }; + class CA_Distance: RscText { + idc = 151; + style = 0; + sizeEx = "0.038*SafezoneH"; + colorText[] = {0.706,0.0745,0.0196,1}; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "2456"; + x = 0; + y = 0; + w = 0; + h = 0; + }; class CA_Elev: RscText { idc = 175; style = 1; diff --git a/addons/laser/functions/fnc_onLaserDesignatorDraw.sqf b/addons/laser/functions/fnc_onLaserDesignatorDraw.sqf index a5da33b236..7f8537ab9b 100644 --- a/addons/laser/functions/fnc_onLaserDesignatorDraw.sqf +++ b/addons/laser/functions/fnc_onLaserDesignatorDraw.sqf @@ -1,9 +1,15 @@ -#define DEBUG_MODE_FULL +//#define DEBUG_MODE_FULL #include "script_component.hpp" -TRACE_1("", _this); private["_laserCode"]; _laserCode = ACE_player getVariable[QGVAR(code), ACE_DEFAULT_LASER_CODE]; if(!isNil "_laserCode") then { __LaserDesignatorIGUI_LaserCode ctrlSetText format["Code: %1", [_laserCode, 4, 0, false] call CBA_fnc_formatNumber]; +}; + +if(! (ctrlShown __LaserDesignatorIGUI_LaserOn) ) then { + // TODO: hide distance + __LaserDesignatorIGUI_ACE_Distance ctrlSetText "----"; +} else { + __LaserDesignatorIGUI_ACE_Distance ctrlSetText (ctrlText __LaserDesignatorIGUI_CA_Distance); }; \ No newline at end of file diff --git a/addons/laser/script_component.hpp b/addons/laser/script_component.hpp index 6bd4063f4e..77369ead96 100644 --- a/addons/laser/script_component.hpp +++ b/addons/laser/script_component.hpp @@ -16,4 +16,7 @@ #define __LaserDesignatorIGUI (uiNamespace getVariable ["ACE_RscOptics_LaserDesignator", nil]) -#define __LaserDesignatorIGUI_LaserCode (__LaserDesignatorIGUI displayCtrl 123001) \ No newline at end of file +#define __LaserDesignatorIGUI_LaserCode (__LaserDesignatorIGUI displayCtrl 123001) +#define __LaserDesignatorIGUI_ACE_Distance (__LaserDesignatorIGUI displayCtrl 123002) +#define __LaserDesignatorIGUI_CA_Distance (__LaserDesignatorIGUI displayCtrl 151) +#define __LaserDesignatorIGUI_LaserOn (__LaserDesignatorIGUI displayCtrl 158) \ No newline at end of file From 2940d1f83cc521b9f89835f57f263709f7dfe3b2 Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 15 Apr 2015 03:10:17 +0200 Subject: [PATCH 016/305] base rallypoints create a respawn marker if none is present in the mission --- addons/respawn/CfgEventHandlers.hpp | 14 ++++++++------ addons/respawn/functions/fnc_initRallypoint.sqf | 7 ++++++- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/addons/respawn/CfgEventHandlers.hpp b/addons/respawn/CfgEventHandlers.hpp index 7b00950931..9ff7a2bae8 100644 --- a/addons/respawn/CfgEventHandlers.hpp +++ b/addons/respawn/CfgEventHandlers.hpp @@ -23,37 +23,39 @@ class Extended_Respawn_EventHandlers { class Extended_Init_EventHandlers { class ACE_Rallypoint_West { class ADDON { - init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_nato_CO.paa'; _this call FUNC(initRallypoint)); + init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_nato_CO.paa'; [ARR_2(_this select 0,'')] call FUNC(initRallypoint)); }; }; class ACE_Rallypoint_East { class ADDON { - init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_CSAT_CO.paa'; _this call FUNC(initRallypoint)); + init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_CSAT_CO.paa'; [ARR_2(_this select 0,'')] call FUNC(initRallypoint)); }; }; class ACE_Rallypoint_Independent { class ADDON { - init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_AAF_CO.paa'; _this call FUNC(initRallypoint)); + init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_AAF_CO.paa'; [ARR_2(_this select 0,'')] call FUNC(initRallypoint)); }; }; class ACE_Rallypoint_West_Base { class ADDON { - init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_nato_CO.paa'; _this call FUNC(initRallypoint)); + init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_nato_CO.paa'; [ARR_2(_this select 0,'respawn_west')] call FUNC(initRallypoint)); }; }; class ACE_Rallypoint_East_Base { class ADDON { - init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_CSAT_CO.paa'; _this call FUNC(initRallypoint)); + init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_CSAT_CO.paa'; [ARR_2(_this select 0,'respawn_east')] call FUNC(initRallypoint)); }; }; class ACE_Rallypoint_Independent_Base { class ADDON { - init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_AAF_CO.paa'; _this call FUNC(initRallypoint)); + init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_AAF_CO.paa'; [ARR_2(_this select 0,'respawn_guerrila')] call FUNC(initRallypoint)); }; }; + + //respawn_civilian }; diff --git a/addons/respawn/functions/fnc_initRallypoint.sqf b/addons/respawn/functions/fnc_initRallypoint.sqf index cb4d55146f..c266026e11 100644 --- a/addons/respawn/functions/fnc_initRallypoint.sqf +++ b/addons/respawn/functions/fnc_initRallypoint.sqf @@ -16,9 +16,10 @@ #include "script_component.hpp" -private ["_rallypoint", "_name"]; +private ["_rallypoint", "_respawnMarker", "_name"]; _rallypoint = _this select 0; +_respawnMarker = _this select 1; if (!local _rallypoint) exitWith {}; @@ -31,3 +32,7 @@ if (isNil _name) then { deleteVehicle _rallypoint; diag_log text "[ACE] Respawn: ERROR Multiple Rallypoints of same type."; }; + +if (isServer && {_respawnMarker != ""} && {!(_respawnMarker in allMapMarkers)}) then { + createMarker [_respawnMarker, _rallypoint]; +}; From 91c8c89e87d9ef08efb30d1faf98b6fa542e5a72 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 14 Apr 2015 20:47:07 -0500 Subject: [PATCH 017/305] Only sync A3 VON status over network --- .../nametags/functions/fnc_initIsSpeaking.sqf | 49 ++++++++----------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/addons/nametags/functions/fnc_initIsSpeaking.sqf b/addons/nametags/functions/fnc_initIsSpeaking.sqf index 56c5cfc2f1..95403e0894 100644 --- a/addons/nametags/functions/fnc_initIsSpeaking.sqf +++ b/addons/nametags/functions/fnc_initIsSpeaking.sqf @@ -20,8 +20,8 @@ if (isServer) then { //If someone disconnects while speaking, reset their variable addMissionEventHandler ["HandleDisconnect", { PARAMS_1(_disconnectedPlayer); - if (_disconnectedPlayer getVariable [QGVAR(isSpeaking), false]) then { - _disconnectedPlayer setVariable [QGVAR(isSpeaking), false, true]; + if (_disconnectedPlayer getVariable [QGVAR(isSpeakingInGame), false]) then { + _disconnectedPlayer setVariable [QGVAR(isSpeakingInGame), false, true]; }; }]; }; @@ -31,46 +31,39 @@ if (!hasInterface) exitWith {}; ["playerChanged", { //When player changes, make sure to reset old unit's variable PARAMS_2(_newUnit,_oldUnit); - if (_oldUnit getVariable [QGVAR(isSpeaking), false]) then { - _oldUnit setVariable [QGVAR(isSpeaking), false, true]; + if ((!isNull _oldUnit) && {_oldUnit getVariable [QGVAR(isSpeakingInGame), false]}) then { + _oldUnit setVariable [QGVAR(isSpeakingInGame), false, true]; }; }] call EFUNC(common,addEventHandler); +//PFEH to watch the internal VON icon +//Note: class RscDisplayVoiceChat {idd = 55}; //only present when talking +[{ + _oldSetting = ACE_player getVariable [QGVAR(isSpeakingInGame), false]; + _newSetting = (!(isNull findDisplay 55)); + if (!(_oldSetting isEqualTo _newSetting)) then { + ACE_player setVariable [QGVAR(isSpeakingInGame), _newSetting, true]; + }; +} , 0.1, []] call CBA_fnc_addPerFrameHandler; -//For performance, chose different code paths at mission start based on installed mods (once, instead of checking each time) -_pfEHCode = switch (true) do { + +DFUNC(isSpeaking) = switch (true) do { case (isClass (configFile >> "cfgPatches" >> "acre_api")): { { - _oldSetting = ACE_player getVariable [QGVAR(isSpeaking), false]; - _newSetting = ([ACE_player] call acre_api_fnc_isSpeaking) || ([ACE_player] call acre_api_fnc_isBroadcasting) || {!(isNull findDisplay 55)}; - if (!(_oldSetting isEqualTo _newSetting)) then { - ACE_player setVariable [QGVAR(isSpeaking), _newSetting, true]; - }; + PARAMS_1(_unit); + (_unit getVariable [QGVAR(isSpeakingInGame), false]) || ([_unit] call acre_api_fnc_isSpeaking) || ([ACE_player] call acre_api_fnc_isBroadcasting) }; }; case (isClass (configFile >> "cfgPatches" >> "task_force_radio")): { - //Note: TFAR has a TFAR_fnc_isSpeaking function, but it has a fairly costly `callExtension` - //I think it's much faster to use the internal "tf_isSpeaking" variable - //If we don't care about the built-in VON, we could switch this to a pure event driven system { - _oldSetting = ACE_player getVariable [QGVAR(isSpeaking), false]; - _newSetting = (ACE_player getVariable ["tf_isSpeaking", false]) || {!(isNull findDisplay 55)}; - if (!(_oldSetting isEqualTo _newSetting)) then { - ACE_player setVariable [QGVAR(isSpeaking), _newSetting, true]; - }; + PARAMS_1(_unit); + (_unit getVariable [QGVAR(isSpeakingInGame), false]) || (_unit getVariable ["tf_isSpeaking", false]) }; }; default { - //Note: class RscDisplayVoiceChat {idd = 55}; //only present when talking { - _oldSetting = ACE_player getVariable [QGVAR(isSpeaking), false]; - _newSetting = (!(isNull findDisplay 55)); - if (!(_oldSetting isEqualTo _newSetting)) then { - ACE_player setVariable [QGVAR(isSpeaking), _newSetting, true]; - }; + PARAMS_1(_unit); + (_unit getVariable [QGVAR(isSpeakingInGame), false]) }; }; }; - -//Is 0.05sec precision enough?? -[_pfEHCode, 0.05, []] call CBA_fnc_addPerFrameHandler; From 00b9e2d72ca7584268b78636d49a842ab39ebab5 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 14 Apr 2015 20:49:44 -0500 Subject: [PATCH 018/305] draw3d --- addons/nametags/XEH_postInit.sqf | 1 + addons/nametags/XEH_preInit.sqf | 2 -- addons/nametags/functions/fnc_onDraw3d.sqf | 10 +++++----- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf index ab3cd03391..1df20e45e7 100644 --- a/addons/nametags/XEH_postInit.sqf +++ b/addons/nametags/XEH_postInit.sqf @@ -5,6 +5,7 @@ if (!hasInterface) exitWith {}; +GVAR(ShowNamesTime) = -10; // Add keybinds ["ACE3", QGVAR(showNameTags), localize "STR_ACE_NameTags_ShowNames", diff --git a/addons/nametags/XEH_preInit.sqf b/addons/nametags/XEH_preInit.sqf index 80c06cff1f..9fae94fd08 100644 --- a/addons/nametags/XEH_preInit.sqf +++ b/addons/nametags/XEH_preInit.sqf @@ -12,6 +12,4 @@ PREP(onDraw3d); PREP(onMouseZChanged); PREP(setText); -GVAR(ShowNamesTime) = -10; - ADDON = true; diff --git a/addons/nametags/functions/fnc_onDraw3d.sqf b/addons/nametags/functions/fnc_onDraw3d.sqf index 8aa503d377..d35cef0d67 100644 --- a/addons/nametags/functions/fnc_onDraw3d.sqf +++ b/addons/nametags/functions/fnc_onDraw3d.sqf @@ -50,9 +50,9 @@ if ((GVAR(showPlayerNames) in [2,4]) && {_onKeyPressAlphaMax > 0}) then { _alpha = _alpha min _onKeyPressAlphaMax; _icon = ICON_NONE; if (GVAR(showSoundWaves) == 2) then { //icon will be drawn below, so only show name here - _icon = if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {ICON_NAME} else {_defaultIcon}; + _icon = if (([_target] call FUNC(isSpeaking)) && {(vehicle _target) == _target}) then {ICON_NAME} else {_defaultIcon}; } else { - _icon = if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target} && {GVAR(showSoundWaves) > 0}) then {ICON_NAME_SPEAK} else {_defaultIcon}; + _icon = if (([_target] call FUNC(isSpeaking)) && {(vehicle _target) == _target} && {GVAR(showSoundWaves) > 0}) then {ICON_NAME_SPEAK} else {_defaultIcon}; }; [_player, _target, _alpha, _distance * 0.026, _icon] call FUNC(drawNameTagIcon); @@ -77,10 +77,10 @@ if (((GVAR(showPlayerNames) in [1,3]) && {_onKeyPressAlphaMax > 0}) || {GVAR(sho _icon = ICON_NONE; if ((GVAR(showPlayerNames) in [1,3]) && {_onKeyPressAlphaMax > 0}) then { - if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target} && {GVAR(showSoundWaves) > 0}) then {_icon = ICON_NAME_SPEAK;} else {_icon = _defaultIcon}; + if (([_target] call FUNC(isSpeaking)) && {(vehicle _target) == _target} && {GVAR(showSoundWaves) > 0}) then {_icon = ICON_NAME_SPEAK;} else {_icon = _defaultIcon}; } else { //showSoundWaves must be 2, only draw speak icon - if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {_icon = ICON_SPEAK;}; + if (([_target] call FUNC(isSpeaking)) && {(vehicle _target) == _target}) then {_icon = ICON_SPEAK;}; }; if ((_icon != ICON_NONE) && @@ -96,7 +96,7 @@ if (((GVAR(showPlayerNames) in [1,3]) && {_onKeyPressAlphaMax > 0}) || {GVAR(sho _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min (1 - 0.15 * (_projDist * 5 - _distance - 3)) min 1) * GVAR(PlayerNamesMaxAlpha); - if ((GVAR(showSoundWaves) == 2) && {(_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}}) then { + if ((GVAR(showSoundWaves) == 2) && {([_target] call FUNC(isSpeaking)) && {(vehicle _target) == _target}}) then { _alpha = 1; } else { _alpha = _alpha min _onKeyPressAlphaMax; From 1f51a3fc8ac5fd27275621244c300dd997d318b5 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 14 Apr 2015 23:10:05 -0500 Subject: [PATCH 019/305] Never use this func anywhere --- addons/nametags/XEH_preInit.sqf | 1 - .../nametags/functions/fnc_onMouseZChanged.sqf | 18 ------------------ 2 files changed, 19 deletions(-) delete mode 100644 addons/nametags/functions/fnc_onMouseZChanged.sqf diff --git a/addons/nametags/XEH_preInit.sqf b/addons/nametags/XEH_preInit.sqf index 9fae94fd08..f3c9a97cba 100644 --- a/addons/nametags/XEH_preInit.sqf +++ b/addons/nametags/XEH_preInit.sqf @@ -9,7 +9,6 @@ PREP(getVehicleData); PREP(initIsSpeaking); PREP(moduleNameTags); PREP(onDraw3d); -PREP(onMouseZChanged); PREP(setText); ADDON = true; diff --git a/addons/nametags/functions/fnc_onMouseZChanged.sqf b/addons/nametags/functions/fnc_onMouseZChanged.sqf deleted file mode 100644 index 8892f201bc..0000000000 --- a/addons/nametags/functions/fnc_onMouseZChanged.sqf +++ /dev/null @@ -1,18 +0,0 @@ -/* - Author: aeroson - - Description: - Callback for mouse wheel change - - Parameters: - None - - Returns: - Nothing -*/ - -#include "script_component.hpp" - -if(call FUNC(canShow)) then { - call FUNC(doShow); -}; From 6c4e50a98de7a6186ef2d82c5ac0aa07b9e71359 Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 15 Apr 2015 08:31:40 +0200 Subject: [PATCH 020/305] localized names for rallypoints, auto assign slot of group leader at the start of the mission as JIP persistant rallypoint mover slot --- addons/respawn/CfgEventHandlers.hpp | 9 ++++ addons/respawn/CfgVehicles.hpp | 12 ++--- addons/respawn/XEH_preInit.sqf | 1 + .../functions/fnc_handleInitPostServer.sqf | 54 +++++++++++++++++++ .../respawn/functions/fnc_handleRespawn.sqf | 5 ++ addons/respawn/stringtable.xml | 24 +++++++++ 6 files changed, 99 insertions(+), 6 deletions(-) create mode 100644 addons/respawn/functions/fnc_handleInitPostServer.sqf diff --git a/addons/respawn/CfgEventHandlers.hpp b/addons/respawn/CfgEventHandlers.hpp index 9ff7a2bae8..6d7356a607 100644 --- a/addons/respawn/CfgEventHandlers.hpp +++ b/addons/respawn/CfgEventHandlers.hpp @@ -59,3 +59,12 @@ class Extended_Init_EventHandlers { //respawn_civilian }; + +// auto assign rallypoint leader +class Extended_InitPost_EventHandlers { + class CAManBase { + class ADDON { + init = QUOTE(_this call FUNC(handleInitPostServer)); + }; + }; +}; diff --git a/addons/respawn/CfgVehicles.hpp b/addons/respawn/CfgVehicles.hpp index c8ca4f9216..28e33c6b3e 100644 --- a/addons/respawn/CfgVehicles.hpp +++ b/addons/respawn/CfgVehicles.hpp @@ -91,7 +91,7 @@ class CfgVehicles { XEH_ENABLED; author = "$STR_ACE_Common_ACETeam"; - displayName = "Rallypoint West Base"; + displayName = "$STR_ACE_Respawn_RallypointWestBase"; vehicleClass = QGVAR(Rallypoints); class ACE_Actions: ACE_Actions { @@ -111,7 +111,7 @@ class CfgVehicles { XEH_ENABLED; author = "$STR_ACE_Common_ACETeam"; - displayName = "Rallypoint East Base"; + displayName = "$STR_ACE_Respawn_RallypointEastBase"; vehicleClass = QGVAR(Rallypoints); class ACE_Actions: ACE_Actions { @@ -131,7 +131,7 @@ class CfgVehicles { XEH_ENABLED; author = "$STR_ACE_Common_ACETeam"; - displayName = "Rallypoint Independent Base"; + displayName = "$STR_ACE_Respawn_RallypointIndependentBase"; vehicleClass = QGVAR(Rallypoints); class ACE_Actions: ACE_Actions { @@ -152,7 +152,7 @@ class CfgVehicles { XEH_ENABLED; author = "$STR_ACE_Common_ACETeam"; - displayName = "Rallypoint West"; + displayName = "STR_ACE_Respawn_RallypointWest"; vehicleClass = QGVAR(Rallypoints); class ACE_Actions: ACE_Actions { @@ -172,7 +172,7 @@ class CfgVehicles { XEH_ENABLED; author = "$STR_ACE_Common_ACETeam"; - displayName = "Rallypoint East"; + displayName = "STR_ACE_Respawn_RallypointEast"; vehicleClass = QGVAR(Rallypoints); class ACE_Actions: ACE_Actions { @@ -192,7 +192,7 @@ class CfgVehicles { XEH_ENABLED; author = "$STR_ACE_Common_ACETeam"; - displayName = "Rallypoint Independent"; + displayName = "STR_ACE_Respawn_RallypointIndependent"; vehicleClass = QGVAR(Rallypoints); class ACE_Actions: ACE_Actions { diff --git a/addons/respawn/XEH_preInit.sqf b/addons/respawn/XEH_preInit.sqf index f57e1f3714..8b3f309126 100644 --- a/addons/respawn/XEH_preInit.sqf +++ b/addons/respawn/XEH_preInit.sqf @@ -5,6 +5,7 @@ ADDON = false; PREP(canMoveRallypoint); PREP(handleKilled); PREP(handleRespawn); +PREP(handleInitPostServer); PREP(initRallypoint); PREP(module); PREP(moduleFriendlyFire); diff --git a/addons/respawn/functions/fnc_handleInitPostServer.sqf b/addons/respawn/functions/fnc_handleInitPostServer.sqf new file mode 100644 index 0000000000..c83354b24e --- /dev/null +++ b/addons/respawn/functions/fnc_handleInitPostServer.sqf @@ -0,0 +1,54 @@ +// by commy2 +// execute on server only! +#include "script_component.hpp" + +private "_unit"; + +_unit = _this select 0; + +private ["_group0", "_rallypoint"]; + +_group0 = group _unit; // _group is a reserved veriable and shouldn't be used + +_rallypoint = [ + objNull, + missionNamespace getVariable ["ACE_Rallypoint_West", objNull], + missionNamespace getVariable ["ACE_Rallypoint_East", objNull], + missionNamespace getVariable ["ACE_Rallypoint_Independent", objNull] +] select ([west, east, independent] find side _group0) + 1; + +// exit if no moveable rallypoint is placed for that side +if (isNull _rallypoint) exitWith {}; + +// find leader +private "_leaderVarName"; +_leaderVarName = _group0 getVariable [QGVAR(leaderVarName), ""]; + +// exit if group already has a playable slot assigned as rallypoint leader +if (_leaderVarName != "") exitWith { + // assign JIP unit as rallypoint leader + if (str _unit == _leaderVarName) then { + _unit setVariable ["ACE_canMoveRallypoint", true, true]; + }; +}; + +// treat group leader +_unit = leader _group0; + +_leaderVarName = vehicleVarName _unit; + +if (_leaderVarName == "") then { + private "_leaderID"; + _leaderID = GETGVAR(NextLeaderID,0); + + _leaderVarName = format [QGVAR(Rallypoint_Leader_%1), _leaderID]; + + _unit setVehicleVarName _leaderVarName; + + GVAR(NextLeaderID) = _leaderID + 1; +}; + +// prevent group from getting multiple leaders; use this to assign rallypoint moving ability on JIP +_group0 setVariable [QGVAR(leaderVarName), _leaderVarName]; + +_unit setVariable ["ACE_canMoveRallypoint", true, true]; diff --git a/addons/respawn/functions/fnc_handleRespawn.sqf b/addons/respawn/functions/fnc_handleRespawn.sqf index a9fe3293ac..33a0ec09e5 100644 --- a/addons/respawn/functions/fnc_handleRespawn.sqf +++ b/addons/respawn/functions/fnc_handleRespawn.sqf @@ -25,3 +25,8 @@ _respawnedUnit = _this select 0; if (GVAR(SavePreDeathGear)) then { [_respawnedUnit, GVAR(unitGear)] call FUNC(restoreGear); }; + +// fix for setVariable public being lost on respawn for machines that JIP after the command was broadcasted +if (_respawnedUnit getVariable ["ACE_canMoveRallypoint", false]) then { + _respawnedUnit setVariable ["ACE_canMoveRallypoint", true, true]; +}; diff --git a/addons/respawn/stringtable.xml b/addons/respawn/stringtable.xml index 2aa4360275..958bc9b56f 100644 --- a/addons/respawn/stringtable.xml +++ b/addons/respawn/stringtable.xml @@ -37,5 +37,29 @@ Przeteleportowano do punktu zbiórki Odteleportován na rallypoint + + Rallypoint West (Base) + Sammelpunkt West (Basis) + + + Rallypoint East (Base) + Sammelpunkt Ost (Basis) + + + Rallypoint Independent (Base) + Sammelpunkt Widerstand (Basis) + + + Rallypoint West + Sammelpunkt West + + + Rallypoint East + Sammelpunkt Ost + + + Rallypoint Independent + Sammelpunkt Widerstand + From 09289fbf48098ffe23ba0bde1065472d2ce814cc Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 15 Apr 2015 08:34:30 +0200 Subject: [PATCH 021/305] only on server though --- addons/respawn/CfgEventHandlers.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/respawn/CfgEventHandlers.hpp b/addons/respawn/CfgEventHandlers.hpp index 6d7356a607..58aa8995ee 100644 --- a/addons/respawn/CfgEventHandlers.hpp +++ b/addons/respawn/CfgEventHandlers.hpp @@ -64,7 +64,7 @@ class Extended_Init_EventHandlers { class Extended_InitPost_EventHandlers { class CAManBase { class ADDON { - init = QUOTE(_this call FUNC(handleInitPostServer)); + serverInit = QUOTE(_this call FUNC(handleInitPostServer)); }; }; }; From af3fdf9b91c04a3164fc5b60f11f8a0bf396c4bf Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 15 Apr 2015 10:28:09 +0200 Subject: [PATCH 022/305] Update stringtable.xml Italian translation --- addons/medical/stringtable.xml | 148 +++++++++++++++++++++++++++++++-- 1 file changed, 143 insertions(+), 5 deletions(-) diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 65b663708b..a2db83b09b 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -10,6 +10,7 @@ Wstrzyknij atropinę Injecter de l'atropine Ввести атропин + Inietta atropina Inject Epinephrine @@ -21,7 +22,7 @@ Ввести адреналин Adrenalin Injetar Epinefrina - Inietta Epinefrina + Inietta epinefrina Inject Morphine @@ -45,7 +46,7 @@ Transfusion Infúzió Transfundir Sangue - Effettua Trasfusione + Effettua trasfusione di sangue Transfuse Plasma @@ -55,6 +56,7 @@ Przetocz osocze Transfuser du Plasma Перелить плазму + Effettua trasfusione di plasma Transfuse Saline @@ -64,6 +66,7 @@ Przetocz solankę Transfuser de la Saline Перелить физраствор + Effettua trasfusione di soluzione salina Apply Tourniquet @@ -72,6 +75,7 @@ Aplikovat škrtidlo Załóż stazę Appliquer un garrot + Applica laccio emostatico Bandage @@ -189,6 +193,7 @@ Wstrzykiwanie atropiny ... Injection d'Atropine ... Введение атропина... + Inietto l'atropina ... Transfusing Blood ... @@ -200,7 +205,7 @@ Transfusion Sanguine ... Infúzió... Transfundindo Sangue ... - Effettuo la trasfusione ... + Effettuo la trasfusione di sangue ... Transfusing Saline ... @@ -210,6 +215,7 @@ Przetaczanie solanki ... Transfusion de saline ... Переливание физраствора... + Effettuo la rasfusione di salina Transfusing Plasma ... @@ -219,6 +225,7 @@ Przetaczanie osocza ... Transfusion de Plasma ... Переливание плазмы... + Effettu la trasfusione di plasma ... Bandaging ... @@ -240,6 +247,7 @@ Zakładanie stazy ... Mise en place du Garrot ... Наложение жгута... + Sto applicando il laccio emostatico ... Medical @@ -260,6 +268,7 @@ Obinadlo Bandaż jałowy Bandage rapide + Bendaggio rapido Packing Bandage @@ -267,6 +276,7 @@ Vendaje compresivo Компресионный пакет Bandaż uciskowy + Bendaggio compressivo Elastic Bandage @@ -276,6 +286,7 @@ Elastické obinadlo Bandaż elastyczny Pansement élastique + Bendaggio elastico QuikClot @@ -285,6 +296,7 @@ Opatrunek QuikClot QuikClot Hémostatique + QuikClot(polvere emostatica) Check Pulse @@ -294,6 +306,7 @@ Zkontrolovat pulz Sprawdź tętno Vérifier les pulsations + Controlla il polso Check Blood Pressure @@ -303,6 +316,7 @@ Zkontrolovat krevní tlak Sprawdź ciśnienie krwi Vérification de la Tension + Controlla pressionsa sanguigna Triage Card @@ -312,6 +326,7 @@ Karta segregacyjna Karta Triage Carte de Triage + Triage Card Tourniquet @@ -321,6 +336,7 @@ Škrtidlo Staza Garrot + Laccio emostatico Remove Tourniquet @@ -330,6 +346,7 @@ Sundat škrtidlo Zdejmij stazę Enlever le Garrot + Rimuovi laccio emostatico Give Blood IV (1000ml) @@ -339,6 +356,7 @@ Podaj krew IV (1000ml) Administrer du Sang en IV (1000ml) Podat krev. transfúzi (1000ml) + Effettua trasfusione sangue IV (1000ml) Give Blood IV (500ml) @@ -348,6 +366,7 @@ Podaj krew IV (500ml) Administrer du Sang en IV (500ml) Podat krev. transfúzi (500ml) + Effettua trasfusione sangue IV (500ml) Give Blood IV (250ml) @@ -357,6 +376,7 @@ Podaj krew IV (250ml) Administrer du Sang en IV (250ml) Podat krev. transfúzi (250ml) + Effettua trasfusione sangue IV (250ml) Give Plasma IV (1000ml) @@ -366,6 +386,7 @@ Podaj osocze IV (1000ml) Administrer du Plasma en IV (1000ml) Podat plazmu (1000ml) + Effettua trasfusione plasma IV (1000ml) Give Plasma IV (500ml) @@ -375,6 +396,7 @@ Podaj osocze IV (500ml) Administrer du Plasma en IV (500ml) Podat plazmu (500ml) + Effettua trasfusione plasma IV (500ml) Give Plasma IV (250ml) @@ -384,6 +406,7 @@ Podaj osocze IV (250ml) Administrer du Plasma en IV (250ml) Podat plazmu (250ml) + Effettua trasfusione plasma IV (250ml) Give Saline IV (1000ml) @@ -393,6 +416,7 @@ Podaj solankę IV (1000ml) Administrer de la Solution Saline en IV (1000ml) Podaz fyz. roztok (1000ml) + Effettua trasfusione salina IV (1000ml) Give Saline IV (500ml) @@ -402,6 +426,7 @@ Podaj solankę IV (500ml) Administrer de la Solution Saline en IV (500ml) Podaz fyz. roztok (500ml) + Effettua trasfusione salina IV (500ml) Give Saline IV (250ml) @@ -411,6 +436,7 @@ Podaj solankę IV (250ml) Administrer de la Solution Saline en IV (250ml) Podaz fyz. roztok (250ml) + Effettua trasfusione salina IV (250ml) Minor @@ -420,6 +446,7 @@ Normalny Mineur Minimální + Minore Delayed @@ -429,6 +456,7 @@ Différé Verzögert Odložitelný + Differito Immediate @@ -438,6 +466,7 @@ Urgence Immédiate Sofort Okamžiý + Immediata Deceased @@ -447,6 +476,7 @@ Décédé Verstorben Mrtvý + Deceduto None @@ -456,6 +486,7 @@ Aucun Keine Nic + Nessuna Normal breathing @@ -465,6 +496,7 @@ Normalny oddech Normale Atmung Dýchá normálně + Respiro normale No breathing @@ -474,6 +506,7 @@ Aucune Respiration Brak oddechu Nedýchá + Mancanza di respiro Difficult breathing @@ -483,6 +516,7 @@ Trudności z oddychaniem Schwere Atmung Dýchá s obtížemi + Difficoltà a respirare Almost no breathing @@ -492,6 +526,7 @@ Respiration Faible Prawie brak oddechu Skoro nedýchá + Respira a fatica Bleeding @@ -501,6 +536,7 @@ Saignement Krwawienie zewnętrzne Krvácí + Sanguinando In Pain @@ -510,6 +546,7 @@ Ressent de la Douleur W bólu V bolestech + Con dolore Lost a lot of Blood @@ -519,6 +556,7 @@ A Perdu Bcp de Sang Stracił dużo krwi Ztratil hodně krve + Ha perso parecchio sangue Tourniquet [CAT] @@ -528,6 +566,7 @@ Garrot [CAT] Staza [typ. CAT] Škrtidlo [CAT] + Laccio emostatico [CAT] Receiving IV [%1ml] @@ -537,6 +576,7 @@ Otrzymywanie IV [%1ml] Transfusion en IV [%1ml] Přijímání transfúze [%1ml] + Ricevendo IV [%1ml] Bandage (Basic) @@ -546,6 +586,7 @@ Bandage (Standard) Bandaż (jałowy) Bandáž (standartní) + Bendaggio (base) Used to cover a wound @@ -554,6 +595,7 @@ Utilisé Pour Couvrir Une Blessure Używany w celu przykrycia i ochrony miejsca zranienia Verwendet, um Wunden abzudecken + Usato per coprire una ferita A dressing, that is a particular material used to cover a wound, which is applied over the wound once bleeding has been stemmed. @@ -562,6 +604,7 @@ Un apósito, material específico utilizado para cubrir una herida, se aplica sobre la herida una vez ha dejado de sangrar. Bandage fait d'un matériel spécial utilisé pour couvrir une blessure, qui peut etre appliqué dès que le saignement a été stoppé. Opatrunek materiałowy, używany do przykrywania ran, zakładany na ranę po zatamowaniu krwawienia. + Una benda apposta, utilizzata per coprire una ferita, la quale è applicato sopra di essa una volta fermata l'emorragia. Packing Bandage @@ -570,6 +613,7 @@ Vendaje compresivo Bandage Mèche Bandaż (uciskowy) + Bendaggio compressivo Used to pack medium to large wounds and stem the bleeding @@ -578,6 +622,7 @@ Se utiliza para vendar heridas medianas o grandes y detener el sangrado Utilisé pour remplir la cavité créée dans une blessure de taille moyenne à grande. Używany w celu opatrywania średnich i dużych ran oraz tamowania krwawienia. + Usato su medie o larghe ferite per fermare emorragie. A bandage used to pack the wound to stem bleeding and facilitate wound healing. Packing a wound is an option in large polytrauma injuries. @@ -585,6 +630,7 @@ Se utiliza para detener la hemorragia de una herida y favorecer su cicatrización. Se usa en grandes lesiones o politraumatismos. Bandage pouvant être inseré dans les blessures pour éponger le saignement et faciliter la guerrison. Ce bandage est optionnel pour soigner les lésions polytraumatique. Opatrunek stosowany w celu zatrzymania krwawienia i osłony większych ran. + Un bendaggio usato per bendare ferite con emorragie e facilitare la guarigione. Bendare una ferita è una opzione su ferite di vario tipo. Bandage (Elastic) @@ -594,6 +640,7 @@ Bandage (Élastique) Bandaż (elastyczny) Bandáž (elastická) + Benda (Elastica) Bandage kit, Elastic @@ -602,6 +649,7 @@ Kit de vendaje (Elástico) Bandage Compressif Élastique Zestaw bandaży elastycznych. + Kit bendaggio, elastico Allows an even compression and extra support to the injured area. @@ -610,6 +658,7 @@ Ce bandage peut être utilisé pour compresser la plaie afin de ralentir le saignement et assurer la tenue du bandage lors de mouvement. Elastyczna opaska podtrzymująca opatrunek oraz usztywniająca okolice stawów. Brinda una compresión uniforme y ofrece soporte extra a una zona lesionada + Permette di comprimevere e aiutare la zone ferita. Tourniquet (CAT) @@ -619,6 +668,7 @@ Garrot (CAT) Staza (typ. CAT) Škrtidlo (CAT) + Laccio emostatico (CAT) Slows down blood loss when bleeding @@ -627,6 +677,7 @@ Ralentit le saignement Zmniejsza ubytek krwi z kończyn w przypadku krwawienia. Verringert den Blutverlust während einer Blutung + Rallenta la perdita di sangue in caso di sanguinamento A constricting device used to compress venous and arterial circulation in effect inhibiting or slowing blood flow and therefore decreasing loss of blood. @@ -635,6 +686,7 @@ Un dispositif permettant de compresser les artères et veines afin de réduire la perte de sang. Opaska uciskowa CAT służy do tamowanie krwotoków w sytuacji zranienia kończyn z masywnym krwawieniem tętniczym lub żylnym. Ein Gerät, das Druck auf Venen und Arterien ausübt und so den Blutfluss verringert. + Un laccio emostatico usato per comprimere le vene e arterie per bloccare o rallentare la circolazione del sangue e quindi rallentare dissanguamenti. Morphine autoinjector @@ -644,6 +696,7 @@ Auto-injecteur de Morphine Autostrzykawka z morfiną Autoinjektor morfin + Autoiniettore di morfina Used to combat moderate to severe pain experiences @@ -652,6 +705,7 @@ Usado para combatir los estados dolorosos de moderados a severos Utilisé pour réduire les douleurs modérées à sévères. Morfina. Ma silne działanie przeciwbólowe. + Usato per combattere il dolore. An analgesic used to combat moderate to severe pain experiences. @@ -660,6 +714,7 @@ Un Analgésique puissant servant à réduire les douleurs modérées à sévères. Organiczny związek chemiczny z grupy alkaloidów. Ma silne działanie przeciwbólowe. Ein Schmerzmittel um mäßige bis starke Schmerzen zu behandeln + Un analgesico usato per combattere il dolore. Atropin autoinjector @@ -669,6 +724,7 @@ Autostrzykawka AtroPen Atropin Autoinjektor Autoinjektor atropin + Autoiniettore di Atropina Used in NBC scenarios @@ -677,6 +733,7 @@ Utilisé en cas d'attaque CBRN Atropina. Stosowana jako lek rozkurczowy i środek rozszerzający źrenice. Verwendet bei ABC Kontamination + Usato in situazioni con gas nervino. A drug used by the Military in NBC scenarios. @@ -685,6 +742,7 @@ Médicament utilisé par l'armée en cas d'attaque CBRN Atropina. Stosowana jako lek rozkurczowy i środek rozszerzający źrenice. Środek stosowany w przypadku zagrożeń NBC. Ein Medikament, das vom Militär bei ABC Kontamination verwendet wird. + E' un farmaco usato in ambito militare in scenari con presenza di gas nervino. Epinephrine autoinjector @@ -694,6 +752,7 @@ Autostrzykawka EpiPen Epiniphrin Autoinjektor Autoinjektor adrenalin + Autoiniettore di Epinefrina Increase heart rate and counter effects given by allergic reactions @@ -702,6 +761,7 @@ Augmente la fréquence cadiaque et annule les effets d'une réaction anaphylactique Adrenalina. Zwiększa puls i przeciwdziała efektom wywołanym przez reakcje alergiczne Steigert die Herzfrequenz, um den Effekt von allergischen Reaktionen zu bekämpfen + Aumenta il battito cardiaco e combatte gli effetti di reazioni allergiche. A drug that works on a sympathetic response to dilate the bronchi, increase heart rate and counter such effects given by allergic reactions (anaphylaxis). Used in sudden cardiac arrest scenarios with decreasing positive outcomes. @@ -709,6 +769,7 @@ Medicamento que dilata los bronquios, aumenta la frecuencia cardiaca y contrarresta los efectos de las reacciones alérgicas (anafilaxis). Se utiliza en caso de paros cardiacos repentinos. Medicament qui fonctionne sur le système nerveux sympathique créant une dilatation des bronches, augmente la fréquence cardiaque et annule les effets d'une réaction allergique (anaphylaxie). Utilisé lors d'arrêt cardio-respiratoire pour augmenter les chances de retrouver un pouls. EpiPen z adrenaliną ma działanie sympatykomimetyczne, tj. pobudza receptory alfa- i beta-adrenergiczne. Pobudzenie układu współczulnego prowadzi do zwiększenia częstotliwości pracy serca, zwiększenia pojemności wyrzutowej serca i przyśpieszenia krążenia wieńcowego. Pobudzenie oskrzelowych receptorów beta-adrenergicznych wywołuje rozkurcz mięśni gładkich oskrzeli, co w efekcie zmniejsza towarzyszące oddychaniu świsty i duszności. + Una sostanza che permette di dilatare i bronchi, aumentare il battito cardiaco e combattere effetti di reazioni allergiche. Usato anche in casi di arresto cardiaco. Plasma IV (1000ml) @@ -717,6 +778,7 @@ Plasma Sanguin IV (1000ml) Osocze IV (1000ml) Plasma IV (1000ml) + Plasma IV (1000ml) A volume-expanding blood supplement. @@ -724,6 +786,7 @@ Suplemento para expandir el volumen sanguíneo. Supplément visant à remplacer les volumes sanguin Składnik krwi, używany do zwiększenia jej objętości. + Aiuta ad aumentare il volume sanguigno. A volume-expanding blood supplement. @@ -731,6 +794,7 @@ Suplemento para expandir el volumen sanguíneo. Supplément visant à remplacer le volume sanguin et remplace les plaquettes. Składnik krwi, używany do zwiększenia jej objętości. + Aiuta ad aumentare il volume sanguigno. Plasma IV (500ml) @@ -739,6 +803,7 @@ Plasma Sanguin IV (500ml) Osocze IV (500ml) Plasma IV (500ml) + Plasma IV (500ml) Plasma IV (250ml) @@ -747,6 +812,7 @@ Plasma Sanguin (250ml) Osocze IV (250ml) Plasma IV (250ml) + Plasma IV (250ml) Blood IV (1000ml) @@ -755,6 +821,7 @@ Cullot Sanguin IV (1000ml) Krew IV (1000ml) Blut IV (1000ml) + Sangue IV (1000ml) Blood IV, for restoring a patients blood (keep cold) @@ -762,12 +829,14 @@ Sangre intravenosa, para restarurar el volumen sanguíneo (mantener frío) Cullot Sanguin O- ,utiliser seulement lors de perte sanguine majeur afin de remplacer le volume sanguin perdu. Habituelment utiliser lors du transport ou dans un etablisement de soin. Krew IV, używana do uzupełnienia krwi u pacjenta, trzymać w warunkach chłodniczych + Sangue usato per ripristinare pazienti in cui si è verificata una perdita di sangue (conservare al fresco) O Negative infusion blood used in strict and rare events to replenish blood supply usually conducted in the transport phase of medical care. Кровь I группы, резус-отрицательная, применяется по жизненным показаниям для возмещения объема потерянной крови на догоспитальном этапе оказания медицинской помощи. Krew 0 Rh-, używana w rzadkich i szczególnych przypadkach do uzupełnienia krwi u pacjenta, zazwyczaj w trakcie fazie transportu rannej osoby do szpitala. Utilice sólo durante gran pérdida de sangre para reemplazar el volumen de sangre perdida. Uso habitual durante el transporte de heridos. + Sangue 0 negativo usato per ripristinare sangue in pazienti in cui si è verificata una perdita di sangue. Blood IV (500ml) @@ -776,6 +845,7 @@ Cullot Sanguin IV (500ml) Krew IV (500ml) Blut IV (500ml) + Sangue IV (500ml) Blood IV (250ml) @@ -784,6 +854,7 @@ Cullot Sanguin IV (250ml) Krew IV (250ml) Blut IV (250ml) + Samgue IV (250ml) Saline IV (1000ml) @@ -792,6 +863,7 @@ Solution Saline 0.9% IV (1000ml) Solanka 0,9% IV (1000ml) Kochsalzlösung (1000ml) + Soluzione salina IV (1000ml) Saline IV, for restoring a patients blood @@ -799,6 +871,7 @@ Solución salina intravenosa, para restaurar el volumen sanguíneo Solution Saline 0.9% IV, pour rétablir temporairement la tension artérielle Solanka 0,9%, podawana dożylnie (IV), używana w celu uzupełnienia krwi u pacjenta + Soluzione salina, usata per ripristinare sangue nei pazienti. A medical volume-replenishing agent introduced into the blood system through an IV infusion. @@ -806,6 +879,7 @@ Suero fisiológico inoculado al torrente sanguíneo de forma intravenosa. Un remplacement temporaire pour rétablir la tension artérielle lors de perte sanguine, administré par intra-veineuse Używany w medycynie w formie płynu infuzyjnego jako środek nawadniający i uzupełniający niedobór elektrolitów, podawany dożylnie (IV). + Una soluzione medica per ripristinare il volume del sangue introdotta tramite trasfusione IV. Saline IV (500ml) @@ -814,6 +888,7 @@ Solution Saline 0.9% IV (500ml) Solanka 0,9% IV (500ml) Kochsalzlösung (500ml) + Soluzione salina IV (500ml) Saline IV (250ml) @@ -822,6 +897,7 @@ Solution Saline 0.9% IV (250ml) Solanka 0,9% IV (250ml) Kochsalzlösung (250ml) + Soluzione salina IV (250ml) Basic Field Dressing (QuikClot) @@ -830,6 +906,7 @@ Bandage Regulier (Coagulant) Podstawowy pakiet opatrunkowy (QuikClot) Verbandpäckchen(Gerinnungsmittel) + Bendaggio emostatico (QuikClot) QuikClot bandage @@ -838,6 +915,7 @@ Bandage coagulant Hemostatyczny pakiet QuikClot. Podstawowy opatrunek stosowany na rany. Bandage mit Gerinnungsmittel + Bendaggio emostatico (QuikClot) Hemostatic bandage with coagulant that stops bleeding. @@ -846,6 +924,7 @@ Proszkowy opatrunek adsorpcyjny przeznaczony do tamowania zagrażających życiu krwawień średniej i dużej intensywności. Vendaje hemostático con coagulante que detiene el sangrado. Verband mit Gerinnungsmittel, um starke Blutung zu behandeln. + Bendaggio emostatico con coagulante che permette di arrestare perdite di sangue Personal Aid Kit @@ -854,6 +933,7 @@ Équipement de support vital Apteczka osobista Persönliches Verbandpäckchen + Pronto soccorso personale Includes various treatment kit needed for stitching or advanced treatment @@ -862,6 +942,7 @@ Inclue du matériel medical pour les traitements avancés, tel les points de suture. Zestaw środków medycznych do opatrywania ran i dodatkowego leczenia po-urazowego Beinhaltet medizinisches Material für fortgeschrittene Behandlung und zum Nähen. + Include vario materiale medico per trattamenti avanzati. @@ -869,6 +950,7 @@ W znacznym stopniu poprawia stan pacjenta + Surgical Kit @@ -877,6 +959,7 @@ Kit quirúrgico Zestaw do szycia ran Operationsset + Kit chirurgico Surgical Kit for in field advanced medical treatment @@ -885,6 +968,7 @@ Kit quirúrgico para el tratamiento avanzado en el campo de batalla Zestaw pozwalający na zszywanie ran w polu Operationsset für fortgeschrittene medizinische Feldversorgung + Kit chirurgico per trattamenti avanzati sul campo. Surgical Kit for in field advanced medical treatment @@ -893,6 +977,7 @@ Zestaw pozwalający na zszywanie ran w polu Operationsset für fortgeschrittene medizinische Feldversorgung Trousse chirurgicale pour le traitement sur le terrain + Kit chirurgico per trattamenti avanzati sul campo. Bodybag @@ -901,6 +986,7 @@ Bolsa para cadáveres Worek na zwłoki Leichensack + Sacca per corpi A bodybag for dead bodies @@ -909,6 +995,7 @@ Una bolsa para cadáveres Worek do pakowania zwłok Ein Leichensack für Tote + Una sacca nera per trasportare cadaveri. A bodybag for dead bodies @@ -917,6 +1004,7 @@ Una bolsa para cadáveres Worek do pakowania zwłok Ein Leichensack für Tote + Una sacca nera per trasportare cadaveri. Blood Pressure @@ -925,6 +1013,7 @@ Presión arterial Ciśnienie krwi Blutdruck + Pressione sanguigna Checking Blood Pressure.. @@ -933,6 +1022,7 @@ Comprobando presión arterial... Sprawdzanie ciśnienia krwi... Blutdruck kontrollieren... + Controllando la pressione sanguigna.. You checked %1 @@ -941,6 +1031,7 @@ Examinando a %1 Zbadałeś %1 Kontrolliert %1 + Hai diagnosticato %1 You find a blood pressure of %2/%3 @@ -948,6 +1039,7 @@ Артериальное давление %2/%3 La Presión Arterial es %2/%3 Wyczuwasz ciśnienie krwi o wartości %2/%3 + Hai riscontrato una pressione di %2/%3 You find a low blood pressure @@ -956,6 +1048,7 @@ La presión arterial es baja Wyczuwasz niskie ciśnienie krwi Blutdruck ist niedrig + La pressione sanguigna è bassa You find a normal blood pressure @@ -964,6 +1057,7 @@ La presión arterial es normal Wyczuwasz normalne ciśnienie krwi Blutdruck ist normal + La pressione sanguigna è normale You find a high blood pressure @@ -972,6 +1066,7 @@ La presión arterial es alta Wyczuwasz wysokie ciśnienie krwi Blutdruck ist hoch + La pressione sanguigna è alta You find no blood pressure @@ -980,6 +1075,7 @@ No hay presión arterial Nie wyczuwasz ciśnienia krwi Patient hat keinen Blutdruck + La pressione sanguigna è assente You fail to find a blood pressure @@ -988,6 +1084,7 @@ No puedes encontrar presión arterial Nie udało Ci się sprawdzić ciśnienia krwi Blutdruck konnte nicht gefunden werden + Manca strumento per misurare pressione sanguigna Pulse @@ -996,6 +1093,7 @@ Pulso Tętno Puls + Polso Checking Heart Rate.. @@ -1004,6 +1102,7 @@ Comprobando ritmo cardíaco... Sprawdzanie tętna... Kontrolliere Herzfrequenz + Controllando il battito cardiaco.. You checked %1 @@ -1012,6 +1111,7 @@ Examinando a %1 Zbadałeś %1 Kontrolliertt %1 + Hai diagnosticato %1 You find a Heart Rate of %2 @@ -1020,6 +1120,7 @@ El ritmo cardíaco es de %2 Wyczuwasz tętno o wartości %2 Herzfrequenz ist %2 + Il battito cardiaco è %2 You find a weak Heart Rate @@ -1028,6 +1129,7 @@ El ritmo cardíaco es débil Wyczuwasz słabe tętno Schwacher Puls + Hai riscontrato un debole battito cardiaco You find a strong Heart Rate @@ -1036,6 +1138,7 @@ El ritmo cardíaco está acelerado Wyczuwasz silne tętno Starker Puls + Hai riscontrato un forte battito cardiaco You find a normal Heart Rate @@ -1044,6 +1147,7 @@ El ritmo cardíaco es bueno Wyczuwasz normalne tętno Normaler Puls + Hai riscontrato un normale battito cardiaco You find no Heart Rate @@ -1052,6 +1156,7 @@ No tiene ritmo cardíaco Wyczuwasz brak tętna Kein Puls gefunden + Hai riscontrato una assenza di battito cardiaco Response @@ -1060,6 +1165,7 @@ Respuesta Przytomność Ansprechbarkeit + Risposta You check response of patient @@ -1068,6 +1174,7 @@ Compruebas si el paciente reacciona Sprawdzasz przytomność pacjenta Du prüfst ob der Patient ansprechbar ist + Controlli la risposta del paziente %1 is responsive @@ -1076,6 +1183,7 @@ %1 ha reaccionado %1 jest przytomny %1 ist anprechbar + %1 e' cosciente %1 is not responsive @@ -1084,6 +1192,7 @@ %1 no reacciona %1 jest nieprzytomny %1 ist nicht ansprechbar + %1 e' incosciente You checked %1 @@ -1092,6 +1201,7 @@ Examinas a %1 Zbadałeś %1 Du versucht %1 anzusprechen + Hai controllato %1 Bandaged @@ -1099,6 +1209,7 @@ Повязка наложена Vendado Zabandażowano + Bendato You bandage %1 (%2) @@ -1106,6 +1217,7 @@ Вы перевязали раненого %1 (%2) Aplicas vendaje a %1 en %2 Bandażujesz %1 (%2) + Stai bendando %1 (%2) %1 is bandaging you @@ -1113,6 +1225,7 @@ %1 перевязывает вас %1 te está vendando %1 bandażuje Ciebie + %1 ti sta bendando You start stitching injures from %1 (%2) @@ -1120,6 +1233,7 @@ Vous suturez %1 (%2) Estás suturando heridas de %1 en %2 Zszywasz rany %1 (%2) + Stai suturando le ferite di %1 (%2) Stitching @@ -1127,6 +1241,7 @@ Sutures Suturando Szycie + Suturando You treat the airway of %1 @@ -1134,6 +1249,7 @@ Vous traitez les voies respiratoires de %1 Estás intubando a %1 Udrażniasz drogi oddechowe %1 + Controlli le vie respiratorie di %1 Airway @@ -1142,6 +1258,7 @@ Drogi oddechowe Atemwege Voies respiratoires + Vie respiratorie %1 is treating your airway @@ -1149,6 +1266,7 @@ %1 traite vos voies respiratoires %1 te está intubando %1 udrażnia Twoje drogi oddechowe + %1 ti sta trattando le vie respiratorie Drag @@ -1184,7 +1302,7 @@ Déposer Elenged Largar - Lascia + Load Patient Into @@ -1216,6 +1334,7 @@ Выгрузить пациента Wyładuj pacjenta Débarquer le Patient + Scarica il paziente Load patient @@ -1223,6 +1342,7 @@ Погрузить пациента Załaduj pacjenta Embarquer le Patient + Carica il paziente Place body in bodybag @@ -1230,6 +1350,7 @@ Поместить тело в мешок для трупов Zapakuj ciało do worka na zwłoki Mettre le corps dans la housse mortuaire + Metti il corpo nella sacca per cadaveri Placing body in bodybag @@ -1237,6 +1358,7 @@ Упаковка тела Pakowanie ciała do worka na zwłoki Placement du corps dans la housse + Stai mettendo il corpo nella sacca %1 has bandaged patient @@ -1244,6 +1366,7 @@ %1 перевязал пациента %1 zabandażował pacjenta %1 a pansé le patient + %1 ha bendato il paziente %1 used %2 @@ -1251,6 +1374,7 @@ %1 использовал %2 %1 użył %2 %1 utilise %2 + %1 ha usato %2 %1 has given an IV @@ -1258,6 +1382,7 @@ %1 провел переливание %1 podał IV %1 a administré une IV + %1 ha somministrato una IV %1 applied a tourniquet @@ -1265,66 +1390,79 @@ %1 наложил жгут %1 założył stazę %1 a appliqué un garrot + %1 ha applicato un laccio emostatico Heavily wounded Schwer verwundet: Ciężko ranny + Gravemente ferito Lightly wounded Leicht verwundet: Lekko ranny + Leggermente ferito Very lightly wounded Sehr leicht verwundet: B. lekko ranny + Ferito lievemente Head Kopf Głowa + Testa Torso Torso Tors + Torso Left Arm Linker Arm Lewe ramię + Braccio sinistro Right Arm Rechter Arm Prawe ramię + Braccio destro Left Leg Linkes Bein Lewa noga + Gamba sinistra Right Leg Rechtes Bein Prawa noga + Gamba destra Pain Effect Type Schmerzeffekt-Typ Rodzaj efektu bólu + Pain Effect Type Colour Flashing Farbblinken Pulsujące kolory + Colore lampeggiante Chromatic Aberration Chromatische Aberration Aberracja chromatyczna + Aberrazione cromatica - \ No newline at end of file + From 532ee164115bba856db38c7e2edd409cd06c56a2 Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 15 Apr 2015 10:30:56 +0200 Subject: [PATCH 023/305] Update stringtable.xml Italian translation --- addons/advanced_ballistics/stringtable.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/addons/advanced_ballistics/stringtable.xml b/addons/advanced_ballistics/stringtable.xml index 29560ce149..f19aa1e672 100644 --- a/addons/advanced_ballistics/stringtable.xml +++ b/addons/advanced_ballistics/stringtable.xml @@ -5,10 +5,12 @@ Show Wind Info Pokaż inf. o wietrze + Mostra indicazioni del vento Show Protractor Pokaż kątomierz + Mostra il rapportatore - \ No newline at end of file + From 2daa0e2d2935bd1593239b62a7f0808e4033c164 Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 15 Apr 2015 10:32:01 +0200 Subject: [PATCH 024/305] Update stringtable.xml Italian translation --- addons/aircraft/stringtable.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/aircraft/stringtable.xml b/addons/aircraft/stringtable.xml index 1ec3d09ae6..ae1993f6a7 100644 --- a/addons/aircraft/stringtable.xml +++ b/addons/aircraft/stringtable.xml @@ -34,6 +34,7 @@ Otevřít nákladní prostor Rámpát kinyitni Открыть грузовой отсек + Apri la porta del cargo Close Cargo Door @@ -44,6 +45,7 @@ Zavřít nákladní prostor Rámpát zárni Закрыть грузовой отсек + Chiudi la porta del cargo From f328d302e1defcfb2bf619de9cf40c106da1f910 Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 15 Apr 2015 10:42:25 +0200 Subject: [PATCH 025/305] Update stringtable.xml Italian translation --- addons/captives/stringtable.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/addons/captives/stringtable.xml b/addons/captives/stringtable.xml index 292da895f3..f5812b2bf7 100644 --- a/addons/captives/stringtable.xml +++ b/addons/captives/stringtable.xml @@ -71,6 +71,7 @@ Fogoly berakása Загрузить пленного Embarcar Prisioneiro + Carica il prigioniero Unload Captive @@ -82,6 +83,7 @@ Fogoly kivevése Выгрузить пленного Desembarcar Prisioneiro + Scarica il prigioniero Cable Tie @@ -128,6 +130,7 @@ Motozás Обыскать человека Revistar + Perquisisci la persona/Italian> Surrender @@ -137,6 +140,7 @@ Vzdát se Poddaj się Сдаться в плен + Arreso Stop Surrendering @@ -146,6 +150,7 @@ Přestat se vzdávat Podejmij walkę ponownie Отменить сдачу в плен + Annulla la resa Only use on alive units @@ -155,6 +160,7 @@ Použitelné jen na živé jednotky Używaj tylko na żywych jednostkach Применимо только к живым юнитам + Si può fare solo su persone vive Only use on dismounted inf @@ -164,6 +170,7 @@ Použitelné jen na pěsích jednotkách Używaj tylko na piechocie poza wszelkimi pojazdami Применимо только к пехоте вне техники + Si può usare solo su fanteria a piedi Nothing under mouse @@ -173,6 +180,7 @@ Nic není vybráno Nie ma nic pod kursorem Ничего не выделено + Niente selezionato From aaee9c72c1270ebdf73fe6e8ae4cf58203c60a5e Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 15 Apr 2015 10:44:13 +0200 Subject: [PATCH 026/305] Update stringtable.xml Italian translation --- addons/disarming/stringtable.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/disarming/stringtable.xml b/addons/disarming/stringtable.xml index e6820dbf16..67a7bb0d76 100644 --- a/addons/disarming/stringtable.xml +++ b/addons/disarming/stringtable.xml @@ -6,6 +6,7 @@ Öffne Inventar Otwórz ekwipunek Otevřít inventář + Apri l'inventario From c9e452a000c515a7b1f17fdb0740e92bc34da038 Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 15 Apr 2015 10:48:52 +0200 Subject: [PATCH 027/305] Update stringtable.xml Italian --- addons/disposable/stringtable.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/disposable/stringtable.xml b/addons/disposable/stringtable.xml index 86c4b2d8e8..f94c872948 100644 --- a/addons/disposable/stringtable.xml +++ b/addons/disposable/stringtable.xml @@ -10,6 +10,7 @@ Lanzador utilizado Használt cső Отстрелянная труба + Tubo utilizzato Used disposable rocket launcher @@ -20,6 +21,7 @@ Lanzador desechable utilizado Használt rakétavető Отстрелянная одноразовая пусковая установка + Lanciarazzi monouso utilizzato Preloaded Missile Dummy @@ -30,6 +32,7 @@ Preloaded Missile Dummy Preloaded Missile Dummy Заряженная ракетная пустышка + Missile stupido precaricato From 45fec0409d0a04adc480d54f1bb03d3490caaf0e Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 15 Apr 2015 10:51:26 +0200 Subject: [PATCH 028/305] Update stringtable.xml Italian --- addons/explosives/stringtable.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/explosives/stringtable.xml b/addons/explosives/stringtable.xml index 44dde34452..626b23596a 100644 --- a/addons/explosives/stringtable.xml +++ b/addons/explosives/stringtable.xml @@ -48,6 +48,7 @@ Robbanóanyag kódja: %1 Código do explosivo: %1 Код подрыва: %1 + Codice esplosivo: %1 Place @@ -488,6 +489,7 @@ Utilizado para detonar explosivos remotamente al soltarlo. Robbanóanyagok távoli robbantásához Используется для дистанционного подрыва, после смерти оператора. + Usato per attivare esplosivi quando rilasciato Pick up @@ -496,6 +498,7 @@ Sebrat Podnieś Ramasser + Raccogli From b28ef3d22dcfc01c1ed305d23a6bf5ef26d6e4b8 Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 15 Apr 2015 10:52:40 +0200 Subject: [PATCH 029/305] Update stringtable.xml Italian --- addons/fcs/stringtable.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/fcs/stringtable.xml b/addons/fcs/stringtable.xml index 1f1b0d3acf..69b81c6779 100644 --- a/addons/fcs/stringtable.xml +++ b/addons/fcs/stringtable.xml @@ -9,6 +9,7 @@ Označit cíl / Změřit vzdálenost Iluminar objetivo / Medir distancia Подсветить цель / Замерить расстояние + Illumina l'obiettivo / Misura la distanza Zeroed To From eceb7595234592383f4be2cfbb206c946bb22424 Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 15 Apr 2015 10:53:35 +0200 Subject: [PATCH 030/305] Update stringtable.xml Italian --- addons/frag/stringtable.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/frag/stringtable.xml b/addons/frag/stringtable.xml index 3fa60aacf7..25d4f04a9a 100644 --- a/addons/frag/stringtable.xml +++ b/addons/frag/stringtable.xml @@ -9,6 +9,7 @@ Wyłącz fragmentację odłamków Выключить разлёт осколков Désactive la fragmentation + Disattiva la frammentazione From 9a8dd905f21008463b8e1b84d1b1c5a4d8fd74f5 Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 15 Apr 2015 10:56:39 +0200 Subject: [PATCH 031/305] Update stringtable.xml --- addons/hearing/stringtable.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/hearing/stringtable.xml b/addons/hearing/stringtable.xml index a29915d5f8..da0f44a43c 100644 --- a/addons/hearing/stringtable.xml +++ b/addons/hearing/stringtable.xml @@ -105,6 +105,7 @@ Knalltrauma deaktivieren Vypnout pískání v uších Wyłącz dzwonienie w uszach + Disabilita il ronzio From 544894a05ee382835b472b3c26191e71b573dfd4 Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 15 Apr 2015 10:59:44 +0200 Subject: [PATCH 032/305] Update stringtable.xml Italian --- addons/interact_menu/stringtable.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index dddf90a4de..f403cf32a8 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -9,10 +9,12 @@ Zobrazit kurzor v menu pro vlastní interakci Zawsze wyświetlaj kursor dla własnej interakcji Toujours afficher le curseur pour les interactions sur soi-même + Mostra sempre il cursore per le auto interazioni Display interaction menus as lists Mostrar los menus de interacción como listas + Mostra il menù di interazione come lista Interact Key @@ -22,6 +24,7 @@ Klávesa pro interakci Klawisz interakcji Touche d'interaction + Tasto interazione Self Interaction Key @@ -31,6 +34,7 @@ Klávesa pro vlastní interakci Klawisz własnej interakcji Touche d'interaction personnelle + Tasto per auto interazioni Self Actions @@ -40,6 +44,7 @@ Vlastní akce Własne akcje Interaction personnelle + Auto interazioni Vehicle Actions @@ -49,6 +54,7 @@ Interakce s vozidly Akcje pojazdu Interaction véhicule + Interazioni con veicoli From 6e7c1ce9d2b8e0858bbf0828bd1a4797b938f3cb Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 15 Apr 2015 11:04:18 +0200 Subject: [PATCH 033/305] Update stringtable.xml Ita --- addons/interaction/stringtable.xml | 31 +++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index b7379026ef..ce18f514f4 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -9,6 +9,7 @@ Interakcje Interactions Взаимодействия + Interazioni Torso @@ -18,6 +19,7 @@ Tors Torse Торс + Torso Head @@ -27,6 +29,7 @@ Głowa Tête Голова + Testa Left Arm @@ -36,6 +39,7 @@ Lewe ramię Bras gauche Левая рука + Braccio sinistro Right Arm @@ -45,6 +49,7 @@ Prawe ramię Bras droit Правая рука + Braccio destro Left Leg @@ -54,6 +59,7 @@ Lewa noga Jambe gauche Левая нога + Gamba sinistra Right Leg @@ -63,6 +69,7 @@ Prawa noga Jambe droite Правая нога + Gamba destra Weapon @@ -72,6 +79,7 @@ Broń Arme Оружие + Arma Interaction Menu @@ -83,7 +91,7 @@ Меню взаимодействия Interakció Menu de Interação - Menù Interattivo + Menù interazione Interaction Menu (Self) @@ -95,7 +103,7 @@ Меню взаимодействия (с собой) Interakció (saját) Menu de Interação (Individual) - Menù Interattivo (Individuale) + Menù interazione (Individuale) Open / Close Door @@ -203,7 +211,7 @@ ТАНЦЕВАТЬ! TÁNC! DANCE! - Balla! + DANZA! Stop Dancing @@ -541,21 +549,25 @@ Join Red Unirse al rojo Rejoindre Rouge + Unisciti al team rosso Join Green Unirse al verde Rejoindre Verte + Unisciti al team verde Join Blue Unirse al azul Rejoindre Bleue + Unisciti al team blu Join Yellow Unirse al amarillo Rejoindre Jaune + Unisciti al team giallo You joined Team %1 @@ -566,7 +578,7 @@ Připojil ses do %1 týmu Вы присоединились к группе %1 Você uniu-se à Equipe %1 - Sei entrato nella Squadra %1 + Sei entrato nella team %1 Csatlakoztál a %1 csapathoz @@ -578,7 +590,7 @@ Opustit tým Покинуть группу Deixar Equipe - Lascia la Squadra + Lascia il team Csapat elhagyása @@ -590,7 +602,7 @@ Opustil si tým Вы покинули группу Você deixou a Equipe - Hai lasciato la squadra + Hai lasciato il team Elhagytad a csapatot @@ -625,7 +637,7 @@ Tecla modificadora Клавиша-модификатор Tecla Modificadora - Modifica Tasto + Modifica tasto Módosító billentyű Modifikátor @@ -639,6 +651,7 @@ Hatótávolságon kívül Poza zasięgiem Mimo dosah + Non in raggio Equipment @@ -649,6 +662,7 @@ Vybavení Felszerelés Снаряжение + Equipaggiamento Push @@ -659,6 +673,7 @@ Odstrčit Tolás Толкать + Spingi Interact @@ -668,6 +683,7 @@ Взаимодействовать Interakcja Interactuar + Interagisci Passengers @@ -677,6 +693,7 @@ Pasažéři Pasażerowie Passagers + Passeggeri From 5c7b8247c53ad1f7f708319f420bf7e14cf13db2 Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 15 Apr 2015 11:05:57 +0200 Subject: [PATCH 034/305] Update stringtable.xml Italian --- addons/inventory/stringtable.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/inventory/stringtable.xml b/addons/inventory/stringtable.xml index 0702f677fa..64784c2a96 100644 --- a/addons/inventory/stringtable.xml +++ b/addons/inventory/stringtable.xml @@ -9,6 +9,7 @@ Zvětšit zobrazení inventáře Powiększ UI ekwipunku Agrandir la taille d'affichage de l'inventaire + Ingrandisci il menù inventario Normally inventory display is scaled by UI size. This allows scaling the Inventory UI size up, but doesn't increase font size allowing more rows displayed. @@ -18,6 +19,7 @@ Normálně se velikost invetáře škáluje s velikostí UI. Toto nastavení dovoluje škálování velikost inventáře ale nežvětšuje velikost fontu. To dovoluje zobrazení více řad v inventáři. Ekwipunek skalowany jest poprzez rozmiar UI. Ta opcja pozwala powiększyć rozmiar UI ekwipunku, lecz nie zwiększa rozmiaru fontu pozwalając na wyświetlanie większej ilości wierszy. L'inventaire est normalement affiché en fonction de la taille de l'UI. Cette option permet d'agrandir l'affichage de l'inventaire, mais n'a aucun effet sur la taille des polices permettant d'afficher plus de ligne + Normalmente il menù inventario è scalato in base alle dimensioni interfaccia. Questa opzione di permette di ingrandirlo ulteriormente ma senza aumentare la dimensione del testo. From d1936d8e1be428ae29c47e9a43121f60b4190486 Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 15 Apr 2015 11:06:42 +0200 Subject: [PATCH 035/305] Update stringtable.xml Italian --- addons/javelin/stringtable.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/javelin/stringtable.xml b/addons/javelin/stringtable.xml index f0e933ad0d..3c53402de2 100644 --- a/addons/javelin/stringtable.xml +++ b/addons/javelin/stringtable.xml @@ -8,6 +8,7 @@ Zamknout cíl(držet) Namierz cel (przytrzymaj) Verrouiller cible (maintenir) + Aggangia il bersagio Cycle Fire Mode @@ -16,6 +17,7 @@ Cyklování režimů palby Przełącz tryb ognia Cycle mode de tir + Alterna le modalità di fuoco From 8c0f52e6153b83c7e32a2f9c13f41286e90162a2 Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 15 Apr 2015 11:08:04 +0200 Subject: [PATCH 036/305] Update stringtable.xml Italian --- addons/kestrel4500/stringtable.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/addons/kestrel4500/stringtable.xml b/addons/kestrel4500/stringtable.xml index 310884f989..0008da266a 100644 --- a/addons/kestrel4500/stringtable.xml +++ b/addons/kestrel4500/stringtable.xml @@ -21,22 +21,27 @@ Open Kestrel 4500 Otwórz Kestrel 4500 + Accendi Kestrel 4500 Show Kestrel 4500 Pokaż Kestrel 4500 + Mostra Kestrel 4500 Hide Kestrel 4500 Ukryj Kestrel 4500 + Nascondi Kestrel 4500 Open Kestrel 4500 Otwórz Kestrel 4500 + Accendi Kestrel 4500 Show Kestrel 4500 Pokaż Kestrel 4500 + Mostra Kestrel 4500 - \ No newline at end of file + From 96be1baddcdb820418a42e1d3d0465c0c0f65b74 Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 15 Apr 2015 11:08:43 +0200 Subject: [PATCH 037/305] Update stringtable.xml Italian --- addons/laser_selfdesignate/stringtable.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/laser_selfdesignate/stringtable.xml b/addons/laser_selfdesignate/stringtable.xml index 4fda0c031e..628c78b57d 100644 --- a/addons/laser_selfdesignate/stringtable.xml +++ b/addons/laser_selfdesignate/stringtable.xml @@ -9,6 +9,7 @@ Laserový značkovač zapnut Desygnator laserowy wł. Désignateur Laser Allumé + Designatore laser acceso Laser Designator Off @@ -18,6 +19,7 @@ Laserový značkovat vypnut Desygnator laserowy wył. Désignateur Laser Éteint + Designatore laser spento From f931c1a42ce4c445f94e25dc3e5e787c9203c7b3 Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 15 Apr 2015 11:10:05 +0200 Subject: [PATCH 038/305] Update stringtable.xml Italian --- addons/laserpointer/stringtable.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/addons/laserpointer/stringtable.xml b/addons/laserpointer/stringtable.xml index d53ab478e0..a3429a1fbf 100644 --- a/addons/laserpointer/stringtable.xml +++ b/addons/laserpointer/stringtable.xml @@ -9,6 +9,7 @@ Лазерный прицел (красный) Laserové ukazovátko (červené) Wskaźnik laserowy (czerwony) + Puntatore laser (rosso) Laser Pointer (green) @@ -17,6 +18,7 @@ Лазерный прицел (зелёный) Laserové ukazovátko (zelené) Wskaźnik laserowy (zielony) + Puntatore laser (verde) Emits visible light. @@ -25,6 +27,7 @@ Испускает узкий пучок видимого света. Vyzařuje viditelné světlo. Wydziela widzialne światło. + Emette luce visibile <t color='#9cf953'>Use: </t>Turn Laser ON/OFF @@ -51,6 +54,7 @@ Switch Laser / IR Laser Umschalten Laser / IR-Laser Przełącz Laser / Laser IR + Alterna Laser / IR Laser - \ No newline at end of file + From 5238647021d5d42bdb6206df8df4d95f06cd8735 Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 15 Apr 2015 11:12:15 +0200 Subject: [PATCH 039/305] Update stringtable.xml Italian --- addons/magazinerepack/stringtable.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/magazinerepack/stringtable.xml b/addons/magazinerepack/stringtable.xml index a524b015f9..c98f009f80 100644 --- a/addons/magazinerepack/stringtable.xml +++ b/addons/magazinerepack/stringtable.xml @@ -81,6 +81,7 @@ Перепаковка завершена Páskování dokončeno Przepakowywanie zakończone + Riempi caricatore Repacking Interrupted @@ -90,6 +91,7 @@ Перепаковка прервана Páskování přerušeno Przepakowywanie przerwane + Riempimento interrotto %1 Full and %2 Partial @@ -99,6 +101,7 @@ %1 полных и %2 неполных %1 plný a %2 částečně Pełnych: %1.<br />Częściowo pełnych: %2. + %1 pieno e %2 parziale From cb2e1c5116d03c1e9644e4b1df5d9c80ab2f2f63 Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 15 Apr 2015 11:13:19 +0200 Subject: [PATCH 040/305] Update stringtable.xml Italian --- addons/maptools/stringtable.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/maptools/stringtable.xml b/addons/maptools/stringtable.xml index f2bc71e324..74c5773027 100644 --- a/addons/maptools/stringtable.xml +++ b/addons/maptools/stringtable.xml @@ -142,6 +142,7 @@ Dirección: %1° Irány: %1 Направление: %1° + Direzione : %1° From 924cd80e6045ef4f681815c7fe5547b463792594 Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 15 Apr 2015 11:13:47 +0200 Subject: [PATCH 041/305] Update stringtable.xml ITalian --- addons/markers/stringtable.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/markers/stringtable.xml b/addons/markers/stringtable.xml index 65da73a026..60a357611d 100644 --- a/addons/markers/stringtable.xml +++ b/addons/markers/stringtable.xml @@ -10,6 +10,7 @@ Kierunek: %1° Dirección: %1° Направление: %1° + Direzione: %1° - \ No newline at end of file + From 47f8161855f05fd15704947719944b37eae06340 Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 15 Apr 2015 11:18:22 +0200 Subject: [PATCH 042/305] Update stringtable.xml Italian --- addons/microdagr/stringtable.xml | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/addons/microdagr/stringtable.xml b/addons/microdagr/stringtable.xml index 12962ea1ac..ec92773357 100644 --- a/addons/microdagr/stringtable.xml +++ b/addons/microdagr/stringtable.xml @@ -10,6 +10,7 @@ MicroDAGR GPS MicroDAGR GPS MicroDAGR GPS + MicroDAGR GPS MicroDAGR advanced GPS receiver @@ -19,6 +20,7 @@ Zaawansowany odbiornik GPS MicroDAGR Récepteur GPS MicroDAGR MicroDAGR pokročílá GPS příjímač + MicroDAGR ricevitore GPS avanzato Angular Unit: @@ -28,6 +30,7 @@ Unité angulaire Winkeleinheit: Úhlová jednotka: + Unità angolare: Mils @@ -37,6 +40,7 @@ Tysiączne Mils Mils + Miglia Show Waypoints On Map: @@ -46,6 +50,7 @@ Pokaż PT na mapie: Montrer points de passage sur la carte Ukázat waypointy na mapě: + Mostra waypoint sulla mappa: Degrees @@ -55,13 +60,14 @@ Stopnie Degrés Stupně + Gradi On Zapnuto Allumé Ein - + Acceso Wł. Ativar Вкл. @@ -72,7 +78,7 @@ Vypnuto Eteint Aus - No + Spento Wył. Desativar Выкл. @@ -86,6 +92,7 @@ Entrer coordonnées Koordinaten eingeben: Napiš souřadnice: + Introduci griglia coordinate: Name of [%1] @@ -95,6 +102,7 @@ Nazwa [%1] Nom de %1 Název [%1] + Nome di [%1] MGRS-New @@ -104,6 +112,7 @@ MGRS-Nowy Info-MGRS MGRS-Nový + Nuovo MGRS WGD @@ -113,6 +122,7 @@ WGD WGD WGD + WGD Range: @@ -122,6 +132,7 @@ Dystans: Distance: Vzdálenost: + Distanza: Compass Direction @@ -131,6 +142,7 @@ Azymut Azimut Azimut: + Azimut Mark @@ -140,6 +152,7 @@ Oznacz Marque Označit + Marca Waypoints @@ -149,6 +162,7 @@ Waypointy Punkty trasy Point de passage + waypoints Connect To @@ -158,6 +172,7 @@ Připojit k Podłącz do Connecter + Collega a Settings @@ -167,6 +182,7 @@ Настройки Nastavení Ustawienia + Impostaizoni SetWP @@ -176,6 +192,7 @@ Nastavit WP UstawPT Définir point de passage + Definisci WayPoints Add @@ -185,6 +202,7 @@ Přidat Dodaj Ajouter + Aggiungi Delete @@ -205,6 +223,7 @@ Przełącz GUI MicroDAGR Basculer le mode d'affichage MicroDAGR Přepnout zobrazení MircroDAGRu + Alterna modalità display MicroDAGR Show MicoDAGR @@ -214,6 +233,7 @@ Ukázat MicroDAGR GPS Pokaż<br />MicroDAGR Afficher MicroDAGR + Mostra MicroDAGR Configure MicroDAGR @@ -223,6 +243,7 @@ Konfigurovat MicroDAGR GPS Konfiguruj<br />MicroDAGR Configurer MicroDAGR + ConfiguraMicroDAGR Close MicroDAGR @@ -232,6 +253,7 @@ Zavřít MicroDAGR GPS Zamknij<br />MicroDAGR Fermer MicroDAGR + Chiudi MicroDAGR - \ No newline at end of file + From 76ff1da57a52bd2195eb7cd60b5b070c9ed0c1aa Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 15 Apr 2015 11:19:54 +0200 Subject: [PATCH 043/305] Update stringtable.xml Italian --- addons/missileguidance/stringtable.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/missileguidance/stringtable.xml b/addons/missileguidance/stringtable.xml index 16c9a7ec74..921ad84701 100644 --- a/addons/missileguidance/stringtable.xml +++ b/addons/missileguidance/stringtable.xml @@ -8,7 +8,7 @@ Zaawansowane naprowadzanie rakiet Erweiterte Raketenlenkung Pokročilé řízení střel - Avanzato Missile Guidance + Guida missili avanzata Avançado Missile Guidance Részletes rakéta irányító Расширенный ракетой @@ -20,7 +20,7 @@ Hydra-70 DAGR Hydra-70 DAGR Rackete Hydra-70 DAGR - + Missile Hydra-70 DAGR @@ -32,7 +32,7 @@ DAGR DAGR DAGR - + DAGR @@ -44,7 +44,7 @@ Laserowo naprowadzana rakieta Hydra-70 DAGR Hydra-70 Lasergelenkte DAGR Rakete Hydra-70 DAGR laserem naváděná střela - + Hydra-70 DAGR missile guida laser @@ -56,7 +56,7 @@ Hellfire II AGM-114K Hellfire II AGM-114K Hellfire II AGM-114K - + Missile Hellfire II AGM-114K @@ -68,7 +68,7 @@ AGM-114K AGM-114K AGM-114K - + AGM-114K @@ -80,7 +80,7 @@ Laserowo naprowadzana rakieta Hellfire II AGM-114K Hellfire II AGM-114K Lasergelenkte Rakete Hellfire II AGM-114K laserem naváděná střela - + Missile guida laser Hellfire II AGM-114K From bc62891122bbfb465604bcf53e8f8fcdaa8f6e5d Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 15 Apr 2015 11:24:20 +0200 Subject: [PATCH 044/305] Update stringtable.xml Italian --- addons/movement/stringtable.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/movement/stringtable.xml b/addons/movement/stringtable.xml index 9de9e9033f..0672c593f6 100644 --- a/addons/movement/stringtable.xml +++ b/addons/movement/stringtable.xml @@ -33,6 +33,7 @@ Trepar Vylézt Подняться + Arrampicati Can't climb here @@ -42,6 +43,7 @@ No se puede trepar aquí Zde není možné vylézt Не можете подняться здесь + Non puoi arrampicarti qui From 9b94692ca5a68dd8b1b54128b3b5d6bc3e103f6a Mon Sep 17 00:00:00 2001 From: Coren4 Date: Wed, 15 Apr 2015 15:02:36 +0200 Subject: [PATCH 045/305] Update AUTHORS.txt --- AUTHORS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.txt b/AUTHORS.txt index 906fc706a4..46ecb651a9 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -77,3 +77,4 @@ BlackPixxel Asgar Serran Kavinsky BlackPixxel +Coren From 238cf1cc6351f7f0a552a482d529ea703e1d17fe Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 15 Apr 2015 15:06:28 +0200 Subject: [PATCH 046/305] Added keybinds for ATragMX and Kestrel 4500 (empty by default) --- addons/atragmx/XEH_postInit.sqf | 2 +- addons/atragmx/initKeybinds.sqf | 2 +- addons/kestrel4500/XEH_postInit.sqf | 2 +- addons/kestrel4500/initKeybinds.sqf | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/atragmx/XEH_postInit.sqf b/addons/atragmx/XEH_postInit.sqf index 6875b4382e..31c526fab7 100644 --- a/addons/atragmx/XEH_postInit.sqf +++ b/addons/atragmx/XEH_postInit.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" -//#include "initKeybinds.sqf" +#include "initKeybinds.sqf" if (count (profileNamespace getVariable ["ACE_ATragMX_gunList", []]) > 0) then { GVAR(gunList) = profileNamespace getVariable "ACE_ATragMX_gunList"; diff --git a/addons/atragmx/initKeybinds.sqf b/addons/atragmx/initKeybinds.sqf index 28616b872f..d8a69a09e3 100644 --- a/addons/atragmx/initKeybinds.sqf +++ b/addons/atragmx/initKeybinds.sqf @@ -8,4 +8,4 @@ false }, {false}, -[197, [false, false, false]], false, 0] call CBA_fnc_addKeybind; // (PRINT) \ No newline at end of file +[0, [false, false, false]], false, 0] call CBA_fnc_addKeybind; // (empty default key) \ No newline at end of file diff --git a/addons/kestrel4500/XEH_postInit.sqf b/addons/kestrel4500/XEH_postInit.sqf index 878f9ca0ce..461ed533db 100644 --- a/addons/kestrel4500/XEH_postInit.sqf +++ b/addons/kestrel4500/XEH_postInit.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" -//#include "initKeybinds.sqf" +#include "initKeybinds.sqf" GVAR(Menus) = ["Direction", "Wind SPD m/s", "CROSSWIND m/s", "HEADWIND m/s", "TEMP °C", "HUMIDITY %", "BARO hPA", "ALTITUDE m", "User Screen 1", "User Screen 2"]; diff --git a/addons/kestrel4500/initKeybinds.sqf b/addons/kestrel4500/initKeybinds.sqf index 657e10d907..585856cbbb 100644 --- a/addons/kestrel4500/initKeybinds.sqf +++ b/addons/kestrel4500/initKeybinds.sqf @@ -8,7 +8,7 @@ false }, {false}, -[70, [false, false, false]], false, 0] call CBA_fnc_addKeybind; // (SCROLL) +[0, [false, false, false]], false, 0] call CBA_fnc_addKeybind; // (empty default key) ["ACE3", QGVAR(DisplayKestrelKey), localize "STR_ACE_Kestrel4500_DisplayKestrelKey", { @@ -20,4 +20,4 @@ false }, {false}, -[70, [true, false, false]], false, 0] call CBA_fnc_addKeybind; // (SHIFT + SCROLL) +[0, [true, false, false]], false, 0] call CBA_fnc_addKeybind; // (empty default key) From def6c9135b605f9900c1d258141bdac20bb57c79 Mon Sep 17 00:00:00 2001 From: KoffeinFlummi Date: Wed, 15 Apr 2015 15:31:10 +0200 Subject: [PATCH 047/305] Fix typos in devenv doc --- .../development/setting-up-the-development-environment.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/development/setting-up-the-development-environment.md b/documentation/development/setting-up-the-development-environment.md index 0fbc0793f2..fe76ca6a20 100644 --- a/documentation/development/setting-up-the-development-environment.md +++ b/documentation/development/setting-up-the-development-environment.md @@ -70,12 +70,12 @@ mklink /D "[Arma 3 installation folder]\z\ace" "[location of the ACE3 project]" mklink /D "P:\z\ace" "[location of the ACE3 project]" ``` -Then, copy the `cba` folder from the `tools` folder to `P:\x\cba`. Create the `x` folder if needed. That folder contains the part of the CBA source code that are required for the macros to work. +Then, copy the `cba` folder from the `tools` folder to `P:\x\cba`. Create the `x` folder if needed. That folder contains the parts of the CBA source code that are required for the macros to work. ## Creating a Test Build -To create a development build of ACE to test changes or to debug something, run the `build.bat` file in the `tools` folder. This will populate the `addons` folder with binarized PBOs. These PBOs still point to the source files in their respective folders however, which allows you to use [file patching](#file-patching). +To create a development build of ACE to test changes or to debug something, run the `build.py` file in the `tools` folder. This will populate the `addons` folder with binarized PBOs. These PBOs still point to the source files in their respective folders however, which allows you to use [file patching](#file-patching). This also means that you cannot distribute this build to others. From bf8f9b48182ddcc02c485bf1dad7cee1da407dd7 Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 15 Apr 2015 15:34:01 +0200 Subject: [PATCH 048/305] all I need is a $ --- addons/respawn/CfgVehicles.hpp | 6 +++--- addons/respawn/functions/fnc_handleInitPostServer.sqf | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/respawn/CfgVehicles.hpp b/addons/respawn/CfgVehicles.hpp index 28e33c6b3e..56d2058d2c 100644 --- a/addons/respawn/CfgVehicles.hpp +++ b/addons/respawn/CfgVehicles.hpp @@ -152,7 +152,7 @@ class CfgVehicles { XEH_ENABLED; author = "$STR_ACE_Common_ACETeam"; - displayName = "STR_ACE_Respawn_RallypointWest"; + displayName = "$STR_ACE_Respawn_RallypointWest"; vehicleClass = QGVAR(Rallypoints); class ACE_Actions: ACE_Actions { @@ -172,7 +172,7 @@ class CfgVehicles { XEH_ENABLED; author = "$STR_ACE_Common_ACETeam"; - displayName = "STR_ACE_Respawn_RallypointEast"; + displayName = "$STR_ACE_Respawn_RallypointEast"; vehicleClass = QGVAR(Rallypoints); class ACE_Actions: ACE_Actions { @@ -192,7 +192,7 @@ class CfgVehicles { XEH_ENABLED; author = "$STR_ACE_Common_ACETeam"; - displayName = "STR_ACE_Respawn_RallypointIndependent"; + displayName = "$STR_ACE_Respawn_RallypointIndependent"; vehicleClass = QGVAR(Rallypoints); class ACE_Actions: ACE_Actions { diff --git a/addons/respawn/functions/fnc_handleInitPostServer.sqf b/addons/respawn/functions/fnc_handleInitPostServer.sqf index c83354b24e..f8a0479717 100644 --- a/addons/respawn/functions/fnc_handleInitPostServer.sqf +++ b/addons/respawn/functions/fnc_handleInitPostServer.sqf @@ -41,7 +41,7 @@ if (_leaderVarName == "") then { private "_leaderID"; _leaderID = GETGVAR(NextLeaderID,0); - _leaderVarName = format [QGVAR(Rallypoint_Leader_%1), _leaderID]; + _leaderVarName = format [QUOTE(ACE_Rallypoint_Leader_%1), _leaderID]; _unit setVehicleVarName _leaderVarName; From 67100406336a5a7b3d9a8b4e82c65dc99178f036 Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 15 Apr 2015 16:13:53 +0200 Subject: [PATCH 049/305] toLower in, always follow your own advice --- addons/hearing/functions/fnc_firedNear.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/hearing/functions/fnc_firedNear.sqf b/addons/hearing/functions/fnc_firedNear.sqf index c66361801e..72776b68c6 100644 --- a/addons/hearing/functions/fnc_firedNear.sqf +++ b/addons/hearing/functions/fnc_firedNear.sqf @@ -31,7 +31,7 @@ _muzzle = _this select 4; _mode = _this select 5; _ammo = _this select 6; -if (_weapon in ["Throw", "Put"]) exitWith {}; +if (toLower _weapon in ["throw", "put"]) exitWith {}; if (_unit != vehicle _unit && {!([_unit] call EFUNC(common,isTurnedOut))}) exitWith {}; _silencer = switch (_weapon) do { From 95b04d08402e4c1c011377c875517b17f4b0eb59 Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 15 Apr 2015 16:22:42 +0200 Subject: [PATCH 050/305] Added custom airFriction values for the new marksmen ammo types. --- addons/ballistics/CfgAmmo.hpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 2528a49c77..87f3a99df1 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -248,6 +248,8 @@ class CfgAmmo { ACE_barrelLengths[]={16, 20, 24, 26}; }; class B_762x54_Ball : BulletBase { + airFriction=-0.001023; + typicalSpeed=820; ACE_caliber=0.312; ACE_bulletLength=1.14; ACE_bulletMass=152; @@ -428,6 +430,8 @@ class CfgAmmo { ACE_barrelLengths[]={20, 24, 26}; }; class B_93x64_Ball : BulletBase { + airFriction=-0.00106; + typicalSpeed=880; ACE_caliber=0.366; ACE_bulletLength=1.350; ACE_bulletMass=230; @@ -468,6 +472,8 @@ class CfgAmmo { ACE_barrelLengths[]={29}; }; class B_338_Ball : BulletBase { + airFriction=-0.00061 + typicalSpeed=915; ACE_caliber=0.338; ACE_bulletLength=1.558; ACE_bulletMass=250; @@ -480,6 +486,8 @@ class CfgAmmo { ACE_barrelLengths[]={20, 26, 28}; }; class B_338_NM_Ball : BulletBase { + airFriction=-0.000537; + typicalSpeed=820; ACE_caliber=0.338; ACE_bulletLength=1.70; ACE_bulletMass=300; @@ -509,9 +517,11 @@ class CfgAmmo { ACE_barrelLengths[]={20, 24, 26.5, 28}; }; class B_127x54_Ball : BulletBase { - ACE_caliber=0.50; + airFriction=-0.00014; + typicalSpeed=300; + ACE_caliber=0.510; ACE_bulletLength=2.540; - ACE_bulletMass=950; + ACE_bulletMass=750; ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; ACE_ballisticCoefficients[]={1.050}; ACE_velocityBoundaries[]={}; From 9c1b40f5a36bb20435a488ca343c25377b02134e Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 15 Apr 2015 16:40:20 +0200 Subject: [PATCH 051/305] preparing for improved positions of action points --- addons/respawn/CfgVehicles.hpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/addons/respawn/CfgVehicles.hpp b/addons/respawn/CfgVehicles.hpp index 56d2058d2c..384376b00c 100644 --- a/addons/respawn/CfgVehicles.hpp +++ b/addons/respawn/CfgVehicles.hpp @@ -100,7 +100,7 @@ class CfgVehicles { distance = 4; condition = QUOTE(side group _player == west); statement = QUOTE([ARR_3(_player,side group _player,'ACE_Rallypoint_West')] call FUNC(teleportToRallypoint)); - position[] = {0,0,-1}; + position = "[0,0,-1]"; showDisabled = 1; priority = 1; }; @@ -120,7 +120,7 @@ class CfgVehicles { distance = 4; condition = QUOTE(side group _player == east); statement = QUOTE([ARR_3(_player,side group _player,'ACE_Rallypoint_East')] call FUNC(teleportToRallypoint)); - position[] = {0,0,-1}; + position = "[0,0,-1]"; showDisabled = 1; priority = 1; }; @@ -140,7 +140,7 @@ class CfgVehicles { distance = 4; condition = QUOTE(side group _player == independent); statement = QUOTE([ARR_3(_player,side group _player,'ACE_Rallypoint_Independent')] call FUNC(teleportToRallypoint)); - position[] = {0,0,-1}; + position = "[0,0,-1]"; showDisabled = 1; priority = 1; }; @@ -161,7 +161,7 @@ class CfgVehicles { distance = 4; condition = QUOTE(side group _player == west); statement = QUOTE([ARR_3(_player,side group _player,'ACE_Rallypoint_West_Base')] call FUNC(teleportToRallypoint)); - position[] = {0,0,-1}; + position = "[0,0,-1]"; showDisabled = 1; priority = 1; }; @@ -181,7 +181,7 @@ class CfgVehicles { distance = 4; condition = QUOTE(side group _player == east); statement = QUOTE([ARR_3(_player,side group _player,'ACE_Rallypoint_East_Base')] call FUNC(teleportToRallypoint)); - position[] = {0,0,-1}; + position = "[0,0,-1]"; showDisabled = 1; priority = 1; }; @@ -201,7 +201,7 @@ class CfgVehicles { distance = 4; condition = QUOTE(side group _player == independent); statement = QUOTE([ARR_3(_player,side group _player,'ACE_Rallypoint_Independent_Base')] call FUNC(teleportToRallypoint)); - position[] = {0,0,-1}; + position = "[0,0,-1]"; showDisabled = 1; priority = 1; }; From bbc24b6d029c1101df788c28c1ebaa65d6633c69 Mon Sep 17 00:00:00 2001 From: Legolasindar Date: Wed, 15 Apr 2015 16:49:43 +0200 Subject: [PATCH 052/305] Update stringtable.xml added spanish translate --- addons/advanced_ballistics/stringtable.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/advanced_ballistics/stringtable.xml b/addons/advanced_ballistics/stringtable.xml index f19aa1e672..d460ac4268 100644 --- a/addons/advanced_ballistics/stringtable.xml +++ b/addons/advanced_ballistics/stringtable.xml @@ -6,11 +6,13 @@ Show Wind Info Pokaż inf. o wietrze Mostra indicazioni del vento + Mostrar información del viento Show Protractor Pokaż kątomierz Mostra il rapportatore + Mostrar transportador From 0d28a890e1229ad8b1aa29559fc671f58151e07f Mon Sep 17 00:00:00 2001 From: jaynus Date: Wed, 15 Apr 2015 08:19:21 -0700 Subject: [PATCH 053/305] Fixes: Cycle fire mode on Titan was not working. Closes #603 --- addons/javelin/functions/fnc_showFireMode.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/javelin/functions/fnc_showFireMode.sqf b/addons/javelin/functions/fnc_showFireMode.sqf index 35dff9dbd3..88374548c0 100644 --- a/addons/javelin/functions/fnc_showFireMode.sqf +++ b/addons/javelin/functions/fnc_showFireMode.sqf @@ -4,8 +4,8 @@ TRACE_1("enter", _this); private["_player", "_currentFireMode"]; -_currentFireMode = ACE_player getVariable["ace_missileguidance_attackProfile", "TOP"]; -if(_currentFireMode == "TOP") then { +_currentFireMode = ACE_player getVariable["ace_missileguidance_attackProfile", "JAV_TOP"]; +if(_currentFireMode == "JAV_TOP") then { __JavelinIGUITop ctrlSetTextColor __ColorGreen; __JavelinIGUIDir ctrlSetTextColor __ColorGray; } else { From 6fca6017591acf97b16e162fc7ee4336be202fc7 Mon Sep 17 00:00:00 2001 From: ruPaladin Date: Wed, 15 Apr 2015 18:24:57 +0300 Subject: [PATCH 054/305] Kestrel 4500NV translation to Russian --- addons/kestrel4500/stringtable.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/addons/kestrel4500/stringtable.xml b/addons/kestrel4500/stringtable.xml index e9a72d82a8..3a0e18b9e5 100644 --- a/addons/kestrel4500/stringtable.xml +++ b/addons/kestrel4500/stringtable.xml @@ -17,27 +17,33 @@ Kestrel 4500 Pocket Weather Tracker Anemomentr skrzydełkowy Kestrel 4500 + Карманная метеостанция Kestrel 4500NV Open Kestrel 4500 Otwórz Kestrel 4500 Kestrel 4500 elővétele + Открыть Kestrel 4500NV Show Kestrel 4500 Pokaż Kestrel 4500 + Показать Kestrel 4500NV Hide Kestrel 4500 Ukryj Kestrel 4500 + Убрать Kestrel 4500NV Open Kestrel 4500 Otwórz Kestrel 4500 + Открыть Kestrel 4500NV Show Kestrel 4500 Pokaż Kestrel 4500 + Показать Kestrel 4500NV From 64504a95156916f222e8b822414c66912ce287b7 Mon Sep 17 00:00:00 2001 From: ruPaladin Date: Wed, 15 Apr 2015 18:27:28 +0300 Subject: [PATCH 055/305] addons/interact_menu translation to Russian --- addons/interact_menu/stringtable.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index eb03f86355..8960f99e60 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -14,6 +14,7 @@ Display interaction menus as lists Mostrar los menus de interacción como listas + Показывать меню взаимодействия в виде списка Interact Key From 9caba1e3a33aefefec4c8f6ecf179aea54a93331 Mon Sep 17 00:00:00 2001 From: ruPaladin Date: Wed, 15 Apr 2015 18:29:38 +0300 Subject: [PATCH 056/305] addons/weather/ translation to Russian --- addons/weather/stringtable.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/weather/stringtable.xml b/addons/weather/stringtable.xml index 4827751c6b..85b1e96383 100644 --- a/addons/weather/stringtable.xml +++ b/addons/weather/stringtable.xml @@ -5,6 +5,7 @@ Show Wind Info Pokaż inf. o wietrze + Показать информацию о погоде - \ No newline at end of file + From 40b784fb7acbf803222c3b1c1f1ca8c213faf7c7 Mon Sep 17 00:00:00 2001 From: Ivan Navarro Cabello Date: Wed, 15 Apr 2015 17:41:10 +0200 Subject: [PATCH 057/305] update stringtable added spanish translate --- addons/atragmx/stringtable.xml | 3 ++ addons/ballistics/stringtable.xml | 78 +++++++++++++++++++++++++++-- addons/javelin/stringtable.xml | 5 +- addons/kestrel4500/stringtable.xml | 8 ++- addons/laserpointer/stringtable.xml | 6 ++- addons/medical/stringtable.xml | 15 +++++- addons/scopes/stringtable.xml | 12 ++++- addons/weather/stringtable.xml | 1 + 8 files changed, 120 insertions(+), 8 deletions(-) diff --git a/addons/atragmx/stringtable.xml b/addons/atragmx/stringtable.xml index 6b6a921c2a..c831e8c9e5 100644 --- a/addons/atragmx/stringtable.xml +++ b/addons/atragmx/stringtable.xml @@ -17,14 +17,17 @@ Open ATragMX Otwórz ATragMX + Abrir ATragMX Rugged PDA with ATragMX Przenośny PDA z kalkulatorem balistycznym ATragMX + PDA rugerizada con ATragMX Open ATragMX Otwórz ATragMX + Abrir ATragMX \ No newline at end of file diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index 41070fa3dd..6419b1a199 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -310,7 +310,7 @@ 7.62mm Tracer 7,62 mm Nyomjelző 7,62mm Leuchtspur - 7,62mm Trazadora + 7,62mm trazadora 7,62mm Traçantes 7,62mm Smugacz 7.62mm Svítící @@ -334,7 +334,7 @@ 7.62mm 20rnd Tracer IR-DIM Mag 7,62 mm Nyomjelző IR-DIM 20-as Tár 7,62 mm 20-Schuss-Magazin Leuchtspur IR-DIM - Cargador de 20 balas IR-DIM de 7,62mm + Cargador de 20 balas trazadoras IR-DIM de 7,62mm Ch. 7,62mm 20Cps Traçantes IR-DIM Magazynek 7,62mm 20rd Smugacz IR-DIM 7.62mm 20ks Svítící IR-DIM Zásobník @@ -443,326 +443,398 @@ .338 LM 10Rnd AP Mag .338 LM 10-Schuss-Magazin Hartkern Magazynek .338 LM 10rd AP + Cargador de 20 balas AP de .338 LM .338 LM AP .338 LM AP .338 LM AP .338 LM AP + .338 LM AP Caliber: .338 Lapua Magnum AP<br />Rounds: 10<br />Used in: MAR-10 Kaliber: .338 Lapua Magnum Hartkern<br />Schuss: 10<br />Verwendet für: MAR-10 Kaliber: .338 Lapua Magnum AP<br />Pociski: 10<br />Używany w: MAR-10 + Calibre: .338 Lapua Magnum AP<br />Balas: 10<br />Se usa en: MAR-10 .338 NM 130Rnd Tracer Belt .338 NM 130-Schuss-Gurt Leuchtspur Taśma .338 NM 130rd Smugacz + Cinta de 130 balas trazadoras de .338 NM .338 NM Tracer .338 NM Leuchtspur .338 NM Tracer .338 NM Svítící + .338 NM trazadora Caliber: .338 Norma Magnum Tracer<br />Rounds: 130<br />Used in: SPMG Kaliber: .338 Norma Magnum Leuchtspur<br />Schuss: 130<br />Verwendet für: SPMG Kaliber: .338 Norma Magnum Smugacz<br />Pociski: 130<br />Używany w: SPMG + Calibre: .338 Norma Magnum trazadora<br />Balas: 130<br />Se usa en: SPMG .338 NM 130Rnd IR-DIM Belt .338 NM 130-Schuss-Gurt Leuchtspur IR-DIM Taśma .338 NM 130rd IR-DIM + Cinta de 130 balas IR-DIM de .338 NM .338 NM IR-DIM .338 LM IR-DIM .338 NM IR-DIM .338 NM IR-DIM + .338 NM IR-DIM Caliber: .338 Norma Magnum Tracer IR-DIM<br />Rounds: 130<br />Used in: SPMG Kaliber: .338 Norma Magnum Leuchtspur IR-DIM<br />Schuss: 130<br />Verwendet für: SPMG Kaliber: .338 Norma Magnum Smugacz IR-DIM<br />Pociski: 130<br />Używany w: SPMG + Calibre: .338 Norma Magnum trazadora IR-DIM<br />Balas: 130<br />Se usa en: SPMG .338 NM 130Rnd AP Belt .338 NM 130-Schuss-Gurt Hartkern Taśma .338 NM 130rd AP + Cinta de 130 balas AP de .338 NM .338 NM AP .338 NM AP .338 NM AP .338 NM AP + .338 NM AP Caliber: .338 Norma Magnum AP<br />Rounds: 130<br />Used in: SPMG Kaliber: .338 Norma Magnum Hartkern<br />Schuss: 130<br />Verwendet für: SPMG Kaliber: .338 Norma Magnum AP<br />Pociski: 130<br />Używane w: SPMG + Calibre: .338 Norma Magnum AP<br />Balas: 130<br />Se usa en: SPMG 9.3mm 10Rnd Tracer Mag 9,3mm 10-Schuss-Magazin Leuchtspur Magazynek 9.3mm 10rd Smugacz + Cargador de 10 balas trazadoras de 9.3mm 9.3mm Tracer 9,3mm Leuchtspur 9,3mm Smugacz 9.3mm Svítící + 9.3mm trazadora Caliber: 9.3x64mm Tracer<br />Rounds: 10<br />Used in: Cyrus Kaliber: 9,3x64mm Leuchtspur<br />Schuss: 10<br />Verwendet für: Cyrus Kaliber: 9,3x64 mm Smugacz<br />Pociski: 10<br />Używany w: Cyrus + Calibre: 9.3x64mm trazadora<br />Balas: 10<br />Se usa en: Cyrus 9.3mm 10Rnd Tracer IR-DIM Mag 9,3mm 10-Schuss-Magazin Leuchtspur IR-DIM Magazynek 9,3mm 10rd Smugacz IR-DIM + Cargador de 10 balas trazadoras IR-DIM de 9.3mm 9.3mm IR-DIM 9,3mm IR-DIM 9,3mm IR-DIM 9.3mm IR-DIM + 9.3mm IR-DIM Caliber: 9.3x64mm Tracer IR-DIM<br />Rounds: 10<br />Used in: Cyrus Kaliber: 9,3x64mm Leuchtspur IR-DIM<br />Schuss: 10<br />Verwendet für: Cyrus Kaliber: 9,3x64 mm Smugacz IR-DIM<br />Pociski: 10<br />Używany w: Cyrus + Calibre: 9.3x64mm trazadora IR-DIM<br />Balas: 10<br />Se usa en: Cyrus 9.3mm 10Rnd AP Mag 9,3mm 10-Schuss-Magazin Hartkern Magazynek 9,3mm 10rd AP + Cargador de 10 balas AP de 9.3mm 9.3mm AP 9,3mm AP 9,3mm AP 9.3mm AP + 9.3mm AP Caliber: 9.3x64mm AP<br />Rounds: 10<br />Used in: Cyrus Kaliber: 9,3x64mm Hartkern<br />Schuss: 10<br />Verwendet für: Cyrus Kaliber: 9,3x64 mm AP<br />Pociski: 10<br />Używany w: Cyrus + Calibre: 9.3x64mm AP<br />Balas: 10<br />Se usa en: Cyrus 9.3mm 150Rnd Tracer Belt 9,3mm 150-Schuss-Gurt Leuchtspur Taśma 9,3mm 150rd Smugacz + Cinta de 150 balas trazadoras de 9.3mm 9.3mm Tracer 9,3mm Leuchtspur 9,3mm Smugacz 9.3mm Svítící + 9.3mm trazadora Caliber: 9.3x64mm Tracer<br />Rounds: 150<br />Used in: Navid Kaliber: 9,3x64mm Leuchtspur<br />Schuss: 150<br />Verwendet für: Navid Kaliber: 9,3x64 mm Smugacz<br />Pociski: 150<br />Używane w: Navid + Calibre: 9.3x64mm trazadora<br />Balas: 150<br />Se usa en: Navid 9.3mm 150Rnd Tracer IR-DIM Belt 9,3mm 150-Schuss-Gurt Leuchtspur IR-DIM Taśma 9,3mm 150rd Smugacz IR-DIM + Cinta de 150 balas trazadoras IR-DIM de 9.3mm 9.3mm IR-DIM 9,3mm IR-DIM 9,3mm IR-DIM 9.3mm IR-DIM + 9.3mm IR-DIM Caliber: 9.3x64mm Tracer IR-DIM<br />Rounds: 150<br />Used in: Navid Kaliber: 9,3x64mm Leuchtspur IR-DIM<br />Schuss: 150<br />Verwendet für: Navid Kaliber: 9,3x64 mm Smugacz IR-DIM<br />Pociski: 150<br />Używane w: Navid + Calibre: 9.3x64mm trazadora IR-DIM<br />Balas: 150<br />Se usa en: Navid 9.3mm 150Rnd AP Belt 9,3mm 150-Schuss-Gurt Hartkern Taśma 9,3mm 150rd AP + Cinta de 150 balas AP de 9.3mm 9.3mm AP 9,3mm AP 9,3mm AP 9.3mm AP + 9.3mm AP Caliber: 9.3x64mm AP<br />Rounds: 150<br />Used in: Navid Kaliber: 9,3x64mm Hartkern<br />Schuss: 150<br />Verwendet für: Navid Kaliber: 9,3x64 mm AP<br />Pociski: 150<br />Używane w: Navid + Calibre: 9.3x64mm AP<br />Balas: 150<br />Se usa en: Navid 9x19mm 16Rnd Mag Magazynek 9x19mm 16rd + Cargador de 16 balas de 9x19mm 9x19mm 9x19mm + 9x19mm 9x19mm 16Rnd Mag Magazynek 9x19mm 16rd + Cargador de 16 balas de 9x19mm 9x19mm 30Rnd Mag Magazynek 9x19mm 30rd + Cargador de 30 balas de 9x19mm 9x19mm 9x19mm + 9x19mm 9x19mm 30Rnd Mag Magazynek 9x19mm 30rd + Cargador de 30 balas de 9x19mm 7.62x54mm 10Rnd Tracer IR-DIM Mag Magazynek 7,62x54 mm 10rd Smugacz IR-DIM + Cargador de 10 balas trazadoras IR-DIM de 7.62x54mm 7.62mm IR-DIM 7,62mm IR-DIM + 7.62mm IR-DIM 7.62x54mm 10Rnd Tracer IR-DIM Mag Magazynek 7,62x54 mm 10rd Smugacz IR-DIM + Cargador de 10 balas trazadoras IR-DIM de 7.62x54mm 6.5mm 100Rnd Tracer IR-DIM Mag Magazynek 6,5mm 100rd Smugacz IR-DIM + Cargador de 100 balas trazadoras IR-DIM de 6.5mm 6.5mm IR-DIM 6,5mm IR-DIM + 6.5mm IR-DIM 6.5mm 100Rnd Tracer IR-DIM Mag Magazynek 6,5mm 100rd Smugacz IR-DIM + Cargador de 100 balas trazadoras IR-DIM de 6.5mm 6.5mm 200Rnd Tracer IR-DIM Belt Magazynek 6,5mm 200rd Smugacz IR-DIM + Cinta de 200 balas trazadoras IR-DIM de 6.5mm 6.5mm IR-DIM 6,5mm IR-DIM + 6.5mm IR-DIM 6.5mm 200Rnd Tracer IR-DIM Belt Magazynek 6,5mm 200rd Smugacz IR-DIM + Cinta de 200 balas trazadoras IR-DIM de 6.5mm 5.56mm 30Rnd Mag (Mk262) Magazynek 5,56mm 30rd Mk262 + Cargador de 30 balas de 5.56mm (Mk262) 5.56mm (Mk262) 5,56mm (Mk262) + 5.56mm (Mk262) Caliber: 5.56x45 mm NATO (Mk262)<br />Rounds: 30 Kaliber: 5,56x45 mm NATO (Mk262)<br />Pociski: 30 + Calibre: 5.56x45 mm NATO (Mk262)<br />Balas: 30 5.56mm 30Rnd Mag (Mk318) Magazynek 5,56mm 30rd Mk318 + Cargador de 30 balas de 5.56mm (Mk318) 5.56mm (Mk318) 5,56mm (Mk318) + 5.56mm (Mk318) Caliber: 5.56x45 mm NATO (Mk318)<br />Rounds: 30 Kaliber: 5,56x45 mm NATO (Mk318)<br />Pociski: 30 + Calibre: 5.56x45 mm NATO (Mk318)<br />Balas: 30 7.62mm 10Rnd Mag (M118LR) Magazynek 7,62mm 10rd (M118LR) + Cargador de 10 balas de 7.62mm (M118LR) 7.62mm (M118LR) 7,62mm (M118LR) + 7.62mm (M118LR) Caliber: 7.62x51 mm NATO (M118LR)<br />Rounds: 10 Kaliber: 7,62x51 mm NATO (M118LR)<br />Pociski: 10 + Calibre: 7.62x51 mm NATO (M118LR)<br />Balas: 10 7.62mm 20Rnd Mag (M118LR) Magazynek 7,62mm 20rd (M118LR) + Cargador de 20 balas de 7.62mm (M118LR) 7.62mm (M118LR) 7,62mm (M118LR) + 7.62mm (M118LR) Caliber: 7.62x51 mm NATO (M118LR)<br />Rounds: 20 Kaliber: 7,62x51 mm NATO (M118LR)<br />Pociski: 20 + Calibre: 7.62x51 mm NATO (M118LR)<br />Balas: 20 7.62mm 20Rnd Mag (Mk248 Mod 0) Magazynek 7,62mm 20rd (Mk248 Mod 0) + Cargador de 20 balas de 7.62mm (Mk248 Mod 0) 7.62mm (Mk248 Mod 0) 7,62mm (Mk248 Mod 0) + 7.62mm (Mk248 Mod 0) Caliber: 7.62x67 mm NATO (Mk248 Mod 0)<br />Rounds: 20 Kaliber: 7,62x51 mm NATO (Mk248 Mod 0)<br />Pociski: 20 + Calibre: 7.62x67 mm NATO (Mk248 Mod 0)<br />Balas: 20 7.62mm 20Rnd Mag (Mk248 Mod 1) Magazynek 7,62mm 20rd (Mk248 Mod 1) + Cargador de 20 balas de 7.62mm (Mk248 Mod 1) 7.62mm (Mk248 Mod 1) 7,62mm (Mk248 Mod 1) + 7.62mm (Mk248 Mod 1) Caliber: 7.62x67 mm NATO (Mk248 Mod 1)<br />Rounds: 20 Kaliber: 7,62x67 mm NATO (Mk248 Mod 1)<br />Pociski: 20 + Calibre: 7.62x67 mm NATO (Mk248 Mod 1)<br />Balas: 20 7.62mm 20Rnd Mag (Berger Hybrid OTM) Magazynek 7,62mm 20rd (Berger Hybrid OTM) + Cargador de 20 balas de 7.62mm (Berger Hybrid OTM) 7.62mm (OTM) 7,62mm (OTM) + 7.62mm (OTM) Caliber: 7.62x67 mm NATO (Berger Hybrid OTM)<br />Rounds: 20 Kaliber: 7,62x67 mm NATO (Berger Hybrid OTM)<br />Pociski: 20 + Calibre: 7.62x67 mm NATO (Berger Hybrid OTM)<br />Balas: 20 6.5x47mm 30Rnd Mag (HPBT Scenar) + Cargador de 30 balas de 6.5x47mm (HPBT Scenar) 6.5mm Scenar + 6.5mm Scenar Caliber: 6.5x47mm (HPBT Scenar)<br />Rounds: 30 + Calibre: 6.5x47mm (HPBT Scenar)<br />Balas: 30 8.6x70mm 10Rnd Mag (300gr Sierra MatchKing HPBT) + Cargador de 10 balas de 8.6x70mm (300gr Sierra MatchKing HPBT) .338 (HPBT) + .338 (HPBT) Caliber: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />Rounds: 10 + Calibre: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />Balas: 10 - + \ No newline at end of file diff --git a/addons/javelin/stringtable.xml b/addons/javelin/stringtable.xml index f41adba0e3..961ef1bb68 100644 --- a/addons/javelin/stringtable.xml +++ b/addons/javelin/stringtable.xml @@ -1,4 +1,5 @@  + @@ -9,6 +10,7 @@ Namierz cel (przytrzymaj) Verrouiller cible (maintenir) Célpontra állás (Lenyomva tartott) + Fijar objetivo (Mantener) Cycle Fire Mode @@ -18,6 +20,7 @@ Przełącz tryb ognia Cycle mode de tir Tüzelési mód váltása + Cambiar modo de disparo - + \ No newline at end of file diff --git a/addons/kestrel4500/stringtable.xml b/addons/kestrel4500/stringtable.xml index e9a72d82a8..17bfacbffc 100644 --- a/addons/kestrel4500/stringtable.xml +++ b/addons/kestrel4500/stringtable.xml @@ -17,27 +17,33 @@ Kestrel 4500 Pocket Weather Tracker Anemomentr skrzydełkowy Kestrel 4500 + Kestrel 4500 Pocket Weather Tracker Open Kestrel 4500 Otwórz Kestrel 4500 Kestrel 4500 elővétele + Abrir Kestrel 4500 Show Kestrel 4500 Pokaż Kestrel 4500 + Mostrar Kestrel 4500 Hide Kestrel 4500 Ukryj Kestrel 4500 + Esconder Kestrel 4500 Open Kestrel 4500 Otwórz Kestrel 4500 + Abrir Kestrel 4500 Show Kestrel 4500 Pokaż Kestrel 4500 + Mostrar Kestrel 4500 - + \ No newline at end of file diff --git a/addons/laserpointer/stringtable.xml b/addons/laserpointer/stringtable.xml index 5d7aa03c67..7d1c3393e8 100644 --- a/addons/laserpointer/stringtable.xml +++ b/addons/laserpointer/stringtable.xml @@ -1,4 +1,5 @@  + @@ -47,16 +48,19 @@ Laser Laser Laser + Laser IR Laser IR-Laser Laser IR + Laser IR Switch Laser / IR Laser Umschalten Laser / IR-Laser Przełącz Laser / Laser IR + Cambiar Laser / Laser IR - + \ No newline at end of file diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 8547a36eae..af7bc08eba 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -1,4 +1,5 @@  + @@ -1391,61 +1392,73 @@ Heavily wounded Schwer verwundet: Ciężko ranny + Gravemente herido Lightly wounded Leicht verwundet: Lekko ranny + Levemente herido Very lightly wounded Sehr leicht verwundet: B. lekko ranny + Muy levemente herido Head Kopf Głowa + Cabeza Torso Torso Tors + Torso Left Arm Linker Arm Lewe ramię + Brazo izquierdo Right Arm Rechter Arm Prawe ramię + Brazo derecho Left Leg Linkes Bein Lewa noga + Pierna izquierda Right Leg Rechtes Bein Prawa noga + Pierna derecha Pain Effect Type Schmerzeffekt-Typ Rodzaj efektu bólu + Tipo de efecto de dolor Colour Flashing Farbblinken Pulsujące kolory + Parpadeo de color Chromatic Aberration Chromatische Aberration Aberracja chromatyczna + Aberración cromática - + \ No newline at end of file diff --git a/addons/scopes/stringtable.xml b/addons/scopes/stringtable.xml index 9e070efa73..548e5d6642 100644 --- a/addons/scopes/stringtable.xml +++ b/addons/scopes/stringtable.xml @@ -1,41 +1,51 @@  + Minor adjustment up Zerowanie powoli w górę + Ajuste menor arriba Minor adjustment down Zerowanie powoli w dół + Ajuste menor abajo Minor adjustment right Zerowanie powoli w prawo + Ajuste menor derecha Minor adjustment left Zerowanie powoli w lewo + Ajuste menor izquierda Major adjustment up Zerowanie w górę + Ajuste mayor arriba Major adjustment down Zerowanie w dół + Ajuste mayor abajo Major adjustment right Zerowanie w prawo + Ajuste mayor derecha Major adjustment left Zerowanie w lewo + Ajuste mayor izquierda Set zero adjustment Zresetuj wyzerowanie + Establecer ajuste a cero - + \ No newline at end of file diff --git a/addons/weather/stringtable.xml b/addons/weather/stringtable.xml index 4827751c6b..41259ec8cc 100644 --- a/addons/weather/stringtable.xml +++ b/addons/weather/stringtable.xml @@ -5,6 +5,7 @@ Show Wind Info Pokaż inf. o wietrze + Mostrar información del viento \ No newline at end of file From ad67fca8f4f8066e2ff898cda58003f4273dc8b1 Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 15 Apr 2015 17:45:48 +0200 Subject: [PATCH 058/305] Update stringtable.xml --- addons/interaction/stringtable.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index ce18f514f4..dd63efef07 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -578,7 +578,7 @@ Připojil ses do %1 týmu Вы присоединились к группе %1 Você uniu-se à Equipe %1 - Sei entrato nella team %1 + Sei entrato nel team %1 Csatlakoztál a %1 csapathoz From ead2b1f06447d2494c17d6813a7802fb7b23ffca Mon Sep 17 00:00:00 2001 From: Marco Date: Wed, 15 Apr 2015 17:52:12 +0200 Subject: [PATCH 059/305] Update AUTHORS.txt --- AUTHORS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.txt b/AUTHORS.txt index 34feb3838f..e2930ee461 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -67,6 +67,7 @@ rakowozz Raspu86 Riccardo Petricca Robert Boklahánics +ramius86 simon84 Sniperwolf572 Tonic From a3965424b9fdce9d7c1aa509331589727604fd93 Mon Sep 17 00:00:00 2001 From: ruPaladin Date: Wed, 15 Apr 2015 19:09:10 +0300 Subject: [PATCH 060/305] addons/medical translation to Russian --- addons/medical/stringtable.xml | 37 +++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 8547a36eae..ea69c1c722 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -74,6 +74,7 @@ Aplikovat škrtidlo Załóż stazę Appliquer un garrot + Наложить жгут Bandage @@ -165,7 +166,7 @@ Inyectando Morfina ... Wstrzykiwanie morfiny ... Aplikuji morfin ... - Введение морфина... + Введение морфина ... Injection de Morphine... Morfium beadása ... Injetando Morfina ... @@ -177,7 +178,7 @@ Inyectando Epinefrina ... Wstrzykiwanie adrenaliny ... Aplikuji adrenalin ... - Введение адреналина... + Введение адреналина ... Injection d'Adrénaline ... Epinefrin beadása ... Injetando Epinefrina ... @@ -190,7 +191,7 @@ Aplikuji atropin ... Wstrzykiwanie atropiny ... Injection d'Atropine ... - Введение атропина... + Введение атропина ... Atropin beadása ... @@ -199,7 +200,7 @@ Transfusión de sangre ... Przetaczanie krwi ... Probíhá transfúze krve ... - Переливание крови... + Переливание крови ... Transfusion Sanguine ... Infúzió vérrel ... Transfundindo Sangue ... @@ -212,7 +213,7 @@ Probíha transfúze fyziologický roztoku ... Przetaczanie solanki ... Transfusion de saline ... - Переливание физраствора... + Переливание физраствора ... Infúzió sós vizzel ... @@ -222,7 +223,7 @@ Probíha transfúze plazmy ... Przetaczanie osocza ... Transfusion de Plasma ... - Переливание плазмы... + Переливание плазмы ... Infúzió vérplazmával ... @@ -235,7 +236,7 @@ Sto applicando la benda ... Bekötözés ... Atando ... - Перевязывание... + Перевязывание ... Applying Tourniquet ... @@ -244,7 +245,7 @@ Aplikuji škrtidlo Zakładanie stazy ... Mise en place du Garrot ... - Наложение жгута... + Наложение жгута ... Érszorító felhelyezése ... @@ -1014,7 +1015,7 @@ Checking Blood Pressure.. Mesure de la tension ... - Проверка артериального давления... + Проверка артериального давления ... Comprobando presión arterial... Sprawdzanie ciśnienia krwi... Blutdruck kontrollieren... @@ -1093,7 +1094,7 @@ Checking Heart Rate.. Vérification du rythme cardiaque ... - Проверка пульса... + Проверка пульса ... Comprobando ritmo cardíaco... Sprawdzanie tętna... Kontrolliere Herzfrequenz @@ -1182,7 +1183,7 @@ %1 is not responsive - %1 не реагирует + %1 не реагирует на раздражители %1 est inconscient %1 no reacciona %1 jest nieprzytomny @@ -1350,7 +1351,7 @@ Placing body in bodybag Colocando cuerpo en bolsa para cadáveres - Упаковка тела + Упаковка тела ... Pakowanie ciała do worka na zwłoki Placement du corps dans la housse Test hullazsákba helyezése ... @@ -1391,61 +1392,73 @@ Heavily wounded Schwer verwundet: Ciężko ranny + Сильно ранен Lightly wounded Leicht verwundet: Lekko ranny + Легко ранен Very lightly wounded Sehr leicht verwundet: B. lekko ranny + Очень легко ранен Head Kopf Głowa + Голова Torso Torso Tors + Торс Left Arm Linker Arm Lewe ramię + Левая рука Right Arm Rechter Arm Prawe ramię + Правая рука Left Leg Linkes Bein Lewa noga + Левая нога Right Leg Rechtes Bein Prawa noga + Правая нога Pain Effect Type Schmerzeffekt-Typ Rodzaj efektu bólu + Вид боли Colour Flashing Farbblinken Pulsujące kolory + Разноцветные вспышки Chromatic Aberration Chromatische Aberration Aberracja chromatyczna + Хроматическая аберрация From c793df48486e6f59867bfa5aadeea9f8580f77fe Mon Sep 17 00:00:00 2001 From: jaynus Date: Wed, 15 Apr 2015 09:10:00 -0700 Subject: [PATCH 061/305] Changed: Safety mode on Titan, it now doesnt show as unloaded Fixed: Some TOP shots would miss, Fixed: Lock constraints would show on fast weapon switch. --- addons/javelin/CfgEventhandlers.hpp | 6 ++ addons/javelin/RscInGameUI.hpp | 2 +- addons/javelin/XEH_pre_init.sqf | 1 + addons/javelin/functions/fnc_onFired.sqf | 18 ++++++ addons/javelin/functions/fnc_onOpticDraw.sqf | 58 +++++++++++++------ addons/javelin/functions/fnc_onOpticLoad.sqf | 3 +- .../javelin/functions/fnc_onOpticUnload.sqf | 20 +++++++ .../functions/fnc_attackProfile_JAV_TOP.sqf | 5 +- 8 files changed, 92 insertions(+), 21 deletions(-) create mode 100644 addons/javelin/functions/fnc_onFired.sqf create mode 100644 addons/javelin/functions/fnc_onOpticUnload.sqf diff --git a/addons/javelin/CfgEventhandlers.hpp b/addons/javelin/CfgEventhandlers.hpp index 2c44a05e3a..ae7f95b232 100644 --- a/addons/javelin/CfgEventhandlers.hpp +++ b/addons/javelin/CfgEventhandlers.hpp @@ -9,4 +9,10 @@ class Extended_PostInit_EventHandlers { init = QUOTE(call COMPILE_FILE(XEH_post_init)); clientInit = QUOTE(call COMPILE_FILE(XEH_clientInit)); }; +}; + +class Extended_FiredBIS_EventHandlers { + class All { + ADDON = QUOTE(_this call FUNC(onFired)); + }; }; \ No newline at end of file diff --git a/addons/javelin/RscInGameUI.hpp b/addons/javelin/RscInGameUI.hpp index 8b33c95c01..d845c1d00b 100644 --- a/addons/javelin/RscInGameUI.hpp +++ b/addons/javelin/RscInGameUI.hpp @@ -14,7 +14,7 @@ class RscInGameUI { idd = 300; controls[] = { "ACE_javelin_elements_group", "ACE_Targeting" }; //, "ACE_TargetingConstrains", "ACE_TargetingGate", "ACE_TargetingLines"}; onLoad = QUOTE(_this call FUNC(onOpticLoad)); - onUnload = "uiNameSpace setVariable ['ACE_RscOptics_javelin',nil];uiNameSpace setVariable ['ACE_RscOptics_javelin_PFH',nil];"; + onUnload = QUOTE(_this call FUNC(onOpticUnload)); class ACE_javelin_elements_group: RscControlsGroup { diff --git a/addons/javelin/XEH_pre_init.sqf b/addons/javelin/XEH_pre_init.sqf index 2b2e980191..1accd4a8f4 100644 --- a/addons/javelin/XEH_pre_init.sqf +++ b/addons/javelin/XEH_pre_init.sqf @@ -6,6 +6,7 @@ PREP(lockKeyUp); PREP(cycleFireMode); PREP(showFireMode); +PREP(onFired); PREP(onOpticLoad); PREP(onOpticDraw); diff --git a/addons/javelin/functions/fnc_onFired.sqf b/addons/javelin/functions/fnc_onFired.sqf new file mode 100644 index 0000000000..fde0f94365 --- /dev/null +++ b/addons/javelin/functions/fnc_onFired.sqf @@ -0,0 +1,18 @@ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" + +PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); + +// Bail on not missile +if(! (_weapon in ["launch_Titan_short_F"]) ) exitWith { false }; + +_pfh_handle = uiNamespace getVariable ["ACE_RscOptics_javelin_PFH", nil]; +if(!isNil "_pfh_handle") then { + //[_pfh_handle] call cba_fnc_removePerFrameHandler; + //uiNamespace setVariable["ACE_RscOptics_javelin_PFH", nil]; + + __JavelinIGUITargeting ctrlShow false; + __JavelinIGUITargetingGate ctrlShow false; + __JavelinIGUITargetingLines ctrlShow false; + __JavelinIGUITargetingConstraints ctrlShow false; +}; \ No newline at end of file diff --git a/addons/javelin/functions/fnc_onOpticDraw.sqf b/addons/javelin/functions/fnc_onOpticDraw.sqf index 85877f1f16..3a64a36802 100644 --- a/addons/javelin/functions/fnc_onOpticDraw.sqf +++ b/addons/javelin/functions/fnc_onOpticDraw.sqf @@ -11,18 +11,6 @@ TRACE_1("enter", _this); private["_isJavelin", "_args", "_lastTick", "_runTime", "_soundTime", "_lockTime", "_newTarget", "_currentTarget", "_range", "_pos", "_targetArray"]; -if( ! ([ (configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)) ), "launch_Titan_base"] call EFUNC(common,inheritsFrom)) - || { (vehicle ACE_player) != ACE_player } - ) exitWith { - __JavelinIGUITargeting ctrlShow false; - __JavelinIGUITargetingGate ctrlShow false; - __JavelinIGUITargetingLines ctrlShow false; - __JavelinIGUITargetingConstraints ctrlShow false; - - [(_this select 1)] call cba_fnc_removePerFrameHandler; - uiNamespace setVariable["ACE_RscOptics_javelin_PFH", nil]; -}; - // Reset arguments if we havnt rendered in over a second _args = uiNamespace getVariable[QGVAR(arguments), [] ]; if( (count _args) > 0) then { @@ -40,6 +28,21 @@ _runTime = _args select 2; _lockTime = _args select 3; _soundTime = _args select 4; _randomLockInterval = _args select 5; +_fireDisabledEH = _args select 6; + +if( ! ([ (configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)) ), "launch_Titan_base"] call EFUNC(common,inheritsFrom)) + || { (vehicle ACE_player) != ACE_player } + ) exitWith { + __JavelinIGUITargeting ctrlShow false; + __JavelinIGUITargetingGate ctrlShow false; + __JavelinIGUITargetingLines ctrlShow false; + __JavelinIGUITargetingConstraints ctrlShow false; + + _fireDisabledEH = [_fireDisabledEH] call FUNC(enableFire); + + [(_this select 1)] call cba_fnc_removePerFrameHandler; + uiNamespace setVariable["ACE_RscOptics_javelin_PFH", nil]; +}; // Find a target within the optic range _newTarget = objNull; @@ -106,6 +109,27 @@ if((call CBA_fnc_getFoV) select 1 > 9) then { __JavelinIGUIWFOV ctrlSetTextColor __ColorGreen; }; +FUNC(disableFire) = { + _firedEH = _this select 0; + + if(_firedEH < 0) then { + _firedEH = [ACE_player, "DefaultAction", {true}, { + _canFire = ACE_player getVariable["ace_missileguidance_target", nil]; + if(!isNil "_canFire") exitWith { false }; + true + }] call EFUNC(common,addActionEventHandler); + }; + _firedEH +}; +FUNC(enableFire) = { + _firedEH = _this select 0; + + if(_firedEH > 0) then { + [ACE_player, "DefaultAction", _firedEH] call EFUNC(common,removeActionEventHandler); + }; + -1 +}; + if (isNull _newTarget) then { // No targets found _currentTarget = objNull; @@ -120,8 +144,7 @@ if (isNull _newTarget) then { ACE_player setVariable ["ace_missileguidance_target",nil, false]; // Disallow fire - if (ACE_player ammo (currentWeapon ACE_player) > 0) then { ACE_player setWeaponReloadingTime [player, (currentWeapon ACE_player), 0.2]; }; - + _fireDisabledEH = [_fireDisabledEH] call FUNC(disableFire); } else { if (_newTarget distance ACE_player < 2500 && {(call CBA_fnc_getFoV) select 1 > 9} @@ -176,7 +199,7 @@ if (isNull _newTarget) then { ACE_player setVariable["ace_missileguidance_target", _currentTarget, false]; // Allow fire - ACE_player setWeaponReloadingTime [player, (currentWeapon ACE_player), 0]; + _fireDisabledEH = [_fireDisabledEH] call FUNC(enableFire); if(diag_tickTime > _soundTime) then { playSound "ACE_Javelin_Locked"; @@ -217,7 +240,7 @@ if (isNull _newTarget) then { _soundTime = diag_tickTime + 0.25; }; // Disallow fire - if (ACE_player ammo (currentWeapon ACE_player) > 0) then { ACE_player setWeaponReloadingTime [player, (currentWeapon ACE_player), 0.2]; }; + _fireDisabledEH = [_fireDisabledEH] call FUNC(disableFire); }; }; } else { @@ -234,7 +257,7 @@ if (isNull _newTarget) then { ACE_player setVariable ["ace_missileguidance_target",nil, false]; // Disallow fire - if (ACE_player ammo (currentWeapon ACE_player) > 0) then { ACE_player setWeaponReloadingTime [player, (currentWeapon ACE_player), 0.2]; }; + _fireDisabledEH = [_fireDisabledEH] call FUNC(disableFire); }; }; @@ -246,5 +269,6 @@ _args set[1, _currentTarget]; _args set[2, _runTime]; _args set[3, _lockTime]; _args set[4, _soundTime]; +_args set[6, _fireDisabledEH]; uiNamespace setVariable[QGVAR(arguments), _args ]; \ No newline at end of file diff --git a/addons/javelin/functions/fnc_onOpticLoad.sqf b/addons/javelin/functions/fnc_onOpticLoad.sqf index d38e1c3305..a2b2692859 100644 --- a/addons/javelin/functions/fnc_onOpticLoad.sqf +++ b/addons/javelin/functions/fnc_onOpticLoad.sqf @@ -25,7 +25,8 @@ uiNameSpace setVariable [QGVAR(arguments), 0, // Run Time 0, // Lock Time 0, // Sound timer - (random __LOCKONTIMERANDOM) // random lock time addition + (random __LOCKONTIMERANDOM), // random lock time addition + -1 ] ]; diff --git a/addons/javelin/functions/fnc_onOpticUnload.sqf b/addons/javelin/functions/fnc_onOpticUnload.sqf new file mode 100644 index 0000000000..38acc1cd1c --- /dev/null +++ b/addons/javelin/functions/fnc_onOpticUnload.sqf @@ -0,0 +1,20 @@ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" +TRACE_1("enter", _this); + +uiNameSpace setVariable ['ACE_RscOptics_javelin',nil]; + +_pfh = uiNamespace getVariable["ACE_RscOptics_javelin_PFH", nil ]; +if(!isNil "_pfh") then { + [_pfh] call CBA_fnc_removePerFrameHandler; + uiNameSpace setVariable ['ACE_RscOptics_javelin_PFH',nil]; +}; + +_args = uiNamespace getVariable[QGVAR(arguments), nil ]; +if(!isNil "_args") then { + _disableFireEH = _args select 6; + if(_disableFireEH > 0) then { + [ACE_player, "DefaultAction", _disableFireEH] call EFUNC(common,removeActionEventHandler); + }; + uiNameSpace setVariable [QGVAR(arguments),nil]; +}; diff --git a/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf b/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf index dc8b9b8e9d..fd86c2bf03 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf @@ -58,10 +58,11 @@ switch( (_state select 0) ) do { case STAGE_COAST: { TRACE_1("STAGE_COAST",""); TRACE_1("", ((ASLToATL _projectilePos) select 2) - (( ASLToATL _seekerTargetPos) select 2) ); - if(_distanceShooterToTarget < 1250 || _distanceToTarget < ( ((ASLToATL _projectilePos) select 2) - (( ASLToATL _seekerTargetPos) select 2) ) * 1.5) then { + if(_distanceToTarget < ( ((ASLToATL _projectilePos) select 2) - (( ASLToATL _seekerTargetPos) select 2) ) * 1.5) then { _state set[0, STAGE_TERMINAL]; + } else { + _returnTargetPos = _seekerTargetPos vectorAdd [0,0,(_projectilePos select 2)]; }; - _returnTargetPos = _seekerTargetPos vectorAdd [0,0,(_projectilePos select 2)]; }; case STAGE_TERMINAL: { TRACE_1("STAGE_TERMINAL",""); From 5923f246fdec8806f542b480fc05084c637833ca Mon Sep 17 00:00:00 2001 From: jaynus Date: Wed, 15 Apr 2015 09:25:19 -0700 Subject: [PATCH 062/305] Fixed: only exit on shooter. --- addons/javelin/functions/fnc_onFired.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/javelin/functions/fnc_onFired.sqf b/addons/javelin/functions/fnc_onFired.sqf index fde0f94365..e873e5cf3e 100644 --- a/addons/javelin/functions/fnc_onFired.sqf +++ b/addons/javelin/functions/fnc_onFired.sqf @@ -4,7 +4,7 @@ PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); // Bail on not missile -if(! (_weapon in ["launch_Titan_short_F"]) ) exitWith { false }; +if( _shooter != ACE_player || { ! (_weapon in ["launch_Titan_short_F"]) } ) exitWith { false }; _pfh_handle = uiNamespace getVariable ["ACE_RscOptics_javelin_PFH", nil]; if(!isNil "_pfh_handle") then { From 6ea38a9946a8fd2201989a4ffb568177e7b55e78 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 15 Apr 2015 11:34:27 -0500 Subject: [PATCH 063/305] Only check A3 VON if no radio mods running --- .../nametags/functions/fnc_initIsSpeaking.sqf | 49 ++++++++++--------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/addons/nametags/functions/fnc_initIsSpeaking.sqf b/addons/nametags/functions/fnc_initIsSpeaking.sqf index 95403e0894..d8ffda756c 100644 --- a/addons/nametags/functions/fnc_initIsSpeaking.sqf +++ b/addons/nametags/functions/fnc_initIsSpeaking.sqf @@ -36,32 +36,33 @@ if (!hasInterface) exitWith {}; }; }] call EFUNC(common,addEventHandler); -//PFEH to watch the internal VON icon -//Note: class RscDisplayVoiceChat {idd = 55}; //only present when talking -[{ - _oldSetting = ACE_player getVariable [QGVAR(isSpeakingInGame), false]; - _newSetting = (!(isNull findDisplay 55)); - if (!(_oldSetting isEqualTo _newSetting)) then { - ACE_player setVariable [QGVAR(isSpeakingInGame), _newSetting, true]; - }; -} , 0.1, []] call CBA_fnc_addPerFrameHandler; +if (isClass (configFile >> "cfgPatches" >> "acre_api")) then { + diag_log text format ["[ACE_nametags] - ACRE Detected"]; + DFUNC(isSpeaking) = { + PARAMS_1(_unit); + ([_unit] call acre_api_fnc_isSpeaking) || ([ACE_player] call acre_api_fnc_isBroadcasting) + }; +} else { + if (isClass (configFile >> "cfgPatches" >> "task_force_radio")) then { + diag_log text format ["[ACE_nametags] - TFR Detected"]; + DFUNC(isSpeaking) = { + PARAMS_1(_unit); + (_unit getVariable ["tf_isSpeaking", false]) + }; + } else { + //No Radio Mod - Start a PFEH to watch the internal VON icon + //Note: class RscDisplayVoiceChat {idd = 55} - only present when talking -DFUNC(isSpeaking) = switch (true) do { -case (isClass (configFile >> "cfgPatches" >> "acre_api")): { - { - PARAMS_1(_unit); - (_unit getVariable [QGVAR(isSpeakingInGame), false]) || ([_unit] call acre_api_fnc_isSpeaking) || ([ACE_player] call acre_api_fnc_isBroadcasting) - }; - }; -case (isClass (configFile >> "cfgPatches" >> "task_force_radio")): { - { - PARAMS_1(_unit); - (_unit getVariable [QGVAR(isSpeakingInGame), false]) || (_unit getVariable ["tf_isSpeaking", false]) - }; - }; - default { - { + [{ + _oldSetting = ACE_player getVariable [QGVAR(isSpeakingInGame), false]; + _newSetting = (!(isNull findDisplay 55)); + if (!(_oldSetting isEqualTo _newSetting)) then { + ACE_player setVariable [QGVAR(isSpeakingInGame), _newSetting, true]; + }; + } , 0.1, []] call CBA_fnc_addPerFrameHandler; + + DFUNC(isSpeaking) = { PARAMS_1(_unit); (_unit getVariable [QGVAR(isSpeakingInGame), false]) }; From e84689a7718eb6b4f17a8f5c0a61184867c62961 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 15 Apr 2015 11:46:01 -0500 Subject: [PATCH 064/305] #544 - Change ERROR warning to debug trace --- addons/captives/functions/fnc_setHandcuffed.sqf | 17 ++++++++--------- .../captives/functions/fnc_setSurrendered.sqf | 3 +-- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf index e992339186..5f134ab03b 100644 --- a/addons/captives/functions/fnc_setHandcuffed.sqf +++ b/addons/captives/functions/fnc_setHandcuffed.sqf @@ -29,11 +29,11 @@ if ((_unit getVariable [QGVAR(isHandcuffed), false]) isEqualTo _state) exitWith if (_state) then { _unit setVariable [QGVAR(isHandcuffed), true, true]; [_unit, QGVAR(Handcuffed), true] call EFUNC(common,setCaptivityStatus); - + if (_unit getVariable [QGVAR(isSurrendering), false]) then { //If surrendering, stop [_unit, false] call FUNC(setSurrendered); }; - + //Set unit cargoIndex (will be -1 if dismounted) _unit setVariable [QGVAR(CargoIndex), ((vehicle _unit) getCargoIndex _unit), true]; @@ -47,30 +47,29 @@ if (_state) then { if (_unit getVariable [QGVAR(isHandcuffed), false] && {vehicle _unit == _unit}) then { [_unit] call EFUNC(common,fixLoweredRifleAnimation); [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); - + //Adds an animation changed eh //If we get a change in animation then redo the animation (handles people vaulting to break the animation chain) _animChangedEHID = _unit addEventHandler ["AnimChanged", { PARAMS_2(_unit,_newAnimation); if ((_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") && {!(_unit getVariable ["ACE_isUnconscious", false])}) then { - ERROR("Handcuff animation interrupted"); - // systemChat format ["debug %2: new %1", _newAnimation, time]; + TRACE_1("Handcuff animation interrupted",_newAnimation); [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); }; }]; _unit setVariable [QGVAR(handcuffAnimEHID), _animChangedEHID]; - + }; }, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute); } else { _unit setVariable [QGVAR(isHandcuffed), false, true]; [_unit, QGVAR(Handcuffed), false] call EFUNC(common,setCaptivityStatus); - - //remove AnimChanged EH + + //remove AnimChanged EH _animChangedEHID = _unit getVariable [QGVAR(handcuffAnimEHID), -1]; _unit removeEventHandler ["AnimChanged", _animChangedEHID]; _unit setVariable [QGVAR(handcuffAnimEHID), -1]; - + if (((vehicle _unit) == _unit) && {!(_unit getVariable ["ACE_isUnconscious", false])}) then { //Break out of hands up animation loop [_unit, "ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); diff --git a/addons/captives/functions/fnc_setSurrendered.sqf b/addons/captives/functions/fnc_setSurrendered.sqf index 30f9105511..d774e7f6e0 100644 --- a/addons/captives/functions/fnc_setSurrendered.sqf +++ b/addons/captives/functions/fnc_setSurrendered.sqf @@ -51,8 +51,7 @@ if (_state) then { _animChangedEHID = _unit addEventHandler ["AnimChanged", { PARAMS_2(_unit,_newAnimation); if ((_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") && {!(_unit getVariable ["ACE_isUnconscious", false])}) then { - ERROR("Surrender animation interrupted"); - // systemChat format ["debug %2: new %1", _newAnimation, time]; + TRACE_1("Surrender animation interrupted",_newAnimation); [_unit, "ACE_AmovPercMstpSsurWnonDnon", 1] call EFUNC(common,doAnimation); }; }]; From 252fb671190fc8412983502d8f387109add299a9 Mon Sep 17 00:00:00 2001 From: ruPaladin Date: Wed, 15 Apr 2015 19:50:32 +0300 Subject: [PATCH 065/305] Update stringtable.xml --- addons/explosives/stringtable.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/explosives/stringtable.xml b/addons/explosives/stringtable.xml index 05410e621e..c34b6d3cc6 100644 --- a/addons/explosives/stringtable.xml +++ b/addons/explosives/stringtable.xml @@ -497,6 +497,7 @@ Podnieś Ramasser Felszedés + Поднять From d8eb564c654e56335e04f4e520163eba14010964 Mon Sep 17 00:00:00 2001 From: ruPaladin Date: Wed, 15 Apr 2015 19:52:29 +0300 Subject: [PATCH 066/305] Update stringtable.xml --- addons/overheating/stringtable.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/addons/overheating/stringtable.xml b/addons/overheating/stringtable.xml index 3aaeebdb00..4bb91688fa 100644 --- a/addons/overheating/stringtable.xml +++ b/addons/overheating/stringtable.xml @@ -15,7 +15,7 @@ Display a notification whenever your weapon gets jammed Zeige einen Hinweis, wenn die Waffe eine Ladehemmung hat. Mostrar notificación cada vez que el arma se encasquille - Демонстровать уведомление, каждый раз, когда клинит Ваше оружие. + Показывать уведомление каждый раз, когда клинит Ваше оружие. Zobrazí upozornění při zaseknutí zbraně Wyświetl powiadomienie za każdym razem, kiedy Twoja broń ulegnie zacięciu Affiche une notification lors d'un enrayement @@ -100,7 +100,7 @@ Wymienianie lufy... Vyměňuji hlaveň ... Changement du canon... - Смена ствола... + Смена ствола ... Cső kicserélése folyamatban... Substituindo cano... Sto sostituendo la canna ... @@ -136,6 +136,7 @@ Zkontrolovat teplotu zbraně Vérifier la température Fegyverhő ellenőrzése + Проверить температуру оружия Checking temperature ... From 7051152d934770e858d505c6db534ef1510dfa5e Mon Sep 17 00:00:00 2001 From: ruPaladin Date: Wed, 15 Apr 2015 19:53:42 +0300 Subject: [PATCH 067/305] Update stringtable.xml --- addons/disarming/stringtable.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/disarming/stringtable.xml b/addons/disarming/stringtable.xml index 508c9f1d3d..ee121d0480 100644 --- a/addons/disarming/stringtable.xml +++ b/addons/disarming/stringtable.xml @@ -7,6 +7,7 @@ Otwórz ekwipunek Otevřít inventář Abrir inventario + Открыть инвентарь From 64d6bbaf2607016b80d027e10a8bb8b435ba5ec6 Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 15 Apr 2015 18:55:20 +0200 Subject: [PATCH 068/305] Fixed an incorrect BC in an ATragMX gun profile --- addons/atragmx/XEH_postInit.sqf | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/addons/atragmx/XEH_postInit.sqf b/addons/atragmx/XEH_postInit.sqf index 31c526fab7..61bbf8b845 100644 --- a/addons/atragmx/XEH_postInit.sqf +++ b/addons/atragmx/XEH_postInit.sqf @@ -6,16 +6,16 @@ if (count (profileNamespace getVariable ["ACE_ATragMX_gunList", []]) > 0) then { GVAR(gunList) = profileNamespace getVariable "ACE_ATragMX_gunList"; } else { // Profile Name, Muzzle Velocity, Zero Range, Scope Base Angle, AirFriction, Bore Height, Scope Unit, Elevation Scope Step, Windage Scope Step, Maximum Elevation, Dialed Elevation, Dialed Windage, Mass, Ammo Class Name, Magazine Class Name, BC, Drag Model, Atmosphere Model - GVAR(gunList) = [["12.7x108mm" , 820, 100, 0.0659, -0.0008600, 3.81, 0, 0.338, 0.338, 120, 0, 0, 48.28, "B_127x108_Ball" , "5Rnd_127x108_Mag" , 0.700, 1, "ASM" ], - ["12.7x99mm" , 880, 100, 0.0607, -0.0008600, 3.81, 0, 0.338, 0.338, 120, 0, 0, 41.92, "B_127x99_Ball" , "5Rnd_mas_127x99_Stanag" , 0.670, 1, "ASM" ], - ["12.7x54mm" , 290, 100, 0.3913, -0.0014000, 3.81, 0, 0.338, 0.338, 120, 0, 0, 61.56, "B_127x54_Ball" , "10Rnd_127x54_Mag" , 1.050, 1, "ASM" ], - ["10.4x77mm" , 910, 100, 0.0572, -0.0004800, 3.81, 0, 0.338, 0.338, 120, 0, 0, 27.15, "B_408_Ball" , "7Rnd_408_Mag" , 0.970, 1, "ASM" ], - ["9.3×64mm" , 870, 100, 0.0632, -0.0007500, 3.81, 0, 0.338, 0.338, 120, 0, 0, 16.20, "B_93x64_Ball" , "10Rnd_93x64_DMR_05_Mag" , 0.368, 1, "ASM" ], - ["8.6×70mm" , 915, 100, 0.0572, -0.0006100, 3.81, 0, 0.338, 0.338, 120, 0, 0, 16.20, "B_338_Ball" , "10Rnd_338_Mag" , 0.322, 7, "ICAO"], - ["7.62x51mm" , 850, 100, 0.0639, -0.0010000, 3.81, 0, 0.338, 0.338, 120, 0, 0, 9.460, "B_762x51_Ball" , "20Rnd_762x51_Mag" , 0.393, 1, "ICAO"], - ["6.5x39mm" , 800, 100, 0.0689, -0.0009000, 3.81, 0, 0.338, 0.338, 120, 0, 0, 7.776, "B_65x39_Caseless", "30Rnd_65x39_caseless_mag", 0.263, 1, "ICAO"], - ["5.56x45mm" , 920, 100, 0.0584, -0.0012650, 3.81, 0, 0.338, 0.338, 120, 0, 0, 4.000, "B_556x45_Ball" , "30Rnd_556x45_Stanag" , 0.304, 1, "ASM" ], - ["5.56x45mm Mk262" , 850, 100, 0.0643, -0.0011250, 3.81, 0, 0.338, 0.338, 120, 0, 0, 4.990, "RH_556x45_Mk262" , "RH_30Rnd_556x45_Mk262" , 0.361, 1, "ASM" ]]; + GVAR(gunList) = [["12.7x108mm" , 820, 100, 0.0659, -0.0008600, 3.81, 0, 0.338, 0.338, 120, 0, 0, 48.28, "B_127x108_Ball" , "5Rnd_127x108_Mag" , 0.630, 1, "ASM" ], + ["12.7x99mm" , 880, 100, 0.0607, -0.0008600, 3.81, 0, 0.338, 0.338, 120, 0, 0, 41.92, "B_127x99_Ball" , "5Rnd_mas_127x99_Stanag" , 0.670, 1, "ASM" ], + ["12.7x54mm" , 290, 100, 0.3913, -0.0014000, 3.81, 0, 0.338, 0.338, 120, 0, 0, 61.56, "B_127x54_Ball" , "10Rnd_127x54_Mag" , 1.050, 1, "ASM" ], + ["10.4x77mm" , 910, 100, 0.0572, -0.0004800, 3.81, 0, 0.338, 0.338, 120, 0, 0, 27.15, "B_408_Ball" , "7Rnd_408_Mag" , 0.970, 1, "ASM" ], + ["9.3×64mm" , 870, 100, 0.0632, -0.0007500, 3.81, 0, 0.338, 0.338, 120, 0, 0, 16.20, "B_93x64_Ball" , "10Rnd_93x64_DMR_05_Mag" , 0.368, 1, "ASM" ], + ["8.6×70mm" , 915, 100, 0.0572, -0.0006100, 3.81, 0, 0.338, 0.338, 120, 0, 0, 16.20, "B_338_Ball" , "10Rnd_338_Mag" , 0.322, 7, "ICAO"], + ["7.62x51mm" , 850, 100, 0.0639, -0.0010000, 3.81, 0, 0.338, 0.338, 120, 0, 0, 9.460, "B_762x51_Ball" , "20Rnd_762x51_Mag" , 0.393, 1, "ICAO"], + ["6.5x39mm" , 800, 100, 0.0689, -0.0009000, 3.81, 0, 0.338, 0.338, 120, 0, 0, 7.776, "B_65x39_Caseless" , "30Rnd_65x39_caseless_mag" , 0.263, 1, "ICAO"], + ["5.56x45mm" , 920, 100, 0.0584, -0.0012650, 3.81, 0, 0.338, 0.338, 120, 0, 0, 4.000, "B_556x45_Ball" , "30Rnd_556x45_Stanag" , 0.304, 1, "ASM" ], + ["5.56x45mm Mk262" , 850, 100, 0.0643, -0.0011250, 3.81, 0, 0.338, 0.338, 120, 0, 0, 4.990, "ACE_556x45_Ball_Mk262" , "ACE_30Rnd_556x45_Stanag_Mk262_mag", 0.361, 1, "ASM" ]]; profileNamespace setVariable ["ACE_ATragMX_gunList", GVAR(gunList)]; }; From ea2281616ea1675c8e632877dc098f8c5dd8eb6a Mon Sep 17 00:00:00 2001 From: jaynus Date: Wed, 15 Apr 2015 09:55:40 -0700 Subject: [PATCH 069/305] Enable all variants of Titan. Can now vanilla-lock in cadet mode. --- addons/javelin/CfgWeapons.hpp | 3 +++ addons/javelin/functions/fnc_onFired.sqf | 4 +++- addons/javelin/functions/fnc_onOpticDraw.sqf | 4 +--- addons/missileguidance/CfgAmmo.hpp | 4 ++++ addons/missileguidance/functions/fnc_onFired.sqf | 5 ++--- 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/addons/javelin/CfgWeapons.hpp b/addons/javelin/CfgWeapons.hpp index cef967e32e..4e7091c653 100644 --- a/addons/javelin/CfgWeapons.hpp +++ b/addons/javelin/CfgWeapons.hpp @@ -8,6 +8,9 @@ class CfgWeapons { weaponInfoType = "ACE_RscOptics_javelin"; modelOptics = PATHTOF(data\reticle_titan.p3d); + canLock = 1; + + lockingTargetSound[] = {"",0,1}; lockedTargetSound[] = {"",0,1}; }; diff --git a/addons/javelin/functions/fnc_onFired.sqf b/addons/javelin/functions/fnc_onFired.sqf index e873e5cf3e..04a023c9d8 100644 --- a/addons/javelin/functions/fnc_onFired.sqf +++ b/addons/javelin/functions/fnc_onFired.sqf @@ -4,7 +4,9 @@ PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); // Bail on not missile -if( _shooter != ACE_player || { ! (_weapon in ["launch_Titan_short_F"]) } ) exitWith { false }; +if( _shooter != ACE_player) exitWith { false }; + +if( ! ([ (configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)) ), "launch_Titan_base"] call EFUNC(common,inheritsFrom)) ) exitWith { }; _pfh_handle = uiNamespace getVariable ["ACE_RscOptics_javelin_PFH", nil]; if(!isNil "_pfh_handle") then { diff --git a/addons/javelin/functions/fnc_onOpticDraw.sqf b/addons/javelin/functions/fnc_onOpticDraw.sqf index 3a64a36802..358b68ebc1 100644 --- a/addons/javelin/functions/fnc_onOpticDraw.sqf +++ b/addons/javelin/functions/fnc_onOpticDraw.sqf @@ -30,9 +30,7 @@ _soundTime = _args select 4; _randomLockInterval = _args select 5; _fireDisabledEH = _args select 6; -if( ! ([ (configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)) ), "launch_Titan_base"] call EFUNC(common,inheritsFrom)) - || { (vehicle ACE_player) != ACE_player } - ) exitWith { +if( ! ([ (configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)) ), "launch_Titan_base"] call EFUNC(common,inheritsFrom)) ) exitWith { __JavelinIGUITargeting ctrlShow false; __JavelinIGUITargetingGate ctrlShow false; __JavelinIGUITargetingLines ctrlShow false; diff --git a/addons/missileguidance/CfgAmmo.hpp b/addons/missileguidance/CfgAmmo.hpp index a05ecee9bc..3b74c87065 100644 --- a/addons/missileguidance/CfgAmmo.hpp +++ b/addons/missileguidance/CfgAmmo.hpp @@ -50,6 +50,8 @@ class CfgAmmo { //maxDeflection = 0.5; //incDeflection = 0.005; + canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode + // Guidance type for munitions defaultSeekerType = "SALH"; seekerTypes[] = { "SALH", "LIDAR", "SARH", "Optic", "Thermal", "GPS", "SACLOS", "MCLOS" }; @@ -120,6 +122,8 @@ class CfgAmmo { //maxDeflection = 0.5; //incDeflection = 0.005; + canVanillaLock = 0; + // Guidance type for munitions defaultSeekerType = "Optic"; seekerTypes[] = { "Optic" }; diff --git a/addons/missileguidance/functions/fnc_onFired.sqf b/addons/missileguidance/functions/fnc_onFired.sqf index 186a622417..ad713d8884 100644 --- a/addons/missileguidance/functions/fnc_onFired.sqf +++ b/addons/missileguidance/functions/fnc_onFired.sqf @@ -41,15 +41,14 @@ if ( isNil "_lockMode" || { ! ( _lockMode in (getArray (_config >> "seekerLockMo // If we didn't get a target, try to fall back on tab locking if(isNil "_target") then { - if(!isPlayer _shooter) then { // This was an AI shot, lets still guide it on the AI target _target = _shooter getVariable[QGVAR(vanilla_target), nil]; TRACE_1("Detected AI Shooter!", _target); } else { _canUseLock = getNumber (_config >> "canVanillaLock"); - if(_canUseLock > 0) then { - // @TODO: Get vanilla target + // @TODO: Get vanilla target + if(_canUseLock > 0 || cadetMode) then { _vanillaTarget = cursorTarget; TRACE_1("Using Vanilla Locking", _vanillaTarget); From 3773238e25ef2ac717e0e1b9e1db3c95c3f5be1d Mon Sep 17 00:00:00 2001 From: ruPaladin Date: Wed, 15 Apr 2015 19:56:34 +0300 Subject: [PATCH 070/305] Update stringtable.xml --- addons/atragmx/stringtable.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/addons/atragmx/stringtable.xml b/addons/atragmx/stringtable.xml index 6b6a921c2a..1468632a9b 100644 --- a/addons/atragmx/stringtable.xml +++ b/addons/atragmx/stringtable.xml @@ -17,14 +17,17 @@ Open ATragMX Otwórz ATragMX + Открыть ATragMX Rugged PDA with ATragMX Przenośny PDA z kalkulatorem balistycznym ATragMX + Защищенный КПК с ATragMX Open ATragMX Otwórz ATragMX + Открыть ATragMX - \ No newline at end of file + From e0c34f22bf59230174df93142f3f0b102a9ab4bb Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 15 Apr 2015 18:59:11 +0200 Subject: [PATCH 071/305] Added ACE_338_Ball_API526 and updated some airFriction values --- addons/ballistics/CfgAmmo.hpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 87f3a99df1..8e75e6ce03 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -502,8 +502,6 @@ class CfgAmmo { class ACE_338_Ball : B_338_Ball { airFriction=-0.000526; caliber=1.55; - deflecting=12; - hit=20; typicalSpeed=826; ACE_caliber=0.338; ACE_bulletLength=1.70; @@ -516,6 +514,21 @@ class CfgAmmo { ACE_muzzleVelocities[]={800, 820, 826, 830}; ACE_barrelLengths[]={20, 24, 26.5, 28}; }; + class ACE_338_Ball_API526 : B_338_Ball { + airFriction=-0.000526; + caliber=2.4; + typicalSpeed=826; + ACE_caliber=0.338; + ACE_bulletLength=1.535; + ACE_bulletMass=253; + 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.290}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={880, 915, 925}; + ACE_barrelLengths[]={20, 26, 28}; + }; class B_127x54_Ball : BulletBase { airFriction=-0.00014; typicalSpeed=300; @@ -545,6 +558,8 @@ class CfgAmmo { ACE_barrelLengths[]={29}; }; class ACE_127x99_Ball_AMAX : B_127x99_Ball { + airFriction=-0.000374; + typicalSpeed=860; ACE_caliber=0.510; ACE_bulletLength=2.540; ACE_bulletMass=750; @@ -557,6 +572,7 @@ class CfgAmmo { ACE_barrelLengths[]={29}; }; class B_127x108_Ball : BulletBase { + airFriction=-0.00064; typicalSpeed=820; ACE_caliber=0.511; ACE_bulletLength=2.520; From f8061922f7d4857e52c93bacb6c1b51de57aa002 Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 15 Apr 2015 18:59:41 +0200 Subject: [PATCH 072/305] Added ACE_10Rnd_338_API526_Mag, ACE_5Rnd_127x99_Mag, ACE_5Rnd_127x99_AMAX_Mag --- addons/ballistics/CfgMagazines.hpp | 27 ++++++++++++++++++ addons/ballistics/CfgVehicles.hpp | 16 +++++++++++ addons/ballistics/stringtable.xml | 46 ++++++++++++++++++------------ 3 files changed, 71 insertions(+), 18 deletions(-) diff --git a/addons/ballistics/CfgMagazines.hpp b/addons/ballistics/CfgMagazines.hpp index de3f80fd83..7a97b3609e 100644 --- a/addons/ballistics/CfgMagazines.hpp +++ b/addons/ballistics/CfgMagazines.hpp @@ -171,6 +171,33 @@ class CfgMagazines { descriptionShort = "$STR_ACE_10Rnd_338_300gr_HPBT_Mag_Description"; initSpeed = 800; }; + class ACE_10Rnd_338_API526_Mag: 10Rnd_338_Mag { + author = "$STR_ACE_Common_ACETeam"; + ammo = "ACE_338_Ball_API526"; + displayName = "$STR_ACE_10Rnd_338_API526_Mag_Name"; + displayNameShort = "$STR_ACE_10Rnd_338_API526_Mag_NameShort"; + descriptionShort = "$STR_ACE_10Rnd_338_API526_Mag_Description"; + initSpeed = 880; + }; + + class 5Rnd_127x108_Mag; + class ACE_5Rnd_127x99_Mag: 5Rnd_127x108_Mag { + author = "$STR_ACE_Common_ACETeam"; + ammo = "B_127x99_Ball"; + displayName = "$STR_ACE_5Rnd_127x99_Mag_Name"; + displayNameShort = "$STR_ACE_5Rnd_127x99_Mag_NameShort"; + descriptionShort = "$STR_ACE_5Rnd_127x99_Mag_Description"; + initSpeed = 853; + }; + class ACE_5Rnd_127x99_AMAX_Mag: 5Rnd_127x108_Mag { + author = "$STR_ACE_Common_ACETeam"; + ammo = "ACE_127x99_Ball_AMAX"; + displayName = "$STR_ACE_5Rnd_127x99_AMAX_Mag_Name"; + displayNameShort = "$STR_ACE_5Rnd_127x99_AMAX_Mag_NameShort"; + descriptionShort = "$STR_ACE_5Rnd_127x99_AMAX_Mag_Description"; + initSpeed = 860; + }; + class 30Rnd_9x21_Mag: CA_Magazine { initSpeed = 450; diff --git a/addons/ballistics/CfgVehicles.hpp b/addons/ballistics/CfgVehicles.hpp index 7c32774f9f..81252df0f2 100644 --- a/addons/ballistics/CfgVehicles.hpp +++ b/addons/ballistics/CfgVehicles.hpp @@ -23,6 +23,10 @@ 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_556x45_Stanag_Tracer_Dim,1); + MACRO_ADDMAGAZINE(ACE_10Rnd_338_300gr_HPBT_Mag,4); + MACRO_ADDMAGAZINE(ACE_10Rnd_338_API526_Mag,4); + MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_Mag,4); + MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_AMAX_Mag,4); }; }; @@ -32,6 +36,10 @@ class CfgVehicles { MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_M118LR_Mag,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_M118LR_Mag,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_Tracer_Dim,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); + MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_AMAX_Mag,4); }; }; @@ -41,6 +49,10 @@ class CfgVehicles { MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_M118LR_Mag,6); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_Tracer_Dim,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_SD,3); + MACRO_ADDMAGAZINE(ACE_10Rnd_338_300gr_HPBT_Mag,4); + MACRO_ADDMAGAZINE(ACE_10Rnd_338_API526_Mag,4); + MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_Mag,4); + MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_AMAX_Mag,4); }; }; @@ -159,6 +171,10 @@ 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_10Rnd_338_300gr_HPBT_Mag,4); + MACRO_ADDMAGAZINE(ACE_10Rnd_338_API526_Mag,4); + MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_Mag,4); + MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_AMAX_Mag,4);I a }; }; }; diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index 41070fa3dd..0b39dcb9d3 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -438,23 +438,6 @@ Calibro: 7.62x51 mm AP<br />Munizioni: 20<br />In uso su: Mk18 ABR Калибр: 7.62x51 мм дозвуковые<br />Патронов: 20<br />Применимы в: Mk18 ABR - - - .338 LM 10Rnd AP Mag - .338 LM 10-Schuss-Magazin Hartkern - Magazynek .338 LM 10rd AP - - - .338 LM AP - .338 LM AP - .338 LM AP - .338 LM AP - - - Caliber: .338 Lapua Magnum AP<br />Rounds: 10<br />Used in: MAR-10 - Kaliber: .338 Lapua Magnum Hartkern<br />Schuss: 10<br />Verwendet für: MAR-10 - Kaliber: .338 Lapua Magnum AP<br />Pociski: 10<br />Używany w: MAR-10 - .338 NM 130Rnd Tracer Belt @@ -756,7 +739,7 @@ Caliber: 6.5x47mm (HPBT Scenar)<br />Rounds: 30 - 8.6x70mm 10Rnd Mag (300gr Sierra MatchKing HPBT) + .338 10Rnd Mag (300gr Sierra MatchKing HPBT) .338 (HPBT) @@ -764,5 +747,32 @@ Caliber: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />Rounds: 10 + + .338 10Rnd Mag (API526) + + + .338 AP + + + Caliber: 8.6x70mm (API526)<br />Rounds: 10 + + + 12.7x99mm 5Rnd Mag + + + 12.7mm + + + Caliber: 12.7x99mm<br />Rounds: 5 + + + 12.7x99mm 5Rnd Mag (AMAX) + + + 12.7mm + + + Caliber: 12.7x99mm (AMAX)<br />Rounds: 5 + From 92031cc3542a4809b0ad14a8f4142bb4941ce9ec Mon Sep 17 00:00:00 2001 From: ruPaladin Date: Wed, 15 Apr 2015 19:59:45 +0300 Subject: [PATCH 073/305] Update stringtable.xml --- addons/laserpointer/stringtable.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/laserpointer/stringtable.xml b/addons/laserpointer/stringtable.xml index 5d7aa03c67..eb328e5997 100644 --- a/addons/laserpointer/stringtable.xml +++ b/addons/laserpointer/stringtable.xml @@ -47,16 +47,19 @@ Laser Laser Laser + Лазер IR Laser IR-Laser Laser IR + ИК-лазер Switch Laser / IR Laser Umschalten Laser / IR-Laser Przełącz Laser / Laser IR + Изменить режим Лазер / ИК-лазер From 0c4734637b1679b2b591cbf3f77167aca7408944 Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 15 Apr 2015 19:00:14 +0200 Subject: [PATCH 074/305] Fixed the GM6 barrel length and updated the magazines array --- addons/ballistics/CfgWeapons.hpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/addons/ballistics/CfgWeapons.hpp b/addons/ballistics/CfgWeapons.hpp index d5b6ad448f..add91d0fa2 100644 --- a/addons/ballistics/CfgWeapons.hpp +++ b/addons/ballistics/CfgWeapons.hpp @@ -522,14 +522,21 @@ class CfgWeapons { ACE_barrelLength=29; }; class srifle_GM6_F: GM6_base_F { + magazines[] = { + "5Rnd_127x108_Mag", + "5Rnd_127x108_APDS_Mag", + "ACE_5Rnd_127x99_Mag", + "ACE_5Rnd_127x99_AMAX_Mag" + }; initSpeed = -1.0; ACE_barrelTwist=15; - ACE_barrelLength=43.3; + ACE_barrelLength=36.6; }; class srifle_DMR_02_F: DMR_02_base_F { magazines[] = { "10Rnd_338_Mag", "ACE_10Rnd_338_300gr_HPBT_Mag", + "ACE_10Rnd_338_API526_Mag", "ACE_20Rnd_762x67_Mk248_Mod_0_Mag", "ACE_20Rnd_762x67_Mk248_Mod_1_Mag", "ACE_20Rnd_762x67_Berger_Hybrid_OTM_Mag" From fe72eef3da65a7a9c368b438f3ae37a4b51f2535 Mon Sep 17 00:00:00 2001 From: ruPaladin Date: Wed, 15 Apr 2015 20:02:41 +0300 Subject: [PATCH 075/305] Update stringtable.xml --- addons/advanced_ballistics/stringtable.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/advanced_ballistics/stringtable.xml b/addons/advanced_ballistics/stringtable.xml index f19aa1e672..b0a6e97f34 100644 --- a/addons/advanced_ballistics/stringtable.xml +++ b/addons/advanced_ballistics/stringtable.xml @@ -6,11 +6,13 @@ Show Wind Info Pokaż inf. o wietrze Mostra indicazioni del vento + Показать информацию о ветре Show Protractor Pokaż kątomierz Mostra il rapportatore + Показать транспортир From 396bd3954e2b70797aa7eacc510c20cd1766413a Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 15 Apr 2015 19:04:41 +0200 Subject: [PATCH 076/305] Fixed a typo --- addons/ballistics/CfgVehicles.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/ballistics/CfgVehicles.hpp b/addons/ballistics/CfgVehicles.hpp index 81252df0f2..9dd4a7083d 100644 --- a/addons/ballistics/CfgVehicles.hpp +++ b/addons/ballistics/CfgVehicles.hpp @@ -174,7 +174,7 @@ class CfgVehicles { MACRO_ADDMAGAZINE(ACE_10Rnd_338_300gr_HPBT_Mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_338_API526_Mag,4); MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_Mag,4); - MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_AMAX_Mag,4);I a + MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_AMAX_Mag,4); }; }; }; From 26d53d255f2267e434c0a5fd316de3c17ad6d0ee Mon Sep 17 00:00:00 2001 From: ruPaladin Date: Wed, 15 Apr 2015 20:08:39 +0300 Subject: [PATCH 077/305] Update stringtable.xml --- addons/scopes/stringtable.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/addons/scopes/stringtable.xml b/addons/scopes/stringtable.xml index 9e070efa73..16d6b60c4c 100644 --- a/addons/scopes/stringtable.xml +++ b/addons/scopes/stringtable.xml @@ -4,38 +4,47 @@ Minor adjustment up Zerowanie powoli w górę + Малая корректировка ВВЕРХ Minor adjustment down Zerowanie powoli w dół + Малая корректировка ВНИЗ Minor adjustment right Zerowanie powoli w prawo + Малая корректировка ВПРАВО Minor adjustment left Zerowanie powoli w lewo + Малая корректировка ВЛЕВО Major adjustment up Zerowanie w górę + Большая корректировка ВВЕРХ Major adjustment down Zerowanie w dół + Большая корректировка ВНИЗ Major adjustment right Zerowanie w prawo + Большая корректировка ВПРАВО Major adjustment left Zerowanie w lewo + Большая корректировка ВЛЕВО Set zero adjustment Zresetuj wyzerowanie + Сбросить корректировку From 25b7f779f14d0ae0ffd885b340182337225b9bc8 Mon Sep 17 00:00:00 2001 From: jaynus Date: Wed, 15 Apr 2015 10:11:13 -0700 Subject: [PATCH 078/305] Difficulty magic. --- addons/javelin/functions/fnc_onOpticDraw.sqf | 4 ++-- addons/javelin/functions/fnc_onOpticUnload.sqf | 2 +- addons/missileguidance/functions/fnc_onFired.sqf | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/javelin/functions/fnc_onOpticDraw.sqf b/addons/javelin/functions/fnc_onOpticDraw.sqf index 358b68ebc1..13669b9d2e 100644 --- a/addons/javelin/functions/fnc_onOpticDraw.sqf +++ b/addons/javelin/functions/fnc_onOpticDraw.sqf @@ -110,7 +110,7 @@ if((call CBA_fnc_getFoV) select 1 > 9) then { FUNC(disableFire) = { _firedEH = _this select 0; - if(_firedEH < 0) then { + if(_firedEH < 0 && difficulty > 0) then { _firedEH = [ACE_player, "DefaultAction", {true}, { _canFire = ACE_player getVariable["ace_missileguidance_target", nil]; if(!isNil "_canFire") exitWith { false }; @@ -122,7 +122,7 @@ FUNC(disableFire) = { FUNC(enableFire) = { _firedEH = _this select 0; - if(_firedEH > 0) then { + if(_firedEH > 0 && difficulty > 0) then { [ACE_player, "DefaultAction", _firedEH] call EFUNC(common,removeActionEventHandler); }; -1 diff --git a/addons/javelin/functions/fnc_onOpticUnload.sqf b/addons/javelin/functions/fnc_onOpticUnload.sqf index 38acc1cd1c..4086c02766 100644 --- a/addons/javelin/functions/fnc_onOpticUnload.sqf +++ b/addons/javelin/functions/fnc_onOpticUnload.sqf @@ -13,7 +13,7 @@ if(!isNil "_pfh") then { _args = uiNamespace getVariable[QGVAR(arguments), nil ]; if(!isNil "_args") then { _disableFireEH = _args select 6; - if(_disableFireEH > 0) then { + if(_disableFireEH > 0 && difficulty > 0) then { [ACE_player, "DefaultAction", _disableFireEH] call EFUNC(common,removeActionEventHandler); }; uiNameSpace setVariable [QGVAR(arguments),nil]; diff --git a/addons/missileguidance/functions/fnc_onFired.sqf b/addons/missileguidance/functions/fnc_onFired.sqf index ad713d8884..dd96821692 100644 --- a/addons/missileguidance/functions/fnc_onFired.sqf +++ b/addons/missileguidance/functions/fnc_onFired.sqf @@ -48,7 +48,7 @@ if(isNil "_target") then { } else { _canUseLock = getNumber (_config >> "canVanillaLock"); // @TODO: Get vanilla target - if(_canUseLock > 0 || cadetMode) then { + if(_canUseLock > 0 || difficulty < 1) then { _vanillaTarget = cursorTarget; TRACE_1("Using Vanilla Locking", _vanillaTarget); From 18be5276a9171e1b85b18a67240ea620eee05b0c Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 15 Apr 2015 19:18:42 +0200 Subject: [PATCH 079/305] rally point moved eh, markers at rallypoint positions --- addons/respawn/CfgEventHandlers.hpp | 7 +++ addons/respawn/XEH_postInit.sqf | 5 +++ addons/respawn/XEH_preInit.sqf | 2 + .../functions/fnc_handlePlayerChanged.sqf | 44 +++++++++++++++++++ .../respawn/functions/fnc_initRallypoint.sqf | 44 ++++++++++++++++--- .../respawn/functions/fnc_moveRallypoint.sqf | 8 ++-- .../functions/fnc_updateRallypoint.sqf | 17 +++++++ 7 files changed, 115 insertions(+), 12 deletions(-) create mode 100644 addons/respawn/XEH_postInit.sqf create mode 100644 addons/respawn/functions/fnc_handlePlayerChanged.sqf create mode 100644 addons/respawn/functions/fnc_updateRallypoint.sqf diff --git a/addons/respawn/CfgEventHandlers.hpp b/addons/respawn/CfgEventHandlers.hpp index 58aa8995ee..46ebd08657 100644 --- a/addons/respawn/CfgEventHandlers.hpp +++ b/addons/respawn/CfgEventHandlers.hpp @@ -1,9 +1,16 @@ + class Extended_PreInit_EventHandlers { class ADDON { init = QUOTE(call COMPILE_FILE(XEH_preInit)); }; }; +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; + class Extended_Killed_EventHandlers { class CAManBase { class ADDON { diff --git a/addons/respawn/XEH_postInit.sqf b/addons/respawn/XEH_postInit.sqf new file mode 100644 index 0000000000..ada5765e86 --- /dev/null +++ b/addons/respawn/XEH_postInit.sqf @@ -0,0 +1,5 @@ +// by commy2 +#include "script_component.hpp" + +["rallypointMoved", {_this call FUNC(updateRallypoint)}] call EFUNC(common,addEventhandler); +["playerChanged", {_this call FUNC(handlePlayerChanged)}] call EFUNC(common,addEventhandler); // hide enemy rallypoint markers diff --git a/addons/respawn/XEH_preInit.sqf b/addons/respawn/XEH_preInit.sqf index 8b3f309126..dd116f108c 100644 --- a/addons/respawn/XEH_preInit.sqf +++ b/addons/respawn/XEH_preInit.sqf @@ -4,6 +4,7 @@ ADDON = false; PREP(canMoveRallypoint); PREP(handleKilled); +PREP(handlePlayerChanged); PREP(handleRespawn); PREP(handleInitPostServer); PREP(initRallypoint); @@ -16,5 +17,6 @@ PREP(removeDisconnectedPlayer); PREP(restoreGear); PREP(showFriendlyFireMessage); PREP(teleportToRallypoint); +PREP(updateRallypoint); ADDON = true; diff --git a/addons/respawn/functions/fnc_handlePlayerChanged.sqf b/addons/respawn/functions/fnc_handlePlayerChanged.sqf new file mode 100644 index 0000000000..db699066bc --- /dev/null +++ b/addons/respawn/functions/fnc_handlePlayerChanged.sqf @@ -0,0 +1,44 @@ +// by commy2 +#include "script_component.hpp" + +private "_newUnit"; + +_newUnit = _this select 0; + +switch (side group _newUnit) do { + case (west): { + ((missionNamespace getVariable ["ACE_Rallypoint_West", objNull]) getVariable [QGVAR(marker), ""]) setMarkerAlphaLocal 1; + ((missionNamespace getVariable ["ACE_Rallypoint_East", objNull]) getVariable [QGVAR(marker), ""]) setMarkerAlphaLocal 0; + ((missionNamespace getVariable ["ACE_Rallypoint_Independent", objNull]) getVariable [QGVAR(marker), ""]) setMarkerAlphaLocal 0; + ((missionNamespace getVariable ["ACE_Rallypoint_West_Base", objNull]) getVariable [QGVAR(marker), ""]) setMarkerAlphaLocal 1; + ((missionNamespace getVariable ["ACE_Rallypoint_East_Base", objNull]) getVariable [QGVAR(marker), ""]) setMarkerAlphaLocal 0; + ((missionNamespace getVariable ["ACE_Rallypoint_Independent_Base", objNull]) getVariable [QGVAR(marker), ""]) setMarkerAlphaLocal 0; + }; + + case (east): { + ((missionNamespace getVariable ["ACE_Rallypoint_West", objNull]) getVariable [QGVAR(marker), ""]) setMarkerAlphaLocal 0; + ((missionNamespace getVariable ["ACE_Rallypoint_East", objNull]) getVariable [QGVAR(marker), ""]) setMarkerAlphaLocal 1; + ((missionNamespace getVariable ["ACE_Rallypoint_Independent", objNull]) getVariable [QGVAR(marker), ""]) setMarkerAlphaLocal 0; + ((missionNamespace getVariable ["ACE_Rallypoint_West_Base", objNull]) getVariable [QGVAR(marker), ""]) setMarkerAlphaLocal 0; + ((missionNamespace getVariable ["ACE_Rallypoint_East_Base", objNull]) getVariable [QGVAR(marker), ""]) setMarkerAlphaLocal 1; + ((missionNamespace getVariable ["ACE_Rallypoint_Independent_Base", objNull]) getVariable [QGVAR(marker), ""]) setMarkerAlphaLocal 0; + }; + + case (independent): { + ((missionNamespace getVariable ["ACE_Rallypoint_West", objNull]) getVariable [QGVAR(marker), ""]) setMarkerAlphaLocal 0; + ((missionNamespace getVariable ["ACE_Rallypoint_East", objNull]) getVariable [QGVAR(marker), ""]) setMarkerAlphaLocal 0; + ((missionNamespace getVariable ["ACE_Rallypoint_Independent", objNull]) getVariable [QGVAR(marker), ""]) setMarkerAlphaLocal 1; + ((missionNamespace getVariable ["ACE_Rallypoint_West_Base", objNull]) getVariable [QGVAR(marker), ""]) setMarkerAlphaLocal 0; + ((missionNamespace getVariable ["ACE_Rallypoint_East_Base", objNull]) getVariable [QGVAR(marker), ""]) setMarkerAlphaLocal 0; + ((missionNamespace getVariable ["ACE_Rallypoint_Independent_Base", objNull]) getVariable [QGVAR(marker), ""]) setMarkerAlphaLocal 1; + }; + + default { + ((missionNamespace getVariable ["ACE_Rallypoint_West", objNull]) getVariable [QGVAR(marker), ""]) setMarkerAlphaLocal 0; + ((missionNamespace getVariable ["ACE_Rallypoint_East", objNull]) getVariable [QGVAR(marker), ""]) setMarkerAlphaLocal 0; + ((missionNamespace getVariable ["ACE_Rallypoint_Independent", objNull]) getVariable [QGVAR(marker), ""]) setMarkerAlphaLocal 0; + ((missionNamespace getVariable ["ACE_Rallypoint_West_Base", objNull]) getVariable [QGVAR(marker), ""]) setMarkerAlphaLocal 0; + ((missionNamespace getVariable ["ACE_Rallypoint_East_Base", objNull]) getVariable [QGVAR(marker), ""]) setMarkerAlphaLocal 0; + ((missionNamespace getVariable ["ACE_Rallypoint_Independent_Base", objNull]) getVariable [QGVAR(marker), ""]) setMarkerAlphaLocal 0; + }; +}; diff --git a/addons/respawn/functions/fnc_initRallypoint.sqf b/addons/respawn/functions/fnc_initRallypoint.sqf index c266026e11..81058614ed 100644 --- a/addons/respawn/functions/fnc_initRallypoint.sqf +++ b/addons/respawn/functions/fnc_initRallypoint.sqf @@ -16,23 +16,53 @@ #include "script_component.hpp" -private ["_rallypoint", "_respawnMarker", "_name"]; +private ["_rallypoint", "_respawnMarker", "_side"]; _rallypoint = _this select 0; _respawnMarker = _this select 1; +_side = _this select 2; -if (!local _rallypoint) exitWith {}; - +private "_name"; _name = typeOf _rallypoint; +// init visible marker +if (hasInterface) then { + private ["_marker", "_type"]; + + _marker = format ["ACE_Marker_%1", _name]; + + // exit if it already exist + if (_marker in allMapMarkers) exitWith {}; + + _marker = createMarkerLocal [_marker, getPosASL _rallypoint]; + _type = ["selector_selectedFriendly", "selector_selectedEnemy"] select (_respawnMarker == ""); + + _marker setMarkerTypeLocal _type; + _marker setMarkerAlphaLocal ([0,1] select (_side == playerSide)); // playerSide to guarantee init + + private "_markerDate"; + _markerDate = _rallypoint getVariable [QGVAR(markerDate), ""]; + + _marker setMarkerTextLocal _markerDate; + + _rallypoint setVariable [QGVAR(marker), _marker]; +}; + +if (!isServer) exitWith {}; + if (isNil _name) then { missionNamespace setVariable [_name, _rallypoint]; publicVariable _name; + + _rallypoint setVariable [QGVAR(side), _side, true]; + + if (_respawnMarker != "" && {!(_respawnMarker in allMapMarkers)}) then { + createMarker [_respawnMarker, _rallypoint]; + }; + + ["rallypointMoved", [_rallypoint, _side]] call EFUNC(common,globalEvent); + } else { deleteVehicle _rallypoint; diag_log text "[ACE] Respawn: ERROR Multiple Rallypoints of same type."; }; - -if (isServer && {_respawnMarker != ""} && {!(_respawnMarker in allMapMarkers)}) then { - createMarker [_respawnMarker, _rallypoint]; -}; diff --git a/addons/respawn/functions/fnc_moveRallypoint.sqf b/addons/respawn/functions/fnc_moveRallypoint.sqf index d937363310..2b008bf122 100644 --- a/addons/respawn/functions/fnc_moveRallypoint.sqf +++ b/addons/respawn/functions/fnc_moveRallypoint.sqf @@ -44,11 +44,9 @@ _this spawn { _rallypoint setPosATL _position; _unit reveal _rallypoint; - /* - _marker = format ["AGM_RallyPoint_%1", _side]; - _marker setMarkerPos _position; - _marker setMarkerTextLocal format ["%1:%2", [date select 3, 2, 0] call CBA_fnc_FORMATNumber, [date select 4, 2, 0] call CBA_fnc_FORMATNumber]; - */ + _rallypoint setVariable [QGVAR(markerDate), format ["%1:%2", date select 3, date select 4], true]; + + ["rallypointMoved", [_rallypoint, _side]] call EFUNC(common,globalEvent); [localize "STR_ACE_Respawn_Deployed"] call EFUNC(common,displayTextStructured); }; diff --git a/addons/respawn/functions/fnc_updateRallypoint.sqf b/addons/respawn/functions/fnc_updateRallypoint.sqf new file mode 100644 index 0000000000..2510a58a30 --- /dev/null +++ b/addons/respawn/functions/fnc_updateRallypoint.sqf @@ -0,0 +1,17 @@ +// by commy2 +#include "script_component.hpp" + +private ["_rallypoint", "_side"]; + +_rallypoint = _this select 0; +_side = _this select 1; + +if (!hasInterface) exitWith {}; + +private ["_marker", "_markerDate"]; + +_marker = _rallypoint getVariable [QGVAR(marker), ""]; +_markerDate = _rallypoint getVariable [QGVAR(markerDate), ""]; + +_marker setMarkerPosLocal getPosASL _rallypoint; +_marker setMarkerTextLocal _markerDate; From ae198fa307d1acce77c3440a22167b6583369092 Mon Sep 17 00:00:00 2001 From: jaynus Date: Wed, 15 Apr 2015 10:32:52 -0700 Subject: [PATCH 080/305] documentation matching re-orginization. --- documentation/feature/javelin.md | 10 ++++++++++ documentation/features/feature-list.md | 20 +++++++++++++++++++ documentation/features/titan-javelin-usage.md | 10 ++++++++++ .../framework/advanced-missile-guidance.md | 10 ++++++++++ .../fragmentation-configuration.md | 2 +- 5 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 documentation/feature/javelin.md create mode 100644 documentation/features/feature-list.md create mode 100644 documentation/features/titan-javelin-usage.md create mode 100644 documentation/framework/advanced-missile-guidance.md rename documentation/{development => framework}/fragmentation-configuration.md (99%) diff --git a/documentation/feature/javelin.md b/documentation/feature/javelin.md new file mode 100644 index 0000000000..eecfa8844a --- /dev/null +++ b/documentation/feature/javelin.md @@ -0,0 +1,10 @@ +--- +layout: wiki +title: Javelin/Titan Locking and Firing +group: feature +order: 5 +parent: wiki +--- + +## 1. Overview +Blah blah blah \ No newline at end of file diff --git a/documentation/features/feature-list.md b/documentation/features/feature-list.md new file mode 100644 index 0000000000..9edc405ba2 --- /dev/null +++ b/documentation/features/feature-list.md @@ -0,0 +1,20 @@ +--- +layout: wiki +title: Features Documentation +group: features +order: 0 +parent: wiki +--- + + +**This page will get updated soon.** + + +## Table of Contents + + 1. [][[Advanced Missile Guidanced Framework|WikiLink]] + 2. [yy](#yy) + 3. [zz](#zz) + + +## What ACE3 has to offer diff --git a/documentation/features/titan-javelin-usage.md b/documentation/features/titan-javelin-usage.md new file mode 100644 index 0000000000..8115e6812b --- /dev/null +++ b/documentation/features/titan-javelin-usage.md @@ -0,0 +1,10 @@ +--- +layout: wiki +title: ACE Titan and Javelin +group: features +order: 0 +parent: wiki +--- + + +**This page will get updated soon.** diff --git a/documentation/framework/advanced-missile-guidance.md b/documentation/framework/advanced-missile-guidance.md new file mode 100644 index 0000000000..e67bfbe0f3 --- /dev/null +++ b/documentation/framework/advanced-missile-guidance.md @@ -0,0 +1,10 @@ +--- +layout: wiki +title: Advanced Missile Guidance +group: framework +order: 5 +parent: wiki +--- + +## 1. Overview +Blah blah blah \ No newline at end of file diff --git a/documentation/development/fragmentation-configuration.md b/documentation/framework/fragmentation-configuration.md similarity index 99% rename from documentation/development/fragmentation-configuration.md rename to documentation/framework/fragmentation-configuration.md index 17ff36fa13..1372b2b69a 100644 --- a/documentation/development/fragmentation-configuration.md +++ b/documentation/framework/fragmentation-configuration.md @@ -1,7 +1,7 @@ --- layout: wiki title: Fragmentation Configuration -group: development +group: framework parent: wiki order: 7 --- From 3cff85e85d74a438f6dd4dfffae7641e8e54c83a Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 15 Apr 2015 19:51:34 +0200 Subject: [PATCH 081/305] Added Mk319 Mod 0 ammo and magazines --- addons/ballistics/CfgAmmo.hpp | 20 +++++++++++++-- addons/ballistics/CfgMagazines.hpp | 19 +++++++++++++- addons/ballistics/CfgVehicles.hpp | 11 +++++++- addons/ballistics/CfgWeapons.hpp | 3 +++ addons/ballistics/stringtable.xml | 40 ++++++++++++++++++++++++------ 5 files changed, 81 insertions(+), 12 deletions(-) diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 8e75e6ce03..a0fa47c452 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -148,7 +148,7 @@ class CfgAmmo { class B_762x51_Ball : BulletBase { airFriction=-0.001035; typicalSpeed=833; - hit=14; + hit=9; ACE_caliber=0.308; ACE_bulletLength=1.14; ACE_bulletMass=146; @@ -180,6 +180,22 @@ class CfgAmmo { ACE_muzzleVelocities[]={750, 780, 790, 794}; ACE_barrelLengths[]={16, 20, 24, 26}; }; + class ACE_762x51_Ball_Mk319_Mod_0 : B_762x51_Ball { + airFriction=-0.0014; + caliber=0.85; + hit=14; + typicalSpeed=890; + ACE_caliber=0.308; + ACE_bulletLength=1.24; + ACE_bulletMass=130; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.277}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={838, 892, 910}; + ACE_barrelLengths[]={13, 16, 20}; + }; class ACE_762x67_Ball_Mk248_Mod_0 : B_762x51_Ball { airFriction=-0.000830; @@ -234,7 +250,7 @@ class CfgAmmo { class ACE_762x51_Ball_Subsonic : B_762x51_Ball { airFriction=-0.000535; caliber=0.5; - hit=16; + hit=6; typicalSpeed=790; ACE_caliber=0.308; ACE_bulletLength=1.340; diff --git a/addons/ballistics/CfgMagazines.hpp b/addons/ballistics/CfgMagazines.hpp index 7a97b3609e..ef36fcca78 100644 --- a/addons/ballistics/CfgMagazines.hpp +++ b/addons/ballistics/CfgMagazines.hpp @@ -117,12 +117,21 @@ class CfgMagazines { class ACE_10Rnd_762x51_M118LR_Mag: 10Rnd_762x51_Mag { author = "$STR_ACE_Common_ACETeam"; ammo = "ACE_762x51_Ball_M118LR"; - count=10; + count = 10; displayName = "$STR_ACE_10Rnd_762x51_M118LR_Mag_Name"; displayNameShort = "$STR_ACE_10Rnd_762x51_M118LR_Mag_NameShort"; descriptionShort = "$STR_ACE_10Rnd_762x51_M118LR_Mag_Description"; initSpeed = 780; }; + class ACE_10Rnd_762x51_Mk319_Mod_0_Mag: 10Rnd_762x51_Mag { + author = "$STR_ACE_Common_ACETeam"; + ammo = "ACE_762x51_Ball_Mk319_Mod_0"; + count = 10; + displayName = "$STR_ACE_10Rnd_762x51_Mk319_Mod_0_Mag_Name"; + displayNameShort = "$STR_ACE_10Rnd_762x51_Mk319_Mod_0_Mag_NameShort"; + descriptionShort = "$STR_ACE_10Rnd_762x51_Mk319_Mod_0_Mag_Description"; + initSpeed = 900; + }; class ACE_20Rnd_762x51_M118LR_Mag: 20Rnd_762x51_Mag { author = "$STR_ACE_Common_ACETeam"; ammo = "ACE_762x51_Ball_M118LR"; @@ -131,6 +140,14 @@ class CfgMagazines { descriptionShort = "$STR_ACE_20Rnd_762x51_M118LR_Mag_Description"; initSpeed = 780; }; + class ACE_20Rnd_762x51_Mk319_Mod_0_Mag: 20Rnd_762x51_Mag { + author = "$STR_ACE_Common_ACETeam"; + ammo = "ACE_762x51_Ball_Mk319_Mod_0"; + displayName = "$STR_ACE_20Rnd_762x51_Mk319_Mod_0_Mag_Name"; + displayNameShort = "$STR_ACE_20Rnd_762x51_Mk319_Mod_0_Mag_NameShort"; + descriptionShort = "$STR_ACE_20Rnd_762x51_Mk319_Mod_0_Mag_Description"; + initSpeed = 900; + }; class ACE_20Rnd_762x67_Mk248_Mod_0_Mag: 20Rnd_762x51_Mag { author = "$STR_ACE_Common_ACETeam"; ammo = "ACE_762x67_Ball_Mk248_Mod_0"; diff --git a/addons/ballistics/CfgVehicles.hpp b/addons/ballistics/CfgVehicles.hpp index 9dd4a7083d..f992f8cc8b 100644 --- a/addons/ballistics/CfgVehicles.hpp +++ b/addons/ballistics/CfgVehicles.hpp @@ -35,6 +35,8 @@ class CfgVehicles { MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_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); + MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mk319_Mod_0_Mag,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_Tracer_Dim,4); MACRO_ADDMAGAZINE(ACE_10Rnd_338_300gr_HPBT_Mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_338_API526_Mag,4); @@ -46,7 +48,9 @@ class CfgVehicles { class Box_NATO_Support_F: NATO_Box_Base { class TransportMagazines { MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_M118LR_Mag,4); - MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_M118LR_Mag,6); + MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_M118LR_Mag,4); + MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_Mk319_Mod_0_Mag,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mk319_Mod_0_Mag,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_Tracer_Dim,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_SD,3); MACRO_ADDMAGAZINE(ACE_10Rnd_338_300gr_HPBT_Mag,4); @@ -62,6 +66,8 @@ class CfgVehicles { MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_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); + MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mk319_Mod_0_Mag,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_Tracer_Dim,4); }; }; @@ -157,7 +163,10 @@ class CfgVehicles { class ACE_Box_Misc: Box_NATO_Support_F { class TransportMagazines { MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_SD,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); + MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mk319_Mod_0_Mag,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_Tracer_Dim,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x67_Mk248_Mod_0_Mag,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x67_Mk248_Mod_1_Mag,4); diff --git a/addons/ballistics/CfgWeapons.hpp b/addons/ballistics/CfgWeapons.hpp index add91d0fa2..dad5356755 100644 --- a/addons/ballistics/CfgWeapons.hpp +++ b/addons/ballistics/CfgWeapons.hpp @@ -503,6 +503,7 @@ class CfgWeapons { "20Rnd_762x51_Mag", "ACE_20Rnd_762x51_Mag_Tracer_Dim", "ACE_20Rnd_762x51_M118LR_Mag", + "ACE_20Rnd_762x51_Mk319_Mod_0_Mag", "ACE_20Rnd_762x51_Mag_SD" }; initSpeed = -0.9724; @@ -550,6 +551,7 @@ class CfgWeapons { "20Rnd_762x51_Mag", "ACE_20Rnd_762x51_Mag_Tracer_Dim", "ACE_20Rnd_762x51_M118LR_Mag", + "ACE_20Rnd_762x51_Mk319_Mod_0_Mag", "ACE_20Rnd_762x51_Mag_SD" }; initSpeed = -0.9843; @@ -571,6 +573,7 @@ class CfgWeapons { "20Rnd_762x51_Mag", "ACE_20Rnd_762x51_Mag_Tracer_Dim", "ACE_20Rnd_762x51_M118LR_Mag", + "ACE_20Rnd_762x51_Mk319_Mod_0_Mag", "ACE_20Rnd_762x51_Mag_SD" }; initSpeed = -0.9916; diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index 0b39dcb9d3..4786555236 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -650,8 +650,8 @@ Magazynek 5,56mm 30rd Mk262 - 5.56mm (Mk262) - 5,56mm (Mk262) + 5.56mm Mk262 + 5,56mm Mk262 Caliber: 5.56x45 mm NATO (Mk262)<br />Rounds: 30 @@ -662,8 +662,8 @@ Magazynek 5,56mm 30rd Mk318 - 5.56mm (Mk318) - 5,56mm (Mk318) + 5.56mm Mk318 + 5,56mm Mk318 Caliber: 5.56x45 mm NATO (Mk318)<br />Rounds: 30 @@ -674,8 +674,8 @@ Magazynek 7,62mm 10rd (M118LR) - 7.62mm (M118LR) - 7,62mm (M118LR) + 7.62mm M118LR + 7,62mm M118LR Caliber: 7.62x51 mm NATO (M118LR)<br />Rounds: 10 @@ -686,13 +686,37 @@ Magazynek 7,62mm 20rd (M118LR) - 7.62mm (M118LR) - 7,62mm (M118LR) + 7.62mm M118LR + 7,62mm M118LR Caliber: 7.62x51 mm NATO (M118LR)<br />Rounds: 20 Kaliber: 7,62x51 mm NATO (M118LR)<br />Pociski: 20 + + 7.62mm 10Rnd Mag (Mk319 Mod 0) + Magazynek 7,62mm 10rd (Mk319 Mod 0) + + + 7.62mm Mk319 + 7,62mm Mk319 + + + Caliber: 7.62x51 mm NATO (Mk319 Mod 0)<br />Rounds: 10 + Kaliber: 7,62x51 mm NATO (Mk319 Mod 0)<br />Pociski: 10 + + + 7.62mm 20Rnd Mag (Mk319 Mod 0) + Magazynek 7,62mm 20rd (Mk319 Mod 0) + + + 7.62mm Mk319 + 7,62mm Mk319 + + + Caliber: 7.62x51 mm NATO (Mk319 Mod 0)<br />Rounds: 20 + Kaliber: 7,62x51 mm NATO (Mk319 Mod 0)<br />Pociski: 20 + 7.62mm 20Rnd Mag (Mk248 Mod 0) Magazynek 7,62mm 20rd (Mk248 Mod 0) From e54d8dc827f05362d3b25b34a56ea48c97bd0355 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 15 Apr 2015 12:55:16 -0500 Subject: [PATCH 082/305] ProgressBar - Fixed Alignment --- addons/common/ProgressScreen.hpp | 135 ++++++++++---------- addons/common/functions/fnc_progressBar.sqf | 19 +-- 2 files changed, 76 insertions(+), 78 deletions(-) diff --git a/addons/common/ProgressScreen.hpp b/addons/common/ProgressScreen.hpp index 751d48af9f..df07e5ca2f 100644 --- a/addons/common/ProgressScreen.hpp +++ b/addons/common/ProgressScreen.hpp @@ -1,77 +1,74 @@ - class GVAR(ProgressBar_Dialog) { - idd = -1; - movingEnable = false; - onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(ctrlProgressBar)),(_this select 0) displayCtrl 1)]; uiNamespace setVariable [ARR_2(QUOTE(QGVAR(ctrlProgressBarTitle)),(_this select 0) displayCtrl 2)];); - objects[] = {}; + idd = -1; + movingEnable = false; + onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(ctrlProgressBar)),(_this select 0) displayCtrl 1)]; uiNamespace setVariable [ARR_2(QUOTE(QGVAR(ctrlProgressBarTitle)),(_this select 0) displayCtrl 2)];); + objects[] = {}; - class controlsBackground { - class Background { - idc = -1; - moving = 0; - font = "TahomaB"; - text = ""; - sizeEx = 0; - lineSpacing = 0; - access = 0; - type = 0; - style = 0; - size = 1; - colorBackground[] = {0, 0, 0, 0.0}; - colorText[] = {0, 0, 0, 0}; - x = "safezoneX"; - y = "safezoneY"; - w = "safezoneW"; - h = "safezoneH"; + class controlsBackground { + class Background { + idc = -1; + moving = 0; + font = "TahomaB"; + text = ""; + sizeEx = 0; + lineSpacing = 0; + access = 0; + type = 0; + style = 0; + size = 1; + colorBackground[] = {0, 0, 0, 0.0}; + colorText[] = {0, 0, 0, 0}; + x = "safezoneX"; + y = "safezoneY"; + w = "safezoneW"; + h = "safezoneH"; + }; + class Progress: ACE_gui_RscProgress { + idc = 1; + x = "1.2 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; + y = "0.1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; + w = "37.8 * (((safezoneW / safezoneH) min 1.2) / 40)"; + h = ".8 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + colorFrame[] = {0,0,0,0.0}; + colorBar[] = {0.27,0.5,0.31,0.8}; + texture = "#(argb,8,8,3)color(1,1,1,0.7)"; + }; + class Title_Bar : ACE_gui_staticBase { + idc = 2; + style = 0x22; + colorBackground[] = {0, 0, 0, 0}; + colorText[] = {1, 1, 1, 1}; + x = "1 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; + y = "0 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; + w = "38 * (((safezoneW / safezoneH) min 1.2) / 40)"; + h = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + }; }; - - class Progress: ACE_gui_RscProgress { - idc = 1; - x = "1 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "0.1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "38 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = ".8 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - colorFrame[] = {0,0,0,0.0}; - colorBar[] = {0.27,0.5,0.31,0.8}; - texture = "#(argb,8,8,3)color(1,1,1,0.7)"; - }; - - class Title_Bar : ACE_gui_staticBase { - idc = 2; - style = 0x22; - colorBackground[] = {0, 0, 0, 0}; - colorText[] = {1, 1, 1, 1}; - x = "1 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "0 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "38 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - }; - }; }; class GVAR(DisableMouse_Dialog) { - idd = -1; - movingEnable = false; - onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(dlgDisableMouse)),_this select 0)];); - objects[] = {}; - class controlsBackground { - class Background { - idc = -1; - moving = 0; - font = "TahomaB"; - text = ""; - sizeEx = 0; - lineSpacing = 0; - access = 0; - type = 0; - style = 0; - size = 1; - colorBackground[] = {0, 0, 0, 0};//0.5 - colorText[] = {0, 0, 0, 0}; - x = "safezoneX"; - y = "safezoneY"; - w = "safezoneW"; - h = "safezoneH"; + idd = -1; + movingEnable = false; + onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(dlgDisableMouse)),_this select 0)];); + objects[] = {}; + class controlsBackground { + class Background { + idc = -1; + moving = 0; + font = "TahomaB"; + text = ""; + sizeEx = 0; + lineSpacing = 0; + access = 0; + type = 0; + style = 0; + size = 1; + colorBackground[] = {0, 0, 0, 0};//0.5 + colorText[] = {0, 0, 0, 0}; + x = "safezoneX"; + y = "safezoneY"; + w = "safezoneW"; + h = "safezoneH"; + }; }; - }; }; diff --git a/addons/common/functions/fnc_progressBar.sqf b/addons/common/functions/fnc_progressBar.sqf index 3191a57d72..03c56398c4 100644 --- a/addons/common/functions/fnc_progressBar.sqf +++ b/addons/common/functions/fnc_progressBar.sqf @@ -26,7 +26,7 @@ PARAMS_4(_totalTime,_args,_onFinish,_onFail); DEFAULT_PARAM(4,_localizedTitle,""); DEFAULT_PARAM(5,_condition,{true}); DEFAULT_PARAM(6,_exceptions,[]); -private ["_player", "_perFrameFunction"]; +private ["_player", "_perFrameFunction", "_ctrlPos"]; _player = ACE_player; @@ -35,14 +35,15 @@ closeDialog 0; createDialog QGVAR(ProgressBar_Dialog); (uiNamespace getVariable QGVAR(ctrlProgressBarTitle)) ctrlSetText _localizedTitle; -if (GVAR(SettingProgressBarLocation) == 1) then { - private "_ctrlPos"; - _ctrlPos = [1 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2), 29 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2), 38 * (((safezoneW / safezoneH) min 1.2) / 40), 0.8 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)]; - (uiNamespace getVariable QGVAR(ctrlProgressBar)) ctrlSetPosition _ctrlPos; - (uiNamespace getVariable QGVAR(ctrlProgressBarTitle)) ctrlSetPosition _ctrlPos; - (uiNamespace getVariable QGVAR(ctrlProgressBar)) ctrlCommit 0; - (uiNamespace getVariable QGVAR(ctrlProgressBarTitle)) ctrlCommit 0; -}; +//Adjust position based on user setting: +_ctrlPos = ctrlPosition (uiNamespace getVariable QGVAR(ctrlProgressBarTitle)); +_ctrlPos set [1, ((0 + 29 * GVAR(SettingProgressBarLocation)) * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2))]; +(uiNamespace getVariable QGVAR(ctrlProgressBarTitle)) ctrlSetPosition _ctrlPos; +(uiNamespace getVariable QGVAR(ctrlProgressBarTitle)) ctrlCommit 0; +_ctrlPos = ctrlPosition (uiNamespace getVariable QGVAR(ctrlProgressBar)); +_ctrlPos set [1, ((0.1 + 29 * GVAR(SettingProgressBarLocation)) * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2))]; +(uiNamespace getVariable QGVAR(ctrlProgressBar)) ctrlSetPosition _ctrlPos; +(uiNamespace getVariable QGVAR(ctrlProgressBar)) ctrlCommit 0; _perFrameFunction = { From 1a117a58932989057b63994d8b7e3406467f7748 Mon Sep 17 00:00:00 2001 From: jaynus Date: Wed, 15 Apr 2015 11:04:37 -0700 Subject: [PATCH 083/305] AMG documentation update. --- .../framework/advanced-missile-guidance.md | 101 +++++++++++++++++- 1 file changed, 99 insertions(+), 2 deletions(-) diff --git a/documentation/framework/advanced-missile-guidance.md b/documentation/framework/advanced-missile-guidance.md index e67bfbe0f3..3029b7b3bd 100644 --- a/documentation/framework/advanced-missile-guidance.md +++ b/documentation/framework/advanced-missile-guidance.md @@ -6,5 +6,102 @@ order: 5 parent: wiki --- -## 1. Overview -Blah blah blah \ No newline at end of file +# 1. Overview + +The ACE Advanced Missile Guidance Framework provides a setup of configuration settings, functions and a execution framework for addon makers to integrate with the missile guidance and targeting mechanisms of ACE. It also provides for mod makers to create their own custom guidance methods within the framework. + +The framework provides all the functionality needed for guidance; from laser locking, target specification and selection, to handling the fired events and tracking and steering the vehicle based on provided parameters. This way, all that needs to be defined in addons is the appropriate CfgAmmo entries for the missile. + +The framework also provides addon makers and scripters with the ability to configure custom seeker types and attack profiles, which are defined below. This allows for complete control of the guidance, locking and flight of a missile at the discretion of the addon maker. + +ACE3 provides a full suite of base concepts and guidance for the majority of modern missile weaponry avialable today; these includes all basic types of seekers (SALH/SACLOS/Optic/Thermal/etc) - as well as the different common attack profiles utilized with guided munitions (such as top-down attacks). + +Finally, flight profiles and mechanics for realistic missile simulations are also implemented; allowing for lock-steering bump guidance flight such as with the M47 Dragon or GBU steering fins, or finely tuned direct flight guidance which is currently avialable with other missile types. + +# 2. Details + +The framework is broken up into 3 major components: Locking Types, Seeker Types and Attack Profiles. In combination, these components build out the entire process of launching, locking and going terminal flight against targets. + +### Components + +##### 1. Locking Types +Locking types provide the basic functionality of targeting which will be based to a seeker type, providing target aquisition for seekers. This provides the basic functionality for providing pre-determined targets for a seeker, or allowing the seeker to perform its own target aquisition and locking. Additionally, the seeker may reference back into the locking type in order to re-perform target aquisition. + +##### 2. Seeker Types +Each seeker is generally assumed to be the logic for the seeker head unit within any given munition. Seekers within this framework provide the basic targeting functionality for the entire framework. The locking type will provide a generic target to the seeker, or the seeker may aquire a target on its own. The seeker then provides a target, either an object or a ASL position, which is then passed further into the framework. This target (or position) should be the actual current target position for the missiles flight. Seekers are required to perform all limitations and checks within their systems, although various limitations have been provided in this framework such as LOS FOV, laser guidance, etc. + +##### 3. Attack Profiles + +An attack profile adjusts the current target flight location to create the actual flight path of the missile. The attack profile is provided with all parameters of the system, including the returned target of the seeker. Using this information, the attack profile then will adjust the *direct flight target position* to specifically direct where and how the missile shall flight. + +## How it all ties together + +The system is executed in a linear series of calls to each step of the process, and feeding back the return from that step to the next step. Execution is conducted using Locking->Seeker->Profile, iteratively every frame of execution. Flight times are adjusted to accTime values and FPS lag, giving consistent flight. + +On each step of execution, a target specification array [targetObj, targetPos] is passed to the locking type, which then will return a possible modified target array. Next, this modified data is passed to the seeker type - which then, in turn, returns a position vector to the current "seeked" target position (ASL). Last, this target position is passed to the attack profile, who then returns an "adjusted attack position (ASL)", which is the location the missile should *currently* be homing on for flight. + +In the simplest sense, the entire system provides the flight trajectory of the missile homing directly on the "adjusted attack position"; thus, an attack profile would ajust this position to direct the missile. For example, Top down attacks return the adjusted attack position high above the target, until entering their terminal stages, which then changes the position to be directly ontop of the target - thus "walking the missile" along its flight path and to the kill. + +# 2. Adding AMG to a missile + +## Enabling guidance on Ammo Types +``` +class CfgAmmo { + class MissileBase; + class MyMissileType : MissileBase { + // Turn off arma crosshair-guidance + manualControl = 0; + + // Begin ACE guidance Configs + class ace_missileguidance { + enabled = 1; + + minDeflection = 0.00025; // Minium flap deflection for guidance + maxDeflection = 0.001; // Maximum flap deflection for guidance + incDeflection = 0.0005; // The incrmeent in which deflection adjusts. + + canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet modes. All 'recruit' games use vanilla locking + + // Seeker type and settings for munitions + defaultSeekerType = "SALH"; + seekerTypes[] = { "SALH", "LIDAR", "SARH", "Optic", "Thermal", "GPS", "SACLOS", "MCLOS" }; + + defaultSeekerLockMode = "LOAL"; + seekerLockModes[] = { "LOAL", "LOBL" }; + + seekerAngle = 90; // Angle in front of the missile which can be searched + seekerAccuracy = 1; // seeker accuracy multiplier + + seekerMinRange = 1; + seekerMaxRange = 2500; // Range from the missile which the seeker can visually search + + // Attack profile type selection + defaultAttackProfile = "LIN"; + attackProfiles[] = { "LIN", "DIR", "MID", "HI" }; + }; +``` + +# 2. Creating your own custom seekers and attack profiles + +## Adding seeker types and attack profiles + +``` +class ace_missileguidance_attackProfiles{ + class MyAttackProfile { + name = ""; + visualName = ""; + description = ""; + + functionName = "my_fnc_doAttackProfile"; + }; +}; +class ace_missileguidance_seekerTypes { + class MySeekerType { + name = ""; + visualName = ""; + description = ""; + + functionName = "my_fnc_doSeekerType"; + }; +}; +``` \ No newline at end of file From bc5b9bdfe90ec202de318099019fa5d9ea90e724 Mon Sep 17 00:00:00 2001 From: FreeZbe Date: Wed, 15 Apr 2015 20:11:08 +0200 Subject: [PATCH 084/305] French : update / fix strintable --- addons/interaction/stringtable.xml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index 680c0409c1..0c10336309 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -33,6 +33,7 @@ Left Arm + Bras gauche Linker Arm Brazo izquierdo Levá paže @@ -194,7 +195,7 @@ Asumir el liderazgo Przejmij dowodzenie Stát se velitelem - Devenir Leader + Devenir Chef de groupe Стать лидером Vezetés átvétele Tornar-se Líder @@ -564,7 +565,7 @@ Join Team<br/>Green Team Grün<br/>beitreten Unirse al<br/>equipo verde - Rejoindre<br/>Verte + Rejoindre<br/>Vert Dołącz do<br/>drużyny zielonej Připojit do<br/>Zeleného týmu Присоединиться<br/>к зеленой группе @@ -576,7 +577,7 @@ Join Team<br/>Blue Team Blau<br/>beitreten Unirse al<br/>equipo azul - Rejoindre<br/>Bleue + Rejoindre<br/>Bleu Dołącz do<br/>drużyny niebieskiej Připojit do<br/>Modrého týmu Присоединиться<br/>к синей группе From 3a062a4ff93cd6a5391505438e6287e0ce7db49d Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 15 Apr 2015 20:33:11 +0200 Subject: [PATCH 085/305] Fixed incorrect Mk319 Mod 0 BC/airFriction --- addons/atragmx/XEH_postInit.sqf | 2 +- addons/ballistics/CfgAmmo.hpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/atragmx/XEH_postInit.sqf b/addons/atragmx/XEH_postInit.sqf index 61bbf8b845..664bc76ba4 100644 --- a/addons/atragmx/XEH_postInit.sqf +++ b/addons/atragmx/XEH_postInit.sqf @@ -12,7 +12,7 @@ if (count (profileNamespace getVariable ["ACE_ATragMX_gunList", []]) > 0) then { ["10.4x77mm" , 910, 100, 0.0572, -0.0004800, 3.81, 0, 0.338, 0.338, 120, 0, 0, 27.15, "B_408_Ball" , "7Rnd_408_Mag" , 0.970, 1, "ASM" ], ["9.3×64mm" , 870, 100, 0.0632, -0.0007500, 3.81, 0, 0.338, 0.338, 120, 0, 0, 16.20, "B_93x64_Ball" , "10Rnd_93x64_DMR_05_Mag" , 0.368, 1, "ASM" ], ["8.6×70mm" , 915, 100, 0.0572, -0.0006100, 3.81, 0, 0.338, 0.338, 120, 0, 0, 16.20, "B_338_Ball" , "10Rnd_338_Mag" , 0.322, 7, "ICAO"], - ["7.62x51mm" , 850, 100, 0.0639, -0.0010000, 3.81, 0, 0.338, 0.338, 120, 0, 0, 9.460, "B_762x51_Ball" , "20Rnd_762x51_Mag" , 0.393, 1, "ICAO"], + ["7.62x51mm" , 820, 100, 0.0639, -0.0010000, 3.81, 0, 0.338, 0.338, 120, 0, 0, 9.460, "B_762x51_Ball" , "20Rnd_762x51_Mag" , 0.393, 1, "ICAO"], ["6.5x39mm" , 800, 100, 0.0689, -0.0009000, 3.81, 0, 0.338, 0.338, 120, 0, 0, 7.776, "B_65x39_Caseless" , "30Rnd_65x39_caseless_mag" , 0.263, 1, "ICAO"], ["5.56x45mm" , 920, 100, 0.0584, -0.0012650, 3.81, 0, 0.338, 0.338, 120, 0, 0, 4.000, "B_556x45_Ball" , "30Rnd_556x45_Stanag" , 0.304, 1, "ASM" ], ["5.56x45mm Mk262" , 850, 100, 0.0643, -0.0011250, 3.81, 0, 0.338, 0.338, 120, 0, 0, 4.990, "ACE_556x45_Ball_Mk262" , "ACE_30Rnd_556x45_Stanag_Mk262_mag", 0.361, 1, "ASM" ]]; diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index a0fa47c452..dfcd18aa52 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -181,7 +181,7 @@ class CfgAmmo { ACE_barrelLengths[]={16, 20, 24, 26}; }; class ACE_762x51_Ball_Mk319_Mod_0 : B_762x51_Ball { - airFriction=-0.0014; + airFriction=-0.00103; caliber=0.85; hit=14; typicalSpeed=890; @@ -189,7 +189,7 @@ class CfgAmmo { ACE_bulletLength=1.24; ACE_bulletMass=130; ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; - ACE_ballisticCoefficients[]={0.277}; + ACE_ballisticCoefficients[]={0.377}; ACE_velocityBoundaries[]={}; ACE_standardAtmosphere="ICAO"; ACE_dragModel=1; From d68cc8f40e86e04996cc9977f677aca6e56fe0da Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 15 Apr 2015 20:50:03 +0200 Subject: [PATCH 086/305] sync rallypoint marker on jip --- addons/respawn/CfgEventHandlers.hpp | 16 +++++----- .../respawn/functions/fnc_initRallypoint.sqf | 30 +++++++++++-------- .../respawn/functions/fnc_moveRallypoint.sqf | 2 +- .../functions/fnc_updateRallypoint.sqf | 5 ++-- 4 files changed, 29 insertions(+), 24 deletions(-) diff --git a/addons/respawn/CfgEventHandlers.hpp b/addons/respawn/CfgEventHandlers.hpp index 46ebd08657..00b6f01cea 100644 --- a/addons/respawn/CfgEventHandlers.hpp +++ b/addons/respawn/CfgEventHandlers.hpp @@ -30,45 +30,43 @@ class Extended_Respawn_EventHandlers { class Extended_Init_EventHandlers { class ACE_Rallypoint_West { class ADDON { - init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_nato_CO.paa'; [ARR_2(_this select 0,'')] call FUNC(initRallypoint)); + init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_nato_CO.paa'; [ARR_3(_this select 0,'',west)] call FUNC(initRallypoint)); }; }; class ACE_Rallypoint_East { class ADDON { - init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_CSAT_CO.paa'; [ARR_2(_this select 0,'')] call FUNC(initRallypoint)); + init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_CSAT_CO.paa'; [ARR_3(_this select 0,'',east)] call FUNC(initRallypoint)); }; }; class ACE_Rallypoint_Independent { class ADDON { - init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_AAF_CO.paa'; [ARR_2(_this select 0,'')] call FUNC(initRallypoint)); + init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_AAF_CO.paa'; [ARR_3(_this select 0,'',independent)] call FUNC(initRallypoint)); }; }; class ACE_Rallypoint_West_Base { class ADDON { - init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_nato_CO.paa'; [ARR_2(_this select 0,'respawn_west')] call FUNC(initRallypoint)); + init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_nato_CO.paa'; [ARR_3(_this select 0,'respawn_west',west)] call FUNC(initRallypoint)); }; }; class ACE_Rallypoint_East_Base { class ADDON { - init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_CSAT_CO.paa'; [ARR_2(_this select 0,'respawn_east')] call FUNC(initRallypoint)); + init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_CSAT_CO.paa'; [ARR_3(_this select 0,'respawn_east',east)] call FUNC(initRallypoint)); }; }; class ACE_Rallypoint_Independent_Base { class ADDON { - init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_AAF_CO.paa'; [ARR_2(_this select 0,'respawn_guerrila')] call FUNC(initRallypoint)); + init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_AAF_CO.paa'; [ARR_3(_this select 0,'respawn_guerrila',independent)] call FUNC(initRallypoint)); //respawn_civilian }; }; - - //respawn_civilian }; -// auto assign rallypoint leader class Extended_InitPost_EventHandlers { + // auto assign rallypoint leader class CAManBase { class ADDON { serverInit = QUOTE(_this call FUNC(handleInitPostServer)); diff --git a/addons/respawn/functions/fnc_initRallypoint.sqf b/addons/respawn/functions/fnc_initRallypoint.sqf index 81058614ed..44671b7c45 100644 --- a/addons/respawn/functions/fnc_initRallypoint.sqf +++ b/addons/respawn/functions/fnc_initRallypoint.sqf @@ -27,25 +27,31 @@ _name = typeOf _rallypoint; // init visible marker if (hasInterface) then { - private ["_marker", "_type"]; + // fix init having wrong position, vars etc. + [_rallypoint, _respawnMarker, _side, _name] spawn { + _rallypoint = _this select 0; + _respawnMarker = _this select 1; + _side = _this select 2; + _name = _this select 3; - _marker = format ["ACE_Marker_%1", _name]; + _marker = format ["ACE_Marker_%1", _name]; - // exit if it already exist - if (_marker in allMapMarkers) exitWith {}; + // exit if it already exist + if (_marker in allMapMarkers) exitWith {}; - _marker = createMarkerLocal [_marker, getPosASL _rallypoint]; - _type = ["selector_selectedFriendly", "selector_selectedEnemy"] select (_respawnMarker == ""); + _marker = createMarkerLocal [_marker, getPosASL _rallypoint]; + _type = ["selector_selectedFriendly", "selector_selectedEnemy"] select (_respawnMarker == ""); - _marker setMarkerTypeLocal _type; - _marker setMarkerAlphaLocal ([0,1] select (_side == playerSide)); // playerSide to guarantee init + _marker setMarkerTypeLocal _type; + _marker setMarkerAlphaLocal ([0,1] select (_side == playerSide)); // playerSide to guarantee init - private "_markerDate"; - _markerDate = _rallypoint getVariable [QGVAR(markerDate), ""]; + private "_markerDate"; + _markerDate = _rallypoint getVariable [QGVAR(markerDate), ""]; - _marker setMarkerTextLocal _markerDate; + _marker setMarkerTextLocal _markerDate; - _rallypoint setVariable [QGVAR(marker), _marker]; + _rallypoint setVariable [QGVAR(marker), _marker]; + }; }; if (!isServer) exitWith {}; diff --git a/addons/respawn/functions/fnc_moveRallypoint.sqf b/addons/respawn/functions/fnc_moveRallypoint.sqf index 2b008bf122..62d2742ef9 100644 --- a/addons/respawn/functions/fnc_moveRallypoint.sqf +++ b/addons/respawn/functions/fnc_moveRallypoint.sqf @@ -46,7 +46,7 @@ _this spawn { _rallypoint setVariable [QGVAR(markerDate), format ["%1:%2", date select 3, date select 4], true]; - ["rallypointMoved", [_rallypoint, _side]] call EFUNC(common,globalEvent); + ["rallypointMoved", [_rallypoint, _side, _position]] call EFUNC(common,globalEvent); [localize "STR_ACE_Respawn_Deployed"] call EFUNC(common,displayTextStructured); }; diff --git a/addons/respawn/functions/fnc_updateRallypoint.sqf b/addons/respawn/functions/fnc_updateRallypoint.sqf index 2510a58a30..248955155a 100644 --- a/addons/respawn/functions/fnc_updateRallypoint.sqf +++ b/addons/respawn/functions/fnc_updateRallypoint.sqf @@ -1,10 +1,11 @@ // by commy2 #include "script_component.hpp" -private ["_rallypoint", "_side"]; +private ["_rallypoint", "_side", "_position"]; _rallypoint = _this select 0; _side = _this select 1; +_position = _this select 2; if (!hasInterface) exitWith {}; @@ -13,5 +14,5 @@ private ["_marker", "_markerDate"]; _marker = _rallypoint getVariable [QGVAR(marker), ""]; _markerDate = _rallypoint getVariable [QGVAR(markerDate), ""]; -_marker setMarkerPosLocal getPosASL _rallypoint; +_marker setMarkerPosLocal _position; _marker setMarkerTextLocal _markerDate; From fa14befe63774c4e2e6d16b6b85cc299e02f8f27 Mon Sep 17 00:00:00 2001 From: Clon1998 Date: Wed, 15 Apr 2015 20:51:29 +0200 Subject: [PATCH 087/305] Update AUTHORS.txt Added my self to the # CONTRIBUTORS --- AUTHORS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.txt b/AUTHORS.txt index e2930ee461..fa47b6a427 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -33,6 +33,7 @@ Aggr094 Anthariel BlackQwar Brakoviejo +Clon1998 Codingboy Crusty eRazeri From 550c32e801ff7e2a0483db52ddcad052ccd4d1ef Mon Sep 17 00:00:00 2001 From: FreeZbe Date: Wed, 15 Apr 2015 20:53:41 +0200 Subject: [PATCH 088/305] French : update stringtable --- addons/ballistics/stringtable.xml | 88 ++++++++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 2 deletions(-) diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index 4786555236..d47bec4c63 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -443,360 +443,444 @@ .338 NM 130Rnd Tracer Belt .338 NM 130-Schuss-Gurt Leuchtspur Taśma .338 NM 130rd Smugacz + Bande .338 NM 130Cps Traçante .338 NM Tracer .338 NM Leuchtspur .338 NM Tracer .338 NM Svítící + .338 NM Traçante Caliber: .338 Norma Magnum Tracer<br />Rounds: 130<br />Used in: SPMG Kaliber: .338 Norma Magnum Leuchtspur<br />Schuss: 130<br />Verwendet für: SPMG Kaliber: .338 Norma Magnum Smugacz<br />Pociski: 130<br />Używany w: SPMG + Calibre: .338 Norma Magnum Traçante<br />Cartouches: 130<br />Utilisé dans: SPMG .338 NM 130Rnd IR-DIM Belt .338 NM 130-Schuss-Gurt Leuchtspur IR-DIM Taśma .338 NM 130rd IR-DIM + Bande .338 NM 130Cps IR-DIM .338 NM IR-DIM .338 LM IR-DIM .338 NM IR-DIM .338 NM IR-DIM + .338 NM IR-DIM Caliber: .338 Norma Magnum Tracer IR-DIM<br />Rounds: 130<br />Used in: SPMG Kaliber: .338 Norma Magnum Leuchtspur IR-DIM<br />Schuss: 130<br />Verwendet für: SPMG Kaliber: .338 Norma Magnum Smugacz IR-DIM<br />Pociski: 130<br />Używany w: SPMG + Calibre: .338 Norma Magnum Traçante IR-DIM<br />Cartouches: 130<br />Utilisé dans: SPMG .338 NM 130Rnd AP Belt .338 NM 130-Schuss-Gurt Hartkern Taśma .338 NM 130rd AP + Bande .338 NM 130Cps AP .338 NM AP .338 NM AP .338 NM AP .338 NM AP + .338 NM AP Caliber: .338 Norma Magnum AP<br />Rounds: 130<br />Used in: SPMG Kaliber: .338 Norma Magnum Hartkern<br />Schuss: 130<br />Verwendet für: SPMG Kaliber: .338 Norma Magnum AP<br />Pociski: 130<br />Używane w: SPMG + Calibre: .338 Norma Magnum AP<br />Cartouches: 130<br />Utilisé dans: SPMG 9.3mm 10Rnd Tracer Mag 9,3mm 10-Schuss-Magazin Leuchtspur Magazynek 9.3mm 10rd Smugacz + Chargeur 9.3mm 10Cps Traçante 9.3mm Tracer 9,3mm Leuchtspur 9,3mm Smugacz 9.3mm Svítící + 9.3mm Traçante Caliber: 9.3x64mm Tracer<br />Rounds: 10<br />Used in: Cyrus Kaliber: 9,3x64mm Leuchtspur<br />Schuss: 10<br />Verwendet für: Cyrus Kaliber: 9,3x64 mm Smugacz<br />Pociski: 10<br />Używany w: Cyrus + Calibre: 9.3x64mm Traçante<br />Cartouches: 10<br />Utilisé dans: Cyrus 9.3mm 10Rnd Tracer IR-DIM Mag 9,3mm 10-Schuss-Magazin Leuchtspur IR-DIM Magazynek 9,3mm 10rd Smugacz IR-DIM + Chargeur 9.3mm 10Cps Traçante IR-DIM 9.3mm IR-DIM 9,3mm IR-DIM 9,3mm IR-DIM 9.3mm IR-DIM + 9.3mm IR-DIM Caliber: 9.3x64mm Tracer IR-DIM<br />Rounds: 10<br />Used in: Cyrus Kaliber: 9,3x64mm Leuchtspur IR-DIM<br />Schuss: 10<br />Verwendet für: Cyrus Kaliber: 9,3x64 mm Smugacz IR-DIM<br />Pociski: 10<br />Używany w: Cyrus + Calibre: 9.3x64mm Traçante IR-DIM<br />Cartouches: 10<br />Utilisé dans: Cyrus 9.3mm 10Rnd AP Mag 9,3mm 10-Schuss-Magazin Hartkern Magazynek 9,3mm 10rd AP + Chargeur 9.3mm 10Cps AP 9.3mm AP 9,3mm AP 9,3mm AP 9.3mm AP + 9.3mm AP Caliber: 9.3x64mm AP<br />Rounds: 10<br />Used in: Cyrus Kaliber: 9,3x64mm Hartkern<br />Schuss: 10<br />Verwendet für: Cyrus Kaliber: 9,3x64 mm AP<br />Pociski: 10<br />Używany w: Cyrus + Calibre: 9.3x64mm AP<br />Cartouches: 10<br />Utilisé dans: Cyrus 9.3mm 150Rnd Tracer Belt 9,3mm 150-Schuss-Gurt Leuchtspur Taśma 9,3mm 150rd Smugacz + Bande 9.3mm 150Cps Traçante 9.3mm Tracer 9,3mm Leuchtspur 9,3mm Smugacz 9.3mm Svítící + 9.3mm Traçante Caliber: 9.3x64mm Tracer<br />Rounds: 150<br />Used in: Navid Kaliber: 9,3x64mm Leuchtspur<br />Schuss: 150<br />Verwendet für: Navid Kaliber: 9,3x64 mm Smugacz<br />Pociski: 150<br />Używane w: Navid + Calibre: 9.3x64mm Traçante<br />Cartouches: 150<br />Utilisé dans: Navid 9.3mm 150Rnd Tracer IR-DIM Belt 9,3mm 150-Schuss-Gurt Leuchtspur IR-DIM Taśma 9,3mm 150rd Smugacz IR-DIM + Bande 9.3mm 150Cps Traçante IR-DIM 9.3mm IR-DIM 9,3mm IR-DIM 9,3mm IR-DIM 9.3mm IR-DIM + 9.3mm IR-DIM Caliber: 9.3x64mm Tracer IR-DIM<br />Rounds: 150<br />Used in: Navid Kaliber: 9,3x64mm Leuchtspur IR-DIM<br />Schuss: 150<br />Verwendet für: Navid Kaliber: 9,3x64 mm Smugacz IR-DIM<br />Pociski: 150<br />Używane w: Navid + Calibre: 9.3x64mm Traçante IR-DIM<br />Cartouches: 150<br />Utilisé dans: Navid 9.3mm 150Rnd AP Belt 9,3mm 150-Schuss-Gurt Hartkern Taśma 9,3mm 150rd AP + Bande 9.3mm 150Cps AP 9.3mm AP 9,3mm AP 9,3mm AP 9.3mm AP + 9.3mm AP Caliber: 9.3x64mm AP<br />Rounds: 150<br />Used in: Navid Kaliber: 9,3x64mm Hartkern<br />Schuss: 150<br />Verwendet für: Navid Kaliber: 9,3x64 mm AP<br />Pociski: 150<br />Używane w: Navid + Calibre: 9.3x64mm AP<br />Cartouches: 150<br />Utilisé dans: Navid 9x19mm 16Rnd Mag Magazynek 9x19mm 16rd + Chargeur 9x19mm 16Cps 9x19mm 9x19mm + 9x19mm - 9x19mm 16Rnd Mag + 9x19mm 30Rnd Mag Magazynek 9x19mm 16rd + 9x19mm 30Cps 9x19mm 30Rnd Mag Magazynek 9x19mm 30rd + 9x19mm 30Cps 9x19mm 9x19mm + 9x19mm 9x19mm 30Rnd Mag Magazynek 9x19mm 30rd + 9x19mm 30Cps 7.62x54mm 10Rnd Tracer IR-DIM Mag Magazynek 7,62x54 mm 10rd Smugacz IR-DIM + Chargeur 7.62x54mm 10Rnd Traçante IR-DIM 7.62mm IR-DIM 7,62mm IR-DIM + 7.62mm IR-DIM 7.62x54mm 10Rnd Tracer IR-DIM Mag Magazynek 7,62x54 mm 10rd Smugacz IR-DIM + Chargeur 7.62x54mm 10Cps Traçante IR-DIM 6.5mm 100Rnd Tracer IR-DIM Mag Magazynek 6,5mm 100rd Smugacz IR-DIM + Chargeur 6.5mm 100Rnd Traçante IR-DIM 6.5mm IR-DIM 6,5mm IR-DIM + 6.5mm IR-DIM 6.5mm 100Rnd Tracer IR-DIM Mag Magazynek 6,5mm 100rd Smugacz IR-DIM + Chargeur 6.5mm 100Rnd Traçante IR-DIM 6.5mm 200Rnd Tracer IR-DIM Belt Magazynek 6,5mm 200rd Smugacz IR-DIM + Bande 6.5mm 200Rnd Traçante IR-DIM 6.5mm IR-DIM 6,5mm IR-DIM + 6.5mm IR-DIM 6.5mm 200Rnd Tracer IR-DIM Belt Magazynek 6,5mm 200rd Smugacz IR-DIM + Bande 6.5mm 200Cps Traçante IR-DIM 5.56mm 30Rnd Mag (Mk262) Magazynek 5,56mm 30rd Mk262 + 5.56mm 30Cps (Mk262) 5.56mm Mk262 5,56mm Mk262 + 5.56mm Mk262 Caliber: 5.56x45 mm NATO (Mk262)<br />Rounds: 30 Kaliber: 5,56x45 mm NATO (Mk262)<br />Pociski: 30 + Calibre: 5.56x45 mm NATO (Mk262)<br />Cartouches: 30 5.56mm 30Rnd Mag (Mk318) Magazynek 5,56mm 30rd Mk318 + 5.56mm 30Cps (Mk318) 5.56mm Mk318 5,56mm Mk318 + 5.56mm Mk318 Caliber: 5.56x45 mm NATO (Mk318)<br />Rounds: 30 Kaliber: 5,56x45 mm NATO (Mk318)<br />Pociski: 30 + Calibre: 5.56x45 mm NATO (Mk318)<br />Cartouches: 30 7.62mm 10Rnd Mag (M118LR) Magazynek 7,62mm 10rd (M118LR) + 7.62mm 10Cps (M118LR) 7.62mm M118LR 7,62mm M118LR + 7.62mm M118LR Caliber: 7.62x51 mm NATO (M118LR)<br />Rounds: 10 Kaliber: 7,62x51 mm NATO (M118LR)<br />Pociski: 10 + Calibre: 7.62x51 mm NATO (M118LR)<br />Cartouches: 10 7.62mm 20Rnd Mag (M118LR) Magazynek 7,62mm 20rd (M118LR) + 7.62mm 20Cps (M118LR) 7.62mm M118LR 7,62mm M118LR + 7.62mm M118LR Caliber: 7.62x51 mm NATO (M118LR)<br />Rounds: 20 Kaliber: 7,62x51 mm NATO (M118LR)<br />Pociski: 20 + Calibre: 7.62x51 mm NATO (M118LR)<br />Cartouches: 20 7.62mm 10Rnd Mag (Mk319 Mod 0) Magazynek 7,62mm 10rd (Mk319 Mod 0) + 7.62mm 10Cps (Mk319 Mod 0) 7.62mm Mk319 7,62mm Mk319 + 7.62mm Mk319 Caliber: 7.62x51 mm NATO (Mk319 Mod 0)<br />Rounds: 10 Kaliber: 7,62x51 mm NATO (Mk319 Mod 0)<br />Pociski: 10 + Calibre: 7.62x51 mm NATO (Mk319 Mod 0)<br />Cartouches: 10 7.62mm 20Rnd Mag (Mk319 Mod 0) Magazynek 7,62mm 20rd (Mk319 Mod 0) + 7.62mm 20Cps (Mk319 Mod 0) 7.62mm Mk319 7,62mm Mk319 + 7.62mm Mk319 Caliber: 7.62x51 mm NATO (Mk319 Mod 0)<br />Rounds: 20 Kaliber: 7,62x51 mm NATO (Mk319 Mod 0)<br />Pociski: 20 + Calibre: 7.62x51 mm NATO (Mk319 Mod 0)<br />Cartouches: 20 7.62mm 20Rnd Mag (Mk248 Mod 0) Magazynek 7,62mm 20rd (Mk248 Mod 0) + 7.62mm 20Cps (Mk248 Mod 0) 7.62mm (Mk248 Mod 0) 7,62mm (Mk248 Mod 0) + 7.62mm (Mk248 Mod 0) Caliber: 7.62x67 mm NATO (Mk248 Mod 0)<br />Rounds: 20 - Kaliber: 7,62x51 mm NATO (Mk248 Mod 0)<br />Pociski: 20 + Kaliber: 7,62x67 mm NATO (Mk248 Mod 0)<br />Pociski: 20 + Calibre: 7.62x67mm NATO (Mk248 Mod 0)<br />Cartouches: 20 7.62mm 20Rnd Mag (Mk248 Mod 1) Magazynek 7,62mm 20rd (Mk248 Mod 1) + 7.62mm 20Cps (Mk248 Mod 1) 7.62mm (Mk248 Mod 1) 7,62mm (Mk248 Mod 1) + 7.62mm (Mk248 Mod 1) Caliber: 7.62x67 mm NATO (Mk248 Mod 1)<br />Rounds: 20 Kaliber: 7,62x67 mm NATO (Mk248 Mod 1)<br />Pociski: 20 + Calibre: 7.62x67mm NATO (Mk248 Mod 1)<br />Cartouches: 20 7.62mm 20Rnd Mag (Berger Hybrid OTM) Magazynek 7,62mm 20rd (Berger Hybrid OTM) + 7.62 20Cps (Berger Hybrid OTM) 7.62mm (OTM) 7,62mm (OTM) + 7.62mm (OTM) Caliber: 7.62x67 mm NATO (Berger Hybrid OTM)<br />Rounds: 20 Kaliber: 7,62x67 mm NATO (Berger Hybrid OTM)<br />Pociski: 20 + Calibre: 7.62x67mm NATO (Berger Hybrid OTM)<br />Cartouches: 20 6.5x47mm 30Rnd Mag (HPBT Scenar) + 6.5x47mm 30Cps (HPBT Scenar) 6.5mm Scenar + 6.5mm Scenar Caliber: 6.5x47mm (HPBT Scenar)<br />Rounds: 30 + Calibre: 6.5x47mm (HPBT Scenar)<br />Cartouches: 30 .338 10Rnd Mag (300gr Sierra MatchKing HPBT) + .338 10 Cps (300gr Sierra MatchKing HPBT) .338 (HPBT) + .338 (HPBT) Caliber: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />Rounds: 10 + Calibre: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />Cartouches: 10 .338 10Rnd Mag (API526) + .338 10Cps (API526) .338 AP + .338 AP Caliber: 8.6x70mm (API526)<br />Rounds: 10 + Calibre: 8.6x70mm (API526)<br />Cartouches: 10 12.7x99mm 5Rnd Mag + 12.7x99mm 5Cps 12.7mm + 12.7mm Caliber: 12.7x99mm<br />Rounds: 5 + Calibre: 12.7x99mm<br />Cartouches: 5 12.7x99mm 5Rnd Mag (AMAX) + 12.7x99mm 5Rnd Mag (AMAX) 12.7mm + 12.7mm Caliber: 12.7x99mm (AMAX)<br />Rounds: 5 + Calibre: 12.7x99mm (AMAX)<br />Cartouches: 5 From 5bcb0ec4930cf08f0d9bfeb3e4874edfc1dccadf Mon Sep 17 00:00:00 2001 From: jaynus Date: Wed, 15 Apr 2015 12:09:47 -0700 Subject: [PATCH 089/305] Forgot to set terminal on short-range attacks. Fixes #630 --- .../functions/fnc_attackProfile_JAV_TOP.sqf | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf b/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf index fd86c2bf03..6b15a3e20a 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf @@ -48,9 +48,12 @@ switch( (_state select 0) ) do { _cruisAlt = 140 * (_distanceShooterToTarget/1250); TRACE_1("_cruisAlt", _cruisAlt); }; - if( ((ASLToATL _projectilePos) select 2) - ((ASLToATL _seekerTargetPos) select 2) >= _cruisAlt) then { - _state set[0, STAGE_COAST]; + if(_cruisAlt < 140) then { + _state set[0, STAGE_TERMINAL]; + } else { + _state set[0, STAGE_COAST]; + }; } else { _returnTargetPos = _seekerTargetPos vectorAdd [0,0,_distanceToTarget*2]; }; From c0dbf10971277d1ced73550ba1df852622f11b4f Mon Sep 17 00:00:00 2001 From: FreeZbe Date: Wed, 15 Apr 2015 21:14:00 +0200 Subject: [PATCH 090/305] French : update stringtable --- addons/kestrel4500/stringtable.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/addons/kestrel4500/stringtable.xml b/addons/kestrel4500/stringtable.xml index 3a0e18b9e5..bd9133f625 100644 --- a/addons/kestrel4500/stringtable.xml +++ b/addons/kestrel4500/stringtable.xml @@ -18,32 +18,38 @@ Kestrel 4500 Pocket Weather Tracker Anemomentr skrzydełkowy Kestrel 4500 Карманная метеостанция Kestrel 4500NV + Station météo portable Kestrel 4500 Open Kestrel 4500 Otwórz Kestrel 4500 Kestrel 4500 elővétele Открыть Kestrel 4500NV + Ouvrir Kestrel 4500 Show Kestrel 4500 Pokaż Kestrel 4500 Показать Kestrel 4500NV + Afficher Kestrel 4500 Hide Kestrel 4500 Ukryj Kestrel 4500 Убрать Kestrel 4500NV + Cacher Kestrel 4500 Open Kestrel 4500 Otwórz Kestrel 4500 Открыть Kestrel 4500NV + Ouvrir Kestrel 4500 Show Kestrel 4500 Pokaż Kestrel 4500 Показать Kestrel 4500NV + Afficher Kestrel 4500 From df61f5c995df9227e4be9ad3150dda395b44e9ae Mon Sep 17 00:00:00 2001 From: FreeZbe Date: Wed, 15 Apr 2015 21:15:57 +0200 Subject: [PATCH 091/305] French : update stringtable --- addons/interact_menu/stringtable.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index 8960f99e60..4a763e4fa9 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -15,6 +15,7 @@ Display interaction menus as lists Mostrar los menus de interacción como listas Показывать меню взаимодействия в виде списка + Afficher le menu d'interaction au format liste Interact Key From 56f6c60e1af394dfeb3b51c22f151ccb91964d6f Mon Sep 17 00:00:00 2001 From: FreeZbe Date: Wed, 15 Apr 2015 21:17:35 +0200 Subject: [PATCH 092/305] French : update stringtable --- addons/weather/stringtable.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/weather/stringtable.xml b/addons/weather/stringtable.xml index 85b1e96383..46a0653269 100644 --- a/addons/weather/stringtable.xml +++ b/addons/weather/stringtable.xml @@ -6,6 +6,7 @@ Show Wind Info Pokaż inf. o wietrze Показать информацию о погоде + Afficher information du vent From 18c65108c3421e23ef96caec1d0e160937cd95ff Mon Sep 17 00:00:00 2001 From: FreeZbe Date: Wed, 15 Apr 2015 21:24:24 +0200 Subject: [PATCH 093/305] French : update stringtable --- addons/laserpointer/stringtable.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/laserpointer/stringtable.xml b/addons/laserpointer/stringtable.xml index eb328e5997..cf4dd742b0 100644 --- a/addons/laserpointer/stringtable.xml +++ b/addons/laserpointer/stringtable.xml @@ -48,18 +48,21 @@ Laser Laser Лазер + Laser IR Laser IR-Laser Laser IR ИК-лазер + Laser IR Switch Laser / IR Laser Umschalten Laser / IR-Laser Przełącz Laser / Laser IR Изменить режим Лазер / ИК-лазер + Changer Laser / Laser IR From 10cf02e8569dc4305daa7aca8b496198b82f3534 Mon Sep 17 00:00:00 2001 From: jaynus Date: Wed, 15 Apr 2015 12:25:57 -0700 Subject: [PATCH 094/305] Slower climb phase.Refs #630 --- .../missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf | 4 ++-- .../missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf b/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf index 822afd7f1b..ecb469527a 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf @@ -48,12 +48,12 @@ switch( (_state select 0) ) do { if( ((ASLToATL _projectilePos) select 2) - ((ASLToATL _seekerTargetPos) select 2) >= _cruisAlt) then { _state set[0, STAGE_TERMINAL]; } else { - _returnTargetPos = _seekerTargetPos vectorAdd [0,0,_distanceToTarget*2]; + _returnTargetPos = _seekerTargetPos vectorAdd [0,0,_distanceToTarget*1.5]; }; }; case STAGE_TERMINAL: { TRACE_1("STAGE_TERMINAL",""); - //_returnTargetPos = _seekerTargetPos vectorAdd [0,0,_distanceToTarget * 0.02]; + _returnTargetPos = _seekerTargetPos vectorAdd [0,0,_distanceToTarget * 0.002]; }; }; diff --git a/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf b/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf index 6b15a3e20a..c5933e6df9 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf @@ -55,7 +55,7 @@ switch( (_state select 0) ) do { _state set[0, STAGE_COAST]; }; } else { - _returnTargetPos = _seekerTargetPos vectorAdd [0,0,_distanceToTarget*2]; + _returnTargetPos = _seekerTargetPos vectorAdd [0,0,_distanceToTarget*1.5]; }; }; case STAGE_COAST: { @@ -70,6 +70,7 @@ switch( (_state select 0) ) do { case STAGE_TERMINAL: { TRACE_1("STAGE_TERMINAL",""); //_returnTargetPos = _seekerTargetPos vectorAdd [0,0,_distanceToTarget * 0.02]; + _returnTargetPos = _seekerTargetPos vectorAdd [0,0,_distanceToTarget * 0.002]; }; }; From 5a7ad8217064ab3333c49f918668ac646972fb3a Mon Sep 17 00:00:00 2001 From: FreeZbe Date: Wed, 15 Apr 2015 21:26:12 +0200 Subject: [PATCH 095/305] French : update stringtable --- addons/advanced_ballistics/stringtable.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/advanced_ballistics/stringtable.xml b/addons/advanced_ballistics/stringtable.xml index b0a6e97f34..badba32960 100644 --- a/addons/advanced_ballistics/stringtable.xml +++ b/addons/advanced_ballistics/stringtable.xml @@ -7,12 +7,14 @@ Pokaż inf. o wietrze Mostra indicazioni del vento Показать информацию о ветре + Afficher les info du vent Show Protractor Pokaż kątomierz Mostra il rapportatore Показать транспортир + Afficher le rapporteur From 6f6d080dbdea800fc81015978669acb2841ddcfa Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 15 Apr 2015 22:16:54 +0200 Subject: [PATCH 096/305] port inject sound --- addons/medical/sounds/Inject.ogg | Bin 0 -> 30817 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 addons/medical/sounds/Inject.ogg diff --git a/addons/medical/sounds/Inject.ogg b/addons/medical/sounds/Inject.ogg new file mode 100644 index 0000000000000000000000000000000000000000..8418078e0f65f738b3bc5ded07cb9b17e8711ced GIT binary patch literal 30817 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 Date: Wed, 15 Apr 2015 22:19:43 +0200 Subject: [PATCH 097/305] port alternative wirecutter sound --- addons/logistics_wirecutter/sound/wirecut.ogg | Bin 0 -> 5488 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 addons/logistics_wirecutter/sound/wirecut.ogg diff --git a/addons/logistics_wirecutter/sound/wirecut.ogg b/addons/logistics_wirecutter/sound/wirecut.ogg new file mode 100644 index 0000000000000000000000000000000000000000..902488c1df6ea5076598a31c3df9f62a78975eaa GIT binary patch literal 5488 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 cYzesuCH3||T6!)NJ>g{vy+kF<6B=3mFW Date: Wed, 15 Apr 2015 22:49:47 +0200 Subject: [PATCH 098/305] Polished the ammo classes some more --- addons/ballistics/CfgAmmo.hpp | 127 +++++++++++++++++----------------- 1 file changed, 62 insertions(+), 65 deletions(-) diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index dfcd18aa52..1a783de813 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -85,7 +85,7 @@ class CfgAmmo { ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; ACE_ballisticCoefficients[]={0.168}; ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; + ACE_standardAtmosphere="ICAO"; ACE_dragModel=7; ACE_muzzleVelocities[]={780, 880, 920}; ACE_barrelLengths[]={10, 16.3, 20}; @@ -103,13 +103,13 @@ class CfgAmmo { ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; ACE_ballisticCoefficients[]={0.168}; ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; + ACE_standardAtmosphere="ICAO"; ACE_dragModel=7; ACE_muzzleVelocities[]={785, 883, 925}; ACE_barrelLengths[]={10, 16.3, 20}; }; class B_65x39_Caseless : BulletBase { - airFriction=-0.000772; + airFriction=-0.000785; typicalSpeed=800; ACE_caliber=0.264; ACE_bulletLength=1.295; @@ -142,8 +142,8 @@ class CfgAmmo { ACE_velocityBoundaries[]={}; ACE_standardAtmosphere="ICAO"; ACE_dragModel=7; - ACE_muzzleVelocities[]={760, 790, 820, 830}; - ACE_barrelLengths[]={16, 20, 24, 26}; + ACE_muzzleVelocities[]={730, 760, 790, 820, 830}; + ACE_barrelLengths[]={10, 16, 20, 24, 26}; }; class B_762x51_Ball : BulletBase { airFriction=-0.001035; @@ -173,10 +173,10 @@ class CfgAmmo { ACE_bulletLength=1.24; ACE_bulletMass=175; ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.505, 0.496, 0.485, 0.485, 0.485}; - ACE_velocityBoundaries[]={853, 549, 549, 549}; + ACE_ballisticCoefficients[]={0.243}; + ACE_velocityBoundaries[]={}; ACE_standardAtmosphere="ICAO"; - ACE_dragModel=1; + ACE_dragModel=7; ACE_muzzleVelocities[]={750, 780, 790, 794}; ACE_barrelLengths[]={16, 20, 24, 26}; }; @@ -196,57 +196,6 @@ class CfgAmmo { ACE_muzzleVelocities[]={838, 892, 910}; ACE_barrelLengths[]={13, 16, 20}; }; - class ACE_762x67_Ball_Mk248_Mod_0 : B_762x51_Ball - { - airFriction=-0.000830; - caliber=1.08; - hit=17; - typicalSpeed=900; - ACE_caliber=0.308; - ACE_bulletLength=1.353; - ACE_bulletMass=190; - 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.268}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={865, 900, 924}; - ACE_barrelLengths[]={20, 24, 26}; - }; - class ACE_762x67_Ball_Mk248_Mod_1 : B_762x51_Ball - { - airFriction=-0.000815; - caliber=1.12; - hit=18; - typicalSpeed=867; - ACE_caliber=0.308; - ACE_bulletLength=1.489; - ACE_bulletMass=220; - 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.310}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={847, 867, 877}; - ACE_barrelLengths[]={20, 24, 26}; - }; - class ACE_762x67_Ball_Berger_Hybrid_OTM : B_762x51_Ball - { - airFriction=-0.00076; - caliber=1.15; - hit=19; - typicalSpeed=853; - ACE_caliber=0.308; - ACE_bulletLength=1.602; - ACE_bulletMass=230; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.368}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={800, 853, 884}; - ACE_barrelLengths[]={20, 24, 26}; - }; class ACE_762x51_Ball_Subsonic : B_762x51_Ball { airFriction=-0.000535; caliber=0.5; @@ -263,6 +212,54 @@ class CfgAmmo { ACE_muzzleVelocities[]={305, 325, 335, 340}; ACE_barrelLengths[]={16, 20, 24, 26}; }; + class ACE_762x67_Ball_Mk248_Mod_0 : B_762x51_Ball { + airFriction=-0.000830; + caliber=1.08; + hit=17; + typicalSpeed=900; + ACE_caliber=0.308; + ACE_bulletLength=1.353; + ACE_bulletMass=190; + 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.268}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={865, 900, 924}; + ACE_barrelLengths[]={20, 24, 26}; + }; + class ACE_762x67_Ball_Mk248_Mod_1 : B_762x51_Ball { + airFriction=-0.000815; + caliber=1.12; + hit=18; + typicalSpeed=867; + ACE_caliber=0.308; + ACE_bulletLength=1.489; + ACE_bulletMass=220; + 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.310}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={847, 867, 877}; + ACE_barrelLengths[]={20, 24, 26}; + }; + class ACE_762x67_Ball_Berger_Hybrid_OTM : B_762x51_Ball { + airFriction=-0.00076; + caliber=1.15; + hit=19; + typicalSpeed=853; + ACE_caliber=0.308; + ACE_bulletLength=1.602; + ACE_bulletMass=230; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.368}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={800, 853, 884}; + ACE_barrelLengths[]={20, 24, 26}; + }; class B_762x54_Ball : BulletBase { airFriction=-0.001023; typicalSpeed=820; @@ -366,7 +363,7 @@ class CfgAmmo { ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; ACE_ballisticCoefficients[]={0.17}; ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; + ACE_standardAtmosphere="ICAO"; ACE_dragModel=1; ACE_muzzleVelocities[]={440, 460, 480}; ACE_barrelLengths[]={4, 5, 9}; @@ -381,7 +378,7 @@ class CfgAmmo { ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; ACE_ballisticCoefficients[]={0.125}; ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; + ACE_standardAtmosphere="ICAO"; ACE_dragModel=1; ACE_muzzleVelocities[]={298, 330, 350}; ACE_barrelLengths[]={3.8, 5, 9}; @@ -411,7 +408,7 @@ class CfgAmmo { ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; ACE_ballisticCoefficients[]={0.189}; ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; + ACE_standardAtmosphere="ICAO"; ACE_dragModel=1; ACE_muzzleVelocities[]={360, 400, 430}; ACE_barrelLengths[]={4, 4.61, 9}; @@ -488,7 +485,7 @@ class CfgAmmo { ACE_barrelLengths[]={29}; }; class B_338_Ball : BulletBase { - airFriction=-0.00061 + airFriction=-0.000606 typicalSpeed=915; ACE_caliber=0.338; ACE_bulletLength=1.558; @@ -516,7 +513,7 @@ class CfgAmmo { ACE_barrelLengths[]={20, 24, 26}; }; class ACE_338_Ball : B_338_Ball { - airFriction=-0.000526; + airFriction=-0.000535; caliber=1.55; typicalSpeed=826; ACE_caliber=0.338; @@ -531,7 +528,7 @@ class CfgAmmo { ACE_barrelLengths[]={20, 24, 26.5, 28}; }; class ACE_338_Ball_API526 : B_338_Ball { - airFriction=-0.000526; + airFriction=-0.000673; caliber=2.4; typicalSpeed=826; ACE_caliber=0.338; From 25e1fd2df3ef15953ed9ccf5c51ccad5f46c0367 Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 15 Apr 2015 22:50:04 +0200 Subject: [PATCH 099/305] Completely overworked the ATragMX gun list --- addons/atragmx/XEH_postInit.sqf | 42 +++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/addons/atragmx/XEH_postInit.sqf b/addons/atragmx/XEH_postInit.sqf index 664bc76ba4..9d769d84a3 100644 --- a/addons/atragmx/XEH_postInit.sqf +++ b/addons/atragmx/XEH_postInit.sqf @@ -6,16 +6,38 @@ if (count (profileNamespace getVariable ["ACE_ATragMX_gunList", []]) > 0) then { GVAR(gunList) = profileNamespace getVariable "ACE_ATragMX_gunList"; } else { // Profile Name, Muzzle Velocity, Zero Range, Scope Base Angle, AirFriction, Bore Height, Scope Unit, Elevation Scope Step, Windage Scope Step, Maximum Elevation, Dialed Elevation, Dialed Windage, Mass, Ammo Class Name, Magazine Class Name, BC, Drag Model, Atmosphere Model - GVAR(gunList) = [["12.7x108mm" , 820, 100, 0.0659, -0.0008600, 3.81, 0, 0.338, 0.338, 120, 0, 0, 48.28, "B_127x108_Ball" , "5Rnd_127x108_Mag" , 0.630, 1, "ASM" ], - ["12.7x99mm" , 880, 100, 0.0607, -0.0008600, 3.81, 0, 0.338, 0.338, 120, 0, 0, 41.92, "B_127x99_Ball" , "5Rnd_mas_127x99_Stanag" , 0.670, 1, "ASM" ], - ["12.7x54mm" , 290, 100, 0.3913, -0.0014000, 3.81, 0, 0.338, 0.338, 120, 0, 0, 61.56, "B_127x54_Ball" , "10Rnd_127x54_Mag" , 1.050, 1, "ASM" ], - ["10.4x77mm" , 910, 100, 0.0572, -0.0004800, 3.81, 0, 0.338, 0.338, 120, 0, 0, 27.15, "B_408_Ball" , "7Rnd_408_Mag" , 0.970, 1, "ASM" ], - ["9.3×64mm" , 870, 100, 0.0632, -0.0007500, 3.81, 0, 0.338, 0.338, 120, 0, 0, 16.20, "B_93x64_Ball" , "10Rnd_93x64_DMR_05_Mag" , 0.368, 1, "ASM" ], - ["8.6×70mm" , 915, 100, 0.0572, -0.0006100, 3.81, 0, 0.338, 0.338, 120, 0, 0, 16.20, "B_338_Ball" , "10Rnd_338_Mag" , 0.322, 7, "ICAO"], - ["7.62x51mm" , 820, 100, 0.0639, -0.0010000, 3.81, 0, 0.338, 0.338, 120, 0, 0, 9.460, "B_762x51_Ball" , "20Rnd_762x51_Mag" , 0.393, 1, "ICAO"], - ["6.5x39mm" , 800, 100, 0.0689, -0.0009000, 3.81, 0, 0.338, 0.338, 120, 0, 0, 7.776, "B_65x39_Caseless" , "30Rnd_65x39_caseless_mag" , 0.263, 1, "ICAO"], - ["5.56x45mm" , 920, 100, 0.0584, -0.0012650, 3.81, 0, 0.338, 0.338, 120, 0, 0, 4.000, "B_556x45_Ball" , "30Rnd_556x45_Stanag" , 0.304, 1, "ASM" ], - ["5.56x45mm Mk262" , 850, 100, 0.0643, -0.0011250, 3.81, 0, 0.338, 0.338, 120, 0, 0, 4.990, "ACE_556x45_Ball_Mk262" , "ACE_30Rnd_556x45_Stanag_Mk262_mag", 0.361, 1, "ASM" ]]; + GVAR(gunList) = [["12.7x108mm" , 820, 100, 0.0659, -0.0008600, 3.81, 0, 0.338, 0.338, 120, 0, 0, 48.28, "B_127x108_Ball" , "5Rnd_127x108_Mag" , 0.630, 1, "ASM" ], + + ["12.7x99mm AMAX" , 860, 100, 0.0612, -0.0008600, 3.81, 0, 0.338, 0.338, 120, 0, 0, 48.60, "B_127x99_Ball" , "5Rnd_mas_127x99_Stanag" , 1.050, 1, "ASM" ], + ["12.7x99mm" , 853, 100, 0.0623, -0.0008600, 3.81, 0, 0.338, 0.338, 120, 0, 0, 41.92, "B_127x99_Ball" , "5Rnd_mas_127x99_Stanag" , 0.670, 1, "ASM" ], + + ["12.7x54mm" , 300, 100, 0.3394, -0.0014000, 3.81, 0, 0.338, 0.338, 120, 0, 0, 48.60, "B_127x54_Ball" , "10Rnd_127x54_Mag" , 1.050, 1, "ASM" ], + + [".408 Chey Tac" , 910, 100, 0.0569, -0.0004800, 3.81, 0, 0.338, 0.338, 120, 0, 0, 27.15, "B_408_Ball" , "7Rnd_408_Mag" , 0.970, 1, "ASM" ], + + ["9.3×64mm" , 870, 100, 0.0619, -0.0007500, 3.81, 0, 0.338, 0.338, 120, 0, 0, 14.90, "B_93x64_Ball" , "10Rnd_93x64_DMR_05_Mag" , 0.368, 1, "ASM" ], + + [".338LM 250gr" , 880, 100, 0.0598, -0.0006060, 3.81, 0, 0.338, 0.338, 120, 0, 0, 16.20, "B_338_Ball" , "10Rnd_338_Mag" , 0.322, 7, "ICAO"], + [".338LM 300gr" , 800, 100, 0.0677, -0.0005350, 3.81, 0, 0.338, 0.338, 120, 0, 0, 19.44, "ACE_338_Ball" , "ACE_10Rnd_338_300gr_HPBT_Mag" , 0.381, 7, "ICAO"], + [".338LM API526" , 880, 100, 0.0601, -0.0006730, 3.81, 0, 0.338, 0.338, 120, 0, 0, 16.39, "ACE_338_Ball_API526" , "ACE_10Rnd_338_API526_Mag" , 0.290, 7, "ICAO"], + + [".300WM Mk248 Mod 0", 900, 100, 0.0584, -0.0008300, 3.81, 0, 0.338, 0.338, 120, 0, 0, 13.31, "ACE_762x67_Ball_Mk248_Mod_0" , "ACE_20Rnd_762x67_Mk248_Mod_0_Mag" , 0.268, 7, "ICAO"], + [".300WM Mk248 Mod 1", 867, 100, 0.0611, -0.0008150, 3.81, 0, 0.338, 0.338, 120, 0, 0, 14.26, "ACE_762x67_Ball_Mk248_Mod_1" , "ACE_20Rnd_762x67_Mk248_Mod_1_Mag" , 0.310, 7, "ICAO"], + [".300WM Berger OTM" , 853, 100, 0.0622, -0.0007600, 3.81, 0, 0.338, 0.338, 120, 0, 0, 14.90, "ACE_762x67_Ball_Berger_Hybrid_OTM", "ACE_20Rnd_762x67_Berger_Hybrid_OTM_Mag", 0.368, 7, "ICAO"], + + ["7.62x54mmR" , 800, 100, 0.0692, -0.0010230, 3.81, 0, 0.338, 0.338, 120, 0, 0, 9.849, "B_762x54_Ball" , "10Rnd_762x54_Mag" , 0.400, 1, "ICAO"], + + ["7.62x51mm M80" , 810, 100, 0.0679, -0.0010350, 3.81, 0, 0.338, 0.338, 120, 0, 0, 9.525, "B_762x51_Ball" , "20Rnd_762x51_Mag" , 0.200, 7, "ICAO"], + ["7.62x51mm M118LR" , 820, 100, 0.0662, -0.0008525, 3.81, 0, 0.338, 0.338, 120, 0, 0, 11.34, "ACE_762x51_Ball_M118LR" , "ACE_20Rnd_762x51_M118LR_Mag" , 0.243, 7, "ICAO"], + ["7.62x51mm Mk319" , 820, 100, 0.0670, -0.0010300, 3.81, 0, 0.338, 0.338, 120, 0, 0, 8.424, "ACE_762x51_Ball_Mk319_Mod_0" , "ACE_20Rnd_762x51_Mk319_Mod_0_Mag" , 0.377, 1, "ICAO"], + ["7.62x51mm Subsonic", 320, 100, 0.3060, -0.0004910, 3.81, 0, 0.338, 0.338, 120, 0, 0, 12.96, "ACE_762x51_Ball_Subsonic" , "ACE_20Rnd_762x51_Mag_SD" , 0.235, 7, "ICAO"], + + ["6.5x39mm" , 800, 100, 0.0683, -0.0007850, 3.81, 0, 0.338, 0.338, 120, 0, 0, 7.970, "B_65x39_Caseless" , "30Rnd_65x39_caseless_mag" , 0.263, 7, "ICAO"], + ["6.5x47mm Lapua" , 800, 100, 0.0682, -0.0007710, 3.81, 0, 0.338, 0.338, 120, 0, 0, 9.007, "ACE_65x47_Ball_Scenar" , "ACE_30Rnd_65x47_Scenar_mag" , 0.290, 7, "ICAO"], + + ["5.56x45mm M855" , 870, 100, 0.0626, -0.0012650, 3.81, 0, 0.338, 0.338, 120, 0, 0, 4.018, "B_556x45_Ball" , "30Rnd_556x45_Stanag" , 0.151, 7, "ASM" ], + ["5.56x45mm Mk262" , 820, 100, 0.0671, -0.0011250, 3.81, 0, 0.338, 0.338, 120, 0, 0, 4.990, "ACE_556x45_Ball_Mk262" , "ACE_30Rnd_556x45_Stanag_Mk262_mag" , 0.361, 1, "ASM" ], + ["5.56x45mm Mk318" , 880, 100, 0.0616, -0.0011200, 3.81, 0, 0.338, 0.338, 120, 0, 0, 4.018, "ACE_556x45_Ball_Mk318" , "ACE_30Rnd_556x45_Stanag_Mk318_mag" , 0.307, 1, "ASM" ]]; profileNamespace setVariable ["ACE_ATragMX_gunList", GVAR(gunList)]; }; From dd09cc4d0691d2f9c53492c1d6c717a151ce3866 Mon Sep 17 00:00:00 2001 From: Tachii Date: Thu, 16 Apr 2015 00:57:15 +0300 Subject: [PATCH 100/305] Update fnc_createAction.sqf typo --- addons/interact_menu/functions/fnc_createAction.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/interact_menu/functions/fnc_createAction.sqf b/addons/interact_menu/functions/fnc_createAction.sqf index 172bbea3a4..0b0030a1b4 100644 --- a/addons/interact_menu/functions/fnc_createAction.sqf +++ b/addons/interact_menu/functions/fnc_createAction.sqf @@ -19,7 +19,7 @@ * Action * * Example: - * [VulcanPinch","Vulcan Pinch","",{_target setDamage 1;},{true},{},[parameters], [0,0,0], 100] call ace_interact_menu_fnc_createAction; + * ["VulcanPinch","Vulcan Pinch","",{_target setDamage 1;},{true},{},[parameters], [0,0,0], 100] call ace_interact_menu_fnc_createAction; * * Public: No */ From 361efe41474cbe60a67389286a0c45acd6e06a4c Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 15 Apr 2015 17:03:59 -0500 Subject: [PATCH 101/305] Missing NoVoice words Protocol bin\config.bin/ACE_RadioProtocolNoRadio/: Missing word RallyUp / UnderFireE --- addons/common/CfgVoice.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/common/CfgVoice.hpp b/addons/common/CfgVoice.hpp index 9c53338e6e..1fb0f5d2b6 100644 --- a/addons/common/CfgVoice.hpp +++ b/addons/common/CfgVoice.hpp @@ -199,6 +199,8 @@ class ACE_RadioProtocolNoRadio: RadioProtocolBase { Ready[] = {}; Waiting[] = {}; StandingBy[] = {}; + RallyUp[] = {}; + UnderFireE[] = {}; /*IAmReady[] = {}; ReadyForOrders[] = {}; AwaitingOrders[] = {};*/ From c0c5af295799b8788c8cc5fee1b7bebf49da8993 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 15 Apr 2015 17:07:06 -0500 Subject: [PATCH 102/305] ballistics - fix ubc --- addons/ballistics/CfgAmmo.hpp | 4 ++-- addons/ballistics/CfgMagazines.hpp | 2 +- addons/ballistics/CfgWeapons.hpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 1a783de813..d82f336952 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -260,7 +260,7 @@ class CfgAmmo { ACE_muzzleVelocities[]={800, 853, 884}; ACE_barrelLengths[]={20, 24, 26}; }; - class B_762x54_Ball : BulletBase { + class B_762x54_Ball: B_762x51_Ball { airFriction=-0.001023; typicalSpeed=820; ACE_caliber=0.312; @@ -485,7 +485,7 @@ class CfgAmmo { ACE_barrelLengths[]={29}; }; class B_338_Ball : BulletBase { - airFriction=-0.000606 + airFriction=-0.000606; typicalSpeed=915; ACE_caliber=0.338; ACE_bulletLength=1.558; diff --git a/addons/ballistics/CfgMagazines.hpp b/addons/ballistics/CfgMagazines.hpp index ef36fcca78..9ce3ad3eb0 100644 --- a/addons/ballistics/CfgMagazines.hpp +++ b/addons/ballistics/CfgMagazines.hpp @@ -244,7 +244,7 @@ class CfgMagazines { initSpeed = 250; }; - class 30Rnd_45ACP_Mag_SMG_01_Tracer_Green: CA_Magazine { + class 30Rnd_45ACP_Mag_SMG_01_Tracer_Green: 30Rnd_45ACP_Mag_SMG_01 { initSpeed = 250; }; diff --git a/addons/ballistics/CfgWeapons.hpp b/addons/ballistics/CfgWeapons.hpp index dad5356755..26b07303c0 100644 --- a/addons/ballistics/CfgWeapons.hpp +++ b/addons/ballistics/CfgWeapons.hpp @@ -422,7 +422,7 @@ class CfgWeapons { ACE_barrelTwist=7; ACE_barrelLength=18.1; }; - class arifle_TRG21_GL_F: Tavor_base_F { + class arifle_TRG21_GL_F: arifle_TRG21_F { magazines[] = { "30Rnd_556x45_Stanag", "30Rnd_556x45_Stanag_Tracer_Red", From 0076be6a86e3890e0315c31a7d0a849d34dd1502 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 15 Apr 2015 17:08:35 -0500 Subject: [PATCH 103/305] Fix stringtables --- addons/captives/stringtable.xml | 2 +- addons/medical/stringtable.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/captives/stringtable.xml b/addons/captives/stringtable.xml index 54e5b26554..fec8e703b1 100644 --- a/addons/captives/stringtable.xml +++ b/addons/captives/stringtable.xml @@ -130,7 +130,7 @@ Motozás Обыскать человека Revistar - Perquisisci la persona/Italian> + Perquisisci la persona Surrender diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index d6b277463e..c9043b5b09 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -1416,7 +1416,7 @@ Déposer Elengedés Largar - + Rrilascia Load Patient Into From 0f4b7d0977f5d738f1e4fcc35aa1acadfbecdb70 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Thu, 16 Apr 2015 00:14:05 +0200 Subject: [PATCH 104/305] fixes #347 Please?? --- addons/medical/functions/fnc_treatmentTourniquet.sqf | 2 +- addons/medical/functions/fnc_treatmentTourniquetLocal.sqf | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/addons/medical/functions/fnc_treatmentTourniquet.sqf b/addons/medical/functions/fnc_treatmentTourniquet.sqf index cff9458426..da50c5c1bf 100644 --- a/addons/medical/functions/fnc_treatmentTourniquet.sqf +++ b/addons/medical/functions/fnc_treatmentTourniquet.sqf @@ -40,7 +40,7 @@ if ((_tourniquets select _part) > 0) exitwith { }; _removeItem = _items select 0; -[[_target, _removeItem], QUOTE(DFUNC(treatmentTourniquetLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ +[[_target, _removeItem, _selectionName], QUOTE(DFUNC(treatmentTourniquetLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ [_target, _removeItem] call FUNC(addToTriageCard); [_target, "activity", "STR_ACE_MEDICAL_ACTIVITY_appliedTourniquet", [[_caller] call EFUNC(common,getName)]] call FUNC(addToLog); diff --git a/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf b/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf index 064761aea0..3b1a351bab 100644 --- a/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf +++ b/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf @@ -16,12 +16,10 @@ private ["_target", "_tourniquetItem", "_part", "_tourniquets", "_applyingTo"]; _target = _this select 0; _tourniquetItem = _this select 1; +_selectionName = _this select 2; -//[_target,"treatment",format["%1 applied a tourniquet on %2",[_caller] call EFUNC(common,getName),_selectionName]] call FUNC(addActivityToLog); -//[_target,_removeItem] call FUNC(addToTriageList); [_target] call FUNC(addToInjuredCollection); - _part = [_selectionName] call FUNC(selectionNameToNumber); // Place a tourniquet on the bodypart From 59ae4623ff49d438b57a0294c68bc60508938983 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Thu, 16 Apr 2015 00:17:17 +0200 Subject: [PATCH 105/305] Derp --- addons/medical/functions/fnc_treatmentTourniquetLocal.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf b/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf index 3b1a351bab..289f852a06 100644 --- a/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf +++ b/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf @@ -13,7 +13,7 @@ */ #include "script_component.hpp" -private ["_target", "_tourniquetItem", "_part", "_tourniquets", "_applyingTo"]; +private ["_target", "_tourniquetItem", "_part", "_tourniquets", "_applyingTo", "_selectionName"]; _target = _this select 0; _tourniquetItem = _this select 1; _selectionName = _this select 2; From 23f47f97ae2b818381e6d42b4d7b4536cfc00ac5 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 15 Apr 2015 18:32:47 -0500 Subject: [PATCH 106/305] Wirecutter - better sound effects, cleanup --- .../logistics_wirecutter/CfgEventHandlers.hpp | 1 - addons/logistics_wirecutter/CfgSounds.hpp | 15 ++++-------- addons/logistics_wirecutter/CfgWeapons.hpp | 24 +++++++++---------- addons/logistics_wirecutter/config.cpp | 2 +- .../functions/fnc_cutDownFence.sqf | 19 ++++++++++----- .../functions/fnc_getNearestFence.sqf | 6 ++--- .../functions/fnc_interactEH.sqf | 2 +- .../functions/fnc_isFence.sqf | 13 +++++----- 8 files changed, 41 insertions(+), 41 deletions(-) diff --git a/addons/logistics_wirecutter/CfgEventHandlers.hpp b/addons/logistics_wirecutter/CfgEventHandlers.hpp index 79c3aaa959..3daad1425a 100644 --- a/addons/logistics_wirecutter/CfgEventHandlers.hpp +++ b/addons/logistics_wirecutter/CfgEventHandlers.hpp @@ -1,4 +1,3 @@ - class Extended_PreInit_EventHandlers { class ADDON { init = QUOTE(call COMPILE_FILE(XEH_preInit)); diff --git a/addons/logistics_wirecutter/CfgSounds.hpp b/addons/logistics_wirecutter/CfgSounds.hpp index 9958190ec1..aa5f3464f6 100644 --- a/addons/logistics_wirecutter/CfgSounds.hpp +++ b/addons/logistics_wirecutter/CfgSounds.hpp @@ -1,12 +1,7 @@ class CfgSounds { - class ACE_Wirecutter_sound { - name = "ACE_wirecutter_sound"; - sound[] = {QUOTE(PATHTOF(sound\wire_cut.ogg)), "db-0", 1}; - titles[] = {}; - }; - class ACE_Wirecutter_sound_long { - name = "ACE_wirecutter_sound_long"; - sound[] = {QUOTE(PATHTOF(sound\wire_cut_long.ogg)), "db-0", 1}; - titles[] = {}; - }; + class ACE_Wirecutter_sound { + name = "ACE_wirecutter_sound"; + sound[] = {QUOTE(PATHTOF(sound\wirecut.ogg)), "db-0", 1}; + titles[] = {}; + }; }; diff --git a/addons/logistics_wirecutter/CfgWeapons.hpp b/addons/logistics_wirecutter/CfgWeapons.hpp index 76b1003f34..648bc3a3f8 100644 --- a/addons/logistics_wirecutter/CfgWeapons.hpp +++ b/addons/logistics_wirecutter/CfgWeapons.hpp @@ -1,16 +1,16 @@ class CfgWeapons { - class InventoryItem_Base_F; - class ACE_ItemCore; + class InventoryItem_Base_F; + class ACE_ItemCore; - class ACE_wirecutter: ACE_ItemCore { - author = "$STR_ACE_Common_ACETeam"; - displayName = "$STR_ACE_logistics_wirecutter_wirecutterName"; - descriptionShort = "$STR_ACE_logistics_wirecutter_wirecutterDescription"; - model = "\A3\weapons_F\ammo\mag_univ.p3d"; - picture = QUOTE(PATHTOF(ui\item_wirecutter_ca.paa)); - scope = 2; - class ItemInfo: InventoryItem_Base_F { - mass = 100; + class ACE_wirecutter: ACE_ItemCore { + author = "$STR_ACE_Common_ACETeam"; + displayName = "$STR_ACE_logistics_wirecutter_wirecutterName"; + descriptionShort = "$STR_ACE_logistics_wirecutter_wirecutterDescription"; + model = "\A3\weapons_F\ammo\mag_univ.p3d"; + picture = QUOTE(PATHTOF(ui\item_wirecutter_ca.paa)); + scope = 2; + class ItemInfo: InventoryItem_Base_F { + mass = 100; + }; }; - }; }; diff --git a/addons/logistics_wirecutter/config.cpp b/addons/logistics_wirecutter/config.cpp index 6e1db15061..8e14bde892 100644 --- a/addons/logistics_wirecutter/config.cpp +++ b/addons/logistics_wirecutter/config.cpp @@ -3,7 +3,7 @@ class CfgPatches { class ADDON { units[] = {}; - weapons[] = {}; + weapons[] = {"ACE_wirecutter"}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_interaction"}; author[] = {"gpgpgpgp", "PabstMirror"}; diff --git a/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf b/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf index ee4c512cd2..0186ea4b3a 100644 --- a/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf +++ b/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf @@ -16,19 +16,26 @@ */ #include "script_component.hpp" +#define SOUND_CLIP_TIME_SPACEING 1.5 private ["_timeToCut"]; PARAMS_2(_unit,_fenceObject); if (_unit != ACE_player) exitWith {}; -_timeToCut = if ([ACE_player] call EFUNC(common,isEngineer)) then {5} else {10}; +_timeToCut = if ([ACE_player] call EFUNC(common,isEngineer)) then {7.5} else {11}; [ACE_player, "AinvPknlMstpSnonWnonDr_medic5", 0] call EFUNC(common,doAnimation); -if (_timeToCut > 5) then { - playSound "ACE_wirecutter_sound_long"; -} else { - playSound "ACE_wirecutter_sound"; +_progressCheck = { + PARAMS_2(_args,_passedTime); + EXPLODE_2_PVT(_args,_fenceObject,_lastSoundEffectTime); + if (_passedTime > (_lastSoundEffectTime + SOUND_CLIP_TIME_SPACEING)) then { + // playSound "ACE_wirecutter_sound"; + playSound3D [QUOTE(PATHTO_R(sound\wirecut.ogg)), objNull, false, (getPosASL ACE_player), 1, 1, 10]; + _args set [1, _passedTime]; + }; + + ((!isNull _fenceObject) && {(damage _fenceObject) < 1} && {("ACE_wirecutter" in (items ACE_player))}) }; -[_timeToCut, [_fenceObject], {(_this select 0) call FUNC(cutDownFenceCallback)}, {(_this select 0) call FUNC(cutDownFenceAbort)}, localize "STR_ACE_logistics_wirecutter_CuttingFence"] call EFUNC(common,progressBar); +[_timeToCut, [_fenceObject,0], {(_this select 0) call FUNC(cutDownFenceCallback)}, {(_this select 0) call FUNC(cutDownFenceAbort)}, localize "STR_ACE_logistics_wirecutter_CuttingFence", _progressCheck] call EFUNC(common,progressBar); diff --git a/addons/logistics_wirecutter/functions/fnc_getNearestFence.sqf b/addons/logistics_wirecutter/functions/fnc_getNearestFence.sqf index c9e59b41a0..15bfbdb8ef 100644 --- a/addons/logistics_wirecutter/functions/fnc_getNearestFence.sqf +++ b/addons/logistics_wirecutter/functions/fnc_getNearestFence.sqf @@ -20,9 +20,9 @@ PARAMS_1(_unit); _nearestFence = objNull; { - if ((isNull _nearestFence) && {[_x] call FUNC(isFence)}) then { - _nearestFence = _x; - }; + if ((isNull _nearestFence) && {[_x] call FUNC(isFence)}) then { + _nearestFence = _x; + }; } forEach nearestObjects [_unit, [], 15]; _nearestFence diff --git a/addons/logistics_wirecutter/functions/fnc_interactEH.sqf b/addons/logistics_wirecutter/functions/fnc_interactEH.sqf index 6dace9c42d..ddd180047c 100644 --- a/addons/logistics_wirecutter/functions/fnc_interactEH.sqf +++ b/addons/logistics_wirecutter/functions/fnc_interactEH.sqf @@ -35,7 +35,7 @@ if (!("ACE_wirecutter" in (items ace_player))) exitWith {}; } else { // Prevent Rare Error when ending mission with interact key down: if (isNull ace_player) exitWith {}; - + //If player moved >5 meters from last pos, then rescan if (((getPosASL ace_player) distance _setPosition) > 5) then { diff --git a/addons/logistics_wirecutter/functions/fnc_isFence.sqf b/addons/logistics_wirecutter/functions/fnc_isFence.sqf index aee9a22ef9..1ab97a67af 100644 --- a/addons/logistics_wirecutter/functions/fnc_isFence.sqf +++ b/addons/logistics_wirecutter/functions/fnc_isFence.sqf @@ -17,11 +17,9 @@ #include "script_component.hpp" //find is case sensitive, so keep everything lowercase -#define FENCE_A3_TYPENAMES ["land_net_fence_4m_f", "land_net_fence_8m_f", "land_net_fenced_8m_f", "land_new_wiredfence_5m_f", "land_new_wiredfence_10m_dam_f", "land_new_wiredfence_10m_f", "land_pipe_fence_4m_f", "land_pipe_fence_4mnolc_f", "land_sportground_fence_f", "land_wired_fence_4m_f", "land_wired_fence_4md_f", "land_wired_fence_8m_f", "land_wired_fence_8md_f", "land_razorwire_f"] -#define FENCE_A3_P3DS ["mil_wiredfence_f.p3d"] +#define FENCE_TYPENAMES ["land_net_fence_4m_f", "land_net_fence_8m_f", "land_net_fenced_8m_f", "land_new_wiredfence_5m_f", "land_new_wiredfence_10m_dam_f", "land_new_wiredfence_10m_f", "land_pipe_fence_4m_f", "land_pipe_fence_4mnolc_f", "land_sportground_fence_f", "land_wired_fence_4m_f", "land_wired_fence_4md_f", "land_wired_fence_8m_f", "land_wired_fence_8md_f", "land_razorwire_f"] -#define FENCE_AIA_TYPENAMES [] -#define FENCE_AIA_P3DS ["wall_indfnc_3.p3d", "wall_indfnc_9.p3d", "wall_indfnc_corner.p3d", "pletivo_wired.p3d", "wall_fen1_5.p3d"] +#define FENCE_P3DS ["mil_wiredfence_f.p3d","wall_indfnc_3.p3d", "wall_indfnc_9.p3d", "wall_indfnc_corner.p3d", "pletivo_wired.p3d", "wall_fen1_5.p3d"] private ["_typeOf", "_returnValue"]; PARAMS_1(_object); @@ -30,14 +28,15 @@ _typeOf = toLower (typeOf _object); _returnValue = false; if (_typeOf != "") then { - _returnValue = _typeOf in (FENCE_A3_TYPENAMES + FENCE_AIA_TYPENAMES); + //If the fence has configEntry we can check it directly + _returnValue = _typeOf in FENCE_TYPENAMES; } else { _typeOf = toLower (str _object); //something like "123201: wall_indfnc_9.p3d" { - if ((_typeOf find _x) != -1) then { + if ((_typeOf find _x) != -1) exitWith { _returnValue = true; }; - } forEach (FENCE_A3_P3DS + FENCE_AIA_P3DS); + } forEach FENCE_P3DS; }; _returnValue From 4169351b1ab2e1c8f2889e49054a568bdad37e25 Mon Sep 17 00:00:00 2001 From: commy2 Date: Thu, 16 Apr 2015 02:00:37 +0200 Subject: [PATCH 107/305] fix addActionEH didn't work after respawn --- addons/common/functions/fnc_addActionEventHandler.sqf | 8 ++++++-- addons/common/functions/fnc_removeActionEventHandler.sqf | 6 ++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/addons/common/functions/fnc_addActionEventHandler.sqf b/addons/common/functions/fnc_addActionEventHandler.sqf index a75b1537d1..a0e9d24f2c 100644 --- a/addons/common/functions/fnc_addActionEventHandler.sqf +++ b/addons/common/functions/fnc_addActionEventHandler.sqf @@ -31,7 +31,11 @@ if (typeName _statement == "STRING") then { _name = format ["ACE_Action_%1", _action]; -_actionsVar = _unit getVariable [_name, [-1, [-1, [], []]]]; +_actionsVar = _unit getVariable [_name, [-1, [-1, [], []], objNull]]; + +if (_unit != _actionsVar select 2) then { // check if the unit is still valid, fixes respawn issues + _actionsVar = [-1, [-1, [], []], objNull]; +}; _actionID = _actionsVar select 0; _actions = _actionsVar select 1; @@ -65,6 +69,6 @@ if (_actionID == -1) then { _actionID = _unit addAction _addAction; }; -_unit setVariable [_name, [_actionID, [_id, _actionIDs, _actions]], false]; +_unit setVariable [_name, [_actionID, [_id, _actionIDs, _actions], _unit], false]; _id diff --git a/addons/common/functions/fnc_removeActionEventHandler.sqf b/addons/common/functions/fnc_removeActionEventHandler.sqf index 7d92b3de75..2bcc970ab0 100644 --- a/addons/common/functions/fnc_removeActionEventHandler.sqf +++ b/addons/common/functions/fnc_removeActionEventHandler.sqf @@ -23,7 +23,7 @@ if (_id == -1) exitWith {}; _name = format ["ACE_Action_%1", _action]; -_actionsVar = _unit getVariable [_name, [-1, [-1, [], []]]]; +_actionsVar = _unit getVariable [_name, [-1, [-1, [], []], objNull]]; _actionID = _actionsVar select 0; _actions = _actionsVar select 1; @@ -32,6 +32,8 @@ _currentID = _actions select 0; _actionIDs = _actions select 1; _actions = _actions select 2; +if (_unit != _actionsVar select 2) exitWith {}; + _id = _actionIDs find _id; if (_id == -1) exitWith {}; @@ -47,4 +49,4 @@ if (count _actions == 0) then { _actionID = -1; }; -_unit setVariable [_name, [_actionID, [_currentID, _actionIDs, _actions]], false]; +_unit setVariable [_name, [_actionID, [_currentID, _actionIDs, _actions], _unit], false]; From b2625c43e7f1aaa172627f16e587bd215eb10a97 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 15 Apr 2015 20:30:05 -0500 Subject: [PATCH 108/305] #644 - Extra Space in macro --- .../laser_selfdesignate/functions/fnc_laserHudDesignateOff.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOff.sqf b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOff.sqf index f8ff2ca0f5..aa46c383bd 100644 --- a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOff.sqf +++ b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOff.sqf @@ -13,7 +13,7 @@ #include "script_component.hpp" if( (count _this) > 2) then { - EXPLODE_3_PVT(_this,_shooter,_laserUuid, _localLaserTarget); + EXPLODE_3_PVT(_this,_shooter,_laserUuid,_localLaserTarget); [_laserUuid] call EFUNC(laser,laserOff); // @TODO: Nou gets to field all tickets about missing lasers. From 80516f4f6197c87e7fe9080cb1734b5d1461175a Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 15 Apr 2015 22:27:12 -0500 Subject: [PATCH 109/305] Increase Sound Volume --- addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf b/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf index 0186ea4b3a..5153176de2 100644 --- a/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf +++ b/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf @@ -31,7 +31,7 @@ _progressCheck = { EXPLODE_2_PVT(_args,_fenceObject,_lastSoundEffectTime); if (_passedTime > (_lastSoundEffectTime + SOUND_CLIP_TIME_SPACEING)) then { // playSound "ACE_wirecutter_sound"; - playSound3D [QUOTE(PATHTO_R(sound\wirecut.ogg)), objNull, false, (getPosASL ACE_player), 1, 1, 10]; + playSound3D [QUOTE(PATHTO_R(sound\wirecut.ogg)), objNull, false, (getPosASL ACE_player), 3, 1, 10]; _args set [1, _passedTime]; }; From 58dfc6aa97c80dae442483c477ae7c2816466287 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 15 Apr 2015 22:34:24 -0500 Subject: [PATCH 110/305] Add item to ace misc box --- addons/logistics_wirecutter/CfgVehicles.hpp | 8 ++++++++ addons/logistics_wirecutter/config.cpp | 1 + 2 files changed, 9 insertions(+) create mode 100644 addons/logistics_wirecutter/CfgVehicles.hpp diff --git a/addons/logistics_wirecutter/CfgVehicles.hpp b/addons/logistics_wirecutter/CfgVehicles.hpp new file mode 100644 index 0000000000..a31d9c0d99 --- /dev/null +++ b/addons/logistics_wirecutter/CfgVehicles.hpp @@ -0,0 +1,8 @@ +class CfgVehicles { + class Box_NATO_Support_F; + class ACE_Box_Misc: Box_NATO_Support_F { + class TransportItems { + MACRO_ADDITEM(ACE_wirecutter,4); + }; + }; +}; diff --git a/addons/logistics_wirecutter/config.cpp b/addons/logistics_wirecutter/config.cpp index 8e14bde892..89fbd1c10f 100644 --- a/addons/logistics_wirecutter/config.cpp +++ b/addons/logistics_wirecutter/config.cpp @@ -15,3 +15,4 @@ class CfgPatches { #include "CfgEventHandlers.hpp" #include "CfgSounds.hpp" #include "CfgWeapons.hpp" +#include "CfgVehicles.hpp" From 9c9136ae91bf511d3290fe2022a06f58b40f148e Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 16 Apr 2015 02:54:50 -0500 Subject: [PATCH 111/305] Stringtable cleanup --- addons/explosives/stringtable.xml | 1 - addons/javelin/stringtable.xml | 1 - 2 files changed, 2 deletions(-) diff --git a/addons/explosives/stringtable.xml b/addons/explosives/stringtable.xml index c8d46aad30..d0b61d0814 100644 --- a/addons/explosives/stringtable.xml +++ b/addons/explosives/stringtable.xml @@ -44,7 +44,6 @@ Kod ładunku: %1 Code explosif: %1 Kód výbušniny: %1 - Codice dell'esplosivo : %1 Robbanóanyag kódja: %1 Código do explosivo: %1 Код подрыва: %1 diff --git a/addons/javelin/stringtable.xml b/addons/javelin/stringtable.xml index 819bb0f46d..0290abafed 100644 --- a/addons/javelin/stringtable.xml +++ b/addons/javelin/stringtable.xml @@ -1,4 +1,3 @@ -<<<<<<< HEAD From a129f18a2ad51ffb73dc1be6012c66bc3d8e8c14 Mon Sep 17 00:00:00 2001 From: Marco Date: Thu, 16 Apr 2015 10:13:50 +0200 Subject: [PATCH 112/305] Update stringtable.xml Italian --- addons/winddeflection/stringtable.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addons/winddeflection/stringtable.xml b/addons/winddeflection/stringtable.xml index 897a3c556b..8e2e00d96e 100644 --- a/addons/winddeflection/stringtable.xml +++ b/addons/winddeflection/stringtable.xml @@ -11,6 +11,7 @@ Vent Windinformationen Szélinformáció + Informazioni sul vento Direction: %1 @@ -21,6 +22,7 @@ Direction %1 Windrichtung: %1 Irány: %1 + Direzione: %1 Speed: %1 m/s @@ -31,6 +33,7 @@ Vitesse %1 m/s Geschwindigkeit: %1m/s Sebesség: %1 m/s + Velocità: %1 m/s Weather Information @@ -41,6 +44,7 @@ Météo Wetterinformationen Időjárás-Információ + Meteo Humidity: %1% @@ -51,6 +55,7 @@ Humidité: %1% Luftfeuchtigkeit: %1 Páratartalom: %1% + Umidità: %1% From b3d4e2f48f0011d4371ff61607e4c90673c14632 Mon Sep 17 00:00:00 2001 From: Marco Date: Thu, 16 Apr 2015 10:14:18 +0200 Subject: [PATCH 113/305] Update stringtable.xml IT --- addons/weather/stringtable.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/weather/stringtable.xml b/addons/weather/stringtable.xml index 46a0653269..0837919e34 100644 --- a/addons/weather/stringtable.xml +++ b/addons/weather/stringtable.xml @@ -7,6 +7,7 @@ Pokaż inf. o wietrze Показать информацию о погоде Afficher information du vent + Mostra informazioni sul vento From c1655aa9a9f79e8e0935b95abb765cf7ebd275df Mon Sep 17 00:00:00 2001 From: Marco Date: Thu, 16 Apr 2015 10:16:17 +0200 Subject: [PATCH 114/305] Update stringtable.xml IT --- addons/weaponselect/stringtable.xml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/addons/weaponselect/stringtable.xml b/addons/weaponselect/stringtable.xml index d534ecd29b..d7d2929a5f 100644 --- a/addons/weaponselect/stringtable.xml +++ b/addons/weaponselect/stringtable.xml @@ -10,6 +10,7 @@ Wyświetl tekst przy rzucie granatem Afficher texte lors d'un lancé de grenade Szöveg mutatása gránát eldobásakor + Mostra indicazioni nel lancio granate Display a hint or text on grenade throw. @@ -20,6 +21,7 @@ Wyświetla powiadomienie lub tekst przy rzucie granatem. Afficher texte/info au lancé de grenade Jelez egy súgót vagy szöveget a gránát eldobásakor. + Mostra un suggerimento quando si lanciano granate Select Pistol @@ -55,7 +57,7 @@ Sélectionner Lanceur Rakétavető Kiválasztása Selecionar Lançador - Seleziona il Lanciatore + Seleziona il Lanciamissili Select Grenade Launcher @@ -162,6 +164,7 @@ Gránát: %1 Граната %1 Grenade %1 + Granata %1 Ready Grenade @@ -172,6 +175,7 @@ Gránát előkészítése Подготовить гранату Grenade prête + Granata pronta Select Frag Grenade @@ -194,7 +198,7 @@ Nem-robbanó Gránát Kiválasztása Zvolit Ne-Výbušný Granát Selecionar Granada - Seleziona Altre Granate + Seleziona granate non a frammentazione Выбрать гранату @@ -218,6 +222,7 @@ Žádné granáty Nincs több gránát Гранат не осталось + Granate esaurite No frags left @@ -264,6 +269,7 @@ Wystrzel granat dymny Füstvető eltüzelése Запустить дымовую завесу + Lancia fumogeno From 5e7fb0fb6467012b9155948be7e9e8cf283526ab Mon Sep 17 00:00:00 2001 From: Marco Date: Thu, 16 Apr 2015 10:18:49 +0200 Subject: [PATCH 115/305] Update stringtable.xml IT --- addons/vehiclelock/stringtable.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/addons/vehiclelock/stringtable.xml b/addons/vehiclelock/stringtable.xml index a327352f9b..349cd46e98 100644 --- a/addons/vehiclelock/stringtable.xml +++ b/addons/vehiclelock/stringtable.xml @@ -10,6 +10,7 @@ Odemknout vozidlo Jármű nyitása Открыть машину + Apri il veicolo Lock Vehicle @@ -20,6 +21,7 @@ Zamknout vozidlo Jármű zárása Закрыть машину + Chiudi il veicolo Lockpick Vehicle @@ -30,6 +32,7 @@ Vypáčit vozidlo Jármű feltörése Взломать замок + Scassina veicolo Picking Lock.... @@ -40,6 +43,7 @@ Páčim vozidlo... Zár feltörése... Взламываем замок... + Scassino il veicolo.... A custom key that will open a specific vehicle. @@ -50,6 +54,7 @@ Vlastní klíč, který otevře konkrétní vozidlo. Egy egyedi kulcs, ami egy meghatározott járművet nyit ki. Ключ от конкретной машины. + Una chiave personalizzata che apre determinati veicoli. A Master Key will open any lock, no matter what! @@ -60,6 +65,7 @@ Hlavní klíč otevře libovolný zámek, bez vyjímek! Egy főkulcs, ami minden zárat kinyit, helyzettől függetlenül! Универсальный ключ, открывающий любой замок. + Una chiave principale che apre qualsiasi serratura! A lockpick set that can pick the locks of most vehicles. @@ -70,6 +76,7 @@ Sada paklíčů, která dokáže odemknout zámky u většiny vozidel. Egy tolvajkulcs-készlet, mely a legtöbb jármű zárjait fel tudja törni. Набор отмычек, которым можно взломать почти любую машину. + Un grimardello per forzare la maggior parte dei veicoli A key that should open most WEST vehicles. @@ -80,6 +87,7 @@ Klíč který by měl otevřít většinou Západních vozidel. Egy kulcs, ami a NYUGAT egységeinek legtöbb járművét ki tudja nyitni. Ключ для открытия большинства машин Запада. + Una chiave che apre la maggior parte dei veicoli WEST A key that should open most EAST vehicle. @@ -90,6 +98,7 @@ Egy kulcs, ami a KELET egységeinek legtöbb járművét ki tudja nyitni. Klíč který by měl otevřít vetšinu Východních vozidel. Ключ для открытия большинства машин Востока. + Una chaive che apr ela maggior parte dei veicoli EAST A key that should open most INDEP vehicle. @@ -100,6 +109,7 @@ Egy kulcs, ami a FÜGGETLEN egységek legtöbb járművét ki tudja nyitni. Klíč který by měl otevřít většinu Nezávislých vozidel. Ключ для открытия большинства машин Независимых. + Una chaive che apr ela maggior parte dei veicoli INDEP A key that should open most CIV vehicle. @@ -110,6 +120,7 @@ Klíč který by měl otevřít většinu Civilních vozidel. Egy kulcs, ami a CIVIL járművek többségét ki tudja nyitni. Ключ для открытия большинства машин Гражданских. + Una chaive che apr ela maggior parte dei veicoli CIV From 59643152bd7bc5e23251db5ce1563270a6fe307b Mon Sep 17 00:00:00 2001 From: Marco Date: Thu, 16 Apr 2015 10:19:43 +0200 Subject: [PATCH 116/305] Update stringtable.xml IT --- addons/switchunits/stringtable.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/switchunits/stringtable.xml b/addons/switchunits/stringtable.xml index c95da37337..58b0b46d6d 100644 --- a/addons/switchunits/stringtable.xml +++ b/addons/switchunits/stringtable.xml @@ -10,6 +10,7 @@ Cambiado de unidad Unité changée Egység átváltva + Cambia unità This unit is too close to the enemy. @@ -20,6 +21,7 @@ Esta unidad está demasiado cerca del enemigo. Cette unité est trop proche des ennemis Ez az egység túl közel van az ellenséghez. + Questa unità è troppo vicina al nemico. From fda1febc30f8e4c86bf2547e78f368fb5a4181eb Mon Sep 17 00:00:00 2001 From: Marco Date: Thu, 16 Apr 2015 10:21:49 +0200 Subject: [PATCH 117/305] Update stringtable.xml IT --- addons/scopes/stringtable.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/addons/scopes/stringtable.xml b/addons/scopes/stringtable.xml index 16d6b60c4c..396e32c6d6 100644 --- a/addons/scopes/stringtable.xml +++ b/addons/scopes/stringtable.xml @@ -5,46 +5,55 @@ Minor adjustment up Zerowanie powoli w górę Малая корректировка ВВЕРХ + Regola leggermente alzata in alto Minor adjustment down Zerowanie powoli w dół Малая корректировка ВНИЗ + Regola leggermente alzata in basso Minor adjustment right Zerowanie powoli w prawo Малая корректировка ВПРАВО + Regola leggermente il tiro a destra Minor adjustment left Zerowanie powoli w lewo Малая корректировка ВЛЕВО + Regola leggermete il tiro a sinistra Major adjustment up Zerowanie w górę Большая корректировка ВВЕРХ + Regola l'alzata in alto Major adjustment down Zerowanie w dół Большая корректировка ВНИЗ + Regola l'alzata in basso Major adjustment right Zerowanie w prawo Большая корректировка ВПРАВО + Regola il tiro a destra Major adjustment left Zerowanie w lewo Большая корректировка ВЛЕВО + Regola il tiro a sinistra Set zero adjustment Zresetuj wyzerowanie Сбросить корректировку + Resetta i valori del tiro From 0655c3f3b69e1186b54e71c0d326cb68eb4dad52 Mon Sep 17 00:00:00 2001 From: Marco Date: Thu, 16 Apr 2015 10:22:32 +0200 Subject: [PATCH 118/305] Update stringtable.xml IT --- addons/safemode/stringtable.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/safemode/stringtable.xml b/addons/safemode/stringtable.xml index 40691bd7da..521651999a 100644 --- a/addons/safemode/stringtable.xml +++ b/addons/safemode/stringtable.xml @@ -10,6 +10,7 @@ Biztonságos mód Предохранитель Sécurité + Sicura inserita Take off Safety @@ -20,6 +21,7 @@ Biztonsági kapcsoló eltolása Снять с предохранителя Enlever sécurité + Togli la sicura Put on Safety @@ -30,6 +32,7 @@ Biztonsági kapcsoló helyretolása Поставить на предохранитель Sécurité mise + Inserisci la sicura Took off Safety @@ -40,6 +43,7 @@ Biztonságos mód megszüntetve Снят с предохранителя Sécurité enlevée + Togli la sicura From 13de953aaba349e36aaba4b4b03f8af56fbff74a Mon Sep 17 00:00:00 2001 From: Marco Date: Thu, 16 Apr 2015 10:23:34 +0200 Subject: [PATCH 119/305] Update stringtable.xml IT --- addons/respawn/stringtable.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/respawn/stringtable.xml b/addons/respawn/stringtable.xml index af003b4c28..7b3d997a1c 100644 --- a/addons/respawn/stringtable.xml +++ b/addons/respawn/stringtable.xml @@ -10,6 +10,7 @@ Rozmieszczenie za 5 sekund ... Respawn za 5 sekund... Kihelyezés 5 másodperc múlva ... + Dispiegamento in 5 secondi ... Rallypoint deployed @@ -20,6 +21,7 @@ Punkt zbiórki rozmieszczony Rallypoint umístěn Gyülekezőpont elhelyezve + Rallypoint dispiegato Teleported to Base @@ -30,6 +32,7 @@ Przeteleportowano do bazy Odteleportován na základnu Bázisra teleportálva + Teleportato alla base Teleported to Rallypoint @@ -40,6 +43,7 @@ Przeteleportowano do punktu zbiórki Odteleportován na rallypoint Gyülekezőpontra teleportálva + Teleportato al rallypoint Rallypoint West (Base) From 66ba74e79d997b9b86e0fa0ac1d771b66e13d730 Mon Sep 17 00:00:00 2001 From: Marco Date: Thu, 16 Apr 2015 10:24:17 +0200 Subject: [PATCH 120/305] Update stringtable.xml IT --- addons/reloadlaunchers/stringtable.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/reloadlaunchers/stringtable.xml b/addons/reloadlaunchers/stringtable.xml index ff5637eaf6..7716050334 100644 --- a/addons/reloadlaunchers/stringtable.xml +++ b/addons/reloadlaunchers/stringtable.xml @@ -11,6 +11,7 @@ Załaduj wyrzutnię Charger lanceur Kilövö betöltése + Carica lanciamissili Loading launcher ... @@ -21,6 +22,7 @@ Nabíjím odpalovač ... Ładowanie wyrzutni ... Kilövő betöltés alatt ... + Carico il lanciamissili ... Launcher loaded @@ -31,6 +33,7 @@ Odpalovač nabit Wyrzutnia załadowana Kilövő betöltve + Lanciamissili caricato Load %1 @@ -41,6 +44,7 @@ Nabít %1 Załadowano %1 %1 betöltése + Caricato %1 From 500098d0610c07189276a69777f0e5f00e14a440 Mon Sep 17 00:00:00 2001 From: Marco Date: Thu, 16 Apr 2015 10:25:39 +0200 Subject: [PATCH 121/305] Update stringtable.xml IT --- addons/reload/stringtable.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/reload/stringtable.xml b/addons/reload/stringtable.xml index 7c401fec05..51956670b7 100644 --- a/addons/reload/stringtable.xml +++ b/addons/reload/stringtable.xml @@ -10,6 +10,7 @@ Sprawdź stan amunicji przy przeładowaniu broni Vérification des munitions au rechargement Lőszer ellenőrzése a fegyver újratöltésekor + Controlla le munizioni ricaricando Check the ammo in your new magazine on magazine reload. @@ -20,6 +21,7 @@ Pokaż stan amunicji w nowym magazynku przy przeładowaniu broni Vérification du nombre de munition au rechargement A lőszer ellenőrzése az új tárad behelyezésekor újratöltés közben. + Controlla le munizioni rimanenti nel caricatore in fase di cambio caricatore. Check Ammo @@ -54,6 +56,7 @@ Podłącz taśmę Gurt anhängen Töltényheveder összekötése + Attacca la tracolla Linking belt... @@ -64,6 +67,7 @@ Podłączanie taśmy... Gurt anhängen ... Töltényheveder összekötése folyamatban... + Attacco la tracolla... From 23cb1058fc386ea282fcd832c37853d803948686 Mon Sep 17 00:00:00 2001 From: Marco Date: Thu, 16 Apr 2015 10:26:55 +0200 Subject: [PATCH 122/305] Update stringtable.xml IT --- addons/parachute/stringtable.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/addons/parachute/stringtable.xml b/addons/parachute/stringtable.xml index 52ccaefe77..a1de714331 100644 --- a/addons/parachute/stringtable.xml +++ b/addons/parachute/stringtable.xml @@ -11,6 +11,7 @@ Altímetro Magasságmérő Высотомер + Altimetro Altimeter Watch @@ -21,6 +22,7 @@ Reloj altímetro Magasságmérős karóra Часы с высотомером + Controlla l'altimetro Used to show height, descent rate and the time. @@ -31,6 +33,7 @@ Utilizado para mostrar altura, tasa de descenso y hora. Mutatja a magasságot, a zuhanási sebességet, és az időt. Используется для определения высоты, скорости снижения и времени. + Usato per mostrare l'altitudine, la velocità di discesa e l'ora. Non-Steerable Parachute @@ -41,6 +44,7 @@ Neříditelný padák Irányíthatatlan ejtőernyő Неуправляемый парашют + Paracadute non manovrabile - \ No newline at end of file + From ba510facbd550549e432b7ec5fb1e71b9e3deee9 Mon Sep 17 00:00:00 2001 From: Marco Date: Thu, 16 Apr 2015 10:29:17 +0200 Subject: [PATCH 123/305] Update stringtable.xml IT --- addons/optionsmenu/stringtable.xml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/addons/optionsmenu/stringtable.xml b/addons/optionsmenu/stringtable.xml index c4ac2b1593..f9bd537e3f 100644 --- a/addons/optionsmenu/stringtable.xml +++ b/addons/optionsmenu/stringtable.xml @@ -22,6 +22,7 @@ Napraw animację Corriger animation Animációk kijavítása + Fixa l'animazione Reset All @@ -32,6 +33,7 @@ Resetuj wszystko Défaut Minden visszaállítása + Resetta tutto Colors @@ -42,6 +44,7 @@ Barvy Kolory Színek + Colori Options @@ -64,6 +67,7 @@ Valeurs Werte Értékek + Valori Yes @@ -98,6 +102,7 @@ Ustawienie: Paramètres Opció: + Parametri: Export @@ -108,6 +113,7 @@ Eksport Exporter Exportálás + Esporta Open Export Menu @@ -118,6 +124,7 @@ Otwórz menu eksportowania Ouvrir le menu d'exportation Exportálási menü megnyitása + Apri menù esportazione String input. @@ -127,6 +134,7 @@ Wpisywanie tekstu. Entrée String bevitel. + Stringa di unput. Array. Seperate elements by using ,. @@ -137,6 +145,7 @@ Tableau. Séparation par ,. Tabulka. Odděl elementy použitím ,. Array. Válasszad el az elemeket vesszővel. + Array. Separa gli elementi usando ,. Number @@ -147,6 +156,7 @@ Cyfra Nombre Szám + Numero Uknown input type @@ -157,6 +167,7 @@ Nieznany rodzaj danych Type d'entrée inconnue Ismeretlen beviteli típus + Input inserito sconosciuto Save input @@ -167,6 +178,7 @@ Zapisz dane Sauvegarder Bevitel elmentése + Salva input Include Client Settings @@ -177,6 +189,7 @@ Zawrzyj ustawienia klienta Inclure paramètres client Kliens-beállítások melléklése + Includi i parametri del client Exclude Client Settings @@ -187,6 +200,7 @@ Wyklucz ustawienia klienta Exclure paramètres client Kliens-beállítások elhagyása + Escludi i parametri del client Settings exported to clipboard @@ -197,6 +211,7 @@ Ustawienia wyeksportowano do schowka Paramètres exportés dans le presse papier Beállítások exportálva a vágólapba + Parametri esportati alla clipboard From 00c0839ce5e284c3224153cf7828f7214c5eee0a Mon Sep 17 00:00:00 2001 From: Marco Date: Thu, 16 Apr 2015 10:33:15 +0200 Subject: [PATCH 124/305] Update stringtable.xml IT --- addons/nametags/stringtable.xml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index 32eb35781b..4f6e2cfb93 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -10,6 +10,7 @@ Pokaż imiona Nevek mutatása Показать имена + Mostra i nomi Show player names @@ -30,7 +31,7 @@ Zeige Spielernamen nur an, wenn die Maus auf sie gerrichtet ist (benötigt Spielernamen) Noms uniquement sous le curseur (si noms affichés) Zobrazit jméno hráče jenom na kurzor (vyžaduje jména hráčů) - Mostra i nomi solo se puntati (richiede i nomi dei giocatori abilitati) + Mostra i nomi solo se puntati (richiede mostra nomi abilitato) Mostrar nome de jogador somente no cursor (requer nome de jogadores) Játékosok nevének mutatása csak a kurzoron (a nevek mutatása szükséges) Показать имена игроков только под курсором (требует имен игроков) @@ -44,6 +45,7 @@ Pokaż imiona graczy tylko po przytrzymaniu klawisza (wymagana opcja Pokaż imiona graczy) Játékosnevek mutatása csak gombnyomásra (a nevek mutatása szükséges) Показать имена игроков только по нажатию клавиши (требует имен игроков) + Mostra i nomi solo se si preme il tasto (richiede mostra nomi abilitato) Show player ranks (requires player names) @@ -52,7 +54,7 @@ Mostrar rango de los jugadores (requiere Mostrar nombres de jugadores) Grade des joueurs (si noms affichés) Zobrazit hodnosti hráčů (vyžaduje jména hráčů) - Mostra i gradi (richiede i nomi dei giocatori abilitati) + Mostra i gradi (richiede mostra nomi abilitato) Mostrar patente de jogadores (requer nome de jogadores) Játékosok rendfokozatának mutatása (a nevek mutatása szükséges) Показать звания игроков (требует имен игроков) @@ -66,6 +68,7 @@ Zobrazit info o posádce vozidla Показать экипаж Jármű-legénység adatainak mutatása + Mostra le informazioni sull'equipaggio del veicolo Show name tags for AI units @@ -76,6 +79,7 @@ Wyświetl imiona jednostek AI Afficher les noms des IA Névcímkék mutatása MI-egységeknél + Mostra le tag nomi per le unità AI Show SoundWaves (requires player names) @@ -86,6 +90,7 @@ Pokaż fale dźwiękowe (wymagana opcja Pokaż imiona graczy) Afficher "qui parle" (si noms affichés) "Hanghullámok" mutatása (a nevek mutatása szükséges) + Mostra barra movimento audio (richiede mostra nomi abilitato) Default Nametag Color (Non Group Members) @@ -96,6 +101,7 @@ Couleur d'affichage par défaut (si dans aucun groupe) Standardní barva jmenovek (pro nečleny jednotky) Alap névcímke-szín (csoporton kívüli személyek) + Colore nametag di default (membri non del gruppo) From aa724129d1720c45eb8e3249c0b865001ea2a407 Mon Sep 17 00:00:00 2001 From: ulteq Date: Thu, 16 Apr 2015 10:51:33 +0200 Subject: [PATCH 125/305] Tuned down the default timeToLive value. --- addons/ballistics/CfgAmmo.hpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index d82f336952..76a3970063 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -3,21 +3,20 @@ class CfgAmmo { class BulletCore; class BulletBase: BulletCore { - // Default: 6 | More is good, but too much is bad (especially with wind deflection / advanced ballistics) - timeToLive = 10; + timeToLive=6; }; class B_20mm : BulletBase { - timeToLive = 30; + timeToLive=30; }; class B_25mm : BulletBase { - timeToLive = 30; + timeToLive=30; }; class B_35mm_AA : BulletBase { - timeToLive = 30; + timeToLive=30; }; class B_30mm_AP : BulletBase { - timeToLive = 30; + timeToLive=30; }; class B_556x45_Ball : BulletBase { @@ -458,6 +457,7 @@ class CfgAmmo { ACE_barrelLengths[]={20, 24.41, 26}; }; class B_408_Ball : BulletBase { + timeToLive=10; airFriction=-0.000395; typicalSpeed=910; ACE_caliber=0.408; @@ -473,6 +473,7 @@ class CfgAmmo { ACE_barrelLengths[]={29}; }; class ACE_106x83mm_Ball : B_408_Ball { + timeToLive=10; ACE_caliber=0.416; ACE_bulletLength=2.089; ACE_bulletMass=398; @@ -485,6 +486,7 @@ class CfgAmmo { ACE_barrelLengths[]={29}; }; class B_338_Ball : BulletBase { + timeToLive=10; airFriction=-0.000606; typicalSpeed=915; ACE_caliber=0.338; @@ -513,6 +515,7 @@ class CfgAmmo { ACE_barrelLengths[]={20, 24, 26}; }; class ACE_338_Ball : B_338_Ball { + timeToLive=10; airFriction=-0.000535; caliber=1.55; typicalSpeed=826; @@ -528,6 +531,7 @@ class CfgAmmo { ACE_barrelLengths[]={20, 24, 26.5, 28}; }; class ACE_338_Ball_API526 : B_338_Ball { + timeToLive=10; airFriction=-0.000673; caliber=2.4; typicalSpeed=826; @@ -557,6 +561,7 @@ class CfgAmmo { ACE_barrelLengths[]={17.2}; }; class B_127x99_Ball : BulletBase { + timeToLive=10; airFriction=-0.0006; typicalSpeed=853; ACE_caliber=0.510; @@ -571,6 +576,7 @@ class CfgAmmo { ACE_barrelLengths[]={29}; }; class ACE_127x99_Ball_AMAX : B_127x99_Ball { + timeToLive=10; airFriction=-0.000374; typicalSpeed=860; ACE_caliber=0.510; @@ -585,6 +591,7 @@ class CfgAmmo { ACE_barrelLengths[]={29}; }; class B_127x108_Ball : BulletBase { + timeToLive=10; airFriction=-0.00064; typicalSpeed=820; ACE_caliber=0.511; From 58d7ff792b4a3295d531bc12304f32ad940975df Mon Sep 17 00:00:00 2001 From: Lex Rivera Date: Thu, 16 Apr 2015 13:28:50 +0300 Subject: [PATCH 126/305] Add link to issue reporting format --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index dd464966f2..f56811dbd8 100644 --- a/README.md +++ b/README.md @@ -37,10 +37,11 @@ The mod is **built modularly** — almost any PBO can be removed, thus a team ca #### Guides & How-Tos If you installed ACE3, but have trouble understanding how it all works, or where to start — see [Getting Started](https://github.com/acemod/ACE3/blob/master/documentation/user/getting-started.md). + #### Contributing If you want to help put with the ongoing development, you can do so by looking for possible bugs or by contributing new features. To contribute something to ACE, simply fork this repository and submit your pull requests for review by other collaborators. In the process, please add yourself to the author array of any .pbo you will be editing and the AUTHORS.txt file; including a valid email address. -To report a bug, propose a feature, or suggest a change to the existing one — please, use our [Issue Tracker](https://github.com/acemod/ACE3/issues). +To report a bug, propose a feature, or suggest a change to the existing one — please, use our [Issue Tracker](https://github.com/acemod/ACE3/issues). See [this link](http://ace3mod.com/wiki/user/how-to-report-an-issue.html) for details. #### Testing & Building If you want to help us test the latest development changes, feel free to download our master branch, using either git — if familiar with the process — or directly, by following [this link](https://github.com/acemod/ACE3/archive/master.zip). From aa5972a03a2cf124c6a706adf11a4d318c16725b Mon Sep 17 00:00:00 2001 From: Lex Rivera Date: Thu, 16 Apr 2015 13:30:09 +0300 Subject: [PATCH 127/305] Damn you, web editor --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index f56811dbd8..3ec6fe0683 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,6 @@ The mod is **built modularly** — almost any PBO can be removed, thus a team ca #### Guides & How-Tos If you installed ACE3, but have trouble understanding how it all works, or where to start — see [Getting Started](https://github.com/acemod/ACE3/blob/master/documentation/user/getting-started.md). - #### Contributing If you want to help put with the ongoing development, you can do so by looking for possible bugs or by contributing new features. To contribute something to ACE, simply fork this repository and submit your pull requests for review by other collaborators. In the process, please add yourself to the author array of any .pbo you will be editing and the AUTHORS.txt file; including a valid email address. From e00dd1c2f21f23958f4cbf9081d1a942f55b9565 Mon Sep 17 00:00:00 2001 From: ruPaladin Date: Thu, 16 Apr 2015 14:10:48 +0300 Subject: [PATCH 128/305] addons/realisticnames translation to Russian --- addons/realisticnames/stringtable.xml | 72 +++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/addons/realisticnames/stringtable.xml b/addons/realisticnames/stringtable.xml index a39736c902..2b02d7f5b7 100644 --- a/addons/realisticnames/stringtable.xml +++ b/addons/realisticnames/stringtable.xml @@ -1049,6 +1049,7 @@ P99 P99 P99 + P99 MP-443 Grach @@ -1058,6 +1059,7 @@ MP-443 Grach MP-443 Grach MP-443 Grach + МР-443 "Грач" ACP-C2 @@ -1067,6 +1069,7 @@ ACP-C2 ACP-C2 ACP-C2 + ACP-C2 FNX-45 Tactical @@ -1076,6 +1079,7 @@ FNX-45 Tactical FNX-45 Tactical FNX-45 Tactical + FNX-45 Tactical Chiappa Rhino 60DS @@ -1085,6 +1089,7 @@ Chiappa Rhino 60DS Chiappa Rhino 6DS Chiappa Rhino 60DS + Chiappa Rhino 60DS Taurus Judge @@ -1094,6 +1099,7 @@ Taurus Judge Taurus Judge Taurus Judge + Taurus Judge NLAW @@ -1103,6 +1109,7 @@ NLAW NLAW NLAW + NLAW RPG-32 @@ -1112,6 +1119,7 @@ RPG-32 RPG-32 RPG-32 + РПГ-32 Mini-Spike (AA) @@ -1121,6 +1129,7 @@ Mini-Spike (AA) Mini-Spike (Repülő-elhárító) Mini-Spike (AA) + Mini-Spike (AA) Mini-Spike (AT) @@ -1130,6 +1139,7 @@ Mini-Spike (AT) Mini-Spike (Tankelhárító) Mini-Spike (AT) + Mini-Spike (AT) MX @@ -1139,6 +1149,7 @@ MX MX MX + MX MX (Black) @@ -1148,6 +1159,7 @@ MX ( Noir) MX (Fekete) MX (Negro) + MX (черный) MXC @@ -1157,6 +1169,7 @@ MXC MXC MXC + MXC MXC (Black) @@ -1166,6 +1179,7 @@ MXC (Noir) MXC (Fekete) MXC (Negro) + MXC (черный) MX 3GL @@ -1175,6 +1189,7 @@ MX 3GL MX 3GL MX 3GL + MX 3GL MX 3GL (Black) @@ -1184,6 +1199,7 @@ MX 3 GL (Noir) MX 3GL (Fekete) MX 3GL (Negro) + MX 3GL (черный) MX LSW @@ -1193,6 +1209,7 @@ MX LSW MX LSW MX LSW + MX LSW MX LSW (Black) @@ -1202,6 +1219,7 @@ MX LSW (Noir) MX LSW (Fekete) MX LSW (Negro) + MX LSW (черный) MXM @@ -1211,6 +1229,7 @@ MXM MXM MXM + MXM MXM (Black) @@ -1220,6 +1239,7 @@ MXM (Noir) MXM (Fekete) MXM (Negro) + MXM (черный) KT2002 Katiba @@ -1229,6 +1249,7 @@ KT2002 Katiba KT2002 Katiba KT2002 Katiba + KT2002 Катиба KT2002C Katiba @@ -1238,6 +1259,7 @@ KT2002C Katiba KT2002C Katiba KT2002C Katiba + KT2002C Катиба KT2002 Katiba KGL @@ -1247,6 +1269,7 @@ KT2002 Katiba KGL KT2002 Katiba KGL KT2002 Katiba KGL + KT2002 Катиба KGL F2000 (Camo) @@ -1256,6 +1279,7 @@ F2000 (Camo) F2000 (Terepmintás) F2000 (Camuflaje) + F2000 (камо) F2000 @@ -1265,6 +1289,7 @@ F2000 F2000 F2000 + F2000 F2000 Tactical (Camo) @@ -1274,6 +1299,7 @@ F2000 Tactical (Camo) F2000 Tactical (Terepmintás) F2000 Tactical (Camuflaje) + F2000 Tactical (камо) F2000 Tactical @@ -1283,6 +1309,7 @@ F2000 Tactical F2000 Tactical F2000 Tactical + F2000 Tactical F2000 EGLM (Camo) @@ -1292,6 +1319,7 @@ F2000 EGLM (Camo) F2000 EGLM (Terepmintás) F2000 EGLM (Camuflaje) + F2000 EGLM (камо) F2000 EGLM @@ -1301,6 +1329,7 @@ F2000 EGLM F2000 EGLM F2000 EGLM + F2000 EGLM TAR-21 @@ -1310,6 +1339,7 @@ TAR-21 TAR-21 TAR-21 + TAR-21 CTAR-21 @@ -1319,6 +1349,7 @@ CTAR-21 CTAR-21 CTAR-21 + CTAR-21 TAR-21 EGLM @@ -1328,6 +1359,7 @@ TAR-21 EGLM TAR-21 EGLM TAR-21 EGLM + TAR-21 EGLM Vector SMG @@ -1337,6 +1369,7 @@ Vector SMG Vector SMG Vector SMG + Vector SMG Scorpion Evo 3 A1 @@ -1346,6 +1379,7 @@ Scorpion Evo 3 A1 Scorpion Evo 3 A1 Scorpion Evo 3 A1 + Scorpion Evo 3 A1 CPW @@ -1355,6 +1389,7 @@ CPW CPW CPW + CPW RFB SDAR @@ -1364,6 +1399,7 @@ RFB SDAR RFB SDAR RFB SDAR + RFB SDAR Stoner 99 LMG @@ -1373,6 +1409,7 @@ Stoner 99 LMG Stoner 99 Könnyűgéppuska Stoner 99 LMG + Stoner 99 LMG Negev NG7 @@ -1382,6 +1419,7 @@ Negev NG7 Negev NG7 Negev NG7 + Negev NG7 Mk14 Mod 1 EBR @@ -1391,6 +1429,7 @@ Mk 14 Mod 1 EBR Mk14 Mod 1 EBR Mk14 Mod 1 EBR + Mk14 Mod 1 EBR GM6 Lynx @@ -1400,6 +1439,7 @@ GM6 Lynx GM6 Gepárd GM6 Lynx + GM6 Lynx GM6 Lynx (Camo) @@ -1409,6 +1449,7 @@ GM6 Lynx (Camo) GM6 Gepárd (Terepmintás) GM6 Lynx (Camuflaje) + GM6 Lynx (камо) M200 Intervention @@ -1418,6 +1459,7 @@ M200 Intervention M200 Intervention M200 Intervention + M200 Intervention M200 Intervention (Camo) @@ -1427,6 +1469,7 @@ M200 Intervention (Camo) M200 Intervention (Terepmintás) M200 Intervention (Camuflaje) + M200 Intervention (камо) VS-121 @@ -1436,174 +1479,203 @@ VS-121 VS-121 VS-121 + VS-121 TODO: MAR-10 .338 TODO: MAR-10 .338 MAR-10 .338 TODO: MAR-10 .338 + TODO: MAR-10 .338 TODO: MAR-10 .338 (Black) TODO: MAR-10 .338 (Black) MAR-10 .338 (Noir) TODO: MAR-10 .338 (Negro) + TODO: MAR-10 .338 (черный) TODO: MAR-10 .338 (Camo) TODO: MAR-10 .338 (Camo) MAR-10 .338 (Camo) TODO: MAR-10 .338 (Camuflaje) + TODO: MAR-10 .338 (камо) TODO: MAR-10 .338 (Sand) TODO: MAR-10 .338 (Sand) MAR-10 .338 (Beige) TODO: MAR-10 .338 (Arena) + TODO: MAR-10 .338 (песочный) TODO: Mk-I EMR 7.62 mm TODO: Mk-I EMR 7.62 mm Mk-l EMR 7.62 mm TODO: Mk-I EMR 7.62 mm + TODO: Mk-I EMR 7.62 мм TODO: Mk-I EMR 7.62 mm (Black) TODO: Mk-I EMR 7.62 mm (Black) Mk-l EMR 7.62 mm (Noir) TODO: Mk-I EMR 7.62 mm (Negro) + TODO: Mk-I EMR 7.62 мм (черный) TODO: Mk-I EMR 7.62 mm (Khaki) TODO: Mk-I EMR 7.62 mm (Khaki) Mk-l EMR 7.62 mm (Kaki) TODO: Mk-I EMR 7.62 mm (Caqui) + TODO: Mk-I EMR 7.62 мм (хаки) TODO: Mk-I EMR 7.62 mm (Sand) TODO: Mk-I EMR 7.62 mm (Sand) Mk-l EMR 7.62 mm (Beige) TODO: Mk-I EMR 7.62 mm (Arena) + TODO: Mk-I EMR 7.62 мм (песочный) TODO: Mk-I EMR 7.62 mm (Camo) TODO: Mk-I EMR 7.62 mm (Camo) Mk-l EMR 7.62 mm (Camo) TODO: Mk-I EMR 7.62 mm (Camuflaje) + TODO: Mk-I EMR 7.62 мм (камо) TODO: Mk-I EMR 7.62 mm (Woodland) TODO: Mk-I EMR 7.62 mm (Woodland) Mk-l EMR 7.62 mm (Woodland) TODO: Mk-I EMR 7.62 mm (Bosque) + TODO: Mk-I EMR 7.62 мм (лесной) TODO: NATO DMR (provisional) spotter TODO: NATO DMR (provisional) spotter NATO DMR (provisoire) Observateur TODO: NATO DMR (provisional) observador + TODO: NATO DMR (provisional) корректировщик TODO: ASP-1 Kir 12.7 mm TODO: ASP-1 Kir 12.7 mm ASP-1 Kir 12.7 mm TODO: ASP-1 Kir 12.7 mm + TODO: ASP-1 Kir 12.7 мм TODO: ASP-1 Kir 12.7 mm (Black) TODO: ASP-1 Kir 12.7 mm (Black) ASP-1 Kir 12.7 mm (Noir) TODO: ASP-1 Kir 12.7 mm (Negro) + TODO: ASP-1 Kir 12.7 мм (черный) TODO: ASP-1 Kir 12.7 mm (Tan) TODO: ASP-1 Kir 12.7 mm (Tan) ASP-1 Kir 12.7 mm (Tan) TODO: ASP-1 Kir 12.7 mm (Tan) + TODO: ASP-1 Kir 12.7 мм (бронзовый) TODO: Cyrus 9.3 mm TODO: Cyrus 9.3 mm Cyrus 9.3 mm TODO: Cyrus 9.3 mm + TODO: Cyrus 9.3 мм TODO: Cyrus 9.3 mm (Black) TODO: Cyrus 9.3 mm (Black) Cyrus 9.3 mm (Noir) TODO: Cyrus 9.3 mm (Negro) + TODO: Cyrus 9.3 мм (черный) TODO: Cyrus 9.3 mm (Hex) TODO: Cyrus 9.3 mm (Hex) Cyrus 9.3 mm (Hex) TODO: Cyrus 9.3 mm (Hex) + TODO: Cyrus 9.3 мм (гекс) TODO: Cyrus 9.3 mm (Tan) TODO: Cyrus 9.3 mm (Tan) Cyrus 9.3 mm (Tan) TODO: Cyrus 9.3 mm (Tan) + TODO: Cyrus 9.3 мм (бронза) TODO: Mk14 7.62 mm TODO: Mk14 7.62 mm Mk 14 7.62 mm TODO: Mk14 7.62 mm + TODO: Mk14 7.62 мм TODO: Mk14 7.62 mm (Camo) TODO: Mk14 7.62 mm (Camo) Mk 14 7.62 mm (Camo) TODO: Mk14 7.62 mm (Camuflaje) + TODO: Mk14 7.62 мм (камо) TODO: Mk14 7.62 mm (Olive) TODO: Mk14 7.62 mm (Olive) Mk 14 7.62 mm (Olive) TODO: Mk14 7.62 mm (Oliva) + TODO: Mk14 7.62 мм (олива) TODO: Navid 9.3 mm TODO: Navid 9.3 mm Navid 9.3 mm TODO: Navid 9.3 mm + TODO: Navid 9.3 мм TODO: Navid 9.3 mm (Hex) TODO: Navid 9.3 mm (Hex) Navid 9.3 mm (Hex) TODO: Navid 9.3 mm (Hex) + TODO: Navid 9.3 мм (гекс) TODO: Navid 9.3 mm (Tan) TODO: Navid 9.3 mm (Tan) Navid 9.3 mm (Tan) TODO: Navid 9.3 mm (Tan) + TODO: Navid 9.3 мм (бронза) TODO: SPMG .338 TODO: SPMG .338 SPMG .338 TODO: SPMG .338 + TODO: SPMG .338 TODO: SPMG .338 (MTP) TODO: SPMG .338 (MTP) SPMG .338 (MTP) TODO: SPMG .338 (MTP) + TODO: SPMG .338 (MTP) TODO: SPMG .338 (Black) TODO: SPMG .338 (Black) SPMG .338 (Noir) TODO: SPMG .338 (Negro) + TODO: SPMG .338 (черный) TODO: SPMG .338 (Sand) TODO: SPMG .338 (Sand) SPMG .338 (Beige) TODO: SPMG .338 (Arena) + TODO: SPMG .338 (песочный) From 15240ac87c62468c9466bd09c5a33f83396e3528 Mon Sep 17 00:00:00 2001 From: ulteq Date: Thu, 16 Apr 2015 13:42:28 +0200 Subject: [PATCH 129/305] Minor code change in the extension detection logic --- addons/advanced_ballistics/XEH_postInit.sqf | 5 +++-- addons/advanced_ballistics/script_component.hpp | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/addons/advanced_ballistics/XEH_postInit.sqf b/addons/advanced_ballistics/XEH_postInit.sqf index 783a5be569..41615696ac 100644 --- a/addons/advanced_ballistics/XEH_postInit.sqf +++ b/addons/advanced_ballistics/XEH_postInit.sqf @@ -33,9 +33,10 @@ GVAR(AtmosphericDensitySimulationEnabled) = true; GVAR(currentGrid) = 0; GVAR(INIT_MESSAGE_ENABLED) = false; -GVAR(extensionAvailable) = "ace_advanced_ballistics" callExtension "version" == "1.0"; +GVAR(extensionVersion) = ("ace_advanced_ballistics" callExtension "version"); +GVAR(extensionAvailable) = (GVAR(extensionVersion) == EXTENSION_REQUIRED_VERSION); if (!GVAR(extensionAvailable)) exitWith { - if ("ace_advanced_ballistics" callExtension "version" == "") then { + if (GVAR(extensionVersion) == "") then { diag_log text "[ACE] ERROR: ace_advanced_ballistics.dll is missing"; } else { diag_log text "[ACE] ERROR: ace_advanced_ballistics.dll is incompatible"; diff --git a/addons/advanced_ballistics/script_component.hpp b/addons/advanced_ballistics/script_component.hpp index 273afa2f49..70c2f47990 100644 --- a/addons/advanced_ballistics/script_component.hpp +++ b/addons/advanced_ballistics/script_component.hpp @@ -24,3 +24,5 @@ #define STD_AIR_DENSITY_ICAO 1.22498 #define STD_AIR_DENSITY_ASM 1.20885 #define GET_TEMPERATURE_AT_HEIGHT(h) (EGVAR(weather,currentTemperature) - 0.0065 * (h)) + +#define EXTENSION_REQUIRED_VERSION "1.0" From ca3293aa1a33e00aed3f83c4db5dca0295794ade Mon Sep 17 00:00:00 2001 From: ulteq Date: Thu, 16 Apr 2015 13:43:41 +0200 Subject: [PATCH 130/305] Added ACE_Box_Ammo (WIP): *TODO: Define a model --- addons/ballistics/CfgVehicles.hpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/addons/ballistics/CfgVehicles.hpp b/addons/ballistics/CfgVehicles.hpp index f992f8cc8b..4ea9fc87a2 100644 --- a/addons/ballistics/CfgVehicles.hpp +++ b/addons/ballistics/CfgVehicles.hpp @@ -160,7 +160,12 @@ class CfgVehicles { }; }; - class ACE_Box_Misc: Box_NATO_Support_F { + class ACE_Box_Ammo: NATO_Box_Base { + scope = 2; + accuracy = 1000; + displayName = "[ACE] Ammo Supply Crate"; + // TODO: model = "..."; + author = "$STR_ACE_Common_ACETeam"; class TransportMagazines { MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_SD,4); MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_M118LR_Mag,4); From d6cadb593acff5c104c014eb812b1f348411fbf0 Mon Sep 17 00:00:00 2001 From: ulteq Date: Thu, 16 Apr 2015 13:44:54 +0200 Subject: [PATCH 131/305] Enabled the ATragMX to use the advanced ballistics extension --- addons/atragmx/functions/fnc_calculate_solution.sqf | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/addons/atragmx/functions/fnc_calculate_solution.sqf b/addons/atragmx/functions/fnc_calculate_solution.sqf index 90263a608c..4e7f5981c1 100644 --- a/addons/atragmx/functions/fnc_calculate_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_solution.sqf @@ -109,8 +109,12 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do { if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { if (missionNamespace getVariable [QEGVAR(advanced_ballistics,AdvancedAirDragEnabled), false]) then { private ["_drag"]; - _drag = -1 * ([_dragModel, _bc, _trueSpeed] call EFUNC(advanced_ballistics,calculateRetardation)); - _bulletAccel = (vectorNormalized _trueVelocity) vectorMultiply (_drag); + _drag = if (missionNamespace getVariable [QEGVAR(advanced_ballistics,extensionAvailable), false]) then { + parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3", _dragModel, _bc, _trueSpeed])) + } else { + ([_dragModel, _bc, _trueSpeed] call EFUNC(advanced_ballistics,calculateRetardation)) + }; + _bulletAccel = (vectorNormalized _trueVelocity) vectorMultiply (-1 * _drag); }; } else { _bulletAccel = _trueVelocity vectorMultiply (_trueSpeed * _airFriction); From 55d9f7a3da2a1fde95146d321e9bdc0a1f70a90c Mon Sep 17 00:00:00 2001 From: ulteq Date: Thu, 16 Apr 2015 13:46:32 +0200 Subject: [PATCH 132/305] The previous GUI state is now restored when you open the ATragMX --- .../atragmx/functions/fnc_create_dialog.sqf | 20 +++++++++------- addons/atragmx/functions/fnc_init.sqf | 10 ++++++++ .../functions/fnc_show_add_new_gun.sqf | 2 ++ .../atragmx/functions/fnc_show_gun_list.sqf | 10 +++++++- .../atragmx/functions/fnc_show_main_page.sqf | 2 ++ .../atragmx/functions/fnc_show_range_card.sqf | 2 ++ .../functions/fnc_show_range_card_setup.sqf | 10 ++++++++ .../fnc_show_target_range_assist.sqf | 17 +++++++++++++ .../fnc_show_target_speed_assist.sqf | 24 +++++++++++++++++++ .../fnc_show_target_speed_assist_timer.sqf | 2 ++ .../fnc_target_speed_assist_timer.sqf | 2 -- .../atragmx/functions/fnc_toggle_gun_list.sqf | 6 ----- .../functions/fnc_toggle_range_card.sqf | 2 -- .../functions/fnc_toggle_range_card_setup.sqf | 10 +------- .../fnc_toggle_target_range_assist.sqf | 15 ------------ .../fnc_toggle_target_speed_assist.sqf | 22 ----------------- .../functions/fnc_update_target_selection.sqf | 2 -- .../functions/fnc_update_unit_selection.sqf | 2 -- addons/atragmx/script_component.hpp | 4 +++- 19 files changed, 94 insertions(+), 70 deletions(-) diff --git a/addons/atragmx/functions/fnc_create_dialog.sqf b/addons/atragmx/functions/fnc_create_dialog.sqf index 01cdcba184..8dc0f3e34f 100644 --- a/addons/atragmx/functions/fnc_create_dialog.sqf +++ b/addons/atragmx/functions/fnc_create_dialog.sqf @@ -23,15 +23,19 @@ createDialog 'ATragMX_Display'; call FUNC(update_target_selection); -true call FUNC(show_main_page); +GVAR(showMainPage) call FUNC(show_main_page); -false call FUNC(show_add_new_gun); -false call FUNC(show_gun_list); -false call FUNC(show_range_card); -false call FUNC(show_range_card_setup); -false call FUNC(show_target_range_assist); -false call FUNC(show_target_speed_assist); -false call FUNC(show_target_speed_assist_timer); +GVAR(showAddNewGun) call FUNC(show_add_new_gun); +GVAR(showGunList) call FUNC(show_gun_list); +GVAR(showRangeCard) call FUNC(show_range_card); +if (GVAR(showRangeCard)) then { + ctrlSetFocus (_dsp displayCtrl 5001); + [] call FUNC(update_range_card); +}; +GVAR(showRangeCardSetup) call FUNC(show_range_card_setup); +GVAR(showTargetRangeAssist) call FUNC(show_target_range_assist); +GVAR(showTargetSpeedAssist) call FUNC(show_target_speed_assist); +GVAR(showTargetSpeedAssistTimer) call FUNC(show_target_speed_assist_timer); { lbAdd [6000, _x select 0]; diff --git a/addons/atragmx/functions/fnc_init.sqf b/addons/atragmx/functions/fnc_init.sqf index 3f46a71fe2..267c04ea6f 100644 --- a/addons/atragmx/functions/fnc_init.sqf +++ b/addons/atragmx/functions/fnc_init.sqf @@ -56,3 +56,13 @@ GVAR(windageOutput) = [0, 0, 0, 0]; GVAR(leadOutput) = [0, 0, 0, 0]; GVAR(tofOutput) = [0, 0, 0, 0]; GVAR(velocityOutput) = [0, 0, 0, 0]; + +GVAR(showMainPage) = true; +GVAR(showAddNewGun) = false; +GVAR(showGunList) = false; +GVAR(showRangeCard) = false; +GVAR(showRangeCardSetup) = false; +GVAR(showTargetRangeAssist) = false; +GVAR(showTargetSpeedAssist) = false; +GVAR(showTargetSpeedAssistTimer) = false; + diff --git a/addons/atragmx/functions/fnc_show_add_new_gun.sqf b/addons/atragmx/functions/fnc_show_add_new_gun.sqf index 12815194dd..b1fd1deb44 100644 --- a/addons/atragmx/functions/fnc_show_add_new_gun.sqf +++ b/addons/atragmx/functions/fnc_show_add_new_gun.sqf @@ -15,4 +15,6 @@ */ #include "script_component.hpp" +GVAR(showAddNewGun) = _this; + {ctrlShow [_x, _this]} forEach [11000, 11001, 11002, 11003]; \ No newline at end of file diff --git a/addons/atragmx/functions/fnc_show_gun_list.sqf b/addons/atragmx/functions/fnc_show_gun_list.sqf index c34784e27a..8834f755f0 100644 --- a/addons/atragmx/functions/fnc_show_gun_list.sqf +++ b/addons/atragmx/functions/fnc_show_gun_list.sqf @@ -15,4 +15,12 @@ */ #include "script_component.hpp" -{ctrlShow [_x, _this]} forEach [6000, 6001, 6002, 6003, 6004, 6005, 6006, 6007]; \ No newline at end of file +GVAR(showGunList) = _this; + +{ctrlShow [_x, _this]} forEach [6000, 6001, 6002, 6003, 6004, 6005, 6006, 6007]; + +if (_this) then { + ctrlSetFocus (_dsp displayCtrl 6002); + + lbSetCurSel [6000, (GVAR(currentGun) select GVAR(currentTarget))]; +}; diff --git a/addons/atragmx/functions/fnc_show_main_page.sqf b/addons/atragmx/functions/fnc_show_main_page.sqf index 5eaf5eb560..941c7559c8 100644 --- a/addons/atragmx/functions/fnc_show_main_page.sqf +++ b/addons/atragmx/functions/fnc_show_main_page.sqf @@ -15,5 +15,7 @@ */ #include "script_component.hpp" +GVAR(showMainPage) = _this; + {ctrlShow [_x, _this]} forEach [10, 100, 11, 110, 12, 120, 13, 130, 14, 140, 20, 200, 21, 210, 22, 220, 30, 300, 31, 310, 32, 320, 33, 330, 34, 340, 40, 400, 401, 402, 403, 41, 410, 411, 412, 42, 420, 500, 501, 502, 503, 600, 601, 602, 603, 1000, 2000, 3000, 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008]; diff --git a/addons/atragmx/functions/fnc_show_range_card.sqf b/addons/atragmx/functions/fnc_show_range_card.sqf index 655630f6c5..5728d18546 100644 --- a/addons/atragmx/functions/fnc_show_range_card.sqf +++ b/addons/atragmx/functions/fnc_show_range_card.sqf @@ -15,4 +15,6 @@ */ #include "script_component.hpp" +GVAR(showRangeCard) = _this; + {ctrlShow [_x, _this]} forEach [5000, 5001, 5002, 5003, 5004, 5005, 5006, 5007]; diff --git a/addons/atragmx/functions/fnc_show_range_card_setup.sqf b/addons/atragmx/functions/fnc_show_range_card_setup.sqf index 3ed8cb5184..e9afe41cc5 100644 --- a/addons/atragmx/functions/fnc_show_range_card_setup.sqf +++ b/addons/atragmx/functions/fnc_show_range_card_setup.sqf @@ -15,4 +15,14 @@ */ #include "script_component.hpp" +GVAR(showRangeCardSetup) = _this; + {ctrlShow [_x, _this]} forEach [10000, 10001, 10002, 10003, 10004, 10005, 10006, 10007, 10008, 10009]; + +if (_this) then { + ctrlSetFocus (_dsp displayCtrl 10006); + + ctrlSetText [10003, Str(Round(GVAR(rangeCardStartRange)))]; + ctrlSetText [10004, Str(Round(GVAR(rangeCardEndRange)))]; + ctrlSetText [10005, Str(Round(GVAR(rangeCardIncrement)))]; +}; diff --git a/addons/atragmx/functions/fnc_show_target_range_assist.sqf b/addons/atragmx/functions/fnc_show_target_range_assist.sqf index 964e5f93d0..e3ca0a2626 100644 --- a/addons/atragmx/functions/fnc_show_target_range_assist.sqf +++ b/addons/atragmx/functions/fnc_show_target_range_assist.sqf @@ -15,4 +15,21 @@ */ #include "script_component.hpp" +GVAR(showTargetRangeAssist) = _this; + {ctrlShow [_x, _this]} forEach [7000, 7001, 7002, 7003, 7004, 7005, 7006, 7007, 7008, 7009, 7010, 7011, 7012, 7013, 7014, 7015, 7016, 7017, 7018, 7019, 7020]; + +if (_this) then { + ctrlSetFocus (_dsp displayCtrl 7018); + + ctrlSetText [7012, Str(parseNumber(ctrlText 320))]; + ctrlSetText [7013, Str(parseNumber(ctrlText 340))]; + + if (GVAR(currentUnit) != 2) then + { + ctrlSetText [7016, "Yards"]; + } else + { + ctrlSetText [7016, "Meters"]; + }; +}; \ No newline at end of file diff --git a/addons/atragmx/functions/fnc_show_target_speed_assist.sqf b/addons/atragmx/functions/fnc_show_target_speed_assist.sqf index ce1e8588b9..90425e26db 100644 --- a/addons/atragmx/functions/fnc_show_target_speed_assist.sqf +++ b/addons/atragmx/functions/fnc_show_target_speed_assist.sqf @@ -15,4 +15,28 @@ */ #include "script_component.hpp" +GVAR(showTargetSpeedAssist) = _this; + {ctrlShow [_x, _this]} forEach [8000, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 8011, 8012, 8013, 8014, 8015]; + +if (_this) then { + ctrlSetFocus (_dsp displayCtrl 8012); + + ctrlSetText [8004, Str(Round((GVAR(targetRange) select GVAR(currentTarget))))]; + + if (GVAR(currentUnit) != 2) then + { + ctrlSetText [8008, "Yards"]; + } else + { + ctrlSetText [8008, "Meters"]; + }; + + if (GVAR(currentUnit) != 1) then + { + ctrlSetText [8011, "m/s"]; + } else + { + ctrlSetText [8011, "mph"]; + }; +}; diff --git a/addons/atragmx/functions/fnc_show_target_speed_assist_timer.sqf b/addons/atragmx/functions/fnc_show_target_speed_assist_timer.sqf index 5b809b7ca9..8f2ff0c83e 100644 --- a/addons/atragmx/functions/fnc_show_target_speed_assist_timer.sqf +++ b/addons/atragmx/functions/fnc_show_target_speed_assist_timer.sqf @@ -15,4 +15,6 @@ */ #include "script_component.hpp" +GVAR(showTargetSpeedAssistTimer) = _this; + {ctrlShow [_x, _this]} forEach [9000, 9001, 9002]; diff --git a/addons/atragmx/functions/fnc_target_speed_assist_timer.sqf b/addons/atragmx/functions/fnc_target_speed_assist_timer.sqf index 90acd1a84f..d8414ba692 100644 --- a/addons/atragmx/functions/fnc_target_speed_assist_timer.sqf +++ b/addons/atragmx/functions/fnc_target_speed_assist_timer.sqf @@ -15,8 +15,6 @@ */ #include "script_component.hpp" -#define _dsp (uiNamespace getVariable "ATragMX_Display") - if !(ctrlVisible 9000) then { false call FUNC(show_target_speed_assist); diff --git a/addons/atragmx/functions/fnc_toggle_gun_list.sqf b/addons/atragmx/functions/fnc_toggle_gun_list.sqf index 4e24e4cb77..cd4acb1f76 100644 --- a/addons/atragmx/functions/fnc_toggle_gun_list.sqf +++ b/addons/atragmx/functions/fnc_toggle_gun_list.sqf @@ -15,8 +15,6 @@ */ #include "script_component.hpp" -#define _dsp (uiNamespace getVariable "ATragMX_Display") - if (ctrlVisible 6000) then { false call FUNC(show_gun_list); @@ -29,8 +27,4 @@ if (ctrlVisible 6000) then { false call FUNC(show_main_page); true call FUNC(show_gun_list); - - ctrlSetFocus (_dsp displayCtrl 6002); - - lbSetCurSel [6000, (GVAR(currentGun) select GVAR(currentTarget))]; }; diff --git a/addons/atragmx/functions/fnc_toggle_range_card.sqf b/addons/atragmx/functions/fnc_toggle_range_card.sqf index 6a5c386de7..6a75ea5445 100644 --- a/addons/atragmx/functions/fnc_toggle_range_card.sqf +++ b/addons/atragmx/functions/fnc_toggle_range_card.sqf @@ -15,8 +15,6 @@ */ #include "script_component.hpp" -#define _dsp (uiNamespace getVariable "ATragMX_Display") - if (ctrlVisible 5006) then { false call FUNC(show_range_card); diff --git a/addons/atragmx/functions/fnc_toggle_range_card_setup.sqf b/addons/atragmx/functions/fnc_toggle_range_card_setup.sqf index 28534c9dd9..71da18349b 100644 --- a/addons/atragmx/functions/fnc_toggle_range_card_setup.sqf +++ b/addons/atragmx/functions/fnc_toggle_range_card_setup.sqf @@ -3,7 +3,7 @@ * Toggles the range card setup screen on/off * * Arguments: - * Nothing + * Apply new range card settings * * Return Value: * Nothing @@ -15,8 +15,6 @@ */ #include "script_component.hpp" -#define _dsp (uiNamespace getVariable "ATragMX_Display") - if (ctrlVisible 10000) then { false call FUNC(show_range_card_setup); @@ -35,10 +33,4 @@ if (ctrlVisible 10000) then { false call FUNC(show_range_card); true call FUNC(show_range_card_setup); - - ctrlSetFocus (_dsp displayCtrl 10006); - - ctrlSetText [10003, Str(Round(GVAR(rangeCardStartRange)))]; - ctrlSetText [10004, Str(Round(GVAR(rangeCardEndRange)))]; - ctrlSetText [10005, Str(Round(GVAR(rangeCardIncrement)))]; }; diff --git a/addons/atragmx/functions/fnc_toggle_target_range_assist.sqf b/addons/atragmx/functions/fnc_toggle_target_range_assist.sqf index 352a6d0e1f..04e9307ded 100644 --- a/addons/atragmx/functions/fnc_toggle_target_range_assist.sqf +++ b/addons/atragmx/functions/fnc_toggle_target_range_assist.sqf @@ -15,8 +15,6 @@ */ #include "script_component.hpp" -#define _dsp (uiNamespace getVariable "ATragMX_Display") - if (ctrlVisible 7000) then { false call FUNC(show_target_range_assist); @@ -31,17 +29,4 @@ if (ctrlVisible 7000) then { false call FUNC(show_main_page); true call FUNC(show_target_range_assist); - - ctrlSetFocus (_dsp displayCtrl 7018); - - ctrlSetText [7012, Str(parseNumber(ctrlText 320))]; - ctrlSetText [7013, Str(parseNumber(ctrlText 340))]; - - if (GVAR(currentUnit) != 2) then - { - ctrlSetText [7016, "Yards"]; - } else - { - ctrlSetText [7016, "Meters"]; - }; }; diff --git a/addons/atragmx/functions/fnc_toggle_target_speed_assist.sqf b/addons/atragmx/functions/fnc_toggle_target_speed_assist.sqf index 0bda7ad019..66ffaa5d07 100644 --- a/addons/atragmx/functions/fnc_toggle_target_speed_assist.sqf +++ b/addons/atragmx/functions/fnc_toggle_target_speed_assist.sqf @@ -15,8 +15,6 @@ */ #include "script_component.hpp" -#define _dsp (uiNamespace getVariable "ATragMX_Display") - if (ctrlVisible 8000) then { false call FUNC(show_target_speed_assist); @@ -31,24 +29,4 @@ if (ctrlVisible 8000) then { false call FUNC(show_main_page); true call FUNC(show_target_speed_assist); - - ctrlSetFocus (_dsp displayCtrl 8012); - - ctrlSetText [8004, Str(Round((GVAR(targetRange) select GVAR(currentTarget))))]; - - if (GVAR(currentUnit) != 2) then - { - ctrlSetText [8008, "Yards"]; - } else - { - ctrlSetText [8008, "Meters"]; - }; - - if (GVAR(currentUnit) != 1) then - { - ctrlSetText [8011, "m/s"]; - } else - { - ctrlSetText [8011, "mph"]; - }; }; diff --git a/addons/atragmx/functions/fnc_update_target_selection.sqf b/addons/atragmx/functions/fnc_update_target_selection.sqf index d48412def0..476c22d658 100644 --- a/addons/atragmx/functions/fnc_update_target_selection.sqf +++ b/addons/atragmx/functions/fnc_update_target_selection.sqf @@ -15,8 +15,6 @@ */ #include "script_component.hpp" -#define _dsp (uiNamespace getVariable "ATragMX_Display") - (_dsp displayCtrl 500) ctrlEnable true; (_dsp displayCtrl 501) ctrlEnable true; (_dsp displayCtrl 502) ctrlEnable true; diff --git a/addons/atragmx/functions/fnc_update_unit_selection.sqf b/addons/atragmx/functions/fnc_update_unit_selection.sqf index dacc228032..f6a51c5cfc 100644 --- a/addons/atragmx/functions/fnc_update_unit_selection.sqf +++ b/addons/atragmx/functions/fnc_update_unit_selection.sqf @@ -15,8 +15,6 @@ */ #include "script_component.hpp" -#define _dsp (uiNamespace getVariable "ATragMX_Display") - (_dsp displayCtrl 600) ctrlEnable true; (_dsp displayCtrl 601) ctrlEnable true; (_dsp displayCtrl 602) ctrlEnable true; diff --git a/addons/atragmx/script_component.hpp b/addons/atragmx/script_component.hpp index 062df59d19..014524c6dd 100644 --- a/addons/atragmx/script_component.hpp +++ b/addons/atragmx/script_component.hpp @@ -9,4 +9,6 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_ATRAGMX #endif -#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file +#include "\z\ace\addons\main\script_macros.hpp" + +#define _dsp (uiNamespace getVariable "ATragMX_Display") From 4ff68eabd440e779a6612d7a629fbceab8c709c1 Mon Sep 17 00:00:00 2001 From: Coren4 Date: Thu, 16 Apr 2015 14:59:19 +0200 Subject: [PATCH 133/305] Update stringtable.xml --- addons/interact_menu/stringtable.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index ede985d6b3..98cac6116a 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -18,6 +18,7 @@ Показывать меню взаимодействия в виде списка Afficher le menu d'interaction au format liste Mostra il menù di interazione come lista + Wyświetlaj menu interakcji jako listę Interact Key From dca11e523b1c313ffadb2afee16e38de136b1b1d Mon Sep 17 00:00:00 2001 From: Tachii Date: Thu, 16 Apr 2015 18:08:58 +0300 Subject: [PATCH 134/305] Update stringtable.xml --- addons/attach/stringtable.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/attach/stringtable.xml b/addons/attach/stringtable.xml index e950d6ea59..db98c4fffc 100644 --- a/addons/attach/stringtable.xml +++ b/addons/attach/stringtable.xml @@ -11,7 +11,7 @@ Acoplar item >> Attacca l'oggetto >> Tárgy hozzácsatolása >> - Добавить приспособления + Прикрепить предмет Attach @@ -23,7 +23,7 @@ Acoplar Attacca Hozzácsatolás - Присоединить + Прикрепить Detach item @@ -47,7 +47,7 @@ Marcador IV Acoplado Strobo IR attaccata Infravörös jeladó hozzácsatolva - ИК-маяк присоединён + ИК-маяк прикреплён IR Strobe Detached @@ -71,7 +71,7 @@ Granada IV Acoplada Granata IR attaccata Infravörös gránát hozzácsatolva - ИК-граната присоединена + ИК-граната прикреплена IR Grenade Detached @@ -95,7 +95,7 @@ Chemlight Acoplada Chemlight attaccata Chemlight hozzácsatolva - Химсвет присоединён + Химсвет прикреплён Chemlight Detached From def2f9c28ee3b87c7a5618ea7802a99d3b2bb745 Mon Sep 17 00:00:00 2001 From: Tachii Date: Thu, 16 Apr 2015 18:13:53 +0300 Subject: [PATCH 135/305] Update stringtable.xml --- addons/captives/stringtable.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/captives/stringtable.xml b/addons/captives/stringtable.xml index fec8e703b1..5683eaf0d3 100644 --- a/addons/captives/stringtable.xml +++ b/addons/captives/stringtable.xml @@ -95,7 +95,7 @@ Algema Plástica Fascietta Gyorskötöző - Кабельная стяжка + Пластиковые наручники Cable ties that allow you to restrain prisoners. @@ -107,7 +107,7 @@ A algema plástica permite que você contenha prisioneiros. Fascietta che ti consente di arrestare i prigionieri. Gyorskötöző, emberek foglyulejtéséhez használható. - Кабельные стяжки позволяют связывать пленников. + Пластиковые наручники позволяют связывать пленников. Inventory of frisked person @@ -117,7 +117,7 @@ Motozott személy felszerelése Inventář prohledávané osoby Ekwipunek rewidowanej osoby - Инвентарь обысканных лиц + Инвентарь обысканного человека Inventário da pessoa revistada @@ -139,7 +139,7 @@ Rendirse Vzdát se Poddaj się - Сдаться в плен + Сдаться Megadás Arreso @@ -150,7 +150,7 @@ Dejar de rendirse Přestat se vzdávat Podejmij walkę ponownie - Отменить сдачу в плен + Прекратить сдачу в плен Megadás abbahagyása Annulla la resa From 184d7c85065fe1ae2a3669a0880548dd1c2cc05f Mon Sep 17 00:00:00 2001 From: jaynus Date: Thu, 16 Apr 2015 08:18:30 -0700 Subject: [PATCH 136/305] Tool addition. Search for missing private declarations by file. --- tools/search_privates.py | 80 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 tools/search_privates.py diff --git a/tools/search_privates.py b/tools/search_privates.py new file mode 100644 index 0000000000..61ac155e64 --- /dev/null +++ b/tools/search_privates.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 + +import fnmatch +import os +import re +import ntpath +from pyparsing import * + + + + +def check_privates(filepath): + + def pushClosing(t): + closingStack.append(closing.expr) + closing << Literal( closingFor[t[0]] ) + + def popClosing(): + closing << closingStack.pop() + + with open(filepath, 'r') as file: + content = file.read() + + priv_use = [] + priv_use = [] + priv_declared = [] + + # Regex search privates + srch = re.compile('(? 0: + print filepath + for bad_priv in missing: + print '\t' + bad_priv + +def main(): + + print("#########################") + print("# Search your Privates #") + print("#########################") + + sqf_list = [] + for root, dirnames, filenames in os.walk('../addons'): + for filename in fnmatch.filter(filenames, '*.sqf'): + sqf_list.append(os.path.join(root, filename)) + + for filename in sqf_list: + check_privates(filename) + +if __name__ == "__main__": + main() \ No newline at end of file From 2466d83cac6f5e55b860fe9ce2e3876227d0deee Mon Sep 17 00:00:00 2001 From: Tachii Date: Thu, 16 Apr 2015 18:19:11 +0300 Subject: [PATCH 137/305] Update stringtable.xml --- addons/common/stringtable.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index ade58c3742..d9ee389166 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -403,7 +403,7 @@ Die Hintergrundfarbe der ACE-Hinweise. El color de fondo de las notificaciones del ACE Il colore di sfondo dei suggerimenti dell'ACE. - Цвет фона всплывающий подсказок АСЕ. + Цвет фона всплывающих подсказок АСЕ. Kolor tła dla powiadomień ACE Notifications ACE: couleur de l'arrière plan Barva pozadí ACE nápověd. From f5078020fbf358ea888fede1f68a0f0a858200db Mon Sep 17 00:00:00 2001 From: Tachii Date: Thu, 16 Apr 2015 18:20:40 +0300 Subject: [PATCH 138/305] Update AUTHORS.txt https://github.com/acemod/ACE3/blob/master/addons/movement/config.cpp I want to be famous! --- AUTHORS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.txt b/AUTHORS.txt index fa47b6a427..52238dc8ac 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -81,3 +81,4 @@ BlackPixxel Asgar Serran Kavinsky Coren +Tachi From e6f29cfdb1e5dc12d1f56f127c5ebf70267092de Mon Sep 17 00:00:00 2001 From: Tachii Date: Thu, 16 Apr 2015 18:23:00 +0300 Subject: [PATCH 139/305] Update AUTHORS.txt --- AUTHORS.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AUTHORS.txt b/AUTHORS.txt index 52238dc8ac..2f16aea49c 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -71,6 +71,7 @@ Robert Boklahánics ramius86 simon84 Sniperwolf572 +Tachi Tonic Tourorist Valentin Torikian @@ -81,4 +82,3 @@ BlackPixxel Asgar Serran Kavinsky Coren -Tachi From defe46b7695fbaa4852ff9d6c7cd17f8a13c0988 Mon Sep 17 00:00:00 2001 From: ulteq Date: Thu, 16 Apr 2015 17:30:50 +0200 Subject: [PATCH 140/305] Added new PFH abort condition (velocity < 100 m/s) --- .../functions/fnc_handleFired.sqf | 16 +++++++++------- .../functions/fnc_updateTrajectoryPFH.sqf | 18 +++++++++--------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/addons/advanced_ballistics/functions/fnc_handleFired.sqf b/addons/advanced_ballistics/functions/fnc_handleFired.sqf index d628f012ee..a36f576bd6 100644 --- a/addons/advanced_ballistics/functions/fnc_handleFired.sqf +++ b/addons/advanced_ballistics/functions/fnc_handleFired.sqf @@ -158,15 +158,17 @@ if (GVAR(AdvancedAirDragEnabled)) then { [{ private ["_index", "_bullet", "_caliber", "_bulletTraceVisible", "_bulletVelocity", "_bulletPosition"]; EXPLODE_4_PVT(_this select 0,_bullet,_caliber,_bulletTraceVisible,_index); - - if (!alive _bullet) exitWith { - [_this select 1] call cba_fnc_removePerFrameHandler; - }; - + _bulletVelocity = velocity _bullet; _bulletPosition = getPosASL _bullet; - - if (_bulletTraceVisible && vectorMagnitude _bulletVelocity > 600) then { + + _bulletSpeed = vectorMagnitude _bulletVelocity; + + if (!alive _bullet || _bulletSpeed < 100) exitWith { + [_this select 1] call cba_fnc_removePerFrameHandler; + }; + + if (_bulletTraceVisible && _bulletSpeed > 600) then { drop ["\A3\data_f\ParticleEffects\Universal\Refract","","Billboard",1,0.1,getPos _bullet,[0,0,0],0,1.275,1,0,[0.4*_caliber,0.2*_caliber],[[0,0,0,0.6],[0,0,0,0.4]],[1,0],0,0,"","",""]; }; diff --git a/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf b/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf index 9859f330dd..42bac3eac8 100644 --- a/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf +++ b/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf @@ -22,17 +22,17 @@ _bullet = _args select 0; _airFriction = _args select 1; _time = _args select 2; - - if (!alive _bullet) exitwith { - [_this select 1] call cba_fnc_removePerFrameHandler; - }; - - _deltaT = time - _time; - _args set[2, time]; - + _bulletVelocity = velocity _bullet; _bulletSpeed = vectorMagnitude _bulletVelocity; - + + if (!alive _bullet || _bulletSpeed < 100) exitwith { + [_this select 1] call cba_fnc_removePerFrameHandler; + }; + + _deltaT = time - _time; + _args set[2, time]; + if (vectorMagnitude ACE_wind > 0) then { _trueVelocity = _bulletVelocity vectorDiff ACE_wind; _trueSpeed = vectorMagnitude _trueVelocity; From fe7596d28d4be75267a888d877a736b11cd02605 Mon Sep 17 00:00:00 2001 From: jaynus Date: Thu, 16 Apr 2015 08:46:11 -0700 Subject: [PATCH 141/305] handles CBA PARAMS_ and EXPLODE_ --- tools/search_privates.py | 48 ++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/tools/search_privates.py b/tools/search_privates.py index 61ac155e64..20b8f49ab1 100644 --- a/tools/search_privates.py +++ b/tools/search_privates.py @@ -4,11 +4,38 @@ import fnmatch import os import re import ntpath -from pyparsing import * +import sys +import argparse +def get_private_declare(content): + priv_declared = [] + + srch = re.compile('private.*') + priv_srch_declared = srch.findall(content) + priv_srch_declared = sorted(set(priv_srch_declared)) + + priv_dec_str = ''.join(priv_srch_declared) + + srch = re.compile('') + priv_split = srch.findall(priv_dec_str) + priv_split = sorted(set(priv_split)) + priv_declared += priv_split; + + srch = re.compile('PARAMS_[0-9].*|EXPLODE_PVT_[0-9].*') + priv_srch_declared = srch.findall(content) + priv_srch_declared = sorted(set(priv_srch_declared)) + + priv_dec_str = ''.join(priv_srch_declared) + + srch = re.compile('(? Date: Thu, 16 Apr 2015 17:52:21 +0200 Subject: [PATCH 142/305] Minor performance improvement --- addons/advanced_ballistics/functions/fnc_handleFired.sqf | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/addons/advanced_ballistics/functions/fnc_handleFired.sqf b/addons/advanced_ballistics/functions/fnc_handleFired.sqf index a36f576bd6..182166d3af 100644 --- a/addons/advanced_ballistics/functions/fnc_handleFired.sqf +++ b/addons/advanced_ballistics/functions/fnc_handleFired.sqf @@ -95,12 +95,11 @@ if (GVAR(ammoTemperatureEnabled)) then { }; }; -// TODO: Make _bulletTraceVisible global and toggle it with events _bulletTraceVisible = false; -if (GVAR(bulletTraceEnabled) && currentWeapon ACE_player == primaryWeapon ACE_player && count primaryWeaponItems ACE_player > 2) then { +if (GVAR(bulletTraceEnabled) && cameraView == "GUNNER" && currentWeapon ACE_player == primaryWeapon ACE_player && count primaryWeaponItems ACE_player > 2) then { _opticsName = (primaryWeaponItems ACE_player) select 2; _opticType = getNumber(configFile >> "cfgWeapons" >> _opticsName >> "ItemInfo" >> "opticType"); - _bulletTraceVisible = (_opticType == 2 || currentWeapon ACE_player in ["ACE_Vector", "Binocular", "Rangefinder", "Laserdesignator"]) && cameraView == "GUNNER"; + _bulletTraceVisible = (_opticType == 2 || currentWeapon ACE_player in ["ACE_Vector", "Binocular", "Rangefinder", "Laserdesignator"]); }; _caliber = getNumber(configFile >> "cfgAmmo" >> _ammo >> "ACE_caliber"); From b50c615e2c2a962476101e26e1d11bb61bcca89b Mon Sep 17 00:00:00 2001 From: jaynus Date: Thu, 16 Apr 2015 09:00:22 -0700 Subject: [PATCH 143/305] Updated for module-specific command line argument. --- tools/search_privates.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tools/search_privates.py b/tools/search_privates.py index 20b8f49ab1..eccde2fc26 100644 --- a/tools/search_privates.py +++ b/tools/search_privates.py @@ -21,7 +21,7 @@ def get_private_declare(content): priv_split = sorted(set(priv_split)) priv_declared += priv_split; - srch = re.compile('PARAMS_[0-9].*|EXPLODE_PVT_[0-9].*') + srch = re.compile('PARAMS_[0-9].*|EXPLODE_[0-9]_PVT.*') priv_srch_declared = srch.findall(content) priv_srch_declared = sorted(set(priv_srch_declared)) @@ -89,7 +89,12 @@ def main(): print("#########################") sqf_list = [] - for root, dirnames, filenames in os.walk('../addons'): + + parser = argparse.ArgumentParser() + parser.add_argument('-m','--module', help='only search specified module addon folder', required=False, default=".") + args = parser.parse_args() + + for root, dirnames, filenames in os.walk('../addons' + '/' + args.module): for filename in fnmatch.filter(filenames, '*.sqf'): sqf_list.append(os.path.join(root, filename)) From e35d3dab49c3a15b3606022e15c045d8c54800a8 Mon Sep 17 00:00:00 2001 From: ulteq Date: Thu, 16 Apr 2015 18:14:32 +0200 Subject: [PATCH 144/305] Overworked the ATragMX target slot logic: *Added missing privates *Solutions are now automatically calculated on target/gun selection --- addons/atragmx/RscTitles.hpp | 16 +++++----- addons/atragmx/XEH_preInit.sqf | 1 + .../functions/fnc_calculate_range_card.sqf | 22 +++++++------- .../fnc_calculate_scope_base_angle.sqf | 1 + .../fnc_calculate_target_solution.sqf | 23 +++++++------- addons/atragmx/functions/fnc_change_gun.sqf | 12 ++++---- .../functions/fnc_change_target_slot.sqf | 26 ++++++++++++++++ .../functions/fnc_cycle_scope_unit.sqf | 2 +- addons/atragmx/functions/fnc_init.sqf | 12 ++++---- addons/atragmx/functions/fnc_parse_input.sqf | 28 ++++++++--------- .../fnc_reset_relative_click_memory.sqf | 4 +-- addons/atragmx/functions/fnc_save_gun.sqf | 2 +- .../atragmx/functions/fnc_show_gun_list.sqf | 2 +- .../functions/fnc_update_atmosphere.sqf | 8 ++--- addons/atragmx/functions/fnc_update_gun.sqf | 22 +++++++------- .../functions/fnc_update_range_card.sqf | 8 ++--- .../fnc_update_relative_click_memory.sqf | 4 +-- .../atragmx/functions/fnc_update_result.sqf | 10 +++---- .../functions/fnc_update_scope_unit.sqf | 4 +-- .../functions/fnc_update_zero_range.sqf | 30 +++++++++---------- 20 files changed, 133 insertions(+), 104 deletions(-) create mode 100644 addons/atragmx/functions/fnc_change_target_slot.sqf diff --git a/addons/atragmx/RscTitles.hpp b/addons/atragmx/RscTitles.hpp index 8c0a647839..b60ff03fdc 100644 --- a/addons/atragmx/RscTitles.hpp +++ b/addons/atragmx/RscTitles.hpp @@ -230,12 +230,12 @@ class ATragMX_Display { w=0.03; h=0.03; colorBackground[]={0,0,0,0.0}; - action=QUOTE(((GVAR(currentGun) select GVAR(currentTarget)) + (count GVAR(gunList)) - 1) % (count GVAR(gunList)) call FUNC(change_gun)); + action=QUOTE((GVAR(currentGun) + (count GVAR(gunList)) - 1) % (count GVAR(gunList)) call FUNC(change_gun)); }; class BOTTOM: TOP { idc=-1; y=0.265*safezoneH+safezoneY+0.955; - action=QUOTE(((GVAR(currentGun) select GVAR(currentTarget)) + (count GVAR(gunList)) + 1) % (count GVAR(gunList)) call FUNC(change_gun)); + action=QUOTE((GVAR(currentGun) + (count GVAR(gunList)) + 1) % (count GVAR(gunList)) call FUNC(change_gun)); }; class LEFT: ATragMX_RscButton { idc=-1; @@ -244,12 +244,12 @@ class ATragMX_Display { w=0.05; h=0.03; colorBackground[]={0,0,0,0}; - action=QUOTE(call FUNC(parse_input); GVAR(currentTarget) = (4 + GVAR(currentTarget) - 1) % 4; call FUNC(update_target_selection)); + action=QUOTE(((4 + GVAR(currentTarget) - 1) % 4) call FUNC(change_target_slot)); }; class RIGHT: LEFT { idc=-1; x=0.55*safezoneW+safezoneX+0.2725; - action=QUOTE(call FUNC(parse_input); GVAR(currentTarget) = (4 + GVAR(currentTarget) + 1) % 4; call FUNC(update_target_selection)); + action=QUOTE(((4 + GVAR(currentTarget) + 1) % 4) call FUNC(change_target_slot)); }; class TOP_LEFT: ATragMX_RscButton { idc=-1; @@ -420,25 +420,25 @@ class ATragMX_Display { colorBackgroundDisabled[]={0,0,0,1}; colorBackgroundActive[]={0,0,0,0}; text="A"; - action=QUOTE(call FUNC(parse_input); GVAR(currentTarget)=0; call FUNC(update_target_selection)); + action=QUOTE(0 call FUNC(change_target_slot)); }; class TEXT_TARGET_B: TEXT_TARGET_A { idc=501; x=0.550*safezoneW+safezoneX+0.2281; text="B"; - action=QUOTE(call FUNC(parse_input); GVAR(currentTarget)=1; call FUNC(update_target_selection)); + action=QUOTE(1 call FUNC(change_target_slot)); }; class TEXT_TARGET_C: TEXT_TARGET_B { idc=502; x=0.550*safezoneW+safezoneX+0.2512; text="C"; - action=QUOTE(call FUNC(parse_input); GVAR(currentTarget)=2; call FUNC(update_target_selection)); + action=QUOTE(2 call FUNC(change_target_slot)); }; class TEXT_TARGET_D: TEXT_TARGET_B { idc=503; x=0.550*safezoneW+safezoneX+0.2743; text="D"; - action=QUOTE(call FUNC(parse_input); GVAR(currentTarget)=3; call FUNC(update_target_selection)); + action=QUOTE(3 call FUNC(change_target_slot)); }; class TEXT_TARGET: TEXT_GUN { diff --git a/addons/atragmx/XEH_preInit.sqf b/addons/atragmx/XEH_preInit.sqf index 91024d05a3..0224fc3e9c 100644 --- a/addons/atragmx/XEH_preInit.sqf +++ b/addons/atragmx/XEH_preInit.sqf @@ -11,6 +11,7 @@ PREP(calculate_target_solution); PREP(calculate_target_speed_assist); PREP(can_show); PREP(change_gun); +PREP(change_target_slot); PREP(create_dialog); PREP(cycle_range_card_columns); PREP(cycle_scope_unit); diff --git a/addons/atragmx/functions/fnc_calculate_range_card.sqf b/addons/atragmx/functions/fnc_calculate_range_card.sqf index 05625a53f6..aecd6496af 100644 --- a/addons/atragmx/functions/fnc_calculate_range_card.sqf +++ b/addons/atragmx/functions/fnc_calculate_range_card.sqf @@ -18,21 +18,21 @@ [] call FUNC(parse_input); private ["_scopeBaseAngle"]; -_scopeBaseAngle = ((GVAR(workingMemory) select GVAR(currentTarget)) select 3); +_scopeBaseAngle = (GVAR(workingMemory) select 3); private ["_bulletMass", "_boreHeight", "_airFriction", "_muzzleVelocity", "_bc", "_dragModel", "_atmosphereModel"]; -_bulletMass = (GVAR(workingMemory) select GVAR(currentTarget)) select 12; -_boreHeight = (GVAR(workingMemory) select GVAR(currentTarget)) select 5; -_airFriction = (GVAR(workingMemory) select GVAR(currentTarget)) select 4; -_muzzleVelocity = (GVAR(workingMemory) select GVAR(currentTarget)) select 1; -_bc = (GVAR(workingMemory) select GVAR(currentTarget)) select 15; -_dragModel = (GVAR(workingMemory) select GVAR(currentTarget)) select 16; -_atmosphereModel = (GVAR(workingMemory) select GVAR(currentTarget)) select 17; +_bulletMass = GVAR(workingMemory) select 12; +_boreHeight = GVAR(workingMemory) select 5; +_airFriction = GVAR(workingMemory) select 4; +_muzzleVelocity = GVAR(workingMemory) select 1; +_bc = GVAR(workingMemory) select 15; +_dragModel = GVAR(workingMemory) select 16; +_atmosphereModel = GVAR(workingMemory) select 17; private ["_temperature", "_barometricPressure", "_relativeHumidity"]; -_temperature = (GVAR(temperature) select GVAR(currentTarget)); -_barometricPressure = (GVAR(barometricPressure) select GVAR(currentTarget)); -_relativeHumidity = (GVAR(relativeHumidity) select GVAR(currentTarget)); +_temperature = GVAR(temperature); +_barometricPressure = GVAR(barometricPressure); +_relativeHumidity = GVAR(relativeHumidity); if (GVAR(currentUnit) == 1) then { _temperature = (_temperature - 32) / 1.8; diff --git a/addons/atragmx/functions/fnc_calculate_scope_base_angle.sqf b/addons/atragmx/functions/fnc_calculate_scope_base_angle.sqf index 4822b08b37..17370c82b2 100644 --- a/addons/atragmx/functions/fnc_calculate_scope_base_angle.sqf +++ b/addons/atragmx/functions/fnc_calculate_scope_base_angle.sqf @@ -34,6 +34,7 @@ _temperature = 15; _barometricPressure = 1013.25; _relativeHumidity = 0; +private ["_result"]; _result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, 0, 0, 0, 0, _zeroRange, _airFriction, 1, "ICAO", false] call FUNC(calculate_solution); _scopeBaseAngle + (_result select 0) / 60 diff --git a/addons/atragmx/functions/fnc_calculate_target_solution.sqf b/addons/atragmx/functions/fnc_calculate_target_solution.sqf index 57783d9cca..3f4c92c191 100644 --- a/addons/atragmx/functions/fnc_calculate_target_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_target_solution.sqf @@ -18,21 +18,21 @@ [] call FUNC(parse_input); private ["_scopeBaseAngle"]; -_scopeBaseAngle = ((GVAR(workingMemory) select GVAR(currentTarget)) select 3); +_scopeBaseAngle = (GVAR(workingMemory) select 3); private ["_bulletMass", "_boreHeight", "_airFriction", "_muzzleVelocity", "_bc", "_dragModel", "_atmosphereModel"]; -_bulletMass = (GVAR(workingMemory) select GVAR(currentTarget)) select 12; -_boreHeight = (GVAR(workingMemory) select GVAR(currentTarget)) select 5; -_airFriction = (GVAR(workingMemory) select GVAR(currentTarget)) select 4; -_muzzleVelocity = (GVAR(workingMemory) select GVAR(currentTarget)) select 1; -_bc = (GVAR(workingMemory) select GVAR(currentTarget)) select 15; -_dragModel = (GVAR(workingMemory) select GVAR(currentTarget)) select 16; -_atmosphereModel = (GVAR(workingMemory) select GVAR(currentTarget)) select 17; +_bulletMass = GVAR(workingMemory) select 12; +_boreHeight = GVAR(workingMemory) select 5; +_airFriction = GVAR(workingMemory) select 4; +_muzzleVelocity = GVAR(workingMemory) select 1; +_bc = GVAR(workingMemory) select 15; +_dragModel = GVAR(workingMemory) select 16; +_atmosphereModel = GVAR(workingMemory) select 17; private ["_temperature", "_barometricPressure", "_relativeHumidity"]; -_temperature = (GVAR(temperature) select GVAR(currentTarget)); -_barometricPressure = (GVAR(barometricPressure) select GVAR(currentTarget)); -_relativeHumidity = (GVAR(relativeHumidity) select GVAR(currentTarget)); +_temperature = GVAR(temperature); +_barometricPressure = GVAR(barometricPressure); +_relativeHumidity = GVAR(relativeHumidity); if (GVAR(currentUnit) == 1) then { _temperature = (_temperature - 32) / 1.8; @@ -55,6 +55,7 @@ if (GVAR(currentUnit) == 1) then _targetSpeed = _targetSpeed / 2.23693629; }; +private ["_result"]; _result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, _windSpeed, _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, false] call FUNC(calculate_solution); diff --git a/addons/atragmx/functions/fnc_change_gun.sqf b/addons/atragmx/functions/fnc_change_gun.sqf index 259441d51d..520e4e85be 100644 --- a/addons/atragmx/functions/fnc_change_gun.sqf +++ b/addons/atragmx/functions/fnc_change_gun.sqf @@ -17,14 +17,14 @@ if (_this < 0 || _this > (count GVAR(gunList)) - 1) exitWith {}; -GVAR(workingMemory) set [GVAR(currentTarget), +(GVAR(gunList) select _this)]; -GVAR(currentGun) set [GVAR(currentTarget), _this]; +GVAR(workingMemory) = +(GVAR(gunList) select _this); +GVAR(currentGun) = _this; -lbSetCurSel [6000, (GVAR(currentGun) select GVAR(currentTarget))]; +lbSetCurSel [6000, GVAR(currentGun)]; -if ((GVAR(scopeUnits) select (GVAR(currentScopeUnit) select GVAR(currentTarget))) != "Clicks") then +if ((GVAR(scopeUnits) select GVAR(currentScopeUnit)) != "Clicks") then { - GVAR(currentScopeUnit) set [GVAR(currentTarget), (GVAR(workingMemory) select GVAR(currentTarget)) select 6]; + GVAR(currentScopeUnit) = GVAR(workingMemory) select 6; }; [] call FUNC(update_gun); @@ -35,4 +35,4 @@ GVAR(leadOutput) set [GVAR(currentTarget), 0]; GVAR(tofOutput) set [GVAR(currentTarget), 0]; GVAR(velocityOutput) set [GVAR(currentTarget), 0]; -[] call FUNC(update_result); +[] call FUNC(calculate_target_solution); diff --git a/addons/atragmx/functions/fnc_change_target_slot.sqf b/addons/atragmx/functions/fnc_change_target_slot.sqf new file mode 100644 index 0000000000..6e6951c6bf --- /dev/null +++ b/addons/atragmx/functions/fnc_change_target_slot.sqf @@ -0,0 +1,26 @@ +/* + * Author: Ruthberg + * Selects a target slot (A, B, C or D) + * + * Arguments: + * target + * + * Return Value: + * Nothing + * + * Example: + * 2 call ace_atragmx_fnc_change_target_slot + * + * Public: No + */ +#include "script_component.hpp" + +private ["_target"]; +_target = 0 max _this min 3; + +call FUNC(parse_input); + +GVAR(currentTarget) = _target; +call FUNC(update_target_selection); + +call FUNC(calculate_target_solution); diff --git a/addons/atragmx/functions/fnc_cycle_scope_unit.sqf b/addons/atragmx/functions/fnc_cycle_scope_unit.sqf index 99704220d4..36f704bd2d 100644 --- a/addons/atragmx/functions/fnc_cycle_scope_unit.sqf +++ b/addons/atragmx/functions/fnc_cycle_scope_unit.sqf @@ -17,7 +17,7 @@ [] call FUNC(parse_input); -GVAR(currentScopeUnit) set [GVAR(currentTarget), ((GVAR(currentScopeUnit) select GVAR(currentTarget)) + 1) % (count GVAR(scopeUnits))]; +GVAR(currentScopeUnit) = (GVAR(currentScopeUnit) + 1) % (count GVAR(scopeUnits)); [] call FUNC(update_scope_unit); [] call FUNC(update_result); diff --git a/addons/atragmx/functions/fnc_init.sqf b/addons/atragmx/functions/fnc_init.sqf index 267c04ea6f..8fda3570fa 100644 --- a/addons/atragmx/functions/fnc_init.sqf +++ b/addons/atragmx/functions/fnc_init.sqf @@ -15,7 +15,7 @@ */ #include "script_component.hpp" -GVAR(workingMemory) = [+(GVAR(gunList) select 0), +(GVAR(gunList) select 0), +(GVAR(gunList) select 0), +(GVAR(gunList) select 0)]; +GVAR(workingMemory) = +(GVAR(gunList) select 0); GVAR(scopeUnits) = ["MILs", "TMOA", "SMOA", "Clicks"]; @@ -37,13 +37,13 @@ GVAR(speedAssistNumTicksUnit) = 0; GVAR(speedAssistTimer) = true; GVAR(currentUnit) = 2; -GVAR(currentGun) = [0, 0, 0, 0]; +GVAR(currentGun) = 0; GVAR(currentTarget) = 0; -GVAR(currentScopeUnit) = [0, 0, 0, 0]; +GVAR(currentScopeUnit) = 0; -GVAR(temperature) = [15, 15, 15, 15]; -GVAR(barometricPressure) = [1013.25, 1013.25, 1013.25, 1013.25]; -GVAR(relativeHumidity) = [0.5, 0.5, 0.5, 0.5]; +GVAR(temperature) = 15; +GVAR(barometricPressure) = 1013.25; +GVAR(relativeHumidity) = 0.5; GVAR(windSpeed) = [0, 0, 0, 0]; GVAR(windDirection) = [12, 12, 12, 12]; diff --git a/addons/atragmx/functions/fnc_parse_input.sqf b/addons/atragmx/functions/fnc_parse_input.sqf index 4a525dcad8..7d364cbdfc 100644 --- a/addons/atragmx/functions/fnc_parse_input.sqf +++ b/addons/atragmx/functions/fnc_parse_input.sqf @@ -15,9 +15,9 @@ */ #include "script_component.hpp" -GVAR(temperature) set [GVAR(currentTarget), parseNumber(ctrlText 200)]; -GVAR(barometricPressure) set [GVAR(currentTarget), 0 max parseNumber(ctrlText 210)]; -GVAR(relativeHumidity) set [GVAR(currentTarget), (0 max parseNumber(ctrlText 220) min 100) / 100]; +GVAR(temperature) = parseNumber(ctrlText 200); +GVAR(barometricPressure) = 0 max parseNumber(ctrlText 210); +GVAR(relativeHumidity) = (0 max parseNumber(ctrlText 220) min 100) / 100; GVAR(windSpeed) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 300)) min 50]; GVAR(windDirection) set [GVAR(currentTarget), 1 max Round(parseNumber(ctrlText 310)) min 12]; @@ -44,20 +44,20 @@ _boreHeight = 0.1 max _boreHeight min 10; _bulletMass = 1 max _bulletMass min 100; _muzzleVelocity = 100 max _muzzleVelocity min 1400; -(GVAR(workingMemory) select GVAR(currentTarget)) set [5, _boreHeight]; -(GVAR(workingMemory) select GVAR(currentTarget)) set [12, _bulletMass]; +GVAR(workingMemory) set [5, _boreHeight]; +GVAR(workingMemory) set [12, _bulletMass]; if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,AdvancedAirDragEnabled), false])) then { - (GVAR(workingMemory) select GVAR(currentTarget)) set [15, _airFriction]; + GVAR(workingMemory) set [15, _airFriction]; } else { - (GVAR(workingMemory) select GVAR(currentTarget)) set [4, _airFriction]; + GVAR(workingMemory) set [4, _airFriction]; }; -(GVAR(workingMemory) select GVAR(currentTarget)) set [1, _muzzleVelocity]; +GVAR(workingMemory) set [1, _muzzleVelocity]; -private ["_elevationCur", "_elevationCur", "_elevationScopeStep", "_windageScopeStep"]; +private ["_elevationCur", "_windageCur", "_elevationScopeStep", "_windageScopeStep"]; _elevationCur = parseNumber(ctrlText 402); _windageCur = parseNumber(ctrlText 412); -switch ((GVAR(currentScopeUnit) select GVAR(currentTarget))) do +switch (GVAR(currentScopeUnit)) do { case 0: { @@ -73,16 +73,16 @@ switch ((GVAR(currentScopeUnit) select GVAR(currentTarget))) do case 3: { - _elevationScopeStep = ((GVAR(workingMemory) select GVAR(currentTarget)) select 7); - _windageScopeStep = ((GVAR(workingMemory) select GVAR(currentTarget)) select 8); + _elevationScopeStep = (GVAR(workingMemory) select 7); + _windageScopeStep = (GVAR(workingMemory) select 8); _elevationCur = _elevationCur * _elevationScopeStep; _windageCur = _windageCur * _windageScopeStep; }; }; -(GVAR(workingMemory) select GVAR(currentTarget)) set [10, _elevationCur]; -(GVAR(workingMemory) select GVAR(currentTarget)) set [11, _windageCur]; +GVAR(workingMemory) set [10, _elevationCur]; +GVAR(workingMemory) set [11, _windageCur]; [] call FUNC(update_gun); [] call FUNC(update_atmosphere); diff --git a/addons/atragmx/functions/fnc_reset_relative_click_memory.sqf b/addons/atragmx/functions/fnc_reset_relative_click_memory.sqf index 1a20af7452..96d638dc1a 100644 --- a/addons/atragmx/functions/fnc_reset_relative_click_memory.sqf +++ b/addons/atragmx/functions/fnc_reset_relative_click_memory.sqf @@ -15,7 +15,7 @@ */ #include "script_component.hpp" -(GVAR(workingMemory) select GVAR(currentTarget)) set [10, 0]; -(GVAR(workingMemory) select GVAR(currentTarget)) set [11, 0]; +GVAR(workingMemory) set [10, 0]; +GVAR(workingMemory) set [11, 0]; [] call FUNC(update_result); diff --git a/addons/atragmx/functions/fnc_save_gun.sqf b/addons/atragmx/functions/fnc_save_gun.sqf index d797939991..4b42f2027f 100644 --- a/addons/atragmx/functions/fnc_save_gun.sqf +++ b/addons/atragmx/functions/fnc_save_gun.sqf @@ -18,7 +18,7 @@ private ["_index"]; _index = 0 max (lbCurSel 6000); -GVAR(gunList) set [_index, +(GVAR(workingMemory) select GVAR(currentTarget))]; +GVAR(gunList) set [_index, +GVAR(workingMemory)]; lbClear 6000; { diff --git a/addons/atragmx/functions/fnc_show_gun_list.sqf b/addons/atragmx/functions/fnc_show_gun_list.sqf index 8834f755f0..e51aaba13b 100644 --- a/addons/atragmx/functions/fnc_show_gun_list.sqf +++ b/addons/atragmx/functions/fnc_show_gun_list.sqf @@ -22,5 +22,5 @@ GVAR(showGunList) = _this; if (_this) then { ctrlSetFocus (_dsp displayCtrl 6002); - lbSetCurSel [6000, (GVAR(currentGun) select GVAR(currentTarget))]; + lbSetCurSel [6000, GVAR(currentGun)]; }; diff --git a/addons/atragmx/functions/fnc_update_atmosphere.sqf b/addons/atragmx/functions/fnc_update_atmosphere.sqf index 91f1831b04..68a60f72e9 100644 --- a/addons/atragmx/functions/fnc_update_atmosphere.sqf +++ b/addons/atragmx/functions/fnc_update_atmosphere.sqf @@ -15,10 +15,10 @@ */ #include "script_component.hpp" -ctrlSetText [200, Str(Round((GVAR(temperature) select GVAR(currentTarget)) * 10) / 10)]; +ctrlSetText [200, Str(Round(GVAR(temperature) * 10) / 10)]; if (GVAR(currentUnit) == 1) then { - ctrlSetText [210, Str(Round((GVAR(barometricPressure) select GVAR(currentTarget)) * 100) / 100)]; + ctrlSetText [210, Str(Round(GVAR(barometricPressure) * 100) / 100)]; } else { - ctrlSetText [210, Str(Round(GVAR(barometricPressure) select GVAR(currentTarget)))]; + ctrlSetText [210, Str(Round(GVAR(barometricPressure)))]; }; -ctrlSetText [220, Str(Round((GVAR(relativeHumidity) select GVAR(currentTarget)) * 100 * 10) / 10)]; +ctrlSetText [220, Str(Round(GVAR(relativeHumidity) * 100 * 10) / 10)]; diff --git a/addons/atragmx/functions/fnc_update_gun.sqf b/addons/atragmx/functions/fnc_update_gun.sqf index cd80e5f122..1e12439878 100644 --- a/addons/atragmx/functions/fnc_update_gun.sqf +++ b/addons/atragmx/functions/fnc_update_gun.sqf @@ -15,39 +15,39 @@ */ #include "script_component.hpp" -ctrlSetText [1000, (GVAR(workingMemory) select GVAR(currentTarget)) select 0]; +ctrlSetText [1000, GVAR(workingMemory) select 0]; if (GVAR(currentUnit) == 1) then { - ctrlSetText [ 100, Str(Round(((GVAR(workingMemory) select GVAR(currentTarget)) select 5) / 2.54 * 100) / 100)]; + ctrlSetText [ 100, Str(Round((GVAR(workingMemory) select 5) / 2.54 * 100) / 100)]; } else { - ctrlSetText [ 100, Str(Round(((GVAR(workingMemory) select GVAR(currentTarget)) select 5) * 100) / 100)]; + ctrlSetText [ 100, Str(Round((GVAR(workingMemory) select 5) * 100) / 100)]; }; if (GVAR(currentUnit) == 1) then { - ctrlSetText [ 110, Str(Round(((GVAR(workingMemory) select GVAR(currentTarget)) select 12) * 15.4323584))]; + ctrlSetText [ 110, Str(Round((GVAR(workingMemory) select 12) * 15.4323584))]; } else { - ctrlSetText [ 110, Str(Round((GVAR(workingMemory) select GVAR(currentTarget)) select 12))]; + ctrlSetText [ 110, Str(Round(GVAR(workingMemory) select 12))]; }; if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,AdvancedAirDragEnabled), false])) then { - ctrlSetText [ 120, Str(Round(((GVAR(workingMemory) select GVAR(currentTarget)) select 15) * 1000) / 1000)]; + ctrlSetText [ 120, Str(Round((GVAR(workingMemory) select 15) * 1000) / 1000)]; } else { - ctrlSetText [ 120, Str(Round(((GVAR(workingMemory) select GVAR(currentTarget)) select 4) * -1000 * 1000) / 1000)]; + ctrlSetText [ 120, Str(Round((GVAR(workingMemory) select 4) * -1000 * 1000) / 1000)]; }; if (GVAR(currentUnit) == 1) then { - ctrlSetText [130, Str(Round(((GVAR(workingMemory) select GVAR(currentTarget)) select 1) * 3.2808399))]; + ctrlSetText [130, Str(Round((GVAR(workingMemory) select 1) * 3.2808399))]; } else { - ctrlSetText [130, Str(Round((GVAR(workingMemory) select GVAR(currentTarget)) select 1))]; + ctrlSetText [130, Str(Round(GVAR(workingMemory) select 1))]; }; if (GVAR(currentUnit) == 2) then { - ctrlSetText [140, Str(Round((GVAR(workingMemory) select GVAR(currentTarget)) select 2))]; + ctrlSetText [140, Str(Round(GVAR(workingMemory) select 2))]; } else { - ctrlSetText [140, Str(Round(((GVAR(workingMemory) select GVAR(currentTarget)) select 2) * 1.0936133))]; + ctrlSetText [140, Str(Round((GVAR(workingMemory) select 2) * 1.0936133))]; }; [] call FUNC(update_scope_unit); diff --git a/addons/atragmx/functions/fnc_update_range_card.sqf b/addons/atragmx/functions/fnc_update_range_card.sqf index 546c38d24c..358a74ce5d 100644 --- a/addons/atragmx/functions/fnc_update_range_card.sqf +++ b/addons/atragmx/functions/fnc_update_range_card.sqf @@ -15,7 +15,7 @@ */ #include "script_component.hpp" -private ["_range", "_elevation", "_windage", "_lead", "_TOF", "_velocity", "_kineticEnergy", "_rangeOutput", "_elevationOutput", "_windageOutput", "_lastColumnOutput"]; +private ["_range", "_elevation", "_windage", "_elevationScopeStep", "_windageScopeStep", "_lead", "_TOF", "_velocity", "_kineticEnergy", "_rangeOutput", "_elevationOutput", "_windageOutput", "_lastColumnOutput"]; _lastColumnOutput = ""; ctrlSetText [5006, (GVAR(rangeCardLastColumns) select GVAR(rangeCardCurrentColumn))]; @@ -39,7 +39,7 @@ lnbClear 5007; _velocity = _x select 5; _kineticEnergy = _x select 6; - switch ((GVAR(currentScopeUnit) select GVAR(currentTarget))) do + switch (GVAR(currentScopeUnit)) do { case 0: { @@ -55,8 +55,8 @@ lnbClear 5007; case 3: { - _elevationScopeStep = ((GVAR(workingMemory) select GVAR(currentTarget)) select 7); - _windageScopeStep = ((GVAR(workingMemory) select GVAR(currentTarget)) select 8); + _elevationScopeStep = (GVAR(workingMemory) select 7); + _windageScopeStep = (GVAR(workingMemory) select 8); _elevation = Round(_elevation / _elevationScopeStep); _windage = Round(_windage / _windageScopeStep); diff --git a/addons/atragmx/functions/fnc_update_relative_click_memory.sqf b/addons/atragmx/functions/fnc_update_relative_click_memory.sqf index 378124ad4f..1d5add83db 100644 --- a/addons/atragmx/functions/fnc_update_relative_click_memory.sqf +++ b/addons/atragmx/functions/fnc_update_relative_click_memory.sqf @@ -15,7 +15,7 @@ */ #include "script_component.hpp" -(GVAR(workingMemory) select GVAR(currentTarget)) set [10, (GVAR(elevationOutput) select GVAR(currentTarget))]; -(GVAR(workingMemory) select GVAR(currentTarget)) set [11, (GVAR(windageOutput) select GVAR(currentTarget))]; +GVAR(workingMemory) set [10, (GVAR(elevationOutput) select GVAR(currentTarget))]; +GVAR(workingMemory) set [11, (GVAR(windageOutput) select GVAR(currentTarget))]; [] call FUNC(update_result); diff --git a/addons/atragmx/functions/fnc_update_result.sqf b/addons/atragmx/functions/fnc_update_result.sqf index 11ff8a314e..addd1034b2 100644 --- a/addons/atragmx/functions/fnc_update_result.sqf +++ b/addons/atragmx/functions/fnc_update_result.sqf @@ -19,15 +19,15 @@ private ["_elevationAbs", "_elevationRel", "_elevationCur", "_windageAbs", "_win _elevationAbs = (GVAR(elevationOutput) select GVAR(currentTarget)); _windageAbs = (GVAR(windageOutput) select GVAR(currentTarget)); -_elevationCur = (GVAR(workingMemory) select GVAR(currentTarget)) select 10; -_windageCur = (GVAR(workingMemory) select GVAR(currentTarget)) select 11; +_elevationCur = GVAR(workingMemory) select 10; +_windageCur = GVAR(workingMemory) select 11; _elevationRel = _elevationAbs - _elevationCur; _windageRel = _windageAbs - _windageCur; _lead = (GVAR(leadOutput) select GVAR(currentTarget)); -switch ((GVAR(currentScopeUnit) select GVAR(currentTarget))) do +switch (GVAR(currentScopeUnit)) do { case 0: { @@ -55,8 +55,8 @@ switch ((GVAR(currentScopeUnit) select GVAR(currentTarget))) do case 3: { - _elevationScopeStep = ((GVAR(workingMemory) select GVAR(currentTarget)) select 7); - _windageScopeStep = ((GVAR(workingMemory) select GVAR(currentTarget)) select 8); + _elevationScopeStep = (GVAR(workingMemory) select 7); + _windageScopeStep = (GVAR(workingMemory) select 8); _elevationAbs = Round(_elevationAbs / _elevationScopeStep); _windageAbs = Round(_windageAbs / _windageScopeStep); diff --git a/addons/atragmx/functions/fnc_update_scope_unit.sqf b/addons/atragmx/functions/fnc_update_scope_unit.sqf index 2a4435c376..55bb703eee 100644 --- a/addons/atragmx/functions/fnc_update_scope_unit.sqf +++ b/addons/atragmx/functions/fnc_update_scope_unit.sqf @@ -15,5 +15,5 @@ */ #include "script_component.hpp" -ctrlSetText [2000, GVAR(scopeUnits) select (GVAR(currentScopeUnit) select GVAR(currentTarget))]; -ctrlSetText [5000, GVAR(scopeUnits) select (GVAR(currentScopeUnit) select GVAR(currentTarget))]; +ctrlSetText [2000, GVAR(scopeUnits) select GVAR(currentScopeUnit)]; +ctrlSetText [5000, GVAR(scopeUnits) select GVAR(currentScopeUnit)]; diff --git a/addons/atragmx/functions/fnc_update_zero_range.sqf b/addons/atragmx/functions/fnc_update_zero_range.sqf index 15e65c38a6..e7f0c2c301 100644 --- a/addons/atragmx/functions/fnc_update_zero_range.sqf +++ b/addons/atragmx/functions/fnc_update_zero_range.sqf @@ -16,16 +16,16 @@ #include "script_component.hpp" private ["_scopeBaseAngle"]; -_scopeBaseAngle = ((GVAR(workingMemory) select GVAR(currentTarget)) select 3); +_scopeBaseAngle = (GVAR(workingMemory) select 3); private ["_bulletMass", "_boreHeight", "_airFriction", "_muzzleVelocity", "_bc", "_dragModel", "_atmosphereModel"]; -_bulletMass = (GVAR(workingMemory) select GVAR(currentTarget)) select 12; -_boreHeight = (GVAR(workingMemory) select GVAR(currentTarget)) select 5; -_airFriction = (GVAR(workingMemory) select GVAR(currentTarget)) select 4; -_muzzleVelocity = (GVAR(workingMemory) select GVAR(currentTarget)) select 1; -_bc = (GVAR(workingMemory) select GVAR(currentTarget)) select 15; -_dragModel = (GVAR(workingMemory) select GVAR(currentTarget)) select 16; -_atmosphereModel = (GVAR(workingMemory) select GVAR(currentTarget)) select 17; +_bulletMass = GVAR(workingMemory) select 12; +_boreHeight = GVAR(workingMemory) select 5; +_airFriction = GVAR(workingMemory) select 4; +_muzzleVelocity = GVAR(workingMemory) select 1; +_bc = GVAR(workingMemory) select 15; +_dragModel = GVAR(workingMemory) select 16; +_atmosphereModel = GVAR(workingMemory) select 17; private ["_zeroRange"]; _zeroRange = Round(parseNumber(ctrlText 140)); @@ -34,14 +34,14 @@ if (GVAR(currentUnit) != 2) then _zeroRange = _zeroRange / 1.0936133; }; if (_zeroRange < 10) exitWith { - (GVAR(workingMemory) select GVAR(currentTarget)) set [2, _zeroRange]; - (GVAR(workingMemory) select GVAR(currentTarget)) set [3, 0]; + GVAR(workingMemory) set [2, _zeroRange]; + GVAR(workingMemory) set [3, 0]; }; private ["_temperature", "_barometricPressure", "_relativeHumidity"]; -_temperature = (GVAR(temperature) select GVAR(currentTarget)); -_barometricPressure = (GVAR(barometricPressure) select GVAR(currentTarget)); -_relativeHumidity = (GVAR(relativeHumidity) select GVAR(currentTarget)); +_temperature = GVAR(temperature); +_barometricPressure = GVAR(barometricPressure); +_relativeHumidity = GVAR(relativeHumidity); if (GVAR(currentUnit) == 1) then { _temperature = (_temperature - 32) / 1.8; @@ -51,5 +51,5 @@ if (GVAR(currentUnit) == 1) then private ["_result"]; _result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, 0, 0, 0, 0, _zeroRange, _bc, _dragModel, _atmosphereModel, false] call FUNC(calculate_solution); -(GVAR(workingMemory) select GVAR(currentTarget)) set [2, _zeroRange]; -(GVAR(workingMemory) select GVAR(currentTarget)) set [3, _scopeBaseAngle + (_result select 0) / 60]; +GVAR(workingMemory) set [2, _zeroRange]; +GVAR(workingMemory) set [3, _scopeBaseAngle + (_result select 0) / 60]; From 4e4dee18df3ad25dbf73578308011939578b6231 Mon Sep 17 00:00:00 2001 From: ulteq Date: Thu, 16 Apr 2015 18:21:19 +0200 Subject: [PATCH 145/305] Added missing privates / Removed unused privates --- addons/advanced_ballistics/functions/fnc_handleFired.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/advanced_ballistics/functions/fnc_handleFired.sqf b/addons/advanced_ballistics/functions/fnc_handleFired.sqf index 182166d3af..baa3a871fa 100644 --- a/addons/advanced_ballistics/functions/fnc_handleFired.sqf +++ b/addons/advanced_ballistics/functions/fnc_handleFired.sqf @@ -19,7 +19,7 @@ */ #include "script_component.hpp" -private ["_unit", "_weapon", "_mode", "_ammo", "_magazine", "_caliber", "_bullet", "_abort", "_index", "_opticsName", "_opticType", "_bulletTraceVisible", "_temperature", "_barometricPressure", "_atmosphereModel", "_bulletMass", "_bulletLength", "_bulletTranslation", "_airFriction", "_dragModel", "_velocityBoundaryData", "_muzzleVelocity", "_muzzleVelocityCoef", "_muzzleVelocityShift", "_bulletVelocity", "_bulletSpeed", "_bulletLength", "_bulletWeight", "_barrelTwist", "_twistDirection", "_stabilityFactor", "_transonicStabilityCoef", "_ACE_Elevation", "_ACE_Windage", "_ID"]; +private ["_unit", "_weapon", "_mode", "_ammo", "_magazine", "_caliber", "_bullet", "_abort", "_index", "_opticsName", "_opticType", "_bulletTraceVisible", "_temperature", "_barometricPressure", "_atmosphereModel", "_bulletMass", "_bulletLength", "_airFriction", "_dragModel", "_muzzleVelocity", "_muzzleVelocityCoef", "_muzzleAccessory", "_initSpeedCoef", "_muzzleVelocityShift", "_bulletVelocity", "_bulletSpeed", "_bulletLength", "_bulletWeight", "_barrelTwist", "_twistDirection", "_stabilityFactor", "_transonicStabilityCoef"]; _unit = _this select 0; _weapon = _this select 1; _mode = _this select 3; @@ -191,7 +191,7 @@ if (GVAR(AdvancedAirDragEnabled)) then { if ((GVAR(bulletDatabaseOccupiedIndices) pushBack _index) == 0) then { [{ - private ["_bulletDatabaseEntry", "_bullet", "_caliber", "_muzzleVelocity", "_frames", "_speed", "_airFriction", "_airFrictionRef", "_dragModel", "_atmosphereModel", "_ballisticCoefficient", "_ballisticCoefficients", "_velocityBoundaries", "_airDensity", "_stabilityFactor", "_transonicStabilityCoef", "_twistDirection", "_unit", "_bulletTraceVisible", "_index", "_temperature", "_humidity", "_deltaT", "_TOF", "_bulletPosition", "_bulletVelocity", "_bulletSpeed", "_trueVelocity", "_trueSpeed", "_bulletSpeedAvg", "_wind", "_drag", "_dragRef", "_vect", "_accel", "_accelRef", "_centripetalAccel", "_pressure", "_pressureDeviation", "_windSourceObstacle", "_windSourceTerrain", "_height", "_roughnessLength"]; + private ["_bulletDatabaseEntry", "_bullet", "_caliber", "_muzzleVelocity", "_frames", "_speed", "_airFriction", "_airFrictionRef", "_dragModel", "_atmosphereModel", "_ballisticCoefficient", "_ballisticCoefficients", "_velocityBoundaries", "_airDensity", "_stabilityFactor", "_transonicStabilityCoef", "_twistDirection", "_unit", "_bulletTraceVisible", "_index", "_temperature", "_humidity", "_deltaT", "_TOF", "_bulletPosition", "_bulletVelocity", "_bulletSpeed", "_trueVelocity", "_trueSpeed", "_bulletSpeedAvg", "_wind", "_drag", "_dragRef", "_vect", "_accel", "_accelRef", "_centripetalAccel", "_pressure", "_pressureDeviation", "_windSourceObstacle", "_windSourceTerrain", "_height", "_roughnessLength", "_bulletDir", "_horizontalDeflection", "_horizontalDeflectionPartial", "_spinDrift", "_spinDriftPartial"]; { _bulletDatabaseEntry = (GVAR(bulletDatabase) select _x); From 4c749a30cf29e529a537b82c3926116b97e5ef4f Mon Sep 17 00:00:00 2001 From: jaynus Date: Thu, 16 Apr 2015 09:22:11 -0700 Subject: [PATCH 146/305] ignore leading numbers search_privates --- tools/search_privates.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/search_privates.py b/tools/search_privates.py index eccde2fc26..8276bef848 100644 --- a/tools/search_privates.py +++ b/tools/search_privates.py @@ -27,7 +27,7 @@ def get_private_declare(content): priv_dec_str = ''.join(priv_srch_declared) - srch = re.compile('(? Date: Thu, 16 Apr 2015 18:29:23 +0200 Subject: [PATCH 147/305] Added missing parentheses --- tools/search_privates.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/search_privates.py b/tools/search_privates.py index 8276bef848..fa4801771d 100644 --- a/tools/search_privates.py +++ b/tools/search_privates.py @@ -78,9 +78,9 @@ def check_privates(filepath): missing.append(s) if len(missing) > 0: - print filepath + print (filepath) for bad_priv in missing: - print '\t' + bad_priv + print ('\t' + bad_priv) def main(): @@ -102,4 +102,4 @@ def main(): check_privates(filename) if __name__ == "__main__": - main() \ No newline at end of file + main() From 6d93fe45a68a0cb21aa5d760e05da34982755afd Mon Sep 17 00:00:00 2001 From: jaynus Date: Thu, 16 Apr 2015 09:35:21 -0700 Subject: [PATCH 148/305] Guidance handoff to guiding unit/laser shooter. This needs LOBL vs. LOAL capability. --- addons/missileguidance/XEH_post_init.sqf | 1 + addons/missileguidance/XEH_pre_init.sqf | 3 ++ .../functions/fnc_doHandoff.sqf | 4 ++ .../functions/fnc_handleHandoff.sqf | 6 +++ .../missileguidance/functions/fnc_onFired.sqf | 50 +++++++++++-------- tools/github_privates_bot.py | 22 ++++++++ 6 files changed, 66 insertions(+), 20 deletions(-) create mode 100644 addons/missileguidance/functions/fnc_doHandoff.sqf create mode 100644 addons/missileguidance/functions/fnc_handleHandoff.sqf create mode 100644 tools/github_privates_bot.py diff --git a/addons/missileguidance/XEH_post_init.sqf b/addons/missileguidance/XEH_post_init.sqf index dc30361926..deaeef669d 100644 --- a/addons/missileguidance/XEH_post_init.sqf +++ b/addons/missileguidance/XEH_post_init.sqf @@ -1,2 +1,3 @@ #include "script_component.hpp" +[QGVAR(handoff), {_this call FUNC(handleHandoff)}] call EFUNC(common,addEventHandler); diff --git a/addons/missileguidance/XEH_pre_init.sqf b/addons/missileguidance/XEH_pre_init.sqf index d19b8475c9..08219e02f0 100644 --- a/addons/missileguidance/XEH_pre_init.sqf +++ b/addons/missileguidance/XEH_pre_init.sqf @@ -14,6 +14,9 @@ PREP(guidancePFH); PREP(doAttackProfile); PREP(doSeekerSearch); +PREP(doHandoff); +PREP(handleHandoff); + // Attack Profiles PREP(attackProfile_LIN); PREP(attackProfile_DIR); diff --git a/addons/missileguidance/functions/fnc_doHandoff.sqf b/addons/missileguidance/functions/fnc_doHandoff.sqf new file mode 100644 index 0000000000..d99998c8c4 --- /dev/null +++ b/addons/missileguidance/functions/fnc_doHandoff.sqf @@ -0,0 +1,4 @@ +#include "script_component.hpp" +PARAMS_2(_target,_args); + +[QGVAR(handoff), [_target, _args]] call EFUNC(common,globalEvent); \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_handleHandoff.sqf b/addons/missileguidance/functions/fnc_handleHandoff.sqf new file mode 100644 index 0000000000..2f1dfac8e7 --- /dev/null +++ b/addons/missileguidance/functions/fnc_handleHandoff.sqf @@ -0,0 +1,6 @@ +#include "script_component.hpp" +PARAMS_2(_target,_args); + +if(!local _target) exitWith {}; + +[FUNC(guidancePFH), 0, _args] call cba_fnc_addPerFrameHandler; \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_onFired.sqf b/addons/missileguidance/functions/fnc_onFired.sqf index dd96821692..e36742bce5 100644 --- a/addons/missileguidance/functions/fnc_onFired.sqf +++ b/addons/missileguidance/functions/fnc_onFired.sqf @@ -60,27 +60,37 @@ if(isNil "_target") then { }; TRACE_4("Beginning ACE guidance system",_target,_ammo,_seekerType,_attackProfile); -[FUNC(guidancePFH), 0, [_this, - [_shooter, - [_target, _targetPos, _launchPos], - _seekerType, - _attackProfile, - _lockMode - ], - [ - getNumber ( _config >> "minDeflection" ), - getNumber ( _config >> "maxDeflection" ), - getNumber ( _config >> "incDeflection" ) - ], - [ - getNumber ( _config >> "seekerAngle" ), - getNumber ( _config >> "seekerAccuracy" ), - getNumber ( _config >> "seekerMaxRange" ) - ], - [ diag_tickTime, [], [] ] - ] -] call cba_fnc_addPerFrameHandler; +_args = [_this, + [_shooter, + [_target, _targetPos, _launchPos], + _seekerType, + _attackProfile, + _lockMode + ], + [ + getNumber ( _config >> "minDeflection" ), + getNumber ( _config >> "maxDeflection" ), + getNumber ( _config >> "incDeflection" ) + ], + [ + getNumber ( _config >> "seekerAngle" ), + getNumber ( _config >> "seekerAccuracy" ), + getNumber ( _config >> "seekerMaxRange" ) + ], + [ diag_tickTime, [], [] ] + ]; + +// Hand off to the guiding unit. We just use local player so local PFH fires for now +// Laser code needs to give us a shooter for LOBL, or the seeker unit needs to be able to shift locality +// Based on its homing laser +// Lasers need to be handled in a special LOAL/LOBL case +_guidingUnit = ACE_player; +if(local _guidingUnit) then { + [FUNC(guidancePFH), 0, _args ] call cba_fnc_addPerFrameHandler; +} else { + [QGVAR(handoff), [_guidingUnit, _args] ] call FUNC(doHandoff); +}; /* Clears locking settings (vehicle _shooter) setVariable [QGVAR(target), nil]; (vehicle _shooter) setVariable [QGVAR(seekerType), nil]; diff --git a/tools/github_privates_bot.py b/tools/github_privates_bot.py new file mode 100644 index 0000000000..4ef04eb33c --- /dev/null +++ b/tools/github_privates_bot.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 + +import os +import argparse + +from pygithub3 import Github + +def main(): + gh = Github(user='acemod', repo='ACE3') + + pull_requests = gh.pull_requests.list().all() + + for request in pull_requests: + files = gh.pull_requests.list_files(request.number).all() + + for file in files: + # print file.filename + if '.sqf' in file.filename: + print file + +if __name__ == "__main__": + main() \ No newline at end of file From 9d87f08aa629a677c3d515c26b21feb18d0622e8 Mon Sep 17 00:00:00 2001 From: jaynus Date: Thu, 16 Apr 2015 09:48:21 -0700 Subject: [PATCH 149/305] Regex's kill kids. --- tools/search_privates.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/search_privates.py b/tools/search_privates.py index 8276bef848..eef6535e46 100644 --- a/tools/search_privates.py +++ b/tools/search_privates.py @@ -16,7 +16,7 @@ def get_private_declare(content): priv_dec_str = ''.join(priv_srch_declared) - srch = re.compile('') + srch = re.compile('(? Date: Thu, 16 Apr 2015 18:52:48 +0200 Subject: [PATCH 150/305] Added missing privates --- addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf b/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf index 42bac3eac8..f5f1d3861e 100644 --- a/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf +++ b/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf @@ -16,7 +16,7 @@ #include "script_component.hpp" [{ - private ["_bullet", "_airFriction", "_args", "_deltaT", "_bulletVelocity", "_bulletSpeed", "_trueVelocity", "_trueVelocity", "_dragRef", "_drag", "_accelRef", "_accel"]; + private ["_args", "_bullet", "_airFriction", "_time", "_deltaT", "_bulletVelocity", "_bulletSpeed", "_trueVelocity", "_trueSpeed", "_dragRef", "_drag", "_accelRef", "_accel"]; _args = _this select 0; _bullet = _args select 0; From 9db256ad8d80a43374056490b2eabbd9b7258d89 Mon Sep 17 00:00:00 2001 From: jaynus Date: Thu, 16 Apr 2015 09:54:52 -0700 Subject: [PATCH 151/305] ignore preceeding numbers --- tools/search_privates.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/search_privates.py b/tools/search_privates.py index 55a6dfc791..9cc55fbdcc 100644 --- a/tools/search_privates.py +++ b/tools/search_privates.py @@ -53,7 +53,7 @@ def check_privates(filepath): # Regex search privates - srch = re.compile('(? Date: Thu, 16 Apr 2015 19:00:37 +0200 Subject: [PATCH 152/305] Fixed constant name not following the coding-guideline --- addons/atragmx/functions/fnc_create_dialog.sqf | 2 +- addons/atragmx/functions/fnc_show_gun_list.sqf | 2 +- .../atragmx/functions/fnc_show_range_card_setup.sqf | 2 +- .../functions/fnc_show_target_range_assist.sqf | 2 +- .../functions/fnc_show_target_speed_assist.sqf | 2 +- .../functions/fnc_target_speed_assist_timer.sqf | 2 +- addons/atragmx/functions/fnc_toggle_range_card.sqf | 2 +- .../functions/fnc_update_target_selection.sqf | 12 ++++++------ .../atragmx/functions/fnc_update_unit_selection.sqf | 8 ++++---- addons/atragmx/script_component.hpp | 2 +- 10 files changed, 18 insertions(+), 18 deletions(-) diff --git a/addons/atragmx/functions/fnc_create_dialog.sqf b/addons/atragmx/functions/fnc_create_dialog.sqf index 8dc0f3e34f..73945a4030 100644 --- a/addons/atragmx/functions/fnc_create_dialog.sqf +++ b/addons/atragmx/functions/fnc_create_dialog.sqf @@ -29,7 +29,7 @@ GVAR(showAddNewGun) call FUNC(show_add_new_gun); GVAR(showGunList) call FUNC(show_gun_list); GVAR(showRangeCard) call FUNC(show_range_card); if (GVAR(showRangeCard)) then { - ctrlSetFocus (_dsp displayCtrl 5001); + ctrlSetFocus (__DSP displayCtrl 5001); [] call FUNC(update_range_card); }; GVAR(showRangeCardSetup) call FUNC(show_range_card_setup); diff --git a/addons/atragmx/functions/fnc_show_gun_list.sqf b/addons/atragmx/functions/fnc_show_gun_list.sqf index e51aaba13b..565da71ce6 100644 --- a/addons/atragmx/functions/fnc_show_gun_list.sqf +++ b/addons/atragmx/functions/fnc_show_gun_list.sqf @@ -20,7 +20,7 @@ GVAR(showGunList) = _this; {ctrlShow [_x, _this]} forEach [6000, 6001, 6002, 6003, 6004, 6005, 6006, 6007]; if (_this) then { - ctrlSetFocus (_dsp displayCtrl 6002); + ctrlSetFocus (__DSP displayCtrl 6002); lbSetCurSel [6000, GVAR(currentGun)]; }; diff --git a/addons/atragmx/functions/fnc_show_range_card_setup.sqf b/addons/atragmx/functions/fnc_show_range_card_setup.sqf index e9afe41cc5..98e5f57998 100644 --- a/addons/atragmx/functions/fnc_show_range_card_setup.sqf +++ b/addons/atragmx/functions/fnc_show_range_card_setup.sqf @@ -20,7 +20,7 @@ GVAR(showRangeCardSetup) = _this; {ctrlShow [_x, _this]} forEach [10000, 10001, 10002, 10003, 10004, 10005, 10006, 10007, 10008, 10009]; if (_this) then { - ctrlSetFocus (_dsp displayCtrl 10006); + ctrlSetFocus (__DSP displayCtrl 10006); ctrlSetText [10003, Str(Round(GVAR(rangeCardStartRange)))]; ctrlSetText [10004, Str(Round(GVAR(rangeCardEndRange)))]; diff --git a/addons/atragmx/functions/fnc_show_target_range_assist.sqf b/addons/atragmx/functions/fnc_show_target_range_assist.sqf index e3ca0a2626..f7b973876f 100644 --- a/addons/atragmx/functions/fnc_show_target_range_assist.sqf +++ b/addons/atragmx/functions/fnc_show_target_range_assist.sqf @@ -20,7 +20,7 @@ GVAR(showTargetRangeAssist) = _this; {ctrlShow [_x, _this]} forEach [7000, 7001, 7002, 7003, 7004, 7005, 7006, 7007, 7008, 7009, 7010, 7011, 7012, 7013, 7014, 7015, 7016, 7017, 7018, 7019, 7020]; if (_this) then { - ctrlSetFocus (_dsp displayCtrl 7018); + ctrlSetFocus (__DSP displayCtrl 7018); ctrlSetText [7012, Str(parseNumber(ctrlText 320))]; ctrlSetText [7013, Str(parseNumber(ctrlText 340))]; diff --git a/addons/atragmx/functions/fnc_show_target_speed_assist.sqf b/addons/atragmx/functions/fnc_show_target_speed_assist.sqf index 90425e26db..43b9afe470 100644 --- a/addons/atragmx/functions/fnc_show_target_speed_assist.sqf +++ b/addons/atragmx/functions/fnc_show_target_speed_assist.sqf @@ -20,7 +20,7 @@ GVAR(showTargetSpeedAssist) = _this; {ctrlShow [_x, _this]} forEach [8000, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 8011, 8012, 8013, 8014, 8015]; if (_this) then { - ctrlSetFocus (_dsp displayCtrl 8012); + ctrlSetFocus (__DSP displayCtrl 8012); ctrlSetText [8004, Str(Round((GVAR(targetRange) select GVAR(currentTarget))))]; diff --git a/addons/atragmx/functions/fnc_target_speed_assist_timer.sqf b/addons/atragmx/functions/fnc_target_speed_assist_timer.sqf index d8414ba692..da4b68a7c7 100644 --- a/addons/atragmx/functions/fnc_target_speed_assist_timer.sqf +++ b/addons/atragmx/functions/fnc_target_speed_assist_timer.sqf @@ -20,7 +20,7 @@ if !(ctrlVisible 9000) then { false call FUNC(show_target_speed_assist); true call FUNC(show_target_speed_assist_timer); - ctrlSetFocus (_dsp displayCtrl 9002); + ctrlSetFocus (__DSP displayCtrl 9002); [{ private ["_args", "_startTime"]; diff --git a/addons/atragmx/functions/fnc_toggle_range_card.sqf b/addons/atragmx/functions/fnc_toggle_range_card.sqf index 6a75ea5445..e5d5cb0269 100644 --- a/addons/atragmx/functions/fnc_toggle_range_card.sqf +++ b/addons/atragmx/functions/fnc_toggle_range_card.sqf @@ -24,7 +24,7 @@ if (ctrlVisible 5006) then false call FUNC(show_main_page); true call FUNC(show_range_card); - ctrlSetFocus (_dsp displayCtrl 5001); + ctrlSetFocus (__DSP displayCtrl 5001); [] call FUNC(calculate_range_card); [] call FUNC(update_range_card); diff --git a/addons/atragmx/functions/fnc_update_target_selection.sqf b/addons/atragmx/functions/fnc_update_target_selection.sqf index 476c22d658..2a29d05fb1 100644 --- a/addons/atragmx/functions/fnc_update_target_selection.sqf +++ b/addons/atragmx/functions/fnc_update_target_selection.sqf @@ -15,13 +15,13 @@ */ #include "script_component.hpp" -(_dsp displayCtrl 500) ctrlEnable true; -(_dsp displayCtrl 501) ctrlEnable true; -(_dsp displayCtrl 502) ctrlEnable true; -(_dsp displayCtrl 503) ctrlEnable true; +(__DSP displayCtrl 500) ctrlEnable true; +(__DSP displayCtrl 501) ctrlEnable true; +(__DSP displayCtrl 502) ctrlEnable true; +(__DSP displayCtrl 503) ctrlEnable true; -(_dsp displayCtrl 500 + GVAR(currentTarget)) ctrlEnable false; +(__DSP displayCtrl 500 + GVAR(currentTarget)) ctrlEnable false; -ctrlSetFocus (_dsp displayCtrl 3000); +ctrlSetFocus (__DSP displayCtrl 3000); [] call FUNC(update_unit_selection); diff --git a/addons/atragmx/functions/fnc_update_unit_selection.sqf b/addons/atragmx/functions/fnc_update_unit_selection.sqf index f6a51c5cfc..5468d2d0fc 100644 --- a/addons/atragmx/functions/fnc_update_unit_selection.sqf +++ b/addons/atragmx/functions/fnc_update_unit_selection.sqf @@ -15,11 +15,11 @@ */ #include "script_component.hpp" -(_dsp displayCtrl 600) ctrlEnable true; -(_dsp displayCtrl 601) ctrlEnable true; -(_dsp displayCtrl 602) ctrlEnable true; +(__DSP displayCtrl 600) ctrlEnable true; +(__DSP displayCtrl 601) ctrlEnable true; +(__DSP displayCtrl 602) ctrlEnable true; -(_dsp displayCtrl 600 + GVAR(currentUnit)) ctrlEnable false; +(__DSP displayCtrl 600 + GVAR(currentUnit)) ctrlEnable false; [] call FUNC(update_gun); [] call FUNC(update_atmosphere); diff --git a/addons/atragmx/script_component.hpp b/addons/atragmx/script_component.hpp index 014524c6dd..60b3083a96 100644 --- a/addons/atragmx/script_component.hpp +++ b/addons/atragmx/script_component.hpp @@ -11,4 +11,4 @@ #include "\z\ace\addons\main\script_macros.hpp" -#define _dsp (uiNamespace getVariable "ATragMX_Display") +#define __DSP (uiNamespace getVariable "ATragMX_Display") From 61d1e6854ecbd6db76f62476a12985e88eee037e Mon Sep 17 00:00:00 2001 From: Ivan Navarro Cabello Date: Thu, 16 Apr 2015 19:03:15 +0200 Subject: [PATCH 153/305] added spanish translation added spanish translation to ballistics and respawn --- addons/ballistics/stringtable.xml | 19 +++++++++++++++++-- addons/respawn/stringtable.xml | 10 ++++++++-- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index cf59b59f40..c95da8d760 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -480,7 +480,7 @@ Caliber: .338 Norma Magnum Tracer IR-DIM<br />Rounds: 130<br />Used in: SPMG Kaliber: .338 Norma Magnum Leuchtspur IR-DIM<br />Schuss: 130<br />Verwendet für: SPMG Kaliber: .338 Norma Magnum Smugacz IR-DIM<br />Pociski: 130<br />Używany w: SPMG - Calibre: .338 Norma Magnum Traçante IR-DIM<br />Cartouches: 130<br />Utilisé dans: SPMG + Calibre: .338 Norma Magnum Traçante IR-DIM<br />Cartouches: 130<br />Utilisé dans: SPMG Calibre: .338 Norma Magnum trazadora IR-DIM<br />Balas: 130<br />Se usa en: SPMG @@ -805,31 +805,37 @@ 7.62mm 10Rnd Mag (Mk319 Mod 0) Magazynek 7,62mm 10rd (Mk319 Mod 0) 7.62mm 10Cps (Mk319 Mod 0) + Cargador de 10 balas de 7.62mm (Mk319 Mod 0) 7.62mm Mk319 7,62mm Mk319 7.62mm Mk319 + 7.62mm Mk319 Caliber: 7.62x51 mm NATO (Mk319 Mod 0)<br />Rounds: 10 Kaliber: 7,62x51 mm NATO (Mk319 Mod 0)<br />Pociski: 10 Calibre: 7.62x51 mm NATO (Mk319 Mod 0)<br />Cartouches: 10 + Calibre: 7.62x51 mm NATO (Mk319 Mod 0)<br />Balas: 10 7.62mm 20Rnd Mag (Mk319 Mod 0) Magazynek 7,62mm 20rd (Mk319 Mod 0) 7.62mm 20Cps (Mk319 Mod 0) + Cargador de 20 balas de 7.62mm (Mk319 Mod 0) 7.62mm Mk319 7,62mm Mk319 7.62mm Mk319 + 7.62mm Mk319 Caliber: 7.62x51 mm NATO (Mk319 Mod 0)<br />Rounds: 20 Kaliber: 7,62x51 mm NATO (Mk319 Mod 0)<br />Pociski: 20 Calibre: 7.62x51 mm NATO (Mk319 Mod 0)<br />Cartouches: 20 + Calibre: 7.62x51 mm NATO (Mk319 Mod 0)<br />Balas: 20 7.62mm 20Rnd Mag (Mk248 Mod 0) @@ -918,38 +924,47 @@ .338 10Rnd Mag (API526) .338 10Cps (API526) + Cargador de 10 balas de .338 (API526) .338 AP .338 AP + .338 AP Caliber: 8.6x70mm (API526)<br />Rounds: 10 Calibre: 8.6x70mm (API526)<br />Cartouches: 10 + Calibre: 8.6x70mm (API526)<br />Balas: 10 12.7x99mm 5Rnd Mag 12.7x99mm 5Cps + Cargador de 5 balas de 12.7x99mm 12.7mm 12.7mm + 12.7mm Caliber: 12.7x99mm<br />Rounds: 5 Calibre: 12.7x99mm<br />Cartouches: 5 + Calibre: 12.7x99mm<br />Balas: 5 12.7x99mm 5Rnd Mag (AMAX) 12.7x99mm 5Rnd Mag (AMAX) + Cargador de 5 balas de 12.7x99mm (AMAX) 12.7mm 12.7mm + 12.7mm Caliber: 12.7x99mm (AMAX)<br />Rounds: 5 Calibre: 12.7x99mm (AMAX)<br />Cartouches: 5 + Calibre: 12.7x99mm (AMAX)<br />Balas: 5 - + \ No newline at end of file diff --git a/addons/respawn/stringtable.xml b/addons/respawn/stringtable.xml index af003b4c28..409a149f83 100644 --- a/addons/respawn/stringtable.xml +++ b/addons/respawn/stringtable.xml @@ -5,7 +5,7 @@ Deploy in 5 seconds ... Déploiement dans 5 secondes ... Wird in 5 Sekunden errichtet ... - Desplegando en 5 segundos ... + Despliegue en 5 segundos ... Возрождение через 5 секунд ... Rozmieszczenie za 5 sekund ... Respawn za 5 sekund... @@ -44,26 +44,32 @@ Rallypoint West (Base) Sammelpunkt West (Basis) + Punto de reunión Oeste (Base) Rallypoint East (Base) Sammelpunkt Ost (Basis) + Punto de reunión Este (Base) Rallypoint Independent (Base) Sammelpunkt Widerstand (Basis) + Punto de reunión Independiente (Base) Rallypoint West Sammelpunkt West + Punto de reunión Oeste Rallypoint East Sammelpunkt Ost + Punto de reunión Este Rallypoint Independent Sammelpunkt Widerstand + Punto de reunión Independiente - + \ No newline at end of file From 6a942ac8209cce075fcb7284e6c8eb8e5d5c8b47 Mon Sep 17 00:00:00 2001 From: jaynus Date: Thu, 16 Apr 2015 10:10:24 -0700 Subject: [PATCH 154/305] Fixed: ACE_Fake**** Was showing in arsenal. Fixes #670 --- addons/common/CfgMagazines.hpp | 1 + addons/common/CfgWeapons.hpp | 2 ++ 2 files changed, 3 insertions(+) diff --git a/addons/common/CfgMagazines.hpp b/addons/common/CfgMagazines.hpp index 815ab6db9f..465ea57f78 100644 --- a/addons/common/CfgMagazines.hpp +++ b/addons/common/CfgMagazines.hpp @@ -2,6 +2,7 @@ class CfgMagazines { class CA_Magazine; class ACE_FakeMagazine: CA_Magazine { + scopeCurator = 1; descriptionShort = ""; displayName = ""; displayNameShort = ""; diff --git a/addons/common/CfgWeapons.hpp b/addons/common/CfgWeapons.hpp index c2d1532f40..cf8c06798e 100644 --- a/addons/common/CfgWeapons.hpp +++ b/addons/common/CfgWeapons.hpp @@ -14,6 +14,8 @@ class CfgWeapons { class ACE_FakePrimaryWeapon: Rifle_Base_F { scope = 2; + scopeCurator = 1; + displayName = ""; model = "\A3\Weapons_f\empty"; picture = ""; From e06fd7350e7980da734f3452ab4603be74750d97 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 16 Apr 2015 12:10:40 -0500 Subject: [PATCH 155/305] DEFAULT_PARAM KEY_PARAM private check --- tools/search_privates.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/search_privates.py b/tools/search_privates.py index 9cc55fbdcc..404c56f4db 100644 --- a/tools/search_privates.py +++ b/tools/search_privates.py @@ -21,7 +21,7 @@ def get_private_declare(content): priv_split = sorted(set(priv_split)) priv_declared += priv_split; - srch = re.compile('PARAMS_[0-9].*|EXPLODE_[0-9]_PVT.*') + srch = re.compile('PARAMS_[0-9].*|EXPLODE_[0-9]_PVT.*|DEFAULT_PARAM.*|KEY_PARAM.*') priv_srch_declared = srch.findall(content) priv_srch_declared = sorted(set(priv_srch_declared)) From 638433614c8778ec7b9b80b269ec6829376fa130 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 16 Apr 2015 12:36:12 -0500 Subject: [PATCH 156/305] Some missing private defines. --- addons/attach/functions/fnc_attach.sqf | 1 + addons/attach/functions/fnc_canAttach.sqf | 2 +- addons/attach/functions/fnc_detach.sqf | 2 +- addons/attach/functions/fnc_getChildrenAttachActions.sqf | 1 + addons/backpacks/functions/fnc_backpackOpened.sqf | 6 +----- addons/captives/XEH_postInit.sqf | 1 + addons/captives/functions/fnc_doLoadCaptive.sqf | 1 + addons/captives/functions/fnc_moduleSurrender.sqf | 1 + addons/captives/functions/fnc_setHandcuffed.sqf | 2 ++ addons/captives/functions/fnc_setSurrendered.sqf | 2 ++ addons/disarming/functions/fnc_canBeDisarmed.sqf | 2 ++ addons/disarming/functions/fnc_disarmDropItems.sqf | 5 +++++ addons/disarming/functions/fnc_eventTargetStart.sqf | 2 ++ addons/disarming/functions/fnc_getAllGearUnit.sqf | 2 ++ addons/disarming/functions/fnc_openDisarmDialog.sqf | 3 +++ addons/disarming/functions/fnc_showItemsInListbox.sqf | 2 +- addons/disarming/functions/fnc_verifyMagazinesMoved.sqf | 2 +- addons/disposable/XEH_postInitClient.sqf | 5 ++--- 18 files changed, 30 insertions(+), 12 deletions(-) diff --git a/addons/attach/functions/fnc_attach.sqf b/addons/attach/functions/fnc_attach.sqf index 3bb54eee16..45b1c0a336 100644 --- a/addons/attach/functions/fnc_attach.sqf +++ b/addons/attach/functions/fnc_attach.sqf @@ -62,6 +62,7 @@ if (_unit == _attachToVehicle) then { //Self Attachment _actionID = _unit addAction [format ["%1", localize "STR_ACE_Attach_CancelAction"], {GVAR(placeAction) = 0}]; [{ + private "_startingPosition"; PARAMS_2(_args,_pfID); EXPLODE_7_PVT(_args,_unit,_attachToVehicle,_itemClassname,_itemVehClass,_tempObject,_onAtachText,_actionID); diff --git a/addons/attach/functions/fnc_canAttach.sqf b/addons/attach/functions/fnc_canAttach.sqf index d0930dc069..18071092d5 100644 --- a/addons/attach/functions/fnc_canAttach.sqf +++ b/addons/attach/functions/fnc_canAttach.sqf @@ -19,7 +19,7 @@ PARAMS_3(_attachToVehicle,_player,_args); -private ["_itemName", "_attachLimit", "_attachedObjects"]; +private ["_itemName", "_attachLimit", "_attachedObjects","_playerPos"]; _itemName = [_args, 0, ""] call CBA_fnc_defaultParam; _attachLimit = [6, 1] select (_player == _attachToVehicle); diff --git a/addons/attach/functions/fnc_detach.sqf b/addons/attach/functions/fnc_detach.sqf index 99ac646013..a56936301d 100644 --- a/addons/attach/functions/fnc_detach.sqf +++ b/addons/attach/functions/fnc_detach.sqf @@ -18,7 +18,7 @@ PARAMS_2(_attachToVehicle,_unit); -private ["_attachedObjects", "_attachedItems"]; +private ["_attachedObjects", "_attachedItems", "_itemDisplayName"]; _attachedObjects = _attachToVehicle getVariable [QGVAR(Objects), []]; _attachedItems = _attachToVehicle getVariable [QGVAR(ItemNames), []]; diff --git a/addons/attach/functions/fnc_getChildrenAttachActions.sqf b/addons/attach/functions/fnc_getChildrenAttachActions.sqf index 3594e10bd6..fb432146be 100644 --- a/addons/attach/functions/fnc_getChildrenAttachActions.sqf +++ b/addons/attach/functions/fnc_getChildrenAttachActions.sqf @@ -17,6 +17,7 @@ */ #include "script_component.hpp" +private ["_listed", "_actions", "_item", "_displayName", "_picture", "_action"]; PARAMS_2(_target,_player); _listed = []; diff --git a/addons/backpacks/functions/fnc_backpackOpened.sqf b/addons/backpacks/functions/fnc_backpackOpened.sqf index 1894d68f23..3f5cf53994 100644 --- a/addons/backpacks/functions/fnc_backpackOpened.sqf +++ b/addons/backpacks/functions/fnc_backpackOpened.sqf @@ -13,11 +13,7 @@ */ #include "script_component.hpp" -private ["_unit", "_target"]; - -_unit = _this select 0; -_target = _this select 1; -_backpack = _this select 2; +PARAMS_3(_unit,_target,_backpack); // do cam shake if the target is the player if ([_target] call EFUNC(common,isPlayer)) then { diff --git a/addons/captives/XEH_postInit.sqf b/addons/captives/XEH_postInit.sqf index 651edbcf86..f91f24025e 100644 --- a/addons/captives/XEH_postInit.sqf +++ b/addons/captives/XEH_postInit.sqf @@ -7,6 +7,7 @@ if (isServer) then { addMissionEventHandler ["HandleDisconnect", { PARAMS_1(_disconnectedPlayer); + private "_escortedUnit"; _escortedUnit = _disconnectedPlayer getVariable [QGVAR(escortedUnit), objNull]; if ((!isNull _escortedUnit) && {(attachedTo _escortedUnit) == _disconnectedPlayer}) then { detach _escortedUnit; diff --git a/addons/captives/functions/fnc_doLoadCaptive.sqf b/addons/captives/functions/fnc_doLoadCaptive.sqf index 9fd65a130d..97ecd98a0a 100644 --- a/addons/captives/functions/fnc_doLoadCaptive.sqf +++ b/addons/captives/functions/fnc_doLoadCaptive.sqf @@ -18,6 +18,7 @@ #include "script_component.hpp" PARAMS_3(_unit,_target,_vehicle); +private "_objects"; if (isNull _target) then { _objects = attachedObjects _unit; diff --git a/addons/captives/functions/fnc_moduleSurrender.sqf b/addons/captives/functions/fnc_moduleSurrender.sqf index 0506b0cc17..bf0e04cd6a 100644 --- a/addons/captives/functions/fnc_moduleSurrender.sqf +++ b/addons/captives/functions/fnc_moduleSurrender.sqf @@ -18,6 +18,7 @@ #include "script_component.hpp" PARAMS_3(_logic,_units,_activated); +private ["_bisMouseOver", "_mouseOverObject"]; if (!_activated) exitWith {}; diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf index 5f134ab03b..bd141988bb 100644 --- a/addons/captives/functions/fnc_setHandcuffed.sqf +++ b/addons/captives/functions/fnc_setHandcuffed.sqf @@ -50,6 +50,7 @@ if (_state) then { //Adds an animation changed eh //If we get a change in animation then redo the animation (handles people vaulting to break the animation chain) + private "_animChangedEHID"; _animChangedEHID = _unit addEventHandler ["AnimChanged", { PARAMS_2(_unit,_newAnimation); if ((_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") && {!(_unit getVariable ["ACE_isUnconscious", false])}) then { @@ -66,6 +67,7 @@ if (_state) then { [_unit, QGVAR(Handcuffed), false] call EFUNC(common,setCaptivityStatus); //remove AnimChanged EH + private "_animChangedEHID"; _animChangedEHID = _unit getVariable [QGVAR(handcuffAnimEHID), -1]; _unit removeEventHandler ["AnimChanged", _animChangedEHID]; _unit setVariable [QGVAR(handcuffAnimEHID), -1]; diff --git a/addons/captives/functions/fnc_setSurrendered.sqf b/addons/captives/functions/fnc_setSurrendered.sqf index d774e7f6e0..22de70921d 100644 --- a/addons/captives/functions/fnc_setSurrendered.sqf +++ b/addons/captives/functions/fnc_setSurrendered.sqf @@ -48,6 +48,7 @@ if (_state) then { if (_unit getVariable [QGVAR(isSurrendering), false] && {(vehicle _unit) == _unit}) then { //Adds an animation changed eh //If we get a change in animation then redo the animation (handles people vaulting to break the animation chain) + private "_animChangedEHID"; _animChangedEHID = _unit addEventHandler ["AnimChanged", { PARAMS_2(_unit,_newAnimation); if ((_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") && {!(_unit getVariable ["ACE_isUnconscious", false])}) then { @@ -63,6 +64,7 @@ if (_state) then { [_unit, QGVAR(Surrendered), false] call EFUNC(common,setCaptivityStatus); //remove AnimChanged EH + private "_animChangedEHID"; _animChangedEHID = _unit getVariable [QGVAR(surrenderAnimEHID), -1]; _unit removeEventHandler ["AnimChanged", _animChangedEHID]; _unit setVariable [QGVAR(surrenderAnimEHID), -1]; diff --git a/addons/disarming/functions/fnc_canBeDisarmed.sqf b/addons/disarming/functions/fnc_canBeDisarmed.sqf index 04171a900d..25ec884919 100644 --- a/addons/disarming/functions/fnc_canBeDisarmed.sqf +++ b/addons/disarming/functions/fnc_canBeDisarmed.sqf @@ -17,6 +17,8 @@ PARAMS_1(_target); +private ["_animationStateCfgMoves", "_putDownAnim"]; + //Check animationState for putDown anim //This ensures the unit doesn't have to actualy do any animation to drop something //This should always be true for the 3 possible status effects that allow disarming diff --git a/addons/disarming/functions/fnc_disarmDropItems.sqf b/addons/disarming/functions/fnc_disarmDropItems.sqf index 24ab96a2cf..2cb3e89b5d 100644 --- a/addons/disarming/functions/fnc_disarmDropItems.sqf +++ b/addons/disarming/functions/fnc_disarmDropItems.sqf @@ -20,6 +20,9 @@ #define TIME_MAX_WAIT 5 +private ["_fncSumArray", "_return", "_holder", "_dropPos", "_targetMagazinesStart", "_holderMagazinesStart", "_xClassname", "_xAmmo", "_targetMagazinesEnd", "_holderMagazinesEnd", "_holderItemsStart", "_targetItemsStart", "_addToCrateClassnames", "_addToCrateCount", "_index", "_holderItemsEnd", "_targetItemsEnd", "_holderIsEmpty"]; + + PARAMS_3(_caller,_target,_listOfItemsToRemove); DEFAULT_PARAM(3,_doNotDropAmmo,false); //By default units drop all weapon mags when dropping a weapon @@ -154,6 +157,8 @@ if (_holderIsEmpty) then { //Start the PFEH to do the actions (which could take >1 frame) [{ + private ["_needToRemoveWeapon", "_needToRemoveMagazines", "_needToRemoveBackpack", "_needToRemoveVest", "_needToRemoveUniform", "_error", "_magsToPickup", "_index", "_magazinesInHolder"]; + PARAMS_2(_args,_pfID); EXPLODE_8_PVT(_args,_caller,_target,_listOfItemsToRemove,_holder,_holderIsEmpty,_maxWaitTime,_doNotDropAmmo,_startingMagazines); diff --git a/addons/disarming/functions/fnc_eventTargetStart.sqf b/addons/disarming/functions/fnc_eventTargetStart.sqf index c91f717e2a..316ec2b656 100644 --- a/addons/disarming/functions/fnc_eventTargetStart.sqf +++ b/addons/disarming/functions/fnc_eventTargetStart.sqf @@ -20,6 +20,8 @@ PARAMS_3(_caller,_target,_listOfObjectsToRemove); +private "_itemsToAdd"; + _itemsToAdd = []; { if (_x == (uniform _target)) then { diff --git a/addons/disarming/functions/fnc_getAllGearUnit.sqf b/addons/disarming/functions/fnc_getAllGearUnit.sqf index d07f40c972..a319c006ee 100644 --- a/addons/disarming/functions/fnc_getAllGearUnit.sqf +++ b/addons/disarming/functions/fnc_getAllGearUnit.sqf @@ -17,6 +17,8 @@ PARAMS_1(_target); +private ["_allItems", "_classnamesCount", "_index", "_uniqueClassnames"]; + _allItems = ((weapons _target) + (magazines _target) + (items _target) + (assignedItems _target)); if ((backpack _target) != "") then { diff --git a/addons/disarming/functions/fnc_openDisarmDialog.sqf b/addons/disarming/functions/fnc_openDisarmDialog.sqf index 6da123b831..832f32ced5 100644 --- a/addons/disarming/functions/fnc_openDisarmDialog.sqf +++ b/addons/disarming/functions/fnc_openDisarmDialog.sqf @@ -28,6 +28,7 @@ ] PARAMS_2(_caller,_target); +private "_display"; //Sanity Checks if (_caller != ACE_player) exitwith {ERROR("Player isn't caller?");}; @@ -59,6 +60,7 @@ GVAR(disarmTarget) = _target; //Setup PFEH [{ + private ["_groundContainer", "_targetContainer", "_playerName", "_rankPicture", "_rankIndex", "_targetUniqueItems", "_holderUniqueItems"]; disableSerialization; EXPLODE_2_PVT(_this,_args,_pfID); EXPLODE_3_PVT(_args,_player,_target,_display); @@ -71,6 +73,7 @@ GVAR(disarmTarget) = _target; GVAR(disarmTarget) = objNull; if (!isNull _display) then {closeDialog 0;}; //close dialog if still open } else { + _groundContainer = _display displayCtrl 632; _targetContainer = _display displayCtrl 633; _playerName = _display displayCtrl 111; diff --git a/addons/disarming/functions/fnc_showItemsInListbox.sqf b/addons/disarming/functions/fnc_showItemsInListbox.sqf index e040233b82..5c809de4a2 100644 --- a/addons/disarming/functions/fnc_showItemsInListbox.sqf +++ b/addons/disarming/functions/fnc_showItemsInListbox.sqf @@ -19,7 +19,7 @@ disableSerialization; PARAMS_2(_listBoxCtrl,_itemsCountArray); -private "_classname"; +private ["_classname", "_count", "_displayName", "_picture"]; { _displayName = ""; diff --git a/addons/disarming/functions/fnc_verifyMagazinesMoved.sqf b/addons/disarming/functions/fnc_verifyMagazinesMoved.sqf index 779a5e39ba..e1753f390a 100644 --- a/addons/disarming/functions/fnc_verifyMagazinesMoved.sqf +++ b/addons/disarming/functions/fnc_verifyMagazinesMoved.sqf @@ -20,7 +20,7 @@ */ #include "script_component.hpp" -private ["_problem", "_beginingArray"]; +private ["_problem", "_beginingArray", "_index"]; PARAMS_4(_startA,_endA,_startB,_endB); diff --git a/addons/disposable/XEH_postInitClient.sqf b/addons/disposable/XEH_postInitClient.sqf index 1fe598137f..c20dfa886b 100644 --- a/addons/disposable/XEH_postInitClient.sqf +++ b/addons/disposable/XEH_postInitClient.sqf @@ -5,7 +5,6 @@ #include "script_component.hpp" ["inventoryDisplayLoaded",{ - _player = ACE_player; - [_player] call FUNC(takeLoadedATWeapon); - [_player, (_this select 0)] call FUNC(updateInventoryDisplay); + [ACE_player] call FUNC(takeLoadedATWeapon); + [ACE_player, (_this select 0)] call FUNC(updateInventoryDisplay); }] call EFUNC(common,addEventHandler); \ No newline at end of file From 3d14b171a6a671af160f3cf0d296c3db72546840 Mon Sep 17 00:00:00 2001 From: KoffeinFlummi Date: Thu, 16 Apr 2015 19:38:07 +0200 Subject: [PATCH 157/305] Make make.py itself support 32-&64-bit systems ... ... because having two different files is dumb. --- tools/make.py | 15 +- tools/make64.py | 837 ------------------------------------------------ 2 files changed, 12 insertions(+), 840 deletions(-) delete mode 100644 tools/make64.py diff --git a/tools/make.py b/tools/make.py index bd27f893f5..29cf3f1956 100644 --- a/tools/make.py +++ b/tools/make.py @@ -200,7 +200,10 @@ def find_depbo_tools(regKey): reg = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) try: - k = winreg.OpenKey(reg, r"Software\Mikero\pboProject") + try: + k = winreg.OpenKey(reg, r"Software\Wow6432Node\Mikero\pboProject") + except FileNotFoundError: + k = winreg.OpenKey(reg, r"Software\Mikero\pboProject") try: pboproject_path = winreg.QueryValueEx(k, "exe")[0] winreg.CloseKey(k) @@ -208,7 +211,10 @@ def find_depbo_tools(regKey): except: print_error("ERROR: Could not find pboProject.") - k = winreg.OpenKey(reg, r"Software\Mikero\rapify") + try: + k = winreg.OpenKey(reg, r"Software\Wow6432Node\Mikero\rapify") + except FileNotFoundError: + k = winreg.OpenKey(reg, r"Software\Mikero\rapify") try: rapify_path = winreg.QueryValueEx(k, "exe")[0] winreg.CloseKey(k) @@ -216,7 +222,10 @@ def find_depbo_tools(regKey): except: print_error("Could not find rapify.") - k = winreg.OpenKey(reg, r"Software\Mikero\MakePbo") + try: + k = winreg.OpenKey(reg, r"Software\Wow6432Node\Mikero\MakePbo") + except FileNotFoundError: + k = winreg.OpenKey(reg, r"Software\Mikero\MakePbo") try: makepbo_path = winreg.QueryValueEx(k, "exe")[0] winreg.CloseKey(k) diff --git a/tools/make64.py b/tools/make64.py deleted file mode 100644 index b6635f884e..0000000000 --- a/tools/make64.py +++ /dev/null @@ -1,837 +0,0 @@ -#!/usr/bin/env python -# vim: set fileencoding=utf-8 : - -# make.py -# An Arma 3 addon build system - -############################################################################### - -# The MIT License (MIT) - -# Copyright (c) 2013-2014 Ryan Schultz - -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. - -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -############################################################################### - -__version__ = "0.3dev" - -import sys - -if sys.version_info[0] == 2: - print("Python 3 is required.") - sys.exit(1) - -import os -import os.path -import shutil -import platform -import glob -import subprocess -import hashlib -import configparser -import json -import traceback -import time -import re - -if sys.platform == "win32": - import winreg - -############################################################################### -# http://akiscode.com/articles/sha-1directoryhash.shtml -# Copyright (c) 2009 Stephen Akiki -# MIT License (Means you can do whatever you want with this) -# See http://www.opensource.org/licenses/mit-license.php -# Error Codes: -# -1 -> Directory does not exist -# -2 -> General error (see stack traceback) -def get_directory_hash(directory): - directory_hash = hashlib.sha1() - if not os.path.exists (directory): - return -1 - - try: - for root, dirs, files in os.walk(directory): - for names in files: - path = os.path.join(root, names) - try: - f = open(path, 'rb') - except: - # You can't open the file for some reason - f.close() - continue - - while 1: - # Read file in as little chunks - buf = f.read(4096) - if not buf: break - new = hashlib.sha1(buf) - directory_hash.update(new.digest()) - f.close() - - except: - # Print the stack traceback - traceback.print_exc() - return -2 - - return directory_hash.hexdigest() - -# Copyright (c) André Burgaud -# http://www.burgaud.com/bring-colors-to-the-windows-console-with-python/ -if sys.platform == "win32": - from ctypes import windll, Structure, c_short, c_ushort, byref - - SHORT = c_short - WORD = c_ushort - - class COORD(Structure): - """struct in wincon.h.""" - _fields_ = [ - ("X", SHORT), - ("Y", SHORT)] - - class SMALL_RECT(Structure): - """struct in wincon.h.""" - _fields_ = [ - ("Left", SHORT), - ("Top", SHORT), - ("Right", SHORT), - ("Bottom", SHORT)] - - class CONSOLE_SCREEN_BUFFER_INFO(Structure): - """struct in wincon.h.""" - _fields_ = [ - ("dwSize", COORD), - ("dwCursorPosition", COORD), - ("wAttributes", WORD), - ("srWindow", SMALL_RECT), - ("dwMaximumWindowSize", COORD)] - - # winbase.h - STD_INPUT_HANDLE = -10 - STD_OUTPUT_HANDLE = -11 - STD_ERROR_HANDLE = -12 - - # wincon.h - FOREGROUND_BLACK = 0x0000 - FOREGROUND_BLUE = 0x0001 - FOREGROUND_GREEN = 0x0002 - FOREGROUND_CYAN = 0x0003 - FOREGROUND_RED = 0x0004 - FOREGROUND_MAGENTA = 0x0005 - FOREGROUND_YELLOW = 0x0006 - FOREGROUND_GREY = 0x0007 - FOREGROUND_INTENSITY = 0x0008 # foreground color is intensified. - - BACKGROUND_BLACK = 0x0000 - BACKGROUND_BLUE = 0x0010 - BACKGROUND_GREEN = 0x0020 - BACKGROUND_CYAN = 0x0030 - BACKGROUND_RED = 0x0040 - BACKGROUND_MAGENTA = 0x0050 - BACKGROUND_YELLOW = 0x0060 - BACKGROUND_GREY = 0x0070 - BACKGROUND_INTENSITY = 0x0080 # background color is intensified. - - stdout_handle = windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE) - SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute - GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo - - def get_text_attr(): - """Returns the character attributes (colors) of the console screen - buffer.""" - csbi = CONSOLE_SCREEN_BUFFER_INFO() - GetConsoleScreenBufferInfo(stdout_handle, byref(csbi)) - return csbi.wAttributes - - def set_text_attr(color): - """Sets the character attributes (colors) of the console screen - buffer. Color is a combination of foreground and background color, - foreground and background intensity.""" - SetConsoleTextAttribute(stdout_handle, color) -############################################################################### - -def find_bi_tools(work_drive): - """Find BI tools.""" - - reg = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER) - try: - k = winreg.OpenKey(reg, r"Software\bohemia interactive\arma 3 tools") - arma3tools_path = winreg.QueryValueEx(k, "path")[0] - winreg.CloseKey(k) - except: - raise Exception("BadTools","Arma 3 Tools are not installed correctly or the P: drive needs to be created.") - - addonbuilder_path = os.path.join(arma3tools_path, "AddonBuilder", "AddonBuilder.exe") - dssignfile_path = os.path.join(arma3tools_path, "DSSignFile", "DSSignFile.exe") - dscreatekey_path = os.path.join(arma3tools_path, "DSSignFile", "DSCreateKey.exe") - cfgconvert_path = os.path.join(arma3tools_path, "CfgConvert", "CfgConvert.exe") - - if os.path.isfile(addonbuilder_path) and os.path.isfile(dssignfile_path) and os.path.isfile(dscreatekey_path) and os.path.isfile(cfgconvert_path): - return [addonbuilder_path, dssignfile_path, dscreatekey_path, cfgconvert_path] - else: - raise Exception("BadTools","Arma 3 Tools are not installed correctly or the P: drive needs to be created.") - -def find_depbo_tools(regKey): - """Use registry entries to find DePBO-based tools.""" - stop = False - - if regKey == "HKCU": - reg = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER) - stop = True - else: - reg = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) - - try: - k = winreg.OpenKey(reg, r"Software\Wow6432Node\Mikero\pboProject") - try: - pboproject_path = winreg.QueryValueEx(k, "exe")[0] - winreg.CloseKey(k) - print("Found pboproject.") - except: - print_error("ERROR: Could not find pboProject.") - - k = winreg.OpenKey(reg, r"Software\Wow6432Node\Mikero\rapify") - try: - rapify_path = winreg.QueryValueEx(k, "exe")[0] - winreg.CloseKey(k) - print("Found rapify.") - except: - print_error("Could not find rapify.") - - k = winreg.OpenKey(reg, r"Software\Wow6432Node\Mikero\MakePbo") - try: - makepbo_path = winreg.QueryValueEx(k, "exe")[0] - winreg.CloseKey(k) - print("Found makepbo.") - except: - print_error("Could not find makepbo.") - except: - if stop == True: - raise Exception("BadDePBO", "DePBO tools not installed correctly") - return -1 - - - #Strip any quotations from the path due to a MikeRo tool bug which leaves a trailing space in some of its registry paths. - return [pboproject_path.strip('"'),rapify_path.strip('"'),makepbo_path.strip('"')] - -def color(color): - """Set the color. Works on Win32 and normal terminals.""" - if sys.platform == "win32": - if color == "green": - set_text_attr(FOREGROUND_GREEN | get_text_attr() & 0x0070 | FOREGROUND_INTENSITY) - elif color == "red": - set_text_attr(FOREGROUND_RED | get_text_attr() & 0x0070 | FOREGROUND_INTENSITY) - elif color == "blue": - set_text_attr(FOREGROUND_BLUE | get_text_attr() & 0x0070 | FOREGROUND_INTENSITY) - elif color == "reset": - set_text_attr(FOREGROUND_GREY | get_text_attr() & 0x0070) - elif color == "grey": - set_text_attr(FOREGROUND_GREY | get_text_attr() & 0x0070) - else : - if color == "green": - sys.stdout.write('\033[92m') - elif color == "red": - sys.stdout.write('\033[91m') - elif color == "blue": - sys.stdout.write('\033[94m') - elif color == "reset": - sys.stdout.write('\033[0m') - -def print_error(msg): - color("red") - print ("ERROR: " + msg) - color("reset") - -def print_green(msg): - color("green") - print(msg) - color("reset") - -def print_blue(msg): - color("blue") - print(msg) - color("reset") - -def print_yellow(msg): - color("yellow") - print(msg) - color("reset") - -############################################################################### - -def main(argv): - """Build an Arma addon suite in a directory from rules in a make.cfg file.""" - print_blue(("\nmake.py for Arma, v" + __version__)) - - if sys.platform != "win32": - print_error("Non-Windows platform (Cygwin?). Please re-run from cmd.") - sys.exit(1) - - reg = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER) - try: - k = winreg.OpenKey(reg, r"Software\bohemia interactive\arma 3 tools") - arma3tools_path = winreg.QueryValueEx(k, "path")[0] - winreg.CloseKey(k) - except: - raise Exception("BadTools","Arma 3 Tools are not installed correctly or the P: drive needs to be created.") - - # Default behaviors - test = False # Copy to Arma 3 directory? - arg_modules = False # Only build modules on command line? - make_release = False # Make zip file from the release? - release_version = 0 # Version of release - use_pboproject = True # Default to pboProject build tool - make_target = "DEFAULT" # Which section in make.cfg to use for the build - new_key = False # Make a new key and use it to sign? - quiet = False # Suppress output from build tool? - - # Parse arguments - if "help" in argv or "-h" in argv or "--help" in argv: - print (""" -make.py [help] [test] [force] [key ] [target ] [release ] - [module name] [module name] [...] - -test -- Copy result to Arma 3. -release -- Make archive with . -force -- Ignore cache and build all. -target -- Use rules in make.cfg under heading [] rather than - default [Make] -key -- Use key in working directory with to sign. If it does not - exist, create key. -quiet -- Suppress command line output from build tool. - -If module names are specified, only those modules will be built. - -Examples: - make.py force test - Build all modules (ignoring cache) and copy the mod folder to the Arma 3 - directory. - make.py mymodule_gun - Only build the module named 'mymodule_gun'. - make.py force key MyNewKey release 1.0 - Build all modules (ignoring cache), sign them with NewKey, and pack them - into a zip file for release with version 1.0. - - -If a file called $NOBIN$ is found in the module directory, that module will not be binarized. - -See the make.cfg file for additional build options. -""") - sys.exit(0) - - if "force" in argv: - argv.remove("force") - force_build = True - else: - force_build = False - - if "test" in argv: - test = True - argv.remove("test") - - if "release" in argv: - make_release = True - release_version = argv[argv.index("release") + 1] - argv.remove(release_version) - argv.remove("release") - - if "target" in argv: - make_target = argv[argv.index("target") + 1] - argv.remove("target") - argv.remove(make_target) - force_build = True - - if "key" in argv: - new_key = True - key_name = argv[argv.index("key") + 1] - argv.remove("key") - argv.remove(key_name) - - if "quiet" in argv: - quiet = True - argv.remove("quiet") - - # Get the directory the make script is in. - make_root = os.path.dirname(os.path.realpath(__file__)) - make_root_parent = os.path.abspath(os.path.join(os.getcwd(), os.pardir)) - os.chdir(make_root) - - # Get latest commit ID - try: - gitpath = os.path.join(os.path.dirname(make_root), ".git") - assert os.path.exists(gitpath) - - commit_id = subprocess.check_output(["git", "rev-parse", "HEAD"]) - commit_id = str(commit_id, "utf-8")[:8] - except: - print_error("FAILED TO DETERMINE COMMIT ID.") - commit_id = "NOGIT" - - cfg = configparser.ConfigParser(); - try: - cfg.read(os.path.join(make_root, "make.cfg")) - - # Project name (with @ symbol) - project = cfg.get(make_target, "project", fallback="@"+os.path.basename(os.getcwd())) - - # Private key path - key = cfg.get(make_target, "key", fallback=None) - - # Project prefix (folder path) - prefix = cfg.get(make_target, "prefix", fallback="") - - # Should we autodetect modules on a complete build? - module_autodetect = cfg.getboolean(make_target, "module_autodetect", fallback=True) - - # Manual list of modules to build for a complete build - modules = cfg.get(make_target, "modules", fallback=None) - # Parse it out - if modules: - modules = [x.strip() for x in modules.split(',')] - else: - modules = [] - - # List of directories to ignore when detecting - ignore = [x.strip() for x in cfg.get(make_target, "ignore", fallback="release").split(',')] - - # BI Tools work drive on Windows - work_drive = cfg.get(make_target, "work_drive", fallback="P:\\") - - # Which build tool should we use? - build_tool = cfg.get(make_target, "build_tool", fallback="addonbuilder").lower() - - # Release/build directory, relative to script dir - release_dir = cfg.get(make_target, "release_dir", fallback="release") - - # Project PBO file prefix (files are renamed to prefix_name.pbo) - pbo_name_prefix = cfg.get(make_target, "pbo_name_prefix", fallback=None) - - # Project module Root - module_root_parent = os.path.abspath(os.path.join(os.path.join(work_drive, prefix), os.pardir)) - module_root = cfg.get(make_target, "module_root", fallback=os.path.join(make_root_parent, "addons")) - print_green ("module_root: " + module_root) - if (os.path.isdir(module_root)): - os.chdir(module_root) - else: - print_error ("Directory " + module_root + " does not exist.") - sys.exit() - - except: - raise - print_error("Could not parse make.cfg.") - sys.exit(1) - - - - # See if we have been given specific modules to build from command line. - if len(argv) > 1 and not make_release: - arg_modules = True - modules = argv[1:] - - # Find the tools we need. - try: - tools = find_bi_tools(work_drive) - addonbuilder = tools[0] - dssignfile = tools[1] - dscreatekey = tools[2] - cfgconvert = tools[3] - - except: - print_error("Arma 3 Tools are not installed correctly or the P: drive has not been created.") - sys.exit(1) - - if build_tool == "pboproject": - try: - depbo_tools = find_depbo_tools("HKLM") - if depbo_tools == -1: - depbo_tools = find_depbo_tools("HKCU") - pboproject = depbo_tools[0] - rapifyTool = depbo_tools[1] - makepboTool = depbo_tools[2] - except: - raise - print_error("Could not find dePBO tools. Download the needed tools from: https://dev.withsix.com/projects/mikero-pbodll/files") - sys.exit(1) - - # Try to open and deserialize build cache file. - try: - cache = {} - with open(os.path.join(make_root, "make.cache"), 'r') as f: - cache_raw = f.read() - - cache = json.loads(cache_raw) - - except: - print ("No cache found.") - cache = {} - - # Get list of subdirs in make root. - dirs = next(os.walk(module_root))[1] - - # Autodetect what directories to build. - if module_autodetect and not arg_modules: - modules = [] - for path in dirs: - # Any dir that has a config.cpp in its root is an addon to build. - config_path = os.path.join(path, 'config.cpp') - if os.path.isfile(config_path) and not path in ignore: - modules.append(path) - - # Make the key specified from command line if necessary. - if new_key: - if not os.path.isfile(os.path.join(module_root, key_name + ".biprivatekey")): - print_green("\nRequested key does not exist.") - ret = subprocess.call([dscreatekey, key_name]) # Created in make_root - if ret == 0: - print_blue("Created: " + os.path.join(module_root, key_name + ".biprivatekey")) - else: - print_error("Failed to create key!") - - try: - print_blue("Copying public key to release directory.") - - try: - os.makedirs(os.path.join(module_root, release_dir, "Keys")) - except: - pass - - shutil.copyfile(os.path.join(module_root, key_name + ".bikey"), os.path.join(module_root, release_dir, "Keys", key_name + ".bikey")) - - except: - raise - print_error("Could not copy key to release directory.") - - else: - print_green("\nNOTE: Using key " + os.path.join(module_root, key_name + ".biprivatekey")) - - key = os.path.join(module_root, key_name + ".biprivatekey") - - - # For each module, prep files and then build. - for module in modules: - print_green("\nMaking " + module + "-"*max(1, (60-len(module)))) - - # Cache check - if module in cache: - old_sha = cache[module] - else: - old_sha = "" - - #We always build ACE_common so we can properly show the correct version stamp in the RPT file. - if module == "common": - old_sha = "" - - # Hash the module - new_sha = get_directory_hash(os.path.join(module_root, module)) - - # Check if it needs rebuilt - # print ("Hash:", new_sha) - if old_sha == new_sha: - if not force_build: - print("Module has not changed.") - # Skip everything else - continue - - # Only do this if the project isn't stored directly on the work drive. - # Split the path at the drive name and see if they are on the same drive (usually P:) - if os.path.splitdrive(module_root)[0] != os.path.splitdrive(work_drive)[0]: - try: - # Remove old work drive version (ignore errors) - shutil.rmtree(os.path.join(work_drive, prefix, module), True) - - # Copy module to the work drive - shutil.copytree(module, os.path.join(work_drive, prefix, module)) - - except: - raise - print_error("ERROR: Could not copy module to work drive. Does the module exist?") - input("Press Enter to continue...") - print("Resuming build...") - continue - #else: - #print("WARNING: Module is stored on work drive (" + work_drive + ").") - - try: - # Remove the old pbo, key, and log - old = os.path.join(module_root, release_dir, project, "Addons", module) + "*" - files = glob.glob(old) - for f in files: - os.remove(f) - - if pbo_name_prefix: - old = os.path.join(module_root, release_dir, project, "Addons", pbo_name_prefix+module) + "*" - files = glob.glob(old) - for f in files: - os.remove(f) - except: - raise - print_error("ERROR: Could not copy module to work drive. Does the module exist?") - input("Press Enter to continue...") - print("Resuming build...") - continue - - # Build the module into a pbo - print_blue("Building: " + os.path.join(work_drive, prefix, module)) - print_blue("Destination: " + os.path.join(module_root, release_dir, project, "Addons")) - - # Make destination folder (if needed) - try: - os.makedirs(os.path.join(module_root, release_dir, project, "Addons")) - except: - pass - - # Run build tool - build_successful = False - if build_tool == "pboproject": - try: - #PABST: Convert config (run the macro'd config.cpp through CfgConvert twice to produce a de-macro'd cpp that pboProject can read without fucking up: - shutil.copyfile(os.path.join(work_drive, prefix, module, "config.cpp"), os.path.join(work_drive, prefix, module, "config.backup")) - - os.chdir("P:\\") - - cmd = [os.path.join(arma3tools_path, "CfgConvert", "CfgConvert.exe"), "-bin", "-dst", os.path.join(work_drive, prefix, module, "config.bin"), os.path.join(work_drive, prefix, module, "config.cpp")] - ret = subprocess.call(cmd) - if ret != 0: - print_error("CfgConvert -bin return code == " + str(ret) + ". Usually means there is a syntax error within the config.cpp file.") - os.remove(os.path.join(work_drive, prefix, module, "config.cpp")) - shutil.copyfile(os.path.join(work_drive, prefix, module, "config.backup"), os.path.join(work_drive, prefix, module, "config.cpp")) - - cmd = [os.path.join(arma3tools_path, "CfgConvert", "CfgConvert.exe"), "-txt", "-dst", os.path.join(work_drive, prefix, module, "config.cpp"), os.path.join(work_drive, prefix, module, "config.bin")] - ret = subprocess.call(cmd) - if ret != 0: - print_error("CfgConvert -txt return code == " + str(ret) + ". Usually means there is a syntax error within the config.cpp file.") - os.remove(os.path.join(work_drive, prefix, module, "config.cpp")) - shutil.copyfile(os.path.join(work_drive, prefix, module, "config.backup"), os.path.join(work_drive, prefix, module, "config.cpp")) - - - # Include build number - try: - configpath = os.path.join(work_drive, prefix, module, "config.cpp") - f = open(configpath, "r") - configtext = f.read() - f.close() - - if configtext: - patchestext = re.search(r"class CfgPatches\n\{(.*?)\n\}", configtext, re.DOTALL).group(1) - patchestext = re.sub(r'version(.*?)="(.*?)"', r'version\1="\2-{}"'.format(commit_id), patchestext) - configtext = re.sub(r"class CfgPatches\n\{(.*?)\n\}", "class CfgPatches\n{"+patchestext+"\n}", configtext, flags=re.DOTALL) - f = open(configpath, "w") - f.write(configtext) - f.close() - else: - os.remove(os.path.join(work_drive, prefix, module, "config.cpp")) - os.rename(os.path.join(work_drive, prefix, module, "config.backup"), os.path.join(work_drive, prefix, module, "config.cpp")) - except: - raise - print_error("Failed to include build number") - continue - - if os.path.isfile(os.path.join(work_drive, prefix, module, "$NOBIN$")): - print_green("$NOBIN$ Found. Proceeding with non-binarizing!") - cmd = [makepboTool, "-P","-A","-L","-N","-G", os.path.join(work_drive, prefix, module),os.path.join(module_root, release_dir, project,"Addons")] - - else: - cmd = [pboproject, "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "-S","+Noisy", "+X", "+Clean", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"] - - color("grey") - if quiet: - devnull = open(os.devnull, 'w') - ret = subprocess.call(cmd, stdout=devnull) - devnull.close() - else: - ret = subprocess.call(cmd) - color("reset") - - if ret == 0: - print_green("pboProject return code == " + str(ret)) - # Prettyprefix rename the PBO if requested. - if pbo_name_prefix: - try: - os.rename(os.path.join(module_root, release_dir, project, "Addons", module+".pbo"), os.path.join(module_root, release_dir, project, "Addons", pbo_name_prefix+module+".pbo")) - except: - raise - print_error("Could not rename built PBO with prefix.") - # Sign result - if key: - print("Signing with " + key + ".") - if pbo_name_prefix: - ret = subprocess.call([dssignfile, key, os.path.join(module_root, release_dir, project, "Addons", pbo_name_prefix + module + ".pbo")]) - else: - ret = subprocess.call([dssignfile, key, os.path.join(module_root, release_dir, project, "Addons", module + ".pbo")]) - - if ret == 0: - build_successful = True - else: - build_successful = True - - if not build_successful: - print_error("pboProject return code == " + str(ret)) - print_error("Module not successfully built/signed.") - print ("Resuming build...") - continue - - #PABST: cleanup config BS (you could comment this out to see the "de-macroed" cpp - #print_green("\Pabst (restoring): " + os.path.join(work_drive, prefix, module, "config.cpp")) - os.remove(os.path.join(work_drive, prefix, module, "config.cpp")) - os.remove(os.path.join(work_drive, prefix, module, "config.bin")) - os.rename(os.path.join(work_drive, prefix, module, "config.backup"), os.path.join(work_drive, prefix, module, "config.cpp")) - - # Back to the root - os.chdir(module_root) - - except: - raise - print_error("Could not run Addon Builder.") - input("Press Enter to continue...") - print ("Resuming build...") - continue - - elif build_tool== "addonbuilder": - # Detect $NOBIN$ and do not binarize if found. - if os.path.isfile(os.path.join(work_drive, prefix, module, "$NOBIN$")): - do_binarize = False - print("$NOBIN$ file found in module, packing only.") - else: - do_binarize = True - try: - # Call AddonBuilder - os.chdir("P:\\") - - cmd = [addonbuilder, os.path.join(work_drive, prefix, module), os.path.join(make_root, release_dir, project, "Addons"), "-clear", "-project="+work_drive] - if not do_binarize: - cmd.append("-packonly") - - if quiet: - previousDirectory = os.getcwd() - os.chdir(arma3tools_path) - devnull = open(os.devnull, 'w') - ret = subprocess.call(cmd, stdout=devnull) - devnull.close() - os.chdir(previousDirectory) - else: - previousDirectory = os.getcwd() - os.chdir(arma3tools_path) - print_error("Current directory - " + os.getcwd()) - ret = subprocess.call(cmd) - os.chdir(previousDirectory) - print_error("Current directory - " + os.getcwd()) - color("reset") - print_green("completed") - # Prettyprefix rename the PBO if requested. - if pbo_name_prefix: - try: - os.rename(os.path.join(make_root, release_dir, project, "Addons", module+".pbo"), os.path.join(make_root, release_dir, project, "Addons", pbo_name_prefix+module+".pbo")) - except: - raise - print_error("Could not rename built PBO with prefix.") - - if ret == 0: - # Sign result - if key: - print("Signing with " + key + ".") - if pbo_name_prefix: - ret = subprocess.call([dssignfile, key, os.path.join(make_root, release_dir, project, "Addons", pbo_name_prefix + module + ".pbo")]) - else: - ret = subprocess.call([dssignfile, key, os.path.join(make_root, release_dir, project, "Addons", module + ".pbo")]) - - if ret == 0: - build_successful = True - else: - build_successful = True - - if not build_successful: - print_error("Module not successfully built.") - - # Back to the root - os.chdir(make_root) - - except: - raise - print_error("Could not run Addon Builder.") - input("Press Enter to continue...") - print ("Resuming build...") - continue - - else: - print_error("Unknown build_tool " + build_tool + "!") - - # Update the hash for a successfully built module - if build_successful: - cache[module] = new_sha - - # Done building all modules! - - # Write out the cache state - cache_out = json.dumps(cache) - with open(os.path.join(make_root, "make.cache"), 'w') as f: - f.write(cache_out) - - # Delete the pboproject temp files if building a release. - if make_release and build_tool == "pboproject": - try: - shutil.rmtree(os.path.join(module_root, release_dir, project, "temp"), True) - except: - print_error("ERROR: Could not delete pboProject temp files.") - - print_green("\nDone.") - - # Make release - if make_release: - print_blue("\nMaking release: " + project + "-" + release_version + ".zip") - - try: - # Delete all log files - for root, dirs, files in os.walk(os.path.join(module_root, release_dir, project, "Addons")): - for currentFile in files: - if currentFile.lower().endswith("log"): - os.remove(os.path.join(root, currentFile)) - - # Create a zip with the contents of release/ in it - shutil.make_archive(project + "-" + release_version, "zip", os.path.join(module_root, release_dir)) - except: - raise - print_error("Could not make release.") - - # Copy to Arma 3 folder for testing - if test: - print_blue("\nCopying to Arma 3.") - - if sys.platform == "win32": - reg = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) - try: - k = winreg.OpenKey(reg, r"SOFTWARE\Wow6432Node\Bohemia Interactive\Arma 3") - a3_path = winreg.EnumValue(k, 1)[1] - winreg.CloseKey(k) - except: - print_error("Could not find Arma 3's directory in the registry.") - else: - a3_path = cygwin_a3path - - if os.path.exists(a3_path): - try: - shutil.rmtree(os.path.join(a3_path, project), True) - shutil.copytree(os.path.join(module_root, release_dir, project), os.path.join(a3_path, project)) - except: - print_error("Could not copy files. Is Arma 3 running?") - -if __name__ == "__main__": - main(sys.argv) -input("Press Enter to continue...") From 17946063049486dc8d87f75da088138c771f7efb Mon Sep 17 00:00:00 2001 From: ulteq Date: Thu, 16 Apr 2015 19:52:20 +0200 Subject: [PATCH 158/305] Got rid of the __DSP macro --- addons/atragmx/functions/fnc_create_dialog.sqf | 2 +- addons/atragmx/functions/fnc_show_gun_list.sqf | 2 +- .../atragmx/functions/fnc_show_range_card_setup.sqf | 2 +- .../functions/fnc_show_target_range_assist.sqf | 2 +- .../functions/fnc_show_target_speed_assist.sqf | 2 +- .../functions/fnc_target_speed_assist_timer.sqf | 2 +- addons/atragmx/functions/fnc_toggle_range_card.sqf | 2 +- .../functions/fnc_update_target_selection.sqf | 12 ++++++------ .../atragmx/functions/fnc_update_unit_selection.sqf | 8 ++++---- addons/atragmx/script_component.hpp | 2 -- 10 files changed, 17 insertions(+), 19 deletions(-) diff --git a/addons/atragmx/functions/fnc_create_dialog.sqf b/addons/atragmx/functions/fnc_create_dialog.sqf index 73945a4030..59ec3528af 100644 --- a/addons/atragmx/functions/fnc_create_dialog.sqf +++ b/addons/atragmx/functions/fnc_create_dialog.sqf @@ -29,7 +29,7 @@ GVAR(showAddNewGun) call FUNC(show_add_new_gun); GVAR(showGunList) call FUNC(show_gun_list); GVAR(showRangeCard) call FUNC(show_range_card); if (GVAR(showRangeCard)) then { - ctrlSetFocus (__DSP displayCtrl 5001); + ctrlSetFocus ((uiNamespace getVariable "ATragMX_Display") displayCtrl 5001); [] call FUNC(update_range_card); }; GVAR(showRangeCardSetup) call FUNC(show_range_card_setup); diff --git a/addons/atragmx/functions/fnc_show_gun_list.sqf b/addons/atragmx/functions/fnc_show_gun_list.sqf index 565da71ce6..5e1cdfa453 100644 --- a/addons/atragmx/functions/fnc_show_gun_list.sqf +++ b/addons/atragmx/functions/fnc_show_gun_list.sqf @@ -20,7 +20,7 @@ GVAR(showGunList) = _this; {ctrlShow [_x, _this]} forEach [6000, 6001, 6002, 6003, 6004, 6005, 6006, 6007]; if (_this) then { - ctrlSetFocus (__DSP displayCtrl 6002); + ctrlSetFocus ((uiNamespace getVariable "ATragMX_Display") displayCtrl 6002); lbSetCurSel [6000, GVAR(currentGun)]; }; diff --git a/addons/atragmx/functions/fnc_show_range_card_setup.sqf b/addons/atragmx/functions/fnc_show_range_card_setup.sqf index 98e5f57998..3d44c14b53 100644 --- a/addons/atragmx/functions/fnc_show_range_card_setup.sqf +++ b/addons/atragmx/functions/fnc_show_range_card_setup.sqf @@ -20,7 +20,7 @@ GVAR(showRangeCardSetup) = _this; {ctrlShow [_x, _this]} forEach [10000, 10001, 10002, 10003, 10004, 10005, 10006, 10007, 10008, 10009]; if (_this) then { - ctrlSetFocus (__DSP displayCtrl 10006); + ctrlSetFocus ((uiNamespace getVariable "ATragMX_Display") displayCtrl 10006); ctrlSetText [10003, Str(Round(GVAR(rangeCardStartRange)))]; ctrlSetText [10004, Str(Round(GVAR(rangeCardEndRange)))]; diff --git a/addons/atragmx/functions/fnc_show_target_range_assist.sqf b/addons/atragmx/functions/fnc_show_target_range_assist.sqf index f7b973876f..60de30930f 100644 --- a/addons/atragmx/functions/fnc_show_target_range_assist.sqf +++ b/addons/atragmx/functions/fnc_show_target_range_assist.sqf @@ -20,7 +20,7 @@ GVAR(showTargetRangeAssist) = _this; {ctrlShow [_x, _this]} forEach [7000, 7001, 7002, 7003, 7004, 7005, 7006, 7007, 7008, 7009, 7010, 7011, 7012, 7013, 7014, 7015, 7016, 7017, 7018, 7019, 7020]; if (_this) then { - ctrlSetFocus (__DSP displayCtrl 7018); + ctrlSetFocus ((uiNamespace getVariable "ATragMX_Display") displayCtrl 7018); ctrlSetText [7012, Str(parseNumber(ctrlText 320))]; ctrlSetText [7013, Str(parseNumber(ctrlText 340))]; diff --git a/addons/atragmx/functions/fnc_show_target_speed_assist.sqf b/addons/atragmx/functions/fnc_show_target_speed_assist.sqf index 43b9afe470..3ac05f3f4f 100644 --- a/addons/atragmx/functions/fnc_show_target_speed_assist.sqf +++ b/addons/atragmx/functions/fnc_show_target_speed_assist.sqf @@ -20,7 +20,7 @@ GVAR(showTargetSpeedAssist) = _this; {ctrlShow [_x, _this]} forEach [8000, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 8011, 8012, 8013, 8014, 8015]; if (_this) then { - ctrlSetFocus (__DSP displayCtrl 8012); + ctrlSetFocus ((uiNamespace getVariable "ATragMX_Display") displayCtrl 8012); ctrlSetText [8004, Str(Round((GVAR(targetRange) select GVAR(currentTarget))))]; diff --git a/addons/atragmx/functions/fnc_target_speed_assist_timer.sqf b/addons/atragmx/functions/fnc_target_speed_assist_timer.sqf index da4b68a7c7..6e47461cf3 100644 --- a/addons/atragmx/functions/fnc_target_speed_assist_timer.sqf +++ b/addons/atragmx/functions/fnc_target_speed_assist_timer.sqf @@ -20,7 +20,7 @@ if !(ctrlVisible 9000) then { false call FUNC(show_target_speed_assist); true call FUNC(show_target_speed_assist_timer); - ctrlSetFocus (__DSP displayCtrl 9002); + ctrlSetFocus ((uiNamespace getVariable "ATragMX_Display") displayCtrl 9002); [{ private ["_args", "_startTime"]; diff --git a/addons/atragmx/functions/fnc_toggle_range_card.sqf b/addons/atragmx/functions/fnc_toggle_range_card.sqf index e5d5cb0269..572a4fe6ae 100644 --- a/addons/atragmx/functions/fnc_toggle_range_card.sqf +++ b/addons/atragmx/functions/fnc_toggle_range_card.sqf @@ -24,7 +24,7 @@ if (ctrlVisible 5006) then false call FUNC(show_main_page); true call FUNC(show_range_card); - ctrlSetFocus (__DSP displayCtrl 5001); + ctrlSetFocus ((uiNamespace getVariable "ATragMX_Display") displayCtrl 5001); [] call FUNC(calculate_range_card); [] call FUNC(update_range_card); diff --git a/addons/atragmx/functions/fnc_update_target_selection.sqf b/addons/atragmx/functions/fnc_update_target_selection.sqf index 2a29d05fb1..d63f84a90c 100644 --- a/addons/atragmx/functions/fnc_update_target_selection.sqf +++ b/addons/atragmx/functions/fnc_update_target_selection.sqf @@ -15,13 +15,13 @@ */ #include "script_component.hpp" -(__DSP displayCtrl 500) ctrlEnable true; -(__DSP displayCtrl 501) ctrlEnable true; -(__DSP displayCtrl 502) ctrlEnable true; -(__DSP displayCtrl 503) ctrlEnable true; +((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; -(__DSP displayCtrl 500 + GVAR(currentTarget)) ctrlEnable false; +((uiNamespace getVariable "ATragMX_Display") displayCtrl 500 + GVAR(currentTarget)) ctrlEnable false; -ctrlSetFocus (__DSP displayCtrl 3000); +ctrlSetFocus ((uiNamespace getVariable "ATragMX_Display") displayCtrl 3000); [] call FUNC(update_unit_selection); diff --git a/addons/atragmx/functions/fnc_update_unit_selection.sqf b/addons/atragmx/functions/fnc_update_unit_selection.sqf index 5468d2d0fc..2882954c5b 100644 --- a/addons/atragmx/functions/fnc_update_unit_selection.sqf +++ b/addons/atragmx/functions/fnc_update_unit_selection.sqf @@ -15,11 +15,11 @@ */ #include "script_component.hpp" -(__DSP displayCtrl 600) ctrlEnable true; -(__DSP displayCtrl 601) ctrlEnable true; -(__DSP displayCtrl 602) ctrlEnable true; +((uiNamespace getVariable "ATragMX_Display") displayCtrl 600) ctrlEnable true; +((uiNamespace getVariable "ATragMX_Display") displayCtrl 601) ctrlEnable true; +((uiNamespace getVariable "ATragMX_Display") displayCtrl 602) ctrlEnable true; -(__DSP displayCtrl 600 + GVAR(currentUnit)) ctrlEnable false; +((uiNamespace getVariable "ATragMX_Display") displayCtrl 600 + GVAR(currentUnit)) ctrlEnable false; [] call FUNC(update_gun); [] call FUNC(update_atmosphere); diff --git a/addons/atragmx/script_component.hpp b/addons/atragmx/script_component.hpp index 60b3083a96..f7ec6e68e8 100644 --- a/addons/atragmx/script_component.hpp +++ b/addons/atragmx/script_component.hpp @@ -10,5 +10,3 @@ #endif #include "\z\ace\addons\main\script_macros.hpp" - -#define __DSP (uiNamespace getVariable "ATragMX_Display") From fa6cb3e75ce2390614203def390b3dd179450dba Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 16 Apr 2015 12:58:54 -0500 Subject: [PATCH 159/305] #672 - Don't show speaking icon for unconc players --- addons/nametags/functions/fnc_initIsSpeaking.sqf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/nametags/functions/fnc_initIsSpeaking.sqf b/addons/nametags/functions/fnc_initIsSpeaking.sqf index d8ffda756c..daddd36c05 100644 --- a/addons/nametags/functions/fnc_initIsSpeaking.sqf +++ b/addons/nametags/functions/fnc_initIsSpeaking.sqf @@ -41,14 +41,14 @@ if (isClass (configFile >> "cfgPatches" >> "acre_api")) then { diag_log text format ["[ACE_nametags] - ACRE Detected"]; DFUNC(isSpeaking) = { PARAMS_1(_unit); - ([_unit] call acre_api_fnc_isSpeaking) || ([ACE_player] call acre_api_fnc_isBroadcasting) + (([_unit] call acre_api_fnc_isSpeaking) || ([ACE_player] call acre_api_fnc_isBroadcasting)) && {!(_unit getVariable ["ACE_isUnconscious", false])} }; } else { if (isClass (configFile >> "cfgPatches" >> "task_force_radio")) then { diag_log text format ["[ACE_nametags] - TFR Detected"]; DFUNC(isSpeaking) = { PARAMS_1(_unit); - (_unit getVariable ["tf_isSpeaking", false]) + (_unit getVariable ["tf_isSpeaking", false]) && {!(_unit getVariable ["ACE_isUnconscious", false])} }; } else { //No Radio Mod - Start a PFEH to watch the internal VON icon @@ -64,7 +64,7 @@ if (isClass (configFile >> "cfgPatches" >> "acre_api")) then { DFUNC(isSpeaking) = { PARAMS_1(_unit); - (_unit getVariable [QGVAR(isSpeakingInGame), false]) + (_unit getVariable [QGVAR(isSpeakingInGame), false]) && {!(_unit getVariable ["ACE_isUnconscious", false])} }; }; }; From ce4a9c36763177faa7482ba0db384146d9f6e963 Mon Sep 17 00:00:00 2001 From: jaynus Date: Thu, 16 Apr 2015 11:32:47 -0700 Subject: [PATCH 160/305] Apply javelin guidance to static titans. --- addons/javelin/CfgVehicles.hpp | 29 ++++++++++++++++++++ addons/javelin/CfgWeapons.hpp | 14 +++++++++- addons/javelin/config.cpp | 3 +- addons/javelin/functions/fnc_onFired.sqf | 5 +++- addons/javelin/functions/fnc_onOpticDraw.sqf | 19 +++++++++++-- addons/missileguidance/CfgAmmo.hpp | 5 ++-- 6 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 addons/javelin/CfgVehicles.hpp diff --git a/addons/javelin/CfgVehicles.hpp b/addons/javelin/CfgVehicles.hpp new file mode 100644 index 0000000000..02b8789e1a --- /dev/null +++ b/addons/javelin/CfgVehicles.hpp @@ -0,0 +1,29 @@ +class CfgVehicles { + class LandVehicle; + class StaticWeapon : LandVehicle { + class Turrets; + }; + + class StaticMGWeapon : StaticWeapon { + class Turrets : Turrets { + class MainTurret; + }; + }; + + + class AT_01_base_F: StaticMGWeapon { + class Turrets : Turrets { + class MainTurret : MainTurret { + turretInfoType = "ACE_RscOptics_javelin"; + gunnerOpticsModel = PATHTOF(data\reticle_titan.p3d); + opticsZoomMin = 0.08333; + opticsZoomMax = 0.04167; + opticsZoomInit = 0.08333; + opticsPPEffects[] = {"OpticsCHAbera1","OpticsBlur1"}; + opticsFlare = 0; + discretefov[] = {0.08333,0.04167}; + discreteInitIndex = 0; + }; + }; + }; +}; \ No newline at end of file diff --git a/addons/javelin/CfgWeapons.hpp b/addons/javelin/CfgWeapons.hpp index 4e7091c653..0898fa6d3c 100644 --- a/addons/javelin/CfgWeapons.hpp +++ b/addons/javelin/CfgWeapons.hpp @@ -1,14 +1,26 @@ class CfgWeapons { class Launcher; + class MissileLauncher; + class Launcher_Base_F : Launcher { class WeaponSlotsInfo; }; + class missiles_titan : MissileLauncher { + weaponInfoType = "ACE_RscOptics_javelin"; + modelOptics = PATHTOF(data\reticle_titan.p3d); + + canLock = 0; + + lockingTargetSound[] = {"",0,1}; + lockedTargetSound[] = {"",0,1}; + }; + class launch_Titan_base : Launcher_Base_F { weaponInfoType = "ACE_RscOptics_javelin"; modelOptics = PATHTOF(data\reticle_titan.p3d); - canLock = 1; + canLock = 0; lockingTargetSound[] = {"",0,1}; diff --git a/addons/javelin/config.cpp b/addons/javelin/config.cpp index 9d7c14e448..cb76da0010 100644 --- a/addons/javelin/config.cpp +++ b/addons/javelin/config.cpp @@ -13,4 +13,5 @@ class CfgPatches { #include "CfgEventhandlers.hpp" #include "RscInGameUI.hpp" #include "CfgSounds.hpp" -#include "CfgWeapons.hpp" \ No newline at end of file +#include "CfgWeapons.hpp" +#include "CfgVehicles.hpp" \ No newline at end of file diff --git a/addons/javelin/functions/fnc_onFired.sqf b/addons/javelin/functions/fnc_onFired.sqf index 04a023c9d8..a4e351cd92 100644 --- a/addons/javelin/functions/fnc_onFired.sqf +++ b/addons/javelin/functions/fnc_onFired.sqf @@ -6,7 +6,10 @@ PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); // Bail on not missile if( _shooter != ACE_player) exitWith { false }; -if( ! ([ (configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)) ), "launch_Titan_base"] call EFUNC(common,inheritsFrom)) ) exitWith { }; +if( ! ([ (configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)) ), "launch_Titan_base"] call EFUNC(common,inheritsFrom)) + && + { ! ([ (configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)) ), "missiles_titan"] call EFUNC(common,inheritsFrom)) } +) exitWith { }; _pfh_handle = uiNamespace getVariable ["ACE_RscOptics_javelin_PFH", nil]; if(!isNil "_pfh_handle") then { diff --git a/addons/javelin/functions/fnc_onOpticDraw.sqf b/addons/javelin/functions/fnc_onOpticDraw.sqf index 13669b9d2e..bc17865480 100644 --- a/addons/javelin/functions/fnc_onOpticDraw.sqf +++ b/addons/javelin/functions/fnc_onOpticDraw.sqf @@ -30,7 +30,10 @@ _soundTime = _args select 4; _randomLockInterval = _args select 5; _fireDisabledEH = _args select 6; -if( ! ([ (configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)) ), "launch_Titan_base"] call EFUNC(common,inheritsFrom)) ) exitWith { +if( ! ([ (configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)) ), "launch_Titan_base"] call EFUNC(common,inheritsFrom)) + && + { ! ([ (configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)) ), "missiles_titan"] call EFUNC(common,inheritsFrom)) } + ) exitWith { __JavelinIGUITargeting ctrlShow false; __JavelinIGUITargetingGate ctrlShow false; __JavelinIGUITargetingLines ctrlShow false; @@ -55,8 +58,16 @@ if ((velocity ACE_player) distance [0,0,0] > 0.5 && {cameraView == "GUNNER"} && // bail on not loaded -if (ACE_player ammo (currentWeapon ACE_player) == 0) exitWith { }; - +if( (vehicle ACE_player) != ACE_player) then { + if( (vehicle player) magazineTurretAmmo ["1Rnd_GAT_missiles", [0]] < 1) exitWith { + TRACE_1("No turret ammo, exit", ""); + }; +} else { + if (ACE_player ammo (currentWeapon ACE_player) < 1 ) exitWith { + TRACE_1("No ammo, exit", ""); + }; +}; + _range = parseNumber (ctrlText __JavelinIGUIRangefinder); TRACE_1("Viewing range", _range); if (_range > 50 && {_range < 2500}) then { @@ -144,6 +155,8 @@ if (isNull _newTarget) then { // Disallow fire _fireDisabledEH = [_fireDisabledEH] call FUNC(disableFire); } else { + _fov = [] call CBA_fnc_getFoV; + TRACE_1("FOV", _fov); if (_newTarget distance ACE_player < 2500 && {(call CBA_fnc_getFoV) select 1 > 9} && { (currentVisionMode ACE_player == 2)} diff --git a/addons/missileguidance/CfgAmmo.hpp b/addons/missileguidance/CfgAmmo.hpp index 3b74c87065..82045a1720 100644 --- a/addons/missileguidance/CfgAmmo.hpp +++ b/addons/missileguidance/CfgAmmo.hpp @@ -105,8 +105,9 @@ class CfgAmmo { // Turn off arma crosshair-guidance manualControl = 0; - hit = 1400; - + hit = 1400; // default: 800 + indirectHit = 20; + indirectHitRange = 2; // ACE uses these values //trackOversteer = 1; //trackLead = 0; From e12831bee474814bee5fd4f02f4dc10a9ccb40b6 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 16 Apr 2015 15:17:53 -0500 Subject: [PATCH 161/305] #678 - Missing Text Height in settingMenu --- addons/optionsmenu/gui/settingsMenu.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/optionsmenu/gui/settingsMenu.hpp b/addons/optionsmenu/gui/settingsMenu.hpp index 93d35b284c..5361aa7172 100644 --- a/addons/optionsmenu/gui/settingsMenu.hpp +++ b/addons/optionsmenu/gui/settingsMenu.hpp @@ -94,6 +94,8 @@ class ACE_settingsMenu { periodFocus = 1; periodOver = 1; action = QUOTE([MENU_TAB_OPTIONS] call FUNC(onListBoxShowSelectionChanged);); + SizeEx = (UNITY * 1); + Size = (UNITY * 1); }; class selectionAction_2: selectionAction_1 { idc = 1001; @@ -221,6 +223,8 @@ class ACE_settingsMenu { periodFocus = 1; periodOver = 1; action = "closedialog 0;"; + SizeEx = (UNITY * 1); + Size = (UNITY * 1); }; class action_reset: actionClose { idc = 1100; From 4e5c2ef187f900c364c125cc51559726a25b8f44 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 16 Apr 2015 19:11:42 -0500 Subject: [PATCH 162/305] option menu ui scaling --- addons/optionsmenu/config.cpp | 12 +- addons/optionsmenu/gui/settingsMenu.hpp | 300 ++++++++++++------------ addons/optionsmenu/stringtable.xml | 5 +- 3 files changed, 170 insertions(+), 147 deletions(-) diff --git a/addons/optionsmenu/config.cpp b/addons/optionsmenu/config.cpp index 675e415e47..69249b36c4 100644 --- a/addons/optionsmenu/config.cpp +++ b/addons/optionsmenu/config.cpp @@ -26,4 +26,14 @@ class CfgAddons { #include "gui\settingsMenu.hpp" #include "gui\pauseMenu.hpp" -#include "CFgVehicles.hpp" +#include "CfgVehicles.hpp" + +class ACE_Settings { + class GVAR(optionMenuDisplaySize) { + value = 0; + typeName = "SCALAR"; + isClientSettable = 1; + displayName = "$STR_ACE_optionsMenu_uiScaing"; + values[] = {"$str_medium", "$str_large", "$str_very_large"}; + }; +}; diff --git a/addons/optionsmenu/gui/settingsMenu.hpp b/addons/optionsmenu/gui/settingsMenu.hpp index 5361aa7172..9225564eea 100644 --- a/addons/optionsmenu/gui/settingsMenu.hpp +++ b/addons/optionsmenu/gui/settingsMenu.hpp @@ -4,46 +4,56 @@ class ACE_settingsMenu { onLoad = QUOTE(uiNamespace setVariable [ARR_2('ACE_settingsMenu', _this select 0)]; [] call FUNC(onSettingsMenuOpen);); onUnload = QUOTE(uiNamespace setVariable [ARR_2('ACE_settingsMenu', nil)]; saveProfileNamespace;); - #define SIZEX (((safezoneW / safezoneH) min 1.2)) - #define SIZEY (SIZEX / 1.2) - #define UNITX (SIZEX / 40) - #define UNITY (SIZEY / 25) - #define OFFSETX (safezoneX + (safezoneW - SIZEX)/2) - #define OFFSETY (safezoneY + (safezoneH - (SIZEX / 1.2))/2) +#define SIZEX (((safezoneW / safezoneH) min 1.2)) +#define SIZEY (SIZEX / 1.2) +#define X_ORIGINAL(num) (num * (SIZEX / 40) + (safezoneX + (safezoneW - SIZEX)/2)) +#define Y_ORIGINAL(num) (num * (SIZEY / 25) + (safezoneY + (safezoneH - (SIZEX / 1.2))/2)) +#define W_ORIGINAL(num) (num * (SIZEX / 40)) +#define H_ORIGINAL(num) (num * (SIZEY / 25)) +#define X_MAKEITBIGGA(num) (num * (safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)) +#define Y_MAKEITBIGGA(num) (num * (safeZoneH / 30) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)) +#define W_MAKEITBIGGA(num) (num * (safeZoneH / 40)) +#define H_MAKEITBIGGA(num) (num * (safeZoneH / 30)) + +#define X_PART(num) QUOTE(linearConversion [ARR_5(0, 2, (missionNamespace getVariable [ARR_2(QUOTE(QGVAR(optionMenuDisplaySize)), 0)]), X_ORIGINAL(num), X_MAKEITBIGGA(num))]) +#define Y_PART(num) QUOTE(linearConversion [ARR_5(0, 2, (missionNamespace getVariable [ARR_2(QUOTE(QGVAR(optionMenuDisplaySize)), 0)]), Y_ORIGINAL(num), Y_MAKEITBIGGA(num))]) +#define W_PART(num) QUOTE(linearConversion [ARR_5(0, 2, (missionNamespace getVariable [ARR_2(QUOTE(QGVAR(optionMenuDisplaySize)), 0)]), W_ORIGINAL(num), W_MAKEITBIGGA(num))]) +#define H_PART(num) QUOTE(linearConversion [ARR_5(0, 2, (missionNamespace getVariable [ARR_2(QUOTE(QGVAR(optionMenuDisplaySize)), 0)]), H_ORIGINAL(num), H_MAKEITBIGGA(num))]) + class controlsBackground { class HeaderBackground: ACE_gui_backgroundBase { idc = -1; type = CT_STATIC; - x = 1 * UNITX + OFFSETX; - y = 1 * UNITY + OFFSETY; - w = 38 * UNITX; - h = 1 * UNITY; + x = X_PART(1); + y = Y_PART(1); + w = W_PART(38); + h = H_PART(1); style = ST_LEFT + ST_SHADOW; font = "PuristaMedium"; - SizeEx = (UNITY * 1); + SizeEx = H_PART(1); colorText[] = {0.95, 0.95, 0.95, 0.75}; colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])", "(profilenamespace getvariable ['GUI_BCG_RGB_A',0.9])"}; text = ""; }; class CenterBackground: HeaderBackground { - y = 2.1 * UNITY + OFFSETY; - h = 2.5 * UNITY; + y = Y_PART(2.1); + h = H_PART(2.5); text = ""; colorText[] = {0, 0, 0, "(profilenamespace getvariable ['GUI_BCG_RGB_A',0.9])"}; colorBackground[] = {0,0,0,"(profilenamespace getvariable ['GUI_BCG_RGB_A',0.9])"}; }; class LeftBackground: CenterBackground { - y = 4.8 * UNITY + OFFSETY; - h = 17.4 * UNITY; - w = 25 * UNITX; + y = Y_PART(4.8); + h = H_PART(17.4); + w = W_PART(25); }; class RightBackground: LeftBackground { - x = 26.1 * UNITX + OFFSETX; - w = 12.9 * UNITX; + x = X_PART(26.1); + w = W_PART(12.9); }; class RightBackgroundHeader: RightBackground { - h = 1.4 * UNITY; + h = H_PART(1.4); colorBackground[] = {0,0,0,1}; }; }; @@ -52,32 +62,32 @@ class ACE_settingsMenu { class HeaderName { idc = 1; type = CT_STATIC; - x = 1 * UNITX + OFFSETX; - y = 1 * UNITY + OFFSETY; - w = 38 * UNITX; - h = 1 * UNITY; + x = X_PART(1); + y = Y_PART(1); + w = W_PART(38); + h = H_PART(1); style = ST_LEFT + ST_SHADOW; font = "PuristaMedium"; - SizeEx = (UNITY * 1); + SizeEx = H_PART(1); colorText[] = {0.95, 0.95, 0.95, 0.75}; colorBackground[] = {0,0,0,0}; text = "$STR_ACE_OptionsMenu_OpenConfigMenu"; }; class labelSubHeader: ACE_gui_staticBase { idc = 13; - x = 2 * UNITX + OFFSETX; - y = 3.4 * UNITY + OFFSETY; - w = 30 * UNITX; - h = 1 * UNITY; + x = X_PART(2); + y = Y_PART(3.4); + w = W_PART(30); + h = H_PART(1); text = ""; }; class selectionAction_1: ACE_gui_buttonBase { idc = 1000; text = "$STR_ACE_OptionsMenu_TabOptions"; - x = 1 * UNITX + OFFSETX; - y = 2.1 * UNITY + OFFSETY; - w = 9.5 * UNITX; - h = 1 * UNITY; + x = X_PART(1); + y = Y_PART(2.1); + w = W_PART(9.5); + h = H_PART(1); animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.9)"; animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.8)"; animTextureOver = "#(argb,8,8,3)color(1,1,1,1)"; @@ -94,34 +104,34 @@ class ACE_settingsMenu { periodFocus = 1; periodOver = 1; action = QUOTE([MENU_TAB_OPTIONS] call FUNC(onListBoxShowSelectionChanged);); - SizeEx = (UNITY * 1); - Size = (UNITY * 1); + SizeEx = H_PART(1); + Size = H_PART(1); }; class selectionAction_2: selectionAction_1 { idc = 1001; text = "$STR_ACE_OptionsMenu_TabColors"; - x = 10.5 * UNITX + OFFSETX; + x = X_PART(10.5); action = QUOTE([MENU_TAB_COLORS] call FUNC(onListBoxShowSelectionChanged);); }; class selectionAction_3: selectionAction_1 { idc = 1002; text = ""; - x = 20 * UNITX + OFFSETX; + x = X_PART(20); action = ""; }; class selectionAction_4: selectionAction_1 { idc = 1003; text = ""; - x = 29.5 * UNITX + OFFSETX; + x = X_PART(29.5); action = ""; }; class listBoxSettingsList: ACE_gui_listNBox { idc = 200; - x = 2 * UNITX + OFFSETX; - y = 5.5 * UNITY + OFFSETY; - w = 23 * UNITX; - h = 15 * UNITY; - SizeEx = (UNITY * 0.8); + x = X_PART(2); + y = Y_PART(5.5); + w = W_PART(23); + h = H_PART(15); + SizeEx = H_ORIGINAL(0.8); colorBackground[] = {0, 0, 0, 0.9}; colorSelectBackground[] = {0, 0, 0, 0.9}; columns[] = {0.0, 0.6}; @@ -129,83 +139,83 @@ class ACE_settingsMenu { }; class labelTitle: ACE_gui_staticBase { idc = 250; - x = 27.1 * UNITX + OFFSETX; - y = 5.1 * UNITY + OFFSETY; - w = 11 * UNITX; - h = 1 * UNITY; + x = X_PART(27.1); + y = Y_PART(5.1); + w = W_PART(11); + h = H_PART(1); text = ""; - SizeEx = (UNITY *1); + SizeEx = H_PART(1); }; class labelKey: ACE_gui_staticBase { //Variable Name idc = 300; - x = 27.1 * UNITX + OFFSETX; - y = 6.2 * UNITY + OFFSETY; - w = 11 * UNITX; - h = 1 * UNITY; + x = X_PART(27.1); + y = Y_PART(6.2); + w = W_PART(11); + h = H_PART(1); text = ""; - SizeEx = (UNITY * 0.65); + SizeEx = H_PART(0.65); }; class Label2: labelKey { idc = 301; - y = 7.3 * UNITY + OFFSETY; + y = Y_PART(7.3); text = "$STR_ACE_OptionsMenu_Setting"; - SizeEx = (UNITY * 1); + SizeEx = H_PART(1); }; class comboBox1: ACE_gui_comboBoxBase { idc = 400; - x = 31.1 * UNITX + OFFSETX; - y = 7.3 * UNITY + OFFSETY; - w = 7 * UNITX; - h = 1 * UNITY; + x = X_PART(31.1); + y = Y_PART(7.3); + w = W_PART(7); + h = H_PART(1); onLBSelChanged = QUOTE( call FUNC(onListBoxSettingsChanged)); - SizeEx = (UNITY * 0.9); + SizeEx = H_PART(0.9); }; class sliderBar1: RscXSliderH { idc = 410; - x = 27.1 * UNITX + OFFSETX; - y = 7.3 * UNITY + OFFSETY; - w = 11 * UNITX; - h = 0.75 * UNITY; + x = X_PART(27.1); + y = Y_PART(7.3); + w = W_PART(11); + h = H_PART(0.75); onSliderPosChanged = QUOTE(_this call FUNC(onSliderPosChanged)); color[] = {1,0,0,0.4}; colorActive[] = {1,0,0,1}; }; class sliderBar2: sliderBar1 { idc = 411; - y = 8.2 * UNITY + OFFSETY; + y = Y_PART(8.2); color[] = {0,1,0,0.4}; colorActive[] = {0,1,0,1}; }; class sliderBar3: sliderBar1 { idc = 412; - y = 9.1 * UNITY + OFFSETY; + y = Y_PART(9.1); color[] = {0,0,1,0.4}; colorActive[] = {0,0,1,1}; }; class sliderBar4: sliderBar1 { idc = 413; - y = 10 * UNITY + OFFSETY; + y = Y_PART(10); color[] = {1,1,1,0.4}; colorActive[] = {1,1,1,1}; }; class labelDesc: ACE_gui_staticBase { idc = 251; - x = 27.1 * UNITX + OFFSETX; - y = 11 * UNITY + OFFSETY; - w = 11 * UNITX; - h = 11 * UNITY; + x = X_PART(27.1); + y = Y_PART(11); + w = W_PART(11); + h = H_PART(11); text = ""; style = ST_LEFT + ST_MULTI; lineSpacing = 1; - SizeEx = (UNITY * 0.8); + SizeEx = H_PART(0.8); }; class actionClose: ACE_gui_buttonBase { idc = 10; text = "$STR_DISP_CLOSE"; - x = 1 * UNITX + OFFSETX; - y = 22.3 * UNITY + OFFSETY; - w = 7.5 * UNITX; - h = 1 * UNITY; + x = X_PART(1); + y = Y_PART(22.3); + w = W_PART(7.5); + h = H_PART(1); style = ST_LEFT; animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.8)"; animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.5)"; @@ -223,19 +233,19 @@ class ACE_settingsMenu { periodFocus = 1; periodOver = 1; action = "closedialog 0;"; - SizeEx = (UNITY * 1); - Size = (UNITY * 1); + SizeEx = H_PART(1); + Size = H_PART(1); }; class action_reset: actionClose { idc = 1100; text = "$STR_ACE_OptionsMenu_ResetAll"; - x = 26.1 * (SIZEX / 40) + OFFSETX; + x = X_PART(9.5); action = QUOTE([] call FUNC(resetSettings)); }; class action_exportServerConfig: actionClose { idc = 1102; text = "$STR_ACE_OptionsMenu_OpenExport"; - x = 1 * (SIZEX / 40) + OFFSETX; + x = X_PART(18); action = QUOTE(if (GVAR(serverConfigGeneration) > 0) then {createDialog 'ACE_serverSettingsMenu'; }); }; }; @@ -247,32 +257,32 @@ class ACE_serverSettingsMenu: ACE_settingsMenu { class HeaderName { idc = 1; type = CT_STATIC; - x = 1 * UNITX + OFFSETX; - y = 1 * UNITY + OFFSETY; - w = 38 * UNITX; - h = 1 * UNITY; + x = X_PART(1); + y = Y_PART(1); + w = W_PART(38); + h = H_PART(1); style = ST_LEFT + ST_SHADOW; font = "PuristaMedium"; - SizeEx = (UNITY * 1); + SizeEx = H_PART(1); colorText[] = {0.95, 0.95, 0.95, 0.75}; colorBackground[] = {0,0,0,0}; text = "$STR_ACE_OptionsMenu_OpenConfigMenu"; }; class labelSubHeader: ACE_gui_staticBase { idc = 13; - x = 2 * UNITX + OFFSETX; - y = 3.4 * UNITY + OFFSETY; - w = 30 * UNITX; - h = 1 * UNITY; + x = X_PART(2); + y = Y_PART(3.4); + w = W_PART(30); + h = H_PART(1); text = ""; }; class selectionAction_1: ACE_gui_buttonBase { idc = 1000; text = "$STR_ACE_OptionsMenu_TabOptions"; - x = 1 * UNITX + OFFSETX; - y = 2.1 * UNITY + OFFSETY; - w = 9.5 * UNITX; - h = 1 * UNITY; + x = X_PART(1); + y = Y_PART(2.1); + w = W_PART(9.5); + h = H_PART(1); animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.9)"; animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.8)"; animTextureOver = "#(argb,8,8,3)color(1,1,1,1)"; @@ -293,28 +303,28 @@ class ACE_serverSettingsMenu: ACE_settingsMenu { class selectionAction_2: selectionAction_1 { idc = 1001; text = "$STR_ACE_OptionsMenu_TabColors"; - x = 10.5 * UNITX + OFFSETX; + x = X_PART(10.5); action = QUOTE([MENU_TAB_SERVER_COLORS] call FUNC(onServerListBoxShowSelectionChanged);); }; class selectionAction_3: selectionAction_1 { idc = 1002; text = "$STR_ACE_OptionsMenu_TabValues"; - x = 20 * UNITX + OFFSETX; + x = X_PART(20); action = QUOTE([MENU_TAB_SERVER_VALUES] call FUNC(onServerListBoxShowSelectionChanged);); }; class selectionAction_4: selectionAction_1 { idc = 1003; text = ""; - x = 29.5 * UNITX + OFFSETX; + x = X_PART(29.5); action = ""; }; class listBoxSettingsList: ACE_gui_listNBox { idc = 200; - x = 2 * UNITX + OFFSETX; - y = 5.5 * UNITY + OFFSETY; - w = 23 * UNITX; - h = 15 * UNITY; - SizeEx = (UNITY * 0.8); + x = X_PART(2); + y = Y_PART(5.5); + w = W_PART(23); + h = H_PART(15); + SizeEx = H_PART(0.8); colorBackground[] = {0, 0, 0, 0.9}; colorSelectBackground[] = {0, 0, 0, 0.9}; columns[] = {0.0, 0.6}; @@ -322,120 +332,120 @@ class ACE_serverSettingsMenu: ACE_settingsMenu { }; class labelTitle: ACE_gui_staticBase { idc = 250; - x = 27.1 * UNITX + OFFSETX; - y = 5.1 * UNITY + OFFSETY; - w = 11 * UNITX; - h = 1 * UNITY; + x = X_PART(27.1); + y = Y_PART(5.1); + w = W_PART(11); + h = H_PART(1); text = ""; - SizeEx = (UNITY *1); + SizeEx = H_PART(1); }; class labelKey: ACE_gui_staticBase { //Variable Name idc = 300; - x = 27.1 * UNITX + OFFSETX; - y = 6.2 * UNITY + OFFSETY; - w = 11 * UNITX; - h = 1 * UNITY; + x = X_PART(27.1); + y = Y_PART(6.2); + w = W_PART(11); + h = H_PART(1); text = ""; - SizeEx = (UNITY * 0.65); + SizeEx = H_PART(0.65); }; class Label2: labelKey { idc = 301; - y = 7.3 * UNITY + OFFSETY; + y = Y_PART(7.3); text = "$STR_ACE_OptionsMenu_Setting"; - SizeEx = (UNITY * 1); + SizeEx = H_PART(1); }; class comboBox1: ACE_gui_comboBoxBase { idc = 400; - x = 31.1 * UNITX + OFFSETX; - y = 7.3 * UNITY + OFFSETY; - w = 7 * UNITX; - h = 1 * UNITY; + x = X_PART(31.1); + y = Y_PART(7.3); + w = W_PART(7); + h = H_PART(1); onLBSelChanged = QUOTE( call FUNC(onListBoxSettingsChanged)); - SizeEx = (UNITY * 0.9); + SizeEx = H_PART(0.9); }; class sliderBar1: RscXSliderH { idc = 410; - x = 27.1 * UNITX + OFFSETX; - y = 7.3 * UNITY + OFFSETY; - w = 11 * UNITX; - h = 0.75 * UNITY; + x = X_PART(27.1); + y = Y_PART(7.3); + w = W_PART(11); + h = H_PART(0.75); onSliderPosChanged = QUOTE(_this call FUNC(onSliderPosChanged)); color[] = {1,0,0,0.4}; colorActive[] = {1,0,0,1}; }; class sliderBar2: sliderBar1 { idc = 411; - y = 8.2 * UNITY + OFFSETY; + y = Y_PART(8.2); color[] = {0,1,0,0.4}; colorActive[] = {0,1,0,1}; }; class sliderBar3: sliderBar1 { idc = 412; - y = 9.1 * UNITY + OFFSETY; + y = Y_PART(9.1); color[] = {0,0,1,0.4}; colorActive[] = {0,0,1,1}; }; class sliderBar4: sliderBar1 { idc = 413; - y = 10 * UNITY + OFFSETY; + y = Y_PART(10); color[] = {1,1,1,0.4}; colorActive[] = {1,1,1,1}; }; class inputField1: ACE_gui_editBase { idc = 414; - x = 27.1 * UNITX + OFFSETX; - y = 7.3 * UNITY + OFFSETY; - w = 11 * UNITX; - h = 0.75 * UNITY; + x = X_PART(27.1); + y = Y_PART(7.3); + w = W_PART(11); + h = H_PART(0.75); }; class inputFieldTypeLabel: ACE_gui_staticBase { idc = 415; - x = 27.1 * UNITX + OFFSETX; - y = 8.2 * UNITY + OFFSETY; - w = 11 * UNITX; - h = 0.75 * UNITY; + x = X_PART(27.1); + y = Y_PART(8.2); + w = W_PART(11); + h = H_PART(0.75); text = ""; style = ST_LEFT + ST_MULTI; lineSpacing = 1; - SizeEx = (UNITY * 0.8); + SizeEx = H_PART(0.8); }; class saveInputButton: selectionAction_1 { idc = 416; text = "$STR_ACE_OptionsMenu_SaveInput"; - x = 27.1 * UNITX + OFFSETX; - y = 9.1 * UNITY + OFFSETY; - w = 11 * UNITX; - h = 1 * UNITY; + x = X_PART(27.1); + y = Y_PART(9.1); + w = W_PART(11); + h = H_PART(1); action = QUOTE([] call FUNC(onServerSaveInputField);); }; class labelDesc: ACE_gui_staticBase { idc = 251; - x = 27.1 * UNITX + OFFSETX; - y = 11 * UNITY + OFFSETY; - w = 11 * UNITX; - h = 11 * UNITY; + x = X_PART(27.1); + y = Y_PART(11); + w = W_PART(11); + h = H_PART(11); text = ""; style = ST_LEFT + ST_MULTI; lineSpacing = 1; - SizeEx = (UNITY * 0.8); + SizeEx = H_PART(0.8); }; class actionClose; class action_reset: actionClose { idc = 1100; text = "$STR_ACE_OptionsMenu_ResetAll"; - x = 26.1 * (SIZEX / 40) + OFFSETX; + x = X_PART(26.1); action = QUOTE([] call FUNC(serverResetSettings)); }; class action_exportServerConfig: actionClose { idc = 1101; text = "$STR_ACE_OptionsMenu_Export"; - x = 1 * (SIZEX / 40) + OFFSETX; + x = X_PART(1); action = QUOTE([] call FUNC(exportSettings)); }; class action_toggleIncludeClientSettings: actionClose { idc = 1102; text = "$STR_ACE_OptionsMenu_inClientSettings"; - x = 9 * (SIZEX / 40) + OFFSETX; + x = X_PART(9); action = QUOTE([] call FUNC(toggleIncludeClientSettings)); }; }; diff --git a/addons/optionsmenu/stringtable.xml b/addons/optionsmenu/stringtable.xml index c4ac2b1593..6e512b7d25 100644 --- a/addons/optionsmenu/stringtable.xml +++ b/addons/optionsmenu/stringtable.xml @@ -198,5 +198,8 @@ Paramètres exportés dans le presse papier Beállítások exportálva a vágólapba + + Option Menu UI Scaling + - + \ No newline at end of file From 53af014eab292835bf0a23b3d37b77fb095b9c4b Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 16 Apr 2015 19:29:39 -0500 Subject: [PATCH 163/305] Fix Localization in value[] array --- addons/common/functions/fnc_setSettingFromConfig.sqf | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/addons/common/functions/fnc_setSettingFromConfig.sqf b/addons/common/functions/fnc_setSettingFromConfig.sqf index 4d81ef3535..347320edec 100644 --- a/addons/common/functions/fnc_setSettingFromConfig.sqf +++ b/addons/common/functions/fnc_setSettingFromConfig.sqf @@ -75,6 +75,18 @@ if (isNil _name) then { getNumber (_optionEntry >> "force") > 0, _value ]; + + //Strings in the values array won't be localized from the config, so just do that now: + private "_values"; + _values = _settingData select 5; + { + _text = _x; + if (((typeName _text) == "STRING") && {(count _text) > 1} && {(_text select [0,1]) == "$"}) then { + _text = localize (_text select [1, ((count _text) - 1)]); //chop off the leading $ + _values set [_forEachIndex, _text]; + }; + } forEach _values; + GVAR(settings) pushBack _settingData; From 1729c781bd01135182053cdfcc8ad733afc6bf83 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 16 Apr 2015 19:46:42 -0500 Subject: [PATCH 164/305] Cleanup / private vars --- addons/inventory/config.cpp | 2 +- .../functions/fnc_exportSettings.sqf | 6 + .../functions/fnc_onServerSaveInputField.sqf | 22 +- .../fnc_onServerSettingsMenuOpen.sqf | 3 +- .../functions/fnc_onSettingsMenuOpen.sqf | 4 +- .../fnc_serverSettingsMenuUpdateKeyView.sqf | 2 +- .../fnc_serverSettingsMenuUpdateList.sqf | 2 +- .../functions/fnc_settingsMenuUpdateList.sqf | 2 +- addons/optionsmenu/gui/settingsMenu.hpp | 850 +++++++++--------- 9 files changed, 451 insertions(+), 442 deletions(-) diff --git a/addons/inventory/config.cpp b/addons/inventory/config.cpp index 1268f8b886..622dacc624 100644 --- a/addons/inventory/config.cpp +++ b/addons/inventory/config.cpp @@ -21,7 +21,7 @@ class ACE_Settings { isClientSettable = 1; displayName = "$STR_ACE_Inventory_SettingName"; description = "$STR_ACE_Inventory_SettingDescription"; - values[] = {"Normal (Default Size)", "Medium", "Bigger"}; + values[] = {"$str_medium", "$str_large", "$str_very_large"}; }; }; diff --git a/addons/optionsmenu/functions/fnc_exportSettings.sqf b/addons/optionsmenu/functions/fnc_exportSettings.sqf index 3ac2455a64..f98c3548e8 100644 --- a/addons/optionsmenu/functions/fnc_exportSettings.sqf +++ b/addons/optionsmenu/functions/fnc_exportSettings.sqf @@ -16,6 +16,8 @@ #include "script_component.hpp" +private ["_compiledConfig", "_name", "_typeName", "_isClientSetable", "_localizedName", "_localizedDescription", "_possibleValues", "_defaultValue", "_value", "_compiledConfigEntry"]; + _compiledConfig = " "; { @@ -52,6 +54,10 @@ class %1 { typeName = %3; force = 1; };", _name, _value, format['"%1"', _typeName]]; + + //clipboard seems to be getting cuttoff, so do a backup dump to rpt: + diag_log text _compiledConfigEntry; + _compiledConfig = _compiledConfig + _compiledConfigEntry; }; } forEach EGVAR(common,settings); diff --git a/addons/optionsmenu/functions/fnc_onServerSaveInputField.sqf b/addons/optionsmenu/functions/fnc_onServerSaveInputField.sqf index ca4a00891a..b8eb630f85 100644 --- a/addons/optionsmenu/functions/fnc_onServerSaveInputField.sqf +++ b/addons/optionsmenu/functions/fnc_onServerSaveInputField.sqf @@ -16,28 +16,28 @@ #include "script_component.hpp" -private ["_settingIndex", "_inputText"]; +private ["_settingIndex", "_inputText", "_setting", "_settingName", "_convertedValue"]; _settingIndex = lbCurSel 200; //Index of left list _inputText = ctrlText 414; //Index of right drop down switch (GVAR(optionMenu_openTab)) do { case (MENU_TAB_SERVER_VALUES): { - if ((_settingIndex >= 0) && (_settingIndex < (count GVAR(serverSideValues)))) then { - try { - _setting = (GVAR(serverSideValues) select _settingIndex); - _settingName = _setting select 0; + if ((_settingIndex >= 0) && (_settingIndex < (count GVAR(serverSideValues)))) then { + try { + _setting = (GVAR(serverSideValues) select _settingIndex); + _settingName = _setting select 0; - _convertedValue = switch (toUpper (_setting select 1)) do { + _convertedValue = switch (toUpper (_setting select 1)) do { case "STRING": {format ['"%1"', _inputText]}; case "ARRAY": {format [call compile "[%1]", _inputText]}; case "SCALAR": {parseNumber _inputText;}; - default {throw "Error"}; + default {throw "Error"}; + }; + [MENU_TAB_SERVER_VALUES, _settingName, _convertedValue] call FUNC(updateSetting); + } catch { }; - [MENU_TAB_SERVER_VALUES, _settingName, _convertedValue] call FUNC(updateSetting); - } catch { }; + [false] call FUNC(serverSettingsMenuUpdateList); }; - [false] call FUNC(serverSettingsMenuUpdateList); - }; }; diff --git a/addons/optionsmenu/functions/fnc_onServerSettingsMenuOpen.sqf b/addons/optionsmenu/functions/fnc_onServerSettingsMenuOpen.sqf index 7894d2ff1a..f5501d0860 100644 --- a/addons/optionsmenu/functions/fnc_onServerSettingsMenuOpen.sqf +++ b/addons/optionsmenu/functions/fnc_onServerSettingsMenuOpen.sqf @@ -16,6 +16,8 @@ #include "script_component.hpp" +private ["_name", "_typeName", "_isClientSetable", "_localizedName", "_localizedDescription", "_possibleValues", "_defaultValue", "_setting", "_menu", "_settingsMenu"]; + if (GVAR(serverConfigGeneration) == 0 || isMultiplayer) exitwith {closeDialog 145246;}; // Filter only user setable setting @@ -54,7 +56,6 @@ GVAR(serverSideValues) = []; //Delay a frame [{ [MENU_TAB_SERVER_OPTIONS] call FUNC(onServerListBoxShowSelectionChanged) }, []] call EFUNC(common,execNextFrame); -private "_menu"; disableSerialization; _menu = uiNamespace getvariable "ACE_serverSettingsMenu"; (_menu displayCtrl 1003) ctrlEnable false; diff --git a/addons/optionsmenu/functions/fnc_onSettingsMenuOpen.sqf b/addons/optionsmenu/functions/fnc_onSettingsMenuOpen.sqf index 3a4c6ec561..050abcf295 100644 --- a/addons/optionsmenu/functions/fnc_onSettingsMenuOpen.sqf +++ b/addons/optionsmenu/functions/fnc_onSettingsMenuOpen.sqf @@ -16,9 +16,12 @@ #include "script_component.hpp" +private ["_setting", "_menu"]; + // Filter only user setable setting GVAR(clientSideOptions) = []; GVAR(clientSideColors) = []; + { // If the setting is user setable and not forced if ((_x select 2) && !(_x select 6)) then { @@ -40,7 +43,6 @@ GVAR(clientSideColors) = []; //Delay a frame [{ [MENU_TAB_OPTIONS] call FUNC(onListBoxShowSelectionChanged) }, []] call EFUNC(common,execNextFrame); -private "_menu"; disableSerialization; _menu = uiNamespace getvariable "ACE_settingsMenu"; (_menu displayCtrl 1002) ctrlEnable false; diff --git a/addons/optionsmenu/functions/fnc_serverSettingsMenuUpdateKeyView.sqf b/addons/optionsmenu/functions/fnc_serverSettingsMenuUpdateKeyView.sqf index 2dcf9f7fe7..52984b78f3 100644 --- a/addons/optionsmenu/functions/fnc_serverSettingsMenuUpdateKeyView.sqf +++ b/addons/optionsmenu/functions/fnc_serverSettingsMenuUpdateKeyView.sqf @@ -16,7 +16,7 @@ #include "script_component.hpp" -private ["_settingsMenu", "_ctrlList", "_collection", "_settingIndex", "_setting", "_entryName", "_localizedName", "_localizedDescription", "_possibleValues", "_settingsValue", "_currentColor"]; +private ["_settingsMenu", "_ctrlList", "_collection", "_settingIndex", "_setting", "_entryName", "_localizedName", "_localizedDescription", "_possibleValues", "_settingsValue", "_currentColor", "_expectedType"]; disableSerialization; _settingsMenu = uiNamespace getVariable 'ACE_serverSettingsMenu'; diff --git a/addons/optionsmenu/functions/fnc_serverSettingsMenuUpdateList.sqf b/addons/optionsmenu/functions/fnc_serverSettingsMenuUpdateList.sqf index ad5d647c16..dad3012e1b 100644 --- a/addons/optionsmenu/functions/fnc_serverSettingsMenuUpdateList.sqf +++ b/addons/optionsmenu/functions/fnc_serverSettingsMenuUpdateList.sqf @@ -16,7 +16,7 @@ #include "script_component.hpp" -private ["_settingsMenu", "_ctrlList", "_settingsText", "_color", "_settingsColor", "_updateKeyView"]; +private ["_settingsMenu", "_ctrlList", "_settingsText", "_color", "_settingsColor", "_updateKeyView", "_settingsValue"]; DEFAULT_PARAM(0,_updateKeyView,true); disableSerialization; diff --git a/addons/optionsmenu/functions/fnc_settingsMenuUpdateList.sqf b/addons/optionsmenu/functions/fnc_settingsMenuUpdateList.sqf index 0138b9e87d..513b187d7d 100644 --- a/addons/optionsmenu/functions/fnc_settingsMenuUpdateList.sqf +++ b/addons/optionsmenu/functions/fnc_settingsMenuUpdateList.sqf @@ -16,7 +16,7 @@ #include "script_component.hpp" -private ["_settingsMenu", "_ctrlList", "_settingsText", "_color", "_settingsColor", "_updateKeyView"]; +private ["_settingsMenu", "_ctrlList", "_settingsText", "_color", "_settingsColor", "_updateKeyView", "_settingsValue"]; DEFAULT_PARAM(0,_updateKeyView,true); disableSerialization; diff --git a/addons/optionsmenu/gui/settingsMenu.hpp b/addons/optionsmenu/gui/settingsMenu.hpp index 9225564eea..04e7ee5aaa 100644 --- a/addons/optionsmenu/gui/settingsMenu.hpp +++ b/addons/optionsmenu/gui/settingsMenu.hpp @@ -1,8 +1,8 @@ class ACE_settingsMenu { - idd = 145246; - movingEnable = false; - onLoad = QUOTE(uiNamespace setVariable [ARR_2('ACE_settingsMenu', _this select 0)]; [] call FUNC(onSettingsMenuOpen);); - onUnload = QUOTE(uiNamespace setVariable [ARR_2('ACE_settingsMenu', nil)]; saveProfileNamespace;); + idd = 145246; + movingEnable = false; + onLoad = QUOTE(uiNamespace setVariable [ARR_2('ACE_settingsMenu', _this select 0)]; [] call FUNC(onSettingsMenuOpen);); + onUnload = QUOTE(uiNamespace setVariable [ARR_2('ACE_settingsMenu', nil)]; saveProfileNamespace;); #define SIZEX (((safezoneW / safezoneH) min 1.2)) #define SIZEY (SIZEX / 1.2) @@ -20,433 +20,433 @@ class ACE_settingsMenu { #define Y_PART(num) QUOTE(linearConversion [ARR_5(0, 2, (missionNamespace getVariable [ARR_2(QUOTE(QGVAR(optionMenuDisplaySize)), 0)]), Y_ORIGINAL(num), Y_MAKEITBIGGA(num))]) #define W_PART(num) QUOTE(linearConversion [ARR_5(0, 2, (missionNamespace getVariable [ARR_2(QUOTE(QGVAR(optionMenuDisplaySize)), 0)]), W_ORIGINAL(num), W_MAKEITBIGGA(num))]) #define H_PART(num) QUOTE(linearConversion [ARR_5(0, 2, (missionNamespace getVariable [ARR_2(QUOTE(QGVAR(optionMenuDisplaySize)), 0)]), H_ORIGINAL(num), H_MAKEITBIGGA(num))]) - - class controlsBackground { - class HeaderBackground: ACE_gui_backgroundBase { - idc = -1; - type = CT_STATIC; - x = X_PART(1); - y = Y_PART(1); - w = W_PART(38); - h = H_PART(1); - style = ST_LEFT + ST_SHADOW; - font = "PuristaMedium"; - SizeEx = H_PART(1); - colorText[] = {0.95, 0.95, 0.95, 0.75}; - colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])", "(profilenamespace getvariable ['GUI_BCG_RGB_A',0.9])"}; - text = ""; - }; - class CenterBackground: HeaderBackground { - y = Y_PART(2.1); - h = H_PART(2.5); - text = ""; - colorText[] = {0, 0, 0, "(profilenamespace getvariable ['GUI_BCG_RGB_A',0.9])"}; - colorBackground[] = {0,0,0,"(profilenamespace getvariable ['GUI_BCG_RGB_A',0.9])"}; - }; - class LeftBackground: CenterBackground { - y = Y_PART(4.8); - h = H_PART(17.4); - w = W_PART(25); - }; - class RightBackground: LeftBackground { - x = X_PART(26.1); - w = W_PART(12.9); - }; - class RightBackgroundHeader: RightBackground { - h = H_PART(1.4); - colorBackground[] = {0,0,0,1}; - }; - }; - class controls { - class HeaderName { - idc = 1; - type = CT_STATIC; - x = X_PART(1); - y = Y_PART(1); - w = W_PART(38); - h = H_PART(1); - style = ST_LEFT + ST_SHADOW; - font = "PuristaMedium"; - SizeEx = H_PART(1); - colorText[] = {0.95, 0.95, 0.95, 0.75}; - colorBackground[] = {0,0,0,0}; - text = "$STR_ACE_OptionsMenu_OpenConfigMenu"; + class controlsBackground { + class HeaderBackground: ACE_gui_backgroundBase { + idc = -1; + type = CT_STATIC; + x = X_PART(1); + y = Y_PART(1); + w = W_PART(38); + h = H_PART(1); + style = ST_LEFT + ST_SHADOW; + font = "PuristaMedium"; + SizeEx = H_PART(1); + colorText[] = {0.95, 0.95, 0.95, 0.75}; + colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])", "(profilenamespace getvariable ['GUI_BCG_RGB_A',0.9])"}; + text = ""; + }; + class CenterBackground: HeaderBackground { + y = Y_PART(2.1); + h = H_PART(2.5); + text = ""; + colorText[] = {0, 0, 0, "(profilenamespace getvariable ['GUI_BCG_RGB_A',0.9])"}; + colorBackground[] = {0,0,0,"(profilenamespace getvariable ['GUI_BCG_RGB_A',0.9])"}; + }; + class LeftBackground: CenterBackground { + y = Y_PART(4.8); + h = H_PART(17.4); + w = W_PART(25); + }; + class RightBackground: LeftBackground { + x = X_PART(26.1); + w = W_PART(12.9); + }; + class RightBackgroundHeader: RightBackground { + h = H_PART(1.4); + colorBackground[] = {0,0,0,1}; + }; }; - class labelSubHeader: ACE_gui_staticBase { - idc = 13; - x = X_PART(2); - y = Y_PART(3.4); - w = W_PART(30); - h = H_PART(1); - text = ""; + + class controls { + class HeaderName { + idc = 1; + type = CT_STATIC; + x = X_PART(1); + y = Y_PART(1); + w = W_PART(38); + h = H_PART(1); + style = ST_LEFT + ST_SHADOW; + font = "PuristaMedium"; + SizeEx = H_PART(1); + colorText[] = {0.95, 0.95, 0.95, 0.75}; + colorBackground[] = {0,0,0,0}; + text = "$STR_ACE_OptionsMenu_OpenConfigMenu"; + }; + class labelSubHeader: ACE_gui_staticBase { + idc = 13; + x = X_PART(2); + y = Y_PART(3.4); + w = W_PART(30); + h = H_PART(1); + text = ""; + }; + class selectionAction_1: ACE_gui_buttonBase { + idc = 1000; + text = "$STR_ACE_OptionsMenu_TabOptions"; + x = X_PART(1); + y = Y_PART(2.1); + w = W_PART(9.5); + h = H_PART(1); + animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.9)"; + animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.8)"; + animTextureOver = "#(argb,8,8,3)color(1,1,1,1)"; + animTextureFocused = "#(argb,8,8,3)color(1,1,1,1)"; + animTexturePressed = "#(argb,8,8,3)color(1,1,1,1)"; + animTextureDefault = "#(argb,8,8,3)color(1,1,1,1)"; + color[] = {1, 1, 1, 1}; + color2[] = {0,0,0, 1}; + colorBackgroundFocused[] = {1,1,1,1}; + colorBackground[] = {1,1,1,1}; + colorbackground2[] = {1,1,1,1}; + colorDisabled[] = {1,1,1,1}; + colorFocused[] = {0,0,0,1}; + periodFocus = 1; + periodOver = 1; + action = QUOTE([MENU_TAB_OPTIONS] call FUNC(onListBoxShowSelectionChanged);); + SizeEx = H_PART(1); + Size = H_PART(1); + }; + class selectionAction_2: selectionAction_1 { + idc = 1001; + text = "$STR_ACE_OptionsMenu_TabColors"; + x = X_PART(10.5); + action = QUOTE([MENU_TAB_COLORS] call FUNC(onListBoxShowSelectionChanged);); + }; + class selectionAction_3: selectionAction_1 { + idc = 1002; + text = ""; + x = X_PART(20); + action = ""; + }; + class selectionAction_4: selectionAction_1 { + idc = 1003; + text = ""; + x = X_PART(29.5); + action = ""; + }; + class listBoxSettingsList: ACE_gui_listNBox { + idc = 200; + x = X_PART(2); + y = Y_PART(5.5); + w = W_PART(23); + h = H_PART(15); + SizeEx = H_ORIGINAL(0.8); + colorBackground[] = {0, 0, 0, 0.9}; + colorSelectBackground[] = {0, 0, 0, 0.9}; + columns[] = {0.0, 0.6}; + onLBSelChanged = QUOTE(_this call FUNC(settingsMenuUpdateKeyView)); + }; + class labelTitle: ACE_gui_staticBase { + idc = 250; + x = X_PART(27.1); + y = Y_PART(5.1); + w = W_PART(11); + h = H_PART(1); + text = ""; + SizeEx = H_PART(1); + }; + class labelKey: ACE_gui_staticBase { //Variable Name + idc = 300; + x = X_PART(27.1); + y = Y_PART(6.2); + w = W_PART(11); + h = H_PART(1); + text = ""; + SizeEx = H_PART(0.65); + }; + class Label2: labelKey { + idc = 301; + y = Y_PART(7.3); + text = "$STR_ACE_OptionsMenu_Setting"; + SizeEx = H_PART(1); + }; + class comboBox1: ACE_gui_comboBoxBase { + idc = 400; + x = X_PART(31.1); + y = Y_PART(7.3); + w = W_PART(7); + h = H_PART(1); + onLBSelChanged = QUOTE( call FUNC(onListBoxSettingsChanged)); + SizeEx = H_PART(0.9); + }; + class sliderBar1: RscXSliderH { + idc = 410; + x = X_PART(27.1); + y = Y_PART(7.3); + w = W_PART(11); + h = H_PART(0.75); + onSliderPosChanged = QUOTE(_this call FUNC(onSliderPosChanged)); + color[] = {1,0,0,0.4}; + colorActive[] = {1,0,0,1}; + }; + class sliderBar2: sliderBar1 { + idc = 411; + y = Y_PART(8.2); + color[] = {0,1,0,0.4}; + colorActive[] = {0,1,0,1}; + }; + class sliderBar3: sliderBar1 { + idc = 412; + y = Y_PART(9.1); + color[] = {0,0,1,0.4}; + colorActive[] = {0,0,1,1}; + }; + class sliderBar4: sliderBar1 { + idc = 413; + y = Y_PART(10); + color[] = {1,1,1,0.4}; + colorActive[] = {1,1,1,1}; + }; + class labelDesc: ACE_gui_staticBase { + idc = 251; + x = X_PART(27.1); + y = Y_PART(11); + w = W_PART(11); + h = H_PART(11); + text = ""; + style = ST_LEFT + ST_MULTI; + lineSpacing = 1; + SizeEx = H_PART(0.8); + }; + class actionClose: ACE_gui_buttonBase { + idc = 10; + text = "$STR_DISP_CLOSE"; + x = X_PART(1); + y = Y_PART(22.3); + w = W_PART(7.5); + h = H_PART(1); + style = ST_LEFT; + animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.8)"; + animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.5)"; + animTextureOver = "#(argb,8,8,3)color(1,1,1,1)"; + animTextureFocused = "#(argb,8,8,3)color(1,1,1,1)"; + animTexturePressed = "#(argb,8,8,3)color(1,1,1,1)"; + animTextureDefault = "#(argb,8,8,3)color(1,1,1,1)"; + color[] = {1, 1, 1, 1}; + color2[] = {0,0,0, 1}; + colorBackgroundFocused[] = {1,1,1,1}; + colorBackground[] = {1,1,1,1}; + colorbackground2[] = {1,1,1,1}; + colorDisabled[] = {0.5,0.5,0.5,0.8}; + colorFocused[] = {0,0,0,1}; + periodFocus = 1; + periodOver = 1; + action = "closedialog 0;"; + SizeEx = H_PART(1); + Size = H_PART(1); + }; + class action_reset: actionClose { + idc = 1100; + text = "$STR_ACE_OptionsMenu_ResetAll"; + x = X_PART(9.5); + action = QUOTE([] call FUNC(resetSettings)); + }; + class action_exportServerConfig: actionClose { + idc = 1102; + text = "$STR_ACE_OptionsMenu_OpenExport"; + x = X_PART(18); + action = QUOTE(if (GVAR(serverConfigGeneration) > 0) then {createDialog 'ACE_serverSettingsMenu'; }); + }; }; - class selectionAction_1: ACE_gui_buttonBase { - idc = 1000; - text = "$STR_ACE_OptionsMenu_TabOptions"; - x = X_PART(1); - y = Y_PART(2.1); - w = W_PART(9.5); - h = H_PART(1); - animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.8)"; - animTextureOver = "#(argb,8,8,3)color(1,1,1,1)"; - animTextureFocused = "#(argb,8,8,3)color(1,1,1,1)"; - animTexturePressed = "#(argb,8,8,3)color(1,1,1,1)"; - animTextureDefault = "#(argb,8,8,3)color(1,1,1,1)"; - color[] = {1, 1, 1, 1}; - color2[] = {0,0,0, 1}; - colorBackgroundFocused[] = {1,1,1,1}; - colorBackground[] = {1,1,1,1}; - colorbackground2[] = {1,1,1,1}; - colorDisabled[] = {1,1,1,1}; - colorFocused[] = {0,0,0,1}; - periodFocus = 1; - periodOver = 1; - action = QUOTE([MENU_TAB_OPTIONS] call FUNC(onListBoxShowSelectionChanged);); - SizeEx = H_PART(1); - Size = H_PART(1); - }; - class selectionAction_2: selectionAction_1 { - idc = 1001; - text = "$STR_ACE_OptionsMenu_TabColors"; - x = X_PART(10.5); - action = QUOTE([MENU_TAB_COLORS] call FUNC(onListBoxShowSelectionChanged);); - }; - class selectionAction_3: selectionAction_1 { - idc = 1002; - text = ""; - x = X_PART(20); - action = ""; - }; - class selectionAction_4: selectionAction_1 { - idc = 1003; - text = ""; - x = X_PART(29.5); - action = ""; - }; - class listBoxSettingsList: ACE_gui_listNBox { - idc = 200; - x = X_PART(2); - y = Y_PART(5.5); - w = W_PART(23); - h = H_PART(15); - SizeEx = H_ORIGINAL(0.8); - colorBackground[] = {0, 0, 0, 0.9}; - colorSelectBackground[] = {0, 0, 0, 0.9}; - columns[] = {0.0, 0.6}; - onLBSelChanged = QUOTE(_this call FUNC(settingsMenuUpdateKeyView)); - }; - class labelTitle: ACE_gui_staticBase { - idc = 250; - x = X_PART(27.1); - y = Y_PART(5.1); - w = W_PART(11); - h = H_PART(1); - text = ""; - SizeEx = H_PART(1); - }; - class labelKey: ACE_gui_staticBase { //Variable Name - idc = 300; - x = X_PART(27.1); - y = Y_PART(6.2); - w = W_PART(11); - h = H_PART(1); - text = ""; - SizeEx = H_PART(0.65); - }; - class Label2: labelKey { - idc = 301; - y = Y_PART(7.3); - text = "$STR_ACE_OptionsMenu_Setting"; - SizeEx = H_PART(1); - }; - class comboBox1: ACE_gui_comboBoxBase { - idc = 400; - x = X_PART(31.1); - y = Y_PART(7.3); - w = W_PART(7); - h = H_PART(1); - onLBSelChanged = QUOTE( call FUNC(onListBoxSettingsChanged)); - SizeEx = H_PART(0.9); - }; - class sliderBar1: RscXSliderH { - idc = 410; - x = X_PART(27.1); - y = Y_PART(7.3); - w = W_PART(11); - h = H_PART(0.75); - onSliderPosChanged = QUOTE(_this call FUNC(onSliderPosChanged)); - color[] = {1,0,0,0.4}; - colorActive[] = {1,0,0,1}; - }; - class sliderBar2: sliderBar1 { - idc = 411; - y = Y_PART(8.2); - color[] = {0,1,0,0.4}; - colorActive[] = {0,1,0,1}; - }; - class sliderBar3: sliderBar1 { - idc = 412; - y = Y_PART(9.1); - color[] = {0,0,1,0.4}; - colorActive[] = {0,0,1,1}; - }; - class sliderBar4: sliderBar1 { - idc = 413; - y = Y_PART(10); - color[] = {1,1,1,0.4}; - colorActive[] = {1,1,1,1}; - }; - class labelDesc: ACE_gui_staticBase { - idc = 251; - x = X_PART(27.1); - y = Y_PART(11); - w = W_PART(11); - h = H_PART(11); - text = ""; - style = ST_LEFT + ST_MULTI; - lineSpacing = 1; - SizeEx = H_PART(0.8); - }; - class actionClose: ACE_gui_buttonBase { - idc = 10; - text = "$STR_DISP_CLOSE"; - x = X_PART(1); - y = Y_PART(22.3); - w = W_PART(7.5); - h = H_PART(1); - style = ST_LEFT; - animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.8)"; - animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.5)"; - animTextureOver = "#(argb,8,8,3)color(1,1,1,1)"; - animTextureFocused = "#(argb,8,8,3)color(1,1,1,1)"; - animTexturePressed = "#(argb,8,8,3)color(1,1,1,1)"; - animTextureDefault = "#(argb,8,8,3)color(1,1,1,1)"; - color[] = {1, 1, 1, 1}; - color2[] = {0,0,0, 1}; - colorBackgroundFocused[] = {1,1,1,1}; - colorBackground[] = {1,1,1,1}; - colorbackground2[] = {1,1,1,1}; - colorDisabled[] = {0.5,0.5,0.5,0.8}; - colorFocused[] = {0,0,0,1}; - periodFocus = 1; - periodOver = 1; - action = "closedialog 0;"; - SizeEx = H_PART(1); - Size = H_PART(1); - }; - class action_reset: actionClose { - idc = 1100; - text = "$STR_ACE_OptionsMenu_ResetAll"; - x = X_PART(9.5); - action = QUOTE([] call FUNC(resetSettings)); - }; - class action_exportServerConfig: actionClose { - idc = 1102; - text = "$STR_ACE_OptionsMenu_OpenExport"; - x = X_PART(18); - action = QUOTE(if (GVAR(serverConfigGeneration) > 0) then {createDialog 'ACE_serverSettingsMenu'; }); - }; - }; }; class ACE_serverSettingsMenu: ACE_settingsMenu { onLoad = QUOTE(uiNamespace setVariable [ARR_2('ACE_serverSettingsMenu', _this select 0)]; [] call FUNC(onServerSettingsMenuOpen);); onUnload = QUOTE(uiNamespace setVariable [ARR_2('ACE_serverSettingsMenu', nil)];); - class controls: controls { - class HeaderName { - idc = 1; - type = CT_STATIC; - x = X_PART(1); - y = Y_PART(1); - w = W_PART(38); - h = H_PART(1); - style = ST_LEFT + ST_SHADOW; - font = "PuristaMedium"; - SizeEx = H_PART(1); - colorText[] = {0.95, 0.95, 0.95, 0.75}; - colorBackground[] = {0,0,0,0}; - text = "$STR_ACE_OptionsMenu_OpenConfigMenu"; + class controls: controls { + class HeaderName { + idc = 1; + type = CT_STATIC; + x = X_PART(1); + y = Y_PART(1); + w = W_PART(38); + h = H_PART(1); + style = ST_LEFT + ST_SHADOW; + font = "PuristaMedium"; + SizeEx = H_PART(1); + colorText[] = {0.95, 0.95, 0.95, 0.75}; + colorBackground[] = {0,0,0,0}; + text = "$STR_ACE_OptionsMenu_OpenConfigMenu"; + }; + class labelSubHeader: ACE_gui_staticBase { + idc = 13; + x = X_PART(2); + y = Y_PART(3.4); + w = W_PART(30); + h = H_PART(1); + text = ""; + }; + class selectionAction_1: ACE_gui_buttonBase { + idc = 1000; + text = "$STR_ACE_OptionsMenu_TabOptions"; + x = X_PART(1); + y = Y_PART(2.1); + w = W_PART(9.5); + h = H_PART(1); + animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.9)"; + animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.8)"; + animTextureOver = "#(argb,8,8,3)color(1,1,1,1)"; + animTextureFocused = "#(argb,8,8,3)color(1,1,1,1)"; + animTexturePressed = "#(argb,8,8,3)color(1,1,1,1)"; + animTextureDefault = "#(argb,8,8,3)color(1,1,1,1)"; + color[] = {1, 1, 1, 1}; + color2[] = {0,0,0, 1}; + colorBackgroundFocused[] = {1,1,1,1}; + colorBackground[] = {1,1,1,1}; + colorbackground2[] = {1,1,1,1}; + colorDisabled[] = {1,1,1,1}; + colorFocused[] = {0,0,0,1}; + periodFocus = 1; + periodOver = 1; + action = QUOTE([MENU_TAB_SERVER_OPTIONS] call FUNC(onServerListBoxShowSelectionChanged);); + }; + class selectionAction_2: selectionAction_1 { + idc = 1001; + text = "$STR_ACE_OptionsMenu_TabColors"; + x = X_PART(10.5); + action = QUOTE([MENU_TAB_SERVER_COLORS] call FUNC(onServerListBoxShowSelectionChanged);); + }; + class selectionAction_3: selectionAction_1 { + idc = 1002; + text = "$STR_ACE_OptionsMenu_TabValues"; + x = X_PART(20); + action = QUOTE([MENU_TAB_SERVER_VALUES] call FUNC(onServerListBoxShowSelectionChanged);); + }; + class selectionAction_4: selectionAction_1 { + idc = 1003; + text = ""; + x = X_PART(29.5); + action = ""; + }; + class listBoxSettingsList: ACE_gui_listNBox { + idc = 200; + x = X_PART(2); + y = Y_PART(5.5); + w = W_PART(23); + h = H_PART(15); + SizeEx = H_ORIGINAL(0.8); + colorBackground[] = {0, 0, 0, 0.9}; + colorSelectBackground[] = {0, 0, 0, 0.9}; + columns[] = {0.0, 0.6}; + onLBSelChanged = QUOTE(_this call FUNC(serverSettingsMenuUpdateKeyView)); + }; + class labelTitle: ACE_gui_staticBase { + idc = 250; + x = X_PART(27.1); + y = Y_PART(5.1); + w = W_PART(11); + h = H_PART(1); + text = ""; + SizeEx = H_PART(1); + }; + class labelKey: ACE_gui_staticBase { //Variable Name + idc = 300; + x = X_PART(27.1); + y = Y_PART(6.2); + w = W_PART(11); + h = H_PART(1); + text = ""; + SizeEx = H_PART(0.65); + }; + class Label2: labelKey { + idc = 301; + y = Y_PART(7.3); + text = "$STR_ACE_OptionsMenu_Setting"; + SizeEx = H_PART(1); + }; + class comboBox1: ACE_gui_comboBoxBase { + idc = 400; + x = X_PART(31.1); + y = Y_PART(7.3); + w = W_PART(7); + h = H_PART(1); + onLBSelChanged = QUOTE( call FUNC(onListBoxSettingsChanged)); + SizeEx = H_PART(0.9); + }; + class sliderBar1: RscXSliderH { + idc = 410; + x = X_PART(27.1); + y = Y_PART(7.3); + w = W_PART(11); + h = H_PART(0.75); + onSliderPosChanged = QUOTE(_this call FUNC(onSliderPosChanged)); + color[] = {1,0,0,0.4}; + colorActive[] = {1,0,0,1}; + }; + class sliderBar2: sliderBar1 { + idc = 411; + y = Y_PART(8.2); + color[] = {0,1,0,0.4}; + colorActive[] = {0,1,0,1}; + }; + class sliderBar3: sliderBar1 { + idc = 412; + y = Y_PART(9.1); + color[] = {0,0,1,0.4}; + colorActive[] = {0,0,1,1}; + }; + class sliderBar4: sliderBar1 { + idc = 413; + y = Y_PART(10); + color[] = {1,1,1,0.4}; + colorActive[] = {1,1,1,1}; + }; + class inputField1: ACE_gui_editBase { + idc = 414; + x = X_PART(27.1); + y = Y_PART(7.3); + w = W_PART(11); + h = H_PART(0.75); + }; + class inputFieldTypeLabel: ACE_gui_staticBase { + idc = 415; + x = X_PART(27.1); + y = Y_PART(8.2); + w = W_PART(11); + h = H_PART(0.75); + text = ""; + style = ST_LEFT + ST_MULTI; + lineSpacing = 1; + SizeEx = H_PART(0.8); + }; + class saveInputButton: selectionAction_1 { + idc = 416; + text = "$STR_ACE_OptionsMenu_SaveInput"; + x = X_PART(27.1); + y = Y_PART(9.1); + w = W_PART(11); + h = H_PART(1); + action = QUOTE([] call FUNC(onServerSaveInputField);); + }; + class labelDesc: ACE_gui_staticBase { + idc = 251; + x = X_PART(27.1); + y = Y_PART(11); + w = W_PART(11); + h = H_PART(11); + text = ""; + style = ST_LEFT + ST_MULTI; + lineSpacing = 1; + SizeEx = H_PART(0.8); + }; + class actionClose; + class action_reset: actionClose { + idc = 1100; + text = "$STR_ACE_OptionsMenu_ResetAll"; + x = X_PART(26.1); + action = QUOTE([] call FUNC(serverResetSettings)); + }; + class action_exportServerConfig: actionClose { + idc = 1101; + text = "$STR_ACE_OptionsMenu_Export"; + x = X_PART(1); + action = QUOTE([] call FUNC(exportSettings)); + }; + class action_toggleIncludeClientSettings: actionClose { + idc = 1102; + text = "$STR_ACE_OptionsMenu_inClientSettings"; + x = X_PART(9); + action = QUOTE([] call FUNC(toggleIncludeClientSettings)); + }; }; - class labelSubHeader: ACE_gui_staticBase { - idc = 13; - x = X_PART(2); - y = Y_PART(3.4); - w = W_PART(30); - h = H_PART(1); - text = ""; - }; - class selectionAction_1: ACE_gui_buttonBase { - idc = 1000; - text = "$STR_ACE_OptionsMenu_TabOptions"; - x = X_PART(1); - y = Y_PART(2.1); - w = W_PART(9.5); - h = H_PART(1); - animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.9)"; - animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.8)"; - animTextureOver = "#(argb,8,8,3)color(1,1,1,1)"; - animTextureFocused = "#(argb,8,8,3)color(1,1,1,1)"; - animTexturePressed = "#(argb,8,8,3)color(1,1,1,1)"; - animTextureDefault = "#(argb,8,8,3)color(1,1,1,1)"; - color[] = {1, 1, 1, 1}; - color2[] = {0,0,0, 1}; - colorBackgroundFocused[] = {1,1,1,1}; - colorBackground[] = {1,1,1,1}; - colorbackground2[] = {1,1,1,1}; - colorDisabled[] = {1,1,1,1}; - colorFocused[] = {0,0,0,1}; - periodFocus = 1; - periodOver = 1; - action = QUOTE([MENU_TAB_SERVER_OPTIONS] call FUNC(onServerListBoxShowSelectionChanged);); - }; - class selectionAction_2: selectionAction_1 { - idc = 1001; - text = "$STR_ACE_OptionsMenu_TabColors"; - x = X_PART(10.5); - action = QUOTE([MENU_TAB_SERVER_COLORS] call FUNC(onServerListBoxShowSelectionChanged);); - }; - class selectionAction_3: selectionAction_1 { - idc = 1002; - text = "$STR_ACE_OptionsMenu_TabValues"; - x = X_PART(20); - action = QUOTE([MENU_TAB_SERVER_VALUES] call FUNC(onServerListBoxShowSelectionChanged);); - }; - class selectionAction_4: selectionAction_1 { - idc = 1003; - text = ""; - x = X_PART(29.5); - action = ""; - }; - class listBoxSettingsList: ACE_gui_listNBox { - idc = 200; - x = X_PART(2); - y = Y_PART(5.5); - w = W_PART(23); - h = H_PART(15); - SizeEx = H_PART(0.8); - colorBackground[] = {0, 0, 0, 0.9}; - colorSelectBackground[] = {0, 0, 0, 0.9}; - columns[] = {0.0, 0.6}; - onLBSelChanged = QUOTE(_this call FUNC(serverSettingsMenuUpdateKeyView)); - }; - class labelTitle: ACE_gui_staticBase { - idc = 250; - x = X_PART(27.1); - y = Y_PART(5.1); - w = W_PART(11); - h = H_PART(1); - text = ""; - SizeEx = H_PART(1); - }; - class labelKey: ACE_gui_staticBase { //Variable Name - idc = 300; - x = X_PART(27.1); - y = Y_PART(6.2); - w = W_PART(11); - h = H_PART(1); - text = ""; - SizeEx = H_PART(0.65); - }; - class Label2: labelKey { - idc = 301; - y = Y_PART(7.3); - text = "$STR_ACE_OptionsMenu_Setting"; - SizeEx = H_PART(1); - }; - class comboBox1: ACE_gui_comboBoxBase { - idc = 400; - x = X_PART(31.1); - y = Y_PART(7.3); - w = W_PART(7); - h = H_PART(1); - onLBSelChanged = QUOTE( call FUNC(onListBoxSettingsChanged)); - SizeEx = H_PART(0.9); - }; - class sliderBar1: RscXSliderH { - idc = 410; - x = X_PART(27.1); - y = Y_PART(7.3); - w = W_PART(11); - h = H_PART(0.75); - onSliderPosChanged = QUOTE(_this call FUNC(onSliderPosChanged)); - color[] = {1,0,0,0.4}; - colorActive[] = {1,0,0,1}; - }; - class sliderBar2: sliderBar1 { - idc = 411; - y = Y_PART(8.2); - color[] = {0,1,0,0.4}; - colorActive[] = {0,1,0,1}; - }; - class sliderBar3: sliderBar1 { - idc = 412; - y = Y_PART(9.1); - color[] = {0,0,1,0.4}; - colorActive[] = {0,0,1,1}; - }; - class sliderBar4: sliderBar1 { - idc = 413; - y = Y_PART(10); - color[] = {1,1,1,0.4}; - colorActive[] = {1,1,1,1}; - }; - class inputField1: ACE_gui_editBase { - idc = 414; - x = X_PART(27.1); - y = Y_PART(7.3); - w = W_PART(11); - h = H_PART(0.75); - }; - class inputFieldTypeLabel: ACE_gui_staticBase { - idc = 415; - x = X_PART(27.1); - y = Y_PART(8.2); - w = W_PART(11); - h = H_PART(0.75); - text = ""; - style = ST_LEFT + ST_MULTI; - lineSpacing = 1; - SizeEx = H_PART(0.8); - }; - class saveInputButton: selectionAction_1 { - idc = 416; - text = "$STR_ACE_OptionsMenu_SaveInput"; - x = X_PART(27.1); - y = Y_PART(9.1); - w = W_PART(11); - h = H_PART(1); - action = QUOTE([] call FUNC(onServerSaveInputField);); - }; - class labelDesc: ACE_gui_staticBase { - idc = 251; - x = X_PART(27.1); - y = Y_PART(11); - w = W_PART(11); - h = H_PART(11); - text = ""; - style = ST_LEFT + ST_MULTI; - lineSpacing = 1; - SizeEx = H_PART(0.8); - }; - class actionClose; - class action_reset: actionClose { - idc = 1100; - text = "$STR_ACE_OptionsMenu_ResetAll"; - x = X_PART(26.1); - action = QUOTE([] call FUNC(serverResetSettings)); - }; - class action_exportServerConfig: actionClose { - idc = 1101; - text = "$STR_ACE_OptionsMenu_Export"; - x = X_PART(1); - action = QUOTE([] call FUNC(exportSettings)); - }; - class action_toggleIncludeClientSettings: actionClose { - idc = 1102; - text = "$STR_ACE_OptionsMenu_inClientSettings"; - x = X_PART(9); - action = QUOTE([] call FUNC(toggleIncludeClientSettings)); - }; - }; }; From bdd34221507f8a3e8375935089da32153c3db8b0 Mon Sep 17 00:00:00 2001 From: esteldunedain Date: Thu, 16 Apr 2015 23:53:54 -0300 Subject: [PATCH 165/305] Allow to dynamically modify actions at runtime. An optional code entry called modifierFunction can be added. That code is called before evaluating the action, allowing to dynamically change the actions name, icon, etc --- .../functions/fnc_collectActiveActionTree.sqf | 7 +++++++ addons/interact_menu/functions/fnc_compileMenu.sqf | 6 ++++-- .../functions/fnc_compileMenuSelfAction.sqf | 6 ++++-- addons/interact_menu/functions/fnc_createAction.sqf | 12 ++++++++++-- 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf b/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf index 582fe750a8..6abcebf47e 100644 --- a/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf +++ b/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf @@ -22,6 +22,13 @@ private ["_target","_player","_fullPath","_activeChildren","_dynamicChildren","_ _target = _object; _player = ACE_player; +// Check if the function should be modified first +if !((_origActionData select 10) isEqualTo {}) then { + // It should, so make a copy and pass it to the modifierFunction + _origActionData = +_origActionData; + [_target, ACE_player, _origActionData select 6, _origActionData] call (_origActionData select 10); +}; + // Return nothing if the action itself is not active if !([_target, ACE_player, _origActionData select 6] call (_origActionData select 4)) exitWith { [] diff --git a/addons/interact_menu/functions/fnc_compileMenu.sqf b/addons/interact_menu/functions/fnc_compileMenu.sqf index baf8e1c272..7983c493e1 100644 --- a/addons/interact_menu/functions/fnc_compileMenu.sqf +++ b/addons/interact_menu/functions/fnc_compileMenu.sqf @@ -27,7 +27,7 @@ if !(isNil {missionNamespace getVariable [_actionsVarName, nil]}) exitWith {}; private "_recurseFnc"; _recurseFnc = { private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_selection", "_condition", "_showDisabled", - "_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_insertChildren"]; + "_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_insertChildren", "_modifierFunction"]; EXPLODE_1_PVT(_this,_actionsCfg); _actions = []; @@ -56,6 +56,7 @@ _recurseFnc = { _condition = _condition + format [QUOTE( && {[ARR_3(ACE_player, _target, %1)] call EFUNC(common,canInteractWith)} ), getArray (_entryCfg >> "exceptions")]; _insertChildren = compile (getText (_entryCfg >> "insertChildren")); + _modifierFunction = compile (getText (_entryCfg >> "modifierFunction")); _showDisabled = (getNumber (_entryCfg >> "showDisabled")) > 0; _enableInside = (getNumber (_entryCfg >> "enableInside")) > 0; @@ -76,7 +77,8 @@ _recurseFnc = { [], _selection, _distance, - [_showDisabled,_enableInside,_canCollapse,_runOnHover] + [_showDisabled,_enableInside,_canCollapse,_runOnHover], + _modifierFunction ], _children ]; diff --git a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf index 968b143701..0258b3dc8a 100644 --- a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf @@ -27,7 +27,7 @@ if !(isNil {missionNamespace getVariable [_actionsVarName, nil]}) exitWith {}; private "_recurseFnc"; _recurseFnc = { private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_selection", "_condition", "_showDisabled", - "_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_insertChildren"]; + "_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_insertChildren", "_modifierFunction"]; EXPLODE_1_PVT(_this,_actionsCfg); _actions = []; @@ -46,6 +46,7 @@ _recurseFnc = { _condition = _condition + format [QUOTE( && {[ARR_3(ACE_player, _target, %1)] call EFUNC(common,canInteractWith)} ), getArray (_entryCfg >> "exceptions")]; _insertChildren = compile (getText (_entryCfg >> "insertChildren")); + _modifierFunction = compile (getText (_entryCfg >> "modifierFunction")); _showDisabled = (getNumber (_entryCfg >> "showDisabled")) > 0; _enableInside = (getNumber (_entryCfg >> "enableInside")) > 0; @@ -66,7 +67,8 @@ _recurseFnc = { [], [0,0,0], 10, //distace - [_showDisabled,_enableInside,_canCollapse,_runOnHover] + [_showDisabled,_enableInside,_canCollapse,_runOnHover], + _modifierFunction ], _children ]; diff --git a/addons/interact_menu/functions/fnc_createAction.sqf b/addons/interact_menu/functions/fnc_createAction.sqf index 0b0030a1b4..fb3f05b7b5 100644 --- a/addons/interact_menu/functions/fnc_createAction.sqf +++ b/addons/interact_menu/functions/fnc_createAction.sqf @@ -14,6 +14,7 @@ * 7: Position (Position or Selection Name) or (Optional) * 8: Distance (Optional) * 9: Other parameters (Optional) + * 10: Modifier function (Optional) * * Return value: * Action @@ -27,7 +28,7 @@ EXPLODE_5_PVT(_this,_actionName,_displayName,_icon,_statement,_condition); -private ["_insertChildren","_customParams","_position","_distance","_params"]; +private ["_insertChildren","_customParams","_position","_distance","_params", "_modifierFunction"]; _insertChildren = if (count _this > 5) then { _this select 5 @@ -59,6 +60,12 @@ _params = if (count _this > 9) then { [false,false,false,false] }; +_modifierFunction = if (count _this > 10) then { + _this select 10 +} else { + {} +}; + [ _actionName, _displayName, @@ -70,5 +77,6 @@ _params = if (count _this > 9) then { _customParams, _position, _distance, - _params + _params, + _modifierFunction ] From 7d5a70246b6f352d9a25e1e69927bfa8d7484f68 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 16 Apr 2015 22:10:33 -0500 Subject: [PATCH 166/305] Remove unnecessary cfgSounds --- addons/logistics_wirecutter/CfgSounds.hpp | 7 ------- addons/logistics_wirecutter/config.cpp | 1 - 2 files changed, 8 deletions(-) delete mode 100644 addons/logistics_wirecutter/CfgSounds.hpp diff --git a/addons/logistics_wirecutter/CfgSounds.hpp b/addons/logistics_wirecutter/CfgSounds.hpp deleted file mode 100644 index aa5f3464f6..0000000000 --- a/addons/logistics_wirecutter/CfgSounds.hpp +++ /dev/null @@ -1,7 +0,0 @@ -class CfgSounds { - class ACE_Wirecutter_sound { - name = "ACE_wirecutter_sound"; - sound[] = {QUOTE(PATHTOF(sound\wirecut.ogg)), "db-0", 1}; - titles[] = {}; - }; -}; diff --git a/addons/logistics_wirecutter/config.cpp b/addons/logistics_wirecutter/config.cpp index 89fbd1c10f..d83cff4035 100644 --- a/addons/logistics_wirecutter/config.cpp +++ b/addons/logistics_wirecutter/config.cpp @@ -13,6 +13,5 @@ class CfgPatches { }; #include "CfgEventHandlers.hpp" -#include "CfgSounds.hpp" #include "CfgWeapons.hpp" #include "CfgVehicles.hpp" From 54daa02aa4dbd216d497eeba5d8955024eeeaa36 Mon Sep 17 00:00:00 2001 From: esteldunedain Date: Fri, 17 Apr 2015 01:44:38 -0300 Subject: [PATCH 167/305] Weather: headers + privates --- addons/weather/XEH_postInit.sqf | 2 ++ addons/weather/functions/fnc_displayWindInfo.sqf | 7 +++---- addons/weather/functions/fnc_getMapData.sqf | 1 - addons/weather/functions/fnc_getWind.sqf | 11 +++++++++++ addons/weather/functions/fnc_serverController.sqf | 11 +++++++++++ 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/addons/weather/XEH_postInit.sqf b/addons/weather/XEH_postInit.sqf index 75e1277fee..9276e710da 100644 --- a/addons/weather/XEH_postInit.sqf +++ b/addons/weather/XEH_postInit.sqf @@ -39,6 +39,7 @@ _fnc_updateWind = { // Update Rain _fnc_updateRain = { + private ["_oldStrength","_rainStrength","_transitionTime","_periodPosition","_periodPercent"]; if(GVAR(enableRain)) then { if(!isNil "ACE_RAIN_PARAMS" && {!isNil QGVAR(rain_period_start_time)}) then { _oldStrength = ACE_RAIN_PARAMS select 0; @@ -56,6 +57,7 @@ _fnc_updateRain = { // Update Temperature _fnc_updateTemperature = { + private ["_time","_month","_hourlyCoef","_avgTemperature","_pS1","_pS2"]; _time = daytime; _month = date select 1; diff --git a/addons/weather/functions/fnc_displayWindInfo.sqf b/addons/weather/functions/fnc_displayWindInfo.sqf index 61d556a27c..d84cddd106 100644 --- a/addons/weather/functions/fnc_displayWindInfo.sqf +++ b/addons/weather/functions/fnc_displayWindInfo.sqf @@ -1,6 +1,5 @@ /* * Author: Ruthberg - * * Displays a wind info (colored arrow) in the top left corner of the screen * * Argument: @@ -29,13 +28,13 @@ GVAR(WindInfo) = true; [{ private ["_windSpeed", "_windDir", "_playerDir", "_windIndex", "_windColor", "_newWindSpeed", "_windSource", "_height"]; - + if !(GVAR(WindInfo) && !(underwater ACE_player) && vehicle ACE_player == ACE_player) exitWith { GVAR(WindInfo) = false; 0 cutText ["", "PLAIN"]; [_this select 1] call cba_fnc_removePerFrameHandler; }; - + _windIndex = 12; _windColor = [1, 1, 1, 1]; @@ -46,7 +45,7 @@ GVAR(WindInfo) = true; } else { vectorMagnitude ACE_wind; }; - + if (_windSpeed > 0.2) then { _playerDir = getDir ACE_player; _windDir = (ACE_wind select 0) atan2 (ACE_wind select 1); diff --git a/addons/weather/functions/fnc_getMapData.sqf b/addons/weather/functions/fnc_getMapData.sqf index 86a05fb225..fecf9f34f7 100644 --- a/addons/weather/functions/fnc_getMapData.sqf +++ b/addons/weather/functions/fnc_getMapData.sqf @@ -1,6 +1,5 @@ /* * Author: Ruthberg, esteldunedain - * * Get the weather data for the current map * * Argument: diff --git a/addons/weather/functions/fnc_getWind.sqf b/addons/weather/functions/fnc_getWind.sqf index e25d53309d..b0fbf5e8fa 100644 --- a/addons/weather/functions/fnc_getWind.sqf +++ b/addons/weather/functions/fnc_getWind.sqf @@ -1,4 +1,15 @@ +/* + * Author: ACE2 Team + * Calculate current wind locally from the data broadcasted by the server + * + * Argument: + * None + * + * Return value: + * Wind + */ #include "script_component.hpp" +private ["_dir","_dirInc","_dirRange","_period","_periodPercent","_periodPosition","_return","_spd","_spdInc","_spdRange"]; _return = [0,0,0]; if(!isNil "ACE_WIND_PARAMS") then { diff --git a/addons/weather/functions/fnc_serverController.sqf b/addons/weather/functions/fnc_serverController.sqf index 7646475e81..e29836fc18 100644 --- a/addons/weather/functions/fnc_serverController.sqf +++ b/addons/weather/functions/fnc_serverController.sqf @@ -1,4 +1,15 @@ +/* + * Author: ACE2 Team, esteldunedain + * Calculate the wind and rain evolution on the server. Broadcast the current and next values to the clients + * + * Argument: + * None + * + * Return value: + * None + */ #include "script_component.hpp" +private ["_gustCount","_gustDir","_gustSpeed","_gustTime","_gusts","_i","_lastRain","_maxInterval","_rainOverCast","_startDir","_startSpeed","_time","_timeTillGust","_transitionTime"]; // Rain simulation if(GVAR(rain_period_count) > GVAR(rain_next_period)) then { From e38a6fc62bed074ec3ec399d327adfc9b5bf884a Mon Sep 17 00:00:00 2001 From: ruPaladin Date: Fri, 17 Apr 2015 12:01:01 +0300 Subject: [PATCH 168/305] one more russian fix --- addons/captives/stringtable.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/captives/stringtable.xml b/addons/captives/stringtable.xml index 5683eaf0d3..f609aabd93 100644 --- a/addons/captives/stringtable.xml +++ b/addons/captives/stringtable.xml @@ -95,7 +95,7 @@ Algema Plástica Fascietta Gyorskötöző - Пластиковые наручники + Кабельная стяжка Cable ties that allow you to restrain prisoners. @@ -107,7 +107,7 @@ A algema plástica permite que você contenha prisioneiros. Fascietta che ti consente di arrestare i prigionieri. Gyorskötöző, emberek foglyulejtéséhez használható. - Пластиковые наручники позволяют связывать пленников. + Кабельные стяжки позволяют связывать пленников. Inventory of frisked person From 20565e8b026a89789721feb49bad1f4bf0457ce5 Mon Sep 17 00:00:00 2001 From: commy2 Date: Fri, 17 Apr 2015 11:02:01 +0200 Subject: [PATCH 169/305] hide height / velocity while parachuting, freefallig in expert mode, fix 692 --- addons/parachute/XEH_postInit.sqf | 3 +- addons/parachute/XEH_preInit.sqf | 1 + .../fnc_handleInfoDisplayChanged.sqf | 41 +++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 addons/parachute/functions/fnc_handleInfoDisplayChanged.sqf diff --git a/addons/parachute/XEH_postInit.sqf b/addons/parachute/XEH_postInit.sqf index ead4b33943..2b449d9674 100644 --- a/addons/parachute/XEH_postInit.sqf +++ b/addons/parachute/XEH_postInit.sqf @@ -40,5 +40,4 @@ GVAR(PFH) = false; }] call EFUNC(common,addEventHandler); // don't show speed and height when in expert mode -["Parachute", {if (!cadetMode) then {_dlg = _this select 0; {(_dlg displayCtrl _x) ctrlShow false} forEach [121, 122, 1004, 1005, 1006, 1014];};}] call EFUNC(common,addInfoDisplayEventHandler); //@todo addEventHandler infoDisplayChanged with select 1 == "Parachute" -["Soldier", {if (!cadetMode) then {_dlg = _this select 0; {_ctrl = (_dlg displayCtrl _x); _ctrl ctrlSetPosition [0,0,0,0]; _ctrl ctrlCommit 0;} forEach [380, 382]};}] call EFUNC(common,addInfoDisplayEventHandler); //@todo addEventHandler infoDisplayChanged with select 1 == "Soldier" +["infoDisplayChanged", {_this call FUNC(handleInfoDisplayChanged)}] call EFUNC(common,addEventHandler); diff --git a/addons/parachute/XEH_preInit.sqf b/addons/parachute/XEH_preInit.sqf index 91c24606c6..f446d955b8 100644 --- a/addons/parachute/XEH_preInit.sqf +++ b/addons/parachute/XEH_preInit.sqf @@ -18,6 +18,7 @@ ADDON = false; PREP(doLanding); +PREP(handleInfoDisplayChanged); PREP(hideAltimeter); PREP(onEachFrame); PREP(showAltimeter); diff --git a/addons/parachute/functions/fnc_handleInfoDisplayChanged.sqf b/addons/parachute/functions/fnc_handleInfoDisplayChanged.sqf new file mode 100644 index 0000000000..9b076256dd --- /dev/null +++ b/addons/parachute/functions/fnc_handleInfoDisplayChanged.sqf @@ -0,0 +1,41 @@ +/* + * Author: commy2 + * Hides the height and velocity display while freefalling or parachuting on higher difficulties. + * + * Arguments: + * Stuff from infoDisplayChanged eventhandler. + * + * Return Value: + * None + * + * Public: No + */ +#include "script_component.hpp" + +private ["_dialog", "_type"]; + +_dialog = _this select 0; +_type = _this select 1; + +// don't do anything in noob mode +if (cadetMode) exitWith {}; + +switch (_type) do { + case ("Parachute"): { + { + (_dialog displayCtrl _x) ctrlShow false; + } forEach [121, 122, 1004, 1005, 1006, 1014]; + }; + + case ("Soldier"): { + { + private "_control"; + _control = (_dialog displayCtrl _x); + + // these reset ctrlShow every frame by the engine. Set height/width to 0 as work around. + _control ctrlSetPosition [0,0,0,0]; + _control ctrlCommit 0; + } forEach [380, 382]; + }; +}; +nil // switch might return true if no case was found. Just to make sure the return value matches From e04a0c438aa8441e4a01e958a2505c8135cfb7f5 Mon Sep 17 00:00:00 2001 From: ulteq Date: Fri, 17 Apr 2015 11:05:24 +0200 Subject: [PATCH 170/305] Fixed deprecated delete_gun function --- addons/atragmx/functions/fnc_delete_gun.sqf | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/addons/atragmx/functions/fnc_delete_gun.sqf b/addons/atragmx/functions/fnc_delete_gun.sqf index d16e1f84a0..be230da59a 100644 --- a/addons/atragmx/functions/fnc_delete_gun.sqf +++ b/addons/atragmx/functions/fnc_delete_gun.sqf @@ -20,10 +20,8 @@ _index = lbCurSel 6000; if (_index == -1) exitWith {}; -for "_i" from 0 to (count GVAR(currentGun)) - 1 do { - if ((GVAR(currentGun) select _i) > _index) then { - GVAR(currentGun) set [_i, (GVAR(currentGun) select _i) - 1]; - }; +if (GVAR(currentGun) > _index) then { + GVAR(currentGun) = GVAR(currentGun) - 1; }; GVAR(gunList) set [_index, 0]; From 8813315f365d42081d50b79724105d1a6df60c6f Mon Sep 17 00:00:00 2001 From: nomisum Date: Fri, 17 Apr 2015 11:40:31 +0200 Subject: [PATCH 171/305] added missing translations german --- addons/advanced_ballistics/stringtable.xml | 4 +++- addons/atragmx/stringtable.xml | 5 ++++- addons/interact_menu/stringtable.xml | 3 ++- addons/kestrel4500/stringtable.xml | 8 +++++++- addons/overheating/stringtable.xml | 3 ++- addons/scopes/stringtable.xml | 11 ++++++++++- addons/weather/stringtable.xml | 3 ++- 7 files changed, 30 insertions(+), 7 deletions(-) diff --git a/addons/advanced_ballistics/stringtable.xml b/addons/advanced_ballistics/stringtable.xml index 6890937a45..103256a722 100644 --- a/addons/advanced_ballistics/stringtable.xml +++ b/addons/advanced_ballistics/stringtable.xml @@ -9,6 +9,7 @@ Показать информацию о ветре Afficher les info du vent Mostrar información del viento + Windinformation anzeigen Show Protractor @@ -17,6 +18,7 @@ Показать транспортир Afficher le rapporteur Mostrar transportador + Winkelmesser anzeigen - + \ No newline at end of file diff --git a/addons/atragmx/stringtable.xml b/addons/atragmx/stringtable.xml index 1baa4fb38c..245e5d5f1c 100644 --- a/addons/atragmx/stringtable.xml +++ b/addons/atragmx/stringtable.xml @@ -19,18 +19,21 @@ Otwórz ATragMX Открыть ATragMX Abrir ATragMX + ATragMX öffnen Rugged PDA with ATragMX Przenośny PDA z kalkulatorem balistycznym ATragMX Защищенный КПК с ATragMX PDA rugerizada con ATragMX + Robuster PDA mit ATragMX Open ATragMX Otwórz ATragMX Открыть ATragMX Abrir ATragMX + ATragMX öffnen - + \ No newline at end of file diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index 98cac6116a..a926c98063 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -19,6 +19,7 @@ Afficher le menu d'interaction au format liste Mostra il menù di interazione come lista Wyświetlaj menu interakcji jako listę + Interaktionsmenü in Listen anzeigen Interact Key @@ -65,4 +66,4 @@ Interazioni con veicoli - + \ No newline at end of file diff --git a/addons/kestrel4500/stringtable.xml b/addons/kestrel4500/stringtable.xml index 4757159ff5..2703e34e9f 100644 --- a/addons/kestrel4500/stringtable.xml +++ b/addons/kestrel4500/stringtable.xml @@ -19,6 +19,7 @@ Карманная метеостанция Kestrel 4500NV Station météo portable Kestrel 4500 Kestrel 4500 Pocket Weather Tracker + Kestrel 4500 Taschenwettermessgerät Open Kestrel 4500 @@ -28,6 +29,7 @@ Ouvrir Kestrel 4500 Accendi Kestrel 4500 Abrir Kestrel 4500 + Kestrel 4500 öffnen Show Kestrel 4500 @@ -36,6 +38,7 @@ Afficher Kestrel 4500 Mostra Kestrel 4500 Mostrar Kestrel 4500 + Kestrel 4500 anzeigen Hide Kestrel 4500 @@ -44,6 +47,7 @@ Cacher Kestrel 4500 Nascondi Kestrel 4500 Esconder Kestrel 4500 + Kestrel 4500 wegstecken Open Kestrel 4500 @@ -52,6 +56,7 @@ Ouvrir Kestrel 4500 Accendi Kestrel 4500 Abrir Kestrel 4500 + Kestrel 4500 öffnen Show Kestrel 4500 @@ -60,6 +65,7 @@ Afficher Kestrel 4500 Mostra Kestrel 4500 Mostrar Kestrel 4500 + Kestrel 4500 anzeigen - + \ No newline at end of file diff --git a/addons/overheating/stringtable.xml b/addons/overheating/stringtable.xml index 4bb91688fa..89993dee62 100644 --- a/addons/overheating/stringtable.xml +++ b/addons/overheating/stringtable.xml @@ -137,6 +137,7 @@ Vérifier la température Fegyverhő ellenőrzése Проверить температуру оружия + Waffentemperatur prüfen Checking temperature ... @@ -163,4 +164,4 @@ Температура - + \ No newline at end of file diff --git a/addons/scopes/stringtable.xml b/addons/scopes/stringtable.xml index 4a06a779b5..a47f480bb8 100644 --- a/addons/scopes/stringtable.xml +++ b/addons/scopes/stringtable.xml @@ -6,54 +6,63 @@ Zerowanie powoli w górę Малая корректировка ВВЕРХ Ajuste menor arriba + Kleine Korrektur nach oben Minor adjustment down Zerowanie powoli w dół Малая корректировка ВНИЗ Ajuste menor abajo + Kleine Korrektur nach unten Minor adjustment right Zerowanie powoli w prawo Малая корректировка ВПРАВО Ajuste menor derecha + Kleine Korrektur nach rechts Minor adjustment left Zerowanie powoli w lewo Малая корректировка ВЛЕВО Ajuste menor izquierda + Kleine Korrektur nach links Major adjustment up Zerowanie w górę Большая корректировка ВВЕРХ Ajuste mayor arriba + Große Korrektur nach oben Major adjustment down Zerowanie w dół Большая корректировка ВНИЗ Ajuste mayor abajo + Große Korrektur nach unten Major adjustment right Zerowanie w prawo Большая корректировка ВПРАВО Ajuste mayor derecha + Große Korrektur nach rechts Major adjustment left Zerowanie w lewo Большая корректировка ВЛЕВО Ajuste mayor izquierda + Große Korrektur nach links Set zero adjustment Zresetuj wyzerowanie Сбросить корректировку Establecer ajuste a cero + Auf 0 justieren - + \ No newline at end of file diff --git a/addons/weather/stringtable.xml b/addons/weather/stringtable.xml index 060d9b6f51..e3cbaa02d4 100644 --- a/addons/weather/stringtable.xml +++ b/addons/weather/stringtable.xml @@ -7,6 +7,7 @@ Показать информацию о погоде Afficher information du vent Mostrar información del viento + Zeige Windinformationen - + \ No newline at end of file From d865e9c038641e7bfb48e0c9729395f64e67a7c1 Mon Sep 17 00:00:00 2001 From: nomisum Date: Fri, 17 Apr 2015 11:42:47 +0200 Subject: [PATCH 172/305] fixed typo --- addons/advanced_ballistics/stringtable.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/advanced_ballistics/stringtable.xml b/addons/advanced_ballistics/stringtable.xml index 103256a722..f92375986e 100644 --- a/addons/advanced_ballistics/stringtable.xml +++ b/addons/advanced_ballistics/stringtable.xml @@ -9,7 +9,7 @@ Показать информацию о ветре Afficher les info du vent Mostrar información del viento - Windinformation anzeigen + Windinformationen anzeigen Show Protractor From 45d639b395c5c843ced5babaaf3b3ee2414a2ad0 Mon Sep 17 00:00:00 2001 From: commy2 Date: Fri, 17 Apr 2015 12:28:06 +0200 Subject: [PATCH 173/305] disposable cleanup, fix #696 --- addons/disposable/CfgEventHandlers.hpp | 26 +++++------------------- addons/disposable/CfgMagazines.hpp | 1 + addons/disposable/XEH_postInit.sqf | 10 +++++++++ addons/disposable/XEH_postInitClient.sqf | 10 --------- 4 files changed, 16 insertions(+), 31 deletions(-) create mode 100644 addons/disposable/XEH_postInit.sqf delete mode 100644 addons/disposable/XEH_postInitClient.sqf diff --git a/addons/disposable/CfgEventHandlers.hpp b/addons/disposable/CfgEventHandlers.hpp index 02d0cb625f..4b5614f553 100644 --- a/addons/disposable/CfgEventHandlers.hpp +++ b/addons/disposable/CfgEventHandlers.hpp @@ -1,44 +1,28 @@ class Extended_PreInit_EventHandlers { class ADDON { - init = QUOTE( call COMPILE_FILE(XEH_preInit) ); + init = QUOTE(call COMPILE_FILE(XEH_preInit)); }; }; class Extended_PostInit_EventHandlers { class ADDON { - clientInit = QUOTE( call COMPILE_FILE(XEH_postInitClient) ); + init = QUOTE(call COMPILE_FILE(XEH_postInit)); }; }; class Extended_FiredBIS_EventHandlers { class CAManBase { class ADDON { - firedBIS = QUOTE( _this call FUNC(replaceATWeapon) ); + firedBIS = QUOTE(_this call FUNC(replaceATWeapon)); }; }; }; // handle preloaded missile -class Extended_Init_EventHandlers { +class Extended_InitPost_EventHandlers { class CAManBase { class ADDON { - init = QUOTE( _this call FUNC(takeLoadedATWeapon) ); - }; - }; -}; - -class Extended_Take_EventHandlers { - class CAManBase { - class ADDON { - take = QUOTE( _this call FUNC(takeLoadedATWeapon); [_this select 0] call FUNC(updateInventoryDisplay); ); - }; - }; -}; - -class Extended_Put_EventHandlers { - class CAManBase { - class ADDON { - put = QUOTE( [_this select 0] call FUNC(updateInventoryDisplay); ); + init = QUOTE([ARR_2(_this select 0, secondaryWeapon (_this select 0))] call FUNC(takeLoadedATWeapon); systemChat str [ARR_2(_this select 0, secondaryWeapon (_this select 0))]); }; }; }; diff --git a/addons/disposable/CfgMagazines.hpp b/addons/disposable/CfgMagazines.hpp index 8fbae08dfd..6265c06f50 100644 --- a/addons/disposable/CfgMagazines.hpp +++ b/addons/disposable/CfgMagazines.hpp @@ -3,6 +3,7 @@ class CfgMagazines { class ACE_PreloadedMissileDummy: NLAW_F { // The dummy magazine author = "$STR_ACE_Common_ACETeam"; scope = 1; + scopeArsenal = 1; displayName = "$STR_ACE_Disposable_PreloadedMissileDummy"; picture = PATHTOEF(common,UI\blank_CO.paa); weaponPoolAvailable = 0; diff --git a/addons/disposable/XEH_postInit.sqf b/addons/disposable/XEH_postInit.sqf new file mode 100644 index 0000000000..bc51974bc6 --- /dev/null +++ b/addons/disposable/XEH_postInit.sqf @@ -0,0 +1,10 @@ +// by commy2 +#include "script_component.hpp" + +if (!hasInterface) exitWith {}; + +["inventoryDisplayLoaded", {[ACE_player, _this select 0] call FUNC(updateInventoryDisplay)}] call EFUNC(common,addEventHandler); +["playerInventoryChanged", { + [_this select 0, _this select 1 select 11] call FUNC(takeLoadedATWeapon); + [_this select 0] call FUNC(updateInventoryDisplay); +}] call EFUNC(common,addEventHandler); diff --git a/addons/disposable/XEH_postInitClient.sqf b/addons/disposable/XEH_postInitClient.sqf deleted file mode 100644 index c20dfa886b..0000000000 --- a/addons/disposable/XEH_postInitClient.sqf +++ /dev/null @@ -1,10 +0,0 @@ -// by commy2 - -// The Arma InventoryOpened EH fires actually before the inventory dialog is opened (findDisplay 602 => displayNull). - -#include "script_component.hpp" - -["inventoryDisplayLoaded",{ - [ACE_player] call FUNC(takeLoadedATWeapon); - [ACE_player, (_this select 0)] call FUNC(updateInventoryDisplay); -}] call EFUNC(common,addEventHandler); \ No newline at end of file From 26944ea84e8eb07d81c9558cf110604e5d89edc7 Mon Sep 17 00:00:00 2001 From: commy2 Date: Fri, 17 Apr 2015 13:01:38 +0200 Subject: [PATCH 174/305] make altimeter actually usable with parachutes --- addons/parachute/XEH_postInit.sqf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/parachute/XEH_postInit.sqf b/addons/parachute/XEH_postInit.sqf index 2b449d9674..19e6d413a2 100644 --- a/addons/parachute/XEH_postInit.sqf +++ b/addons/parachute/XEH_postInit.sqf @@ -14,12 +14,13 @@ * Public: No */ #include "script_component.hpp" + if (!hasInterface) exitWith {}; ["ACE3", QGVAR(showAltimeter), localize "STR_ACE_Parachute_showAltimeter", { // Conditions: canInteract - if !([ACE_player, objNull, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, objNull, ["isNotEscorting", "isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; if (!('ACE_Altimeter' in assignedItems ace_player)) exitWith {false}; if (!(missionNamespace getVariable [QGVAR(AltimeterActive), false])) then { [ace_player] call FUNC(showAltimeter); From c2214efeb1c8175be8e37a8a55cd5bd9732ffacb Mon Sep 17 00:00:00 2001 From: EpMAK Date: Fri, 17 Apr 2015 14:54:28 +0300 Subject: [PATCH 175/305] Russian stringtables finished Filled all the missing lines, little errors fixed. --- addons/respawn/stringtable.xml | 6 ++++++ addons/vehiclelock/stringtable.xml | 6 +++--- addons/weaponselect/stringtable.xml | 4 ++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/addons/respawn/stringtable.xml b/addons/respawn/stringtable.xml index 409a149f83..dceeb687fe 100644 --- a/addons/respawn/stringtable.xml +++ b/addons/respawn/stringtable.xml @@ -45,31 +45,37 @@ Rallypoint West (Base) Sammelpunkt West (Basis) Punto de reunión Oeste (Base) + Точка сбора Синих (База) Rallypoint East (Base) Sammelpunkt Ost (Basis) Punto de reunión Este (Base) + Точка сбора Красных (База) Rallypoint Independent (Base) Sammelpunkt Widerstand (Basis) Punto de reunión Independiente (Base) + Точка сбора Независимых (База Rallypoint West Sammelpunkt West Punto de reunión Oeste + Точка сбора Синих Rallypoint East Sammelpunkt Ost Punto de reunión Este + Точка сбора Красных Rallypoint Independent Sammelpunkt Widerstand Punto de reunión Independiente + Точка сбора Независимых \ No newline at end of file diff --git a/addons/vehiclelock/stringtable.xml b/addons/vehiclelock/stringtable.xml index a327352f9b..6bf62bb671 100644 --- a/addons/vehiclelock/stringtable.xml +++ b/addons/vehiclelock/stringtable.xml @@ -79,7 +79,7 @@ Klucz, który powinien otworzyć większość pojazdów ZACHODU. Klíč který by měl otevřít většinou Západních vozidel. Egy kulcs, ami a NYUGAT egységeinek legtöbb járművét ki tudja nyitni. - Ключ для открытия большинства машин Запада. + Ключ для открытия большинства машин Красных. A key that should open most EAST vehicle. @@ -89,7 +89,7 @@ Klucz, który powinien otworzyć większość pojazdów WSCHODU. Egy kulcs, ami a KELET egységeinek legtöbb járművét ki tudja nyitni. Klíč který by měl otevřít vetšinu Východních vozidel. - Ключ для открытия большинства машин Востока. + Ключ для открытия большинства машин Синих. A key that should open most INDEP vehicle. @@ -112,4 +112,4 @@ Ключ для открытия большинства машин Гражданских. - + \ No newline at end of file diff --git a/addons/weaponselect/stringtable.xml b/addons/weaponselect/stringtable.xml index d534ecd29b..ae99f3e032 100644 --- a/addons/weaponselect/stringtable.xml +++ b/addons/weaponselect/stringtable.xml @@ -229,7 +229,7 @@ Už nejsou granáty Não há granadas de fragmentação restantes Nessuna granata a frammentazione rimanente - Осколочныких гранат нет + Осколочных гранат нет No misc. grenades left @@ -266,4 +266,4 @@ Запустить дымовую завесу - + \ No newline at end of file From af876e337018b9ecc1e97bbe012e464449fef81f Mon Sep 17 00:00:00 2001 From: ruPaladin Date: Fri, 17 Apr 2015 15:27:53 +0300 Subject: [PATCH 176/305] attach --- addons/attach/stringtable.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/attach/stringtable.xml b/addons/attach/stringtable.xml index db98c4fffc..fc419148f8 100644 --- a/addons/attach/stringtable.xml +++ b/addons/attach/stringtable.xml @@ -189,7 +189,7 @@ %1<br/>Acoplada %1<br/>attaccata %1<br/>hozzácsatolva - %1<br/>присоединена + %1<br/>присоединен(-а) %1<br/>Detached @@ -201,7 +201,7 @@ %1<br/>Separada %1<br/>staccata %1<br/>lecsatolva - %1<br/>отсоединена + %1<br/>отсоединен(-а) From b80ec3f7905bb11a0692b84ee86b67b50bc267de Mon Sep 17 00:00:00 2001 From: ruPaladin Date: Fri, 17 Apr 2015 15:57:25 +0300 Subject: [PATCH 177/305] ballistics russian fixes + multilanguage fix --- addons/ballistics/stringtable.xml | 90 +++++++++++++++++++++++++++++-- 1 file changed, 87 insertions(+), 3 deletions(-) diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index c95da8d760..cfe91258d5 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -445,6 +445,7 @@ Taśma .338 NM 130rd Smugacz Bande .338 NM 130Cps Traçante Cinta de 130 balas trazadoras de .338 NM + Лента из 130-ти .338 NM трассирующих .338 NM Tracer @@ -453,6 +454,7 @@ .338 NM Svítící .338 NM Traçante .338 NM trazadora + .338 NM трассирующие Caliber: .338 Norma Magnum Tracer<br />Rounds: 130<br />Used in: SPMG @@ -460,6 +462,7 @@ Kaliber: .338 Norma Magnum Smugacz<br />Pociski: 130<br />Używany w: SPMG Calibre: .338 Norma Magnum Traçante<br />Cartouches: 130<br />Utilisé dans: SPMG Calibre: .338 Norma Magnum trazadora<br />Balas: 130<br />Se usa en: SPMG + Калибр: .338 Norma Magnum трассирующие<br />Патронов: 130<br />Применимы в: SPMG .338 NM 130Rnd IR-DIM Belt @@ -467,6 +470,7 @@ Taśma .338 NM 130rd IR-DIM Bande .338 NM 130Cps IR-DIM Cinta de 130 balas IR-DIM de .338 NM + Лента из 130-ти .338 NM трассирующих под ПНВ .338 NM IR-DIM @@ -475,6 +479,7 @@ .338 NM IR-DIM .338 NM IR-DIM .338 NM IR-DIM + .338 NM трассирующих под ПНВ Caliber: .338 Norma Magnum Tracer IR-DIM<br />Rounds: 130<br />Used in: SPMG @@ -482,6 +487,7 @@ Kaliber: .338 Norma Magnum Smugacz IR-DIM<br />Pociski: 130<br />Używany w: SPMG Calibre: .338 Norma Magnum Traçante IR-DIM<br />Cartouches: 130<br />Utilisé dans: SPMG Calibre: .338 Norma Magnum trazadora IR-DIM<br />Balas: 130<br />Se usa en: SPMG + Калибр: .338 Norma Magnum трассирующие под ПНВ<br />Патронов: 130<br />Применимы в: SPMG .338 NM 130Rnd AP Belt @@ -489,6 +495,7 @@ Taśma .338 NM 130rd AP Bande .338 NM 130Cps AP Cinta de 130 balas AP de .338 NM + Лента из 130-ти .338 NM бронебойных .338 NM AP @@ -497,6 +504,7 @@ .338 NM AP .338 NM AP .338 NM AP + .338 NM бронебойные Caliber: .338 Norma Magnum AP<br />Rounds: 130<br />Used in: SPMG @@ -504,6 +512,7 @@ Kaliber: .338 Norma Magnum AP<br />Pociski: 130<br />Używane w: SPMG Calibre: .338 Norma Magnum AP<br />Cartouches: 130<br />Utilisé dans: SPMG Calibre: .338 Norma Magnum AP<br />Balas: 130<br />Se usa en: SPMG + Калибр: .338 Norma Magnum бронебойные<br />Патронов: 130<br />Применимы в: SPMG @@ -512,6 +521,7 @@ Magazynek 9.3mm 10rd Smugacz Chargeur 9.3mm 10Cps Traçante Cargador de 10 balas trazadoras de 9.3mm + Магазин из 10-ти 9.3 мм трассирующих 9.3mm Tracer @@ -520,6 +530,7 @@ 9.3mm Svítící 9.3mm Traçante 9.3mm trazadora + 9.3 мм трассирующие Caliber: 9.3x64mm Tracer<br />Rounds: 10<br />Used in: Cyrus @@ -527,6 +538,7 @@ Kaliber: 9,3x64 mm Smugacz<br />Pociski: 10<br />Używany w: Cyrus Calibre: 9.3x64mm Traçante<br />Cartouches: 10<br />Utilisé dans: Cyrus Calibre: 9.3x64mm trazadora<br />Balas: 10<br />Se usa en: Cyrus + Калибр: 9.3x64 мм трассирующие<br />Патронов: 10<br />Применимы в: Cyrus 9.3mm 10Rnd Tracer IR-DIM Mag @@ -534,6 +546,7 @@ Magazynek 9,3mm 10rd Smugacz IR-DIM Chargeur 9.3mm 10Cps Traçante IR-DIM Cargador de 10 balas trazadoras IR-DIM de 9.3mm + Магазин из 10-ти 9.3 мм трассирующих под ПНВ 9.3mm IR-DIM @@ -542,6 +555,7 @@ 9.3mm IR-DIM 9.3mm IR-DIM 9.3mm IR-DIM + 9.3 мм трассирующие под ПНВ Caliber: 9.3x64mm Tracer IR-DIM<br />Rounds: 10<br />Used in: Cyrus @@ -549,6 +563,7 @@ Kaliber: 9,3x64 mm Smugacz IR-DIM<br />Pociski: 10<br />Używany w: Cyrus Calibre: 9.3x64mm Traçante IR-DIM<br />Cartouches: 10<br />Utilisé dans: Cyrus Calibre: 9.3x64mm trazadora IR-DIM<br />Balas: 10<br />Se usa en: Cyrus + Калибр: 9.3x64 мм трассирующие под ПНВ<br />Патронов: 10<br />Применимы в: Cyrus 9.3mm 10Rnd AP Mag @@ -556,6 +571,7 @@ Magazynek 9,3mm 10rd AP Chargeur 9.3mm 10Cps AP Cargador de 10 balas AP de 9.3mm + Магазин из 10-ти 9.3 мм бронебойных 9.3mm AP @@ -564,6 +580,7 @@ 9.3mm AP 9.3mm AP 9.3mm AP + 9.3 мм бронебойные Caliber: 9.3x64mm AP<br />Rounds: 10<br />Used in: Cyrus @@ -571,6 +588,7 @@ Kaliber: 9,3x64 mm AP<br />Pociski: 10<br />Używany w: Cyrus Calibre: 9.3x64mm AP<br />Cartouches: 10<br />Utilisé dans: Cyrus Calibre: 9.3x64mm AP<br />Balas: 10<br />Se usa en: Cyrus + Калибр: 9.3x64 мм бронебойные<br />Патронов: 10<br />Применимы в: Cyrus @@ -579,6 +597,7 @@ Taśma 9,3mm 150rd Smugacz Bande 9.3mm 150Cps Traçante Cinta de 150 balas trazadoras de 9.3mm + Лента из 150-ти 9.3 мм трассирующих 9.3mm Tracer @@ -587,6 +606,7 @@ 9.3mm Svítící 9.3mm Traçante 9.3mm trazadora + 9.3 мм трассирующие Caliber: 9.3x64mm Tracer<br />Rounds: 150<br />Used in: Navid @@ -594,6 +614,7 @@ Kaliber: 9,3x64 mm Smugacz<br />Pociski: 150<br />Używane w: Navid Calibre: 9.3x64mm Traçante<br />Cartouches: 150<br />Utilisé dans: Navid Calibre: 9.3x64mm trazadora<br />Balas: 150<br />Se usa en: Navid + Калибр: 9.3x64 мм трассирующие<br />Патронов: 150<br />Применимы в: Navid 9.3mm 150Rnd Tracer IR-DIM Belt @@ -601,6 +622,7 @@ Taśma 9,3mm 150rd Smugacz IR-DIM Bande 9.3mm 150Cps Traçante IR-DIM Cinta de 150 balas trazadoras IR-DIM de 9.3mm + Лента из 150-ти 9.3 мм трассирующих под ПНВ 9.3mm IR-DIM @@ -609,6 +631,7 @@ 9.3mm IR-DIM 9.3mm IR-DIM 9.3mm IR-DIM + 9.3 мм трассирующие под ПНВ Caliber: 9.3x64mm Tracer IR-DIM<br />Rounds: 150<br />Used in: Navid @@ -616,6 +639,7 @@ Kaliber: 9,3x64 mm Smugacz IR-DIM<br />Pociski: 150<br />Używane w: Navid Calibre: 9.3x64mm Traçante IR-DIM<br />Cartouches: 150<br />Utilisé dans: Navid Calibre: 9.3x64mm trazadora IR-DIM<br />Balas: 150<br />Se usa en: Navid + Калибр: 9.3x64 мм трассирующие под ПНВ<br />Патронов: 150<br />Применимы в: Navid 9.3mm 150Rnd AP Belt @@ -623,6 +647,7 @@ Taśma 9,3mm 150rd AP Bande 9.3mm 150Cps AP Cinta de 150 balas AP de 9.3mm + Лента из 150-ти 9.3 мм бронебойных 9.3mm AP @@ -631,6 +656,7 @@ 9.3mm AP 9.3mm AP 9.3mm AP + 9.3 мм бронебойные Caliber: 9.3x64mm AP<br />Rounds: 150<br />Used in: Navid @@ -638,333 +664,391 @@ Kaliber: 9,3x64 mm AP<br />Pociski: 150<br />Używane w: Navid Calibre: 9.3x64mm AP<br />Cartouches: 150<br />Utilisé dans: Navid Calibre: 9.3x64mm AP<br />Balas: 150<br />Se usa en: Navid + Калибр: 9.3x64 мм бронебойные<br />Патронов: 150<br />Применимы в: Navid 9x19mm 16Rnd Mag Magazynek 9x19mm 16rd Chargeur 9x19mm 16Cps Cargador de 16 balas de 9x19mm + Магазин из 16-ти 9x19 мм патронов 9x19mm 9x19mm 9x19mm 9x19mm + 9x19 мм патрон - 9x19mm 30Rnd Mag + 9x19mm 16Rnd Mag Magazynek 9x19mm 16rd - 9x19mm 30Cps + 9x19mm 16Cps Cargador de 16 balas de 9x19mm + Магазин из 16-ти 9x19 мм патронов 9x19mm 30Rnd Mag Magazynek 9x19mm 30rd 9x19mm 30Cps Cargador de 30 balas de 9x19mm + Магазин из 30-ти 9x19 мм патронов 9x19mm 9x19mm 9x19mm 9x19mm + 9x19 мм патрон 9x19mm 30Rnd Mag Magazynek 9x19mm 30rd 9x19mm 30Cps Cargador de 30 balas de 9x19mm + Магазин из 30-ти 9x19 мм патронов 7.62x54mm 10Rnd Tracer IR-DIM Mag Magazynek 7,62x54 mm 10rd Smugacz IR-DIM Chargeur 7.62x54mm 10Rnd Traçante IR-DIM Cargador de 10 balas trazadoras IR-DIM de 7.62x54mm + Магазин из 10-ти 7.62x54 мм трассирующих под ПНВ 7.62mm IR-DIM 7,62mm IR-DIM 7.62mm IR-DIM 7.62mm IR-DIM + 7.62x54 мм трассирующие под ПНВ 7.62x54mm 10Rnd Tracer IR-DIM Mag Magazynek 7,62x54 mm 10rd Smugacz IR-DIM Chargeur 7.62x54mm 10Cps Traçante IR-DIM Cargador de 10 balas trazadoras IR-DIM de 7.62x54mm + Магазин из 10-ти 7.62x54 мм трассирующих под ПНВ 6.5mm 100Rnd Tracer IR-DIM Mag Magazynek 6,5mm 100rd Smugacz IR-DIM Chargeur 6.5mm 100Rnd Traçante IR-DIM Cargador de 100 balas trazadoras IR-DIM de 6.5mm + Магазин из 100-та 6.5 мм трассирующих под ПНВ 6.5mm IR-DIM 6,5mm IR-DIM 6.5mm IR-DIM 6.5mm IR-DIM + 6.5 мм трассирующие под ПНВ 6.5mm 100Rnd Tracer IR-DIM Mag Magazynek 6,5mm 100rd Smugacz IR-DIM Chargeur 6.5mm 100Rnd Traçante IR-DIM Cargador de 100 balas trazadoras IR-DIM de 6.5mm + Магазин из 100-та 6.5 мм трассирующих под ПНВ 6.5mm 200Rnd Tracer IR-DIM Belt Magazynek 6,5mm 200rd Smugacz IR-DIM Bande 6.5mm 200Rnd Traçante IR-DIM Cinta de 200 balas trazadoras IR-DIM de 6.5mm + Лента из 200-от 6.5 мм трассирующих под ПНВ 6.5mm IR-DIM 6,5mm IR-DIM 6.5mm IR-DIM 6.5mm IR-DIM + 6.5 мм трассирующие под ПНВ 6.5mm 200Rnd Tracer IR-DIM Belt Magazynek 6,5mm 200rd Smugacz IR-DIM Bande 6.5mm 200Cps Traçante IR-DIM Cinta de 200 balas trazadoras IR-DIM de 6.5mm + Лента из 200-от 6.5 мм трассирующих под ПНВ 5.56mm 30Rnd Mag (Mk262) Magazynek 5,56mm 30rd Mk262 5.56mm 30Cps (Mk262) Cargador de 30 balas de 5.56mm (Mk262) + Магазин из 30-ти 5.56 мм (Mk262) 5.56mm Mk262 5,56mm Mk262 5.56mm Mk262 5.56mm (Mk262) + 5.56 мм (Mk262) патрон Caliber: 5.56x45 mm NATO (Mk262)<br />Rounds: 30 Kaliber: 5,56x45 mm NATO (Mk262)<br />Pociski: 30 Calibre: 5.56x45 mm NATO (Mk262)<br />Cartouches: 30 Calibre: 5.56x45 mm NATO (Mk262)<br />Balas: 30 + Калибр: 5.56x45 мм НАТО (Mk262)<br />Патронов: 30 5.56mm 30Rnd Mag (Mk318) Magazynek 5,56mm 30rd Mk318 5.56mm 30Cps (Mk318) Cargador de 30 balas de 5.56mm (Mk318) + Магазин из 30-ти 5.56 мм (Mk318) 5.56mm Mk318 5,56mm Mk318 5.56mm Mk318 5.56mm (Mk318) + 5.56 мм (Mk318) патрон Caliber: 5.56x45 mm NATO (Mk318)<br />Rounds: 30 Kaliber: 5,56x45 mm NATO (Mk318)<br />Pociski: 30 Calibre: 5.56x45 mm NATO (Mk318)<br />Cartouches: 30 Calibre: 5.56x45 mm NATO (Mk318)<br />Balas: 30 + Калибр: 5.56x45 мм НАТО (Mk318)<br />Патронов: 30 7.62mm 10Rnd Mag (M118LR) Magazynek 7,62mm 10rd (M118LR) 7.62mm 10Cps (M118LR) Cargador de 10 balas de 7.62mm (M118LR) + Магазин из 10-ти 7.62 мм (M118LR) 7.62mm M118LR 7,62mm M118LR 7.62mm M118LR 7.62mm (M118LR) + 7.62 мм (M118LR) патрон Caliber: 7.62x51 mm NATO (M118LR)<br />Rounds: 10 Kaliber: 7,62x51 mm NATO (M118LR)<br />Pociski: 10 Calibre: 7.62x51 mm NATO (M118LR)<br />Cartouches: 10 Calibre: 7.62x51 mm NATO (M118LR)<br />Balas: 10 + Калибр: 7.62x51 мм НАТО (M118LR)<br />Патронов: 10 7.62mm 20Rnd Mag (M118LR) Magazynek 7,62mm 20rd (M118LR) 7.62mm 20Cps (M118LR) Cargador de 20 balas de 7.62mm (M118LR) + Магазин из 20-ти 7.62 мм (M118LR) 7.62mm M118LR 7,62mm M118LR 7.62mm M118LR 7.62mm (M118LR) + 7.62 мм (M118LR) патрон Caliber: 7.62x51 mm NATO (M118LR)<br />Rounds: 20 Kaliber: 7,62x51 mm NATO (M118LR)<br />Pociski: 20 Calibre: 7.62x51 mm NATO (M118LR)<br />Cartouches: 20 Calibre: 7.62x51 mm NATO (M118LR)<br />Balas: 20 + Калибр: 7.62x51 мм НАТО (M118LR)<br />Патронов: 20 7.62mm 10Rnd Mag (Mk319 Mod 0) Magazynek 7,62mm 10rd (Mk319 Mod 0) 7.62mm 10Cps (Mk319 Mod 0) Cargador de 10 balas de 7.62mm (Mk319 Mod 0) + Магазин из 10-ти 7.62 мм (Mk319 Mod 0) 7.62mm Mk319 7,62mm Mk319 7.62mm Mk319 7.62mm Mk319 + 7.62 мм Mk319 патрон Caliber: 7.62x51 mm NATO (Mk319 Mod 0)<br />Rounds: 10 Kaliber: 7,62x51 mm NATO (Mk319 Mod 0)<br />Pociski: 10 Calibre: 7.62x51 mm NATO (Mk319 Mod 0)<br />Cartouches: 10 Calibre: 7.62x51 mm NATO (Mk319 Mod 0)<br />Balas: 10 + Калибр: 7.62x51 мм НАТО (Mk319 Mod 0)<br />Патронов: 10 7.62mm 20Rnd Mag (Mk319 Mod 0) Magazynek 7,62mm 20rd (Mk319 Mod 0) 7.62mm 20Cps (Mk319 Mod 0) Cargador de 20 balas de 7.62mm (Mk319 Mod 0) + Магазин из 20-ти 7.62 мм (Mk319 Mod 0) 7.62mm Mk319 7,62mm Mk319 7.62mm Mk319 7.62mm Mk319 + 7.62 мм Mk319 патрон Caliber: 7.62x51 mm NATO (Mk319 Mod 0)<br />Rounds: 20 Kaliber: 7,62x51 mm NATO (Mk319 Mod 0)<br />Pociski: 20 Calibre: 7.62x51 mm NATO (Mk319 Mod 0)<br />Cartouches: 20 Calibre: 7.62x51 mm NATO (Mk319 Mod 0)<br />Balas: 20 + Калибр: 7.62x51 мм НАТО (Mk319 Mod 0)<br />Патронов: 20 7.62mm 20Rnd Mag (Mk248 Mod 0) Magazynek 7,62mm 20rd (Mk248 Mod 0) 7.62mm 20Cps (Mk248 Mod 0) Cargador de 20 balas de 7.62mm (Mk248 Mod 0) + Магазин из 20-ти 7.62 мм (Mk248 Mod 0) 7.62mm (Mk248 Mod 0) 7,62mm (Mk248 Mod 0) 7.62mm (Mk248 Mod 0) 7.62mm (Mk248 Mod 0) + 7.62 мм (Mk248 Mod 0) патрон Caliber: 7.62x67 mm NATO (Mk248 Mod 0)<br />Rounds: 20 Kaliber: 7,62x67 mm NATO (Mk248 Mod 0)<br />Pociski: 20 Calibre: 7.62x67mm NATO (Mk248 Mod 0)<br />Cartouches: 20 Calibre: 7.62x67 mm NATO (Mk248 Mod 0)<br />Balas: 20 + Калибр: 7.62x67 мм НАТО (Mk248 Mod 0)<br />Патронов: 20 7.62mm 20Rnd Mag (Mk248 Mod 1) Magazynek 7,62mm 20rd (Mk248 Mod 1) 7.62mm 20Cps (Mk248 Mod 1) Cargador de 20 balas de 7.62mm (Mk248 Mod 1) + Магазин из 20-ти 7.62 мм (Mk248 Mod 1) 7.62mm (Mk248 Mod 1) 7,62mm (Mk248 Mod 1) 7.62mm (Mk248 Mod 1) 7.62mm (Mk248 Mod 1) + 7.62 мм (Mk248 Mod 1) патрон Caliber: 7.62x67 mm NATO (Mk248 Mod 1)<br />Rounds: 20 Kaliber: 7,62x67 mm NATO (Mk248 Mod 1)<br />Pociski: 20 Calibre: 7.62x67mm NATO (Mk248 Mod 1)<br />Cartouches: 20 Calibre: 7.62x67 mm NATO (Mk248 Mod 1)<br />Balas: 20 + Калибр: 7.62x67 мм НАТО (Mk248 Mod 1)<br />Патронов: 20 7.62mm 20Rnd Mag (Berger Hybrid OTM) Magazynek 7,62mm 20rd (Berger Hybrid OTM) 7.62 20Cps (Berger Hybrid OTM) Cargador de 20 balas de 7.62mm (Berger Hybrid OTM) + Магазин из 20-ти 7.62 мм (Berger Hybrid OTM) 7.62mm (OTM) 7,62mm (OTM) 7.62mm (OTM) 7.62mm (OTM) + 7.62 мм (OTM) патрон Caliber: 7.62x67 mm NATO (Berger Hybrid OTM)<br />Rounds: 20 Kaliber: 7,62x67 mm NATO (Berger Hybrid OTM)<br />Pociski: 20 Calibre: 7.62x67mm NATO (Berger Hybrid OTM)<br />Cartouches: 20 Calibre: 7.62x67 mm NATO (Berger Hybrid OTM)<br />Balas: 20 + Калибр: 7.62x67 мм НАТО (Berger Hybrid OTM)<br />Патронов: 20 6.5x47mm 30Rnd Mag (HPBT Scenar) 6.5x47mm 30Cps (HPBT Scenar) Cargador de 30 balas de 6.5x47mm (HPBT Scenar) + Магазин из 30-ти 6.5x47 мм (HPBT Scenar) 6.5mm Scenar 6.5mm Scenar 6.5mm Scenar + 6.5 мм (Scenar) патрон Caliber: 6.5x47mm (HPBT Scenar)<br />Rounds: 30 Calibre: 6.5x47mm (HPBT Scenar)<br />Cartouches: 30 Calibre: 6.5x47mm (HPBT Scenar)<br />Balas: 30 + Калибр: 6.5x47 мм (HPBT Scenar)<br />Патронов: 30 .338 10Rnd Mag (300gr Sierra MatchKing HPBT) .338 10 Cps (300gr Sierra MatchKing HPBT) Cargador de 10 balas de 8.6x70mm (300gr Sierra MatchKing HPBT) + Магазин из 10-ти .338 (300gr Sierra MatchKing HPBT) .338 (HPBT) .338 (HPBT) .338 (HPBT) + .338 (HPBT) патрон Caliber: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />Rounds: 10 Calibre: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />Cartouches: 10 Calibre: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />Balas: 10 + Калибр: .338 (300gr Sierra MatchKing HPBT)<br />Патронов: 10 .338 10Rnd Mag (API526) .338 10Cps (API526) Cargador de 10 balas de .338 (API526) + Магазин из 10-ти .338 (API526) .338 AP .338 AP .338 AP + .338 бронебойные Caliber: 8.6x70mm (API526)<br />Rounds: 10 Calibre: 8.6x70mm (API526)<br />Cartouches: 10 Calibre: 8.6x70mm (API526)<br />Balas: 10 + Калибр: .338 (API526)<br />Патронов: 10 12.7x99mm 5Rnd Mag 12.7x99mm 5Cps Cargador de 5 balas de 12.7x99mm + Магазин из 5-ти 12.7x99 мм патронов 12.7mm 12.7mm 12.7mm + 12.7x99 мм патрон Caliber: 12.7x99mm<br />Rounds: 5 Calibre: 12.7x99mm<br />Cartouches: 5 Calibre: 12.7x99mm<br />Balas: 5 + Калибр: 12.7x99 мм<br />Патронов: 5 12.7x99mm 5Rnd Mag (AMAX) 12.7x99mm 5Rnd Mag (AMAX) Cargador de 5 balas de 12.7x99mm (AMAX) + Магазин из 5-ти 12.7x99 мм (AMAX) 12.7mm 12.7mm 12.7mm + 12.7x99 мм (AMAX) Caliber: 12.7x99mm (AMAX)<br />Rounds: 5 Calibre: 12.7x99mm (AMAX)<br />Cartouches: 5 Calibre: 12.7x99mm (AMAX)<br />Balas: 5 + Калибр: 12.7x99 мм (AMAX)<br />Патронов: 5 - \ No newline at end of file + From 766321224b5d783b30daf9e4125df54d179c0975 Mon Sep 17 00:00:00 2001 From: ruPaladin Date: Fri, 17 Apr 2015 15:59:29 +0300 Subject: [PATCH 178/305] hearing --- addons/hearing/stringtable.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/hearing/stringtable.xml b/addons/hearing/stringtable.xml index f57bc2545a..20466db84d 100644 --- a/addons/hearing/stringtable.xml +++ b/addons/hearing/stringtable.xml @@ -31,7 +31,7 @@ Poner tapones Włóż stopery Dát špunty do uší - Беруши надеты + Надеть беруши Bouchons mis Füldugó berakva Protetores colocados @@ -43,7 +43,7 @@ Quitar tapones Wyjmij stopery Vyndat špunty z uší - Беруши сняты + Снять беруши Bouchons enlevés Füldugó kivéve Protetores retirados From a6e0cac734960ebd205cc0e2f9dfa13b31287240 Mon Sep 17 00:00:00 2001 From: ruPaladin Date: Fri, 17 Apr 2015 16:02:46 +0300 Subject: [PATCH 179/305] interact_menu (fixes to prevent text overlapping) --- addons/interact_menu/stringtable.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index 98cac6116a..ad1263b38c 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -5,7 +5,7 @@ Always display cursor for self interaction Immer den Cursor für Selbst-Interaktionen anzeigen. Mostrar siempre el cursor para la interacción propia - Всегда показывать курсор для взаимодействия с собой + Показывать курсор (взаимодействия с собой) Zobrazit kurzor v menu pro vlastní interakci Zawsze wyświetlaj kursor dla własnej interakcji Toujours afficher le curseur pour les interactions sur soi-même @@ -15,7 +15,7 @@ Display interaction menus as lists Mostrar los menus de interacción como listas - Показывать меню взаимодействия в виде списка + Меню взаимодействий в виде списка Afficher le menu d'interaction au format liste Mostra il menù di interazione come lista Wyświetlaj menu interakcji jako listę From a4980a91e1d9ce81fa741e9c809deb0f63bc1eb4 Mon Sep 17 00:00:00 2001 From: ruPaladin Date: Fri, 17 Apr 2015 16:04:26 +0300 Subject: [PATCH 180/305] inventory (semantic correction) --- addons/inventory/stringtable.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/inventory/stringtable.xml b/addons/inventory/stringtable.xml index f1d1e70f9d..da132cc3f1 100644 --- a/addons/inventory/stringtable.xml +++ b/addons/inventory/stringtable.xml @@ -5,7 +5,7 @@ Make Inventory Display Bigger Erhöhe die angezeigte Inventargröße Hacer la pantalla de inventario mas grande - Сделать окно инвентаря больше + Изменить размер окна инвентаря Zvětšit zobrazení inventáře Powiększ UI ekwipunku Agrandir la taille d'affichage de l'inventaire @@ -16,7 +16,7 @@ Normally inventory display is scaled by UI size. This allows scaling the Inventory UI size up, but doesn't increase font size allowing more rows displayed. Im Regelfall wird die Inventargröße durch die Größe der Nutzeroberfläche bestimmt. Diese Einstellung erlaubt es das Inventar unter Ausschluss der Schriftgröße zu vergrößern. Dadurch können mehr Gegenstände angezeigt werden. Normalmente la pantalla de inventario se escala por el tamaño de la interfaz de usuario. Esto permite ampliar el tamaño de la interfaz de usuario de inventario, pero no aumenta el tamaño de fuente, permitiendo mostrar más filas. - Обычно, окно инвентаря зависит от размеров пользовательского интерфейса. Эта настройка позволяет увеличить размер окна инвентаря в пользовательском интерфейсе, не увеличивая размера шрифтов, так что отображется большее количество строк. + Обычно, размер окна инвентаря зависит от размеров пользовательского интерфейса. Эта настройка позволяет увеличить размер окна инвентаря, не увеличивая размеры шрифтов, так что отображется большее количество строк. Normálně se velikost invetáře škáluje s velikostí UI. Toto nastavení dovoluje škálování velikost inventáře ale nežvětšuje velikost fontu. To dovoluje zobrazení více řad v inventáři. Ekwipunek skalowany jest poprzez rozmiar UI. Ta opcja pozwala powiększyć rozmiar UI ekwipunku, lecz nie zwiększa rozmiaru fontu pozwalając na wyświetlanie większej ilości wierszy. L'inventaire est normalement affiché en fonction de la taille de l'UI. Cette option permet d'agrandir l'affichage de l'inventaire, mais n'a aucun effet sur la taille des polices permettant d'afficher plus de ligne From 52dc5d66a47d22662d1be290007f36e24a68dc9c Mon Sep 17 00:00:00 2001 From: ruPaladin Date: Fri, 17 Apr 2015 16:09:17 +0300 Subject: [PATCH 181/305] nametags (fix text overlapping, semantic correct) --- addons/nametags/stringtable.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index 32eb35781b..c4e6f3315e 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -55,7 +55,7 @@ Mostra i gradi (richiede i nomi dei giocatori abilitati) Mostrar patente de jogadores (requer nome de jogadores) Játékosok rendfokozatának mutatása (a nevek mutatása szükséges) - Показать звания игроков (требует имен игроков) + Показать звания игроков (имена обязательны) Show vehicle crew info @@ -71,7 +71,7 @@ Show name tags for AI units Zeige Namen für KI Einheiten Mostrar etiquetas de nombre para unidades IA - Показывать именые метки ИИ + Показывать имена ботов Zobrazit jména AI Wyświetl imiona jednostek AI Afficher les noms des IA @@ -81,7 +81,7 @@ Show SoundWaves (requires player names) Zeigen Schallwellen (benötigt Spielernamen) Mostrar onda sonora (requiere Mostrar nombres de jugadores) - Показывать звуковые волны (требует имен игроков) + Индикатор разговора (имена обязательны) Zobrazit SoundWaves (vyžaduje jména hráčů) Pokaż fale dźwiękowe (wymagana opcja Pokaż imiona graczy) Afficher "qui parle" (si noms affichés) From 874cc752713ce862062e5cf67dc7d6e3072945b6 Mon Sep 17 00:00:00 2001 From: ruPaladin Date: Fri, 17 Apr 2015 16:22:02 +0300 Subject: [PATCH 182/305] medical (semantic correction) --- addons/medical/stringtable.xml | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 9f651e90b7..e80be2fc65 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -369,7 +369,7 @@ Give Blood IV (1000ml) Bluttransfusion IV (1000ml) Dar Sangre IV (1000ml) - Дать кровь для в/в вливания (1000 мл) + Перелить пакет крови (1000 мл) Podaj krew IV (1000ml) Administrer du Sang en IV (1000ml) Podat krev. transfúzi (1000ml) @@ -380,7 +380,7 @@ Give Blood IV (500ml) Bluttransfusion IV (500ml) Dar Sangre IV (500ml) - Дать кровь для в/в вливания (500 мл) + Перелить пакет крови (500 мл) Podaj krew IV (500ml) Administrer du Sang en IV (500ml) Podat krev. transfúzi (500ml) @@ -391,7 +391,7 @@ Give Blood IV (250ml) Bluttransfusion IV (250ml) Dar Sangre IV (250ml) - Дать кровь для в/в вливания (250 мл) + Перелить пакет крови (250 мл) Podaj krew IV (250ml) Administrer du Sang en IV (250ml) Podat krev. transfúzi (250ml) @@ -402,7 +402,7 @@ Give Plasma IV (1000ml) Plasmatransfusion IV (1000ml) Dar Plasma IV (1000ml) - Дать плазму для в/в вливания (1000 мл) + Перелить пакет плазмы (1000 мл) Podaj osocze IV (1000ml) Administrer du Plasma en IV (1000ml) Podat plazmu (1000ml) @@ -413,7 +413,7 @@ Give Plasma IV (500ml) Plasmatransfusion IV (500ml) Dar Plasma IV (500ml) - Дать плазму для в/в вливания (500 мл) + Перелить пакет плазмы (500 мл) Podaj osocze IV (500ml) Administrer du Plasma en IV (500ml) Podat plazmu (500ml) @@ -424,7 +424,7 @@ Give Plasma IV (250ml) Plasmatransfusion IV (250ml) Dar Plasma IV (250ml) - Дать плазму для в/в вливания (250 мл) + Перелить пакет плазмы (250 мл) Podaj osocze IV (250ml) Administrer du Plasma en IV (250ml) Podat plazmu (250ml) @@ -435,7 +435,7 @@ Give Saline IV (1000ml) Kochsaltzlösung IV (1000ml) Dar Salino IV (1000ml) - Дать физраствор для в/в вливания (1000 мл) + Перелить пакет физраствора (1000 мл) Podaj solankę IV (1000ml) Administrer de la Solution Saline en IV (1000ml) Podaz fyz. roztok (1000ml) @@ -446,7 +446,7 @@ Give Saline IV (500ml) Kochsaltzlösung IV (500ml) Dar Salino IV (500ml) - Дать физраствор для в/в вливания (500 мл) + Перелить пакет физраствора (500 мл) Podaj solankę IV (500ml) Administrer de la Solution Saline en IV (500ml) Podaz fyz. roztok (500ml) @@ -457,7 +457,7 @@ Give Saline IV (250ml) Kochsaltzlösung IV (250ml) Dar Salino IV (250ml) - Дать физраствор для в/в вливания (250 мл) + Перелить пакет физраствора (250 мл) Podaj solankę IV (250ml) Administrer de la Solution Saline en IV (250ml) Podaz fyz. roztok (250ml) @@ -468,7 +468,7 @@ Minor Gering Menor - Незначительная + Легкие ранения Normalny Mineur Minimální @@ -478,7 +478,7 @@ Delayed Retrasado - Груз 300 + Средние ранения Opóźniony Différé Verzögert @@ -489,7 +489,7 @@ Immediate Inmediato - Помощь отложена + Тяжелые ранения Natychmiastowy Urgence Immédiate Sofort @@ -500,7 +500,7 @@ Deceased Fallecido - Груз 200 + Труп Nie żyje Décédé Verstorben @@ -511,7 +511,7 @@ None Ninguno - Нет + Отсутствует Brak Aucun Keine @@ -1590,7 +1590,7 @@ Pain Effect Type Schmerzeffekt-Typ Rodzaj efektu bólu - Вид боли + Эффект боли Pain Effect Type Tipo de efecto de dolor @@ -1598,7 +1598,7 @@ Colour Flashing Farbblinken Pulsujące kolory - Разноцветные вспышки + Пульсирующий свет Colore lampeggiante Parpadeo de color From 469dafd0c086d0cd463b1505245b99923118c9ff Mon Sep 17 00:00:00 2001 From: jaynus Date: Fri, 17 Apr 2015 07:25:49 -0700 Subject: [PATCH 183/305] tab --- addons/laser/CfgVehicles.hpp | 2 +- addons/laser/RscInGameUI.hpp | 232 +++++++++++++++++------------------ 2 files changed, 117 insertions(+), 117 deletions(-) diff --git a/addons/laser/CfgVehicles.hpp b/addons/laser/CfgVehicles.hpp index 1e83f66cc9..23eb00c37c 100644 --- a/addons/laser/CfgVehicles.hpp +++ b/addons/laser/CfgVehicles.hpp @@ -5,7 +5,7 @@ class CfgVehicles { // @TODO: Changing the model and simulation hides it, but THEN IT DOESNT SPAWN WTF!? model = "\A3\Weapons_F\empty.p3d"; destrType = "DestructNo"; - simulation = "house"; + simulation = "house"; class EventHandlers { init = QUOTE(_this call FUNC(laser_init)); diff --git a/addons/laser/RscInGameUI.hpp b/addons/laser/RscInGameUI.hpp index d3dfaa5d43..d87136c960 100644 --- a/addons/laser/RscInGameUI.hpp +++ b/addons/laser/RscInGameUI.hpp @@ -6,118 +6,118 @@ class RscMapControl; class RscInGameUI { class RscOptics_LaserDesignator { - idd = 300; - controls[] = {"CA_IGUI_elements_group"}; + idd = 300; + controls[] = {"CA_IGUI_elements_group"}; onLoad = "uiNameSpace setVariable ['ACE_RscOptics_LaserDesignator',(_this select 0)];"; onUnload = "uiNameSpace setVariable ['ACE_RscOptics_LaserDesignator',nil];"; - class CA_IGUI_elements_group: RscControlsGroup { - idc = 170; + class CA_IGUI_elements_group: RscControlsGroup { + idc = 170; - x = "0 * (0.01875 * SafezoneH) + (SafezoneX + ((SafezoneW - SafezoneH) / 2))"; - y = "0 * (0.025 * SafezoneH) + (SafezoneY)"; - w = "53.5 * (0.01875 * SafezoneH)"; - h = "40 * (0.025 * SafezoneH)"; - class VScrollbar: VScrollbar { - width = 0; - }; - class HScrollbar: HScrollbar { - height = 0; - }; + x = "0 * (0.01875 * SafezoneH) + (SafezoneX + ((SafezoneW - SafezoneH) / 2))"; + y = "0 * (0.025 * SafezoneH) + (SafezoneY)"; + w = "53.5 * (0.01875 * SafezoneH)"; + h = "40 * (0.025 * SafezoneH)"; + class VScrollbar: VScrollbar { + width = 0; + }; + class HScrollbar: HScrollbar { + height = 0; + }; class controls { - class CA_OpticsZoom: RscText { - idc = 180; - style = 1; - colorText[] = {0.706,0.0745,0.0196,1}; - sizeEx = "0.038*SafezoneH"; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "4.5"; - x = "43.85 * (0.01875 * SafezoneH)"; - y = "19.6 * (0.025 * SafezoneH)"; - w = "4.5 * (0.01875 * SafezoneH)"; - h = "1.1 * (0.025 * SafezoneH)"; - }; + class CA_OpticsZoom: RscText { + idc = 180; + style = 1; + colorText[] = {0.706,0.0745,0.0196,1}; + sizeEx = "0.038*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "4.5"; + x = "43.85 * (0.01875 * SafezoneH)"; + y = "19.6 * (0.025 * SafezoneH)"; + w = "4.5 * (0.01875 * SafezoneH)"; + h = "1.1 * (0.025 * SafezoneH)"; + }; class ACE_Distance: RscText { - idc = 123002; - style = 0; - sizeEx = "0.038*SafezoneH"; - colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "2456"; - x = "24.6 * (0.01875 * SafezoneH)"; - y = "3 * (0.025 * SafezoneH)"; - w = "4 * (0.01875 * SafezoneH)"; - h = "1.5 * (0.025 * SafezoneH)"; - }; - class CA_Distance: RscText { - idc = 151; - style = 0; - sizeEx = "0.038*SafezoneH"; - colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "2456"; - x = 0; + idc = 123002; + style = 0; + sizeEx = "0.038*SafezoneH"; + colorText[] = {0.706,0.0745,0.0196,1}; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "2456"; + x = "24.6 * (0.01875 * SafezoneH)"; + y = "3 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.5 * (0.025 * SafezoneH)"; + }; + class CA_Distance: RscText { + idc = 151; + style = 0; + sizeEx = "0.038*SafezoneH"; + colorText[] = {0.706,0.0745,0.0196,1}; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "2456"; + x = 0; y = 0; w = 0; h = 0; - }; - class CA_Elev: RscText { - idc = 175; - style = 1; - sizeEx = "0.038*SafezoneH"; - colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "80.5"; - x = "32.7 * (0.01875 * SafezoneH)"; - y = "3 * (0.025 * SafezoneH)"; - w = "5 * (0.01875 * SafezoneH)"; - h = "1.5 * (0.025 * SafezoneH)"; - }; - class CA_VisionMode: RscText { - idc = 179; - style = 0; - sizeEx = "0.038*SafezoneH"; - colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "VIS"; - x = "6.5 * (0.01875 * SafezoneH)"; - y = "19.6 * (0.025 * SafezoneH)"; - w = "4 * (0.01875 * SafezoneH)"; - h = "1.1 * (0.025 * SafezoneH)"; - }; - class CA_Laser: RscText { - idc = 158; - style = "0x30 + 0x800"; - sizeEx = "0.038*SafezoneH"; - colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "\A3\ui_f\data\igui\rscingameui\rscoptics\laser_designator_iconLaserOn.paa"; - x = "29.2 * (0.01875 * SafezoneH)"; - y = "3 * (0.025 * SafezoneH)"; - w = "3.5 * (0.01875 * SafezoneH)"; - h = "1.5 * (0.025 * SafezoneH)"; - }; - class CA_Heading: RscText { - idc = 156; - style = 0; - sizeEx = "0.038*SafezoneH"; - colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "023"; - x = "16.1 * (0.01875 * SafezoneH)"; - y = "3 * (0.025 * SafezoneH)"; - w = "3.5 * (0.01875 * SafezoneH)"; - h = "1.6 * (0.025 * SafezoneH)"; - }; + }; + class CA_Elev: RscText { + idc = 175; + style = 1; + sizeEx = "0.038*SafezoneH"; + colorText[] = {0.706,0.0745,0.0196,1}; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "80.5"; + x = "32.7 * (0.01875 * SafezoneH)"; + y = "3 * (0.025 * SafezoneH)"; + w = "5 * (0.01875 * SafezoneH)"; + h = "1.5 * (0.025 * SafezoneH)"; + }; + class CA_VisionMode: RscText { + idc = 179; + style = 0; + sizeEx = "0.038*SafezoneH"; + colorText[] = {0.706,0.0745,0.0196,1}; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "VIS"; + x = "6.5 * (0.01875 * SafezoneH)"; + y = "19.6 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.1 * (0.025 * SafezoneH)"; + }; + class CA_Laser: RscText { + idc = 158; + style = "0x30 + 0x800"; + sizeEx = "0.038*SafezoneH"; + colorText[] = {0.706,0.0745,0.0196,1}; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics\laser_designator_iconLaserOn.paa"; + x = "29.2 * (0.01875 * SafezoneH)"; + y = "3 * (0.025 * SafezoneH)"; + w = "3.5 * (0.01875 * SafezoneH)"; + h = "1.5 * (0.025 * SafezoneH)"; + }; + class CA_Heading: RscText { + idc = 156; + style = 0; + sizeEx = "0.038*SafezoneH"; + colorText[] = {0.706,0.0745,0.0196,1}; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "023"; + x = "16.1 * (0.01875 * SafezoneH)"; + y = "3 * (0.025 * SafezoneH)"; + w = "3.5 * (0.01875 * SafezoneH)"; + h = "1.6 * (0.025 * SafezoneH)"; + }; class ACE_LaserCode_Helper : RscMapControl { idc = -1; @@ -126,19 +126,19 @@ class RscInGameUI { h = 0; }; class ACE_LaserCode : RscText { - idc = 123001; - style = 0; - sizeEx = "0.038*SafezoneH"; - colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "Code: 1001"; - x = "32.7 * (0.01875 * SafezoneH)"; - y = "35.5 * (0.025 * SafezoneH)"; - w = "12 * (0.01875 * SafezoneH)"; - h = "1.6 * (0.025 * SafezoneH)"; - }; - }; - }; - }; + idc = 123001; + style = 0; + sizeEx = "0.038*SafezoneH"; + colorText[] = {0.706,0.0745,0.0196,1}; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "Code: 1001"; + x = "32.7 * (0.01875 * SafezoneH)"; + y = "35.5 * (0.025 * SafezoneH)"; + w = "12 * (0.01875 * SafezoneH)"; + h = "1.6 * (0.025 * SafezoneH)"; + }; + }; + }; + }; }; \ No newline at end of file From 6c3e699fdb6c4511286998bea569a2a32c90a508 Mon Sep 17 00:00:00 2001 From: jaynus Date: Fri, 17 Apr 2015 07:28:19 -0700 Subject: [PATCH 184/305] tabs --- addons/javelin/CfgWeapons.hpp | 6 +- addons/javelin/RscInGameUI.hpp | 6 +- addons/missileguidance/CfgAmmo.hpp | 58 +++++++++---------- .../Example_ACE_MissileGuidance.hpp | 38 ++++++------ 4 files changed, 54 insertions(+), 54 deletions(-) diff --git a/addons/javelin/CfgWeapons.hpp b/addons/javelin/CfgWeapons.hpp index 0898fa6d3c..79e7c7358c 100644 --- a/addons/javelin/CfgWeapons.hpp +++ b/addons/javelin/CfgWeapons.hpp @@ -4,7 +4,7 @@ class CfgWeapons { class Launcher_Base_F : Launcher { class WeaponSlotsInfo; - }; + }; class missiles_titan : MissileLauncher { weaponInfoType = "ACE_RscOptics_javelin"; @@ -13,7 +13,7 @@ class CfgWeapons { canLock = 0; lockingTargetSound[] = {"",0,1}; - lockedTargetSound[] = {"",0,1}; + lockedTargetSound[] = {"",0,1}; }; class launch_Titan_base : Launcher_Base_F { @@ -24,6 +24,6 @@ class CfgWeapons { lockingTargetSound[] = {"",0,1}; - lockedTargetSound[] = {"",0,1}; + lockedTargetSound[] = {"",0,1}; }; }; \ No newline at end of file diff --git a/addons/javelin/RscInGameUI.hpp b/addons/javelin/RscInGameUI.hpp index d845c1d00b..ea1e12626c 100644 --- a/addons/javelin/RscInGameUI.hpp +++ b/addons/javelin/RscInGameUI.hpp @@ -255,9 +255,9 @@ class RscInGameUI { idc = 6999; x = "SafezoneX"; - y = "SafezoneY"; - w = "SafezoneW"; - h = "SafezoneH"; + y = "SafezoneY"; + w = "SafezoneW"; + h = "SafezoneH"; enabled = 0; class Controls { diff --git a/addons/missileguidance/CfgAmmo.hpp b/addons/missileguidance/CfgAmmo.hpp index 82045a1720..a4a4f7e25d 100644 --- a/addons/missileguidance/CfgAmmo.hpp +++ b/addons/missileguidance/CfgAmmo.hpp @@ -8,29 +8,29 @@ class CfgAmmo { class M_PG_AT : MissileBase { model = "\A3\Weapons_F\Ammo\Rocket_01_fly_F"; - proxyShape = "\A3\Weapons_F\Ammo\Rocket_01_F"; + proxyShape = "\A3\Weapons_F\Ammo\Rocket_01_F"; irLock = 0; - laserLock = 0; - airLock = 0; - weaponLockSystem = "2 + 16"; + laserLock = 0; + airLock = 0; + weaponLockSystem = "2 + 16"; - maxSpeed = 720; - maxControlRange = 5000; - maneuvrability = 8; - timeToLive = 60; - simulationStep = 0.01; - airFriction = 0.1; - sideAirFriction = 0.16; - initTime = 0.002; - thrustTime = 1.07; - thrust = 530; - fuseDistance = 2; + maxSpeed = 720; + maxControlRange = 5000; + maneuvrability = 8; + timeToLive = 60; + simulationStep = 0.01; + airFriction = 0.1; + sideAirFriction = 0.16; + initTime = 0.002; + thrustTime = 1.07; + thrust = 530; + fuseDistance = 2; - effectsMissileInit = "MissileDAR1"; - effectsMissile = "missile2"; - whistleDist = 4; - muzzleEffect = ""; + effectsMissileInit = "MissileDAR1"; + effectsMissile = "missile2"; + whistleDist = 4; + muzzleEffect = ""; // Turn off arma crosshair-guidance manualControl = 0; @@ -73,17 +73,17 @@ class CfgAmmo { class ACE_Hydra70_DAGR : M_PG_AT { displayName = "$STR_ACE_Hydra70_DAGR"; - displayNameShort = "$STR_ACE_Hydra70_DAGR_Short"; + displayNameShort = "$STR_ACE_Hydra70_DAGR_Short"; description = "$STR_ACE_Hydra70_DAGR"; - descriptionShort = "$STR_ACE_Hydra70_DAGR_Desc"; + descriptionShort = "$STR_ACE_Hydra70_DAGR_Desc"; }; class ACE_Hellfire_AGM114K : ACE_Hydra70_DAGR { displayName = "$STR_ACE_Hellfire_AGM114K"; - displayNameShort = "$STR_ACE_Hellfire_AGM114K_Short"; + displayNameShort = "$STR_ACE_Hellfire_AGM114K_Short"; - description = "$STR_ACE_Hellfire_AGM114K_desc"; + description = "$STR_ACE_Hellfire_AGM114K_desc"; descriptionShort = "$STR_ACE_Hellfire_AGM114K_desc"; // @TODO: placeholder model to at least make it look different @@ -92,22 +92,22 @@ class CfgAmmo { hit = 1400; indirectHit = 71; - indirectHitRange = 4.5; - effectsMissile = "missile2"; + indirectHitRange = 4.5; + effectsMissile = "missile2"; }; // Titan class M_Titan_AT : MissileBase { irLock = 0; - laserLock = 0; - airLock = 0; + laserLock = 0; + airLock = 0; // Turn off arma crosshair-guidance manualControl = 0; hit = 1400; // default: 800 - indirectHit = 20; - indirectHitRange = 2; + indirectHit = 20; + indirectHitRange = 2; // ACE uses these values //trackOversteer = 1; //trackLead = 0; diff --git a/addons/missileguidance/Example_ACE_MissileGuidance.hpp b/addons/missileguidance/Example_ACE_MissileGuidance.hpp index 400a3a9a41..d9c1ea8a2c 100644 --- a/addons/missileguidance/Example_ACE_MissileGuidance.hpp +++ b/addons/missileguidance/Example_ACE_MissileGuidance.hpp @@ -3,29 +3,29 @@ THIS IS A WIP FUNCTIONALITY, DUE TO CHANGE class M_PG_AT : MissileBase { model = "\A3\Weapons_F\Ammo\Rocket_01_fly_F"; - proxyShape = "\A3\Weapons_F\Ammo\Rocket_01_F"; + proxyShape = "\A3\Weapons_F\Ammo\Rocket_01_F"; irLock = 0; - laserLock = 0; - airLock = 0; - weaponLockSystem = "2 + 16"; + laserLock = 0; + airLock = 0; + weaponLockSystem = "2 + 16"; - maxSpeed = 720; - maxControlRange = 5000; - maneuvrability = 8; - timeToLive = 60; - simulationStep = 0.01; - airFriction = 0.1; - sideAirFriction = 0.16; - initTime = 0.002; - thrustTime = 1.07; - thrust = 530; - fuseDistance = 2; + maxSpeed = 720; + maxControlRange = 5000; + maneuvrability = 8; + timeToLive = 60; + simulationStep = 0.01; + airFriction = 0.1; + sideAirFriction = 0.16; + initTime = 0.002; + thrustTime = 1.07; + thrust = 530; + fuseDistance = 2; - effectsMissileInit = "MissileDAR1"; - effectsMissile = "missile2"; - whistleDist = 4; - muzzleEffect = ""; + effectsMissileInit = "MissileDAR1"; + effectsMissile = "missile2"; + whistleDist = 4; + muzzleEffect = ""; // Turn off arma crosshair-guidance manualControl = 0; From 3a94753645f695086cb4518e14e3922a5cae7158 Mon Sep 17 00:00:00 2001 From: jaynus Date: Fri, 17 Apr 2015 07:28:59 -0700 Subject: [PATCH 185/305] tab --- addons/laser/CfgVehicles.hpp | 2 +- addons/laser/RscInGameUI.hpp | 232 +++++++++++++++++------------------ 2 files changed, 117 insertions(+), 117 deletions(-) diff --git a/addons/laser/CfgVehicles.hpp b/addons/laser/CfgVehicles.hpp index 1e83f66cc9..23eb00c37c 100644 --- a/addons/laser/CfgVehicles.hpp +++ b/addons/laser/CfgVehicles.hpp @@ -5,7 +5,7 @@ class CfgVehicles { // @TODO: Changing the model and simulation hides it, but THEN IT DOESNT SPAWN WTF!? model = "\A3\Weapons_F\empty.p3d"; destrType = "DestructNo"; - simulation = "house"; + simulation = "house"; class EventHandlers { init = QUOTE(_this call FUNC(laser_init)); diff --git a/addons/laser/RscInGameUI.hpp b/addons/laser/RscInGameUI.hpp index d3dfaa5d43..d87136c960 100644 --- a/addons/laser/RscInGameUI.hpp +++ b/addons/laser/RscInGameUI.hpp @@ -6,118 +6,118 @@ class RscMapControl; class RscInGameUI { class RscOptics_LaserDesignator { - idd = 300; - controls[] = {"CA_IGUI_elements_group"}; + idd = 300; + controls[] = {"CA_IGUI_elements_group"}; onLoad = "uiNameSpace setVariable ['ACE_RscOptics_LaserDesignator',(_this select 0)];"; onUnload = "uiNameSpace setVariable ['ACE_RscOptics_LaserDesignator',nil];"; - class CA_IGUI_elements_group: RscControlsGroup { - idc = 170; + class CA_IGUI_elements_group: RscControlsGroup { + idc = 170; - x = "0 * (0.01875 * SafezoneH) + (SafezoneX + ((SafezoneW - SafezoneH) / 2))"; - y = "0 * (0.025 * SafezoneH) + (SafezoneY)"; - w = "53.5 * (0.01875 * SafezoneH)"; - h = "40 * (0.025 * SafezoneH)"; - class VScrollbar: VScrollbar { - width = 0; - }; - class HScrollbar: HScrollbar { - height = 0; - }; + x = "0 * (0.01875 * SafezoneH) + (SafezoneX + ((SafezoneW - SafezoneH) / 2))"; + y = "0 * (0.025 * SafezoneH) + (SafezoneY)"; + w = "53.5 * (0.01875 * SafezoneH)"; + h = "40 * (0.025 * SafezoneH)"; + class VScrollbar: VScrollbar { + width = 0; + }; + class HScrollbar: HScrollbar { + height = 0; + }; class controls { - class CA_OpticsZoom: RscText { - idc = 180; - style = 1; - colorText[] = {0.706,0.0745,0.0196,1}; - sizeEx = "0.038*SafezoneH"; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "4.5"; - x = "43.85 * (0.01875 * SafezoneH)"; - y = "19.6 * (0.025 * SafezoneH)"; - w = "4.5 * (0.01875 * SafezoneH)"; - h = "1.1 * (0.025 * SafezoneH)"; - }; + class CA_OpticsZoom: RscText { + idc = 180; + style = 1; + colorText[] = {0.706,0.0745,0.0196,1}; + sizeEx = "0.038*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "4.5"; + x = "43.85 * (0.01875 * SafezoneH)"; + y = "19.6 * (0.025 * SafezoneH)"; + w = "4.5 * (0.01875 * SafezoneH)"; + h = "1.1 * (0.025 * SafezoneH)"; + }; class ACE_Distance: RscText { - idc = 123002; - style = 0; - sizeEx = "0.038*SafezoneH"; - colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "2456"; - x = "24.6 * (0.01875 * SafezoneH)"; - y = "3 * (0.025 * SafezoneH)"; - w = "4 * (0.01875 * SafezoneH)"; - h = "1.5 * (0.025 * SafezoneH)"; - }; - class CA_Distance: RscText { - idc = 151; - style = 0; - sizeEx = "0.038*SafezoneH"; - colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "2456"; - x = 0; + idc = 123002; + style = 0; + sizeEx = "0.038*SafezoneH"; + colorText[] = {0.706,0.0745,0.0196,1}; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "2456"; + x = "24.6 * (0.01875 * SafezoneH)"; + y = "3 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.5 * (0.025 * SafezoneH)"; + }; + class CA_Distance: RscText { + idc = 151; + style = 0; + sizeEx = "0.038*SafezoneH"; + colorText[] = {0.706,0.0745,0.0196,1}; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "2456"; + x = 0; y = 0; w = 0; h = 0; - }; - class CA_Elev: RscText { - idc = 175; - style = 1; - sizeEx = "0.038*SafezoneH"; - colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "80.5"; - x = "32.7 * (0.01875 * SafezoneH)"; - y = "3 * (0.025 * SafezoneH)"; - w = "5 * (0.01875 * SafezoneH)"; - h = "1.5 * (0.025 * SafezoneH)"; - }; - class CA_VisionMode: RscText { - idc = 179; - style = 0; - sizeEx = "0.038*SafezoneH"; - colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "VIS"; - x = "6.5 * (0.01875 * SafezoneH)"; - y = "19.6 * (0.025 * SafezoneH)"; - w = "4 * (0.01875 * SafezoneH)"; - h = "1.1 * (0.025 * SafezoneH)"; - }; - class CA_Laser: RscText { - idc = 158; - style = "0x30 + 0x800"; - sizeEx = "0.038*SafezoneH"; - colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "\A3\ui_f\data\igui\rscingameui\rscoptics\laser_designator_iconLaserOn.paa"; - x = "29.2 * (0.01875 * SafezoneH)"; - y = "3 * (0.025 * SafezoneH)"; - w = "3.5 * (0.01875 * SafezoneH)"; - h = "1.5 * (0.025 * SafezoneH)"; - }; - class CA_Heading: RscText { - idc = 156; - style = 0; - sizeEx = "0.038*SafezoneH"; - colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "023"; - x = "16.1 * (0.01875 * SafezoneH)"; - y = "3 * (0.025 * SafezoneH)"; - w = "3.5 * (0.01875 * SafezoneH)"; - h = "1.6 * (0.025 * SafezoneH)"; - }; + }; + class CA_Elev: RscText { + idc = 175; + style = 1; + sizeEx = "0.038*SafezoneH"; + colorText[] = {0.706,0.0745,0.0196,1}; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "80.5"; + x = "32.7 * (0.01875 * SafezoneH)"; + y = "3 * (0.025 * SafezoneH)"; + w = "5 * (0.01875 * SafezoneH)"; + h = "1.5 * (0.025 * SafezoneH)"; + }; + class CA_VisionMode: RscText { + idc = 179; + style = 0; + sizeEx = "0.038*SafezoneH"; + colorText[] = {0.706,0.0745,0.0196,1}; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "VIS"; + x = "6.5 * (0.01875 * SafezoneH)"; + y = "19.6 * (0.025 * SafezoneH)"; + w = "4 * (0.01875 * SafezoneH)"; + h = "1.1 * (0.025 * SafezoneH)"; + }; + class CA_Laser: RscText { + idc = 158; + style = "0x30 + 0x800"; + sizeEx = "0.038*SafezoneH"; + colorText[] = {0.706,0.0745,0.0196,1}; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics\laser_designator_iconLaserOn.paa"; + x = "29.2 * (0.01875 * SafezoneH)"; + y = "3 * (0.025 * SafezoneH)"; + w = "3.5 * (0.01875 * SafezoneH)"; + h = "1.5 * (0.025 * SafezoneH)"; + }; + class CA_Heading: RscText { + idc = 156; + style = 0; + sizeEx = "0.038*SafezoneH"; + colorText[] = {0.706,0.0745,0.0196,1}; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "023"; + x = "16.1 * (0.01875 * SafezoneH)"; + y = "3 * (0.025 * SafezoneH)"; + w = "3.5 * (0.01875 * SafezoneH)"; + h = "1.6 * (0.025 * SafezoneH)"; + }; class ACE_LaserCode_Helper : RscMapControl { idc = -1; @@ -126,19 +126,19 @@ class RscInGameUI { h = 0; }; class ACE_LaserCode : RscText { - idc = 123001; - style = 0; - sizeEx = "0.038*SafezoneH"; - colorText[] = {0.706,0.0745,0.0196,1}; - shadow = 0; - font = "EtelkaMonospacePro"; - text = "Code: 1001"; - x = "32.7 * (0.01875 * SafezoneH)"; - y = "35.5 * (0.025 * SafezoneH)"; - w = "12 * (0.01875 * SafezoneH)"; - h = "1.6 * (0.025 * SafezoneH)"; - }; - }; - }; - }; + idc = 123001; + style = 0; + sizeEx = "0.038*SafezoneH"; + colorText[] = {0.706,0.0745,0.0196,1}; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "Code: 1001"; + x = "32.7 * (0.01875 * SafezoneH)"; + y = "35.5 * (0.025 * SafezoneH)"; + w = "12 * (0.01875 * SafezoneH)"; + h = "1.6 * (0.025 * SafezoneH)"; + }; + }; + }; + }; }; \ No newline at end of file From e83ab4049fd6e3bbcc3d3e2e74306f5f1ecf52a4 Mon Sep 17 00:00:00 2001 From: jaynus Date: Fri, 17 Apr 2015 07:30:55 -0700 Subject: [PATCH 186/305] Fixed: Tabs everywhere. --- addons/aircraft/CfgAmmo.hpp | 6 +++--- addons/aircraft/Heli_Attack_01_base_F.hpp | 8 ++++---- addons/optics/CfgWeapons.hpp | 16 ++++++++-------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/addons/aircraft/CfgAmmo.hpp b/addons/aircraft/CfgAmmo.hpp index 41462354d8..8aa5d3173e 100644 --- a/addons/aircraft/CfgAmmo.hpp +++ b/addons/aircraft/CfgAmmo.hpp @@ -2,7 +2,7 @@ class CfgAmmo { class BulletBase; class B_20mm : BulletBase { - hit = 80; + hit = 80; indirectHit = 12; indirectHitRange = 2; //2; caliber = 1.4; @@ -13,7 +13,7 @@ class CfgAmmo { tracerEndTime = 3.5; CraterEffects = "ExploAmmoCrater"; - explosionEffects = "ExploAmmoExplosion"; + explosionEffects = "ExploAmmoExplosion"; model = "\A3\Weapons_f\Data\bullettracer\tracer_red"; }; class ACE_20mm_HE : B_20mm {}; @@ -23,7 +23,7 @@ class CfgAmmo { indirectHitRange = 0.3; //2; explosive = 0; CraterEffects = ""; - explosionEffects = ""; + explosionEffects = ""; }; // adjust minigun caliber and deflection to other ammo diff --git a/addons/aircraft/Heli_Attack_01_base_F.hpp b/addons/aircraft/Heli_Attack_01_base_F.hpp index 7276b3e402..22f2da3833 100644 --- a/addons/aircraft/Heli_Attack_01_base_F.hpp +++ b/addons/aircraft/Heli_Attack_01_base_F.hpp @@ -907,7 +907,7 @@ class Heli_Attack_01_base_F: Helicopter_Base_F { thermalMode[] = {0,1}; gunnerOpticsColor[] = {0,0,0,1}; directionStabilized = 1; - horizontallyStabilized = 1; + horizontallyStabilized = 1; gunnerOpticsModel = "\A3\Weapons_F_Beta\Reticle\Heli_Attack_01_Optics_Gunner_wide_F"; }; class Medium: Wide @@ -918,7 +918,7 @@ class Heli_Attack_01_base_F: Helicopter_Base_F { maxFov = 0.093; gunnerOpticsColor[] = {0,0,0,1}; directionStabilized = 1; - horizontallyStabilized = 1; + horizontallyStabilized = 1; gunnerOpticsModel = "\A3\Weapons_F_Beta\Reticle\Heli_Attack_01_Optics_Gunner_medium_F"; }; class Narrow: Wide @@ -929,7 +929,7 @@ class Heli_Attack_01_base_F: Helicopter_Base_F { maxFov = 0.029; gunnerOpticsColor[] = {0,0,0,1}; directionStabilized = 1; - horizontallyStabilized = 1; + horizontallyStabilized = 1; gunnerOpticsModel = "\A3\Weapons_F_Beta\Reticle\Heli_Attack_01_Optics_Gunner_narrow_F"; }; @@ -941,7 +941,7 @@ class Heli_Attack_01_base_F: Helicopter_Base_F { maxFov = 0.01; gunnerOpticsColor[] = {0,0,0,1}; directionStabilized = 1; - horizontallyStabilized = 1; + horizontallyStabilized = 1; gunnerOpticsModel = "\A3\Weapons_F_Beta\Reticle\Heli_Attack_01_Optics_Gunner_narrow_F"; }; diff --git a/addons/optics/CfgWeapons.hpp b/addons/optics/CfgWeapons.hpp index 7749db0bc4..6d61ff98a2 100644 --- a/addons/optics/CfgWeapons.hpp +++ b/addons/optics/CfgWeapons.hpp @@ -5,20 +5,20 @@ class CfgWeapons { class Default; class Binocular: Default { - forceOptics = 0; // Allow using compass with Binocular - opticsZoomMin = 0.056889; // 5.25x power - opticsZoomMax = 0.056889; // 9 px/mil - modelOptics = "\z\ace\addons\optics\models\NWD_M22_5x"; // 7 horizontal field of view - visionMode[] = {"Normal"}; // Can't use nvgs with binoculars any more than you can with scopes - // Fix AI using Binocs on short range - #18737 + forceOptics = 0; // Allow using compass with Binocular + opticsZoomMin = 0.056889; // 5.25x power + opticsZoomMax = 0.056889; // 9 px/mil + modelOptics = "\z\ace\addons\optics\models\NWD_M22_5x"; // 7 horizontal field of view + visionMode[] = {"Normal"}; // Can't use nvgs with binoculars any more than you can with scopes + // Fix AI using Binocs on short range - #18737 // minRange = 300; // 300 = uses Rangefinder often (runs a few meters, stops, uses RF, repeats) minRange = 500; //500 = seem almost never use it..? - minRangeProbab = 0.001; + minRangeProbab = 0.001; midRange = 1000; midRangeProbab = 0.01; maxRange = 5000; maxRangeProbab = 0.01; - }; + }; // zooming reticle scopes class optic_DMS: ItemCore { From 26984905693c99441a61288c16849b381a218578 Mon Sep 17 00:00:00 2001 From: ruPaladin Date: Fri, 17 Apr 2015 17:49:03 +0300 Subject: [PATCH 187/305] medical (patient status semantic fixes) --- addons/medical/stringtable.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index e80be2fc65..959662c9f1 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -1518,7 +1518,7 @@ Heavily wounded Schwer verwundet: Ciężko ranny - Сильно ранен + Сильные ранения Gravemente ferito Gravemente herido @@ -1526,7 +1526,7 @@ Lightly wounded Leicht verwundet: Lekko ranny - Легко ранен + Легкие ранения Leggermente ferito Levemente herido @@ -1534,7 +1534,7 @@ Very lightly wounded Sehr leicht verwundet: B. lekko ranny - Очень легко ранен + Царапины Ferito lievemente Muy levemente herido @@ -1542,7 +1542,7 @@ Head Kopf Głowa - Голова + Головы Testa Cabeza @@ -1550,7 +1550,7 @@ Torso Torso Tors - Торс + Торса Torso Torso @@ -1558,7 +1558,7 @@ Left Arm Linker Arm Lewe ramię - Левая рука + Левой руки Braccio sinistro Brazo izquierdo @@ -1566,7 +1566,7 @@ Right Arm Rechter Arm Prawe ramię - Правая рука + Правой руки Braccio destro Brazo derecho @@ -1574,7 +1574,7 @@ Left Leg Linkes Bein Lewa noga - Левая нога + Левой ноги Gamba sinistra Pierna izquierda @@ -1582,7 +1582,7 @@ Right Leg Rechtes Bein Prawa noga - Правая нога + Правой ноги Gamba destra Pierna derecha From bb2383cffd960fb01d7be37448df87706cf5fd60 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 17 Apr 2015 09:51:43 -0500 Subject: [PATCH 188/305] #700 - ProgressBar Visual Improvement --- addons/common/ProgressScreen.hpp | 33 ++++++++++++--------- addons/common/functions/fnc_progressBar.sqf | 10 ++++--- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/addons/common/ProgressScreen.hpp b/addons/common/ProgressScreen.hpp index df07e5ca2f..ab624669cf 100644 --- a/addons/common/ProgressScreen.hpp +++ b/addons/common/ProgressScreen.hpp @@ -1,7 +1,7 @@ class GVAR(ProgressBar_Dialog) { idd = -1; movingEnable = false; - onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(ctrlProgressBar)),(_this select 0) displayCtrl 1)]; uiNamespace setVariable [ARR_2(QUOTE(QGVAR(ctrlProgressBarTitle)),(_this select 0) displayCtrl 2)];); + onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(ctrlProgressBG)),(_this select 0) displayCtrl 1)]; uiNamespace setVariable [ARR_2(QUOTE(QGVAR(ctrlProgressBar)),(_this select 0) displayCtrl 2)]; uiNamespace setVariable [ARR_2(QUOTE(QGVAR(ctrlProgressBarTitle)),(_this select 0) displayCtrl 3)];); objects[] = {}; class controlsBackground { @@ -23,26 +23,31 @@ class GVAR(ProgressBar_Dialog) { w = "safezoneW"; h = "safezoneH"; }; - class Progress: ACE_gui_RscProgress { + class TitleBackground: ACE_gui_staticBase { idc = 1; - x = "1.2 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "0.1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "37.8 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = ".8 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - colorFrame[] = {0,0,0,0.0}; - colorBar[] = {0.27,0.5,0.31,0.8}; - texture = "#(argb,8,8,3)color(1,1,1,0.7)"; - }; - class Title_Bar : ACE_gui_staticBase { - idc = 2; - style = 0x22; - colorBackground[] = {0, 0, 0, 0}; + style = ST_CENTER; + sizeEx = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + colorBackground[] = {0, 0, 0, 0.5}; colorText[] = {1, 1, 1, 1}; x = "1 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; y = "0 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; w = "38 * (((safezoneW / safezoneH) min 1.2) / 40)"; h = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; }; + class Progress: ACE_gui_RscProgress { + idc = 2; + x = "1.2 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; + y = "0.1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; + w = "38 * (((safezoneW / safezoneH) min 1.2) / 40)"; + h = "1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + colorFrame[] = {1,1,1,0.5}; + colorBar[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.77])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.51])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.08])","(profilenamespace getvariable ['GUI_BCG_RGB_A',0.8])"}; + texture = "#(argb,8,8,3)color(1,1,1,0.7)"; + }; + class TitleText: TitleBackground { + idc = 3; + colorBackground[] = {0, 0, 0, 0}; + }; }; }; diff --git a/addons/common/functions/fnc_progressBar.sqf b/addons/common/functions/fnc_progressBar.sqf index 03c56398c4..f7d927556c 100644 --- a/addons/common/functions/fnc_progressBar.sqf +++ b/addons/common/functions/fnc_progressBar.sqf @@ -38,12 +38,14 @@ createDialog QGVAR(ProgressBar_Dialog); //Adjust position based on user setting: _ctrlPos = ctrlPosition (uiNamespace getVariable QGVAR(ctrlProgressBarTitle)); _ctrlPos set [1, ((0 + 29 * GVAR(SettingProgressBarLocation)) * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2))]; -(uiNamespace getVariable QGVAR(ctrlProgressBarTitle)) ctrlSetPosition _ctrlPos; -(uiNamespace getVariable QGVAR(ctrlProgressBarTitle)) ctrlCommit 0; -_ctrlPos = ctrlPosition (uiNamespace getVariable QGVAR(ctrlProgressBar)); -_ctrlPos set [1, ((0.1 + 29 * GVAR(SettingProgressBarLocation)) * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2))]; + +(uiNamespace getVariable QGVAR(ctrlProgressBG)) ctrlSetPosition _ctrlPos; +(uiNamespace getVariable QGVAR(ctrlProgressBG)) ctrlCommit 0; (uiNamespace getVariable QGVAR(ctrlProgressBar)) ctrlSetPosition _ctrlPos; (uiNamespace getVariable QGVAR(ctrlProgressBar)) ctrlCommit 0; +(uiNamespace getVariable QGVAR(ctrlProgressBarTitle)) ctrlSetPosition _ctrlPos; +(uiNamespace getVariable QGVAR(ctrlProgressBarTitle)) ctrlCommit 0; + _perFrameFunction = { From 38f32cad0dc505798cbccd1da2ff423aa75e3913 Mon Sep 17 00:00:00 2001 From: jonpas Date: Fri, 17 Apr 2015 17:40:13 +0200 Subject: [PATCH 189/305] bracket -> brace --- documentation/development/coding-guidelines.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/documentation/development/coding-guidelines.md b/documentation/development/coding-guidelines.md index f72263eeaa..e39581a9d4 100644 --- a/documentation/development/coding-guidelines.md +++ b/documentation/development/coding-guidelines.md @@ -35,8 +35,8 @@ Tabs can be tricky sometimes, especially when it comes to sharing code with othe ## Braces -- opening bracket on the same line as keyword -- closing bracket in own line, same level of indentation as keyword +- opening brace on the same line as keyword +- closing brace in own line, same level of indentation as keyword **Yes:** @@ -70,7 +70,7 @@ class Something : Or { }; ``` -When using `if`/`else`, it is encouraged to put `else` on the same line as the closing bracket to save space: +When using `if`/`else`, it is encouraged to put `else` on the same line as the closing brace to save space: ```c++ if (alive player) then { @@ -90,7 +90,7 @@ class Three {foo = 3;}; #### Reasoning -Putting the opening bracket in it's own line wastes a lot of space, and keeping the closing bracket on the same level as the keyword makes it easier to recognize what exactly the bracket closes. +Putting the opening brace in it's own line wastes a lot of space, and keeping the closing brace on the same level as the keyword makes it easier to recognize what exactly the brace closes. ## How to create a new module From ba576c5763cf0310576eba7e45cbb9d898d236c0 Mon Sep 17 00:00:00 2001 From: jonpas Date: Fri, 17 Apr 2015 17:42:03 +0200 Subject: [PATCH 190/305] Capitalized Visual Studio, Corrected togglable spelling --- documentation/development/extension-guidelines.md | 2 +- documentation/development/modularity-and-pbo-structure.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/development/extension-guidelines.md b/documentation/development/extension-guidelines.md index 0558d49d5e..b5e7e98586 100644 --- a/documentation/development/extension-guidelines.md +++ b/documentation/development/extension-guidelines.md @@ -11,7 +11,7 @@ order: 9 ### Requirements - A compiler (VS/GCC/Clang) - - If starting with visual studio, you need to make sure to use the Visual studio command prompt + - If starting with Visual Studio, you need to make sure to use the Visual studio command prompt - cmake 3.0 or later in your path ### Cross-Platform Guidelines diff --git a/documentation/development/modularity-and-pbo-structure.md b/documentation/development/modularity-and-pbo-structure.md index ad1194e39c..e3e8c5002a 100644 --- a/documentation/development/modularity-and-pbo-structure.md +++ b/documentation/development/modularity-and-pbo-structure.md @@ -10,7 +10,7 @@ order: 4 Main principles: - As much stuff as possible should be modular -- Strive to make as much stuff as possible run-time toogable. Adding/removing PBOS would still be requiring to toogle any feature relying on config changes. +- Strive to make as much stuff as possible run-time togglable. Adding/removing PBOS would still be requiring to toggle any feature relying on config changes. ### PBO Structure From 2d5b10fb601d0cafa8b975798ce3ff96e5902a1d Mon Sep 17 00:00:00 2001 From: jonpas Date: Fri, 17 Apr 2015 17:45:10 +0200 Subject: [PATCH 191/305] Module names --- .../development/modularity-and-pbo-structure.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/documentation/development/modularity-and-pbo-structure.md b/documentation/development/modularity-and-pbo-structure.md index e3e8c5002a..0c16c4bc97 100644 --- a/documentation/development/modularity-and-pbo-structure.md +++ b/documentation/development/modularity-and-pbo-structure.md @@ -17,16 +17,16 @@ Main principles: Main principles: - Try to keep single module dependencies as much as possible -- InteractionMenu would be the requirement for most modules. -- Anything that is 100% config should require common and not interaction. +- Interact_Menu would be the requirement for most modules. +- Anything that is 100% config should require Common and not Interact_Menu. ``` -Main -> Common -> OptionsMenu -> InteractionMenu -> Most things +Main -> Common -> OptionsMenu -> Interact_Menu -> Most things Main -> Common -> Config things -Main -> Common -> 3D Models | - InteractionMenu | -> Feature +Main -> Common -> 3D Models | + Interact_Menu | -> Feature ``` From 31a2f1b279f049a39bda74c4af0c4c5fb97a3b37 Mon Sep 17 00:00:00 2001 From: EpMAK Date: Fri, 17 Apr 2015 19:36:07 +0300 Subject: [PATCH 192/305] Russian translations Again, filling strings, fixing errors --- addons/ballistics/stringtable.xml | 156 +++++++++++++++++++------ addons/laserpointer/stringtable.xml | 4 +- addons/medical/stringtable.xml | 4 +- addons/missileguidance/stringtable.xml | 16 +-- addons/movement/stringtable.xml | 4 +- addons/nametags/stringtable.xml | 16 ++- addons/nightvision/stringtable.xml | 6 +- addons/reload/stringtable.xml | 8 +- addons/respawn/stringtable.xml | 6 +- addons/weaponselect/stringtable.xml | 14 ++- addons/winddeflection/stringtable.xml | 9 +- 11 files changed, 176 insertions(+), 67 deletions(-) diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index c95da8d760..a60cefcf9d 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -13,7 +13,7 @@ 6.5mm 30ks Svítící IR-DIM Zásobník Carregador de 30 projéteis traçantes IR-DIM de 6,5mm Caricatore 6.5mm 30Rnd Traccianti IR-DIM - Магазин из 30-ти 6.5 мм трассирующих под ПНВ + Магазин из 30-ти 6,5 мм трассирующих под ПНВ 6.5mm IR-DIM @@ -25,7 +25,7 @@ 6.5mm IR-DIM 6,5mm IR-DIM 6.5 IR-DIM - 6.5 мм ИК-трассирующие + 6,5 мм ИК-трассирующие Caliber: 6.5x39 mm Tracer IR-DIM<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL @@ -37,7 +37,7 @@ Ráže: 6.5x39 mm Svítící IR-DIM<br />Munice: 30<br />Použití: MX/C/M/SW/3GL Calibre: 6,5x39 mm Traçante IR-DIM<br />Projéteis: 30<br />Usado em: MX/C/M/SW/3GL Calibro: 6.5x39 mm Traccianti IR-DIM <br />Munizioni: 30<br />In uso su: MX/C/M/SW/3GL - Калибр: 6.5x39 мм трассирующие под ПНВ<br />Патронов: 30<br />Применимы в: MX/C/M/SW/3GL + Калибр: 6,5x39 мм трассирующие под ПНВ<br />Патронов: 30<br />Используются с: MX/C/M/SW/3GL 6.5mm 30Rnd SD Mag @@ -49,7 +49,7 @@ 6.5mm 30ks SD Zásobník Carregador de 30 projéteis SD de 6,5mm Caricatore 6.5mm 30Rnd Sil. - Магазин из 30-ти 6.5 мм дозвуковых + Магазин из 30-ти 6,5 мм дозвуковых 6.5mm SD @@ -61,7 +61,7 @@ 6.5mm SD 6,5mm SD 6.5mm Sil. - 6.5 мм дозвуковые + 6,5 мм дозвуковые Caliber: 6.5x39 mm SD<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL @@ -73,7 +73,7 @@ Ráže: 6.5x39 mm SD<br />Munice: 30<br />Použití: MX/C/M/SW/3GL Calibre: 6,5x39 mm SD<br />Projéteis: 30<br />Usado em: MX/C/M/SW/3GL Calibro: 6.5x39 mm Sil.<br />Munizioni: 30<br />In uso su: MX/C/M/SW/3GL - Калибр: 6.5x39 мм дозвуковые<br />Патронов: 30<br />Применимы в: MX/C/M/SW/3GL + Калибр: 6,5x39 мм дозвуковые<br />Патронов: 30<br />Используются с: MX/C/M/SW/3GL 6.5mm 30Rnd AP Mag @@ -85,7 +85,7 @@ 6.5mm 30ks AP Zásobník Carregador de 30 projéteis AP de 6,5mm Caricatore 6.5mm 30Rnd AP - Магазин из 30-ти 6.5 мм бронебойных + Магазин из 30-ти 6,5 мм бронебойных 6.5mm AP @@ -97,7 +97,7 @@ 6.5mm AP 6,5mm AP 6.5mm AP - 6.5 мм бронебойные + 6,5 мм бронебойные Caliber: 6.5x39 mm AP<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL @@ -109,7 +109,7 @@ Ráže: 6.5x39 mm AP<br />Munice: 30<br />Použití: MX/C/M/SW/3GL Calibre: 6,5x39 mm AP<br />Projéteis: 30<br />Usado em: MX/C/M/SW/3GL Calibro: 6.5x39 mm AP<br />Munizioni: 30<br />In uso su: MX/C/M/SW/3GL - Калибр: 6.5x39 мм бронебойные<br />Патронов: 30<br />Применимы в: MX/C/M/SW/3GL + Калибр: 6,5x39 мм бронебойные<br />Патронов: 30<br />Используются с: MX/C/M/SW/3GL @@ -122,7 +122,7 @@ 6.5mm 30ks Svítící IR-DIM Zásobník Carregador de 30 projéteis traçantes IR-DIM de 6,5mm Caricatore 6.5mm 30Rnd Traccianti IR-DIM - Магазин из 30-ти 6.5 мм трассирующих под ПНВ + Магазин из 30-ти 6,5 мм трассирующих под ПНВ 6.5mm IR-DIM @@ -134,7 +134,7 @@ 6.5mm IR-DIM 6,5mm IR-DIM 6.5mm IR-DIM - 6.5 мм ИК-трассирующие + 6,5 мм ИК-трассирующие Caliber: 6.5x39 mm Tracer IR-DIM<br />Rounds: 30<br />Used in: Katiba @@ -146,7 +146,7 @@ Ráže: 6.5x39 mm Svítící IR-DIM<br />Munice: 30<br />Použití: Katiba Calibre: 6,5x39 mm Traçante IR-DIM<br />Projéteis: 30<br />Usado em: Katiba Calibro: 6.5x39 mm Tracciant IR-DIM<br />Munizioni: 30<br />In uso su: Katiba - Калибр: 6.5x39 мм трассирующие под ПНВ<br />Патронов: 30<br />Применимы в: Katiba + Калибр: 6,5x39 мм трассирующие под ПНВ<br />Патронов: 30<br />Используются с: Katiba 6.5mm 30Rnd SD Mag @@ -158,7 +158,7 @@ 6.5mm 30ks SD Zásobník Carregador de 30 projéteis SD de 6,5mm Caricatore 6.5mm 30Rnd Sil. - Магазин из 30-ти 6.5 мм дозвуковых + Магазин из 30-ти 6,5 мм дозвуковых 6.5mm SD @@ -170,7 +170,7 @@ 6.5mm SD 6,5mm SD 6.5mm Sil. - 6.5 мм дозвуковые + 6,5 мм дозвуковые Caliber: 6.5x39 mm SD<br />Rounds: 30<br />Used in: Katiba @@ -182,7 +182,7 @@ Ráže: 6.5x39 mm SD<br />Munice: 30<br />Použití: Katiba Calibre: 6,5x39 mm SD<br />Projéteis: 30<br />Usado em: Katiba Calibro: 6.5x39 mm Sil.<br />Munizioni: 30<br />In uso su: Katiba - Калибр: 6.5x39 мм дозвуковые<br />Патронов: 30<br />Применимы в: Katiba + Калибр: 6,5x39 мм дозвуковые<br />Патронов: 30<br />Используются с: Katiba 6.5mm 30Rnd AP Mag @@ -194,7 +194,7 @@ 6.5mm 30ks AP Zásobník Carregador de 30 projéteis AP de 6,5mm Caricatore 6.5mm 30Rnd AP - Магазин из 30-ти 6.5 мм бронебойных + Магазин из 30-ти 6,5 мм бронебойных 6.5mm AP @@ -206,7 +206,7 @@ 6.5mm AP 6,5mm AP 6.5mm AP - 6.5 мм бронебойные + 6,5 мм бронебойные Caliber: 6.5x39 mm AP<br />Rounds: 30<br />Used in: Katiba @@ -218,7 +218,7 @@ Ráže: 6.5x39 mm AP<br />Munice: 30<br />Použití: Katiba Calibre: 6,5x39 mm AP<br />Projéteis: 30<br />Usado em: Katiba Calibro: 6.5x39 mm AP<br />Munizioni: 30<br />In uso su: Katiba - Калибр: 6.5x39 мм бронебойные<br />Патронов: 30<br />Применимы в: Katiba + Калибр: 6,5x39 мм бронебойные<br />Патронов: 30<br />Используются с: Katiba @@ -231,7 +231,7 @@ 5.56mm 30ks Svítící IR-DIM Zásobník Carregador de 30 projéteis traçantes IR-DIM de 5,56mm Caricatore 5.56mm 30rnd Traccianti IR-DIM - Магазин из 30-ти 5.56 мм трассирующих под ПНВ + Магазин из 30-ти 5,56 мм трассирующих под ПНВ 5.56mm IR-DIM @@ -243,7 +243,7 @@ 5.56mm IR-DIM 5,56mm IR-DIM 5.56mm IR-DIM - 5.56 мм ИК-трассирующие + 5,56 мм ИК-трассирующие Caliber: 5.56x45 mm Tracer IR-DIM<br />Rounds: 30<br />Used in: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR @@ -255,7 +255,7 @@ Ráže: 5.56x45 mm Svítící IR-DIM<br />Munice: 30<br />Použití: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR Calibre: 5,56x45 mm Traçante IR-DIM<br />Projéteis: 30<br />Usado em: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR Calibro: 5.56x45 mm Traccianti IR-DIM<br />Munizioni: 30<br />In uso su: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Калибр: 5.56x45 мм трассирующие под ПНВ<br />Патронов: 30<br />Применимы в: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Калибр: 5,56x45 мм трассирующие под ПНВ<br />Патронов: 30<br />Используются с: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR 5.56mm 30Rnd AP Mag @@ -267,7 +267,7 @@ 5.56mm 30ks AP Zásobník Carregador de 30 projéteis AP de 5,56mm Caricatore 5.56mm 30Rnd AP - Магазин из 30-ти 5.56 мм бронебойных + Магазин из 30-ти 5,56 мм бронебойных 5.56mm AP @@ -279,7 +279,7 @@ 5.56mm AP 5,56mm AP 5.56mm AP - 5.56 мм бронебойные + 5,56 мм бронебойные Caliber: 5.56x45 mm AP<br />Rounds: 30<br />Used in: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR @@ -291,7 +291,7 @@ Ráže: 5.56x45 mm AP<br />Munice: 30<br />Použití: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR Calibre: 5,56x45 mm AP<br />Projéteis: 30<br />Usado em: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR Calibro: 5.56x45 mm AP<br />Munizioni: 30<br />In uso su: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Калибр: 5.56x45 мм бронебойные<br />Патронов: 30<br />Применимы в: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Калибр: 5,56x45 мм бронебойные<br />Патронов: 30<br />Используются с: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR @@ -304,7 +304,7 @@ 7.62mm 20ks Svítící Zásobník Carregador de 20 projéteis traçantes de 7,62mm Caricatore 7.62mm 20Rnd Traccianti - Магазин из 20-ти 7.62 мм трассирующих + Магазин из 20-ти 7,62 мм трассирующих 7.62mm Tracer @@ -316,7 +316,7 @@ 7.62mm Svítící 7,62mm Traçante 7.62mm Traccianti - 7.62 мм трассирущие + 7,62 мм трассирущие Caliber: 7.62x51 mm Tracer<br />Rounds: 20<br />Used in: Mk18 ABR @@ -328,7 +328,7 @@ Ráže: 7.62x51 mm Svítící<br />Munice: 20<br />Použití: Mk18 ABR Calibre: 7,62x51 mm Traçante<br />Projéteis: 20<br />Usado em: Mk18 ABR Calibro: 7.62x51 mm Traccianti<br />Munizioni: 20<br />In uso su: Mk18 ABR - Калибр: 7.62x51 мм трассирующие<br />Патронов: 20<br />Применимы в: Mk18 ABR + Калибр: 7,62x51 мм трассирующие<br />Патронов: 20<br />Используются с: Mk18 ABR 7.62mm 20rnd Tracer IR-DIM Mag @@ -340,7 +340,7 @@ 7.62mm 20ks Svítící IR-DIM Zásobník Carregador de 20 projéteis IR-DIM de 7,62mm Caricatore 7.62mm 20rnd Traccianti IR-DIM - Магазин из 20-ти 7.62 мм трассирующих под ПНВ + Магазин из 20-ти 7,62 мм трассирующих под ПНВ 7.62mm IR-DIM @@ -352,7 +352,7 @@ 7.62mm IR-DIM 7,62mm IR-DIM 7.62mm IR-DIM - 7.62 мм ИК-трассирующие + 7,62 мм ИК-трассирующие Caliber: 7.62x51 mm Tracer IR-DIM<br />Rounds: 20<br />Used in: Mk18 ABR @@ -364,7 +364,7 @@ Ráže: 7.62x51 mm Svítící IR-DIM<br />Munice: 20<br />Použití: Mk18 ABR Calibre: 7,62x51 mm Traçante IR-DIM<br />Projéteis: 20<br />Usado em: Mk18 ABR Calibro: 7.62x51 mm Traccianti IR-DIM<br />Munizioni: 20<br />In uso su: Mk18 ABR - Калибр: 7.62x51 мм трассирующие под ПНВ<br />Патронов: 20<br />Применимы в: Mk18 ABR + Калибр: 7,62x51 мм трассирующие под ПНВ<br />Патронов: 20<br />Используются с: Mk18 ABR 7.62mm 20Rnd SD Mag @@ -376,7 +376,7 @@ 7.62mm 20ks SD Zásobník Carregador de 20 projéteis SD de 7,62mm Caricatore 7.62mm 20Rnd Sil. - Магазин из 20-ти 7.62 мм дозвуковых + Магазин из 20-ти 7,62 мм дозвуковых 7.62mm SD @@ -388,7 +388,7 @@ 7.62mm SD 7,62mm SD 7.62mm Sil. - 7.62 мм дозвуковые + 7,62 мм дозвуковые Caliber: 7.62x51 mm SD<br />Rounds: 20<br />Used in: Mk18 ABR @@ -400,7 +400,7 @@ Ráže: 7.62x51 mm SD<br />Munice: 20<br />Použití: Mk18 ABR Calibre: 7,62x51 mm SD<br />Projéteis: 20<br />Usado em: Mk18 ABR Calibro: 7.62x51 mm Sil.<br />Munizioni: 20<br />In uso su: Mk18 ABR - Калибр: 7.62x51 мм дозвуковые<br />Патронов: 20<br />Применимы в: Mk18 ABR + Калибр: 7,62x51 мм дозвуковые<br />Патронов: 20<br />Используются с: Mk18 ABR 7.62mm 20Rnd AP Mag @@ -412,7 +412,7 @@ 7.62mm 20ks AP Zásobník Carregador de 20 projéteis AP de 7,62mm Caricatore 7.62mm 20Rnd AP - Магазин из 20-ти 7.62 мм бронебойных + Магазин из 20-ти 7,62 мм бронебойных 7.62mm AP @@ -424,7 +424,7 @@ 7.62mm AP 7,62mm AP 7.62mm AP - 7.62 мм бронебойные + 7,62 мм бронебойные Caliber: 7.62x51 mm AP<br />Rounds: 20<br />Used in: Mk18 ABR @@ -436,7 +436,7 @@ Ráže: 7.62x51 mm AP<br />Munice: 20<br />Použití: Mk18 ABR Calibre: 7,62x51 mm AP<br />Projéteis: 20<br />Usado em: Mk18 ABR Calibro: 7.62x51 mm AP<br />Munizioni: 20<br />In uso su: Mk18 ABR - Калибр: 7.62x51 мм дозвуковые<br />Патронов: 20<br />Применимы в: Mk18 ABR + Калибр: 7,62x51 мм дозвуковые<br />Патронов: 20<br />Используются с: Mk18 ABR @@ -445,6 +445,7 @@ Taśma .338 NM 130rd Smugacz Bande .338 NM 130Cps Traçante Cinta de 130 balas trazadoras de .338 NM + Лента из 130-ти .338 NM трассирующих .338 NM Tracer @@ -453,6 +454,7 @@ .338 NM Svítící .338 NM Traçante .338 NM trazadora + .338 NM трассирующие Caliber: .338 Norma Magnum Tracer<br />Rounds: 130<br />Used in: SPMG @@ -460,6 +462,7 @@ Kaliber: .338 Norma Magnum Smugacz<br />Pociski: 130<br />Używany w: SPMG Calibre: .338 Norma Magnum Traçante<br />Cartouches: 130<br />Utilisé dans: SPMG Calibre: .338 Norma Magnum trazadora<br />Balas: 130<br />Se usa en: SPMG + Калибр: .338 Norma Magnum трассирующие<br />Патронов: 130<br />Используются в: SPMG .338 NM 130Rnd IR-DIM Belt @@ -467,6 +470,7 @@ Taśma .338 NM 130rd IR-DIM Bande .338 NM 130Cps IR-DIM Cinta de 130 balas IR-DIM de .338 NM + Лента из 130-ти .338 NM трасирующих под ПНВ .338 NM IR-DIM @@ -475,6 +479,7 @@ .338 NM IR-DIM .338 NM IR-DIM .338 NM IR-DIM + .338 NM ИК-трассирующие Caliber: .338 Norma Magnum Tracer IR-DIM<br />Rounds: 130<br />Used in: SPMG @@ -482,6 +487,7 @@ Kaliber: .338 Norma Magnum Smugacz IR-DIM<br />Pociski: 130<br />Używany w: SPMG Calibre: .338 Norma Magnum Traçante IR-DIM<br />Cartouches: 130<br />Utilisé dans: SPMG Calibre: .338 Norma Magnum trazadora IR-DIM<br />Balas: 130<br />Se usa en: SPMG + Калибр: .338 Norma Magnum ИК-трассирующие<br />Патронов: 130<br />Используются с: SPMG .338 NM 130Rnd AP Belt @@ -489,6 +495,7 @@ Taśma .338 NM 130rd AP Bande .338 NM 130Cps AP Cinta de 130 balas AP de .338 NM + Лента из 130-ти .338 NM бронебойных .338 NM AP @@ -497,6 +504,7 @@ .338 NM AP .338 NM AP .338 NM AP + .338 NM бронебойные Caliber: .338 Norma Magnum AP<br />Rounds: 130<br />Used in: SPMG @@ -504,6 +512,7 @@ Kaliber: .338 Norma Magnum AP<br />Pociski: 130<br />Używane w: SPMG Calibre: .338 Norma Magnum AP<br />Cartouches: 130<br />Utilisé dans: SPMG Calibre: .338 Norma Magnum AP<br />Balas: 130<br />Se usa en: SPMG + Калибр: .338 Norma Magnum бронебойные<br />Патронов: 130<br />Используются с: SPMG @@ -512,6 +521,7 @@ Magazynek 9.3mm 10rd Smugacz Chargeur 9.3mm 10Cps Traçante Cargador de 10 balas trazadoras de 9.3mm + Магазин из 10-ти 9,3 мм трассирующих 9.3mm Tracer @@ -520,6 +530,7 @@ 9.3mm Svítící 9.3mm Traçante 9.3mm trazadora + 9,3 мм трассирующие Caliber: 9.3x64mm Tracer<br />Rounds: 10<br />Used in: Cyrus @@ -527,6 +538,7 @@ Kaliber: 9,3x64 mm Smugacz<br />Pociski: 10<br />Używany w: Cyrus Calibre: 9.3x64mm Traçante<br />Cartouches: 10<br />Utilisé dans: Cyrus Calibre: 9.3x64mm trazadora<br />Balas: 10<br />Se usa en: Cyrus + Калибр: 9,3x64 мм трассирующие<br />Патронов: 10<br />Используются с: Cyrus 9.3mm 10Rnd Tracer IR-DIM Mag @@ -534,6 +546,7 @@ Magazynek 9,3mm 10rd Smugacz IR-DIM Chargeur 9.3mm 10Cps Traçante IR-DIM Cargador de 10 balas trazadoras IR-DIM de 9.3mm + Магазин из 10-ти 9,3 мм ИК-трассирующих 9.3mm IR-DIM @@ -542,6 +555,7 @@ 9.3mm IR-DIM 9.3mm IR-DIM 9.3mm IR-DIM + 9,3 мм ИК-трассирующие Caliber: 9.3x64mm Tracer IR-DIM<br />Rounds: 10<br />Used in: Cyrus @@ -549,6 +563,7 @@ Kaliber: 9,3x64 mm Smugacz IR-DIM<br />Pociski: 10<br />Używany w: Cyrus Calibre: 9.3x64mm Traçante IR-DIM<br />Cartouches: 10<br />Utilisé dans: Cyrus Calibre: 9.3x64mm trazadora IR-DIM<br />Balas: 10<br />Se usa en: Cyrus + Калибр: 9,3x64 мм ИК-трассирующие<br />Патронов: 10<br />Используются с: Cyrus 9.3mm 10Rnd AP Mag @@ -556,6 +571,7 @@ Magazynek 9,3mm 10rd AP Chargeur 9.3mm 10Cps AP Cargador de 10 balas AP de 9.3mm + Магазин из 10-ти 9,3 мм бронебойных 9.3mm AP @@ -564,6 +580,7 @@ 9.3mm AP 9.3mm AP 9.3mm AP + 9,3 мм бронебойные Caliber: 9.3x64mm AP<br />Rounds: 10<br />Used in: Cyrus @@ -571,6 +588,7 @@ Kaliber: 9,3x64 mm AP<br />Pociski: 10<br />Używany w: Cyrus Calibre: 9.3x64mm AP<br />Cartouches: 10<br />Utilisé dans: Cyrus Calibre: 9.3x64mm AP<br />Balas: 10<br />Se usa en: Cyrus + Калибр: 9,3x64 мм бронебойные<br />Патронов: 10<br />Используются с: Cyrus @@ -579,6 +597,7 @@ Taśma 9,3mm 150rd Smugacz Bande 9.3mm 150Cps Traçante Cinta de 150 balas trazadoras de 9.3mm + Лента из 150-ти 9,3 мм трассирующих 9.3mm Tracer @@ -587,6 +606,7 @@ 9.3mm Svítící 9.3mm Traçante 9.3mm trazadora + 9,3 мм трассирующие Caliber: 9.3x64mm Tracer<br />Rounds: 150<br />Used in: Navid @@ -594,6 +614,7 @@ Kaliber: 9,3x64 mm Smugacz<br />Pociski: 150<br />Używane w: Navid Calibre: 9.3x64mm Traçante<br />Cartouches: 150<br />Utilisé dans: Navid Calibre: 9.3x64mm trazadora<br />Balas: 150<br />Se usa en: Navid + Калибр: 9,3x64 мм трассирующие<br />Патронов: 150<br />Используются с: Навид 9.3mm 150Rnd Tracer IR-DIM Belt @@ -601,6 +622,7 @@ Taśma 9,3mm 150rd Smugacz IR-DIM Bande 9.3mm 150Cps Traçante IR-DIM Cinta de 150 balas trazadoras IR-DIM de 9.3mm + Лента из 150-ти 9,3 мм ИК-трассирующих 9.3mm IR-DIM @@ -609,6 +631,7 @@ 9.3mm IR-DIM 9.3mm IR-DIM 9.3mm IR-DIM + 9,3 мм ИК-трассирующие Caliber: 9.3x64mm Tracer IR-DIM<br />Rounds: 150<br />Used in: Navid @@ -616,6 +639,7 @@ Kaliber: 9,3x64 mm Smugacz IR-DIM<br />Pociski: 150<br />Używane w: Navid Calibre: 9.3x64mm Traçante IR-DIM<br />Cartouches: 150<br />Utilisé dans: Navid Calibre: 9.3x64mm trazadora IR-DIM<br />Balas: 150<br />Se usa en: Navid + Калибр: 9,3x64 мм ИК-трассирующие<br />Патронов: 150<br />Используются с: Навид 9.3mm 150Rnd AP Belt @@ -623,6 +647,7 @@ Taśma 9,3mm 150rd AP Bande 9.3mm 150Cps AP Cinta de 150 balas AP de 9.3mm + Лента из 150-ти 9,3 мм бронебойных 9.3mm AP @@ -631,6 +656,7 @@ 9.3mm AP 9.3mm AP 9.3mm AP + 9,3 мм бронебойные Caliber: 9.3x64mm AP<br />Rounds: 150<br />Used in: Navid @@ -638,333 +664,391 @@ Kaliber: 9,3x64 mm AP<br />Pociski: 150<br />Używane w: Navid Calibre: 9.3x64mm AP<br />Cartouches: 150<br />Utilisé dans: Navid Calibre: 9.3x64mm AP<br />Balas: 150<br />Se usa en: Navid + Калибр: 9,3x64 мм бронебойные<br />Патронов: 150<br />Используются с: Навид 9x19mm 16Rnd Mag Magazynek 9x19mm 16rd Chargeur 9x19mm 16Cps Cargador de 16 balas de 9x19mm + Магазин из 16-ти 9х19 мм 9x19mm 9x19mm 9x19mm 9x19mm + 9х19 мм 9x19mm 30Rnd Mag Magazynek 9x19mm 16rd 9x19mm 30Cps Cargador de 16 balas de 9x19mm + Магазин из 30-ти 9х19 мм 9x19mm 30Rnd Mag Magazynek 9x19mm 30rd 9x19mm 30Cps Cargador de 30 balas de 9x19mm + Магазин из 30-ти 9х19 мм 9x19mm 9x19mm 9x19mm 9x19mm + 9х19 мм 9x19mm 30Rnd Mag Magazynek 9x19mm 30rd 9x19mm 30Cps Cargador de 30 balas de 9x19mm + Магазин из 30-ти 9х19 мм 7.62x54mm 10Rnd Tracer IR-DIM Mag Magazynek 7,62x54 mm 10rd Smugacz IR-DIM Chargeur 7.62x54mm 10Rnd Traçante IR-DIM Cargador de 10 balas trazadoras IR-DIM de 7.62x54mm + Магазин из 10-ти 7,62 мм ИК-трассирующих 7.62mm IR-DIM 7,62mm IR-DIM 7.62mm IR-DIM 7.62mm IR-DIM + 7,62 мм ИК-трассирующие 7.62x54mm 10Rnd Tracer IR-DIM Mag Magazynek 7,62x54 mm 10rd Smugacz IR-DIM Chargeur 7.62x54mm 10Cps Traçante IR-DIM Cargador de 10 balas trazadoras IR-DIM de 7.62x54mm + Магазин из 10-ти 7,62 мм ИК-трассирующих 6.5mm 100Rnd Tracer IR-DIM Mag Magazynek 6,5mm 100rd Smugacz IR-DIM Chargeur 6.5mm 100Rnd Traçante IR-DIM Cargador de 100 balas trazadoras IR-DIM de 6.5mm + Магазин из 100-ти 6,5 мм ИК-трассирующих 6.5mm IR-DIM 6,5mm IR-DIM 6.5mm IR-DIM 6.5mm IR-DIM + 6,5 мм ИК-трассирующие 6.5mm 100Rnd Tracer IR-DIM Mag Magazynek 6,5mm 100rd Smugacz IR-DIM Chargeur 6.5mm 100Rnd Traçante IR-DIM Cargador de 100 balas trazadoras IR-DIM de 6.5mm + Магазин из 100-ти 6,5 мм ИК-трассирующих 6.5mm 200Rnd Tracer IR-DIM Belt Magazynek 6,5mm 200rd Smugacz IR-DIM Bande 6.5mm 200Rnd Traçante IR-DIM Cinta de 200 balas trazadoras IR-DIM de 6.5mm + Магазин из 200-ти 6,5 мм ИК-трассирующих 6.5mm IR-DIM 6,5mm IR-DIM 6.5mm IR-DIM 6.5mm IR-DIM + 6,5 мм ИК-трассирующие 6.5mm 200Rnd Tracer IR-DIM Belt Magazynek 6,5mm 200rd Smugacz IR-DIM Bande 6.5mm 200Cps Traçante IR-DIM Cinta de 200 balas trazadoras IR-DIM de 6.5mm + Магазин из 200-ти 6,5 мм ИК-трассирующих 5.56mm 30Rnd Mag (Mk262) Magazynek 5,56mm 30rd Mk262 5.56mm 30Cps (Mk262) Cargador de 30 balas de 5.56mm (Mk262) + Магазин из 30-ти 5.56 мм Mk262 5.56mm Mk262 5,56mm Mk262 5.56mm Mk262 5.56mm (Mk262) + 5,56 мм Mk262 Caliber: 5.56x45 mm NATO (Mk262)<br />Rounds: 30 Kaliber: 5,56x45 mm NATO (Mk262)<br />Pociski: 30 Calibre: 5.56x45 mm NATO (Mk262)<br />Cartouches: 30 Calibre: 5.56x45 mm NATO (Mk262)<br />Balas: 30 + Калибр: 5,56x45 mm NATO (Mk262)<br />Патронов: 30 5.56mm 30Rnd Mag (Mk318) Magazynek 5,56mm 30rd Mk318 5.56mm 30Cps (Mk318) Cargador de 30 balas de 5.56mm (Mk318) + Магазин из 30-ти 5.56 мм Mk318 5.56mm Mk318 5,56mm Mk318 5.56mm Mk318 5.56mm (Mk318) + 5.56 мм Mk318 Caliber: 5.56x45 mm NATO (Mk318)<br />Rounds: 30 Kaliber: 5,56x45 mm NATO (Mk318)<br />Pociski: 30 Calibre: 5.56x45 mm NATO (Mk318)<br />Cartouches: 30 Calibre: 5.56x45 mm NATO (Mk318)<br />Balas: 30 + Калибр: 5,56x45 mm NATO (Mk318)<br />Патронов: 30 7.62mm 10Rnd Mag (M118LR) Magazynek 7,62mm 10rd (M118LR) 7.62mm 10Cps (M118LR) Cargador de 10 balas de 7.62mm (M118LR) + Магазин из 10-ти 7,62 мм (M118LR) 7.62mm M118LR 7,62mm M118LR 7.62mm M118LR 7.62mm (M118LR) + 7,62 мм M118LR Caliber: 7.62x51 mm NATO (M118LR)<br />Rounds: 10 Kaliber: 7,62x51 mm NATO (M118LR)<br />Pociski: 10 Calibre: 7.62x51 mm NATO (M118LR)<br />Cartouches: 10 Calibre: 7.62x51 mm NATO (M118LR)<br />Balas: 10 + Калибр: 7,62x51 мм NATO (M118LR)<br />Патронов: 10 7.62mm 20Rnd Mag (M118LR) Magazynek 7,62mm 20rd (M118LR) 7.62mm 20Cps (M118LR) Cargador de 20 balas de 7.62mm (M118LR) + Магазин из 20-ти 7,62 мм (M118LR) 7.62mm M118LR 7,62mm M118LR 7.62mm M118LR 7.62mm (M118LR) + 7,62 мм M118LR Caliber: 7.62x51 mm NATO (M118LR)<br />Rounds: 20 Kaliber: 7,62x51 mm NATO (M118LR)<br />Pociski: 20 Calibre: 7.62x51 mm NATO (M118LR)<br />Cartouches: 20 Calibre: 7.62x51 mm NATO (M118LR)<br />Balas: 20 + Калибр: 7,62x51 мм NATO (M118LR)<br />Патронов: 20 7.62mm 10Rnd Mag (Mk319 Mod 0) Magazynek 7,62mm 10rd (Mk319 Mod 0) 7.62mm 10Cps (Mk319 Mod 0) Cargador de 10 balas de 7.62mm (Mk319 Mod 0) + Магазин из 10-ти 7,62 мм (Mk319 Mod 0) 7.62mm Mk319 7,62mm Mk319 7.62mm Mk319 7.62mm Mk319 + 7,62mm Mk319 Caliber: 7.62x51 mm NATO (Mk319 Mod 0)<br />Rounds: 10 Kaliber: 7,62x51 mm NATO (Mk319 Mod 0)<br />Pociski: 10 Calibre: 7.62x51 mm NATO (Mk319 Mod 0)<br />Cartouches: 10 Calibre: 7.62x51 mm NATO (Mk319 Mod 0)<br />Balas: 10 + Калибр: 7,62x51 мм NATO (Mk319 Mod 0)<br />Патронов: 10 7.62mm 20Rnd Mag (Mk319 Mod 0) Magazynek 7,62mm 20rd (Mk319 Mod 0) 7.62mm 20Cps (Mk319 Mod 0) Cargador de 20 balas de 7.62mm (Mk319 Mod 0) + Магазин из 20-ти 7,62 мм (Mk319 Mod 0) 7.62mm Mk319 7,62mm Mk319 7.62mm Mk319 7.62mm Mk319 + 7,62 мм Mk319 Caliber: 7.62x51 mm NATO (Mk319 Mod 0)<br />Rounds: 20 Kaliber: 7,62x51 mm NATO (Mk319 Mod 0)<br />Pociski: 20 Calibre: 7.62x51 mm NATO (Mk319 Mod 0)<br />Cartouches: 20 Calibre: 7.62x51 mm NATO (Mk319 Mod 0)<br />Balas: 20 + Калибр: 7,62x51 мм NATO (Mk319 Mod 0)<br />Патронов: 20 7.62mm 20Rnd Mag (Mk248 Mod 0) Magazynek 7,62mm 20rd (Mk248 Mod 0) 7.62mm 20Cps (Mk248 Mod 0) Cargador de 20 balas de 7.62mm (Mk248 Mod 0) + Магазин из 20-ти 7,62 мм (Mk248 Mod 0) 7.62mm (Mk248 Mod 0) 7,62mm (Mk248 Mod 0) 7.62mm (Mk248 Mod 0) 7.62mm (Mk248 Mod 0) + 7,62 мм (Mk248 Mod 0) Caliber: 7.62x67 mm NATO (Mk248 Mod 0)<br />Rounds: 20 Kaliber: 7,62x67 mm NATO (Mk248 Mod 0)<br />Pociski: 20 Calibre: 7.62x67mm NATO (Mk248 Mod 0)<br />Cartouches: 20 Calibre: 7.62x67 mm NATO (Mk248 Mod 0)<br />Balas: 20 + Калибр: 7,62x67 мм NATO (Mk248 Mod 0)<br />Патронов: 20 7.62mm 20Rnd Mag (Mk248 Mod 1) Magazynek 7,62mm 20rd (Mk248 Mod 1) 7.62mm 20Cps (Mk248 Mod 1) Cargador de 20 balas de 7.62mm (Mk248 Mod 1) + Магазин из 20-ти 7,62 мм (Mk248 Mod 1) 7.62mm (Mk248 Mod 1) 7,62mm (Mk248 Mod 1) 7.62mm (Mk248 Mod 1) 7.62mm (Mk248 Mod 1) + 7,62 мм (Mk248 Mod 1) Caliber: 7.62x67 mm NATO (Mk248 Mod 1)<br />Rounds: 20 Kaliber: 7,62x67 mm NATO (Mk248 Mod 1)<br />Pociski: 20 Calibre: 7.62x67mm NATO (Mk248 Mod 1)<br />Cartouches: 20 Calibre: 7.62x67 mm NATO (Mk248 Mod 1)<br />Balas: 20 + Калибр: 7,62x67 мм NATO (Mk248 Mod 1)<br />Патронов: 20 7.62mm 20Rnd Mag (Berger Hybrid OTM) Magazynek 7,62mm 20rd (Berger Hybrid OTM) 7.62 20Cps (Berger Hybrid OTM) Cargador de 20 balas de 7.62mm (Berger Hybrid OTM) + Магазин из 20-ти 7,62 мм (Berger Hybrid OTM) 7.62mm (OTM) 7,62mm (OTM) 7.62mm (OTM) 7.62mm (OTM) + 7,62 мм (OTM) Caliber: 7.62x67 mm NATO (Berger Hybrid OTM)<br />Rounds: 20 Kaliber: 7,62x67 mm NATO (Berger Hybrid OTM)<br />Pociski: 20 Calibre: 7.62x67mm NATO (Berger Hybrid OTM)<br />Cartouches: 20 Calibre: 7.62x67 mm NATO (Berger Hybrid OTM)<br />Balas: 20 + Калибр: 7,62x67 мм NATO (Berger Hybrid OTM)<br />Патронов: 20 6.5x47mm 30Rnd Mag (HPBT Scenar) 6.5x47mm 30Cps (HPBT Scenar) Cargador de 30 balas de 6.5x47mm (HPBT Scenar) + Магазин из 30-ти 6,5x47 мм (HPBT Scenar) 6.5mm Scenar 6.5mm Scenar 6.5mm Scenar + 6,5 мм Scenar Caliber: 6.5x47mm (HPBT Scenar)<br />Rounds: 30 Calibre: 6.5x47mm (HPBT Scenar)<br />Cartouches: 30 Calibre: 6.5x47mm (HPBT Scenar)<br />Balas: 30 + Калибр: 6,5x47 мм (HPBT Scenar)<br />Патронов: 30 .338 10Rnd Mag (300gr Sierra MatchKing HPBT) .338 10 Cps (300gr Sierra MatchKing HPBT) Cargador de 10 balas de 8.6x70mm (300gr Sierra MatchKing HPBT) + Магазин из 10-ти .338 (300 гран Sierra MatchKing HPBT) .338 (HPBT) .338 (HPBT) .338 (HPBT) + .338 (HPBT) Caliber: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />Rounds: 10 Calibre: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />Cartouches: 10 Calibre: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />Balas: 10 + Калибр: 8,6x70 мм (300 гран Sierra MatchKing HPBT)<br />Патронов: 10 .338 10Rnd Mag (API526) .338 10Cps (API526) Cargador de 10 balas de .338 (API526) + Магазин из 10-ти .338 (API526) .338 AP .338 AP .338 AP + .338 бронебойные Caliber: 8.6x70mm (API526)<br />Rounds: 10 Calibre: 8.6x70mm (API526)<br />Cartouches: 10 Calibre: 8.6x70mm (API526)<br />Balas: 10 + Калибр: 8,6x70mm (API526)<br />Патронов: 10 12.7x99mm 5Rnd Mag 12.7x99mm 5Cps Cargador de 5 balas de 12.7x99mm + Магазин из 5-ти 12,7x99 мм 12.7mm 12.7mm 12.7mm + 12,7 мм Caliber: 12.7x99mm<br />Rounds: 5 Calibre: 12.7x99mm<br />Cartouches: 5 Calibre: 12.7x99mm<br />Balas: 5 + Калибр: 12,7x99mm<br />Патронов: 5 12.7x99mm 5Rnd Mag (AMAX) 12.7x99mm 5Rnd Mag (AMAX) Cargador de 5 balas de 12.7x99mm (AMAX) + Магазин из 5-ти 12,7x99 мм (A-MAX) 12.7mm 12.7mm 12.7mm + 12,7 мм Caliber: 12.7x99mm (AMAX)<br />Rounds: 5 Calibre: 12.7x99mm (AMAX)<br />Cartouches: 5 Calibre: 12.7x99mm (AMAX)<br />Balas: 5 + Калибр: 12,7x99 мм (A-MAX)<br />Патронов: 5 \ No newline at end of file diff --git a/addons/laserpointer/stringtable.xml b/addons/laserpointer/stringtable.xml index 6be6baf82b..8fa38e24dd 100644 --- a/addons/laserpointer/stringtable.xml +++ b/addons/laserpointer/stringtable.xml @@ -42,7 +42,7 @@ <t color='#9cf953'>Uso: </t>Laser ON/OFF <t color='#9cf953'>Użyj: </t>wł./wył. laser <t color='#9cf953'>Uso: </t>Ativar/Desativar laser - <t color='#9cf953'>Использовать: </t>вкл/выкл лазер + <t color='#9cf953'>Использовать: </t>ВКЛ/ВЫКЛ лазер <t color='#9cf953'>Usar: </t>encender/apagar láser <t color='#9cf953'>Használat: </t>Lézer BE/KI kapcsolása @@ -72,4 +72,4 @@ Cambiar Laser / Laser IR - + \ No newline at end of file diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 9f651e90b7..598e64efb0 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -468,7 +468,7 @@ Minor Gering Menor - Незначительная + Незначительные травмы Normalny Mineur Minimální @@ -1611,4 +1611,4 @@ Aberración cromática - + \ No newline at end of file diff --git a/addons/missileguidance/stringtable.xml b/addons/missileguidance/stringtable.xml index c9cb4c4c6b..aec2303301 100644 --- a/addons/missileguidance/stringtable.xml +++ b/addons/missileguidance/stringtable.xml @@ -11,7 +11,7 @@ Guida missili avanzata Avançado Missile Guidance Fejlett rakétairányító - Расширенный ракетой + Продвинутое наведение ракет Hydra-70 DAGR Missile @@ -23,7 +23,7 @@ Missile Hydra-70 DAGR Hydra-70 DAGR rakéta - + Hydra-70 DAGR DAGR @@ -35,7 +35,7 @@ DAGR DAGR - + DAGR Hydra-70 DAGR Laser Guided Missile @@ -47,7 +47,7 @@ Hydra-70 DAGR missile guida laser Hydra-70 DAGR lézer-irányított rakéta - + Управляемая ракета лазерного наведения Hydra-70 DAGR Hellfire II AGM-114K Missile @@ -59,7 +59,7 @@ Missile Hellfire II AGM-114K Hellfire II AGM-114K rakéta - + Hellfire II AGM-114K AGM-114K @@ -71,7 +71,7 @@ AGM-114K AGM-114K - + AGM-114K Hellfire II AGM-114K Laser Guided Missile @@ -83,7 +83,7 @@ Missile guida laser Hellfire II AGM-114K Hellfire II AGM-114K lézer-irányított rakéta - + Управляемая ракета лазерного наведения Hellfire II AGM-114K - + \ No newline at end of file diff --git a/addons/movement/stringtable.xml b/addons/movement/stringtable.xml index eb91496de8..843705ebea 100644 --- a/addons/movement/stringtable.xml +++ b/addons/movement/stringtable.xml @@ -11,7 +11,7 @@ Mostra peso in libbre Mostrar peso em libras Súly megjelenítése fontban. - Показать вес в фунтах + Показывать вес в фунтах Weight: @@ -48,4 +48,4 @@ Non puoi arrampicarti qui - + \ No newline at end of file diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index 32eb35781b..5ad5b4b956 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -10,6 +10,7 @@ Pokaż imiona Nevek mutatása Показать имена + Mostra i nomi Show player names @@ -30,7 +31,7 @@ Zeige Spielernamen nur an, wenn die Maus auf sie gerrichtet ist (benötigt Spielernamen) Noms uniquement sous le curseur (si noms affichés) Zobrazit jméno hráče jenom na kurzor (vyžaduje jména hráčů) - Mostra i nomi solo se puntati (richiede i nomi dei giocatori abilitati) + Mostra i nomi solo se puntati (richiede mostra nomi abilitato) Mostrar nome de jogador somente no cursor (requer nome de jogadores) Játékosok nevének mutatása csak a kurzoron (a nevek mutatása szükséges) Показать имена игроков только под курсором (требует имен игроков) @@ -44,6 +45,7 @@ Pokaż imiona graczy tylko po przytrzymaniu klawisza (wymagana opcja Pokaż imiona graczy) Játékosnevek mutatása csak gombnyomásra (a nevek mutatása szükséges) Показать имена игроков только по нажатию клавиши (требует имен игроков) + Mostra i nomi solo se si preme il tasto (richiede mostra nomi abilitato) Show player ranks (requires player names) @@ -52,10 +54,10 @@ Mostrar rango de los jugadores (requiere Mostrar nombres de jugadores) Grade des joueurs (si noms affichés) Zobrazit hodnosti hráčů (vyžaduje jména hráčů) - Mostra i gradi (richiede i nomi dei giocatori abilitati) + Mostra i gradi (richiede mostra nomi abilitato) Mostrar patente de jogadores (requer nome de jogadores) Játékosok rendfokozatának mutatása (a nevek mutatása szükséges) - Показать звания игроков (требует имен игроков) + Показывать звания игроков (требует имен игроков) Show vehicle crew info @@ -64,8 +66,9 @@ Mostrar tripulantes Pokaż załogę pojazdu Zobrazit info o posádce vozidla - Показать экипаж + Показывать информацию об экипаже Jármű-legénység adatainak mutatása + Mostra le informazioni sull'equipaggio del veicolo Show name tags for AI units @@ -76,6 +79,7 @@ Wyświetl imiona jednostek AI Afficher les noms des IA Névcímkék mutatása MI-egységeknél + Mostra le tag nomi per le unità AI Show SoundWaves (requires player names) @@ -86,6 +90,7 @@ Pokaż fale dźwiękowe (wymagana opcja Pokaż imiona graczy) Afficher "qui parle" (si noms affichés) "Hanghullámok" mutatása (a nevek mutatása szükséges) + Mostra barra movimento audio (richiede mostra nomi abilitato) Default Nametag Color (Non Group Members) @@ -96,6 +101,7 @@ Couleur d'affichage par défaut (si dans aucun groupe) Standardní barva jmenovek (pro nečleny jednotky) Alap névcímke-szín (csoporton kívüli személyek) + Colore nametag di default (membri non del gruppo) - + \ No newline at end of file diff --git a/addons/nightvision/stringtable.xml b/addons/nightvision/stringtable.xml index 20c916104a..a2e24d79df 100644 --- a/addons/nightvision/stringtable.xml +++ b/addons/nightvision/stringtable.xml @@ -91,7 +91,7 @@ Sistema de visión nocturna (Panorámicas) Gogle noktowizyjne (panoramiczne) Noktovizor (Širokoúhlý) - ПНВ (Широкий) + ПНВ (Широкоугольный) JVN (Large) Éjjellátó szemüveg (széles látószögű) @@ -102,7 +102,7 @@ Czułość: %1 Jas: %1 Luminosité : %1 - Контраст: + Яркость: %1 Fényerő: %1 Luminosidade: %1 Luminosità: %1 @@ -132,4 +132,4 @@ Riduci la luminosità dell'NVG - + \ No newline at end of file diff --git a/addons/reload/stringtable.xml b/addons/reload/stringtable.xml index 7c401fec05..425c2ba8db 100644 --- a/addons/reload/stringtable.xml +++ b/addons/reload/stringtable.xml @@ -10,6 +10,7 @@ Sprawdź stan amunicji przy przeładowaniu broni Vérification des munitions au rechargement Lőszer ellenőrzése a fegyver újratöltésekor + Controlla le munizioni ricaricando Check the ammo in your new magazine on magazine reload. @@ -20,6 +21,7 @@ Pokaż stan amunicji w nowym magazynku przy przeładowaniu broni Vérification du nombre de munition au rechargement A lőszer ellenőrzése az új tárad behelyezésekor újratöltés közben. + Controlla le munizioni rimanenti nel caricatore in fase di cambio caricatore. Check Ammo @@ -31,7 +33,7 @@ Zkontrolovat Munici Controlla le munizioni Conferir munições - Kонтроль Боеприпасы + Проверить боеприпасы Ammo @@ -54,6 +56,7 @@ Podłącz taśmę Gurt anhängen Töltényheveder összekötése + Attacca la tracolla Linking belt... @@ -64,6 +67,7 @@ Podłączanie taśmy... Gurt anhängen ... Töltényheveder összekötése folyamatban... + Attacco la tracolla... - + \ No newline at end of file diff --git a/addons/respawn/stringtable.xml b/addons/respawn/stringtable.xml index dceeb687fe..67273ff96d 100644 --- a/addons/respawn/stringtable.xml +++ b/addons/respawn/stringtable.xml @@ -10,6 +10,7 @@ Rozmieszczenie za 5 sekund ... Respawn za 5 sekund... Kihelyezés 5 másodperc múlva ... + Dispiegamento in 5 secondi ... Rallypoint deployed @@ -20,6 +21,7 @@ Punkt zbiórki rozmieszczony Rallypoint umístěn Gyülekezőpont elhelyezve + Rallypoint dispiegato Teleported to Base @@ -30,6 +32,7 @@ Przeteleportowano do bazy Odteleportován na základnu Bázisra teleportálva + Teleportato alla base Teleported to Rallypoint @@ -40,6 +43,7 @@ Przeteleportowano do punktu zbiórki Odteleportován na rallypoint Gyülekezőpontra teleportálva + Teleportato al rallypoint Rallypoint West (Base) @@ -57,7 +61,7 @@ Rallypoint Independent (Base) Sammelpunkt Widerstand (Basis) Punto de reunión Independiente (Base) - Точка сбора Независимых (База + Точка сбора Независимых (База) Rallypoint West diff --git a/addons/weaponselect/stringtable.xml b/addons/weaponselect/stringtable.xml index ae99f3e032..14f24b92e1 100644 --- a/addons/weaponselect/stringtable.xml +++ b/addons/weaponselect/stringtable.xml @@ -10,6 +10,7 @@ Wyświetl tekst przy rzucie granatem Afficher texte lors d'un lancé de grenade Szöveg mutatása gránát eldobásakor + Mostra indicazioni nel lancio granate Display a hint or text on grenade throw. @@ -20,6 +21,7 @@ Wyświetla powiadomienie lub tekst przy rzucie granatem. Afficher texte/info au lancé de grenade Jelez egy súgót vagy szöveget a gránát eldobásakor. + Mostra un suggerimento quando si lanciano granate Select Pistol @@ -55,7 +57,7 @@ Sélectionner Lanceur Rakétavető Kiválasztása Selecionar Lançador - Seleziona il Lanciatore + Seleziona il Lanciamissili Select Grenade Launcher @@ -162,6 +164,7 @@ Gránát: %1 Граната %1 Grenade %1 + Granata %1 Ready Grenade @@ -172,6 +175,7 @@ Gránát előkészítése Подготовить гранату Grenade prête + Granata pronta Select Frag Grenade @@ -194,7 +198,7 @@ Nem-robbanó Gránát Kiválasztása Zvolit Ne-Výbušný Granát Selecionar Granada - Seleziona Altre Granate + Seleziona granate non a frammentazione Выбрать гранату @@ -218,6 +222,7 @@ Žádné granáty Nincs több gránát Гранат не осталось + Granate esaurite No frags left @@ -241,7 +246,7 @@ Už nejsou žádné ostatní granáty Não há outras granadas restantes Nessun'altra granata rimanente. - Летальные гранаты закончились + Нелетальные гранаты закончились No grenade selected @@ -263,7 +268,8 @@ Tirer le lance-pots fumigènes Wystrzel granat dymny Füstvető eltüzelése - Запустить дымовую завесу + Пустить дымовую завесу + Lancia fumogeno \ No newline at end of file diff --git a/addons/winddeflection/stringtable.xml b/addons/winddeflection/stringtable.xml index 897a3c556b..73d07eddd4 100644 --- a/addons/winddeflection/stringtable.xml +++ b/addons/winddeflection/stringtable.xml @@ -11,16 +11,18 @@ Vent Windinformationen Szélinformáció + Informazioni sul vento Direction: %1 Kierunek: %1 Dirección: %1 - Направление: %1 + Направление: %1° Směr: %1 Direction %1 Windrichtung: %1 Irány: %1 + Direzione: %1 Speed: %1 m/s @@ -31,6 +33,7 @@ Vitesse %1 m/s Geschwindigkeit: %1m/s Sebesség: %1 m/s + Velocità: %1 m/s Weather Information @@ -41,6 +44,7 @@ Météo Wetterinformationen Időjárás-Információ + Meteo Humidity: %1% @@ -51,7 +55,8 @@ Humidité: %1% Luftfeuchtigkeit: %1 Páratartalom: %1% + Umidità: %1% - + \ No newline at end of file From 9cede7cf85ab3882f54c879570edbcfd2172328a Mon Sep 17 00:00:00 2001 From: jonpas Date: Fri, 17 Apr 2015 19:10:41 +0200 Subject: [PATCH 193/305] Module name Interact_Menu -> Interaction in documentation --- .../development/modularity-and-pbo-structure.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/documentation/development/modularity-and-pbo-structure.md b/documentation/development/modularity-and-pbo-structure.md index 0c16c4bc97..036ebb35d4 100644 --- a/documentation/development/modularity-and-pbo-structure.md +++ b/documentation/development/modularity-and-pbo-structure.md @@ -17,16 +17,14 @@ Main principles: Main principles: - Try to keep single module dependencies as much as possible -- Interact_Menu would be the requirement for most modules. -- Anything that is 100% config should require Common and not Interact_Menu. +- Interaction would be the requirement for most modules. +- Anything that is 100% config should require Common and not Interaction. ``` -Main -> Common -> OptionsMenu -> Interact_Menu -> Most things +Main -> Common -> OptionsMenu -> Interaction -> Most things Main -> Common -> Config things Main -> Common -> 3D Models | - Interact_Menu | -> Feature + Interaction | -> Feature ``` - - From 6e077de829d2a7c95a1f443553e40289f939a278 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 17 Apr 2015 12:13:23 -0500 Subject: [PATCH 194/305] Medical - Use default value instead of 0 for getVar #683 - should prevent people getting knocked out from any damage source if the variables are undefined --- addons/medical/XEH_postInit.sqf | 2 +- addons/medical/functions/fnc_addToInjuredCollection.sqf | 6 +++--- addons/medical/functions/fnc_handleUnitVitals.sqf | 4 ++-- addons/medical/functions/fnc_setCardiacArrest.sqf | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index 309bb2a888..ae6c87c1c6 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -248,7 +248,7 @@ if (USE_WOUND_EVENT_SYNC) then { }; [ - {(((_this select 0) getvariable [QGVAR(bloodVolume), 0]) < 65)}, + {(((_this select 0) getvariable [QGVAR(bloodVolume), 100]) < 65)}, {(((_this select 0) getvariable [QGVAR(pain), 0]) > 0.9)}, {(((_this select 0) call FUNC(getBloodLoss)) > 0.25)}, {((_this select 0) getvariable [QGVAR(inReviveState), false])}, diff --git a/addons/medical/functions/fnc_addToInjuredCollection.sqf b/addons/medical/functions/fnc_addToInjuredCollection.sqf index 82c385f0e1..cbe146d701 100644 --- a/addons/medical/functions/fnc_addToInjuredCollection.sqf +++ b/addons/medical/functions/fnc_addToInjuredCollection.sqf @@ -33,10 +33,10 @@ if ([_unit] call FUNC(hasMedicalEnabled) || _force) then { [_this select 1] call CBA_fnc_removePerFrameHandler; if (!local _unit) then { if (GVAR(level) >= 2) then { - _unit setvariable [QGVAR(heartRate), _unit getvariable [QGVAR(heartRate), 0], true]; - _unit setvariable [QGVAR(bloodPressure), _unit getvariable [QGVAR(bloodPressure), [0, 0]], true]; + _unit setvariable [QGVAR(heartRate), _unit getvariable [QGVAR(heartRate), 80], true]; + _unit setvariable [QGVAR(bloodPressure), _unit getvariable [QGVAR(bloodPressure), [80, 120]], true]; }; - _unit setvariable [QGVAR(bloodVolume), _unit getvariable [QGVAR(bloodVolume), 0], true]; + _unit setvariable [QGVAR(bloodVolume), _unit getvariable [QGVAR(bloodVolume), 100], true]; }; } else { [_unit] call FUNC(handleUnitVitals); diff --git a/addons/medical/functions/fnc_handleUnitVitals.sqf b/addons/medical/functions/fnc_handleUnitVitals.sqf index 81c9ffea40..2b175d7ca2 100644 --- a/addons/medical/functions/fnc_handleUnitVitals.sqf +++ b/addons/medical/functions/fnc_handleUnitVitals.sqf @@ -27,7 +27,7 @@ if (_syncValues) then { _unit setvariable [QGVAR(lastMomentValuesSynced), time]; }; -_bloodVolume = (_unit getvariable [QGVAR(bloodVolume), 0]) + ([_unit] call FUNC(getBloodVolumeChange)); +_bloodVolume = (_unit getvariable [QGVAR(bloodVolume), 100]) + ([_unit] call FUNC(getBloodVolumeChange)); _bloodVolume = _bloodVolume max 0; _unit setvariable [QGVAR(bloodVolume), _bloodVolume, _syncValues]; @@ -100,7 +100,7 @@ if (GVAR(level) >= 2) then { }; // Set the vitals - _heartRate = (_unit getvariable [QGVAR(heartRate), 0]) + (([_unit] call FUNC(getHeartRateChange)) * _interval); + _heartRate = (_unit getvariable [QGVAR(heartRate), 80]) + (([_unit] call FUNC(getHeartRateChange)) * _interval); _unit setvariable [QGVAR(heartRate), _heartRate, _syncValues]; _bloodPressure = [_unit] call FUNC(getBloodPressure); diff --git a/addons/medical/functions/fnc_setCardiacArrest.sqf b/addons/medical/functions/fnc_setCardiacArrest.sqf index cebf968898..b4483defc2 100644 --- a/addons/medical/functions/fnc_setCardiacArrest.sqf +++ b/addons/medical/functions/fnc_setCardiacArrest.sqf @@ -33,7 +33,7 @@ _timeInCardiacArrest = 120 + round(random(600)); _startTime = _args select 1; _timeInCardiacArrest = _args select 2; - _heartRate = _unit getvariable [QGVAR(heartRate), 0]; + _heartRate = _unit getvariable [QGVAR(heartRate), 80]; if (_heartRate > 0 || !alive _unit) exitwith { [(_this select 1)] call cba_fnc_removePerFrameHandler; _unit setvariable [QGVAR(inCardiacArrest), nil,true]; From bf7a7b5bc9df70d570fc23954de9e97b683d9ad5 Mon Sep 17 00:00:00 2001 From: Aleksey Yermakov Date: Fri, 17 Apr 2015 20:18:41 +0300 Subject: [PATCH 195/305] Update stringtable.xml --- addons/ballistics/stringtable.xml | 38 +++++++++++++++---------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index a60cefcf9d..238cdabaf3 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -13,7 +13,7 @@ 6.5mm 30ks Svítící IR-DIM Zásobník Carregador de 30 projéteis traçantes IR-DIM de 6,5mm Caricatore 6.5mm 30Rnd Traccianti IR-DIM - Магазин из 30-ти 6,5 мм трассирующих под ПНВ + Магазин из 30-ти 6,5 мм ИК-трассирующих 6.5mm IR-DIM @@ -37,7 +37,7 @@ Ráže: 6.5x39 mm Svítící IR-DIM<br />Munice: 30<br />Použití: MX/C/M/SW/3GL Calibre: 6,5x39 mm Traçante IR-DIM<br />Projéteis: 30<br />Usado em: MX/C/M/SW/3GL Calibro: 6.5x39 mm Traccianti IR-DIM <br />Munizioni: 30<br />In uso su: MX/C/M/SW/3GL - Калибр: 6,5x39 мм трассирующие под ПНВ<br />Патронов: 30<br />Используются с: MX/C/M/SW/3GL + Калибр: 6,5x39 мм ИК-трассирующие<br />Патронов: 30<br />Используются с: MX/C/M/SW/3GL 6.5mm 30Rnd SD Mag @@ -122,7 +122,7 @@ 6.5mm 30ks Svítící IR-DIM Zásobník Carregador de 30 projéteis traçantes IR-DIM de 6,5mm Caricatore 6.5mm 30Rnd Traccianti IR-DIM - Магазин из 30-ти 6,5 мм трассирующих под ПНВ + Магазин из 30-ти 6,5 мм ИК-трассирующих 6.5mm IR-DIM @@ -146,7 +146,7 @@ Ráže: 6.5x39 mm Svítící IR-DIM<br />Munice: 30<br />Použití: Katiba Calibre: 6,5x39 mm Traçante IR-DIM<br />Projéteis: 30<br />Usado em: Katiba Calibro: 6.5x39 mm Tracciant IR-DIM<br />Munizioni: 30<br />In uso su: Katiba - Калибр: 6,5x39 мм трассирующие под ПНВ<br />Патронов: 30<br />Используются с: Katiba + Калибр: 6,5x39 мм ИК-трассирующие<br />Патронов: 30<br />Используются с: Katiba 6.5mm 30Rnd SD Mag @@ -168,7 +168,7 @@ 6,5mm SD 6,5mm SD 6.5mm SD - 6,5mm SD + 6,5 мм SD 6.5mm Sil. 6,5 мм дозвуковые @@ -231,7 +231,7 @@ 5.56mm 30ks Svítící IR-DIM Zásobník Carregador de 30 projéteis traçantes IR-DIM de 5,56mm Caricatore 5.56mm 30rnd Traccianti IR-DIM - Магазин из 30-ти 5,56 мм трассирующих под ПНВ + Магазин из 30-ти 5,56 мм ИК-трассирующих 5.56mm IR-DIM @@ -255,7 +255,7 @@ Ráže: 5.56x45 mm Svítící IR-DIM<br />Munice: 30<br />Použití: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR Calibre: 5,56x45 mm Traçante IR-DIM<br />Projéteis: 30<br />Usado em: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR Calibro: 5.56x45 mm Traccianti IR-DIM<br />Munizioni: 30<br />In uso su: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Калибр: 5,56x45 мм трассирующие под ПНВ<br />Патронов: 30<br />Используются с: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Калибр: 5,56x45 мм ИК-трассирующие<br />Патронов: 30<br />Используются с: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR 5.56mm 30Rnd AP Mag @@ -340,7 +340,7 @@ 7.62mm 20ks Svítící IR-DIM Zásobník Carregador de 20 projéteis IR-DIM de 7,62mm Caricatore 7.62mm 20rnd Traccianti IR-DIM - Магазин из 20-ти 7,62 мм трассирующих под ПНВ + Магазин из 20-ти 7,62 мм ИК-трассирующих 7.62mm IR-DIM @@ -364,7 +364,7 @@ Ráže: 7.62x51 mm Svítící IR-DIM<br />Munice: 20<br />Použití: Mk18 ABR Calibre: 7,62x51 mm Traçante IR-DIM<br />Projéteis: 20<br />Usado em: Mk18 ABR Calibro: 7.62x51 mm Traccianti IR-DIM<br />Munizioni: 20<br />In uso su: Mk18 ABR - Калибр: 7,62x51 мм трассирующие под ПНВ<br />Патронов: 20<br />Используются с: Mk18 ABR + Калибр: 7,62x51 мм ИК-трассирующие<br />Патронов: 20<br />Используются с: Mk18 ABR 7.62mm 20Rnd SD Mag @@ -470,7 +470,7 @@ Taśma .338 NM 130rd IR-DIM Bande .338 NM 130Cps IR-DIM Cinta de 130 balas IR-DIM de .338 NM - Лента из 130-ти .338 NM трасирующих под ПНВ + Лента из 130-ти .338 NM ИК-трассирующих .338 NM IR-DIM @@ -734,7 +734,7 @@ Magazynek 6,5mm 100rd Smugacz IR-DIM Chargeur 6.5mm 100Rnd Traçante IR-DIM Cargador de 100 balas trazadoras IR-DIM de 6.5mm - Магазин из 100-ти 6,5 мм ИК-трассирующих + Магазин из 100 6,5 мм ИК-трассирующих 6.5mm IR-DIM @@ -748,14 +748,14 @@ Magazynek 6,5mm 100rd Smugacz IR-DIM Chargeur 6.5mm 100Rnd Traçante IR-DIM Cargador de 100 balas trazadoras IR-DIM de 6.5mm - Магазин из 100-ти 6,5 мм ИК-трассирующих + Магазин из 100 6,5 мм ИК-трассирующих 6.5mm 200Rnd Tracer IR-DIM Belt Magazynek 6,5mm 200rd Smugacz IR-DIM Bande 6.5mm 200Rnd Traçante IR-DIM Cinta de 200 balas trazadoras IR-DIM de 6.5mm - Магазин из 200-ти 6,5 мм ИК-трассирующих + Магазин из 200-т 6,5 мм ИК-трассирующих 6.5mm IR-DIM @@ -769,7 +769,7 @@ Magazynek 6,5mm 200rd Smugacz IR-DIM Bande 6.5mm 200Cps Traçante IR-DIM Cinta de 200 balas trazadoras IR-DIM de 6.5mm - Магазин из 200-ти 6,5 мм ИК-трассирующих + Магазин из 200-т 6,5 мм ИК-трассирующих 5.56mm 30Rnd Mag (Mk262) @@ -790,7 +790,7 @@ Kaliber: 5,56x45 mm NATO (Mk262)<br />Pociski: 30 Calibre: 5.56x45 mm NATO (Mk262)<br />Cartouches: 30 Calibre: 5.56x45 mm NATO (Mk262)<br />Balas: 30 - Калибр: 5,56x45 mm NATO (Mk262)<br />Патронов: 30 + Калибр: 5,56x45 мм NATO (Mk262)<br />Патронов: 30 5.56mm 30Rnd Mag (Mk318) @@ -811,7 +811,7 @@ Kaliber: 5,56x45 mm NATO (Mk318)<br />Pociski: 30 Calibre: 5.56x45 mm NATO (Mk318)<br />Cartouches: 30 Calibre: 5.56x45 mm NATO (Mk318)<br />Balas: 30 - Калибр: 5,56x45 mm NATO (Mk318)<br />Патронов: 30 + Калибр: 5,56x45 мм NATO (Mk318)<br />Патронов: 30 7.62mm 10Rnd Mag (M118LR) @@ -1012,7 +1012,7 @@ Caliber: 8.6x70mm (API526)<br />Rounds: 10 Calibre: 8.6x70mm (API526)<br />Cartouches: 10 Calibre: 8.6x70mm (API526)<br />Balas: 10 - Калибр: 8,6x70mm (API526)<br />Патронов: 10 + Калибр: 8,6x70 мм (API526)<br />Патронов: 10 12.7x99mm 5Rnd Mag @@ -1030,7 +1030,7 @@ Caliber: 12.7x99mm<br />Rounds: 5 Calibre: 12.7x99mm<br />Cartouches: 5 Calibre: 12.7x99mm<br />Balas: 5 - Калибр: 12,7x99mm<br />Патронов: 5 + Калибр: 12,7x99 мм<br />Патронов: 5 12.7x99mm 5Rnd Mag (AMAX) @@ -1051,4 +1051,4 @@ Калибр: 12,7x99 мм (A-MAX)<br />Патронов: 5 - \ No newline at end of file + From 2be38c493c647caa5962fb45b0519402be54dce8 Mon Sep 17 00:00:00 2001 From: jaynus Date: Fri, 17 Apr 2015 10:21:41 -0700 Subject: [PATCH 196/305] ACE JIP synchronized event infastructure. --- addons/common/XEH_postInit.sqf | 7 ++- addons/common/XEH_preInit.sqf | 12 +++++ .../fnc__handleRequestSyncedEvent.sqf | 37 +++++++++++++ .../functions/fnc__handleSyncedEvent.sqf | 36 +++++++++++++ .../functions/fnc_addSyncedEventHandler.sqf | 32 ++++++++++++ .../fnc_removeSyncedEventHandler.sqf | 24 +++++++++ .../functions/fnc_requestSyncedEvent.sqf | 17 ++++++ addons/common/functions/fnc_syncedEvent.sqf | 31 +++++++++++ .../common/functions/fnc_syncedEventPFH.sqf | 52 +++++++++++++++++++ 9 files changed, 247 insertions(+), 1 deletion(-) create mode 100644 addons/common/functions/fnc__handleRequestSyncedEvent.sqf create mode 100644 addons/common/functions/fnc__handleSyncedEvent.sqf create mode 100644 addons/common/functions/fnc_addSyncedEventHandler.sqf create mode 100644 addons/common/functions/fnc_removeSyncedEventHandler.sqf create mode 100644 addons/common/functions/fnc_requestSyncedEvent.sqf create mode 100644 addons/common/functions/fnc_syncedEvent.sqf create mode 100644 addons/common/functions/fnc_syncedEventPFH.sqf diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index e470e91c95..96b0f34356 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -87,7 +87,7 @@ enableCamShake true; // Set the name for the current player ["playerChanged", { EXPLODE_2_PVT(_this,_newPlayer,_oldPlayer); - + diag_log text format["PLAYER CHANGED!", _this]; if (alive _newPlayer) then { [_newPlayer] call FUNC(setName) }; @@ -188,3 +188,8 @@ GVAR(OldPlayerWeapon) = currentWeapon ACE_player; // Players can always interact with passengers of the same vehicle {!((_this select 0) isEqualTo (_this select 1)) && {vehicle (_this select 0) == vehicle (_this select 1)}} }] call FUNC(addCanInteractWithCondition); + +// Synced ACE events +["SEH", FUNC(_handleSyncedEvent)] call FUNC(addEventHandler); +["SEH_s", FUNC(_handleRequestSyncedEvent)] call FUNC(addEventHandler); +[FUNC(syncedEventPFH), 0.5, []] call cba_fnc_addPerFrameHandler; diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index b5382d0b5e..5bacea7505 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -269,6 +269,18 @@ PREP(hashListSelect); PREP(hashListSet); PREP(hashListPush); +// Synchronized Events +PREP(syncedEventPFH); +PREP(addSyncedEventHandler); +PREP(removeSyncedEventHandler); +PREP(syncedEvent); +PREP(_handleSyncedEvent); +PREP(_handleRequestSyncedEvent); +PREP(requestSyncedEvent); +GVAR(syncedEvents) = HASH_CREATE; + +// @TODO: Generic local-managed global-synced objects (createVehicleLocal) + //Debug ACE_COUNTERS = []; diff --git a/addons/common/functions/fnc__handleRequestSyncedEvent.sqf b/addons/common/functions/fnc__handleRequestSyncedEvent.sqf new file mode 100644 index 0000000000..643ce40916 --- /dev/null +++ b/addons/common/functions/fnc__handleRequestSyncedEvent.sqf @@ -0,0 +1,37 @@ +/* + * Author: jaynus + * + * + * Argument: + * + * Return value: + * Boolean of success + */ + #define DEBUG_MODE_FULL +#include "script_component.hpp" + +//SEH_s +if(isServer) then { + // Find the event name, and shovel out the events to the client + PARAMS_2(_eventName,_client); + private["_eventEntry", "_eventLog"]; + + if(!HASH_HASKEY(GVAR(syncedEvents),_eventName)) exitWith { + diag_log text format["[ACE] Error, request for synced event - key not found."]; + false + }; + _eventEntry = HASH_GET(GVAR(syncedEvents),_eventName); + _eventLog = _eventEntry select 1; + + ["SEH_s", _client, [_eventName, _eventLog] ] call FUNC(targetEvent); +} else { + PARAMS_2(_eventName,_eventLog); + // This is the client handling the response from the server + // Start running the events + { + _eventArgs = _x select 1; + [_eventName, _eventArgs, (_x select 2)] call FUNC(_handleSyncedEvent); + } forEach _eventLog; +}; + +true \ No newline at end of file diff --git a/addons/common/functions/fnc__handleSyncedEvent.sqf b/addons/common/functions/fnc__handleSyncedEvent.sqf new file mode 100644 index 0000000000..14dfc32bae --- /dev/null +++ b/addons/common/functions/fnc__handleSyncedEvent.sqf @@ -0,0 +1,36 @@ +/* + * Author: jaynus + * + * Call and propegate a synced event + * + * Argument: + * 0: Name (String) + * 1: Arguments (Array) + * 2: TTL (Number or Code) [Optional] + * + * Return value: + * Boolean of success + */ +#define DEBUG_MODE_FULL +#include "script_component.hpp" +PARAMS_3(_name,_args,_ttl); +private["_internalData", "_eventLog", "_eventCode"]; + +if(!HASH_HASKEY(GVAR(syncedEvents),_name)) exitWith { + diag_log text format["[ACE] Error, synced event key not found."]; + false +}; + +_internalData = HASH_GET(GVAR(syncedEvents),_name); + +if(isServer) then { + // Server needs to internally log it for synchronization + if(_ttl > -1) then { + _internalData = HASH_GET(GVAR(syncedEvents),_name); + _eventLog = _internalData select 1; + _eventLog pushback [diag_tickTime, _args, _ttl]; + }; +}; + +_eventCode = _internalData select 0; +_args call _eventCode; \ No newline at end of file diff --git a/addons/common/functions/fnc_addSyncedEventHandler.sqf b/addons/common/functions/fnc_addSyncedEventHandler.sqf new file mode 100644 index 0000000000..ab9d8bb829 --- /dev/null +++ b/addons/common/functions/fnc_addSyncedEventHandler.sqf @@ -0,0 +1,32 @@ +/* + * Author: jaynus + * + * Register an event handler for an ACE synced event + * + * Argument: + * 0: Name (String) + * 1: Handler (Code) + * 2: TTL (Number or Code) [Optional] + * + * Return value: + * Boolean of success + */ +#define DEBUG_MODE_FULL +#include "script_component.hpp" +PARAMS_2(_name,_handler); + +private["_ttl", "_eventId", "_data"]; +if( (count _this) > 2) then { + _ttl = _this select 2; +} else { + _ttl = 0; +}; + +if(HASH_HASKEY(GVAR(syncedEvents),_name)) exitWith { + diag_log text format["[ACE] Error, duplicate synced event creation."]; + false +}; + +_eventId = [_name, FUNC(_handleSyncedEvent)] call FUNC(addEventHandler); +_data = [_handler,[],_ttl,_eventId]; +HASH_SET(GVAR(syncedEvents),_name,_data); \ No newline at end of file diff --git a/addons/common/functions/fnc_removeSyncedEventHandler.sqf b/addons/common/functions/fnc_removeSyncedEventHandler.sqf new file mode 100644 index 0000000000..6429120bbe --- /dev/null +++ b/addons/common/functions/fnc_removeSyncedEventHandler.sqf @@ -0,0 +1,24 @@ +/* + * Author: jaynus + * + * Remove a synced event handler + * + * Argument: + * 0: Name (String) + * + * Return value: + * Boolean of success + */ +#include "script_component.hpp" +PARAMS_1(_name); + +if(!HASH_HASKEY(GVAR(syncedEvents),_name)) exitWith { + diag_log text format["[ACE] Error, synced event key not found."]; + false +}; + +_data = HASH_GET(GVAR(syncedEvents),_name); +_eventId = _data select 3; + +[_eventId] call ace_common_fnc_removeEventHandler; +HASH_REM(GVAR(syncedEvents),_name); \ No newline at end of file diff --git a/addons/common/functions/fnc_requestSyncedEvent.sqf b/addons/common/functions/fnc_requestSyncedEvent.sqf new file mode 100644 index 0000000000..f18c3542b5 --- /dev/null +++ b/addons/common/functions/fnc_requestSyncedEvent.sqf @@ -0,0 +1,17 @@ +/* + * Author: jaynus + * + * + * Argument: + * + * Return value: + * Boolean of success + */ +#define DEBUG_MODE_FULL +#include "script_component.hpp" +PARAMS_1(_eventName); + +// Only JIP machines on initialization send this off, requesting sync on events with the serverCommand +if(isServer) exitWith { false }; + +["SEH_s", [_eventName, ACE_player] ] call ace_common_fnc_serverEvent; \ No newline at end of file diff --git a/addons/common/functions/fnc_syncedEvent.sqf b/addons/common/functions/fnc_syncedEvent.sqf new file mode 100644 index 0000000000..43f4feb5bd --- /dev/null +++ b/addons/common/functions/fnc_syncedEvent.sqf @@ -0,0 +1,31 @@ +/* + * Author: jaynus + * + * Call and propegate a synced event + * + * Argument: + * 0: Name (String) + * 1: Arguments (Array) + * 2: TTL (Number or Code) [Optional] for this specific event call + * + * Return value: + * Boolean of success + */ +#define DEBUG_MODE_FULL +#include "script_component.hpp" +PARAMS_2(_name,_args); +private["_ttl", "_eventData", "_internalData", "_eventLog"]; + +if( (count _this) > 2) then { + _ttl = _this select 2; +} else { + _ttl = 0; +}; + +if(!HASH_HASKEY(GVAR(syncedEvents),_name)) exitWith { + diag_log text format["[ACE] Error, synced event key not found."]; + false +}; + +_eventData = [_name, _args,_ttl]; +["SEH", _eventData] call FUNC(globalEvent); \ No newline at end of file diff --git a/addons/common/functions/fnc_syncedEventPFH.sqf b/addons/common/functions/fnc_syncedEventPFH.sqf new file mode 100644 index 0000000000..e8a21202ab --- /dev/null +++ b/addons/common/functions/fnc_syncedEventPFH.sqf @@ -0,0 +1,52 @@ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" + +if(!isServer) exitWith { false }; + +// Walk through the local synced events and clean up anything thats already EOL +// @TODO: This should be iteration limited to prevent FPS lag +private["_data"]; +{ + private["_data", "_ttl", "_eventLog", "_newEventLog", "_name"]; + _name = _x; + + _data = HASH_GET(GVAR(syncedEvents),_name); + _eventLog = _data select 1; + _globalEventTTL = _data select 2; + _newEventLog = []; + + // @TODO: This should be iteration limited to prevent FPS lag + { + private["_eventEntry", "_ttlReturn"]; + _eventEntry = _x; + + _ttlReturn = true; + if(typeName _globalEventTTL == "CODE") then { + _ttlReturn = [(_data select 0),_eventEntry] call _globalEventTTL; + } else { + _ttlReturn = call { _globalEventTTL < 1 || {diag_tickTime < (_eventEntry select 0) + _globalEventTTL} }; + }; + + if(_ttlReturn) then { + // Do event based TTL check + private["_eventTTL"]; + _eventTTL = _eventEntry select 2; + + if(typeName _eventTTL == "CODE") then { + _ttlReturn = [(_data select 0),_eventEntry] call _eventTTL; + } else { + _ttlReturn = call { _eventTTL < 1 || {diag_tickTime < (_eventEntry select 0) + _eventTTL} }; + }; + }; + + // Finally drop it if the TTL check fails + if(_ttlReturn) then { + _newEventLog pushBack _x; + }; + } forEach _eventLog; + + _data set[1, _newEventLog]; +} forEach (GVAR(syncedEvents) select 0); + + +// @TODO: Next, detect if we had a new request from a JIP player, and we need to continue syncing events From 2f1ee94d91598278d26a975bbb99d176bef0a486 Mon Sep 17 00:00:00 2001 From: Aleksey Yermakov Date: Fri, 17 Apr 2015 20:24:32 +0300 Subject: [PATCH 197/305] Update stringtable.xml --- addons/ballistics/stringtable.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index 238cdabaf3..d79855b916 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -685,7 +685,7 @@ Magazynek 9x19mm 16rd 9x19mm 30Cps Cargador de 16 balas de 9x19mm - Магазин из 30-ти 9х19 мм + Магазин из 16-ти 9х19 мм 9x19mm 30Rnd Mag From 8a669c390a16a23a0cee27680092501f15add04d Mon Sep 17 00:00:00 2001 From: Aleksey Yermakov Date: Fri, 17 Apr 2015 20:35:34 +0300 Subject: [PATCH 198/305] Update stringtable.xml --- addons/ballistics/stringtable.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index d79855b916..30aa21b748 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -994,7 +994,7 @@ Caliber: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />Rounds: 10 Calibre: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />Cartouches: 10 Calibre: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />Balas: 10 - Калибр: 8,6x70 мм (300 гран Sierra MatchKing HPBT)<br />Патронов: 10 + Калибр: .338 (300 гран Sierra MatchKing HPBT)<br />Патронов: 10 .338 10Rnd Mag (API526) @@ -1012,7 +1012,7 @@ Caliber: 8.6x70mm (API526)<br />Rounds: 10 Calibre: 8.6x70mm (API526)<br />Cartouches: 10 Calibre: 8.6x70mm (API526)<br />Balas: 10 - Калибр: 8,6x70 мм (API526)<br />Патронов: 10 + Калибр: .338 (API526)<br />Патронов: 10 12.7x99mm 5Rnd Mag From 0e90199e23a75feb5a4390a1b93bbafee913160e Mon Sep 17 00:00:00 2001 From: commy2 Date: Fri, 17 Apr 2015 20:29:01 +0200 Subject: [PATCH 199/305] remove debug message --- addons/disposable/CfgEventHandlers.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/disposable/CfgEventHandlers.hpp b/addons/disposable/CfgEventHandlers.hpp index 4b5614f553..e4e4abffd8 100644 --- a/addons/disposable/CfgEventHandlers.hpp +++ b/addons/disposable/CfgEventHandlers.hpp @@ -22,7 +22,7 @@ class Extended_FiredBIS_EventHandlers { class Extended_InitPost_EventHandlers { class CAManBase { class ADDON { - init = QUOTE([ARR_2(_this select 0, secondaryWeapon (_this select 0))] call FUNC(takeLoadedATWeapon); systemChat str [ARR_2(_this select 0, secondaryWeapon (_this select 0))]); + init = QUOTE([ARR_2(_this select 0, secondaryWeapon (_this select 0))] call FUNC(takeLoadedATWeapon)); }; }; }; From 7489e514ce3538bb88eb122f06137e9ba87a9d99 Mon Sep 17 00:00:00 2001 From: Grzegorz Sikora Date: Fri, 17 Apr 2015 21:48:04 +0200 Subject: [PATCH 200/305] PL translation --- addons/ballistics/stringtable.xml | 15 +++++++++++++++ addons/medical/stringtable.xml | 22 ++++++++++++---------- addons/respawn/stringtable.xml | 7 +++++++ 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index c95da8d760..eb8e3a25c7 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -895,76 +895,91 @@ 6.5x47mm 30Rnd Mag (HPBT Scenar) 6.5x47mm 30Cps (HPBT Scenar) Cargador de 30 balas de 6.5x47mm (HPBT Scenar) + Magazynek 6,5x47 mm 30rd (HPBT Scenar) 6.5mm Scenar 6.5mm Scenar 6.5mm Scenar + 6,5mm Scenar Caliber: 6.5x47mm (HPBT Scenar)<br />Rounds: 30 Calibre: 6.5x47mm (HPBT Scenar)<br />Cartouches: 30 Calibre: 6.5x47mm (HPBT Scenar)<br />Balas: 30 + Kaliber: 6,5x47 mm (HPBT Scenar)<br />Pociski: 30 .338 10Rnd Mag (300gr Sierra MatchKing HPBT) .338 10 Cps (300gr Sierra MatchKing HPBT) Cargador de 10 balas de 8.6x70mm (300gr Sierra MatchKing HPBT) + Magazynek .338 10rd (300gr Sierra MatchKing HPBT) .338 (HPBT) .338 (HPBT) .338 (HPBT) + .338 (HPBT) Caliber: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />Rounds: 10 Calibre: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />Cartouches: 10 Calibre: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />Balas: 10 + Kaliber: 8,6x70 mm (300gr Sierra MatchKing HPBT)<br />Pociski: 10 .338 10Rnd Mag (API526) .338 10Cps (API526) Cargador de 10 balas de .338 (API526) + Magazynek .338 10rd (API526) .338 AP .338 AP .338 AP + .338 AP Caliber: 8.6x70mm (API526)<br />Rounds: 10 Calibre: 8.6x70mm (API526)<br />Cartouches: 10 Calibre: 8.6x70mm (API526)<br />Balas: 10 + Kaliber: 8,6x70 mm (API526)<br />Pociski: 10 12.7x99mm 5Rnd Mag 12.7x99mm 5Cps Cargador de 5 balas de 12.7x99mm + Magazynek 12,7x99 mm 5rd 12.7mm 12.7mm 12.7mm + 12,7mm Caliber: 12.7x99mm<br />Rounds: 5 Calibre: 12.7x99mm<br />Cartouches: 5 Calibre: 12.7x99mm<br />Balas: 5 + Kaliber: 12,7x99 mm<br />Pociski: 5 12.7x99mm 5Rnd Mag (AMAX) 12.7x99mm 5Rnd Mag (AMAX) Cargador de 5 balas de 12.7x99mm (AMAX) + Magazynek 12,7x99 mm 5rd (AMAX) 12.7mm 12.7mm 12.7mm + 12,7mm Caliber: 12.7x99mm (AMAX)<br />Rounds: 5 Calibre: 12.7x99mm (AMAX)<br />Cartouches: 5 Calibre: 12.7x99mm (AMAX)<br />Balas: 5 + Kaliber: 12,7x99 mm (AMAX)<br />Pociski: 5 \ No newline at end of file diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 9f651e90b7..a8a8017160 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -1,4 +1,5 @@  + @@ -64,7 +65,7 @@ Salzlösungtransfusion Transfundir salino Transfúze fyziologický roztoku - Przetocz solankę + Przetocz sól fizjologiczną Transfuser de la Saline Перелить физраствор Infúzió (sós víz) @@ -216,7 +217,7 @@ Sallösungtransfusion ... Transfusión de salino ... Probíha transfúze fyziologický roztoku ... - Przetaczanie solanki ... + Przetaczanie soli fizjologicznej ... Transfusion de saline ... Переливание физраствора ... Infúzió sós vizzel ... @@ -436,7 +437,7 @@ Kochsaltzlösung IV (1000ml) Dar Salino IV (1000ml) Дать физраствор для в/в вливания (1000 мл) - Podaj solankę IV (1000ml) + Podaj sól fizjologiczną IV (1000ml) Administrer de la Solution Saline en IV (1000ml) Podaz fyz. roztok (1000ml) Sós víz adása intravénásan (1000ml) @@ -447,7 +448,7 @@ Kochsaltzlösung IV (500ml) Dar Salino IV (500ml) Дать физраствор для в/в вливания (500 мл) - Podaj solankę IV (500ml) + Podaj sól fizjologiczną IV (500ml) Administrer de la Solution Saline en IV (500ml) Podaz fyz. roztok (500ml) Sós víz adása intravénásan (500ml) @@ -458,7 +459,7 @@ Kochsaltzlösung IV (250ml) Dar Salino IV (250ml) Дать физраствор для в/в вливания (250 мл) - Podaj solankę IV (250ml) + Podaj sól fizjologiczną IV (250ml) Administrer de la Solution Saline en IV (250ml) Podaz fyz. roztok (250ml) Sós víz adása intravénásan (250ml) @@ -930,7 +931,7 @@ Физраствор для в/в вливания (1000 мл) Solución Salina IV (1000ml) Solution Saline 0.9% IV (1000ml) - Solanka 0,9% IV (1000ml) + Sól fizjologiczna IV (1000ml) Kochsalzlösung (1000ml) 0,9%-os sósvíz-infúzió (1000ml) Soluzione salina IV (1000ml) @@ -940,7 +941,7 @@ Пакет физраствора для возмещения объема потерянной крови Solución salina intravenosa, para restaurar el volumen sanguíneo Solution Saline 0.9% IV, pour rétablir temporairement la tension artérielle - Solanka 0,9%, podawana dożylnie (IV), używana w celu uzupełnienia krwi u pacjenta + Sól fizjologiczna, podawana dożylnie (IV), używana w celu uzupełnienia krwi u pacjenta 0,9%-os sósvíz-infúzió, a páciens vérmennyiségének helyreállítására Soluzione salina, usata per ripristinare sangue nei pazienti. @@ -958,7 +959,7 @@ Физраствор для в/в вливания (500 мл) Salino IV (500ml) Solution Saline 0.9% IV (500ml) - Solanka 0,9% IV (500ml) + Sól fizjologiczna IV (500ml) Kochsalzlösung (500ml) 0,9%-os sósvíz-infúzió (500ml) Soluzione salina IV (500ml) @@ -968,7 +969,7 @@ Физраствор для в/в вливания (250 мл) Salino IV (250ml) Solution Saline 0.9% IV (250ml) - Solanka 0,9% IV (250ml) + Sól fizjologiczna IV (250ml) Kochsalzlösung (250ml) 0,9%-os sósvíz-infúzió (250ml) Soluzione salina IV (250ml) @@ -1128,6 +1129,7 @@ La Presión Arterial es %2/%3 A vérnyomás %2/%3 Hai riscontrato una pressione di %2/%3 + Wyczuwasz ciśnienie krwi o wartości %2/%3 You find a low blood pressure @@ -1611,4 +1613,4 @@ Aberración cromática - + \ No newline at end of file diff --git a/addons/respawn/stringtable.xml b/addons/respawn/stringtable.xml index 65e21c0107..5874b095ae 100644 --- a/addons/respawn/stringtable.xml +++ b/addons/respawn/stringtable.xml @@ -1,4 +1,5 @@  + @@ -50,36 +51,42 @@ Sammelpunkt West (Basis) Punto de reunión Oeste (Base) Точка сбора Синих (База) + Punkt zbiórki Zachodu (Baza) Rallypoint East (Base) Sammelpunkt Ost (Basis) Punto de reunión Este (Base) Точка сбора Красных (База) + Punkt zbiórki Wschodu (Baza) Rallypoint Independent (Base) Sammelpunkt Widerstand (Basis) Punto de reunión Independiente (Base) Точка сбора Независимых (База + Punkt zbiórki Ruchu oporu (Baza) Rallypoint West Sammelpunkt West Punto de reunión Oeste Точка сбора Синих + Punkt zbiórki Zachodu Rallypoint East Sammelpunkt Ost Punto de reunión Este Точка сбора Красных + Punkt zbiórki Wschodu Rallypoint Independent Sammelpunkt Widerstand Punto de reunión Independiente Точка сбора Независимых + Punkt zbiórki Ruchu oporu \ No newline at end of file From 00f26144ecfffef3ef6deaa2401aad7277490867 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 17 Apr 2015 15:45:00 -0500 Subject: [PATCH 201/305] More Privates --- .../functions/fnc_pfhUpdateGForces.sqf | 2 + .../functions/fnc_flashbangExplosionEH.sqf | 2 +- .../functions/fnc_flashbangThrownFuze.sqf | 3 +- addons/markers/XEH_preInit.sqf | 2 + .../functions/fnc_initInsertMarker.sqf | 2 + addons/microdagr/XEH_clientInit.sqf | 2 + .../functions/fnc_deviceAddWaypoint.sqf | 2 + .../functions/fnc_deviceDeleteWaypoint.sqf | 2 + .../functions/fnc_mapDoubleTapEH.sqf | 2 + .../microdagr/functions/fnc_mapOnDrawEH.sqf | 3 +- .../fnc_saveCurrentAndSetNewMode.sqf | 14 +++---- addons/movement/functions/fnc_canClimb.sqf | 6 +-- addons/movement/functions/fnc_getWeight.sqf | 2 +- .../functions/fnc_drawNameTagIcon.sqf | 2 +- .../nametags/functions/fnc_initIsSpeaking.sqf | 1 + .../nametags/functions/fnc_moduleNameTags.sqf | 4 +- addons/nametags/functions/fnc_onDraw3d.sqf | 28 ++++++------- addons/nightvision/XEH_postInitClient.sqf | 4 +- .../functions/fnc_updatePPEffects.sqf | 4 +- addons/noradio/XEH_post_initClient.sqf | 6 +-- .../functions/fnc_addMapFunction.sqf | 6 +-- .../functions/fnc_handleMapClick.sqf | 2 +- .../switchunits/functions/fnc_initPlayer.sqf | 5 +-- .../functions/fnc_nearestPlayers.sqf | 15 +++---- .../switchunits/functions/fnc_switchBack.sqf | 16 +++----- .../switchunits/functions/fnc_switchUnit.sqf | 4 +- .../vehiclelock/functions/fnc_moduleSync.sqf | 1 + .../functions/fnc_onOpenInventory.sqf | 1 + addons/weaponselect/XEH_preInit.sqf | 1 + .../fnc_countMagazinesForGrenadeMuzzle.sqf | 11 ++--- .../fnc_displayGrenadeTypeAndNumber.sqf | 4 +- .../functions/fnc_selectGrenadeAll.sqf | 40 +++++++++---------- .../functions/fnc_selectGrenadeFrag.sqf | 34 ++++++++-------- .../functions/fnc_selectGrenadeOther.sqf | 34 ++++++++-------- .../functions/fnc_setNextGrenadeMuzzle.sqf | 14 +++---- tools/search_privates.py | 15 +++++-- 36 files changed, 151 insertions(+), 145 deletions(-) diff --git a/addons/gforces/functions/fnc_pfhUpdateGForces.sqf b/addons/gforces/functions/fnc_pfhUpdateGForces.sqf index 01c00511cf..29a4859651 100644 --- a/addons/gforces/functions/fnc_pfhUpdateGForces.sqf +++ b/addons/gforces/functions/fnc_pfhUpdateGForces.sqf @@ -13,6 +13,8 @@ */ #include "script_component.hpp" +private ["_interval", "_player", "_newVel", "_accel", "_currentGForce", "_average", "_sum", "_classCoef", "_suitCoef", "_gBlackOut", "_gRedOut", "_g", "_gBO", "_coef", "_strength"]; + EXPLODE_2_PVT(_this,_params,_pfhId); _interval = time - GVAR(lastUpdateTime); diff --git a/addons/grenades/functions/fnc_flashbangExplosionEH.sqf b/addons/grenades/functions/fnc_flashbangExplosionEH.sqf index c84ee33b33..75e61dab56 100644 --- a/addons/grenades/functions/fnc_flashbangExplosionEH.sqf +++ b/addons/grenades/functions/fnc_flashbangExplosionEH.sqf @@ -15,7 +15,7 @@ */ #include "script_component.hpp" -private ["_affected", "_strength", "_posGrenade", "_posUnit", "_angleGrenade", "_angleView", "_angleDiff", "_light", "_losCount"]; +private ["_affected", "_strength", "_posGrenade", "_posUnit", "_angleGrenade", "_angleView", "_angleDiff", "_light", "_losCount", "_dirToUnitVector", "_eyeDir", "_eyePos"]; PARAMS_1(_grenade); diff --git a/addons/grenades/functions/fnc_flashbangThrownFuze.sqf b/addons/grenades/functions/fnc_flashbangThrownFuze.sqf index a83c81e660..377793ca7b 100644 --- a/addons/grenades/functions/fnc_flashbangThrownFuze.sqf +++ b/addons/grenades/functions/fnc_flashbangThrownFuze.sqf @@ -19,7 +19,8 @@ PARAMS_1(_projectile); if (alive _projectile) then { playSound3D ["A3\Sounds_F\weapons\Explosion\explosion_mine_1.wss", _projectile, false, getPosASL _projectile, 5, 1.2, 400]; - + + private "_affected"; _affected = _projectile nearEntities ["CAManBase", 50]; ["flashbangExplosion", _affected, [_projectile]] call EFUNC(common,targetEvent); }; diff --git a/addons/markers/XEH_preInit.sqf b/addons/markers/XEH_preInit.sqf index fd97aeda0c..b2b9ed5c00 100644 --- a/addons/markers/XEH_preInit.sqf +++ b/addons/markers/XEH_preInit.sqf @@ -12,6 +12,8 @@ PREP(sendMarkersJIP); PREP(setMarkerJIP); PREP(setMarkerNetwork); +private ["_config", "_marker", "_a", "_scope", "_icon", "_rgba", "_name"]; + // init marker types if (isNil QGVAR(MarkersCache)) then { _config = configfile >> "CfgMarkers"; diff --git a/addons/markers/functions/fnc_initInsertMarker.sqf b/addons/markers/functions/fnc_initInsertMarker.sqf index 6ac13f9e80..6c5160c031 100644 --- a/addons/markers/functions/fnc_initInsertMarker.sqf +++ b/addons/markers/functions/fnc_initInsertMarker.sqf @@ -19,6 +19,8 @@ #define BORDER 0.005 [{ + private ["_display", "_text", "_picture", "_channel", "_buttonOK", "_buttonCancel", "_description", "_title", "_descriptionChannel", "_sizeX", "_sizeY", "_aceShapeLB", "_aceColorLB", "_aceAngleSlider", "_aceAngleSliderText", "_mapIDD", "_pos", "_posX", "_posY", "_posW", "_posH", "_offsetButtons", "_buttonOk", "_curSelShape", "_curSelColor", "_curSelAngle"]; + disableserialization; PARAMS_1(_display); diff --git a/addons/microdagr/XEH_clientInit.sqf b/addons/microdagr/XEH_clientInit.sqf index c917eb0a8d..99c94b4512 100644 --- a/addons/microdagr/XEH_clientInit.sqf +++ b/addons/microdagr/XEH_clientInit.sqf @@ -54,6 +54,8 @@ GVAR(rangeFinderPositionASL) = []; GVAR(mapAltitude) = getNumber (configFile >> "CfgWorlds" >> worldName >> "elevationOffset"); +private ["_worldMapLong", "_worldMapLat", "_zone", "_band", "_squareID"]; + //Calculate the map's MGRS: _worldMapLong = getNumber (configFile >> "CfgWorlds" >> worldName >> "longitude"); _worldMapLat = getNumber (configFile >> "CfgWorlds" >> worldName >> "latitude"); diff --git a/addons/microdagr/functions/fnc_deviceAddWaypoint.sqf b/addons/microdagr/functions/fnc_deviceAddWaypoint.sqf index 6912810f58..c383d0a95e 100644 --- a/addons/microdagr/functions/fnc_deviceAddWaypoint.sqf +++ b/addons/microdagr/functions/fnc_deviceAddWaypoint.sqf @@ -19,6 +19,8 @@ PARAMS_2(_waypointName,_waypointPosASL); +private "_waypoints"; + _waypoints = ace_player getVariable [QGVAR(waypoints), []]; _waypoints pushBack [_waypointName, _waypointPosASL]; ace_player setVariable [QGVAR(waypoints), _waypoints]; diff --git a/addons/microdagr/functions/fnc_deviceDeleteWaypoint.sqf b/addons/microdagr/functions/fnc_deviceDeleteWaypoint.sqf index 3d1e8ec852..62ca5a222a 100644 --- a/addons/microdagr/functions/fnc_deviceDeleteWaypoint.sqf +++ b/addons/microdagr/functions/fnc_deviceDeleteWaypoint.sqf @@ -18,6 +18,8 @@ PARAMS_1(_wpIndex); +private "_waypoints"; + _waypoints = ace_player getVariable [QGVAR(waypoints), []]; if ((_wpIndex < 0) || (_wpIndex > ((count _waypoints) - 1))) exitWith {ERROR("out of bounds wp");}; diff --git a/addons/microdagr/functions/fnc_mapDoubleTapEH.sqf b/addons/microdagr/functions/fnc_mapDoubleTapEH.sqf index f36d5f2548..21a164ff2e 100644 --- a/addons/microdagr/functions/fnc_mapDoubleTapEH.sqf +++ b/addons/microdagr/functions/fnc_mapDoubleTapEH.sqf @@ -20,6 +20,8 @@ PARAMS_4(_theMap,_mouseButton,_xPos,_yPos); +private ["_worldPos"]; + //Only handle LMB if (_mouseButton != 0) exitWith {}; diff --git a/addons/microdagr/functions/fnc_mapOnDrawEH.sqf b/addons/microdagr/functions/fnc_mapOnDrawEH.sqf index 3acf3e889c..bff20a4b67 100644 --- a/addons/microdagr/functions/fnc_mapOnDrawEH.sqf +++ b/addons/microdagr/functions/fnc_mapOnDrawEH.sqf @@ -17,7 +17,8 @@ PARAMS_1(_theMap); -_theMap = _this select 0; +private ["_mapSize", "_waypoints", "_size", "_targetPos", "_relBearing", "_wpName", "_wpPos", "_alpha"]; + _mapSize = (ctrlPosition _theMap) select 3; _waypoints = [] call FUNC(deviceGetWaypoints); diff --git a/addons/microdagr/functions/fnc_saveCurrentAndSetNewMode.sqf b/addons/microdagr/functions/fnc_saveCurrentAndSetNewMode.sqf index 1f4982d87f..64a5cab991 100644 --- a/addons/microdagr/functions/fnc_saveCurrentAndSetNewMode.sqf +++ b/addons/microdagr/functions/fnc_saveCurrentAndSetNewMode.sqf @@ -1,7 +1,7 @@ /* * Author: PabstMirror * Saves the current mode and sets a new mode - * Used to backup display when switching display modes + * Used to backup display when switching display modes * * Arguments: * 0: New Mode @@ -16,7 +16,7 @@ */ #include "script_component.hpp" -private ["_display", "_theMap", "_mapSize", "_centerPos"]; +private ["_display", "_theMap", "_mapSize", "_centerPos", "_mapCtrlPos"]; PARAMS_1(_newMode); @@ -36,16 +36,16 @@ if (GVAR(currentApplicationPage) == 2) then { _centerPos = [((_mapCtrlPos select 0) + (_mapCtrlPos select 2) / 2), ((_mapCtrlPos select 1) + (_mapCtrlPos select 3) / 2)]; GVAR(mapPosition) = _theMap ctrlMapScreenToWorld _centerPos; GVAR(mapZoom) = (ctrlMapScale _theMap) * _mapSize; - + //Hit button again, toggle map modes: if (_newMode == 2) then { - if (GVAR(mapShowTexture)) then { - GVAR(mapShowTexture) = false; - } else { + if (GVAR(mapShowTexture)) then { + GVAR(mapShowTexture) = false; + } else { if (GVAR(MapDataAvailable) == MAP_DETAIL_SAT) then { GVAR(mapShowTexture) = true; }; - }; + }; }; }; diff --git a/addons/movement/functions/fnc_canClimb.sqf b/addons/movement/functions/fnc_canClimb.sqf index 27753d8a12..d9946f381c 100644 --- a/addons/movement/functions/fnc_canClimb.sqf +++ b/addons/movement/functions/fnc_canClimb.sqf @@ -9,15 +9,15 @@ * The return value * * Example: - * _bool = [player] call ace_movement_fnc_canClimb + * [player] call ace_movement_fnc_canClimb * * Public: No */ #include "script_component.hpp" -private ["_unit", "_pos", "_dir"]; +private ["_pos", "_dir"]; -_unit = _this select 0; +PARAMS_1(_unit); _pos = getPosASL _unit; _dir = getDir _unit; diff --git a/addons/movement/functions/fnc_getWeight.sqf b/addons/movement/functions/fnc_getWeight.sqf index 955be1a215..6941173fde 100644 --- a/addons/movement/functions/fnc_getWeight.sqf +++ b/addons/movement/functions/fnc_getWeight.sqf @@ -9,7 +9,7 @@ * The return value * * Example: - * _bool = [player] call ace_movement_fnc_getWeight + * [player] call ace_movement_fnc_getWeight * * Public: No */ diff --git a/addons/nametags/functions/fnc_drawNameTagIcon.sqf b/addons/nametags/functions/fnc_drawNameTagIcon.sqf index f0a9bb89d4..6a7db7d5ac 100644 --- a/addons/nametags/functions/fnc_drawNameTagIcon.sqf +++ b/addons/nametags/functions/fnc_drawNameTagIcon.sqf @@ -27,7 +27,7 @@ "\A3\Ui_f\data\GUI\Cfg\Ranks\colonel_gs.paa" \ ] -private ["_height", "_position", "_color", "_name", "_rank", "_size"]; +private ["_height", "_position", "_color", "_name", "_rank", "_size", "_icon"]; PARAMS_5(_player,_target,_alpha,_heightOffset,_iconType); diff --git a/addons/nametags/functions/fnc_initIsSpeaking.sqf b/addons/nametags/functions/fnc_initIsSpeaking.sqf index daddd36c05..c6087541a8 100644 --- a/addons/nametags/functions/fnc_initIsSpeaking.sqf +++ b/addons/nametags/functions/fnc_initIsSpeaking.sqf @@ -55,6 +55,7 @@ if (isClass (configFile >> "cfgPatches" >> "acre_api")) then { //Note: class RscDisplayVoiceChat {idd = 55} - only present when talking [{ + private ["_oldSetting", "_newSetting"]; _oldSetting = ACE_player getVariable [QGVAR(isSpeakingInGame), false]; _newSetting = (!(isNull findDisplay 55)); if (!(_oldSetting isEqualTo _newSetting)) then { diff --git a/addons/nametags/functions/fnc_moduleNameTags.sqf b/addons/nametags/functions/fnc_moduleNameTags.sqf index 6050b99c67..1bbd4d8efb 100644 --- a/addons/nametags/functions/fnc_moduleNameTags.sqf +++ b/addons/nametags/functions/fnc_moduleNameTags.sqf @@ -14,9 +14,7 @@ if !(isServer) exitWith {}; -_logic = _this select 0; -_units = _this select 1; -_activated = _this select 2; +PARAMS_3(_logic,_units,_activated); if !(_activated) exitWith {}; diff --git a/addons/nametags/functions/fnc_onDraw3d.sqf b/addons/nametags/functions/fnc_onDraw3d.sqf index d35cef0d67..9efc70aeb9 100644 --- a/addons/nametags/functions/fnc_onDraw3d.sqf +++ b/addons/nametags/functions/fnc_onDraw3d.sqf @@ -1,9 +1,9 @@ #include "script_component.hpp" -_player = ACE_player; +private ["_onKeyPressAlphaMax", "_defaultIcon", "_distance", "_alpha", "_icon", "_targets", "_pos2", "_vecy", "_relPos", "_projDist", "_pos", "_target"]; //don't show nametags in spectator -if (!alive _player) exitWith {}; +if (!alive ACE_player) exitWith {}; _onKeyPressAlphaMax = if ((GVAR(showPlayerNames) in [3,4])) then { 2 + (GVAR(ShowNamesTime) - time); //after release 1 second of full opacity, 1 second of fading to 0 @@ -24,14 +24,14 @@ if (GVAR(showCursorTagForVehicles) && {_onKeyPressAlphaMax > 0}) then { if ((!(_target isKindOf "CAManBase")) && {!(_target in allUnitsUAV)}) then { _target = effectiveCommander _target; if ((!isNull _target) && - {(side (group _target)) == (side (group _player))} && - {_target != _player} && + {(side (group _target)) == (side (group ACE_player))} && + {_target != ACE_player} && {GVAR(ShowNamesForAI) || {[_target] call EFUNC(common,isPlayer)}} && {!(_target getVariable ["ACE_hideName", false])}) then { - _distance = _player distance _target; + _distance = ACE_player distance _target; _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); _alpha = _alpha min _onKeyPressAlphaMax; - [_player, _target, _alpha, _distance * 0.026, _defaultIcon] call FUNC(drawNameTagIcon); + [ACE_player, _target, _alpha, _distance * 0.026, _defaultIcon] call FUNC(drawNameTagIcon); }; }; }; @@ -41,11 +41,11 @@ if ((GVAR(showPlayerNames) in [2,4]) && {_onKeyPressAlphaMax > 0}) then { _target = cursorTarget; if ((!isNull _target) && {_target isKindOf "CAManBase"} && - {(side (group _target)) == (side (group _player))} && - {_target != _player} && + {(side (group _target)) == (side (group ACE_player))} && + {_target != ACE_player} && {GVAR(ShowNamesForAI) || {[_target] call EFUNC(common,isPlayer)}} && {!(_target getVariable ["ACE_hideName", false])}) then { - _distance = _player distance _target; + _distance = ACE_player distance _target; _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); _alpha = _alpha min _onKeyPressAlphaMax; _icon = ICON_NONE; @@ -55,7 +55,7 @@ if ((GVAR(showPlayerNames) in [2,4]) && {_onKeyPressAlphaMax > 0}) then { _icon = if (([_target] call FUNC(isSpeaking)) && {(vehicle _target) == _target} && {GVAR(showSoundWaves) > 0}) then {ICON_NAME_SPEAK} else {_defaultIcon}; }; - [_player, _target, _alpha, _distance * 0.026, _icon] call FUNC(drawNameTagIcon); + [ACE_player, _target, _alpha, _distance * 0.026, _icon] call FUNC(drawNameTagIcon); }; }; @@ -84,12 +84,12 @@ if (((GVAR(showPlayerNames) in [1,3]) && {_onKeyPressAlphaMax > 0}) || {GVAR(sho }; if ((_icon != ICON_NONE) && - {(side (group _target)) == (side (group _player))} && - {_target != _player} && + {(side (group _target)) == (side (group ACE_player))} && + {_target != ACE_player} && {GVAR(ShowNamesForAI) || {[_target] call EFUNC(common,isPlayer)}} && {!(_target getVariable ["ACE_hideName", false])}) then { - if (lineIntersects [_pos, (visiblePositionASL _target) vectorAdd [0,0,1], vehicle _player, _target]) exitWith {}; // Check if there is line of sight + if (lineIntersects [_pos, (visiblePositionASL _target) vectorAdd [0,0,1], vehicle ACE_player, _target]) exitWith {}; // Check if there is line of sight _relPos = (visiblePositionASL _target) vectorDiff _pos; _distance = vectorMagnitude _relPos; _projDist = _relPos vectorDistance (_vecy vectorMultiply (_relPos vectorDotProduct _vecy)); @@ -102,7 +102,7 @@ if (((GVAR(showPlayerNames) in [1,3]) && {_onKeyPressAlphaMax > 0}) || {GVAR(sho _alpha = _alpha min _onKeyPressAlphaMax; }; - [_player, _target, _alpha, _distance * 0.026, _icon] call FUNC(drawNameTagIcon); + [ACE_player, _target, _alpha, _distance * 0.026, _icon] call FUNC(drawNameTagIcon); }; } forEach _targets; }; diff --git a/addons/nightvision/XEH_postInitClient.sqf b/addons/nightvision/XEH_postInitClient.sqf index 376059ce1b..db5d395096 100644 --- a/addons/nightvision/XEH_postInitClient.sqf +++ b/addons/nightvision/XEH_postInitClient.sqf @@ -42,7 +42,7 @@ GVAR(ppEffectMuzzleFlash) ppEffectCommit 0; // Conditions: canInteract if !([ACE_player, objNull, ["isNotEscorting", "isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific - if ((currentVisionMode _player != 1)) exitWith {false}; + if ((currentVisionMode ACE_player != 1)) exitWith {false}; // Statement [ACE_player, 1] call FUNC(changeNVGBrightness); @@ -56,7 +56,7 @@ GVAR(ppEffectMuzzleFlash) ppEffectCommit 0; // Conditions: canInteract if !([ACE_player, objNull, ["isNotEscorting", "isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific - if ((currentVisionMode _player != 1)) exitWith {false}; + if ((currentVisionMode ACE_player != 1)) exitWith {false}; // Statement [ACE_player, -1] call FUNC(changeNVGBrightness); diff --git a/addons/nightvision/functions/fnc_updatePPEffects.sqf b/addons/nightvision/functions/fnc_updatePPEffects.sqf index a90186fe10..9906a440fc 100644 --- a/addons/nightvision/functions/fnc_updatePPEffects.sqf +++ b/addons/nightvision/functions/fnc_updatePPEffects.sqf @@ -15,7 +15,7 @@ */ #include "script_component.hpp" -private ["_currentVehicle", "_grainSetting", "_blurSetting", "_radBlurSetting", "_config"]; +private ["_currentVehicle", "_grainSetting", "_blurSetting", "_radBlurSetting", "_config", "_hmd", "_cameraView", "_turret"]; _currentVehicle = vehicle ACE_player; @@ -41,7 +41,7 @@ _fnc_isUsingHMD = { !("NVG" in getArray (_config >> "ViewOptics" >> "visionMode")); }; - private ["_result", "_turretConfig", "_turretConfigOpticsIn"]; + private ["_result", "_turretConfig", "_turretConfigOpticsIn", "_index"]; _result = true; _turretConfig = [_config, _turret] call EFUNC(common,getTurretConfigPath); _turretConfigOpticsIn = _turretConfig >> "OpticsIn"; diff --git a/addons/noradio/XEH_post_initClient.sqf b/addons/noradio/XEH_post_initClient.sqf index 4f35a1ced9..ecd80a6436 100644 --- a/addons/noradio/XEH_post_initClient.sqf +++ b/addons/noradio/XEH_post_initClient.sqf @@ -2,15 +2,13 @@ #include "script_component.hpp" /* -_setupPlayer = { +[{ if (!isNull ACE_player) then { [(_this select 1)] call cba_fnc_removePerFrameHandler; [ACE_player, "isPlayer"] call EFUNC(common,muteUnit); }; -}; - -[_setupPlayer, 0, []] call CBA_fnc_addPerFrameHandler; +}, 0, []] call CBA_fnc_addPerFrameHandler; */ if (!hasInterface) exitWith {}; diff --git a/addons/switchunits/functions/fnc_addMapFunction.sqf b/addons/switchunits/functions/fnc_addMapFunction.sqf index 62a7c42a22..7204e73d36 100644 --- a/addons/switchunits/functions/fnc_addMapFunction.sqf +++ b/addons/switchunits/functions/fnc_addMapFunction.sqf @@ -17,12 +17,10 @@ #include "script_component.hpp" -private ["_unit", "_sides"]; -_unit = _this select 0; -_sides = _this select 1; +PARAMS_2(_unit,_sides); ["theMapClick", "onMapSingleClick", { - + // IGNORE_PRIVATE_WARNING(_pos,_shift,_alt) if (alive ACE_player && {GVAR(OriginalUnit) getVariable ["ACE_CanSwitchUnits", false]}) then { [_this, _pos, _shift, _alt] call FUNC(handleMapClick); }; diff --git a/addons/switchunits/functions/fnc_handleMapClick.sqf b/addons/switchunits/functions/fnc_handleMapClick.sqf index 3033071984..bfe36f13ea 100644 --- a/addons/switchunits/functions/fnc_handleMapClick.sqf +++ b/addons/switchunits/functions/fnc_handleMapClick.sqf @@ -10,7 +10,7 @@ * None * * Example: - * [_unit, _sides] call FUNC(handleMapClick) + * [unit, _sides] call FUNC(handleMapClick) * * Public: No */ diff --git a/addons/switchunits/functions/fnc_initPlayer.sqf b/addons/switchunits/functions/fnc_initPlayer.sqf index 9c71f8cefc..c2857f1091 100644 --- a/addons/switchunits/functions/fnc_initPlayer.sqf +++ b/addons/switchunits/functions/fnc_initPlayer.sqf @@ -10,7 +10,7 @@ * None * * Example: - * [_player, _sides] call FUNC(initPlayer) + * [player, [west]] call FUNC(initPlayer) * * Public: No */ @@ -19,8 +19,7 @@ private ["_playerUnit", "_sides"]; -_playerUnit = _this select 0; -_sides = _this select 1; +PARAMS_2(_playerUnit,_sides); if (vehicle _playerUnit == _playerUnit) then { diff --git a/addons/switchunits/functions/fnc_nearestPlayers.sqf b/addons/switchunits/functions/fnc_nearestPlayers.sqf index b79c54054f..987c4e3528 100644 --- a/addons/switchunits/functions/fnc_nearestPlayers.sqf +++ b/addons/switchunits/functions/fnc_nearestPlayers.sqf @@ -10,14 +10,15 @@ * Player units > * * Example: - * [_pos, 100] call FUNC(nearestPlayers) + * [[300,300,0], 100] call FUNC(nearestPlayers) * * Public: Yes */ - #include "script_component.hpp" -private ["_position", "_radius", "_nearestPlayers"]; +private ["_nearestPlayers"]; + +PARAMS_2(_position,_radius); _position = _this select 0; _radius = _this select 1; @@ -25,9 +26,9 @@ _radius = _this select 1; _nearestPlayers = []; { - if ([_x] call EFUNC(common,isPlayer) && {alive _x}) then { - _nearestPlayers pushBack _x; - }; + if ([_x] call EFUNC(common,isPlayer) && {alive _x}) then { + _nearestPlayers pushBack _x; + }; } forEach (nearestObjects [_position, ["Man"], _radius]); - _nearestPlayers +_nearestPlayers diff --git a/addons/switchunits/functions/fnc_switchBack.sqf b/addons/switchunits/functions/fnc_switchBack.sqf index d54713bbe4..9a5253cb3d 100644 --- a/addons/switchunits/functions/fnc_switchBack.sqf +++ b/addons/switchunits/functions/fnc_switchBack.sqf @@ -10,26 +10,20 @@ * None * * Example: - * [_origPlayer, _respPlayer] call FUNC(switchBack) + * [_originalPlayerUnit, _currentUnit] call FUNC(switchBack) * * Public: Yes */ #include "script_component.hpp" -private ["_origPlayerUnit"]; +PARMAS_1(_originalPlayerUnit); -_origPlayerUnit = _this select 0; -[_origPlayerUnit] joinSilent GVAR(OriginalGroup); +[_originalPlayerUnit] joinSilent GVAR(OriginalGroup); DFUNC(pfhSwitchBack) = { - - private ["_args", "_originalPlayerUnit", "_currentUnit"]; - - _args = _this select 0; - - _originalPlayerUnit = _args select 0; - _currentUnit = _args select 1; + PARAMS_2(_args,_pfID); + EXPLODE_2_PVT(_args,_originalPlayerUnit,_currentUnit); if (local _originalPlayerUnit) exitWith { selectPlayer _originalPlayerUnit; diff --git a/addons/switchunits/functions/fnc_switchUnit.sqf b/addons/switchunits/functions/fnc_switchUnit.sqf index abd053ffae..b1879b0999 100644 --- a/addons/switchunits/functions/fnc_switchUnit.sqf +++ b/addons/switchunits/functions/fnc_switchUnit.sqf @@ -18,9 +18,9 @@ #include "script_component.hpp" -private ["_unit", "_allNearestPlayers", "_oldUnit", "_leave"]; +private ["_nearestEnemyPlayers", "_allNearestPlayers", "_oldUnit", "_leave"]; -_unit = _this select 1; +PARAMS_1(_unit); // don't switch to original player units if (!([_unit] call FUNC(isValidAi))) exitWith {}; diff --git a/addons/vehiclelock/functions/fnc_moduleSync.sqf b/addons/vehiclelock/functions/fnc_moduleSync.sqf index feed42e3ab..ede20e3196 100644 --- a/addons/vehiclelock/functions/fnc_moduleSync.sqf +++ b/addons/vehiclelock/functions/fnc_moduleSync.sqf @@ -37,6 +37,7 @@ if (!isServer) exitWith {}; }; { + private "_unit"; _unit = _x; if (_unit isKindOf "CAManBase") then { { diff --git a/addons/vehiclelock/functions/fnc_onOpenInventory.sqf b/addons/vehiclelock/functions/fnc_onOpenInventory.sqf index 55fee28cc6..65c3068dce 100644 --- a/addons/vehiclelock/functions/fnc_onOpenInventory.sqf +++ b/addons/vehiclelock/functions/fnc_onOpenInventory.sqf @@ -21,6 +21,7 @@ PARAMS_2(_unit,_container); //Only check for player: if (_unit != ace_player) exitWith {false}; +private "_handeled"; _handeled = false; if (GVAR(LockVehicleInventory) && //if setting not enabled diff --git a/addons/weaponselect/XEH_preInit.sqf b/addons/weaponselect/XEH_preInit.sqf index 790dfe7a99..4c5216c2f6 100644 --- a/addons/weaponselect/XEH_preInit.sqf +++ b/addons/weaponselect/XEH_preInit.sqf @@ -26,6 +26,7 @@ GVAR(CurrentGrenadeMuzzleOther) = ""; // Collect frag and other muzzles separately with uiNamespace do { + private ["_magazines", "_magazine", "_ammo", "_explosive"]; if (isNil QGVAR(FragMuzzles)) then { GVAR(FragMuzzles) = []; GVAR(NonFragMuzzles) = []; diff --git a/addons/weaponselect/functions/fnc_countMagazinesForGrenadeMuzzle.sqf b/addons/weaponselect/functions/fnc_countMagazinesForGrenadeMuzzle.sqf index f73f2444c4..f45ed0ea57 100644 --- a/addons/weaponselect/functions/fnc_countMagazinesForGrenadeMuzzle.sqf +++ b/addons/weaponselect/functions/fnc_countMagazinesForGrenadeMuzzle.sqf @@ -12,18 +12,13 @@ */ #include "script_component.hpp" -private ["_unit", "_muzzle"]; +PARAMS_2(_unit,_muzzle); -_unit = _this select 0; -_muzzle = _this select 1; - -private ["_uniformMags", "_vestMags", "_backPackMags"]; +private ["_uniformMags", "_vestMags", "_backpackMags", "_numberOfMagazines", "_magazineClasses", "_firstMagazine"]; _uniformMags = getMagazineCargo uniformContainer _unit; _vestMags = getMagazineCargo vestContainer _unit; -_backPackMags = getMagazineCargo backpackContainer _unit; - -private ["_numberOfMagazines", "_magazineClasses", "_firstMagazine"]; +_backpackMags = getMagazineCargo backpackContainer _unit; _numberOfMagazines = 0; _magazineClasses = getArray (configFile >> "CfgWeapons" >> "Throw" >> _muzzle >> "magazines"); diff --git a/addons/weaponselect/functions/fnc_displayGrenadeTypeAndNumber.sqf b/addons/weaponselect/functions/fnc_displayGrenadeTypeAndNumber.sqf index 1922ffdbb9..d7a68e7f50 100644 --- a/addons/weaponselect/functions/fnc_displayGrenadeTypeAndNumber.sqf +++ b/addons/weaponselect/functions/fnc_displayGrenadeTypeAndNumber.sqf @@ -21,10 +21,10 @@ _numberofMagazines = _this select 1; private ["_color", "_name", "_text", "_picture"]; -_color = [[1,0,0], [1,1,1]] select (_numberOfMagazines > 0); +_color = [[1,0,0], [1,1,1]] select (_numberofMagazines > 0); _name = getText (configFile >> "CfgMagazines" >> _magazine >> "displayNameShort"); -_text = [format["%1 x%2", _name, _numberOfMagazines], _color] call EFUNC(common,stringToColoredText); +_text = [format["%1 x%2", _name, _numberofMagazines], _color] call EFUNC(common,stringToColoredText); _picture = getText (configFile >> "CfgMagazines" >> _magazine >> "picture"); [_text, _picture] call EFUNC(common,displayTextPicture); diff --git a/addons/weaponselect/functions/fnc_selectGrenadeAll.sqf b/addons/weaponselect/functions/fnc_selectGrenadeAll.sqf index 31999ad0b9..a75a11c202 100644 --- a/addons/weaponselect/functions/fnc_selectGrenadeAll.sqf +++ b/addons/weaponselect/functions/fnc_selectGrenadeAll.sqf @@ -11,41 +11,41 @@ */ #include "script_component.hpp" -private ["_unit", "_nextMuzzle"]; +private ["_text", "_nextMuzzle"]; -_unit = _this select 0; +PARAMS_1(_unit); _nextMuzzle = ["All"] call FUNC(findNextGrenadeMuzzle); if (_nextMuzzle != "") then { - private ["_magazines", "_magazine", "_count", "_return"]; - _magazines = GVAR(AllMagazines) select (GVAR(AllMuzzles) find _nextMuzzle); - reverse _magazines; + private ["_magazines", "_magazine", "_count", "_return"]; + _magazines = GVAR(AllMagazines) select (GVAR(AllMuzzles) find _nextMuzzle); + reverse _magazines; - _magazine = ""; - _count = {_return = _x in _magazines; if (_return) then {_magazine = _x}; _return} count magazines _unit; + _magazine = ""; + _count = {_return = _x in _magazines; if (_return) then {_magazine = _x}; _return} count magazines _unit; - // There is a muzzle with magazines --> cycle to it - [_unit, _nextMuzzle] call FUNC(setNextGrenadeMuzzle); + // There is a muzzle with magazines --> cycle to it + [_unit, _nextMuzzle] call FUNC(setNextGrenadeMuzzle); - [_magazine, _count] call FUNC(displayGrenadeTypeAndNumber); + [_magazine, _count] call FUNC(displayGrenadeTypeAndNumber); } else { - // There is a no muzzle with magazines --> select nothing - GVAR(CurrentGrenadeMuzzleFrag) = ""; GVAR(CurrentGrenadeMuzzleOther) = ""; + // There is a no muzzle with magazines --> select nothing + GVAR(CurrentGrenadeMuzzleFrag) = ""; GVAR(CurrentGrenadeMuzzleOther) = ""; - if (GVAR(DisplayText)) then { - _text = [localize "STR_ACE_WeaponSelect_NoGrenadesLeft", [1,0,0]] call EFUNC(common,stringToColoredText); - [composeText [lineBreak, _text]] call EFUNC(common,displayTextStructured); - }; + if (GVAR(DisplayText)) then { + _text = [localize "STR_ACE_WeaponSelect_NoGrenadesLeft", [1,0,0]] call EFUNC(common,stringToColoredText); + [composeText [lineBreak, _text]] call EFUNC(common,displayTextStructured); + }; }; if (_nextMuzzle in GVAR(FragMuzzles)) then { - GVAR(CurrentGrenadeMuzzleFrag) = _nextMuzzle; - GVAR(CurrentGrenadeMuzzleIsFrag) = true; + GVAR(CurrentGrenadeMuzzleFrag) = _nextMuzzle; + GVAR(CurrentGrenadeMuzzleIsFrag) = true; } else { - GVAR(CurrentGrenadeMuzzleOther) = _nextMuzzle; - GVAR(CurrentGrenadeMuzzleIsFrag) = false; + GVAR(CurrentGrenadeMuzzleOther) = _nextMuzzle; + GVAR(CurrentGrenadeMuzzleIsFrag) = false; }; diff --git a/addons/weaponselect/functions/fnc_selectGrenadeFrag.sqf b/addons/weaponselect/functions/fnc_selectGrenadeFrag.sqf index 408cf0e608..0dee3e5c57 100644 --- a/addons/weaponselect/functions/fnc_selectGrenadeFrag.sqf +++ b/addons/weaponselect/functions/fnc_selectGrenadeFrag.sqf @@ -11,34 +11,34 @@ */ #include "script_component.hpp" -private ["_unit", "_nextMuzzle"]; +private ["_text", "_nextMuzzle"]; -_unit = _this select 0; +PARAMS_1(_unit); _nextMuzzle = ["Frag"] call FUNC(findNextGrenadeMuzzle); if (_nextMuzzle != "") then { - GVAR(CurrentGrenadeMuzzleFrag) = _nextMuzzle; + GVAR(CurrentGrenadeMuzzleFrag) = _nextMuzzle; - private ["_magazines", "_magazine", "_count", "_return"]; - _magazines = GVAR(FragMagazines) select (GVAR(FragMuzzles) find _nextMuzzle); - reverse _magazines; + private ["_magazines", "_magazine", "_count", "_return"]; + _magazines = GVAR(FragMagazines) select (GVAR(FragMuzzles) find _nextMuzzle); + reverse _magazines; - _magazine = ""; - _count = {_return = _x in _magazines; if (_return) then {_magazine = _x}; _return} count magazines _unit; + _magazine = ""; + _count = {_return = _x in _magazines; if (_return) then {_magazine = _x}; _return} count magazines _unit; - // There is a muzzle with magazines --> cycle to it - [_unit, _nextMuzzle] call FUNC(setNextGrenadeMuzzle); + // There is a muzzle with magazines --> cycle to it + [_unit, _nextMuzzle] call FUNC(setNextGrenadeMuzzle); - [_magazine, _count] call FUNC(displayGrenadeTypeAndNumber); + [_magazine, _count] call FUNC(displayGrenadeTypeAndNumber); } else { - // There is a no muzzle with magazines --> select nothing - GVAR(CurrentGrenadeMuzzleFrag) = ""; - if (GVAR(DisplayText)) then { - _text = [localize "STR_ACE_WeaponSelect_NoFragsLeft", [1,0,0]] call EFUNC(common,stringToColoredText); - [composeText [lineBreak, _text]] call EFUNC(common,displayTextStructured); - }; + // There is a no muzzle with magazines --> select nothing + GVAR(CurrentGrenadeMuzzleFrag) = ""; + if (GVAR(DisplayText)) then { + _text = [localize "STR_ACE_WeaponSelect_NoFragsLeft", [1,0,0]] call EFUNC(common,stringToColoredText); + [composeText [lineBreak, _text]] call EFUNC(common,displayTextStructured); + }; }; GVAR(CurrentGrenadeMuzzleIsFrag) = true; diff --git a/addons/weaponselect/functions/fnc_selectGrenadeOther.sqf b/addons/weaponselect/functions/fnc_selectGrenadeOther.sqf index c732010a2b..4ab65e5bf3 100644 --- a/addons/weaponselect/functions/fnc_selectGrenadeOther.sqf +++ b/addons/weaponselect/functions/fnc_selectGrenadeOther.sqf @@ -11,34 +11,34 @@ */ #include "script_component.hpp" -private ["_unit", "_nextMuzzle"]; +private ["_nextMuzzle", "_text"]; -_unit = _this select 0; +PARAMS_1(_unit); _nextMuzzle = ["NonFrag"] call FUNC(findNextGrenadeMuzzle); if (_nextMuzzle != "") then { - GVAR(CurrentGrenadeMuzzleOther) = _nextMuzzle; + GVAR(CurrentGrenadeMuzzleOther) = _nextMuzzle; - private ["_magazines", "_magazine", "_count", "_return"]; - _magazines = GVAR(NonFragMagazines) select (GVAR(NonFragMuzzles) find _nextMuzzle); - reverse _magazines; + private ["_magazines", "_magazine", "_count", "_return"]; + _magazines = GVAR(NonFragMagazines) select (GVAR(NonFragMuzzles) find _nextMuzzle); + reverse _magazines; - _magazine = ""; - _count = {_return = _x in _magazines; if (_return) then {_magazine = _x}; _return} count magazines _unit; + _magazine = ""; + _count = {_return = _x in _magazines; if (_return) then {_magazine = _x}; _return} count magazines _unit; - // There is a muzzle with magazines --> cycle to it - [_unit, _nextMuzzle] call FUNC(setNextGrenadeMuzzle); + // There is a muzzle with magazines --> cycle to it + [_unit, _nextMuzzle] call FUNC(setNextGrenadeMuzzle); - [_magazine, _count] call FUNC(displayGrenadeTypeAndNumber); + [_magazine, _count] call FUNC(displayGrenadeTypeAndNumber); } else { - // There is a no muzzle with magazines --> select nothing - GVAR(CurrentGrenadeMuzzleOther) = ""; - if (GVAR(DisplayText)) then { - _text = [localize "STR_ACE_WeaponSelect_NoMiscGrenadeLeft", [1,0,0]] call EFUNC(common,stringToColoredText); - [composeText [lineBreak, _text]] call EFUNC(common,displayTextStructured); - }; + // There is a no muzzle with magazines --> select nothing + GVAR(CurrentGrenadeMuzzleOther) = ""; + if (GVAR(DisplayText)) then { + _text = [localize "STR_ACE_WeaponSelect_NoMiscGrenadeLeft", [1,0,0]] call EFUNC(common,stringToColoredText); + [composeText [lineBreak, _text]] call EFUNC(common,displayTextStructured); + }; }; GVAR(CurrentGrenadeMuzzleIsFrag) = false; diff --git a/addons/weaponselect/functions/fnc_setNextGrenadeMuzzle.sqf b/addons/weaponselect/functions/fnc_setNextGrenadeMuzzle.sqf index ced1fa87b3..81d1a59ed1 100644 --- a/addons/weaponselect/functions/fnc_setNextGrenadeMuzzle.sqf +++ b/addons/weaponselect/functions/fnc_setNextGrenadeMuzzle.sqf @@ -17,19 +17,15 @@ private ["_unit", "_muzzle"]; _unit = _this select 0; _muzzle = _this select 1; -private ["_uniformMags", "_vestMags", "_backPackMags"]; +private ["_uniformMags", "_vestMags", "_backpackMags", "_i", "_uniformMagsToRemove", "_vestMagsToRemove", "_backpackMagsToRemove", "_firstMagazine", "_throwMuzzleNames"]; _uniformMags = getMagazineCargo uniformContainer _unit; _vestMags = getMagazineCargo vestContainer _unit; -_backPackMags = getMagazineCargo backpackContainer _unit; - -private ["_uniformMagsToRemove", "_vestMagsToRemove", "_backPackMagsToRemove"]; +_backpackMags = getMagazineCargo backpackContainer _unit; _uniformMagsToRemove = []; _vestMagsToRemove = []; -_backPackMagsToRemove = []; - -private ["_firstMagazine", "_throwMuzzleNames"]; +_backpackMagsToRemove = []; _firstMagazine = ""; _throwMuzzleNames = getArray (configfile >> "CfgWeapons" >> "Throw" >> "muzzles"); @@ -99,7 +95,7 @@ _throwMuzzleNames = getArray (configfile >> "CfgWeapons" >> "Throw" >> "muzzles" for [{_i = 0}, {_i < (_x select 1)}, {_i = _i + 1}] do { _unit removeItem (_x select 0); }; -} forEach _backPackMagsToRemove; +} forEach _backpackMagsToRemove; // Readd magazines { @@ -118,4 +114,4 @@ _throwMuzzleNames = getArray (configfile >> "CfgWeapons" >> "Throw" >> "muzzles" for [{_i = 0}, {_i < (_x select 1)}, {_i = _i + 1}] do { _unit addItemToBackpack (_x select 0); }; -} forEach _backPackMagsToRemove; +} forEach _backpackMagsToRemove; diff --git a/tools/search_privates.py b/tools/search_privates.py index 404c56f4db..56626c5bfd 100644 --- a/tools/search_privates.py +++ b/tools/search_privates.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python3 import fnmatch import os @@ -21,7 +21,7 @@ def get_private_declare(content): priv_split = sorted(set(priv_split)) priv_declared += priv_split; - srch = re.compile('PARAMS_[0-9].*|EXPLODE_[0-9]_PVT.*|DEFAULT_PARAM.*|KEY_PARAM.*') + srch = re.compile('PARAMS_[0-9].*|EXPLODE_[0-9]_PVT.*|DEFAULT_PARAM.*|KEY_PARAM.*|IGNORE_PRIVATE_WARNING.*') priv_srch_declared = srch.findall(content) priv_srch_declared = sorted(set(priv_srch_declared)) @@ -37,7 +37,7 @@ def get_private_declare(content): return priv_declared def check_privates(filepath): - + bad_count_file = 0 def pushClosing(t): closingStack.append(closing.expr) closing << Literal( closingFor[t[0]] ) @@ -81,6 +81,9 @@ def check_privates(filepath): print (filepath) for bad_priv in missing: print ('\t' + bad_priv) + bad_count_file = bad_count_file + 1 + + return bad_count_file def main(): @@ -89,6 +92,7 @@ def main(): print("#########################") sqf_list = [] + bad_count = 0 parser = argparse.ArgumentParser() parser.add_argument('-m','--module', help='only search specified module addon folder', required=False, default=".") @@ -99,7 +103,10 @@ def main(): sqf_list.append(os.path.join(root, filename)) for filename in sqf_list: - check_privates(filename) + bad_count = bad_count + check_privates(filename) + + + print ("Bad Count {0}".format(bad_count)) if __name__ == "__main__": main() From dce344c85ffaf93a501d58e3133468182218789e Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 17 Apr 2015 16:51:27 -0500 Subject: [PATCH 202/305] Ignore Case --- .../functions/fnc_teleportToRallypoint.sqf | 40 +++++++++---------- .../switchunits/functions/fnc_switchBack.sqf | 2 +- tools/search_privates.py | 4 +- 3 files changed, 22 insertions(+), 24 deletions(-) diff --git a/addons/respawn/functions/fnc_teleportToRallypoint.sqf b/addons/respawn/functions/fnc_teleportToRallypoint.sqf index 82a1d68e05..dc3cc16b92 100644 --- a/addons/respawn/functions/fnc_teleportToRallypoint.sqf +++ b/addons/respawn/functions/fnc_teleportToRallypoint.sqf @@ -1,31 +1,29 @@ /* - Name: ACE_Respawn_fnc_teleportToRallypoint - - Author(s): - commy2 - - Description: - teleports a unit to a rallypoint - - Parameters: - 0: OBJECT - unit - 1: OBJECT - side - 2: BOOLEAN - teleport to base - - Returns: - VOID -*/ - + * Author: commy2 + * teleports a unit to a rallypoint + * + * Arguments: + * 0: unit + * 1: side? + * 2: teleport to base + * + * Return Value: + * Nothing + * + * Example: + * [,,] call ACE_Respawn_fnc_teleportToRallypoint; + * + * Public: No + */ #include "script_component.hpp" -private ["_unit", "_side", "_rallypoint", "_toBase"]; +PARAMS_3(_unit,_side,_rallypoint); -_unit = _this select 0; -_side = _this select 1; -_rallypoint = _this select 2; +private ["_toBase"]; // rallypoint names are defined in CfgVehicles.hpp +//IGNORE_PRIVATE_WARNING("_Base") _toBase = _rallypoint find "_Base" != -1; _rallypoint = missionNamespace getVariable [_rallypoint, objNull], diff --git a/addons/switchunits/functions/fnc_switchBack.sqf b/addons/switchunits/functions/fnc_switchBack.sqf index 9a5253cb3d..69be77dd8b 100644 --- a/addons/switchunits/functions/fnc_switchBack.sqf +++ b/addons/switchunits/functions/fnc_switchBack.sqf @@ -17,7 +17,7 @@ #include "script_component.hpp" -PARMAS_1(_originalPlayerUnit); +PARAMS_1(_originalPlayerUnit); [_originalPlayerUnit] joinSilent GVAR(OriginalGroup); diff --git a/tools/search_privates.py b/tools/search_privates.py index 56626c5bfd..6e1430a8ca 100644 --- a/tools/search_privates.py +++ b/tools/search_privates.py @@ -73,8 +73,8 @@ def check_privates(filepath): missing = [] for s in priv_use: - if s not in priv_declared: - if s not in missing: + if s.lower() not in map(str.lower,priv_declared): + if s.lower() not in map(str.lower,missing): missing.append(s) if len(missing) > 0: From 314b0d23d68803ab66e860d0ebfa0a3e22a7bd15 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sat, 18 Apr 2015 00:11:53 +0200 Subject: [PATCH 203/305] ATragMX Feature Expansion: *Added Gun and Ammo Data Screen *Added Atomospheric and Environmental Data Screen *Added Target Data Screen *Added support for coriolis- and spin drift *Added a second option (AT) to enter atmospheric data *Target data is now saved/restored in/from the profileNamespace *Atmosphere data is now saved/restored in/from the profileNamespace *Selected gun profile is now saved/restored in/from the profileNamespace *Fixed several bugs in the dual-/imperial unit systems *Minor bug fixes in the target range assist screen *Minor bug fix in the target speed assist screen --- addons/atragmx/RscTitles.hpp | 318 ++++++++++++++++-- addons/atragmx/XEH_postInit.sqf | 47 +-- addons/atragmx/XEH_preInit.sqf | 17 + .../functions/fnc_calculate_range_card.sqf | 51 ++- .../fnc_calculate_scope_base_angle.sqf | 2 +- .../functions/fnc_calculate_solution.sqf | 66 +++- .../fnc_calculate_target_range_assist.sqf | 2 +- .../fnc_calculate_target_solution.sqf | 57 +++- .../fnc_calculate_target_speed_assist.sqf | 21 +- addons/atragmx/functions/fnc_change_gun.sqf | 19 +- .../functions/fnc_change_target_slot.sqf | 2 +- .../atragmx/functions/fnc_create_dialog.sqf | 3 + .../atragmx/functions/fnc_cycle_gun_list.sqf | 18 + .../functions/fnc_cycle_image_size_units.sqf | 19 ++ .../functions/fnc_cycle_num_ticks_units.sqf | 20 ++ .../functions/fnc_cycle_target_size_units.sqf | 19 ++ addons/atragmx/functions/fnc_init.sqf | 15 +- addons/atragmx/functions/fnc_parse_input.sqf | 80 +++-- .../functions/fnc_restore_atmo_default.sqf | 25 ++ .../functions/fnc_restore_user_data.sqf | 36 ++ .../functions/fnc_show_atmo_env_data.sqf | 25 ++ .../functions/fnc_show_gun_ammo_data.sqf | 24 ++ .../atragmx/functions/fnc_show_main_page.sqf | 10 +- .../functions/fnc_show_target_data.sqf | 24 ++ .../fnc_show_target_range_assist.sqf | 6 +- .../fnc_show_target_speed_assist.sqf | 12 +- .../atragmx/functions/fnc_store_user_data.sqf | 36 ++ .../functions/fnc_toggle_atmo_env_data.sqf | 28 ++ .../functions/fnc_toggle_gun_ammo_data.sqf | 29 ++ .../atragmx/functions/fnc_toggle_gun_list.sqf | 12 +- .../functions/fnc_toggle_range_card.sqf | 6 +- .../functions/fnc_toggle_range_card_setup.sqf | 13 +- .../functions/fnc_toggle_target_data.sqf | 28 ++ .../fnc_toggle_target_range_assist.sqf | 16 +- .../fnc_toggle_target_speed_assist.sqf | 15 +- .../functions/fnc_update_atmo_env_data.sqf | 45 +++ .../functions/fnc_update_atmo_selection.sqf | 31 ++ .../functions/fnc_update_atmosphere.sqf | 15 +- addons/atragmx/functions/fnc_update_gun.sqf | 36 +- .../functions/fnc_update_gun_ammo_data.sqf | 74 ++++ .../functions/fnc_update_range_card.sqf | 46 +-- .../atragmx/functions/fnc_update_result.sqf | 14 +- .../atragmx/functions/fnc_update_target.sqf | 25 +- .../functions/fnc_update_target_data.sqf | 40 +++ .../functions/fnc_update_unit_selection.sqf | 4 + .../functions/fnc_update_zero_range.sqf | 15 +- 46 files changed, 1174 insertions(+), 292 deletions(-) create mode 100644 addons/atragmx/functions/fnc_cycle_gun_list.sqf create mode 100644 addons/atragmx/functions/fnc_cycle_image_size_units.sqf create mode 100644 addons/atragmx/functions/fnc_cycle_num_ticks_units.sqf create mode 100644 addons/atragmx/functions/fnc_cycle_target_size_units.sqf create mode 100644 addons/atragmx/functions/fnc_restore_atmo_default.sqf create mode 100644 addons/atragmx/functions/fnc_restore_user_data.sqf create mode 100644 addons/atragmx/functions/fnc_show_atmo_env_data.sqf create mode 100644 addons/atragmx/functions/fnc_show_gun_ammo_data.sqf create mode 100644 addons/atragmx/functions/fnc_show_target_data.sqf create mode 100644 addons/atragmx/functions/fnc_store_user_data.sqf create mode 100644 addons/atragmx/functions/fnc_toggle_atmo_env_data.sqf create mode 100644 addons/atragmx/functions/fnc_toggle_gun_ammo_data.sqf create mode 100644 addons/atragmx/functions/fnc_toggle_target_data.sqf create mode 100644 addons/atragmx/functions/fnc_update_atmo_env_data.sqf create mode 100644 addons/atragmx/functions/fnc_update_atmo_selection.sqf create mode 100644 addons/atragmx/functions/fnc_update_gun_ammo_data.sqf create mode 100644 addons/atragmx/functions/fnc_update_target_data.sqf diff --git a/addons/atragmx/RscTitles.hpp b/addons/atragmx/RscTitles.hpp index b60ff03fdc..592374ddad 100644 --- a/addons/atragmx/RscTitles.hpp +++ b/addons/atragmx/RscTitles.hpp @@ -230,12 +230,12 @@ class ATragMX_Display { w=0.03; h=0.03; colorBackground[]={0,0,0,0.0}; - action=QUOTE((GVAR(currentGun) + (count GVAR(gunList)) - 1) % (count GVAR(gunList)) call FUNC(change_gun)); + action=QUOTE(-1 call FUNC(cycle_gun_list)); }; class BOTTOM: TOP { idc=-1; y=0.265*safezoneH+safezoneY+0.955; - action=QUOTE((GVAR(currentGun) + (count GVAR(gunList)) + 1) % (count GVAR(gunList)) call FUNC(change_gun)); + action=QUOTE(+1 call FUNC(cycle_gun_list)); }; class LEFT: ATragMX_RscButton { idc=-1; @@ -316,6 +316,7 @@ class ATragMX_Display { colorBackground[]={0.15,0.21,0.23,0.3}; colorFocused[]={0.15,0.21,0.23,0.2}; text="Gun"; + action=QUOTE(call FUNC(toggle_gun_ammo_data)); }; class TEXT_BORE_HEIGHT: TEXT_GUN_PROFILE { idc=10; @@ -323,12 +324,12 @@ class ATragMX_Display { y=0.265*safezoneH+safezoneY+0.285; text="BH"; }; - class TEXT_BORE_HEIGHT_INPUT: ATragMX_RscEdit { + class TEXT_BORE_HEIGHT_OUTPUT: TEXT_BORE_HEIGHT { idc=100; + style=ST_RIGHT; w=0.058; x=0.550*safezoneW+safezoneX+0.145; y=0.265*safezoneH+safezoneY+0.285; - onKeyUp=QUOTE(if (_this select 1 == 28) then {call FUNC(calculate_target_solution)}); }; class TEXT_BULLET_MASS: TEXT_BORE_HEIGHT { idc=11; @@ -336,7 +337,7 @@ class ATragMX_Display { y=0.265*safezoneH+safezoneY+0.320; text="BW"; }; - class TEXT_BULLET_MASS_INPUT: TEXT_BORE_HEIGHT_INPUT { + class TEXT_BULLET_MASS_OUTPUT: TEXT_BORE_HEIGHT_OUTPUT { idc=110; y=0.265*safezoneH+safezoneY+0.320; }; @@ -345,7 +346,7 @@ class ATragMX_Display { y=0.265*safezoneH+safezoneY+0.355; text="C1"; }; - class TEXT_AIR_FRICTION_INPUT: TEXT_BORE_HEIGHT_INPUT { + class TEXT_AIR_FRICTION_OUTPUT: TEXT_BORE_HEIGHT_OUTPUT { idc=120; y=0.265*safezoneH+safezoneY+0.355; }; @@ -359,7 +360,7 @@ class ATragMX_Display { colorFocused[]={0.15,0.21,0.23,0.2}; text="MV"; }; - class TEXT_MUZZLE_VELOCITY_INPUT: TEXT_BORE_HEIGHT_INPUT { + class TEXT_MUZZLE_VELOCITY_OUTPUT: TEXT_BORE_HEIGHT_OUTPUT { idc=130; y=0.265*safezoneH+safezoneY+0.390; }; @@ -368,35 +369,35 @@ class ATragMX_Display { y=0.265*safezoneH+safezoneY+0.425; text="ZR"; }; - class TEXT_ZERO_RANGE_INPUT: TEXT_BORE_HEIGHT_INPUT { + class TEXT_ZERO_RANGE_OUTPUT: TEXT_BORE_HEIGHT_OUTPUT { idc=140; y=0.265*safezoneH+safezoneY+0.425; - onKeyUp=QUOTE(if (_this select 1 == 28) then {call FUNC(update_zero_range)}); }; class TEXT_ATMOSPHERE: TEXT_GUN { idc=4001; x=0.550*safezoneW+safezoneX+0.205; text="Atmsphr"; + action=QUOTE(0 call FUNC(toggle_atmo_env_data)); }; class TEXT_TEMPERATURE: TEXT_BULLET_MASS { idc=20; x=0.550*safezoneW+safezoneX+0.20; text="Tmp"; }; - class TEXT_TEMPERATURE_INPUT: ATragMX_RscEdit { + class TEXT_TEMPERATURE_OUTPUT: TEXT_TEMPERATURE { idc=200; + style=ST_RIGHT; w=0.050; x=0.550*safezoneW+safezoneX+0.245; y=0.265*safezoneH+safezoneY+0.320; text=""; - onKeyUp=QUOTE(if (_this select 1 == 28) then {call FUNC(calculate_target_solution)}); }; class TEXT_BAROMETRIC_PRESSURE: TEXT_AIR_FRICTION { idc=21; x=0.550*safezoneW+safezoneX+0.20; text="BP"; }; - class TEXT_BAROMETRIC_PRESSURE_INPUT: TEXT_TEMPERATURE_INPUT { + class TEXT_BAROMETRIC_PRESSURE_OUTPUT: TEXT_TEMPERATURE_OUTPUT { idc=210; y=0.265*safezoneH+safezoneY+0.355; }; @@ -406,10 +407,19 @@ class ATragMX_Display { y=0.265*safezoneH+safezoneY+0.390; text="RH"; }; - class TEXT_RELATIVE_HUMIDITY_INPUT: TEXT_TEMPERATURE_INPUT { + class TEXT_RELATIVE_HUMIDITY_OUTPUT: TEXT_TEMPERATURE_OUTPUT { idc=220; y=0.265*safezoneH+safezoneY+0.390; }; + class TEXT_ALTITUDE: TEXT_BORE_HEIGHT { + idc=23; + x=0.550*safezoneW+safezoneX+0.20; + text="Alt"; + }; + class TEXT_ALTITUDE_OUTPUT: TEXT_TEMPERATURE_OUTPUT { + idc=230; + y=0.265*safezoneH+safezoneY+0.285; + }; class TEXT_TARGET_A: ATragMX_RscButton { idc=500; w=0.0231; @@ -445,18 +455,18 @@ class ATragMX_Display { idc=4002; x=0.550*safezoneW+safezoneX+0.3; text="Target"; + action=QUOTE(0 call FUNC(toggle_target_data)); }; class TEXT_WIND_SPEED: TEXT_BORE_HEIGHT { idc=30; x=0.550*safezoneW+safezoneX+0.3; text="WS"; }; - class TEXT_WIND_SPEED_INPUT: ATragMX_RscEdit { + class TEXT_WIND_SPEED_OUTPUT: TEXT_BORE_HEIGHT_OUTPUT { idc=300; w=0.058; x=0.550*safezoneW+safezoneX+0.335; y=0.265*safezoneH+safezoneY+0.285; - onKeyUp=QUOTE(if (_this select 1 == 28) then {call FUNC(calculate_target_solution)}); text="0"; }; class TEXT_WIND_DIRECTION: TEXT_BULLET_MASS { @@ -464,7 +474,7 @@ class ATragMX_Display { x=0.550*safezoneW+safezoneX+0.3; text="WD"; }; - class TEXT_WIND_DIRECTION_INPUT: TEXT_WIND_SPEED_INPUT { + class TEXT_WIND_DIRECTION_OUTPUT: TEXT_WIND_SPEED_OUTPUT { idc=310; y=0.265*safezoneH+safezoneY+0.32; }; @@ -473,7 +483,7 @@ class ATragMX_Display { x=0.550*safezoneW+safezoneX+0.3; text="IA"; }; - class TEXT_INCLINATION_ANGLE_INPUT: TEXT_WIND_SPEED_INPUT { + class TEXT_INCLINATION_ANGLE_OUTPUT: TEXT_WIND_SPEED_OUTPUT { idc=320; y=0.265*safezoneH+safezoneY+0.355; }; @@ -481,9 +491,9 @@ class ATragMX_Display { idc=33; x=0.550*safezoneW+safezoneX+0.3; text="TS"; - action=QUOTE(call FUNC(toggle_target_speed_assist)); + action=QUOTE(0 call FUNC(toggle_target_speed_assist)); }; - class TEXT_TARGET_SPEED_INPUT: TEXT_WIND_SPEED_INPUT { + class TEXT_TARGET_SPEED_OUTPUT: TEXT_WIND_SPEED_OUTPUT { idc=330; y=0.265*safezoneH+safezoneY+0.39; }; @@ -493,7 +503,7 @@ class ATragMX_Display { text="TR"; action=QUOTE(0 call FUNC(toggle_target_range_assist)); }; - class TEXT_TARGET_RANGE_INPUT: TEXT_WIND_SPEED_INPUT { + class TEXT_TARGET_RANGE_INPUT: TEXT_WIND_SPEED_OUTPUT { idc=340; y=0.265*safezoneH+safezoneY+0.425; }; @@ -563,6 +573,7 @@ class ATragMX_Display { x=0.550*safezoneW+safezoneX+0.11; y=0.265*safezoneH+safezoneY+0.57; text="Lead"; + action=""; }; class TEXT_LEAD_OUTPUT: TEXT_ELEVATION_OUTPUT_ABSOLUTE { idc=420; @@ -814,13 +825,13 @@ class ATragMX_Display { w=0.07; x=0.550*safezoneW+safezoneX+0.32; text="cm"; - action=QUOTE(GVAR(rangeAssistTargetSizeUnit)=(GVAR(rangeAssistTargetSizeUnit)+1) % (count GVAR(GVAR(rangeAssistTargetSizeUnit)s)); ctrlSetText [7014, GVAR(GVAR(rangeAssistTargetSizeUnit)s) select GVAR(rangeAssistTargetSizeUnit)]); + action=QUOTE(call FUNC(cycle_target_size_units)); }; class TEXT_TARGET_RANGE_ASSIST_IMAGE_SIZE_UNIT: TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE_UNIT { idc=7015; y=0.265*safezoneH+safezoneY+0.45; text="MIL"; - action=QUOTE(GVAR(rangeAssistImageSizeUnit)=(GVAR(rangeAssistImageSizeUnit)+1) % (count GVAR(rangeAssistImageSizeUnits)); ctrlSetText [7015, GVAR(rangeAssistImageSizeUnits) select GVAR(rangeAssistImageSizeUnit)]); + action=QUOTE(call FUNC(cycle_image_size_units)); }; class TEXT_TARGET_RANGE_ASSIST_ESTIMATED_RANGE_UNIT: TEXT_TARGET_RANGE_ASSIST_ESTIMATED_RANGE { idc=7016; @@ -861,22 +872,22 @@ class ATragMX_Display { class TEXT_TARGET_SPEED_ASSIST_TARGET_RANGE: TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE { idc=8000; - x=0.550*safezoneW+safezoneX+0.12; + x=0.550*safezoneW+safezoneX+0.13; text="Target Range"; }; class TEXT_TARGET_SPEED_ASSIST_NUM_TICKS: TEXT_TARGET_RANGE_ASSIST_IMAGE_SIZE { idc=8001; - x=0.550*safezoneW+safezoneX+0.12; + x=0.550*safezoneW+safezoneX+0.13; text="Num Ticks"; }; class TEXT_TARGET_SPEED_ASSIST_TIME: TEXT_TARGET_RANGE_ASSIST_ANGLE { idc=8002; - x=0.550*safezoneW+safezoneX+0.12; + x=0.550*safezoneW+safezoneX+0.13; text="Time (secs)"; }; class TEXT_TARGET_SPEED_ASSIST_TARGET_ESTIMATED_SPEED: TEXT_TARGET_RANGE_ASSIST_ESTIMATED_RANGE { idc=8003; - x=0.550*safezoneW+safezoneX+0.12; + x=0.550*safezoneW+safezoneX+0.13; text="Est Speed"; }; class TEXT_TARGET_SPEED_ASSIST_TARGET_RANGE_INPUT: TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE_INPUT { @@ -907,7 +918,7 @@ class ATragMX_Display { class TEXT_TARGET_SPEED_ASSIST_NUM_TICKS_UNIT: TEXT_TARGET_RANGE_ASSIST_IMAGE_SIZE_UNIT { idc=8009; text="MIL"; - action=QUOTE(GVAR(speedAssistNumTicksUnit)=(GVAR(speedAssistNumTicksUnit)+1) % (count GVAR(speedAssistNumTicksUnits)); ctrlSetText [8009, GVAR(speedAssistNumTicksUnits) select GVAR(speedAssistNumTicksUnit)]; call FUNC(calculate_target_speed_assist)); + action=QUOTE(call FUNC(cycle_num_ticks_units)); }; class TEXT_TARGET_SPEED_ASSIST_TIMER_START: TEXT_TARGET_RANGE_ASSIST_IMAGE_SIZE_UNIT { idc=8010; @@ -1046,5 +1057,258 @@ class ATragMX_Display { text="Cancel"; action=QUOTE(false call FUNC(show_add_new_gun); true call FUNC(show_gun_list)); }; + + class TEXT_GUN_AMMO_DATA_BORE_HEIGHT: TEXT_BORE_HEIGHT { + idc=12000; + w=0.22; + y=0.265*safezoneH+safezoneY+0.28; + text="Bore (cm)"; + }; + class TEXT_GUN_AMMO_DATA_BORE_HEIGHT_INPUT: ATragMX_RscEdit { + idc=120000; + w=0.06; + x=0.550*safezoneW+safezoneX+0.335; + y=0.265*safezoneH+safezoneY+0.28; + }; + class TEXT_GUN_AMMO_DATA_BULLET_MASS: TEXT_GUN_AMMO_DATA_BORE_HEIGHT { + idc=12001; + y=0.265*safezoneH+safezoneY+0.320; + text="Bullet Weight (grams)"; + }; + class TEXT_GUN_AMMO_DATA_BULLET_MASS_INPUT: TEXT_GUN_AMMO_DATA_BORE_HEIGHT_INPUT { + idc=120010; + y=0.265*safezoneH+safezoneY+0.320; + }; + class TEXT_GUN_AMMO_DATA_BULLET_DIAMETER: TEXT_GUN_AMMO_DATA_BORE_HEIGHT { + idc=12002; + y=0.265*safezoneH+safezoneY+0.360; + text="Bullet Diam (cm)"; + }; + class TEXT_GUN_AMMO_DATA_BULLET_DIAMETER_INPUT: TEXT_GUN_AMMO_DATA_BORE_HEIGHT_INPUT { + idc=120020; + y=0.265*safezoneH+safezoneY+0.360; + }; + class TEXT_GUN_AMMO_DATA_AIR_FRICTION: TEXT_GUN_AMMO_DATA_BORE_HEIGHT { + idc=12003; + y=0.265*safezoneH+safezoneY+0.400; + text="C1 Coefficient"; + }; + class TEXT_GUN_AMMO_DATA_AIR_FRICTION_INPUT: TEXT_GUN_AMMO_DATA_BORE_HEIGHT_INPUT { + idc=120030; + y=0.265*safezoneH+safezoneY+0.400; + }; + class TEXT_GUN_AMMO_DATA_RIFLE_TWIST: TEXT_GUN_AMMO_DATA_BORE_HEIGHT { + idc=12004; + y=0.265*safezoneH+safezoneY+0.440; + text="Rifle Twist (cm/trn)"; + }; + class TEXT_GUN_AMMO_DATA_RIFLE_TWIST_INPUT: TEXT_GUN_AMMO_DATA_BORE_HEIGHT_INPUT { + idc=120040; + y=0.265*safezoneH+safezoneY+0.440; + }; + class TEXT_GUN_AMMO_DATA_MUZZLE_VELOCITY: TEXT_GUN_AMMO_DATA_BORE_HEIGHT { + idc=12005; + y=0.265*safezoneH+safezoneY+0.480; + text="Muzzle Velocity (m/s)"; + }; + class TEXT_GUN_AMMO_DATA_MUZZLE_VELOCITY_INPUT: TEXT_GUN_AMMO_DATA_BORE_HEIGHT_INPUT { + idc=120050; + y=0.265*safezoneH+safezoneY+0.480; + }; + class TEXT_GUN_AMMO_DATA_ZERO_RANGE: TEXT_GUN_AMMO_DATA_BORE_HEIGHT { + idc=12006; + y=0.265*safezoneH+safezoneY+0.520; + text="Zero Range (meters)"; + }; + class TEXT_GUN_AMMO_DATA_ZERO_RANGE_INPUT: TEXT_GUN_AMMO_DATA_BORE_HEIGHT_INPUT { + idc=120060; + y=0.265*safezoneH+safezoneY+0.520; + }; + class TEXT_GUN_AMMO_DATA_DONE: TEXT_TARGET_SPEED_ASSIST_DONE { + idc=12008; + action=QUOTE(1 call FUNC(toggle_gun_ammo_data)); + }; + class TEXT_GUN_AMMO_DATA_CANCEL: TEXT_TARGET_SPEED_ASSIST_CANCEL { + idc=12009; + action=QUOTE(0 call FUNC(toggle_gun_ammo_data)); + }; + class TEXT_GUN_AMMO_DATA_PREV: TEXT_TARGET_SPEED_ASSIST_PREV { + idc=12010; + }; + class TEXT_GUN_AMMO_DATA_NEXT: TEXT_TARGET_SPEED_ASSIST_NEXT { + idc=12011; + }; + + class TEXT_ATMO_ENV_DATA_DEFAULT: TEXT_LEAD { + idc=13000; + w=0.08; + x=0.550*safezoneW+safezoneX+0.15; + y=0.265*safezoneH+safezoneY+0.320; + text="Default"; + action=QUOTE(call FUNC(restore_atmo_default)); + }; + class TEXT_ATMO_ENV_DATA_AT: TEXT_TARGET_A { + idc=13001; + w=0.04; + x=0.550*safezoneW+safezoneX+0.24; + y=0.265*safezoneH+safezoneY+0.320; + text="AT"; + action=QUOTE(GVAR(atmosphereModeTBH) = false; call FUNC(update_atmo_selection)); + }; + class TEXT_ATMO_ENV_DATA_TBH: TEXT_ATMO_ENV_DATA_AT { + idc=13002; + x=0.550*safezoneW+safezoneX+0.28; + text="TBH"; + action=QUOTE(GVAR(atmosphereModeTBH) = true; call FUNC(update_atmo_selection)); + }; + class TEXT_ATMO_ENV_DATA_ALTITUDE: TEXT_GUN_AMMO_DATA_BORE_HEIGHT { + idc=13003; + x=0.550*safezoneW+safezoneX+0.115; + y=0.265*safezoneH+safezoneY+0.400; + text="Altitude (ft)"; + }; + class TEXT_ATMO_ENV_DATA_ALTITUDE_INPUT: TEXT_GUN_AMMO_DATA_BORE_HEIGHT_INPUT { + idc=130030; + x=0.550*safezoneW+safezoneX+0.330; + y=0.265*safezoneH+safezoneY+0.400; + }; + class TEXT_ATMO_ENV_DATA_TEMPERATURE: TEXT_ATMO_ENV_DATA_ALTITUDE { + idc=13004; + y=0.265*safezoneH+safezoneY+0.440; + text="temperature (F)"; + }; + class TEXT_ATMO_ENV_DATA_TEMPERATURE_INPUT: TEXT_ATMO_ENV_DATA_ALTITUDE_INPUT { + idc=130040; + y=0.265*safezoneH+safezoneY+0.440; + }; + class TEXT_ATMO_ENV_DATA_BAROMETRIC_PRESSURE: TEXT_ATMO_ENV_DATA_ALTITUDE { + idc=13005; + y=0.265*safezoneH+safezoneY+0.480; + text="Barom Pres (in.merc.)"; + }; + class TEXT_ATMO_ENV_DATA_BAROMETRIC_PRESSURE_INPUT: TEXT_ATMO_ENV_DATA_ALTITUDE_INPUT { + idc=130050; + y=0.265*safezoneH+safezoneY+0.480; + }; + class TEXT_ATMO_ENV_DATA_RELATIVE_HUMIDITY: TEXT_ATMO_ENV_DATA_ALTITUDE { + idc=13006; + y=0.265*safezoneH+safezoneY+0.520; + text="Relative Humidity (%)"; + }; + class TEXT_ATMO_ENV_DATA_RELATIVE_HUMIDITY_INPUT: TEXT_ATMO_ENV_DATA_ALTITUDE_INPUT { + idc=130060; + y=0.265*safezoneH+safezoneY+0.520; + }; + class TEXT_ATMO_ENV_DATA_DONE: TEXT_TARGET_SPEED_ASSIST_DONE { + idc=13007; + action=QUOTE(1 call FUNC(toggle_atmo_env_data)); + }; + class TEXT_ATMO_ENV_DATA_CANCEL: TEXT_TARGET_SPEED_ASSIST_CANCEL { + idc=13008; + action=QUOTE(0 call FUNC(toggle_atmo_env_data)); + }; + class TEXT_ATMO_ENV_DATA_PREV: TEXT_TARGET_SPEED_ASSIST_PREV { + idc=13009; + }; + class TEXT_ATMO_ENV_DATA_NEXT: TEXT_TARGET_SPEED_ASSIST_NEXT { + idc=13010; + }; + + class TEXT_TARGET_DATA_LATITUDE: TEXT_BORE_HEIGHT { + idc=14000; + w=0.22; + y=0.265*safezoneH+safezoneY+0.28; + text="Latitude"; + }; + class TEXT_TARGET_DATA_LATITUDE_INPUT: ATragMX_RscEdit { + idc=140000; + w=0.06; + x=0.550*safezoneW+safezoneX+0.335; + y=0.265*safezoneH+safezoneY+0.28; + }; + class TEXT_TARGET_DATA_DIR_OF_FIRE: TEXT_TARGET_DATA_LATITUDE { + idc=14001; + y=0.265*safezoneH+safezoneY+0.320; + text="Dir of Fire (deg from N)"; + }; + class TEXT_TARGET_DATA_DIR_OF_FIRE_INPUT: TEXT_TARGET_DATA_LATITUDE_INPUT { + idc=140010; + y=0.265*safezoneH+safezoneY+0.320; + }; + class TEXT_TARGET_DATA_WIND_SPEED: TEXT_TARGET_DATA_LATITUDE { + idc=14002; + y=0.265*safezoneH+safezoneY+0.360; + text="Wind Speed (m/s)"; + }; + class TEXT_TARGET_DATA_WIND_SPEED_INPUT_1: TEXT_TARGET_DATA_LATITUDE_INPUT { + idc=140020; + w=0.045; + x=0.550*safezoneW+safezoneX+0.300; + y=0.265*safezoneH+safezoneY+0.360; + }; + class TEXT_TARGET_DATA_WIND_SPEED_INPUT_2: TEXT_TARGET_DATA_LATITUDE_INPUT { + idc=140021; + w=0.045; + x=0.550*safezoneW+safezoneX+0.350; + y=0.265*safezoneH+safezoneY+0.360; + }; + class TEXT_TARGET_DATA_WIND_DIRECTION: TEXT_TARGET_DATA_LATITUDE { + idc=14003; + y=0.265*safezoneH+safezoneY+0.400; + text="Wind Direction (clock)"; + }; + class TEXT_TARGET_DATA_WIND_DIRECTION_INPUT: TEXT_TARGET_DATA_LATITUDE_INPUT { + idc=140030; + y=0.265*safezoneH+safezoneY+0.400; + }; + class TEXT_TARGET_DATA_INCLINATION_ANGLE: TEXT_TARGET_DATA_LATITUDE { + idc=14004; + y=0.265*safezoneH+safezoneY+0.440; + text="Inclination Angle"; + }; + class TEXT_TARGET_DATA_INCLINATION_ANGLE_INPUT_COSINE: TEXT_TARGET_DATA_LATITUDE_INPUT { + idc=140041; + w=0.045; + x=0.550*safezoneW+safezoneX+0.300; + y=0.265*safezoneH+safezoneY+0.440; + }; + class TEXT_TARGET_DATA_INCLINATION_ANGLE_INPUT_DEGREE: TEXT_TARGET_DATA_LATITUDE_INPUT { + idc=140040; + w=0.045; + x=0.550*safezoneW+safezoneX+0.350; + y=0.265*safezoneH+safezoneY+0.440; + }; + class TEXT_TARGET_DATA_TARGET_SPEED: TEXT_TARGET_DATA_LATITUDE { + idc=14005; + y=0.265*safezoneH+safezoneY+0.480; + text="Target Speed (m/s)"; + }; + class TEXT_TARGET_DATA_TARGET_SPEED_INPUT: TEXT_TARGET_DATA_LATITUDE_INPUT { + idc=140050; + y=0.265*safezoneH+safezoneY+0.480; + }; + class TEXT_TARGET_DATA_TARGET_RANGE: TEXT_TARGET_DATA_LATITUDE { + idc=14006; + y=0.265*safezoneH+safezoneY+0.520; + text="Target Range (meters)"; + }; + class TEXT_TARGET_DATA_TARGET_RANGE_INPUT: TEXT_TARGET_DATA_LATITUDE_INPUT { + idc=140060; + y=0.265*safezoneH+safezoneY+0.520; + }; + class TEXT_TARGET_DATA_DONE: TEXT_TARGET_SPEED_ASSIST_DONE { + idc=14008; + action=QUOTE(1 call FUNC(toggle_target_data)); + }; + class TEXT_TARGET_DATA_CANCEL: TEXT_TARGET_SPEED_ASSIST_CANCEL { + idc=14009; + action=QUOTE(0 call FUNC(toggle_target_data)); + }; + class TEXT_TARGET_DATA_PREV: TEXT_TARGET_SPEED_ASSIST_PREV { + idc=14010; + }; + class TEXT_TARGET_DATA_NEXT: TEXT_TARGET_SPEED_ASSIST_NEXT { + idc=14011; + }; }; }; \ No newline at end of file diff --git a/addons/atragmx/XEH_postInit.sqf b/addons/atragmx/XEH_postInit.sqf index 9d769d84a3..01b13fc85e 100644 --- a/addons/atragmx/XEH_postInit.sqf +++ b/addons/atragmx/XEH_postInit.sqf @@ -5,43 +5,44 @@ if (count (profileNamespace getVariable ["ACE_ATragMX_gunList", []]) > 0) then { GVAR(gunList) = profileNamespace getVariable "ACE_ATragMX_gunList"; } else { - // Profile Name, Muzzle Velocity, Zero Range, Scope Base Angle, AirFriction, Bore Height, Scope Unit, Elevation Scope Step, Windage Scope Step, Maximum Elevation, Dialed Elevation, Dialed Windage, Mass, Ammo Class Name, Magazine Class Name, BC, Drag Model, Atmosphere Model - GVAR(gunList) = [["12.7x108mm" , 820, 100, 0.0659, -0.0008600, 3.81, 0, 0.338, 0.338, 120, 0, 0, 48.28, "B_127x108_Ball" , "5Rnd_127x108_Mag" , 0.630, 1, "ASM" ], + // Profile Name, Muzzle Velocity, Zero Range, Scope Base Angle, AirFriction, Bore Height, Scope Unit, Elevation Scope Step, Windage Scope Step, Maximum Elevation, Dialed Elevation, Dialed Windage, Mass, Bullet Diameter, Rifle Twist, BC, Drag Model, Atmosphere Model + GVAR(gunList) = [["12.7x108mm" , 820, 100, 0.0659, -0.0008600, 3.81, 0, 0.338, 0.338, 120, 0, 0, 48.28, 12.7, 38.10, 0.630, 1, "ASM" ], - ["12.7x99mm AMAX" , 860, 100, 0.0612, -0.0008600, 3.81, 0, 0.338, 0.338, 120, 0, 0, 48.60, "B_127x99_Ball" , "5Rnd_mas_127x99_Stanag" , 1.050, 1, "ASM" ], - ["12.7x99mm" , 853, 100, 0.0623, -0.0008600, 3.81, 0, 0.338, 0.338, 120, 0, 0, 41.92, "B_127x99_Ball" , "5Rnd_mas_127x99_Stanag" , 0.670, 1, "ASM" ], + ["12.7x99mm AMAX" , 860, 100, 0.0612, -0.0008600, 3.81, 0, 0.338, 0.338, 120, 0, 0, 48.60, 12.7, 38.10, 1.050, 1, "ASM" ], + ["12.7x99mm" , 853, 100, 0.0623, -0.0008600, 3.81, 0, 0.338, 0.338, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM" ], - ["12.7x54mm" , 300, 100, 0.3394, -0.0014000, 3.81, 0, 0.338, 0.338, 120, 0, 0, 48.60, "B_127x54_Ball" , "10Rnd_127x54_Mag" , 1.050, 1, "ASM" ], + ["12.7x54mm" , 300, 100, 0.3394, -0.0014000, 3.81, 0, 0.338, 0.338, 120, 0, 0, 48.60, 12.7, 24.13, 1.050, 1, "ASM" ], - [".408 Chey Tac" , 910, 100, 0.0569, -0.0004800, 3.81, 0, 0.338, 0.338, 120, 0, 0, 27.15, "B_408_Ball" , "7Rnd_408_Mag" , 0.970, 1, "ASM" ], + [".408 Chey Tac" , 910, 100, 0.0569, -0.0004800, 3.81, 0, 0.338, 0.338, 120, 0, 0, 27.15, 10.4, 33.02, 0.970, 1, "ASM" ], - ["9.3×64mm" , 870, 100, 0.0619, -0.0007500, 3.81, 0, 0.338, 0.338, 120, 0, 0, 14.90, "B_93x64_Ball" , "10Rnd_93x64_DMR_05_Mag" , 0.368, 1, "ASM" ], + ["9.3×64mm" , 870, 100, 0.0619, -0.0007500, 3.81, 0, 0.338, 0.338, 120, 0, 0, 14.90, 9.30, 35.56, 0.368, 1, "ASM" ], - [".338LM 250gr" , 880, 100, 0.0598, -0.0006060, 3.81, 0, 0.338, 0.338, 120, 0, 0, 16.20, "B_338_Ball" , "10Rnd_338_Mag" , 0.322, 7, "ICAO"], - [".338LM 300gr" , 800, 100, 0.0677, -0.0005350, 3.81, 0, 0.338, 0.338, 120, 0, 0, 19.44, "ACE_338_Ball" , "ACE_10Rnd_338_300gr_HPBT_Mag" , 0.381, 7, "ICAO"], - [".338LM API526" , 880, 100, 0.0601, -0.0006730, 3.81, 0, 0.338, 0.338, 120, 0, 0, 16.39, "ACE_338_Ball_API526" , "ACE_10Rnd_338_API526_Mag" , 0.290, 7, "ICAO"], + [".338LM 250gr" , 880, 100, 0.0598, -0.0006060, 3.81, 0, 0.338, 0.338, 120, 0, 0, 16.20, 8.58, 25.40, 0.322, 7, "ICAO"], + [".338LM 300gr" , 800, 100, 0.0677, -0.0005350, 3.81, 0, 0.338, 0.338, 120, 0, 0, 19.44, 8.58, 25.40, 0.381, 7, "ICAO"], + [".338LM API526" , 880, 100, 0.0601, -0.0006730, 3.81, 0, 0.338, 0.338, 120, 0, 0, 16.39, 8.58, 25.40, 0.290, 7, "ICAO"], - [".300WM Mk248 Mod 0", 900, 100, 0.0584, -0.0008300, 3.81, 0, 0.338, 0.338, 120, 0, 0, 13.31, "ACE_762x67_Ball_Mk248_Mod_0" , "ACE_20Rnd_762x67_Mk248_Mod_0_Mag" , 0.268, 7, "ICAO"], - [".300WM Mk248 Mod 1", 867, 100, 0.0611, -0.0008150, 3.81, 0, 0.338, 0.338, 120, 0, 0, 14.26, "ACE_762x67_Ball_Mk248_Mod_1" , "ACE_20Rnd_762x67_Mk248_Mod_1_Mag" , 0.310, 7, "ICAO"], - [".300WM Berger OTM" , 853, 100, 0.0622, -0.0007600, 3.81, 0, 0.338, 0.338, 120, 0, 0, 14.90, "ACE_762x67_Ball_Berger_Hybrid_OTM", "ACE_20Rnd_762x67_Berger_Hybrid_OTM_Mag", 0.368, 7, "ICAO"], + [".300WM Mk248 Mod 0", 900, 100, 0.0584, -0.0008300, 3.81, 0, 0.338, 0.338, 120, 0, 0, 13.31, 7.80, 25.40, 0.268, 7, "ICAO"], + [".300WM Mk248 Mod 1", 867, 100, 0.0611, -0.0008150, 3.81, 0, 0.338, 0.338, 120, 0, 0, 14.26, 7.80, 25.40, 0.310, 7, "ICAO"], + [".300WM Berger OTM" , 853, 100, 0.0622, -0.0007600, 3.81, 0, 0.338, 0.338, 120, 0, 0, 14.90, 7.80, 25.40, 0.368, 7, "ICAO"], - ["7.62x54mmR" , 800, 100, 0.0692, -0.0010230, 3.81, 0, 0.338, 0.338, 120, 0, 0, 9.849, "B_762x54_Ball" , "10Rnd_762x54_Mag" , 0.400, 1, "ICAO"], + ["7.62x54mmR" , 800, 100, 0.0692, -0.0010230, 3.81, 0, 0.338, 0.338, 120, 0, 0, 9.849, 7.92, 24.13, 0.400, 1, "ICAO"], - ["7.62x51mm M80" , 810, 100, 0.0679, -0.0010350, 3.81, 0, 0.338, 0.338, 120, 0, 0, 9.525, "B_762x51_Ball" , "20Rnd_762x51_Mag" , 0.200, 7, "ICAO"], - ["7.62x51mm M118LR" , 820, 100, 0.0662, -0.0008525, 3.81, 0, 0.338, 0.338, 120, 0, 0, 11.34, "ACE_762x51_Ball_M118LR" , "ACE_20Rnd_762x51_M118LR_Mag" , 0.243, 7, "ICAO"], - ["7.62x51mm Mk319" , 820, 100, 0.0670, -0.0010300, 3.81, 0, 0.338, 0.338, 120, 0, 0, 8.424, "ACE_762x51_Ball_Mk319_Mod_0" , "ACE_20Rnd_762x51_Mk319_Mod_0_Mag" , 0.377, 1, "ICAO"], - ["7.62x51mm Subsonic", 320, 100, 0.3060, -0.0004910, 3.81, 0, 0.338, 0.338, 120, 0, 0, 12.96, "ACE_762x51_Ball_Subsonic" , "ACE_20Rnd_762x51_Mag_SD" , 0.235, 7, "ICAO"], + ["7.62x51mm M80" , 810, 100, 0.0679, -0.0010350, 3.81, 0, 0.338, 0.338, 120, 0, 0, 9.525, 7.82, 25.40, 0.200, 7, "ICAO"], + ["7.62x51mm M118LR" , 820, 100, 0.0662, -0.0008525, 3.81, 0, 0.338, 0.338, 120, 0, 0, 11.34, 7.82, 25.40, 0.243, 7, "ICAO"], + ["7.62x51mm Mk319" , 820, 100, 0.0670, -0.0010300, 3.81, 0, 0.338, 0.338, 120, 0, 0, 8.424, 7.82, 25.40, 0.377, 1, "ICAO"], + ["7.62x51mm Subsonic", 320, 100, 0.3060, -0.0004910, 3.81, 0, 0.338, 0.338, 120, 0, 0, 12.96, 7.82, 25.40, 0.235, 7, "ICAO"], - ["6.5x39mm" , 800, 100, 0.0683, -0.0007850, 3.81, 0, 0.338, 0.338, 120, 0, 0, 7.970, "B_65x39_Caseless" , "30Rnd_65x39_caseless_mag" , 0.263, 7, "ICAO"], - ["6.5x47mm Lapua" , 800, 100, 0.0682, -0.0007710, 3.81, 0, 0.338, 0.338, 120, 0, 0, 9.007, "ACE_65x47_Ball_Scenar" , "ACE_30Rnd_65x47_Scenar_mag" , 0.290, 7, "ICAO"], + ["6.5x39mm" , 800, 100, 0.0683, -0.0007850, 3.81, 0, 0.338, 0.338, 120, 0, 0, 7.970, 6.71, 22.86, 0.263, 7, "ICAO"], + ["6.5x47mm Lapua" , 800, 100, 0.0682, -0.0007710, 3.81, 0, 0.338, 0.338, 120, 0, 0, 9.007, 6.71, 22.86, 0.290, 7, "ICAO"], - ["5.56x45mm M855" , 870, 100, 0.0626, -0.0012650, 3.81, 0, 0.338, 0.338, 120, 0, 0, 4.018, "B_556x45_Ball" , "30Rnd_556x45_Stanag" , 0.151, 7, "ASM" ], - ["5.56x45mm Mk262" , 820, 100, 0.0671, -0.0011250, 3.81, 0, 0.338, 0.338, 120, 0, 0, 4.990, "ACE_556x45_Ball_Mk262" , "ACE_30Rnd_556x45_Stanag_Mk262_mag" , 0.361, 1, "ASM" ], - ["5.56x45mm Mk318" , 880, 100, 0.0616, -0.0011200, 3.81, 0, 0.338, 0.338, 120, 0, 0, 4.018, "ACE_556x45_Ball_Mk318" , "ACE_30Rnd_556x45_Stanag_Mk318_mag" , 0.307, 1, "ASM" ]]; + ["5.56x45mm M855" , 870, 100, 0.0626, -0.0012650, 3.81, 0, 0.338, 0.338, 120, 0, 0, 4.018, 5.70, 17.78, 0.151, 7, "ASM" ], + ["5.56x45mm Mk262" , 820, 100, 0.0671, -0.0011250, 3.81, 0, 0.338, 0.338, 120, 0, 0, 4.990, 5.70, 17.78, 0.361, 1, "ASM" ], + ["5.56x45mm Mk318" , 880, 100, 0.0616, -0.0011200, 3.81, 0, 0.338, 0.338, 120, 0, 0, 4.018, 5.70, 17.78, 0.307, 1, "ASM" ]]; profileNamespace setVariable ["ACE_ATragMX_gunList", GVAR(gunList)]; }; [] call FUNC(init); +[] call FUNC(restore_user_data); ["RangerfinderData", {_this call FUNC(sord)}] call EFUNC(common,addEventHandler); diff --git a/addons/atragmx/XEH_preInit.sqf b/addons/atragmx/XEH_preInit.sqf index 0224fc3e9c..10e0aff61c 100644 --- a/addons/atragmx/XEH_preInit.sqf +++ b/addons/atragmx/XEH_preInit.sqf @@ -13,35 +13,52 @@ PREP(can_show); PREP(change_gun); PREP(change_target_slot); PREP(create_dialog); +PREP(cycle_gun_list); +PREP(cycle_image_size_units); +PREP(cycle_num_ticks_units); PREP(cycle_range_card_columns); PREP(cycle_scope_unit); +PREP(cycle_target_size_units); PREP(delete_gun); PREP(init); PREP(parse_input); PREP(reset_relative_click_memory); +PREP(restore_atmo_default); +PREP(restore_user_data); PREP(save_gun); PREP(show_add_new_gun); +PREP(show_atmo_env_data); +PREP(show_gun_ammo_data); PREP(show_gun_list); PREP(show_main_page); PREP(show_range_card); PREP(show_range_card_setup); +PREP(show_target_data); PREP(show_target_range_assist); PREP(show_target_speed_assist); PREP(show_target_speed_assist_timer); PREP(sord); +PREP(store_user_data); PREP(target_speed_assist_timer); +PREP(toggle_atmo_env_data); +PREP(toggle_gun_ammo_data); PREP(toggle_gun_list); PREP(toggle_range_card); PREP(toggle_range_card_setup); +PREP(toggle_target_data); PREP(toggle_target_range_assist); PREP(toggle_target_speed_assist); PREP(update_atmosphere); +PREP(update_atmo_env_data); +PREP(update_atmo_selection); PREP(update_gun); +PREP(update_gun_ammo_data); PREP(update_range_card); PREP(update_relative_click_memory); PREP(update_result); PREP(update_scope_unit); PREP(update_target); +PREP(update_target_data); PREP(update_target_selection); PREP(update_unit_selection); PREP(update_zero_range); diff --git a/addons/atragmx/functions/fnc_calculate_range_card.sqf b/addons/atragmx/functions/fnc_calculate_range_card.sqf index aecd6496af..f506726be2 100644 --- a/addons/atragmx/functions/fnc_calculate_range_card.sqf +++ b/addons/atragmx/functions/fnc_calculate_range_card.sqf @@ -20,43 +20,64 @@ private ["_scopeBaseAngle"]; _scopeBaseAngle = (GVAR(workingMemory) select 3); -private ["_bulletMass", "_boreHeight", "_airFriction", "_muzzleVelocity", "_bc", "_dragModel", "_atmosphereModel"]; +private ["_bulletMass", "_bulletDiameter", "_boreHeight", "_airFriction", "_barrelTwist", "_muzzleVelocity", "_bc", "_dragModel", "_atmosphereModel", "_twistDirection"]; _bulletMass = GVAR(workingMemory) select 12; +_bulletDiameter = GVAR(workingMemory) select 13; _boreHeight = GVAR(workingMemory) select 5; _airFriction = GVAR(workingMemory) select 4; +_barrelTwist = GVAR(workingMemory) select 14; _muzzleVelocity = GVAR(workingMemory) select 1; _bc = GVAR(workingMemory) select 15; _dragModel = GVAR(workingMemory) select 16; _atmosphereModel = GVAR(workingMemory) select 17; -private ["_temperature", "_barometricPressure", "_relativeHumidity"]; +_twistDirection = 0; +if (_barrelTwist > 0) then { + _twistDirection = 1; +} else { + if (_barrelTwist < 0) then { + _twistDirection = -1; + }; +}; +_barrelTwist = abs(_barrelTwist); + +private ["_altitude", "_temperature", "_barometricPressure", "_relativeHumidity"]; +_altitude = GVAR(altitude); _temperature = GVAR(temperature); _barometricPressure = GVAR(barometricPressure); _relativeHumidity = GVAR(relativeHumidity); -if (GVAR(currentUnit) == 1) then -{ - _temperature = (_temperature - 32) / 1.8; - _barometricPressure = _barometricPressure * 33.8638866667; +if (!GVAR(atmosphereModeTBH)) then { + _barometricPressure = 1013.25 * exp(-(_altitude) / 7990); + _relativeHumidity = 50; }; -private ["_windSpeed", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange"]; -_windSpeed = (GVAR(windSpeed) select GVAR(currentTarget)); +private ["_bulletLength", "_stabilityFactor"]; +_bulletLength = 1.8; +_stabilityFactor = 1.5; +if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,SpinDriftEnabled), false])) then { + if (_bulletDiameter > 0 && _bulletLength > 0 && _bulletMass > 0 && _barrelTwist > 0) then { + _stabilityFactor = [_bulletDiameter / 10 / 2.54, _bulletLength, _bulletMass * 15.4323584, _barrelTwist / 2.54, _muzzleVelocity, _temperature, _barometricPressure] call EFUNC(advanced_ballistics,calculateStabilityFactor); + }; +}; + +private ["_latitude", "_directionOfFire", "_windSpeed", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange"]; +_latitude = GVAR(latitude) select GVAR(currentTarget); +_directionOfFire = GVAR(directionOfFire) select GVAR(currentTarget); +_windSpeed = (GVAR(windSpeed1) select GVAR(currentTarget)); _windDirection = (GVAR(windDirection) select GVAR(currentTarget)); _inclinationAngle = (GVAR(inclinationAngle) select GVAR(currentTarget)); _targetSpeed = (GVAR(targetSpeed) select GVAR(currentTarget)); _targetRange = GVAR(rangeCardEndRange); -if (GVAR(currentUnit) != 2) then -{ - _targetRange = _targetRange / 1.0936133; -}; -if (GVAR(currentUnit) == 1) then -{ +if (GVAR(currentUnit) != 2) then { _windSpeed = _windSpeed / 2.23693629; _targetSpeed = _targetSpeed / 2.23693629; }; +if (GVAR(currentUnit) == 1) then { + _targetRange = _targetRange / 1.0936133; +}; GVAR(rangeCardData) = []; private ["_result"]; _result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, - _windSpeed, _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, true] call FUNC(calculate_solution); + _windSpeed, _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, true, _stabilityFactor, _twistDirection, _latitude] call FUNC(calculate_solution); diff --git a/addons/atragmx/functions/fnc_calculate_scope_base_angle.sqf b/addons/atragmx/functions/fnc_calculate_scope_base_angle.sqf index 17370c82b2..4995c31a61 100644 --- a/addons/atragmx/functions/fnc_calculate_scope_base_angle.sqf +++ b/addons/atragmx/functions/fnc_calculate_scope_base_angle.sqf @@ -35,6 +35,6 @@ _barometricPressure = 1013.25; _relativeHumidity = 0; private ["_result"]; -_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, 0, 0, 0, 0, _zeroRange, _airFriction, 1, "ICAO", false] call FUNC(calculate_solution); +_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, 0, 0, 0, 0, _zeroRange, _airFriction, 1, "ICAO", false, 1.5, 0, 0] call FUNC(calculate_solution); _scopeBaseAngle + (_result select 0) / 60 diff --git a/addons/atragmx/functions/fnc_calculate_solution.sqf b/addons/atragmx/functions/fnc_calculate_solution.sqf index 4e7f5981c1..f7f23044e3 100644 --- a/addons/atragmx/functions/fnc_calculate_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_solution.sqf @@ -21,6 +21,9 @@ * 15: drag model * 16: atmosphere model * 17: Store range card data? + * 18: Stability factor + * 19: Twist Direction + * 20: Latitude * * Return Value: * 0: Elevation @@ -28,7 +31,10 @@ * 2: Lead * 3: Time of fligth * 4: Remaining velocity - * 4: Remaining kinetic energy + * 5: Remaining kinetic energy + * 6: Vertical coriolis drift + * 7: Horizontal coriolis drift + * 8: Spin drift * * Example: * call ace_atragmx_calculate_target_range_assist @@ -37,7 +43,7 @@ */ #include "script_component.hpp" -private ["_scopeBaseAngle", "_bulletMass", "_boreHeight", "_airFriction", "_muzzleVelocity", "_temperature", "_barometricPressure", "_relativeHumidity", "_simSteps", "_windSpeed", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange", "_bc", "_dragModel", "_atmosphereModel", "_storeRangeCardData"]; +private ["_scopeBaseAngle", "_bulletMass", "_boreHeight", "_airFriction", "_muzzleVelocity", "_temperature", "_barometricPressure", "_relativeHumidity", "_simSteps", "_windSpeed", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange", "_bc", "_dragModel", "_atmosphereModel", "_storeRangeCardData", "_stabilityFactor", "_twistDirection", "_latitude"]; _scopeBaseAngle = _this select 0; _bulletMass = _this select 1; _boreHeight = _this select 2; @@ -56,6 +62,9 @@ _bc = _this select 14; _dragModel = _this select 15; _atmosphereModel = _this select 16; _storeRangeCardData = _this select 17; +_stabilityFactor = _this select 18; +_twistDirection = _this select 19; +_latitude = _this select 20; private ["_bulletPos", "_bulletVelocity", "_bulletAccel", "_bulletSpeed", "_gravity", "_deltaT"]; _bulletPos = [0, 0, 0]; @@ -65,20 +74,26 @@ _bulletSpeed = 0; _gravity = [0, sin(_scopeBaseAngle + _inclinationAngle) * -9.80665, cos(_scopeBaseAngle + _inclinationAngle) * -9.80665]; _deltaT = 1 / _simSteps; -private ["_elevation", "_windage", "_lead", "_TOF", "_trueVelocity", "_trueSpeed", "_kineticEnergy"]; +private ["_elevation", "_windage", "_lead", "_TOF", "_trueVelocity", "_trueSpeed", "_kineticEnergy", "_verticalCoriolis", "_verticalDeflection", "_horizontalCoriolis", "_horizontalDeflection", "_spinDrift", "_spinDeflection"]; _elevation = 0; _windage = 0; _lead = 0; _TOF = 0; _trueVelocity = [0, 0, 0]; _trueSpeed = 0; +_verticalCoriolis = 0; +_verticalDeflection = 0; +_horizontalCoriolis = 0; +_horizontalDeflection = 0; +_spinDrift = 0; +_spinDeflection = 0; private ["_n", "_range", "_rangeFactor"]; _n = 0; _range = 0; _rangeFactor = 1; if (_storeRangeCardData) then { - if (GVAR(currentUnit) != 2) then { + if (GVAR(currentUnit) == 1) then { _rangeFactor = 1.0936133; }; GVAR(rangeCardData) = []; @@ -90,6 +105,11 @@ if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) _bc = [_bc, _temperature, _barometricPressure, _relativeHumidity, _atmosphereModel] call EFUNC(advanced_ballistics,calculateAtmosphericCorrection); }; +private ["_speedTotal", "_stepsTotal", "_speedAverage"]; +_speedTotal = 0; +_stepsTotal = 0; +_speedAverage = 0; + _TOF = 0; _bulletPos set [0, 0]; @@ -102,6 +122,10 @@ _bulletVelocity set [2, Sin(_scopeBaseAngle) * _muzzleVelocity]; while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do { _bulletSpeed = vectorMagnitude _bulletVelocity; + + _speedTotal = _speedTotal + _bulletSpeed; + _stepsTotal = _stepsTotal + 1; + _speedAverage = (_speedTotal / _stepsTotal); _trueVelocity = _bulletVelocity vectorDiff _wind; _trueSpeed = vectorMagnitude _trueVelocity; @@ -139,7 +163,22 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do { }; _kineticEnergy = 0.5 * (_bulletMass / 1000 * (_bulletSpeed ^ 2)); _kineticEnergy = _kineticEnergy * 0.737562149; - + + if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,CoriolisEnabled), false])) then { + if ((_bulletPos select 1) > 0) then { + _horizontalDeflection = 0.0000729 * ((_bulletPos select 0) ^ 2) * sin(_latitude) / _speedAverage; + _horizontalCoriolis = - atan(_horizontalDeflection / (_bulletPos select 1)); + _windage = _windage + _horizontalCoriolis; + }; + }; + if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,SpinDriftEnabled), false])) then { + if ((_bulletPos select 1) > 0) then { + _spinDeflection = _twistDirection * 0.0254 * 1.25 * (_stabilityFactor + 1.2) * _TOF ^ 1.83; + _spinDrift = - atan(_spinDeflection / (_bulletPos select 1)); + _windage = _windage + _spinDrift; + }; + }; + GVAR(rangeCardData) set [_n, [_range, _elevation * 60, _windage * 60, _lead, _TOF, _bulletSpeed, _kineticEnergy]]; _n = _n + 1; }; @@ -158,4 +197,19 @@ if (_targetRange != 0) then { _kineticEnergy = 0.5 * (_bulletMass / 1000 * (_bulletSpeed ^ 2)); _kineticEnergy = _kineticEnergy * 0.737562149; -[_elevation * 60, _windage * 60, _lead, _TOF, _bulletSpeed, _kineticEnergy] +if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,CoriolisEnabled), false])) then { + if ((_bulletPos select 1) > 0) then { + _horizontalDeflection = 0.0000729 * ((_bulletPos select 0) ^ 2) * sin(_latitude) / _speedAverage; + _horizontalCoriolis = - atan(_horizontalDeflection / (_bulletPos select 1)); + _windage = _windage + _horizontalCoriolis; + }; +}; +if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,SpinDriftEnabled), false])) then { + if ((_bulletPos select 1) > 0) then { + _spinDeflection = _twistDirection * 0.0254 * 1.25 * (_stabilityFactor + 1.2) * _TOF ^ 1.83; + _spinDrift = - atan(_spinDeflection / (_bulletPos select 1)); + _windage = _windage + _spinDrift; + }; +}; + +[_elevation * 60, _windage * 60, _lead, _TOF, _bulletSpeed, _kineticEnergy, _verticalCoriolis, _horizontalCoriolis, _spinDrift] diff --git a/addons/atragmx/functions/fnc_calculate_target_range_assist.sqf b/addons/atragmx/functions/fnc_calculate_target_range_assist.sqf index 6280f19339..91eb9ae20c 100644 --- a/addons/atragmx/functions/fnc_calculate_target_range_assist.sqf +++ b/addons/atragmx/functions/fnc_calculate_target_range_assist.sqf @@ -46,7 +46,7 @@ switch (GVAR(rangeAssistImageSizeUnit)) do { }; }; _estRange = parseNumber(ctrlText 7013); -if (GVAR(currentUnit) != 2) then { +if (GVAR(currentUnit) == 1) then { _estRange = _estRange / 1.0936133; }; diff --git a/addons/atragmx/functions/fnc_calculate_target_solution.sqf b/addons/atragmx/functions/fnc_calculate_target_solution.sqf index 3f4c92c191..f6dd92bc7f 100644 --- a/addons/atragmx/functions/fnc_calculate_target_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_target_solution.sqf @@ -20,44 +20,65 @@ private ["_scopeBaseAngle"]; _scopeBaseAngle = (GVAR(workingMemory) select 3); -private ["_bulletMass", "_boreHeight", "_airFriction", "_muzzleVelocity", "_bc", "_dragModel", "_atmosphereModel"]; +private ["_bulletMass", "_bulletDiameter", "_boreHeight", "_airFriction", "_barrelTwist", "_muzzleVelocity", "_bc", "_dragModel", "_atmosphereModel", "_twistDirection"]; _bulletMass = GVAR(workingMemory) select 12; +_bulletDiameter = GVAR(workingMemory) select 13; _boreHeight = GVAR(workingMemory) select 5; _airFriction = GVAR(workingMemory) select 4; +_barrelTwist = GVAR(workingMemory) select 14; _muzzleVelocity = GVAR(workingMemory) select 1; _bc = GVAR(workingMemory) select 15; _dragModel = GVAR(workingMemory) select 16; _atmosphereModel = GVAR(workingMemory) select 17; -private ["_temperature", "_barometricPressure", "_relativeHumidity"]; +_twistDirection = 0; +if (_barrelTwist > 0) then { + _twistDirection = 1; +} else { + if (_barrelTwist < 0) then { + _twistDirection = -1; + }; +}; +_barrelTwist = abs(_barrelTwist); + +private ["_altitude", "_temperature", "_barometricPressure", "_relativeHumidity"]; +_altitude = GVAR(altitude); _temperature = GVAR(temperature); _barometricPressure = GVAR(barometricPressure); _relativeHumidity = GVAR(relativeHumidity); -if (GVAR(currentUnit) == 1) then -{ - _temperature = (_temperature - 32) / 1.8; - _barometricPressure = _barometricPressure * 33.8638866667; +if (!GVAR(atmosphereModeTBH)) then { + _barometricPressure = 1013.25 * exp(-(_altitude) / 7990); + _relativeHumidity = 50; }; -private ["_windSpeed", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange"]; -_windSpeed = (GVAR(windSpeed) select GVAR(currentTarget)); -_windDirection = (GVAR(windDirection) select GVAR(currentTarget)); -_inclinationAngle = (GVAR(inclinationAngle) select GVAR(currentTarget)); -_targetSpeed = (GVAR(targetSpeed) select GVAR(currentTarget)); -_targetRange = (GVAR(targetRange) select GVAR(currentTarget)); -if (GVAR(currentUnit) != 2) then -{ - _targetRange = _targetRange / 1.0936133; +private ["_bulletLength", "_stabilityFactor"]; +_bulletLength = 1.8; +_stabilityFactor = 1.5; +if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,SpinDriftEnabled), false])) then { + if (_bulletDiameter > 0 && _bulletLength > 0 && _bulletMass > 0 && _barrelTwist > 0) then { + _stabilityFactor = [_bulletDiameter / 10 / 2.54, _bulletLength, _bulletMass * 15.4323584, _barrelTwist / 2.54, _muzzleVelocity, _temperature, _barometricPressure] call EFUNC(advanced_ballistics,calculateStabilityFactor); + }; }; -if (GVAR(currentUnit) == 1) then -{ + +private ["_latitude", "_directionOfFire", "_windSpeed", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange"]; +_latitude = GVAR(latitude) select GVAR(currentTarget); +_directionOfFire = GVAR(directionOfFire) select GVAR(currentTarget); +_windSpeed = GVAR(windSpeed1) select GVAR(currentTarget); +_windDirection = GVAR(windDirection) select GVAR(currentTarget); +_inclinationAngle = GVAR(inclinationAngle) select GVAR(currentTarget); +_targetSpeed = GVAR(targetSpeed) select GVAR(currentTarget); +_targetRange = GVAR(targetRange) select GVAR(currentTarget); +if (GVAR(currentUnit) != 2) then { _windSpeed = _windSpeed / 2.23693629; _targetSpeed = _targetSpeed / 2.23693629; }; +if (GVAR(currentUnit) == 1) then { + _targetRange = _targetRange / 1.0936133; +}; private ["_result"]; _result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, - _windSpeed, _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, false] call FUNC(calculate_solution); + _windSpeed, _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, false, _stabilityFactor, _twistDirection, _latitude] call FUNC(calculate_solution); GVAR(elevationOutput) set [GVAR(currentTarget), _result select 0]; GVAR(windageOutput) set [GVAR(currentTarget), _result select 1]; diff --git a/addons/atragmx/functions/fnc_calculate_target_speed_assist.sqf b/addons/atragmx/functions/fnc_calculate_target_speed_assist.sqf index 7ee7e9ff78..d055af5a71 100644 --- a/addons/atragmx/functions/fnc_calculate_target_speed_assist.sqf +++ b/addons/atragmx/functions/fnc_calculate_target_speed_assist.sqf @@ -22,34 +22,27 @@ _numTicks = parseNumber(ctrlText 8005); _timeSecs = parseNumber(ctrlText 8006); _estSpeed = 0; -if (GVAR(currentUnit) != 2) then -{ +if (GVAR(currentUnit) == 1) then { _targetRange = _targetRange / 1.0936133; }; -switch (GVAR(rangeAssistImageSizeUnit)) do -{ - case 0: - { +switch (GVAR(rangeAssistImageSizeUnit)) do { + case 0: { _numTicks = _numTicks / 6400 * 360; }; - case 1: - { + case 1: { _numTicks = _numTicks / 60; }; - case 2: - { + case 2: { _numTicks = _numTicks / 60 / 1.047; }; }; -if (_timeSecs > 0) then -{ +if (_timeSecs > 0) then { _estSpeed = tan(_numTicks) * _targetRange / _timeSecs; }; -if (GVAR(currentUnit) == 1) then -{ +if (GVAR(currentUnit) != 2) then { _estSpeed = _estSpeed * 2.23693629; }; diff --git a/addons/atragmx/functions/fnc_change_gun.sqf b/addons/atragmx/functions/fnc_change_gun.sqf index 520e4e85be..9b0f18c185 100644 --- a/addons/atragmx/functions/fnc_change_gun.sqf +++ b/addons/atragmx/functions/fnc_change_gun.sqf @@ -4,6 +4,7 @@ * * Arguments: * gunID + * update solution * * Return Value: * Nothing @@ -15,19 +16,23 @@ */ #include "script_component.hpp" -if (_this < 0 || _this > (count GVAR(gunList)) - 1) exitWith {}; +private ["_gunID", "_updateSolution"]; +_gunID = _this select 0; +_updateSolution = _this select 1; -GVAR(workingMemory) = +(GVAR(gunList) select _this); -GVAR(currentGun) = _this; +if (_gunID < 0 || _gunID > (count GVAR(gunList)) - 1) exitWith {}; + +GVAR(workingMemory) = +(GVAR(gunList) select _gunID); +GVAR(currentGun) = _gunID; lbSetCurSel [6000, GVAR(currentGun)]; -if ((GVAR(scopeUnits) select GVAR(currentScopeUnit)) != "Clicks") then -{ +if ((GVAR(scopeUnits) select GVAR(currentScopeUnit)) != "Clicks") then { GVAR(currentScopeUnit) = GVAR(workingMemory) select 6; }; [] call FUNC(update_gun); +[] call FUNC(update_gun_ammo_data); GVAR(elevationOutput) set [GVAR(currentTarget), 0]; GVAR(windageOutput) set [GVAR(currentTarget), 0]; @@ -35,4 +40,6 @@ GVAR(leadOutput) set [GVAR(currentTarget), 0]; GVAR(tofOutput) set [GVAR(currentTarget), 0]; GVAR(velocityOutput) set [GVAR(currentTarget), 0]; -[] call FUNC(calculate_target_solution); +if (_updateSolution) then { + [] call FUNC(calculate_target_solution); +}; diff --git a/addons/atragmx/functions/fnc_change_target_slot.sqf b/addons/atragmx/functions/fnc_change_target_slot.sqf index 6e6951c6bf..ed8c622b8d 100644 --- a/addons/atragmx/functions/fnc_change_target_slot.sqf +++ b/addons/atragmx/functions/fnc_change_target_slot.sqf @@ -23,4 +23,4 @@ call FUNC(parse_input); GVAR(currentTarget) = _target; call FUNC(update_target_selection); -call FUNC(calculate_target_solution); +[] call FUNC(calculate_target_solution); diff --git a/addons/atragmx/functions/fnc_create_dialog.sqf b/addons/atragmx/functions/fnc_create_dialog.sqf index 59ec3528af..5be6e4ecb4 100644 --- a/addons/atragmx/functions/fnc_create_dialog.sqf +++ b/addons/atragmx/functions/fnc_create_dialog.sqf @@ -26,6 +26,8 @@ call FUNC(update_target_selection); GVAR(showMainPage) call FUNC(show_main_page); GVAR(showAddNewGun) call FUNC(show_add_new_gun); +GVAR(showAtmoEnvData) call FUNC(show_atmo_env_data); +GVAR(showGunAmmoData) call FUNC(show_gun_ammo_data); GVAR(showGunList) call FUNC(show_gun_list); GVAR(showRangeCard) call FUNC(show_range_card); if (GVAR(showRangeCard)) then { @@ -33,6 +35,7 @@ if (GVAR(showRangeCard)) then { [] call FUNC(update_range_card); }; GVAR(showRangeCardSetup) call FUNC(show_range_card_setup); +GVAR(showTargetData) call FUNC(show_target_data); GVAR(showTargetRangeAssist) call FUNC(show_target_range_assist); GVAR(showTargetSpeedAssist) call FUNC(show_target_speed_assist); GVAR(showTargetSpeedAssistTimer) call FUNC(show_target_speed_assist_timer); diff --git a/addons/atragmx/functions/fnc_cycle_gun_list.sqf b/addons/atragmx/functions/fnc_cycle_gun_list.sqf new file mode 100644 index 0000000000..3d4bef70c1 --- /dev/null +++ b/addons/atragmx/functions/fnc_cycle_gun_list.sqf @@ -0,0 +1,18 @@ +/* + * Author: Ruthberg + * Cycles through the gun list + * + * Arguments: + * step + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_cycle_scope_unit + * + * Public: No + */ +#include "script_component.hpp" + +[(GVAR(currentGun) + (count GVAR(gunList)) + _this) % (count GVAR(gunList)), true] call FUNC(change_gun); diff --git a/addons/atragmx/functions/fnc_cycle_image_size_units.sqf b/addons/atragmx/functions/fnc_cycle_image_size_units.sqf new file mode 100644 index 0000000000..d78b13731c --- /dev/null +++ b/addons/atragmx/functions/fnc_cycle_image_size_units.sqf @@ -0,0 +1,19 @@ +/* + * Author: Ruthberg + * Cycles through the image size units + * + * Arguments: + * step + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_cycle_image_size_units + * + * Public: No + */ +#include "script_component.hpp" + +GVAR(rangeAssistImageSizeUnit) = (GVAR(rangeAssistImageSizeUnit) + 1) % (count GVAR(rangeAssistImageSizeUnits)); +ctrlSetText [7015, GVAR(rangeAssistImageSizeUnits) select GVAR(rangeAssistImageSizeUnit)]; diff --git a/addons/atragmx/functions/fnc_cycle_num_ticks_units.sqf b/addons/atragmx/functions/fnc_cycle_num_ticks_units.sqf new file mode 100644 index 0000000000..6afc105f62 --- /dev/null +++ b/addons/atragmx/functions/fnc_cycle_num_ticks_units.sqf @@ -0,0 +1,20 @@ +/* + * Author: Ruthberg + * Cycles through the num ticks units + * + * Arguments: + * step + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_cycle_num_ticks_units + * + * Public: No + */ +#include "script_component.hpp" + +GVAR(speedAssistNumTicksUnit) = (GVAR(speedAssistNumTicksUnit) + 1) % (count GVAR(speedAssistNumTicksUnits)); +ctrlSetText [8009, GVAR(speedAssistNumTicksUnits) select GVAR(speedAssistNumTicksUnit)]; +call FUNC(calculate_target_speed_assist); diff --git a/addons/atragmx/functions/fnc_cycle_target_size_units.sqf b/addons/atragmx/functions/fnc_cycle_target_size_units.sqf new file mode 100644 index 0000000000..e055c8282c --- /dev/null +++ b/addons/atragmx/functions/fnc_cycle_target_size_units.sqf @@ -0,0 +1,19 @@ +/* + * Author: Ruthberg + * Cycles through the target size units + * + * Arguments: + * step + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_cycle_target_size_units + * + * Public: No + */ +#include "script_component.hpp" + +GVAR(rangeAssistTargetSizeUnit) = (GVAR(rangeAssistTargetSizeUnit) + 1) % (count GVAR(rangeAssistTargetSizeUnits)); +ctrlSetText [7014, GVAR(rangeAssistTargetSizeUnits) select GVAR(rangeAssistTargetSizeUnit)]; diff --git a/addons/atragmx/functions/fnc_init.sqf b/addons/atragmx/functions/fnc_init.sqf index 8fda3570fa..efbd39ef81 100644 --- a/addons/atragmx/functions/fnc_init.sqf +++ b/addons/atragmx/functions/fnc_init.sqf @@ -9,7 +9,7 @@ * Nothing * * Example: - * call ace_atragmx_init + * call ace_atragmx_fnc_init * * Public: No */ @@ -26,7 +26,7 @@ GVAR(rangeCardLastColumns) = ["Lead", "RemV", "RemE", "TmFlt"]; GVAR(rangeCardCurrentColumn) = 3; GVAR(rangeCardData) = []; -GVAR(GVAR(rangeAssistTargetSizeUnit)s) = ["in", "ft", "cm", "m"]; +GVAR(rangeAssistTargetSizeUnits) = ["in", "ft", "cm", "m"]; GVAR(rangeAssistTargetSizeUnit) = 2; GVAR(rangeAssistImageSizeUnits) = ["MIL", "TMOA", "IOA"]; GVAR(rangeAssistImageSizeUnit) = 0; @@ -41,11 +41,16 @@ GVAR(currentGun) = 0; GVAR(currentTarget) = 0; GVAR(currentScopeUnit) = 0; +GVAR(atmosphereModeTBH) = true; +GVAR(altitude) = 0; GVAR(temperature) = 15; GVAR(barometricPressure) = 1013.25; GVAR(relativeHumidity) = 0.5; -GVAR(windSpeed) = [0, 0, 0, 0]; +GVAR(latitude) = [38, 38, 38, 38]; +GVAR(directionOfFire) = [0, 0, 0, 0]; +GVAR(windSpeed1) = [0, 0, 0, 0]; +GVAR(windSpeed2) = [0, 0, 0, 0]; GVAR(windDirection) = [12, 12, 12, 12]; GVAR(inclinationAngle) = [0, 0, 0, 0]; GVAR(targetSpeed) = [0, 0, 0, 0]; @@ -59,10 +64,12 @@ GVAR(velocityOutput) = [0, 0, 0, 0]; GVAR(showMainPage) = true; GVAR(showAddNewGun) = false; +GVAR(showAtmoEnvData) = false; +GVAR(showGunAmmoData) = false; GVAR(showGunList) = false; GVAR(showRangeCard) = false; GVAR(showRangeCardSetup) = false; +GVAR(showTargetData) = false; GVAR(showTargetRangeAssist) = false; GVAR(showTargetSpeedAssist) = false; GVAR(showTargetSpeedAssistTimer) = false; - diff --git a/addons/atragmx/functions/fnc_parse_input.sqf b/addons/atragmx/functions/fnc_parse_input.sqf index 7d364cbdfc..be91ecc593 100644 --- a/addons/atragmx/functions/fnc_parse_input.sqf +++ b/addons/atragmx/functions/fnc_parse_input.sqf @@ -15,64 +15,78 @@ */ #include "script_component.hpp" -GVAR(temperature) = parseNumber(ctrlText 200); -GVAR(barometricPressure) = 0 max parseNumber(ctrlText 210); -GVAR(relativeHumidity) = (0 max parseNumber(ctrlText 220) min 100) / 100; - -GVAR(windSpeed) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 300)) min 50]; -GVAR(windDirection) set [GVAR(currentTarget), 1 max Round(parseNumber(ctrlText 310)) min 12]; -GVAR(inclinationAngle) set [GVAR(currentTarget), -60 max parseNumber(ctrlText 320) min 60]; -GVAR(targetSpeed) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 330)) min 50]; -GVAR(targetRange) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 340)) min 4000]; - -private ["_boreHeight", "_bulletMass", "_airFriction", "_muzzleVelocity"]; -_boreHeight = parseNumber(ctrlText 100); -_bulletMass = parseNumber(ctrlText 110); -if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,AdvancedAirDragEnabled), false])) then { - _airFriction = 0.1 max parseNumber(ctrlText 120) min 2; -} else { - _airFriction = parseNumber(ctrlText 120) / -1000; +GVAR(altitude) = -1000 max parseNumber(ctrlText 130030) min 20000; +GVAR(temperature) = -50 max parseNumber(ctrlText 130040) min 160; +GVAR(barometricPressure) = 0 max parseNumber(ctrlText 130050) min 1350; +GVAR(relativeHumidity) = (0 max parseNumber(ctrlText 130060) min 100) / 100; +if (GVAR(currentUnit) == 1) then { + GVAR(altitude) = GVAR(altitude) * 0.3048; + GVAR(temperature) = (GVAR(temperature) - 32) / 1.8; + GVAR(barometricPressure) = GVAR(barometricPressure) * 33.86389; }; -_muzzleVelocity = parseNumber(ctrlText 130); -if (GVAR(currentUnit) == 1) then -{ + +GVAR(latitude) set [GVAR(currentTarget), -90 max Round(parseNumber(ctrlText 140000)) min 90]; +GVAR(directionOfFire) set [GVAR(currentTarget), 0 max abs(Round(parseNumber(ctrlText 140010))) min 359]; +GVAR(windSpeed1) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140020)) min 50]; +GVAR(windSpeed2) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140021)) min 50]; +GVAR(windDirection) set [GVAR(currentTarget), 1 max Round(parseNumber(ctrlText 140030)) min 12]; +GVAR(inclinationAngle) set [GVAR(currentTarget), -60 max parseNumber(ctrlText 140040) min 60]; +GVAR(targetSpeed) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140050)) min 50]; +GVAR(targetRange) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140060)) min 4000]; + +private ["_boreHeight", "_bulletMass", "_bulletDiameter", "_airFriction", "_rifleTwist", "_muzzleVelocity", "_zeroRange"]; +_boreHeight = parseNumber(ctrlText 120000); +_bulletMass = parseNumber(ctrlText 120010); +_bulletDiameter = parseNumber(ctrlText 120020); +if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,AdvancedAirDragEnabled), false])) then { + _airFriction = 0.1 max parseNumber(ctrlText 120030) min 2; +} else { + _airFriction = parseNumber(ctrlText 120030) / -1000; +}; +_rifleTwist = parseNumber(ctrlText 120040); +_muzzleVelocity = parseNumber(ctrlText 120050); +_zeroRange = parseNumber (ctrlText 120060); +if (GVAR(currentUnit) != 2) then { _boreHeight = _boreHeight * 2.54; _bulletMass = _bulletMass * 0.06479891; + _bulletDiameter = _bulletDiameter * 10 * 2.54; + _rifleTwist = _rifleTwist * 2.54; _muzzleVelocity = _muzzleVelocity / 3.2808399; }; +if (GVAR(currentUnit) == 1) then { + _zeroRange = _zeroRange / 1.0936133; +}; _boreHeight = 0.1 max _boreHeight min 10; _bulletMass = 1 max _bulletMass min 100; +_bulletDiameter = 1 max _bulletDiameter min 25; _muzzleVelocity = 100 max _muzzleVelocity min 1400; - +_zeroRange = 0 max _zeroRange min 1000; GVAR(workingMemory) set [5, _boreHeight]; GVAR(workingMemory) set [12, _bulletMass]; +GVAR(workingMemory) set [13, _bulletDiameter]; +GVAR(workingMemory) set [14, _rifleTwist]; if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,AdvancedAirDragEnabled), false])) then { GVAR(workingMemory) set [15, _airFriction]; } else { GVAR(workingMemory) set [4, _airFriction]; }; GVAR(workingMemory) set [1, _muzzleVelocity]; +GVAR(workingMemory) set [2, _zeroRange]; private ["_elevationCur", "_windageCur", "_elevationScopeStep", "_windageScopeStep"]; _elevationCur = parseNumber(ctrlText 402); _windageCur = parseNumber(ctrlText 412); -switch (GVAR(currentScopeUnit)) do -{ - case 0: - { +switch (GVAR(currentScopeUnit)) do { + case 0: { _elevationCur = _elevationCur * 3.38; _windageCur = _windageCur * 3.38; }; - - case 2: - { + case 2: { _elevationCur = _elevationCur / 1.047; _windageCur = _windageCur / 1.047; }; - - case 3: - { + case 3: { _elevationScopeStep = (GVAR(workingMemory) select 7); _windageScopeStep = (GVAR(workingMemory) select 8); @@ -85,5 +99,9 @@ GVAR(workingMemory) set [10, _elevationCur]; GVAR(workingMemory) set [11, _windageCur]; [] call FUNC(update_gun); +[] call FUNC(update_gun_ammo_data); [] call FUNC(update_atmosphere); +[] call FUNC(update_atmo_env_data); [] call FUNC(update_target); + +[] call FUNC(store_user_data); diff --git a/addons/atragmx/functions/fnc_restore_atmo_default.sqf b/addons/atragmx/functions/fnc_restore_atmo_default.sqf new file mode 100644 index 0000000000..08b7c56d86 --- /dev/null +++ b/addons/atragmx/functions/fnc_restore_atmo_default.sqf @@ -0,0 +1,25 @@ +/* + * Author: Ruthberg + * Restores the atmospheric data defaults + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_restore_atmo_default + * + * Public: No + */ +#include "script_component.hpp" + +GVAR(atmosphereModeTBH) = true; +GVAR(altitude) = 0; +GVAR(temperature) = 15; +GVAR(barometricPressure) = 1013.25; +GVAR(relativeHumidity) = 0.5; + +[] call FUNC(update_atmo_selection); +[] call FUNC(update_atmosphere); diff --git a/addons/atragmx/functions/fnc_restore_user_data.sqf b/addons/atragmx/functions/fnc_restore_user_data.sqf new file mode 100644 index 0000000000..7c011198d6 --- /dev/null +++ b/addons/atragmx/functions/fnc_restore_user_data.sqf @@ -0,0 +1,36 @@ +/* + * Author: Ruthberg + * Reads user data from profileNamespace + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_restore_user_data + * + * Public: No + */ +#include "script_component.hpp" + +GVAR(currentUnit) = 0 max (profileNamespace getVariable ["ACE_ATragMX_currentUnit", 2]) min 2; +[profileNamespace getVariable ["ACE_ATragMX_currentGun", 0], false] call FUNC(change_gun); +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; +GVAR(temperature) = -50 max (profileNamespace getVariable ["ACE_ATragMX_temperature", 15]) min 160; +GVAR(barometricPressure) = 340 max (profileNamespace getVariable ["ACE_ATragMX_barometricPressure", 1013.25]) min 1350; +GVAR(relativeHumidity) = 0 max (profileNamespace getVariable ["ACE_ATragMX_relativeHumidity", 0.5]) min 1; + +GVAR(latitude) = profileNamespace getVariable ["ACE_ATragMX_latitude", [38, 38, 38, 38]]; +GVAR(directionOfFire) = profileNamespace getVariable ["ACE_ATragMX_directionOfFire", [0, 0, 0, 0]]; +GVAR(windSpeed1) = profileNamespace getVariable ["ACE_ATragMX_windSpeed1", [0, 0, 0, 0]]; +GVAR(windSpeed2) = profileNamespace getVariable ["ACE_ATragMX_windSpeed2", [0, 0, 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(targetRange) = profileNamespace getVariable ["ACE_ATragMX_targetRange", [0, 0, 0, 0]]; diff --git a/addons/atragmx/functions/fnc_show_atmo_env_data.sqf b/addons/atragmx/functions/fnc_show_atmo_env_data.sqf new file mode 100644 index 0000000000..9386956067 --- /dev/null +++ b/addons/atragmx/functions/fnc_show_atmo_env_data.sqf @@ -0,0 +1,25 @@ +/* + * Author: Ruthberg + * Shows/Hides the atmosphere and environmental data controls + * + * Arguments: + * visible - + * + * Return Value: + * Nothing + * + * Example: + * false call ace_atragmx_fnc_show_atmo_env_data + * + * Public: No + */ +#include "script_component.hpp" + +GVAR(showAtmoEnvData) = _this; + +{ctrlShow [_x, _this]} forEach [13000, 13001, 13002, 13003, 130030, 13004, 130040, 13005, 130050, 13006, 130060, 13007, 13008, 13009, 13010]; + +if (_this) then { + [] call FUNC(update_atmo_selection); + [] call FUNC(update_atmo_env_data); +}; diff --git a/addons/atragmx/functions/fnc_show_gun_ammo_data.sqf b/addons/atragmx/functions/fnc_show_gun_ammo_data.sqf new file mode 100644 index 0000000000..06ab20b3b7 --- /dev/null +++ b/addons/atragmx/functions/fnc_show_gun_ammo_data.sqf @@ -0,0 +1,24 @@ +/* + * Author: Ruthberg + * Shows/Hides the gun ammo data controls + * + * Arguments: + * visible - + * + * Return Value: + * Nothing + * + * Example: + * false call ace_atragmx_fnc_show_gun_ammo_data + * + * Public: No + */ +#include "script_component.hpp" + +GVAR(showGunAmmoData) = _this; + +{ctrlShow [_x, _this]} forEach [12000, 120000, 12001, 120010, 12002, 120020, 12003, 120030, 12004, 120040, 12005, 120050, 12006, 120060, 12007, 12008, 12009, 12010, 12011]; + +if (_this) then { + [] call FUNC(update_gun_ammo_data); +}; diff --git a/addons/atragmx/functions/fnc_show_main_page.sqf b/addons/atragmx/functions/fnc_show_main_page.sqf index 941c7559c8..607527a18e 100644 --- a/addons/atragmx/functions/fnc_show_main_page.sqf +++ b/addons/atragmx/functions/fnc_show_main_page.sqf @@ -17,5 +17,13 @@ GVAR(showMainPage) = _this; -{ctrlShow [_x, _this]} forEach [10, 100, 11, 110, 12, 120, 13, 130, 14, 140, 20, 200, 21, 210, 22, 220, 30, 300, 31, 310, 32, 320, 33, 330, 34, 340, 40, 400, 401, 402, 403, 41, 410, 411, 412, 42, 420, +{ctrlShow [_x, _this]} forEach [10, 100, 11, 110, 12, 120, 13, 130, 14, 140, 20, 200, 21, 210, 22, 220, 23, 230, 30, 300, 31, 310, 32, 320, 33, 330, 34, 340, 40, 400, 401, 402, 403, 41, 410, 411, 412, 42, 420, 500, 501, 502, 503, 600, 601, 602, 603, 1000, 2000, 3000, 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008]; + +if (_this) then { + if (GVAR(atmosphereModeTBH)) then { + {ctrlShow [_x, false]} forEach [23, 230]; + } else { + {ctrlShow [_x, false]} forEach [21, 210, 22, 220]; + }; +}; diff --git a/addons/atragmx/functions/fnc_show_target_data.sqf b/addons/atragmx/functions/fnc_show_target_data.sqf new file mode 100644 index 0000000000..8b206fee3a --- /dev/null +++ b/addons/atragmx/functions/fnc_show_target_data.sqf @@ -0,0 +1,24 @@ +/* + * Author: Ruthberg + * Shows/Hides the target data controls + * + * Arguments: + * visible - + * + * Return Value: + * Nothing + * + * Example: + * false call ace_atragmx_fnc_show_target_data + * + * Public: No + */ +#include "script_component.hpp" + +GVAR(showTargetData) = _this; + +{ctrlShow [_x, _this]} forEach [14000, 140000, 14001, 140010, 14002, 140020, 140021, 14003, 140030, 14004, 140040, 140041, 14005, 140050, 14006, 140060, 14007, 14008, 14009, 14010, 14011]; + +if (_this) then { + [] call FUNC(update_target_data); +}; diff --git a/addons/atragmx/functions/fnc_show_target_range_assist.sqf b/addons/atragmx/functions/fnc_show_target_range_assist.sqf index 60de30930f..4f46932a0b 100644 --- a/addons/atragmx/functions/fnc_show_target_range_assist.sqf +++ b/addons/atragmx/functions/fnc_show_target_range_assist.sqf @@ -25,11 +25,9 @@ if (_this) then { ctrlSetText [7012, Str(parseNumber(ctrlText 320))]; ctrlSetText [7013, Str(parseNumber(ctrlText 340))]; - if (GVAR(currentUnit) != 2) then - { + if (GVAR(currentUnit) == 1) then { ctrlSetText [7016, "Yards"]; - } else - { + } else { ctrlSetText [7016, "Meters"]; }; }; \ No newline at end of file diff --git a/addons/atragmx/functions/fnc_show_target_speed_assist.sqf b/addons/atragmx/functions/fnc_show_target_speed_assist.sqf index 3ac05f3f4f..2e66b5ea7b 100644 --- a/addons/atragmx/functions/fnc_show_target_speed_assist.sqf +++ b/addons/atragmx/functions/fnc_show_target_speed_assist.sqf @@ -24,19 +24,15 @@ if (_this) then { ctrlSetText [8004, Str(Round((GVAR(targetRange) select GVAR(currentTarget))))]; - if (GVAR(currentUnit) != 2) then - { + if (GVAR(currentUnit) == 1) then { ctrlSetText [8008, "Yards"]; - } else - { + } else { ctrlSetText [8008, "Meters"]; }; - if (GVAR(currentUnit) != 1) then - { + if (GVAR(currentUnit) == 2) then { ctrlSetText [8011, "m/s"]; - } else - { + } else { ctrlSetText [8011, "mph"]; }; }; diff --git a/addons/atragmx/functions/fnc_store_user_data.sqf b/addons/atragmx/functions/fnc_store_user_data.sqf new file mode 100644 index 0000000000..81a4476d75 --- /dev/null +++ b/addons/atragmx/functions/fnc_store_user_data.sqf @@ -0,0 +1,36 @@ +/* + * Author: Ruthberg + * Saves user data into profileNamespace + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_store_user_data + * + * Public: No + */ +#include "script_component.hpp" + +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)]; +profileNamespace setVariable ["ACE_ATragMX_temperature", GVAR(temperature)]; +profileNamespace setVariable ["ACE_ATragMX_barometricPressure", GVAR(barometricPressure)]; +profileNamespace setVariable ["ACE_ATragMX_relativeHumidity", GVAR(relativeHumidity)]; + +profileNamespace setVariable ["latitude", GVAR(latitude)]; +profileNamespace setVariable ["directionOfFire", GVAR(directionOfFire)]; +profileNamespace setVariable ["ACE_ATragMX_windSpeed1", GVAR(windSpeed1)]; +profileNamespace setVariable ["ACE_ATragMX_windSpeed2", GVAR(windSpeed2)]; +profileNamespace setVariable ["ACE_ATragMX_windDirection", GVAR(windDirection)]; +profileNamespace setVariable ["ACE_ATragMX_inclinationAngle", GVAR(inclinationAngle)]; +profileNamespace setVariable ["ACE_ATragMX_targetSpeed", GVAR(targetSpeed)]; +profileNamespace setVariable ["ACE_ATragMX_targetRange", GVAR(targetRange)]; diff --git a/addons/atragmx/functions/fnc_toggle_atmo_env_data.sqf b/addons/atragmx/functions/fnc_toggle_atmo_env_data.sqf new file mode 100644 index 0000000000..ce761c2216 --- /dev/null +++ b/addons/atragmx/functions/fnc_toggle_atmo_env_data.sqf @@ -0,0 +1,28 @@ +/* + * Author: Ruthberg + * Toggles the atmospheric data screen on/off + * + * Arguments: + * Apply new data? + * + * Return Value: + * Nothing + * + * Example: + * 1 call ace_atragmx_fnc_toggle_atmo_env_data + * + * Public: No + */ +#include "script_component.hpp" + +if (ctrlVisible 13000) then { + false call FUNC(show_atmo_env_data); + true call FUNC(show_main_page); + + if (_this == 1) then { + call FUNC(calculate_target_solution); + }; +} else { + true call FUNC(show_atmo_env_data); + false call FUNC(show_main_page); +}; diff --git a/addons/atragmx/functions/fnc_toggle_gun_ammo_data.sqf b/addons/atragmx/functions/fnc_toggle_gun_ammo_data.sqf new file mode 100644 index 0000000000..0fd4b913b8 --- /dev/null +++ b/addons/atragmx/functions/fnc_toggle_gun_ammo_data.sqf @@ -0,0 +1,29 @@ +/* + * Author: Ruthberg + * Toggles the gun ammo data screen on/off + * + * Arguments: + * Apply new data? + * + * Return Value: + * Nothing + * + * Example: + * 1 call ace_atragmx_fnc_toggle_gun_ammo_data + * + * Public: No + */ +#include "script_component.hpp" + +if (ctrlVisible 12000) then { + false call FUNC(show_gun_ammo_data); + true call FUNC(show_main_page); + + if (_this == 1) then { + call FUNC(update_zero_range); + call FUNC(calculate_target_solution); + }; +} else { + true call FUNC(show_gun_ammo_data); + false call FUNC(show_main_page); +}; diff --git a/addons/atragmx/functions/fnc_toggle_gun_list.sqf b/addons/atragmx/functions/fnc_toggle_gun_list.sqf index cd4acb1f76..714e6e848d 100644 --- a/addons/atragmx/functions/fnc_toggle_gun_list.sqf +++ b/addons/atragmx/functions/fnc_toggle_gun_list.sqf @@ -3,28 +3,26 @@ * Toggles the gun list screen on/off * * Arguments: - * Nothing + * change gun? * * Return Value: * Nothing * * Example: - * call ace_atragmx_fnc_toggle_gun_list + * false call ace_atragmx_fnc_toggle_gun_list * * Public: No */ #include "script_component.hpp" -if (ctrlVisible 6000) then -{ +if (ctrlVisible 6000) then { false call FUNC(show_gun_list); true call FUNC(show_main_page); if (_this) then { - (lbCurSel 6000) call FUNC(change_gun); + [lbCurSel 6000, true] call FUNC(change_gun); }; -} else -{ +} else { false call FUNC(show_main_page); true call FUNC(show_gun_list); }; diff --git a/addons/atragmx/functions/fnc_toggle_range_card.sqf b/addons/atragmx/functions/fnc_toggle_range_card.sqf index 572a4fe6ae..059bc7e40b 100644 --- a/addons/atragmx/functions/fnc_toggle_range_card.sqf +++ b/addons/atragmx/functions/fnc_toggle_range_card.sqf @@ -15,12 +15,10 @@ */ #include "script_component.hpp" -if (ctrlVisible 5006) then -{ +if (ctrlVisible 5006) then { false call FUNC(show_range_card); true call FUNC(show_main_page); -} else -{ +} else { false call FUNC(show_main_page); true call FUNC(show_range_card); diff --git a/addons/atragmx/functions/fnc_toggle_range_card_setup.sqf b/addons/atragmx/functions/fnc_toggle_range_card_setup.sqf index 71da18349b..738a154d17 100644 --- a/addons/atragmx/functions/fnc_toggle_range_card_setup.sqf +++ b/addons/atragmx/functions/fnc_toggle_range_card_setup.sqf @@ -3,25 +3,23 @@ * Toggles the range card setup screen on/off * * Arguments: - * Apply new range card settings + * Apply new range card settings * * Return Value: * Nothing * * Example: - * call ace_atragmx_fnc_toggle_range_card_setup + * 1 call ace_atragmx_fnc_toggle_range_card_setup * * Public: No */ #include "script_component.hpp" -if (ctrlVisible 10000) then -{ +if (ctrlVisible 10000) then { false call FUNC(show_range_card_setup); true call FUNC(show_range_card); - if (_this == 1) then - { + if (_this == 1) then { GVAR(rangeCardStartRange) = 0 max Round(parseNumber(ctrlText 10003)) min 3000; GVAR(rangeCardEndRange) = 0 max Round(parseNumber(ctrlText 10004)) min 3000; GVAR(rangeCardIncrement) = 1 max Round(parseNumber(ctrlText 10005)) min 3000; @@ -29,8 +27,7 @@ if (ctrlVisible 10000) then [] call FUNC(calculate_range_card); [] call FUNC(update_range_card); }; -} else -{ +} else { false call FUNC(show_range_card); true call FUNC(show_range_card_setup); }; diff --git a/addons/atragmx/functions/fnc_toggle_target_data.sqf b/addons/atragmx/functions/fnc_toggle_target_data.sqf new file mode 100644 index 0000000000..90fefbf37e --- /dev/null +++ b/addons/atragmx/functions/fnc_toggle_target_data.sqf @@ -0,0 +1,28 @@ +/* + * Author: Ruthberg + * Toggles the target data screen on/off + * + * Arguments: + * Apply new data? + * + * Return Value: + * Nothing + * + * Example: + * 1 call ace_atragmx_fnc_toggle_target_data + * + * Public: No + */ +#include "script_component.hpp" + +if (ctrlVisible 14000) then { + false call FUNC(show_target_data); + true call FUNC(show_main_page); + + if (_this == 1) then { + call FUNC(calculate_target_solution); + }; +} else { + true call FUNC(show_target_data); + false call FUNC(show_main_page); +}; diff --git a/addons/atragmx/functions/fnc_toggle_target_range_assist.sqf b/addons/atragmx/functions/fnc_toggle_target_range_assist.sqf index 04e9307ded..d13ef4fb2e 100644 --- a/addons/atragmx/functions/fnc_toggle_target_range_assist.sqf +++ b/addons/atragmx/functions/fnc_toggle_target_range_assist.sqf @@ -3,30 +3,30 @@ * Toggles the target range assist screen on/off * * Arguments: - * Nothing + * update range? * * Return Value: * Nothing * * Example: - * call ace_atragmx_fnc_toggle_target_range_assist + * 1 call ace_atragmx_fnc_toggle_target_range_assist * * Public: No */ #include "script_component.hpp" -if (ctrlVisible 7000) then -{ +if (ctrlVisible 7000) then { false call FUNC(show_target_range_assist); true call FUNC(show_main_page); - if (_this == 1) then - { + if (_this == 1) then { ctrlSetText [320, Str(parseNumber(ctrlText 7012))]; + ctrlSetText [140040, Str(parseNumber(ctrlText 7012))]; ctrlSetText [340, Str(parseNumber(ctrlText 7013))]; + ctrlSetText [140060, Str(parseNumber(ctrlText 7013))]; + [] call FUNC(calculate_target_solution); }; -} else -{ +} else { false call FUNC(show_main_page); true call FUNC(show_target_range_assist); }; diff --git a/addons/atragmx/functions/fnc_toggle_target_speed_assist.sqf b/addons/atragmx/functions/fnc_toggle_target_speed_assist.sqf index 66ffaa5d07..e227cf0716 100644 --- a/addons/atragmx/functions/fnc_toggle_target_speed_assist.sqf +++ b/addons/atragmx/functions/fnc_toggle_target_speed_assist.sqf @@ -3,30 +3,29 @@ * Toggles the target speed assist screen on/off * * Arguments: - * Nothing + * update speed? * * Return Value: * Nothing * * Example: - * call ace_atragmx_fnc_toggle_target_speed_assist + * 1 call ace_atragmx_fnc_toggle_target_speed_assist * * Public: No */ #include "script_component.hpp" -if (ctrlVisible 8000) then -{ +if (ctrlVisible 8000) then { false call FUNC(show_target_speed_assist); true call FUNC(show_main_page); - if (_this == 1) then - { + if (_this == 1) then { [] call FUNC(calculate_target_speed_assist); ctrlSetText [330, Str(parseNumber(ctrlText 8007))]; + ctrlSetText [140050, Str(parseNumber(ctrlText 8007))]; + [] call FUNC(calculate_target_solution); }; -} else -{ +} else { false call FUNC(show_main_page); true call FUNC(show_target_speed_assist); }; diff --git a/addons/atragmx/functions/fnc_update_atmo_env_data.sqf b/addons/atragmx/functions/fnc_update_atmo_env_data.sqf new file mode 100644 index 0000000000..8dcbc89280 --- /dev/null +++ b/addons/atragmx/functions/fnc_update_atmo_env_data.sqf @@ -0,0 +1,45 @@ +/* + * Author: Ruthberg + * Updates the atmospheric data fields + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_update_atmo_env_data + * + * Public: No + */ +#include "script_component.hpp" + +ctrlSetFocus ((uiNamespace getVariable "ATragMX_Display") displayCtrl 13007); + +if (GVAR(currentUnit) != 1) then { + ctrlSetText [130040, Str(Round(GVAR(temperature) * 10) / 10)]; +} else { + ctrlSetText [130040, Str(Round((GVAR(temperature) * 1.8 + 32) * 10) / 10)]; +}; +if (GVAR(currentUnit) != 1) then { + ctrlSetText [130050, Str(Round(GVAR(barometricPressure)))]; +} else { + ctrlSetText [130050, Str(Round(GVAR(barometricPressure) / 33.8638866667 * 100) / 100)]; +}; +ctrlSetText [130060, Str(Round(GVAR(relativeHumidity) * 100 * 10) / 10)]; +if (GVAR(currentUnit) != 1) then { + ctrlSetText [130030, Str(Round(GVAR(altitude)))]; +} else { + ctrlSetText [130030, Str(Round(GVAR(altitude) * 3.2808399))]; +}; + +if (GVAR(currentUnit) == 2) then { + ctrlSetText [13003, "Altitude (m)"]; + ctrlSetText [13004, "temperature (C)"]; + ctrlSetText [13005, "Barom Pres (milibars)"]; +} else { + ctrlSetText [13003, "Altitude (ft)"]; + ctrlSetText [13004, "temperature (F)"]; + ctrlSetText [13005, "Barom Pres (in.merc.)"]; +}; diff --git a/addons/atragmx/functions/fnc_update_atmo_selection.sqf b/addons/atragmx/functions/fnc_update_atmo_selection.sqf new file mode 100644 index 0000000000..18036178b4 --- /dev/null +++ b/addons/atragmx/functions/fnc_update_atmo_selection.sqf @@ -0,0 +1,31 @@ +/* + * Author: Ruthberg + * Updates the atmospheric data input method + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_update_atmo_selection + * + * Public: No + */ +#include "script_component.hpp" + +((uiNamespace getVariable "ATragMX_Display") displayCtrl 13001) ctrlEnable true; +((uiNamespace getVariable "ATragMX_Display") displayCtrl 13002) ctrlEnable true; + +if (GVAR(atmosphereModeTBH)) then { + ((uiNamespace getVariable "ATragMX_Display") displayCtrl 13002) ctrlEnable false; + {ctrlShow [_x, false]} forEach [13003, 130030]; + {ctrlShow [_x, true]} forEach [13005, 130050, 13006, 130060]; +} else { + ((uiNamespace getVariable "ATragMX_Display") displayCtrl 13001) ctrlEnable false; + {ctrlShow [_x, false]} forEach [13005, 130050, 13006, 130060]; + {ctrlShow [_x, true]} forEach [13003, 130030]; +}; + +[] call FUNC(update_atmo_env_data); diff --git a/addons/atragmx/functions/fnc_update_atmosphere.sqf b/addons/atragmx/functions/fnc_update_atmosphere.sqf index 68a60f72e9..fa555f50e7 100644 --- a/addons/atragmx/functions/fnc_update_atmosphere.sqf +++ b/addons/atragmx/functions/fnc_update_atmosphere.sqf @@ -15,10 +15,19 @@ */ #include "script_component.hpp" -ctrlSetText [200, Str(Round(GVAR(temperature) * 10) / 10)]; -if (GVAR(currentUnit) == 1) then { - ctrlSetText [210, Str(Round(GVAR(barometricPressure) * 100) / 100)]; +if (GVAR(currentUnit) != 1) then { + ctrlSetText [200, Str(Round(GVAR(temperature) * 10) / 10)]; } else { + ctrlSetText [200, Str(Round((GVAR(temperature) * 1.8 + 32) * 10) / 10)]; +}; +if (GVAR(currentUnit) != 1) then { ctrlSetText [210, Str(Round(GVAR(barometricPressure)))]; +} else { + ctrlSetText [210, Str(Round(GVAR(barometricPressure) / 33.8638866667 * 100) / 100)]; }; ctrlSetText [220, Str(Round(GVAR(relativeHumidity) * 100 * 10) / 10)]; +if (GVAR(currentUnit) != 1) then { + ctrlSetText [230, Str(Round(GVAR(altitude)))]; +} else { + ctrlSetText [230, Str(Round(GVAR(altitude) * 3.2808399))]; +}; diff --git a/addons/atragmx/functions/fnc_update_gun.sqf b/addons/atragmx/functions/fnc_update_gun.sqf index 1e12439878..f3d173ba11 100644 --- a/addons/atragmx/functions/fnc_update_gun.sqf +++ b/addons/atragmx/functions/fnc_update_gun.sqf @@ -16,37 +16,29 @@ #include "script_component.hpp" ctrlSetText [1000, GVAR(workingMemory) select 0]; -if (GVAR(currentUnit) == 1) then -{ - ctrlSetText [ 100, Str(Round((GVAR(workingMemory) select 5) / 2.54 * 100) / 100)]; -} else -{ - ctrlSetText [ 100, Str(Round((GVAR(workingMemory) select 5) * 100) / 100)]; +if (GVAR(currentUnit) != 2) then { + ctrlSetText [100, Str(Round((GVAR(workingMemory) select 5) / 2.54 * 100) / 100)]; +} else { + ctrlSetText [100, Str(Round((GVAR(workingMemory) select 5) * 100) / 100)]; }; -if (GVAR(currentUnit) == 1) then -{ - ctrlSetText [ 110, Str(Round((GVAR(workingMemory) select 12) * 15.4323584))]; -} else -{ - ctrlSetText [ 110, Str(Round(GVAR(workingMemory) select 12))]; +if (GVAR(currentUnit) != 2) then { + ctrlSetText [110, Str(Round((GVAR(workingMemory) select 12) * 15.4323584))]; +} else { + ctrlSetText [110, Str(Round(GVAR(workingMemory) select 12))]; }; if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,AdvancedAirDragEnabled), false])) then { - ctrlSetText [ 120, Str(Round((GVAR(workingMemory) select 15) * 1000) / 1000)]; + ctrlSetText [120, Str(Round((GVAR(workingMemory) select 15) * 1000) / 1000)]; } else { - ctrlSetText [ 120, Str(Round((GVAR(workingMemory) select 4) * -1000 * 1000) / 1000)]; + ctrlSetText [120, Str(Round((GVAR(workingMemory) select 4) * -1000 * 1000) / 1000)]; }; -if (GVAR(currentUnit) == 1) then -{ +if (GVAR(currentUnit) != 2) then { ctrlSetText [130, Str(Round((GVAR(workingMemory) select 1) * 3.2808399))]; -} else -{ +} else { ctrlSetText [130, Str(Round(GVAR(workingMemory) select 1))]; }; -if (GVAR(currentUnit) == 2) then -{ +if (GVAR(currentUnit) != 1) then { ctrlSetText [140, Str(Round(GVAR(workingMemory) select 2))]; -} else -{ +} else { ctrlSetText [140, Str(Round((GVAR(workingMemory) select 2) * 1.0936133))]; }; diff --git a/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf b/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf new file mode 100644 index 0000000000..3627197185 --- /dev/null +++ b/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf @@ -0,0 +1,74 @@ +/* + * Author: Ruthberg + * Updates the gun ammo data fields + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_update_gun_ammo_data + * + * Public: No + */ +#include "script_component.hpp" + +ctrlSetFocus ((uiNamespace getVariable "ATragMX_Display") displayCtrl 12008); + +if (GVAR(currentUnit) != 2) then { + ctrlSetText [120000, Str(Round((GVAR(workingMemory) select 5) / 2.54 * 100) / 100)]; +} else { + ctrlSetText [120000, Str(Round((GVAR(workingMemory) select 5) * 100) / 100)]; +}; +if (GVAR(currentUnit) != 2) then { + ctrlSetText [120010, Str(Round((GVAR(workingMemory) select 12) * 15.4323584))]; +} else { + ctrlSetText [120010, Str(Round(GVAR(workingMemory) select 12))]; +}; +if (GVAR(currentUnit) != 2) then { + ctrlSetText [120020, Str(Round((GVAR(workingMemory) select 13) / 10 / 2.54 * 1000) / 1000)]; +} else { + ctrlSetText [120020, Str(Round((GVAR(workingMemory) select 13) * 1000) / 1000)]; +}; +if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,AdvancedAirDragEnabled), false])) then { + ctrlSetText [120030, Str(Round((GVAR(workingMemory) select 15) * 1000) / 1000)]; +} else { + ctrlSetText [120030, Str(Round((GVAR(workingMemory) select 4) * -1000 * 1000) / 1000)]; +}; +if (GVAR(currentUnit) != 2) then { + ctrlSetText [120040, Str(Round((GVAR(workingMemory) select 14) / 2.54 * 10) / 10)]; +} else { + ctrlSetText [120040, Str(Round((GVAR(workingMemory) select 14) * 100) / 100)]; +}; +if (GVAR(currentUnit) != 2) then { + ctrlSetText [120050, Str(Round((GVAR(workingMemory) select 1) * 3.2808399))]; +} else { + ctrlSetText [120050, Str(Round(GVAR(workingMemory) select 1))]; +}; +if (GVAR(currentUnit) == 2) then { + ctrlSetText [120060, Str(Round(GVAR(workingMemory) select 2))]; +} else { + ctrlSetText [120060, Str(Round((GVAR(workingMemory) select 2) * 1.0936133))]; +}; + +if (GVAR(currentUnit) == 2) then { + ctrlSetText [12000, "Bore (cm)"]; + ctrlSetText [12001, "Bullet Weight (grams)"]; + ctrlSetText [12002, "Bullet Diam (cm)"]; + ctrlSetText [12004, "Rifle Twist (cm/trn)"]; + ctrlSetText [12005, "Muzzle Velocity (m/s)"]; +} else { + ctrlSetText [12000, "Bore (inches)"]; + ctrlSetText [12001, "Bullet Weight (grains)"]; + ctrlSetText [12002, "Bullet Diam (inches)"]; + ctrlSetText [12004, "Rifle Twist (inches/trn)"]; + ctrlSetText [12005, "Muzzle Velocity (feet/sec)"]; +}; + +if (GVAR(currentUnit) == 1) then { + ctrlSetText [12006, "Zero Range (yards)"]; +} else { + ctrlSetText [12006, "Zero Range (meters)"]; +}; diff --git a/addons/atragmx/functions/fnc_update_range_card.sqf b/addons/atragmx/functions/fnc_update_range_card.sqf index 358a74ce5d..871e5fa268 100644 --- a/addons/atragmx/functions/fnc_update_range_card.sqf +++ b/addons/atragmx/functions/fnc_update_range_card.sqf @@ -20,11 +20,9 @@ _lastColumnOutput = ""; ctrlSetText [5006, (GVAR(rangeCardLastColumns) select GVAR(rangeCardCurrentColumn))]; -if (GVAR(currentUnit) != 2) then -{ +if (GVAR(currentUnit) == 1) then { ctrlSetText [5003, "Yards"]; -} else -{ +} else { ctrlSetText [5003, "Meters"]; }; @@ -39,22 +37,16 @@ lnbClear 5007; _velocity = _x select 5; _kineticEnergy = _x select 6; - switch (GVAR(currentScopeUnit)) do - { - case 0: - { + switch (GVAR(currentScopeUnit)) do { + case 0: { _elevation = _elevation / 3.38; _windage = _windage / 3.38; - }; - - case 2: - { + }; + case 2: { _elevation = _elevation * 1.047; _windage = _windage * 1.047; }; - - case 3: - { + case 3: { _elevationScopeStep = (GVAR(workingMemory) select 7); _windageScopeStep = (GVAR(workingMemory) select 8); @@ -67,35 +59,25 @@ lnbClear 5007; _windageOutput = Str(Round(_windage * 100) / 100); _rangeOutput = Str(_range); - if (_velocity < 340.29) then - { + if (_velocity < 340.29) then { _rangeOutput = _rangeOutput + "*"; }; - if (GVAR(currentUnit) == 1) then - { + if (GVAR(currentUnit) == 1) then { _velocity = _velocity * 3.2808399; }; - switch (GVAR(rangeCardCurrentColumn)) do - { - case 0: - { + switch (GVAR(rangeCardCurrentColumn)) do { + case 0: { _lastColumnOutput = Str(Round(_lead * 100) / 100); }; - - case 1: - { + case 1: { _lastColumnOutput = Str(Round(_velocity)); }; - - case 2: - { + case 2: { _lastColumnOutput = Str(Round(_kineticEnergy)); }; - - case 3: - { + case 3: { _lastColumnOutput = Str(Round(_TOF * 100) / 100); } }; diff --git a/addons/atragmx/functions/fnc_update_result.sqf b/addons/atragmx/functions/fnc_update_result.sqf index addd1034b2..6898920eac 100644 --- a/addons/atragmx/functions/fnc_update_result.sqf +++ b/addons/atragmx/functions/fnc_update_result.sqf @@ -27,10 +27,8 @@ _windageRel = _windageAbs - _windageCur; _lead = (GVAR(leadOutput) select GVAR(currentTarget)); -switch (GVAR(currentScopeUnit)) do -{ - case 0: - { +switch (GVAR(currentScopeUnit)) do { + case 0: { _elevationAbs = _elevationAbs / 3.38; _windageAbs = _windageAbs / 3.38; @@ -40,9 +38,7 @@ switch (GVAR(currentScopeUnit)) do _elevationCur = _elevationCur / 3.38; _windageCur = _windageCur / 3.38; }; - - case 2: - { + case 2: { _elevationAbs = _elevationAbs * 1.047; _windageAbs = _windageAbs * 1.047; @@ -52,9 +48,7 @@ switch (GVAR(currentScopeUnit)) do _elevationCur = _elevationCur * 1.047; _windageCur = _windageCur * 1.047; }; - - case 3: - { + case 3: { _elevationScopeStep = (GVAR(workingMemory) select 7); _windageScopeStep = (GVAR(workingMemory) select 8); diff --git a/addons/atragmx/functions/fnc_update_target.sqf b/addons/atragmx/functions/fnc_update_target.sqf index 18d7a72cd2..30b33eb55f 100644 --- a/addons/atragmx/functions/fnc_update_target.sqf +++ b/addons/atragmx/functions/fnc_update_target.sqf @@ -15,23 +15,8 @@ */ #include "script_component.hpp" -if (!isNil QGVAR(windSpeed)) then -{ - ctrlSetText [300, Str(Round((GVAR(windSpeed) select GVAR(currentTarget)) * 100) / 100)]; -}; -if (!isNil QGVAR(windDirection)) then -{ - ctrlSetText [310, Str(Round((GVAR(windDirection) select GVAR(currentTarget))))]; -}; -if (!isNil QGVAR(inclinationAngle)) then -{ - ctrlSetText [320, Str(Round((GVAR(inclinationAngle) select GVAR(currentTarget))))]; -}; -if (!isNil QGVAR(targetSpeed)) then -{ - ctrlSetText [330, Str(Round((GVAR(targetSpeed) select GVAR(currentTarget)) * 100) / 100)]; -}; -if (!isNil QGVAR(targetRange)) then -{ - ctrlSetText [340, Str(Round((GVAR(targetRange) select GVAR(currentTarget))))]; -}; +ctrlSetText [300, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 100) / 100)]; +ctrlSetText [310, Str(Round((GVAR(windDirection) select GVAR(currentTarget))))]; +ctrlSetText [320, Str(Round((GVAR(inclinationAngle) select GVAR(currentTarget))))]; +ctrlSetText [330, Str(Round((GVAR(targetSpeed) select GVAR(currentTarget)) * 100) / 100)]; +ctrlSetText [340, Str(Round((GVAR(targetRange) select GVAR(currentTarget))))]; diff --git a/addons/atragmx/functions/fnc_update_target_data.sqf b/addons/atragmx/functions/fnc_update_target_data.sqf new file mode 100644 index 0000000000..35711acd5b --- /dev/null +++ b/addons/atragmx/functions/fnc_update_target_data.sqf @@ -0,0 +1,40 @@ +/* + * Author: Ruthberg + * Updates all target column input fields + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_update_target + * + * Public: No + */ +#include "script_component.hpp" + +ctrlSetText [140000, Str(Round((GVAR(latitude) select GVAR(currentTarget)) * 100) / 100)]; +ctrlSetText [140010, Str(Round((GVAR(directionOfFire) select GVAR(currentTarget)) * 100) / 100)]; +ctrlSetText [140020, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 100) / 100)]; +ctrlSetText [140021, Str(Round((GVAR(windSpeed2) select GVAR(currentTarget)) * 100) / 100)]; +ctrlSetText [140030, Str(Round((GVAR(windDirection) select GVAR(currentTarget))))]; +ctrlSetText [140040, Str(Round((GVAR(inclinationAngle) select GVAR(currentTarget))))]; +ctrlSetText [140041, Str(floor(cos(GVAR(inclinationAngle) select GVAR(currentTarget)) * 100) / 100)]; +ctrlSetText [140050, Str(Round((GVAR(targetSpeed) select GVAR(currentTarget)) * 100) / 100)]; +ctrlSetText [140060, Str(Round((GVAR(targetRange) select GVAR(currentTarget))))]; + +if (GVAR(currentUnit) == 2) then { + ctrlSetText [14002, "Wind Speed (m/s)"]; + ctrlSetText [14005, "Target Speed (m/s)"]; +} else { + ctrlSetText [14002, "Wind Speed (mph)"]; + ctrlSetText [14005, "Target Speed (mph)"]; +}; + +if (GVAR(currentUnit) == 1) then { + ctrlSetText [14006, "Target Range (yards)"]; +} else { + ctrlSetText [14006, "Target Range (meters)"]; +}; diff --git a/addons/atragmx/functions/fnc_update_unit_selection.sqf b/addons/atragmx/functions/fnc_update_unit_selection.sqf index 2882954c5b..77d96bfdd6 100644 --- a/addons/atragmx/functions/fnc_update_unit_selection.sqf +++ b/addons/atragmx/functions/fnc_update_unit_selection.sqf @@ -22,6 +22,10 @@ ((uiNamespace getVariable "ATragMX_Display") displayCtrl 600 + GVAR(currentUnit)) ctrlEnable false; [] call FUNC(update_gun); +[] call FUNC(update_gun_ammo_data); [] call FUNC(update_atmosphere); +[] call FUNC(update_atmo_env_data); [] call FUNC(update_target); +[] call FUNC(update_target_data); + [] call FUNC(update_result); diff --git a/addons/atragmx/functions/fnc_update_zero_range.sqf b/addons/atragmx/functions/fnc_update_zero_range.sqf index e7f0c2c301..6e2a9c566c 100644 --- a/addons/atragmx/functions/fnc_update_zero_range.sqf +++ b/addons/atragmx/functions/fnc_update_zero_range.sqf @@ -28,9 +28,8 @@ _dragModel = GVAR(workingMemory) select 16; _atmosphereModel = GVAR(workingMemory) select 17; private ["_zeroRange"]; -_zeroRange = Round(parseNumber(ctrlText 140)); -if (GVAR(currentUnit) != 2) then -{ +_zeroRange = Round(parseNumber(ctrlText 120060)); +if (GVAR(currentUnit) == 1) then { _zeroRange = _zeroRange / 1.0936133; }; if (_zeroRange < 10) exitWith { @@ -38,18 +37,14 @@ if (_zeroRange < 10) exitWith { GVAR(workingMemory) set [3, 0]; }; -private ["_temperature", "_barometricPressure", "_relativeHumidity"]; +private ["_altitude", "_temperature", "_barometricPressure", "_relativeHumidity"]; +_altitude = GVAR(altitude); _temperature = GVAR(temperature); _barometricPressure = GVAR(barometricPressure); _relativeHumidity = GVAR(relativeHumidity); -if (GVAR(currentUnit) == 1) then -{ - _temperature = (_temperature - 32) / 1.8; - _barometricPressure = _barometricPressure * 33.8638866667; -}; private ["_result"]; -_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, 0, 0, 0, 0, _zeroRange, _bc, _dragModel, _atmosphereModel, false] call FUNC(calculate_solution); +_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, 0, 0, 0, 0, _zeroRange, _bc, _dragModel, _atmosphereModel, false, 1.5, 0, 0] call FUNC(calculate_solution); GVAR(workingMemory) set [2, _zeroRange]; GVAR(workingMemory) set [3, _scopeBaseAngle + (_result select 0) / 60]; From 1e446fb0607929fd0ca4cf849ab09055eebd15c3 Mon Sep 17 00:00:00 2001 From: Tachii Date: Sat, 18 Apr 2015 02:01:09 +0300 Subject: [PATCH 204/305] Update stringtable.xml --- addons/movement/stringtable.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/movement/stringtable.xml b/addons/movement/stringtable.xml index eb91496de8..efed949036 100644 --- a/addons/movement/stringtable.xml +++ b/addons/movement/stringtable.xml @@ -11,7 +11,7 @@ Mostra peso in libbre Mostrar peso em libras Súly megjelenítése fontban. - Показать вес в фунтах + Показывать вес в фунтах Weight: @@ -32,7 +32,7 @@ Wspinaczka Trepar Vylézt - Подняться + Взобраться Mászás Arrampicati @@ -43,7 +43,7 @@ Nie możesz wspiąć się tutaj No se puede trepar aquí Zde není možné vylézt - Не можете подняться здесь + Здесь невозможно взобраться Itt nem tudsz mászni Non puoi arrampicarti qui From bd3ef35c88e9d54f4bc0f51c84ed89b861109bcf Mon Sep 17 00:00:00 2001 From: Tachii Date: Sat, 18 Apr 2015 02:07:49 +0300 Subject: [PATCH 205/305] Update stringtable.xml --- addons/hearing/stringtable.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/hearing/stringtable.xml b/addons/hearing/stringtable.xml index f57bc2545a..25eedec9b9 100644 --- a/addons/hearing/stringtable.xml +++ b/addons/hearing/stringtable.xml @@ -19,7 +19,7 @@ Los tapones para los oídos permiten al usuario operar armamento ruidoso sin sufrir pérdida de audición. Stopery do uszu umożliwiają użytkownikowi przebywać w pobliżu głośnej broni bez poniesienia konsekwencji jaką jest utrata słuchu. Ochranné špunty umožňují uživateli, aby neutrpěl zranění jeho sluchu v blízkosti hlasitých zbraní. - Беруши позволяют избежать потери слуха при близкой громкой стрельбе. + Беруши позволяют носителю находиться возле громкого вооружения без потери слуха Bouchons Anti-Bruits pour la prévention des traumatismes sonores aigus. Erősebb hanghatásoktól védő füldugó, megakadályozza a nagy hanggal járó fegyverzettől való halláskárosodást. Protetor para ouvidos permitem que o usuário esteja próximo a ruídos sem danificar sua audição. From 0bb3238db18050339f2bda1640a6fa6fb9ec5a9f Mon Sep 17 00:00:00 2001 From: Tachii Date: Sat, 18 Apr 2015 02:09:59 +0300 Subject: [PATCH 206/305] Update stringtable.xml --- addons/disposable/stringtable.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/disposable/stringtable.xml b/addons/disposable/stringtable.xml index 214b3f228a..9b7121e3ca 100644 --- a/addons/disposable/stringtable.xml +++ b/addons/disposable/stringtable.xml @@ -31,7 +31,7 @@ Wstępnie załadowana atrapa pocisku Preloaded Missile Dummy Előtöltött műrakéta - Заряженная ракетная пустышка + Предзаряженная Рокетная Болванка Missile stupido precaricato From 7f942a06f8d4f8fe93471ad61bf3717ade6c0efb Mon Sep 17 00:00:00 2001 From: Tachii Date: Sat, 18 Apr 2015 02:11:16 +0300 Subject: [PATCH 207/305] Update stringtable.xml --- addons/logistics_uavbattery/stringtable.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/logistics_uavbattery/stringtable.xml b/addons/logistics_uavbattery/stringtable.xml index b60353e29c..23588586cf 100644 --- a/addons/logistics_uavbattery/stringtable.xml +++ b/addons/logistics_uavbattery/stringtable.xml @@ -11,7 +11,7 @@ Dron je nabitý O VANT está cheio Il drone è pieno - БПЛА заполнен + БПЛА полностью заряжен You need a UAV Battery @@ -59,7 +59,7 @@ Používané k dobíjení UAV Usada para reabastecer VANT Usata per ricaricare la Batteria dell'UAV - Используется для зарядки БПЛА + Используется для зарядки переносных БПЛА Recharging ... From ed2e847247d4d91b30c2731975b416bf1713649c Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 17 Apr 2015 18:13:09 -0500 Subject: [PATCH 208/305] More Privates --- addons/maptools/XEH_postInitClient.sqf | 1 + addons/maptools/functions/fnc_addLineMarker.sqf | 9 +++++---- .../functions/fnc_calculateMapScale.sqf | 2 ++ .../functions/fnc_copyMapReceiveMarkers.sqf | 1 + addons/maptools/functions/fnc_handleKeyDown.sqf | 9 +++------ .../functions/fnc_handleMouseButton.sqf | 5 ++--- .../maptools/functions/fnc_handleMouseMove.sqf | 1 + .../maptools/functions/fnc_isInsideMapTool.sqf | 1 + addons/maptools/functions/fnc_openMapGps.sqf | 5 ++++- .../maptools/functions/fnc_openMapGpsUpdate.sqf | 2 ++ .../maptools/functions/fnc_removeLineMarker.sqf | 2 +- .../maptools/functions/fnc_updateLineMarker.sqf | 9 +++++---- .../functions/fnc_updateMapToolMarkers.sqf | 2 ++ .../functions/fnc_reloadLauncher.sqf | 7 +------ .../functions/fnc_handleInitPostServer.sqf | 6 ++---- addons/respawn/functions/fnc_initRallypoint.sqf | 17 ++++++----------- addons/respawn/functions/fnc_module.sqf | 8 ++++---- .../functions/fnc_moduleFriendlyFire.sqf | 10 +++------- .../respawn/functions/fnc_moduleRallypoint.sqf | 8 +++----- addons/respawn/functions/fnc_moveRallypoint.sqf | 7 ++++--- .../functions/fnc_removeDisconnectedPlayer.sqf | 2 +- addons/respawn/functions/fnc_restoreGear.sqf | 5 ++--- addons/safemode/XEH_postInit.sqf | 1 + addons/scopes/functions/fnc_adjustScope.sqf | 6 +++--- addons/scopes/functions/fnc_adjustZero.sqf | 7 ++++--- .../functions/fnc_applyScopeAdjustment.sqf | 4 ++-- addons/scopes/functions/fnc_canAdjustZero.sqf | 7 ++++--- tools/search_privates.py | 2 ++ 28 files changed, 72 insertions(+), 74 deletions(-) diff --git a/addons/maptools/XEH_postInitClient.sqf b/addons/maptools/XEH_postInitClient.sqf index 26fb005e9f..8129a75b15 100644 --- a/addons/maptools/XEH_postInitClient.sqf +++ b/addons/maptools/XEH_postInitClient.sqf @@ -24,6 +24,7 @@ GVAR(drawing_controls) = [36732, 36733, 36734, 36735, 36736, 36737]; // The thread dies as soon as the mission start, so it's not really compiting for scheduler space. [] spawn { _fnc_installMapEvents = { + private "_d"; _d = _this; ((finddisplay _d) displayctrl 51) ctrlAddEventHandler ["MouseMoving", {_this call FUNC(handleMouseMove);}]; ((finddisplay _d) displayctrl 51) ctrlAddEventHandler ["MouseButtonDown", {[1, _this] call FUNC(handleMouseButton);}]; diff --git a/addons/maptools/functions/fnc_addLineMarker.sqf b/addons/maptools/functions/fnc_addLineMarker.sqf index 83e983d0e3..157891a262 100644 --- a/addons/maptools/functions/fnc_addLineMarker.sqf +++ b/addons/maptools/functions/fnc_addLineMarker.sqf @@ -15,10 +15,11 @@ */ #include "script_component.hpp" -_name = _this select 0; -_startPos = _this select 1; -_difPos = (_this select 2) vectorDiff _startPos ; -_color = _this select 3; +PARAMS_4(_name,_startPos,_endPos,_color); + +private ["_marker", "_difPos", "_mag"]; + +_difPos = _endPos vectorDiff _startPos; _marker = createMarkerLocal [_name, _startPos]; _name setMarkerShapeLocal "RECTANGLE"; diff --git a/addons/maptools/functions/fnc_calculateMapScale.sqf b/addons/maptools/functions/fnc_calculateMapScale.sqf index 700e089a88..4723a4f5e1 100644 --- a/addons/maptools/functions/fnc_calculateMapScale.sqf +++ b/addons/maptools/functions/fnc_calculateMapScale.sqf @@ -12,6 +12,8 @@ */ #include "script_component.hpp" +private ["_screenOffset", "_pos"]; + _pos = ((finddisplay 12) displayctrl 51) ctrlMapScreenToWorld [0.5, 0.5]; _screenOffset = ((finddisplay 12) displayctrl 51) posWorldToScreen [(_pos select 0) + 100, (_pos select 1)]; diff --git a/addons/maptools/functions/fnc_copyMapReceiveMarkers.sqf b/addons/maptools/functions/fnc_copyMapReceiveMarkers.sqf index e3de77316a..44f6ed6203 100644 --- a/addons/maptools/functions/fnc_copyMapReceiveMarkers.sqf +++ b/addons/maptools/functions/fnc_copyMapReceiveMarkers.sqf @@ -15,6 +15,7 @@ PARAMS_1(_lineMarkers); { + private "_marker"; _marker = _x; //Add marker if we don't already have it if (({(_x select 0) == (_marker select 0)} count GVAR(drawing_lineMarkers)) == 0) then { diff --git a/addons/maptools/functions/fnc_handleKeyDown.sqf b/addons/maptools/functions/fnc_handleKeyDown.sqf index d2b3a060b8..d1f9e199c9 100644 --- a/addons/maptools/functions/fnc_handleKeyDown.sqf +++ b/addons/maptools/functions/fnc_handleKeyDown.sqf @@ -15,13 +15,10 @@ #include "script_component.hpp" -private ["_dir", "_params", "_control", "_button", "_screenPos", "_shiftKey", "_ctrlKey", "_handled", "_pos"]; +PARAMS_5(_display,_code,_shiftKey,_ctrlKey,_altKey); + +private ["_handled", "_relPos", "_diffVector", "_magDiffVector", "_lambdaLong", "_lambdaTrasAbs"]; -_display = _this select 0; -_code = _this select 1; -_shiftKey = _this select 2; -_ctrlKey = _this select 3; -_altKey = _this select 4; _handled = false; #define DIK_ESCAPE 0x01 diff --git a/addons/maptools/functions/fnc_handleMouseButton.sqf b/addons/maptools/functions/fnc_handleMouseButton.sqf index 8db6b8b0f1..16cabe9719 100644 --- a/addons/maptools/functions/fnc_handleMouseButton.sqf +++ b/addons/maptools/functions/fnc_handleMouseButton.sqf @@ -13,10 +13,9 @@ #include "script_component.hpp" -private ["_dir", "_params", "_control", "_button", "_screenPos", "_shiftKey", "_ctrlKey", "_handled", "_pos"]; +private ["_control", "_button", "_screenPos", "_shiftKey", "_ctrlKey", "_handled", "_pos", "_altKey", "_gui", "_marker"]; -_dir = _this select 0; -_params = _this select 1; +PARAMS_2(_dir,_params); _control = _params select 0; _button = _params select 1; _screenPos = [_params select 2, _params select 3]; diff --git a/addons/maptools/functions/fnc_handleMouseMove.sqf b/addons/maptools/functions/fnc_handleMouseMove.sqf index 4111c8fad4..2148c5a162 100644 --- a/addons/maptools/functions/fnc_handleMouseMove.sqf +++ b/addons/maptools/functions/fnc_handleMouseMove.sqf @@ -51,6 +51,7 @@ if (GVAR(mapTool_isDragging)) exitWith { // Rotation if (GVAR(mapTool_isRotating)) exitWith { + private "_angle"; // Get new angle _angle = (180 + ((GVAR(mousePosition) select 0) - (GVAR(mapTool_startPos) select 0)) atan2 ((GVAR(mousePosition) select 1) - (GVAR(mapTool_startPos) select 1)) mod 360); GVAR(mapTool_angle) = GVAR(mapTool_startAngle) + _angle - GVAR(mapTool_startDragAngle); diff --git a/addons/maptools/functions/fnc_isInsideMapTool.sqf b/addons/maptools/functions/fnc_isInsideMapTool.sqf index 4dd66e2b9a..eeaf8f346a 100644 --- a/addons/maptools/functions/fnc_isInsideMapTool.sqf +++ b/addons/maptools/functions/fnc_isInsideMapTool.sqf @@ -16,6 +16,7 @@ #define DIST_TOP_TO_CENTER_PERC 0.65 #define DIST_LEFT_TO_CENTER_PERC 0.30 +private ["_textureWidth", "_relPos", "_dirVector", "_lambdaLong", "_lambdaTrasAbs", "_pos"]; if (GVAR(mapTool_Shown) == 0) exitWith {false}; _textureWidth = [TEXTURE_WIDTH_IN_M, TEXTURE_WIDTH_IN_M / 2] select (GVAR(mapTool_Shown) - 1); diff --git a/addons/maptools/functions/fnc_openMapGps.sqf b/addons/maptools/functions/fnc_openMapGps.sqf index c4e2436b3b..7d29d9e169 100644 --- a/addons/maptools/functions/fnc_openMapGps.sqf +++ b/addons/maptools/functions/fnc_openMapGps.sqf @@ -12,7 +12,10 @@ */ #include "script_component.hpp" -_shouldOpenGps = _this select 0; +PARAMS_1(_shouldOpenGps); + +private ["_isOpen"]; + _isOpen = !(isNull (uiNamespace getVariable [QGVAR(ui_mapGpsDisplay), displayNull])); if (_shouldOpenGps && {"ItemGPS" in assignedItems ACE_player} && {!_isOpen}) then { diff --git a/addons/maptools/functions/fnc_openMapGpsUpdate.sqf b/addons/maptools/functions/fnc_openMapGpsUpdate.sqf index ddc177f182..092f0720c2 100644 --- a/addons/maptools/functions/fnc_openMapGpsUpdate.sqf +++ b/addons/maptools/functions/fnc_openMapGpsUpdate.sqf @@ -3,6 +3,8 @@ #include "script_component.hpp" +private ["_mapGpsDisplay", "_ctrl"]; + if ((!("ItemGPS" in assigneditems ACE_player)) || {isNull (uiNamespace getVariable [QGVAR(ui_mapGpsDisplay), displayNull])}) exitWith { ("RscACE_MapGps" call BIS_fnc_rscLayer) cutText ["","PLAIN"]; //close GPS RSC [(_this select 1)] call CBA_fnc_removePerFrameHandler; //remove frameHandler diff --git a/addons/maptools/functions/fnc_removeLineMarker.sqf b/addons/maptools/functions/fnc_removeLineMarker.sqf index 45c39611db..be82970524 100644 --- a/addons/maptools/functions/fnc_removeLineMarker.sqf +++ b/addons/maptools/functions/fnc_removeLineMarker.sqf @@ -11,7 +11,7 @@ #include "script_component.hpp" -_name = _this select 0; +PARAMS_1(_name); deleteMarkerLocal _name; { diff --git a/addons/maptools/functions/fnc_updateLineMarker.sqf b/addons/maptools/functions/fnc_updateLineMarker.sqf index cf80c1ac26..a745bfa123 100644 --- a/addons/maptools/functions/fnc_updateLineMarker.sqf +++ b/addons/maptools/functions/fnc_updateLineMarker.sqf @@ -13,10 +13,11 @@ */ #include "script_component.hpp" -_name = _this select 0; -_startPos = _this select 1; -_difPos = (_this select 2) vectorDiff _startPos ; -_color = _this select 3; +PARAMS_4(_name,_startPos,_endPos,_color); + +private ["_difPos", "_mag"]; + +_difPos = _endPos vectorDiff _startPos; _name setMarkerShapeLocal "RECTANGLE"; _name setMarkerAlphaLocal 1; diff --git a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf index 3a7b919b8b..fa6db8872a 100644 --- a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf +++ b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf @@ -18,6 +18,8 @@ PARAMS_1(_theMap); +private ["_rotatingTexture", "_textureWidth", "_scale", "_xPos", "_yPos"]; + if (!("ACE_MapTools" in items ACE_player)|| {GVAR(mapTool_Shown) == 0}) exitWith {}; _rotatingTexture = ""; diff --git a/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf b/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf index 36772f9dfd..fc802a025c 100644 --- a/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf +++ b/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf @@ -14,12 +14,7 @@ */ #include "script_component.hpp" -private ["_unit", "_weapon", "_magazine"]; - -_unit = _this select 0; -_target = _this select 1; -_weapon = _this select 2; -_magazine = _this select 3; +PARAMS_4(_unit,_target,_weapon,_magazine); _target selectWeapon _weapon; diff --git a/addons/respawn/functions/fnc_handleInitPostServer.sqf b/addons/respawn/functions/fnc_handleInitPostServer.sqf index f8a0479717..914334cc25 100644 --- a/addons/respawn/functions/fnc_handleInitPostServer.sqf +++ b/addons/respawn/functions/fnc_handleInitPostServer.sqf @@ -2,13 +2,11 @@ // execute on server only! #include "script_component.hpp" -private "_unit"; - -_unit = _this select 0; +PARAMS_1(_unit); private ["_group0", "_rallypoint"]; -_group0 = group _unit; // _group is a reserved veriable and shouldn't be used +_group0 = group _unit; // _group-is a reserved veriable and shouldn't be used _rallypoint = [ objNull, diff --git a/addons/respawn/functions/fnc_initRallypoint.sqf b/addons/respawn/functions/fnc_initRallypoint.sqf index 44671b7c45..2ef158a419 100644 --- a/addons/respawn/functions/fnc_initRallypoint.sqf +++ b/addons/respawn/functions/fnc_initRallypoint.sqf @@ -16,11 +16,7 @@ #include "script_component.hpp" -private ["_rallypoint", "_respawnMarker", "_side"]; - -_rallypoint = _this select 0; -_respawnMarker = _this select 1; -_side = _this select 2; +PARAMS_3(_rallypoint,_respawnMarker,_side); private "_name"; _name = typeOf _rallypoint; @@ -29,12 +25,11 @@ _name = typeOf _rallypoint; if (hasInterface) then { // fix init having wrong position, vars etc. [_rallypoint, _respawnMarker, _side, _name] spawn { - _rallypoint = _this select 0; - _respawnMarker = _this select 1; - _side = _this select 2; - _name = _this select 3; - - _marker = format ["ACE_Marker_%1", _name]; + PARAMS_4(_rallypoint,_respawnMarker,_side,_name); + + private ["_marker", "_type"]; + + _marker = format ["ACE_Marker_%1", _name]; // exit if it already exist if (_marker in allMapMarkers) exitWith {}; diff --git a/addons/respawn/functions/fnc_module.sqf b/addons/respawn/functions/fnc_module.sqf index 6d03c1eda3..4f22bdfcd4 100644 --- a/addons/respawn/functions/fnc_module.sqf +++ b/addons/respawn/functions/fnc_module.sqf @@ -18,10 +18,9 @@ #include "script_component.hpp" -if !(isServer) exitWith {}; +PARAMS_3(_logic,_units,_activated); -_logic = _this select 0; -_activated = _this select 2; +if !(isServer) exitWith {}; if !(_activated) exitWith {}; @@ -32,9 +31,10 @@ GVAR(Module) = true; if (isServer) then { if (GVAR(RemoveDeadBodiesDisconnected)) then { + private "_fnc_deleteDisconnected"; _fnc_deleteDisconnected = { _this spawn { - _unit = _this select 0; + PARAMS_1(_unit); sleep 4; diff --git a/addons/respawn/functions/fnc_moduleFriendlyFire.sqf b/addons/respawn/functions/fnc_moduleFriendlyFire.sqf index 35857b43e4..7641db806d 100644 --- a/addons/respawn/functions/fnc_moduleFriendlyFire.sqf +++ b/addons/respawn/functions/fnc_moduleFriendlyFire.sqf @@ -19,17 +19,13 @@ #include "script_component.hpp" _this spawn { - _logic = _this select 0; - _units = _this select 1; - _activated = _this select 2; + PARAMS_3(_logic,_units,_activated); if !(_activated) exitWith {}; if (isServer) then { - _varName = QGVAR(showFriendlyFireMessage); - - missionNamespace setVariable [_varName, true]; - publicVariable _varName; + missionNamespace setVariable [QGVAR(showFriendlyFireMessage), true]; + publicVariable QGVAR(showFriendlyFireMessage); }; diag_log text "[ACE]: Friendly Fire Messages Module Initialized."; diff --git a/addons/respawn/functions/fnc_moduleRallypoint.sqf b/addons/respawn/functions/fnc_moduleRallypoint.sqf index 1646fa72da..15c415027d 100644 --- a/addons/respawn/functions/fnc_moduleRallypoint.sqf +++ b/addons/respawn/functions/fnc_moduleRallypoint.sqf @@ -16,11 +16,9 @@ VOID */ - #include "script_component.hpp" - -_logic = _this select 0; -_units = _this select 1; -_activated = _this select 2; +#include "script_component.hpp" + +PARAMS_3(_logic,_units,_activated); if !(_activated) exitWith {}; diff --git a/addons/respawn/functions/fnc_moveRallypoint.sqf b/addons/respawn/functions/fnc_moveRallypoint.sqf index 62d2742ef9..2453c68344 100644 --- a/addons/respawn/functions/fnc_moveRallypoint.sqf +++ b/addons/respawn/functions/fnc_moveRallypoint.sqf @@ -18,9 +18,10 @@ #include "script_component.hpp" _this spawn { - _unit = _this select 0; - _side = _this select 1; - + PARAMS_2(_unit,_side); + + private ["_rallypoint", "_position"]; + // rallypoint names are defined in CfgVehicles.hpp _rallypoint = [ diff --git a/addons/respawn/functions/fnc_removeDisconnectedPlayer.sqf b/addons/respawn/functions/fnc_removeDisconnectedPlayer.sqf index 492cd990a4..7bd0a6707f 100644 --- a/addons/respawn/functions/fnc_removeDisconnectedPlayer.sqf +++ b/addons/respawn/functions/fnc_removeDisconnectedPlayer.sqf @@ -16,7 +16,7 @@ #include "script_component.hpp" -private ["_forceRemove", "_body"]; +private ["_forceRemove", "_body", "_uid"]; _forceRemove = _this select 0; diff --git a/addons/respawn/functions/fnc_restoreGear.sqf b/addons/respawn/functions/fnc_restoreGear.sqf index 5a00e3425c..85863bb6c2 100644 --- a/addons/respawn/functions/fnc_restoreGear.sqf +++ b/addons/respawn/functions/fnc_restoreGear.sqf @@ -17,11 +17,10 @@ #include "script_component.hpp" -private ["_unit", "_allGear", "_headgear", "_goggles", "_uniform", "_uniformitems", "_vest", "_vestitems", "_backpack", "_backpackitems", "_primaryweapon", "_primaryweaponitems", "_primaryweaponmagazine", "_handgunweapon", "_handgunweaponitems", "_handgunweaponmagazine", "_assigneditems", "_binocular"]; +PARAMS_2(_unit,_allGear); +private ["_unit", "_allGear", "_headgear", "_goggles", "_uniform", "_uniformitems", "_vest", "_vestitems", "_backpack", "_backpackitems", "_primaryweapon", "_primaryweaponitems", "_primaryweaponmagazine", "_handgunweapon", "_handgunweaponitems", "_handgunweaponmagazine", "_assigneditems", "_binocular", "_backpa", "_secondaryweapon", "_secondaryweaponitems", "_secondaryweaponmagazine"]; -_unit = _this select 0; -_allGear = _this select 1; // remove all starting gear of a player removeAllWeapons _unit; diff --git a/addons/safemode/XEH_postInit.sqf b/addons/safemode/XEH_postInit.sqf index aa13029547..be6b79d82a 100644 --- a/addons/safemode/XEH_postInit.sqf +++ b/addons/safemode/XEH_postInit.sqf @@ -3,6 +3,7 @@ if (!hasInterface) exitWith {}; +// IGNORE_PRIVATE_WARNING(_player) //["Soldier", {_player = ACE_player; if (currentWeapon _player in (_player getVariable [QGVAR(safedWeapons), []])) then {[false] call FUNC(setSafeModeVisual)}] call EFUNC(common,addInfoDisplayEventHandler); //@todo addEventHandler infoDisplayChanged with select 1 == "Soldier" diff --git a/addons/scopes/functions/fnc_adjustScope.sqf b/addons/scopes/functions/fnc_adjustScope.sqf index 76c62a4688..a59095d127 100644 --- a/addons/scopes/functions/fnc_adjustScope.sqf +++ b/addons/scopes/functions/fnc_adjustScope.sqf @@ -14,11 +14,11 @@ */ #include "script_component.hpp" -if !(vehicle _unit == _unit) exitWith {false}; +PARAMS_3(_unit,_turretAndDirection,_majorStep); -private ["_unit", "_turretAndDirection", "_majorStep", "_weaponIndex", "_zeroing", "_optic", "_increment", "_maxVertical", "_maxHorizontal", "_elevation", "_windage", "_zero"]; +if (vehicle _unit != _unit) exitWith {false}; -EXPLODE_3_PVT(_this,_unit,_turretAndDirection,_majorStep); +private ["_weaponIndex", "_zeroing", "_optic", "_increment", "_maxVertical", "_maxHorizontal", "_elevation", "_windage", "_zero", "_adjustment"]; _weaponIndex = [_unit, currentWeapon _unit] call EFUNC(common,getWeaponIndex); if (_weaponIndex < 0) exitWith {false}; diff --git a/addons/scopes/functions/fnc_adjustZero.sqf b/addons/scopes/functions/fnc_adjustZero.sqf index 4dbab48f49..12e911b537 100644 --- a/addons/scopes/functions/fnc_adjustZero.sqf +++ b/addons/scopes/functions/fnc_adjustZero.sqf @@ -12,10 +12,11 @@ */ #include "script_component.hpp" -if !(vehicle _unit == _unit) exitWith {false}; +PARAMS_1(_unit); -private ["_unit", "_adjustment", "_zeroing", "_elevation", "_windage", "_zero"]; -_unit = _this select 0; +if (vehicle _unit != _unit) exitWith {false}; + +private ["_weaponIndex", "_adjustment", "_zeroing", "_elevation", "_windage", "_zero"]; _weaponIndex = [_unit, currentWeapon _unit] call EFUNC(common,getWeaponIndex); if (_weaponIndex < 0) exitWith {false}; diff --git a/addons/scopes/functions/fnc_applyScopeAdjustment.sqf b/addons/scopes/functions/fnc_applyScopeAdjustment.sqf index 6bb72558b1..4950fe9ece 100644 --- a/addons/scopes/functions/fnc_applyScopeAdjustment.sqf +++ b/addons/scopes/functions/fnc_applyScopeAdjustment.sqf @@ -15,10 +15,10 @@ */ #include "script_component.hpp" -private ["_unit", "_elevation", "_windage", "_zero", "_adjustmentDifference", "_pitchbankyaw", "_pitch", "_bank", "_yaw"]; - EXPLODE_4_PVT(_this,_unit,_elevation,_windage,_zero); +private ["_adjustmentDifference", "_pitchbankyaw", "_pitch", "_bank", "_yaw", "_adjustment", "_weaponIndex"]; + _weaponIndex = [_unit, currentWeapon _unit] call EFUNC(common,getWeaponIndex); _adjustment = _unit getVariable QGVAR(Adjustment); diff --git a/addons/scopes/functions/fnc_canAdjustZero.sqf b/addons/scopes/functions/fnc_canAdjustZero.sqf index c9663ea711..619d82cf6e 100644 --- a/addons/scopes/functions/fnc_canAdjustZero.sqf +++ b/addons/scopes/functions/fnc_canAdjustZero.sqf @@ -12,13 +12,14 @@ */ #include "script_component.hpp" +PARAMS_1(_unit); + +private ["_weaponIndex", "_adjustment", "_elevation"]; + if (cameraView == "GUNNER") exitWith {false}; if !(vehicle _unit == _unit) exitWith {false}; if !(missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) exitWith {false}; -private ["_unit", "_adjustment", "_elevation"]; -_unit = _this select 0; - _weaponIndex = [_unit, currentWeapon _unit] call EFUNC(common,getWeaponIndex); if (_weaponIndex < 0) exitWith {false}; diff --git a/tools/search_privates.py b/tools/search_privates.py index 6e1430a8ca..4b418de8d6 100644 --- a/tools/search_privates.py +++ b/tools/search_privates.py @@ -70,6 +70,8 @@ def check_privates(filepath): if '_forEachIndex' in priv_use: priv_use.remove('_forEachIndex') if '_foreachIndex' in priv_declared: priv_declared.remove('_foreachIndex') if '_foreachIndex' in priv_use: priv_use.remove('_foreachIndex') + if '_foreachindex' in priv_declared: priv_declared.remove('_foreachindex') + if '_foreachindex' in priv_use: priv_use.remove('_foreachindex') missing = [] for s in priv_use: From 04858bb6733f0a941e205fdaaa0085328cc6acf8 Mon Sep 17 00:00:00 2001 From: Tachii Date: Sat, 18 Apr 2015 02:19:09 +0300 Subject: [PATCH 209/305] Update stringtable.xml --- addons/microdagr/stringtable.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/microdagr/stringtable.xml b/addons/microdagr/stringtable.xml index d7d550fc32..2acb0ec574 100644 --- a/addons/microdagr/stringtable.xml +++ b/addons/microdagr/stringtable.xml @@ -95,7 +95,7 @@ Enter Grid Cords: Introducir coordenadas de cuadrícula: - Введите координаты: + Введите Сеточные Координаты: Wprowadź współrzędne: Entrer coordonnées Koordinaten eingeben: @@ -183,7 +183,7 @@ Connect To Conectar a - Соединиться с + Подключиться к Verbinde zu Připojit k Podłącz do From b7c7d2ff152c9c59020b17adb98fcae4ed1af4d3 Mon Sep 17 00:00:00 2001 From: Tachii Date: Sat, 18 Apr 2015 03:04:14 +0300 Subject: [PATCH 210/305] Update stringtable.xml --- addons/hearing/stringtable.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/hearing/stringtable.xml b/addons/hearing/stringtable.xml index 25eedec9b9..3fa947ead9 100644 --- a/addons/hearing/stringtable.xml +++ b/addons/hearing/stringtable.xml @@ -19,7 +19,7 @@ Los tapones para los oídos permiten al usuario operar armamento ruidoso sin sufrir pérdida de audición. Stopery do uszu umożliwiają użytkownikowi przebywać w pobliżu głośnej broni bez poniesienia konsekwencji jaką jest utrata słuchu. Ochranné špunty umožňují uživateli, aby neutrpěl zranění jeho sluchu v blízkosti hlasitých zbraní. - Беруши позволяют носителю находиться возле громкого вооружения без потери слуха + Беруши позволяют носителю находиться возле громкого вооружения без потери слуха. Bouchons Anti-Bruits pour la prévention des traumatismes sonores aigus. Erősebb hanghatásoktól védő füldugó, megakadályozza a nagy hanggal járó fegyverzettől való halláskárosodást. Protetor para ouvidos permitem que o usuário esteja próximo a ruídos sem danificar sua audição. From 711be038fcc49c06cf0b2e806865a0f54f9d2d02 Mon Sep 17 00:00:00 2001 From: Tachii Date: Sat, 18 Apr 2015 03:09:51 +0300 Subject: [PATCH 211/305] Update stringtable.xml --- addons/disposable/stringtable.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/disposable/stringtable.xml b/addons/disposable/stringtable.xml index 9b7121e3ca..7f57998157 100644 --- a/addons/disposable/stringtable.xml +++ b/addons/disposable/stringtable.xml @@ -31,7 +31,7 @@ Wstępnie załadowana atrapa pocisku Preloaded Missile Dummy Előtöltött műrakéta - Предзаряженная Рокетная Болванка + Предзаряженная ракетная болванка Missile stupido precaricato From ad6155755779787b53ebff7fb3909f7527fb6c31 Mon Sep 17 00:00:00 2001 From: Tachii Date: Sat, 18 Apr 2015 03:10:28 +0300 Subject: [PATCH 212/305] Update stringtable.xml --- addons/microdagr/stringtable.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/microdagr/stringtable.xml b/addons/microdagr/stringtable.xml index 2acb0ec574..f98c7f438c 100644 --- a/addons/microdagr/stringtable.xml +++ b/addons/microdagr/stringtable.xml @@ -95,7 +95,7 @@ Enter Grid Cords: Introducir coordenadas de cuadrícula: - Введите Сеточные Координаты: + Введите сеточные координаты: Wprowadź współrzędne: Entrer coordonnées Koordinaten eingeben: From 8fa0c91632289fbae1138da693f038e5fe234884 Mon Sep 17 00:00:00 2001 From: jaynus Date: Fri, 17 Apr 2015 18:23:26 -0700 Subject: [PATCH 213/305] Added PlayerJIP event, handled full requests on JIP. --- addons/common/XEH_postInit.sqf | 27 ++++++++++++++++++- .../fnc__handleRequestAllSyncedEvents.sqf | 23 ++++++++++++++++ .../fnc__handleRequestSyncedEvent.sqf | 2 +- 3 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 addons/common/functions/fnc__handleRequestAllSyncedEvents.sqf diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 96b0f34356..d228d77d7b 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -107,7 +107,6 @@ GVAR(OldPlayerWeapon) = currentWeapon ACE_player; // PFH to raise varios events [{ - // "playerInventoryChanged" event _newPlayerInventory = [ACE_player] call FUNC(getAllGear); if !(_newPlayerInventory isEqualTo GVAR(OldPlayerInventory)) then { @@ -190,6 +189,32 @@ GVAR(OldPlayerWeapon) = currentWeapon ACE_player; }] call FUNC(addCanInteractWithCondition); // Synced ACE events +// Handle JIP scenario +if(!isServer) then{ + ["PlayerJip", { + diag_log text format["[ACE] - JIP event synchronization initialized"]; + ["SEH_all", [player]] call FUNC(serverEvent); + }] call FUNC(addEventHandler); +} else { + ["SEH_all", FUNC(_handleRequestAllSyncedEvents)] call FUNC(addEventHandler); +}; ["SEH", FUNC(_handleSyncedEvent)] call FUNC(addEventHandler); ["SEH_s", FUNC(_handleRequestSyncedEvent)] call FUNC(addEventHandler); [FUNC(syncedEventPFH), 0.5, []] call cba_fnc_addPerFrameHandler; + + +// JIP Detection and event trigger. Run this at the very end, just in case anything uses it +if(isNull player) then { + // We are jipping! Get ready and wait, and throw the event + [{ + PARAMS_2(_args,_handle); + + if(!isNull player) then { + ["PlayerJip", [player] ] call FUNC(localEvent); + [_handle] call cba_fnc_removePerFrameHandler; + }; + }, 0, []] call cba_fnc_addPerFrameHandler; +}; + + + diff --git a/addons/common/functions/fnc__handleRequestAllSyncedEvents.sqf b/addons/common/functions/fnc__handleRequestAllSyncedEvents.sqf new file mode 100644 index 0000000000..62981092fb --- /dev/null +++ b/addons/common/functions/fnc__handleRequestAllSyncedEvents.sqf @@ -0,0 +1,23 @@ +/* + * Author: jaynus + * + * + * Argument: + * + * Return value: + * Boolean of success + */ +#define DEBUG_MODE_FULL +#include "script_component.hpp" +PARAMS_1(_client); + +{ + private["_eventName", "_eventEntry", "_eventLog"]; + _eventName = _x; + _eventEntry = HASH_GET(GVAR(syncedEvents),_eventName); + _eventLog = _eventEntry select 1; + + ["SEH_s", _client, [_eventName, _eventLog] ] call FUNC(targetEvent); +} forEach (GVAR(syncedEvents) select 0); + +true \ No newline at end of file diff --git a/addons/common/functions/fnc__handleRequestSyncedEvent.sqf b/addons/common/functions/fnc__handleRequestSyncedEvent.sqf index 643ce40916..c9b81f8ef7 100644 --- a/addons/common/functions/fnc__handleRequestSyncedEvent.sqf +++ b/addons/common/functions/fnc__handleRequestSyncedEvent.sqf @@ -7,7 +7,7 @@ * Return value: * Boolean of success */ - #define DEBUG_MODE_FULL +#define DEBUG_MODE_FULL #include "script_component.hpp" //SEH_s From da09b74fe4bfcdc663f5c977e451f9c5c8b5b90e Mon Sep 17 00:00:00 2001 From: jaynus Date: Fri, 17 Apr 2015 18:27:35 -0700 Subject: [PATCH 214/305] Don't JIP check server side, but still have it fire for HC. --- addons/common/XEH_postInit.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index d228d77d7b..34ada15480 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -204,7 +204,7 @@ if(!isServer) then{ // JIP Detection and event trigger. Run this at the very end, just in case anything uses it -if(isNull player) then { +if(!isServer && {isNull player}) then { // We are jipping! Get ready and wait, and throw the event [{ PARAMS_2(_args,_handle); From 93d03b404fdef3153a6d689cf8c87e2e713340db Mon Sep 17 00:00:00 2001 From: jaynus Date: Fri, 17 Apr 2015 19:26:27 -0700 Subject: [PATCH 215/305] JIP Sync events complete. --- addons/common/XEH_postInit.sqf | 49 +++++++++++-------- addons/common/XEH_preInit.sqf | 5 +- .../fnc__handleRequestAllSyncedEvents.sqf | 4 +- .../fnc__handleRequestSyncedEvent.sqf | 14 ++++-- .../functions/fnc__handleSyncedEvent.sqf | 14 +++--- .../functions/fnc_addSyncedEventHandler.sqf | 2 +- .../functions/fnc_requestSyncedEvent.sqf | 4 +- addons/common/functions/fnc_syncedEvent.sqf | 2 +- 8 files changed, 58 insertions(+), 36 deletions(-) diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 34ada15480..2a20c0204d 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -65,9 +65,31 @@ if (_currentVersion != _previousVersion) then { 0 spawn COMPILE_FILE(scripts\Version\checkVersionNumber); +// ACE events "ACEg" addPublicVariableEventHandler { _this call FUNC(_handleNetEvent); }; "ACEc" addPublicVariableEventHandler { _this call FUNC(_handleNetEvent); }; +// Synced ACE events +// Handle JIP scenario +if(!isServer) then { + ["PlayerJip", { + diag_log text format["[ACE] * JIP event synchronization initialized"]; + ["SEH_all", [player]] call FUNC(serverEvent); + }] call FUNC(addEventHandler); +} else { + ["SEH_all", FUNC(_handleRequestAllSyncedEvents)] call FUNC(addEventHandler); +}; +["SEH", FUNC(_handleSyncedEvent)] call FUNC(addEventHandler); +["SEH_s", FUNC(_handleRequestSyncedEvent)] call FUNC(addEventHandler); +[FUNC(syncedEventPFH), 0.5, []] call cba_fnc_addPerFrameHandler; + + +/***************************************************************/ +/***************************************************************/ +/***************************************************************/ +/***************************************************************/ +/***************************************************************/ + // everything that only player controlled machines need, goes below this if (!hasInterface) exitWith {}; @@ -87,7 +109,7 @@ enableCamShake true; // Set the name for the current player ["playerChanged", { EXPLODE_2_PVT(_this,_newPlayer,_oldPlayer); - diag_log text format["PLAYER CHANGED!", _this]; + if (alive _newPlayer) then { [_newPlayer] call FUNC(setName) }; @@ -188,30 +210,15 @@ GVAR(OldPlayerWeapon) = currentWeapon ACE_player; {!((_this select 0) isEqualTo (_this select 1)) && {vehicle (_this select 0) == vehicle (_this select 1)}} }] call FUNC(addCanInteractWithCondition); -// Synced ACE events -// Handle JIP scenario -if(!isServer) then{ - ["PlayerJip", { - diag_log text format["[ACE] - JIP event synchronization initialized"]; - ["SEH_all", [player]] call FUNC(serverEvent); - }] call FUNC(addEventHandler); -} else { - ["SEH_all", FUNC(_handleRequestAllSyncedEvents)] call FUNC(addEventHandler); -}; -["SEH", FUNC(_handleSyncedEvent)] call FUNC(addEventHandler); -["SEH_s", FUNC(_handleRequestSyncedEvent)] call FUNC(addEventHandler); -[FUNC(syncedEventPFH), 0.5, []] call cba_fnc_addPerFrameHandler; - - +// Lastly, do JIP events // JIP Detection and event trigger. Run this at the very end, just in case anything uses it -if(!isServer && {isNull player}) then { +if(isMultiplayer && { time > 0 || isNull player } ) then { // We are jipping! Get ready and wait, and throw the event [{ - PARAMS_2(_args,_handle); - - if(!isNull player) then { + diag_log text format["JIP Detected, waiting"]; + if(!(isNull player)) then { ["PlayerJip", [player] ] call FUNC(localEvent); - [_handle] call cba_fnc_removePerFrameHandler; + [(_this select 1)] call cba_fnc_removePerFrameHandler; }; }, 0, []] call cba_fnc_addPerFrameHandler; }; diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 5bacea7505..077d69578b 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -273,10 +273,13 @@ PREP(hashListPush); PREP(syncedEventPFH); PREP(addSyncedEventHandler); PREP(removeSyncedEventHandler); +PREP(requestSyncedEvent); PREP(syncedEvent); + PREP(_handleSyncedEvent); PREP(_handleRequestSyncedEvent); -PREP(requestSyncedEvent); +PREP(_handleRequestAllSyncedEvents); + GVAR(syncedEvents) = HASH_CREATE; // @TODO: Generic local-managed global-synced objects (createVehicleLocal) diff --git a/addons/common/functions/fnc__handleRequestAllSyncedEvents.sqf b/addons/common/functions/fnc__handleRequestAllSyncedEvents.sqf index 62981092fb..7c566ce4d1 100644 --- a/addons/common/functions/fnc__handleRequestAllSyncedEvents.sqf +++ b/addons/common/functions/fnc__handleRequestAllSyncedEvents.sqf @@ -1,13 +1,15 @@ /* * Author: jaynus * + * Handles a server-side request for synchronization ALL events on JIP to a client. * * Argument: + * 0: client (object) * * Return value: * Boolean of success */ -#define DEBUG_MODE_FULL +//#define DEBUG_MODE_FULL #include "script_component.hpp" PARAMS_1(_client); diff --git a/addons/common/functions/fnc__handleRequestSyncedEvent.sqf b/addons/common/functions/fnc__handleRequestSyncedEvent.sqf index c9b81f8ef7..2d58aae869 100644 --- a/addons/common/functions/fnc__handleRequestSyncedEvent.sqf +++ b/addons/common/functions/fnc__handleRequestSyncedEvent.sqf @@ -1,13 +1,20 @@ /* * Author: jaynus + * + * Receives either requests for synchronization from clients, or the synchronization data from the server. * - * - * Argument: + * Arguments [Client] : + * 0: eventName (String) + * 1: eventLog (Array) + * + * Arguments [Server] : + * 0: eventName (String) + * 1: client (Object) * * Return value: * Boolean of success */ -#define DEBUG_MODE_FULL +//#define DEBUG_MODE_FULL #include "script_component.hpp" //SEH_s @@ -32,6 +39,7 @@ if(isServer) then { _eventArgs = _x select 1; [_eventName, _eventArgs, (_x select 2)] call FUNC(_handleSyncedEvent); } forEach _eventLog; + diag_log text format["[ACE] + [%1] synchronized", _eventName]; }; true \ No newline at end of file diff --git a/addons/common/functions/fnc__handleSyncedEvent.sqf b/addons/common/functions/fnc__handleSyncedEvent.sqf index 14dfc32bae..9807896358 100644 --- a/addons/common/functions/fnc__handleSyncedEvent.sqf +++ b/addons/common/functions/fnc__handleSyncedEvent.sqf @@ -1,17 +1,17 @@ /* * Author: jaynus + * + * Handles synced events being received. Server will log them, and server/client will execute them. * - * Call and propegate a synced event - * - * Argument: - * 0: Name (String) - * 1: Arguments (Array) - * 2: TTL (Number or Code) [Optional] + * Arguments [Client] : + * 0: eventName (String) + * 1: arguments (Array) + * 2: ttl (Scalar) * * Return value: * Boolean of success */ -#define DEBUG_MODE_FULL +//#define DEBUG_MODE_FULL #include "script_component.hpp" PARAMS_3(_name,_args,_ttl); private["_internalData", "_eventLog", "_eventCode"]; diff --git a/addons/common/functions/fnc_addSyncedEventHandler.sqf b/addons/common/functions/fnc_addSyncedEventHandler.sqf index ab9d8bb829..5d2b221178 100644 --- a/addons/common/functions/fnc_addSyncedEventHandler.sqf +++ b/addons/common/functions/fnc_addSyncedEventHandler.sqf @@ -11,7 +11,7 @@ * Return value: * Boolean of success */ -#define DEBUG_MODE_FULL +//#define DEBUG_MODE_FULL #include "script_component.hpp" PARAMS_2(_name,_handler); diff --git a/addons/common/functions/fnc_requestSyncedEvent.sqf b/addons/common/functions/fnc_requestSyncedEvent.sqf index f18c3542b5..dea0c7adef 100644 --- a/addons/common/functions/fnc_requestSyncedEvent.sqf +++ b/addons/common/functions/fnc_requestSyncedEvent.sqf @@ -1,13 +1,15 @@ /* * Author: jaynus * + * Send a request to synchronize an event name from the client->server. Execute on client only. * * Argument: + * 0: eventName (String) * * Return value: * Boolean of success */ -#define DEBUG_MODE_FULL +//#define DEBUG_MODE_FULL #include "script_component.hpp" PARAMS_1(_eventName); diff --git a/addons/common/functions/fnc_syncedEvent.sqf b/addons/common/functions/fnc_syncedEvent.sqf index 43f4feb5bd..70c30a19da 100644 --- a/addons/common/functions/fnc_syncedEvent.sqf +++ b/addons/common/functions/fnc_syncedEvent.sqf @@ -11,7 +11,7 @@ * Return value: * Boolean of success */ -#define DEBUG_MODE_FULL +//#define DEBUG_MODE_FULL #include "script_component.hpp" PARAMS_2(_name,_args); private["_ttl", "_eventData", "_internalData", "_eventLog"]; From 32df4a2adcd827eff4b0cf3cff08f2b240571c9f Mon Sep 17 00:00:00 2001 From: jaynus Date: Fri, 17 Apr 2015 19:33:07 -0700 Subject: [PATCH 216/305] synced events implemented into litter. --- addons/medical/XEH_postInit.sqf | 4 + addons/medical/XEH_preInit.sqf | 5 +- .../functions/fnc__handleCreateLitter.sqf | 115 ++++++++++++++++++ addons/medical/functions/fnc_createLitter.sqf | 103 +--------------- 4 files changed, 127 insertions(+), 100 deletions(-) create mode 100644 addons/medical/functions/fnc__handleCreateLitter.sqf diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index 309bb2a888..68e3b7965b 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -265,3 +265,7 @@ if (USE_WOUND_EVENT_SYNC) then { ["playerInventoryChanged", { [ACE_player] call FUNC(itemCheck); }] call EFUNC(common,addEventHandler); + + +// Synchronized litter creation +[QGVAR(createLitter), FUNC(_handleCreateLitter)] call EFUNC(common,addEventHandler); \ No newline at end of file diff --git a/addons/medical/XEH_preInit.sqf b/addons/medical/XEH_preInit.sqf index f15b4ec109..bdfbedb429 100644 --- a/addons/medical/XEH_preInit.sqf +++ b/addons/medical/XEH_preInit.sqf @@ -21,7 +21,6 @@ PREP(adjustPainLevel); PREP(canAccessMedicalEquipment); PREP(canTreat); PREP(canTreatCached); -PREP(createLitter); PREP(determineIfFatal); PREP(getBloodLoss); PREP(getBloodPressure); @@ -98,6 +97,10 @@ PREP(moduleTreatmentConfiguration); PREP(copyDeadBody); PREP(requestWoundSync); +// Litter handling functionality test +PREP(createLitter); +PREP(_handleCreateLitter); + GVAR(injuredUnitCollection) = []; GVAR(IVBags) = []; diff --git a/addons/medical/functions/fnc__handleCreateLitter.sqf b/addons/medical/functions/fnc__handleCreateLitter.sqf new file mode 100644 index 0000000000..e7751e153b --- /dev/null +++ b/addons/medical/functions/fnc__handleCreateLitter.sqf @@ -0,0 +1,115 @@ +/* + * Author: Glowbal + * Spawns litter for the treatment action on the ground around the target + * + * Arguments: + * 0: The target + * 1: The treatment classname + * + * Return Value: + * + * + * Public: No + */ + +#include "script_component.hpp" + +#define MIN_ENTRIES_LITTER_CONFIG 3 + +if(hasInterface) then { + private ["_config", "_litter", "_createLitter", "_litterObject", "_position", "_createdLitter"]; + PARAMS_6(_caller,_target,_selectionName,_className,_usersOfItems); + + _caller = _this select 0; + _target = _this select 1; + _selectionName = _this select 2; + _className = _this select 3; + _usersOfItems = _this select 5; + + if !(GVAR(allowLitterCreation)) exitwith {}; + if (vehicle _caller != _caller || vehicle _target != _target) exitwith {}; + + _config = (configFile >> "ACE_Medical_Actions" >> "Basic" >> _className); + if (GVAR(level) >= 2) then { + _config = (configFile >> "ACE_Medical_Actions" >> "Advanced" >> _className); + }; + if !(isClass _config) exitwith {false}; + + + if !(isArray (_config >> "litter")) exitwith {}; + _litter = getArray (_config >> "litter"); + + _createLitter = { + _position = getPos (_this select 0); + _litterClass = _this select 1; + _litterObject = createVehicle [_litterClass, _position, [], 0, "NONE"]; + if (random(1) >= 0.5) then { + _litterObject setPos [(_position select 0) + random 2, (_position select 1) + random 2, _position select 2]; + } else { + _litterObject setPos [(_position select 0) - random 2, (_position select 1) - random 2, _position select 2]; + }; + _litterObject setDir (random 360); + _litterObject; + }; + + if (isnil QGVAR(allCreatedLitter)) then { + GVAR(allCreatedLitter) = []; + GVAR(litterPFHRunning) = false; + }; + + _createdLitter = []; + { + if (typeName _x == "ARRAY") then { + if (count _x < MIN_ENTRIES_LITTER_CONFIG) exitwith {}; + private ["_selection", "_litterCondition", "_litterOptions"]; + _selection = _x select 0; + if (toLower _selection in [toLower _selectionName, "all"]) then { // in is case sensitve. We can be forgiving here, so lets use toLower. + _litterCondition = _x select 1; + _litterOptions = _x select 2; + + if (isnil _litterCondition) then { + _litterCondition = if (_litterCondition != "") then {compile _litterCondition} else {{true}}; + } else { + _litterCondition = missionNamespace getvariable _litterCondition; + }; + if !([_caller, _target, _selectionName, _className, _usersOfItems] call _litterCondition) exitwith {}; + + if (typeName _litterOptions == "ARRAY") then { + // Loop through through the litter options and place the litter + { + if (typeName _x == "ARRAY" && {(count _x > 0)}) then { + _createdLitter pushback ([_target, _x select (floor(random(count _x)))] call _createLitter); + }; + if (typeName _x == "STRING") then { + _createdLitter pushback ([_target, _x] call _createLitter); + }; + }foreach _litterOptions; + }; + }; + }; + }foreach _litter; + + if (GVAR(litterCleanUpDelay) >= 0) then { + GVAR(allCreatedLitter) pushback [time, GVAR(litterCleanUpDelay), _createdLitter]; + }; + + if !(GVAR(litterPFHRunning)) then { + GVAR(litterPFHRunning) = true; + [{ + { + if (time - (_x select 0) >= (_x select 1)) then { + { + deleteVehicle _x; + }foreach (_this select 2); + GVAR(allCreatedLitter) set[_foreachIndex, objNull]; + }; + }foreach GVAR(allCreatedLitter); + GVAR(allCreatedLitter) = GVAR(allCreatedLitter) - [objNull]; + + if (count GVAR(allCreatedLitter) == 0) exitwith { + GVAR(litterPFHRunning) = false; + [_this select 1] call CBA_fnc_removePerFrameHandler; + }; + }, 30, []] call CBA_fnc_addPerFrameHandler; + }; +}; \ No newline at end of file diff --git a/addons/medical/functions/fnc_createLitter.sqf b/addons/medical/functions/fnc_createLitter.sqf index 570c6d63d3..edc16c186e 100644 --- a/addons/medical/functions/fnc_createLitter.sqf +++ b/addons/medical/functions/fnc_createLitter.sqf @@ -1,10 +1,8 @@ /* - * Author: Glowbal - * Spawns litter for the treatment action on the ground around the target + * Author: jaynus * * Arguments: - * 0: The target - * 1: The treatment classname + * * * Return Value: * @@ -14,98 +12,5 @@ #include "script_component.hpp" -#define MIN_ENTRIES_LITTER_CONFIG 3 - -private ["_target", "_className", "_config", "_litter", "_createLitter", "_litterObject", "_position", "_createdLitter"]; -_caller = _this select 0; -_target = _this select 1; -_selectionName = _this select 2; -_className = _this select 3; -_usersOfItems = _this select 5; - -if !(GVAR(allowLitterCreation)) exitwith {}; -if (vehicle _caller != _caller || vehicle _target != _target) exitwith {}; - -_config = (configFile >> "ACE_Medical_Actions" >> "Basic" >> _className); -if (GVAR(level) >= 2) then { - _config = (configFile >> "ACE_Medical_Actions" >> "Advanced" >> _className); -}; -if !(isClass _config) exitwith {false}; - - -if !(isArray (_config >> "litter")) exitwith {}; -_litter = getArray (_config >> "litter"); - -_createLitter = { - _position = getPos (_this select 0); - _litterClass = _this select 1; - _litterObject = createVehicle [_litterClass, _position, [], 0, "NONE"]; - if (random(1) >= 0.5) then { - _litterObject setPos [(_position select 0) + random 2, (_position select 1) + random 2, _position select 2]; - } else { - _litterObject setPos [(_position select 0) - random 2, (_position select 1) - random 2, _position select 2]; - }; - _litterObject setDir (random 360); - _litterObject; -}; - -if (isnil QGVAR(allCreatedLitter)) then { - GVAR(allCreatedLitter) = []; - GVAR(litterPFHRunning) = false; -}; - -_createdLitter = []; -{ - if (typeName _x == "ARRAY") then { - if (count _x < MIN_ENTRIES_LITTER_CONFIG) exitwith {}; - private ["_selection", "_litterCondition", "_litterOptions"]; - _selection = _x select 0; - if (toLower _selection in [toLower _selectionName, "all"]) then { // in is case sensitve. We can be forgiving here, so lets use toLower. - _litterCondition = _x select 1; - _litterOptions = _x select 2; - - if (isnil _litterCondition) then { - _litterCondition = if (_litterCondition != "") then {compile _litterCondition} else {{true}}; - } else { - _litterCondition = missionNamespace getvariable _litterCondition; - }; - if !([_caller, _target, _selectionName, _className, _usersOfItems] call _litterCondition) exitwith {}; - - if (typeName _litterOptions == "ARRAY") then { - // Loop through through the litter options and place the litter - { - if (typeName _x == "ARRAY" && {(count _x > 0)}) then { - _createdLitter pushback ([_target, _x select (floor(random(count _x)))] call _createLitter); - }; - if (typeName _x == "STRING") then { - _createdLitter pushback ([_target, _x] call _createLitter); - }; - }foreach _litterOptions; - }; - }; - }; -}foreach _litter; - -if (GVAR(litterCleanUpDelay) >= 0) then { - GVAR(allCreatedLitter) pushback [time, GVAR(litterCleanUpDelay), _createdLitter]; -}; - -if !(GVAR(litterPFHRunning)) then { - GVAR(litterPFHRunning) = true; - [{ - { - if (time - (_x select 0) >= (_x select 1)) then { - { - deleteVehicle _x; - }foreach (_this select 2); - GVAR(allCreatedLitter) set[_foreachIndex, objNull]; - }; - }foreach GVAR(allCreatedLitter); - GVAR(allCreatedLitter) = GVAR(allCreatedLitter) - [objNull]; - - if (count GVAR(allCreatedLitter) == 0) exitwith { - GVAR(litterPFHRunning) = false; - [_this select 1] call CBA_fnc_removePerFrameHandler; - }; - }, 30, []] call CBA_fnc_addPerFrameHandler; -}; +// Create a synchronized, 30 second TTL event for litter +[QGVAR(createLitter), _this, 30] call EFUNC(common,syncedEvent); \ No newline at end of file From c952a97de83ba462ffcb76630af1addfe6e2ba40 Mon Sep 17 00:00:00 2001 From: jaynus Date: Fri, 17 Apr 2015 19:38:05 -0700 Subject: [PATCH 217/305] Revert "synced events implemented into litter." This reverts commit 32df4a2adcd827eff4b0cf3cff08f2b240571c9f. --- addons/medical/XEH_postInit.sqf | 4 - addons/medical/XEH_preInit.sqf | 5 +- .../functions/fnc__handleCreateLitter.sqf | 115 ------------------ addons/medical/functions/fnc_createLitter.sqf | 103 +++++++++++++++- 4 files changed, 100 insertions(+), 127 deletions(-) delete mode 100644 addons/medical/functions/fnc__handleCreateLitter.sqf diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index 68e3b7965b..309bb2a888 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -265,7 +265,3 @@ if (USE_WOUND_EVENT_SYNC) then { ["playerInventoryChanged", { [ACE_player] call FUNC(itemCheck); }] call EFUNC(common,addEventHandler); - - -// Synchronized litter creation -[QGVAR(createLitter), FUNC(_handleCreateLitter)] call EFUNC(common,addEventHandler); \ No newline at end of file diff --git a/addons/medical/XEH_preInit.sqf b/addons/medical/XEH_preInit.sqf index bdfbedb429..f15b4ec109 100644 --- a/addons/medical/XEH_preInit.sqf +++ b/addons/medical/XEH_preInit.sqf @@ -21,6 +21,7 @@ PREP(adjustPainLevel); PREP(canAccessMedicalEquipment); PREP(canTreat); PREP(canTreatCached); +PREP(createLitter); PREP(determineIfFatal); PREP(getBloodLoss); PREP(getBloodPressure); @@ -97,10 +98,6 @@ PREP(moduleTreatmentConfiguration); PREP(copyDeadBody); PREP(requestWoundSync); -// Litter handling functionality test -PREP(createLitter); -PREP(_handleCreateLitter); - GVAR(injuredUnitCollection) = []; GVAR(IVBags) = []; diff --git a/addons/medical/functions/fnc__handleCreateLitter.sqf b/addons/medical/functions/fnc__handleCreateLitter.sqf deleted file mode 100644 index e7751e153b..0000000000 --- a/addons/medical/functions/fnc__handleCreateLitter.sqf +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Author: Glowbal - * Spawns litter for the treatment action on the ground around the target - * - * Arguments: - * 0: The target - * 1: The treatment classname - * - * Return Value: - * - * - * Public: No - */ - -#include "script_component.hpp" - -#define MIN_ENTRIES_LITTER_CONFIG 3 - -if(hasInterface) then { - private ["_config", "_litter", "_createLitter", "_litterObject", "_position", "_createdLitter"]; - PARAMS_6(_caller,_target,_selectionName,_className,_usersOfItems); - - _caller = _this select 0; - _target = _this select 1; - _selectionName = _this select 2; - _className = _this select 3; - _usersOfItems = _this select 5; - - if !(GVAR(allowLitterCreation)) exitwith {}; - if (vehicle _caller != _caller || vehicle _target != _target) exitwith {}; - - _config = (configFile >> "ACE_Medical_Actions" >> "Basic" >> _className); - if (GVAR(level) >= 2) then { - _config = (configFile >> "ACE_Medical_Actions" >> "Advanced" >> _className); - }; - if !(isClass _config) exitwith {false}; - - - if !(isArray (_config >> "litter")) exitwith {}; - _litter = getArray (_config >> "litter"); - - _createLitter = { - _position = getPos (_this select 0); - _litterClass = _this select 1; - _litterObject = createVehicle [_litterClass, _position, [], 0, "NONE"]; - if (random(1) >= 0.5) then { - _litterObject setPos [(_position select 0) + random 2, (_position select 1) + random 2, _position select 2]; - } else { - _litterObject setPos [(_position select 0) - random 2, (_position select 1) - random 2, _position select 2]; - }; - _litterObject setDir (random 360); - _litterObject; - }; - - if (isnil QGVAR(allCreatedLitter)) then { - GVAR(allCreatedLitter) = []; - GVAR(litterPFHRunning) = false; - }; - - _createdLitter = []; - { - if (typeName _x == "ARRAY") then { - if (count _x < MIN_ENTRIES_LITTER_CONFIG) exitwith {}; - private ["_selection", "_litterCondition", "_litterOptions"]; - _selection = _x select 0; - if (toLower _selection in [toLower _selectionName, "all"]) then { // in is case sensitve. We can be forgiving here, so lets use toLower. - _litterCondition = _x select 1; - _litterOptions = _x select 2; - - if (isnil _litterCondition) then { - _litterCondition = if (_litterCondition != "") then {compile _litterCondition} else {{true}}; - } else { - _litterCondition = missionNamespace getvariable _litterCondition; - }; - if !([_caller, _target, _selectionName, _className, _usersOfItems] call _litterCondition) exitwith {}; - - if (typeName _litterOptions == "ARRAY") then { - // Loop through through the litter options and place the litter - { - if (typeName _x == "ARRAY" && {(count _x > 0)}) then { - _createdLitter pushback ([_target, _x select (floor(random(count _x)))] call _createLitter); - }; - if (typeName _x == "STRING") then { - _createdLitter pushback ([_target, _x] call _createLitter); - }; - }foreach _litterOptions; - }; - }; - }; - }foreach _litter; - - if (GVAR(litterCleanUpDelay) >= 0) then { - GVAR(allCreatedLitter) pushback [time, GVAR(litterCleanUpDelay), _createdLitter]; - }; - - if !(GVAR(litterPFHRunning)) then { - GVAR(litterPFHRunning) = true; - [{ - { - if (time - (_x select 0) >= (_x select 1)) then { - { - deleteVehicle _x; - }foreach (_this select 2); - GVAR(allCreatedLitter) set[_foreachIndex, objNull]; - }; - }foreach GVAR(allCreatedLitter); - GVAR(allCreatedLitter) = GVAR(allCreatedLitter) - [objNull]; - - if (count GVAR(allCreatedLitter) == 0) exitwith { - GVAR(litterPFHRunning) = false; - [_this select 1] call CBA_fnc_removePerFrameHandler; - }; - }, 30, []] call CBA_fnc_addPerFrameHandler; - }; -}; \ No newline at end of file diff --git a/addons/medical/functions/fnc_createLitter.sqf b/addons/medical/functions/fnc_createLitter.sqf index edc16c186e..570c6d63d3 100644 --- a/addons/medical/functions/fnc_createLitter.sqf +++ b/addons/medical/functions/fnc_createLitter.sqf @@ -1,8 +1,10 @@ /* - * Author: jaynus + * Author: Glowbal + * Spawns litter for the treatment action on the ground around the target * * Arguments: - * + * 0: The target + * 1: The treatment classname * * Return Value: * @@ -12,5 +14,98 @@ #include "script_component.hpp" -// Create a synchronized, 30 second TTL event for litter -[QGVAR(createLitter), _this, 30] call EFUNC(common,syncedEvent); \ No newline at end of file +#define MIN_ENTRIES_LITTER_CONFIG 3 + +private ["_target", "_className", "_config", "_litter", "_createLitter", "_litterObject", "_position", "_createdLitter"]; +_caller = _this select 0; +_target = _this select 1; +_selectionName = _this select 2; +_className = _this select 3; +_usersOfItems = _this select 5; + +if !(GVAR(allowLitterCreation)) exitwith {}; +if (vehicle _caller != _caller || vehicle _target != _target) exitwith {}; + +_config = (configFile >> "ACE_Medical_Actions" >> "Basic" >> _className); +if (GVAR(level) >= 2) then { + _config = (configFile >> "ACE_Medical_Actions" >> "Advanced" >> _className); +}; +if !(isClass _config) exitwith {false}; + + +if !(isArray (_config >> "litter")) exitwith {}; +_litter = getArray (_config >> "litter"); + +_createLitter = { + _position = getPos (_this select 0); + _litterClass = _this select 1; + _litterObject = createVehicle [_litterClass, _position, [], 0, "NONE"]; + if (random(1) >= 0.5) then { + _litterObject setPos [(_position select 0) + random 2, (_position select 1) + random 2, _position select 2]; + } else { + _litterObject setPos [(_position select 0) - random 2, (_position select 1) - random 2, _position select 2]; + }; + _litterObject setDir (random 360); + _litterObject; +}; + +if (isnil QGVAR(allCreatedLitter)) then { + GVAR(allCreatedLitter) = []; + GVAR(litterPFHRunning) = false; +}; + +_createdLitter = []; +{ + if (typeName _x == "ARRAY") then { + if (count _x < MIN_ENTRIES_LITTER_CONFIG) exitwith {}; + private ["_selection", "_litterCondition", "_litterOptions"]; + _selection = _x select 0; + if (toLower _selection in [toLower _selectionName, "all"]) then { // in is case sensitve. We can be forgiving here, so lets use toLower. + _litterCondition = _x select 1; + _litterOptions = _x select 2; + + if (isnil _litterCondition) then { + _litterCondition = if (_litterCondition != "") then {compile _litterCondition} else {{true}}; + } else { + _litterCondition = missionNamespace getvariable _litterCondition; + }; + if !([_caller, _target, _selectionName, _className, _usersOfItems] call _litterCondition) exitwith {}; + + if (typeName _litterOptions == "ARRAY") then { + // Loop through through the litter options and place the litter + { + if (typeName _x == "ARRAY" && {(count _x > 0)}) then { + _createdLitter pushback ([_target, _x select (floor(random(count _x)))] call _createLitter); + }; + if (typeName _x == "STRING") then { + _createdLitter pushback ([_target, _x] call _createLitter); + }; + }foreach _litterOptions; + }; + }; + }; +}foreach _litter; + +if (GVAR(litterCleanUpDelay) >= 0) then { + GVAR(allCreatedLitter) pushback [time, GVAR(litterCleanUpDelay), _createdLitter]; +}; + +if !(GVAR(litterPFHRunning)) then { + GVAR(litterPFHRunning) = true; + [{ + { + if (time - (_x select 0) >= (_x select 1)) then { + { + deleteVehicle _x; + }foreach (_this select 2); + GVAR(allCreatedLitter) set[_foreachIndex, objNull]; + }; + }foreach GVAR(allCreatedLitter); + GVAR(allCreatedLitter) = GVAR(allCreatedLitter) - [objNull]; + + if (count GVAR(allCreatedLitter) == 0) exitwith { + GVAR(litterPFHRunning) = false; + [_this select 1] call CBA_fnc_removePerFrameHandler; + }; + }, 30, []] call CBA_fnc_addPerFrameHandler; +}; From 71e62711c6cbdf149a180508254906f06dfd73a8 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 17 Apr 2015 22:02:23 -0500 Subject: [PATCH 218/305] #731 - stop error if target offscreen --- addons/common/functions/fnc_worldToScreenBounds.sqf | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/addons/common/functions/fnc_worldToScreenBounds.sqf b/addons/common/functions/fnc_worldToScreenBounds.sqf index 7b88350c6a..afb5817d81 100644 --- a/addons/common/functions/fnc_worldToScreenBounds.sqf +++ b/addons/common/functions/fnc_worldToScreenBounds.sqf @@ -40,12 +40,13 @@ if (true) then { { _ppos = worldToScreen (_object modelToWorld _x); - _pposX = _ppos select 0; - _pposY = _ppos select 1; - if (_pposX < _minX) then {_minX = _pposX}; - if (_pposX > _maxX) then {_maxX = _pposX}; - if (_pposY < _minY) then {_minY = _pposY}; - if (_pposY > _maxY) then {_maxY = _pposY}; + if (count _ppos >= 2) then { + EXPLODE_2_PVT(_ppos,_pposX,_pposY); + if (_pposX < _minX) then {_minX = _pposX}; + if (_pposX > _maxX) then {_maxX = _pposX}; + if (_pposY < _minY) then {_minY = _pposY}; + if (_pposY > _maxY) then {_maxY = _pposY}; + }; //else - what to do if it is offscreen? } forEach _boundsCorners; }; From caef5c105f9cd290bc1cc34d552d55a2d09c0a70 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 17 Apr 2015 22:40:37 -0500 Subject: [PATCH 219/305] More Privates --- addons/goggles/XEH_postInit.sqf | 1 + addons/goggles/functions/fnc_applyDirtEffect.sqf | 2 +- addons/goggles/functions/fnc_clearGlasses.sqf | 3 ++- addons/goggles/functions/fnc_getExplosionIndex.sqf | 2 +- addons/goggles/functions/fnc_isGogglesVisible.sqf | 6 ++++-- addons/hearing/functions/fnc_firedNear.sqf | 2 +- addons/hearing/functions/fnc_moduleHearing.sqf | 3 +-- addons/hearing/functions/fnc_updateVolume.sqf | 2 ++ addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf | 2 ++ addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf | 2 +- addons/logistics_wirecutter/functions/fnc_interactEH.sqf | 2 +- addons/magazinerepack/functions/fnc_getMagazineChildren.sqf | 2 +- .../magazinerepack/functions/fnc_simulateRepackEvents.sqf | 2 +- addons/map/functions/fnc_blueForceTrackingModule.sqf | 4 +--- addons/map/functions/fnc_blueForceTrackingUpdate.sqf | 2 ++ addons/map/functions/fnc_determineMapLight.sqf | 2 +- addons/map/functions/fnc_determineZoom.sqf | 2 +- addons/map/functions/fnc_moduleMap.sqf | 3 +-- addons/overheating/functions/fnc_checkTemperature.sqf | 2 ++ addons/overheating/functions/fnc_displayTemperature.sqf | 2 +- addons/overheating/functions/fnc_overheat.sqf | 5 ++--- addons/reload/functions/fnc_canCheckAmmo.sqf | 2 ++ addons/reload/functions/fnc_displayAmmo.sqf | 2 +- addons/reload/functions/fnc_startLinkingBelt.sqf | 4 ++-- 24 files changed, 35 insertions(+), 26 deletions(-) diff --git a/addons/goggles/XEH_postInit.sqf b/addons/goggles/XEH_postInit.sqf index ee62dfdd66..4fcf4fc055 100644 --- a/addons/goggles/XEH_postInit.sqf +++ b/addons/goggles/XEH_postInit.sqf @@ -56,6 +56,7 @@ FUNC(CheckGlasses) = { }; player addEventHandler ["Explosion", { + private "_effects"; if (alive ace_player) then { call FUNC(ApplyDirtEffect); if (GETBROKEN) exitWith {}; diff --git a/addons/goggles/functions/fnc_applyDirtEffect.sqf b/addons/goggles/functions/fnc_applyDirtEffect.sqf index 182ffac910..068f7639d2 100644 --- a/addons/goggles/functions/fnc_applyDirtEffect.sqf +++ b/addons/goggles/functions/fnc_applyDirtEffect.sqf @@ -16,7 +16,7 @@ #include "script_component.hpp" if (cameraOn != ace_player || {call FUNC(externalCamera)}) exitWith{false}; -private "_dirtImage"; +private ["_dirtImage", "_applied", "_effects"]; _effects = GETGLASSES(ace_player); _effects set [DIRT, true]; SETGLASSES(ace_player,_effects); diff --git a/addons/goggles/functions/fnc_clearGlasses.sqf b/addons/goggles/functions/fnc_clearGlasses.sqf index b70b962940..7fcb05a511 100644 --- a/addons/goggles/functions/fnc_clearGlasses.sqf +++ b/addons/goggles/functions/fnc_clearGlasses.sqf @@ -16,7 +16,8 @@ */ #include "script_component.hpp" -private "_broken"; +private ["_broken", "_effects"]; + _broken = GETBROKEN; _effects = GLASSESDEFAULT; _effects set [BROKEN, _broken]; diff --git a/addons/goggles/functions/fnc_getExplosionIndex.sqf b/addons/goggles/functions/fnc_getExplosionIndex.sqf index 5519bf397c..6e16085b2c 100644 --- a/addons/goggles/functions/fnc_getExplosionIndex.sqf +++ b/addons/goggles/functions/fnc_getExplosionIndex.sqf @@ -9,7 +9,7 @@ * The rating [0-3] * * Example: - * _rating = 0.05 call ace_goggles_fnc_getExplosionIndex; + * 0.05 call ace_goggles_fnc_getExplosionIndex; * * Public: No */ diff --git a/addons/goggles/functions/fnc_isGogglesVisible.sqf b/addons/goggles/functions/fnc_isGogglesVisible.sqf index 9206965995..253a82f0a3 100644 --- a/addons/goggles/functions/fnc_isGogglesVisible.sqf +++ b/addons/goggles/functions/fnc_isGogglesVisible.sqf @@ -14,8 +14,10 @@ * Public: Yes */ #include "script_component.hpp" -private ["_currentGlasses", "_result", "_unit"]; -_unit = _this select 0; + +PARAMS_1(_unit); + +private ["_currentGlasses", "_result", "_position", "_visible"]; _currentGlasses = goggles _unit; _result = false; diff --git a/addons/hearing/functions/fnc_firedNear.sqf b/addons/hearing/functions/fnc_firedNear.sqf index 72776b68c6..7e9472e72a 100644 --- a/addons/hearing/functions/fnc_firedNear.sqf +++ b/addons/hearing/functions/fnc_firedNear.sqf @@ -21,7 +21,7 @@ */ #include "script_component.hpp" -private ["_unit", "_firer", "_distance", "_weapon", "_muzzle", "_mode", "_ammo", "_silencer", "_audibleFireCoef", "_loudness", "_strength"]; +private ["_unit", "_firer", "_distance", "_weapon", "_muzzle", "_mode", "_ammo", "_silencer", "_audibleFireCoef", "_loudness", "_strength", "_audibleFire", "_audibleFireTime", "_audibleFireTimeCoef"]; _unit = _this select 0; _firer = _this select 1; diff --git a/addons/hearing/functions/fnc_moduleHearing.sqf b/addons/hearing/functions/fnc_moduleHearing.sqf index d7b43e0092..a560a712a6 100644 --- a/addons/hearing/functions/fnc_moduleHearing.sqf +++ b/addons/hearing/functions/fnc_moduleHearing.sqf @@ -10,8 +10,7 @@ */ #include "script_component.hpp" -_logic = _this select 0; -_activated = _this select 2; +PARAMS_3(_logic,_units,_activated); if !(_activated) exitWith {}; diff --git a/addons/hearing/functions/fnc_updateVolume.sqf b/addons/hearing/functions/fnc_updateVolume.sqf index dd51f30e19..a0ca6af457 100644 --- a/addons/hearing/functions/fnc_updateVolume.sqf +++ b/addons/hearing/functions/fnc_updateVolume.sqf @@ -18,6 +18,8 @@ #define STRENGHTODEAFNESS 3 #define MAXDEAFNESS 1.1 +private ["_recoverRate", "_volume"]; + // Exit if combat deafness is disabled if !(GVAR(enableCombatDeafness)) exitWith {}; diff --git a/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf b/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf index b5c6664657..6fda0fed10 100644 --- a/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf +++ b/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf @@ -18,6 +18,8 @@ PARAMS_2(_caller,_target); +private ["_onFinish", "_onFailure"]; + if (!(_this call FUNC(canRefuelUAV))) exitWith {}; _onFinish = { diff --git a/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf b/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf index 5153176de2..0cab7ab461 100644 --- a/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf +++ b/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf @@ -17,7 +17,7 @@ #include "script_component.hpp" #define SOUND_CLIP_TIME_SPACEING 1.5 -private ["_timeToCut"]; +private ["_timeToCut", "_progressCheck"]; PARAMS_2(_unit,_fenceObject); if (_unit != ACE_player) exitWith {}; diff --git a/addons/logistics_wirecutter/functions/fnc_interactEH.sqf b/addons/logistics_wirecutter/functions/fnc_interactEH.sqf index ddd180047c..efb8f292c9 100644 --- a/addons/logistics_wirecutter/functions/fnc_interactEH.sqf +++ b/addons/logistics_wirecutter/functions/fnc_interactEH.sqf @@ -25,7 +25,7 @@ if (_interactionType != 0) exitWith {}; if (!("ACE_wirecutter" in (items ace_player))) exitWith {}; [{ - private ["_fncStatement", "_attachedFence", "_fncCondition", "_helper"]; + private ["_fncStatement", "_attachedFence", "_fncCondition", "_helper", "_action"]; PARAMS_2(_args,_pfID); EXPLODE_3_PVT(_args,_setPosition,_addedHelpers,_fencesHelped); diff --git a/addons/magazinerepack/functions/fnc_getMagazineChildren.sqf b/addons/magazinerepack/functions/fnc_getMagazineChildren.sqf index 7a2b81371c..fbd07cf31a 100644 --- a/addons/magazinerepack/functions/fnc_getMagazineChildren.sqf +++ b/addons/magazinerepack/functions/fnc_getMagazineChildren.sqf @@ -28,7 +28,7 @@ _unitMagCounts = []; _xFullMagazineCount = getNumber (configfile >> "CfgMagazines" >> _xClassname >> "count"); //for every partial magazine, that is either in inventory or can be moved there - if ((_xCount < _xFullMagazineCount) && {_xCount > 0} && {(!_xLoaded) || {_player canAdd _magazineClassname}}) then { + if ((_xCount < _xFullMagazineCount) && {_xCount > 0} && {(!_xLoaded) || {_player canAdd _xClassname}}) then { _index = _unitMagazines find _xClassname; if (_index == -1) then { _unitMagazines pushBack _xClassname; diff --git a/addons/magazinerepack/functions/fnc_simulateRepackEvents.sqf b/addons/magazinerepack/functions/fnc_simulateRepackEvents.sqf index fb37a0dd4e..4ef69044da 100644 --- a/addons/magazinerepack/functions/fnc_simulateRepackEvents.sqf +++ b/addons/magazinerepack/functions/fnc_simulateRepackEvents.sqf @@ -19,7 +19,7 @@ */ #include "script_component.hpp" -private ["_newMagFnc", "_time", "_events", "_swapAmmoFnc", "_ammoSwaped", "_lowIndex", "_highIndex", "_ammoToTransfer", "_ammoAvailable", "_ammoNeeded"]; +private ["_newMagFnc", "_time", "_events", "_swapAmmoFnc", "_ammoSwaped", "_lowIndex", "_highIndex", "_ammoToTransfer", "_ammoAvailable", "_ammoNeeded", "_swapProgress"]; PARAMS_3(_fullMagazineCount,_arrayOfAmmoCounts,_isBelt); diff --git a/addons/map/functions/fnc_blueForceTrackingModule.sqf b/addons/map/functions/fnc_blueForceTrackingModule.sqf index cecfd348d2..c156c9527d 100644 --- a/addons/map/functions/fnc_blueForceTrackingModule.sqf +++ b/addons/map/functions/fnc_blueForceTrackingModule.sqf @@ -14,9 +14,7 @@ if !(hasInterface) exitWith {}; -_logic = _this select 0; -_units = _this select 1; -_activated = _this select 2; +PARAMS_3(_logic,_units,_activated); if !(_activated) exitWith {}; diff --git a/addons/map/functions/fnc_blueForceTrackingUpdate.sqf b/addons/map/functions/fnc_blueForceTrackingUpdate.sqf index 030daeaa36..edbe484f04 100644 --- a/addons/map/functions/fnc_blueForceTrackingUpdate.sqf +++ b/addons/map/functions/fnc_blueForceTrackingUpdate.sqf @@ -1,5 +1,7 @@ #include "script_component.hpp" +private ["_groupsToDrawMarkers", "_playerSide", "_anyPlayers", "_markerType", "_colour", "_marker"]; + // Delete last set of markers (always) { deleteMarkerLocal _x; diff --git a/addons/map/functions/fnc_determineMapLight.sqf b/addons/map/functions/fnc_determineMapLight.sqf index fbc847c313..a5168bd8a1 100644 --- a/addons/map/functions/fnc_determineMapLight.sqf +++ b/addons/map/functions/fnc_determineMapLight.sqf @@ -15,7 +15,7 @@ EXPLODE_1_PVT(_this,_unit); -private ["_isEnclosed","_nearObjects","_light","_ll","_flashlight"]; +private ["_isEnclosed","_nearObjects","_light","_ll","_flashlight", "_flareTint", "_lightTint", "_l"]; // Blend two colors _fnc_blendColor = { diff --git a/addons/map/functions/fnc_determineZoom.sqf b/addons/map/functions/fnc_determineZoom.sqf index fdc620b417..345fc68583 100644 --- a/addons/map/functions/fnc_determineZoom.sqf +++ b/addons/map/functions/fnc_determineZoom.sqf @@ -12,7 +12,7 @@ */ #include "script_component.hpp" -private ["_grids", "_fourSize", "_sixSize", "_continue", "_size"]; +private ["_grids", "_fourSize", "_sixSize", "_continue", "_size", "_i"]; _grids = configFile >> "CfgWorlds" >> worldName >> "Grid"; _fourSize = -1; _sixSize = -1; diff --git a/addons/map/functions/fnc_moduleMap.sqf b/addons/map/functions/fnc_moduleMap.sqf index a22bbbb385..4bcdb69269 100644 --- a/addons/map/functions/fnc_moduleMap.sqf +++ b/addons/map/functions/fnc_moduleMap.sqf @@ -10,8 +10,7 @@ */ #include "script_component.hpp" -_logic = _this select 0; -_activated = _this select 2; +PARAMS_3(_logic,_units,_activated); if !(_activated) exitWith {}; diff --git a/addons/overheating/functions/fnc_checkTemperature.sqf b/addons/overheating/functions/fnc_checkTemperature.sqf index 6c15068815..0b811f9792 100644 --- a/addons/overheating/functions/fnc_checkTemperature.sqf +++ b/addons/overheating/functions/fnc_checkTemperature.sqf @@ -18,6 +18,8 @@ EXPLODE_2_PVT(_this,_player,_weapon); +private ["_action"]; + // Play animation and report temperature _action = getText (configFile >> "CfgWeapons" >> _weapon >> "ACE_checkTemperatureAction"); diff --git a/addons/overheating/functions/fnc_displayTemperature.sqf b/addons/overheating/functions/fnc_displayTemperature.sqf index 6112bea178..3012e480e3 100644 --- a/addons/overheating/functions/fnc_displayTemperature.sqf +++ b/addons/overheating/functions/fnc_displayTemperature.sqf @@ -16,7 +16,7 @@ EXPLODE_2_PVT(_this,_player,_weapon); // Calculate cool down of weapon since last shot -private ["_string", "_overheat", "_temperature", "_time", "_barrelMass"]; +private ["_string", "_overheat", "_temperature", "_time", "_barrelMass", "_a"]; _string = format [QGVAR(%1), _weapon]; _overheat = _player getVariable [_string, [0, 0]]; _temperature = _overheat select 0; diff --git a/addons/overheating/functions/fnc_overheat.sqf b/addons/overheating/functions/fnc_overheat.sqf index 2468265f8f..05e5bbba9c 100644 --- a/addons/overheating/functions/fnc_overheat.sqf +++ b/addons/overheating/functions/fnc_overheat.sqf @@ -17,7 +17,8 @@ */ #include "\z\ace\addons\overheating\script_component.hpp" -private ["_unit", "_weapon", "_ammo", "_projectile"]; +private ["_unit", "_weapon", "_ammo", "_projectile", "_velocity", "_variableName", "_overheat", "_temperature", "_time", "_bulletMass", "_energyIncrement", "_barrelMass", "_scaledTemperature", "_intensity", "_position", "_direction", "_dispersion", "_count", "_slowdownFactor", "_jamChance", "_surface"]; + _unit = _this select 0; _weapon = _this select 1; _ammo = _this select 4; @@ -25,8 +26,6 @@ _projectile = _this select 6; _velocity = velocity _projectile; -private ["_variableName", "_overheat", "_temperature", "_time", "_energyIncrement", "_barrelMass", "_scaledTemperature"]; - // each weapon has it's own variable. Can't store the temperature in the weapon since they are not objects unfortunately. _variableName = format [QGVAR(%1), _weapon]; diff --git a/addons/reload/functions/fnc_canCheckAmmo.sqf b/addons/reload/functions/fnc_canCheckAmmo.sqf index 63c302bf07..4075e7a151 100644 --- a/addons/reload/functions/fnc_canCheckAmmo.sqf +++ b/addons/reload/functions/fnc_canCheckAmmo.sqf @@ -13,6 +13,8 @@ EXPLODE_2_PVT(_this,_player,_target); +private ["_magazineType", "_magazineCfg"]; + // Return true for static weapons if they have been fired once, @todo 1.40 this work-around doesn't work anymore if (_target isKindOf "StaticWeapon") exitWith { if (currentMagazine _target != "") exitWith {true}; diff --git a/addons/reload/functions/fnc_displayAmmo.sqf b/addons/reload/functions/fnc_displayAmmo.sqf index 77578caa68..06f3a39da3 100644 --- a/addons/reload/functions/fnc_displayAmmo.sqf +++ b/addons/reload/functions/fnc_displayAmmo.sqf @@ -14,7 +14,7 @@ EXPLODE_1_PVT(_this,_target); -private ["_weapon","_muzzle","_magazine","_showNumber","_ammo","_maxRounds","_count","_text","_color","_picture"]; +private ["_weapon","_muzzle","_magazine","_showNumber","_ammo","_maxRounds","_count","_text","_color","_picture", "_a", "_string"]; _weapon = currentWeapon _target; _muzzle = currentMuzzle _target; diff --git a/addons/reload/functions/fnc_startLinkingBelt.sqf b/addons/reload/functions/fnc_startLinkingBelt.sqf index 412fcabb97..8b9145c237 100644 --- a/addons/reload/functions/fnc_startLinkingBelt.sqf +++ b/addons/reload/functions/fnc_startLinkingBelt.sqf @@ -15,7 +15,7 @@ EXPLODE_2_PVT(_this,_player,_target); if (vehicle _target != _target) exitWith {false}; -private ["_magazineCfg","_magazineType"]; +private ["_magazineCfg","_magazineType", "_condition", "_onFailure", "_onFinish"]; _magazineType = currentMagazine _target; _magazineCfg = configFile >> "CfgMagazines" >> _magazineType; if (getNumber (_magazineCfg >> "ACE_isBelt") == 0) exitWith {false}; @@ -54,7 +54,7 @@ _onFinish = { _onFailure = { EXPLODE_3_PVT((_this select 0),_player,_target,_magazine); - [_caller, "AmovPknlMstpSrasWrflDnon", 1] call EFUNC(common,doAnimation); + [_player, "AmovPknlMstpSrasWrflDnon", 1] call EFUNC(common,doAnimation); // Add back the magazine with the former ammo count _player addMagazine _magazine; From 9633547d6bf1e6e538baf50cc7b74a763065e0a4 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 18 Apr 2015 09:26:47 +0200 Subject: [PATCH 220/305] tweak ability to climb --- addons/movement/functions/fnc_canClimb.sqf | 33 ++++++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/addons/movement/functions/fnc_canClimb.sqf b/addons/movement/functions/fnc_canClimb.sqf index 27753d8a12..1bc0d43bd8 100644 --- a/addons/movement/functions/fnc_canClimb.sqf +++ b/addons/movement/functions/fnc_canClimb.sqf @@ -25,15 +25,36 @@ _dir = [sin _dir, cos _dir, 0]; private ["_checkPos0beg", "_checkPos0end", "_checkPos1beg", "_checkPos1end"]; -_checkPos0beg = _pos vectorAdd [0, 0, 1.0]; +_checkPos0beg = _pos vectorAdd [0, 0, 0.9]; _checkPos0end = _checkPos0beg vectorAdd (_dir vectorMultiply 1.3); -_checkPos1beg = _pos vectorAdd [0, 0, 1.5]; -_checkPos1end = _checkPos1beg vectorAdd _dir; +_checkPos1beg = _pos vectorAdd [0, 0, 1.75]; +_checkPos1end = _checkPos1beg vectorAdd (_dir vectorMultiply 1.3); + +_checkPos2beg = _pos vectorAdd [0.3 * (_dir select 1), 0.3 * -(_dir select 0), 2.0]; +_checkPos2end = _checkPos2beg vectorAdd (_dir vectorMultiply 1.3); + +_checkPos3beg = _pos vectorAdd [-0.2 * (_dir select 1), -0.2 * -(_dir select 0), 2.0]; +_checkPos3end = _checkPos3beg vectorAdd (_dir vectorMultiply 1.3); + +_checkPos4beg = _pos vectorAdd [0.3 * (_dir select 1), 0.3 * -(_dir select 0), 1.5]; +_checkPos4end = _checkPos4beg vectorAdd (_dir vectorMultiply 1.3); + +_checkPos5beg = _pos vectorAdd [-0.2 * (_dir select 1), -0.2 * -(_dir select 0), 1.5]; +_checkPos5end = _checkPos5beg vectorAdd (_dir vectorMultiply 1.3); /* -drawLine3D [ASLToATL _checkPos0beg, ASLToATL _checkPos0end, [1,0,0,1]]; +drawLine3D [ASLToATL _checkPos0beg, ASLToATL _checkPos0end, [0,1,0,1]]; drawLine3D [ASLToATL _checkPos1beg, ASLToATL _checkPos1end, [1,0,0,1]]; - */ +drawLine3D [ASLToATL _checkPos2beg, ASLToATL _checkPos2end, [1,0.5,0.5,1]]; +drawLine3D [ASLToATL _checkPos3beg, ASLToATL _checkPos3end, [1,0.5,0.5,1]]; +drawLine3D [ASLToATL _checkPos4beg, ASLToATL _checkPos4end, [1,0.5,0.5,1]]; +drawLine3D [ASLToATL _checkPos5beg, ASLToATL _checkPos5end, [1,0.5,0.5,1]]; +*/ -lineIntersects [_checkPos0beg, _checkPos0end] && {!(lineIntersects [_checkPos1beg, _checkPos1end])} + lineIntersects [_checkPos0beg, _checkPos0end] +&& {!(lineIntersects [_checkPos1beg, _checkPos1end])} +&& {!(lineIntersects [_checkPos2beg, _checkPos2end])} +&& {!(lineIntersects [_checkPos3beg, _checkPos3end])} +&& {!(lineIntersects [_checkPos4beg, _checkPos4end])} +&& {!(lineIntersects [_checkPos5beg, _checkPos5end])} From 4264f78128dcc6ef2aa9eba7ced0b11019241d6d Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 18 Apr 2015 10:16:10 +0200 Subject: [PATCH 221/305] player has to put weapon on back before climbing, check if still can climb --- addons/movement/functions/fnc_climb.sqf | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/addons/movement/functions/fnc_climb.sqf b/addons/movement/functions/fnc_climb.sqf index aff27ffe9d..f88884195e 100644 --- a/addons/movement/functions/fnc_climb.sqf +++ b/addons/movement/functions/fnc_climb.sqf @@ -24,6 +24,15 @@ if !([_unit] call FUNC(canClimb)) exitWith { }; if !(_unit getVariable [QGVAR(isClimbInit), false]) then { + _unit addEventHandler ["AnimChanged", { + if (local (_this select 0) && {_this select 1 == "ACE_Climb"}) then { + // abort climb animation + if !(_this call FUNC(canClimb)) then { + [_this select 0, "AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); + }; + }; + }]; + _unit addEventHandler ["AnimDone", { if (local (_this select 0) && {_this select 1 == "ACE_Climb"}) then {_this call FUNC(handleClimb)}; }]; @@ -32,5 +41,5 @@ if !(_unit getVariable [QGVAR(isClimbInit), false]) then { }; [_unit] call EFUNC(common,fixLoweredRifleAnimation); -[_unit, "AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); +[_unit, "AmovPercMstpSnonWnonDnon", 0] call EFUNC(common,doAnimation); [_unit, "ACE_Climb", 0] call EFUNC(common,doAnimation); From 9057edb1e24d22b6e5622b6b6dfffdfaf214343c Mon Sep 17 00:00:00 2001 From: ulteq Date: Sat, 18 Apr 2015 11:10:05 +0200 Subject: [PATCH 222/305] Added a new module option for wind deflection: *enabled - true/false --- addons/winddeflection/ACE_Settings.hpp | 6 ++++++ addons/winddeflection/CfgVehicles.hpp | 6 ++++++ addons/winddeflection/functions/fnc_handleFired.sqf | 1 + 3 files changed, 13 insertions(+) diff --git a/addons/winddeflection/ACE_Settings.hpp b/addons/winddeflection/ACE_Settings.hpp index 89235fe5af..f84bdeace3 100644 --- a/addons/winddeflection/ACE_Settings.hpp +++ b/addons/winddeflection/ACE_Settings.hpp @@ -1,4 +1,10 @@ class ACE_Settings { + class GVAR(enabled) { + displayName = "Wind Deflection"; + description = "Enables wind deflection"; + typeName = "BOOL"; + value = 1; + }; class GVAR(simulationInterval) { displayName = "Simulation Interval"; description = "Defines the interval between every calculation step"; diff --git a/addons/winddeflection/CfgVehicles.hpp b/addons/winddeflection/CfgVehicles.hpp index f9362a2711..09dc1b69be 100644 --- a/addons/winddeflection/CfgVehicles.hpp +++ b/addons/winddeflection/CfgVehicles.hpp @@ -11,6 +11,12 @@ class CfgVehicles { isTriggerActivated = 0; author = "$STR_ACE_Common_ACETeam"; class Arguments { + class enabled { + displayName = "Wind Deflection"; + description = "Enables wind deflection"; + typeName = "BOOL"; + defaultValue = 1; + }; class simulationInterval { displayName = "Simulation Interval"; description = "Defines the interval between every calculation step"; diff --git a/addons/winddeflection/functions/fnc_handleFired.sqf b/addons/winddeflection/functions/fnc_handleFired.sqf index 5ee22ecf4f..241fbcf839 100644 --- a/addons/winddeflection/functions/fnc_handleFired.sqf +++ b/addons/winddeflection/functions/fnc_handleFired.sqf @@ -28,6 +28,7 @@ _unit = _this select 0; _bullet = _this select 6; if (!hasInterface) exitWith {false}; +if (!(GVAR(enabled))) exitWith {false}; if (!(_bullet isKindOf "BulletBase")) exitWith {false}; if (_unit distance ACE_player > GVAR(simulationRadius)) exitWith {false}; if (!([_unit] call EFUNC(common,isPlayer))) exitWith {false}; From 2a6dcbfbcb276b43935b2c8725b57f0513a9c972 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sat, 18 Apr 2015 12:12:19 +0200 Subject: [PATCH 223/305] Added automatic unit conversion for the target data --- .../functions/fnc_calculate_range_card.sqf | 4 ---- .../functions/fnc_calculate_solution.sqf | 2 ++ .../fnc_calculate_target_solution.sqf | 7 ------- addons/atragmx/functions/fnc_parse_input.sqf | 10 ++++++++- .../atragmx/functions/fnc_update_target.sqf | 18 +++++++++++++--- .../functions/fnc_update_target_data.sqf | 21 +++++++++++++++---- 6 files changed, 43 insertions(+), 19 deletions(-) diff --git a/addons/atragmx/functions/fnc_calculate_range_card.sqf b/addons/atragmx/functions/fnc_calculate_range_card.sqf index f506726be2..359f7ab4ee 100644 --- a/addons/atragmx/functions/fnc_calculate_range_card.sqf +++ b/addons/atragmx/functions/fnc_calculate_range_card.sqf @@ -68,10 +68,6 @@ _windDirection = (GVAR(windDirection) select GVAR(currentTarget)); _inclinationAngle = (GVAR(inclinationAngle) select GVAR(currentTarget)); _targetSpeed = (GVAR(targetSpeed) select GVAR(currentTarget)); _targetRange = GVAR(rangeCardEndRange); -if (GVAR(currentUnit) != 2) then { - _windSpeed = _windSpeed / 2.23693629; - _targetSpeed = _targetSpeed / 2.23693629; -}; if (GVAR(currentUnit) == 1) then { _targetRange = _targetRange / 1.0936133; }; diff --git a/addons/atragmx/functions/fnc_calculate_solution.sqf b/addons/atragmx/functions/fnc_calculate_solution.sqf index f7f23044e3..db8a475b93 100644 --- a/addons/atragmx/functions/fnc_calculate_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_solution.sqf @@ -43,6 +43,8 @@ */ #include "script_component.hpp" +systemChat format["%1", _this]; + private ["_scopeBaseAngle", "_bulletMass", "_boreHeight", "_airFriction", "_muzzleVelocity", "_temperature", "_barometricPressure", "_relativeHumidity", "_simSteps", "_windSpeed", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange", "_bc", "_dragModel", "_atmosphereModel", "_storeRangeCardData", "_stabilityFactor", "_twistDirection", "_latitude"]; _scopeBaseAngle = _this select 0; _bulletMass = _this select 1; diff --git a/addons/atragmx/functions/fnc_calculate_target_solution.sqf b/addons/atragmx/functions/fnc_calculate_target_solution.sqf index f6dd92bc7f..764f21cfc9 100644 --- a/addons/atragmx/functions/fnc_calculate_target_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_target_solution.sqf @@ -68,13 +68,6 @@ _windDirection = GVAR(windDirection) select GVAR(currentTarget); _inclinationAngle = GVAR(inclinationAngle) select GVAR(currentTarget); _targetSpeed = GVAR(targetSpeed) select GVAR(currentTarget); _targetRange = GVAR(targetRange) select GVAR(currentTarget); -if (GVAR(currentUnit) != 2) then { - _windSpeed = _windSpeed / 2.23693629; - _targetSpeed = _targetSpeed / 2.23693629; -}; -if (GVAR(currentUnit) == 1) then { - _targetRange = _targetRange / 1.0936133; -}; private ["_result"]; _result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, diff --git a/addons/atragmx/functions/fnc_parse_input.sqf b/addons/atragmx/functions/fnc_parse_input.sqf index be91ecc593..172df7bd58 100644 --- a/addons/atragmx/functions/fnc_parse_input.sqf +++ b/addons/atragmx/functions/fnc_parse_input.sqf @@ -31,8 +31,16 @@ GVAR(windSpeed1) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140020 GVAR(windSpeed2) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140021)) min 50]; GVAR(windDirection) set [GVAR(currentTarget), 1 max Round(parseNumber(ctrlText 140030)) min 12]; GVAR(inclinationAngle) set [GVAR(currentTarget), -60 max parseNumber(ctrlText 140040) min 60]; -GVAR(targetSpeed) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140050)) min 50]; +GVAR(targetSpeed) set [GVAR(currentTarget), -50 max abs(parseNumber(ctrlText 140050)) min 50]; GVAR(targetRange) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140060)) min 4000]; +if (GVAR(currentUnit) != 2) then { + GVAR(windSpeed1) set [GVAR(currentTarget), (GVAR(windSpeed1) select GVAR(currentTarget)) * 0.44704]; + GVAR(windSpeed2) set [GVAR(currentTarget), (GVAR(windSpeed2) select GVAR(currentTarget)) * 0.44704]; + GVAR(targetSpeed) set [GVAR(currentTarget), (GVAR(targetSpeed) select GVAR(currentTarget)) * 0.44704]; +}; +if (GVAR(currentUnit) == 1) then { + GVAR(targetRange) set [GVAR(currentTarget), (GVAR(targetRange) select GVAR(currentTarget)) * 0.9144]; +}; private ["_boreHeight", "_bulletMass", "_bulletDiameter", "_airFriction", "_rifleTwist", "_muzzleVelocity", "_zeroRange"]; _boreHeight = parseNumber(ctrlText 120000); diff --git a/addons/atragmx/functions/fnc_update_target.sqf b/addons/atragmx/functions/fnc_update_target.sqf index 30b33eb55f..c5a02c0164 100644 --- a/addons/atragmx/functions/fnc_update_target.sqf +++ b/addons/atragmx/functions/fnc_update_target.sqf @@ -15,8 +15,20 @@ */ #include "script_component.hpp" -ctrlSetText [300, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 100) / 100)]; +if (GVAR(currentUnit) != 2) then { + ctrlSetText [300, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 2.23693629 * 100) / 100)]; +} else { + ctrlSetText [300, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 100) / 100)]; +}; ctrlSetText [310, Str(Round((GVAR(windDirection) select GVAR(currentTarget))))]; ctrlSetText [320, Str(Round((GVAR(inclinationAngle) select GVAR(currentTarget))))]; -ctrlSetText [330, Str(Round((GVAR(targetSpeed) select GVAR(currentTarget)) * 100) / 100)]; -ctrlSetText [340, Str(Round((GVAR(targetRange) select GVAR(currentTarget))))]; +if (GVAR(currentUnit) != 2) then { + ctrlSetText [330, Str(Round((GVAR(targetSpeed) select GVAR(currentTarget)) * 2.23693629 * 100) / 100)]; +} else { + ctrlSetText [330, Str(Round((GVAR(targetSpeed) select GVAR(currentTarget)) * 100) / 100)]; +}; +if (GVAR(currentUnit) == 1) then { + ctrlSetText [340, Str(Round((GVAR(targetRange) select GVAR(currentTarget)) * 1.0936133))]; +} else { + ctrlSetText [340, Str(Round((GVAR(targetRange) select GVAR(currentTarget))))]; +}; diff --git a/addons/atragmx/functions/fnc_update_target_data.sqf b/addons/atragmx/functions/fnc_update_target_data.sqf index 35711acd5b..bfd7fced05 100644 --- a/addons/atragmx/functions/fnc_update_target_data.sqf +++ b/addons/atragmx/functions/fnc_update_target_data.sqf @@ -17,13 +17,26 @@ ctrlSetText [140000, Str(Round((GVAR(latitude) select GVAR(currentTarget)) * 100) / 100)]; ctrlSetText [140010, Str(Round((GVAR(directionOfFire) select GVAR(currentTarget)) * 100) / 100)]; -ctrlSetText [140020, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 100) / 100)]; -ctrlSetText [140021, Str(Round((GVAR(windSpeed2) select GVAR(currentTarget)) * 100) / 100)]; +if (GVAR(currentUnit) != 2) then { + ctrlSetText [140020, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 2.23693629 * 100) / 100)]; + ctrlSetText [140021, Str(Round((GVAR(windSpeed2) select GVAR(currentTarget)) * 2.23693629 * 100) / 100)]; +} else { + ctrlSetText [140020, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 100) / 100)]; + ctrlSetText [140021, Str(Round((GVAR(windSpeed2) select GVAR(currentTarget)) * 100) / 100)]; +}; ctrlSetText [140030, Str(Round((GVAR(windDirection) select GVAR(currentTarget))))]; ctrlSetText [140040, Str(Round((GVAR(inclinationAngle) select GVAR(currentTarget))))]; ctrlSetText [140041, Str(floor(cos(GVAR(inclinationAngle) select GVAR(currentTarget)) * 100) / 100)]; -ctrlSetText [140050, Str(Round((GVAR(targetSpeed) select GVAR(currentTarget)) * 100) / 100)]; -ctrlSetText [140060, Str(Round((GVAR(targetRange) select GVAR(currentTarget))))]; +if (GVAR(currentUnit) != 2) then { + ctrlSetText [140050, Str(Round((GVAR(targetSpeed) select GVAR(currentTarget)) * 2.23693629 * 100) / 100)]; +} else { + ctrlSetText [140050, Str(Round((GVAR(targetSpeed) select GVAR(currentTarget)) * 100) / 100)]; +}; +if (GVAR(currentUnit) == 1) then { + ctrlSetText [140060, Str(Round((GVAR(targetRange) select GVAR(currentTarget)) * 1.0936133))]; +} else { + ctrlSetText [140060, Str(Round((GVAR(targetRange) select GVAR(currentTarget))))]; +}; if (GVAR(currentUnit) == 2) then { ctrlSetText [14002, "Wind Speed (m/s)"]; From 4449c99ebaaaa7a62e299438e49b361365a94824 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sat, 18 Apr 2015 12:13:27 +0200 Subject: [PATCH 224/305] Removed debug output --- addons/atragmx/functions/fnc_calculate_solution.sqf | 2 -- 1 file changed, 2 deletions(-) diff --git a/addons/atragmx/functions/fnc_calculate_solution.sqf b/addons/atragmx/functions/fnc_calculate_solution.sqf index db8a475b93..f7f23044e3 100644 --- a/addons/atragmx/functions/fnc_calculate_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_solution.sqf @@ -43,8 +43,6 @@ */ #include "script_component.hpp" -systemChat format["%1", _this]; - private ["_scopeBaseAngle", "_bulletMass", "_boreHeight", "_airFriction", "_muzzleVelocity", "_temperature", "_barometricPressure", "_relativeHumidity", "_simSteps", "_windSpeed", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange", "_bc", "_dragModel", "_atmosphereModel", "_storeRangeCardData", "_stabilityFactor", "_twistDirection", "_latitude"]; _scopeBaseAngle = _this select 0; _bulletMass = _this select 1; From 0f7bcf8d622882f62b7425c60ce8f45ff6fb8bde Mon Sep 17 00:00:00 2001 From: Grzegorz Sikora Date: Sat, 18 Apr 2015 13:56:34 +0200 Subject: [PATCH 225/305] PL translation --- addons/optionsmenu/stringtable.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/optionsmenu/stringtable.xml b/addons/optionsmenu/stringtable.xml index 2bc66b8b52..5c292ea16f 100644 --- a/addons/optionsmenu/stringtable.xml +++ b/addons/optionsmenu/stringtable.xml @@ -1,4 +1,5 @@  + @@ -215,6 +216,7 @@ Option Menu UI Scaling + Skalowanie UI menu ustawień \ No newline at end of file From 422e175f09229fc7c80b8a1ff5903eae33cea1b9 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sat, 18 Apr 2015 15:08:54 +0200 Subject: [PATCH 226/305] Implemented the dual wind speed feature --- addons/atragmx/RscTitles.hpp | 2 +- .../functions/fnc_calculate_range_card.sqf | 7 +- .../fnc_calculate_scope_base_angle.sqf | 2 +- .../functions/fnc_calculate_solution.sqf | 66 +++++++++++-------- .../fnc_calculate_target_solution.sqf | 10 +-- addons/atragmx/functions/fnc_change_gun.sqf | 3 +- addons/atragmx/functions/fnc_init.sqf | 4 +- .../functions/fnc_restore_user_data.sqf | 1 + .../atragmx/functions/fnc_store_user_data.sqf | 1 + .../functions/fnc_update_range_card.sqf | 30 ++++++--- .../fnc_update_relative_click_memory.sqf | 2 +- .../atragmx/functions/fnc_update_result.sqf | 28 ++++++-- .../atragmx/functions/fnc_update_target.sqf | 14 +++- .../functions/fnc_update_zero_range.sqf | 2 +- 14 files changed, 115 insertions(+), 57 deletions(-) diff --git a/addons/atragmx/RscTitles.hpp b/addons/atragmx/RscTitles.hpp index 592374ddad..0752f8beb7 100644 --- a/addons/atragmx/RscTitles.hpp +++ b/addons/atragmx/RscTitles.hpp @@ -573,7 +573,7 @@ class ATragMX_Display { x=0.550*safezoneW+safezoneX+0.11; y=0.265*safezoneH+safezoneY+0.57; text="Lead"; - action=""; + action=QUOTE(GVAR(showWind2) = !GVAR(showWind2); call FUNC(update_result); call FUNC(update_target)); }; class TEXT_LEAD_OUTPUT: TEXT_ELEVATION_OUTPUT_ABSOLUTE { idc=420; diff --git a/addons/atragmx/functions/fnc_calculate_range_card.sqf b/addons/atragmx/functions/fnc_calculate_range_card.sqf index 359f7ab4ee..c11cf90550 100644 --- a/addons/atragmx/functions/fnc_calculate_range_card.sqf +++ b/addons/atragmx/functions/fnc_calculate_range_card.sqf @@ -60,10 +60,11 @@ if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) }; }; -private ["_latitude", "_directionOfFire", "_windSpeed", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange"]; +private ["_latitude", "_directionOfFire", "_windSpeed1", "_windSpeed2", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange"]; _latitude = GVAR(latitude) select GVAR(currentTarget); _directionOfFire = GVAR(directionOfFire) select GVAR(currentTarget); -_windSpeed = (GVAR(windSpeed1) select GVAR(currentTarget)); +_windSpeed1 = (GVAR(windSpeed1) select GVAR(currentTarget)); +_windSpeed2 = (GVAR(windSpeed2) select GVAR(currentTarget)); _windDirection = (GVAR(windDirection) select GVAR(currentTarget)); _inclinationAngle = (GVAR(inclinationAngle) select GVAR(currentTarget)); _targetSpeed = (GVAR(targetSpeed) select GVAR(currentTarget)); @@ -76,4 +77,4 @@ GVAR(rangeCardData) = []; private ["_result"]; _result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, - _windSpeed, _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, true, _stabilityFactor, _twistDirection, _latitude] call FUNC(calculate_solution); + [_windSpeed1, _windSpeed2], _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, true, _stabilityFactor, _twistDirection, _latitude] call FUNC(calculate_solution); diff --git a/addons/atragmx/functions/fnc_calculate_scope_base_angle.sqf b/addons/atragmx/functions/fnc_calculate_scope_base_angle.sqf index 4995c31a61..76c54f63a9 100644 --- a/addons/atragmx/functions/fnc_calculate_scope_base_angle.sqf +++ b/addons/atragmx/functions/fnc_calculate_scope_base_angle.sqf @@ -35,6 +35,6 @@ _barometricPressure = 1013.25; _relativeHumidity = 0; private ["_result"]; -_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, 0, 0, 0, 0, _zeroRange, _airFriction, 1, "ICAO", false, 1.5, 0, 0] call FUNC(calculate_solution); +_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, [0, 0], 0, 0, 0, _zeroRange, _airFriction, 1, "ICAO", false, 1.5, 0, 0] call FUNC(calculate_solution); _scopeBaseAngle + (_result select 0) / 60 diff --git a/addons/atragmx/functions/fnc_calculate_solution.sqf b/addons/atragmx/functions/fnc_calculate_solution.sqf index f7f23044e3..242e2e9c48 100644 --- a/addons/atragmx/functions/fnc_calculate_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_solution.sqf @@ -12,7 +12,7 @@ * 6: barometric pressure * 7: relative humidity * 8: simulation steps - * 9: wind speed + * 9: wind speed * 10: wind direction * 11: inclination angle * 12: target speed @@ -26,15 +26,15 @@ * 20: Latitude * * Return Value: - * 0: Elevation - * 1: Windage - * 2: Lead - * 3: Time of fligth - * 4: Remaining velocity - * 5: Remaining kinetic energy - * 6: Vertical coriolis drift - * 7: Horizontal coriolis drift - * 8: Spin drift + * 0: Elevation (MOA) + * 1: Windage (MOA) + * 2: Lead (MOA) + * 3: Time of fligth (SECONDS) + * 4: Remaining velocity (m/s) + * 5: Remaining kinetic energy (ft·lb) + * 6: Vertical coriolis drift (MOA) + * 7: Horizontal coriolis drift (MOA) + * 8: Spin drift (MOA) * * Example: * call ace_atragmx_calculate_target_range_assist @@ -43,7 +43,7 @@ */ #include "script_component.hpp" -private ["_scopeBaseAngle", "_bulletMass", "_boreHeight", "_airFriction", "_muzzleVelocity", "_temperature", "_barometricPressure", "_relativeHumidity", "_simSteps", "_windSpeed", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange", "_bc", "_dragModel", "_atmosphereModel", "_storeRangeCardData", "_stabilityFactor", "_twistDirection", "_latitude"]; +private ["_scopeBaseAngle", "_bulletMass", "_boreHeight", "_airFriction", "_muzzleVelocity", "_temperature", "_barometricPressure", "_relativeHumidity", "_simSteps", "_windSpeed1", "_windSpeed2", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange", "_bc", "_dragModel", "_atmosphereModel", "_storeRangeCardData", "_stabilityFactor", "_twistDirection", "_latitude"]; _scopeBaseAngle = _this select 0; _bulletMass = _this select 1; _boreHeight = _this select 2; @@ -53,7 +53,8 @@ _temperature = _this select 5; _barometricPressure = _this select 6; _relativeHumidity = _this select 7; _simSteps = _this select 8; -_windSpeed = _this select 9; +_windSpeed1 = (_this select 9) select 0; +_windSpeed2 = (_this select 9) select 1; _windDirection = _this select 10; _inclinationAngle = _this select 11; _targetSpeed = _this select 12; @@ -74,9 +75,10 @@ _bulletSpeed = 0; _gravity = [0, sin(_scopeBaseAngle + _inclinationAngle) * -9.80665, cos(_scopeBaseAngle + _inclinationAngle) * -9.80665]; _deltaT = 1 / _simSteps; -private ["_elevation", "_windage", "_lead", "_TOF", "_trueVelocity", "_trueSpeed", "_kineticEnergy", "_verticalCoriolis", "_verticalDeflection", "_horizontalCoriolis", "_horizontalDeflection", "_spinDrift", "_spinDeflection"]; +private ["_elevation", "_windage1", "_windage2", "_lead", "_TOF", "_trueVelocity", "_trueSpeed", "_kineticEnergy", "_verticalCoriolis", "_verticalDeflection", "_horizontalCoriolis", "_horizontalDeflection", "_spinDrift", "_spinDeflection"]; _elevation = 0; -_windage = 0; +_windage1 = 0; +_windage2 = 0; _lead = 0; _TOF = 0; _trueVelocity = [0, 0, 0]; @@ -99,8 +101,10 @@ if (_storeRangeCardData) then { GVAR(rangeCardData) = []; }; -private ["_wind"]; -_wind = [cos(270 - _windDirection * 30) * _windSpeed, sin(270 - _windDirection * 30) * _windSpeed, 0]; +private ["_wind1", "_wind2", "_windDrift"]; +_wind1 = [cos(270 - _windDirection * 30) * _windSpeed1, sin(270 - _windDirection * 30) * _windSpeed1, 0]; +_wind2 = [cos(270 - _windDirection * 30) * _windSpeed2, sin(270 - _windDirection * 30) * _windSpeed2, 0]; +_windDrift = 0; if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,AdvancedAirDragEnabled), false])) then { _bc = [_bc, _temperature, _barometricPressure, _relativeHumidity, _atmosphereModel] call EFUNC(advanced_ballistics,calculateAtmosphericCorrection); }; @@ -127,7 +131,7 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do { _stepsTotal = _stepsTotal + 1; _speedAverage = (_speedTotal / _stepsTotal); - _trueVelocity = _bulletVelocity vectorDiff _wind; + _trueVelocity = _bulletVelocity vectorDiff _wind1; _trueSpeed = vectorMagnitude _trueVelocity; if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { @@ -156,7 +160,9 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do { if ((_bulletPos select 1) * _rangeFactor >= _range && _range <= GVAR(rangeCardEndRange)) then { if ((_bulletPos select 1) > 0) then { _elevation = - atan((_bulletPos select 2) / (_bulletPos select 1)); - _windage = - atan((_bulletPos select 0) / (_bulletPos select 1)); + _windage1 = - atan((_bulletPos select 0) / (_bulletPos select 1)); + _windDrift = (_wind2 select 0) * (_TOF - (_range / _rangeFactor) / _muzzleVelocity); + _windage2 = - atan(_windDrift / (_bulletPos select 1)); }; if (_range != 0) then { _lead = (_targetSpeed * _TOF) / (Tan(3.38 / 60) * _range); @@ -166,20 +172,22 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do { if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,CoriolisEnabled), false])) then { if ((_bulletPos select 1) > 0) then { - _horizontalDeflection = 0.0000729 * ((_bulletPos select 0) ^ 2) * sin(_latitude) / _speedAverage; + _horizontalDeflection = 0.0000729 * ((_bulletPos select 1) ^ 2) * sin(_latitude) / _speedAverage; _horizontalCoriolis = - atan(_horizontalDeflection / (_bulletPos select 1)); - _windage = _windage + _horizontalCoriolis; + _windage1 = _windage1 + _horizontalCoriolis; + _windage2 = _windage2 + _horizontalCoriolis; }; }; if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,SpinDriftEnabled), false])) then { if ((_bulletPos select 1) > 0) then { _spinDeflection = _twistDirection * 0.0254 * 1.25 * (_stabilityFactor + 1.2) * _TOF ^ 1.83; _spinDrift = - atan(_spinDeflection / (_bulletPos select 1)); - _windage = _windage + _spinDrift; + _windage1 = _windage1 + _spinDrift; + _windage2 = _windage2 + _spinDrift; }; }; - GVAR(rangeCardData) set [_n, [_range, _elevation * 60, _windage * 60, _lead, _TOF, _bulletSpeed, _kineticEnergy]]; + GVAR(rangeCardData) set [_n, [_range, _elevation * 60, [_windage1 * 60, _windage2 * 60], _lead, _TOF, _bulletSpeed, _kineticEnergy]]; _n = _n + 1; }; }; @@ -187,7 +195,9 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do { if ((_bulletPos select 1) > 0) then { _elevation = - atan((_bulletPos select 2) / (_bulletPos select 1)); - _windage = - atan((_bulletPos select 0) / (_bulletPos select 1)); + _windage1 = - atan((_bulletPos select 0) / (_bulletPos select 1)); + _windDrift = (_wind2 select 0) * (_TOF - _targetRange / _muzzleVelocity); + _windage2 = - atan(_windDrift / (_bulletPos select 1)); }; if (_targetRange != 0) then { @@ -199,17 +209,19 @@ _kineticEnergy = _kineticEnergy * 0.737562149; if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,CoriolisEnabled), false])) then { if ((_bulletPos select 1) > 0) then { - _horizontalDeflection = 0.0000729 * ((_bulletPos select 0) ^ 2) * sin(_latitude) / _speedAverage; + _horizontalDeflection = 0.0000729 * ((_bulletPos select 1) ^ 2) * sin(_latitude) / _speedAverage; _horizontalCoriolis = - atan(_horizontalDeflection / (_bulletPos select 1)); - _windage = _windage + _horizontalCoriolis; + _windage1 = _windage1 + _horizontalCoriolis; + _windage2 = _windage2 + _horizontalCoriolis; }; }; if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,SpinDriftEnabled), false])) then { if ((_bulletPos select 1) > 0) then { _spinDeflection = _twistDirection * 0.0254 * 1.25 * (_stabilityFactor + 1.2) * _TOF ^ 1.83; _spinDrift = - atan(_spinDeflection / (_bulletPos select 1)); - _windage = _windage + _spinDrift; + _windage1 = _windage1 + _spinDrift; + _windage2 = _windage2 + _spinDrift; }; }; -[_elevation * 60, _windage * 60, _lead, _TOF, _bulletSpeed, _kineticEnergy, _verticalCoriolis, _horizontalCoriolis, _spinDrift] +[_elevation * 60, [_windage1 * 60, _windage2 * 60], _lead, _TOF, _bulletSpeed, _kineticEnergy, _verticalCoriolis * 60, _horizontalCoriolis * 60, _spinDrift * 60] diff --git a/addons/atragmx/functions/fnc_calculate_target_solution.sqf b/addons/atragmx/functions/fnc_calculate_target_solution.sqf index 764f21cfc9..c8a3683498 100644 --- a/addons/atragmx/functions/fnc_calculate_target_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_target_solution.sqf @@ -60,10 +60,11 @@ if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) }; }; -private ["_latitude", "_directionOfFire", "_windSpeed", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange"]; +private ["_latitude", "_directionOfFire", "_windSpeed1", "_windSpeed2", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange"]; _latitude = GVAR(latitude) select GVAR(currentTarget); _directionOfFire = GVAR(directionOfFire) select GVAR(currentTarget); -_windSpeed = GVAR(windSpeed1) select GVAR(currentTarget); +_windSpeed1 = GVAR(windSpeed1) select GVAR(currentTarget); +_windSpeed2 = GVAR(windSpeed2) select GVAR(currentTarget); _windDirection = GVAR(windDirection) select GVAR(currentTarget); _inclinationAngle = GVAR(inclinationAngle) select GVAR(currentTarget); _targetSpeed = GVAR(targetSpeed) select GVAR(currentTarget); @@ -71,10 +72,11 @@ _targetRange = GVAR(targetRange) select GVAR(currentTarget); private ["_result"]; _result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, - _windSpeed, _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, false, _stabilityFactor, _twistDirection, _latitude] call FUNC(calculate_solution); + [_windSpeed1, _windSpeed2], _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, false, _stabilityFactor, _twistDirection, _latitude] call FUNC(calculate_solution); GVAR(elevationOutput) set [GVAR(currentTarget), _result select 0]; -GVAR(windageOutput) set [GVAR(currentTarget), _result select 1]; +GVAR(windage1Output) set [GVAR(currentTarget), (_result select 1) select 0]; +GVAR(windage2Output) set [GVAR(currentTarget), (_result select 1) select 1]; GVAR(leadOutput) set [GVAR(currentTarget), _result select 2]; GVAR(tofOutput) set [GVAR(currentTarget), _result select 3]; GVAR(velocityOutput) set [GVAR(currentTarget), _result select 4]; diff --git a/addons/atragmx/functions/fnc_change_gun.sqf b/addons/atragmx/functions/fnc_change_gun.sqf index 9b0f18c185..c753f644a4 100644 --- a/addons/atragmx/functions/fnc_change_gun.sqf +++ b/addons/atragmx/functions/fnc_change_gun.sqf @@ -35,7 +35,8 @@ if ((GVAR(scopeUnits) select GVAR(currentScopeUnit)) != "Clicks") then { [] call FUNC(update_gun_ammo_data); GVAR(elevationOutput) set [GVAR(currentTarget), 0]; -GVAR(windageOutput) set [GVAR(currentTarget), 0]; +GVAR(windage1Output) set [GVAR(currentTarget), 0]; +GVAR(windage2Output) set [GVAR(currentTarget), 0]; GVAR(leadOutput) set [GVAR(currentTarget), 0]; GVAR(tofOutput) set [GVAR(currentTarget), 0]; GVAR(velocityOutput) set [GVAR(currentTarget), 0]; diff --git a/addons/atragmx/functions/fnc_init.sqf b/addons/atragmx/functions/fnc_init.sqf index efbd39ef81..881f65a6b0 100644 --- a/addons/atragmx/functions/fnc_init.sqf +++ b/addons/atragmx/functions/fnc_init.sqf @@ -56,8 +56,10 @@ GVAR(inclinationAngle) = [0, 0, 0, 0]; GVAR(targetSpeed) = [0, 0, 0, 0]; GVAR(targetRange) = [0, 0, 0, 0]; +GVAR(showWind2) = false; GVAR(elevationOutput) = [0, 0, 0, 0]; -GVAR(windageOutput) = [0, 0, 0, 0]; +GVAR(windage1Output) = [0, 0, 0, 0]; +GVAR(windage2Output) = [0, 0, 0, 0]; GVAR(leadOutput) = [0, 0, 0, 0]; GVAR(tofOutput) = [0, 0, 0, 0]; GVAR(velocityOutput) = [0, 0, 0, 0]; diff --git a/addons/atragmx/functions/fnc_restore_user_data.sqf b/addons/atragmx/functions/fnc_restore_user_data.sqf index 7c011198d6..6fddc4bed5 100644 --- a/addons/atragmx/functions/fnc_restore_user_data.sqf +++ b/addons/atragmx/functions/fnc_restore_user_data.sqf @@ -26,6 +26,7 @@ GVAR(temperature) = -50 max (profileNamespace getVariable ["ACE_ATragMX_temperat GVAR(barometricPressure) = 340 max (profileNamespace getVariable ["ACE_ATragMX_barometricPressure", 1013.25]) min 1350; GVAR(relativeHumidity) = 0 max (profileNamespace getVariable ["ACE_ATragMX_relativeHumidity", 0.5]) min 1; +GVAR(showWind2) = profileNamespace getVariable ["ACE_ATragMX_showWind2", false]; GVAR(latitude) = profileNamespace getVariable ["ACE_ATragMX_latitude", [38, 38, 38, 38]]; GVAR(directionOfFire) = profileNamespace getVariable ["ACE_ATragMX_directionOfFire", [0, 0, 0, 0]]; GVAR(windSpeed1) = profileNamespace getVariable ["ACE_ATragMX_windSpeed1", [0, 0, 0, 0]]; diff --git a/addons/atragmx/functions/fnc_store_user_data.sqf b/addons/atragmx/functions/fnc_store_user_data.sqf index 81a4476d75..6a66b96ea3 100644 --- a/addons/atragmx/functions/fnc_store_user_data.sqf +++ b/addons/atragmx/functions/fnc_store_user_data.sqf @@ -26,6 +26,7 @@ profileNamespace setVariable ["ACE_ATragMX_temperature", GVAR(temperature)]; profileNamespace setVariable ["ACE_ATragMX_barometricPressure", GVAR(barometricPressure)]; profileNamespace setVariable ["ACE_ATragMX_relativeHumidity", GVAR(relativeHumidity)]; +profileNamespace setVariable ["ACE_ATragMX_showWind2", GVAR(showWind2)]; profileNamespace setVariable ["latitude", GVAR(latitude)]; profileNamespace setVariable ["directionOfFire", GVAR(directionOfFire)]; profileNamespace setVariable ["ACE_ATragMX_windSpeed1", GVAR(windSpeed1)]; diff --git a/addons/atragmx/functions/fnc_update_range_card.sqf b/addons/atragmx/functions/fnc_update_range_card.sqf index 871e5fa268..0c49b6f794 100644 --- a/addons/atragmx/functions/fnc_update_range_card.sqf +++ b/addons/atragmx/functions/fnc_update_range_card.sqf @@ -15,10 +15,14 @@ */ #include "script_component.hpp" -private ["_range", "_elevation", "_windage", "_elevationScopeStep", "_windageScopeStep", "_lead", "_TOF", "_velocity", "_kineticEnergy", "_rangeOutput", "_elevationOutput", "_windageOutput", "_lastColumnOutput"]; +private ["_range", "_elevation", "_windage1", "_windage2", "_elevationScopeStep", "_windageScopeStep", "_lead", "_TOF", "_velocity", "_kineticEnergy", "_rangeOutput", "_elevationOutput", "_windageOutput", "_lastColumnOutput"]; _lastColumnOutput = ""; -ctrlSetText [5006, (GVAR(rangeCardLastColumns) select GVAR(rangeCardCurrentColumn))]; +if (GVAR(showWind2) && GVAR(rangeCardCurrentColumn) == 0) then { + ctrlSetText [5006, "Wind2"]; +} else { + ctrlSetText [5006, (GVAR(rangeCardLastColumns) select GVAR(rangeCardCurrentColumn))]; +}; if (GVAR(currentUnit) == 1) then { ctrlSetText [5003, "Yards"]; @@ -31,7 +35,8 @@ lnbClear 5007; { _range = _x select 0; _elevation = _x select 1; - _windage = _x select 2; + _windage1 = (_x select 2) select 0; + _windage2 = (_x select 2) select 1; _lead = _x select 3; _TOF = _x select 4; _velocity = _x select 5; @@ -40,23 +45,26 @@ lnbClear 5007; switch (GVAR(currentScopeUnit)) do { case 0: { _elevation = _elevation / 3.38; - _windage = _windage / 3.38; - }; + _windage1 = _windage1 / 3.38; + _windage2 = _windage2 / 3.38; + }; case 2: { _elevation = _elevation * 1.047; - _windage = _windage * 1.047; + _windage1 = _windage1 * 1.047; + _windage2 = _windage2 * 1.047; }; case 3: { _elevationScopeStep = (GVAR(workingMemory) select 7); _windageScopeStep = (GVAR(workingMemory) select 8); _elevation = Round(_elevation / _elevationScopeStep); - _windage = Round(_windage / _windageScopeStep); + _windage1 = Round(_windage1 / _windageScopeStep); + _windage2 = Round(_windage2 / _windageScopeStep); }; }; _elevationOutput = Str(Round(_elevation * 100) / 100); - _windageOutput = Str(Round(_windage * 100) / 100); + _windageOutput = Str(Round(_windage1 * 100) / 100); _rangeOutput = Str(_range); if (_velocity < 340.29) then { @@ -69,7 +77,11 @@ lnbClear 5007; switch (GVAR(rangeCardCurrentColumn)) do { case 0: { - _lastColumnOutput = Str(Round(_lead * 100) / 100); + if (GVAR(showWind2)) then { + _lastColumnOutput = Str(Round(_windage2 * 100) / 100); + } else { + _lastColumnOutput = Str(Round(_lead * 100) / 100); + }; }; case 1: { _lastColumnOutput = Str(Round(_velocity)); diff --git a/addons/atragmx/functions/fnc_update_relative_click_memory.sqf b/addons/atragmx/functions/fnc_update_relative_click_memory.sqf index 1d5add83db..1dc534ce4b 100644 --- a/addons/atragmx/functions/fnc_update_relative_click_memory.sqf +++ b/addons/atragmx/functions/fnc_update_relative_click_memory.sqf @@ -16,6 +16,6 @@ #include "script_component.hpp" GVAR(workingMemory) set [10, (GVAR(elevationOutput) select GVAR(currentTarget))]; -GVAR(workingMemory) set [11, (GVAR(windageOutput) select GVAR(currentTarget))]; +GVAR(workingMemory) set [11, (GVAR(windage1Output) select GVAR(currentTarget))]; [] call FUNC(update_result); diff --git a/addons/atragmx/functions/fnc_update_result.sqf b/addons/atragmx/functions/fnc_update_result.sqf index 6898920eac..a86170fd45 100644 --- a/addons/atragmx/functions/fnc_update_result.sqf +++ b/addons/atragmx/functions/fnc_update_result.sqf @@ -15,9 +15,11 @@ */ #include "script_component.hpp" -private ["_elevationAbs", "_elevationRel", "_elevationCur", "_windageAbs", "_windageRel", "_windageCur", "_lead", "_elevationScopeStep", "_windageScopeStep"]; -_elevationAbs = (GVAR(elevationOutput) select GVAR(currentTarget)); -_windageAbs = (GVAR(windageOutput) select GVAR(currentTarget)); +private ["_elevationAbs", "_elevationRel", "_elevationCur", "_windageAbs", "_wind2", "_windageRel", "_windageCur", "_lead", "_elevationScopeStep", "_windageScopeStep"]; +_elevationAbs = GVAR(elevationOutput) select GVAR(currentTarget); +_windageAbs = GVAR(windage1Output) select GVAR(currentTarget); + +_wind2 = GVAR(windage2Output) select GVAR(currentTarget); _elevationCur = GVAR(workingMemory) select 10; _windageCur = GVAR(workingMemory) select 11; @@ -25,13 +27,15 @@ _windageCur = GVAR(workingMemory) select 11; _elevationRel = _elevationAbs - _elevationCur; _windageRel = _windageAbs - _windageCur; -_lead = (GVAR(leadOutput) select GVAR(currentTarget)); +_lead = GVAR(leadOutput) select GVAR(currentTarget); switch (GVAR(currentScopeUnit)) do { case 0: { _elevationAbs = _elevationAbs / 3.38; _windageAbs = _windageAbs / 3.38; + _wind2 = _wind2 / 3.38; + _elevationRel = _elevationRel / 3.38; _windageRel = _windageRel / 3.38; @@ -42,6 +46,8 @@ switch (GVAR(currentScopeUnit)) do { _elevationAbs = _elevationAbs * 1.047; _windageAbs = _windageAbs * 1.047; + _wind2 = _wind2 / 1.047; + _elevationRel = _elevationRel * 1.047; _windageRel = _windageRel * 1.047; @@ -55,6 +61,8 @@ switch (GVAR(currentScopeUnit)) do { _elevationAbs = Round(_elevationAbs / _elevationScopeStep); _windageAbs = Round(_windageAbs / _windageScopeStep); + _wind2 = Round(_wind2 / _windageScopeStep); + _elevationRel = Round(_elevationRel / _elevationScopeStep); _windageRel = Round(_windageRel / _windageScopeStep); @@ -63,6 +71,12 @@ switch (GVAR(currentScopeUnit)) do { }; }; +if (GVAR(showWind2)) then { + ctrlSetText [42, "Wind2"]; +} else { + ctrlSetText [42, "Lead"]; +}; + ctrlSetText [400, Str(Round(_elevationAbs * 100) / 100)]; ctrlSetText [401, Str(Round(_elevationRel * 100) / 100)]; ctrlSetText [402, Str(Round(_elevationCur * 100) / 100)]; @@ -71,4 +85,8 @@ ctrlSetText [410, Str(Round(_windageAbs * 100) / 100)]; ctrlSetText [411, Str(Round(_windageRel * 100) / 100)]; ctrlSetText [412, Str(Round(_windageCur * 100) / 100)]; -ctrlSetText [420, Str(Round(_lead * 100) / 100)]; +if (GVAR(showWind2)) then { + ctrlSetText [420, Str(Round(_wind2 * 100) / 100)]; +} else { + ctrlSetText [420, Str(Round(_lead * 100) / 100)]; +}; \ No newline at end of file diff --git a/addons/atragmx/functions/fnc_update_target.sqf b/addons/atragmx/functions/fnc_update_target.sqf index c5a02c0164..dab62e099d 100644 --- a/addons/atragmx/functions/fnc_update_target.sqf +++ b/addons/atragmx/functions/fnc_update_target.sqf @@ -15,10 +15,18 @@ */ #include "script_component.hpp" -if (GVAR(currentUnit) != 2) then { - ctrlSetText [300, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 2.23693629 * 100) / 100)]; +if (GVAR(showWind2)) then { + if (GVAR(currentUnit) != 2) then { + ctrlSetText [300, format["%1/%2", Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 2.23693629), Round((GVAR(windSpeed2) select GVAR(currentTarget)) * 2.23693629)]]; + } else { + ctrlSetText [300, format["%1/%2", Round(GVAR(windSpeed1) select GVAR(currentTarget)), Round(GVAR(windSpeed2) select GVAR(currentTarget))]]; + }; } else { - ctrlSetText [300, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 100) / 100)]; + if (GVAR(currentUnit) != 2) then { + ctrlSetText [300, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 2.23693629 * 100) / 100)]; + } else { + ctrlSetText [300, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 100) / 100)]; + }; }; ctrlSetText [310, Str(Round((GVAR(windDirection) select GVAR(currentTarget))))]; ctrlSetText [320, Str(Round((GVAR(inclinationAngle) select GVAR(currentTarget))))]; diff --git a/addons/atragmx/functions/fnc_update_zero_range.sqf b/addons/atragmx/functions/fnc_update_zero_range.sqf index 6e2a9c566c..a5cab3755e 100644 --- a/addons/atragmx/functions/fnc_update_zero_range.sqf +++ b/addons/atragmx/functions/fnc_update_zero_range.sqf @@ -44,7 +44,7 @@ _barometricPressure = GVAR(barometricPressure); _relativeHumidity = GVAR(relativeHumidity); private ["_result"]; -_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, 0, 0, 0, 0, _zeroRange, _bc, _dragModel, _atmosphereModel, false, 1.5, 0, 0] call FUNC(calculate_solution); +_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, [0, 0], 0, 0, 0, _zeroRange, _bc, _dragModel, _atmosphereModel, false, 1.5, 0, 0] call FUNC(calculate_solution); GVAR(workingMemory) set [2, _zeroRange]; GVAR(workingMemory) set [3, _scopeBaseAngle + (_result select 0) / 60]; From 5319fe5b98037544f63bb9af65f083b86dfa3fad Mon Sep 17 00:00:00 2001 From: ulteq Date: Sat, 18 Apr 2015 15:08:54 +0200 Subject: [PATCH 227/305] Implemented the dual wind speed feature --- addons/atragmx/RscTitles.hpp | 2 +- .../functions/fnc_calculate_range_card.sqf | 7 +- .../fnc_calculate_scope_base_angle.sqf | 2 +- .../functions/fnc_calculate_solution.sqf | 66 +++++++++++-------- .../fnc_calculate_target_solution.sqf | 10 +-- addons/atragmx/functions/fnc_change_gun.sqf | 3 +- addons/atragmx/functions/fnc_init.sqf | 4 +- .../functions/fnc_restore_user_data.sqf | 1 + .../atragmx/functions/fnc_store_user_data.sqf | 1 + .../functions/fnc_update_range_card.sqf | 30 ++++++--- .../fnc_update_relative_click_memory.sqf | 2 +- .../atragmx/functions/fnc_update_result.sqf | 28 ++++++-- .../atragmx/functions/fnc_update_target.sqf | 14 +++- .../functions/fnc_update_zero_range.sqf | 2 +- 14 files changed, 115 insertions(+), 57 deletions(-) diff --git a/addons/atragmx/RscTitles.hpp b/addons/atragmx/RscTitles.hpp index 592374ddad..0752f8beb7 100644 --- a/addons/atragmx/RscTitles.hpp +++ b/addons/atragmx/RscTitles.hpp @@ -573,7 +573,7 @@ class ATragMX_Display { x=0.550*safezoneW+safezoneX+0.11; y=0.265*safezoneH+safezoneY+0.57; text="Lead"; - action=""; + action=QUOTE(GVAR(showWind2) = !GVAR(showWind2); call FUNC(update_result); call FUNC(update_target)); }; class TEXT_LEAD_OUTPUT: TEXT_ELEVATION_OUTPUT_ABSOLUTE { idc=420; diff --git a/addons/atragmx/functions/fnc_calculate_range_card.sqf b/addons/atragmx/functions/fnc_calculate_range_card.sqf index 359f7ab4ee..c11cf90550 100644 --- a/addons/atragmx/functions/fnc_calculate_range_card.sqf +++ b/addons/atragmx/functions/fnc_calculate_range_card.sqf @@ -60,10 +60,11 @@ if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) }; }; -private ["_latitude", "_directionOfFire", "_windSpeed", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange"]; +private ["_latitude", "_directionOfFire", "_windSpeed1", "_windSpeed2", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange"]; _latitude = GVAR(latitude) select GVAR(currentTarget); _directionOfFire = GVAR(directionOfFire) select GVAR(currentTarget); -_windSpeed = (GVAR(windSpeed1) select GVAR(currentTarget)); +_windSpeed1 = (GVAR(windSpeed1) select GVAR(currentTarget)); +_windSpeed2 = (GVAR(windSpeed2) select GVAR(currentTarget)); _windDirection = (GVAR(windDirection) select GVAR(currentTarget)); _inclinationAngle = (GVAR(inclinationAngle) select GVAR(currentTarget)); _targetSpeed = (GVAR(targetSpeed) select GVAR(currentTarget)); @@ -76,4 +77,4 @@ GVAR(rangeCardData) = []; private ["_result"]; _result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, - _windSpeed, _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, true, _stabilityFactor, _twistDirection, _latitude] call FUNC(calculate_solution); + [_windSpeed1, _windSpeed2], _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, true, _stabilityFactor, _twistDirection, _latitude] call FUNC(calculate_solution); diff --git a/addons/atragmx/functions/fnc_calculate_scope_base_angle.sqf b/addons/atragmx/functions/fnc_calculate_scope_base_angle.sqf index 4995c31a61..76c54f63a9 100644 --- a/addons/atragmx/functions/fnc_calculate_scope_base_angle.sqf +++ b/addons/atragmx/functions/fnc_calculate_scope_base_angle.sqf @@ -35,6 +35,6 @@ _barometricPressure = 1013.25; _relativeHumidity = 0; private ["_result"]; -_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, 0, 0, 0, 0, _zeroRange, _airFriction, 1, "ICAO", false, 1.5, 0, 0] call FUNC(calculate_solution); +_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, [0, 0], 0, 0, 0, _zeroRange, _airFriction, 1, "ICAO", false, 1.5, 0, 0] call FUNC(calculate_solution); _scopeBaseAngle + (_result select 0) / 60 diff --git a/addons/atragmx/functions/fnc_calculate_solution.sqf b/addons/atragmx/functions/fnc_calculate_solution.sqf index f7f23044e3..242e2e9c48 100644 --- a/addons/atragmx/functions/fnc_calculate_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_solution.sqf @@ -12,7 +12,7 @@ * 6: barometric pressure * 7: relative humidity * 8: simulation steps - * 9: wind speed + * 9: wind speed * 10: wind direction * 11: inclination angle * 12: target speed @@ -26,15 +26,15 @@ * 20: Latitude * * Return Value: - * 0: Elevation - * 1: Windage - * 2: Lead - * 3: Time of fligth - * 4: Remaining velocity - * 5: Remaining kinetic energy - * 6: Vertical coriolis drift - * 7: Horizontal coriolis drift - * 8: Spin drift + * 0: Elevation (MOA) + * 1: Windage (MOA) + * 2: Lead (MOA) + * 3: Time of fligth (SECONDS) + * 4: Remaining velocity (m/s) + * 5: Remaining kinetic energy (ft·lb) + * 6: Vertical coriolis drift (MOA) + * 7: Horizontal coriolis drift (MOA) + * 8: Spin drift (MOA) * * Example: * call ace_atragmx_calculate_target_range_assist @@ -43,7 +43,7 @@ */ #include "script_component.hpp" -private ["_scopeBaseAngle", "_bulletMass", "_boreHeight", "_airFriction", "_muzzleVelocity", "_temperature", "_barometricPressure", "_relativeHumidity", "_simSteps", "_windSpeed", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange", "_bc", "_dragModel", "_atmosphereModel", "_storeRangeCardData", "_stabilityFactor", "_twistDirection", "_latitude"]; +private ["_scopeBaseAngle", "_bulletMass", "_boreHeight", "_airFriction", "_muzzleVelocity", "_temperature", "_barometricPressure", "_relativeHumidity", "_simSteps", "_windSpeed1", "_windSpeed2", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange", "_bc", "_dragModel", "_atmosphereModel", "_storeRangeCardData", "_stabilityFactor", "_twistDirection", "_latitude"]; _scopeBaseAngle = _this select 0; _bulletMass = _this select 1; _boreHeight = _this select 2; @@ -53,7 +53,8 @@ _temperature = _this select 5; _barometricPressure = _this select 6; _relativeHumidity = _this select 7; _simSteps = _this select 8; -_windSpeed = _this select 9; +_windSpeed1 = (_this select 9) select 0; +_windSpeed2 = (_this select 9) select 1; _windDirection = _this select 10; _inclinationAngle = _this select 11; _targetSpeed = _this select 12; @@ -74,9 +75,10 @@ _bulletSpeed = 0; _gravity = [0, sin(_scopeBaseAngle + _inclinationAngle) * -9.80665, cos(_scopeBaseAngle + _inclinationAngle) * -9.80665]; _deltaT = 1 / _simSteps; -private ["_elevation", "_windage", "_lead", "_TOF", "_trueVelocity", "_trueSpeed", "_kineticEnergy", "_verticalCoriolis", "_verticalDeflection", "_horizontalCoriolis", "_horizontalDeflection", "_spinDrift", "_spinDeflection"]; +private ["_elevation", "_windage1", "_windage2", "_lead", "_TOF", "_trueVelocity", "_trueSpeed", "_kineticEnergy", "_verticalCoriolis", "_verticalDeflection", "_horizontalCoriolis", "_horizontalDeflection", "_spinDrift", "_spinDeflection"]; _elevation = 0; -_windage = 0; +_windage1 = 0; +_windage2 = 0; _lead = 0; _TOF = 0; _trueVelocity = [0, 0, 0]; @@ -99,8 +101,10 @@ if (_storeRangeCardData) then { GVAR(rangeCardData) = []; }; -private ["_wind"]; -_wind = [cos(270 - _windDirection * 30) * _windSpeed, sin(270 - _windDirection * 30) * _windSpeed, 0]; +private ["_wind1", "_wind2", "_windDrift"]; +_wind1 = [cos(270 - _windDirection * 30) * _windSpeed1, sin(270 - _windDirection * 30) * _windSpeed1, 0]; +_wind2 = [cos(270 - _windDirection * 30) * _windSpeed2, sin(270 - _windDirection * 30) * _windSpeed2, 0]; +_windDrift = 0; if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,AdvancedAirDragEnabled), false])) then { _bc = [_bc, _temperature, _barometricPressure, _relativeHumidity, _atmosphereModel] call EFUNC(advanced_ballistics,calculateAtmosphericCorrection); }; @@ -127,7 +131,7 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do { _stepsTotal = _stepsTotal + 1; _speedAverage = (_speedTotal / _stepsTotal); - _trueVelocity = _bulletVelocity vectorDiff _wind; + _trueVelocity = _bulletVelocity vectorDiff _wind1; _trueSpeed = vectorMagnitude _trueVelocity; if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { @@ -156,7 +160,9 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do { if ((_bulletPos select 1) * _rangeFactor >= _range && _range <= GVAR(rangeCardEndRange)) then { if ((_bulletPos select 1) > 0) then { _elevation = - atan((_bulletPos select 2) / (_bulletPos select 1)); - _windage = - atan((_bulletPos select 0) / (_bulletPos select 1)); + _windage1 = - atan((_bulletPos select 0) / (_bulletPos select 1)); + _windDrift = (_wind2 select 0) * (_TOF - (_range / _rangeFactor) / _muzzleVelocity); + _windage2 = - atan(_windDrift / (_bulletPos select 1)); }; if (_range != 0) then { _lead = (_targetSpeed * _TOF) / (Tan(3.38 / 60) * _range); @@ -166,20 +172,22 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do { if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,CoriolisEnabled), false])) then { if ((_bulletPos select 1) > 0) then { - _horizontalDeflection = 0.0000729 * ((_bulletPos select 0) ^ 2) * sin(_latitude) / _speedAverage; + _horizontalDeflection = 0.0000729 * ((_bulletPos select 1) ^ 2) * sin(_latitude) / _speedAverage; _horizontalCoriolis = - atan(_horizontalDeflection / (_bulletPos select 1)); - _windage = _windage + _horizontalCoriolis; + _windage1 = _windage1 + _horizontalCoriolis; + _windage2 = _windage2 + _horizontalCoriolis; }; }; if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,SpinDriftEnabled), false])) then { if ((_bulletPos select 1) > 0) then { _spinDeflection = _twistDirection * 0.0254 * 1.25 * (_stabilityFactor + 1.2) * _TOF ^ 1.83; _spinDrift = - atan(_spinDeflection / (_bulletPos select 1)); - _windage = _windage + _spinDrift; + _windage1 = _windage1 + _spinDrift; + _windage2 = _windage2 + _spinDrift; }; }; - GVAR(rangeCardData) set [_n, [_range, _elevation * 60, _windage * 60, _lead, _TOF, _bulletSpeed, _kineticEnergy]]; + GVAR(rangeCardData) set [_n, [_range, _elevation * 60, [_windage1 * 60, _windage2 * 60], _lead, _TOF, _bulletSpeed, _kineticEnergy]]; _n = _n + 1; }; }; @@ -187,7 +195,9 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do { if ((_bulletPos select 1) > 0) then { _elevation = - atan((_bulletPos select 2) / (_bulletPos select 1)); - _windage = - atan((_bulletPos select 0) / (_bulletPos select 1)); + _windage1 = - atan((_bulletPos select 0) / (_bulletPos select 1)); + _windDrift = (_wind2 select 0) * (_TOF - _targetRange / _muzzleVelocity); + _windage2 = - atan(_windDrift / (_bulletPos select 1)); }; if (_targetRange != 0) then { @@ -199,17 +209,19 @@ _kineticEnergy = _kineticEnergy * 0.737562149; if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,CoriolisEnabled), false])) then { if ((_bulletPos select 1) > 0) then { - _horizontalDeflection = 0.0000729 * ((_bulletPos select 0) ^ 2) * sin(_latitude) / _speedAverage; + _horizontalDeflection = 0.0000729 * ((_bulletPos select 1) ^ 2) * sin(_latitude) / _speedAverage; _horizontalCoriolis = - atan(_horizontalDeflection / (_bulletPos select 1)); - _windage = _windage + _horizontalCoriolis; + _windage1 = _windage1 + _horizontalCoriolis; + _windage2 = _windage2 + _horizontalCoriolis; }; }; if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,SpinDriftEnabled), false])) then { if ((_bulletPos select 1) > 0) then { _spinDeflection = _twistDirection * 0.0254 * 1.25 * (_stabilityFactor + 1.2) * _TOF ^ 1.83; _spinDrift = - atan(_spinDeflection / (_bulletPos select 1)); - _windage = _windage + _spinDrift; + _windage1 = _windage1 + _spinDrift; + _windage2 = _windage2 + _spinDrift; }; }; -[_elevation * 60, _windage * 60, _lead, _TOF, _bulletSpeed, _kineticEnergy, _verticalCoriolis, _horizontalCoriolis, _spinDrift] +[_elevation * 60, [_windage1 * 60, _windage2 * 60], _lead, _TOF, _bulletSpeed, _kineticEnergy, _verticalCoriolis * 60, _horizontalCoriolis * 60, _spinDrift * 60] diff --git a/addons/atragmx/functions/fnc_calculate_target_solution.sqf b/addons/atragmx/functions/fnc_calculate_target_solution.sqf index 764f21cfc9..c8a3683498 100644 --- a/addons/atragmx/functions/fnc_calculate_target_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_target_solution.sqf @@ -60,10 +60,11 @@ if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) }; }; -private ["_latitude", "_directionOfFire", "_windSpeed", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange"]; +private ["_latitude", "_directionOfFire", "_windSpeed1", "_windSpeed2", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange"]; _latitude = GVAR(latitude) select GVAR(currentTarget); _directionOfFire = GVAR(directionOfFire) select GVAR(currentTarget); -_windSpeed = GVAR(windSpeed1) select GVAR(currentTarget); +_windSpeed1 = GVAR(windSpeed1) select GVAR(currentTarget); +_windSpeed2 = GVAR(windSpeed2) select GVAR(currentTarget); _windDirection = GVAR(windDirection) select GVAR(currentTarget); _inclinationAngle = GVAR(inclinationAngle) select GVAR(currentTarget); _targetSpeed = GVAR(targetSpeed) select GVAR(currentTarget); @@ -71,10 +72,11 @@ _targetRange = GVAR(targetRange) select GVAR(currentTarget); private ["_result"]; _result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, - _windSpeed, _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, false, _stabilityFactor, _twistDirection, _latitude] call FUNC(calculate_solution); + [_windSpeed1, _windSpeed2], _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, false, _stabilityFactor, _twistDirection, _latitude] call FUNC(calculate_solution); GVAR(elevationOutput) set [GVAR(currentTarget), _result select 0]; -GVAR(windageOutput) set [GVAR(currentTarget), _result select 1]; +GVAR(windage1Output) set [GVAR(currentTarget), (_result select 1) select 0]; +GVAR(windage2Output) set [GVAR(currentTarget), (_result select 1) select 1]; GVAR(leadOutput) set [GVAR(currentTarget), _result select 2]; GVAR(tofOutput) set [GVAR(currentTarget), _result select 3]; GVAR(velocityOutput) set [GVAR(currentTarget), _result select 4]; diff --git a/addons/atragmx/functions/fnc_change_gun.sqf b/addons/atragmx/functions/fnc_change_gun.sqf index 9b0f18c185..c753f644a4 100644 --- a/addons/atragmx/functions/fnc_change_gun.sqf +++ b/addons/atragmx/functions/fnc_change_gun.sqf @@ -35,7 +35,8 @@ if ((GVAR(scopeUnits) select GVAR(currentScopeUnit)) != "Clicks") then { [] call FUNC(update_gun_ammo_data); GVAR(elevationOutput) set [GVAR(currentTarget), 0]; -GVAR(windageOutput) set [GVAR(currentTarget), 0]; +GVAR(windage1Output) set [GVAR(currentTarget), 0]; +GVAR(windage2Output) set [GVAR(currentTarget), 0]; GVAR(leadOutput) set [GVAR(currentTarget), 0]; GVAR(tofOutput) set [GVAR(currentTarget), 0]; GVAR(velocityOutput) set [GVAR(currentTarget), 0]; diff --git a/addons/atragmx/functions/fnc_init.sqf b/addons/atragmx/functions/fnc_init.sqf index efbd39ef81..881f65a6b0 100644 --- a/addons/atragmx/functions/fnc_init.sqf +++ b/addons/atragmx/functions/fnc_init.sqf @@ -56,8 +56,10 @@ GVAR(inclinationAngle) = [0, 0, 0, 0]; GVAR(targetSpeed) = [0, 0, 0, 0]; GVAR(targetRange) = [0, 0, 0, 0]; +GVAR(showWind2) = false; GVAR(elevationOutput) = [0, 0, 0, 0]; -GVAR(windageOutput) = [0, 0, 0, 0]; +GVAR(windage1Output) = [0, 0, 0, 0]; +GVAR(windage2Output) = [0, 0, 0, 0]; GVAR(leadOutput) = [0, 0, 0, 0]; GVAR(tofOutput) = [0, 0, 0, 0]; GVAR(velocityOutput) = [0, 0, 0, 0]; diff --git a/addons/atragmx/functions/fnc_restore_user_data.sqf b/addons/atragmx/functions/fnc_restore_user_data.sqf index 7c011198d6..6fddc4bed5 100644 --- a/addons/atragmx/functions/fnc_restore_user_data.sqf +++ b/addons/atragmx/functions/fnc_restore_user_data.sqf @@ -26,6 +26,7 @@ GVAR(temperature) = -50 max (profileNamespace getVariable ["ACE_ATragMX_temperat GVAR(barometricPressure) = 340 max (profileNamespace getVariable ["ACE_ATragMX_barometricPressure", 1013.25]) min 1350; GVAR(relativeHumidity) = 0 max (profileNamespace getVariable ["ACE_ATragMX_relativeHumidity", 0.5]) min 1; +GVAR(showWind2) = profileNamespace getVariable ["ACE_ATragMX_showWind2", false]; GVAR(latitude) = profileNamespace getVariable ["ACE_ATragMX_latitude", [38, 38, 38, 38]]; GVAR(directionOfFire) = profileNamespace getVariable ["ACE_ATragMX_directionOfFire", [0, 0, 0, 0]]; GVAR(windSpeed1) = profileNamespace getVariable ["ACE_ATragMX_windSpeed1", [0, 0, 0, 0]]; diff --git a/addons/atragmx/functions/fnc_store_user_data.sqf b/addons/atragmx/functions/fnc_store_user_data.sqf index 81a4476d75..6a66b96ea3 100644 --- a/addons/atragmx/functions/fnc_store_user_data.sqf +++ b/addons/atragmx/functions/fnc_store_user_data.sqf @@ -26,6 +26,7 @@ profileNamespace setVariable ["ACE_ATragMX_temperature", GVAR(temperature)]; profileNamespace setVariable ["ACE_ATragMX_barometricPressure", GVAR(barometricPressure)]; profileNamespace setVariable ["ACE_ATragMX_relativeHumidity", GVAR(relativeHumidity)]; +profileNamespace setVariable ["ACE_ATragMX_showWind2", GVAR(showWind2)]; profileNamespace setVariable ["latitude", GVAR(latitude)]; profileNamespace setVariable ["directionOfFire", GVAR(directionOfFire)]; profileNamespace setVariable ["ACE_ATragMX_windSpeed1", GVAR(windSpeed1)]; diff --git a/addons/atragmx/functions/fnc_update_range_card.sqf b/addons/atragmx/functions/fnc_update_range_card.sqf index 871e5fa268..0c49b6f794 100644 --- a/addons/atragmx/functions/fnc_update_range_card.sqf +++ b/addons/atragmx/functions/fnc_update_range_card.sqf @@ -15,10 +15,14 @@ */ #include "script_component.hpp" -private ["_range", "_elevation", "_windage", "_elevationScopeStep", "_windageScopeStep", "_lead", "_TOF", "_velocity", "_kineticEnergy", "_rangeOutput", "_elevationOutput", "_windageOutput", "_lastColumnOutput"]; +private ["_range", "_elevation", "_windage1", "_windage2", "_elevationScopeStep", "_windageScopeStep", "_lead", "_TOF", "_velocity", "_kineticEnergy", "_rangeOutput", "_elevationOutput", "_windageOutput", "_lastColumnOutput"]; _lastColumnOutput = ""; -ctrlSetText [5006, (GVAR(rangeCardLastColumns) select GVAR(rangeCardCurrentColumn))]; +if (GVAR(showWind2) && GVAR(rangeCardCurrentColumn) == 0) then { + ctrlSetText [5006, "Wind2"]; +} else { + ctrlSetText [5006, (GVAR(rangeCardLastColumns) select GVAR(rangeCardCurrentColumn))]; +}; if (GVAR(currentUnit) == 1) then { ctrlSetText [5003, "Yards"]; @@ -31,7 +35,8 @@ lnbClear 5007; { _range = _x select 0; _elevation = _x select 1; - _windage = _x select 2; + _windage1 = (_x select 2) select 0; + _windage2 = (_x select 2) select 1; _lead = _x select 3; _TOF = _x select 4; _velocity = _x select 5; @@ -40,23 +45,26 @@ lnbClear 5007; switch (GVAR(currentScopeUnit)) do { case 0: { _elevation = _elevation / 3.38; - _windage = _windage / 3.38; - }; + _windage1 = _windage1 / 3.38; + _windage2 = _windage2 / 3.38; + }; case 2: { _elevation = _elevation * 1.047; - _windage = _windage * 1.047; + _windage1 = _windage1 * 1.047; + _windage2 = _windage2 * 1.047; }; case 3: { _elevationScopeStep = (GVAR(workingMemory) select 7); _windageScopeStep = (GVAR(workingMemory) select 8); _elevation = Round(_elevation / _elevationScopeStep); - _windage = Round(_windage / _windageScopeStep); + _windage1 = Round(_windage1 / _windageScopeStep); + _windage2 = Round(_windage2 / _windageScopeStep); }; }; _elevationOutput = Str(Round(_elevation * 100) / 100); - _windageOutput = Str(Round(_windage * 100) / 100); + _windageOutput = Str(Round(_windage1 * 100) / 100); _rangeOutput = Str(_range); if (_velocity < 340.29) then { @@ -69,7 +77,11 @@ lnbClear 5007; switch (GVAR(rangeCardCurrentColumn)) do { case 0: { - _lastColumnOutput = Str(Round(_lead * 100) / 100); + if (GVAR(showWind2)) then { + _lastColumnOutput = Str(Round(_windage2 * 100) / 100); + } else { + _lastColumnOutput = Str(Round(_lead * 100) / 100); + }; }; case 1: { _lastColumnOutput = Str(Round(_velocity)); diff --git a/addons/atragmx/functions/fnc_update_relative_click_memory.sqf b/addons/atragmx/functions/fnc_update_relative_click_memory.sqf index 1d5add83db..1dc534ce4b 100644 --- a/addons/atragmx/functions/fnc_update_relative_click_memory.sqf +++ b/addons/atragmx/functions/fnc_update_relative_click_memory.sqf @@ -16,6 +16,6 @@ #include "script_component.hpp" GVAR(workingMemory) set [10, (GVAR(elevationOutput) select GVAR(currentTarget))]; -GVAR(workingMemory) set [11, (GVAR(windageOutput) select GVAR(currentTarget))]; +GVAR(workingMemory) set [11, (GVAR(windage1Output) select GVAR(currentTarget))]; [] call FUNC(update_result); diff --git a/addons/atragmx/functions/fnc_update_result.sqf b/addons/atragmx/functions/fnc_update_result.sqf index 6898920eac..a86170fd45 100644 --- a/addons/atragmx/functions/fnc_update_result.sqf +++ b/addons/atragmx/functions/fnc_update_result.sqf @@ -15,9 +15,11 @@ */ #include "script_component.hpp" -private ["_elevationAbs", "_elevationRel", "_elevationCur", "_windageAbs", "_windageRel", "_windageCur", "_lead", "_elevationScopeStep", "_windageScopeStep"]; -_elevationAbs = (GVAR(elevationOutput) select GVAR(currentTarget)); -_windageAbs = (GVAR(windageOutput) select GVAR(currentTarget)); +private ["_elevationAbs", "_elevationRel", "_elevationCur", "_windageAbs", "_wind2", "_windageRel", "_windageCur", "_lead", "_elevationScopeStep", "_windageScopeStep"]; +_elevationAbs = GVAR(elevationOutput) select GVAR(currentTarget); +_windageAbs = GVAR(windage1Output) select GVAR(currentTarget); + +_wind2 = GVAR(windage2Output) select GVAR(currentTarget); _elevationCur = GVAR(workingMemory) select 10; _windageCur = GVAR(workingMemory) select 11; @@ -25,13 +27,15 @@ _windageCur = GVAR(workingMemory) select 11; _elevationRel = _elevationAbs - _elevationCur; _windageRel = _windageAbs - _windageCur; -_lead = (GVAR(leadOutput) select GVAR(currentTarget)); +_lead = GVAR(leadOutput) select GVAR(currentTarget); switch (GVAR(currentScopeUnit)) do { case 0: { _elevationAbs = _elevationAbs / 3.38; _windageAbs = _windageAbs / 3.38; + _wind2 = _wind2 / 3.38; + _elevationRel = _elevationRel / 3.38; _windageRel = _windageRel / 3.38; @@ -42,6 +46,8 @@ switch (GVAR(currentScopeUnit)) do { _elevationAbs = _elevationAbs * 1.047; _windageAbs = _windageAbs * 1.047; + _wind2 = _wind2 / 1.047; + _elevationRel = _elevationRel * 1.047; _windageRel = _windageRel * 1.047; @@ -55,6 +61,8 @@ switch (GVAR(currentScopeUnit)) do { _elevationAbs = Round(_elevationAbs / _elevationScopeStep); _windageAbs = Round(_windageAbs / _windageScopeStep); + _wind2 = Round(_wind2 / _windageScopeStep); + _elevationRel = Round(_elevationRel / _elevationScopeStep); _windageRel = Round(_windageRel / _windageScopeStep); @@ -63,6 +71,12 @@ switch (GVAR(currentScopeUnit)) do { }; }; +if (GVAR(showWind2)) then { + ctrlSetText [42, "Wind2"]; +} else { + ctrlSetText [42, "Lead"]; +}; + ctrlSetText [400, Str(Round(_elevationAbs * 100) / 100)]; ctrlSetText [401, Str(Round(_elevationRel * 100) / 100)]; ctrlSetText [402, Str(Round(_elevationCur * 100) / 100)]; @@ -71,4 +85,8 @@ ctrlSetText [410, Str(Round(_windageAbs * 100) / 100)]; ctrlSetText [411, Str(Round(_windageRel * 100) / 100)]; ctrlSetText [412, Str(Round(_windageCur * 100) / 100)]; -ctrlSetText [420, Str(Round(_lead * 100) / 100)]; +if (GVAR(showWind2)) then { + ctrlSetText [420, Str(Round(_wind2 * 100) / 100)]; +} else { + ctrlSetText [420, Str(Round(_lead * 100) / 100)]; +}; \ No newline at end of file diff --git a/addons/atragmx/functions/fnc_update_target.sqf b/addons/atragmx/functions/fnc_update_target.sqf index c5a02c0164..dab62e099d 100644 --- a/addons/atragmx/functions/fnc_update_target.sqf +++ b/addons/atragmx/functions/fnc_update_target.sqf @@ -15,10 +15,18 @@ */ #include "script_component.hpp" -if (GVAR(currentUnit) != 2) then { - ctrlSetText [300, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 2.23693629 * 100) / 100)]; +if (GVAR(showWind2)) then { + if (GVAR(currentUnit) != 2) then { + ctrlSetText [300, format["%1/%2", Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 2.23693629), Round((GVAR(windSpeed2) select GVAR(currentTarget)) * 2.23693629)]]; + } else { + ctrlSetText [300, format["%1/%2", Round(GVAR(windSpeed1) select GVAR(currentTarget)), Round(GVAR(windSpeed2) select GVAR(currentTarget))]]; + }; } else { - ctrlSetText [300, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 100) / 100)]; + if (GVAR(currentUnit) != 2) then { + ctrlSetText [300, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 2.23693629 * 100) / 100)]; + } else { + ctrlSetText [300, Str(Round((GVAR(windSpeed1) select GVAR(currentTarget)) * 100) / 100)]; + }; }; ctrlSetText [310, Str(Round((GVAR(windDirection) select GVAR(currentTarget))))]; ctrlSetText [320, Str(Round((GVAR(inclinationAngle) select GVAR(currentTarget))))]; diff --git a/addons/atragmx/functions/fnc_update_zero_range.sqf b/addons/atragmx/functions/fnc_update_zero_range.sqf index 6e2a9c566c..a5cab3755e 100644 --- a/addons/atragmx/functions/fnc_update_zero_range.sqf +++ b/addons/atragmx/functions/fnc_update_zero_range.sqf @@ -44,7 +44,7 @@ _barometricPressure = GVAR(barometricPressure); _relativeHumidity = GVAR(relativeHumidity); private ["_result"]; -_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, 0, 0, 0, 0, _zeroRange, _bc, _dragModel, _atmosphereModel, false, 1.5, 0, 0] call FUNC(calculate_solution); +_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, [0, 0], 0, 0, 0, _zeroRange, _bc, _dragModel, _atmosphereModel, false, 1.5, 0, 0] call FUNC(calculate_solution); GVAR(workingMemory) set [2, _zeroRange]; GVAR(workingMemory) set [3, _scopeBaseAngle + (_result select 0) / 60]; From 5e45734cf401f46d53e87fcfec0768852fe66269 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sat, 18 Apr 2015 15:52:06 +0200 Subject: [PATCH 228/305] Implemented the dual inclination angle input method --- addons/atragmx/RscTitles.hpp | 2 ++ addons/atragmx/XEH_preInit.sqf | 1 + addons/atragmx/functions/fnc_parse_input.sqf | 11 +++++++- .../fnc_update_inclination_angle.sqf | 26 +++++++++++++++++++ 4 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 addons/atragmx/functions/fnc_update_inclination_angle.sqf diff --git a/addons/atragmx/RscTitles.hpp b/addons/atragmx/RscTitles.hpp index 0752f8beb7..6497606683 100644 --- a/addons/atragmx/RscTitles.hpp +++ b/addons/atragmx/RscTitles.hpp @@ -1271,12 +1271,14 @@ class ATragMX_Display { w=0.045; x=0.550*safezoneW+safezoneX+0.300; y=0.265*safezoneH+safezoneY+0.440; + onKeyUp=QUOTE(if (_this select 1 == 28) then {0 call FUNC(update_inclination_angle)}); }; class TEXT_TARGET_DATA_INCLINATION_ANGLE_INPUT_DEGREE: TEXT_TARGET_DATA_LATITUDE_INPUT { idc=140040; w=0.045; x=0.550*safezoneW+safezoneX+0.350; y=0.265*safezoneH+safezoneY+0.440; + onKeyUp=QUOTE(if (_this select 1 == 28) then {1 call FUNC(update_inclination_angle)}); }; class TEXT_TARGET_DATA_TARGET_SPEED: TEXT_TARGET_DATA_LATITUDE { idc=14005; diff --git a/addons/atragmx/XEH_preInit.sqf b/addons/atragmx/XEH_preInit.sqf index 10e0aff61c..6a640f162e 100644 --- a/addons/atragmx/XEH_preInit.sqf +++ b/addons/atragmx/XEH_preInit.sqf @@ -53,6 +53,7 @@ PREP(update_atmo_env_data); PREP(update_atmo_selection); PREP(update_gun); PREP(update_gun_ammo_data); +PREP(update_inclination_angle); PREP(update_range_card); PREP(update_relative_click_memory); PREP(update_result); diff --git a/addons/atragmx/functions/fnc_parse_input.sqf b/addons/atragmx/functions/fnc_parse_input.sqf index 172df7bd58..ca22c62663 100644 --- a/addons/atragmx/functions/fnc_parse_input.sqf +++ b/addons/atragmx/functions/fnc_parse_input.sqf @@ -25,12 +25,21 @@ if (GVAR(currentUnit) == 1) then { GVAR(barometricPressure) = GVAR(barometricPressure) * 33.86389; }; +private ["_inclinationAngleCosine", "_inclinationAngleDegree"]; GVAR(latitude) set [GVAR(currentTarget), -90 max Round(parseNumber(ctrlText 140000)) min 90]; GVAR(directionOfFire) set [GVAR(currentTarget), 0 max abs(Round(parseNumber(ctrlText 140010))) min 359]; GVAR(windSpeed1) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140020)) min 50]; GVAR(windSpeed2) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140021)) min 50]; GVAR(windDirection) set [GVAR(currentTarget), 1 max Round(parseNumber(ctrlText 140030)) min 12]; -GVAR(inclinationAngle) set [GVAR(currentTarget), -60 max parseNumber(ctrlText 140040) min 60]; +_inclinationAngleCosine = 0.5 max parseNumber(ctrlText 140041) max 1; +_inclinationAngleDegree = -60 max parseNumber(ctrlText 140040) min 60; +if (_inclinationAngleDegree != GVAR(inclinationAngle) select GVAR(currentTarget)) then { + GVAR(inclinationAngle) set [GVAR(currentTarget), _inclinationAngleDegree]; +} else { + if (_inclinationAngleCosine != cos(GVAR(inclinationAngle) select GVAR(currentTarget))) then { + GVAR(inclinationAngle) set [GVAR(currentTarget), acos(_inclinationAngleCosine)]; + }; +}; GVAR(targetSpeed) set [GVAR(currentTarget), -50 max abs(parseNumber(ctrlText 140050)) min 50]; GVAR(targetRange) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140060)) min 4000]; if (GVAR(currentUnit) != 2) then { diff --git a/addons/atragmx/functions/fnc_update_inclination_angle.sqf b/addons/atragmx/functions/fnc_update_inclination_angle.sqf new file mode 100644 index 0000000000..b47936b2c0 --- /dev/null +++ b/addons/atragmx/functions/fnc_update_inclination_angle.sqf @@ -0,0 +1,26 @@ +/* + * Author: Ruthberg + * Updates the inclination angle input fields + * + * Arguments: + * Reference input field ID + * + * Return Value: + * Nothing + * + * Example: + * 0 call ace_atragmx_fnc_update_inclination_angle + * + * Public: No + */ +#include "script_component.hpp" + +private ["_inclinationAngleCosine", "_inclinationAngleDegree"]; +_inclinationAngleCosine = 0.5 max parseNumber(ctrlText 140041) max 1; +_inclinationAngleDegree = -60 max parseNumber(ctrlText 140040) min 60; + +if (_this == 0) then { + ctrlSetText [140040, Str(round(acos(_inclinationAngleCosine)))]; +} else { + ctrlSetText [140041, Str(floor(cos(_inclinationAngleDegree) * 100) / 100)]; +}; From 170a8d064120cded61757ba92dd050eb07d8d90a Mon Sep 17 00:00:00 2001 From: Grzegorz Sikora Date: Sat, 18 Apr 2015 13:56:34 +0200 Subject: [PATCH 229/305] PL translation --- addons/optionsmenu/stringtable.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/optionsmenu/stringtable.xml b/addons/optionsmenu/stringtable.xml index 2bc66b8b52..5c292ea16f 100644 --- a/addons/optionsmenu/stringtable.xml +++ b/addons/optionsmenu/stringtable.xml @@ -1,4 +1,5 @@  + @@ -215,6 +216,7 @@ Option Menu UI Scaling + Skalowanie UI menu ustawień \ No newline at end of file From f31e3c1fd4b335c6a2785af15c8edc1d999da7b3 Mon Sep 17 00:00:00 2001 From: jaynus Date: Sat, 18 Apr 2015 08:31:03 -0700 Subject: [PATCH 230/305] litter simulation createVehicleLocal /w temporal network sync. --- addons/medical/ACE_Settings.hpp | 6 +++ addons/medical/XEH_postInit.sqf | 4 ++ addons/medical/XEH_preInit.sqf | 5 +- addons/medical/functions/fnc_createLitter.sqf | 48 +++++-------------- .../functions/fnc_handleCreateLitter.sqf | 23 +++++++++ 5 files changed, 48 insertions(+), 38 deletions(-) create mode 100644 addons/medical/functions/fnc_handleCreateLitter.sqf diff --git a/addons/medical/ACE_Settings.hpp b/addons/medical/ACE_Settings.hpp index 56e5a531ec..81dd34a01a 100644 --- a/addons/medical/ACE_Settings.hpp +++ b/addons/medical/ACE_Settings.hpp @@ -124,4 +124,10 @@ class ACE_Settings { values[] = {"$STR_ACE_Medical_painEffect_Flash", "$STR_ACE_Medical_painEffect_Chroma"}; isClientSettable = 1; }; + + class GVAR(litterSimulationDetail) { + typeName = "SCALAR"; + value = 2; + values[] = {"None", "500", "All"}; + }; }; diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index 309bb2a888..c7390c18be 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -265,3 +265,7 @@ if (USE_WOUND_EVENT_SYNC) then { ["playerInventoryChanged", { [ACE_player] call FUNC(itemCheck); }] call EFUNC(common,addEventHandler); + + +// Networked litter +[QGVAR(createLitter), FUNC(handleCreateLitter)] call EFUNC(common,addSyncedEventHandler); \ No newline at end of file diff --git a/addons/medical/XEH_preInit.sqf b/addons/medical/XEH_preInit.sqf index f15b4ec109..78a2e7f71b 100644 --- a/addons/medical/XEH_preInit.sqf +++ b/addons/medical/XEH_preInit.sqf @@ -21,7 +21,6 @@ PREP(adjustPainLevel); PREP(canAccessMedicalEquipment); PREP(canTreat); PREP(canTreatCached); -PREP(createLitter); PREP(determineIfFatal); PREP(getBloodLoss); PREP(getBloodPressure); @@ -98,6 +97,10 @@ PREP(moduleTreatmentConfiguration); PREP(copyDeadBody); PREP(requestWoundSync); +// Networked litter +PREP(createLitter); +PREP(handleCreateLitter); + GVAR(injuredUnitCollection) = []; GVAR(IVBags) = []; diff --git a/addons/medical/functions/fnc_createLitter.sqf b/addons/medical/functions/fnc_createLitter.sqf index 570c6d63d3..cc3e32eb5e 100644 --- a/addons/medical/functions/fnc_createLitter.sqf +++ b/addons/medical/functions/fnc_createLitter.sqf @@ -37,21 +37,19 @@ if !(isArray (_config >> "litter")) exitwith {}; _litter = getArray (_config >> "litter"); _createLitter = { + private["_position", "_litterClass", "_direction"]; _position = getPos (_this select 0); _litterClass = _this select 1; - _litterObject = createVehicle [_litterClass, _position, [], 0, "NONE"]; if (random(1) >= 0.5) then { - _litterObject setPos [(_position select 0) + random 2, (_position select 1) + random 2, _position select 2]; + _position = [(_position select 0) + random 2, (_position select 1) + random 2, _position select 2]; } else { - _litterObject setPos [(_position select 0) - random 2, (_position select 1) - random 2, _position select 2]; + _position = [(_position select 0) - random 2, (_position select 1) - random 2, _position select 2]; }; - _litterObject setDir (random 360); - _litterObject; -}; - -if (isnil QGVAR(allCreatedLitter)) then { - GVAR(allCreatedLitter) = []; - GVAR(litterPFHRunning) = false; + _direction = (random 360); + + [QGVAR(createLitter), [_litterClass,_position,_direction], 0] call EFUNC(common,syncedEvent); + + true }; _createdLitter = []; @@ -75,37 +73,13 @@ _createdLitter = []; // Loop through through the litter options and place the litter { if (typeName _x == "ARRAY" && {(count _x > 0)}) then { - _createdLitter pushback ([_target, _x select (floor(random(count _x)))] call _createLitter); + [_target, _x select (floor(random(count _x)))] call _createLitter; }; if (typeName _x == "STRING") then { - _createdLitter pushback ([_target, _x] call _createLitter); + [_target, _x] call _createLitter; }; }foreach _litterOptions; }; }; }; -}foreach _litter; - -if (GVAR(litterCleanUpDelay) >= 0) then { - GVAR(allCreatedLitter) pushback [time, GVAR(litterCleanUpDelay), _createdLitter]; -}; - -if !(GVAR(litterPFHRunning)) then { - GVAR(litterPFHRunning) = true; - [{ - { - if (time - (_x select 0) >= (_x select 1)) then { - { - deleteVehicle _x; - }foreach (_this select 2); - GVAR(allCreatedLitter) set[_foreachIndex, objNull]; - }; - }foreach GVAR(allCreatedLitter); - GVAR(allCreatedLitter) = GVAR(allCreatedLitter) - [objNull]; - - if (count GVAR(allCreatedLitter) == 0) exitwith { - GVAR(litterPFHRunning) = false; - [_this select 1] call CBA_fnc_removePerFrameHandler; - }; - }, 30, []] call CBA_fnc_addPerFrameHandler; -}; +}foreach _litter; \ No newline at end of file diff --git a/addons/medical/functions/fnc_handleCreateLitter.sqf b/addons/medical/functions/fnc_handleCreateLitter.sqf new file mode 100644 index 0000000000..f6bd821831 --- /dev/null +++ b/addons/medical/functions/fnc_handleCreateLitter.sqf @@ -0,0 +1,23 @@ +#include "script_component.hpp" +PARAMS_3(_litterClass,_position,_direction); +private["_litterObject"]; + + + +if (isnil QGVAR(allCreatedLitter)) then { + GVAR(allCreatedLitter) = []; + GVAR(litterPFHRunning) = false; +}; + +if((count GVAR(allCreatedLitter)) <= GVAR(litterSimulationDetail) )then { + _litterObject = createVehicleLocal [_litterClass, _position, [], 0, "NONE"]; + _litterObject setDir _direction; +} else { + // @TODO: We hit max litter items, remove a few of them to work with what we have. + // Basically, we should just start FIFO'ing these +}; + +GVAR(allCreatedLitter) pushBack _litterObject; +//GVAR(allCreatedLitter) = GVAR(allCreatedLitter) - [objNull]; + +true \ No newline at end of file From c5f5b11d31e4c1a9820eae60b3fc08b0ced480b6 Mon Sep 17 00:00:00 2001 From: jaynus Date: Sat, 18 Apr 2015 08:37:21 -0700 Subject: [PATCH 231/305] strings. --- addons/medical/ACE_Settings.hpp | 6 ++++-- addons/medical/stringtable.xml | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/addons/medical/ACE_Settings.hpp b/addons/medical/ACE_Settings.hpp index 81dd34a01a..51ff72f465 100644 --- a/addons/medical/ACE_Settings.hpp +++ b/addons/medical/ACE_Settings.hpp @@ -126,8 +126,10 @@ class ACE_Settings { }; class GVAR(litterSimulationDetail) { + displayName = "$STR_ACE_Medical_litterSimulationDetail"; + description = "$STR_ACE_Medical_litterSimulationDetail_Desc"; typeName = "SCALAR"; - value = 2; - values[] = {"None", "500", "All"}; + value = 500; + isClientSettable = 1; }; }; diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 9f651e90b7..b77649a072 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -1,6 +1,12 @@  + + Litter Simulation Detail + + + 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. + Inject Atropine Atropin injizieren From d1993836aef8d2509f25381cd33ef42f5f22a4f0 Mon Sep 17 00:00:00 2001 From: jaynus Date: Sat, 18 Apr 2015 08:40:28 -0700 Subject: [PATCH 232/305] Cleanup. missing string. --- addons/missileguidance/CfgAmmo.hpp | 6 -- addons/missileguidance/CfgVehicles.hpp | 3 +- .../Example_ACE_MissileGuidance.hpp | 65 ------------------- addons/missileguidance/stringtable.xml | 3 + 4 files changed, 5 insertions(+), 72 deletions(-) delete mode 100644 addons/missileguidance/Example_ACE_MissileGuidance.hpp diff --git a/addons/missileguidance/CfgAmmo.hpp b/addons/missileguidance/CfgAmmo.hpp index a4a4f7e25d..680a410506 100644 --- a/addons/missileguidance/CfgAmmo.hpp +++ b/addons/missileguidance/CfgAmmo.hpp @@ -46,9 +46,6 @@ class CfgAmmo { minDeflection = 0.00025; // Minium flap deflection for guidance maxDeflection = 0.001; // Maximum flap deflection for guidance incDeflection = 0.0005; // The incrmeent in which deflection adjusts. - //minDeflection = 0.005; - //maxDeflection = 0.5; - //incDeflection = 0.005; canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode @@ -119,9 +116,6 @@ class CfgAmmo { minDeflection = 0.00005; // Minium flap deflection for guidance maxDeflection = 0.025; // Maximum flap deflection for guidance incDeflection = 0.00005; // The incrmeent in which deflection adjusts. - //minDeflection = 0.005; - //maxDeflection = 0.5; - //incDeflection = 0.005; canVanillaLock = 0; diff --git a/addons/missileguidance/CfgVehicles.hpp b/addons/missileguidance/CfgVehicles.hpp index 7707717c9e..301795b8d7 100644 --- a/addons/missileguidance/CfgVehicles.hpp +++ b/addons/missileguidance/CfgVehicles.hpp @@ -17,7 +17,7 @@ class CfgVehicles { class MainTurret; }; }; - + class ACE_Comanche_Test : B_Heli_Attack_01_F { displayName = "ACE_Comanche_Test"; author = "ACE Team"; @@ -30,4 +30,5 @@ class CfgVehicles { }; }; }; + }; diff --git a/addons/missileguidance/Example_ACE_MissileGuidance.hpp b/addons/missileguidance/Example_ACE_MissileGuidance.hpp deleted file mode 100644 index d9c1ea8a2c..0000000000 --- a/addons/missileguidance/Example_ACE_MissileGuidance.hpp +++ /dev/null @@ -1,65 +0,0 @@ -THIS IS A WIP FUNCTIONALITY, DUE TO CHANGE - - - class M_PG_AT : MissileBase { - model = "\A3\Weapons_F\Ammo\Rocket_01_fly_F"; - proxyShape = "\A3\Weapons_F\Ammo\Rocket_01_F"; - - irLock = 0; - laserLock = 0; - airLock = 0; - weaponLockSystem = "2 + 16"; - - maxSpeed = 720; - maxControlRange = 5000; - maneuvrability = 8; - timeToLive = 60; - simulationStep = 0.01; - airFriction = 0.1; - sideAirFriction = 0.16; - initTime = 0.002; - thrustTime = 1.07; - thrust = 530; - fuseDistance = 2; - - effectsMissileInit = "MissileDAR1"; - effectsMissile = "missile2"; - whistleDist = 4; - muzzleEffect = ""; - - // Turn off arma crosshair-guidance - manualControl = 0; - - // ACE uses these values - trackOversteer = 1; - trackLead = 0; - - // Begin ACE guidance Configs - class ACE_MissileGuidance { - enabled = 1; - - minDeflection = 0.005; // Minium flap deflection for guidance - maxDeflection = 0.025; // Maximum flap deflection for guidance - incDeflection = 0.005; // The incrmeent in which deflection adjusts. - //minDeflection = 0.005; - //maxDeflection = 0.5; - //incDeflection = 0.005; - - // Guidance type for munitions - defaultSeekerType = "SALH"; - seekerTypes[] = { "SALH", "LIDAR", "SARH", "Optic", "Thermal", "GPS", "SACLOS", "MCLOS" }; - - defaultSeekerLockMode = "LOAL"; - seekerLockModes[] = { "LOAL", "LOBL" }; - - seekerAngle = 90; // Angle in front of the missile which can be searched - seekerAccuracy = 1; // seeker accuracy multiplier - - seekerMinRange = 1; - seekerMaxRange = 2500; // Range from the missile which the seeker can visually search - - // Attack profile type selection - defaultAttackProfile = "LIN"; - attackProfiles[] = { "LIN", "DIR", "MID", "HI", "TOP", "PYM" }; - }; - }; \ No newline at end of file diff --git a/addons/missileguidance/stringtable.xml b/addons/missileguidance/stringtable.xml index c9cb4c4c6b..ab3a449aa6 100644 --- a/addons/missileguidance/stringtable.xml +++ b/addons/missileguidance/stringtable.xml @@ -13,6 +13,9 @@ Fejlett rakétairányító Расширенный ракетой + + Advanced missile guidance, or AMG, provides multiple enhancements to missile locking and firing. It is also a framework required for missile weapon types. + Hydra-70 DAGR Missile From 370e6bd9a7c7b43f7fa19a1e1896f23258b00953 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 18 Apr 2015 17:42:13 +0200 Subject: [PATCH 233/305] maybe fix for #741, Speedlimiter locking vehicle controls --- addons/vehicles/functions/fnc_speedLimiter.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/vehicles/functions/fnc_speedLimiter.sqf b/addons/vehicles/functions/fnc_speedLimiter.sqf index 2332336e0a..053d96d470 100644 --- a/addons/vehicles/functions/fnc_speedLimiter.sqf +++ b/addons/vehicles/functions/fnc_speedLimiter.sqf @@ -35,7 +35,7 @@ _maxSpeed = speed _vehicle max 10; _speed = speed _vehicle; if (_speed > _maxSpeed) then { - _vehicle setVelocity ((velocity _vehicle) vectorMultiply (_maxSpeed / _speed)); + _vehicle setVelocity ((velocity _vehicle) vectorMultiply ((_maxSpeed / _speed) - 0.00001)); // fix 1.42-hotfix PhysX libraries applying force in previous direction when turning }; } , 0, [_driver, _vehicle, _maxSpeed]] call CBA_fnc_addPerFrameHandler; From fc39b81c958284193b78afbee69d72025b774569 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sat, 18 Apr 2015 17:45:32 +0200 Subject: [PATCH 234/305] *Fixed a minor bug in the dual inclination calculation *Added a profile namespace format version *The profileNamespace data is now automatically reset on version mismatch --- addons/atragmx/XEH_postInit.sqf | 3 +- addons/atragmx/XEH_preInit.sqf | 1 + .../atragmx/functions/fnc_clear_user_data.sqf | 39 +++++++++++++++++++ addons/atragmx/functions/fnc_parse_input.sqf | 5 ++- .../atragmx/functions/fnc_store_user_data.sqf | 2 + .../fnc_toggle_target_speed_assist.sqf | 10 +++-- .../fnc_update_inclination_angle.sqf | 4 +- .../functions/fnc_update_target_data.sqf | 2 +- addons/atragmx/script_component.hpp | 2 + 9 files changed, 59 insertions(+), 9 deletions(-) create mode 100644 addons/atragmx/functions/fnc_clear_user_data.sqf diff --git a/addons/atragmx/XEH_postInit.sqf b/addons/atragmx/XEH_postInit.sqf index 01b13fc85e..e5f7dd42d3 100644 --- a/addons/atragmx/XEH_postInit.sqf +++ b/addons/atragmx/XEH_postInit.sqf @@ -2,7 +2,7 @@ #include "initKeybinds.sqf" -if (count (profileNamespace getVariable ["ACE_ATragMX_gunList", []]) > 0) then { +if ((profileNamespace getVariable ["ACE_ATragMX_profileNamespaceVersion", 0]) == ATRAGMX_PROFILE_NAMESPACE_VERSION && count (profileNamespace getVariable ["ACE_ATragMX_gunList", []]) > 0) then { GVAR(gunList) = profileNamespace getVariable "ACE_ATragMX_gunList"; } else { // Profile Name, Muzzle Velocity, Zero Range, Scope Base Angle, AirFriction, Bore Height, Scope Unit, Elevation Scope Step, Windage Scope Step, Maximum Elevation, Dialed Elevation, Dialed Windage, Mass, Bullet Diameter, Rifle Twist, BC, Drag Model, Atmosphere Model @@ -39,6 +39,7 @@ if (count (profileNamespace getVariable ["ACE_ATragMX_gunList", []]) > 0) then { ["5.56x45mm Mk262" , 820, 100, 0.0671, -0.0011250, 3.81, 0, 0.338, 0.338, 120, 0, 0, 4.990, 5.70, 17.78, 0.361, 1, "ASM" ], ["5.56x45mm Mk318" , 880, 100, 0.0616, -0.0011200, 3.81, 0, 0.338, 0.338, 120, 0, 0, 4.018, 5.70, 17.78, 0.307, 1, "ASM" ]]; + [] call FUNC(clear_user_data); profileNamespace setVariable ["ACE_ATragMX_gunList", GVAR(gunList)]; }; diff --git a/addons/atragmx/XEH_preInit.sqf b/addons/atragmx/XEH_preInit.sqf index 6a640f162e..b85e325494 100644 --- a/addons/atragmx/XEH_preInit.sqf +++ b/addons/atragmx/XEH_preInit.sqf @@ -12,6 +12,7 @@ PREP(calculate_target_speed_assist); PREP(can_show); PREP(change_gun); PREP(change_target_slot); +PREP(clear_user_data); PREP(create_dialog); PREP(cycle_gun_list); PREP(cycle_image_size_units); diff --git a/addons/atragmx/functions/fnc_clear_user_data.sqf b/addons/atragmx/functions/fnc_clear_user_data.sqf new file mode 100644 index 0000000000..10f31741f2 --- /dev/null +++ b/addons/atragmx/functions/fnc_clear_user_data.sqf @@ -0,0 +1,39 @@ +/* + * Author: Ruthberg + * Removes all user data from the profileNamespace + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_clear_user_data + * + * Public: No + */ +#include "script_component.hpp" + +profileNamespace setVariable ["ACE_ATragMX_gunList", nil]; + +profileNamespace setVariable ["ACE_ATragMX_currentUnit", nil]; +profileNamespace setVariable ["ACE_ATragMX_currentGun", nil]; +profileNamespace setVariable ["ACE_ATragMX_currentTarget", nil]; +profileNamespace setVariable ["ACE_ATragMX_currentScopeUnit", nil]; + +profileNamespace setVariable ["ACE_ATragMX_atmosphereModeTBH", nil]; +profileNamespace setVariable ["ACE_ATragMX_altitude", nil]; +profileNamespace setVariable ["ACE_ATragMX_temperature", nil]; +profileNamespace setVariable ["ACE_ATragMX_barometricPressure", nil]; +profileNamespace setVariable ["ACE_ATragMX_relativeHumidity", nil]; + +profileNamespace setVariable ["ACE_ATragMX_showWind2", nil]; +profileNamespace setVariable ["latitude", nil]; +profileNamespace setVariable ["directionOfFire", nil]; +profileNamespace setVariable ["ACE_ATragMX_windSpeed1", nil]; +profileNamespace setVariable ["ACE_ATragMX_windSpeed2", nil]; +profileNamespace setVariable ["ACE_ATragMX_windDirection", nil]; +profileNamespace setVariable ["ACE_ATragMX_inclinationAngle", nil]; +profileNamespace setVariable ["ACE_ATragMX_targetSpeed", nil]; +profileNamespace setVariable ["ACE_ATragMX_targetRange", nil]; diff --git a/addons/atragmx/functions/fnc_parse_input.sqf b/addons/atragmx/functions/fnc_parse_input.sqf index ca22c62663..aa77fc8111 100644 --- a/addons/atragmx/functions/fnc_parse_input.sqf +++ b/addons/atragmx/functions/fnc_parse_input.sqf @@ -31,12 +31,12 @@ GVAR(directionOfFire) set [GVAR(currentTarget), 0 max abs(Round(parseNumber(ctrl GVAR(windSpeed1) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140020)) min 50]; GVAR(windSpeed2) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140021)) min 50]; GVAR(windDirection) set [GVAR(currentTarget), 1 max Round(parseNumber(ctrlText 140030)) min 12]; -_inclinationAngleCosine = 0.5 max parseNumber(ctrlText 140041) max 1; +_inclinationAngleCosine = 0.5 max parseNumber(ctrlText 140041) min 1; _inclinationAngleDegree = -60 max parseNumber(ctrlText 140040) min 60; if (_inclinationAngleDegree != GVAR(inclinationAngle) select GVAR(currentTarget)) then { GVAR(inclinationAngle) set [GVAR(currentTarget), _inclinationAngleDegree]; } else { - if (_inclinationAngleCosine != cos(GVAR(inclinationAngle) select GVAR(currentTarget))) then { + if (_inclinationAngleCosine != Round(cos(GVAR(inclinationAngle) select GVAR(currentTarget)) * 100) / 100) then { GVAR(inclinationAngle) set [GVAR(currentTarget), acos(_inclinationAngleCosine)]; }; }; @@ -120,5 +120,6 @@ GVAR(workingMemory) set [11, _windageCur]; [] call FUNC(update_atmosphere); [] call FUNC(update_atmo_env_data); [] call FUNC(update_target); +[] call FUNC(update_target_data); [] call FUNC(store_user_data); diff --git a/addons/atragmx/functions/fnc_store_user_data.sqf b/addons/atragmx/functions/fnc_store_user_data.sqf index 6a66b96ea3..66207444d2 100644 --- a/addons/atragmx/functions/fnc_store_user_data.sqf +++ b/addons/atragmx/functions/fnc_store_user_data.sqf @@ -15,6 +15,8 @@ */ #include "script_component.hpp" +profileNamespace setVariable ["ACE_ATragMX_profileNamespaceVersion", ATRAGMX_PROFILE_NAMESPACE_VERSION]; + profileNamespace setVariable ["ACE_ATragMX_currentUnit", GVAR(currentUnit)]; profileNamespace setVariable ["ACE_ATragMX_currentGun", GVAR(currentGun)]; profileNamespace setVariable ["ACE_ATragMX_currentTarget", GVAR(currentTarget)]; diff --git a/addons/atragmx/functions/fnc_toggle_target_speed_assist.sqf b/addons/atragmx/functions/fnc_toggle_target_speed_assist.sqf index e227cf0716..5b88a6cfce 100644 --- a/addons/atragmx/functions/fnc_toggle_target_speed_assist.sqf +++ b/addons/atragmx/functions/fnc_toggle_target_speed_assist.sqf @@ -21,9 +21,13 @@ if (ctrlVisible 8000) then { if (_this == 1) then { [] call FUNC(calculate_target_speed_assist); - ctrlSetText [330, Str(parseNumber(ctrlText 8007))]; - ctrlSetText [140050, Str(parseNumber(ctrlText 8007))]; - [] call FUNC(calculate_target_solution); + private ["_targetSpeed"]; + _targetSpeed = parseNumber(ctrlText 8007); + if (_targetSpeed != 0) then { + ctrlSetText [330, Str(_targetSpeed)]; + ctrlSetText [140050, Str(_targetSpeed)]; + [] call FUNC(calculate_target_solution); + }; }; } else { false call FUNC(show_main_page); diff --git a/addons/atragmx/functions/fnc_update_inclination_angle.sqf b/addons/atragmx/functions/fnc_update_inclination_angle.sqf index b47936b2c0..ea5599bf2d 100644 --- a/addons/atragmx/functions/fnc_update_inclination_angle.sqf +++ b/addons/atragmx/functions/fnc_update_inclination_angle.sqf @@ -16,11 +16,11 @@ #include "script_component.hpp" private ["_inclinationAngleCosine", "_inclinationAngleDegree"]; -_inclinationAngleCosine = 0.5 max parseNumber(ctrlText 140041) max 1; +_inclinationAngleCosine = 0.5 max parseNumber(ctrlText 140041) min 1; _inclinationAngleDegree = -60 max parseNumber(ctrlText 140040) min 60; if (_this == 0) then { ctrlSetText [140040, Str(round(acos(_inclinationAngleCosine)))]; } else { - ctrlSetText [140041, Str(floor(cos(_inclinationAngleDegree) * 100) / 100)]; + ctrlSetText [140041, Str(round(cos(_inclinationAngleDegree) * 100) / 100)]; }; diff --git a/addons/atragmx/functions/fnc_update_target_data.sqf b/addons/atragmx/functions/fnc_update_target_data.sqf index bfd7fced05..733118d583 100644 --- a/addons/atragmx/functions/fnc_update_target_data.sqf +++ b/addons/atragmx/functions/fnc_update_target_data.sqf @@ -26,7 +26,7 @@ if (GVAR(currentUnit) != 2) then { }; ctrlSetText [140030, Str(Round((GVAR(windDirection) select GVAR(currentTarget))))]; ctrlSetText [140040, Str(Round((GVAR(inclinationAngle) select GVAR(currentTarget))))]; -ctrlSetText [140041, Str(floor(cos(GVAR(inclinationAngle) select GVAR(currentTarget)) * 100) / 100)]; +ctrlSetText [140041, Str(Round(cos(GVAR(inclinationAngle) select GVAR(currentTarget)) * 100) / 100)]; if (GVAR(currentUnit) != 2) then { ctrlSetText [140050, Str(Round((GVAR(targetSpeed) select GVAR(currentTarget)) * 2.23693629 * 100) / 100)]; } else { diff --git a/addons/atragmx/script_component.hpp b/addons/atragmx/script_component.hpp index f7ec6e68e8..5290ba6a1f 100644 --- a/addons/atragmx/script_component.hpp +++ b/addons/atragmx/script_component.hpp @@ -10,3 +10,5 @@ #endif #include "\z\ace\addons\main\script_macros.hpp" + +#define ATRAGMX_PROFILE_NAMESPACE_VERSION 1.0 From e14ee452497f1d9ecbf3b9cd7eb80173d40f6d89 Mon Sep 17 00:00:00 2001 From: jaynus Date: Sat, 18 Apr 2015 09:29:58 -0700 Subject: [PATCH 235/305] debug checking. --- addons/missileguidance/functions/fnc_guidancePFH.sqf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/missileguidance/functions/fnc_guidancePFH.sqf b/addons/missileguidance/functions/fnc_guidancePFH.sqf index f7fd56c164..2487e3b28f 100644 --- a/addons/missileguidance/functions/fnc_guidancePFH.sqf +++ b/addons/missileguidance/functions/fnc_guidancePFH.sqf @@ -92,6 +92,10 @@ if(accTime > 0) then { drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,1,1,1], ASLtoATL _projectilePos, 0.75, 0.75, 0, str _vectorTo, 1, 0.025, "TahomaB"]; drawLine3D [ASLtoATL _projectilePos, ASLtoATL _profileAdjustedTargetPos, [1,0,0,1]]; +_ps = "#particlesource" createVehicleLocal (ASLtoATL _projectilePos); +_PS setParticleParams [["\A3\Data_f\cl_basic", 8, 3, 1], "", "Billboard", 1, 3.0141, [0, 0, 2], [0, 0, 0], 1, 1.275, 1, 0, [1, 1], [[1, 0, 0, 1], [1, 0, 0, 1], [1, 0, 0, 1]], [1], 1, 0, "", "", nil]; +_PS setDropInterval 3.0; + hintSilent format["d: %1", _distanceToTarget]; #endif From d1e03d8e7aa027290008e571914f5344ad5cc064 Mon Sep 17 00:00:00 2001 From: jaynus Date: Sat, 18 Apr 2015 09:40:46 -0700 Subject: [PATCH 236/305] Slight tweaks. --- addons/javelin/functions/fnc_onOpticDraw.sqf | 2 +- addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf | 2 +- addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf | 2 +- addons/missileguidance/functions/fnc_seekerType_Optic.sqf | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/addons/javelin/functions/fnc_onOpticDraw.sqf b/addons/javelin/functions/fnc_onOpticDraw.sqf index bc17865480..73f07d3e90 100644 --- a/addons/javelin/functions/fnc_onOpticDraw.sqf +++ b/addons/javelin/functions/fnc_onOpticDraw.sqf @@ -72,7 +72,7 @@ _range = parseNumber (ctrlText __JavelinIGUIRangefinder); TRACE_1("Viewing range", _range); if (_range > 50 && {_range < 2500}) then { _pos = positionCameraToWorld [0,0,_range]; - _targetArray = _pos nearEntities ["AllVehicles", _range/25]; + _targetArray = _pos nearEntities ["AllVehicles", _range/100]; TRACE_1("Searching at range", _targetArray); if (count (_targetArray) > 0) then { _newTarget = _targetArray select 0; diff --git a/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf b/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf index ecb469527a..1e13c57ccc 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf @@ -53,7 +53,7 @@ switch( (_state select 0) ) do { }; case STAGE_TERMINAL: { TRACE_1("STAGE_TERMINAL",""); - _returnTargetPos = _seekerTargetPos vectorAdd [0,0,_distanceToTarget * 0.002]; + _returnTargetPos = _seekerTargetPos; }; }; diff --git a/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf b/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf index c5933e6df9..e9064da404 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf @@ -70,7 +70,7 @@ switch( (_state select 0) ) do { case STAGE_TERMINAL: { TRACE_1("STAGE_TERMINAL",""); //_returnTargetPos = _seekerTargetPos vectorAdd [0,0,_distanceToTarget * 0.02]; - _returnTargetPos = _seekerTargetPos vectorAdd [0,0,_distanceToTarget * 0.002]; + _returnTargetPos = _seekerTargetPos; }; }; diff --git a/addons/missileguidance/functions/fnc_seekerType_Optic.sqf b/addons/missileguidance/functions/fnc_seekerType_Optic.sqf index 74d3b0fc71..45e378c975 100644 --- a/addons/missileguidance/functions/fnc_seekerType_Optic.sqf +++ b/addons/missileguidance/functions/fnc_seekerType_Optic.sqf @@ -17,6 +17,7 @@ TRACE_1("", _launchParams); _foundTargetPos = [0,0,0]; if(!isNil "_target") then { _foundTargetPos = getPosASL _target; + //_foundTargetPos = (_target modelToWorldVisual (getCenterOfMass _target)); }; // @TODO: This is seeker LOS and angle checks for LOAL only; LOBL does not need visual From 34cf11e02223d12186d29ab611f1290ca28f024c Mon Sep 17 00:00:00 2001 From: Grzegorz Date: Sat, 18 Apr 2015 18:48:56 +0200 Subject: [PATCH 237/305] PL translation fix Did not saw that one --- addons/realisticnames/stringtable.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/realisticnames/stringtable.xml b/addons/realisticnames/stringtable.xml index 2b02d7f5b7..7f2cf20e96 100644 --- a/addons/realisticnames/stringtable.xml +++ b/addons/realisticnames/stringtable.xml @@ -1135,7 +1135,7 @@ Mini-Spike (AT) Mini-Spike (PALR) Mini-Spike (PT) - Mini-Spike (AA) + Mini-Spike (AT) Mini-Spike (AT) Mini-Spike (Tankelhárító) Mini-Spike (AT) From f55bd5a6295680b1719b24823e6b4ff71b63fae6 Mon Sep 17 00:00:00 2001 From: FreeZbe Date: Sat, 18 Apr 2015 18:49:46 +0200 Subject: [PATCH 238/305] French: updates / fixes stringtable --- addons/advanced_ballistics/stringtable.xml | 4 +- addons/atragmx/stringtable.xml | 4 +- addons/attach/stringtable.xml | 10 +- addons/captives/stringtable.xml | 10 +- addons/common/stringtable.xml | 14 +-- addons/disarming/stringtable.xml | 3 +- addons/explosives/stringtable.xml | 8 +- addons/grenades/stringtable.xml | 12 +-- addons/hearing/stringtable.xml | 4 +- addons/interact_menu/stringtable.xml | 4 +- addons/javelin/stringtable.xml | 6 +- addons/laser_selfdesignate/stringtable.xml | 6 +- addons/magazinerepack/stringtable.xml | 4 +- addons/medical/stringtable.xml | 102 ++++++++++++--------- addons/missileguidance/stringtable.xml | 16 ++-- addons/nametags/stringtable.xml | 4 +- addons/optionsmenu/stringtable.xml | 1 + addons/realisticnames/stringtable.xml | 4 +- addons/respawn/stringtable.xml | 6 ++ addons/scopes/stringtable.xml | 11 ++- addons/weather/stringtable.xml | 4 +- 21 files changed, 135 insertions(+), 102 deletions(-) diff --git a/addons/advanced_ballistics/stringtable.xml b/addons/advanced_ballistics/stringtable.xml index 6890937a45..4d09dac3ef 100644 --- a/addons/advanced_ballistics/stringtable.xml +++ b/addons/advanced_ballistics/stringtable.xml @@ -7,7 +7,7 @@ Pokaż inf. o wietrze Mostra indicazioni del vento Показать информацию о ветре - Afficher les info du vent + Afficher les info sur le vent Mostrar información del viento @@ -19,4 +19,4 @@ Mostrar transportador - + \ No newline at end of file diff --git a/addons/atragmx/stringtable.xml b/addons/atragmx/stringtable.xml index 1baa4fb38c..f1cfa25e9a 100644 --- a/addons/atragmx/stringtable.xml +++ b/addons/atragmx/stringtable.xml @@ -19,6 +19,7 @@ Otwórz ATragMX Открыть ATragMX Abrir ATragMX + Ouvrir ATragMX Rugged PDA with ATragMX @@ -31,6 +32,7 @@ Otwórz ATragMX Открыть ATragMX Abrir ATragMX + Ouvrir ATragMX - + \ No newline at end of file diff --git a/addons/attach/stringtable.xml b/addons/attach/stringtable.xml index db98c4fffc..4d3b57e944 100644 --- a/addons/attach/stringtable.xml +++ b/addons/attach/stringtable.xml @@ -42,7 +42,7 @@ IR-Stroboskop befestigt Marcador IR acoplado Przyczepiono stroboskop IR - Strobe IR attaché + Balise IR attachée IR Značkovač připnutý Marcador IV Acoplado Strobo IR attaccata @@ -54,7 +54,7 @@ IR-Stroboskop entfernt Marcador IR quitado Odczepiono stroboskop IR - Strobe IR détaché + Balise IR détachée IR Značkovač odepnutý Marcador IV Separado Strobo IR staccata @@ -126,7 +126,7 @@ IR-Stroboskop Marcador IR Stroboskop IR - Strobe IR + Balise IR IR Značkovač Marcador IV Strobo IR @@ -138,7 +138,7 @@ Das IR-Stroboskop erlaubt es dir deine Position mit einem blinkenden Leuchtfeuer zu signalisieren, welches nur mit Nachtsichtgerät zu erkennen ist. Stroboskop światła podczerwieni umożliwia oznaczenie swojej pozycji pulsacyjnym światłem widocznym tylko przez optykę noktowizyjną i gogle noktowizyjne. El Marcador IR permite señalizar su posisición a través de una baliza visible solo a través de dispositivos de visión nocturna. - Le Strobe IR permet de signaler votre position grace à un clignotement visible par des JVN. + La balise IR permet de signaler votre position grace à un clignotement visible par des JVN. IR Značkovač je Infračerveně zářící stroboskop umožňující signalizaci vaší pozice díky blikajícímu světlu, které je vidět pouze při užití noktovizoru. O Marcador IV permite que você sinalize sua posição através de um pulso visível somente com equipamento de visão noturna. La Strobo IR è una luce stroboscopica che ti permette di segnalare la tua posizione grazie all'emissione di impulsi ad infrarossi visibili solo con i visori notturni. @@ -204,4 +204,4 @@ %1<br/>отсоединена - + \ No newline at end of file diff --git a/addons/captives/stringtable.xml b/addons/captives/stringtable.xml index f609aabd93..0a88c5d7d8 100644 --- a/addons/captives/stringtable.xml +++ b/addons/captives/stringtable.xml @@ -134,7 +134,7 @@ Surrender - Capituler + Se rendre Kapitulieren Rendirse Vzdát se @@ -156,7 +156,7 @@ Only use on alive units - Utiliser uniquement sur unité vivante + Utiliser uniquement sur une unité vivante Nur bei lebenden Einheiten verwendbar Utilizar solo en unidades vivas Použitelné jen na živé jednotky @@ -167,7 +167,7 @@ Only use on dismounted inf - Utiliser uniquement sur personnel à pied + Utiliser uniquement sur du personnel à pied Nur bei abgesessener Infanterie verwendbar Utilizar solo en infanteria desmontada Použitelné jen na pěsích jednotkách @@ -178,7 +178,7 @@ Nothing under mouse - Rien sous la souris + Rien sous le curseur Es wurde nichts ausgewählt Nada bajo el ratón Nic není vybráno @@ -188,4 +188,4 @@ Niente selezionato - + \ No newline at end of file diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index d9ee389166..de10a60893 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -272,7 +272,7 @@ Desactivar menú de mando Wyłącz menu dowodzenia Vypnout velící menu - Désactiver Menu Commande + Désactiver menu commande Выключить командное меню Parancsnoki menü kikapcsolása Disabilita Menù di comando @@ -329,7 +329,7 @@ Accetta le richieste degli altri giocatori. Queste possono riguardare l'uso o la condivisione dell'equipaggiamento, o di determinate azioni. Přijimutí žádosti poslané jinými hráči. Mohou to být žádosti k použítí/sdílení vybavení nebo k vykonání určité činnosti. Принять запросы, отправленные другими игроками. Например, запросы на использование/совместное использование снаряжения, выполнение определенных действий - Accepter les requêtes d'autres joueurs. Comme l'utilisation / l'échange d'équipement, la réalistion d'actions. + Accepter les requêtes d'autres joueurs. Comme l'utilisation / l'échange d'équipement, la réalisation d'actions. Más játékosok általi kérések elfogadása. Ezek a kérések vonatkozhatnak a felszerelés használatára/megosztására, valamint különböző cselekményekre. @@ -340,7 +340,7 @@ Rifiuta le richieste degli altri giocatori. Queste possono riguardare l'uso o la condivisione dell'equipaggiamento, o di determinate azioni. Zamítnutí žádostii poslané jinými hráči. Mohou to být žádosti k použítí/sdílení vybavení nebo k vykonání určité činnosti. Отклонить запросы, отправленные другими игроками. Например, запросы на использование/совместное использование снаряжения, выполнение определенных действий - Rejeter les requêtes d'autres joueurs. Comme l'utilisation / l'échange d'équipement, la réalistion d'actions. + Rejeter les requêtes d'autres joueurs. Comme l'utilisation / l'échange d'équipement, la réalisation d'actions. Más játékosok általi kérések elutasítása. Ezek a kérések vonatkozhatnak a felszerelés használatára/megosztására, valamint különböző cselekményekre. @@ -383,7 +383,7 @@ Modifica la posizione su schermo della barra di avanzamento. Установите желаемое положение строки состояния на экране. Ustaw pożądaną lokalizację paska postępu na ekranie - Appliquer la postion de la barre de progression sur l'écran + Appliquer la position de la barre de progression sur l'écran Nastavuje pozici ukazetele průběhu činnosti na vaší obrazovce. Itt beállítható az állapotjelző sáv képernyődön lévő helyzete. @@ -405,7 +405,7 @@ Il colore di sfondo dei suggerimenti dell'ACE. Цвет фона всплывающих подсказок АСЕ. Kolor tła dla powiadomień ACE - Notifications ACE: couleur de l'arrière plan + Notification ACE: couleur de l'arrière plan Barva pozadí ACE nápověd. Az ACE-súgók hátterének színe. @@ -427,7 +427,7 @@ Il colore del testo dei suggerimenti dell'ACE. Questo è il colore standard per tutti i caratteri mostrati dal sistema di suggerimenti dell'ACE, se questo non è altrimenti specificato. Цвет шрифта текста всплывающих подсказок АСЕ. Этот цвет является стандартным для всего текста, транслирующегося через систему подсказок АСЕ, если не установлено другого цвета для текста подсказок. Kolor tekstu dla powiadomień ACE. Ten kolor jest domyślnym dla wszystkich tekstów wyświetlanych poprzez System Powiadomień ACE, jeżeli dla powiadomienia nie określono innego koloru. - Notification ACE: couleur du texte. C'est la couleur par défaut de tout texte afficher dans les notifications ACE, si aucune couleur n'est spécifiée pour les notifications + Notification ACE: couleur du texte. C'est la couleur par défaut de tout texte affiché dans les notifications ACE, si aucune couleur n'est spécifiée pour les notifications Barva fontu ACE nápověd. Toto je standardní barva pro všechen text zobrazovaný ACE nápovědami, pokud nemá nápověda žádnou specifikanou barvu. Az ACE-súgók betűkészletének színek. Ez a szín alapértelmezett az összes szövegre az ACE-súgórendszerben, ha a súgószöveg maga nem ad meg más színt. @@ -454,4 +454,4 @@ Une banane est un fruit qui, d'un point de vue botanique, fait partie du groupe des baies. Produite par plusieurs sortes de grandes plantes à fleurs herbacées du type Musa. - + \ No newline at end of file diff --git a/addons/disarming/stringtable.xml b/addons/disarming/stringtable.xml index 625f156b95..583080ff08 100644 --- a/addons/disarming/stringtable.xml +++ b/addons/disarming/stringtable.xml @@ -9,6 +9,7 @@ Abrir inventario Открыть инвентарь Apri l'inventario + Ouvrir l'inventaire - + \ No newline at end of file diff --git a/addons/explosives/stringtable.xml b/addons/explosives/stringtable.xml index d0b61d0814..9d4937ed65 100644 --- a/addons/explosives/stringtable.xml +++ b/addons/explosives/stringtable.xml @@ -114,7 +114,7 @@ Mobiltelefon Télefono móvil Telefon komórkowy - Téléphone Portable + Téléphone portable Telefon Cellulare Mobiltelefon @@ -294,7 +294,7 @@ "Platzieren"-Menü Menú de colocación Menu umieszczania - Menu Placement + Menu placement Menu Umístění Menù di collocamento Elhelyezési menü @@ -450,7 +450,7 @@ Czujnik magnetyczny (wybuch w górę) Sensor IM (ataque inferior) Magnetfeldsensor (Bodenangriff) - Capteur Magnétique (par le bas) + Capteur magnétique (par le bas) Magnetický Senzor (Výbuch ze spoda) Sensore Magnetico di Prossimità (Attacco inferiore) Mágneses mező érzékelő (Bottom Attack) @@ -502,4 +502,4 @@ Raccogli - + \ No newline at end of file diff --git a/addons/grenades/stringtable.xml b/addons/grenades/stringtable.xml index 758e6eb9a0..7f8321d6c6 100644 --- a/addons/grenades/stringtable.xml +++ b/addons/grenades/stringtable.xml @@ -20,7 +20,7 @@ Lanzamiento normal Normalny rzut Normální hod - Lancer Normal + Lancer normal Нормальный бросок Normál dobás Lancio normale @@ -32,7 +32,7 @@ Lanzamiento alto Wysoki rzut Vysoký hod - Lancer Haut + Lancer haut Высокий бросок Magas dobás Lancio verso l'alto @@ -44,7 +44,7 @@ Lanzamiento preciso Precyzyjny rzut Přesný hod - Lancer Précis + Lancer précis Точный бросок Pontos dobás Lancio preciso @@ -56,7 +56,7 @@ Rodar granada Po ziemi Po zemi - Lancer Roulé + Lancer roulé Катить гранату Gránát gurítása Fai rotolare la granata @@ -78,7 +78,7 @@ M84 Stun Grenade M84 Blendgranate Granada aturdidora M84 - M84 Grenade Incapacitante + M84 Grenade incapacitante Granat hukowy M84 Omračující granát M84 M84 светозвуковая граната @@ -243,4 +243,4 @@ M127A1 (Amarilla) - + \ No newline at end of file diff --git a/addons/hearing/stringtable.xml b/addons/hearing/stringtable.xml index 3fa947ead9..7ae1120b17 100644 --- a/addons/hearing/stringtable.xml +++ b/addons/hearing/stringtable.xml @@ -80,7 +80,7 @@ Nie masz stoperów Nemáš žádné špunty У вас нет беруш - Vous n'avez pas de Bouchons Anti-Bruits + Vous n'avez pas de bouchons anti-bruits Nincsen füldugód Você não possui protetores auriculares Non hai i tappi auricolari @@ -109,4 +109,4 @@ Disabilita il ronzio - + \ No newline at end of file diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index 98cac6116a..c1999b424b 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -16,7 +16,7 @@ Display interaction menus as lists Mostrar los menus de interacción como listas Показывать меню взаимодействия в виде списка - Afficher le menu d'interaction au format liste + Afficher le menu d'interaction sous forme de liste Mostra il menù di interazione come lista Wyświetlaj menu interakcji jako listę @@ -65,4 +65,4 @@ Interazioni con veicoli - + \ No newline at end of file diff --git a/addons/javelin/stringtable.xml b/addons/javelin/stringtable.xml index 32aed563a1..33abcc1e49 100644 --- a/addons/javelin/stringtable.xml +++ b/addons/javelin/stringtable.xml @@ -1,4 +1,4 @@ - + @@ -7,7 +7,7 @@ Захватить цель (удерживать) Zamknout cíl(držet) Namierz cel (przytrzymaj) - Verrouiller cible (maintenir) + Verrouiller la cible (maintenir) Célpontra állás (Lenyomva tartott) Aggangia il bersagio Fijar objetivo (Mantener) @@ -24,4 +24,4 @@ Cambiar modo de disparo - + \ No newline at end of file diff --git a/addons/laser_selfdesignate/stringtable.xml b/addons/laser_selfdesignate/stringtable.xml index f38c015c44..f587763bce 100644 --- a/addons/laser_selfdesignate/stringtable.xml +++ b/addons/laser_selfdesignate/stringtable.xml @@ -8,7 +8,7 @@ ЛЦУ ВКЛ Laserový značkovač zapnut Desygnator laserowy wł. - Désignateur Laser Allumé + Désignateur laser allumé Lézeres Megjelölő Be Designatore laser acceso @@ -19,9 +19,9 @@ ЛЦУ ВЫКЛ Laserový značkovat vypnut Desygnator laserowy wył. - Désignateur Laser Éteint + Désignateur laser éteint Lézeres Megjelölő Ki Designatore laser spento - + \ No newline at end of file diff --git a/addons/magazinerepack/stringtable.xml b/addons/magazinerepack/stringtable.xml index 1e02260d1b..3c84a9109e 100644 --- a/addons/magazinerepack/stringtable.xml +++ b/addons/magazinerepack/stringtable.xml @@ -5,7 +5,7 @@ Repack Magazines Magazine umpacken Reorganizar cargadores - Réorganiser chargeurs + Réorganiser les chargeurs Przepakuj magazynki Přepáskovat Zásobníky Ricarica Caricatori @@ -107,4 +107,4 @@ %1 pieno e %2 parziale - + \ No newline at end of file diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index a8a8017160..d14e532c26 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -66,7 +66,7 @@ Transfundir salino Transfúze fyziologický roztoku Przetocz sól fizjologiczną - Transfuser de la Saline + Transfuser de la solution saline Перелить физраствор Infúzió (sós víz) Effettua trasfusione di soluzione salina @@ -288,6 +288,7 @@ Bandaż uciskowy Nyomókötszer Bendaggio compressivo + Bandage gauze Elastic Bandage @@ -329,7 +330,7 @@ Проверить давление Zkontrolovat krevní tlak Sprawdź ciśnienie krwi - Vérification de la Tension + Vérification de la tension Vérnyomás megmérése Controlla pressionsa sanguigna @@ -340,7 +341,7 @@ Медкарта Karta segregacyjna Karta Triage - Carte de Triage + Carte de triage Orvosi lap Triage Card @@ -362,7 +363,7 @@ Снять жгут Sundat škrtidlo Zdejmij stazę - Enlever le Garrot + Enlever le garrot Érszorító leszedése Rimuovi laccio emostatico @@ -372,7 +373,7 @@ Dar Sangre IV (1000ml) Дать кровь для в/в вливания (1000 мл) Podaj krew IV (1000ml) - Administrer du Sang en IV (1000ml) + Administrer du sang en IV (1000ml) Podat krev. transfúzi (1000ml) Vér adása intravénásan (1000ml) Effettua trasfusione sangue IV (1000ml) @@ -383,7 +384,7 @@ Dar Sangre IV (500ml) Дать кровь для в/в вливания (500 мл) Podaj krew IV (500ml) - Administrer du Sang en IV (500ml) + Administrer du sang en IV (500ml) Podat krev. transfúzi (500ml) Vér adása intravénásan (500ml) Effettua trasfusione sangue IV (500ml) @@ -394,7 +395,7 @@ Dar Sangre IV (250ml) Дать кровь для в/в вливания (250 мл) Podaj krew IV (250ml) - Administrer du Sang en IV (250ml) + Administrer du sang en IV (250ml) Podat krev. transfúzi (250ml) Vér adása intravénásan (250ml) Effettua trasfusione sangue IV (250ml) @@ -405,7 +406,7 @@ Dar Plasma IV (1000ml) Дать плазму для в/в вливания (1000 мл) Podaj osocze IV (1000ml) - Administrer du Plasma en IV (1000ml) + Administrer du plasma en IV (1000ml) Podat plazmu (1000ml) Vérplazma adása intravénásan (1000ml) Effettua trasfusione plasma IV (1000ml) @@ -416,7 +417,7 @@ Dar Plasma IV (500ml) Дать плазму для в/в вливания (500 мл) Podaj osocze IV (500ml) - Administrer du Plasma en IV (500ml) + Administrer du plasma en IV (500ml) Podat plazmu (500ml) Vérplazma adása intravénásan (500ml) Effettua trasfusione plasma IV (500ml) @@ -427,7 +428,7 @@ Dar Plasma IV (250ml) Дать плазму для в/в вливания (250 мл) Podaj osocze IV (250ml) - Administrer du Plasma en IV (250ml) + Administrer du plasma en IV (250ml) Podat plazmu (250ml) Vérplazma adása intravénásan (250ml) Effettua trasfusione plasma IV (250ml) @@ -438,7 +439,7 @@ Dar Salino IV (1000ml) Дать физраствор для в/в вливания (1000 мл) Podaj sól fizjologiczną IV (1000ml) - Administrer de la Solution Saline en IV (1000ml) + Administrer de la solution saline en IV (1000ml) Podaz fyz. roztok (1000ml) Sós víz adása intravénásan (1000ml) Effettua trasfusione salina IV (1000ml) @@ -449,7 +450,7 @@ Dar Salino IV (500ml) Дать физраствор для в/в вливания (500 мл) Podaj sól fizjologiczną IV (500ml) - Administrer de la Solution Saline en IV (500ml) + Administrer de la solution saline en IV (500ml) Podaz fyz. roztok (500ml) Sós víz adása intravénásan (500ml) Effettua trasfusione salina IV (500ml) @@ -460,7 +461,7 @@ Dar Salino IV (250ml) Дать физраствор для в/в вливания (250 мл) Podaj sól fizjologiczną IV (250ml) - Administrer de la Solution Saline en IV (250ml) + Administrer de la solution saline en IV (250ml) Podaz fyz. roztok (250ml) Sós víz adása intravénásan (250ml) Effettua trasfusione salina IV (250ml) @@ -471,7 +472,7 @@ Menor Незначительная Normalny - Mineur + Léger Minimální Enyhe Minore @@ -524,7 +525,7 @@ Normal breathing Дыхание в норме Respiración normal - Respiration Normale + Respiration normale Normalny oddech Normale Atmung Dýchá normálně @@ -536,7 +537,7 @@ Keine Atmung Дыхание отсутствует No respira - Aucune Respiration + Aucune respiration Brak oddechu Nedýchá Nincs légzés @@ -546,7 +547,7 @@ Difficult breathing Дыхание затруднено Dificultad para respirar - Difficultée Respiratoire + Difficultée respiratoire Trudności z oddychaniem Schwere Atmung Dýchá s obtížemi @@ -558,7 +559,7 @@ Fast keine Atmung Дыхание очень слабое Casi sin respiración - Respiration Faible + Respiration faible Prawie brak oddechu Skoro nedýchá Alig van légzés @@ -580,7 +581,7 @@ Hat Schmerzen Испытывает боль Con dolor - Ressent de la Douleur + Ressent de la douleur W bólu V bolestech Fájdalom alatt @@ -591,7 +592,7 @@ Hat eine große Menge Blut verloren Большая кровопотеря Mucha sangre perdida - A Perdu Bcp de Sang + A perdu beaucoup de sang Stracił dużo krwi Ztratil hodně krve Sok vért vesztett @@ -634,7 +635,7 @@ Used to cover a wound Для перевязки ран Utilizado para cubrir una herida - Utilisé Pour Couvrir Une Blessure + Utilisé pour couvrir une blessure Używany w celu przykrycia i ochrony miejsca zranienia Verwendet, um Wunden abzudecken Sebesülések befedésére alkalmas @@ -655,7 +656,7 @@ Mullbinde Тампонирующая повязка Vendaje compresivo - Bandage Mèche + Bandage gauze Bandaż (uciskowy) Nyomókötszer Bendaggio compressivo @@ -665,7 +666,7 @@ Verwendet, um mittlere bis große Wunden abzudecken und Blutungen zu stoppen Для тампонирования ран среднего и большого размера и остановки кровотечения. Se utiliza para vendar heridas medianas o grandes y detener el sangrado - Utilisé pour remplir la cavité créée dans une blessure de taille moyenne à grande. + Utilisé pour couvrir des blessures de taille moyenne à grande. Arrête l'hémorragies Używany w celu opatrywania średnich i dużych ran oraz tamowania krwawienia. Közepestől nagyig terjedő sebek betakarására és vérzés elállítására használt kötszer Usato su medie o larghe ferite per fermare emorragie. @@ -674,7 +675,7 @@ A bandage used to pack the wound to stem bleeding and facilitate wound healing. Packing a wound is an option in large polytrauma injuries. Повязка для тампонирования раны, остановки кровотечения и лучшего заживления. При тяжелых сочетанных ранениях возможно тампонирование раны. Se utiliza para detener la hemorragia de una herida y favorecer su cicatrización. Se usa en grandes lesiones o politraumatismos. - Bandage pouvant être inseré dans les blessures pour éponger le saignement et faciliter la guerrison. Ce bandage est optionnel pour soigner les lésions polytraumatique. + Bandage servant à recouvrir les blessures pour arrêter les hémmoragies et faciliter la guérisson. Recouvrir une blessure est optionnel dans le cas de blessures polytraumatiques Opatrunek stosowany w celu zatrzymania krwawienia i osłony większych ran. Egy kötszerfajta, melyet a sebek nyomására használnak a vérzés elállítása és sebgyógyulás érdekében. A nyomókötés egy lehetőség nagyobb polytraumatikus sérülések esetén. Un bendaggio usato per bendare ferite con emorragie e facilitare la guarigione. Bendare una ferita è una opzione su ferite di vario tipo. @@ -695,7 +696,7 @@ Elastische Binde (Kompressionsbinde) Давящая повязка Kit de vendaje (Elástico) - Bandage Compressif Élastique + Bandage compressif élastique Zestaw bandaży elastycznych. Rugalmas kötszercsomag, "rögzítő" Kit bendaggio, elastico @@ -766,7 +767,7 @@ An analgesic used to combat moderate to severe pain experiences. Обезболивающее для снятия средних и сильных болевых ощущений. Analgésico usado para combatir los estados dolorosos de moderados a severos. - Un Analgésique puissant servant à réduire les douleurs modérées à sévères. + Un analgésique puissant servant à réduire les douleurs modérées à sévères. Organiczny związek chemiczny z grupy alkaloidów. Ma silne działanie przeciwbólowe. Ein Schmerzmittel um mäßige bis starke Schmerzen zu behandeln Egy fájdalomcsillapító anyag, jellemzően mérsékelt vagy erős fájdalom esetén alkalmazandó. @@ -864,7 +865,7 @@ Plasma IV (500ml) Плазма для в/в вливания (500 мл) Plasma IV (500ml) - Plasma Sanguin IV (500ml) + Plasma sanguin IV (500ml) Osocze IV (500ml) Plasma IV (500ml) Vérplazma-infúzió (500ml) @@ -874,7 +875,7 @@ Plasma IV (250ml) Плазма для в/в вливания (250 мл) Plasma IV (250ml) - Plasma Sanguin (250ml) + Plasma sanguin (250ml) Osocze IV (250ml) Plasma IV (250ml) Vérplazma-infúzió (250ml) @@ -884,7 +885,7 @@ Blood IV (1000ml) Кровь для переливания (1000 мл) Sangre IV (1000ml) - Cullot Sanguin IV (1000ml) + Cullot sanguin IV (1000ml) Krew IV (1000ml) Blut IV (1000ml) Vér-infúzió (1000ml) @@ -894,7 +895,7 @@ Blood IV, for restoring a patients blood (keep cold) Пакет крови для возмещения объема потерянной крови (хранить в холодильнике) Sangre intravenosa, para restarurar el volumen sanguíneo (mantener frío) - Cullot Sanguin O- ,utiliser seulement lors de perte sanguine majeur afin de remplacer le volume sanguin perdu. Habituelment utiliser lors du transport ou dans un etablisement de soin. + Cullot sanguin O- ,utiliser seulement lors de perte sanguine majeur afin de remplacer le volume sanguin perdu. Habituelment utiliser lors du transport ou dans un etablisement de soin. Krew IV, używana do uzupełnienia krwi u pacjenta, trzymać w warunkach chłodniczych Vér-infúzió, intravénás bejuttatásra egy páciensnek (hidegen tárolandó) Sangue usato per ripristinare pazienti in cui si è verificata una perdita di sangue (conservare al fresco) @@ -905,12 +906,13 @@ Krew 0 Rh-, używana w rzadkich i szczególnych przypadkach do uzupełnienia krwi u pacjenta, zazwyczaj w trakcie fazie transportu rannej osoby do szpitala. Utilice sólo durante gran pérdida de sangre para reemplazar el volumen de sangre perdida. Uso habitual durante el transporte de heridos. Sangue 0 negativo usato per ripristinare sangue in pazienti in cui si è verificata una perdita di sangue. + Cullot sanguin O- utilisé dans de rares et stricts cas pour compléter une perte de sang importante. Administré normalement lors d'un MEDEVAC Blood IV (500ml) Кровь для переливания (500 мл) Sangre IV (500ml) - Cullot Sanguin IV (500ml) + Cullot sanguin IV (500ml) Krew IV (500ml) Blut IV (500ml) Vér-infúzió (500ml) @@ -920,7 +922,7 @@ Blood IV (250ml) Кровь для переливания (250 мл) Sangre IV (250ml) - Cullot Sanguin IV (250ml) + Cullot sanguin IV (250ml) Krew IV (250ml) Blut IV (250ml) Vér-infúzió (250ml) @@ -930,7 +932,7 @@ Saline IV (1000ml) Физраствор для в/в вливания (1000 мл) Solución Salina IV (1000ml) - Solution Saline 0.9% IV (1000ml) + Solution saline 0.9% IV (1000ml) Sól fizjologiczna IV (1000ml) Kochsalzlösung (1000ml) 0,9%-os sósvíz-infúzió (1000ml) @@ -940,7 +942,7 @@ Saline IV, for restoring a patients blood Пакет физраствора для возмещения объема потерянной крови Solución salina intravenosa, para restaurar el volumen sanguíneo - Solution Saline 0.9% IV, pour rétablir temporairement la tension artérielle + Solution saline 0.9% IV, pour rétablir temporairement la tension artérielle Sól fizjologiczna, podawana dożylnie (IV), używana w celu uzupełnienia krwi u pacjenta 0,9%-os sósvíz-infúzió, a páciens vérmennyiségének helyreállítására Soluzione salina, usata per ripristinare sangue nei pazienti. @@ -949,7 +951,7 @@ A medical volume-replenishing agent introduced into the blood system through an IV infusion. Пакет физиологического раствора для возмещения объема потерянной крови путем внутривенного вливания Suero fisiológico inoculado al torrente sanguíneo de forma intravenosa. - Un remplacement temporaire pour rétablir la tension artérielle lors de perte sanguine, administré par intra-veineuse + Un remplacant temporaire pour rétablir la tension artérielle lors de perte sanguine, administré par intra-veineuse Używany w medycynie w formie płynu infuzyjnego jako środek nawadniający i uzupełniający niedobór elektrolitów, podawany dożylnie (IV). Egy orvosi térfogat-helyreállító készítmény, melyet intravénás módon lehet a szervezetbe juttatni. Una soluzione medica per ripristinare il volume del sangue introdotta tramite trasfusione IV. @@ -958,7 +960,7 @@ Saline IV (500ml) Физраствор для в/в вливания (500 мл) Salino IV (500ml) - Solution Saline 0.9% IV (500ml) + Solution saline 0.9% IV (500ml) Sól fizjologiczna IV (500ml) Kochsalzlösung (500ml) 0,9%-os sósvíz-infúzió (500ml) @@ -968,7 +970,7 @@ Saline IV (250ml) Физраствор для в/в вливания (250 мл) Salino IV (250ml) - Solution Saline 0.9% IV (250ml) + Solution saline 0.9% IV (250ml) Sól fizjologiczna IV (250ml) Kochsalzlösung (250ml) 0,9%-os sósvíz-infúzió (250ml) @@ -978,7 +980,7 @@ Basic Field Dressing (QuikClot) Первичный перевязочный пакет (QuikClot) Vendaje básico (QuickClot) - Bandage Regulier (Coagulant) + Bandage basique (Hémostatique) Podstawowy pakiet opatrunkowy (QuikClot) Verbandpäckchen(Gerinnungsmittel) Általános zárókötszer (QuikClot) @@ -988,7 +990,7 @@ QuikClot bandage Гемостатический пакет QuikClot Vendaje QuikClot - Bandage coagulant + Bandage hémostatique Hemostatyczny pakiet QuikClot. Podstawowy opatrunek stosowany na rany. Bandage mit Gerinnungsmittel QuikClot kötszer @@ -1064,7 +1066,7 @@ Bodybag - Sac à corps + Housse mortuaire Мешок для трупов Bolsa para cadáveres Worek na zwłoki @@ -1427,7 +1429,7 @@ Załaduj pacjenta Naložit pacianta do Погрузить пациента в - Embarquer le Patient + Embarquer le patient Sebesült berakása Carregar Paciente Em Carica paziente nel @@ -1439,7 +1441,7 @@ Wyładuj pacjenta Vyložit pacienta Выгрузить пациента - Débarquer le Patient + Débarquer le patient Sebesült kihúzása Descarregar Paciente Scarica il paziente @@ -1449,7 +1451,7 @@ Descargar el paciente Выгрузить пациента Wyładuj pacjenta - Débarquer le Patient + Débarquer le patient Sebesült kihúzása Scarica il paziente @@ -1458,7 +1460,7 @@ Cargar el paciente en Погрузить пациента Załaduj pacjenta - Embarquer le Patient + Embarquer le patient Sebesült berakása Carica il paziente @@ -1523,6 +1525,7 @@ Сильно ранен Gravemente ferito Gravemente herido + Lourdement blessé Lightly wounded @@ -1531,6 +1534,7 @@ Легко ранен Leggermente ferito Levemente herido + Légèrement blessé Very lightly wounded @@ -1539,6 +1543,7 @@ Очень легко ранен Ferito lievemente Muy levemente herido + Très légèrement blessé Head @@ -1547,6 +1552,7 @@ Голова Testa Cabeza + Tête Torso @@ -1555,6 +1561,7 @@ Торс Torso Torso + Torse Left Arm @@ -1563,6 +1570,7 @@ Левая рука Braccio sinistro Brazo izquierdo + Bras gouche Right Arm @@ -1571,6 +1579,7 @@ Правая рука Braccio destro Brazo derecho + Bras droit Left Leg @@ -1579,6 +1588,7 @@ Левая нога Gamba sinistra Pierna izquierda + Jambe gauche Right Leg @@ -1587,6 +1597,7 @@ Правая нога Gamba destra Pierna derecha + Jambe droite Pain Effect Type @@ -1595,6 +1606,7 @@ Вид боли Pain Effect Type Tipo de efecto de dolor + Type d'effet de douleur Colour Flashing @@ -1603,6 +1615,7 @@ Разноцветные вспышки Colore lampeggiante Parpadeo de color + Flash de couleur Chromatic Aberration @@ -1611,6 +1624,7 @@ Хроматическая аберрация Aberrazione cromatica Aberración cromática + Aberration chromatique \ No newline at end of file diff --git a/addons/missileguidance/stringtable.xml b/addons/missileguidance/stringtable.xml index c9cb4c4c6b..fdd7e5ee42 100644 --- a/addons/missileguidance/stringtable.xml +++ b/addons/missileguidance/stringtable.xml @@ -4,7 +4,7 @@ Advanced Missile Guidance Avanzada Misiles Orientación - Avancée Missile orientation + Guidage avancé de missile Zaawansowane naprowadzanie rakiet Erweitertes Raketenlenksystem Pokročilé řízení střel @@ -16,7 +16,7 @@ Hydra-70 DAGR Missile - + Hydra-70 DAGR Hydra-70 DAGR Hydra-70 DAGR Rackete Hydra-70 DAGR @@ -28,7 +28,7 @@ DAGR - + DAGR DAGR DAGR DAGR @@ -40,7 +40,7 @@ Hydra-70 DAGR Laser Guided Missile - + Missile à guidage Hydra-70 DAGR Laserowo naprowadzana rakieta Hydra-70 DAGR Hydra-70 DAGR lasergelenkte Rakete Hydra-70 DAGR laserem naváděná střela @@ -52,7 +52,7 @@ Hellfire II AGM-114K Missile - + Hellfire II AGM-114K Hellfire II AGM-114K Hellfire II AGM-114K Hellfire II AGM-114K @@ -64,7 +64,7 @@ AGM-114K - + AGM-114K AGM-114K AGM-114K AGM-114K @@ -76,7 +76,7 @@ Hellfire II AGM-114K Laser Guided Missile - + Missile à guidage laser Hellfire II AGM-114K Laserowo naprowadzana rakieta Hellfire II AGM-114K Hellfire II AGM-114K Lasergelenkte Rakete Hellfire II AGM-114K laserem naváděná střela @@ -86,4 +86,4 @@ - + \ No newline at end of file diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index 4f6e2cfb93..39a87f2ff4 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -17,7 +17,7 @@ Spielernamen anzeigen Mostrar nombres de jugadores Pokaż imiona graczy - Afficher nom des joueurs + Afficher les nom des joueurs Játékosnevek mutatása Zobrazit jména hráčů Mostrar nomes de jogadores @@ -104,4 +104,4 @@ Colore nametag di default (membri non del gruppo) - + \ No newline at end of file diff --git a/addons/optionsmenu/stringtable.xml b/addons/optionsmenu/stringtable.xml index 2bc66b8b52..660cfdb4e1 100644 --- a/addons/optionsmenu/stringtable.xml +++ b/addons/optionsmenu/stringtable.xml @@ -215,6 +215,7 @@ Option Menu UI Scaling + Menu option: taille de l'UI \ No newline at end of file diff --git a/addons/realisticnames/stringtable.xml b/addons/realisticnames/stringtable.xml index 2b02d7f5b7..04dd81e02e 100644 --- a/addons/realisticnames/stringtable.xml +++ b/addons/realisticnames/stringtable.xml @@ -1554,7 +1554,7 @@ TODO: NATO DMR (provisional) spotter TODO: NATO DMR (provisional) spotter - NATO DMR (provisoire) Observateur + NATO DMR (provisoire) observateur TODO: NATO DMR (provisional) observador TODO: NATO DMR (provisional) корректировщик @@ -1678,4 +1678,4 @@ TODO: SPMG .338 (песочный) - + \ No newline at end of file diff --git a/addons/respawn/stringtable.xml b/addons/respawn/stringtable.xml index 5874b095ae..8b06099c3a 100644 --- a/addons/respawn/stringtable.xml +++ b/addons/respawn/stringtable.xml @@ -52,6 +52,7 @@ Punto de reunión Oeste (Base) Точка сбора Синих (База) Punkt zbiórki Zachodu (Baza) + Point de ralliement OUEST (Base) Rallypoint East (Base) @@ -59,6 +60,7 @@ Punto de reunión Este (Base) Точка сбора Красных (База) Punkt zbiórki Wschodu (Baza) + Point de ralliement EST (Base) Rallypoint Independent (Base) @@ -66,6 +68,7 @@ Punto de reunión Independiente (Base) Точка сбора Независимых (База Punkt zbiórki Ruchu oporu (Baza) + Point de ralliement Indépendant (Base) Rallypoint West @@ -73,6 +76,7 @@ Punto de reunión Oeste Точка сбора Синих Punkt zbiórki Zachodu + Point de ralliement OUEST Rallypoint East @@ -80,6 +84,7 @@ Punto de reunión Este Точка сбора Красных Punkt zbiórki Wschodu + Point de ralliement EST Rallypoint Independent @@ -87,6 +92,7 @@ Punto de reunión Independiente Точка сбора Независимых Punkt zbiórki Ruchu oporu + Point de ralliement Indépendant \ No newline at end of file diff --git a/addons/scopes/stringtable.xml b/addons/scopes/stringtable.xml index dd5abdef55..caaff182f3 100644 --- a/addons/scopes/stringtable.xml +++ b/addons/scopes/stringtable.xml @@ -7,6 +7,7 @@ Малая корректировка ВВЕРХ Ajuste menor arriba Regola leggermente alzata in alto + Hausse + Minor adjustment down @@ -14,6 +15,7 @@ Малая корректировка ВНИЗ Ajuste menor abajo Regola leggermente alzata in basso + Hausse - Minor adjustment right @@ -21,6 +23,7 @@ Малая корректировка ВПРАВО Ajuste menor derecha Regola leggermente il tiro a destra + Dérive + Minor adjustment left @@ -28,6 +31,7 @@ Малая корректировка ВЛЕВО Ajuste menor izquierda Regola leggermete il tiro a sinistra + Dérive - Major adjustment up @@ -35,6 +39,7 @@ Большая корректировка ВВЕРХ Ajuste mayor arriba Regola l'alzata in alto + Hausse +++ Major adjustment down @@ -42,6 +47,7 @@ Большая корректировка ВНИЗ Ajuste mayor abajo Regola l'alzata in basso + Hausse --- Major adjustment right @@ -49,6 +55,7 @@ Большая корректировка ВПРАВО Ajuste mayor derecha Regola il tiro a destra + Dérive +++ Major adjustment left @@ -56,6 +63,7 @@ Большая корректировка ВЛЕВО Ajuste mayor izquierda Regola il tiro a sinistra + Dérive --- Set zero adjustment @@ -63,6 +71,7 @@ Сбросить корректировку Establecer ajuste a cero Resetta i valori del tiro + RAZ corrections - + \ No newline at end of file diff --git a/addons/weather/stringtable.xml b/addons/weather/stringtable.xml index 2278bf350d..7d1e1a1a2c 100644 --- a/addons/weather/stringtable.xml +++ b/addons/weather/stringtable.xml @@ -5,9 +5,9 @@ Show Wind Info Pokaż inf. o wietrze Показать информацию о погоде - Afficher information du vent + Afficher information sur le vent Mostrar información del viento Mostra informazioni sul vento - + \ No newline at end of file From 9c076364ec79b44f18e6f4882f24693b2881d3a0 Mon Sep 17 00:00:00 2001 From: jaynus Date: Sat, 18 Apr 2015 10:18:33 -0700 Subject: [PATCH 239/305] Titan AA asset functionality is now vanilla, locking doesn't override AA/AP stuff. --- addons/javelin/CfgVehicles.hpp | 3 +++ addons/javelin/CfgWeapons.hpp | 15 ++++++++++++--- addons/javelin/functions/fnc_onFired.sqf | 4 ++-- addons/javelin/functions/fnc_onOpticDraw.sqf | 8 +++++--- 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/addons/javelin/CfgVehicles.hpp b/addons/javelin/CfgVehicles.hpp index 02b8789e1a..5ea7e3327c 100644 --- a/addons/javelin/CfgVehicles.hpp +++ b/addons/javelin/CfgVehicles.hpp @@ -14,6 +14,9 @@ class CfgVehicles { class AT_01_base_F: StaticMGWeapon { class Turrets : Turrets { class MainTurret : MainTurret { + weapons[] = { "missiles_titan_static_at" }; + magazines[] = {"1Rnd_GAT_missiles","1Rnd_GAT_missiles","1Rnd_GAT_missiles","1Rnd_GAT_missiles"}; + turretInfoType = "ACE_RscOptics_javelin"; gunnerOpticsModel = PATHTOF(data\reticle_titan.p3d); opticsZoomMin = 0.08333; diff --git a/addons/javelin/CfgWeapons.hpp b/addons/javelin/CfgWeapons.hpp index 79e7c7358c..1392cd1a56 100644 --- a/addons/javelin/CfgWeapons.hpp +++ b/addons/javelin/CfgWeapons.hpp @@ -5,18 +5,27 @@ class CfgWeapons { class Launcher_Base_F : Launcher { class WeaponSlotsInfo; }; - + + // @TODO: AA by default, motherfuckers class missiles_titan : MissileLauncher { + + }; + + class missiles_titan_at : missiles_titan { weaponInfoType = "ACE_RscOptics_javelin"; modelOptics = PATHTOF(data\reticle_titan.p3d); canLock = 0; - + magazines[] = {"1Rnd_GAT_missiles"}; lockingTargetSound[] = {"",0,1}; lockedTargetSound[] = {"",0,1}; }; + class missiles_titan_static_at : missiles_titan_at { }; - class launch_Titan_base : Launcher_Base_F { + // @TODO: AA by default, motherfuckers + class launch_Titan_base : Launcher_Base_F {}; + + class launch_Titan_short_base : launch_Titan_base { weaponInfoType = "ACE_RscOptics_javelin"; modelOptics = PATHTOF(data\reticle_titan.p3d); diff --git a/addons/javelin/functions/fnc_onFired.sqf b/addons/javelin/functions/fnc_onFired.sqf index a4e351cd92..8c6590f5df 100644 --- a/addons/javelin/functions/fnc_onFired.sqf +++ b/addons/javelin/functions/fnc_onFired.sqf @@ -6,9 +6,9 @@ PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); // Bail on not missile if( _shooter != ACE_player) exitWith { false }; -if( ! ([ (configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)) ), "launch_Titan_base"] call EFUNC(common,inheritsFrom)) +if( ! ([ (configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)) ), "launch_Titan_short_base"] call EFUNC(common,inheritsFrom)) && - { ! ([ (configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)) ), "missiles_titan"] call EFUNC(common,inheritsFrom)) } + { ! ([ (configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)) ), "missiles_titan_at"] call EFUNC(common,inheritsFrom)) } ) exitWith { }; _pfh_handle = uiNamespace getVariable ["ACE_RscOptics_javelin_PFH", nil]; diff --git a/addons/javelin/functions/fnc_onOpticDraw.sqf b/addons/javelin/functions/fnc_onOpticDraw.sqf index 73f07d3e90..adbd2fde1c 100644 --- a/addons/javelin/functions/fnc_onOpticDraw.sqf +++ b/addons/javelin/functions/fnc_onOpticDraw.sqf @@ -30,16 +30,18 @@ _soundTime = _args select 4; _randomLockInterval = _args select 5; _fireDisabledEH = _args select 6; -if( ! ([ (configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)) ), "launch_Titan_base"] call EFUNC(common,inheritsFrom)) +if( ! ([ (configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)) ), "launch_Titan_short_base"] call EFUNC(common,inheritsFrom)) && - { ! ([ (configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)) ), "missiles_titan"] call EFUNC(common,inheritsFrom)) } + { ! ([ (configFile >> "CfgWeapons" >> (currentWeapon (vehicle ACE_player)) ), "missiles_titan_at"] call EFUNC(common,inheritsFrom)) } ) exitWith { __JavelinIGUITargeting ctrlShow false; __JavelinIGUITargetingGate ctrlShow false; __JavelinIGUITargetingLines ctrlShow false; __JavelinIGUITargetingConstraints ctrlShow false; - _fireDisabledEH = [_fireDisabledEH] call FUNC(enableFire); + if(!isNil "_fireDisabledEH") then { + _fireDisabledEH = [_fireDisabledEH] call FUNC(enableFire); + }; [(_this select 1)] call cba_fnc_removePerFrameHandler; uiNamespace setVariable["ACE_RscOptics_javelin_PFH", nil]; From c1ee623808b197ae2694dee08c8e30cf86762d85 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sat, 18 Apr 2015 19:22:24 +0200 Subject: [PATCH 240/305] Added a few static gui elements --- addons/atragmx/RscTitles.hpp | 42 ++++++++++++++++++- .../functions/fnc_show_atmo_env_data.sqf | 2 +- .../functions/fnc_show_target_data.sqf | 2 +- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/addons/atragmx/RscTitles.hpp b/addons/atragmx/RscTitles.hpp index 6497606683..c421f5df70 100644 --- a/addons/atragmx/RscTitles.hpp +++ b/addons/atragmx/RscTitles.hpp @@ -1213,6 +1213,12 @@ class ATragMX_Display { class TEXT_ATMO_ENV_DATA_NEXT: TEXT_TARGET_SPEED_ASSIST_NEXT { idc=13010; }; + class TEXT_ATMO_ENV_DATA_CALC_METHOD: TEXT_GUN_AMMO_DATA_BORE_HEIGHT { + idc=13011; + x=0.550*safezoneW+safezoneX+0.24; + y=0.265*safezoneH+safezoneY+0.29; + text="Calc Method"; + }; class TEXT_TARGET_DATA_LATITUDE: TEXT_BORE_HEIGHT { idc=14000; @@ -1237,15 +1243,31 @@ class ATragMX_Display { }; class TEXT_TARGET_DATA_WIND_SPEED: TEXT_TARGET_DATA_LATITUDE { idc=14002; + w=1.2; y=0.265*safezoneH+safezoneY+0.360; text="Wind Speed (m/s)"; }; + class TEXT_TARGET_DATA_WIND_SPEED_1: TEXT_TARGET_DATA_LATITUDE { + idc=141020; + colorText[]={0,0,0,0.6}; + w=0.05; + h=0.03; + sizeEx=0.025; + x=0.550*safezoneW+safezoneX+0.270; + y=0.265*safezoneH+safezoneY+0.357; + text="1"; + }; class TEXT_TARGET_DATA_WIND_SPEED_INPUT_1: TEXT_TARGET_DATA_LATITUDE_INPUT { idc=140020; w=0.045; - x=0.550*safezoneW+safezoneX+0.300; + x=0.550*safezoneW+safezoneX+0.290; y=0.265*safezoneH+safezoneY+0.360; }; + class TEXT_TARGET_DATA_WIND_SPEED_2: TEXT_TARGET_DATA_WIND_SPEED_1 { + idc=141021; + x=0.550*safezoneW+safezoneX+0.330; + text="2"; + }; class TEXT_TARGET_DATA_WIND_SPEED_INPUT_2: TEXT_TARGET_DATA_LATITUDE_INPUT { idc=140021; w=0.045; @@ -1263,16 +1285,32 @@ class ATragMX_Display { }; class TEXT_TARGET_DATA_INCLINATION_ANGLE: TEXT_TARGET_DATA_LATITUDE { idc=14004; + w=1.2; y=0.265*safezoneH+safezoneY+0.440; text="Inclination Angle"; }; + class TEXT_TARGET_DATA_INCLINATION_ANGLE_COSINE: TEXT_TARGET_DATA_LATITUDE { + idc=141041; + colorText[]={0,0,0,0.6}; + w=0.05; + h=0.03; + sizeEx=0.025; + x=0.550*safezoneW+safezoneX+0.270; + y=0.265*safezoneH+safezoneY+0.437; + text="c"; + }; class TEXT_TARGET_DATA_INCLINATION_ANGLE_INPUT_COSINE: TEXT_TARGET_DATA_LATITUDE_INPUT { idc=140041; w=0.045; - x=0.550*safezoneW+safezoneX+0.300; + x=0.550*safezoneW+safezoneX+0.290; y=0.265*safezoneH+safezoneY+0.440; onKeyUp=QUOTE(if (_this select 1 == 28) then {0 call FUNC(update_inclination_angle)}); }; + class TEXT_TARGET_DATA_INCLINATION_ANGLE_DEGREE: TEXT_TARGET_DATA_INCLINATION_ANGLE_COSINE { + idc=141040; + x=0.550*safezoneW+safezoneX+0.330; + text="d"; + }; class TEXT_TARGET_DATA_INCLINATION_ANGLE_INPUT_DEGREE: TEXT_TARGET_DATA_LATITUDE_INPUT { idc=140040; w=0.045; diff --git a/addons/atragmx/functions/fnc_show_atmo_env_data.sqf b/addons/atragmx/functions/fnc_show_atmo_env_data.sqf index 9386956067..56f75f7844 100644 --- a/addons/atragmx/functions/fnc_show_atmo_env_data.sqf +++ b/addons/atragmx/functions/fnc_show_atmo_env_data.sqf @@ -17,7 +17,7 @@ GVAR(showAtmoEnvData) = _this; -{ctrlShow [_x, _this]} forEach [13000, 13001, 13002, 13003, 130030, 13004, 130040, 13005, 130050, 13006, 130060, 13007, 13008, 13009, 13010]; +{ctrlShow [_x, _this]} forEach [13000, 13001, 13002, 13003, 130030, 13004, 130040, 13005, 130050, 13006, 130060, 13007, 13008, 13009, 13010, 13011]; if (_this) then { [] call FUNC(update_atmo_selection); diff --git a/addons/atragmx/functions/fnc_show_target_data.sqf b/addons/atragmx/functions/fnc_show_target_data.sqf index 8b206fee3a..4e696ae331 100644 --- a/addons/atragmx/functions/fnc_show_target_data.sqf +++ b/addons/atragmx/functions/fnc_show_target_data.sqf @@ -17,7 +17,7 @@ GVAR(showTargetData) = _this; -{ctrlShow [_x, _this]} forEach [14000, 140000, 14001, 140010, 14002, 140020, 140021, 14003, 140030, 14004, 140040, 140041, 14005, 140050, 14006, 140060, 14007, 14008, 14009, 14010, 14011]; +{ctrlShow [_x, _this]} forEach [14000, 140000, 14001, 140010, 14002, 141020, 140020, 141021, 140021, 14003, 140030, 14004, 140040, 141040, 141041, 140041, 14005, 140050, 14006, 140060, 14007, 14008, 14009, 14010, 14011]; if (_this) then { [] call FUNC(update_target_data); From 34b62a0a86237b62c5ba85c9356f3653f8f86cfc Mon Sep 17 00:00:00 2001 From: jaynus Date: Sat, 18 Apr 2015 10:50:16 -0700 Subject: [PATCH 241/305] Print privates declaration for file. --- tools/search_privates.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/tools/search_privates.py b/tools/search_privates.py index 4b418de8d6..f3fbf60c10 100644 --- a/tools/search_privates.py +++ b/tools/search_privates.py @@ -81,10 +81,25 @@ def check_privates(filepath): if len(missing) > 0: print (filepath) + + private_output = 'private['; + first = True + for bad_priv in missing: + if first: + first = False + private_output = private_output + '"' + bad_priv + else: + private_output = private_output + '", "' + bad_priv + + private_output = private_output + '"];'; + print private_output + for bad_priv in missing: print ('\t' + bad_priv) bad_count_file = bad_count_file + 1 - + + + return bad_count_file def main(): From 87337bcb7a51a4e4be2728be25cdb3edb9b8eec3 Mon Sep 17 00:00:00 2001 From: jaynus Date: Sat, 18 Apr 2015 10:50:22 -0700 Subject: [PATCH 242/305] ace_javelin privates --- addons/javelin/functions/fnc_onOpticDraw.sqf | 7 +++++-- addons/javelin/functions/fnc_onOpticUnload.sqf | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/addons/javelin/functions/fnc_onOpticDraw.sqf b/addons/javelin/functions/fnc_onOpticDraw.sqf index adbd2fde1c..74f7c49746 100644 --- a/addons/javelin/functions/fnc_onOpticDraw.sqf +++ b/addons/javelin/functions/fnc_onOpticDraw.sqf @@ -5,12 +5,15 @@ TRACE_1("enter", _this); #define __TRACKINTERVAL 0 // how frequent the check should be. #define __LOCKONTIME 3 // Lock on won't occur sooner +private["_apos", "_aposX", "_aposY", "_args", "_boundsInput", "_bpos", "_canFire", "_constraintBottom"]; +private["_constraintLeft", "_constraintRight", "_constraintTop", "_currentTarget", "_fireDisabledEH"]; +private["_firedEH", "_fov", "_lastTick", "_lockTime", "_maxX", "_maxY", "_minX", "_minY", "_newTarget"]; +private["_offsetX", "_offsetY", "_pos", "_randomLockInterval", "_randomPosWithinBounds", "_range"]; +private["_runTime", "_soundTime", "_targetArray", "_zamerny"]; #define __OffsetX ((ctrlPosition __JavelinIGUITargetingLineV) select 0) - 0.5 #define __OffsetY ((ctrlPosition __JavelinIGUITargetingLineH) select 1) - 0.5 -private["_isJavelin", "_args", "_lastTick", "_runTime", "_soundTime", "_lockTime", "_newTarget", "_currentTarget", "_range", "_pos", "_targetArray"]; - // Reset arguments if we havnt rendered in over a second _args = uiNamespace getVariable[QGVAR(arguments), [] ]; if( (count _args) > 0) then { diff --git a/addons/javelin/functions/fnc_onOpticUnload.sqf b/addons/javelin/functions/fnc_onOpticUnload.sqf index 4086c02766..187b6cf589 100644 --- a/addons/javelin/functions/fnc_onOpticUnload.sqf +++ b/addons/javelin/functions/fnc_onOpticUnload.sqf @@ -1,6 +1,7 @@ //#define DEBUG_MODE_FULL #include "script_component.hpp" TRACE_1("enter", _this); +private["_args", "_disableFireEH", "_pfh"]; uiNameSpace setVariable ['ACE_RscOptics_javelin',nil]; From 953faf3d4b1a4125ff75f1210da905c498bbf5e8 Mon Sep 17 00:00:00 2001 From: jaynus Date: Sat, 18 Apr 2015 10:53:21 -0700 Subject: [PATCH 243/305] ace_missileguidance privates. --- addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf | 1 + addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf | 2 ++ addons/missileguidance/functions/fnc_attackProfile_LIN.sqf | 2 +- addons/missileguidance/functions/fnc_doAttackProfile.sqf | 3 +-- addons/missileguidance/functions/fnc_doSeekerSearch.sqf | 2 +- addons/missileguidance/functions/fnc_guidancePFH.sqf | 1 + addons/missileguidance/functions/fnc_onFired.sqf | 2 ++ addons/missileguidance/functions/fnc_rotateVectLine.sqf | 1 + addons/missileguidance/functions/fnc_seekerType_Optic.sqf | 1 + addons/missileguidance/functions/fnc_seekerType_SALH.sqf | 2 +- 10 files changed, 12 insertions(+), 5 deletions(-) diff --git a/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf b/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf index 1e13c57ccc..d84b3b126b 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf @@ -9,6 +9,7 @@ EXPLODE_7_PVT(((_this select 1) select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); private["_targetPos", "_projectilePos", "_target", "_seekerTargetPos", "_launchParams", "_targetLaunchParams"]; private["_distanceToTarget", "_distanceToShooter", "_addHeight", "_returnTargetPos", "_state"]; +private["_cruisAlt", "_distanceShooterToTarget", "_shooterPos"]; _seekerTargetPos = _this select 0; _launchParams = _this select 1; diff --git a/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf b/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf index e9064da404..393abebc19 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf @@ -9,6 +9,8 @@ EXPLODE_7_PVT(((_this select 1) select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); private["_targetPos", "_projectilePos", "_target", "_seekerTargetPos", "_launchParams", "_targetLaunchParams"]; private["_distanceToTarget", "_distanceToShooter", "_addHeight", "_returnTargetPos", "_state"]; +private["_cruisAlt", "_distanceShooterToTarget", "_shooterPos"]; + _seekerTargetPos = _this select 0; _launchParams = _this select 1; diff --git a/addons/missileguidance/functions/fnc_attackProfile_LIN.sqf b/addons/missileguidance/functions/fnc_attackProfile_LIN.sqf index 032ae51791..8c67e68402 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_LIN.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_LIN.sqf @@ -3,7 +3,7 @@ EXPLODE_7_PVT(((_this select 1) select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); private["_targetPos", "_projectilePos", "_target", "_seekerTargetPos", "_launchParams", "_targetLaunchParams"]; -private["_distanceToTarget", "_distanceToShooter", "_addHeight", "_returnTargetPos"]; +private["_distanceToTarget", "_distanceToShooter", "_addHeight", "_returnTargetPos", "_shooterPos"]; _seekerTargetPos = _this select 0; _launchParams = _this select 1; diff --git a/addons/missileguidance/functions/fnc_doAttackProfile.sqf b/addons/missileguidance/functions/fnc_doAttackProfile.sqf index fa7c6f4f8b..b9a3502035 100644 --- a/addons/missileguidance/functions/fnc_doAttackProfile.sqf +++ b/addons/missileguidance/functions/fnc_doAttackProfile.sqf @@ -2,8 +2,7 @@ #include "script_component.hpp" EXPLODE_7_PVT(((_this select 1) select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); -private["_attackProfilePos"]; - +private["_testName", "_attackProfilePos", "_attackProfile", "_attackProfileName", "_attackProfilesCfg", "_i", "_launchParams", "_testame", "_testProfile"]; _launchParams = ((_this select 1) select 1); _attackProfileName = _launchParams select 3; diff --git a/addons/missileguidance/functions/fnc_doSeekerSearch.sqf b/addons/missileguidance/functions/fnc_doSeekerSearch.sqf index 1e43d83218..081ab16353 100644 --- a/addons/missileguidance/functions/fnc_doSeekerSearch.sqf +++ b/addons/missileguidance/functions/fnc_doSeekerSearch.sqf @@ -2,7 +2,7 @@ #include "script_component.hpp" EXPLODE_7_PVT(((_this select 1) select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); -private["_seekerProfilePos"]; +private["_seekerProfilePos", "_i", "_launchParams", "_seekerType", "_seekerTypeName", "_seekerTypesCfg", "_testName", "_testProfile"]; _launchParams = ((_this select 1) select 1); _seekerTypeName = _launchParams select 2; diff --git a/addons/missileguidance/functions/fnc_guidancePFH.sqf b/addons/missileguidance/functions/fnc_guidancePFH.sqf index 2487e3b28f..614323d63f 100644 --- a/addons/missileguidance/functions/fnc_guidancePFH.sqf +++ b/addons/missileguidance/functions/fnc_guidancePFH.sqf @@ -7,6 +7,7 @@ private["_launchParams", "_targetLaunchParams", "_flightParams", "_seekerParams" private["_lastRunTime", "_runtimeDelta", "_adjustTime", "_args", "_seekerTargetPos", "_projectilePos"]; private["_profileAdjustedTargetPos", "_incDeflection", "_minDeflection", "_maxDeflection"]; private["_targetVector", "_adjustVector", "_finalAdjustVector", "_changeVector", "_pitch", "_yaw", "_roll"]; +private["_PS", "_distanceToTarget", "_targetRelativeVector", "_vectorTo"]; _args = _this select 0; EXPLODE_7_PVT((_args select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); diff --git a/addons/missileguidance/functions/fnc_onFired.sqf b/addons/missileguidance/functions/fnc_onFired.sqf index e36742bce5..071b2bbf99 100644 --- a/addons/missileguidance/functions/fnc_onFired.sqf +++ b/addons/missileguidance/functions/fnc_onFired.sqf @@ -8,6 +8,8 @@ if(GVAR(enabled) < 1 || {!local _projectile} ) exitWith { false }; if( !isPlayer _shooter && { GVAR(enabled) < 2 } ) exitWith { false }; private["_config", "_enabled", "_target", "_seekerType", "_attackProfile"]; +private["_args", "_canUseLock", "_guidingUnit", "_launchPos", "_lockMode", "_targetPos", "_vanillaTarget"]; + PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); // Bail on not missile diff --git a/addons/missileguidance/functions/fnc_rotateVectLine.sqf b/addons/missileguidance/functions/fnc_rotateVectLine.sqf index b0360cc330..b9904f0e5a 100644 --- a/addons/missileguidance/functions/fnc_rotateVectLine.sqf +++ b/addons/missileguidance/functions/fnc_rotateVectLine.sqf @@ -1,4 +1,5 @@ #include "script_component.hpp" +private["_d", "_map", "_p", "_theta", "_u"]; _map = _this select 0; _theta = _this select 1; diff --git a/addons/missileguidance/functions/fnc_seekerType_Optic.sqf b/addons/missileguidance/functions/fnc_seekerType_Optic.sqf index 45e378c975..872f33a917 100644 --- a/addons/missileguidance/functions/fnc_seekerType_Optic.sqf +++ b/addons/missileguidance/functions/fnc_seekerType_Optic.sqf @@ -3,6 +3,7 @@ EXPLODE_7_PVT(((_this select 1) select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); private["_targets", "_foundTargetPos", "_launchParams", "_seekerParams", "_targetLaunchParams"]; +private["_angleFov", "_angleOkay", "_losOkay", "_seekerTargetPos", "_sensorPos", "_target"]; _seekerTargetPos = _this select 0; diff --git a/addons/missileguidance/functions/fnc_seekerType_SALH.sqf b/addons/missileguidance/functions/fnc_seekerType_SALH.sqf index 07f997a041..7aafad1114 100644 --- a/addons/missileguidance/functions/fnc_seekerType_SALH.sqf +++ b/addons/missileguidance/functions/fnc_seekerType_SALH.sqf @@ -2,8 +2,8 @@ #include "script_component.hpp" EXPLODE_7_PVT(((_this select 1) select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); +private["_angleFov", "_canSeeTarget", "_foundTargetPos", "_laserResult", "_launchParams", "_seekerParams", "_seekerTargetPos", "_sensorPos", "_target"]; _seekerTargetPos = _this select 0; - _launchParams = _this select 1; _seekerParams = _launchParams select 3; _angleFov = _seekerParams select 0; From 8361ec3812d099edf34dd49519faffcea3e639ef Mon Sep 17 00:00:00 2001 From: jaynus Date: Sat, 18 Apr 2015 10:57:11 -0700 Subject: [PATCH 244/305] ace_lasers --- addons/laser/XEH_pre_init.sqf | 3 --- .../laser/functions/fnc_findStrongestRay.sqf | 2 +- addons/laser/functions/fnc_laserTargetPFH.sqf | 2 +- addons/laser/functions/fnc_laser_init.sqf | 1 + addons/laser/functions/fnc_rotateVectLine.sqf | 2 +- .../functions/fnc_seekerFindLaserSpot.sqf | 9 ++++---- addons/laser/functions/fnc_shootCone.sqf | 3 +-- .../functions/fnc_translateToModelSpace.sqf | 16 -------------- .../functions/fnc_translateToWeaponSpace.sqf | 22 ------------------- .../fnc_vanillaLaserSeekerHandler.sqf | 2 +- 10 files changed, 11 insertions(+), 51 deletions(-) delete mode 100644 addons/laser/functions/fnc_translateToModelSpace.sqf delete mode 100644 addons/laser/functions/fnc_translateToWeaponSpace.sqf diff --git a/addons/laser/XEH_pre_init.sqf b/addons/laser/XEH_pre_init.sqf index de56274759..2dd6e666eb 100644 --- a/addons/laser/XEH_pre_init.sqf +++ b/addons/laser/XEH_pre_init.sqf @@ -8,9 +8,6 @@ PREP(checkLos); PREP(findStrongestRay); -PREP(translateToModelSpace); -PREP(translateToWeaponSpace); - PREP(onLaserDesignatorDraw); PREP(seekerFindLaserSpot); diff --git a/addons/laser/functions/fnc_findStrongestRay.sqf b/addons/laser/functions/fnc_findStrongestRay.sqf index e4238361cb..811b75d351 100644 --- a/addons/laser/functions/fnc_findStrongestRay.sqf +++ b/addons/laser/functions/fnc_findStrongestRay.sqf @@ -1,5 +1,5 @@ #include "script_component.hpp" - +private["_checkPos", "_i", "_largest", "_largestSpot", "_list", "_outliers", "_remainingSpots", "_samplePos", "_spot", "_spots", "_testPos"]; _list = _this select 0; _checkPos = _this select 1; _spots = []; diff --git a/addons/laser/functions/fnc_laserTargetPFH.sqf b/addons/laser/functions/fnc_laserTargetPFH.sqf index d73d9f070a..4c4f242482 100644 --- a/addons/laser/functions/fnc_laserTargetPFH.sqf +++ b/addons/laser/functions/fnc_laserTargetPFH.sqf @@ -2,7 +2,7 @@ #include "script_component.hpp" TRACE_1("enter", _this); -private["_args", "_laserTarget"]; +private["_args", "_laserTarget", "_pos", "_shooter", "_uuid"]; //TRACE_1("enter", _this); _args = _this select 0; _laserTarget = _args select 0; diff --git a/addons/laser/functions/fnc_laser_init.sqf b/addons/laser/functions/fnc_laser_init.sqf index 378ee38407..2be349c294 100644 --- a/addons/laser/functions/fnc_laser_init.sqf +++ b/addons/laser/functions/fnc_laser_init.sqf @@ -3,6 +3,7 @@ TRACE_1("enter", _this); PARAMS_1(_laserTarget); +private["_uuid"]; // Add the target to the global targets array // Everyone tracks them diff --git a/addons/laser/functions/fnc_rotateVectLine.sqf b/addons/laser/functions/fnc_rotateVectLine.sqf index ec85a83cb7..8bae491c4e 100644 --- a/addons/laser/functions/fnc_rotateVectLine.sqf +++ b/addons/laser/functions/fnc_rotateVectLine.sqf @@ -1,5 +1,5 @@ #include "script_component.hpp" - +private["_d", "_map", "_p", "_theta", "_u"]; _map = _this select 0; _theta = _this select 1; diff --git a/addons/laser/functions/fnc_seekerFindLaserSpot.sqf b/addons/laser/functions/fnc_seekerFindLaserSpot.sqf index 41ea877739..77713eb591 100644 --- a/addons/laser/functions/fnc_seekerFindLaserSpot.sqf +++ b/addons/laser/functions/fnc_seekerFindLaserSpot.sqf @@ -15,10 +15,11 @@ #include "script_component.hpp" -private ["_pos", "_seekerWavelengths", "_seekerCode", "_spots", "_buckets", "_excludes", "_bucketIndex", "_finalPos", "_owner", "_obj", "_x", "_method", - "_emitterWavelength", "_laserCode", "_divergence", "_laser", "_laserPos", "_laserDir", "_res", "_bucketPos", "_bucketList", "_c", "_forEachIndex", "_index", - "_testPos", "_finalBuckets", "_largest", "_largestIndex", "_finalBucket", "_owners", "_avgX", "_avgY", "_avgZ", "_count", "_maxOwner", "_maxOwnerIndex", "_finalOwner"]; - +private ["_pos", "_seekerWavelengths", "_seekerCode", "_spots", "_buckets", "_excludes", "_bucketIndex", "_finalPos", "_owner", "_obj", "_x", "_method"]; +private ["_emitterWavelength", "_laserCode", "_divergence", "_laser", "_laserPos", "_laserDir", "_res", "_bucketPos", "_bucketList", "_c", "_forEachIndex", "_index"]; +private ["_testPos", "_finalBuckets", "_largest", "_largestIndex", "_finalBucket", "_owners", "_avgX", "_avgY", "_avgZ", "_count", "_maxOwner", "_maxOwnerIndex", "_finalOwner"]; +private["_dir", "_seekerCos", "_seekerFov", "_testDotProduct", "_testPoint", "_testPointVector"]; + _pos = _this select 0; _dir = vectorNormalized (_this select 1); _seekerFov = _this select 2; diff --git a/addons/laser/functions/fnc_shootCone.sqf b/addons/laser/functions/fnc_shootCone.sqf index 801353d4f7..a7187aa0e4 100644 --- a/addons/laser/functions/fnc_shootCone.sqf +++ b/addons/laser/functions/fnc_shootCone.sqf @@ -1,7 +1,6 @@ #include "script_component.hpp" //#define DEBUG_MODE_FULL -private ["_divergence","_pos","_vec","_longestReturn","_shortestReturn","_resultPositions","_p1","_p2","_p","_v","_cp","_vecRotateMap","_result", - "_resultPos","_distance","_count","_pos2","_radOffset","_offset","_offsetPos","_offsetVector"]; +private ["_i", "_divergence","_pos","_vec","_longestReturn","_shortestReturn","_resultPositions","_p1","_p2","_p","_v","_cp","_vecRotateMap","_result", "_resultPos","_distance","_count","_pos2","_radOffset","_offset","_offsetPos","_offsetVector"]; _divergence = 0.3; _pos = _this select 0; _vec = _this select 1; diff --git a/addons/laser/functions/fnc_translateToModelSpace.sqf b/addons/laser/functions/fnc_translateToModelSpace.sqf deleted file mode 100644 index 1e2e930ac7..0000000000 --- a/addons/laser/functions/fnc_translateToModelSpace.sqf +++ /dev/null @@ -1,16 +0,0 @@ -_object = _this select 0; -_origin = getPosASL _object; -_matrix = _this select 1; -_xVec = _matrix select 0; -_yVec = _matrix select 1; -_zVec = _matrix select 2; - -_offset = _this select 2; - -_x = _offset select 0; -_y = _offset select 1; -_z = _offset select 2; - -_out = (((_xVec vectorMultiply _x) vectorAdd (_yVec vectorMultiply _y)) vectorAdd (_zVec vectorMultiply _z)) vectorAdd _origin; - -_out; \ No newline at end of file diff --git a/addons/laser/functions/fnc_translateToWeaponSpace.sqf b/addons/laser/functions/fnc_translateToWeaponSpace.sqf deleted file mode 100644 index 2c7dc5e6da..0000000000 --- a/addons/laser/functions/fnc_translateToWeaponSpace.sqf +++ /dev/null @@ -1,22 +0,0 @@ -_object = _this select 0; -_origin = getPosASL _object; -_matrix = _this select 1; -_xVec = _matrix select 0; -_yVec = _matrix select 1; -_zVec = _matrix select 2; - -_offset = _this select 2; - -_offset = _offset vectorDiff _origin; - -_x = _offset select 0; -_y = _offset select 1; -_z = _offset select 2; - -_out = [ - ((_xVec select 0)*_x) + ((_xVec select 1)*_y) + ((_xVec select 2)*_z), - ((_yVec select 0)*_x) + ((_yVec select 1)*_y) + ((_yVec select 2)*_z), - ((_zVec select 0)*_x) + ((_zVec select 1)*_y) + ((_zVec select 2)*_z) - ]; - -_out; \ No newline at end of file diff --git a/addons/laser/functions/fnc_vanillaLaserSeekerHandler.sqf b/addons/laser/functions/fnc_vanillaLaserSeekerHandler.sqf index 38cd1839f9..091c4f7acf 100644 --- a/addons/laser/functions/fnc_vanillaLaserSeekerHandler.sqf +++ b/addons/laser/functions/fnc_vanillaLaserSeekerHandler.sqf @@ -12,7 +12,7 @@ //#define DEBUG_MODE_FULL #include "script_component.hpp" -private["_emitter", "_owner", "_gunnerInfo", "_turretInfo", "_povPos", "_povDir"]; +private["_emmiter", "_owner", "_gunnerInfo", "_turretInfo", "_povPos", "_povDir"]; _emmiter = _this select 0; _owner = _this select 1; From dea95f7947ad0b1b15e938f4363a685a5ef5f2d8 Mon Sep 17 00:00:00 2001 From: jaynus Date: Sat, 18 Apr 2015 10:57:35 -0700 Subject: [PATCH 245/305] ace_laser_selfdesignate --- addons/laser_selfdesignate/functions/fnc_findLaserSource.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/laser_selfdesignate/functions/fnc_findLaserSource.sqf b/addons/laser_selfdesignate/functions/fnc_findLaserSource.sqf index ac1ae7e438..27beed3c6a 100644 --- a/addons/laser_selfdesignate/functions/fnc_findLaserSource.sqf +++ b/addons/laser_selfdesignate/functions/fnc_findLaserSource.sqf @@ -13,7 +13,7 @@ //#define DEBUG_MODE_FULL #include "script_component.hpp" -private["_emitter", "_owner", "_gunnerInfo", "_turretInfo", "_povPos", "_povDir"]; +private["_emmiter", "_owner", "_gunnerInfo", "_turretInfo", "_povPos", "_povDir"]; _emmiter = _this select 0; _owner = _this select 1; From 85e5293c37ac85fc864667efbc7e9f25d390c0a7 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 18 Apr 2015 19:59:41 +0200 Subject: [PATCH 246/305] Fix settings localization is done by the server instead of client #744 --- .../functions/fnc_loadSettingsFromProfile.sqf | 30 +++++++++++++++++++ .../functions/fnc_setSettingFromConfig.sqf | 8 ++--- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/addons/common/functions/fnc_loadSettingsFromProfile.sqf b/addons/common/functions/fnc_loadSettingsFromProfile.sqf index 69d86eac98..1817e2f40e 100644 --- a/addons/common/functions/fnc_loadSettingsFromProfile.sqf +++ b/addons/common/functions/fnc_loadSettingsFromProfile.sqf @@ -13,6 +13,29 @@ */ #include "script_component.hpp" +private ["_parseConfigForDisplayNames", "_name", "_isClientSetable", "_isForced", "_profileValue"]; + +_parseConfigForDisplayNames = { + private "_optionEntry"; + _optionEntry = _this select 0; + if !(isClass _optionEntry) exitwith {false}; + _x set [3, getText (_optionEntry >> "displayName")]; + _x set [4, getText (_optionEntry >> "description")]; + + private "_values"; + _values = _x select 5; + { + private "_text"; + _text = _x; + if (((typeName _text) == "STRING") && {(count _text) > 1} && {(_text select [0,1]) == "$"}) then { + _text = localize (_text select [1, ((count _text) - 1)]); //chop off the leading $ + _values set [_forEachIndex, _text]; + }; + } forEach _values; + true; +}; + + // Iterate through settings { _name = _x select 0; @@ -34,4 +57,11 @@ }; }; }; + + if !([configFile >> "ACE_Settings" >> _name] call _parseConfigForDisplayNames) then { + if !([configFile >> "ACE_ServerSettings" >> _name] call _parseConfigForDisplayNames) then { + [missionConfigFile >> "ACE_Settings" >> _name] call _parseConfigForDisplayNames; + }; + }; + } forEach GVAR(settings); diff --git a/addons/common/functions/fnc_setSettingFromConfig.sqf b/addons/common/functions/fnc_setSettingFromConfig.sqf index 347320edec..3a1b6fd055 100644 --- a/addons/common/functions/fnc_setSettingFromConfig.sqf +++ b/addons/common/functions/fnc_setSettingFromConfig.sqf @@ -75,9 +75,9 @@ if (isNil _name) then { getNumber (_optionEntry >> "force") > 0, _value ]; - + //Strings in the values array won't be localized from the config, so just do that now: - private "_values"; + /*private "_values"; _values = _settingData select 5; { _text = _x; @@ -85,8 +85,8 @@ if (isNil _name) then { _text = localize (_text select [1, ((count _text) - 1)]); //chop off the leading $ _values set [_forEachIndex, _text]; }; - } forEach _values; - + } forEach _values;*/ + GVAR(settings) pushBack _settingData; From 54a70f26b1e37d5d4ba553aab4153d7377dee6d7 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 18 Apr 2015 20:06:01 +0200 Subject: [PATCH 247/305] Moved to own function. --- addons/common/XEH_postInit.sqf | 1 + addons/common/XEH_preInit.sqf | 1 + .../functions/fnc_loadSettingsFromProfile.sqf | 29 +---------- .../fnc_loadSettingsLocalizedText.sqf | 48 +++++++++++++++++++ 4 files changed, 51 insertions(+), 28 deletions(-) create mode 100644 addons/common/functions/fnc_loadSettingsLocalizedText.sqf diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index e470e91c95..a5fdb5bd76 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -4,6 +4,7 @@ // Load settings from profile if (hasInterface) then { call FUNC(loadSettingsFromProfile); + call FUNC(loadSettingsLocalizedText); }; // Listens for global "SettingChanged" events, to update the force status locally diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index b5382d0b5e..5cb3aedc44 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -119,6 +119,7 @@ PREP(loadPerson); PREP(loadPersonLocal); PREP(loadSettingsFromProfile); PREP(loadSettingsOnServer); +PREP(loadSettingsLocalizedText); PREP(map); PREP(moduleCheckPBOs); PREP(moduleLSDVehicles); diff --git a/addons/common/functions/fnc_loadSettingsFromProfile.sqf b/addons/common/functions/fnc_loadSettingsFromProfile.sqf index 1817e2f40e..7cb99e3400 100644 --- a/addons/common/functions/fnc_loadSettingsFromProfile.sqf +++ b/addons/common/functions/fnc_loadSettingsFromProfile.sqf @@ -13,28 +13,7 @@ */ #include "script_component.hpp" -private ["_parseConfigForDisplayNames", "_name", "_isClientSetable", "_isForced", "_profileValue"]; - -_parseConfigForDisplayNames = { - private "_optionEntry"; - _optionEntry = _this select 0; - if !(isClass _optionEntry) exitwith {false}; - _x set [3, getText (_optionEntry >> "displayName")]; - _x set [4, getText (_optionEntry >> "description")]; - - private "_values"; - _values = _x select 5; - { - private "_text"; - _text = _x; - if (((typeName _text) == "STRING") && {(count _text) > 1} && {(_text select [0,1]) == "$"}) then { - _text = localize (_text select [1, ((count _text) - 1)]); //chop off the leading $ - _values set [_forEachIndex, _text]; - }; - } forEach _values; - true; -}; - +private ["_name", "_isClientSetable", "_isForced", "_profileValue"]; // Iterate through settings { @@ -58,10 +37,4 @@ _parseConfigForDisplayNames = { }; }; - if !([configFile >> "ACE_Settings" >> _name] call _parseConfigForDisplayNames) then { - if !([configFile >> "ACE_ServerSettings" >> _name] call _parseConfigForDisplayNames) then { - [missionConfigFile >> "ACE_Settings" >> _name] call _parseConfigForDisplayNames; - }; - }; - } forEach GVAR(settings); diff --git a/addons/common/functions/fnc_loadSettingsLocalizedText.sqf b/addons/common/functions/fnc_loadSettingsLocalizedText.sqf new file mode 100644 index 0000000000..280a1e9907 --- /dev/null +++ b/addons/common/functions/fnc_loadSettingsLocalizedText.sqf @@ -0,0 +1,48 @@ +/* + * Author: Glowbal + * Parse all settings and load the localized displayName and description for all text + * + * Arguments: + * None + * + * Return Value: + * None + * + * Public: No + */ +#include "script_component.hpp" + +private ["_parseConfigForDisplayNames", "_name"]; + +_parseConfigForDisplayNames = { + private "_optionEntry"; + _optionEntry = _this select 0; + if !(isClass _optionEntry) exitwith {false}; + _x set [3, getText (_optionEntry >> "displayName")]; + _x set [4, getText (_optionEntry >> "description")]; + + private "_values"; + _values = _x select 5; + { + private "_text"; + _text = _x; + if (((typeName _text) == "STRING") && {(count _text) > 1} && {(_text select [0,1]) == "$"}) then { + _text = localize (_text select [1, ((count _text) - 1)]); //chop off the leading $ + _values set [_forEachIndex, _text]; + }; + } forEach _values; + true; +}; + + +// Iterate through settings +{ + _name = _x select 0; + + if !([configFile >> "ACE_Settings" >> _name] call _parseConfigForDisplayNames) then { + if !([configFile >> "ACE_ServerSettings" >> _name] call _parseConfigForDisplayNames) then { + [missionConfigFile >> "ACE_Settings" >> _name] call _parseConfigForDisplayNames; + }; + }; + +} forEach GVAR(settings); From 852b4df61df411717f4fbfe057f90af7a31b2398 Mon Sep 17 00:00:00 2001 From: jaynus Date: Sat, 18 Apr 2015 11:16:18 -0700 Subject: [PATCH 248/305] Settings changes. createVehicleLocal derp. --- addons/medical/ACE_Settings.hpp | 19 +++++++++---------- .../functions/fnc_handleCreateLitter.sqf | 8 +++----- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/addons/medical/ACE_Settings.hpp b/addons/medical/ACE_Settings.hpp index 51ff72f465..a4c4e8dd04 100644 --- a/addons/medical/ACE_Settings.hpp +++ b/addons/medical/ACE_Settings.hpp @@ -73,11 +73,18 @@ class ACE_Settings { }; class GVAR(allowLitterCreation) { typeName = "BOOL"; - value = true; + value = 1; + }; + class GVAR(litterSimulationDetail) { + displayName = "$STR_ACE_Medical_litterSimulationDetail"; + description = "$STR_ACE_Medical_litterSimulationDetail_Desc"; + typeName = "SCALAR"; + value = 500; + isClientSettable = 1; }; class GVAR(litterCleanUpDelay) { typeName = "SCALAR"; - value = 1800; + value = -1; }; class GVAR(medicSetting_PAK) { typeName = "SCALAR"; @@ -124,12 +131,4 @@ class ACE_Settings { values[] = {"$STR_ACE_Medical_painEffect_Flash", "$STR_ACE_Medical_painEffect_Chroma"}; isClientSettable = 1; }; - - class GVAR(litterSimulationDetail) { - displayName = "$STR_ACE_Medical_litterSimulationDetail"; - description = "$STR_ACE_Medical_litterSimulationDetail_Desc"; - typeName = "SCALAR"; - value = 500; - isClientSettable = 1; - }; }; diff --git a/addons/medical/functions/fnc_handleCreateLitter.sqf b/addons/medical/functions/fnc_handleCreateLitter.sqf index f6bd821831..ac3ce5da5c 100644 --- a/addons/medical/functions/fnc_handleCreateLitter.sqf +++ b/addons/medical/functions/fnc_handleCreateLitter.sqf @@ -2,15 +2,13 @@ PARAMS_3(_litterClass,_position,_direction); private["_litterObject"]; - - -if (isnil QGVAR(allCreatedLitter)) then { +if (isNil QGVAR(allCreatedLitter)) then { GVAR(allCreatedLitter) = []; GVAR(litterPFHRunning) = false; }; -if((count GVAR(allCreatedLitter)) <= GVAR(litterSimulationDetail) )then { - _litterObject = createVehicleLocal [_litterClass, _position, [], 0, "NONE"]; +if((count GVAR(allCreatedLitter)) <= GVAR(litterSimulationDetail) ) then { + _litterObject = _litterClass createVehicleLocal _position; _litterObject setDir _direction; } else { // @TODO: We hit max litter items, remove a few of them to work with what we have. From 43dee5643fb47b170577889a7eecbac90d851506 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 18 Apr 2015 13:20:10 -0500 Subject: [PATCH 249/305] Python3 compatibility: parentheses for print --- tools/search_privates.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/search_privates.py b/tools/search_privates.py index f3fbf60c10..6445a24dd7 100644 --- a/tools/search_privates.py +++ b/tools/search_privates.py @@ -92,7 +92,7 @@ def check_privates(filepath): private_output = private_output + '", "' + bad_priv private_output = private_output + '"];'; - print private_output + print (private_output) for bad_priv in missing: print ('\t' + bad_priv) From e54c68f7f905c490f8f23d1c07750970aba85467 Mon Sep 17 00:00:00 2001 From: jaynus Date: Sat, 18 Apr 2015 11:37:06 -0700 Subject: [PATCH 250/305] handle cleanup --- .../functions/fnc_handleCreateLitter.sqf | 42 +++++++++++++++---- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/addons/medical/functions/fnc_handleCreateLitter.sqf b/addons/medical/functions/fnc_handleCreateLitter.sqf index ac3ce5da5c..b46f4397cf 100644 --- a/addons/medical/functions/fnc_handleCreateLitter.sqf +++ b/addons/medical/functions/fnc_handleCreateLitter.sqf @@ -1,4 +1,8 @@ +//#define DEBUG_MODE_FULL #include "script_component.hpp" + +if(!hasInterface) exitWith { false }; + PARAMS_3(_litterClass,_position,_direction); private["_litterObject"]; @@ -7,15 +11,37 @@ if (isNil QGVAR(allCreatedLitter)) then { GVAR(litterPFHRunning) = false; }; -if((count GVAR(allCreatedLitter)) <= GVAR(litterSimulationDetail) ) then { - _litterObject = _litterClass createVehicleLocal _position; - _litterObject setDir _direction; -} else { - // @TODO: We hit max litter items, remove a few of them to work with what we have. - // Basically, we should just start FIFO'ing these +_litterObject = _litterClass createVehicleLocal _position; +_litterObject setDir _direction; + +if((count GVAR(allCreatedLitter)) > GVAR(litterSimulationDetail) ) then { + // gank the first litter object, and spawn ours. + private["_oldLitter"]; + _oldLitter = GVAR(allCreatedLitter) deleteAt 0; + { + deleteVehicle _x; + } forEach (_oldLitter select 1); }; -GVAR(allCreatedLitter) pushBack _litterObject; -//GVAR(allCreatedLitter) = GVAR(allCreatedLitter) - [objNull]; +GVAR(allCreatedLitter) pushBack [time, [_litterObject]]; + +if(!GVAR(litterPFHRunning) && {GVAR(litterCleanUpDelay) > 0}) then { + [{ + { + if (time - (_x select 0) >= GVAR(litterCleanUpDelay)) then { + { + deleteVehicle _x; + } foreach (_this select 1); + GVAR(allCreatedLitter) set[_foreachIndex, objNull]; + }; + }foreach GVAR(allCreatedLitter); + GVAR(allCreatedLitter) = GVAR(allCreatedLitter) - [objNull]; + + if ( (count GVAR(allCreatedLitter)) == 0) exitwith { + [(_this select 1)] call CBA_fnc_removePerFrameHandler; + GVAR(litterPFHRunning) = false; + }; + }, 30, []] call cba_fnc_addPerFrameHandler; +}; true \ No newline at end of file From ca74ce721d8eb61aa7278bb69df78a1f8a3ffe11 Mon Sep 17 00:00:00 2001 From: jaynus Date: Sat, 18 Apr 2015 11:48:44 -0700 Subject: [PATCH 251/305] Use cleanup settings, and force server TTL on the events. --- addons/medical/ACE_Settings.hpp | 2 +- addons/medical/XEH_postInit.sqf | 2 +- addons/medical/functions/fnc_createLitter.sqf | 2 ++ addons/medical/functions/fnc_handleCreateLitter.sqf | 4 ++-- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/addons/medical/ACE_Settings.hpp b/addons/medical/ACE_Settings.hpp index a4c4e8dd04..b42d5bc5a6 100644 --- a/addons/medical/ACE_Settings.hpp +++ b/addons/medical/ACE_Settings.hpp @@ -84,7 +84,7 @@ class ACE_Settings { }; class GVAR(litterCleanUpDelay) { typeName = "SCALAR"; - value = -1; + value = 0; }; class GVAR(medicSetting_PAK) { typeName = "SCALAR"; diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index b4d7d30d7a..9b384c67b7 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -268,4 +268,4 @@ if (USE_WOUND_EVENT_SYNC) then { // Networked litter -[QGVAR(createLitter), FUNC(handleCreateLitter)] call EFUNC(common,addSyncedEventHandler); +[QGVAR(createLitter), FUNC(handleCreateLitter), GVAR(litterCleanUpDelay)] call EFUNC(common,addSyncedEventHandler); diff --git a/addons/medical/functions/fnc_createLitter.sqf b/addons/medical/functions/fnc_createLitter.sqf index cc3e32eb5e..5299fbb244 100644 --- a/addons/medical/functions/fnc_createLitter.sqf +++ b/addons/medical/functions/fnc_createLitter.sqf @@ -47,6 +47,8 @@ _createLitter = { }; _direction = (random 360); + // Create the litter, and timeout the event based on the cleanup delay + // The cleanup delay for events in MP is handled by the server side [QGVAR(createLitter), [_litterClass,_position,_direction], 0] call EFUNC(common,syncedEvent); true diff --git a/addons/medical/functions/fnc_handleCreateLitter.sqf b/addons/medical/functions/fnc_handleCreateLitter.sqf index b46f4397cf..aca47250cd 100644 --- a/addons/medical/functions/fnc_handleCreateLitter.sqf +++ b/addons/medical/functions/fnc_handleCreateLitter.sqf @@ -31,10 +31,10 @@ if(!GVAR(litterPFHRunning) && {GVAR(litterCleanUpDelay) > 0}) then { if (time - (_x select 0) >= GVAR(litterCleanUpDelay)) then { { deleteVehicle _x; - } foreach (_this select 1); + } forEach (_x select 1); GVAR(allCreatedLitter) set[_foreachIndex, objNull]; }; - }foreach GVAR(allCreatedLitter); + } forEach GVAR(allCreatedLitter); GVAR(allCreatedLitter) = GVAR(allCreatedLitter) - [objNull]; if ( (count GVAR(allCreatedLitter)) == 0) exitwith { From f5705a91e637148a45160ff4a3559c10e03056de Mon Sep 17 00:00:00 2001 From: jaynus Date: Sat, 18 Apr 2015 12:04:48 -0700 Subject: [PATCH 252/305] oops. --- addons/common/XEH_postInit.sqf | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 2a20c0204d..27f234970e 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -215,7 +215,6 @@ GVAR(OldPlayerWeapon) = currentWeapon ACE_player; if(isMultiplayer && { time > 0 || isNull player } ) then { // We are jipping! Get ready and wait, and throw the event [{ - diag_log text format["JIP Detected, waiting"]; if(!(isNull player)) then { ["PlayerJip", [player] ] call FUNC(localEvent); [(_this select 1)] call cba_fnc_removePerFrameHandler; From d8b461db913a3ef596f5ce22a07374a0a766da8b Mon Sep 17 00:00:00 2001 From: ulteq Date: Sat, 18 Apr 2015 21:17:37 +0200 Subject: [PATCH 253/305] Enabled wind deflection for grenades and vehicle gunners: *Added a new module option to disable WD for vehicle gunners *Fixed enabled setting not being initialized --- addons/winddeflection/ACE_Settings.hpp | 6 ++++++ addons/winddeflection/CfgEventHandlers.hpp | 2 +- addons/winddeflection/CfgVehicles.hpp | 6 ++++++ addons/winddeflection/functions/fnc_handleFired.sqf | 7 ++++--- addons/winddeflection/functions/fnc_initModuleSettings.sqf | 2 ++ .../winddeflection/functions/fnc_updateTrajectoryPFH.sqf | 2 +- 6 files changed, 20 insertions(+), 5 deletions(-) diff --git a/addons/winddeflection/ACE_Settings.hpp b/addons/winddeflection/ACE_Settings.hpp index f84bdeace3..b10b78db0c 100644 --- a/addons/winddeflection/ACE_Settings.hpp +++ b/addons/winddeflection/ACE_Settings.hpp @@ -5,6 +5,12 @@ class ACE_Settings { typeName = "BOOL"; value = 1; }; + class GVAR(vehicleEnabled) { + displayName = "Vehicle Enabled"; + description = "Enables wind deflection for static/vehicle gunners"; + typeName = "BOOL"; + value = 1; + }; class GVAR(simulationInterval) { displayName = "Simulation Interval"; description = "Defines the interval between every calculation step"; diff --git a/addons/winddeflection/CfgEventHandlers.hpp b/addons/winddeflection/CfgEventHandlers.hpp index 4f54a73c84..d856993322 100644 --- a/addons/winddeflection/CfgEventHandlers.hpp +++ b/addons/winddeflection/CfgEventHandlers.hpp @@ -5,7 +5,7 @@ class Extended_PreInit_EventHandlers { }; class Extended_FiredBIS_EventHandlers { - class CAManBase { + class AllVehicles { class ADDON { firedBIS = QUOTE(_this call FUNC(handleFired)); }; diff --git a/addons/winddeflection/CfgVehicles.hpp b/addons/winddeflection/CfgVehicles.hpp index 09dc1b69be..76ac0c13d3 100644 --- a/addons/winddeflection/CfgVehicles.hpp +++ b/addons/winddeflection/CfgVehicles.hpp @@ -17,6 +17,12 @@ class CfgVehicles { typeName = "BOOL"; defaultValue = 1; }; + class vehicleEnabled { + displayName = "Vehicle Enabled"; + description = "Enables wind deflection for static/vehicle gunners"; + typeName = "BOOL"; + defaultValue = 1; + }; class simulationInterval { displayName = "Simulation Interval"; description = "Defines the interval between every calculation step"; diff --git a/addons/winddeflection/functions/fnc_handleFired.sqf b/addons/winddeflection/functions/fnc_handleFired.sqf index 241fbcf839..f7090cfc2a 100644 --- a/addons/winddeflection/functions/fnc_handleFired.sqf +++ b/addons/winddeflection/functions/fnc_handleFired.sqf @@ -21,15 +21,16 @@ */ #include "script_component.hpp" -if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) exitWith {false}; - private ["_unit", "_bullet"]; _unit = _this select 0; _bullet = _this select 6; +if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false] && (_bullet isKindOf "BulletBase") && (_unit isKindOf "Man")) exitWith {false}; + if (!hasInterface) exitWith {false}; if (!(GVAR(enabled))) exitWith {false}; -if (!(_bullet isKindOf "BulletBase")) exitWith {false}; +if (!(GVAR(vehicleEnabled)) && !(_unit isKindOf "Man")) exitWith {false}; +if (!((_bullet isKindOf "BulletBase") || (_bullet isKindOf "GrenadeBase"))) exitWith {false}; if (_unit distance ACE_player > GVAR(simulationRadius)) exitWith {false}; if (!([_unit] call EFUNC(common,isPlayer))) exitWith {false}; diff --git a/addons/winddeflection/functions/fnc_initModuleSettings.sqf b/addons/winddeflection/functions/fnc_initModuleSettings.sqf index 4cf75c885a..40be14a2b2 100644 --- a/addons/winddeflection/functions/fnc_initModuleSettings.sqf +++ b/addons/winddeflection/functions/fnc_initModuleSettings.sqf @@ -22,6 +22,8 @@ _activated = _this select 2; if !(_activated) exitWith {}; +[_logic, QGVAR(enabled), "enabled"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(vehicleEnabled), "vehicleEnabled"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(simulationInterval), "simulationInterval"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(simulationRadius), "simulationRadius"] call EFUNC(common,readSettingFromModule); diff --git a/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf b/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf index f5f1d3861e..4c2859f9b6 100644 --- a/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf +++ b/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf @@ -26,7 +26,7 @@ _bulletVelocity = velocity _bullet; _bulletSpeed = vectorMagnitude _bulletVelocity; - if (!alive _bullet || _bulletSpeed < 100) exitwith { + if (!alive _bullet || ((_bullet isKindOf "BulletBase") && _bulletSpeed < 100)) exitwith { [_this select 1] call cba_fnc_removePerFrameHandler; }; From c08125e0f3c1ec3c282312cb996c4b1fbbcb0a40 Mon Sep 17 00:00:00 2001 From: Grzegorz Sikora Date: Sat, 18 Apr 2015 22:00:37 +0200 Subject: [PATCH 254/305] PL translation --- addons/medical/stringtable.xml | 6 ++++-- addons/missileguidance/stringtable.xml | 2 ++ addons/optionsmenu/stringtable.xml | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 6039d9e5b2..66d84c321d 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -4,9 +4,11 @@ Litter Simulation Detail + Detale zużytych medykamentów 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. + 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. Inject Atropine @@ -91,7 +93,7 @@ Bandage Verbinden Venda - Bandaż + Bandażuj Obvázat Pansement Benda @@ -1633,4 +1635,4 @@ Aberration chromatique - + \ No newline at end of file diff --git a/addons/missileguidance/stringtable.xml b/addons/missileguidance/stringtable.xml index 4cc5278031..50c25a7a96 100644 --- a/addons/missileguidance/stringtable.xml +++ b/addons/missileguidance/stringtable.xml @@ -1,4 +1,5 @@  + @@ -15,6 +16,7 @@ Advanced missile guidance, or AMG, provides multiple enhancements to missile locking and firing. It is also a framework required for missile weapon types. + 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. Hydra-70 DAGR Missile diff --git a/addons/optionsmenu/stringtable.xml b/addons/optionsmenu/stringtable.xml index 660cfdb4e1..63717719b4 100644 --- a/addons/optionsmenu/stringtable.xml +++ b/addons/optionsmenu/stringtable.xml @@ -1,4 +1,5 @@  + @@ -99,7 +100,7 @@ Einstellung: Установки: Ajuste: - Ustawienie: + Ustaw: Paramètres Opció: Parametri: @@ -216,6 +217,7 @@ Option Menu UI Scaling Menu option: taille de l'UI + Skalowanie UI menu ustawień \ No newline at end of file From 8dac6d3f3dbdd8b3d53b2de7be9b56eab87a8280 Mon Sep 17 00:00:00 2001 From: Grzegorz Date: Sat, 18 Apr 2015 22:03:36 +0200 Subject: [PATCH 255/305] Update stringtable.xml --- addons/optionsmenu/stringtable.xml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/addons/optionsmenu/stringtable.xml b/addons/optionsmenu/stringtable.xml index 946148fa79..e65087936e 100644 --- a/addons/optionsmenu/stringtable.xml +++ b/addons/optionsmenu/stringtable.xml @@ -216,11 +216,8 @@ Option Menu UI Scaling -<<<<<<< HEAD Menu option: taille de l'UI -======= ->>>>>>> b2edeb01e48ce6e618b18f38f295cb5d6f0efb1d Skalowanie UI menu ustawień - \ No newline at end of file + From 7ac7bc3f294e8ba47d6805a7bc2c8cd70858c9d2 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 18 Apr 2015 22:06:42 +0200 Subject: [PATCH 256/305] eventhandler for creating and deleting cameras --- addons/common/XEH_postInit.sqf | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index e470e91c95..cff64e75c6 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -174,6 +174,31 @@ GVAR(OldPlayerWeapon) = currentWeapon ACE_player; }, 0, []] call cba_fnc_addPerFrameHandler; + +// PFH to raise camera created event. Only works on these cams by BI. +#define ALL_CAMERAS [ \ + missionNamespace getVariable ["BIS_DEBUG_CAM", objNull], \ + missionNamespace getVariable ["BIS_fnc_camera_cam", objNull], \ + uiNamespace getVariable ["BIS_fnc_arsenal_cam", objNull], \ + uiNamespace getVariable ["BIS_fnc_animViewer_cam", objNull], \ + missionNamespace getVariable ["BIS_fnc_establishingShot_fakeUAV", objNull] \ +] + +GVAR(OldIsCamera) = false; + +[{ + + // "activeCameraChanged" event + _isCamera = {!isNull _x} count ALL_CAMERAS > 0; + if !(_isCamera isEqualTo GVAR(OldIsCamera)) then { + // Raise ACE event locally + GVAR(OldIsCamera) = _isCamera; + ["activeCameraChanged", [ACE_player, _isCamera]] call FUNC(localEvent); + }; + +}, 1, []] call cba_fnc_addPerFrameHandler; // feel free to decrease the sleep time if you need it. + + [QGVAR(StateArrested),false,true,QUOTE(ADDON)] call FUNC(defineVariable); ["displayTextStructured", FUNC(displayTextStructured)] call FUNC(addEventhandler); From 283388eb7c2963cbef63cfb0a87749f0da50b3b8 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sat, 18 Apr 2015 22:12:37 +0200 Subject: [PATCH 257/305] Fixed a small calculation error in the wind speed output --- addons/kestrel4500/functions/fnc_generateOutputData.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/kestrel4500/functions/fnc_generateOutputData.sqf b/addons/kestrel4500/functions/fnc_generateOutputData.sqf index e7679df53f..3e392bd55b 100644 --- a/addons/kestrel4500/functions/fnc_generateOutputData.sqf +++ b/addons/kestrel4500/functions/fnc_generateOutputData.sqf @@ -88,7 +88,7 @@ switch (GVAR(Menu)) do { if (!GVAR(MinAvgMax)) then { if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { _textCenterBig = Str(round(abs(sin(GVAR(RefHeading) - _playerDir) * _windSpeed) * 10) / 10); - _textInfoLine1 = format["%1 m/s @ %2", round((cos(_playerDir - _windDir) * _windSpeed) * 10) / 10, round(_playerDir)]; + _textInfoLine1 = format["%1 m/s @ %2", round((abs(cos(_playerDir - _windDir)) * _windSpeed) * 10) / 10, round(_playerDir)]; } else { _textCenterBig = Str(round(abs(sin(GVAR(RefHeading)) * _windSpeed) * 10) / 10); _textInfoLine1 = format["%1 m/s @ %2", round(_windSpeed * 10) / 10, round(_windDir)]; @@ -120,7 +120,7 @@ switch (GVAR(Menu)) do { if (!GVAR(MinAvgMax)) then { if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { _textCenterBig = Str(round(abs(cos(GVAR(RefHeading) - _playerDir) * _windSpeed) * 10) / 10); - _textInfoLine1 = format["%1 m/s @ %2", round((cos(_playerDir - _windDir) * _windSpeed) * 10) / 10, round(_playerDir)]; + _textInfoLine1 = format["%1 m/s @ %2", round((abs(cos(_playerDir - _windDir)) * _windSpeed) * 10) / 10, round(_playerDir)]; } else { _textCenterBig = Str(round(abs(cos(GVAR(RefHeading)) * _windSpeed) * 10) / 10); _textInfoLine1 = format["%1 m/s @ %2", round(_windSpeed * 10) / 10, round(_windDir)]; From 454c6dfbfec05d29ec41a947a596fcd1557ffab8 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sat, 18 Apr 2015 22:58:23 +0200 Subject: [PATCH 258/305] Added more GUI elements to structure the ATragMX main page --- addons/atragmx/RscTitles.hpp | 35 ++++++++++++++++--- .../atragmx/functions/fnc_show_main_page.sqf | 2 +- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/addons/atragmx/RscTitles.hpp b/addons/atragmx/RscTitles.hpp index c421f5df70..6562e694d1 100644 --- a/addons/atragmx/RscTitles.hpp +++ b/addons/atragmx/RscTitles.hpp @@ -263,7 +263,31 @@ class ATragMX_Display { idc=-1; x=0.55*safezoneW+safezoneX+0.315; }; - + + class TEXT_GUN_FRAME: ATragMX_RscText { + idc=1001; + style=64; + x=0.550*safezoneW+safezoneX+0.11; + y=0.265*safezoneH+safezoneY+0.25; + w=0.0925; + h=0.205; + text=""; + }; + class TEXT_ATMOSPHERE_FRAME: TEXT_GUN_FRAME { + idc=1002; + x=0.550*safezoneW+safezoneX+0.205; + }; + class TEXT_TARGET_FRAME: TEXT_GUN_FRAME { + idc=1003; + x=0.550*safezoneW+safezoneX+0.3; + }; + class TEXT_RESULT_FRAME: TEXT_GUN_FRAME { + idc=1004; + x=0.550*safezoneW+safezoneX+0.11; + y=0.265*safezoneH+safezoneY+0.46; + w=0.2825; + h=0.15; + }; class TEXT_GUN_PROFILE: ATragMX_RscText { idc=1000; x=0.550*safezoneW+safezoneX+0.11; @@ -438,13 +462,13 @@ class ATragMX_Display { text="B"; action=QUOTE(1 call FUNC(change_target_slot)); }; - class TEXT_TARGET_C: TEXT_TARGET_B { + class TEXT_TARGET_C: TEXT_TARGET_A { idc=502; x=0.550*safezoneW+safezoneX+0.2512; text="C"; action=QUOTE(2 call FUNC(change_target_slot)); }; - class TEXT_TARGET_D: TEXT_TARGET_B { + class TEXT_TARGET_D: TEXT_TARGET_A { idc=503; x=0.550*safezoneW+safezoneX+0.2743; text="D"; @@ -511,7 +535,7 @@ class ATragMX_Display { class TEXT_ELEVATION: TEXT_GUN_PROFILE { idc=40; w=0.05; - x=0.550*safezoneW+safezoneX+0.11; + x=0.550*safezoneW+safezoneX+0.115; y=0.265*safezoneH+safezoneY+0.50; text="Elev"; }; @@ -570,7 +594,7 @@ class ATragMX_Display { class TEXT_LEAD: TEXT_GUN { idc=42; w=0.05; - x=0.550*safezoneW+safezoneX+0.11; + x=0.550*safezoneW+safezoneX+0.115; y=0.265*safezoneH+safezoneY+0.57; text="Lead"; action=QUOTE(GVAR(showWind2) = !GVAR(showWind2); call FUNC(update_result); call FUNC(update_target)); @@ -679,6 +703,7 @@ class ATragMX_Display { h=0.45; x=0.550*safezoneW+safezoneX+0.11; y=0.265*safezoneH+safezoneY+0.24; + sizeEx=0.025; colorSelectBackground[]={0.15,0.21,0.23,0.3}; colorSelectBackground2[]={0.15,0.21,0.23,0.3}; onMouseButtonDblClick=QUOTE(true call FUNC(toggle_gun_list)); diff --git a/addons/atragmx/functions/fnc_show_main_page.sqf b/addons/atragmx/functions/fnc_show_main_page.sqf index 607527a18e..ed999948b0 100644 --- a/addons/atragmx/functions/fnc_show_main_page.sqf +++ b/addons/atragmx/functions/fnc_show_main_page.sqf @@ -18,7 +18,7 @@ GVAR(showMainPage) = _this; {ctrlShow [_x, _this]} forEach [10, 100, 11, 110, 12, 120, 13, 130, 14, 140, 20, 200, 21, 210, 22, 220, 23, 230, 30, 300, 31, 310, 32, 320, 33, 330, 34, 340, 40, 400, 401, 402, 403, 41, 410, 411, 412, 42, 420, - 500, 501, 502, 503, 600, 601, 602, 603, 1000, 2000, 3000, 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008]; + 500, 501, 502, 503, 600, 601, 602, 603, 1000, 1001, 1002, 1003, 1004, 2000, 3000, 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008]; if (_this) then { if (GVAR(atmosphereModeTBH)) then { From 21c772aa8d36512ef84ecd9e9bf9ea808ca2125a Mon Sep 17 00:00:00 2001 From: ulteq Date: Sat, 18 Apr 2015 23:14:40 +0200 Subject: [PATCH 259/305] Fixed scope adjustment conflicting with vehicle weapon zeroing --- addons/scopes/functions/fnc_adjustScope.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/scopes/functions/fnc_adjustScope.sqf b/addons/scopes/functions/fnc_adjustScope.sqf index a59095d127..d13ff57ffc 100644 --- a/addons/scopes/functions/fnc_adjustScope.sqf +++ b/addons/scopes/functions/fnc_adjustScope.sqf @@ -16,7 +16,7 @@ PARAMS_3(_unit,_turretAndDirection,_majorStep); -if (vehicle _unit != _unit) exitWith {false}; +if (!(_unit isKindOf "Man")) exitWith {false}; private ["_weaponIndex", "_zeroing", "_optic", "_increment", "_maxVertical", "_maxHorizontal", "_elevation", "_windage", "_zero", "_adjustment"]; From 365d6c81c4a0f49866505fa990bef465ca486135 Mon Sep 17 00:00:00 2001 From: jaynus Date: Sat, 18 Apr 2015 14:39:51 -0700 Subject: [PATCH 260/305] Update javelin.md Small description update just so something is here. --- documentation/feature/javelin.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/documentation/feature/javelin.md b/documentation/feature/javelin.md index eecfa8844a..b253a25fc9 100644 --- a/documentation/feature/javelin.md +++ b/documentation/feature/javelin.md @@ -7,4 +7,15 @@ parent: wiki --- ## 1. Overview -Blah blah blah \ No newline at end of file +Blah blah blah + +Steps to lock titan/Javelin: + +1. You must be zoomed ALL THE WAY IN +2. You must be in thermal view +3. You must have a missile loaded +4. Hold TAB over a target, it will start beeping and the constraint boxes will appear +5. Once the beeping changes to LOCK tone, and the lock crosshairs appear, click fire without releasing tab + + +CTRL+TAB is default key to change firemode (configurable as a key) From 43e287dc0f75373b1ca50fcdac3c020ca76f5c3d Mon Sep 17 00:00:00 2001 From: jaynus Date: Sat, 18 Apr 2015 14:41:17 -0700 Subject: [PATCH 261/305] Added PlayerJIP event. --- documentation/development/ace3-events-system.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/documentation/development/ace3-events-system.md b/documentation/development/ace3-events-system.md index d7c99e558e..17bd431c12 100644 --- a/documentation/development/ace3-events-system.md +++ b/documentation/development/ace3-events-system.md @@ -52,6 +52,13 @@ PREP(onTapShoulder); [_newPlayer, _oldPlayer] local + + "PlayerJIP" + Player was a JIP player, and `player` object is now created. + common + [_player] + local + "playerInventoryChanged" From bce0d8498920e244df9371a5b0f5dd638fd95fc0 Mon Sep 17 00:00:00 2001 From: esteldunedain Date: Sat, 18 Apr 2015 18:41:36 -0300 Subject: [PATCH 262/305] Fix interact menu object ordering --- addons/interact_menu/functions/fnc_renderActionPoints.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/interact_menu/functions/fnc_renderActionPoints.sqf b/addons/interact_menu/functions/fnc_renderActionPoints.sqf index 8d4734c8f8..6ed4b41de4 100644 --- a/addons/interact_menu/functions/fnc_renderActionPoints.sqf +++ b/addons/interact_menu/functions/fnc_renderActionPoints.sqf @@ -25,7 +25,7 @@ _fnc_renderNearbyActions = { _cameraDir = ((positionCameraToWorld [0, 0, 1]) call EFUNC(common,positionToASL)) vectorDiff _cameraPos; _numInteractObjects = 0; - _nearestObjects = nearestObjects [((getPosASL ACE_player) vectorAdd (_cameraDir vectorMultiply 5)) call EFUNC(common,ASLToPosition), ["All"], 8]; + _nearestObjects = nearestObjects [ACE_player, ["All"], 13]; { _target = _x; From 41bd3cb6f506f8775db4210573f791397190a21d Mon Sep 17 00:00:00 2001 From: jaynus Date: Sat, 18 Apr 2015 14:43:22 -0700 Subject: [PATCH 263/305] documented synchronized events. --- documentation/development/ace3-events-system.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/documentation/development/ace3-events-system.md b/documentation/development/ace3-events-system.md index 17bd431c12..33412aa8fa 100644 --- a/documentation/development/ace3-events-system.md +++ b/documentation/development/ace3-events-system.md @@ -23,6 +23,11 @@ Events can be removed or cleared with the following commands. * `[eventName, eventHandlerId] call ace_common_fnc_removeEventHandler`
will remove a specific event handler of the event name, using the ID returned from `ace_common_fnc_addEventHandler`. * `[eventName] call ace_common_fnc_removeAllEventHandlers`
will remove all event handlers for that type of event. +### Synchronized Events +* `[eventName, eventCodeBlock, ttlNumberOrCodeBlock] call ace_common_fnc_addSyncedEventHandler`
adds a globally synchronized event handler which will expire events after the provided TTL, or the code returns true. +* `[eventName] call ace_common_fnc_removeSyncedEventHandler`
will remove a specific event handler of the event name, using the ID returned from `ace_common_fnc_addSyncedEventHandler`. +* * `[eventName, args, ttlNumberOrCodeBlock] call ace_common_fnc_syncedEvent`
calls a global synchronized event, which will also be run on JIP players unless it has expired; event will expire after the provided TTL, or the code returns true. + ### Pattern: ```c++ // tapper machine From b3b172e13b3f18668e969df34540728f04a47948 Mon Sep 17 00:00:00 2001 From: jaynus Date: Sat, 18 Apr 2015 14:46:01 -0700 Subject: [PATCH 264/305] drop bad docs. --- documentation/features/feature-list.md | 20 ------------------- documentation/features/titan-javelin-usage.md | 10 ---------- 2 files changed, 30 deletions(-) delete mode 100644 documentation/features/feature-list.md delete mode 100644 documentation/features/titan-javelin-usage.md diff --git a/documentation/features/feature-list.md b/documentation/features/feature-list.md deleted file mode 100644 index 9edc405ba2..0000000000 --- a/documentation/features/feature-list.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -layout: wiki -title: Features Documentation -group: features -order: 0 -parent: wiki ---- - - -**This page will get updated soon.** - - -## Table of Contents - - 1. [][[Advanced Missile Guidanced Framework|WikiLink]] - 2. [yy](#yy) - 3. [zz](#zz) - - -## What ACE3 has to offer diff --git a/documentation/features/titan-javelin-usage.md b/documentation/features/titan-javelin-usage.md deleted file mode 100644 index 8115e6812b..0000000000 --- a/documentation/features/titan-javelin-usage.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -layout: wiki -title: ACE Titan and Javelin -group: features -order: 0 -parent: wiki ---- - - -**This page will get updated soon.** From 0bfd0840246955f958c15c04613022b9fa661fcc Mon Sep 17 00:00:00 2001 From: jaynus Date: Sat, 18 Apr 2015 14:54:32 -0700 Subject: [PATCH 265/305] extensions recompiled --- ace_advanced_ballistics.dll | Bin 613888 -> 613888 bytes ace_breakLine.dll | Bin 208384 -> 712192 bytes ace_fcs.dll | Bin 779264 -> 787968 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/ace_advanced_ballistics.dll b/ace_advanced_ballistics.dll index 568e7c16db7de74c45b5a9a0b78735a3db594a49..3349bb5b38df8a69b01736e1346a576c8ef4fcb4 100644 GIT binary patch delta 121 zcmZqJquQ`Xbpa!D(Ium1X2y1AMi6EKVrC#_0b*7lX4}rp$ew5^4^$M&00c}xoC?Hq zUUM+axyb<%VgSmuH(Rl9Z?@u)oiBL4HC-*D`LSPr{wL=C)ef7Owr{-2u~-pg&Gzu$ H94nImPeCLu delta 121 zcmZqJquQ`Xbpa!@&pNecX2y1AMi6EKVrC#_0b*7lX4}rp$ew5^zi6#mC<72M0dXo2 z&w0(kFy|%*NQeO_*WPT!zP;IsLw3I4t(%{pEK%O%yVLW~b=|rC)y&&B-sD)U$P84q KJ^VMv$|L|-t0hSQ diff --git a/ace_breakLine.dll b/ace_breakLine.dll index edd00c78eb0218bb0d24ec14735be5de37c859d9..428df80092994ec765c2ee73530a7c9e4c7a216f 100644 GIT binary patch literal 712192 zcmeFa2UJu`vo<^fBMb;KDk^4F%!(*x41f~MAP7dxis&&A%o#a4ZZYSabB>rnlrdsf zR8&;dK~OPacK+wtGb2$w=e_U!*SGG%wN6cUS9NuDb$4}jb#G3a&a)+k5{X2H|1=tj zBm%$u=P1J8gH)jNl|GVBvft!VnFwj?OJ%(M2LxFU4II)xu;*Xay?YKGJS5nzF^7NpUrCR=TIHe4K;kGBE3qCch`+iY zKT}B`VE0FvN-7bZYAWeOrDyw>S7OydBAHmqL{dK+4&xJNBC$gG#Oo%R$0*WNvLF0^ z_0KlA@5o>vcfCg+DHr>irG0COq=#)_pPs=zC6Yev*cJ5M1HWHDo8g}$riZPTOk(K` zL=RJm*r}HI&G64rB8jvepe1YvHAx_�)ud;($%biLURUAt0RD9>fv|$^J~wM(0fI|HXe7 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

sS}J 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 literal 208384 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

Z;yo~t)NG>!wW-PpWm+?pIg&LLwL1o^w5oA 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 diff --git a/ace_fcs.dll b/ace_fcs.dll index 3385e53463fc10130194216fee9e317fea4aea3d..9cef4549c76b8eb75bd9ad1e417e62ca58cb4bcc 100644 GIT binary patch delta 256546 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

kc}Td{KCvZdU27+HD&N~razO&FB+ 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 Rw7z_cp8EOVefsL>e*ttb$KU_} delta 248597 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 z�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 From ae80da74928c8e13e8547aa0444e9bbc62bab79d Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 19 Apr 2015 00:05:54 +0200 Subject: [PATCH 266/305] fix cameras breaking pip scope camera r2t texture, reenable PIP scopes in arsenal --- addons/optics/CfgWeapons.hpp | 10 +++++----- addons/optics/XEH_postInit.sqf | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/addons/optics/CfgWeapons.hpp b/addons/optics/CfgWeapons.hpp index 6d61ff98a2..5aa06f41a0 100644 --- a/addons/optics/CfgWeapons.hpp +++ b/addons/optics/CfgWeapons.hpp @@ -98,7 +98,7 @@ class CfgWeapons { class ACE_optic_Hamr_PIP: ACE_optic_Hamr_2D { author = "$STR_ACE_Common_ACETeam"; _generalMacro = "ACE_optic_Hamr_PIP"; - scopeArsenal = 1; + //scopeArsenal = 1; displayName = "$STR_ACE_optic_hamr_pip"; class ItemInfo: ItemInfo { @@ -147,7 +147,7 @@ class CfgWeapons { class ACE_optic_Arco_PIP: ACE_optic_Arco_2D { author = "$STR_ACE_Common_ACETeam"; _generalMacro = "ACE_optic_Arco_PIP"; - scopeArsenal = 1; + //scopeArsenal = 1; displayName = "$STR_ACE_optic_arco_pip"; class ItemInfo: ItemInfo { @@ -197,7 +197,7 @@ class CfgWeapons { author = "$STR_ACE_Common_ACETeam"; _generalMacro = "ACE_optic_MRCO_PIP"; scope = 1; - scopeArsenal = 1; + //scopeArsenal = 1; displayName = "$STR_ACE_optic_valdada_pip"; class ItemInfo: ItemInfo { @@ -239,7 +239,7 @@ class CfgWeapons { class ACE_optic_SOS_PIP: ACE_optic_SOS_2D { author = "$STR_ACE_Common_ACETeam"; _generalMacro = "ACE_optic_SOS_PIP"; - scopeArsenal = 1; + //scopeArsenal = 1; displayName = "$STR_ACE_optic_sos_pip"; class ItemInfo: ItemInfo { @@ -290,7 +290,7 @@ class CfgWeapons { class ACE_optic_LRPS_PIP: ACE_optic_LRPS_2D { author = "$STR_ACE_Common_ACETeam"; _generalMacro = "ACE_optic_LRPS_PIP"; - scopeArsenal = 1; + //scopeArsenal = 1; displayName = "$STR_ACE_optic_lrps_pip"; class ItemInfo: ItemInfo { diff --git a/addons/optics/XEH_postInit.sqf b/addons/optics/XEH_postInit.sqf index cb3918cbc3..7f68aece74 100644 --- a/addons/optics/XEH_postInit.sqf +++ b/addons/optics/XEH_postInit.sqf @@ -22,3 +22,19 @@ if (!hasInterface) exitWith {}; uiNamespace setVariable [QGVAR(RscWeaponInfo2D), _this select 0]; }; }] call EFUNC(common,addEventHandler); + +// camera has to be re-created every time another camera is created. Otherwise r2t is either black or transparent. @todo Add popular custom cameras to the event in ACE_common. +["activeCameraChanged", { + if !(_this select 1) then { + deleteVehicle GVAR(camera); + + // PiP technique by BadBenson + GVAR(camera) = "camera" camCreate positioncameratoworld [0,0,0]; + GVAR(camera) camSetFov 0.7; + GVAR(camera) camSetTarget ACE_player; + GVAR(camera) camCommit 1; + + "ace_optics_rendertarget0" setPiPEffect [2, 1.0, 1.0, 1.0, 0.0, [0.0, 1.0, 0.0, 0.25], [1.0, 0.0, 1.0, 1.0], [0.199, 0.587, 0.114, 0.0]]; + GVAR(camera) cameraEffect ["INTERNAL", "BACK", "ace_optics_rendertarget0"]; + }; +}] call EFUNC(common,addEventHandler); From 560646e1e197ff1ccfb8e9b794d334cc3e8d23fa Mon Sep 17 00:00:00 2001 From: Tachii Date: Sun, 19 Apr 2015 01:18:53 +0300 Subject: [PATCH 267/305] Update stringtable.xml --- addons/winddeflection/stringtable.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/winddeflection/stringtable.xml b/addons/winddeflection/stringtable.xml index 8e2e00d96e..2acef3581a 100644 --- a/addons/winddeflection/stringtable.xml +++ b/addons/winddeflection/stringtable.xml @@ -6,7 +6,7 @@ Wind Information Informacje o wietrze Información del viento - Ветер + Информация о ветре Informace o větru Vent Windinformationen @@ -39,7 +39,7 @@ Weather Information Informacje o pogodzie Información Meteorológica - Погода + Информация о погоде Informace o počasí Météo Wetterinformationen From a9d38f5970f423795f90cc5e6f34d49d73a2b3e8 Mon Sep 17 00:00:00 2001 From: Tachii Date: Sun, 19 Apr 2015 01:19:32 +0300 Subject: [PATCH 268/305] Update stringtable.xml --- addons/weather/stringtable.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/weather/stringtable.xml b/addons/weather/stringtable.xml index 7d1e1a1a2c..2ee6618756 100644 --- a/addons/weather/stringtable.xml +++ b/addons/weather/stringtable.xml @@ -4,10 +4,10 @@ Show Wind Info Pokaż inf. o wietrze - Показать информацию о погоде + Показать информацию о ветре Afficher information sur le vent Mostrar información del viento Mostra informazioni sul vento - \ No newline at end of file + From 8f9796f4886702bc8ffbc74ca2a03ca9fe7ab984 Mon Sep 17 00:00:00 2001 From: Tachii Date: Sun, 19 Apr 2015 01:23:37 +0300 Subject: [PATCH 269/305] Update stringtable.xml --- addons/weaponselect/stringtable.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/weaponselect/stringtable.xml b/addons/weaponselect/stringtable.xml index 08bb510f6c..823ce97745 100644 --- a/addons/weaponselect/stringtable.xml +++ b/addons/weaponselect/stringtable.xml @@ -41,7 +41,7 @@ Seleccionar fusil Wybierz karabin Zvolit hlavní zbraň - Выбрать автомат + Выбрать винтовку Sélectionner Fusil Puska Kiválasztása Selecionar Rifle @@ -246,7 +246,7 @@ Už nejsou žádné ostatní granáty Não há outras granadas restantes Nessun'altra granata rimanente. - Летальные гранаты закончились + Нелетальные гранаты закончились No grenade selected @@ -272,4 +272,4 @@ Lancia fumogeno - \ No newline at end of file + From dc2c3e246e9662b10de6845aec3e68d21df7b8a9 Mon Sep 17 00:00:00 2001 From: Tachii Date: Sun, 19 Apr 2015 01:25:30 +0300 Subject: [PATCH 270/305] Update stringtable.xml --- addons/dragging/stringtable.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/dragging/stringtable.xml b/addons/dragging/stringtable.xml index 1c704796f8..b02979e279 100644 --- a/addons/dragging/stringtable.xml +++ b/addons/dragging/stringtable.xml @@ -26,14 +26,14 @@ Elengedés - Item to heavy + Item too heavy Gegenstand ist zu schwer Articulo demasiado pesado Przedmiot zbyt ciężki Objet trop lourd Não é possível carregar o item devido a seu peso Non è possibile trascinare l'oggetto a causa del suo peso - Слишком тяжело + Предмет слишком тяжёлый Moc težké Az objektum túl nehéz From e62a476a9098f5c134e6d845cfa66e42567453bb Mon Sep 17 00:00:00 2001 From: Tachii Date: Sun, 19 Apr 2015 01:37:08 +0300 Subject: [PATCH 271/305] Update stringtable.xml --- addons/explosives/stringtable.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/addons/explosives/stringtable.xml b/addons/explosives/stringtable.xml index 9d4937ed65..6898274307 100644 --- a/addons/explosives/stringtable.xml +++ b/addons/explosives/stringtable.xml @@ -203,7 +203,7 @@ Consente la disattivazione degli ordigni esplosivi Robbanóanyagok hatástalanítását teszi lehetővé Permite o desarme de explosivos - Позволяет обезвреживать ВУ + Позволяет обезвреживать взрывчатку Add to Speed Dial @@ -215,7 +215,7 @@ Aggiungi alla selezione rapida Hozzáadás a gyorstárcsázóhoz Adicionar à ligação rápida - Добавить в ускоренный набор + Добавить в быстрый вызов Clear @@ -299,7 +299,7 @@ Menù di collocamento Elhelyezési menü Menu de posicionamento - Меню детонации + Меню установки Defuse @@ -395,7 +395,7 @@ Piastra a Pressione Nyomólap Placa de pressão - Давление + Нажимная плита Tripwire @@ -443,7 +443,7 @@ Sensore IR (Attacco laterale) Infravörös szenzor (Side Attack) Sensor infravermelho (ataque lateral) - ИК (детонация вбок) + ИК сенсор (детонация вбок) Magnetic Influence Sensor (Bottom Attack) @@ -455,7 +455,7 @@ Sensore Magnetico di Prossimità (Attacco inferiore) Mágneses mező érzékelő (Bottom Attack) Influência magnética (ataque inferior) - Магнитный (детонация вверх) + Магнитный сенсор (детонация вверх) No explosives on trigger. @@ -467,7 +467,7 @@ Nincs robbanóanyag a gyújtóeszközhöz kötve. Brak ładunków na zapalnik. Nenhum explosivo no gatilho. - Нет доступных ВУ для взрывателя. + Взрыватель не подсоединён к взрывчатке Dead Man's Switch @@ -477,7 +477,7 @@ Czuwak Detonador de hombre muerto Dead Man's Switch - Ловушка мертвеца + Кнопка мертвеца Used to remotely trigger explosives when released. @@ -502,4 +502,4 @@ Raccogli - \ No newline at end of file + From 2fe7122b3e4d58c4de479b83e65b214b810fe8d2 Mon Sep 17 00:00:00 2001 From: jaynus Date: Sat, 18 Apr 2015 15:44:07 -0700 Subject: [PATCH 272/305] Disable handoff until completed. --- .../functions/fnc_handleHandoff.sqf | 2 +- .../missileguidance/functions/fnc_onFired.sqf | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/addons/missileguidance/functions/fnc_handleHandoff.sqf b/addons/missileguidance/functions/fnc_handleHandoff.sqf index 2f1dfac8e7..07a0e116b3 100644 --- a/addons/missileguidance/functions/fnc_handleHandoff.sqf +++ b/addons/missileguidance/functions/fnc_handleHandoff.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" PARAMS_2(_target,_args); -if(!local _target) exitWith {}; +if(isNil "_target" || { objNull _target} || {!local _target} ) exitWith { false }; [FUNC(guidancePFH), 0, _args] call cba_fnc_addPerFrameHandler; \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_onFired.sqf b/addons/missileguidance/functions/fnc_onFired.sqf index 071b2bbf99..7ada1d4442 100644 --- a/addons/missileguidance/functions/fnc_onFired.sqf +++ b/addons/missileguidance/functions/fnc_onFired.sqf @@ -86,13 +86,20 @@ _args = [_this, // Laser code needs to give us a shooter for LOBL, or the seeker unit needs to be able to shift locality // Based on its homing laser // Lasers need to be handled in a special LOAL/LOBL case -_guidingUnit = ACE_player; -if(local _guidingUnit) then { +//if(isPlayer _shooter) then { +// _guidingUnit = ACE_player; +// +// if(local _guidingUnit) then { +// [FUNC(guidancePFH), 0, _args ] call cba_fnc_addPerFrameHandler; +// } else { +// [QGVAR(handoff), [_guidingUnit, _args] ] call FUNC(doHandoff); +// }; +//} else { [FUNC(guidancePFH), 0, _args ] call cba_fnc_addPerFrameHandler; -} else { - [QGVAR(handoff), [_guidingUnit, _args] ] call FUNC(doHandoff); -}; +//}; + + /* Clears locking settings (vehicle _shooter) setVariable [QGVAR(target), nil]; (vehicle _shooter) setVariable [QGVAR(seekerType), nil]; From 54c5070569fe3d49b5f87b66be04f7badcbc6797 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 18 Apr 2015 22:23:19 -0500 Subject: [PATCH 273/305] isNull --- addons/missileguidance/functions/fnc_handleHandoff.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/missileguidance/functions/fnc_handleHandoff.sqf b/addons/missileguidance/functions/fnc_handleHandoff.sqf index 07a0e116b3..017a9c0160 100644 --- a/addons/missileguidance/functions/fnc_handleHandoff.sqf +++ b/addons/missileguidance/functions/fnc_handleHandoff.sqf @@ -1,6 +1,6 @@ #include "script_component.hpp" PARAMS_2(_target,_args); -if(isNil "_target" || { objNull _target} || {!local _target} ) exitWith { false }; +if(isNil "_target" || {isNull _target} || {!local _target} ) exitWith { false }; [FUNC(guidancePFH), 0, _args] call cba_fnc_addPerFrameHandler; \ No newline at end of file From 9cb27c8fb2f9aab2ca57b0b9e4757d9d3c68a488 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 19 Apr 2015 07:08:57 +0200 Subject: [PATCH 274/305] fix: error when getting killed with FF-messages module, fix #745 --- addons/respawn/functions/fnc_handleKilled.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/respawn/functions/fnc_handleKilled.sqf b/addons/respawn/functions/fnc_handleKilled.sqf index c3ab0aebf3..199495d75d 100644 --- a/addons/respawn/functions/fnc_handleKilled.sqf +++ b/addons/respawn/functions/fnc_handleKilled.sqf @@ -29,5 +29,5 @@ if (GVAR(SavePreDeathGear)) then { }; if (missionNamespace getVariable [QGVAR(showFriendlyFireMessage), false]) then { - [_this, FUNC(showFriendlyFireMessage), 2] call EFUNC(common,execRemoteFnc); + [_this, QUOTE(DFUNC(showFriendlyFireMessage)), 2] call EFUNC(common,execRemoteFnc); }; From 45fd90c6e05fc9a9d54a28683c0ace8b6c2c1e39 Mon Sep 17 00:00:00 2001 From: ruPaladin Date: Sun, 19 Apr 2015 10:49:06 +0300 Subject: [PATCH 275/305] Rus translation (medical) --- addons/medical/stringtable.xml | 52 +++++++++++++++++----------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 3259fd5af7..9645aa2289 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -378,7 +378,7 @@ Give Blood IV (1000ml) Bluttransfusion IV (1000ml) Dar Sangre IV (1000ml) - Дать кровь для в/в вливания (1000 мл) + Перелить пакет крови (1000 мл) Podaj krew IV (1000ml) Administrer du sang en IV (1000ml) Podat krev. transfúzi (1000ml) @@ -389,7 +389,7 @@ Give Blood IV (500ml) Bluttransfusion IV (500ml) Dar Sangre IV (500ml) - Дать кровь для в/в вливания (500 мл) + Перелить пакет крови (500 мл) Podaj krew IV (500ml) Administrer du sang en IV (500ml) Podat krev. transfúzi (500ml) @@ -400,7 +400,7 @@ Give Blood IV (250ml) Bluttransfusion IV (250ml) Dar Sangre IV (250ml) - Дать кровь для в/в вливания (250 мл) + Перелить пакет крови (250 мл) Podaj krew IV (250ml) Administrer du sang en IV (250ml) Podat krev. transfúzi (250ml) @@ -411,7 +411,7 @@ Give Plasma IV (1000ml) Plasmatransfusion IV (1000ml) Dar Plasma IV (1000ml) - Дать плазму для в/в вливания (1000 мл) + Перелить пакет плазмы (1000 мл) Podaj osocze IV (1000ml) Administrer du plasma en IV (1000ml) Podat plazmu (1000ml) @@ -422,7 +422,7 @@ Give Plasma IV (500ml) Plasmatransfusion IV (500ml) Dar Plasma IV (500ml) - Дать плазму для в/в вливания (500 мл) + Перелить пакет плазмы (500 мл) Podaj osocze IV (500ml) Administrer du plasma en IV (500ml) Podat plazmu (500ml) @@ -433,7 +433,7 @@ Give Plasma IV (250ml) Plasmatransfusion IV (250ml) Dar Plasma IV (250ml) - Дать плазму для в/в вливания (250 мл) + Перелить пакет плазмы (250 мл) Podaj osocze IV (250ml) Administrer du plasma en IV (250ml) Podat plazmu (250ml) @@ -444,7 +444,7 @@ Give Saline IV (1000ml) Kochsaltzlösung IV (1000ml) Dar Salino IV (1000ml) - Дать физраствор для в/в вливания (1000 мл) + Перелить пакет физраствора (1000 мл) Podaj sól fizjologiczną IV (1000ml) Administrer de la solution saline en IV (1000ml) Podaz fyz. roztok (1000ml) @@ -455,7 +455,7 @@ Give Saline IV (500ml) Kochsaltzlösung IV (500ml) Dar Salino IV (500ml) - Дать физраствор для в/в вливания (500 мл) + Перелить пакет физраствора (500 мл) Podaj sól fizjologiczną IV (500ml) Administrer de la solution saline en IV (500ml) Podaz fyz. roztok (500ml) @@ -466,7 +466,7 @@ Give Saline IV (250ml) Kochsaltzlösung IV (250ml) Dar Salino IV (250ml) - Дать физраствор для в/в вливания (250 мл) + Перелить пакет физраствора (250 мл) Podaj sól fizjologiczną IV (250ml) Administrer de la solution saline en IV (250ml) Podaz fyz. roztok (250ml) @@ -477,7 +477,7 @@ Minor Gering Menor - Незначительные травмы + Легкие ранения Normalny Léger Minimální @@ -487,7 +487,7 @@ Delayed Retrasado - Груз 300 + Средние ранения Opóźniony Différé Verzögert @@ -498,7 +498,7 @@ Immediate Inmediato - Помощь отложена + Тяжелые ранения Natychmiastowy Urgence Immédiate Sofort @@ -509,7 +509,7 @@ Deceased Fallecido - Груз 200 + Труп Nie żyje Décédé Verstorben @@ -520,7 +520,7 @@ None Ninguno - Нет + Отсутствует Brak Aucun Keine @@ -1529,7 +1529,7 @@ Heavily wounded Schwer verwundet: Ciężko ranny - Сильно ранен + Сильные ранения Gravemente ferito Gravemente herido Lourdement blessé @@ -1538,7 +1538,7 @@ Lightly wounded Leicht verwundet: Lekko ranny - Легко ранен + Легкие ранения Leggermente ferito Levemente herido Légèrement blessé @@ -1547,7 +1547,7 @@ Very lightly wounded Sehr leicht verwundet: B. lekko ranny - Очень легко ранен + Царапины Ferito lievemente Muy levemente herido Très légèrement blessé @@ -1556,7 +1556,7 @@ Head Kopf Głowa - Голова + Головы Testa Cabeza Tête @@ -1565,7 +1565,7 @@ Torso Torso Tors - Торс + Торса Torso Torso Torse @@ -1574,7 +1574,7 @@ Left Arm Linker Arm Lewe ramię - Левая рука + Левой руки Braccio sinistro Brazo izquierdo Bras gouche @@ -1583,7 +1583,7 @@ Right Arm Rechter Arm Prawe ramię - Правая рука + Правой руки Braccio destro Brazo derecho Bras droit @@ -1592,7 +1592,7 @@ Left Leg Linkes Bein Lewa noga - Левая нога + Левой ноги Gamba sinistra Pierna izquierda Jambe gauche @@ -1601,7 +1601,7 @@ Right Leg Rechtes Bein Prawa noga - Правая нога + Правой ноги Gamba destra Pierna derecha Jambe droite @@ -1610,7 +1610,7 @@ Pain Effect Type Schmerzeffekt-Typ Rodzaj efektu bólu - Вид боли + Эффект боли Pain Effect Type Tipo de efecto de dolor Type d'effet de douleur @@ -1619,7 +1619,7 @@ Colour Flashing Farbblinken Pulsujące kolory - Разноцветные вспышки + Пульсирующий свет Colore lampeggiante Parpadeo de color Flash de couleur @@ -1634,4 +1634,4 @@ Aberration chromatique - \ No newline at end of file + From d8b96066e60b660d61fe7df3881d08dd442d6542 Mon Sep 17 00:00:00 2001 From: ruPaladin Date: Sun, 19 Apr 2015 11:01:41 +0300 Subject: [PATCH 276/305] Rus translation (nametags) --- addons/nametags/stringtable.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index 77e10b6ee9..e224ce61e4 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -22,7 +22,7 @@ Zobrazit jména hráčů Mostrar nomes de jogadores Mostra i nomi dei giocatori - Показать имена игроков + Показывать имена игроков (включить имена) Show player name only on cursor (requires player names) @@ -34,7 +34,7 @@ Mostra i nomi solo se puntati (richiede mostra nomi abilitato) Mostrar nome de jogador somente no cursor (requer nome de jogadores) Játékosok nevének mutatása csak a kurzoron (a nevek mutatása szükséges) - Показать имена игроков только под курсором (требует имен игроков) + Показать имена игроков только под курсором (при включенных именах) Show player name only on keypress (requires player names) @@ -44,7 +44,7 @@ Zobrazit jména hráčů jen na klávesu (vyžaduje jména hráčů) Pokaż imiona graczy tylko po przytrzymaniu klawisza (wymagana opcja Pokaż imiona graczy) Játékosnevek mutatása csak gombnyomásra (a nevek mutatása szükséges) - Показать имена игроков только по нажатию клавиши (требует имен игроков) + Показать имена игроков только по нажатию клавиши (при включенных именах) Mostra i nomi solo se si preme il tasto (richiede mostra nomi abilitato) @@ -57,7 +57,7 @@ Mostra i gradi (richiede mostra nomi abilitato) Mostrar patente de jogadores (requer nome de jogadores) Játékosok rendfokozatának mutatása (a nevek mutatása szükséges) - Показывать звания игроков (требует имен игроков) + Показывать звания игроков (при вкл. именах) Show vehicle crew info @@ -74,7 +74,7 @@ Show name tags for AI units Zeige Namen für KI Einheiten Mostrar etiquetas de nombre para unidades IA - Показывать именые метки ИИ + Показывать имена ботов Zobrazit jména AI Wyświetl imiona jednostek AI Afficher les noms des IA @@ -85,7 +85,7 @@ Show SoundWaves (requires player names) Zeigen Schallwellen (benötigt Spielernamen) Mostrar onda sonora (requiere Mostrar nombres de jugadores) - Показывать звуковые волны (требует имен игроков) + Индикатор разговора (при вкл. именах) Zobrazit SoundWaves (vyžaduje jména hráčů) Pokaż fale dźwiękowe (wymagana opcja Pokaż imiona graczy) Afficher "qui parle" (si noms affichés) From 51590d39adcdbaff81ff392832331b2be54e7670 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 19 Apr 2015 10:47:43 +0200 Subject: [PATCH 277/305] Cleaned up the ATragMX postInit routine --- addons/atragmx/functions/fnc_create_dialog.sqf | 2 ++ addons/atragmx/functions/fnc_restore_user_data.sqf | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/addons/atragmx/functions/fnc_create_dialog.sqf b/addons/atragmx/functions/fnc_create_dialog.sqf index 5be6e4ecb4..1646b0ec25 100644 --- a/addons/atragmx/functions/fnc_create_dialog.sqf +++ b/addons/atragmx/functions/fnc_create_dialog.sqf @@ -40,6 +40,8 @@ GVAR(showTargetRangeAssist) call FUNC(show_target_range_assist); GVAR(showTargetSpeedAssist) call FUNC(show_target_speed_assist); GVAR(showTargetSpeedAssistTimer) call FUNC(show_target_speed_assist_timer); +[GVAR(currentGun), false] call FUNC(change_gun); + { lbAdd [6000, _x select 0]; } forEach GVAR(gunList); diff --git a/addons/atragmx/functions/fnc_restore_user_data.sqf b/addons/atragmx/functions/fnc_restore_user_data.sqf index 6fddc4bed5..e21d66acd8 100644 --- a/addons/atragmx/functions/fnc_restore_user_data.sqf +++ b/addons/atragmx/functions/fnc_restore_user_data.sqf @@ -16,7 +16,7 @@ #include "script_component.hpp" GVAR(currentUnit) = 0 max (profileNamespace getVariable ["ACE_ATragMX_currentUnit", 2]) min 2; -[profileNamespace getVariable ["ACE_ATragMX_currentGun", 0], false] call FUNC(change_gun); +GVAR(currentGun) = 0 max (profileNamespace getVariable ["ACE_ATragMX_currentGun", 0]); GVAR(currentTarget) = 0 max (profileNamespace getVariable ["ACE_ATragMX_currentTarget", 0]) min 3; GVAR(currentScopeUnit) = 0 max (profileNamespace getVariable ["ACE_ATragMX_currentScopeUnit", 0]) min 3; From 336a192302a387aaab3c44a511143f0e79a32761 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 19 Apr 2015 10:57:55 +0200 Subject: [PATCH 278/305] The range card setup data is now also restored on mission start --- addons/atragmx/functions/fnc_clear_user_data.sqf | 9 +++++++-- addons/atragmx/functions/fnc_restore_user_data.sqf | 5 +++++ addons/atragmx/functions/fnc_store_user_data.sqf | 9 +++++++-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/addons/atragmx/functions/fnc_clear_user_data.sqf b/addons/atragmx/functions/fnc_clear_user_data.sqf index 10f31741f2..f805ce66b1 100644 --- a/addons/atragmx/functions/fnc_clear_user_data.sqf +++ b/addons/atragmx/functions/fnc_clear_user_data.sqf @@ -29,11 +29,16 @@ profileNamespace setVariable ["ACE_ATragMX_barometricPressure", nil]; profileNamespace setVariable ["ACE_ATragMX_relativeHumidity", nil]; profileNamespace setVariable ["ACE_ATragMX_showWind2", nil]; -profileNamespace setVariable ["latitude", nil]; -profileNamespace setVariable ["directionOfFire", nil]; +profileNamespace setVariable ["ACE_ATragMX_latitude", nil]; +profileNamespace setVariable ["ACE_ATragMX_directionOfFire", nil]; profileNamespace setVariable ["ACE_ATragMX_windSpeed1", nil]; profileNamespace setVariable ["ACE_ATragMX_windSpeed2", nil]; profileNamespace setVariable ["ACE_ATragMX_windDirection", nil]; profileNamespace setVariable ["ACE_ATragMX_inclinationAngle", nil]; profileNamespace setVariable ["ACE_ATragMX_targetSpeed", nil]; profileNamespace setVariable ["ACE_ATragMX_targetRange", nil]; + +profileNamespace setVariable ["ACE_ATragMX_rangeCardStartRange", nil]; +profileNamespace setVariable ["ACE_ATragMX_rangeCardEndRange", nil]; +profileNamespace setVariable ["ACE_ATragMX_rangeCardIncrement", nil]; +profileNamespace setVariable ["ACE_ATragMX_rangeCardCurrentColumn", nil]; \ No newline at end of file diff --git a/addons/atragmx/functions/fnc_restore_user_data.sqf b/addons/atragmx/functions/fnc_restore_user_data.sqf index e21d66acd8..54d1f3cd2b 100644 --- a/addons/atragmx/functions/fnc_restore_user_data.sqf +++ b/addons/atragmx/functions/fnc_restore_user_data.sqf @@ -35,3 +35,8 @@ GVAR(windDirection) = profileNamespace getVariable ["ACE_ATragMX_windDirection", GVAR(inclinationAngle) = profileNamespace getVariable ["ACE_ATragMX_inclinationAngle", [0, 0, 0, 0]]; GVAR(targetSpeed) = profileNamespace getVariable ["ACE_ATragMX_targetSpeed", [0, 0, 0, 0]]; GVAR(targetRange) = profileNamespace getVariable ["ACE_ATragMX_targetRange", [0, 0, 0, 0]]; + +GVAR(rangeCardStartRange) = 0 max (profileNamespace getVariable ["ACE_ATragMX_rangeCardStartRange", 200]) min 3000; +GVAR(rangeCardEndRange) = 0 max (profileNamespace getVariable ["ACE_ATragMX_rangeCardEndRange", 2000]) min 3000; +GVAR(rangeCardIncrement) = 1 max (profileNamespace getVariable ["ACE_ATragMX_rangeCardIncrement", 50]) min 3000; +GVAR(rangeCardCurrentColumn) = 0 max (profileNamespace getVariable ["ACE_ATragMX_rangeCardCurrentColumn", 3]) min 3; diff --git a/addons/atragmx/functions/fnc_store_user_data.sqf b/addons/atragmx/functions/fnc_store_user_data.sqf index 66207444d2..2045276426 100644 --- a/addons/atragmx/functions/fnc_store_user_data.sqf +++ b/addons/atragmx/functions/fnc_store_user_data.sqf @@ -29,11 +29,16 @@ profileNamespace setVariable ["ACE_ATragMX_barometricPressure", GVAR(barometricP profileNamespace setVariable ["ACE_ATragMX_relativeHumidity", GVAR(relativeHumidity)]; profileNamespace setVariable ["ACE_ATragMX_showWind2", GVAR(showWind2)]; -profileNamespace setVariable ["latitude", GVAR(latitude)]; -profileNamespace setVariable ["directionOfFire", GVAR(directionOfFire)]; +profileNamespace setVariable ["ACE_ATragMX_latitude", GVAR(latitude)]; +profileNamespace setVariable ["ACE_ATragMX_directionOfFire", GVAR(directionOfFire)]; profileNamespace setVariable ["ACE_ATragMX_windSpeed1", GVAR(windSpeed1)]; profileNamespace setVariable ["ACE_ATragMX_windSpeed2", GVAR(windSpeed2)]; profileNamespace setVariable ["ACE_ATragMX_windDirection", GVAR(windDirection)]; profileNamespace setVariable ["ACE_ATragMX_inclinationAngle", GVAR(inclinationAngle)]; profileNamespace setVariable ["ACE_ATragMX_targetSpeed", GVAR(targetSpeed)]; profileNamespace setVariable ["ACE_ATragMX_targetRange", GVAR(targetRange)]; + +profileNamespace setVariable ["ACE_ATragMX_rangeCardStartRange", GVAR(rangeCardStartRange)]; +profileNamespace setVariable ["ACE_ATragMX_rangeCardEndRange", GVAR(rangeCardEndRange)]; +profileNamespace setVariable ["ACE_ATragMX_rangeCardIncrement", GVAR(rangeCardIncrement)]; +profileNamespace setVariable ["ACE_ATragMX_rangeCardCurrentColumn", GVAR(rangeCardCurrentColumn)]; \ No newline at end of file From 8f20303a084bb76bde87b6e1f3c0298f292fba65 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 19 Apr 2015 11:02:06 +0200 Subject: [PATCH 279/305] Fixed a bug in the atmosphere unit conversion --- addons/atragmx/functions/fnc_parse_input.sqf | 2 +- addons/atragmx/functions/fnc_update_atmo_env_data.sqf | 6 +++--- addons/atragmx/functions/fnc_update_atmosphere.sqf | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/atragmx/functions/fnc_parse_input.sqf b/addons/atragmx/functions/fnc_parse_input.sqf index aa77fc8111..cda1bb3419 100644 --- a/addons/atragmx/functions/fnc_parse_input.sqf +++ b/addons/atragmx/functions/fnc_parse_input.sqf @@ -19,7 +19,7 @@ GVAR(altitude) = -1000 max parseNumber(ctrlText 130030) min 20000; GVAR(temperature) = -50 max parseNumber(ctrlText 130040) min 160; GVAR(barometricPressure) = 0 max parseNumber(ctrlText 130050) min 1350; GVAR(relativeHumidity) = (0 max parseNumber(ctrlText 130060) min 100) / 100; -if (GVAR(currentUnit) == 1) then { +if (GVAR(currentUnit) != 2) then { GVAR(altitude) = GVAR(altitude) * 0.3048; GVAR(temperature) = (GVAR(temperature) - 32) / 1.8; GVAR(barometricPressure) = GVAR(barometricPressure) * 33.86389; diff --git a/addons/atragmx/functions/fnc_update_atmo_env_data.sqf b/addons/atragmx/functions/fnc_update_atmo_env_data.sqf index 8dcbc89280..7cd34754da 100644 --- a/addons/atragmx/functions/fnc_update_atmo_env_data.sqf +++ b/addons/atragmx/functions/fnc_update_atmo_env_data.sqf @@ -17,18 +17,18 @@ ctrlSetFocus ((uiNamespace getVariable "ATragMX_Display") displayCtrl 13007); -if (GVAR(currentUnit) != 1) then { +if (GVAR(currentUnit) == 2) then { ctrlSetText [130040, Str(Round(GVAR(temperature) * 10) / 10)]; } else { ctrlSetText [130040, Str(Round((GVAR(temperature) * 1.8 + 32) * 10) / 10)]; }; -if (GVAR(currentUnit) != 1) then { +if (GVAR(currentUnit) == 2) then { ctrlSetText [130050, Str(Round(GVAR(barometricPressure)))]; } else { ctrlSetText [130050, Str(Round(GVAR(barometricPressure) / 33.8638866667 * 100) / 100)]; }; ctrlSetText [130060, Str(Round(GVAR(relativeHumidity) * 100 * 10) / 10)]; -if (GVAR(currentUnit) != 1) then { +if (GVAR(currentUnit) == 2) then { ctrlSetText [130030, Str(Round(GVAR(altitude)))]; } else { ctrlSetText [130030, Str(Round(GVAR(altitude) * 3.2808399))]; diff --git a/addons/atragmx/functions/fnc_update_atmosphere.sqf b/addons/atragmx/functions/fnc_update_atmosphere.sqf index fa555f50e7..be7565bda7 100644 --- a/addons/atragmx/functions/fnc_update_atmosphere.sqf +++ b/addons/atragmx/functions/fnc_update_atmosphere.sqf @@ -15,18 +15,18 @@ */ #include "script_component.hpp" -if (GVAR(currentUnit) != 1) then { +if (GVAR(currentUnit) == 2) then { ctrlSetText [200, Str(Round(GVAR(temperature) * 10) / 10)]; } else { ctrlSetText [200, Str(Round((GVAR(temperature) * 1.8 + 32) * 10) / 10)]; }; -if (GVAR(currentUnit) != 1) then { +if (GVAR(currentUnit) == 2) then { ctrlSetText [210, Str(Round(GVAR(barometricPressure)))]; } else { ctrlSetText [210, Str(Round(GVAR(barometricPressure) / 33.8638866667 * 100) / 100)]; }; ctrlSetText [220, Str(Round(GVAR(relativeHumidity) * 100 * 10) / 10)]; -if (GVAR(currentUnit) != 1) then { +if (GVAR(currentUnit) == 2) then { ctrlSetText [230, Str(Round(GVAR(altitude)))]; } else { ctrlSetText [230, Str(Round(GVAR(altitude) * 3.2808399))]; From de5c5139c0f6721bc15fc02015edb8f5c0fd420d Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 19 Apr 2015 11:02:25 +0200 Subject: [PATCH 280/305] Moved a private declaration out of the hot path --- addons/atragmx/functions/fnc_calculate_solution.sqf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/atragmx/functions/fnc_calculate_solution.sqf b/addons/atragmx/functions/fnc_calculate_solution.sqf index 242e2e9c48..2d70e8dca1 100644 --- a/addons/atragmx/functions/fnc_calculate_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_solution.sqf @@ -43,7 +43,7 @@ */ #include "script_component.hpp" -private ["_scopeBaseAngle", "_bulletMass", "_boreHeight", "_airFriction", "_muzzleVelocity", "_temperature", "_barometricPressure", "_relativeHumidity", "_simSteps", "_windSpeed1", "_windSpeed2", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange", "_bc", "_dragModel", "_atmosphereModel", "_storeRangeCardData", "_stabilityFactor", "_twistDirection", "_latitude"]; +private ["_scopeBaseAngle", "_bulletMass", "_boreHeight", "_airFriction", "_muzzleVelocity", "_temperature", "_barometricPressure", "_relativeHumidity", "_simSteps", "_windSpeed1", "_windSpeed2", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange", "_drag", "_bc", "_dragModel", "_atmosphereModel", "_storeRangeCardData", "_stabilityFactor", "_twistDirection", "_latitude"]; _scopeBaseAngle = _this select 0; _bulletMass = _this select 1; _boreHeight = _this select 2; @@ -136,7 +136,6 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do { if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { if (missionNamespace getVariable [QEGVAR(advanced_ballistics,AdvancedAirDragEnabled), false]) then { - private ["_drag"]; _drag = if (missionNamespace getVariable [QEGVAR(advanced_ballistics,extensionAvailable), false]) then { parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3", _dragModel, _bc, _trueSpeed])) } else { From 4235163801945f4a1f959ad3c34ce7f875e08fbb Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 19 Apr 2015 11:14:18 +0200 Subject: [PATCH 281/305] Added asterix (*) prefix to distances in yards on the main page --- addons/atragmx/functions/fnc_update_gun.sqf | 6 +++--- addons/atragmx/functions/fnc_update_target.sqf | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/atragmx/functions/fnc_update_gun.sqf b/addons/atragmx/functions/fnc_update_gun.sqf index f3d173ba11..67e5e651d1 100644 --- a/addons/atragmx/functions/fnc_update_gun.sqf +++ b/addons/atragmx/functions/fnc_update_gun.sqf @@ -36,10 +36,10 @@ if (GVAR(currentUnit) != 2) then { } else { ctrlSetText [130, Str(Round(GVAR(workingMemory) select 1))]; }; -if (GVAR(currentUnit) != 1) then { - ctrlSetText [140, Str(Round(GVAR(workingMemory) select 2))]; +if (GVAR(currentUnit) == 1) then { + ctrlSetText [140, format["*%1", Round((GVAR(workingMemory) select 2) * 1.0936133)]]; } else { - ctrlSetText [140, Str(Round((GVAR(workingMemory) select 2) * 1.0936133))]; + ctrlSetText [140, Str(Round(GVAR(workingMemory) select 2))]; }; [] call FUNC(update_scope_unit); diff --git a/addons/atragmx/functions/fnc_update_target.sqf b/addons/atragmx/functions/fnc_update_target.sqf index dab62e099d..a888e6fdd8 100644 --- a/addons/atragmx/functions/fnc_update_target.sqf +++ b/addons/atragmx/functions/fnc_update_target.sqf @@ -36,7 +36,7 @@ if (GVAR(currentUnit) != 2) then { ctrlSetText [330, Str(Round((GVAR(targetSpeed) select GVAR(currentTarget)) * 100) / 100)]; }; if (GVAR(currentUnit) == 1) then { - ctrlSetText [340, Str(Round((GVAR(targetRange) select GVAR(currentTarget)) * 1.0936133))]; + ctrlSetText [340, format["*%1", Round((GVAR(workingMemory) select 2) * 1.0936133)]]; } else { ctrlSetText [340, Str(Round((GVAR(targetRange) select GVAR(currentTarget))))]; }; From 4430e8a0ee61faaeac26f37f4b26ec3c415c5d35 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 19 Apr 2015 11:18:37 +0200 Subject: [PATCH 282/305] Increased the minimum barometric pressure value that is accepted --- addons/atragmx/functions/fnc_parse_input.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/atragmx/functions/fnc_parse_input.sqf b/addons/atragmx/functions/fnc_parse_input.sqf index cda1bb3419..ab2539ec1c 100644 --- a/addons/atragmx/functions/fnc_parse_input.sqf +++ b/addons/atragmx/functions/fnc_parse_input.sqf @@ -17,7 +17,7 @@ GVAR(altitude) = -1000 max parseNumber(ctrlText 130030) min 20000; GVAR(temperature) = -50 max parseNumber(ctrlText 130040) min 160; -GVAR(barometricPressure) = 0 max parseNumber(ctrlText 130050) min 1350; +GVAR(barometricPressure) = 10 max parseNumber(ctrlText 130050) min 1350; GVAR(relativeHumidity) = (0 max parseNumber(ctrlText 130060) min 100) / 100; if (GVAR(currentUnit) != 2) then { GVAR(altitude) = GVAR(altitude) * 0.3048; From 5195271894755ac6782c4b60b11862e45530027c Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 19 Apr 2015 11:32:02 +0200 Subject: [PATCH 283/305] Fixes: https://github.com/acemod/ACE3/commit/4235163 *The asterix needs to be shown on distances shown in meters not yards --- addons/atragmx/functions/fnc_update_gun.sqf | 15 ++++++++++----- addons/atragmx/functions/fnc_update_target.sqf | 14 ++++++++++---- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/addons/atragmx/functions/fnc_update_gun.sqf b/addons/atragmx/functions/fnc_update_gun.sqf index 67e5e651d1..4ca7338e57 100644 --- a/addons/atragmx/functions/fnc_update_gun.sqf +++ b/addons/atragmx/functions/fnc_update_gun.sqf @@ -36,10 +36,15 @@ if (GVAR(currentUnit) != 2) then { } else { ctrlSetText [130, Str(Round(GVAR(workingMemory) select 1))]; }; -if (GVAR(currentUnit) == 1) then { - ctrlSetText [140, format["*%1", Round((GVAR(workingMemory) select 2) * 1.0936133)]]; -} else { - ctrlSetText [140, Str(Round(GVAR(workingMemory) select 2))]; +switch (GVAR(currentUnit)) do { + case 0: { + ctrlSetText [140, format["*%1", Round(GVAR(workingMemory) select 2)]]; + }; + case 1: { + ctrlSetText [140, Str(Round((GVAR(workingMemory) select 2) * 1.0936133))]; + }; + case 2: { + ctrlSetText [140, Str(Round(GVAR(workingMemory) select 2))]; + }; }; - [] call FUNC(update_scope_unit); diff --git a/addons/atragmx/functions/fnc_update_target.sqf b/addons/atragmx/functions/fnc_update_target.sqf index a888e6fdd8..ef2ef1de5c 100644 --- a/addons/atragmx/functions/fnc_update_target.sqf +++ b/addons/atragmx/functions/fnc_update_target.sqf @@ -35,8 +35,14 @@ if (GVAR(currentUnit) != 2) then { } else { ctrlSetText [330, Str(Round((GVAR(targetSpeed) select GVAR(currentTarget)) * 100) / 100)]; }; -if (GVAR(currentUnit) == 1) then { - ctrlSetText [340, format["*%1", Round((GVAR(workingMemory) select 2) * 1.0936133)]]; -} else { - ctrlSetText [340, Str(Round((GVAR(targetRange) select GVAR(currentTarget))))]; +switch (GVAR(currentUnit)) do { + case 0: { + ctrlSetText [340, format["*%1", Round((GVAR(targetRange) select GVAR(currentTarget)))]]; + }; + case 1: { + ctrlSetText [340, Str(Round((GVAR(targetRange) select GVAR(currentTarget)) * 1.0936133))]; + }; + case 2: { + ctrlSetText [340, Str(Round((GVAR(targetRange) select GVAR(currentTarget))))]; + }; }; From 874858ebb4ab8d770dc530478884433442146961 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 19 Apr 2015 11:43:20 +0200 Subject: [PATCH 284/305] Added a sanity check to the cycle gun list function *Top/Down buttons only cycle the gun list in the main/gun list menu --- addons/atragmx/functions/fnc_cycle_gun_list.sqf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/atragmx/functions/fnc_cycle_gun_list.sqf b/addons/atragmx/functions/fnc_cycle_gun_list.sqf index 3d4bef70c1..75f54c79fb 100644 --- a/addons/atragmx/functions/fnc_cycle_gun_list.sqf +++ b/addons/atragmx/functions/fnc_cycle_gun_list.sqf @@ -15,4 +15,6 @@ */ #include "script_component.hpp" +if (!(GVAR(showMainPage) || GVAR(showGunList))) exitWith {}; + [(GVAR(currentGun) + (count GVAR(gunList)) + _this) % (count GVAR(gunList)), true] call FUNC(change_gun); From f6263e9e8b9b59a005b2aa1aa692cc0914f20c74 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 19 Apr 2015 12:07:27 +0200 Subject: [PATCH 285/305] Overworked the scope click feature: *TODO: Add the "Setting Up a Solution for Your Scope" screen --- addons/atragmx/XEH_postInit.sqf | 46 +++++++++---------- addons/atragmx/functions/fnc_change_gun.sqf | 6 +-- addons/atragmx/functions/fnc_init.sqf | 3 ++ .../functions/fnc_update_scope_unit.sqf | 9 +++- addons/atragmx/script_component.hpp | 2 +- 5 files changed, 37 insertions(+), 29 deletions(-) diff --git a/addons/atragmx/XEH_postInit.sqf b/addons/atragmx/XEH_postInit.sqf index e5f7dd42d3..574b5a8991 100644 --- a/addons/atragmx/XEH_postInit.sqf +++ b/addons/atragmx/XEH_postInit.sqf @@ -5,39 +5,39 @@ if ((profileNamespace getVariable ["ACE_ATragMX_profileNamespaceVersion", 0]) == ATRAGMX_PROFILE_NAMESPACE_VERSION && count (profileNamespace getVariable ["ACE_ATragMX_gunList", []]) > 0) then { GVAR(gunList) = profileNamespace getVariable "ACE_ATragMX_gunList"; } else { - // Profile Name, Muzzle Velocity, Zero Range, Scope Base Angle, AirFriction, Bore Height, Scope Unit, Elevation Scope Step, Windage Scope Step, Maximum Elevation, Dialed Elevation, Dialed Windage, Mass, Bullet Diameter, Rifle Twist, BC, Drag Model, Atmosphere Model - GVAR(gunList) = [["12.7x108mm" , 820, 100, 0.0659, -0.0008600, 3.81, 0, 0.338, 0.338, 120, 0, 0, 48.28, 12.7, 38.10, 0.630, 1, "ASM" ], + // Profile Name, Muzzle Velocity, Zero Range, Scope Base Angle, AirFriction, Bore Height, Scope Unit, Scope Click Unit, Scope Click Number, Maximum Elevation, Dialed Elevation, Dialed Windage, Mass, Bullet Diameter, Rifle Twist, BC, Drag Model, Atmosphere Model + GVAR(gunList) = [["12.7x108mm" , 820, 100, 0.0659, -0.0008600, 3.81, 0, 2, 10, 120, 0, 0, 48.28, 12.7, 38.10, 0.630, 1, "ASM" ], - ["12.7x99mm AMAX" , 860, 100, 0.0612, -0.0008600, 3.81, 0, 0.338, 0.338, 120, 0, 0, 48.60, 12.7, 38.10, 1.050, 1, "ASM" ], - ["12.7x99mm" , 853, 100, 0.0623, -0.0008600, 3.81, 0, 0.338, 0.338, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM" ], + ["12.7x99mm AMAX" , 860, 100, 0.0612, -0.0008600, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 38.10, 1.050, 1, "ASM" ], + ["12.7x99mm" , 853, 100, 0.0623, -0.0008600, 3.81, 0, 2, 10, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM" ], - ["12.7x54mm" , 300, 100, 0.3394, -0.0014000, 3.81, 0, 0.338, 0.338, 120, 0, 0, 48.60, 12.7, 24.13, 1.050, 1, "ASM" ], + ["12.7x54mm" , 300, 100, 0.3394, -0.0014000, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 24.13, 1.050, 1, "ASM" ], - [".408 Chey Tac" , 910, 100, 0.0569, -0.0004800, 3.81, 0, 0.338, 0.338, 120, 0, 0, 27.15, 10.4, 33.02, 0.970, 1, "ASM" ], + [".408 Chey Tac" , 910, 100, 0.0569, -0.0004800, 3.81, 0, 2, 10, 120, 0, 0, 27.15, 10.4, 33.02, 0.970, 1, "ASM" ], - ["9.3×64mm" , 870, 100, 0.0619, -0.0007500, 3.81, 0, 0.338, 0.338, 120, 0, 0, 14.90, 9.30, 35.56, 0.368, 1, "ASM" ], + ["9.3×64mm" , 870, 100, 0.0619, -0.0007500, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 9.30, 35.56, 0.368, 1, "ASM" ], - [".338LM 250gr" , 880, 100, 0.0598, -0.0006060, 3.81, 0, 0.338, 0.338, 120, 0, 0, 16.20, 8.58, 25.40, 0.322, 7, "ICAO"], - [".338LM 300gr" , 800, 100, 0.0677, -0.0005350, 3.81, 0, 0.338, 0.338, 120, 0, 0, 19.44, 8.58, 25.40, 0.381, 7, "ICAO"], - [".338LM API526" , 880, 100, 0.0601, -0.0006730, 3.81, 0, 0.338, 0.338, 120, 0, 0, 16.39, 8.58, 25.40, 0.290, 7, "ICAO"], + [".338LM 250gr" , 880, 100, 0.0598, -0.0006060, 3.81, 0, 2, 10, 120, 0, 0, 16.20, 8.58, 25.40, 0.322, 7, "ICAO"], + [".338LM 300gr" , 800, 100, 0.0677, -0.0005350, 3.81, 0, 2, 10, 120, 0, 0, 19.44, 8.58, 25.40, 0.381, 7, "ICAO"], + [".338LM API526" , 880, 100, 0.0601, -0.0006730, 3.81, 0, 2, 10, 120, 0, 0, 16.39, 8.58, 25.40, 0.290, 7, "ICAO"], - [".300WM Mk248 Mod 0", 900, 100, 0.0584, -0.0008300, 3.81, 0, 0.338, 0.338, 120, 0, 0, 13.31, 7.80, 25.40, 0.268, 7, "ICAO"], - [".300WM Mk248 Mod 1", 867, 100, 0.0611, -0.0008150, 3.81, 0, 0.338, 0.338, 120, 0, 0, 14.26, 7.80, 25.40, 0.310, 7, "ICAO"], - [".300WM Berger OTM" , 853, 100, 0.0622, -0.0007600, 3.81, 0, 0.338, 0.338, 120, 0, 0, 14.90, 7.80, 25.40, 0.368, 7, "ICAO"], + [".300WM Mk248 Mod 0", 900, 100, 0.0584, -0.0008300, 3.81, 0, 2, 10, 120, 0, 0, 13.31, 7.80, 25.40, 0.268, 7, "ICAO"], + [".300WM Mk248 Mod 1", 867, 100, 0.0611, -0.0008150, 3.81, 0, 2, 10, 120, 0, 0, 14.26, 7.80, 25.40, 0.310, 7, "ICAO"], + [".300WM Berger OTM" , 853, 100, 0.0622, -0.0007600, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 7.80, 25.40, 0.368, 7, "ICAO"], - ["7.62x54mmR" , 800, 100, 0.0692, -0.0010230, 3.81, 0, 0.338, 0.338, 120, 0, 0, 9.849, 7.92, 24.13, 0.400, 1, "ICAO"], + ["7.62x54mmR" , 800, 100, 0.0692, -0.0010230, 3.81, 0, 2, 10, 120, 0, 0, 9.849, 7.92, 24.13, 0.400, 1, "ICAO"], - ["7.62x51mm M80" , 810, 100, 0.0679, -0.0010350, 3.81, 0, 0.338, 0.338, 120, 0, 0, 9.525, 7.82, 25.40, 0.200, 7, "ICAO"], - ["7.62x51mm M118LR" , 820, 100, 0.0662, -0.0008525, 3.81, 0, 0.338, 0.338, 120, 0, 0, 11.34, 7.82, 25.40, 0.243, 7, "ICAO"], - ["7.62x51mm Mk319" , 820, 100, 0.0670, -0.0010300, 3.81, 0, 0.338, 0.338, 120, 0, 0, 8.424, 7.82, 25.40, 0.377, 1, "ICAO"], - ["7.62x51mm Subsonic", 320, 100, 0.3060, -0.0004910, 3.81, 0, 0.338, 0.338, 120, 0, 0, 12.96, 7.82, 25.40, 0.235, 7, "ICAO"], + ["7.62x51mm M80" , 810, 100, 0.0679, -0.0010350, 3.81, 0, 2, 10, 120, 0, 0, 9.525, 7.82, 25.40, 0.200, 7, "ICAO"], + ["7.62x51mm M118LR" , 820, 100, 0.0662, -0.0008525, 3.81, 0, 2, 10, 120, 0, 0, 11.34, 7.82, 25.40, 0.243, 7, "ICAO"], + ["7.62x51mm Mk319" , 820, 100, 0.0670, -0.0010300, 3.81, 0, 2, 10, 120, 0, 0, 8.424, 7.82, 25.40, 0.377, 1, "ICAO"], + ["7.62x51mm Subsonic", 320, 100, 0.3060, -0.0004910, 3.81, 0, 2, 10, 120, 0, 0, 12.96, 7.82, 25.40, 0.235, 7, "ICAO"], - ["6.5x39mm" , 800, 100, 0.0683, -0.0007850, 3.81, 0, 0.338, 0.338, 120, 0, 0, 7.970, 6.71, 22.86, 0.263, 7, "ICAO"], - ["6.5x47mm Lapua" , 800, 100, 0.0682, -0.0007710, 3.81, 0, 0.338, 0.338, 120, 0, 0, 9.007, 6.71, 22.86, 0.290, 7, "ICAO"], + ["6.5x39mm" , 800, 100, 0.0683, -0.0007850, 3.81, 0, 2, 10, 120, 0, 0, 7.970, 6.71, 22.86, 0.263, 7, "ICAO"], + ["6.5x47mm Lapua" , 800, 100, 0.0682, -0.0007710, 3.81, 0, 2, 10, 120, 0, 0, 9.007, 6.71, 22.86, 0.290, 7, "ICAO"], - ["5.56x45mm M855" , 870, 100, 0.0626, -0.0012650, 3.81, 0, 0.338, 0.338, 120, 0, 0, 4.018, 5.70, 17.78, 0.151, 7, "ASM" ], - ["5.56x45mm Mk262" , 820, 100, 0.0671, -0.0011250, 3.81, 0, 0.338, 0.338, 120, 0, 0, 4.990, 5.70, 17.78, 0.361, 1, "ASM" ], - ["5.56x45mm Mk318" , 880, 100, 0.0616, -0.0011200, 3.81, 0, 0.338, 0.338, 120, 0, 0, 4.018, 5.70, 17.78, 0.307, 1, "ASM" ]]; + ["5.56x45mm M855" , 870, 100, 0.0626, -0.0012650, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.151, 7, "ASM" ], + ["5.56x45mm Mk262" , 820, 100, 0.0671, -0.0011250, 3.81, 0, 2, 10, 120, 0, 0, 4.990, 5.70, 17.78, 0.361, 1, "ASM" ], + ["5.56x45mm Mk318" , 880, 100, 0.0616, -0.0011200, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.307, 1, "ASM" ]]; [] call FUNC(clear_user_data); profileNamespace setVariable ["ACE_ATragMX_gunList", GVAR(gunList)]; diff --git a/addons/atragmx/functions/fnc_change_gun.sqf b/addons/atragmx/functions/fnc_change_gun.sqf index c753f644a4..a401a849e3 100644 --- a/addons/atragmx/functions/fnc_change_gun.sqf +++ b/addons/atragmx/functions/fnc_change_gun.sqf @@ -27,9 +27,9 @@ GVAR(currentGun) = _gunID; lbSetCurSel [6000, GVAR(currentGun)]; -if ((GVAR(scopeUnits) select GVAR(currentScopeUnit)) != "Clicks") then { - GVAR(currentScopeUnit) = GVAR(workingMemory) select 6; -}; +GVAR(currentScopeUnit) = 0 max (GVAR(workingMemory) select 6) min 3; +GVAR(currentScopeClickUnit) = 0 max (GVAR(workingMemory) select 7) min 2; +GVAR(currentScopeClickNumber) = 1 max (GVAR(workingMemory) select 8) min 10; [] call FUNC(update_gun); [] call FUNC(update_gun_ammo_data); diff --git a/addons/atragmx/functions/fnc_init.sqf b/addons/atragmx/functions/fnc_init.sqf index 881f65a6b0..2e613ca9e6 100644 --- a/addons/atragmx/functions/fnc_init.sqf +++ b/addons/atragmx/functions/fnc_init.sqf @@ -18,6 +18,7 @@ GVAR(workingMemory) = +(GVAR(gunList) select 0); GVAR(scopeUnits) = ["MILs", "TMOA", "SMOA", "Clicks"]; +GVAR(scopeClickUnits) = ["TMOA", "SMOA", "MILs"]; GVAR(rangeCardStartRange) = 200; GVAR(rangeCardEndRange) = 2000; @@ -40,6 +41,8 @@ GVAR(currentUnit) = 2; GVAR(currentGun) = 0; GVAR(currentTarget) = 0; GVAR(currentScopeUnit) = 0; +GVAR(currentScopeClickUnit) = 2; +GVAR(currentScopeClickNumber) = 10; GVAR(atmosphereModeTBH) = true; GVAR(altitude) = 0; diff --git a/addons/atragmx/functions/fnc_update_scope_unit.sqf b/addons/atragmx/functions/fnc_update_scope_unit.sqf index 55bb703eee..72efeb772e 100644 --- a/addons/atragmx/functions/fnc_update_scope_unit.sqf +++ b/addons/atragmx/functions/fnc_update_scope_unit.sqf @@ -15,5 +15,10 @@ */ #include "script_component.hpp" -ctrlSetText [2000, GVAR(scopeUnits) select GVAR(currentScopeUnit)]; -ctrlSetText [5000, GVAR(scopeUnits) select GVAR(currentScopeUnit)]; +if (GVAR(currentScopeUnit) == 3) then { + ctrlSetText [2000, format["Clicks=%1", GVAR(currentScopeClickNumber)]]; + ctrlSetText [5000, format["Clicks=%1", GVAR(currentScopeClickNumber)]]; +} else { + ctrlSetText [2000, GVAR(scopeUnits) select GVAR(currentScopeUnit)]; + ctrlSetText [5000, GVAR(scopeUnits) select GVAR(currentScopeUnit)]; +}; diff --git a/addons/atragmx/script_component.hpp b/addons/atragmx/script_component.hpp index 5290ba6a1f..7cd5b44911 100644 --- a/addons/atragmx/script_component.hpp +++ b/addons/atragmx/script_component.hpp @@ -11,4 +11,4 @@ #include "\z\ace\addons\main\script_macros.hpp" -#define ATRAGMX_PROFILE_NAMESPACE_VERSION 1.0 +#define ATRAGMX_PROFILE_NAMESPACE_VERSION 1.1 From 2b5b89604e308d45e1c701eac4ec35510544f60b Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 19 Apr 2015 12:29:26 +0200 Subject: [PATCH 286/305] Removed unused RscControlsGroup --- addons/atragmx/RscTitles.hpp | 34 ---------------------------------- 1 file changed, 34 deletions(-) diff --git a/addons/atragmx/RscTitles.hpp b/addons/atragmx/RscTitles.hpp index 6562e694d1..905212d5c9 100644 --- a/addons/atragmx/RscTitles.hpp +++ b/addons/atragmx/RscTitles.hpp @@ -133,40 +133,6 @@ class ATragMX_RscListNBox: ATragMX_RscListBox { idcLeft=-1; idcRight=-1; }; -class ATragMX_RscControlsGroup { - type=15; - idc=-1; - style=16; - x=0; - y=0; - w=1; - h=1; - shadow=0; - class VScrollbar { - color[]={1,1,1,0.6}; - width=0.021; - autoScrollSpeed=-1; - autoScrollDelay=5; - autoScrollRewind=0; - shadow=0; - }; - class HScrollbar { - color[]={1,1,1,0.6}; - height=0.028; - shadow=0; - }; - class ScrollBar { - color[]={1,1,1,0.6}; - colorActive[]={1,1,1,1}; - colorDisabled[]={1,1,1,0.3}; - thumb="#(argb,8,8,3)color(1,1,1,1)"; - arrowEmpty="#(argb,8,8,3)color(1,1,1,1)"; - arrowFull="#(argb,8,8,3)color(1,1,1,1)"; - border="#(argb,8,8,3)color(1,1,1,1)"; - }; - class Controls { - }; -}; class ATragMX_RscLineBreak { idc=-1; type=98; From a73c0bc429694bd21d9195f83da977a745fa95c3 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 19 Apr 2015 12:40:13 +0200 Subject: [PATCH 287/305] Sord is now able to transmit the direction of fire --- addons/atragmx/functions/fnc_parse_input.sqf | 4 ++-- addons/atragmx/functions/fnc_sord.sqf | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/atragmx/functions/fnc_parse_input.sqf b/addons/atragmx/functions/fnc_parse_input.sqf index ab2539ec1c..ca289302c9 100644 --- a/addons/atragmx/functions/fnc_parse_input.sqf +++ b/addons/atragmx/functions/fnc_parse_input.sqf @@ -32,12 +32,12 @@ GVAR(windSpeed1) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140020 GVAR(windSpeed2) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140021)) min 50]; GVAR(windDirection) set [GVAR(currentTarget), 1 max Round(parseNumber(ctrlText 140030)) min 12]; _inclinationAngleCosine = 0.5 max parseNumber(ctrlText 140041) min 1; -_inclinationAngleDegree = -60 max parseNumber(ctrlText 140040) min 60; +_inclinationAngleDegree = -60 max round(parseNumber(ctrlText 140040)) min 60; if (_inclinationAngleDegree != GVAR(inclinationAngle) select GVAR(currentTarget)) then { GVAR(inclinationAngle) set [GVAR(currentTarget), _inclinationAngleDegree]; } else { if (_inclinationAngleCosine != Round(cos(GVAR(inclinationAngle) select GVAR(currentTarget)) * 100) / 100) then { - GVAR(inclinationAngle) set [GVAR(currentTarget), acos(_inclinationAngleCosine)]; + GVAR(inclinationAngle) set [GVAR(currentTarget), round(acos(_inclinationAngleCosine))]; }; }; GVAR(targetSpeed) set [GVAR(currentTarget), -50 max abs(parseNumber(ctrlText 140050)) min 50]; diff --git a/addons/atragmx/functions/fnc_sord.sqf b/addons/atragmx/functions/fnc_sord.sqf index 650993cff3..a433153c0e 100644 --- a/addons/atragmx/functions/fnc_sord.sqf +++ b/addons/atragmx/functions/fnc_sord.sqf @@ -22,6 +22,6 @@ _slopeDistance = _this select 0; _azimuth = _this select 1; _inclination = _this select 2; -//_inclination = asin((ACE_player weaponDirection currentWeapon ACE_player) select 2); -GVAR(inclinationAngle) set [GVAR(currentTarget), _inclination]; -GVAR(targetRange) set [GVAR(currentTarget), _slopeDistance]; +GVAR(inclinationAngle) set [GVAR(currentTarget), round(_inclination)]; +GVAR(directionOfFire) set [GVAR(currentTarget), round(_azimuth)]; +GVAR(targetRange) set [GVAR(currentTarget), round(_slopeDistance)]; From 20740679cca12701f22aea15cae0b5ce7ccec91f Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 19 Apr 2015 17:40:49 +0200 Subject: [PATCH 288/305] Fixed inconsistent 'workingMemory' initialization --- addons/atragmx/functions/fnc_change_gun.sqf | 26 ++++++++++++------- .../atragmx/functions/fnc_create_dialog.sqf | 2 +- .../atragmx/functions/fnc_cycle_gun_list.sqf | 2 +- .../functions/fnc_restore_user_data.sqf | 2 +- .../atragmx/functions/fnc_toggle_gun_list.sqf | 2 +- 5 files changed, 21 insertions(+), 13 deletions(-) diff --git a/addons/atragmx/functions/fnc_change_gun.sqf b/addons/atragmx/functions/fnc_change_gun.sqf index a401a849e3..7c5abac47e 100644 --- a/addons/atragmx/functions/fnc_change_gun.sqf +++ b/addons/atragmx/functions/fnc_change_gun.sqf @@ -4,7 +4,8 @@ * * Arguments: * gunID - * update solution + * restore workingMemory from gunList + * update display * * Return Value: * Nothing @@ -16,23 +17,30 @@ */ #include "script_component.hpp" -private ["_gunID", "_updateSolution"]; -_gunID = _this select 0; -_updateSolution = _this select 1; +private ["_gunID", "_restoreMemory", "_updateDisplay"]; +_gunID = _this select 0; +_restoreMemory = _this select 1; +_updateDisplay = _this select 2; if (_gunID < 0 || _gunID > (count GVAR(gunList)) - 1) exitWith {}; -GVAR(workingMemory) = +(GVAR(gunList) select _gunID); +if (_restoreMemory) then { + GVAR(workingMemory) = +(GVAR(gunList) select _gunID); +}; GVAR(currentGun) = _gunID; -lbSetCurSel [6000, GVAR(currentGun)]; +if (_updateDisplay) then { + lbSetCurSel [6000, GVAR(currentGun)]; +}; GVAR(currentScopeUnit) = 0 max (GVAR(workingMemory) select 6) min 3; GVAR(currentScopeClickUnit) = 0 max (GVAR(workingMemory) select 7) min 2; GVAR(currentScopeClickNumber) = 1 max (GVAR(workingMemory) select 8) min 10; -[] call FUNC(update_gun); -[] call FUNC(update_gun_ammo_data); +if (_updateDisplay) then { + [] call FUNC(update_gun); + [] call FUNC(update_gun_ammo_data); +}; GVAR(elevationOutput) set [GVAR(currentTarget), 0]; GVAR(windage1Output) set [GVAR(currentTarget), 0]; @@ -41,6 +49,6 @@ GVAR(leadOutput) set [GVAR(currentTarget), 0]; GVAR(tofOutput) set [GVAR(currentTarget), 0]; GVAR(velocityOutput) set [GVAR(currentTarget), 0]; -if (_updateSolution) then { +if (_updateDisplay) then { [] call FUNC(calculate_target_solution); }; diff --git a/addons/atragmx/functions/fnc_create_dialog.sqf b/addons/atragmx/functions/fnc_create_dialog.sqf index 1646b0ec25..b4d51bd894 100644 --- a/addons/atragmx/functions/fnc_create_dialog.sqf +++ b/addons/atragmx/functions/fnc_create_dialog.sqf @@ -40,7 +40,7 @@ GVAR(showTargetRangeAssist) call FUNC(show_target_range_assist); GVAR(showTargetSpeedAssist) call FUNC(show_target_speed_assist); GVAR(showTargetSpeedAssistTimer) call FUNC(show_target_speed_assist_timer); -[GVAR(currentGun), false] call FUNC(change_gun); +[GVAR(currentGun), false, true] call FUNC(change_gun); { lbAdd [6000, _x select 0]; diff --git a/addons/atragmx/functions/fnc_cycle_gun_list.sqf b/addons/atragmx/functions/fnc_cycle_gun_list.sqf index 75f54c79fb..3796bb78e6 100644 --- a/addons/atragmx/functions/fnc_cycle_gun_list.sqf +++ b/addons/atragmx/functions/fnc_cycle_gun_list.sqf @@ -17,4 +17,4 @@ if (!(GVAR(showMainPage) || GVAR(showGunList))) exitWith {}; -[(GVAR(currentGun) + (count GVAR(gunList)) + _this) % (count GVAR(gunList)), true] call FUNC(change_gun); +[(GVAR(currentGun) + (count GVAR(gunList)) + _this) % (count GVAR(gunList)), true, true] call FUNC(change_gun); diff --git a/addons/atragmx/functions/fnc_restore_user_data.sqf b/addons/atragmx/functions/fnc_restore_user_data.sqf index 54d1f3cd2b..55b73cc5b5 100644 --- a/addons/atragmx/functions/fnc_restore_user_data.sqf +++ b/addons/atragmx/functions/fnc_restore_user_data.sqf @@ -16,7 +16,7 @@ #include "script_component.hpp" GVAR(currentUnit) = 0 max (profileNamespace getVariable ["ACE_ATragMX_currentUnit", 2]) min 2; -GVAR(currentGun) = 0 max (profileNamespace getVariable ["ACE_ATragMX_currentGun", 0]); +[(profileNamespace getVariable ["ACE_ATragMX_currentGun", 0]), true, false] call FUNC(change_gun); GVAR(currentTarget) = 0 max (profileNamespace getVariable ["ACE_ATragMX_currentTarget", 0]) min 3; GVAR(currentScopeUnit) = 0 max (profileNamespace getVariable ["ACE_ATragMX_currentScopeUnit", 0]) min 3; diff --git a/addons/atragmx/functions/fnc_toggle_gun_list.sqf b/addons/atragmx/functions/fnc_toggle_gun_list.sqf index 714e6e848d..1cc1f9338b 100644 --- a/addons/atragmx/functions/fnc_toggle_gun_list.sqf +++ b/addons/atragmx/functions/fnc_toggle_gun_list.sqf @@ -20,7 +20,7 @@ if (ctrlVisible 6000) then { true call FUNC(show_main_page); if (_this) then { - [lbCurSel 6000, true] call FUNC(change_gun); + [lbCurSel 6000, true, true] call FUNC(change_gun); }; } else { false call FUNC(show_main_page); From a83925dd2dd12215539d6e7cc7cbde0b67268aa0 Mon Sep 17 00:00:00 2001 From: Tachii Date: Sun, 19 Apr 2015 18:43:05 +0300 Subject: [PATCH 289/305] Update stringtable.xml --- addons/medical/stringtable.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 9645aa2289..9f862b9b3b 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -477,7 +477,7 @@ Minor Gering Menor - Легкие ранения + Несрочная помощь Normalny Léger Minimální @@ -487,7 +487,7 @@ Delayed Retrasado - Средние ранения + Срочная помощь Opóźniony Différé Verzögert @@ -498,7 +498,7 @@ Immediate Inmediato - Тяжелые ранения + Неотложная помощь Natychmiastowy Urgence Immédiate Sofort @@ -1610,7 +1610,7 @@ Pain Effect Type Schmerzeffekt-Typ Rodzaj efektu bólu - Эффект боли + Тип эффекта боли Pain Effect Type Tipo de efecto de dolor Type d'effet de douleur From 596fadcba07b41cd95df71280dcd0444e3fc625d Mon Sep 17 00:00:00 2001 From: Tachii Date: Sun, 19 Apr 2015 18:51:35 +0300 Subject: [PATCH 290/305] ru translations fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Не стоит додумывать правильные значения или то, как вы думаете это должно интерпертироваться. Нужно переводить то, что написано. Как пример Very Light Wounds - это не царапины, это очень лёгкие ранения. Царапины - это scratches --- addons/medical/stringtable.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 9f862b9b3b..053115f5d7 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -1529,7 +1529,7 @@ Heavily wounded Schwer verwundet: Ciężko ranny - Сильные ранения + Сильно ранен Gravemente ferito Gravemente herido Lourdement blessé @@ -1538,7 +1538,7 @@ Lightly wounded Leicht verwundet: Lekko ranny - Легкие ранения + Легко ранен Leggermente ferito Levemente herido Légèrement blessé @@ -1547,7 +1547,7 @@ Very lightly wounded Sehr leicht verwundet: B. lekko ranny - Царапины + Очень легко ранен Ferito lievemente Muy levemente herido Très légèrement blessé From a7d913b80e1d81b9a4714d82aad283f717b8be35 Mon Sep 17 00:00:00 2001 From: Tachii Date: Sun, 19 Apr 2015 18:54:47 +0300 Subject: [PATCH 291/305] Update stringtable.xml --- addons/medical/stringtable.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 053115f5d7..0287478bc5 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -1529,7 +1529,7 @@ Heavily wounded Schwer verwundet: Ciężko ranny - Сильно ранен + Тяжело ранен Gravemente ferito Gravemente herido Lourdement blessé From aad8d6b7850eab3c3f5ebe1f11e7eb19c465f40e Mon Sep 17 00:00:00 2001 From: jaynus Date: Sun, 19 Apr 2015 09:04:42 -0700 Subject: [PATCH 292/305] Fixed: max litter scalar array, have internal values. --- addons/medical/ACE_Settings.hpp | 6 +++++- addons/medical/functions/fnc_handleCreateLitter.sqf | 5 +++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/addons/medical/ACE_Settings.hpp b/addons/medical/ACE_Settings.hpp index b42d5bc5a6..6ab24379c5 100644 --- a/addons/medical/ACE_Settings.hpp +++ b/addons/medical/ACE_Settings.hpp @@ -79,7 +79,11 @@ class ACE_Settings { displayName = "$STR_ACE_Medical_litterSimulationDetail"; description = "$STR_ACE_Medical_litterSimulationDetail_Desc"; typeName = "SCALAR"; - value = 500; + + value = 3; + values[] = {"Off", "Low", "Medium", "High", "Ultra"}; + _values[] = { 0, 50, 100, 1000, 5000 }; + isClientSettable = 1; }; class GVAR(litterCleanUpDelay) { diff --git a/addons/medical/functions/fnc_handleCreateLitter.sqf b/addons/medical/functions/fnc_handleCreateLitter.sqf index aca47250cd..ee7e591cd1 100644 --- a/addons/medical/functions/fnc_handleCreateLitter.sqf +++ b/addons/medical/functions/fnc_handleCreateLitter.sqf @@ -4,7 +4,7 @@ if(!hasInterface) exitWith { false }; PARAMS_3(_litterClass,_position,_direction); -private["_litterObject"]; +private["_litterObject", "_maxLitterCount"]; if (isNil QGVAR(allCreatedLitter)) then { GVAR(allCreatedLitter) = []; @@ -14,7 +14,8 @@ if (isNil QGVAR(allCreatedLitter)) then { _litterObject = _litterClass createVehicleLocal _position; _litterObject setDir _direction; -if((count GVAR(allCreatedLitter)) > GVAR(litterSimulationDetail) ) then { +_maxLitterCount = getArray (configFile >> "ACE_Settings" >> QGVAR(litterSimulationDetail) >> "_values") select GVAR(litterSimulationDetail); +if((count GVAR(allCreatedLitter)) > _maxLitterCount ) then { // gank the first litter object, and spawn ours. private["_oldLitter"]; _oldLitter = GVAR(allCreatedLitter) deleteAt 0; From 60cab963bfdee0e020c5c1adb3d77178aa2279b6 Mon Sep 17 00:00:00 2001 From: Tachii Date: Sun, 19 Apr 2015 23:00:51 +0300 Subject: [PATCH 293/305] Update stringtable.xml --- addons/medical/stringtable.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 0287478bc5..bf0bde22f6 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -1529,7 +1529,7 @@ Heavily wounded Schwer verwundet: Ciężko ranny - Тяжело ранен + Тяжелые ранения Gravemente ferito Gravemente herido Lourdement blessé @@ -1538,7 +1538,7 @@ Lightly wounded Leicht verwundet: Lekko ranny - Легко ранен + Легкие раненя Leggermente ferito Levemente herido Légèrement blessé From 5038674aefb212f72ea3d566ab9d253e31732e1a Mon Sep 17 00:00:00 2001 From: Tachii Date: Sun, 19 Apr 2015 23:01:38 +0300 Subject: [PATCH 294/305] Update stringtable.xml --- addons/medical/stringtable.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index bf0bde22f6..cf6e4515b3 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -1538,7 +1538,7 @@ Lightly wounded Leicht verwundet: Lekko ranny - Легкие раненя + Легкие ранения Leggermente ferito Levemente herido Légèrement blessé @@ -1547,7 +1547,7 @@ Very lightly wounded Sehr leicht verwundet: B. lekko ranny - Очень легко ранен + Незначительные ранения Ferito lievemente Muy levemente herido Très légèrement blessé From f7d35d5593c1bc728c359e3e2a2c0e79ccaba815 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 19 Apr 2015 22:30:13 +0200 Subject: [PATCH 295/305] =?UTF-8?q?The=20ATragMX=20now=20also=20accounts?= =?UTF-8?q?=20for=20vertical=20coriolis=20drift=20(E=C3=B6tv=C3=B6s=20effe?= =?UTF-8?q?ct)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../functions/fnc_calculate_range_card.sqf | 2 +- .../fnc_calculate_scope_base_angle.sqf | 2 +- .../functions/fnc_calculate_solution.sqf | 35 +++++++++++++------ .../fnc_calculate_target_solution.sqf | 2 +- .../functions/fnc_update_zero_range.sqf | 2 +- 5 files changed, 28 insertions(+), 15 deletions(-) diff --git a/addons/atragmx/functions/fnc_calculate_range_card.sqf b/addons/atragmx/functions/fnc_calculate_range_card.sqf index c11cf90550..f3f27f7d3e 100644 --- a/addons/atragmx/functions/fnc_calculate_range_card.sqf +++ b/addons/atragmx/functions/fnc_calculate_range_card.sqf @@ -77,4 +77,4 @@ GVAR(rangeCardData) = []; private ["_result"]; _result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, - [_windSpeed1, _windSpeed2], _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, true, _stabilityFactor, _twistDirection, _latitude] call FUNC(calculate_solution); + [_windSpeed1, _windSpeed2], _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, true, _stabilityFactor, _twistDirection, _latitude, _directionOfFire] call FUNC(calculate_solution); diff --git a/addons/atragmx/functions/fnc_calculate_scope_base_angle.sqf b/addons/atragmx/functions/fnc_calculate_scope_base_angle.sqf index 76c54f63a9..fbd191bb79 100644 --- a/addons/atragmx/functions/fnc_calculate_scope_base_angle.sqf +++ b/addons/atragmx/functions/fnc_calculate_scope_base_angle.sqf @@ -35,6 +35,6 @@ _barometricPressure = 1013.25; _relativeHumidity = 0; private ["_result"]; -_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, [0, 0], 0, 0, 0, _zeroRange, _airFriction, 1, "ICAO", false, 1.5, 0, 0] call FUNC(calculate_solution); +_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, [0, 0], 0, 0, 0, _zeroRange, _airFriction, 1, "ICAO", false, 1.5, 0, 0, 0] call FUNC(calculate_solution); _scopeBaseAngle + (_result select 0) / 60 diff --git a/addons/atragmx/functions/fnc_calculate_solution.sqf b/addons/atragmx/functions/fnc_calculate_solution.sqf index 2d70e8dca1..f90b299ce9 100644 --- a/addons/atragmx/functions/fnc_calculate_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_solution.sqf @@ -43,7 +43,7 @@ */ #include "script_component.hpp" -private ["_scopeBaseAngle", "_bulletMass", "_boreHeight", "_airFriction", "_muzzleVelocity", "_temperature", "_barometricPressure", "_relativeHumidity", "_simSteps", "_windSpeed1", "_windSpeed2", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange", "_drag", "_bc", "_dragModel", "_atmosphereModel", "_storeRangeCardData", "_stabilityFactor", "_twistDirection", "_latitude"]; +private ["_scopeBaseAngle", "_bulletMass", "_boreHeight", "_airFriction", "_muzzleVelocity", "_temperature", "_barometricPressure", "_relativeHumidity", "_simSteps", "_windSpeed1", "_windSpeed2", "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange", "_drag", "_bc", "_dragModel", "_atmosphereModel", "_storeRangeCardData", "_stabilityFactor", "_twistDirection", "_latitude", "_directionOfFire"]; _scopeBaseAngle = _this select 0; _bulletMass = _this select 1; _boreHeight = _this select 2; @@ -66,6 +66,7 @@ _storeRangeCardData = _this select 17; _stabilityFactor = _this select 18; _twistDirection = _this select 19; _latitude = _this select 20; +_directionOfFire = _this select 21; private ["_bulletPos", "_bulletVelocity", "_bulletAccel", "_bulletSpeed", "_gravity", "_deltaT"]; _bulletPos = [0, 0, 0]; @@ -114,6 +115,12 @@ _speedTotal = 0; _stepsTotal = 0; _speedAverage = 0; +private ["_eoetvoesMultiplier"]; +_eoetvoesMultiplier = 0; +if (missionNamespace getVariable [QEGVAR(advanced_ballistics,EoetvoesEnabled), false]) then { + _eoetvoesMultiplier = 2 * (0.0000729 * _muzzleVelocity / -9.80665) * cos(_latitude) * sin(_directionOfFire); +}; + _TOF = 0; _bulletPos set [0, 0]; @@ -169,16 +176,19 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do { _kineticEnergy = 0.5 * (_bulletMass / 1000 * (_bulletSpeed ^ 2)); _kineticEnergy = _kineticEnergy * 0.737562149; - if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,CoriolisEnabled), false])) then { - if ((_bulletPos select 1) > 0) then { + if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (_bulletPos select 1) > 0) then { + if (missionNamespace getVariable [QEGVAR(advanced_ballistics,CoriolisEnabled), false]) then { _horizontalDeflection = 0.0000729 * ((_bulletPos select 1) ^ 2) * sin(_latitude) / _speedAverage; _horizontalCoriolis = - atan(_horizontalDeflection / (_bulletPos select 1)); _windage1 = _windage1 + _horizontalCoriolis; _windage2 = _windage2 + _horizontalCoriolis; }; - }; - if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,SpinDriftEnabled), false])) then { - if ((_bulletPos select 1) > 0) then { + if (missionNamespace getVariable [QEGVAR(advanced_ballistics,EoetvoesEnabled), false]) then { + _verticalDeflection = (_bulletPos select 2) * _eoetvoesMultiplier; + _verticalCoriolis = - atan(_verticalDeflection / (_bulletPos select 1)); + _elevation = _elevation + _verticalCoriolis; + }; + if (missionNamespace getVariable [QEGVAR(advanced_ballistics,SpinDriftEnabled), false]) then { _spinDeflection = _twistDirection * 0.0254 * 1.25 * (_stabilityFactor + 1.2) * _TOF ^ 1.83; _spinDrift = - atan(_spinDeflection / (_bulletPos select 1)); _windage1 = _windage1 + _spinDrift; @@ -206,16 +216,19 @@ if (_targetRange != 0) then { _kineticEnergy = 0.5 * (_bulletMass / 1000 * (_bulletSpeed ^ 2)); _kineticEnergy = _kineticEnergy * 0.737562149; -if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,CoriolisEnabled), false])) then { - if ((_bulletPos select 1) > 0) then { +if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (_bulletPos select 1) > 0) then { + if (missionNamespace getVariable [QEGVAR(advanced_ballistics,CoriolisEnabled), false]) then { _horizontalDeflection = 0.0000729 * ((_bulletPos select 1) ^ 2) * sin(_latitude) / _speedAverage; _horizontalCoriolis = - atan(_horizontalDeflection / (_bulletPos select 1)); _windage1 = _windage1 + _horizontalCoriolis; _windage2 = _windage2 + _horizontalCoriolis; }; -}; -if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,SpinDriftEnabled), false])) then { - if ((_bulletPos select 1) > 0) then { + if (missionNamespace getVariable [QEGVAR(advanced_ballistics,EoetvoesEnabled), false]) then { + _verticalDeflection = (_bulletPos select 2) * _eoetvoesMultiplier; + _verticalCoriolis = - atan(_verticalDeflection / (_bulletPos select 1)); + _elevation = _elevation + _verticalCoriolis; + }; + if (missionNamespace getVariable [QEGVAR(advanced_ballistics,SpinDriftEnabled), false]) then { _spinDeflection = _twistDirection * 0.0254 * 1.25 * (_stabilityFactor + 1.2) * _TOF ^ 1.83; _spinDrift = - atan(_spinDeflection / (_bulletPos select 1)); _windage1 = _windage1 + _spinDrift; diff --git a/addons/atragmx/functions/fnc_calculate_target_solution.sqf b/addons/atragmx/functions/fnc_calculate_target_solution.sqf index c8a3683498..641551fca1 100644 --- a/addons/atragmx/functions/fnc_calculate_target_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_target_solution.sqf @@ -72,7 +72,7 @@ _targetRange = GVAR(targetRange) select GVAR(currentTarget); private ["_result"]; _result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, - [_windSpeed1, _windSpeed2], _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, false, _stabilityFactor, _twistDirection, _latitude] call FUNC(calculate_solution); + [_windSpeed1, _windSpeed2], _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, false, _stabilityFactor, _twistDirection, _latitude, _directionOfFire] call FUNC(calculate_solution); GVAR(elevationOutput) set [GVAR(currentTarget), _result select 0]; GVAR(windage1Output) set [GVAR(currentTarget), (_result select 1) select 0]; diff --git a/addons/atragmx/functions/fnc_update_zero_range.sqf b/addons/atragmx/functions/fnc_update_zero_range.sqf index a5cab3755e..299c321d33 100644 --- a/addons/atragmx/functions/fnc_update_zero_range.sqf +++ b/addons/atragmx/functions/fnc_update_zero_range.sqf @@ -44,7 +44,7 @@ _barometricPressure = GVAR(barometricPressure); _relativeHumidity = GVAR(relativeHumidity); private ["_result"]; -_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, [0, 0], 0, 0, 0, _zeroRange, _bc, _dragModel, _atmosphereModel, false, 1.5, 0, 0] call FUNC(calculate_solution); +_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, [0, 0], 0, 0, 0, _zeroRange, _bc, _dragModel, _atmosphereModel, false, 1.5, 0, 0, 0] call FUNC(calculate_solution); GVAR(workingMemory) set [2, _zeroRange]; GVAR(workingMemory) set [3, _scopeBaseAngle + (_result select 0) / 60]; From 6c8b58789024df653d90e4502cb895c48114f2a0 Mon Sep 17 00:00:00 2001 From: Tachii Date: Mon, 20 Apr 2015 00:02:01 +0300 Subject: [PATCH 296/305] Update stringtable.xml --- addons/medical/stringtable.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index cf6e4515b3..06361528e3 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -1547,7 +1547,7 @@ Very lightly wounded Sehr leicht verwundet: B. lekko ranny - Незначительные ранения + Царапины Ferito lievemente Muy levemente herido Très légèrement blessé From 20293bd11b4b36c8e6c3ebc51429935f60d1644b Mon Sep 17 00:00:00 2001 From: Tachii Date: Mon, 20 Apr 2015 00:26:20 +0300 Subject: [PATCH 297/305] Update stringtable.xml --- addons/medical/stringtable.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 06361528e3..e85283c471 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -1610,7 +1610,7 @@ Pain Effect Type Schmerzeffekt-Typ Rodzaj efektu bólu - Тип эффекта боли + Визуальный эффект боли Pain Effect Type Tipo de efecto de dolor Type d'effet de douleur From f928f37e264bdbb7b476e1c4a5d9f8d958a0d7b3 Mon Sep 17 00:00:00 2001 From: esteldunedain Date: Mon, 20 Apr 2015 01:16:51 -0300 Subject: [PATCH 298/305] Eliminate interact_menu fps drops due to high nearby object counts. Instead of reanalizing every frame which actions points should be rendered based on distance, that job is now done only 5 times per second. The rest of the frames the action points from the last frame are rerendered.. Close #434 --- addons/interact_menu/XEH_preInit.sqf | 3 +++ .../interact_menu/functions/fnc_keyDown.sqf | 1 + .../functions/fnc_renderActionPoints.sqf | 19 +++++++++++++++++-- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/addons/interact_menu/XEH_preInit.sqf b/addons/interact_menu/XEH_preInit.sqf index b4a3504cdd..747da7083e 100644 --- a/addons/interact_menu/XEH_preInit.sqf +++ b/addons/interact_menu/XEH_preInit.sqf @@ -49,4 +49,7 @@ GVAR(expandedTime) = diag_tickTime; GVAR(iconCtrls) = []; GVAR(iconCount) = 0; +GVAR(foundActions) = []; +GVAR(lastTimeSearchedActions) = -1000; + ADDON = true; diff --git a/addons/interact_menu/functions/fnc_keyDown.sqf b/addons/interact_menu/functions/fnc_keyDown.sqf index 47fdfb1951..123c1d45e2 100644 --- a/addons/interact_menu/functions/fnc_keyDown.sqf +++ b/addons/interact_menu/functions/fnc_keyDown.sqf @@ -29,6 +29,7 @@ if (_menuType == 0) then { }; GVAR(keyDownTime) = diag_tickTime; GVAR(openedMenuType) = _menuType; +GVAR(lastTimeSearchedActions) = -1000; GVAR(useCursorMenu) = (vehicle ACE_player != ACE_player) || visibleMap || diff --git a/addons/interact_menu/functions/fnc_renderActionPoints.sqf b/addons/interact_menu/functions/fnc_renderActionPoints.sqf index 6ed4b41de4..78d5418e5a 100644 --- a/addons/interact_menu/functions/fnc_renderActionPoints.sqf +++ b/addons/interact_menu/functions/fnc_renderActionPoints.sqf @@ -24,6 +24,9 @@ _fnc_renderNearbyActions = { _cameraPos = (positionCameraToWorld [0, 0, 0]) call EFUNC(common,positionToASL); _cameraDir = ((positionCameraToWorld [0, 0, 1]) call EFUNC(common,positionToASL)) vectorDiff _cameraPos; + GVAR(foundActions) = []; + GVAR(lastTimeSearchedActions) = diag_tickTime; + _numInteractObjects = 0; _nearestObjects = nearestObjects [ACE_player, ["All"], 13]; { @@ -46,6 +49,7 @@ _fnc_renderNearbyActions = { _action = _x; if ([_target, _action] call FUNC(renderBaseMenu)) then { _numInteractions = _numInteractions + 1; + GVAR(foundActions) pushBack [_target, _action]; }; }; } forEach GVAR(objectActionList); @@ -57,6 +61,7 @@ _fnc_renderNearbyActions = { // Try to render the menu if ([_target, _action] call FUNC(renderBaseMenu)) then { _numInteractions = _numInteractions + 1; + GVAR(foundActions) pushBack [_target, _action]; }; } forEach _classActions; @@ -71,7 +76,11 @@ _fnc_renderNearbyActions = { } forEach _nearestObjects; }; - +_fnc_renderLastFrameActions = { + { + _x call FUNC(renderBaseMenu); + } forEach GVAR(foundActions); +}; _fnc_renderSelfActions = { _target = _this; @@ -109,7 +118,13 @@ _fnc_renderSelfActions = { if (GVAR(openedMenuType) == 0) then { if (vehicle ACE_player == ACE_player) then { - call _fnc_renderNearbyActions; + if (diag_tickTime > GVAR(lastTimeSearchedActions) + 0.20) then { + // Once every 0.2 secs, collect nearby objects active and visible action points and render them + call _fnc_renderNearbyActions; + } else { + // The rest of the frames just draw the same action points rendered the last frame + call _fnc_renderLastFrameActions; + }; } else { (vehicle ACE_player) call _fnc_renderSelfActions; }; From 8ff72e7fc8e17ec740bc74e9341a8e4c7a1bcdc8 Mon Sep 17 00:00:00 2001 From: ulteq Date: Mon, 20 Apr 2015 10:35:29 +0200 Subject: [PATCH 299/305] Fixed another bug in the unit conversion code --- addons/atragmx/functions/fnc_update_gun_ammo_data.sqf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf b/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf index 3627197185..94801cad39 100644 --- a/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf +++ b/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf @@ -47,10 +47,10 @@ if (GVAR(currentUnit) != 2) then { } else { ctrlSetText [120050, Str(Round(GVAR(workingMemory) select 1))]; }; -if (GVAR(currentUnit) == 2) then { - ctrlSetText [120060, Str(Round(GVAR(workingMemory) select 2))]; -} else { +if (GVAR(currentUnit) == 1) then { ctrlSetText [120060, Str(Round((GVAR(workingMemory) select 2) * 1.0936133))]; +} else { + ctrlSetText [120060, Str(Round(GVAR(workingMemory) select 2))]; }; if (GVAR(currentUnit) == 2) then { From 2bf47ca0c4777d8282be3f1b7ff4c782ca20d3f1 Mon Sep 17 00:00:00 2001 From: ulteq Date: Mon, 20 Apr 2015 10:36:20 +0200 Subject: [PATCH 300/305] Added two more asterix (*) meter indicator GUI elements --- addons/atragmx/RscTitles.hpp | 14 ++++++++++++++ .../atragmx/functions/fnc_show_gun_ammo_data.sqf | 2 +- addons/atragmx/functions/fnc_show_target_data.sqf | 2 +- .../atragmx/functions/fnc_update_gun_ammo_data.sqf | 5 +++++ .../atragmx/functions/fnc_update_target_data.sqf | 5 +++++ 5 files changed, 26 insertions(+), 2 deletions(-) diff --git a/addons/atragmx/RscTitles.hpp b/addons/atragmx/RscTitles.hpp index 905212d5c9..fe45ef67f5 100644 --- a/addons/atragmx/RscTitles.hpp +++ b/addons/atragmx/RscTitles.hpp @@ -1115,6 +1115,13 @@ class ATragMX_Display { idc=120060; y=0.265*safezoneH+safezoneY+0.520; }; + class TEXT_GUN_AMMO_DATA_ZERO_RANGE_METER_INDICATOR: TEXT_GUN_AMMO_DATA_BORE_HEIGHT { + idc=120061; + w=0.05; + x=0.550*safezoneW+safezoneX+0.315; + y=0.265*safezoneH+safezoneY+0.520; + text=""; + }; class TEXT_GUN_AMMO_DATA_DONE: TEXT_TARGET_SPEED_ASSIST_DONE { idc=12008; action=QUOTE(1 call FUNC(toggle_gun_ammo_data)); @@ -1327,6 +1334,13 @@ class ATragMX_Display { idc=140060; y=0.265*safezoneH+safezoneY+0.520; }; + class TEXT_TARGET_DATA_TARGET_RANGE_METER_INDICATOR: TEXT_TARGET_DATA_LATITUDE { + idc=140061; + w=0.05; + x=0.550*safezoneW+safezoneX+0.315; + y=0.265*safezoneH+safezoneY+0.520; + text=""; + }; class TEXT_TARGET_DATA_DONE: TEXT_TARGET_SPEED_ASSIST_DONE { idc=14008; action=QUOTE(1 call FUNC(toggle_target_data)); diff --git a/addons/atragmx/functions/fnc_show_gun_ammo_data.sqf b/addons/atragmx/functions/fnc_show_gun_ammo_data.sqf index 06ab20b3b7..dfab6da238 100644 --- a/addons/atragmx/functions/fnc_show_gun_ammo_data.sqf +++ b/addons/atragmx/functions/fnc_show_gun_ammo_data.sqf @@ -17,7 +17,7 @@ GVAR(showGunAmmoData) = _this; -{ctrlShow [_x, _this]} forEach [12000, 120000, 12001, 120010, 12002, 120020, 12003, 120030, 12004, 120040, 12005, 120050, 12006, 120060, 12007, 12008, 12009, 12010, 12011]; +{ctrlShow [_x, _this]} forEach [12000, 120000, 12001, 120010, 12002, 120020, 12003, 120030, 12004, 120040, 12005, 120050, 12006, 120060, 120061, 12007, 12008, 12009, 12010, 12011]; if (_this) then { [] call FUNC(update_gun_ammo_data); diff --git a/addons/atragmx/functions/fnc_show_target_data.sqf b/addons/atragmx/functions/fnc_show_target_data.sqf index 4e696ae331..48e419f65f 100644 --- a/addons/atragmx/functions/fnc_show_target_data.sqf +++ b/addons/atragmx/functions/fnc_show_target_data.sqf @@ -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, 14007, 14008, 14009, 14010, 14011]; +{ctrlShow [_x, _this]} forEach [14000, 140000, 14001, 140010, 14002, 141020, 140020, 141021, 140021, 14003, 140030, 14004, 140040, 141040, 141041, 140041, 14005, 140050, 14006, 140060, 140061, 14007, 14008, 14009, 14010, 14011]; if (_this) then { [] call FUNC(update_target_data); diff --git a/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf b/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf index 94801cad39..4ccae287e7 100644 --- a/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf +++ b/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf @@ -52,6 +52,11 @@ if (GVAR(currentUnit) == 1) then { } else { ctrlSetText [120060, Str(Round(GVAR(workingMemory) select 2))]; }; +if (GVAR(currentUnit) == 0) then { + ctrlSetText [120061, "*"]; +} else { + ctrlSetText [120061, ""]; +}; if (GVAR(currentUnit) == 2) then { ctrlSetText [12000, "Bore (cm)"]; diff --git a/addons/atragmx/functions/fnc_update_target_data.sqf b/addons/atragmx/functions/fnc_update_target_data.sqf index 733118d583..b5e6dcf85a 100644 --- a/addons/atragmx/functions/fnc_update_target_data.sqf +++ b/addons/atragmx/functions/fnc_update_target_data.sqf @@ -37,6 +37,11 @@ if (GVAR(currentUnit) == 1) then { } else { ctrlSetText [140060, Str(Round((GVAR(targetRange) select GVAR(currentTarget))))]; }; +if (GVAR(currentUnit) == 0) then { + ctrlSetText [140061, "*"]; +} else { + ctrlSetText [140061, ""]; +}; if (GVAR(currentUnit) == 2) then { ctrlSetText [14002, "Wind Speed (m/s)"]; From c049ee5c08308f6355db086ab91a16619bf75487 Mon Sep 17 00:00:00 2001 From: ulteq Date: Mon, 20 Apr 2015 11:02:28 +0200 Subject: [PATCH 301/305] Fixed incorrect .408 Chey Tac airFriction value --- addons/atragmx/XEH_postInit.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/atragmx/XEH_postInit.sqf b/addons/atragmx/XEH_postInit.sqf index 574b5a8991..242b9dcbe8 100644 --- a/addons/atragmx/XEH_postInit.sqf +++ b/addons/atragmx/XEH_postInit.sqf @@ -13,7 +13,7 @@ if ((profileNamespace getVariable ["ACE_ATragMX_profileNamespaceVersion", 0]) == ["12.7x54mm" , 300, 100, 0.3394, -0.0014000, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 24.13, 1.050, 1, "ASM" ], - [".408 Chey Tac" , 910, 100, 0.0569, -0.0004800, 3.81, 0, 2, 10, 120, 0, 0, 27.15, 10.4, 33.02, 0.970, 1, "ASM" ], + [".408 Chey Tac" , 910, 100, 0.0571, -0.0003950, 3.81, 0, 2, 10, 120, 0, 0, 27.15, 10.4, 33.02, 0.970, 1, "ASM" ], ["9.3×64mm" , 870, 100, 0.0619, -0.0007500, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 9.30, 35.56, 0.368, 1, "ASM" ], From de0414803ec7649d18aed45e481c05b14f8d6d3b Mon Sep 17 00:00:00 2001 From: ulteq Date: Mon, 20 Apr 2015 11:08:28 +0200 Subject: [PATCH 302/305] Fixed some more airFriction values in the ATragMX gun list --- addons/atragmx/XEH_postInit.sqf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/atragmx/XEH_postInit.sqf b/addons/atragmx/XEH_postInit.sqf index 242b9dcbe8..7f047834e2 100644 --- a/addons/atragmx/XEH_postInit.sqf +++ b/addons/atragmx/XEH_postInit.sqf @@ -6,16 +6,16 @@ if ((profileNamespace getVariable ["ACE_ATragMX_profileNamespaceVersion", 0]) == GVAR(gunList) = profileNamespace getVariable "ACE_ATragMX_gunList"; } else { // Profile Name, Muzzle Velocity, Zero Range, Scope Base Angle, AirFriction, Bore Height, Scope Unit, Scope Click Unit, Scope Click Number, Maximum Elevation, Dialed Elevation, Dialed Windage, Mass, Bullet Diameter, Rifle Twist, BC, Drag Model, Atmosphere Model - GVAR(gunList) = [["12.7x108mm" , 820, 100, 0.0659, -0.0008600, 3.81, 0, 2, 10, 120, 0, 0, 48.28, 12.7, 38.10, 0.630, 1, "ASM" ], + GVAR(gunList) = [["12.7x108mm" , 820, 100, 0.0657, -0.0006400, 3.81, 0, 2, 10, 120, 0, 0, 48.28, 12.7, 38.10, 0.630, 1, "ASM" ], - ["12.7x99mm AMAX" , 860, 100, 0.0612, -0.0008600, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 38.10, 1.050, 1, "ASM" ], - ["12.7x99mm" , 853, 100, 0.0623, -0.0008600, 3.81, 0, 2, 10, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM" ], + ["12.7x99mm AMAX" , 860, 100, 0.0612, -0.0003740, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 38.10, 1.050, 1, "ASM" ], + ["12.7x99mm" , 853, 100, 0.0623, -0.0006000, 3.81, 0, 2, 10, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM" ], - ["12.7x54mm" , 300, 100, 0.3394, -0.0014000, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 24.13, 1.050, 1, "ASM" ], + ["12.7x54mm" , 300, 100, 0.3395, -0.0001400, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 24.13, 1.050, 1, "ASM" ], [".408 Chey Tac" , 910, 100, 0.0571, -0.0003950, 3.81, 0, 2, 10, 120, 0, 0, 27.15, 10.4, 33.02, 0.970, 1, "ASM" ], - ["9.3×64mm" , 870, 100, 0.0619, -0.0007500, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 9.30, 35.56, 0.368, 1, "ASM" ], + ["9.3×64mm" , 870, 100, 0.0619, -0.0010600, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 9.30, 35.56, 0.368, 1, "ASM" ], [".338LM 250gr" , 880, 100, 0.0598, -0.0006060, 3.81, 0, 2, 10, 120, 0, 0, 16.20, 8.58, 25.40, 0.322, 7, "ICAO"], [".338LM 300gr" , 800, 100, 0.0677, -0.0005350, 3.81, 0, 2, 10, 120, 0, 0, 19.44, 8.58, 25.40, 0.381, 7, "ICAO"], From 0e08fd4457d1cc5fb2a79235a5ff0637998e7287 Mon Sep 17 00:00:00 2001 From: ulteq Date: Mon, 20 Apr 2015 11:09:12 +0200 Subject: [PATCH 303/305] Incremented the ATragMX profile namespace version --- addons/atragmx/script_component.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/atragmx/script_component.hpp b/addons/atragmx/script_component.hpp index 7cd5b44911..6e81f79493 100644 --- a/addons/atragmx/script_component.hpp +++ b/addons/atragmx/script_component.hpp @@ -11,4 +11,4 @@ #include "\z\ace\addons\main\script_macros.hpp" -#define ATRAGMX_PROFILE_NAMESPACE_VERSION 1.1 +#define ATRAGMX_PROFILE_NAMESPACE_VERSION 1.2 From 6c2982548fe70a0dcd8b47be50fff89a0e30b8f4 Mon Sep 17 00:00:00 2001 From: ulteq Date: Mon, 20 Apr 2015 12:35:08 +0200 Subject: [PATCH 304/305] Fixed incorrect function header --- .../advanced_ballistics/functions/fnc_calculateAirDensity.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/advanced_ballistics/functions/fnc_calculateAirDensity.sqf b/addons/advanced_ballistics/functions/fnc_calculateAirDensity.sqf index ea7a77e837..298049e51d 100644 --- a/addons/advanced_ballistics/functions/fnc_calculateAirDensity.sqf +++ b/addons/advanced_ballistics/functions/fnc_calculateAirDensity.sqf @@ -1,7 +1,7 @@ /* * Author: Ruthberg * - * Displays a wind info (colored arrow) in the top left corner of the screen + * Calculates the air density * * Arguments: * 0: temperature - degrees celcius From 89e33dc177dd43fe2e8c66ade92aec786f39548f Mon Sep 17 00:00:00 2001 From: ulteq Date: Mon, 20 Apr 2015 13:54:22 +0200 Subject: [PATCH 305/305] Refactored the weather module: * No changes in functionality --- addons/advanced_ballistics/XEH_preInit.sqf | 1 - .../fnc_calculateAtmosphericCorrection.sqf | 2 +- .../functions/fnc_handleFired.sqf | 6 +- .../kestrel4500/functions/fnc_collectData.sqf | 4 +- .../functions/fnc_generateOutputData.sqf | 2 +- addons/weather/XEH_postInit.sqf | 99 +++++++------------ addons/weather/XEH_preInit.sqf | 40 ++------ .../functions/fnc_calculateAirDensity.sqf | 36 +++++++ .../fnc_calculateBarometricPressure.sqf | 20 ++++ .../weather/functions/fnc_displayWindInfo.sqf | 1 + addons/weather/functions/fnc_getMapData.sqf | 4 + addons/weather/functions/fnc_getWind.sqf | 1 + .../functions/fnc_serverController.sqf | 1 + .../weather/functions/fnc_updateHumidity.sqf | 28 ++++++ addons/weather/functions/fnc_updateRain.sqf | 26 +++++ .../functions/fnc_updateTemperature.sqf | 22 +++++ addons/weather/functions/fnc_updateWind.sqf | 21 ++++ addons/weather/script_component.hpp | 8 ++ 18 files changed, 217 insertions(+), 105 deletions(-) create mode 100644 addons/weather/functions/fnc_calculateAirDensity.sqf create mode 100644 addons/weather/functions/fnc_calculateBarometricPressure.sqf create mode 100644 addons/weather/functions/fnc_updateHumidity.sqf create mode 100644 addons/weather/functions/fnc_updateRain.sqf create mode 100644 addons/weather/functions/fnc_updateTemperature.sqf create mode 100644 addons/weather/functions/fnc_updateWind.sqf diff --git a/addons/advanced_ballistics/XEH_preInit.sqf b/addons/advanced_ballistics/XEH_preInit.sqf index b58a2b88e8..1d19a9c492 100644 --- a/addons/advanced_ballistics/XEH_preInit.sqf +++ b/addons/advanced_ballistics/XEH_preInit.sqf @@ -2,7 +2,6 @@ ADDON = false; -PREP(calculateAirDensity); PREP(calculateAmmoTemperatureVelocityShift); PREP(calculateAtmosphericCorrection); PREP(calculateBarrelLengthVelocityShift); diff --git a/addons/advanced_ballistics/functions/fnc_calculateAtmosphericCorrection.sqf b/addons/advanced_ballistics/functions/fnc_calculateAtmosphericCorrection.sqf index 02e849399e..b0166109f5 100644 --- a/addons/advanced_ballistics/functions/fnc_calculateAtmosphericCorrection.sqf +++ b/addons/advanced_ballistics/functions/fnc_calculateAtmosphericCorrection.sqf @@ -24,7 +24,7 @@ _pressure = _this select 2; // in hPa _relativeHumidity = _this select 3; // as ratio 0-1 _atmosphereModel = _this select 4; // "ICAO" or "ASM" -_airDensity = [_temperature, _pressure, _relativeHumidity] call FUNC(calculateAirDensity); +_airDensity = [_temperature, _pressure, _relativeHumidity] call EFUNC(weather,calculateAirDensity); if (_atmosphereModel == "ICAO") then { (STD_AIR_DENSITY_ICAO / _airDensity) * _ballisticCoefficient diff --git a/addons/advanced_ballistics/functions/fnc_handleFired.sqf b/addons/advanced_ballistics/functions/fnc_handleFired.sqf index baa3a871fa..54a7f2d5b0 100644 --- a/addons/advanced_ballistics/functions/fnc_handleFired.sqf +++ b/addons/advanced_ballistics/functions/fnc_handleFired.sqf @@ -110,7 +110,7 @@ _stabilityFactor = 1.5; if (_caliber > 0 && _bulletLength > 0 && _bulletMass > 0 && _barrelTwist > 0) then { _temperature = GET_TEMPERATURE_AT_HEIGHT((getPosASL _unit) select 2); - _barometricPressure = 1013.25 * exp(-(EGVAR(weather,Altitude) + ((getPosASL _bullet) select 2)) / 7990) - 10 * overcast; + _barometricPressure = ((getPosASL _bullet) select 2) call EFUNC(weather,calculateBarometricPressure); _stabilityFactor = [_caliber, _bulletLength, _bulletMass, _barrelTwist, _muzzleVelocity, _temperature, _barometricPressure] call FUNC(calculateStabilityFactor); }; @@ -288,7 +288,7 @@ if (GVAR(AdvancedAirDragEnabled)) then { }; if (GVAR(AtmosphericDensitySimulationEnabled)) then { - _pressure = 1013.25 * exp(-(EGVAR(weather,Altitude) + (_bulletPosition select 2)) / 7990) - 10 * overcast; + _pressure = (_bulletPosition select 2) call EFUNC(weather,calculateBarometricPressure); _temperature = GET_TEMPERATURE_AT_HEIGHT(_bulletPosition select 2); _humidity = EGVAR(weather,currentHumidity); _airDensity = STD_AIR_DENSITY_ICAO; @@ -315,7 +315,7 @@ if (GVAR(AdvancedAirDragEnabled)) then { _bulletVelocity = _bulletVelocity vectorDiff _accel; } else { if (GVAR(AtmosphericDensitySimulationEnabled)) then { - _pressureDeviation = 1013.25 * exp(-(EGVAR(weather,Altitude) + (_bulletPosition select 2)) / 7990) - 1013.25 - 10 * overcast; + _pressureDeviation = (_bulletPosition select 2) call EFUNC(weather,calculateBarometricPressure) - 1013.25; _temperature = GET_TEMPERATURE_AT_HEIGHT(_bulletPosition select 2); _humidity = EGVAR(weather,currentHumidity); _airFriction = _airFriction + ((_temperature - 15) * 0.0000015 + _humidity * 0.0000040 + _pressureDeviation * -0.0000009); diff --git a/addons/kestrel4500/functions/fnc_collectData.sqf b/addons/kestrel4500/functions/fnc_collectData.sqf index 8ebd4e01d2..bbad8619bc 100644 --- a/addons/kestrel4500/functions/fnc_collectData.sqf +++ b/addons/kestrel4500/functions/fnc_collectData.sqf @@ -19,7 +19,7 @@ private ["_playerDir", "_windSpeed", "_windDir", "_crosswind", "_headwind", "_hu if (isNil QGVAR(MIN) || isNil QGVAR(MAX)) then { _temperature = GET_TEMPERATURE_AT_HEIGHT((getPosASL ACE_player) select 2); _humidity = EGVAR(weather,currentHumidity); - _barometricPressure = 1013.25 * exp(-(EGVAR(weather,Altitude) + ((getPosASL ACE_player) select 2)) / 7990) - 10 * overcast; + _barometricPressure = ((getPosASL ACE_player) select 2) call EFUNC(weather,calculateBarometricPressure); _altitude = EGVAR(weather,Altitude) + ((getPosASL ACE_player) select 2); GVAR(MIN) = [0, 0, 0, 0, _temperature, _humidity, _barometricPressure, _altitude]; GVAR(MAX) = [0, 0, 0, 0, _temperature, _humidity, _barometricPressure, _altitude]; @@ -82,7 +82,7 @@ GVAR(MAX) set [5, _humidity max (GVAR(MAX) select 5)]; GVAR(TOTAL) set [5, (GVAR(TOTAL) select 5) + _humidity]; // BARO -_barometricPressure = 1013.25 * exp(-(EGVAR(weather,Altitude) + ((getPosASL ACE_player) select 2)) / 7990) - 10 * overcast; +_barometricPressure = ((getPosASL ACE_player) select 2) call EFUNC(weather,calculateBarometricPressure); GVAR(MIN) set [6, (GVAR(MIN) select 6) min _barometricPressure]; GVAR(MAX) set [6, _barometricPressure max (GVAR(MAX) select 6)]; GVAR(TOTAL) set [6, (GVAR(TOTAL) select 6) + _barometricPressure]; diff --git a/addons/kestrel4500/functions/fnc_generateOutputData.sqf b/addons/kestrel4500/functions/fnc_generateOutputData.sqf index 3e392bd55b..3f5e77b748 100644 --- a/addons/kestrel4500/functions/fnc_generateOutputData.sqf +++ b/addons/kestrel4500/functions/fnc_generateOutputData.sqf @@ -174,7 +174,7 @@ switch (GVAR(Menu)) do { }; case 6: { // BARO if (!GVAR(MinAvgMax)) then { - _textCenterBig = Str(round((1013.25 * exp(-(EGVAR(weather,Altitude) + ((getPosASL ACE_player) select 2)) / 7990) - 10 * overcast) * 10) / 10); + _textCenterBig = Str(round((((getPosASL ACE_player) select 2) call EFUNC(weather,calculateBarometricPressure)) * 10) / 10); } else { _textCenterLine1Left = "Min"; _textCenterLine2Left = "Avg"; diff --git a/addons/weather/XEH_postInit.sqf b/addons/weather/XEH_postInit.sqf index 9276e710da..e40a061aaf 100644 --- a/addons/weather/XEH_postInit.sqf +++ b/addons/weather/XEH_postInit.sqf @@ -1,6 +1,36 @@ -//XEH_postInit.sqf -//#define DEBUG_MODE_FULL #include "script_component.hpp" + +// Rain variables +GVAR(enableRain) = true; +GVAR(rain_next_period) = -1; +GVAR(rain_period_count) = 0; +GVAR(rain_initial_rain) = 0; +if(overcast >= 0.7) then { + GVAR(rain_initial_rain) = (random ((overcast-0.7)/0.3)); +}; +GVAR(current_rain) = GVAR(rain_initial_rain); +GVAR(rain_current_range) = -1+(random 2); +GVAR(overcast_multiplier) = 1; + +// Wind Variables +ACE_wind = [0, 0, 0]; +GVAR(wind_initial_dir) = (random 360); +GVAR(wind_initial_speed) = (overcast*5)+(random (overcast*5)) max 1; +GVAR(wind_mean_speed) = GVAR(wind_initial_speed); +GVAR(wind_mean_dir) = GVAR(wind_initial_dir); +GVAR(wind_current_speed) = GVAR(wind_initial_speed); +GVAR(wind_current_dir) = GVAR(wind_initial_dir); +GVAR(wind_current_range_speed) = -1+(random 2); +GVAR(wind_current_range_dir) = -1+(random 2); +GVAR(wind_next_period) = -1; //ceil((2+random(5))/(GVAR(overcast_multiplier)/10)); +GVAR(wind_next_major_period) = -1; +GVAR(wind_period_count) = 0; +GVAR(wind_major_period_count) = 0; +GVAR(wind_total_time) = 0; +GVAR(wind_period_start_time) = time; + +call FUNC(getMapData); + "ACE_WIND_PARAMS" addPublicVariableEventHandler { GVAR(wind_period_start_time) = time; }; "ACE_RAIN_PARAMS" addPublicVariableEventHandler { GVAR(rain_period_start_time) = time; }; "ACE_MISC_PARAMS" addPublicVariableEventHandler { @@ -22,66 +52,9 @@ {false}, [37, [true, false, false]], false, 0] call CBA_fnc_addKeybind; // (SHIFT + K) -// Update Wind simulWeatherSync; -_fnc_updateWind = { - ACE_wind = [] call FUNC(getWind); - setWind [ACE_wind select 0, ACE_wind select 1, true]; - 2 setGusts 0; - // Set waves: 0 when no wind, 1 when wind >= 16 m/s - 1 setWaves (((vectorMagnitude ACE_wind) / 16.0) min 1.0); - - //systemChat format ["w:%1 %2,ACE_w:%1 %2, w", [wind select 0, wind select 1, ACE_wind select 0, ACE_wind select 1]]; -}; -[_fnc_updateWind, 1, []] call CBA_fnc_addPerFrameHandler; - - -// Update Rain -_fnc_updateRain = { - private ["_oldStrength","_rainStrength","_transitionTime","_periodPosition","_periodPercent"]; - if(GVAR(enableRain)) then { - if(!isNil "ACE_RAIN_PARAMS" && {!isNil QGVAR(rain_period_start_time)}) then { - _oldStrength = ACE_RAIN_PARAMS select 0; - _rainStrength = ACE_RAIN_PARAMS select 1; - _transitionTime = ACE_RAIN_PARAMS select 2; - _periodPosition = (time - GVAR(rain_period_start_time)) min _transitionTime; - _periodPercent = (_periodPosition/_transitionTime) min 1; - - 0 setRain ((_periodPercent*(_rainStrength-_oldStrength))+_oldStrength); - }; - }; -}; -[_fnc_updateRain, 2, []] call CBA_fnc_addPerFrameHandler; - - -// Update Temperature -_fnc_updateTemperature = { - private ["_time","_month","_hourlyCoef","_avgTemperature","_pS1","_pS2"]; - _time = daytime; - _month = date select 1; - - // Temperature - _hourlyCoef = -0.5 * sin(360 * ((3 + (date select 3))/24 + (date select 4)/1440)); - - GVAR(currentTemperature) = (GVAR(TempDay) select (_month - 1)) * (1 - _hourlyCoef) + (GVAR(TempNight) select (_month - 1)) * _hourlyCoef; - GVAR(currentTemperature) = GVAR(currentTemperature) - 2 * humidity - 4 * overcast; - GVAR(currentTemperature) = round(GVAR(currentTemperature) * 10) / 10; - - // Humidity - GVAR(currentHumidity) = (GVAR(Humidity) select _month) / 100; - - if (rain > 0 && overcast > 0.7) then { - GVAR(currentHumidity) = 1; - } else { - _avgTemperature = ((GVAR(TempDay) select (_month - 1)) + (GVAR(TempNight) select (_month - 1))) / 2; - _pS1 = 6.112 * exp((17.62 * _avgTemperature) / (243.12 + _avgTemperature)); - _PS2 = 6.112 * exp((17.62 * GVAR(currentTemperature)) / (243.12 + GVAR(currentTemperature))); - GVAR(currentHumidity) = GVAR(currentHumidity) * _PS1 / _PS2; - }; - GVAR(currentHumidity) = 0 max GVAR(currentHumidity) min 1; - - // @todo: take altitude and humidity into account - GVAR(currentRelativeDensity) = (273.15 + 20) / (273.15 + GVAR(currentTemperature)); -}; -[_fnc_updateTemperature, 20, []] call CBA_fnc_addPerFrameHandler; +[FUNC(updateTemperature), 20, []] call CBA_fnc_addPerFrameHandler; +[FUNC(updateHumidity), 20, []] call CBA_fnc_addPerFrameHandler; +[FUNC(updateWind), 1, []] call CBA_fnc_addPerFrameHandler; +[FUNC(updateRain), 2, []] call CBA_fnc_addPerFrameHandler; \ No newline at end of file diff --git a/addons/weather/XEH_preInit.sqf b/addons/weather/XEH_preInit.sqf index 2751e77226..ee05983a69 100644 --- a/addons/weather/XEH_preInit.sqf +++ b/addons/weather/XEH_preInit.sqf @@ -2,44 +2,16 @@ #include "script_component.hpp" ADDON = false; -LOG(MSG_INIT); +PREP(calculateAirDensity); +PREP(calculateBarometricPressure); PREP(displayWindInfo); PREP(getMapData); PREP(getWind); PREP(serverController); - - -// Rain variables -GVAR(enableRain) = true; -GVAR(rain_next_period) = -1; -GVAR(rain_period_count) = 0; -GVAR(rain_initial_rain) = 0; -if(overcast >= 0.7) then { - GVAR(rain_initial_rain) = (random ((overcast-0.7)/0.3)); -}; -GVAR(current_rain) = GVAR(rain_initial_rain); -GVAR(rain_current_range) = -1+(random 2); -GVAR(overcast_multiplier) = 1; - -// Wind Variables -ACE_wind = [0, 0, 0]; -GVAR(wind_initial_dir) = (random 360); -GVAR(wind_initial_speed) = (overcast*5)+(random (overcast*5)) max 1; -GVAR(wind_mean_speed) = GVAR(wind_initial_speed); -GVAR(wind_mean_dir) = GVAR(wind_initial_dir); -GVAR(wind_current_speed) = GVAR(wind_initial_speed); -GVAR(wind_current_dir) = GVAR(wind_initial_dir); -GVAR(wind_current_range_speed) = -1+(random 2); -GVAR(wind_current_range_dir) = -1+(random 2); -GVAR(wind_next_period) = -1; //ceil((2+random(5))/(GVAR(overcast_multiplier)/10)); -GVAR(wind_next_major_period) = -1; -GVAR(wind_period_count) = 0; -GVAR(wind_major_period_count) = 0; -GVAR(wind_total_time) = 0; -GVAR(wind_period_start_time) = time; - -// Init weather variables, in case they are needed before postInit -call FUNC(getMapData); +PREP(updateHumidity); +PREP(updateRain); +PREP(updateTemperature); +PREP(updateWind); ADDON = true; diff --git a/addons/weather/functions/fnc_calculateAirDensity.sqf b/addons/weather/functions/fnc_calculateAirDensity.sqf new file mode 100644 index 0000000000..298049e51d --- /dev/null +++ b/addons/weather/functions/fnc_calculateAirDensity.sqf @@ -0,0 +1,36 @@ +/* + * Author: Ruthberg + * + * Calculates the air density + * + * Arguments: + * 0: temperature - degrees celcius + * 1: pressure - hPa + * 2: relativeHumidity - value between 0.0 and 1.0 + * + * Return Value: + * 0: density of air - kg * m^(-3) + * + * Return value: + * None + */ +#include "script_component.hpp" + +private ["_temperature", "_pressure", "_relativeHumidity"]; +_temperature = _this select 0; // in C +_pressure = _this select 1; // in hPa +_relativeHumidity = _this select 2; // as ratio 0-1 + +_pressure = _pressure * 100; + +if (_relativeHumidity > 0) then { + private ["_pSat", "_vaporPressure", "_partialPressure"]; + // Saturation vapor pressure calculated according to: http://wahiduddin.net/calc/density_algorithms.htm + _pSat = 6.1078 * 10 ^ ((7.5 * _temperature) / (_temperature + 237.3)); + _vaporPressure = _relativeHumidity * _pSat; + _partialPressure = _pressure - _vaporPressure; + + (_partialPressure * DRY_AIR_MOLAR_MASS + _vaporPressure * WATER_VAPOR_MOLAR_MASS) / (UNIVERSAL_GAS_CONSTANT * KELVIN(_temperature)) +} else { + _pressure / (SPECIFIC_GAS_CONSTANT_DRY_AIR * KELVIN(_temperature)) +}; diff --git a/addons/weather/functions/fnc_calculateBarometricPressure.sqf b/addons/weather/functions/fnc_calculateBarometricPressure.sqf new file mode 100644 index 0000000000..c65d343c93 --- /dev/null +++ b/addons/weather/functions/fnc_calculateBarometricPressure.sqf @@ -0,0 +1,20 @@ +/* + * Author: Ruthberg + * + * Calculates the barometric pressure based on altitude and weather + * + * Arguments: + * 0: altitude - meters + * + * Return Value: + * 0: barometric pressure - hPA + * + * Return value: + * None + */ +#include "script_component.hpp" + +private ["_altitude"]; +_altitude = _this; + +(1013.25 * exp(-(GVAR(Altitude) + _altitude) / 7990) - 10 * overcast) diff --git a/addons/weather/functions/fnc_displayWindInfo.sqf b/addons/weather/functions/fnc_displayWindInfo.sqf index d84cddd106..58d728bf67 100644 --- a/addons/weather/functions/fnc_displayWindInfo.sqf +++ b/addons/weather/functions/fnc_displayWindInfo.sqf @@ -1,5 +1,6 @@ /* * Author: Ruthberg + * * Displays a wind info (colored arrow) in the top left corner of the screen * * Argument: diff --git a/addons/weather/functions/fnc_getMapData.sqf b/addons/weather/functions/fnc_getMapData.sqf index fecf9f34f7..cb0a961c21 100644 --- a/addons/weather/functions/fnc_getMapData.sqf +++ b/addons/weather/functions/fnc_getMapData.sqf @@ -1,5 +1,6 @@ /* * Author: Ruthberg, esteldunedain + * * Get the weather data for the current map * * Argument: @@ -109,3 +110,6 @@ if (worldName in ["Imrali"]) exitWith { GVAR(TempDay) = [1, 3, 9, 14, 19, 23, 25, 24, 21, 13, 7, 2]; GVAR(TempNight) = [-4, -3, 0, 4, 9, 12, 14, 14, 10, 6, 2, -2]; GVAR(Humidity) = [82, 80, 78, 70, 71, 72, 70, 73, 78, 80, 83, 82]; + +GVAR(currentTemperature) = 20; +GVAR(currentHumidity) = 0.5; diff --git a/addons/weather/functions/fnc_getWind.sqf b/addons/weather/functions/fnc_getWind.sqf index b0fbf5e8fa..54ec6efad3 100644 --- a/addons/weather/functions/fnc_getWind.sqf +++ b/addons/weather/functions/fnc_getWind.sqf @@ -1,5 +1,6 @@ /* * Author: ACE2 Team + * * Calculate current wind locally from the data broadcasted by the server * * Argument: diff --git a/addons/weather/functions/fnc_serverController.sqf b/addons/weather/functions/fnc_serverController.sqf index e29836fc18..d7dff0eb70 100644 --- a/addons/weather/functions/fnc_serverController.sqf +++ b/addons/weather/functions/fnc_serverController.sqf @@ -1,5 +1,6 @@ /* * Author: ACE2 Team, esteldunedain + * * Calculate the wind and rain evolution on the server. Broadcast the current and next values to the clients * * Argument: diff --git a/addons/weather/functions/fnc_updateHumidity.sqf b/addons/weather/functions/fnc_updateHumidity.sqf new file mode 100644 index 0000000000..e3ba7a0224 --- /dev/null +++ b/addons/weather/functions/fnc_updateHumidity.sqf @@ -0,0 +1,28 @@ +/* + * Author: ACE2 Team + * + * Updates GVAR(currentHumidity) based on + * + * Argument: + * Nothing + * + * Return value: + * Nothing + */ +#include "script_component.hpp" + +private ["_month", "_avgTemperature", "_pS1", "_pS2"]; +_month = date select 1; + +GVAR(currentHumidity) = (GVAR(Humidity) select _month) / 100; + +if (rain > 0 && overcast > 0.7) then { + GVAR(currentHumidity) = 1; +} else { + _avgTemperature = ((GVAR(TempDay) select (_month - 1)) + (GVAR(TempNight) select (_month - 1))) / 2; + _pS1 = 6.112 * exp((17.62 * _avgTemperature) / (243.12 + _avgTemperature)); + _PS2 = 6.112 * exp((17.62 * GVAR(currentTemperature)) / (243.12 + GVAR(currentTemperature))); + GVAR(currentHumidity) = GVAR(currentHumidity) * _PS1 / _PS2; +}; + +GVAR(currentHumidity) = 0 max GVAR(currentHumidity) min 1; diff --git a/addons/weather/functions/fnc_updateRain.sqf b/addons/weather/functions/fnc_updateRain.sqf new file mode 100644 index 0000000000..01e32e1734 --- /dev/null +++ b/addons/weather/functions/fnc_updateRain.sqf @@ -0,0 +1,26 @@ +/* + * Author: ACE2 Team + * + * Updates rain based on ACE_RAIN_PARAMS + * + * Argument: + * Nothing + * + * Return value: + * Nothing + */ +#include "script_component.hpp" + +private ["_oldStrength", "_rainStrength", "_transitionTime", "_periodPosition", "_periodPercent"]; + +if (!GVAR(enableRain)) exitWith {}; + +if (!isNil "ACE_RAIN_PARAMS" && {!isNil QGVAR(rain_period_start_time)}) then { + _oldStrength = ACE_RAIN_PARAMS select 0; + _rainStrength = ACE_RAIN_PARAMS select 1; + _transitionTime = ACE_RAIN_PARAMS select 2; + _periodPosition = (time - GVAR(rain_period_start_time)) min _transitionTime; + _periodPercent = (_periodPosition/_transitionTime) min 1; + + 0 setRain ((_periodPercent*(_rainStrength-_oldStrength))+_oldStrength); +}; diff --git a/addons/weather/functions/fnc_updateTemperature.sqf b/addons/weather/functions/fnc_updateTemperature.sqf new file mode 100644 index 0000000000..5e342ad83d --- /dev/null +++ b/addons/weather/functions/fnc_updateTemperature.sqf @@ -0,0 +1,22 @@ +/* + * Author: ACE2 Team + * + * Updates GVAR(currentTemperature) based on the map data + * + * Argument: + * Nothing + * + * Return value: + * Nothing + */ +#include "script_component.hpp" + +private ["_time", "_month", "_hourlyCoef"]; +_time = daytime; +_month = date select 1; + +_hourlyCoef = -0.5 * sin(360 * ((3 + (date select 3))/24 + (date select 4)/1440)); + +GVAR(currentTemperature) = (GVAR(TempDay) select (_month - 1)) * (1 - _hourlyCoef) + (GVAR(TempNight) select (_month - 1)) * _hourlyCoef; +GVAR(currentTemperature) = GVAR(currentTemperature) - 2 * humidity - 4 * overcast; +GVAR(currentTemperature) = round(GVAR(currentTemperature) * 10) / 10; diff --git a/addons/weather/functions/fnc_updateWind.sqf b/addons/weather/functions/fnc_updateWind.sqf new file mode 100644 index 0000000000..e5a52348a8 --- /dev/null +++ b/addons/weather/functions/fnc_updateWind.sqf @@ -0,0 +1,21 @@ +/* + * Author: ACE2 Team + * + * Updates wind, gusts and waves based on ACE_wind + * + * Argument: + * Nothing + * + * Return value: + * Nothing + */ +#include "script_component.hpp" + +ACE_wind = [] call FUNC(getWind); +setWind [ACE_wind select 0, ACE_wind select 1, true]; +2 setGusts 0; + +// Set waves: 0 when no wind, 1 when wind >= 16 m/s +1 setWaves (((vectorMagnitude ACE_wind) / 16.0) min 1.0); + +//hintSilent format["Wind: %1\nACE_wind: %2\nDeviation: %3 (m/s)", wind, ACE_wind, Round((vectorMagnitude (ACE_wind vectorDiff wind)) * 1000) / 1000]; diff --git a/addons/weather/script_component.hpp b/addons/weather/script_component.hpp index a21d8245fd..edc1ac64d0 100644 --- a/addons/weather/script_component.hpp +++ b/addons/weather/script_component.hpp @@ -10,3 +10,11 @@ #endif #include "\z\ace\addons\main\script_macros.hpp" + +#define ABSOLUTE_ZERO_IN_CELSIUS -273.15 +#define KELVIN(t) (t - ABSOLUTE_ZERO_IN_CELSIUS) +#define CELSIUS(t) (t + ABSOLUTE_ZERO_IN_CELSIUS) +#define UNIVERSAL_GAS_CONSTANT 8.314 +#define WATER_VAPOR_MOLAR_MASS 0.018016 +#define DRY_AIR_MOLAR_MASS 0.028964 +#define SPECIFIC_GAS_CONSTANT_DRY_AIR 287.058