diff --git a/AUTHORS.txt b/AUTHORS.txt index b931d774ac..7720bb24d3 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -26,10 +26,11 @@ Walter Pearce # CONTRIBUTORS 11RDP-LoupVert [BIG]Bull -ACCtomeek +ACCtomeek Adanteh aeroson Aggr094 +Anthariel BlackQwar Brakoviejo Codingboy @@ -40,9 +41,10 @@ Falke75 Ferenczi Ferenzi Filip Basara (Logo) +FreeZbe geraldbolso1899 Ghost -gienkov +GieNkoV gpgpgpgp Grzegorz Hamburger SV @@ -50,9 +52,11 @@ havena Hawkins jokoho48 Jonpas -Legolasindar -licht-im-Norden87 +Kllrt +Legolasindar "Viper" +licht-im-Norden87 MarcBook +meat Michail Nikolaev nic547 oscarmolinadev @@ -62,6 +66,13 @@ Raspu86 Riccardo Petricca Robert Boklahánics simon84 +Sniperwolf572 Tonic Tourorist Valentin Torikian +zGuba +Aleksey EpMAK Yermakov +ruPaladin +BlackPixxel +Asgar Serran +Kavinsky diff --git a/addons/ai/CfgWeapons.hpp b/addons/ai/CfgWeapons.hpp index 22e8f703fc..be3245cce3 100644 --- a/addons/ai/CfgWeapons.hpp +++ b/addons/ai/CfgWeapons.hpp @@ -574,4 +574,198 @@ class CfgWeapons { maxRange = 1200; //1000; }; }; + + // marksmen marksmen + class DMR_03_base_F: Rifle_Long_Base_F { + modes[] += {"ACE_Burst_far"}; + + class Single: Mode_SemiAuto { + minRange = 120; // 2; + minRangeProbab = 0.7; // 0.3; + midRangeProbab = 0.3; // 0.7; + }; + + class FullAuto; + + class single_close_optics1: Single { + minRange = 120; // 2; + minRangeProbab = 0.8; // 0.05; + midRangeProbab = 0.05; // 0.8; + }; + + class single_medium_optics1: single_close_optics1 { + minRangeProbab = 0.7; // 0.05; + midRangeProbab = 0.05; // 0.7; + }; + + class single_far_optics1: single_medium_optics1 { + minRange = 400; // 300; + minRangeProbab = 0.5; // 0.05; + midRangeProbab = 0.05; // 0.5; + }; + + class fullauto_medium: FullAuto { + minRange = 20; // 2; + maxRange = 150; // 100; + burst = "3 + round random 5"; // 3; + }; + + class ACE_Burst_far: fullauto_medium { + aiRateOfFire = 2.0; + aiRateOfFireDistance = 500; + minRange = 400; + minRangeProbab = 0.1; + midRange = 500; + midRangeProbab = 0.2; + maxRange = 600; + maxRangeProbab = 0.2; + burst = "2 + round random 3"; + }; + }; + + class DMR_05_base_F: Rifle_Long_Base_F { + modes[] += {"ACE_Burst_far"}; + + class Single: Mode_SemiAuto { + minRange = 120; // 2; + minRangeProbab = 0.7; // 0.3; + midRangeProbab = 0.3; // 0.7; + }; + + class FullAuto; + + class single_close_optics1: Single { + minRange = 120; // 2; + minRangeProbab = 0.8; // 0.05; + midRangeProbab = 0.05; // 0.8; + }; + + class single_medium_optics1: single_close_optics1 { + minRangeProbab = 0.7; // 0.05; + midRangeProbab = 0.05; // 0.7; + }; + + class single_far_optics1: single_medium_optics1 { + minRange = 400; // 300; + minRangeProbab = 0.5; // 0.05; + midRangeProbab = 0.05; // 0.5; + }; + + class fullauto_medium: FullAuto { + minRange = 20; // 2; + maxRange = 150; // 100; + burst = "3 + round random 5"; // 3; + }; + + class ACE_Burst_far: fullauto_medium { + aiRateOfFire = 2.0; + aiRateOfFireDistance = 500; + minRange = 400; + minRangeProbab = 0.1; + midRange = 500; + midRangeProbab = 0.2; + maxRange = 600; + maxRangeProbab = 0.2; + burst = "2 + round random 3"; + }; + }; + + class DMR_06_base_F: Rifle_Long_Base_F { + modes[] += {"ACE_Burst_far"}; + + class Single: Mode_SemiAuto { + minRange = 120; // 2; + minRangeProbab = 0.7; // 0.3; + midRangeProbab = 0.3; // 0.7; + }; + + class FullAuto; + + class single_close_optics1: Single { + minRange = 120; // 2; + minRangeProbab = 0.8; // 0.05; + midRangeProbab = 0.05; // 0.8; + }; + + class single_medium_optics1: single_close_optics1 { + minRangeProbab = 0.7; // 0.05; + midRangeProbab = 0.05; // 0.7; + }; + + class single_far_optics1: single_medium_optics1 { + minRange = 400; // 300; + minRangeProbab = 0.5; // 0.05; + midRangeProbab = 0.05; // 0.5; + }; + + class fullauto_medium: FullAuto { + minRange = 20; // 2; + maxRange = 150; // 100; + burst = "3 + round random 5"; // 3; + }; + + class ACE_Burst_far: fullauto_medium { + aiRateOfFire = 2.0; + aiRateOfFireDistance = 500; + minRange = 400; + minRangeProbab = 0.1; + midRange = 500; + midRangeProbab = 0.2; + maxRange = 600; + maxRangeProbab = 0.2; + burst = "2 + round random 3"; + }; + }; + + // marksmen medium mg + class MMG_01_base_F: Rifle_Long_Base_F { + aiDispersionCoefY = 25.0; + aiDispersionCoefX = 20.0; + modes[] += {"ACE_Burst_far"}; + + class manual; + class burst; + class close; + class short; + class medium; + class ACE_Burst_far: medium { + aiRateOfFire = 6.0; + aiRateOfFireDistance = 900; + minRange = 700; + minRangeProbab = 0.1; + midRange = 900; + midRangeProbab = 0.2; + maxRange = 1100; + maxRangeProbab = 0.2; + burst = "3 + round random 5"; + }; + + class far_optic1; + class far_optic2; + }; + + class MMG_02_base_F: Rifle_Long_Base_F { + aiDispersionCoefY = 20.0; + aiDispersionCoefX = 15.0; + modes[] += {"ACE_Burst_far"}; + + class manual; + class close; + class short; + class medium; + class ACE_Burst_far: medium { + aiRateOfFire = 6.0; + aiRateOfFireDistance = 900; + minRange = 700; + minRangeProbab = 0.1; + midRange = 900; + midRangeProbab = 0.2; + maxRange = 1100; + maxRangeProbab = 0.2; + burst = "3 + round random 5"; + }; + + class far_optic1; + class far_optic2; + }; }; diff --git a/addons/aircraft/CfgAmmo.hpp b/addons/aircraft/CfgAmmo.hpp index 393b9666e6..f29c1d56d6 100644 --- a/addons/aircraft/CfgAmmo.hpp +++ b/addons/aircraft/CfgAmmo.hpp @@ -1,9 +1,7 @@ class CfgAmmo { class BulletBase; - class B_20mm; - - class ACE_20mm_HEDP : B_20mm { + class B_20mm : BulletBase { hit = 80; indirectHit = 12; indirectHitRange = 2; //2; @@ -11,8 +9,22 @@ class CfgAmmo { tracerStartTime = 0.02; timeToLive = 40; explosive = 1.8; + tracersEvery = 3; + tracerEndTime = 3.5; + + CraterEffects = "ExploAmmoCrater"; + explosionEffects = "ExploAmmoExplosion"; + model = "\A3\Weapons_f\Data\bullettracer\tracer_red"; + }; + class ACE_20mm_HEDP : B_20mm {}; + class ACE_20mm_AP : B_20mm { + hit = 50; + indirectHit = 12; + indirectHitRange = 0.3; //2; + explosive = 0; + CraterEffects = ""; + explosionEffects = ""; }; - // adjust minigun caliber and deflection to other ammo class SubmunitionBullet; diff --git a/addons/aircraft/config.cpp b/addons/aircraft/config.cpp index 2ce2d0dc10..2dc390f915 100644 --- a/addons/aircraft/config.cpp +++ b/addons/aircraft/config.cpp @@ -2,7 +2,7 @@ class CfgPatches { class ADDON { - units[] = {}; + units[] = {"ACE_Comanche_Test"}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common"}; diff --git a/addons/aircraft/stringtable.xml b/addons/aircraft/stringtable.xml index 4d1c49fff6..c0966ddcfb 100644 --- a/addons/aircraft/stringtable.xml +++ b/addons/aircraft/stringtable.xml @@ -40,7 +40,7 @@ Close Cargo Door Laderampe schließen Cerrar compuerta de carga - Fermer Rampe Cargo + Fermer la Rampe du Cargo Zamknij drzwi ładowni Zavřít nákladní prostor Rámpát zárni diff --git a/addons/attach/CfgMagazines.hpp b/addons/attach/CfgMagazines.hpp index d63b8db36b..a000222adc 100644 --- a/addons/attach/CfgMagazines.hpp +++ b/addons/attach/CfgMagazines.hpp @@ -2,11 +2,31 @@ class CfgMagazines { class CA_Magazine; class B_IR_Grenade: CA_Magazine { - ACE_Attachable = 1; + ACE_Attachable = "B_IRStrobe"; + }; + + class O_IR_Grenade: B_IR_Grenade { + ACE_Attachable = "O_IRStrobe"; + }; + + class I_IR_Grenade: B_IR_Grenade { + ACE_Attachable = "I_IRStrobe"; }; class SmokeShell; class Chemlight_green: SmokeShell { - ACE_Attachable = 1; + ACE_Attachable = "Chemlight_green"; + }; + + class Chemlight_blue: Chemlight_green { + ACE_Attachable = "Chemlight_blue"; + }; + + class Chemlight_red: Chemlight_green { + ACE_Attachable = "Chemlight_red"; + }; + + class Chemlight_yellow: Chemlight_green { + ACE_Attachable = "Chemlight_yellow"; }; }; diff --git a/addons/attach/CfgWeapons.hpp b/addons/attach/CfgWeapons.hpp index 4ad34832c5..9734ceb273 100644 --- a/addons/attach/CfgWeapons.hpp +++ b/addons/attach/CfgWeapons.hpp @@ -4,7 +4,7 @@ class CfgWeapons { class InventoryItem_Base_F; class ACE_IR_Strobe_Item: ACE_ItemCore { - ACE_attachable = 1; + ACE_attachable = "ACE_IR_Strobe_Effect"; author = "$STR_ACE_Common_ACETeam"; scope = 2; displayName = "$STR_ACE_IrStrobe_Name"; diff --git a/addons/attach/functions/fnc_attach.sqf b/addons/attach/functions/fnc_attach.sqf index 3703514fb6..3bb54eee16 100644 --- a/addons/attach/functions/fnc_attach.sqf +++ b/addons/attach/functions/fnc_attach.sqf @@ -25,35 +25,19 @@ _itemClassname = [_args, 0, ""] call CBA_fnc_defaultParam; //Sanity Check (_unit has item in inventory, not over attach limit) if ((_itemClassname == "") || {!(_this call FUNC(canAttach))}) exitWith {ERROR("Tried to attach, but check failed");}; -_itemVehClass = ""; -_onAtachText = ""; _selfAttachPosition = [_unit, [-0.05, 0, 0.12], "rightshoulder"]; -switch (true) do { -case (_itemClassname == "ACE_IR_Strobe_Item"): { - _itemVehClass = "ACE_IR_Strobe_Effect"; - _onAtachText = localize "STR_ACE_Attach_IrStrobe_Attached"; - //_selfAttachPosition = [_unit, [0, -0.11, 0.16], "pilot"]; //makes it attach to the head a bit better, shoulder is not good for visibility - eRazeri - }; -case (_itemClassname == "B_IR_Grenade"): { - _itemVehClass = "B_IRStrobe"; - _onAtachText = localize "STR_ACE_Attach_IrGrenade_Attached"; - }; -case (_itemClassname == "O_IR_Grenade"): { - _itemVehClass = "O_IRStrobe"; - _onAtachText = localize "STR_ACE_Attach_IrGrenade_Attached"; - }; -case (_itemClassname == "I_IR_Grenade"): { - _itemVehClass = "I_IRStrobe"; - _onAtachText = localize "STR_ACE_Attach_IrGrenade_Attached"; - }; -case (toLower _itemClassname in ["chemlight_blue", "chemlight_green", "chemlight_red", "chemlight_yellow"]): { - _itemVehClass = _itemClassname; - _onAtachText = localize "STR_ACE_Attach_Chemlight_Attached"; - }; +_itemVehClass = getText (configFile >> "CfgWeapons" >> _itemClassname >> "ACE_Attachable"); +_onAtachText = getText (configFile >> "CfgWeapons" >> _itemClassname >> "displayName"); + +if (_itemVehClass == "") then { + _itemVehClass = getText (configFile >> "CfgMagazines" >> _itemClassname >> "ACE_Attachable"); + _onAtachText = getText (configFile >> "CfgMagazines" >> _itemClassname >> "displayName"); }; -if (_itemVehClass == "") exitWith {ERROR("no _itemVehClass for Item");}; +if (_itemVehClass == "") exitWith {ERROR("no ACE_Attachable for Item");}; + +_onAtachText = format [localize "STR_ACE_Attach_Item_Attached", _onAtachText]; if (_unit == _attachToVehicle) then { //Self Attachment _unit removeItem _itemClassname; // Remove item diff --git a/addons/attach/functions/fnc_detach.sqf b/addons/attach/functions/fnc_detach.sqf index 124e5910d6..99ac646013 100644 --- a/addons/attach/functions/fnc_detach.sqf +++ b/addons/attach/functions/fnc_detach.sqf @@ -73,14 +73,9 @@ _attachToVehicle setVariable [QGVAR(Objects), _attachedObjects, true]; _attachToVehicle setVariable [QGVAR(ItemNames), _attachedItems, true]; // Display message -switch (true) do { -case (_itemName == "ACE_IR_Strobe_Item") : { - [localize "STR_ACE_Attach_IrStrobe_Detached"] call EFUNC(common,displayTextStructured); - }; -case (toLower _itemName in ["b_ir_grenade", "o_ir_grenade", "i_ir_grenade"]) : { - [localize "STR_ACE_Attach_IrGrenade_Detached"] call EFUNC(common,displayTextStructured); - }; -case (toLower _itemName in ["chemlight_blue", "chemlight_green", "chemlight_red", "chemlight_yellow"]) : { - [localize "STR_ACE_Attach_Chemlight_Detached"] call EFUNC(common,displayTextStructured); - }; +_itemDisplayName = getText (configFile >> "CfgWeapons" >> _itemName >> "displayName"); +if (_itemDisplayName == "") then { + _itemDisplayName = getText (configFile >> "CfgMagazines" >> _itemName >> "displayName"); }; + +[format [localize "STR_ACE_Attach_Item_Detached", _itemDisplayName]] call EFUNC(common,displayTextStructured); diff --git a/addons/attach/functions/fnc_getChildrenAttachActions.sqf b/addons/attach/functions/fnc_getChildrenAttachActions.sqf index 6ff9410475..3594e10bd6 100644 --- a/addons/attach/functions/fnc_getChildrenAttachActions.sqf +++ b/addons/attach/functions/fnc_getChildrenAttachActions.sqf @@ -26,7 +26,7 @@ _actions = []; if !(_x in _listed) then { _listed pushBack _x; _item = ConfigFile >> "CfgMagazines" >> _x; - if (getNumber (_item >> "ACE_Attachable") == 1) then { + if (getText (_item >> "ACE_Attachable") != "") then { _displayName = getText(_item >> "displayName"); _picture = getText(_item >> "picture"); _action = [_x, _displayName, _picture, {_this call FUNC(attach)}, {_this call FUNC(canAttach)}, {}, [_x]] call EFUNC(interact_menu,createAction); @@ -39,7 +39,7 @@ _actions = []; if !(_x in _listed) then { _listed pushBack _x; _item = ConfigFile >> "CfgWeapons" >> _x; - if (getNumber (_item >> "ACE_Attachable") == 1) then { + if (getText (_item >> "ACE_Attachable") != "") then { _displayName = getText(_item >> "displayName"); _picture = getText(_item >> "picture"); _action = [_x, _displayName, _picture, {_this call FUNC(attach)}, {_this call FUNC(canAttach)}, {}, [_x]] call EFUNC(interact_menu,createAction); diff --git a/addons/attach/stringtable.xml b/addons/attach/stringtable.xml index 27a0517f9a..97649a6026 100644 --- a/addons/attach/stringtable.xml +++ b/addons/attach/stringtable.xml @@ -1,5 +1,4 @@  - @@ -44,11 +43,11 @@ Marcador IR acoplado Przyczepiono stroboskop IR Strobe IR attaché - IR Značkovač Připnutý + IR Značkovač připnutý Marcador IV Acoplado Strobo IR attaccata Infravörös jeladó hozzácsatolva - ИК строб присоединён + ИК-маяк присоединён IR Strobe Detached @@ -56,11 +55,11 @@ Marcador IR quitado Odczepiono stroboskop IR Strobe IR détaché - IR Značkovač Odepnutý + IR Značkovač odepnutý Marcador IV Separado Strobo IR staccata Infravörös jeladó lecsatolva - ИК строб отсоединён + ИК-маяк отсоединён IR Grenade Attached @@ -68,11 +67,11 @@ Granada IR acoplada Przyczepiono granat IR Grenade IR attachée - IR Granát Připnutý + IR Granát připnutý Granada IV Acoplada Granata IR attaccata Infravörös gránát hozzácsatolva - ИК граната присоединена + ИК-граната присоединена IR Grenade Detached @@ -80,11 +79,11 @@ Granada IR quitada Odczepiono granat IR Grenade IR détachée - IR Granát Odepnutý + IR Granát odepnutý Granada IV Separada Granata IR staccata Infravörös gránát lecsatolva - ИК граната отсоединена + ИК-граната отсоединена Chemlight Attached @@ -92,7 +91,7 @@ Barra de luz acoplada Przyczepiono światło chemiczne Chemlight attaché - Chemické světlo Připnuto + Chemické světlo připnuto Chemlight Acoplada Chemlight attaccata Chemlight hozzácsatolva @@ -104,7 +103,7 @@ Barra de luz quitada Odczepiono światło chemiczne Chemlight détaché - Chemické světlo Odepnuto + Chemické světlo odepnuto Chemlight Separada Chemlight staccata Chemlight hozzácsatolva @@ -132,7 +131,7 @@ Marcador IV Strobo IR Infravörös jeladó - ИК строб + ИК-маяк IR Strobe allows you to signal your position through a pulsating beacon only visible with NVGs. @@ -144,7 +143,7 @@ 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. Az infravörös jeladóval megjelölheted a helyzetedet úgy, hogy annak pulzáló fénye csak éjjellátó készülékkel látható. - ИК строб позволяет сигнализировать свое местоположение через пульсирующий маяк, видимый только через ПНВ. + ИК-маяк позволяет сигнализировать о своём местоположении через пульсирующий свет, видимый только через ПНВ. Place @@ -156,6 +155,7 @@ Colocar Posiziona Elhelyez + Установить Cancel @@ -167,13 +167,40 @@ Cancelar Annulla Mégse + Отмена Attach Failed - Échec du Attacher + Échec de l'attachement Befestigen fehlgeschlagen - Присоединить Ошибка + Соединение прервано Error al acoplar + Připnutí selhalo + Przyczepianie nie powiodło się + + + %1<br/>Attached + %1<br/>befestigt + %1<br/>acoplada + %1<br/>Przyczepiono + %1<br/>attachée + %1<br/>Připnutý + %1<br/>Acoplada + %1<br/>attaccata + %1<br/>hozzácsatolva + %1<br/>присоединена + + + %1<br/>Detached + %1<br/>entfernt + %1<br/>quitada + %1<br/>Odczepiono + %1<br/>détachée + %1<br/>Odepnutý + %1<br/>Separada + %1<br/>staccata + %1<br/>lecsatolva + %1<br/>отсоединена diff --git a/addons/captives/functions/fnc_canSurrender.sqf b/addons/captives/functions/fnc_canSurrender.sqf index 3ee687cfc1..3b810a0c5c 100644 --- a/addons/captives/functions/fnc_canSurrender.sqf +++ b/addons/captives/functions/fnc_canSurrender.sqf @@ -18,6 +18,8 @@ PARAMS_2(_unit,_newSurrenderState); +if (currentWeapon _unit != "") exitWith {false}; + private "_returnValue"; _returnValue = if (_newSurrenderState) then { diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf index 5917532874..e992339186 100644 --- a/addons/captives/functions/fnc_setHandcuffed.sqf +++ b/addons/captives/functions/fnc_setHandcuffed.sqf @@ -54,7 +54,7 @@ if (_state) then { 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]; + // systemChat format ["debug %2: new %1", _newAnimation, time]; [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); }; }]; diff --git a/addons/captives/functions/fnc_setSurrendered.sqf b/addons/captives/functions/fnc_setSurrendered.sqf index 73451863dd..30f9105511 100644 --- a/addons/captives/functions/fnc_setSurrendered.sqf +++ b/addons/captives/functions/fnc_setSurrendered.sqf @@ -52,7 +52,7 @@ if (_state) then { 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]; + // systemChat format ["debug %2: new %1", _newAnimation, time]; [_unit, "ACE_AmovPercMstpSsurWnonDnon", 1] call EFUNC(common,doAnimation); }; }]; diff --git a/addons/captives/stringtable.xml b/addons/captives/stringtable.xml index 897782747f..294cf1d68c 100644 --- a/addons/captives/stringtable.xml +++ b/addons/captives/stringtable.xml @@ -1,5 +1,4 @@  - @@ -132,28 +131,48 @@ Surrender + Se rendre Kapitulieren Rendirse + Сдаться + Vzdát se + Poddaj się Stop Surrendering + Arrêt de se rendre Den Kampf erneut aufnehmen Dejar de rendirse + Остановить сдачу + Přestat se vzdávat + Podejmij walkę ponownie Only use on alive units + Utilisation uniquement sur les unités en vie Nur bei lebenden Einheiten verwendbar Utilizar solo en unidades vivas + Только для живых юнитов + Použitelné jen na živé jednotky + Używaj tylko na żywych jednostkach Only use on dismounted inf + Utilisation uniquement sur les infanteries Nur bei abgesessener Infanterie verwendbar Utilizar solo en infanteria desmontada + Только для спеш. солдат + Použitelné jen na pěsích jednotkách + Używaj tylko na piechocie poza wszelkimi pojazdami Nothing under mouse + Rien sous la souris Es wurde nichts ausgewählt Nada bajo el ratón + Объекты под мышью отсутствуют + Nic není vybráno + Nie ma nic pod kursorem diff --git a/addons/common/CfgEventHandlers.hpp b/addons/common/CfgEventHandlers.hpp index eef90451ae..ce0938f063 100644 --- a/addons/common/CfgEventHandlers.hpp +++ b/addons/common/CfgEventHandlers.hpp @@ -26,6 +26,9 @@ class Extended_InitPost_EventHandlers { class GVAR(forceWalk) { init = QUOTE(if (local (_this select 0)) then {_this call FUNC(applyForceWalkStatus);};); }; + class GVAR(muteUnit) { + init = QUOTE(_this call FUNC(muteUnitHandleInitPost)); + }; }; }; @@ -41,4 +44,9 @@ class Extended_Respawn_EventHandlers { respawn = QUOTE(_this call FUNC(resetAllDefaults)); }; }; + class CAManBase { + class GVAR(muteUnit) { + respawn = QUOTE(_this call FUNC(muteUnitHandleRespawn)); + }; + }; }; diff --git a/addons/common/CfgWeapons.hpp b/addons/common/CfgWeapons.hpp index 6035ee84bf..c2d1532f40 100644 --- a/addons/common/CfgWeapons.hpp +++ b/addons/common/CfgWeapons.hpp @@ -15,7 +15,7 @@ class CfgWeapons { class ACE_FakePrimaryWeapon: Rifle_Base_F { scope = 2; displayName = ""; - model = ""; + model = "\A3\Weapons_f\empty"; picture = ""; magazines[] = {"ACE_FakeMagazine"}; discreteDistance[] = {}; diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index f09dae0eb3..e470e91c95 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -35,6 +35,7 @@ if (hasInterface) then { ["setDir", {(_this select 0) setDir (_this select 1)}] call FUNC(addEventhandler); ["setFuel", {(_this select 0) setFuel (_this select 1)}] call FUNC(addEventhandler); +["setSpeaker", {(_this select 0) setSpeaker (_this select 1)}] call FUNC(addEventhandler); // hack to get PFH to work in briefing [QGVAR(onBriefingPFH), "onEachFrame", { diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index a88c349180..b5382d0b5e 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -39,6 +39,7 @@ PREP(displayText); PREP(displayTextPicture); PREP(displayTextStructured); PREP(doAnimation); +PREP(dropBackpack); PREP(endRadioTransmission); PREP(eraseCache); PREP(execNextFrame); @@ -107,6 +108,7 @@ PREP(isAutoWind); PREP(isAwake); PREP(isEngineer); PREP(isEOD); +PREP(isFeatureCameraActive); PREP(isInBuilding); PREP(isModLoaded); PREP(isPlayer); @@ -122,6 +124,8 @@ PREP(moduleCheckPBOs); PREP(moduleLSDVehicles); PREP(moveToTempGroup); PREP(muteUnit); +PREP(muteUnitHandleInitPost); +PREP(muteUnitHandleRespawn); PREP(numberToDigits); PREP(numberToDigitsString); PREP(numberToString); @@ -177,6 +181,12 @@ PREP(useItem); PREP(useMagazine); PREP(waitAndExecute); +PREP(translateToWeaponSpace); +PREP(translateToModelSpace); + +// Model and drawing helpers +PREP(worldToScreenBounds); + // config items PREP(getConfigType); PREP(getItemType); diff --git a/addons/common/functions/fnc_addToInventory.sqf b/addons/common/functions/fnc_addToInventory.sqf index b28d864df8..339055487b 100644 --- a/addons/common/functions/fnc_addToInventory.sqf +++ b/addons/common/functions/fnc_addToInventory.sqf @@ -4,9 +4,10 @@ * or places it in a weaponHolder if no space. * * Arguments: - * 0: Unit (OBJECT) - * 1: Classname (String) - * 2: Container (String, Optional) uniform, vest, backpack + * 0: Unit + * 1: Classname + * 2: Container (uniform, vest, backpack) + * 3: Magazine Ammo Count * * Return Value: * Array: @@ -19,37 +20,29 @@ #include "script_component.hpp" EXPLODE_2_PVT(_this,_unit,_classname); +DEFAULT_PARAM(2,_container,""); +DEFAULT_PARAM(3,_ammoCount,-1); + private "_addedToPlayer"; -private "_container"; private "_canAdd"; private "_type"; _canAdd = false; _addedToPlayer = true; -if((count _this) > 2) then { - _container = _this select 2; -} else { - _container = nil; -}; - _type = [_classname] call EFUNC(common,getItemType); -if(!isNil "_container") then { - switch (_container) do { - case "vest": { _canAdd = _unit canAddItemToVest _classname; }; - case "backpack": { _canAdd = _unit canAddItemToBackpack _classname; }; - case "uniform": { _canAdd = _unit canAddItemToUniform _classname; }; - }; -} else { - _container = ""; - _canAdd = _unit canAdd _classname; +switch (_container) do { + case "vest": { _canAdd = _unit canAddItemToVest _classname; }; + case "backpack": { _canAdd = _unit canAddItemToBackpack _classname; }; + case "uniform": { _canAdd = _unit canAddItemToUniform _classname; }; + default {_canAdd = _unit canAdd _classname;}; }; switch ((_type select 0)) do { case "weapon": { if (_canAdd) then { - switch (_container) do { + switch (_container) do { case "vest": { (vestContainer _unit) addWeaponCargoGlobal [_classname, 1]; }; case "backpack": { (backpackContainer _unit) addWeaponCargoGlobal [_classname, 1]; }; case "uniform": { (uniformContainer _unit) addWeaponCargoGlobal [_classname, 1]; }; @@ -64,24 +57,25 @@ switch ((_type select 0)) do { }; }; case "magazine": { + if (_ammoCount == -1) then {_ammoCount = getNumber (configFile >> "CfgMagazines" >> _classname >> "count");}; if (_canAdd) then { switch (_container) do { - case "vest": { (vestContainer _unit) addMagazineCargoGlobal [_classname, 1]; }; - case "backpack": { (backpackContainer _unit) addMagazineCargoGlobal [_classname, 1]; }; - case "uniform": { (uniformContainer _unit) addMagazineCargoGlobal [_classname, 1]; }; - default { _unit addMagazineGlobal _classname; }; + case "vest": { (vestContainer _unit) addMagazineCargoGlobal [_classname, _ammoCount]; }; + case "backpack": { (backpackContainer _unit) addMagazineCargoGlobal [_classname, _ammoCount]; }; + case "uniform": { (uniformContainer _unit) addMagazineCargoGlobal [_classname, _ammoCount]; }; + default {_unit addMagazine [_classname, _ammoCount]; }; }; } else { _addedToPlayer = false; _pos = _unit modelToWorldVisual [0,1,0.05]; _unit = createVehicle ["WeaponHolder_Single_F",_pos,[],0,"NONE"]; - _unit addMagazineCargoGlobal [_classname, 1]; + _unit addMagazineCargoGlobal [_classname, _ammoCount]; _unit setPosATL _pos; }; }; case "item": { if (_canAdd) then { - switch (_container) do { + switch (_container) do { case "vest": { _unit addItemToVest _classname; }; case "backpack": { _unit addItemToBackpack _classname; }; case "uniform": { _unit addItemToUniform _classname; }; diff --git a/addons/common/functions/fnc_disableAI.sqf b/addons/common/functions/fnc_disableAI.sqf index 9e1bf59a6f..92ad35c0f9 100644 --- a/addons/common/functions/fnc_disableAI.sqf +++ b/addons/common/functions/fnc_disableAI.sqf @@ -1,23 +1,37 @@ -/** - * fn_disableAI_f.sqf - * @Descr: N/A - * @Author: Glowbal +/* + * Author: Glowbal, KoffeinFlummi + * Disables/Enables AI * - * @Arguments: [] - * @Return: - * @PublicAPI: false + * Arguments: + * 0: Unit + * 1: Disable AI + * + * Return Value: + * None + * + * Example: + * [bob, true] call ace_common_fnc_disableAI; + * + * Public: No */ #include "script_component.hpp" -private ["_unit","_disable"]; -_unit = [_this, 0,ObjNull,[ObjNull]] call BIS_fnc_Param; -_disable = [_this, 1,false,[false]] call BIS_fnc_Param; -if (local _unit && !(IsPlayer _unit)) then { +PARAMS_2(_unit,_disable); + +if ((local _unit) && {!([_unit] call EFUNC(common,isPlayer))}) then { if (_disable) then { - _unit disableAI "Move"; + _unit disableAI "MOVE"; _unit disableAI "TARGET"; + _unit disableAI "AUTOTARGET"; + _unit disableAI "FSM"; + _unit disableConversation true; } else { - _unit enableAI "Move"; + //Sanity check to make sure we don't enable unconsious AI + if (_unit getVariable ["ace_isunconscious", false]) exitWith {ERROR("Enabling AI for unconsious unit");}; + _unit enableAI "MOVE"; _unit enableAI "TARGET"; + _unit enableAI "AUTOTARGET"; + _unit enableAI "FSM"; + _unit disableConversation false; }; -}; \ No newline at end of file +}; diff --git a/addons/common/functions/fnc_dropBackpack.sqf b/addons/common/functions/fnc_dropBackpack.sqf new file mode 100644 index 0000000000..a2fd38b7c3 --- /dev/null +++ b/addons/common/functions/fnc_dropBackpack.sqf @@ -0,0 +1,34 @@ +/* + * Author: commy2 + * + * Drops a backback. Also returns the ground wepaon holder object of the dropped backpack. + * + * Argument: + * 0: Unit that has a backpack (Object) + * + * Return value: + * Ground wepaon holder with backpack (Object) + * + */ +#include "script_component.hpp" + +private "_unit"; + +_unit = _this select 0; + +private "_backpackObject"; +_backpackObject = backpackContainer _unit; + +_unit addBackpack "Bag_Base"; +removeBackpack _unit; + +private "_holder"; +_holder = objNull; + +{ + if (_backpackObject in everyBackpack _x) exitWith { + _holder = _x; + }; +} forEach (position _unit nearObjects ["WeaponHolder", 5]); + +_holder diff --git a/addons/common/functions/fnc_endRadioTransmission.sqf b/addons/common/functions/fnc_endRadioTransmission.sqf index 772a34a06b..78a50e9f2c 100644 --- a/addons/common/functions/fnc_endRadioTransmission.sqf +++ b/addons/common/functions/fnc_endRadioTransmission.sqf @@ -14,10 +14,10 @@ // ACRE if (isClass (configFile >> "CfgPatches" >> "acre_main")) then { - [-1] call acre_core_fnc_handleMultiPttKeyPressUp; - [0] call acre_core_fnc_handleMultiPttKeyPressUp; - [1] call acre_core_fnc_handleMultiPttKeyPressUp; - [2] call acre_core_fnc_handleMultiPttKeyPressUp; + [-1] call acre_sys_core_fnc_handleMultiPttKeyPressUp; + [0] call acre_sys_core_fnc_handleMultiPttKeyPressUp; + [1] call acre_sys_core_fnc_handleMultiPttKeyPressUp; + [2] call acre_sys_core_fnc_handleMultiPttKeyPressUp; }; // TFAR diff --git a/addons/common/functions/fnc_isFeatureCameraActive.sqf b/addons/common/functions/fnc_isFeatureCameraActive.sqf new file mode 100644 index 0000000000..250beaa3ca --- /dev/null +++ b/addons/common/functions/fnc_isFeatureCameraActive.sqf @@ -0,0 +1,31 @@ +/* + * Author: Sniperwolf572 + * + * Checks if one of the following BI feature cameras are active: + * + * - Classic camera (BIS_fnc_cameraOld) + * - Splendid camera (BIS_fnc_camera) + * - Arsenal camera (BIS_fnc_arsenal) + * - Animation viewer (BIS_fnc_animViewer) + * - Establishing shot (BIS_fnc_establishingShot) + * + * Arguments: + * None + * + * Return value: + * Is BI feature camera active (bool) + * + * Example: + * call ace_common_fnc_isFeatureCameraActive; + * + */ + +#include "script_component.hpp" + +( + !isNull (missionNamespace getVariable ["BIS_DEBUG_CAM", objNull]) || // Classic camera + {!isNull (missionNamespace getVariable ["BIS_fnc_camera_cam", objNull])} || // Splendid camera + {!isNull (uiNamespace getVariable ["BIS_fnc_arsenal_cam", objNull])} || // Arsenal camera + {!isNull (uiNamespace getVariable ["BIS_fnc_animViewer_cam", objNull])} || // Animation viewer camera + {!isNull (missionNamespace getVariable ["BIS_fnc_establishingShot_fakeUAV", objNull])} // Establishing shot camera +) \ No newline at end of file diff --git a/addons/common/functions/fnc_muteUnit.sqf b/addons/common/functions/fnc_muteUnit.sqf index 8edf9df391..5c496ea58e 100644 --- a/addons/common/functions/fnc_muteUnit.sqf +++ b/addons/common/functions/fnc_muteUnit.sqf @@ -5,21 +5,34 @@ * * Argument: * 0: Unit (Object) + * 1: Reason to mute the unit (String) * * Return value: * Nothing */ #include "script_component.hpp" -private ["_unit", "_speaker"]; +private ["_unit", "_reason"]; _unit = _this select 0; +_reason = _this select 1; if (isNull _unit) exitWith {}; +// add reason to mute to the unit +private "_muteUnitReasons"; +_muteUnitReasons = _unit getVariable [QGVAR(muteUnitReasons), []]; + +if !(_reason in _muteUnitReasons) then { + _muteUnitReasons pushBack _reason; + _unit setVariable [QGVAR(muteUnitReasons), _muteUnitReasons, true]; +}; + +private "_speaker"; _speaker = speaker _unit; + if (_speaker == "ACE_NoVoice") exitWith {}; -[0, "{(_this select 1) setSpeaker 'ACE_NoVoice'}", _unit, "ACE_Speaker"] call FUNC(execPersistentFnc); +["setSpeaker", [_unit, "ACE_NoVoice"]] call FUNC(globalEvent); _unit setVariable ["ACE_OriginalSpeaker", _speaker, true]; diff --git a/addons/common/functions/fnc_muteUnitHandleInitPost.sqf b/addons/common/functions/fnc_muteUnitHandleInitPost.sqf new file mode 100644 index 0000000000..f0abcfcf01 --- /dev/null +++ b/addons/common/functions/fnc_muteUnitHandleInitPost.sqf @@ -0,0 +1,11 @@ +// by commy2 +#include "script_component.hpp" + +private "_unit"; + +_unit = _this select 0; + +// setSpeaker gets overwritten after init on remote units; if unit is muted, setSpeaker again +if (count (_unit getVariable [QGVAR(muteUnitReasons), []]) > 0) then { + ["setSpeaker", [_unit, "ACE_NoVoice"]] call FUNC(localEvent); +}; diff --git a/addons/common/functions/fnc_muteUnitHandleRespawn.sqf b/addons/common/functions/fnc_muteUnitHandleRespawn.sqf new file mode 100644 index 0000000000..021b083bfd --- /dev/null +++ b/addons/common/functions/fnc_muteUnitHandleRespawn.sqf @@ -0,0 +1,12 @@ +// by commy2 +#include "script_component.hpp" + +private "_unit"; + +_unit = _this select 0; + +// setVariable is broken on JIP after respawn +_unit setVariable [QGVAR(muteUnitReasons), _unit getVariable [QGVAR(muteUnitReasons), []], true]; + +// fix mp issues with respawning and the speaker +["setSpeaker", [_unit, speaker _unit]] call FUNC(globalEvent); diff --git a/addons/common/functions/fnc_restoreVariablesJIP.sqf b/addons/common/functions/fnc_restoreVariablesJIP.sqf index 2c173a054c..ca185082cb 100644 --- a/addons/common/functions/fnc_restoreVariablesJIP.sqf +++ b/addons/common/functions/fnc_restoreVariablesJIP.sqf @@ -23,6 +23,3 @@ _respawnVariables pushBack "ACE_PersistentFunctions"; { _unit setVariable [_x, _unit getVariable _x, true]; } forEach _respawnVariables; - -// fix speaker after respawn -[_unit, format ["{_this setSpeaker '%1'}", speaker _unit], 2] call FUNC(execRemoteFnc); diff --git a/addons/common/functions/fnc_setVolume.sqf b/addons/common/functions/fnc_setVolume.sqf index 91d66a00ec..ee2c42e39c 100644 --- a/addons/common/functions/fnc_setVolume.sqf +++ b/addons/common/functions/fnc_setVolume.sqf @@ -27,7 +27,7 @@ if (_setVolume) then { player setVariable ["tf_unable_to_use_radio", false]; // ACRE2 - player setVariable ["acre_sys_core_globalVolume", NORMAL_LEVEL]; + [NORMAL_LEVEL] call acre_api_fnc_setGlobalVolume; player setVariable ["acre_sys_core_isDisabled", false, true]; } else { @@ -40,7 +40,7 @@ if (_setVolume) then { player setVariable ["tf_unable_to_use_radio", true]; // ACRE2 - player setVariable ["acre_sys_core_globalVolume", MUTED_LEVEL]; + [MUTED_LEVEL] call acre_api_fnc_setGlobalVolume; player setVariable ["acre_sys_core_isDisabled", true, true]; }; diff --git a/addons/missileguidance/functions/fnc_translateToModelSpace.sqf b/addons/common/functions/fnc_translateToModelSpace.sqf similarity index 100% rename from addons/missileguidance/functions/fnc_translateToModelSpace.sqf rename to addons/common/functions/fnc_translateToModelSpace.sqf diff --git a/addons/missileguidance/functions/fnc_translateToWeaponSpace.sqf b/addons/common/functions/fnc_translateToWeaponSpace.sqf similarity index 100% rename from addons/missileguidance/functions/fnc_translateToWeaponSpace.sqf rename to addons/common/functions/fnc_translateToWeaponSpace.sqf diff --git a/addons/common/functions/fnc_unmuteUnit.sqf b/addons/common/functions/fnc_unmuteUnit.sqf index 8de7708d4b..94ba72f5a4 100644 --- a/addons/common/functions/fnc_unmuteUnit.sqf +++ b/addons/common/functions/fnc_unmuteUnit.sqf @@ -1,23 +1,39 @@ /* * Author: commy2 * - * Unmutes the unit. + * Unmutes the unit. Only unmutes if the last reason was removed. * * Argument: * 0: Unit (Object) + * 1: Reason to unmute the unit. (String) * * Return value: * Nothing */ #include "script_component.hpp" -private ["_unit", "_speaker"]; +private ["_unit", "_reason"]; _unit = _this select 0; +_reason = _this select 1; if (isNull _unit) exitWith {}; +// remove reason to mute to the unit +private "_muteUnitReasons"; +_muteUnitReasons = _unit getVariable [QGVAR(muteUnitReasons), []]; + +if (_reason in _muteUnitReasons) then { + _muteUnitReasons deleteAt (_muteUnitReasons find _reason); + _unit setVariable [QGVAR(muteUnitReasons), _muteUnitReasons, true]; +}; + +// don't unmute if there is another mute reason! +if (count _muteUnitReasons > 0) exitWith {}; + +private "_speaker"; _speaker = _unit getVariable ["ACE_OriginalSpeaker", ""]; + if (_speaker == "") exitWith {}; -[0, format ["{(_this select 1) setSpeaker '%1'}", _speaker], _unit, "ACE_Speaker"] call FUNC(execPersistentFnc); +["setSpeaker", _unit, [_unit, _speaker]] call FUNC(targetEvent); diff --git a/addons/common/functions/fnc_worldToScreenBounds.sqf b/addons/common/functions/fnc_worldToScreenBounds.sqf new file mode 100644 index 0000000000..7b88350c6a --- /dev/null +++ b/addons/common/functions/fnc_worldToScreenBounds.sqf @@ -0,0 +1,52 @@ +// (c) zGuba 2011 +// Function helper for framing objects on screen. +// Input: [_object,_margins3D,_offset3D] (object, 3 * float array, 3 * float array) +// Output: [_minX,_minY,_minY,_maxY] (4 * float) + +#include "script_component.hpp" + +private ["_minX","_minY","_maxX","_maxY"]; + +PARAMS_3(_object,_margins,_offsets); + +_minX = 10; +_minY = 10; +_maxX = -10; +_maxY = -10; + +if (true) then { + _bounds = boundingBox _object; + + _boundsMin = _bounds select 0; + _boundsMinX = (_boundsMin select 0) - (_margins select 0) + (_offsets select 0); + _boundsMinY = (_boundsMin select 1) - (_margins select 1) + (_offsets select 1); + _boundsMinZ = (_boundsMin select 2) - (_margins select 2) + (_offsets select 2); + _boundsMax = _bounds select 1; + _boundsMaxX = (_boundsMax select 0) + (_margins select 0) + (_offsets select 0); + _boundsMaxY = (_boundsMax select 1) + (_margins select 1) + (_offsets select 1); + _boundsMaxZ = (_boundsMax select 2) + (_margins select 2) + (_offsets select 2); + + _boundsCorners = [ + [_boundsMinX,_boundsMinY,_boundsMinZ], + [_boundsMinX,_boundsMinY,_boundsMaxZ], + [_boundsMinX,_boundsMaxY,_boundsMinZ], + [_boundsMinX,_boundsMaxY,_boundsMaxZ], + [_boundsMaxX,_boundsMinY,_boundsMinZ], + [_boundsMaxX,_boundsMinY,_boundsMaxZ], + [_boundsMaxX,_boundsMaxY,_boundsMinZ], + [_boundsMaxX,_boundsMaxY,_boundsMaxZ] + ]; + + + { + _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}; + } forEach _boundsCorners; +}; + +[_minX,_minY,_maxX,_maxY] diff --git a/addons/common/scripts/assignedItemFix.sqf b/addons/common/scripts/assignedItemFix.sqf index bf8dc193ec..c118115bed 100644 --- a/addons/common/scripts/assignedItemFix.sqf +++ b/addons/common/scripts/assignedItemFix.sqf @@ -1,19 +1,62 @@ // by commy2 #include "script_component.hpp" -if (isNil "ACE_itemFix") then { - ACE_isMapEnabled = call {_config = missionConfigFile >> "showMap"; !isNumber _config || {getNumber _config == 1}}; - ACE_isCompassEnabled = call {_config = missionConfigFile >> "showCompass"; !isNumber _config || {getNumber _config == 1}}; - ACE_isWatchEnabled = call {_config = missionConfigFile >> "showWatch"; !isNumber _config || {getNumber _config == 1}}; - ACE_isRadioEnabled = call {_config = missionConfigFile >> "showRadio"; !isNumber _config || {getNumber _config == 1}}; - ACE_isGPSEnabled = call {_config = missionConfigFile >> "showGPS"; !isNumber _config || {getNumber _config == 1}}; +ACE_isMapEnabled = call {_config = missionConfigFile >> "showMap"; !isNumber _config || {getNumber _config == 1}}; // default value is 1, so do isNumber check first +ACE_isCompassEnabled = call {_config = missionConfigFile >> "showCompass"; !isNumber _config || {getNumber _config == 1}}; +ACE_isWatchEnabled = call {_config = missionConfigFile >> "showWatch"; !isNumber _config || {getNumber _config == 1}}; +ACE_isRadioEnabled = call {_config = missionConfigFile >> "showRadio"; !isNumber _config || {getNumber _config == 1}}; +ACE_isGPSEnabled = call {_config = missionConfigFile >> "showGPS"; !isNumber _config || {getNumber _config == 1}}; - ACE_itemFix = ["ACE_itemFix", "onEachFrame", { - _items = assignedItems ACE_player; - showMap (ACE_isMapEnabled && {"ItemMap" in _items}); - showCompass (ACE_isCompassEnabled && {"ItemCompass" in _items}); - showWatch (ACE_isWatchEnabled && {"ItemWatch" in _items}); - //showRadio (ACE_isRadioEnabled && {"ItemRadio" in _items}); - showGPS (ACE_isGPSEnabled && {"ItemGPS" in _items || {cameraOn == getConnectedUAV ACE_player}}); //If player is activly controling a UAV, showGPS controls showing the map (m key) - }] call BIS_fnc_addStackedEventHandler; -}; +GVAR(AssignedItems) = []; +GVAR(AssignedItemsInfo) = []; + +["playerInventoryChanged", { + private ["_unit", "_assignedItems", "_shownItems"]; + + _unit = _this select 0; + _assignedItems = _this select 1 select 17; + + _shownItems = [ + ACE_isMapEnabled, + ACE_isCompassEnabled, + ACE_isWatchEnabled, + ACE_isRadioEnabled, + ACE_isGPSEnabled + ]; + + { + if !(_x in GVAR(AssignedItems)) then { + GVAR(AssignedItems) pushBack _x; + GVAR(AssignedItemsInfo) pushBack toLower getText (configFile >> "CfgWeapons" >> _x >> "ACE_hideItemType") + }; + + private "_hideItemType"; + _hideItemType = GVAR(AssignedItemsInfo) select (GVAR(AssignedItems) find _x); + + switch (_hideItemType) do { + case ("map"): { + _shownItems set [0, false]; + }; + case ("compass"): { + _shownItems set [1, false]; + }; + case ("watch"): { + _shownItems set [2, false]; + }; + case ("radio"): { + _shownItems set [3, false]; + }; + case ("gps"): { + _shownItems set [4, false]; + }; + }; + } forEach _assignedItems; + + //systemChat str _shownItems; + + showMap (_shownItems select 0); + showCompass (_shownItems select 1); + showWatch (_shownItems select 2); + showRadio (_shownItems select 3); + showGPS (_shownItems select 4 || {cameraOn == getConnectedUAV _unit}); //If player is activly controling a UAV, showGPS controls showing the map (m key) +}] call FUNC(addEventHandler); diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index a5f5368cd0..8301e0a0bb 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -1,363 +1,439 @@  - + - - - ACE-Team - ACE-Team - ACE-Team - ACE-Team - ACE-Team - ACE-Team - Команда ACE - ACE-Team - ACE-Team - ACE-Team - - - Save - Speichern - Guardar - Zapisz - Uložit - Sauvegarder - Сохранить - Salvar - Mentés - Salva - - - Cancel - Abbrechen - Cancelar - Anuluj - Zrušit - Annuler - Отмена - Cancelar - Mégse - Annulla - - - ACE Options - ACE Optionen - Opciones ACE - Opcje ACE - ACE Nastavení - ACE Options - ACE Настройки - Opções do ACE - ACE Opciók - Opzioni ACE - - - - N - N - N - N - S - N - С - N - É - N - - - NNE - NNO - NNE - NNE - SSV - NNE - ССВ - NNE - ÉÉK - NNE - - - NE - NO - NE - NE - SV - NE - СВ - NE - ÉK - NE - - - ENE - ONO - ENE - ENE - VSV - ENE - ВСВ - LNE - KÉK - ENE - - - E - O - E - E - V - E - В - L - K - E - - - ESE - OSO - ESE - ESE - VJV - ESE - ВЮВ - LSE - KDK - ESE - - - SE - SO - SE - SE - JV - SE - ЮВ - SE - DK - SE - - - SSE - SSO - SSE - SSE - JJV - SSE - ЮЮВ - SSE - DDK - SSE - - - S - S - S - S - J - S - Ю - S - D - S - - - SSW - SSW - SSO - SSW - JJZ - SSO - ЮЮЗ - SSO - DDNy - SSO - - - SW - SW - SO - SW - JZ - SO - ЮЗ - SO - DNy - SO - - - WSW - WSW - OSO - WSW - ZJZ - OSO - ЗЮЗ - OSO - NyDNy - OSO - - - W - W - O - W - Z - O - З - O - Ny - O - - - WNW - WNW - ONO - WNW - ZSZ - ONO - ЗСЗ - ONO - NyÉNy - ONO - - - NW - NW - NO - NW - SZ - NO - СЗ - NO - ÉNy - NO - - - NNW - NNW - NNO - NNW - SSZ - NNO - ССЗ - NNO - ÉÉNy - NNO - - - Action cancelled. - Aktion abgebrochen. - Acción cancelada. - Przerwano czynność - Akce přerušena - Action annulée. - Действие отменено. - Ação cancelada. - Művelet megszakítva. - Azione cancellata. - - - [ACE] Miscellaneous Items - [ACE] Verschiedenes - [ACE] Objetos varios - [ACE] Różne przedmioty - [ACE] Ostatní předměty - [ACE] Objets divers - [ACE] Различные предметы - [ACE] Itens diversos - [ACE] Egyéb tárgyak - [ACE] Oggetti vari - - - Disable Command Menu - Befehlsmenü ausschalten - Desactivar menú de mando - Wyłącz menu dowodzenia - Vypnout velící menu - Désactiver Menu Commande - Выключить командное меню - Parancsnoki menü kikapcsolása - - - Unknown - Unbekannt - Desconocido - Nieznany - Neznámý - Неизвестно - Ismeretlen - - - No Voice - Keine Stimme - Sin voz - Brak głosu - Žádný hlas - Без голоса - Nincs hang - - - Akceptuj prośby - Aceptar Peticiones - Accept Requests - Anfrage annehmen - - - Ignoruj prośby - Rechazar Peticiones - Decline Requests - Anfrage ablehnen - - - Akceptuj prośby wysłane przez innych graczy. Akceptacji wymagają między innymi akcje używania / współdzielenia wyposażenia, wykonywania określonych czynności. - Acepta Peticiones de otros jugadores. Pueden ser solicitudes para usar / compartir equipamiento, realizar ciertas acciones. - Accept Requests send by other players. These can be requests to use / share equipment, perform certain actions. - Anfragen anderer Spieler annehmen. Diese Anfragen können sich auf das Benutzen / Teilen von Equipment beziehen oder das Ausführen bestimmter Aktionen. - - - Ignoruj prośby wysłane przez innych graczy. Akceptacji wymagają między innymi akcje używania / współdzielenia wyposażenia, wykonywania określonych czynności. - Rechazar Peticiones de otros jugadores. Pueden ser solicitudes para usar / compartir equipamiento, realizar ciertas acciones. - Decline Requests send by other players. These can be requests to use / share equipment, perform certain actions. - Anfragen anderer Spieler ablehnen. Diese Anfragen können sich auf das Benutzen / Teilen von Equipment beziehen oder das Ausführen bestimmter Aktionen. - - - Feedback icons - Feedback-Icons - - - Select the position of or disable the feedback icons on your screen. These icons will show to provide extra feedback on your character status and actions performed. - Wähle die Position der Feedback-Icons aus oder deaktiviere Sie. Die Feedback-Icons zeigen den Status deiner Einheit an, oder die ausgeführte Aktion. - - - Progress bar location - Position des Fortschrittsanzeige - - - Set the desired location of the progress bar on your screen. - Wähle die Position der Fortschrittsanzeige. - - - Hint Background color - Hinweis Hintergrundfarbe - - - The color of the background from the ACE hints. - Wähle die Hintergrundfarbe für ACE-Hinweise. - - - Hint text font color - Hinweis Textfarbe - - - The color of the text font from the ACE hints. This color is the default color for all text displayed through the ACE Hint system, if the hint text has no other color specified. - Wähle die Textfarbe für ACE-Hinweise. - - - Banana - Banane - - - A banana is an edible fruit, botanically a berry, produced by several kinds of large herbaceous flowering plants in the genus Musa. - Die Bananen (Musa) sind eine Pflanzengattung in der Familie der Bananengewächse (Musaceae) innerhalb der Einkeimblättrigen Pflanzen (Monokotyledonen). - - + + + ACE-Team + ACE-Team + ACE-Team + ACE-Team + ACE-Team + ACE-Team + Команда ACE + ACE-Team + ACE-Team + ACE-Team + + + Save + Speichern + Guardar + Zapisz + Uložit + Sauvegarder + Сохранить + Salvar + Mentés + Salva + + + Cancel + Abbrechen + Cancelar + Anuluj + Zrušit + Annuler + Отмена + Cancelar + Mégse + Annulla + + + ACE Options + ACE Optionen + Opciones ACE + Ustawienia ACE + Nastavení ACE + ACE Options + ACE Настройки + Opções do ACE + ACE Opciók + Opzioni ACE + + + + N + N + N + N + S + N + С + N + É + N + + + NNE + NNO + NNE + NNE + SSV + NNE + ССВ + NNE + ÉÉK + NNE + + + NE + NO + NE + NE + SV + NE + СВ + NE + ÉK + NE + + + ENE + ONO + ENE + ENE + VSV + ENE + ВСВ + LNE + KÉK + ENE + + + E + O + E + E + V + E + В + L + K + E + + + ESE + OSO + ESE + ESE + VJV + ESE + ВЮВ + LSE + KDK + ESE + + + SE + SO + SE + SE + JV + SE + ЮВ + SE + DK + SE + + + SSE + SSO + SSE + SSE + JJV + SSE + ЮЮВ + SSE + DDK + SSE + + + S + S + S + S + J + S + Ю + S + D + S + + + SSW + SSW + SSO + SSW + JJZ + SSO + ЮЮЗ + SSO + DDNy + SSO + + + SW + SW + SO + SW + JZ + SO + ЮЗ + SO + DNy + SO + + + WSW + WSW + OSO + WSW + ZJZ + OSO + ЗЮЗ + OSO + NyDNy + OSO + + + W + W + O + W + Z + O + З + O + Ny + O + + + WNW + WNW + ONO + WNW + ZSZ + ONO + ЗСЗ + ONO + NyÉNy + ONO + + + NW + NW + NO + NW + SZ + NO + СЗ + NO + ÉNy + NO + + + NNW + NNW + NNO + NNW + SSZ + NNO + ССЗ + NNO + ÉÉNy + NNO + + + Action cancelled. + Aktion abgebrochen. + Acción cancelada. + Przerwano czynność + Akce přerušena. + Action annulée. + Действие отменено. + Ação cancelada. + Művelet megszakítva. + Azione cancellata. + + + [ACE] Miscellaneous Items + [ACE] Verschiedenes + [ACE] Objetos varios + [ACE] Różne przedmioty + [ACE] Ostatní předměty + [ACE] Objets divers + [ACE] Различные предметы + [ACE] Itens diversos + [ACE] Egyéb tárgyak + [ACE] Oggetti vari + + + Disable Command Menu + Befehlsmenü ausschalten + Desactivar menú de mando + Wyłącz menu dowodzenia + Vypnout velící menu + Désactiver Menu Commande + Выключить командное меню + Parancsnoki menü kikapcsolása + Disabilita Menù di comando + + + Unknown + Unbekannt + Desconocido + Nieznany + Neznámý + Неизвестно + Ismeretlen + Sconosciuto + Inconnu + + + No Voice + Keine Stimme + Sin voz + Brak głosu + Žádný hlas + Без голоса + Nincs hang + Senza voce + + + Accept Requests + Anfrage akzeptieren + Aceptar peticiones + Akceptuj prośby + Přijmout žádost + Accetta Richieste + Подтвердить запросы + + + Decline Requests + Anfrage ablehnen + Rechazar peticiones + Ignoruj prośby + Zamítnout žádost + Rifiuta Richieste + Отклонить запросы + + + Accept Requests send by other players. These can be requests to use / share equipment, perform certain actions. + Anfragen werden von anderen Mitspielen gestellt. Diese können Anfragen u.a. zum Teilen/Verwenden von Ausrüstungsgegenständen, oder auch zum Ausführen von Handlungen sein. + Acepta peticiones de otros jugadores. Pueden ser solicitudes para usar / compartir equipamiento, realizar ciertas acciones. + Akceptuj prośby wysłane przez innych graczy. Akceptacji wymagają między innymi akcje używania / współdzielenia wyposażenia, wykonywania określonych czynności. + 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. + + + Decline Requests send by other players. These can be requests to use / share equipment, perform certain actions. + Anfragen werden von anderen Mitspielen gestellt. Diese können Anfragen u.a. zum Teilen/Verwenden von Ausrüstungsgegenständen, oder auch zum Ausführen von Handlungen sein. + Rechazar peticiones de otros jugadores. Pueden ser solicitudes para usar / compartir equipamiento, realizar ciertas acciones. + Ignoruj prośby wysłane przez innych graczy. Akceptacji wymagają między innymi akcje używania / współdzielenia wyposażenia, wykonywania określonych czynności. + 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. + + + Feedback icons + Rückmeldungssymbole + Iconos de respuesta + Icone informative + Иконки состояний + Ikony pomocnicze + Icônes de Feedback + Pomocné ikony + + + Select the position of or disable the feedback icons on your screen. These icons will show to provide extra feedback on your character status and actions performed. + Wähle die Position der Rückmeldungssymbole, oder deaktiviere sie. Diese Symbole stellen eine zusätzliche Rückmeldung über die Lage und Handlungen deines Soldaten dar. + Seleccionar la posición de o desactivar los íconos de respuesta en la pantalla. Estos iconos se mostrarán para proporcionar información adicional sobre el estado de su personaje y las acciones a realizar. + Seleziona la posizione o disabilita le icone informative sul tuo schermo. Queste saranno mostrate per fornire informazioni aggiuntive sullo stato o sulle azioni del giocatore. + Выберите положение или или отключите отображение иконок состояний на Вашем экране. Эти иконки предоставят дополнительную информацию о состоянии персонажа и выполняемых действиях. + Ustaw pozycję lub wyłącz całkowicie ikony pomocnicze na ekranie. Te ikony dostarczają dodatkowych informacji na temat statusu Twojej postaci i wykonywanych przez nią akcji. + Sélectionner la position de ou désactiver les îcones de feedback sur votre écran. Ces îcones sont là pour vous fournir un feedback du statut votre personnage et les actions à effectuer. + Nastavuje pozici nebo vypíná pomocné ikony. Tyto ikony ukazují extra informace ke stavu postavy a vykonávaných činností. + + + Progress bar location + Position der Fortschrittsanzeige + Ubicación de la barra de progreso + Posizione della barra di avanzamento + Положение прогресс-бара + Lokalizacja paska postępu + Localisation de la barre de progression + Pozice ukazetele průběhu činnosti + + + Set the desired location of the progress bar on your screen. + Setze die gewünschte Position der Fortschrittsanzeige fest + Seleccionar la ubicación deseada de la barra de progreso en tu pantalla + Modifica la posizione su schermo della barra di avanzamento. + Установите желаемое положение строки состояния на экране. + Ustaw pożądaną lokalizację paska postępu na ekranie + Définisez l'endroit que vous désirez pour faire appraître la barre de progression. + Nastavuje pozici ukazetele průběhu činnosti na vaší obrazovce. + + + Hint Background color + Hintergrundfarbe der Hinweise + Color de fondo de las notificaciones + Sfondo dei Suggerimenti + Цвет фона всплывающих подсказок + Kolor tła powiadomień + Couleur de fond des astuces + Barva pozadí nápovědy + + + The color of the background from the ACE hints. + 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 + Définisez la couleur de fond pour les astuces fournies par ACE. + Barva pozadí ACE nápověd. + + + Hint text font color + Textfarbe der Hinweise + Color del texto de las notificaciones + Testo dei Suggerimenti + Цвет шрифта всплывающих подсказок + Kolor tekstu powiadomień + Couleur du texte des astuces + Barva fontu nápověd. + + + The color of the text font from the ACE hints. This color is the default color for all text displayed through the ACE Hint system, if the hint text has no other color specified. + Wähle die Textfarbe für ACE-Hinweise. + El color del texto de las notificaciones del ACE. Este es el color predeterminado para todo el texto que se muestra a través del sistema de notificaciones del ACE, si el texto de notificación no tiene otro color especificado. + 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. + Définisez la couleur du texte des astuces fournies par ACE. La couleur est celle par défaut affichée à travers toutes les astuces de ACE seulement si aucune couleur n'est défnie. + 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. + + + Banana + Banane + Banana + Banán + Banana + Банан + Banan + Banane + + + A banana is an edible fruit, botanically a berry, produced by several kinds of large herbaceous flowering plants in the genus Musa. + Die Banane ist eine essbare Frucht, biologisch betrachtet jedoch eine Beere. Sie wächst an unterschiedlichen, krautartigen Gewächsen aus der Familie der Musa. + Una banana es una fruta comestible, botanicamente una baya, producida por varios tipos de grandes plantas herbáceas del género Musa. + Banán je protáhlé ovoce a plod banánovníku (epigeická bobule). + Una banana è un frutto commestibile, nello specifico una bacca cuoiosa, prodotto da un gran numero di grandi pianti erbacee dotate di fiori, della famiglia delle Musaceae. + Банан - это съедобный фрукт, ягода с ботанической точки зрения, произрастающий на нескольких видах травянистых растениях рода Банан (Musa). + Rodzaj roślin z rodziny bananowatych, obejmujący około 80 gatunków.<br />Przedstawiciele są typowymi przedstawicielami flory międzyzwrotnikowej Azji, Afryki i Australii.<br />Część gatunków dostarcza jadalnych owoców. Słowo banan pochodzi prawdopodobnie od arabskiego słowa banan, co oznacza palec, lub afrykańskiego języka wolof, w którym rośliny te określa się mianem banaana. + Une banane est un fruit comestible, botaniquement une baie, produite par plusieurs types de grandes plantes herbacées à fleurs dans le genre Musa. + + \ No newline at end of file diff --git a/addons/disarming/$PBOPREFIX$ b/addons/disarming/$PBOPREFIX$ new file mode 100644 index 0000000000..47b746cf19 --- /dev/null +++ b/addons/disarming/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\disarming \ No newline at end of file diff --git a/addons/disarming/CfgEventHandlers.hpp b/addons/disarming/CfgEventHandlers.hpp new file mode 100644 index 0000000000..e75956f440 --- /dev/null +++ b/addons/disarming/CfgEventHandlers.hpp @@ -0,0 +1,11 @@ +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)); + }; +}; diff --git a/addons/disarming/CfgVehicles.hpp b/addons/disarming/CfgVehicles.hpp new file mode 100644 index 0000000000..381aaed93e --- /dev/null +++ b/addons/disarming/CfgVehicles.hpp @@ -0,0 +1,17 @@ +class CfgVehicles { + class Man; + class CAManBase: Man { + class ACE_Actions { + class ACE_MainActions { + class ACE_DisarmInventory { + displayName = "$STR_ACE_Disarming_OpenInventory"; + distance = 3.5; + condition = QUOTE([ARR_2(_player,_target)] call FUNC(canPlayerDisarmUnit)); + statement = QUOTE([ARR_2(_player,_target)] call FUNC(openDisarmDialog)); + icon = PATHTOF(UI\disarm.paa); + exceptions[] = {}; + }; + }; + }; + }; +}; diff --git a/addons/disarming/CfgWeapons.hpp b/addons/disarming/CfgWeapons.hpp new file mode 100644 index 0000000000..404ef4aa76 --- /dev/null +++ b/addons/disarming/CfgWeapons.hpp @@ -0,0 +1,14 @@ +class CfgWeapons { + class ACE_ItemCore; + class InventoryItem_Base_F; + + class ACE_DebugPotato: ACE_ItemCore { + displayName = "ACE Potato (debug)"; + descriptionShort = "Glorious Potato
If you see this in game it means someone fucked up"; + picture = QUOTE(PATHTOF(UI\potato_ca.paa)); + scope = 1; + class ItemInfo: InventoryItem_Base_F { + mass = 1; + }; + }; +}; diff --git a/addons/disarming/README.md b/addons/disarming/README.md new file mode 100644 index 0000000000..0423aa48bd --- /dev/null +++ b/addons/disarming/README.md @@ -0,0 +1,11 @@ +ace_disarming +============ + +Adds ability to make units drop items/weapons/magazines. + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [PabstMirror](https://github.com/PabstMirror) diff --git a/addons/disarming/UI/disarm.paa b/addons/disarming/UI/disarm.paa new file mode 100644 index 0000000000..d13f38daee Binary files /dev/null and b/addons/disarming/UI/disarm.paa differ diff --git a/addons/disarming/UI/potato_ca.paa b/addons/disarming/UI/potato_ca.paa new file mode 100644 index 0000000000..00757d8ed3 Binary files /dev/null and b/addons/disarming/UI/potato_ca.paa differ diff --git a/addons/disarming/XEH_postInit.sqf b/addons/disarming/XEH_postInit.sqf new file mode 100644 index 0000000000..7315ef1785 --- /dev/null +++ b/addons/disarming/XEH_postInit.sqf @@ -0,0 +1,4 @@ +#include "script_component.hpp" + +["DisarmDropItems", {_this call FUNC(eventTargetStart)}] call EFUNC(common,addEventHandler); +["DisarmDebugCallback", {_this call FUNC(eventCallerFinish)}] call EFUNC(common,addEventHandler); diff --git a/addons/disarming/XEH_preInit.sqf b/addons/disarming/XEH_preInit.sqf new file mode 100644 index 0000000000..84534e41b4 --- /dev/null +++ b/addons/disarming/XEH_preInit.sqf @@ -0,0 +1,17 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP(canBeDisarmed); +PREP(canPlayerDisarmUnit); +PREP(disarmDropItems); +PREP(eventCallerFinish); +PREP(eventTargetFinish); +PREP(eventTargetStart); +PREP(getAllGearContainer); +PREP(getAllGearUnit); +PREP(openDisarmDialog); +PREP(showItemsInListbox); +PREP(verifyMagazinesMoved); + +ADDON = true; diff --git a/addons/disarming/config.cpp b/addons/disarming/config.cpp new file mode 100644 index 0000000000..00f8204b09 --- /dev/null +++ b/addons/disarming/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {}; + weapons[] = {"ACE_DebugPotato"}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ACE_Interaction"}; + author[] = {"PabstMirror"}; + authorUrl = "https://github.com/PabstMirror/"; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" + +#include "gui_disarm.hpp" diff --git a/addons/disarming/functions/fnc_canBeDisarmed.sqf b/addons/disarming/functions/fnc_canBeDisarmed.sqf new file mode 100644 index 0000000000..04171a900d --- /dev/null +++ b/addons/disarming/functions/fnc_canBeDisarmed.sqf @@ -0,0 +1,34 @@ +/* + * Author: PabstMirror + * Checks the conditions for being able to disarm a unit + * + * Arguments: + * 0: Target + * + * Return Value: + * Can Be Disarmed + * + * Example: + * [cursorTarget] call ace_disarming_fnc_canBeDisarmed + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_1(_target); + +//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 +_animationStateCfgMoves = getText (configFile >> "CfgMovesMaleSdr" >> "States" >> (animationState _target) >> "actions"); +if (_animationStateCfgMoves == "") exitWith {false}; +_putDownAnim = getText (configFile >> "CfgMovesBasic" >> "Actions" >> _animationStateCfgMoves >> "PutDown"); +if (_putDownAnim != "") exitWith {false}; + + +(alive _target) && +{(abs (speed _target)) < 1} && +{(vehicle _target) == _target} && +{(_target getVariable ["ACE_isUnconscious", false]) || + {_target getVariable [QEGVAR(captives,isHandcuffed), false]} || + {_target getVariable [QEGVAR(captives,isSurrendering), false]}} diff --git a/addons/disarming/functions/fnc_canPlayerDisarmUnit.sqf b/addons/disarming/functions/fnc_canPlayerDisarmUnit.sqf new file mode 100644 index 0000000000..ec9e975ec2 --- /dev/null +++ b/addons/disarming/functions/fnc_canPlayerDisarmUnit.sqf @@ -0,0 +1,22 @@ +/* + * Author: PabstMirror + * Checks the conditions for being able to disarm a unit + * + * Arguments: + * 0: Player + * 1: Target + * + * Return Value: + * Can Be Disarm Target + * + * Example: + * [player, cursorTarget] call ace_disarming_fnc_canPlayerDisarmUnit + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_player,_target); + +([_target] call FUNC(canBeDisarmed)) && +{([_player, _target, []] call EFUNC(common,canInteractWith))} diff --git a/addons/disarming/functions/fnc_disarmDropItems.sqf b/addons/disarming/functions/fnc_disarmDropItems.sqf new file mode 100644 index 0000000000..24ab96a2cf --- /dev/null +++ b/addons/disarming/functions/fnc_disarmDropItems.sqf @@ -0,0 +1,252 @@ +/* + * Author: PabstMirror + * Makes a unit drop items + * + * Arguments: + * 0: caller (player) + * 1: target + * 2: classnamess + * 3: Do Not Drop Ammo + * + * Return Value: + * Nothing + * + * Example: + * [player, cursorTarget, ["ace_bandage"]] call ace_disarming_fnc_disarmDropItems + * + * Public: No + */ +#include "script_component.hpp" + +#define TIME_MAX_WAIT 5 + +PARAMS_3(_caller,_target,_listOfItemsToRemove); +DEFAULT_PARAM(3,_doNotDropAmmo,false); //By default units drop all weapon mags when dropping a weapon + +_fncSumArray = { + _return = 0; + {_return = _return + _x;} forEach (_this select 0); + _return +}; + +//Sanity Checks +if (!([_target] call FUNC(canBeDisarmed))) exitWith { + [_caller, _target, "Debug: Cannot disarm target"] call FUNC(eventTargetFinish); +}; +if (_doNotDropAmmo && {({_x in _listOfItemsToRemove} count (magazines _target)) > 0}) exitWith { + [_caller, _target, "Debug: Trying to drop magazine with _doNotDropAmmo flag"] call FUNC(eventTargetFinish); +}; + +_holder = objNull; + +//If not dropping ammo, don't use an existing container +if (!_doNotDropAmmo) then { + { + if ((_x getVariable [QGVAR(disarmUnit), objNull]) == _target) exitWith { + _holder = _x; + }; + } forEach ((getpos _target) nearObjects [DISARM_CONTAINER, 3]); +}; + +//Create a new weapon holder +if (isNull _holder) then { + _dropPos = _target modelToWorld [0.4, 0.75, 0]; //offset someone unconscious isn't lying over it + _dropPos set [2, ((getPosASL _target) select 2)]; + _holder = createVehicle [DISARM_CONTAINER, _dropPos, [], 0, "CAN_COLLIDE"]; + _holder setPosASL _dropPos; + _holder setVariable [QGVAR(disarmUnit), _target, true]; +}; + +//Verify holder created +if (isNull _holder) exitWith { + [_caller, _target, "Debug: Null Holder"] call FUNC(eventTargetFinish); +}; +//Make sure only one drop operation at a time (using PFEH system as a queue) +if (_holder getVariable [QGVAR(holderInUse), false]) exitWith { + [{ + _this call FUNC(disarmDropItems); + }, _this, 0, 0] call EFUNC(common,waitAndExecute); +}; +_holder setVariable [QGVAR(holderInUse), true]; + + +//Remove Magazines +_targetMagazinesStart = magazinesAmmo _target; +_holderMagazinesStart = magazinesAmmoCargo _holder; + +{ + EXPLODE_2_PVT(_x,_xClassname,_xAmmo); + if ((_xClassname in _listOfItemsToRemove) && {!(_xClassname in UNIQUE_MAGAZINES)}) then { + _holder addMagazineAmmoCargo [_xClassname, 1, _xAmmo]; + _target removeMagazine _xClassname; + }; +} forEach _targetMagazinesStart; + +_targetMagazinesEnd = magazinesAmmo _target; +_holderMagazinesEnd = magazinesAmmoCargo _holder; + +//Verify Mags dropped from unit: +if ( ({((_x select 0) in _listOfItemsToRemove) && {!((_x select 0) in UNIQUE_MAGAZINES)}} count _targetMagazinesEnd) != 0) exitWith { + _holder setVariable [QGVAR(holderInUse), false]; + [_caller, _target, "Debug: Didn't Remove Magazines"] call FUNC(eventTargetFinish); +}; +//Verify holder has mags unit had +if (!([_targetMagazinesStart, _targetMagazinesEnd, _holderMagazinesStart, _holderMagazinesEnd] call FUNC(verifyMagazinesMoved))) then { + ERR = [_targetMagazinesStart, _targetMagazinesEnd, _holderMagazinesStart, _holderMagazinesEnd]; + _holder setVariable [QGVAR(holderInUse), false]; + [_caller, _target, "Debug: Crate Magazines not in holder"] call FUNC(eventTargetFinish); +}; + +//Remove Items, Assigned Items and NVG +_holderItemsStart = getitemCargo _holder; +_targetItemsStart = (assignedItems _target) + (items _target); +if ((headgear _target) != "") then {_targetItemsStart pushBack (headgear _target);}; +if ((goggles _target) != "") then {_targetItemsStart pushBack (goggles _target);}; + + +_addToCrateClassnames = []; +_addToCrateCount = []; +{ + if (_x in _listOfItemsToRemove) then { + if (_x in (items _target)) then { + _target removeItem _x; + } else { + _target unlinkItem _x; + }; + _index = _addToCrateClassnames find _x; + if (_index != -1) then { + _addToCrateCount set [_index, ((_addToCrateCount select _index) + 1)]; + } else { + _addToCrateClassnames pushBack _x; + _addToCrateCount pushBack 1; + }; + }; +} forEach _targetItemsStart; + +//Add the items to the holder (combined to reduce addItemCargoGlobal calls) +{ + _holder addItemCargoGlobal [(_addToCrateClassnames select _forEachIndex), (_addToCrateCount select _forEachIndex)]; +} forEach _addToCrateClassnames; + +_holderItemsEnd = getitemCargo _holder; +_targetItemsEnd = (assignedItems _target) + (items _target); +if ((headgear _target) != "") then {_targetItemsEnd pushBack (headgear _target);}; +if ((goggles _target) != "") then {_targetItemsEnd pushBack (goggles _target);}; + +//Verify Items Added +if (((count _targetItemsStart) - (count _targetItemsEnd)) != ([_addToCrateCount] call _fncSumArray)) exitWith { + _holder setVariable [QGVAR(holderInUse), false]; + [_caller, _target, "Debug: Items Not Removed From Player"] call FUNC(eventTargetFinish); +}; +if ((([_holderItemsEnd select 1] call _fncSumArray) - ([_holderItemsStart select 1] call _fncSumArray)) != ([_addToCrateCount] call _fncSumArray)) exitWith { + _holder setVariable [QGVAR(holderInUse), false]; + [_caller, _target, "Debug: Items Not Added to Holder"] call FUNC(eventTargetFinish); +}; + + +//If holder is still empty, it will be 'garbage collected' while we wait for the drop 'action' to take place +//So add a dummy item and just remove at the end +_holderIsEmpty = ([_holder] call FUNC(getAllGearContainer)) isEqualTo [[],[]]; +if (_holderIsEmpty) then { + TRACE_1("Debug: adding dummy item to holder",_holder); + _holder addItemCargoGlobal [DUMMY_ITEM, 1]; +}; + +//Start the PFEH to do the actions (which could take >1 frame) +[{ + PARAMS_2(_args,_pfID); + EXPLODE_8_PVT(_args,_caller,_target,_listOfItemsToRemove,_holder,_holderIsEmpty,_maxWaitTime,_doNotDropAmmo,_startingMagazines); + + _needToRemoveWeapon = ({_x in _listOfItemsToRemove} count (weapons _target)) > 0; + _needToRemoveMagazines = ({_x in _listOfItemsToRemove} count (magazines _target)) > 0; + _needToRemoveBackpack = ((backPack _target) != "") && {(backPack _target) in _listOfItemsToRemove}; + _needToRemoveVest = ((vest _target) != "") && {(vest _target) in _listOfItemsToRemove}; + _needToRemoveUniform = ((uniform _target) != "") && {(uniform _target) in _listOfItemsToRemove}; + + if ((time < _maxWaitTime) && {[_target] call FUNC(canBeDisarmed)} && {_needToRemoveWeapon || _needToRemoveMagazines || _needToRemoveBackpack}) then { + //action drop weapons (keeps loaded magazine and attachements) + { + if (_x in _listOfItemsToRemove) then { + _target action ["DropWeapon", _holder, _x]; + }; + } forEach (weapons _target); + + //Drop magazine (keeps unique ID) + { + if (_x in _listOfItemsToRemove) then { + _target action ["DropMagazine", _holder, _x]; + }; + } forEach (magazines _target); + + //Drop backpack (Keeps variables for ACRE/TFR) + if (_needToRemoveBackpack) then {_target action ["DropBag", _holder, (backPack _target)];}; + } else { + [_pfID] call CBA_fnc_removePerFrameHandler; + + if (_doNotDropAmmo) then { + _error = false; + + _magsToPickup = +_startingMagazines; + { + _index = _magsToPickup find _x; + if (_index == -1) exitWith {_error = true; ERROR("More mags than when we started?")}; + _magsToPickup deleteAt _index; + } forEach (magazinesAmmo _target); + + _magazinesInHolder = magazinesAmmoCargo _holder; + { + _index = _magazinesInHolder find _x; + if (_index == -1) exitWith {_error = true; ERROR("Missing mag not in holder")}; + _magazinesInHolder deleteAt _index; + } forEach _magsToPickup; + + //No Error (all the ammo in the container is ammo we should have); + if ((!_error) && {_magazinesInHolder isEqualTo []}) then { + { + _target addMagazine _x; + } forEach (magazinesAmmoCargo _holder); + clearMagazineCargoGlobal _holder; + }; + }; + + //If we added a dummy item, remove it now + if (_holderIsEmpty && {!((getItemCargo _holder) isEqualTo [[DUMMY_ITEM],[1]])}) exitWith { + _holder setVariable [QGVAR(holderInUse), false]; + [_caller, _target, "Debug: Holder should only have dummy item"] call FUNC(eventTargetFinish); + }; + if (_holderIsEmpty) then { + TRACE_1("Debug: removing dummy item from holder",_holder); + clearItemCargoGlobal _holder; + }; + //Verify we didn't timeout waiting on drop action + if (time >= _maxWaitTime) exitWith { + _holder setVariable [QGVAR(holderInUse), false]; + [_caller, _target, "Debug: Drop Actions Timeout"] call FUNC(eventTargetFinish); + }; + //If target lost disarm status: + if (!([_target] call FUNC(canBeDisarmed))) exitWith { + _holder setVariable [QGVAR(holderInUse), false]; + [_caller, _target, "Debug: Target cannot be disarmed"] call FUNC(eventTargetFinish); + }; + if (_needToRemoveVest && {!((vestItems _target) isEqualTo [])}) exitWith { + _holder setVariable [QGVAR(holderInUse), false]; + [_caller, _target, "Debug: Vest Not Empty"] call FUNC(eventTargetFinish); + }; + if (_needToRemoveVest) then { + _holder addItemCargoGlobal [(vest _target), 1]; + removeVest _target; + }; + if (_needToRemoveUniform && {!((uniformItems _target) isEqualTo [])}) exitWith { + _holder setVariable [QGVAR(holderInUse), false]; + [_caller, _target, "Debug: Uniform Not Empty"] call FUNC(eventTargetFinish); + }; + if (_needToRemoveUniform) then { + _holder addItemCargoGlobal [(uniform _target), 1]; + removeUniform _target; + }; + + _holder setVariable [QGVAR(holderInUse), false]; + [_caller, _target, ""] call FUNC(eventTargetFinish); + }; + +}, 0.0, [_caller,_target, _listOfItemsToRemove, _holder, _holderIsEmpty, (time + TIME_MAX_WAIT), _doNotDropAmmo, _targetMagazinesEnd]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/disarming/functions/fnc_eventCallerFinish.sqf b/addons/disarming/functions/fnc_eventCallerFinish.sqf new file mode 100644 index 0000000000..c87cb434b3 --- /dev/null +++ b/addons/disarming/functions/fnc_eventCallerFinish.sqf @@ -0,0 +1,25 @@ +/* + * Author: PabstMirror + * Recieves a possible error code from FUNC(eventTargetFinish) + * + * Arguments: + * 0: caller (player) + * 1: target + * 2: error message + * + * Return Value: + * None + * + * Example: + * [player1, player2, "Someting fucked up"] call ace_disarming_fnc_eventCallerFinish + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_3(_caller,_target,_errorMsg); + +if (_caller != ACE_player) exitWith {}; + +systemChat format ["Debug-Caller: Disarm finished from [%1] with code [%2]", _target, _errorMsg]; +diag_log text format ["[ACE_Disarming] %1 - eventCallerFinish: %2", time, _this]; diff --git a/addons/disarming/functions/fnc_eventTargetFinish.sqf b/addons/disarming/functions/fnc_eventTargetFinish.sqf new file mode 100644 index 0000000000..8cc67fa486 --- /dev/null +++ b/addons/disarming/functions/fnc_eventTargetFinish.sqf @@ -0,0 +1,26 @@ +/* + * Author: PabstMirror + * After FUNC(disarmDropItems) has completed, passing a possible error code. + * Passes that error back to orginal caller. + * + * Arguments: + * 0: caller + * 1: target + * 2: errorMsg + * + * Return Value: + * Nothing + * + * Example: + * [player1, player2, "Someting fucked up"] call ace_disarming_fnc_eventTargetFinish + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_3(_caller,_target,_errorMsg); + +if (_errorMsg != "") then { + diag_log text format ["[ACE_Disarming] %1 - eventTargetFinish: %2", time, _this]; + ["DisarmDebugCallback", [_caller], [_caller, _target, _errorMsg]] call EFUNC(common,targetEvent); +}; diff --git a/addons/disarming/functions/fnc_eventTargetStart.sqf b/addons/disarming/functions/fnc_eventTargetStart.sqf new file mode 100644 index 0000000000..c91f717e2a --- /dev/null +++ b/addons/disarming/functions/fnc_eventTargetStart.sqf @@ -0,0 +1,39 @@ +/* + * Author: PabstMirror + * Disarm Event Handler, Starting func, called on the target. + * If target has to remove uniform/vest, this will add all uniform/vest items to the drop list. + * + * Arguments: + * 0: caller (player) + * 1: target + * 2: type of disarm + * + * Return Value: + * Nothing + * + * Example: + * eventTargetStart + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_3(_caller,_target,_listOfObjectsToRemove); + +_itemsToAdd = []; +{ + if (_x == (uniform _target)) then { + _itemsToAdd = _itemsToAdd + (uniformItems _target); + }; + if (_x == (vest _target)) then { + _itemsToAdd = _itemsToAdd + (vestItems _target); + }; +} forEach _listOfObjectsToRemove; + +{ + if (!(_x in _listOfObjectsToRemove)) then { + _listOfObjectsToRemove pushBack _x; + }; +} forEach _itemsToAdd; + +[_caller, _target, _listOfObjectsToRemove] call FUNC(disarmDropItems); diff --git a/addons/disarming/functions/fnc_getAllGearContainer.sqf b/addons/disarming/functions/fnc_getAllGearContainer.sqf new file mode 100644 index 0000000000..c5b2c445ab --- /dev/null +++ b/addons/disarming/functions/fnc_getAllGearContainer.sqf @@ -0,0 +1,29 @@ +/* + * Author: PabstMirror + * Helper function to get all gear of a container + * + * Arguments: + * 0: Container + * + * Return Value: + * Array of 2 arrays, classnames and count + * + * Example: + * [["ace_bandage"],[2]] = [box] call ace_disarming_fnc_getAllGearContainer + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_1(_target); + +private ["_allGear"]; + +_allGear = [[],[]]; + +{ + (_allGear select 0) append (_x select 0); + (_allGear select 1) append (_x select 1); +} forEach [(getWeaponCargo _target), (getItemCargo _target), (getMagazineCargo _target), (getBackpackCargo _target)]; + +_allGear diff --git a/addons/disarming/functions/fnc_getAllGearUnit.sqf b/addons/disarming/functions/fnc_getAllGearUnit.sqf new file mode 100644 index 0000000000..d07f40c972 --- /dev/null +++ b/addons/disarming/functions/fnc_getAllGearUnit.sqf @@ -0,0 +1,52 @@ +/* + * Author: PabstMirror + * Helper function to get all gear of a unit. + * + * Arguments: + * 0: Target + * + * Return Value: + * Array of 2 arrays, classnames and count + * + * Example: + * [["ace_bandage"],[2]] = [bob] call ace_disarming_fnc_getAllGearUnit + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_1(_target); + +_allItems = ((weapons _target) + (magazines _target) + (items _target) + (assignedItems _target)); + +if ((backpack _target) != "") then { + _allItems pushBack (backpack _target); +}; +if ((vest _target) != "") then { + _allItems pushBack (vest _target); +}; +if ((uniform _target) != "") then { + _allItems pushBack (uniform _target); +}; +if ((headgear _target) != "") then { + _allItems pushBack (headgear _target); +}; +//What kind of asshole takes a man's glasses? +if ((goggles _target) != "") then { + _allItems pushBack (goggles _target); +}; + +_uniqueClassnames = []; +_classnamesCount = []; +//Filter unique and count +{ + _index = _uniqueClassnames find _x; + if (_index != -1) then { + _classnamesCount set [_index, ((_classnamesCount select _index) + 1)]; + } else { + _uniqueClassnames pushBack _x; + _classnamesCount pushBack 1; + }; +} forEach _allItems; + +[_uniqueClassnames, _classnamesCount] diff --git a/addons/disarming/functions/fnc_openDisarmDialog.sqf b/addons/disarming/functions/fnc_openDisarmDialog.sqf new file mode 100644 index 0000000000..6da123b831 --- /dev/null +++ b/addons/disarming/functions/fnc_openDisarmDialog.sqf @@ -0,0 +1,106 @@ +/* + * Author: PabstMirror + * Opens the disarm dialog (allowing a person to remove items) + * + * Arguments: + * 0: Caller (player) + * 1: Target + * + * Return Value: + * None + * + * Example: + * [player, bob] call ace_disarming_fnc_openDisarmDialog + * + * Public: No + */ +#include "script_component.hpp" + +#define TEXTURES_RANKS [ \ + "", \ + "\A3\Ui_f\data\GUI\Cfg\Ranks\private_gs.paa", \ + "\A3\Ui_f\data\GUI\Cfg\Ranks\corporal_gs.paa", \ + "\A3\Ui_f\data\GUI\Cfg\Ranks\sergeant_gs.paa", \ + "\A3\Ui_f\data\GUI\Cfg\Ranks\lieutenant_gs.paa", \ + "\A3\Ui_f\data\GUI\Cfg\Ranks\captain_gs.paa", \ + "\A3\Ui_f\data\GUI\Cfg\Ranks\major_gs.paa", \ + "\A3\Ui_f\data\GUI\Cfg\Ranks\colonel_gs.paa" \ + ] + +PARAMS_2(_caller,_target); + +//Sanity Checks +if (_caller != ACE_player) exitwith {ERROR("Player isn't caller?");}; +if (!([_player, _target] call FUNC(canPlayerDisarmUnit))) exitWith {ERROR("Can't Disarm Unit");}; +if (dialog) then {ERROR("Dialog open when trying to open disarm dialog"); closeDialog 0;}; + +disableSerialization; + +createDialog QGVAR(remoteInventory); + +_display = uiNamespace getVariable ["ACE_remoteInventory", displayNull]; +if (isNull _display) exitWith {ERROR("Display is Null");}; + +GVAR(disarmTarget) = _target; + +//Setup Drop Event (on right pannel) +(_display displayCtrl 632) ctrlAddEventHandler ["LBDrop", { + if (isNull GVAR(disarmTarget)) exitWith {}; + PARAMS_5(_ctrl,_xPos,_yPos,_idc,_itemInfo); + EXPLODE_3_PVT((_itemInfo select 0),_displayText,_value,_data); + + if (isNull GVAR(disarmTarget)) exitWith {ERROR("disarmTarget is null");}; + + TRACE_2("Debug: Droping %1 from %2",_data,GVAR(disarmTarget)); + ["DisarmDropItems", [GVAR(disarmTarget)], [ACE_player, GVAR(disarmTarget), [_data]]] call EFUNC(common,targetEvent); + + false //not sure what this does +}]; + +//Setup PFEH +[{ + disableSerialization; + EXPLODE_2_PVT(_this,_args,_pfID); + EXPLODE_3_PVT(_args,_player,_target,_display); + + if ((!([_player, _target] call FUNC(canPlayerDisarmUnit))) || + {isNull _display} || + {_player != ACE_player}) then { + + [_pfID] call CBA_fnc_removePerFrameHandler; + 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; + _rankPicture = _display displayCtrl 1203; + + //Show rank and name (just like BIS's inventory) + _rankIndex = ((["PRIVATE", "CORPORAL", "SERGEANT", "LIEUTENANT", "CAPTAIN", "MAJOR", "COLONEL"] find (rank _target)) + 1); + _rankPicture ctrlSetText (TEXTURES_RANKS select _rankIndex); + _playerName ctrlSetText ([GVAR(disarmTarget)] call EFUNC(common,getName)); + + //Clear both inventory lists: + lbClear _groundContainer; + lbClear _targetContainer; + + //Show the items in the ground disarmTarget's inventory + _targetUniqueItems = [GVAR(disarmTarget)] call FUNC(getAllGearUnit); + [_targetContainer, _targetUniqueItems] call FUNC(showItemsInListbox); + + //Try to find a holder that the target is using to drop items into: + _holder = objNull; + { + if ((_x getVariable [QGVAR(disarmUnit), objNull]) == _target) exitWith { + _holder = _x; + }; + } forEach ((getpos _target) nearObjects [DISARM_CONTAINER, 3]); + + //If a holder exists, show it's inventory + if (!isNull _holder) then { + _holderUniqueItems = [_holder] call FUNC(getAllGearContainer); + [_groundContainer, _holderUniqueItems] call FUNC(showItemsInListbox); + }; + }; +}, 0, [_caller, _target, _display]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/disarming/functions/fnc_showItemsInListbox.sqf b/addons/disarming/functions/fnc_showItemsInListbox.sqf new file mode 100644 index 0000000000..e040233b82 --- /dev/null +++ b/addons/disarming/functions/fnc_showItemsInListbox.sqf @@ -0,0 +1,60 @@ +/* + * Author: PabstMirror + * Shows a list of inventory items in a listBox control. + * + * Arguments: + * 0: RscListBox + * 1: ItemArray [["itemClassnames"],[counts]] + * + * Return Value: + * Nothing + * + * Example: + * [theListBox, [["ace_bandage"],[2]]] call ace_disarming_fnc_showItemsInListbox + * + * Public: No + */ +#include "script_component.hpp" + +disableSerialization; +PARAMS_2(_listBoxCtrl,_itemsCountArray); + +private "_classname"; + +{ + _displayName = ""; + _picture = ""; + + _classname = _x; + _count = (_itemsCountArray select 1) select _forEachIndex; + + if (_classname != DUMMY_ITEM) then { //Don't show the dummy potato + + switch (true) do { + case (isClass (configFile >> "CfgWeapons" >> _classname)): { + _displayName = getText (configFile >> "CfgWeapons" >> _classname >> "displayName"); + _picture = getText (configFile >> "CfgWeapons" >> _classname >> "picture"); + }; + case (isClass (configFile >> "CfgMagazines" >> _classname)): { + _displayName = getText (configFile >> "CfgMagazines" >> _classname >> "displayName"); + _picture = getText (configFile >> "CfgMagazines" >> _classname >> "picture"); + }; + case (isClass (configFile >> "CfgVehicles" >> _classname)): { + _displayName = getText (configFile >> "CfgVehicles" >> _classname >> "displayName"); + _picture = getText (configFile >> "CfgVehicles" >> _classname >> "picture"); + }; + case (isClass (configFile >> "CfgGlasses" >> _classname)): { + _displayName = getText (configFile >> "CfgGlasses" >> _classname >> "displayName"); + _picture = getText (configFile >> "CfgGlasses" >> _classname >> "picture"); + }; + default { + ERROR(format ["[%1] - bad classname", _classname]); + }; + }; + + _listBoxCtrl lbAdd format ["%1", _displayName]; + _listBoxCtrl lbSetData [_forEachIndex, _classname]; + _listBoxCtrl lbSetPicture [_forEachIndex, _picture]; + _listBoxCtrl lbSetTextRight [_forEachIndex, str _count]; + }; +} forEach (_itemsCountArray select 0); diff --git a/addons/disarming/functions/fnc_verifyMagazinesMoved.sqf b/addons/disarming/functions/fnc_verifyMagazinesMoved.sqf new file mode 100644 index 0000000000..779a5e39ba --- /dev/null +++ b/addons/disarming/functions/fnc_verifyMagazinesMoved.sqf @@ -0,0 +1,41 @@ +/* + * Author: PabstMirror + * Verifies magazines moved with exact ammo counts preserved. + * Arrays will be in format from magazinesAmmo/magazinesAmmoCargo + * e.g.: [["30Rnd_65x39_caseless_mag",15], ["30Rnd_65x39_caseless_mag",30]] + * + * Arguments: + * 0: Start on container A + * 1: End on container A + * 2: Start on container B + * 3: End on container B + * + * Return Value: + * Verified Good + * + * Example: + * [stuff] call ace_disarming_fnc_verifyMagazinesMoved + * + * Public: No + */ +#include "script_component.hpp" + +private ["_problem", "_beginingArray"]; + +PARAMS_4(_startA,_endA,_startB,_endB); + +//Quick Lazy Count Check +if (((count _startA) + (count _startB)) != ((count _endA) + (count _endB))) exitWith { + false +}; + +_beginingArray = (_startA + _startB); + +_problem = false; +{ + _index = _beginingArray find _x; + if (_index == -1) exitWith {_problem = true;}; + _beginingArray deleteAt _index; +} forEach (_endA + _endB); + +(!_problem) && {_beginingArray isEqualTo []} diff --git a/addons/disarming/functions/script_component.hpp b/addons/disarming/functions/script_component.hpp new file mode 100644 index 0000000000..38e082ee0e --- /dev/null +++ b/addons/disarming/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\disarming\script_component.hpp" \ No newline at end of file diff --git a/addons/disarming/gui_disarm.hpp b/addons/disarming/gui_disarm.hpp new file mode 100644 index 0000000000..0961b809ed --- /dev/null +++ b/addons/disarming/gui_disarm.hpp @@ -0,0 +1,162 @@ +//The disarming dialog +//Meant to mimic the real BIS inventory (so people understand how to use it) + +class RscText; +class RscPicture; +class RscActiveText; +class RscListBox; + +//Use the definese from +#define X_BIS(num) (num * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)) +#define Y_BIS(num) (num * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)) +#define W_BIS(num) (num * (((safezoneW / safezoneH) min 1.2) / 40)) +#define H_BIS(num) (num * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 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(QEGVAR(inventory,inventoryDisplaySize)), 0)]), X_BIS(num), X_MAKEITBIGGA(num))]) +#define Y_PART(num) QUOTE(linearConversion [ARR_5(0, 2, (missionNamespace getVariable [ARR_2(QUOTE(QEGVAR(inventory,inventoryDisplaySize)), 0)]), Y_BIS(num), Y_MAKEITBIGGA(num))]) +#define W_PART(num) QUOTE(linearConversion [ARR_5(0, 2, (missionNamespace getVariable [ARR_2(QUOTE(QEGVAR(inventory,inventoryDisplaySize)), 0)]), W_BIS(num), W_MAKEITBIGGA(num))]) +#define H_PART(num) QUOTE(linearConversion [ARR_5(0, 2, (missionNamespace getVariable [ARR_2(QUOTE(QEGVAR(inventory,inventoryDisplaySize)), 0)]), H_BIS(num), H_MAKEITBIGGA(num))]) + +class GVAR(remoteInventory) { + idd = -1; + movingEnable = 0; + enableSimulation = 1; + enableDisplay = 1; + onLoad = "uiNamespace setVariable ['ACE_remoteInventory', _this select 0];"; + duration = 2147483647; + fadein = 0; + fadeout = 0; + + class Colors { + dragValidBgr[] = {"(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])","(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])","(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])",0.5}; + dragInvalidBgr[] = {"(profilenamespace getvariable ['IGUI_ERROR_RGB_R',0.8])","(profilenamespace getvariable ['IGUI_ERROR_RGB_G',0.0])","(profilenamespace getvariable ['IGUI_ERROR_RGB_B',0.0])",0.5}; + dragValidBar[] = {"(profilenamespace getvariable ['IGUI_WARNING_RGB_R',0.8])","(profilenamespace getvariable ['IGUI_WARNING_RGB_G',0.5])","(profilenamespace getvariable ['IGUI_WARNING_RGB_B',0.0])",0.5}; + dragInvalidBar[] = {"(profilenamespace getvariable ['IGUI_ERROR_RGB_R',0.8])","(profilenamespace getvariable ['IGUI_ERROR_RGB_G',0.0])","(profilenamespace getvariable ['IGUI_ERROR_RGB_B',0.0])",0.5}; + progressBar[] = {"(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])","(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])","(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])",1}; + progressBarBgr[] = {"(profilenamespace getvariable ['IGUI_BCG_RGB_R',0])","(profilenamespace getvariable ['IGUI_BCG_RGB_G',1])","(profilenamespace getvariable ['IGUI_BCG_RGB_B',1])",0.75}; + highlight[] = {"(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])","(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])","(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])",0.5}; + }; + + class controlsBackground {}; + + class controls { + class CA_ContainerBackground: RscText { + idc = -1; + x = X_PART(1); + y = Y_PART(1); + w = W_PART(12); + h = H_PART(22.5); + colorBackground[] = {0.05,0.05,0.05,0.7}; + }; + class CA_PlayerBackground: RscText { + idc = -1; + x = X_PART(14.6); + y = Y_PART(2); + w = W_PART(24.4); + h = H_PART(21.5); + colorBackground[] = {0.05,0.05,0.05,0.7}; + }; + class TitleBackground: RscText { + idc = -1; + x = X_PART(14.6); + y = Y_PART(1); + w = W_PART(24.4); + h = H_PART(1); + colorBackground[] = {0.1,0.1,0.1,1}; + }; + class PlayersName: RscText { + idc = 111; + // text = "Player name here:"; + x = X_PART(15.6); + y = Y_PART(1); + w = W_PART(19.8); + h = H_PART(1); + }; + class RankBackground: RscText { + idc = -1; + x = X_PART(15.1); + y = Y_PART(1.25); + w = W_PART(0.6); + h = H_PART(0.6); + colorBackground[] = {1,1,1,0.2}; + }; + class RankPicture: RscPicture { + idc = 1203; + // text = "\A3\Ui_f\data\GUI\Cfg\Ranks\corporal_gs.paa"; + x = X_PART(15.1); + y = Y_PART(1.25); + w = W_PART(0.6); + h = H_PART(0.6); + }; + class ButtonBack: RscActiveText { + idc = -1; + style = 48; + color[] = {1,1,1,0.7}; + text = "\A3\Ui_f\data\GUI\Rsc\RscDisplayArcadeMap\icon_exit_cross_ca.paa"; + x = X_PART(38); + y = Y_PART(1); + w = W_PART(1); + h = H_PART(1); + colorText[] = {1,1,1,0.7}; + colorActive[] = {1,1,1,1}; + tooltip = "$STR_DISP_OPT_CLOSE"; + onButtonClick = "closeDialog 0"; + }; + class ExternalContainerBackground: RscPicture { + colorText[] = {1,1,1,0.1}; + idc = -1; + x = X_PART(1.5); + y = Y_PART(3.7); + w = W_PART(11); + h = H_PART(18.4); + }; + class PlayerContainerBackground: ExternalContainerBackground { + idc = -1; + x = X_PART(15.1); + y = Y_PART(6); + w = W_PART(11); + h = H_PART(14); + }; + class GroundTitleBackground: RscText { + idc = -1; + x = X_PART(1); + y = Y_PART(1); + w = W_PART(12); + h = H_PART(1); + colorBackground[] = {0.1,0.1,0.1,1}; + }; + class GroundName: RscText { + idc = -1; + text = "$STR_cfgVehicles_WeaponHolder0"; //"ground" + x = X_PART(1); + y = Y_PART(1); + w = W_PART(12); + h = H_PART(1); + }; + class GroundContainer: RscListBox { + idc = 632; + sizeEx = "0.8 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + sizeEx2 = "0.8 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + rowHeight = "1.75 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + canDrag = 0; + colorText[] = {1,1,1,1}; + colorBackground[] = {0,0,0,0}; + itemBackground[] = {1,1,1,0.2}; + itemSpacing = 0.001; + x = X_PART(1.5); + y = Y_PART(2.5); + w = W_PART(11); + h = H_PART(21); + }; + class UniformContainer: GroundContainer { + idc = 633; + canDrag = 1; + x = X_PART(15.1); + }; + }; +}; diff --git a/addons/disarming/script_component.hpp b/addons/disarming/script_component.hpp new file mode 100644 index 0000000000..d9bec366dc --- /dev/null +++ b/addons/disarming/script_component.hpp @@ -0,0 +1,16 @@ +#define COMPONENT disarming +#include "\z\ace\addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_DISARMING + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_DISARMING + #define DEBUG_SETTINGS DEBUG_SETTINGS_DISARMING +#endif + +#include "\z\ace\addons\main\script_macros.hpp" + +#define DISARM_CONTAINER "GroundWeaponHolder" +#define DUMMY_ITEM "ACE_DebugPotato" +#define UNIQUE_MAGAZINES ["ACE_key_customKeyMagazine"] \ No newline at end of file diff --git a/addons/disarming/stringtable.xml b/addons/disarming/stringtable.xml new file mode 100644 index 0000000000..69f0336808 --- /dev/null +++ b/addons/disarming/stringtable.xml @@ -0,0 +1,11 @@ + + + + + + Open Inventory + Otwórz ekwipunek + Otevřít inventář + + + \ No newline at end of file diff --git a/addons/disposable/stringtable.xml b/addons/disposable/stringtable.xml index 8b6c032961..86c4b2d8e8 100644 --- a/addons/disposable/stringtable.xml +++ b/addons/disposable/stringtable.xml @@ -1,5 +1,4 @@  - @@ -7,7 +6,7 @@ Benutze Einwegwaffe Tube utilisé Použitý odpalovač - Zużyta tuba + Zużyta rura Lanzador utilizado Használt cső Отстрелянная труба @@ -17,20 +16,20 @@ Benutzter Einweg-Raketenwerfer Lance-roquette à usage unique utilisé Použitý raketomet - Zużyta tuba granatnika jednorazowego użytku + Zużyta rura granatnika jednorazowego użytku Lanzador desechable utilizado Használt rakétavető Отстрелянная одноразовая пусковая установка Preloaded Missile Dummy - Preloaded Missile Dummy - Preloaded Missile Dummy - Preloaded Missile Dummy - Preloaded Missile Dummy + Vorgeladene Racketennachbildung + Missile préchargé Dummy + Přednabitá dummy střela + Wstępnie załadowana atrapa pocisku Preloaded Missile Dummy Preloaded Missile Dummy Заряженная ракетная пустышка - \ No newline at end of file + diff --git a/addons/dragging/functions/fnc_dropObject.sqf b/addons/dragging/functions/fnc_dropObject.sqf index 489457bfbc..9589457dbe 100644 --- a/addons/dragging/functions/fnc_dropObject.sqf +++ b/addons/dragging/functions/fnc_dropObject.sqf @@ -23,8 +23,10 @@ _unit removeAction (_unit getVariable [QGVAR(ReleaseActionID), -1]); private "_inBuilding"; _inBuilding = [_unit] call FUNC(isObjectOnObject); -// play release animation -_unit playAction "released"; +if !(_unit getvariable ["ACE_isUnconscious", false]) then { + // play release animation + _unit playAction "released"; +}; // prevent collision damage ["fixCollision", _unit] call EFUNC(common,localEvent); @@ -58,3 +60,7 @@ if !(_target isKindOf "CAManBase") then { ["fixPosition", _target, _target] call EFUNC(common,targetEvent); ["fixFloating", _target, _target] call EFUNC(common,targetEvent); }; + +if (_unit getvariable ["ACE_isUnconscious", false]) then { + [_unit, "unconscious", 2, true] call EFUNC(common,doAnimation); +}; diff --git a/addons/dragging/functions/fnc_dropObject_carry.sqf b/addons/dragging/functions/fnc_dropObject_carry.sqf index 5e2ea8b8c1..b6dfe9fc45 100644 --- a/addons/dragging/functions/fnc_dropObject_carry.sqf +++ b/addons/dragging/functions/fnc_dropObject_carry.sqf @@ -32,7 +32,7 @@ detach _target; // fix anim when aborting carrying persons if (_target isKindOf "CAManBase" || {animationState _unit in CARRY_ANIMATIONS}) then { - if (vehicle _unit == _unit) then { + if (vehicle _unit == _unit && {!(_unit getvariable ["ACE_isUnconscious", false])}) then { [_unit, "", 2, true] call EFUNC(common,doAnimation); }; diff --git a/addons/dragging/stringtable.xml b/addons/dragging/stringtable.xml index 9193d2712e..51fcf43c0b 100644 --- a/addons/dragging/stringtable.xml +++ b/addons/dragging/stringtable.xml @@ -1,5 +1,4 @@ - - + @@ -28,18 +27,15 @@ Item to heavy - Gegenstand zu schwer + Gegenstand ist zu schwer Articulo demasiado pesado - + Túl nehéz ahhoz, hogy elhúzd + Слишком тяжело + Moc težké Carry diff --git a/addons/explosives/CfgACE_Triggers.hpp b/addons/explosives/ACE_Triggers.hpp similarity index 96% rename from addons/explosives/CfgACE_Triggers.hpp rename to addons/explosives/ACE_Triggers.hpp index 6319444cb2..9c33246cd8 100644 --- a/addons/explosives/CfgACE_Triggers.hpp +++ b/addons/explosives/ACE_Triggers.hpp @@ -1,10 +1,10 @@ -class CfgACE_Triggers { +class ACE_Triggers { /* onPlace parameters: 0: OBJECT - unit placing 1: OBJECT - Placed explosive 2: STRING - Magazine classname 3: ARRAY - vars -Last Index: CfgACE_Triggers config of trigger type. +Last Index: ACE_Triggers config of trigger type. onSetup parameters: 0: STRING - Magazine Classname */ diff --git a/addons/explosives/config.cpp b/addons/explosives/config.cpp index 9652c38dd2..e77d2bf624 100644 --- a/addons/explosives/config.cpp +++ b/addons/explosives/config.cpp @@ -18,7 +18,8 @@ class CfgPatches { #include "CfgMagazines.hpp" #include "CfgWeapons.hpp" #include "CfgVehicles.hpp" -#include "CfgACE_Triggers.hpp" + +#include "ACE_Triggers.hpp" #include "ExplosivesUI.hpp" class CfgActions { diff --git a/addons/explosives/functions/fnc_addClacker.sqf b/addons/explosives/functions/fnc_addClacker.sqf index 1e12b79d62..7e3529f931 100644 --- a/addons/explosives/functions/fnc_addClacker.sqf +++ b/addons/explosives/functions/fnc_addClacker.sqf @@ -12,7 +12,7 @@ * None * * Example: - * [player, _explosive, "SatchelCharge_Remote_Mag", [ConfigFile >> "CfgACE_Triggers" >> "Command"]] call ACE_Explosives_fnc_addClacker; + * [player, _explosive, "SatchelCharge_Remote_Mag", [ConfigFile >> "ACE_Triggers" >> "Command"]] call ACE_Explosives_fnc_addClacker; * * Public: Yes */ diff --git a/addons/explosives/functions/fnc_addDetonateActions.sqf b/addons/explosives/functions/fnc_addDetonateActions.sqf index 8c6cfb4d0c..5081040233 100644 --- a/addons/explosives/functions/fnc_addDetonateActions.sqf +++ b/addons/explosives/functions/fnc_addDetonateActions.sqf @@ -24,7 +24,7 @@ _result = [_unit] call FUNC(getPlacedExplosives); _children = []; { if (!isNull(_x select 0)) then { - _required = getArray (ConfigFile >> "CfgACE_Triggers" >> (_x select 4) >> "requires"); + _required = getArray (ConfigFile >> "ACE_Triggers" >> (_x select 4) >> "requires"); if (_detonator in _required) then { _item = ConfigFile >> "CfgMagazines" >> (_x select 3); diff --git a/addons/explosives/functions/fnc_getPlacedExplosives.sqf b/addons/explosives/functions/fnc_getPlacedExplosives.sqf index 9b40002bbe..1164972047 100644 --- a/addons/explosives/functions/fnc_getPlacedExplosives.sqf +++ b/addons/explosives/functions/fnc_getPlacedExplosives.sqf @@ -20,7 +20,7 @@ private ["_unit", "_clackerList", "_adjustedList", "_list", "_filter"]; _unit = _this select 0; _filter = nil; if (count _this > 1) then { - _filter = ConfigFile >> "CfgACE_Triggers" >> (_this select 1); + _filter = ConfigFile >> "ACE_Triggers" >> (_this select 1); }; _clackerList = []; _adjustedList = false; @@ -31,7 +31,7 @@ _list = []; _clackerList set [_foreachIndex, "X"]; _adjustedList = true; } else { - if (isNil "_filter" || {(ConfigFile >> "CfgACE_Triggers" >> (_x select 4)) == _filter}) then { + if (isNil "_filter" || {(ConfigFile >> "ACE_Triggers" >> (_x select 4)) == _filter}) then { _list pushBack _x; }; }; diff --git a/addons/explosives/functions/fnc_placeExplosive.sqf b/addons/explosives/functions/fnc_placeExplosive.sqf index 90997fd2ad..228e8eef23 100644 --- a/addons/explosives/functions/fnc_placeExplosive.sqf +++ b/addons/explosives/functions/fnc_placeExplosive.sqf @@ -33,7 +33,7 @@ if (isNil "_triggerConfig") exitWith { }; _magazineTrigger = ConfigFile >> "CfgMagazines" >> _magazineClass >> "ACE_Triggers" >> _triggerConfig; -_triggerConfig = ConfigFile >> "CfgACE_Triggers" >> _triggerConfig; +_triggerConfig = ConfigFile >> "ACE_Triggers" >> _triggerConfig; if (isNil "_triggerConfig") exitWith { diag_log format ["ACE_Explosives: Error config not found in PlaceExplosive: %1", _this]; diff --git a/addons/explosives/functions/fnc_selectTrigger.sqf b/addons/explosives/functions/fnc_selectTrigger.sqf index 48f7f3f199..53bc8b66cb 100644 --- a/addons/explosives/functions/fnc_selectTrigger.sqf +++ b/addons/explosives/functions/fnc_selectTrigger.sqf @@ -19,7 +19,7 @@ private ["_config"]; EXPLODE_3_PVT(_this,_explosive,_magazine,_trigger); -_config = ConfigFile >> "CfgACE_Triggers" >> _trigger; +_config = ConfigFile >> "ACE_Triggers" >> _trigger; // If the onSetup function returns true, it is handled elsewhere if (isText(_config >> "onSetup") && {[_explosive,_magazine] call compile getText (_config >> "onSetup")}) exitWith {}; diff --git a/addons/explosives/functions/fnc_triggerType.sqf b/addons/explosives/functions/fnc_triggerType.sqf index 8ebcbf6699..fc6a0b90c1 100644 --- a/addons/explosives/functions/fnc_triggerType.sqf +++ b/addons/explosives/functions/fnc_triggerType.sqf @@ -6,7 +6,7 @@ * 0: Explosive magazine * * Return Value: - * Supported triggers as CfgACE_Triggers config entries + * Supported triggers as ACE_Triggers config entries * * Example: * _supports = ["SatchelCharge_Remote_Mag"] call ACE_Explosives_fnc_TriggerType @@ -20,6 +20,6 @@ _config = getArray (ConfigFile >> "CfgMagazines" >> (_this select 0) >> "ACE_Tri _count = count _config; for "_index" from 0 to (_count - 1) do { - _result set [_index, ConfigFile >> "CfgACE_Triggers" >> (_config select _index)]; + _result set [_index, ConfigFile >> "ACE_Triggers" >> (_config select _index)]; }; _result diff --git a/addons/explosives/stringtable.xml b/addons/explosives/stringtable.xml index 1d010a0a7e..f0df907f16 100644 --- a/addons/explosives/stringtable.xml +++ b/addons/explosives/stringtable.xml @@ -1,498 +1,502 @@  - + - - - Explosives - Sprengstoffe - Explosivos - Ładunki wybuchowe - Explosifs - Výbušniny - Esplosivi - Robbanóanyagok - Explosivos - Взрывчатка - - - Place >> - Platzieren >> - Colocar >> - Umieść >> - Placer >> - Položit >> - Piazza >> - Lerakás >> - Colocar >> - Установить >> - - - Detonate >> - Zünden >> - Detonar >> - Detonuj >> - Mise à feu >> - Odpálit >> - Detona >> - Robbantás >> - Detonar >> - Подрыв >> - - - Explosive code: %1 - Sprengstoffcode: %1 - Código del explosivo: %1 - 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 - - - Place - Platzieren - Colocar - Umieść - Placer - Položit - Piazza - Elhelyezés - Colocar - Положить - - - Cancel - Abbrechen - Cancelar - Anuluj - Annuler - Zrušit - Annulla - Mégsem - Cancelar - Отмена - - - + Modifier, rotates - + Modifikator, drehen - + Modificador, girar - + Modificateur, tourner - + Modificatore, rotazione - + Otočit - + Változtatás, forgatás - + modyfikator, obracanie - + Modificador, rotaciona - + Bращать - - - Turn On Thor III - Thor III aktivieren - Encender Thor III - Włącz Thor III - Allumer Thor III - Zapnout Thor III - Accendi Thor III - Thor III bekapcsolása - Ativar Thor III - Активировать Thor III - - - Turn Off Thor III - Thor III deaktivieren - Apagar Thor III - Wyłącz Thor III - Éteindre Thor III - Vypnout Thor III - Spegni Thor III - Thor III kikapcsolása - Desativar Thor III - Деактивировать Thor III - - - Cellphone - Mobiltelefon - Télefono móvil - Telefon komórkowy - Téléphone Portable - Telefon - Cellulare - Mobil - Celular - Сотовый телефон - - - Used to remotely trigger explosives - Wird benutzt um Sprengstoffe fernzuzünden - Usado para detonar remotamente explosivos - Używany do zdalnego detonowania ładunków wybuchowych - Utilisé pour déclencher des explosifs à distance - Používaný ke vzdálenému odpalování výbušnin - Usato per l'attivazione a distanza degli esplosivi - Robbanóanyagok távoli robbantásához - Usado para acionar explosivos remotamente - Используется для удаленного запуска взрывчатку - - - M57 Firing Device - M57 Zündvorrichtung - Dispositivo de detonación M57 - Zapalnik M57 - M57 Dispositif de mise à feu - M57 Odpalovací Zařízení - Detonatore M57 - M57 Detonátor - M57 Dispositivo de Detonação - Взрыватель M57 - - - Used to remotely trigger explosives - Wird benutzt um Sprengstoffe fernzuzünden - Usado para detonar remotamente explosivos - Używany do zdalnego detonowania ładunków wybuchowych - Utilisé pour déclencher des explosifs à distance - Použévané ke vzdálenému odpalování výbušnin - Usato per l'attivazione a distanza degli esplosivi - Robbanóanyagok távoli robbantásához - Usado para acionar explosivos remotamente - Используется для удаленного запуска взрывчатку - - - M26 Firing Device - M26 Zündvorrichtung - Dispositivo de detonación MK26 - Zapalnik M26 - M26 Dispositif de mise à feu - M26 Odpalovací Zařízení - Detonatore M26 - M26 Detonátor - M26 Dispositivo de Detonação - Взрыватель M26 - - - M152 RAMS - M152 RAMS - M152 RAMS - M152 RAMS - M152 RAMS - M152 RAMS - M152 RAMS - M152 RAMS - M152 RAMS - M152 RAMS - - - Defusal Kit - Entschärfungskit - Kit de desactivación - Zestaw do rozbrajania - Kit de désamorçage - Zneškodňovací sada - Kit E.O.D. - Hatástalanító felszerelés - Kit de desarme - Разминирование комплект - - - Allows defusing of explosives - Erlaubt die Entschärfung von Sprengstoffen - Permite desactivar explosivos - Umożliwia rozbrajanie ładunków wybuchowych - Permet de désamorçer des explosifs - Dovoluje zneškodňování výbušnin - Consente la disattivazione degli ordigni esplosivi - Robbanóanyagok hatástalanításához - Permite o desarme de explosivos - Allows defusing of explosives - - - Add to Speed Dial - Zur Schnellauswahl hinzufügen - Agregar a marcado rápido - Dodaj do szybkiego wybierania - Ajouter à la composition rapide - Přidat jako rychlou volbu - Aggiungi alla selezione rapida - Hozzáadás gyorshíváshoz - Adicionar à ligação rápida - Добавить в ускоренный набор - - - Clear - Löschen - Borrar - Usuń - Désamorçé - Čistý - Libera - Törlés - Limpar - Pассеиваться - - - Dial - Wählen - Marcar - Wybierz mumer - Composer - Vytočit - Composizione numero - Tárcsázás - Discar - Hабрать - - - Up - Hoch - Arriba - W górę - Haut - Nahoru - Sopra - Fel - Cima - Поднять - - - Down - Runter - Abajo - W dół - Bas - Dolu - Sotto - Le - Baixo - Опустить - - - Cancel - Abbrechen - Cancelar - Anuluj - Annuler - Zrušit - Annulla - Mégsem - Cancelar - Отмена - - - Detonate Menu - "Zünden"-Menü - Menú de detonación - Menu detonowania - Menu de mise à feu - Menu Detonace - Menù di detonazione - Robbantás menü - Menu de detonação - Меню Подрыв - - - Place Menu - "Platzieren"-Menü - Menú de colocación - Menu umieszczania - Menu Placement - Menu Umístění - Menù di collocamento - Lerakás menü - Menu de posicionamento - Меню Установить - - - Defuse - Entschärfen - Desactivar - Rozbrój - Désamorçer - Zneškodnit - Disinnesca - Hatástalanítás - Desarmar - Обезвредить - - - Defusing Explosive... - Entschärfe Sprengstoff... - Desactivando explosivo... - Rozbrajanie ładunku... - Désamorçage des explosifs... - Zneškodňuji Výbušninu... - Esposivo in fase di disattivazione... - Robbanóanyag hatástalaníása... - Desarmando Explosivo... - Обезвреживание... - - - Timer - Zeitzünder - Temporizador - Czasomierz - Retard - Časovač - Cronometro - Időzített - Timer - Временной - - - Time: %1m %2s - Zeit: %1m %2s - Tiempo: %1m %2s - Czas: %1m %2s - Temps : %1m %2s - Čas: %1m %2s - Tempo : %1m %2s - Idő: %1m %2s - Tempo: %1m %2s - Tемп: %1m %2c - - - Set Time - Zeit einstellen - Configurar tiempo - Ustaw czas - Régler retard - Nastavit Čas - Modifica il conto alla rovescia - Idő állítása - Configurar Tempo - Xронометр - - - Select a Trigger - Wähle einen Zünder - Seleccionar un disparador - Wybierz zapalnik - Sélectionner une mise à feu - Zvolit Detonátor - Seleziona un Attivatore - Detonátor kiválasztása - Selecionar um Gatilho - Выберите - - - Select - Wählen - Seleccionar - Wybierz - Sélectionner - Zvolit - Seleziona - Kiválasztás - Selecionar - Выбрать защелка - - - Pressure Plate - Płyta naciskowa - Placa de presión - Druckplatte - Plaque de pression - Nášlapná nástraha - Piastra a Pressione - Nyomólap - Placa de pressão - Давление - - - Tripwire - Linka naciągu - Cable trampa - Stolperdraht - Fil de butée - Nástražný drát - Filo a Inciampo - Botlódrót - Linha de tração - Натяжной - - - IR Sensor - Czujnik podczerwieni - Sensor IR - Infrarotsensor - Capteur IR - IR Značkovač - Sensore IR - IR szenzor - Sensor IV - ИК - - - No triggers available for %1 - Brak dostępnych zapalników dla %1 - No hay detonadores disponibles para %1 - Keine Auslöser vorhanden für %1 - Pas de mise à feu disponible pour %1 - Žádný detonátor k dispozici pro %1 - Nessun attivatore disponibile per %1 - Nincs detonátor a %1 - Nenhum gatilho disponível para %1 - Нет защелка доступны для %1 - - - IR Sensor (Side Attack) - Czujnik podczerwieni (wybuch na bok) - Sensor IR (ataque lateral) - Infrarotsensor (Seitenangriff) - Capteur IR (de flanc) - IR Značkovač (Výbuch stranou) - Sensore IR (Attacco laterale) - IR Sensor (Side Attack) - Sensor infravermelho (ataque lateral) - ИК (боковая атака) - - - Magnetic Influence Sensor (Bottom Attack) - Czujnik magnetyczny (wybuch w górę) - Sensor IM (ataque inferior) - Magnetfeldsensor (Bodenangriff) - Capteur Magnétique (par le bas) - Magnetický Senzor (Výbuch ze spoda) - Sensore Magnetico di Prossimità (Attacco inferiore) - Mágneses (Bottom Attack) - Influência magnética (ataque inferior) - Магнитный (дно атака) - - - No explosives on trigger. - Keine Sprengladungen auf diesem Auslöser. - Ningún explosivo en el detonador. - Pas d'explosif à mettre à feu. - Nessun esplosivo sul sensore. - Žádná výbušnina k odpálení. - Nincs robbanóanyag a detonátorhoz. - Brak ładunków na zapalnik. - Nenhum explosivo no gatilho. - Нет взрывчатки на курок. - - - Dead Man's Switch - Totmannschalter - Mise à feu par relâchement de pression - Spínač mrtvého muže - Czuwak - Detonador de hombre muerto - Dead Man's Switch - Кнопка мертвеца - - - Used to remotely trigger explosives when released. - Zündet Sprengladungen wenn losgelassen. - Déclenche la mise à feu d'un explosif lorsqu'il est libéré. - Používaný k vzdálenému odpálení, při uvolnění odpálí výbušniny - Używany w celu zdalnej detonacji ładunków kiedy jego operator zostanie zabity. - Utilizado para detonar explosivos remotamente al soltarlo. - Robbanóanyagok távoli robbantásához - Используется для дистанционного подрыва, после смерти оператора. - - - Pick up - Aufnehmen - - + + + Explosives + Sprengstoffe + Explosivos + Ładunki wybuchowe + Explosifs + Výbušniny + Esplosivi + Robbanóanyagok + Explosivos + Взрывчатка + + + Place >> + Platzieren >> + Colocar >> + Umieść >> + Placer >> + Položit >> + Piazza >> + Lerakás >> + Colocar >> + Установить >> + + + Detonate >> + Zünden >> + Detonar >> + Detonuj >> + Mise à feu >> + Odpálit >> + Detona >> + Robbantás >> + Detonar >> + Подрыв >> + + + Explosive code: %1 + Sprengstoffcode: %1 + Código del explosivo: %1 + 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 + + + Place + Platzieren + Colocar + Umieść + Placer + Položit + Piazza + Elhelyezés + Colocar + Установить + + + Cancel + Abbrechen + Cancelar + Anuluj + Annuler + Zrušit + Annulla + Mégsem + Cancelar + Отмена + + + + Modifier, rotates + + Modifikator, drehen + + Modificador, girar + + Modificateur, tourner + + Modificatore, rotazione + + Modifikátor, otočit + + Változtatás, forgatás + + Modyfikator, obrót + + Modificador, rotaciona + + Bращать + + + Turn On Thor III + Thor III aktivieren + Encender Thor III + Włącz Thor III + Allumer Thor III + Zapnout Thor III + Accendi Thor III + Thor III bekapcsolása + Ativar Thor III + Активировать Thor III + + + Turn Off Thor III + Thor III deaktivieren + Apagar Thor III + Wyłącz Thor III + Éteindre Thor III + Vypnout Thor III + Spegni Thor III + Thor III kikapcsolása + Desativar Thor III + Деактивировать Thor III + + + Cellphone + Mobiltelefon + Télefono móvil + Telefon komórkowy + Téléphone Portable + Telefon + Cellulare + Mobil + Celular + Сотовый телефон + + + Used to remotely trigger explosives + Wird benutzt um Sprengstoffe fernzuzünden + Usado para detonar remotamente explosivos + Używany do zdalnego detonowania ładunków wybuchowych + Utilisé pour déclencher des explosifs à distance + Používaný ke vzdálenému odpalování výbušnin + Usato per l'attivazione a distanza degli esplosivi + Robbanóanyagok távoli robbantásához + Usado para acionar explosivos remotamente + Используется для удаленной детонации СВУ + + + M57 Firing Device + M57 Zündvorrichtung + Dispositivo de detonación M57 + Zapalnik M57 + M57 Dispositif de mise à feu + Odpalovací zařízení M57 + Detonatore M57 + M57 Detonátor + M57 Dispositivo de Detonação + Взрыватель M57 + + + Used to remotely trigger explosives + Wird benutzt um Sprengstoffe fernzuzünden + Usado para detonar remotamente explosivos + Używany do zdalnego detonowania ładunków wybuchowych + Utilisé pour déclencher des explosifs à distance + Používané ke vzdálenému odpalování výbušnin + Usato per l'attivazione a distanza degli esplosivi + Robbanóanyagok távoli robbantásához + Usado para acionar explosivos remotamente + Используется для удаленной детонации зарядов + + + M26 Firing Device + M26 Zündvorrichtung + Dispositivo de detonación MK26 + Zapalnik M26 + M26 Dispositif de mise à feu + Odpalovací zařízení M26 + Detonatore M26 + M26 Detonátor + M26 Dispositivo de Detonação + Взрыватель M26 + + + M152 RAMS + M152 RAMS + M152 RAMS + M152 RAMS + M152 RAMS + M152 RAMS + M152 RAMS + M152 RAMS + M152 RAMS + M152 RAMS + + + Defusal Kit + Entschärfungskit + Kit de desactivación + Zestaw do rozbrajania + Kit de désamorçage + Zneškodňovací sada + Kit E.O.D. + Hatástalanító felszerelés + Kit de desarme + Комплект разминирования + + + Allows defusing of explosives + Erlaubt die Entschärfung von Sprengstoffen + Permite desactivar explosivos + Umożliwia rozbrajanie ładunków wybuchowych + Permet de désamorçer des explosifs + Dovoluje zneškodňování výbušnin + Consente la disattivazione degli ordigni esplosivi + Robbanóanyagok hatástalanításához + Permite o desarme de explosivos + Позволяет обезвреживать ВУ + + + Add to Speed Dial + Zur Schnellauswahl hinzufügen + Agregar a marcado rápido + Dodaj do szybkiego wybierania + Ajouter à la composition rapide + Přidat jako rychlou volbu + Aggiungi alla selezione rapida + Hozzáadás gyorshíváshoz + Adicionar à ligação rápida + Добавить в ускоренный набор + + + Clear + Löschen + Borrar + Usuń + Désamorçé + Čistý + Libera + Törlés + Limpar + Очистить + + + Dial + Wählen + Marcar + Wybierz mumer + Composer + Vytočit + Composizione numero + Tárcsázás + Discar + Hабрать + + + Up + Hoch + Arriba + W górę + Haut + Nahoru + Sopra + Fel + Cima + Вызов + + + Down + Runter + Abajo + W dół + Bas + Dolu + Sotto + Le + Baixo + Сброс + + + Cancel + Abbrechen + Cancelar + Anuluj + Annuler + Zrušit + Annulla + Mégsem + Cancelar + Отмена + + + Detonate Menu + "Zünden"-Menü + Menú de detonación + Menu detonowania + Menu de mise à feu + Menu Detonace + Menù di detonazione + Robbantás menü + Menu de detonação + Меню подрыва + + + Place Menu + "Platzieren"-Menü + Menú de colocación + Menu umieszczania + Menu Placement + Menu Umístění + Menù di collocamento + Lerakás menü + Menu de posicionamento + Меню детонации + + + Defuse + Entschärfen + Desactivar + Rozbrój + Désamorçer + Zneškodnit + Disinnesca + Hatástalanítás + Desarmar + Обезвредить + + + Defusing Explosive... + Entschärfe Sprengstoff... + Desactivando explosivo... + Rozbrajanie ładunku... + Désamorçage des explosifs... + Zneškodňuji Výbušninu... + Esposivo in fase di disattivazione... + Robbanóanyag hatástalaníása... + Desarmando Explosivo... + Обезвреживание... + + + Timer + Zeitzünder + Temporizador + Czasomierz + Retard + Časovač + Cronometro + Időzített + Timer + Таймер + + + Time: %1m %2s + Zeit: %1m %2s + Tiempo: %1m %2s + Czas: %1m %2s + Temps : %1m %2s + Čas: %1m %2s + Tempo : %1m %2s + Idő: %1m %2s + Tempo: %1m %2s + Время: %1m %2c + + + Set Time + Zeit einstellen + Configurar tiempo + Ustaw czas + Régler retard + Nastavit Čas + Modifica il conto alla rovescia + Idő állítása + Configurar Tempo + Установить время + + + Select a Trigger + Wähle einen Zünder + Seleccionar un disparador + Wybierz zapalnik + Sélectionner une mise à feu + Zvolit Detonátor + Seleziona un Attivatore + Detonátor kiválasztása + Selecionar um Gatilho + Выберите детонатор + + + Select + Wählen + Seleccionar + Wybierz + Sélectionner + Zvolit + Seleziona + Kiválasztás + Selecionar + Выбрать + + + Pressure Plate + Płyta naciskowa + Placa de presión + Druckplatte + Plaque de pression + Nášlapná nástraha + Piastra a Pressione + Nyomólap + Placa de pressão + Давление + + + Tripwire + Linka naciągu + Cable trampa + Stolperdraht + Fil de butée + Nástražný drát + Filo a Inciampo + Botlódrót + Linha de tração + Растяжка + + + IR Sensor + Czujnik podczerwieni + Sensor IR + Infrarotsensor + Capteur IR + IR Značkovač + Sensore IR + IR szenzor + Sensor IV + ИК сенсор + + + No triggers available for %1 + Brak dostępnych zapalników dla %1 + No hay detonadores disponibles para %1 + Keine Auslöser vorhanden für %1 + Pas de mise à feu disponible pour %1 + Žádný detonátor k dispozici pro %1 + Nessun attivatore disponibile per %1 + Nincs detonátor a %1 + Nenhum gatilho disponível para %1 + Нет доступных взрывателей для %1 + + + IR Sensor (Side Attack) + Czujnik podczerwieni (wybuch na bok) + Sensor IR (ataque lateral) + Infrarotsensor (Seitenangriff) + Capteur IR (de flanc) + IR Značkovač (Výbuch stranou) + Sensore IR (Attacco laterale) + IR Sensor (Side Attack) + Sensor infravermelho (ataque lateral) + ИК (детонация вбок) + + + Magnetic Influence Sensor (Bottom Attack) + Czujnik magnetyczny (wybuch w górę) + Sensor IM (ataque inferior) + Magnetfeldsensor (Bodenangriff) + Capteur Magnétique (par le bas) + Magnetický Senzor (Výbuch ze spoda) + Sensore Magnetico di Prossimità (Attacco inferiore) + Mágneses (Bottom Attack) + Influência magnética (ataque inferior) + Магнитный (детонация вверх) + + + No explosives on trigger. + Keine Sprengladungen auf diesem Auslöser. + Ningún explosivo en el detonador. + Pas d'explosif à mettre à feu. + Nessun esplosivo sul sensore. + Žádná výbušnina k odpálení. + Nincs robbanóanyag a detonátorhoz. + Brak ładunków na zapalnik. + Nenhum explosivo no gatilho. + Нет доступных ВУ для взрывателя. + + + Dead Man's Switch + Totmannschalter + Mise à feu par relâchement de pression + Spínač mrtvého muže + Czuwak + Detonador de hombre muerto + Dead Man's Switch + Ловушка мертвеца + + + Used to remotely trigger explosives when released. + Zündet Sprengladungen wenn losgelassen. + Déclenche la mise à feu d'un explosif lorsqu'il est libéré. + Používaný k vzdálenému odpálení, při uvolnění odpálí výbušniny + Używany w celu zdalnej detonacji ładunków kiedy jego operator zostanie zabity. + Utilizado para detonar explosivos remotamente al soltarlo. + Robbanóanyagok távoli robbantásához + Используется для дистанционного подрыва, после смерти оператора. + + + Pick up + Aufheben + Recoger + Sebrat + Podnieś + Prendre + + \ No newline at end of file diff --git a/addons/fcs/XEH_clientInit.sqf b/addons/fcs/XEH_clientInit.sqf index d3605d87a7..3338e739e1 100644 --- a/addons/fcs/XEH_clientInit.sqf +++ b/addons/fcs/XEH_clientInit.sqf @@ -4,6 +4,8 @@ GVAR(enabled) = false; GVAR(time) = 0; GVAR(position) = [0,0,0]; +if (!hasInterface) exitWith {}; + #include "initKeybinds.sqf" ["infoDisplayChanged", { diff --git a/addons/fcs/stringtable.xml b/addons/fcs/stringtable.xml index 154d874f73..1f1b0d3acf 100644 --- a/addons/fcs/stringtable.xml +++ b/addons/fcs/stringtable.xml @@ -1,5 +1,4 @@  - @@ -9,13 +8,7 @@ Naświetl cel / Zmierz odległość Označit cíl / Změřit vzdálenost Iluminar objetivo / Medir distancia - - Подсветить цель / Измерить расстояние + Подсветить цель / Замерить расстояние Zeroed To @@ -24,7 +17,7 @@ Wyzerowany na Nastaveno na Zéroté à - Зероинг + Выставлено на Nullázás Fixado em Azzeramento a @@ -32,7 +25,7 @@ Adjust FCS Range (Up) Entfernung des FLS erhöhen - Zwiększ zasięg FCS + Zwiększ zasięg SKO Ajustar distancia del FCS (arriba) Nastavit FCS Náměr (nahoru) Augmenter la distance du SCT @@ -44,7 +37,7 @@ Adjust FCS Range (Down) Entfernung des FLS verringern - Zmniejsz zasięg FCS + Zmniejsz zasięg SKO Ajustar distancia del FCS (abajo) Nastavit FCS Náměr (dolů) Réduire la distance du SCT @@ -58,7 +51,7 @@ FLS zurücksetzen Reiniciar FCS Réinitialiser le SCT - Resetuj FCS + Resetuj SKO Resetovat FCS FCS visszaállítása Reiniciar FCS @@ -70,12 +63,12 @@ FLS wurde zurückgesetzt. FCS reiniciado SCT réinitialisé. - FCS został zresetowany. + SKO został zresetowany. FCS byl resetován. Az FCS visszaállítva FCS reiniciado. L'FCS è stato azzerato - СУО обнулен + СУО обнулен. diff --git a/addons/flashsuppressors/CfgVehicles.hpp b/addons/flashsuppressors/CfgVehicles.hpp index a973518b91..e76f0b8776 100644 --- a/addons/flashsuppressors/CfgVehicles.hpp +++ b/addons/flashsuppressors/CfgVehicles.hpp @@ -7,6 +7,8 @@ class CfgVehicles { MACRO_ADDITEM(ACE_muzzle_mzls_B,5); MACRO_ADDITEM(ACE_muzzle_mzls_smg_01,5); MACRO_ADDITEM(ACE_muzzle_mzls_smg_02,5); + MACRO_ADDITEM(ACE_muzzle_mzls_338,5); + MACRO_ADDITEM(ACE_muzzle_mzls_93mmg,5); }; }; @@ -17,6 +19,8 @@ class CfgVehicles { MACRO_ADDITEM(ACE_muzzle_mzls_B,5); MACRO_ADDITEM(ACE_muzzle_mzls_smg_01,5); MACRO_ADDITEM(ACE_muzzle_mzls_smg_02,5); + MACRO_ADDITEM(ACE_muzzle_mzls_338,5); + MACRO_ADDITEM(ACE_muzzle_mzls_93mmg,5); }; }; @@ -28,6 +32,8 @@ class CfgVehicles { MACRO_ADDITEM(ACE_muzzle_mzls_L,5); MACRO_ADDITEM(ACE_muzzle_mzls_smg_01,5); MACRO_ADDITEM(ACE_muzzle_mzls_smg_02,5); + MACRO_ADDITEM(ACE_muzzle_mzls_338,5); + MACRO_ADDITEM(ACE_muzzle_mzls_93mmg,5); }; }; @@ -38,6 +44,8 @@ class CfgVehicles { MACRO_ADDITEM(ACE_muzzle_mzls_L,2); MACRO_ADDITEM(ACE_muzzle_mzls_smg_01,2); MACRO_ADDITEM(ACE_muzzle_mzls_smg_02,2); + MACRO_ADDITEM(ACE_muzzle_mzls_338,5); + MACRO_ADDITEM(ACE_muzzle_mzls_93mmg,5); }; }; }; diff --git a/addons/flashsuppressors/CfgWeapons.hpp b/addons/flashsuppressors/CfgWeapons.hpp index 973d438961..c070ada18d 100644 --- a/addons/flashsuppressors/CfgWeapons.hpp +++ b/addons/flashsuppressors/CfgWeapons.hpp @@ -1,5 +1,231 @@ +class MuzzleSlot; + class CfgWeapons { + + /* MX */ + + class Rifle; + class Rifle_Base_F: Rifle { + class WeaponSlotsInfo; + }; + + class arifle_MX_Base_F: Rifle_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_H"}; + }; + }; + }; + + class arifle_MX_SW_F: arifle_MX_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + // Shit is broken again + //compatibleItems[] += {"ACE_muzzle_mzls_H"}; + compatibleItems[] = {"muzzle_snds_H","muzzle_snds_H_SW","ACE_muzzle_mzls_H"}; + }; + }; + }; + + + /* Katiba */ + + class arifle_katiba_Base_F: Rifle_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_H"}; + }; + }; + }; + + + /* Other */ + + class Rifle_Long_Base_F: Rifle_Base_F { + class WeaponSlotsInfo; + }; + + class EBR_base_F: Rifle_Long_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_B"}; + }; + }; + }; + + class DMR_01_base_F: Rifle_Long_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_B"}; + }; + }; + }; + + class DMR_02_base_F: Rifle_Long_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_338"}; + }; + }; + }; + + class DMR_03_base_F: Rifle_Long_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_B"}; + }; + }; + }; + + class DMR_05_base_F: Rifle_Long_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_93mmg"}; + }; + }; + }; + + class DMR_06_base_F: Rifle_Long_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_B"}; + }; + }; + }; + + class MMG_01_base_F: Rifle_Long_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_93mmg"}; + }; + }; + }; + + class MMG_02_base_F: Rifle_Long_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_338"}; + }; + }; + }; + + class LMG_Mk200_F: Rifle_Long_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_H"}; + }; + }; + }; + + class LMG_Zafir_F: Rifle_Long_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_B"}; + }; + }; + }; + + + /* Assault Rifles */ + + class Tavor_base_F: Rifle_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_L"}; + }; + }; + }; + + class mk20_base_F: Rifle_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_L"}; + }; + }; + }; + + + /* SMGs */ + + class pdw2000_base_F: Rifle_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_smg_02"}; + }; + }; + }; + + class SMG_01_Base: Rifle_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_smg_01"}; + }; + }; + }; + + class SMG_02_base_F: Rifle_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_smg_02"}; + }; + }; + }; + + + /* Pistols */ + + class Pistol; + class Pistol_Base_F: Pistol { + class WeaponSlotsInfo; + }; + + class hgun_P07_F: Pistol_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + linkProxy = "\A3\data_f\proxies\weapon_slots\MUZZLE"; + compatibleItems[] += {"ACE_muzzle_mzls_smg_02"}; + }; + }; + }; + + class hgun_Rook40_F: Pistol_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + linkProxy = "\A3\data_f\proxies\weapon_slots\MUZZLE"; + compatibleItems[] += {"ACE_muzzle_mzls_smg_02"}; + }; + }; + }; + + class hgun_ACPC2_F: Pistol_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_smg_01"}; + }; + }; + }; + + class hgun_Pistol_heavy_01_F: Pistol_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot: MuzzleSlot { + compatibleItems[] += {"ACE_muzzle_mzls_smg_01"}; + }; + }; + }; + + /*class hgun_Pistol_heavy_02_F: Pistol_Base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + class MuzzleSlot { + linkProxy = "\A3\data_f\proxies\weapon_slots\MUZZLE"; + compatibleItems[] += {"ACE_muzzle_mzls_smg_01"}; + }; + }; + };*/ + + + /* Flashsuppressors */ + class ItemCore; class InventoryMuzzleItem_Base_F; @@ -239,4 +465,96 @@ class CfgWeapons { inertia = 0.1; }; + + class ACE_muzzle_mzls_338: ACE_muzzle_mzls_H { + author = "$STR_ACE_Common_ACETeam"; + _generalMacro = "ACE_muzzle_mzls_338"; + displayName = "$STR_ACE_muzzle_mzls_338"; + picture = "\A3\weapons_F\Data\UI\gear_acca_mzls_h_ca.paa"; + model = "\A3\weapons_f\acc\acca_mzls_H_F"; + + class ItemInfo: ItemInfo { + mass = 8; + soundTypeIndex = 0; + muzzleEnd = "zaslehPoint"; + alternativeFire = "Zasleh2"; + + class MagazineCoef { + initSpeed = 1.0; + }; + + class AmmoCoef { + hit = 1.0; + visibleFire = 0.5; + audibleFire = 1.0; + visibleFireTime = 0.5; + audibleFireTime = 1.0; + cost = 1.0; + typicalSpeed = 1.0; + airFriction = 1.0; + }; + + class MuzzleCoef { + dispersionCoef = "0.9f"; + artilleryDispersionCoef = "1.0f"; + fireLightCoef = "0.5f"; + recoilCoef = "1.0f"; + recoilProneCoef = "1.0f"; + minRangeCoef = "1.0f"; + minRangeProbabCoef = "1.0f"; + midRangeCoef = "1.0f"; + midRangeProbabCoef = "1.0f"; + maxRangeCoef = "1.0f"; + maxRangeProbabCoef = "1.0f"; + }; + }; + + inertia = 0.2; + }; + + class ACE_muzzle_mzls_93mmg: ACE_muzzle_mzls_H { + author = "$STR_ACE_Common_ACETeam"; + _generalMacro = "ACE_muzzle_mzls_93mmg"; + displayName = "$STR_ACE_muzzle_mzls_93mmg"; + picture = "\A3\weapons_F\Data\UI\gear_acca_mzls_h_ca.paa"; + model = "\A3\weapons_f\acc\acca_mzls_H_F"; + + class ItemInfo: ItemInfo { + mass = 8; + soundTypeIndex = 0; + muzzleEnd = "zaslehPoint"; + alternativeFire = "Zasleh2"; + + class MagazineCoef { + initSpeed = 1.0; + }; + + class AmmoCoef { + hit = 1.0; + visibleFire = 0.5; + audibleFire = 1.0; + visibleFireTime = 0.5; + audibleFireTime = 1.0; + cost = 1.0; + typicalSpeed = 1.0; + airFriction = 1.0; + }; + + class MuzzleCoef { + dispersionCoef = "0.9f"; + artilleryDispersionCoef = "1.0f"; + fireLightCoef = "0.5f"; + recoilCoef = "1.0f"; + recoilProneCoef = "1.0f"; + minRangeCoef = "1.0f"; + minRangeProbabCoef = "1.0f"; + midRangeCoef = "1.0f"; + midRangeProbabCoef = "1.0f"; + maxRangeCoef = "1.0f"; + maxRangeProbabCoef = "1.0f"; + }; + }; + + inertia = 0.2; + }; }; diff --git a/addons/flashsuppressors/config.cpp b/addons/flashsuppressors/config.cpp index 6f94efba1d..10b9622d17 100644 --- a/addons/flashsuppressors/config.cpp +++ b/addons/flashsuppressors/config.cpp @@ -3,7 +3,15 @@ class CfgPatches { class ADDON { units[] = {}; - weapons[] = {"ACE_muzzle_mzls_H","ACE_muzzle_mzls_B","ACE_muzzle_mzls_L","ACE_muzzle_mzls_smg_01","ACE_muzzle_mzls_smg_02"}; + weapons[] = { + "ACE_muzzle_mzls_H", + "ACE_muzzle_mzls_B", + "ACE_muzzle_mzls_L", + "ACE_muzzle_mzls_smg_01", + "ACE_muzzle_mzls_smg_02", + "ACE_muzzle_mzls_338", + "ACE_muzzle_mzls_93mmg" + }; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common"}; author[] = {"commy2"}; diff --git a/addons/flashsuppressors/newclasses.txt b/addons/flashsuppressors/newclasses.txt index 5e9543fa37..7030b80857 100644 --- a/addons/flashsuppressors/newclasses.txt +++ b/addons/flashsuppressors/newclasses.txt @@ -4,3 +4,5 @@ ACE_muzzle_mzls_B ACE_muzzle_mzls_L ACE_muzzle_mzls_smg_01 ACE_muzzle_mzls_smg_02 +ACE_muzzle_mzls_338 +ACE_muzzle_mzls_93mmg diff --git a/addons/flashsuppressors/stringtable.xml b/addons/flashsuppressors/stringtable.xml index 3f6cc7b0d2..d3185fc2b0 100644 --- a/addons/flashsuppressors/stringtable.xml +++ b/addons/flashsuppressors/stringtable.xml @@ -1,66 +1,90 @@  - + - - - Flash Suppressor (6.5 mm) - Lángrejtő (6,5 mm) - Mündungsfeuerdämpfer (6,5 mm) - Soppressore di fiamma (6.5mm) - Supressor de Clarão (6,5mm) - Tłumik płomieni (6,5 mm) - Tlumič záblesku (6,5 mm) - Cache-flamme (6,5 mm) - Пламегаситель (6,5 мм) - Supresor (6,5 mm) - - - Flash Suppressor (7.62 mm) - Lángrejtő (7,62 mm) - Mündungsfeuerdämpfer (7,62 mm) - Soppressore di fiamma (7.62mm) - Supressor de Clarão (7,62mm) - Tłumik płomieni (7,62 mm) - Tlumič záblesku (7,62 mm) - Cache-flamme (7,62 mm) - Пламегаситель (7,62 мм) - Supresor (7,62 mm) - - - Flash Suppressor (5.56 mm) - Lángrejtő (5,56 mm) - Mündungsfeuerdämpfer (5,56 mm) - Soppressore di fiamma (5.56mm) - Supressor de Clarão (5,56mm) - Tłumik płomieni (5,56 mm) - Tlumič záblesku (5,56 mm) - Cache-flamme (5,56 mm) - Пламегаситель (5,56 мм) - Supresor (5,56 mm) - - - Flash Suppressor (.45 ACP) - Lángrejtő (.45 ACP) - Mündungsfeuerdämpfer (.45 ACP) - Soppressore di fiamma (.45 ACP) - Supressor de Clarão (.45 ACP) - Tłumik płomieni (.45 ACP) - Tlumič záblesku (.45 ACP) - Cache-flamme (.45 ACP) - Пламегаситель (.45 ACP) - Supresor (.45 ACP) - - - Flash Suppressor (9 mm) - Lángrejtő (9 mm) - Mündungsfeuerdämpfer (9 mm) - Soppressore di fiamma (9 mm) - Supressor de Clarão (9mm) - Tłumik płomieni (9 mm) - Tlumič záblesku (9 mm) - Cache-flamme (9 mm) - Пламегаситель (9 мм) - Supresor (9 mm) - - - + + + Flash Suppressor (6.5 mm) + Lángrejtő (6,5 mm) + Mündungsfeuerdämpfer (6,5 mm) + Soppressore di fiamma (6.5mm) + Supressor de Clarão (6,5mm) + Tłumik płomienia (6,5 mm) + Tlumič plamene (6,5 mm) + Cache-flamme (6,5 mm) + Пламегаситель (6,5 мм) + Supresor (6,5 mm) + + + Flash Suppressor (7.62 mm) + Lángrejtő (7,62 mm) + Mündungsfeuerdämpfer (7,62 mm) + Soppressore di fiamma (7.62mm) + Supressor de Clarão (7,62mm) + Tłumik płomienia (7,62 mm) + Tlumič plamene (7,62 mm) + Cache-flamme (7,62 mm) + Пламегаситель (7,62 мм) + Supresor (7,62 mm) + + + Flash Suppressor (5.56 mm) + Lángrejtő (5,56 mm) + Mündungsfeuerdämpfer (5,56 mm) + Soppressore di fiamma (5.56mm) + Supressor de Clarão (5,56mm) + Tłumik płomienia (5,56 mm) + Tlumič plamene (5,56 mm) + Cache-flamme (5,56 mm) + Пламегаситель (5,56 мм) + Supresor (5,56 mm) + + + Flash Suppressor (.45 ACP) + Lángrejtő (.45 ACP) + Mündungsfeuerdämpfer (.45 ACP) + Soppressore di fiamma (.45 ACP) + Supressor de Clarão (.45 ACP) + Tłumik płomienia (.45 ACP) + Tlumič plamene (.45 ACP) + Cache-flamme (.45 ACP) + Пламегаситель (.45 ACP) + Supresor (.45 ACP) + + + Flash Suppressor (9 mm) + Lángrejtő (9 mm) + Mündungsfeuerdämpfer (9 mm) + Soppressore di fiamma (9 mm) + Supressor de Clarão (9mm) + Tłumik płomienia (9 mm) + Tlumič plamene (9 mm) + Cache-flamme (9 mm) + Пламегаситель (9 мм) + Supresor (9 mm) + + + Flash Suppressor (.338) + Lángrejtő (.338) + Mündungsfeuerdämpfer (.338) + Soppressore di fiamma (.338) + Supressor de Clarão (.338) + Tłumik płomienia (.338) + Tlumič záblesku (.338) + Cache-flamme (.338) + Пламегаситель (.338) + Supresor (.338) + + + Flash Suppressor (9.3 mm) + Lángrejtő (9,3 mm) + Mündungsfeuerdämpfer (9,3 mm) + Soppressore di fiamma (9.3mm) + Supressor de Clarão (9,3mm) + Tłumik płomienia (9,3 mm) + Tlumič záblesku (9,3 mm) + Cache-flamme (9,3 mm) + Пламегаситель (9,3 мм) + Supresor (9,3 mm) + + + \ No newline at end of file diff --git a/addons/frag/stringtable.xml b/addons/frag/stringtable.xml index 4ae3979667..443646424a 100644 --- a/addons/frag/stringtable.xml +++ b/addons/frag/stringtable.xml @@ -1,15 +1,13 @@ - - - - - + + + Disable Fragmentation + Keine Schrapnelle Zakázat fragmentaci granátů - Weapons: Keine Schrapnelle - Wyłącz głowice fragmentacyjne + Desactivar fragmentación + Wyłącz fragmentację odłamków Выключить разлёт осколков - - \ No newline at end of file + diff --git a/addons/goggles/functions/fnc_externalCamera.sqf b/addons/goggles/functions/fnc_externalCamera.sqf index 9161804a56..ddc05e6b87 100644 --- a/addons/goggles/functions/fnc_externalCamera.sqf +++ b/addons/goggles/functions/fnc_externalCamera.sqf @@ -16,4 +16,5 @@ #include "script_component.hpp" if (GVAR(showInThirdPerson)) exitWith { false }; -(cameraView == "External") + +(cameraView in ["EXTERNAL", "GROUP"] || {call EFUNC(common,isFeatureCameraActive)}) diff --git a/addons/goggles/stringtable.xml b/addons/goggles/stringtable.xml index 1756442176..952a1320a0 100644 --- a/addons/goggles/stringtable.xml +++ b/addons/goggles/stringtable.xml @@ -1,14 +1,13 @@  - Show Goggle Effects in Third Person Brilleneffekt in dritter Person anzeigen Mostrar efectos de las gafas en tercera persona - Zobrazit účinky brýlí v třetí osobě + Zobrazit efekt brýlí v třetí osobě Effets de lunettes à la 3ème personne - Отображать эффект очков в третьем лице + Отображать эффект очков от третьего лица Szemüveg effekt mutatása külső nézetből Włącz efekty gogli w trzeciej osobie Mostrar efeitos de óculos em Terceira Pessoa diff --git a/addons/grenades/stringtable.xml b/addons/grenades/stringtable.xml index 1129d44271..41c699af5f 100644 --- a/addons/grenades/stringtable.xml +++ b/addons/grenades/stringtable.xml @@ -1,246 +1,246 @@ - - + + - - - Switch Grenade Mode - Granaten-Modus wechseln - Cambiar modo de granada - Tryb rzutu granatem - Změnit styl hodu granátu - Changer type de lancer de grenade - Сменить режим броска гранаты - Gránátdobás mód váltás - Cambia tipo di granata - Alternar Modo de Granada - - - Normal Throw - Normaler Wurf - Lanzamiento normal - Normalny rzut - Normální - Lancer Normal - Нормальный бросок - Normál dobás - Lancio normale - Arremesso Normal - - - High Throw - Hoher Wurf - Lanzamiento alto - Rzut lobem - Vysoko - Lancer Haut - Высокий бросок - Magas dobás - Lancio verso l'alto - Arremesso Alto - - - Precise Throw - Präziser Wurf - Lanzamiento preciso - Precyzyjny rzut - Přesně - Lancer Précis - Точный бросок - Pontos dobás - Lancio preciso - Arremesso Preciso - - - Roll Grenade - Granate rollen - Rodar granada - Po ziemi - Po zemi - Lancer Roulé - Катить гранату - Gurítás - Fai rotolare la granata - Rolar Granada - - - Drop Grenade - Granate fallenlassen - Soltar granada - Upuść granat - Upustit granát - Lâcher la grenade - Бросить себе под ноги - Ejtés - Lascia la granata - Largar Granada - - - M84 Stun Grenade - M84 Blendgranate - Granada aturdidora M84 - M84 Grenade Incapacitante - Granat hukowy M84 - M84 Omračující granát - M84 светозвуковая граната - M84 Villanógránát - Granata Stordente M84 - M84 granada de atordoamento - - - Also known as flashbang. Causes immediate flash blindness, deafness, tinnitus, and inner ear disturbance. - Verursacht temporäre Blind- und Taubheit. - Produce de manera inmediata ceguera, sordera, tinitus y afecta el oído interior. - Les grenades incapacitantes servent à désorienter ou distraire une menace pendant quelques secondes. - Granat ogłusza, nie zabijając przeciwnika. Detonacja daje efekt oślepiającego błysku i głośnego huku. - Omračující granát je taktická nesmrtící zbraň používaná při záchraně rukojmí a zvládání davu. - Граната XM84 (M84) - не летального действия, и предназначена для отвлечения и временного вывода из строя, либо дезориентации противника. Основное использование нашла при освобождении заложников, захвате преступников и террористов, а также проведении диверсионных миссий. - Eldobás után felrobban és éles hang, valamint fényhatással zavarja össze a környezetében tartózkodókat. - Anche conosciuta come flashbang. Causa accecamento immediato, sensazioni di sposatezza, mancanza d'equilibrio e disturbi al timpano. - Um tipo de granada não-letal destinado a confundir, desorientar e distrair uma potencial ameaça. - - - M127A1 Hand Held Signal (White) - M127A1 Leuchtmittel (Weiß) - M127A1 Světlice (Bílá) - M127A1 Jelzőrakéta (Fehér) - M127A1 Bengala (Bianco) - Flara ręczna sygnałowa M127A1 (biała) - M127A1 Sinalizador (Branco) - M127A1 Фальшфейер (Белый) - Bengala M127A1 (Blanca) - M127A1 Feux à main (Blanc) - - - M127A1 Hand Held Signal (Red) - M127A1 Leuchtmittel (Rot) - M127A1 Světlice (Červená) - M127A1 Jelzőrakéta (Piros) - M127A1 Bengala (Rosso) - Flara ręczna sygnałowa M127A1 (czerwona) - M127A1 Sinalizador (Vermelho) - M127A1 Фальшфейер (Красный) - Bengala M127A1 (Roja) - M127A1 Feux à main (Rouge) - - - M127A1 Hand Held Signal (Green) - M127A1 Leuchtmittel (Grün) - M127A1 Světlice (Zelená) - M127A1 Jelzőrakéta (Zöld) - M127A1 Bengala (Verde) - Flara ręczna sygnałowa M127A1 (zielona) - M127A1 Sinalizador (Verde) - M127A1 Фальшфейер (Зелёный) - Bengala M127A1 (Verde) - M127A1 Feux à main (Vert) - - - M127A1 Hand Held Signal (Yellow) - M127A1 Leuchtmittel (Gelb) - M127A1 Světlice (Žlutá) - M127A1 Jelzőrakéta (Sárga) - M127A1 Bengala (Giallo) - Flara ręczna sygnałowa M127A1 (żółta) - M127A1 Sinalizador (Amarelo) - M127A1 Фальшфейер (Жёлтые) - Bengala M127A1 (Amarilla) - M127A1 Feux à main (Jaune) - - - White Hand Flare - Weiße Leuchtkugel, wird wie eine Granate geworfen. - Světlice (Bílá) - Jelzőrakéta (Fehér) - Bengala (Bianco) - Flara ręczna (biała) - Sinalizador (Branco) - Фальшфейер (Белый) - Bengala (Blanca) - Feux à main (Blanc) - - - Red Hand Flare - Rote Leuchtkugel, wird wie eine Granate geworfen. - Světlice (Červená) - Jelzőrakéta (Piros) - Bengala (Rosso) - Flara ręczna (czerwona) - Sinalizador (Vermelho) - Фальшфейер (Красный) - Bengala (Roja) - Feux à main (Rouge) - - - Green Hand Flare - Grüne Leuchtkugel, wird wie eine Granate geworfen. - Světlice (Zelená) - Jelzőrakéta (Zöld) - Bengala (Verde) - Flara ręczna (zielona) - Sinalizador (Verde) - Фальшфейер (Зелёный) - Bengala (Verde) - Feux à main (Vert) - - - Yellow Hand Flare - Gelbe Leuchtkugel, wird wie eine Granate geworfen. - Světlice Žlutá - Jelzőrakéta (Sárga) - Bengala (Giallo) - Flara ręczna (żółta) - Sinalizador (Amarelo) - Фальшфейер (Жёлтые) - Bengala (Amarilla) - Feux à main (Jaune) - - - M127A1 (White) - M127A1 (Weiß) - M127A1 (Bílá) - M127A1 (Blanc) - M127A1 (Fehér) - M127A1 (Bianco) - M127A1 (biała) - M127A1 (Branco) - M127A1 (Белый) - M127A1 (Blanca) - - - M127A1 (Red) - M127A1 (Rot) - M127A1 (Červená) - M127A1 (Rouge) - M127A1 (Piros) - M127A1 (Rosso) - M127A1 (czerwona) - M127A1 (Vermelho) - M127A1 (Красный) - M127A1 (Roja) - - - M127A1 (Green) - M127A1 (Grün) - M127A1 (Zelená) - M127A1 (Vert) - M127A1 (Zöld) - M127A1 (Verde) - M127A1 (zielona) - M127A1 (Verde) - M127A1 (Зелёный) - M127A1 (Verde) - - - M127A1 (Yellow) - M127A1 (Gelb) - M127A1 (Žlutá) - M127A1 (Jaune) - M127A1 (Sárga) - M127A1 (Giallo) - M127A1 (żółta) - M127A1 (Amarelo) - M127A1 (Жёлтые) - M127A1 (Amarilla) - - - + + + Switch Grenade Mode + Granaten-Modus wechseln + Cambiar modo de granada + Przełącz sposób rzutu granatem + Změnit styl hodu granátu + Changer type de lancer de grenade + Сменить режим броска гранаты + Gránátdobás mód váltás + Cambia tipo di granata + Alternar Modo de Granada + + + Normal Throw + Normaler Wurf + Lanzamiento normal + Normalny rzut + Normální hod + Lancer Normal + Нормальный бросок + Normál dobás + Lancio normale + Arremesso Normal + + + High Throw + Hoher Wurf + Lanzamiento alto + Wysoki rzut + Vysoký hod + Lancer Haut + Высокий бросок + Magas dobás + Lancio verso l'alto + Arremesso Alto + + + Precise Throw + Präziser Wurf + Lanzamiento preciso + Precyzyjny rzut + Přesný hod + Lancer Précis + Точный бросок + Pontos dobás + Lancio preciso + Arremesso Preciso + + + Roll Grenade + Granate rollen + Rodar granada + Po ziemi + Po zemi + Lancer Roulé + Катить гранату + Gurítás + Fai rotolare la granata + Rolar Granada + + + Drop Grenade + Granate fallenlassen + Soltar granada + Upuść granat + Upustit granát + Lâcher la grenade + Бросить себе под ноги + Ejtés + Lascia la granata + Largar Granada + + + M84 Stun Grenade + M84 Blendgranate + Granada aturdidora M84 + M84 Grenade Incapacitante + Granat hukowy M84 + Omračující granát M84 + M84 светозвуковая граната + M84 Villanógránát + Granata Stordente M84 + M84 granada de atordoamento + + + Also known as flashbang. Causes immediate flash blindness, deafness, tinnitus, and inner ear disturbance. + Verursacht temporäre Blind- und Taubheit. + Produce de manera inmediata ceguera, sordera, tinitus y afecta el oído interior. + Les grenades incapacitantes servent à désorienter ou distraire une menace pendant quelques secondes. + Znany też jako flashbang. Powoduje natychmiastową tymczasową ślepotę, głuchotę, dzwonienie w uszach i inne zaburzenia ucha wewnętrznego. + Omračující granát je taktická nesmrtící zbraň používaná při záchraně rukojmí a zvládání davu. + XM84 (M84) - граната нелетального действия, и предназначена для отвлечения и временного вывода из строя, либо дезориентации противника. Основное использование нашла при освобождении заложников, захвате преступников и террористов, а также проведении диверсионных миссий. + Eldobás után felrobban és éles hang, valamint fényhatással zavarja össze a környezetében tartózkodókat. + Anche conosciuta come flashbang. Causa accecamento immediato, sensazioni di sposatezza, mancanza d'equilibrio e disturbi al timpano. + Um tipo de granada não-letal destinado a confundir, desorientar e distrair uma potencial ameaça. + + + M127A1 Hand Held Signal (White) + M127A1 Leuchtmittel (Weiß) + Světlice M127A1 (Bílá) + M127A1 Jelzőrakéta (Fehér) + M127A1 Bengala (Bianco) + Flara ręczna sygnałowa M127A1 (biała) + M127A1 Sinalizador (Branco) + M127A1 Фальшфейер (Белый) + Bengala M127A1 (Blanca) + M127A1 Feux à main (Blanc) + + + M127A1 Hand Held Signal (Red) + M127A1 Leuchtmittel (Rot) + Světlice M127A1 (Červená) + M127A1 Jelzőrakéta (Piros) + M127A1 Bengala (Rosso) + Flara ręczna sygnałowa M127A1 (czerwona) + M127A1 Sinalizador (Vermelho) + M127A1 Фальшфейер (Красный) + Bengala M127A1 (Roja) + M127A1 Feux à main (Rouge) + + + M127A1 Hand Held Signal (Green) + M127A1 Leuchtmittel (Grün) + Světlice M127A1 (Zelená) + M127A1 Jelzőrakéta (Zöld) + M127A1 Bengala (Verde) + Flara ręczna sygnałowa M127A1 (zielona) + M127A1 Sinalizador (Verde) + M127A1 Фальшфейер (Зелёный) + Bengala M127A1 (Verde) + M127A1 Feux à main (Vert) + + + M127A1 Hand Held Signal (Yellow) + M127A1 Leuchtmittel (Gelb) + Světlice M127A1 (Žlutá) + M127A1 Jelzőrakéta (Sárga) + M127A1 Bengala (Giallo) + Flara ręczna sygnałowa M127A1 (żółta) + M127A1 Sinalizador (Amarelo) + M127A1 Фальшфейер (Жёлтые) + Bengala M127A1 (Amarilla) + M127A1 Feux à main (Jaune) + + + White Hand Flare + Weiße Leuchtkugel, wird wie eine Granate geworfen. + Světlice (Bílá) + Jelzőrakéta (Fehér) + Bengala (Bianco) + Flara ręczna (biała) + Sinalizador (Branco) + Фальшфейер (Белый) + Bengala (Blanca) + Feux à main (Blanc) + + + Red Hand Flare + Rote Leuchtkugel, wird wie eine Granate geworfen. + Světlice (Červená) + Jelzőrakéta (Piros) + Bengala (Rosso) + Flara ręczna (czerwona) + Sinalizador (Vermelho) + Фальшфейер (Красный) + Bengala (Roja) + Feux à main (Rouge) + + + Green Hand Flare + Grüne Leuchtkugel, wird wie eine Granate geworfen. + Světlice (Zelená) + Jelzőrakéta (Zöld) + Bengala (Verde) + Flara ręczna (zielona) + Sinalizador (Verde) + Фальшфейер (Зелёный) + Bengala (Verde) + Feux à main (Vert) + + + Yellow Hand Flare + Gelbe Leuchtkugel, wird wie eine Granate geworfen. + Světlice (Žlutá) + Jelzőrakéta (Sárga) + Bengala (Giallo) + Flara ręczna (żółta) + Sinalizador (Amarelo) + Фальшфейер (Жёлтые) + Bengala (Amarilla) + Feux à main (Jaune) + + + M127A1 (White) + M127A1 (Weiß) + M127A1 (Bílá) + M127A1 (Blanc) + M127A1 (Fehér) + M127A1 (Bianco) + M127A1 (biała) + M127A1 (Branco) + M127A1 (Белый) + M127A1 (Blanca) + + + M127A1 (Red) + M127A1 (Rot) + M127A1 (Červená) + M127A1 (Rouge) + M127A1 (Piros) + M127A1 (Rosso) + M127A1 (czerwona) + M127A1 (Vermelho) + M127A1 (Красный) + M127A1 (Roja) + + + M127A1 (Green) + M127A1 (Grün) + M127A1 (Zelená) + M127A1 (Vert) + M127A1 (Zöld) + M127A1 (Verde) + M127A1 (zielona) + M127A1 (Verde) + M127A1 (Зелёный) + M127A1 (Verde) + + + M127A1 (Yellow) + M127A1 (Gelb) + M127A1 (Žlutá) + M127A1 (Jaune) + M127A1 (Sárga) + M127A1 (Giallo) + M127A1 (żółta) + M127A1 (Amarelo) + M127A1 (Жёлтые) + M127A1 (Amarilla) + + + \ No newline at end of file diff --git a/addons/hearing/stringtable.xml b/addons/hearing/stringtable.xml index f042128301..9c6a107466 100644 --- a/addons/hearing/stringtable.xml +++ b/addons/hearing/stringtable.xml @@ -1,5 +1,4 @@  - @@ -30,7 +29,7 @@ Earplugs in Ohrenstöpsel drinnen Poner tapones - Załóż stopery + Włóż stopery Dát špunty do uší Беруши надеты Bouchons mis @@ -42,7 +41,7 @@ Earplugs out Ohrenstöpsel raus Quitar tapones - Zdejmij stopery + Wyjmij stopery Vyndat špunty z uší Беруши сняты Bouchons enlevés @@ -54,7 +53,7 @@ Earplugs in Ohrenstöpsel drinnen Tapones puestos - Stopery założone + Stopery włożone Špunty v uších Беруши надеты Bouchons mis @@ -66,7 +65,7 @@ Earplugs out Ohrenstöpsel raus Tapones quitados - Stopery zdjęte + Stopery wyjęte Špunty venku z uší Беруши сняты Bouchons enlevés @@ -100,8 +99,12 @@ Disable ear ringing + Désactiver les tintements d'oreille Desactivar zumbido de oídos + Отключить эффект баротравмы Knalltrauma deaktivieren + Vypnout pískání v uších + Wyłącz dzwonienie w uszach - \ No newline at end of file + diff --git a/addons/interact_menu/functions/fnc_keyDown.sqf b/addons/interact_menu/functions/fnc_keyDown.sqf index d4a7f8a96e..47fdfb1951 100644 --- a/addons/interact_menu/functions/fnc_keyDown.sqf +++ b/addons/interact_menu/functions/fnc_keyDown.sqf @@ -32,7 +32,7 @@ GVAR(openedMenuType) = _menuType; GVAR(useCursorMenu) = (vehicle ACE_player != ACE_player) || visibleMap || - {(_menuType == 1) && {(isWeaponDeployed ACE_player) || GVAR(AlwaysUseCursorSelfInteraction)}}; + {(_menuType == 1) && {(isWeaponDeployed ACE_player) || GVAR(AlwaysUseCursorSelfInteraction) || {cameraView == "GUNNER"}}}; if (GVAR(useCursorMenu)) then { createDialog QGVAR(cursorMenu); // The dialog sets: diff --git a/addons/interact_menu/functions/fnc_renderActionPoints.sqf b/addons/interact_menu/functions/fnc_renderActionPoints.sqf index e14b69472c..45c0c46a61 100644 --- a/addons/interact_menu/functions/fnc_renderActionPoints.sqf +++ b/addons/interact_menu/functions/fnc_renderActionPoints.sqf @@ -23,7 +23,7 @@ _fnc_renderNearbyActions = { #define MAXINTERACTOBJECTS 3 _numInteractObjects = 0; - _nearestObjects = nearestObjects [(getPos ACE_player), ["All"], 15]; + _nearestObjects = nearestObjects [ACE_player, ["All"], 15]; { _target = _x; diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index b3de5efddf..0f718ded19 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -1,26 +1,50 @@  - 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 Interact Key - Interaktionstaste + Fremdinteraktionsmenü-Taste + Tecla de interacción + Клавиша взаимодействия + Klávesa pro interakci + Klawisz interakcji + Touche d'interaction Self Interaction Key - Selbst-Interaktionstaste + Eigeninteraktionsmenü-Taste + Tecla de interacción propia + Клавиша взаимодействия (с собой) + Klávesa pro vlastní interakci + Klawisz własnej interakcji + Touche d'Interaction sur soi-même Self Actions - Selbst-Interaktion + Selbst-Aktionen + Acciones propias + Действия с собой + Vlastní akce + Własne akcje + Actions sur soi-même Vehicle Actions - Fahrzeug-Interaktion + Fahrzeug-Aktionen + Acciones de vehículo + Действия на транспорте + Interakce s vozidly + Akcje pojazdu + Actions sur les véhicules - \ No newline at end of file + diff --git a/addons/interaction/CfgEventHandlers.hpp b/addons/interaction/CfgEventHandlers.hpp index 17200056b8..7b003bbe8c 100644 --- a/addons/interaction/CfgEventHandlers.hpp +++ b/addons/interaction/CfgEventHandlers.hpp @@ -1,27 +1,11 @@ class Extended_PreInit_EventHandlers { - class ADDON { - init = QUOTE( call COMPILE_FILE(XEH_preInit) ); - }; + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_preInit) ); + }; }; class Extended_PostInit_EventHandlers { - class ADDON { - clientInit = QUOTE( call COMPILE_FILE(XEH_clientInit) ); - }; -}; - -class Extended_GetIn_EventHandlers { - class All { - class ADDONnu { - clientGetIn = QUOTE( if (_this select 2 == ACE_player && {!isNull (findDisplay 1713999)}) then {(findDisplay 1713999) closeDisplay 1}); + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); }; - }; -}; - -class Extended_GetOut_EventHandlers { - class All { - class ADDONnu { - clientGetOut = QUOTE( if (_this select 2 == ACE_player && {!isNull (findDisplay 1713999)}) then {(findDisplay 1713999) closeDisplay 1}); - }; - }; }; diff --git a/addons/interaction/CfgVehicles.hpp b/addons/interaction/CfgVehicles.hpp index e85300f301..bd36f42703 100644 --- a/addons/interaction/CfgVehicles.hpp +++ b/addons/interaction/CfgVehicles.hpp @@ -260,12 +260,11 @@ class CfgVehicles { icon = PATHTOF(UI\team\team_white_ca.paa); hotkey = "N"; }; - class ACE_BecomeLeader { displayName = "$STR_ACE_Interaction_BecomeLeader"; - condition = QUOTE(count (units group _player) > 1 && {leader group _player != _player}); + condition = QUOTE(_this call FUNC(canBecomeLeader)); exceptions[] = {"isNotInside"}; - statement = QUOTE(_newGroup = createGroup side group _player; (units group _player) joinSilent _newGroup; _newGroup selectLeader _player;); + statement = QUOTE(_this call FUNC(doBecomeLeader)); showDisabled = 1; priority = 1.0; icon = PATHTOF(UI\team\team_white_ca.paa); diff --git a/addons/interaction/XEH_clientInit.sqf b/addons/interaction/XEH_postInit.sqf similarity index 91% rename from addons/interaction/XEH_clientInit.sqf rename to addons/interaction/XEH_postInit.sqf index 1ed3883f02..98b1cc1523 100644 --- a/addons/interaction/XEH_clientInit.sqf +++ b/addons/interaction/XEH_postInit.sqf @@ -4,6 +4,12 @@ ACE_Modifier = 0; +//SelectLeader Event Handler for BecomeLeader action: +[QGVAR(selectLeader), { + PARAMS_2(_group,_leader); + _group selectLeader _leader; +}] call EFUNC(common,addEventHandler); + if (!hasInterface) exitWith {}; GVAR(isOpeningDoor) = false; diff --git a/addons/interaction/XEH_preInit.sqf b/addons/interaction/XEH_preInit.sqf index 671535c36d..6f10a4e834 100644 --- a/addons/interaction/XEH_preInit.sqf +++ b/addons/interaction/XEH_preInit.sqf @@ -6,8 +6,10 @@ PREP(addPassengerActions); PREP(addPassengersActions); PREP(addSelectableItem); PREP(applyButtons); +PREP(canBecomeLeader); PREP(canInteractWithCivilian); PREP(canTapShoulder); +PREP(doBecomeLeader); PREP(getDoor); PREP(getDoorAnimations); PREP(getDown); diff --git a/addons/interaction/functions/fnc_canBecomeLeader.sqf b/addons/interaction/functions/fnc_canBecomeLeader.sqf new file mode 100644 index 0000000000..11234ad6d7 --- /dev/null +++ b/addons/interaction/functions/fnc_canBecomeLeader.sqf @@ -0,0 +1,21 @@ +/* + * Author: PabstMirror + * Test if can Become Leader of group + * + * Arguments: + * 0: target + * 1: player + * + * Return Value: + * + * + * Example: + * [player, player] call ace_interaction_fnc_canBecomeLeader + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_target,_player); + +(count (units group _player) > 1) && {leader group _player != _player} diff --git a/addons/interaction/functions/fnc_doBecomeLeader.sqf b/addons/interaction/functions/fnc_doBecomeLeader.sqf new file mode 100644 index 0000000000..24bfa66c11 --- /dev/null +++ b/addons/interaction/functions/fnc_doBecomeLeader.sqf @@ -0,0 +1,21 @@ + /* + * Author: PabstMirror + * Become Leader of group + * + * Arguments: + * 0: target + * 1: player + * + * Return Value: + * None + * + * Example: + * [player, player] call ace_interaction_fnc_doBecomeLeader + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_target,_player); + +[QGVAR(selectLeader), (units group _player), [(group _player), _player]] call EFUNC(common,targetEvent); diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index e85d0d3b47..cf0349af5c 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -1,38 +1,69 @@  - Interactions - Interaktion + Interaktionen + Interacciones + Interakce + Interakcje + Interactions Torso Torso + Torso + Trup + Tors + Torse Head Kopf + Cabeza + Hlava + Głowa + Tête Left Arm - Arm links + Linker Arm + Brazo izquierdo + Levá paže + Lewe ramię + Bras Gauche Right Arm - Arm rechts + Rechter Arm + Brazo derecho + Pravá paže + Prawe ramię + Bras Droit Left Leg - Bein links + Linkes Bein + Pierna izquierda + Levá noha + Lewa noga + Jambe Gauche Right Leg - Bein rechts + Rechtes Bein + Pierna derecha + Pravá hona + Prawa noga + Jambe Droite Weapon Waffe + Arma + Zbraň + Broń + Arme Interaction Menu @@ -50,7 +81,7 @@ Interaction Menu (Self) Interaktionsmenü (Selbst) Menú de interacción (Propia) - Menu interakcji (na siebie) + Menu interakcji (własne) Menu interakce (vlastní) Menu d'interaction (Perso) Меню взаимодействия (с собой) @@ -135,7 +166,7 @@ Gruppe verlassen Dejar grupo Opuść grupę - Odejít ze skupiny + Opustit skupinu Quitter Groupe Выйти из группы Csoport elhagyása @@ -195,7 +226,7 @@ Gesten Gestos Gesty - Gesta + Posunky Signaux Жесты Kézjelek @@ -377,7 +408,7 @@ On te tape sur l'épaule Zostałeś klepnięty po ramieniu Vállonveregettek - Někdo tě poklepal na rameno + Někdo tě poklepal na PRAVÉ rameno Вас похлопали по плечу Você foi tocado no ombro Ti è stato dato un colpetto sulla spalla @@ -389,7 +420,7 @@ On te tape sur l'épaule. Zostałeś klepnięty po ramieniu Vállonveregettek - Někdo tě poklepal na rameno. + Někdo tě poklepal na LEVÉ rameno Вас похлопали по плечу Você foi tocado no ombro. Ti è stato dato un colpetto sulla spalla @@ -508,7 +539,7 @@ Unirse al<br/>equipo rojo Rejoindre<br/>Rouge Dołącz do drużyny<br/>czerwonej - Připojit do<br/>Červeného Týmu + Připojit do<br/>Červeného týmu Присоединиться<br/>к красной группе Unir-se à<br/>Equipe Vermelha Entra nella<br/>Squadra Rossa @@ -520,7 +551,7 @@ Unirse al<br/>equipo verde Rejoindre<br/>Verte Dołącz do<br/>drużyny zielonej - Připojit do<br/>Zeleného Týmu + Připojit do<br/>Zeleného týmu Присоединиться<br/>к зеленой группе Unir-se à<br/>Equipe Verde Entra nella<br/>Squadra Verde @@ -532,7 +563,7 @@ Unirse al<br/>equipo azul Rejoindre<br/>Bleue Dołącz do<br/>drużyny niebieskiej - Připojit do<br/>Modrého Týmu + Připojit do<br/>Modrého týmu Присоединиться<br/>к синей группе Unir-se à<br/>Equipe Azul Entra nella<br/>Squadra Blu @@ -544,7 +575,7 @@ Unirse al<br/>equipo amarillo Rejoindre<br/>Jaune Dołącz do<br/>drużyny żółtej - Připojit do<br/>Žlutého Týmu + Připojit do<br/>Žlutého týmu Присоединиться<br/>к желтой группе Unir-se à<br/>Equipe Amarela Entra nella<br/>Squadra Gialla @@ -556,7 +587,7 @@ Te has unido al equipo %1 Tu as rejoint l'équipe %1 Dołączyłeś do drużyny %1 - Připojil ses do Týmu %1 + Připojil ses do %1 týmu Вы присоединились к группе %1 Você uniu-se à Equipe %1 Sei entrato nella Squadra %1 @@ -616,7 +647,7 @@ Modyfikator Modifier la touche Tecla modificadora - клавиша-модификатор + Клавиша-модификатор Tecla Modificadora Modifica Tasto Módosító billentyű @@ -655,6 +686,7 @@ Interact + Interagir Interagiere Interakce Взаимодействовать @@ -663,7 +695,12 @@ Passengers - Passagiere + Fahrzeuginsassen + Pasajeros + Пассажиры + Pasažéři + Pasażerowie + Passagers - \ No newline at end of file + diff --git a/addons/inventory/stringtable.xml b/addons/inventory/stringtable.xml index f93e0d9627..5505d6b505 100644 --- a/addons/inventory/stringtable.xml +++ b/addons/inventory/stringtable.xml @@ -1,14 +1,23 @@  - Make Inventory Display Bigger - Die Anzeige des Inventar vergrößern. + Erhöhe die angezeigte Inventargröße + Hacer la pantalla de inventario mas grande + Сделать окно инвентаря больше + Zvětšit zobrazení inventáře + Powiększ UI ekwipunku + Augmente la taille d'affichage de l'inventaire 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. - Normalerweise wird die Größe des Inventars mit der Größe der UI skaliert. Diese Einstellung allerdings vergrößert das Inventar bei gleichbleibender Schriftgröße, so dass mehr Einträge angzeigt werden können. + 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. + Normalement, l'inventaire est automatiquement mesuré par la taille de l'interface de l'utilisateur. Cette option vous permet d'augmenter la taille d'affichage de l'inventaire, cependant, cette option n'augmente pas la police d'écriture et le nombre de place. - \ No newline at end of file + diff --git a/addons/javelin/$PBOPREFIX$ b/addons/javelin/$PBOPREFIX$ new file mode 100644 index 0000000000..3497b9aaf6 --- /dev/null +++ b/addons/javelin/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\javelin \ No newline at end of file diff --git a/addons/wep_javelin/CfgEventhandlers.hpp b/addons/javelin/CfgEventhandlers.hpp similarity index 69% rename from addons/wep_javelin/CfgEventhandlers.hpp rename to addons/javelin/CfgEventhandlers.hpp index a61ea9c746..2c44a05e3a 100644 --- a/addons/wep_javelin/CfgEventhandlers.hpp +++ b/addons/javelin/CfgEventhandlers.hpp @@ -9,10 +9,4 @@ class Extended_PostInit_EventHandlers { init = QUOTE(call COMPILE_FILE(XEH_post_init)); clientInit = QUOTE(call COMPILE_FILE(XEH_clientInit)); }; -}; - -class Extended_FiredBIS_EventHandlers { - class CAManBase { - ADDON = QUOTE(_this call FUNC(fired)); - }; }; \ No newline at end of file diff --git a/addons/wep_javelin/CfgSounds.hpp b/addons/javelin/CfgSounds.hpp similarity index 100% rename from addons/wep_javelin/CfgSounds.hpp rename to addons/javelin/CfgSounds.hpp diff --git a/addons/javelin/CfgWeapons.hpp b/addons/javelin/CfgWeapons.hpp new file mode 100644 index 0000000000..cef967e32e --- /dev/null +++ b/addons/javelin/CfgWeapons.hpp @@ -0,0 +1,14 @@ +class CfgWeapons { + class Launcher; + class Launcher_Base_F : Launcher { + class WeaponSlotsInfo; + }; + + class launch_Titan_base : Launcher_Base_F { + weaponInfoType = "ACE_RscOptics_javelin"; + modelOptics = PATHTOF(data\reticle_titan.p3d); + + lockingTargetSound[] = {"",0,1}; + lockedTargetSound[] = {"",0,1}; + }; +}; \ No newline at end of file diff --git a/addons/wep_javelin/README.md b/addons/javelin/README.md similarity index 77% rename from addons/wep_javelin/README.md rename to addons/javelin/README.md index df3ad9b29d..37685d9cce 100644 --- a/addons/wep_javelin/README.md +++ b/addons/javelin/README.md @@ -1,4 +1,4 @@ -ace_wep_javelin +ace_javelin =============== Adds the Javelin AT launcher. @@ -9,4 +9,3 @@ Adds the Javelin AT launcher. The people responsible for merging changes to this component or answering potential questions. - [jaynus](https://github.com/walterpearce) -- [NouberNou](https://github.com/NouberNou) diff --git a/addons/wep_javelin/RscInGameUI.hpp b/addons/javelin/RscInGameUI.hpp similarity index 92% rename from addons/wep_javelin/RscInGameUI.hpp rename to addons/javelin/RscInGameUI.hpp index 811548a9d2..8c73f3d8d1 100644 --- a/addons/wep_javelin/RscInGameUI.hpp +++ b/addons/javelin/RscInGameUI.hpp @@ -10,11 +10,11 @@ class RscLine; // Taken from AGM for optics management. class RscInGameUI { - class RscOptics_titan { + class ACE_RscOptics_javelin { idd = 300; - controls[] = {"ACE_javelin_elements_group"}; + controls[] = { "ACE_javelin_elements_group", "CA_Distance", "ACE_Targeting" }; //, "ACE_TargetingConstrains", "ACE_TargetingGate", "ACE_TargetingLines"}; onLoad = QUOTE(_this call FUNC(onOpticLoad)); - onUnload = "uiNameSpace setVariable ['ACE_RscOptics_javelin',nil];"; + onUnload = "uiNameSpace setVariable ['ACE_RscOptics_javelin',nil];uiNameSpace setVariable ['ACE_RscOptics_javelin_PFH',nil];"; class CA_Distance: RscOpticsValue { idc = 151; @@ -45,13 +45,6 @@ class RscInGameUI { height = 0.001; }; class Controls { - class JavelinLocking : RscMapControl { - onDraw = QUOTE(_this call FUNC(onOpticDraw)); - idc = -1; - w = 0; - h = 0; - }; - class ACE_javelin_Day_mode_off: RscPicture { idc = 1001; x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.03/4)*3*SafezoneH - SafezoneX"; @@ -94,6 +87,7 @@ class RscInGameUI { x = "((SafezoneW -SafezoneH*3/4)/2)+ (0.307/4)*3*SafezoneH - SafezoneX"; colorText[] = {0.2941,0.8745,0.2157,1}; }; + /* class StadiaL: RscLine { x = "0.4899*SafezoneW - SafezoneX"; y = "0.171*SafezoneH - SafezoneY"; @@ -136,6 +130,7 @@ class RscInGameUI { h = 0; colorText[] = {0.2941,0.8745,0.2157,1}; }; + */ }; }; class ACE_javelin_NFOV_mode_off: ACE_javelin_Day_mode_off { @@ -167,6 +162,7 @@ class RscInGameUI { y = "0.031*SafezoneH - SafezoneY"; colorText[] = {0.2941,0.8745,0.2157,1}; }; + /* class StadiaL: RscLine { x = "0.4788*SafezoneW - SafezoneX"; y = "0.171*SafezoneH - SafezoneY"; @@ -209,15 +205,83 @@ class RscInGameUI { h = "0.1895*SafezoneH"; colorText[] = {0.2941,0.8745,0.2157,1}; }; + */ }; }; - /* - class TargetingConstrains: RscControlsGroup { - idc = 699100; + + class ACE_javelin_SEEK_off: ACE_javelin_Day_mode_off { + idc = 699000; + x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.863/4)*3*SafezoneH - SafezoneX"; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\seek_co.paa"; + }; + class ACE_javelin_SEEK: ACE_javelin_SEEK_off { + idc = 166; + colorText[] = {0.2941,0.8745,0.2157,0}; + }; + class ACE_javelin_Missle_off: ACE_javelin_Day_mode_off { + idc = 1032; + x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (-0.134/4)*3*SafezoneH - SafezoneX"; + y = "(SafezoneY + 0.208*SafezoneH) - SafezoneY"; + colorText[] = {0.2941,0.2941,0.2941,1}; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\missle_co.paa"; + }; + class ACE_javelin_Missle: ACE_javelin_Missle_off { + idc = 167; + colorText[] = {0.9255,0.5216,0.1216,0}; + }; + class ACE_javelin_CLU_off: ACE_javelin_Missle_off { + idc = 1027; + y = "(SafezoneY + 0.436*SafezoneH) - SafezoneY"; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\clu_co.paa"; + }; + class ACE_javelin_HangFire_off: ACE_javelin_Missle_off { + idc = 1028; + y = "(SafezoneY + 0.669*SafezoneH) - SafezoneY"; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\hangfire_co.paa"; + }; + class ACE_javelin_TOP_off: ACE_javelin_Day_mode_off { + idc = 699001; + x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (1.023/4)*3*SafezoneH - SafezoneX"; + y = "(SafezoneY + 0.208*SafezoneH) - SafezoneY"; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\top_co.paa"; + colorText[] = {0.2941,0.8745,0.2157,1}; + }; + class ACE_javelin_DIR: ACE_javelin_Day_mode { + idc = 699002; + x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (1.023/4)*3*SafezoneH - SafezoneX"; + y = "(SafezoneY + 0.436*SafezoneH) - SafezoneY"; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\dir_co.paa"; + colorText[] = {0.2941,0.2941,0.2941,1}; + }; + class ACE_javelin_FLTR_mode_off: ACE_javelin_Day_mode_off { + idc = 1002; + x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (1.023/4)*3*SafezoneH - SafezoneX"; + y = "(SafezoneY + 0.669*SafezoneH) - SafezoneY"; + text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\fltr_co.paa"; + }; + class ACE_javelin_FLTR_mode: ACE_javelin_FLTR_mode_off { + idc = 161; + colorText[] = {0.2941,0.8745,0.2157,1}; + }; + }; + }; + class ACE_Targeting : RscControlsGroup { + idc = 6999; + + x = "SafezoneX"; + y = "SafezoneY"; + w = "SafezoneW"; + h = "SafezoneH"; + + enabled = 0; + class Controls { + class ACE_TargetingConstrains: RscControlsGroup { x = "SafezoneX"; y = "SafezoneY"; w = "SafezoneW-SafezoneX"; h = "SafezoneH-SafezoneY"; + + enabled = 0; class VScrollbar { autoScrollSpeed = -1; autoScrollDelay = 5; @@ -258,18 +322,18 @@ class RscInGameUI { idc = 699105; text = PATHTOF(data\javelin_ui_border_ca.paa); colorText[] = {0,0,0,1}; - x = "((SafezoneW -(3/4)*SafezoneH)/2) - SafezoneX"; + x = "((SafezoneW -(3.1/4)*SafezoneH)/2) - SafezoneX"; y = "0.15*SafezoneH-SafezoneY"; - w = "(3/4)*SafezoneH"; + w = "(3.1/4)*SafezoneH"; h = "0.7*SafezoneH"; }; }; }; - class TargetingGate: TargetingConstrains { + class ACE_TargetingGate : ACE_TargetingConstrains { idc = 699200; class Controls { - class TargetingGateTL: TargetingConstrains { + class TargetingGateTL: ACE_TargetingConstrains { x = "((SafezoneW -(3/4)*SafezoneH)/2) - SafezoneX"; y = "0.15*SafezoneH - SafezoneY"; idc = 699201; @@ -351,8 +415,9 @@ class RscInGameUI { }; }; }; - - class TargetingLines: TargetingConstrains { + + + class ACE_TargetingLines: ACE_TargetingConstrains { idc = 699300; class Controls { class LineH: RscLine { @@ -373,62 +438,6 @@ class RscInGameUI { }; }; }; - */ - - class ACE_javelin_SEEK_off: ACE_javelin_Day_mode_off { - idc = 699000; - x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.863/4)*3*SafezoneH - SafezoneX"; - text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\seek_co.paa"; - }; - class ACE_javelin_SEEK: ACE_javelin_SEEK_off { - idc = 166; - colorText[] = {0.2941,0.8745,0.2157,0}; - }; - class ACE_javelin_Missle_off: ACE_javelin_Day_mode_off { - idc = 1032; - x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (-0.134/4)*3*SafezoneH - SafezoneX"; - y = "(SafezoneY + 0.208*SafezoneH) - SafezoneY"; - colorText[] = {0.2941,0.2941,0.2941,1}; - text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\missle_co.paa"; - }; - class ACE_javelin_Missle: ACE_javelin_Missle_off { - idc = 167; - colorText[] = {0.9255,0.5216,0.1216,0}; - }; - class ACE_javelin_CLU_off: ACE_javelin_Missle_off { - idc = 1027; - y = "(SafezoneY + 0.436*SafezoneH) - SafezoneY"; - text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\clu_co.paa"; - }; - class ACE_javelin_HangFire_off: ACE_javelin_Missle_off { - idc = 1028; - y = "(SafezoneY + 0.669*SafezoneH) - SafezoneY"; - text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\hangfire_co.paa"; - }; - class ACE_javelin_TOP_off: ACE_javelin_Day_mode_off { - idc = 699001; - x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (1.023/4)*3*SafezoneH - SafezoneX"; - y = "(SafezoneY + 0.208*SafezoneH) - SafezoneY"; - text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\top_co.paa"; - colorText[] = {0.2941,0.8745,0.2157,1}; - }; - class ACE_javelin_DIR: ACE_javelin_Day_mode { - idc = 699002; - x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (1.023/4)*3*SafezoneH - SafezoneX"; - y = "(SafezoneY + 0.436*SafezoneH) - SafezoneY"; - text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\dir_co.paa"; - colorText[] = {0.2941,0.2941,0.2941,1}; - }; - class ACE_javelin_FLTR_mode_off: ACE_javelin_Day_mode_off { - idc = 1002; - x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (1.023/4)*3*SafezoneH - SafezoneX"; - y = "(SafezoneY + 0.669*SafezoneH) - SafezoneY"; - text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\fltr_co.paa"; - }; - class ACE_javelin_FLTR_mode: ACE_javelin_FLTR_mode_off { - idc = 161; - colorText[] = {0.2941,0.8745,0.2157,1}; - }; }; }; }; diff --git a/addons/javelin/XEH_clientInit.sqf b/addons/javelin/XEH_clientInit.sqf new file mode 100644 index 0000000000..38b006ca24 --- /dev/null +++ b/addons/javelin/XEH_clientInit.sqf @@ -0,0 +1,5 @@ +#include "script_component.hpp" + +if (!hasInterface) exitWith {}; + +#include "initKeybinds.sqf" \ No newline at end of file diff --git a/addons/wep_javelin/XEH_post_init.sqf b/addons/javelin/XEH_post_init.sqf similarity index 100% rename from addons/wep_javelin/XEH_post_init.sqf rename to addons/javelin/XEH_post_init.sqf diff --git a/addons/wep_javelin/XEH_pre_init.sqf b/addons/javelin/XEH_pre_init.sqf similarity index 53% rename from addons/wep_javelin/XEH_pre_init.sqf rename to addons/javelin/XEH_pre_init.sqf index 1b6682f0fc..2b2e980191 100644 --- a/addons/wep_javelin/XEH_pre_init.sqf +++ b/addons/javelin/XEH_pre_init.sqf @@ -1,13 +1,10 @@ #include "script_component.hpp" -PREP(fired); - -PREP(translateToWeaponSpace); -PREP(translateToModelSpace); - PREP(lockKeyDown); PREP(lockKeyUp); + PREP(cycleFireMode); +PREP(showFireMode); PREP(onOpticLoad); PREP(onOpticDraw); diff --git a/addons/wep_javelin/config.cpp b/addons/javelin/config.cpp similarity index 63% rename from addons/wep_javelin/config.cpp rename to addons/javelin/config.cpp index c7ea1c867a..9d7c14e448 100644 --- a/addons/wep_javelin/config.cpp +++ b/addons/javelin/config.cpp @@ -5,11 +5,12 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_laser"}; + requiredAddons[] = { "ace_main", "ace_common", "ace_missileguidance" }; VERSION_CONFIG; }; }; #include "CfgEventhandlers.hpp" #include "RscInGameUI.hpp" -#include "CfgSounds.hpp" \ No newline at end of file +#include "CfgSounds.hpp" +#include "CfgWeapons.hpp" \ No newline at end of file diff --git a/addons/wep_javelin/data/jav_disp.paa b/addons/javelin/data/jav_disp.paa similarity index 100% rename from addons/wep_javelin/data/jav_disp.paa rename to addons/javelin/data/jav_disp.paa diff --git a/addons/wep_javelin/data/jav_ring.paa b/addons/javelin/data/jav_ring.paa similarity index 100% rename from addons/wep_javelin/data/jav_ring.paa rename to addons/javelin/data/jav_ring.paa diff --git a/addons/wep_javelin/data/javelin_ui_border_ca.paa b/addons/javelin/data/javelin_ui_border_ca.paa similarity index 100% rename from addons/wep_javelin/data/javelin_ui_border_ca.paa rename to addons/javelin/data/javelin_ui_border_ca.paa diff --git a/addons/javelin/data/reticle_titan.p3d b/addons/javelin/data/reticle_titan.p3d new file mode 100644 index 0000000000..682296f0c8 Binary files /dev/null and b/addons/javelin/data/reticle_titan.p3d differ diff --git a/addons/wep_javelin/data/sounds/javelin_locked.ogg b/addons/javelin/data/sounds/javelin_locked.ogg similarity index 100% rename from addons/wep_javelin/data/sounds/javelin_locked.ogg rename to addons/javelin/data/sounds/javelin_locked.ogg diff --git a/addons/wep_javelin/data/sounds/javelin_locking.ogg b/addons/javelin/data/sounds/javelin_locking.ogg similarity index 100% rename from addons/wep_javelin/data/sounds/javelin_locking.ogg rename to addons/javelin/data/sounds/javelin_locking.ogg diff --git a/addons/javelin/functions/fnc_cycleFireMode.sqf b/addons/javelin/functions/fnc_cycleFireMode.sqf new file mode 100644 index 0000000000..4fed8e05cc --- /dev/null +++ b/addons/javelin/functions/fnc_cycleFireMode.sqf @@ -0,0 +1,13 @@ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" +TRACE_1("enter", _this); + +private["_player", "_currentFireMode"]; + +_currentFireMode = ACE_player getVariable["ace_missileguidance_attackProfile", "TOP"]; +if(_currentFireMode == "LIN") then { + _currentFireMode = "TOP"; +} else { + _currentFireMode = "LIN"; +}; +ACE_player setVariable["ace_missileguidance_attackProfile", _currentFireMode, false]; diff --git a/addons/javelin/functions/fnc_lockKeyDown.sqf b/addons/javelin/functions/fnc_lockKeyDown.sqf new file mode 100644 index 0000000000..2a537e2ae9 --- /dev/null +++ b/addons/javelin/functions/fnc_lockKeyDown.sqf @@ -0,0 +1,3 @@ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" +TRACE_1("enter", _this); \ No newline at end of file diff --git a/addons/javelin/functions/fnc_lockKeyUp.sqf b/addons/javelin/functions/fnc_lockKeyUp.sqf new file mode 100644 index 0000000000..2a537e2ae9 --- /dev/null +++ b/addons/javelin/functions/fnc_lockKeyUp.sqf @@ -0,0 +1,3 @@ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" +TRACE_1("enter", _this); \ No newline at end of file diff --git a/addons/javelin/functions/fnc_onOpticDraw.sqf b/addons/javelin/functions/fnc_onOpticDraw.sqf new file mode 100644 index 0000000000..2412c2d5a1 --- /dev/null +++ b/addons/javelin/functions/fnc_onOpticDraw.sqf @@ -0,0 +1,227 @@ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" +TRACE_1("enter", _this); + +#define __TRACKINTERVAL 0 // how frequent the check should be. +#define __LOCKONTIME 3.0 // Lock on won't occur sooner +#define __LOCKONTIMERANDOM 0.3 // Deviation in lock on time +#define __SENSORSQUARE 1 // Locking on sensor square side in angles + +#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"]; + +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 { + _lastTick = _args select 0; + if(diag_tickTime - _lastTick > 1) then { + [] call FUNC(onOpticLoad); + }; +}; + +TRACE_1("Running", "Running"); + +// Pull the arguments +_currentTarget = _args select 1; +_runTime = _args select 2; +_lockTime = _args select 3; +_soundTime = _args select 4; + +// Find a target within the optic range +_newTarget = objNull; + +// Bail on fast movement +if ((velocity ACE_player) distance [0,0,0] > 0.5 && {cameraView == "GUNNER"} && {cameraOn == ACE_player}) exitWith { // keep it steady. + ACE_player switchCamera "INTERNAL"; +}; + +// Refresh the firemode +[] call FUNC(showFireMode); + +_range = parseNumber (ctrlText __JavelinIGUIRangefinder); +if (_range > 50 && {_range < 2500}) then { + _pos = positionCameraToWorld [0,0,_range]; + _targetArray = _pos nearEntities ["AllVehicles", _range/25]; + if (count (_targetArray) > 0) then { + _newTarget = _targetArray select 0; + }; +}; + +if (isNull _newTarget) then { + _newTarget = cursorTarget; +}; + +// Create constants +_constraintTop = __ConstraintTop; +_constraintLeft = __ConstraintLeft; +_constraintBottom = __ConstraintBottom; +_constraintRight = __ConstraintRight; + +_offsetX = __OffsetX; +_offsetY = __OffsetY; + +__JavelinIGUITargeting ctrlShow true; +__JavelinIGUITargetingConstrains ctrlShow true; + +if (isNull _newTarget) then { + // No targets found + _currentTarget = objNull; + _lockTime = 0; + + __JavelinIGUISeek ctrlSetTextColor __ColorGray; + __JavelinIGUINFOV ctrlSetTextColor __ColorGreen; + __JavelinIGUITargeting ctrlShow false; + __JavelinIGUITargetingGate ctrlShow false; + __JavelinIGUITargetingLines ctrlShow false; + __JavelinIGUITargetingConstraints ctrlShow false; + + ACE_player setVariable ["ace_missileguidance_target",nil, false]; + + // Disallow fire + //if (ACE_player ammo "Javelin" > 0 || {ACE_player ammo "ACE_Javelin_Direct" > 0}) then {ACE_player setWeaponReloadingTime //[player, "Javelin", 0.2];}; +} else { + if (_newTarget distance ACE_player < 2500 + && {(call CBA_fnc_getFoV) select 1 > 9} + && { (currentVisionMode ACE_player == 2)} + && GVAR(isLockKeyDown) + ) then { + // Lock on after 3 seconds + if(_currentTarget != _newTarget) then { + TRACE_1("New Target, reseting locking", _newTarget); + _lockTime = diag_tickTime; + _currentTarget = _newTarget; + + playSound "ACE_Javelin_Locking"; + } else { + if(diag_tickTime - _lockTime > __LOCKONTIME) then { + TRACE_2("LOCKED!", _currentTarget, _lockTime); + + __JavelinIGUISeek ctrlSetTextColor __ColorGreen; + __JavelinIGUINFOV ctrlSetTextColor __ColorNull; + + __JavelinIGUITargeting ctrlShow true; + __JavelinIGUITargetingConstrains ctrlShow false; + __JavelinIGUITargetingGate ctrlShow true; + __JavelinIGUITargetingLines ctrlShow true; + + _zamerny = if (_currentTarget isKindOf "CAManBase") then {_currentTarget selectionPosition "body"} else {_currentTarget selectionPosition "zamerny"}; + _randomPosWithinBounds = [(_zamerny select 0) + 1 - (random 2.0),(_zamerny select 1) + 1 - (random 2.0),(_zamerny select 2) + 0.5 - (random 1.0)]; + + _apos = worldToScreen (_currentTarget modelToWorld _randomPosWithinBounds); + + _aposX = 0; + _aposY = 0; + if (count _apos < 2) then { + _aposX = 1; + _aposY = 0; + } else { + _aposX = (_apos select 0) + _offsetX; + _aposY = (_apos select 1) + _offsetY; + }; + + // Move target marker to coords. + __JavelinIGUITargetingLineV ctrlSetPosition [_aposX,ctrlPosition __JavelinIGUITargetingLineV select 1]; + __JavelinIGUITargetingLineH ctrlSetPosition [ctrlPosition __JavelinIGUITargetingLineH select 0,_aposY]; + {_x ctrlCommit __TRACKINTERVAL} forEach [__JavelinIGUITargetingLineH,__JavelinIGUITargetingLineV]; + + _boundsInput = if (_currentTarget isKindOf "CAManBase") then { + [_currentTarget,[-1,-1,-2],_currentTarget selectionPosition "body"]; + } else { + [_currentTarget,[-1,-1,-2],_currentTarget selectionPosition "zamerny"]; + }; + + _bpos = _boundsInput call EFUNC(common,worldToScreenBounds); + + _minX = ((_bpos select 0) + _offsetX) max _constraintLeft; + _minY = ((_bpos select 1) + _offsetY) max _constraintTop; + _maxX = ((_bpos select 2) + _offsetX) min (_constraintRight - 0.025*(3/4)*SafezoneH); + _maxY = ((_bpos select 3) + _offsetY) min (_constraintBottom - 0.025*SafezoneH); + + TRACE_4("", _boundsInput, _bpos, _minX, _minY); + + __JavelinIGUITargetingGateTL ctrlSetPosition [_minX,_minY]; + __JavelinIGUITargetingGateTR ctrlSetPosition [_maxX,_minY]; + __JavelinIGUITargetingGateBL ctrlSetPosition [_minX,_maxY]; + __JavelinIGUITargetingGateBR ctrlSetPosition [_maxX,_maxY]; + + {_x ctrlCommit __TRACKINTERVAL} forEach [__JavelinIGUITargetingGateTL,__JavelinIGUITargetingGateTR,__JavelinIGUITargetingGateBL,__JavelinIGUITargetingGateBR]; + + ACE_player setVariable["ace_missileguidance_target", _currentTarget, false]; + + if(diag_tickTime > _soundTime) then { + playSound "ACE_Javelin_Locked"; + _soundTime = diag_tickTime + 0.25; + }; + } else { + __JavelinIGUITargeting ctrlShow true; + __JavelinIGUITargetingGate ctrlShow true; + __JavelinIGUITargetingLines ctrlShow false; + + ACE_player setVariable["ace_missileguidance_target", nil, false]; + + _boundsInput = if (_currentTarget isKindOf "CAManBase") then { + [_newTarget,[-1,-1,-2],_currentTarget selectionPosition "body"]; + } else { + [_newTarget,[-1,-1,-1],_currentTarget selectionPosition "zamerny"]; + }; + + _bpos = _boundsInput call EFUNC(common,worldToScreenBounds); + + _minX = ((_bpos select 0) + _offsetX) max _constraintLeft; + _minY = ((_bpos select 1) + _offsetY) max _constraintTop; + _maxX = ((_bpos select 2) + _offsetX) min (_constraintRight - 0.025*(3/4)*SafezoneH); + _maxY = ((_bpos select 3) + _offsetY) min (_constraintBottom - 0.025*SafezoneH); + + __JavelinIGUITargetingGateTL ctrlSetPosition [_minX,_minY]; + __JavelinIGUITargetingGateTR ctrlSetPosition [_maxX,_minY]; + __JavelinIGUITargetingGateBL ctrlSetPosition [_minX,_maxY]; + __JavelinIGUITargetingGateBR ctrlSetPosition [_maxX,_maxY]; + + {_x ctrlCommit __TRACKINTERVAL} forEach [__JavelinIGUITargetingGateTL,__JavelinIGUITargetingGateTR,__JavelinIGUITargetingGateBL,__JavelinIGUITargetingGateBR]; + + if(diag_tickTime > _soundTime) then { + playSound "ACE_Javelin_Locking"; + _soundTime = diag_tickTime + 0.25; + }; + }; + }; + } else { + // Something is wrong with our seek + _currentTarget = objNull; + ACE_player setVariable["ace_missileguidance_target", nil, false]; + + __JavelinIGUISeek ctrlSetTextColor __ColorGray; + __JavelinIGUINFOV ctrlSetTextColor __ColorGray; + __JavelinIGUITargeting ctrlShow false; + __JavelinIGUITargetingGate ctrlShow false; + __JavelinIGUITargetingLines ctrlShow false; + + ACE_player setVariable ["ace_missileguidance_target",nil, false]; + }; + +}; + +//TRACE_2("", _newTarget, _currentTarget); + +// Save arguments for next run +_args set[0, diag_tickTime]; +_args set[1, _currentTarget]; +_args set[2, _runTime]; +_args set[3, _lockTime]; +_args set[4, _soundTime]; + +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 new file mode 100644 index 0000000000..a12d0ef176 --- /dev/null +++ b/addons/javelin/functions/fnc_onOpticLoad.sqf @@ -0,0 +1,33 @@ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" +TRACE_1("enter", _this); + +if((count _this) > 0) then { + uiNameSpace setVariable ['ACE_RscOptics_javelin',_this select 0]; +}; + +ACE_player setVariable ["ace_missileguidance_target",nil, false]; + +__JavelinIGUISeek ctrlSetTextColor __ColorGray; +__JavelinIGUINFOV ctrlSetTextColor __ColorGray; + +__JavelinIGUITargeting ctrlShow false; +__JavelinIGUITargetingConstrains ctrlShow false; +__JavelinIGUITargetingGate ctrlShow false; +__JavelinIGUITargetingLines ctrlShow false; + +uiNameSpace setVariable [QGVAR(arguments), + [ + 0, // Last runtime + objNull, // currentTargetObject + 0, // Run Time + 0, // Lock Time + 0 // Sound timer + ] +]; + +_pfh_handle = uiNamespace getVariable ["ACE_RscOptics_javelin_PFH", nil]; +if(isNil "_pfh_handle") then { + _pfh_handle = [FUNC(onOpticDraw), 0, []] call CBA_fnc_addPerFrameHandler; + uiNamespace setVariable["ACE_RscOptics_javelin_PFH", _pfh_handle]; +}; \ No newline at end of file diff --git a/addons/javelin/functions/fnc_showFireMode.sqf b/addons/javelin/functions/fnc_showFireMode.sqf new file mode 100644 index 0000000000..35dff9dbd3 --- /dev/null +++ b/addons/javelin/functions/fnc_showFireMode.sqf @@ -0,0 +1,14 @@ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" +TRACE_1("enter", _this); + +private["_player", "_currentFireMode"]; + +_currentFireMode = ACE_player getVariable["ace_missileguidance_attackProfile", "TOP"]; +if(_currentFireMode == "TOP") then { + __JavelinIGUITop ctrlSetTextColor __ColorGreen; + __JavelinIGUIDir ctrlSetTextColor __ColorGray; +} else { + __JavelinIGUITop ctrlSetTextColor __ColorGray; + __JavelinIGUIDir ctrlSetTextColor __ColorGreen; +}; \ No newline at end of file diff --git a/addons/javelin/functions/script_component.hpp b/addons/javelin/functions/script_component.hpp new file mode 100644 index 0000000000..21c6597c86 --- /dev/null +++ b/addons/javelin/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\javelin\script_component.hpp" \ No newline at end of file diff --git a/addons/wep_javelin/initKeybinds.sqf b/addons/javelin/initKeybinds.sqf similarity index 67% rename from addons/wep_javelin/initKeybinds.sqf rename to addons/javelin/initKeybinds.sqf index 126b1395a3..ecce40bbf0 100644 --- a/addons/wep_javelin/initKeybinds.sqf +++ b/addons/javelin/initKeybinds.sqf @@ -1,6 +1,6 @@ // by commy2 -["ACE3", QGVAR(lockTarget), localize "STR_ACE_WEP_JAVELIN_LockTarget", +["ACE3", QGVAR(lockTarget), localize "STR_ACE_JAVELIN_LockTarget", { if (GETGVAR(isLockKeyDown,false)) exitWith {false}; @@ -21,10 +21,10 @@ }, [15, [false, false, false]], false] call cba_fnc_addKeybind; //Tab Key -["ACE3", QGVAR(cycleFireMode), localize "STR_ACE_WEP_JAVELIN_CycleFireMode", +["ACE3", QGVAR(cycleFireMode), localize "STR_ACE_JAVELIN_CycleFireMode", { false }, { [ACE_player] call FUNC(cycleFireMode); false }, -[15, [false, true, false]], false] call cba_fnc_addKeybind; //Shift+Tab Key \ No newline at end of file +[15, [false, true, false]], false] call cba_fnc_addKeybind; //Ctrl+Tab Key \ No newline at end of file diff --git a/addons/wep_javelin/script_component.hpp b/addons/javelin/script_component.hpp similarity index 70% rename from addons/wep_javelin/script_component.hpp rename to addons/javelin/script_component.hpp index 3df1273422..6aa34b6bc8 100644 --- a/addons/wep_javelin/script_component.hpp +++ b/addons/javelin/script_component.hpp @@ -1,12 +1,12 @@ -#define COMPONENT wep_javelin +#define COMPONENT javelin #include "\z\ace\Addons\main\script_mod.hpp" -#ifdef DEBUG_ENABLED_WEP_JAVELIN +#ifdef DEBUG_ENABLED_JAVELIN #define DEBUG_MODE_FULL #endif -#ifdef DEBUG_SETTINGS_WEP_JAVELIN - #define DEBUG_SETTINGS DEBUG_SETTINGS_WEP_JAVELIN +#ifdef DEBUG_SETTINGS_JAVELIN + #define DEBUG_SETTINGS DEBUG_SETTINGS_JAVELIN #endif #include "\z\ace\Addons\main\script_macros.hpp" @@ -19,6 +19,8 @@ #define __JavelinIGUI (uinamespace getVariable "ACE_RscOptics_javelin") // Custom controls +#define __JavelinIGUITargeting (__JavelinIGUI displayCtrl 6999) + #define __JavelinIGUISeek (__JavelinIGUI displayCtrl 699000) #define __JavelinIGUITop (__JavelinIGUI displayCtrl 699001) #define __JavelinIGUIDir (__JavelinIGUI displayCtrl 699002) @@ -46,6 +48,11 @@ #define __JavelinIGUITargetingLineH (__JavelinIGUI displayCtrl 699301) #define __JavelinIGUITargetingLineV (__JavelinIGUI displayCtrl 699302) +#define __ConstraintTop (((ctrlPosition __JavelinIGUITargetingConstrainTop) select 1) + ((ctrlPosition (__JavelinIGUITargetingConstrainTop)) select 3)) +#define __ConstraintBottom ((ctrlPosition __JavelinIGUITargetingConstrainBottom) select 1) +#define __ConstraintLeft (((ctrlPosition __JavelinIGUITargetingConstrainLeft) select 0) + ((ctrlPosition (__JavelinIGUITargetingConstrainLeft)) select 2)) +#define __ConstraintRight ((ctrlPosition __JavelinIGUITargetingConstrainRight) select 0) + // Colors for controls #define __ColorOrange [0.9255,0.5216,0.1216,1] #define __ColorGreen [0.2941,0.8745,0.2157,1] diff --git a/addons/javelin/stringtable.xml b/addons/javelin/stringtable.xml new file mode 100644 index 0000000000..bd8f59c41c --- /dev/null +++ b/addons/javelin/stringtable.xml @@ -0,0 +1,21 @@ + + + + + Lock Target (Hold) + Ziel aufschalten + Захватить цель (удерживать) + Zamknout cíl(držet) + Namierz cel (przytrzymaj) + Vérouiller la Cible (Maintenir) + + + Cycle Fire Mode + Wechsle Feuermodus + Переключение режимов огня + Cyklování režimů palby + Przełącz tryb ognia + Mode de Tir (Cycle) + + + diff --git a/addons/laser/CfgEventhandlers.hpp b/addons/laser/CfgEventhandlers.hpp index bad89fd048..d925d0a12e 100644 --- a/addons/laser/CfgEventhandlers.hpp +++ b/addons/laser/CfgEventhandlers.hpp @@ -9,3 +9,11 @@ class Extended_PostInit_EventHandlers { init = QUOTE(call COMPILE_FILE(XEH_post_init)); }; }; + +class Extended_Init_EventHandlers { + class LaserTargetBase { + class ADDON { + init = QUOTE(_this call DFUNC(laser_init)); + }; + }; +}; \ No newline at end of file diff --git a/addons/laser/CfgVehicles.hpp b/addons/laser/CfgVehicles.hpp index 07b8055f0e..f4e2ed42ab 100644 --- a/addons/laser/CfgVehicles.hpp +++ b/addons/laser/CfgVehicles.hpp @@ -2,8 +2,32 @@ class CfgVehicles { class All; 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}; 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"; }; }; \ No newline at end of file diff --git a/addons/laser/CfgWeapons.hpp b/addons/laser/CfgWeapons.hpp new file mode 100644 index 0000000000..70a25e6f85 --- /dev/null +++ b/addons/laser/CfgWeapons.hpp @@ -0,0 +1,8 @@ + +class CfgWeapons { + class Binocular; + + class Laserdesignator : Binocular { + visionMode[] = {"Normal","NVG"}; + }; +}; diff --git a/addons/laser/RscInGameUI.hpp b/addons/laser/RscInGameUI.hpp new file mode 100644 index 0000000000..457d320520 --- /dev/null +++ b/addons/laser/RscInGameUI.hpp @@ -0,0 +1 @@ +// TODO: RscOptics_LaserDesignator for laser code designation \ No newline at end of file diff --git a/addons/laser/XEH_post_init.sqf b/addons/laser/XEH_post_init.sqf index 6904ee6c47..fb189d5041 100644 --- a/addons/laser/XEH_post_init.sqf +++ b/addons/laser/XEH_post_init.sqf @@ -1,3 +1,4 @@ #include "script_component.hpp" -NO_DEDICATED; +["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/XEH_pre_init.sqf b/addons/laser/XEH_pre_init.sqf index 8b39c429b6..e160a533f2 100644 --- a/addons/laser/XEH_pre_init.sqf +++ b/addons/laser/XEH_pre_init.sqf @@ -6,21 +6,28 @@ PREP(shootRay); PREP(shootCone); PREP(checkLos); -PREP(findLaserDesignator); PREP(findStrongestRay); PREP(translateToModelSpace); PREP(translateToWeaponSpace); +PREP(seekerFindLaserSpot); +PREP(laserOn); +PREP(laserOff); +PREP(handleLaserOn); +PREP(handleLaserOff); + +PREP(drawVisibleLaserTargets); + PREP(laser_init); - -GVAR(laser) = nil; // a single hud draws 1 laser at a time - +PREP(vanillaLaserSeekerHandler); PREP(laserTargetPFH); -ACE_LASERS = []; +GVAR(VanillaLasers) = []; -ACE_DEFAULT_LASER_CODE = 1000; -ACE_DEFAULT_FIRE_SELECTION = [FIREMODE_DIRECT_LOAL, ACE_DEFAULT_LASER_CODE]; +// Laser default variables +ACE_DEFAULT_LASER_CODE = 1001; +ACE_DEFAULT_LASER_WAVELENGTH = 1550; +ACE_DEFAULT_LASER_BEAMSPREAD = 1; -FUNC(getPosASL) = {visiblePositionASL (_this select 0)}; \ No newline at end of file +GVAR(laserEmitters) = HASH_CREATE; \ No newline at end of file diff --git a/addons/laser/config.cpp b/addons/laser/config.cpp index 4b209b866e..3f430619ef 100644 --- a/addons/laser/config.cpp +++ b/addons/laser/config.cpp @@ -11,4 +11,5 @@ class CfgPatches { }; #include "CfgEventhandlers.hpp" -#include "CfgVehicles.hpp" \ No newline at end of file +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" \ No newline at end of file diff --git a/addons/laser/functions/fnc_drawVisibleLaserTargets.sqf b/addons/laser/functions/fnc_drawVisibleLaserTargets.sqf new file mode 100644 index 0000000000..161364c0f2 --- /dev/null +++ b/addons/laser/functions/fnc_drawVisibleLaserTargets.sqf @@ -0,0 +1 @@ +// @TODO: This is to draw the actual LaserTarget positions to utilize for laser shooting. \ No newline at end of file diff --git a/addons/laser/functions/fnc_findLaserDesignator.sqf b/addons/laser/functions/fnc_findLaserDesignator.sqf deleted file mode 100644 index d10e221501..0000000000 --- a/addons/laser/functions/fnc_findLaserDesignator.sqf +++ /dev/null @@ -1,70 +0,0 @@ -#include "script_component.hpp" - -private ["_missile", "_headingPitch", "_found", "_vectorTo", "_polarTo", "_dir", "_vertOk", "_horzOk", "_fov", - "_closestDistance", "_pos1", "_pos2", "_disCheck", "_currentTarget", "_potentialTargets", "_offset", "_vector"]; -_missile = _this select 0; -_laserCode = _this select 1; -_fov = if (count _this > 2) then {_this select 2} else {75}; -_vector = if (count _this > 3) then {_this select 3} else {vectorDir _missile}; -_offset = if (count _this > 4) then {_this select 4} else {[0,0,0]}; - -_headingPitch = _vector call CBA_fnc_vect2polar; -_currentTarget = nil; -_found = false; - -LOG("Searching lasers"); -if(!(isNil "ACE_LASERS")) then { - _potentialTargets = []; - TRACE_1("", ACE_LASERS); - - { - if(!(isNull _x)) then { - _sensorPos = ATLtoASL(_missile modelToWorldVisual _offset); - _vectorTo = [_sensorPos, ([_x] call FUNC(getPosASL))] call BIS_fnc_vectorFromXToY; - _polarTo = _vectorTo call CBA_fnc_vect2polar; - _dir = _polarTo select 1; - _dir = _dir - (_headingPitch select 1); - - TRACE_4("Calc", _sensorPos, _vectorTo, _polarTo, _dir); - - if (_dir < 0) then {_dir = _dir + 360}; - if (_dir > 360) then {_dir = _dir - 360}; - _vertOk = false; - _horzOk = false; - if(_dir < _fov || {_dir > (360-_fov)}) then { - _horzOk = true; - }; - if(abs((abs(_polarTo select 2))-(abs(_headingPitch select 2))) < _fov) then { - _vertOk = true; - }; - - TRACE_2("Results", _vertOk, _horzOk); - - if(_vertOk && {_horzOk}) then { - // Does the laser currently have our current code, if we have one? - _targetCode = _x getVariable ["ACE_LASERTARGET_CODE", ACE_DEFAULT_LASER_CODE]; - TRACE_1("Target in sight, checking code", _targetCode, _laserCode); - if(_targetCode == _laserCode) then { - _potentialTargets set[(count _potentialTargets), _x]; - }; - }; - }; - - } forEach ACE_LASERS; - - TRACE_1("", _potentialTargets); - - _closestDistance = 100000; - { - _pos1 = (getPosASL _missile); - _pos2 = ([_x] call FUNC(getPosASL)); - _disCheck = _pos1 distance _pos2; - // shouldn't this bail out when a valid target is found instead of iterating over all potential targets ? - if(_disCheck < _closestDistance && {[_pos1, _pos2, _x, _missile] call FUNC(checkLos)}) then { - _found = true; - _currentTarget = _x; - _closestDistance = _disCheck; - }; - } forEach _potentialTargets; -}; -[_found, _currentTarget] \ No newline at end of file diff --git a/addons/laser/functions/fnc_handleLaserOff.sqf b/addons/laser/functions/fnc_handleLaserOff.sqf new file mode 100644 index 0000000000..573bd8197b --- /dev/null +++ b/addons/laser/functions/fnc_handleLaserOff.sqf @@ -0,0 +1,8 @@ +//fnc_handleLaserOff.sqf +#include "script_component.hpp" + +private ["_uuid"]; +_uuid = _this select 0; +if(HASH_HASKEY(GVAR(laserEmitters), _uuid)) then { + HASH_REM(GVAR(laserEmitters), _uuid); +}; diff --git a/addons/laser/functions/fnc_handleLaserOn.sqf b/addons/laser/functions/fnc_handleLaserOn.sqf new file mode 100644 index 0000000000..bac53a8957 --- /dev/null +++ b/addons/laser/functions/fnc_handleLaserOn.sqf @@ -0,0 +1,7 @@ +//fnc_handleLaserOn.sqf +#include "script_component.hpp" + +private ["_uuid", "_args"]; +_uuid = _this select 0; +_args = _this select 1; +HASH_SET(GVAR(laserEmitters), _uuid, _args); diff --git a/addons/laser/functions/fnc_laserOff.sqf b/addons/laser/functions/fnc_laserOff.sqf new file mode 100644 index 0000000000..84613cd988 --- /dev/null +++ b/addons/laser/functions/fnc_laserOff.sqf @@ -0,0 +1,16 @@ +/* + * Author: Nou + * Turn a laser designator off. + * + * Arguments: + * 0: UUID (from laserOn) + * + * Return value: + * None + */ + +#include "script_component.hpp" + +private ["_uuid"]; +_uuid = _this select 0; +["laser_laserOff", [_uuid]] call EFUNC(common,globalEvent); diff --git a/addons/laser/functions/fnc_laserOn.sqf b/addons/laser/functions/fnc_laserOn.sqf new file mode 100644 index 0000000000..9b5faa3859 --- /dev/null +++ b/addons/laser/functions/fnc_laserOn.sqf @@ -0,0 +1,23 @@ +/* + * Author: Nou + * Turn a laser designator on. + * + * Arguments: + * 0: Emitter + * 1: Owner + * 2: Method, can be code, which emitter and owner are passed to, a string function name, an array with a position memory point and weapon name, or an array with a position memory point, a vector begining memory point, and vector ending memory point. + * 3: Wavelength (1550nm is common eye safe) + * 4: Laser code + * 5: Beam divergence (in mils off beam center). + * + * Return value: + * String, UUID for sending to laserOff function. + */ + +#include "script_component.hpp" + +private ["_uuid", "_args"]; +_uuid = format["%1%2%3", floor diag_tickTime, floor random 1000, floor random 10000]; +_args = [_uuid, _this]; +["laser_laserOn", _args] call EFUNC(common,globalEvent); +_uuid; diff --git a/addons/laser/functions/fnc_laserTargetPFH.sqf b/addons/laser/functions/fnc_laserTargetPFH.sqf index bdab413685..d73d9f070a 100644 --- a/addons/laser/functions/fnc_laserTargetPFH.sqf +++ b/addons/laser/functions/fnc_laserTargetPFH.sqf @@ -1,20 +1,25 @@ +//#define DEBUG_MODE_FULL #include "script_component.hpp" +TRACE_1("enter", _this); private["_args", "_laserTarget"]; //TRACE_1("enter", _this); _args = _this select 0; _laserTarget = _args select 0; +_shooter = _args select 1; +_uuid = _args select 2; -if(isNull _laserTarget || !alive player) exitWith { +if(isNull _laserTarget || !alive _shooter) exitWith { [(_this select 1)] call cba_fnc_removePerFrameHandler; - REM(ACE_LASERS, _laserTarget); + REM(GVAR(VanillaLasers), _laserTarget); + + // Remove laseron + [_uuid] call FUNC(laserOff); }; -_end = diag_tickTime; - #ifdef DEBUG_MODE_FULL // Iconize the location of the actual laserTarget -_pos = [_laserTarget] call FUNC(getPosASL); +_pos = getPosASL _laserTarget; drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa", [1,0,0,1], (ASLtoATL _pos), 0.75, 0.75, 0, "", 0.5, 0.025, "TahomaB"]; { diff --git a/addons/laser/functions/fnc_laser_init.sqf b/addons/laser/functions/fnc_laser_init.sqf index 9fcb439032..378ee38407 100644 --- a/addons/laser/functions/fnc_laser_init.sqf +++ b/addons/laser/functions/fnc_laser_init.sqf @@ -1,25 +1,32 @@ +//#define DEBUG_MODE_FULL #include "script_component.hpp" -PARAMS_1(_laserTarget); - TRACE_1("enter", _this); +PARAMS_1(_laserTarget); + // Add the target to the global targets array // Everyone tracks them - // Add the laser localized to the laser array, and give it the default localized code -PUSH(ACE_LASERS, _laserTarget); +PUSH(GVAR(VanillaLasers), _laserTarget); + // Check the vehicle, otherwise use the default -_laserTarget setVariable ["ACE_LASERTARGET_CODE", ACE_DEFAULT_LASER_CODE, false]; +_laserTarget setVariable [QGVAR(code), ACE_DEFAULT_LASER_CODE, false]; +_laserTarget setVariable [QGVAR(beamSpread), ACE_DEFAULT_LASER_BEAMSPREAD, false]; +_laserTarget setVariable [QGVAR(waveLength), ACE_DEFAULT_LASER_WAVELENGTH, false]; + // Clean the lasers of any null objects while we are here -REM(ACE_LASERS, objNull); +REM(GVAR(VanillaLasers), objNull); if(!(local _laserTarget)) exitWith { }; + // The target is local, so its on this client if(!isDedicated) then { - _laserTarget setVariable ["ACE_LASERTARGET_SHOOTER", player, true]; - - [FUNC(laserTargetPFH), 0, [_laserTarget, player]] call cba_fnc_addPerFrameHandler; + // @TODO: Get ownership variables and set them on the vehicle + + _uuid = [(vehicle ACE_player), ACE_player, QFUNC(vanillaLaserSeekerHandler), ACE_DEFAULT_LASER_WAVELENGTH, ACE_DEFAULT_LASER_CODE, ACE_DEFAULT_LASER_BEAMSPREAD] call FUNC(laserOn); + _laserTarget setVariable [QGVAR(uuid), _uuid, false]; + [FUNC(laserTargetPFH), 0, [_laserTarget, ACE_player, _uuid]] call cba_fnc_addPerFrameHandler; } else { // server side ownership of laser - //_laserTarget setVariable ["ACE_LASERTARGET_SHOOTER", nil, false]; + _laserTarget setVariable [QGVAR(owner), nil, true]; }; diff --git a/addons/laser/functions/fnc_rotateVectLine.sqf b/addons/laser/functions/fnc_rotateVectLine.sqf index b0360cc330..ec85a83cb7 100644 --- a/addons/laser/functions/fnc_rotateVectLine.sqf +++ b/addons/laser/functions/fnc_rotateVectLine.sqf @@ -32,7 +32,5 @@ if (_d != 0) then { }; /* Inverse of step 1 */ -_q1 set[0, (_q2 select 0) + (_p1 select 0)]; -_q1 set[1, (_q2 select 1) + (_p1 select 1)]; -_q1 set[2, (_q2 select 2) + (_p1 select 2)]; +_q1 = _q2 vectorAdd _p1; _q1; \ No newline at end of file diff --git a/addons/laser/functions/fnc_rotateVectLineGetMap.sqf b/addons/laser/functions/fnc_rotateVectLineGetMap.sqf index fdbd6533ef..dc4b1b54c3 100644 --- a/addons/laser/functions/fnc_rotateVectLineGetMap.sqf +++ b/addons/laser/functions/fnc_rotateVectLineGetMap.sqf @@ -5,19 +5,12 @@ _p = _this select 0; _p1 = _this select 1; _p2 = _this select 2; -_q1 = []; _q2 = []; -_u = []; /* Step 1 */ -_q1 set[0, (_p select 0) - (_p1 select 0)]; -_q1 set[1, (_p select 1) - (_p1 select 1)]; -_q1 set[2, (_p select 2) - (_p1 select 2)]; - -_u set[0, (_p2 select 0) - (_p1 select 0)]; -_u set[1, (_p2 select 1) - (_p1 select 1)]; -_u set[2, (_p2 select 2) - (_p1 select 2)]; -_u = _u call BIS_fnc_unitVector; +_q1 = _p vectorDiff _p1; +_u = _p2 vectorDiff _p1; +_u = vectorNormalized _u; _d = sqrt((_u select 1)*(_u select 1) + (_u select 2)*(_u select 2)); /* Step 2 */ diff --git a/addons/laser/functions/fnc_seekerFindLaserSpot.sqf b/addons/laser/functions/fnc_seekerFindLaserSpot.sqf new file mode 100644 index 0000000000..421748a681 --- /dev/null +++ b/addons/laser/functions/fnc_seekerFindLaserSpot.sqf @@ -0,0 +1,143 @@ +/* + * Author: Nou + * Turn a laser designator on. + * + * Arguments: + * 0: Position of seeker (ASL) + * 1: Seeker wavelength sensitivity range, [1550,1550] is common eye safe. + * 2: Seeker laser code. + * + * Return value: + * Array, [Strongest compatible laser spot ASL pos, owner object] Nil array values if nothing found. + */ + +#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"]; + +_pos = _this select 0; +_seekerWavelengths = _this select 1; +_seekerCode = _this select 2; + +_spots = []; +_buckets = []; +_excludes = []; +_bucketIndex = 0; +_finalPos = nil; +_finalOwner = nil; + +{ + _obj = _x select 0; + _owner = _x select 1; + _method = _x select 2; + _emitterWavelength = _x select 3; + _laserCode = _x select 4; + _divergence = _x select 5; + if(alive _obj && {_emitterWavelength >= (_seekerWavelengths select 0)} && {_emitterWavelength <= (_seekerWavelengths select 1)} && {_laserCode == _seekerCode}) then { + _laser = []; + if(IS_CODE(_method)) then { + _laser = _x call _method; + } else { + if(IS_STRING(_method)) then { + _laser = _x call (missionNamespace getVariable [_method, {}]); + } else { + if(IS_ARRAY(_method)) then { + if(count _method == 2) then { + _laser = [ATLtoASL (_obj modelToWorldVisual (_method select 0)), _obj weaponDirection (_method select 1)]; + } else { + if(count _method == 3) then { + _laser = [ATLtoASL (_obj modelToWorldVisual (_method select 0)), (ATLtoASL (_obj modelToWorldVisual (_method select 1))) vectorFromTo (ATLtoASL (_obj modelToWorldVisual (_method select 2)))]; + }; + }; + }; + }; + }; + _laserPos = _laser select 0; + _laserDir = _laser select 1; + _res = [_laserPos, _laserDir, _divergence] call FUNC(shootCone); + { + _spots pushBack [_x select 0, _owner]; + } forEach (_res select 2); + }; +} forEach (GVAR(laserEmitters) select 1); + +if((count _spots) > 0) then { + _bucketPos = nil; + _bucketList = nil; + _c = 0; + while { count(_spots) != count(_excludes) && _c < (count _spots) } do { + scopeName "mainSearch"; + { + if(!(_forEachIndex in _excludes)) then { + _index = _buckets pushBack [_x, [_x]]; + _excludes pushBack _forEachIndex; + _bucketPos = _x select 0; + _bucketList = (_buckets select _index) select 1; + breakTo "mainSearch"; + }; + } forEach _spots; + { + if(!(_forEachIndex in _excludes)) then { + _testPos = (_x select 0); + if(_testPos vectorDistanceSqr _bucketPos <= 100) then { + _bucketList pushBack _x; + _excludes pushBack _forEachIndex; + }; + }; + } forEach _spots; + _c = _c + 1; + }; + _finalBuckets = []; + _largest = -1; + _largestIndex = 0; + { + _index = _finalBuckets pushBack []; + _bucketList = _finalBuckets select _index; + { + _testPos = (_x select 0); + if(!terrainIntersectASL [_pos, _testPos] && {!lineIntersects [_pos, _testPos]}) then { + _bucketList pushBack _x; + }; + } forEach (_x select 1); + if((count _bucketList) > _largest) then { + _largest = (count _bucketList); + _largestIndex = _index; + }; + } forEach _buckets; + + _finalBucket = _finalBuckets select _largestIndex; + _owners = HASH_CREATE; + + if(count _finalBucket > 0) then { + _avgX = 0; + _avgY = 0; + _avgZ = 0; + { + player sideChat format["x: %1", _x]; + _avgX = _avgX + ((_x select 0) select 0); + _avgY = _avgY + ((_x select 0) select 1); + _avgZ = _avgZ + ((_x select 0) select 2); + _owner = _x select 1; + if(HASH_HASKEY(_owners, _owner)) then { + _count = HASH_GET(_owners, _owner); + HASH_SET(_owners, _owner, _count+1); + } else { + HASH_SET(_owners, _owner, 1); + }; + } forEach _finalBucket; + _count = count _finalBucket; + _finalPos = [_avgX/_count, _avgY/_count, _avgZ/_count]; + _maxOwner = -1; + _maxOwnerIndex = 0; + { + if((_owners select 1) select _forEachIndex > _maxOwner) then { + _maxOwner = (_owners select 1) select _forEachIndex; + _maxOwnerIndex = _forEachIndex; + }; + } forEach (_owners select 0); + _finalOwner = (_owners select 0) select _maxOwnerIndex; + }; +}; +[_finalPos, _owner]; diff --git a/addons/laser/functions/fnc_shootCone.sqf b/addons/laser/functions/fnc_shootCone.sqf index e33edd10bc..801353d4f7 100644 --- a/addons/laser/functions/fnc_shootCone.sqf +++ b/addons/laser/functions/fnc_shootCone.sqf @@ -1,8 +1,17 @@ #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"]; _divergence = 0.3; _pos = _this select 0; _vec = _this select 1; +if(count _this > 2) then { + _divergence = _this select 2; +}; +_count = 3; +if(count _this > 3) then { + _count = _this select 3; +}; _longestReturn = -1000000000; _shortestReturn = 1000000000; _resultPositions = []; @@ -10,7 +19,7 @@ _p1 = [0,0,0]; _p2 = +_vec; _p = (_vec call CBA_fnc_vect2polar); _v = [(_p select 0), (_p select 1), (_p select 2)+90] call CBA_fnc_polar2vect; -_cp = [_vec, _v] call BIS_fnc_crossProduct; +_cp = _vec vectorCrossProduct _v; _vecRotateMap = [_cp, _p1, _p2] call FUNC(rotateVectLineGetMap); @@ -24,28 +33,21 @@ if(!isNil "_resultPos") then { if(_distance > _longestReturn) then { _longestReturn = _distance; }; - _resultPositions set[(count _resultPositions), _result]; + _resultPositions pushBack _result; #ifdef DEBUG_MODE_FULL - DRAW_LINES set[(count DRAW_LINES), [_pos, _resultPos, [0, 1, 0, 1]]]; + // DRAW_LINES set[(count DRAW_LINES), [_pos, _resultPos, [0, 1, 0, 1]]]; + drawLine3D [ASLtoATL _pos, ASLtoATL _resultPos, [1,0,0,1]]; #endif }; -_count = 8; -_pos2 = [ - (_pos select 0)+((_vec select 0)*1000), - (_pos select 1)+((_vec select 1)*1000), - (_pos select 2)+((_vec select 2)*1000) - ]; + +_pos2 = _pos vectorAdd (_vec vectorMultiply 1000); { for "_i" from 0 to ceil(_count*_x) do { _radOffset = random 360; _offset = [_vecRotateMap, (((360/_count)*_i)+_radOffset) mod 360] call FUNC(rotateVectLine); - _offsetPos = [ - (_pos2 select 0)+((_offset select 0)*(_divergence*_x)), - (_pos2 select 1)+((_offset select 1)*(_divergence*_x)), - (_pos2 select 2)+((_offset select 2)*(_divergence*_x)) - ]; - _offsetVector = [_pos, _offsetPos] call BIS_fnc_vectorFromXtoY; + _offsetPos = _pos2 vectorAdd (_offset vectorMultiply (_divergence*_x)); + _offsetVector = _pos vectorFromTo _offsetPos; _result = [_pos, _offsetVector] call FUNC(shootRay); _resultPos = _result select 0; if(!isNil "_resultPos") then { @@ -56,9 +58,10 @@ _pos2 = [ if(_distance > _longestReturn) then { _longestReturn = _distance; }; - _resultPositions set[(count _resultPositions), _result]; + _resultPositions pushBack _result; #ifdef DEBUG_MODE_FULL - DRAW_LINES set[(count DRAW_LINES), [_pos, _resultPos, [0, 1, 0, 1]]]; + // DRAW_LINES set[(count DRAW_LINES), [_pos, _resultPos, [0, 1, 0, 1]]]; + drawLine3D [ASLtoATL _pos, ASLtoATL _resultPos, [1,0,0,1]]; #endif }; }; diff --git a/addons/laser/functions/fnc_shootRay.sqf b/addons/laser/functions/fnc_shootRay.sqf index 62847d16b6..83b257ed7b 100644 --- a/addons/laser/functions/fnc_shootRay.sqf +++ b/addons/laser/functions/fnc_shootRay.sqf @@ -11,13 +11,8 @@ _lastPos = +_pos; { scopeName "mainSearch"; for "_i" from 1 to 10 do { - _nextPos = [ - (_lastPos select 0)+((_vec select 0)*_x), - (_lastPos select 1)+((_vec select 1)*_x), - (_lastPos select 2)+((_vec select 2)*_x) - ]; - - if(lineIntersects [_lastPos, _nextPos] || terrainIntersectASL [_lastPos, _nextPos]) then { + _nextPos = _lastPos vectorAdd (_vec vectorMultiply _x); + if(terrainIntersectASL [_lastPos, _nextPos] || {lineIntersects [_lastPos, _nextPos]}) then { _resultPos = _lastPos; breakTo "mainSearch"; } else { @@ -25,6 +20,5 @@ _lastPos = +_pos; _lastPos = _nextPos; }; }; - } forEach _fidelity; [_resultPos, _distance]; \ No newline at end of file diff --git a/addons/laser/functions/fnc_vanillaLaserSeekerHandler.sqf b/addons/laser/functions/fnc_vanillaLaserSeekerHandler.sqf new file mode 100644 index 0000000000..38cd1839f9 --- /dev/null +++ b/addons/laser/functions/fnc_vanillaLaserSeekerHandler.sqf @@ -0,0 +1,26 @@ +/* + * Author: jaynus + * Handler function for laser network code. + * + * Argument: + * 0: Emitter + * 1: Owner + * + * Return value: + * [position, direction] + */ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" + +private["_emitter", "_owner", "_gunnerInfo", "_turretInfo", "_povPos", "_povDir"]; + +_emmiter = _this select 0; +_owner = _this select 1; + +// Not in a vehicle.... +// @TODO: handle lasering from turrets +if( (vehicle _emmiter) == _emmiter && alive _emmiter && (currentWeapon _emmiter) == "LaserDesignator") exitWith { + [(eyePos _emmiter), (eyeDirection _emmiter)] +}; + +[-1,-1] \ No newline at end of file diff --git a/addons/laser_selfdesignate/CfgUI.hpp b/addons/laser_selfdesignate/CfgUI.hpp deleted file mode 100644 index e8823e04f8..0000000000 --- a/addons/laser_selfdesignate/CfgUI.hpp +++ /dev/null @@ -1,32 +0,0 @@ -class RscPicture; -class RscText; -class RscControlsGroupNoScrollbars; -/* This disables air radar. We need to make this a seperate HUD addon -class RscInGameUI -{ - class RscUnitInfo - { - class CA_Radar: RscControlsGroupNoScrollbars - { - class controls - { - class CA_RadarBackground: RscPicture { - colorText[] = {0,0,0,0}; - text = ""; - }; - class CA_RadarIcon: RscPicture { - colorText[] = {0,0,0,0}; - }; - class CA_Heading: RscText { - colorText[] = {0,0,0,0}; - }; - }; - }; - }; -}; -class CfgInGameUI -{ - -}; - -*/ \ No newline at end of file diff --git a/addons/laser_selfdesignate/CfgVehicles.hpp b/addons/laser_selfdesignate/CfgVehicles.hpp index b29d8a4394..02d8b32b3d 100644 --- a/addons/laser_selfdesignate/CfgVehicles.hpp +++ b/addons/laser_selfdesignate/CfgVehicles.hpp @@ -8,12 +8,6 @@ class CfgVehicles { class Turrets { class MainTurret; }; - - // TODO: move these to a different HUD addon - // commanderCanSee = 2+32; - // gunnerCanSee = 2+32; - // driverCanSee = 2+32; - }; class Helicopter_Base_F: Helicopter {}; diff --git a/addons/laser_selfdesignate/XEH_pre_init.sqf b/addons/laser_selfdesignate/XEH_pre_init.sqf index a8d4b1779d..3f8c92e4db 100644 --- a/addons/laser_selfdesignate/XEH_pre_init.sqf +++ b/addons/laser_selfdesignate/XEH_pre_init.sqf @@ -5,7 +5,8 @@ PREP(laserHudDesignateOn); PREP(laserHudDesignateOff); PREP(unitTurretHasDesignator); -GVAR(laser) = nil; -GVAR(laserActive) = false; +PREP(findLaserSource); + +GVAR(active) = false; FUNC(getPosASL) = {visiblePositionASL (_this select 0)}; diff --git a/addons/laser_selfdesignate/config.cpp b/addons/laser_selfdesignate/config.cpp index 33c31ba7e5..19ec28063b 100644 --- a/addons/laser_selfdesignate/config.cpp +++ b/addons/laser_selfdesignate/config.cpp @@ -10,8 +10,6 @@ class CfgPatches { }; }; -#include "CfgUI.hpp" - #include "CfgEventhandlers.hpp" #include "CfgWeapons.hpp" #include "CfgVehicles.hpp" diff --git a/addons/laser_selfdesignate/functions/fnc_findLaserSource.sqf b/addons/laser_selfdesignate/functions/fnc_findLaserSource.sqf new file mode 100644 index 0000000000..ac1ae7e438 --- /dev/null +++ b/addons/laser_selfdesignate/functions/fnc_findLaserSource.sqf @@ -0,0 +1,30 @@ +/* + * Author: jaynus + * Handler function for laser network code. + * + * Argument: + * 0: Emitter + * 1: Owner + * + * Return value: + * [position, direction] + */ + //findLaserSource.sqf +//#define DEBUG_MODE_FULL +#include "script_component.hpp" + +private["_emitter", "_owner", "_gunnerInfo", "_turretInfo", "_povPos", "_povDir"]; + +_emmiter = _this select 0; +_owner = _this select 1; + +_gunnerInfo = [_emmiter, (currentWeapon _emmiter)] call CBA_fnc_getFirer; +_turretInfo = [_emmiter, _gunnerInfo select 1] call EFUNC(common,getTurretDirection); +_povPos = _turretInfo select 0; +_povDir = _turretInfo select 1; + +if(!isNil "_povPos" && !isNil "_povDir") exitWith { + [_povPos, _povDir] +}; + +[-1,-1] \ No newline at end of file diff --git a/addons/laser_selfdesignate/functions/fnc_initDesignatorActions.sqf b/addons/laser_selfdesignate/functions/fnc_initDesignatorActions.sqf index af361425aa..6514c889a1 100644 --- a/addons/laser_selfdesignate/functions/fnc_initDesignatorActions.sqf +++ b/addons/laser_selfdesignate/functions/fnc_initDesignatorActions.sqf @@ -28,7 +28,7 @@ GVAR(initializedClasses) = _initializedClasses; if (getNumber (_turretConfig >> QGVAR(Enabled)) == 1) exitWith { // @todo: Add the state variables to the vehicle, instead of to the client - // e.g.: _vehicle setVariable [format ["%1_%2", QGVAR(laserActive), _x], false]; + // e.g.: _vehicle setVariable [format ["%1_%2", QGVAR(active), _x], false]; // Add actions _onAction = [QGVAR(LaserOn), localize "STR_ACE_Laser_SelfDesignate_DesignatorOn", "", @@ -38,7 +38,7 @@ GVAR(initializedClasses) = _initializedClasses; }, { // Condition - !GVAR(laserActive) && {[ACE_player] call FUNC(unitTurretHasDesignator)} + !GVAR(active) && {[ACE_player] call FUNC(unitTurretHasDesignator)} }] call EFUNC(interact_menu,createAction); _offAction = [QGVAR(LaserOff), localize "STR_ACE_Laser_SelfDesignate_DesignatorOff", "", @@ -48,7 +48,7 @@ GVAR(initializedClasses) = _initializedClasses; }, { // Condition - GVAR(laserActive) && {[ACE_player] call FUNC(unitTurretHasDesignator)} + GVAR(active) && {[ACE_player] call FUNC(unitTurretHasDesignator)} }] call EFUNC(interact_menu,createAction); [_type, 1, ["ACE_SelfActions"], _onAction] call EFUNC(interact_menu,addActionToClass); diff --git a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOff.sqf b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOff.sqf index 2f4c437d28..17e7fcb76e 100644 --- a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOff.sqf +++ b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOff.sqf @@ -1,20 +1,25 @@ +/* + * Author: jaynus + * Turns off passed laser self designation. + * + * Argument: + * 0: Shooter, player shooting the laser + * 1: LaserUUID, the UUID of the laser returned by EFUNC(laser,laserOn) + * 2: Local laser target, unused. + * + * Return value: + * true + */ #include "script_component.hpp" -if(isNil QGVAR(laser)) exitWith { - false -}; -if(!local GVAR(laser)) then { - false +if( (count _this) > 2) then { + EXPLODE_3_PVT(_this,_shooter,_laserUuid, _localLaserTarget); + + [_laserUuid] call EFUNC(laser,laserOff); + // @TODO: Nou gets to field all tickets about missing lasers. + //deleteVehicle _localLaserTarget; }; -_handle = GVAR(laser) getVariable ["ACE_PFH_HANDLE", nil]; -if(!isNil "_handle") then { - [_handle] call cba_fnc_removePerFrameHandler; -}; - -REM(ACE_LASERS, GVAR(laser)); -deleteVehicle GVAR(laser); -GVAR(laser) = nil; -GVAR(laserActive) = false; +GVAR(active) = false; true \ 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 f0fdc8458f..c480c051bb 100644 --- a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf +++ b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf @@ -1,109 +1,89 @@ -//#define DEBUG_MODE_FULL +/* + * Author: jaynus + * Turns on laser self designation from this vehicle based on the turret. + * There are no arguments, because it is all strictly based on the users vehicle. + * + * Argument: + * + * Return value: + * N/A + */ + //#define DEBUG_MODE_FULL #include "script_component.hpp" TRACE_1("enter", _this); #define FCS_UPDATE_DELAY 1 -FUNC(magnitude) = { - _this distance [0, 0, 0] -}; - -FUNC(mat_normalize3d) = { - private ["_mag"]; - PARAMS_3(_vx,_vy,_vz); - - _mag = _this call FUNC(magnitude); - if (_mag == 0) then {_mag = 1}; - [(_vx/_mag), (_vy/_mag), (_vz/_mag)] -}; - FUNC(laserHudDesignatePFH) = { - private["_args", "_laserTarget", "_shooter", "_vehicle", "_weapon", "_gunnerInfo", "_turret", "_pov", "_gunBeg", "_gunEnd", "_povPos", "_povDir", "_result", "_resultPositions", "_firstResult", "_forceUpdateTime"]; + private["_strongestResultPos", "_args", "_localLaserTarget", "_laserResultPosition", "_laserResult", "_shooter", "_vehicle", "_weapon", "_gunnerInfo", "_turretInfo", "_pov", "_gunBeg", "_gunEnd", "_povPos", "_povDir", "_result", "_resultPositions", "_firstResult", "_forceUpdateTime"]; _args = _this select 0; - _laserTarget = _args select 0; - _shooter = _args select 1; - - if( (count _args) < 3) then { - _args set[2, diag_tickTime + FCS_UPDATE_DELAY]; - }; - _forceUpdateTime = _args select 2; + _shooter = _args select 0; + _localLaserTarget = _args select 2; _vehicle = vehicle _shooter; - _weapon = currentWeapon _vehicle; - TRACE_1("", _args); - - if(!alive _shooter || isNull _vehicle || isNull _laserTarget || !GVAR(laserActive) ) exitWith { - [] call FUNC(laserHudDesignateOff); + + if((vehicle _shooter) == _shooter || {!alive _shooter} || {isNull _vehicle} || {!GVAR(active)} ) exitWith { + _args call FUNC(laserHudDesignateOff); }; - if(!([ACE_player] call FUNC(unitTurretHasDesignator)) ) exitWith { - [] call FUNC(laserHudDesignateOff); + if(!([_shooter] call FUNC(unitTurretHasDesignator)) ) exitWith { + _args call FUNC(laserHudDesignateOff); }; + + if( (count _args) < 4) then { + _args set[3, diag_tickTime + FCS_UPDATE_DELAY]; + }; + _forceUpdateTime = _args select 3; + + // @TODO: We don't have anything here we need to do the calculations for right now + /* - // Retrieve the gunner and turret memory point information - _gunnerInfo = [_vehicle, _weapon] call CBA_fnc_getFirer; + _gunnerInfo = [_vehicle, (currentWeapon _vehicle)] call CBA_fnc_getFirer; _turretInfo = [_vehicle, _gunnerInfo select 1] call EFUNC(common,getTurretDirection); _povPos = _turretInfo select 0; - _povDir = _turretInfo select 1; + + _laserCode = (vehicle ACE_player) getVariable[QGVAR(currentCode), ACE_DEFAULT_LASER_CODE]; + _waveLength = (vehicle ACE_player) getVariable[QGVAR(currentWaveLength), ACE_DEFAULT_LASER_WAVELENGTH]; - - _result = [_povPos, _povDir] call EFUNC(laser,shootCone); - if((count _result) > 0) then { - _resultPositions = _result select 2; + _laserResult = [_povPos, [_waveLength,_waveLength], _laserCode] call EFUNC(laser,seekerFindLaserSpot); + _laserResultPosition = _laserResult select 0; + TRACE_1("Search", _laserResult); - if((count _resultPositions) > 0) then { - _firstResult = _resultPositions select 0; - _pos = _firstResult select 0; - - // If the laser has moved less than a half meter, then dont move it. - // Just regular use of lasers will commonly make them move this much, - // but not across multiple close frames. - // This loses accuracy a little, but saves position updates per frame. - TRACE_5("", diag_tickTime, _forceUpdateTime, getPosASL _laserTarget, _pos, ((getPosASL _laserTarget) distance _pos)); + if((count _laserResult) > 0) then { + // @TODO: Nou gets to field all tickets about missing lasers. + //_localLaserTarget setPosASL _laserResultPosition; + }; + */ - if(diag_tickTime > _forceUpdateTime) then { - TRACE_1("FCS Update", ""); - ["ace_fcs_forceUpdate", []] call ace_common_fnc_localEvent; - }; - - if( (_laserTarget distance _pos) > 0.1) then { - TRACE_1("LaserPos Update", ""); - _laserTarget setPosATL (ASLToATL _pos); - }; - - if(diag_tickTime > _forceUpdateTime) then { - _args set[2, diag_tickTime + FCS_UPDATE_DELAY]; - }; -#ifdef DEBUG_MODE_FULL - drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,0,1], (getPosATL _laserTarget), 0.75, 0.75, 0, "", 0.5, 0.025, "TahomaB"]; - - { - private["_position"]; - _position = _x select 0; - drawLine3d [ASLToATL _povPos, ASLToATL _position, [0,0,1,1] ]; - } forEach _resultPositions; -#endif - }; + if(diag_tickTime > _forceUpdateTime) then { + ["ace_fcs_forceUpdate", []] call ace_common_fnc_localEvent; + _args set[3, diag_tickTime + FCS_UPDATE_DELAY]; }; _this set[0, _args]; }; -private "_laserTarget"; -private "_handle"; +private ["_laserTarget", "_handle", "_vehicle", "_laserUuid", "_waveLength", "_beamSpread", "_laserCode"]; -if(isNil QGVAR(laser)) then { +if(!GVAR(active)) then { + GVAR(active) = true; - _laserTarget = "LaserTargetW" createVehicle (getpos player); + TRACE_1("Activating laser", ""); - GVAR(laserActive) = true; + // 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]; - _handle = [FUNC(laserHudDesignatePFH), 0.1, [_laserTarget, player]] call cba_fnc_addPerFrameHandler; - _laserTarget setVariable ["ACE_PFH_HANDLE", _handle, false]; + _laserUuid = [(vehicle ACE_player), ACE_player, QFUNC(findLaserSource), _waveLength, _laserCode, _beamSpread] call EFUNC(laser,laserOn); - GVAR(laser) = _laserTarget; + // @TODO: Create the local target for the players side + // @TODO: Nou gets to field all tickets about missing lasers. + //_localLaserTarget = "LaserTargetW" createVehicleLocal (getpos ACE_player); + + _handle = [FUNC(laserHudDesignatePFH), 0.1, [ACE_player, _laserUuid, nil]] call cba_fnc_addPerFrameHandler; } else { [] call FUNC(laserHudDesignateOff); [] call FUNC(laserHudDesignateOn); diff --git a/addons/laser_selfdesignate/stringtable.xml b/addons/laser_selfdesignate/stringtable.xml index 03d28814ec..8b2c528871 100644 --- a/addons/laser_selfdesignate/stringtable.xml +++ b/addons/laser_selfdesignate/stringtable.xml @@ -1,14 +1,23 @@  - Laser<br/>Designator On Lasermarkierer<br/>an + Laser<br/>Designador encendido + ЛЦУ<br/>ВКЛ + Laserový<br/>značkovač zapnut + Desygnator<br/>laserowy wł. + Désignateur<br/>Laser Allumé Laser<br/>Designator Off Lasermarkierer<br/>aus + Laser<br/>Designador apagado + ЛЦУ<br/>ВЫКЛ + Laserový<br/>značkovat vypnut + Desygnator<br/>laserowy wył. + Désignateur<br/>Laser Éteint - \ No newline at end of file + diff --git a/addons/laserpointer/stringtable.xml b/addons/laserpointer/stringtable.xml index 87b36618a6..a5a153aca4 100644 --- a/addons/laserpointer/stringtable.xml +++ b/addons/laserpointer/stringtable.xml @@ -1,32 +1,40 @@  - Laser Pointer (red) + Pointeur laser (rouge) Laserpointer (rot) + Лазерный прицел (красный) + Laserové ukazovátko (červené) + Wskaźnik laserowy (czerwony) Laser Pointer (green) + Pointeur laser (vert) Laserpointer (grün) + Лазерный прицел (зелёный) + Laserové ukazovátko (zelené) + Wskaźnik laserowy (zielony) - Emits visible light. + Diffuse un rayon lumineux visible. Strahlt sichtbares Licht aus. + Испускает узкий пучок видимого света. + Vyzařuje viditelné světlo. + Wydziela widzialne światło. - <t color='#9cf953'>Use: </t>Turn Laser ON/OFF <t color='#9cf953'>Použití: </t>Zapnout/vypnout laser - <t color='#9cf953'>Utiliser : </t>laser on/off + <t color='#9cf953'>Utiliser : </t>laser allumé/éteint <t color='#9cf953'>Benutzen: </t>Laser EIN/AUS <t color='#9cf953'>Uso: </t>Laser ON/OFF - <t color='#9cf953'>Użyj: </t>wł./wył. lasera + <t color='#9cf953'>Użyj: </t>wł./wył. laser <t color='#9cf953'>Uso: </t>Ativar/Desativar laser <t color='#9cf953'>Использовать: </t>вкл/выкл лазер <t color='#9cf953'>Usar: </t>encender/apagar láser - diff --git a/addons/logistics_uavbattery/CfgVehicles.hpp b/addons/logistics_uavbattery/CfgVehicles.hpp index a3a3fc763d..5feba4c9a8 100644 --- a/addons/logistics_uavbattery/CfgVehicles.hpp +++ b/addons/logistics_uavbattery/CfgVehicles.hpp @@ -1,29 +1,29 @@ class CfgVehicles { - class Helicopter_Base_F; - class UAV_01_base_F: Helicopter_Base_F { - class ACE_Actions { - class ACE_MainActions { - class GVAR(RefuelUAV) { - displayName = "$STR_ACE_logistics_uavbattery_Recharge"; - distance = 4; - condition = QUOTE([ARR_2(_player, _target)] call FUNC(canRefuelUAV)); - statement = QUOTE([ARR_2(_player, _target)] call FUNC(refuelUAV)); - showDisabled = 0; \ - priority = 1.245; \ - icon = QUOTE(PATHTOF(ui\UAV_battery.paa)); + class Helicopter_Base_F; + class UAV_01_base_F: Helicopter_Base_F { + class ACE_Actions { + class ACE_MainActions { + class GVAR(RefuelUAV) { + displayName = "$STR_ACE_logistics_uavbattery_Recharge"; + distance = 4; + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canRefuelUAV)); + statement = QUOTE([ARR_2(_player, _target)] call FUNC(refuelUAV)); + showDisabled = 0; \ + priority = 1.245; \ + icon = QUOTE(PATHTOF(ui\UAV_battery_ca.paa)); + }; + }; }; - }; }; - }; - // Misc box content - class Box_NATO_Support_F; - class ACE_Box_Misc: Box_NATO_Support_F { - class TransportItems { - class _xx_ACE_UAVBattery { - count = 6; - name = "ACE_UAVBattery"; - }; + // Misc box content + class Box_NATO_Support_F; + class ACE_Box_Misc: Box_NATO_Support_F { + class TransportItems { + class _xx_ACE_UAVBattery { + count = 6; + name = "ACE_UAVBattery"; + }; + }; }; - }; }; diff --git a/addons/logistics_uavbattery/CfgWeapons.hpp b/addons/logistics_uavbattery/CfgWeapons.hpp index e84e053347..1986b4f80f 100644 --- a/addons/logistics_uavbattery/CfgWeapons.hpp +++ b/addons/logistics_uavbattery/CfgWeapons.hpp @@ -1,15 +1,15 @@ class CfgWeapons { - class InventoryItem_Base_F; - class ACE_ItemCore; + class InventoryItem_Base_F; + class ACE_ItemCore; - class ACE_UAVBattery: ACE_ItemCore { - scope = 2; - displayName = "$STR_ACE_logistics_uavbattery_Battery_Name"; - descriptionShort = "$STR_ACE_logistics_uavbattery_Battery_Description"; - model = QUOTE(PATHTOF(models\ace_battery.p3d)); - picture = QUOTE(PATHTOF(ui\UAV_battery.paa)); - class ItemInfo: InventoryItem_Base_F { - mass = 20; + class ACE_UAVBattery: ACE_ItemCore { + scope = 2; + displayName = "$STR_ACE_logistics_uavbattery_Battery_Name"; + descriptionShort = "$STR_ACE_logistics_uavbattery_Battery_Description"; + model = QUOTE(PATHTOF(models\ace_battery.p3d)); + picture = QUOTE(PATHTOF(ui\UAV_battery_ca.paa)); + class ItemInfo: InventoryItem_Base_F { + mass = 20; + }; }; - }; }; diff --git a/addons/logistics_uavbattery/stringtable.xml b/addons/logistics_uavbattery/stringtable.xml index fbd9004290..feca4d07ec 100644 --- a/addons/logistics_uavbattery/stringtable.xml +++ b/addons/logistics_uavbattery/stringtable.xml @@ -1,78 +1,78 @@  - + - - - Drone is full - Drohne ist voll - El VANT está lleno - L'UAV est chargé - Dron jest naładowany - A drón fel van töltve - Dron je nabitý - O VANT está cheio - Il drone è pieno - БПЛА заполнен - - - You need a UAV Battery - Du brauchst eine UAV-Batterie - Necesitas una batería para VANT - Pas de batterie UAV - Potrzebujesz baterii UAV - Szükséged van egy UAV akkumulátorra - Potřebuješ UAV-Baterii - Você precisa de uma Bateria para VANT - Hai bisogno di una Batteria UAV - Требуется аккумулятор БПЛА - - - Recharge - Aufladen - Recargar - Recharger - Naładuj - Feltöltés - Dobít - Recarregar - Ricarica - Подзарядить - - - UAV Battery - UAV-Batterie - Batería para VANT - Batterie UAV - Bateria UAV - UAV akkumulátor - UAV-Baterie - Bateria para VANT - Batteria UAV - Аккумулятор БПЛА - - - Used to refuel Carried UAV's - Verwendet zum Aufladen von tragbaren UAV's - Usada para reabastecer el VANT - Utilisée pour recharger l'UAV - Używana do naładowania UAV - Hordozható UAV-ok működéséhez való akkumulátor - Používané k dobíjení UAV - Usada para reabastecer VANT - Usata per ricaricare la Batteria dell'UAV - Используется для подзарядки БПЛА - - - Recharging ... - Aufladen ... - Recargando ... - Rechargement ... - Ładowanie ... - Akku feltöltése ... - Dobíjení ... - Recarregando ... - In ricarica ... - Подзаряжаем ... - - + + + Drone is full + Drohne ist voll + El VANT está lleno + L'UAV est chargé + Dron jest naładowany + A drón fel van töltve + Dron je nabitý + O VANT está cheio + Il drone è pieno + БПЛА заполнен + + + You need a UAV Battery + Du brauchst eine UAV-Batterie + Necesitas una batería para VANT + Pas de batterie UAV + Potrzebujesz baterii UAV + Szükséged van egy UAV akkumulátorra + Potřebuješ UAV baterii + Você precisa de uma Bateria para VANT + Hai bisogno di una Batteria UAV + Требуется аккумулятор для БПЛА + + + Recharge + Aufladen + Recargar + Recharger + Naładuj + Feltöltés + Dobít + Recarregar + Ricarica + Зарядить + + + UAV Battery + UAV-Batterie + Batería para VANT + Batterie UAV + Bateria UAV + UAV akkumulátor + UAV baterie + Bateria para VANT + Batteria UAV + Аккумулятор БПЛА + + + Used to refuel Carried UAV's + Verwendet zum Aufladen von tragbaren UAV's + Usada para reabastecer el VANT + Utilisée pour recharger l'UAV + Używana do naładowania baterii przenośnego UAV + Hordozható UAV-ok működéséhez való akkumulátor + Používané k dobíjení UAV + Usada para reabastecer VANT + Usata per ricaricare la Batteria dell'UAV + Используется для зарядки БПЛА + + + Recharging ... + Aufladen ... + Recargando ... + Rechargement ... + Ładowanie ... + Akku feltöltése ... + Dobíjení ... + Recarregando ... + In ricarica ... + Заряжается ... + + \ No newline at end of file diff --git a/addons/logistics_uavbattery/ui/UAV_battery.paa b/addons/logistics_uavbattery/ui/UAV_battery.paa deleted file mode 100644 index 5e6c0e1bf7..0000000000 Binary files a/addons/logistics_uavbattery/ui/UAV_battery.paa and /dev/null differ diff --git a/addons/logistics_uavbattery/ui/UAV_battery_ca.paa b/addons/logistics_uavbattery/ui/UAV_battery_ca.paa new file mode 100644 index 0000000000..426578c3fc Binary files /dev/null and b/addons/logistics_uavbattery/ui/UAV_battery_ca.paa differ diff --git a/addons/logistics_wirecutter/stringtable.xml b/addons/logistics_wirecutter/stringtable.xml index f23af6b1e5..01bd6b99f3 100644 --- a/addons/logistics_wirecutter/stringtable.xml +++ b/addons/logistics_wirecutter/stringtable.xml @@ -1,51 +1,60 @@  - + - - - Wirecutter - Drahtschneider - Wirecutter - - - Wirecutter - Schneidet Draht. - - - Cut Fence - Zaun schneiden - Cortar alambrado - Przetnij płot - Přestřihnout plot - Cisailler Clôture - Cortar Cerca - Taglia - Drótkerítés átvágása - Вырезать забор - - - Cutting Fences / Wires ... - Zaun / Draht schneiden ... - Cortando alambrado / cables ... - Przecinanie płotu / drutów ... - Přestřihnout plot / dráty ... - Cisaille l'obstacle ... - Cortando Cerca / Arame ... - Sto tagliando ... - Drótok elvágása ... - Вырезаем забор / провода ... - - - Fence cut - Zaun geschnitten - Alambrado cortado - Płot przecięty - Plot přestřižen - Clôture cisaillée - Cerca cortada - Fatto! - Drótkerítés átvágva - Забор вырезан - - + + + Wirecutter + Coupe clôture + Drahtschneider + Cortador de cables + Клещи-кусачки + Štípací kleště + Nożyce do cięcia drutu + + + Wirecutter + Schneidet Draht. + Cortador de cables + Позволяют быстро перекусывать сеточные конструкции. + Štípačky + Służą do cięcia drutu i płotów + Coupe clôture + + + Cut Fence + Zaun schneiden + Cortar alambrado + Przetnij płot + Přestřihnout plot + Cisailler Clôture + Cortar Cerca + Taglia + Drótkerítés átvágása + Разрезать забор + + + Cutting Fences / Wires ... + Zaun / Draht schneiden ... + Cortando alambrado / cables ... + Przecinanie płotu / drutów ... + Přestřihnout plot / dráty ... + Cisaille l'obstacle ... + Cortando Cerca / Arame ... + Sto tagliando ... + Drótok elvágása ... + Разрезаем забор / провода ... + + + Fence cut + Zaun geschnitten + Alambrado cortado + Płot przecięty + Plot přestřižen + Clôture cisaillée + Cerca cortada + Fatto! + Drótkerítés átvágva + Забор разрезан + + \ No newline at end of file diff --git a/addons/magazinerepack/stringtable.xml b/addons/magazinerepack/stringtable.xml index d8fd5ca177..35531452d2 100644 --- a/addons/magazinerepack/stringtable.xml +++ b/addons/magazinerepack/stringtable.xml @@ -1,93 +1,105 @@  - + - - - Repack<br/>Magazines - Magazine<br/>umpacken - Reorganizar<br/>cargadores - Réorganiser<br/>chargeurs - Przepakuj<br/>magazynki - Přepáskovat<br/>Zásobníky - Ricarica<br/>Caricatori - Reorganizar<br/>Carregadores - Újratárazás<br/> - Перепаковать<br/>магазины - - - Select Magazine Menu - Magazinauswahlmenü - Menú de selección de cargador - Sélectionner menu des chargeurs - Menu wyboru magazynków - Zvolit Menu Zásobníků - Seleziona Menù di Ricarica - Menu de Seleção de Carregador - Fegyvertár menü kiválasztás - Меню выбора магазинов - - - Select Mag - Magazin auswählen - Seleccionar cargador - Sélectionner chargeur - Wybierz magazynek - Zvolit Zásobník - Seleziona Caricatore - Selecionar Carregador - Tár kiválasztása - Выбрать магазин - - - Repacking Magazines ... - Magazine umpacken ... - Reorganizando cargadores ... - Réorganisation des chargeurs ... - Przepakowywanie magazynków ... - Páskuji Zásobníky ... - Sto ricaricando le munizioni ... - Reorganizando Carregadores ... - Újratárazás ... - Перепаковка магазинов ... - - - Repacked Magazines - Magazine umgepackt - Cargadores reorganizados - Chargeurs réorganisés - Magazynki przepakowane - Přepáskované Zásobníky - Caricatore ricaricato - Carregadores Reorganizados - Újratárazott tárak - Магазины перепакованы - - - %1 full mag(s) and %2 extra round(s) - %1 volle(s) Magazin(e) und %2 übrig gebliebene Patrone(n) - %1 cargador(es) completo(s) y %2 bala(s) extra(s) - %1 chargeur(s) plein(s) et %2 cartouche(s) en rab - %1 pełnych magazynków i %2 dodatkowych naboi - %1 plný zásobník(y) a %2 munice navíc - %1 caricatore/i pieno e %2 munizioni extra - %1 carregador(es) cheio(s) e %2 disparo(s) a mais - %1 tejles tár és %2 extra lőszer. - %1 полных магазина(ов) и %2 патрона(ов) - - - Repacking Finished - Wiederverpacken Fertig - Reembalaje Finalizado - - - Repacking Interrupted - Umpacken Unterbrochen - Reempaque Interrupted - - - %1 Full and %2 Partial - %1 Vollständigen und %2 Teilweisen - %1 Total y %2 Parcial - - + + + Repack<br/>Magazines + Magazine<br/>umpacken + Reorganizar<br/>cargadores + Réorganiser<br/>chargeurs + Przepakuj<br/>magazynki + Přepáskovat<br/>Zásobníky + Ricarica<br/>Caricatori + Reorganizar<br/>Carregadores + Újratárazás<br/> + Перепаковать<br/>магазины + + + Select Magazine Menu + Magazinauswahlmenü + Menú de selección de cargador + Sélectionner menu des chargeurs + Menu wyboru magazynków + Zvolit Menu zásobníků + Seleziona Menù di Ricarica + Menu de Seleção de Carregador + Fegyvertár menü kiválasztás + Меню выбора магазинов + + + Select Mag + Magazin auswählen + Seleccionar cargador + Sélectionner chargeur + Wybierz magazynek + Zvolit zásobník + Seleziona Caricatore + Selecionar Carregador + Tár kiválasztása + Выбрать магазин + + + Repacking Magazines ... + Magazine umpacken ... + Reorganizando cargadores ... + Réorganisation des chargeurs ... + Przepakowywanie magazynków ... + Páskuji zásobníky ... + Sto ricaricando le munizioni ... + Reorganizando Carregadores ... + Újratárazás ... + Перепаковка магазинов ... + + + Repacked Magazines + Magazine umgepackt + Cargadores reorganizados + Chargeurs réorganisés + Magazynki przepakowane + Přepáskované zásobníky + Caricatore ricaricato + Carregadores Reorganizados + Újratárazott tárak + Магазины перепакованы + + + %1 full mag(s) and %2 extra round(s) + %1 volle(s) Magazin(e) und %2 übrig gebliebene Patrone(n) + %1 cargador(es) completo(s) y %2 bala(s) extra(s) + %1 chargeur(s) plein(s) et %2 cartouche(s) en rab + Pełnych magazynków: %1.<br /> Dodatkowych naboi: %2. + %1 plný zásobník(y) a %2 munice navíc + %1 caricatore/i pieno e %2 munizioni extra + %1 carregador(es) cheio(s) e %2 disparo(s) a mais + %1 tejles tár és %2 extra lőszer. + %1 полных магазина(ов) и %2 патрона(ов) + + + Repacking Finished + Réorganisation terminé + Wiederverpacken Fertig + Reembalaje finalizado + Перепаковка завершена + Páskování dokončeno + Przepakowywanie zakończone + + + Repacking Interrupted + Réorganisation Interrompue + Umpacken Unterbrochen + Reembalaje interrumpido + Перепаковка прервана + Páskování přerušeno + Przepakowywanie przerwane + + + %1 Full and %2 Partial + %1 Complet et %2 Partiellement + %1 Vollständigen und %2 Teilweisen + %1 Total y %2 Parcial + %1 полных и %2 неполных + %1 plný a %2 částečně + Pełnych: %1.<br />Częściowo pełnych: %2. + + \ No newline at end of file diff --git a/addons/magazines/CfgAmmo.hpp b/addons/magazines/CfgAmmo.hpp index 2e1e9fceea..8a9a3ec209 100644 --- a/addons/magazines/CfgAmmo.hpp +++ b/addons/magazines/CfgAmmo.hpp @@ -107,4 +107,71 @@ class CfgAmmo { //typicalspeed = 792; //airfriction = -0.0008577; }; + + + /* .338 Lapua Magnum */ + + // IR Dim + class B_338_Ball; + class ACE_B_338_Ball_Tracer_Dim: B_338_Ball { + nvgOnly = 1; + }; + + //AP + class ACE_B_338_Ball_AP: B_338_Ball { + caliber = 3.6; + hit = 18.9; + }; + + //SD + class ACE_B_338_Ball_SD: B_338_Ball { + airFriction = -0.00036; + hit = 15.75; + supersonicCrackFar[] = {}; + supersonicCrackNear[] = {}; + typicalSpeed = 320; + audibleFire = 1.2; + visibleFire = 4.0; + }; + + + /* .338 Norma Magnum */ + + //IR Dim + class B_338_NM_Ball; + class ACE_B_338_NM_Ball_Tracer_Dim: B_338_NM_Ball { + nvgOnly = 1; + }; + + //AP + class ACE_B_338_NM_Ball_AP: B_338_NM_Ball { + caliber = 3.2; + hit = 16.8; + }; + + + /* 9.3x64mm */ + + //IR Dim + class B_93x64_Ball; + class ACE_B_93x64_Ball_Tracer_Dim: B_93x64_Ball { + nvgOnly = 1; + }; + + //AP + class ACE_B_93x64_Ball_AP: B_93x64_Ball { + caliber = 4.0; + hit = 21; + }; + + //SD + class ACE_B_93x64_Ball_SD: B_93x64_Ball { + airFriction = -0.00042; + hit = 17.5; + supersonicCrackFar[] = {}; + supersonicCrackNear[] = {}; + typicalSpeed = 320; + audibleFire = 1.2; + visibleFire = 4.0; + }; }; diff --git a/addons/magazines/CfgMagazines.hpp b/addons/magazines/CfgMagazines.hpp index 86cb6d9e1b..cea8c31004 100644 --- a/addons/magazines/CfgMagazines.hpp +++ b/addons/magazines/CfgMagazines.hpp @@ -136,4 +136,131 @@ class CfgMagazines { displayNameShort = "$STR_ACE_20Rnd_762x51_mag_APNameShort"; descriptionShort = "$STR_ACE_20Rnd_762x51_mag_APDescription"; }; + + + /* 338 Lapua Magnum */ + class 10Rnd_338_Mag; + class ACE_10Rnd_338_Mag_Tracer: 10Rnd_338_Mag { + author = "$STR_ACE_Common_ACETeam"; + displayName = "$STR_ACE_10Rnd_338_Mag_TracerName"; + displayNameShort = "$STR_ACE_10Rnd_338_Mag_TracerNameShort"; + descriptionShort = "$STR_ACE_10Rnd_338_Mag_TracerDescription"; + tracersEvery = 1; + }; + + class ACE_10Rnd_338_Mag_Tracer_Dim: ACE_10Rnd_338_Mag_Tracer { + author = "$STR_ACE_Common_ACETeam"; + ammo = "ACE_B_338_Ball_Tracer_Dim"; + displayName = "$STR_ACE_10Rnd_388_Mag_Tracer_DimName"; + displayNameShort = "$STR_ACE_10Rnd_338_Mag_Tracer_DimNameShort"; + descriptionShort = "$STR_ACE_10Rnd_338_Mag_Tracer_DimDescription"; + }; + + class ACE_10Rnd_338_Mag_AP: 10Rnd_338_Mag { + author = "$STR_ACE_Common_ACETeam"; + ammo ="ACE_B_338_Ball_AP"; + displayName = "$STR_ACE_10Rnd_338_Mag_APName"; + displayNameShort = "$STR_ACE_10Rnd_338_Mag_APNameShort"; + descriptionShort = "$STR_ACE_10Rnd_338_Mag_APDescription"; + }; + + class ACE_10Rnd_338_Mag_SD: 10Rnd_338_Mag { + author = "$STR_ACE_Common_ACETeam"; + ammo = "ACE_B_338_Ball_SD"; + displayName = "$STR_ACE_10Rnd_338_Mag_SDName"; + displayNameShort = "$STR_ACE_10Rnd_338_Mag_SDNameShort"; + descriptionShort = "$STR_ACE_10Rnd_338_Mag_SDDescription"; + initSpeed = 320; + }; + + + /* .333 Norma Magnum */ + + class 130Rnd_338_Mag; + class ACE_130Rnd_338_Mag_Tracer: 130Rnd_338_Mag { + author = "$STR_ACE_Common_ACETeam"; + displayName = "$STR_ACE_130Rnd_338_Mag_TracerName"; + displayNameShort = "$STR_ACE_130Rnd_338_Mag_TracerNameShort"; + descriptionShort = "$STR_ACE_130Rnd_338_Mag_TracerDescription"; + tracersEvery = 1; + }; + + class ACE_130Rnd_338_Mag_Tracer_Dim: ACE_130Rnd_338_Mag_Tracer { + author = "$STR_ACE_Common_ACETeam"; + ammo = "ACE_B_338_NM_Ball_Tracer_Dim"; + displayName = "$STR_ACE_130Rnd_338_Mag_Tracer_DimName"; + displayNameShort = "$STR_ACE_130Rnd_338_Mag_Tracer_DimNameShort"; + descriptionShort = "$STR_ACE_130Rnd_338_Mag_Tracer_DimDescription"; + }; + + class ACE_130Rnd_338_Mag_AP: 130Rnd_338_Mag { + author = "$STR_ACE_Common_ACETeam"; + ammo = "ACE_B_338_NM_Ball_AP"; + displayName = "$STR_ACE_130Rnd_338_Mag_APName"; + displayNameShort = "$STR_ACE_130Rnd_338_Mag_APNameShort"; + descriptionShort = "$STR_ACE_130Rnd_338_Mag_APDescription"; + }; + + + /* 9.3x64mm */ + //10Rnd Mags + + class 10Rnd_93x64_DMR_05_Mag; + class ACE_10Rnd_93x64_DMR_05_Mag_Tracer: 10Rnd_93x64_DMR_05_Mag { + author = "$STR_ACE_Common_ACEETeam"; + displayName = "$STR_ACE_10Rnd_93x64_DMR_05_Mag_TracerName"; + displayNameShort = "$STR_ACE_10Rnd_93x64_DMR_05_Mag_TracerNameShort"; + descriptionShort = "$STR_ACE_10Rnd_93x64_DMR_05_Mag_TracerDescription"; + tracersEvery = 1; + }; + + class ACE_10Rnd_93x64_DMR_05_Mag_Tracer_Dim: ACE_10Rnd_93x64_DMR_05_Mag_Tracer { + author = "$STR_ACE_Common_ACEETeam"; + ammo ="ACE_B_93x64_Ball_Tracer_Dim"; + displayName = "$STR_ACE_10Rnd_93x64_DMR_05_Mag_Tracer_DimName"; + displayNameShort = "$STR_ACE_10Rnd_93x64_DMR_05_Mag_Tracer_DimNameShort"; + descriptionShort = "$STR_ACE_10Rnd_93x64_DMR_05_Mag_Tracer_DimDescription"; + }; + + class ACE_10Rnd_93x64_DMR_05_Mag_AP: 10Rnd_93x64_DMR_05_Mag { + author = "$STR_ACE_Common_ACEETeam"; + ammo = "ACE_B_93x64_Ball_AP"; + displayName = "$STR_ACE_10Rnd_93x64_DMR_05_Mag_APName"; + displayNameShort = "$STR_ACE_10Rnd_93x64_DMR_05_Mag_APNameShort"; + descriptionShort = "$STR_ACE_10Rnd_93x64_DMR_05_Mag_APDescription"; + }; + + class ACE_10Rnd_93x64_DMR_05_Mag_SD: 10Rnd_93x64_DMR_05_Mag { + author = "$STR_ACE_Common_ACEETeam"; + ammo = "ACE_B_93x64_Ball_SD"; + displayName = "$STR_ACE_10Rnd_93x64_DMR_05_Mag_SDName"; + displayNameShort = "$STR_ACE_10Rnd_93x64_DMR_05_Mag_SDNameShort"; + descriptionShort = "$STR_ACE_10Rnd_93x64_DMR_05_Mag_SDDescription"; + initSpeed = 320; + }; + //150Rnd Belt + class 150Rnd_93x64_Mag; + class ACE_150Rnd_93x64_Mag_Tracer: 150Rnd_93x64_Mag { + author = "$STR_ACE_Common_ACEETeam"; + displayName = "$STR_ACE_150Rnd_93x64_Mag_TracerName"; + displayNameShort = "$STR_ACE_150Rnd_93x64_Mag_TracerNameShort"; + descriptionShort = "$STR_ACE_150Rnd_93x64_Mag_TracerDescription"; + tracersEvery = 1; + }; + + class ACE_150Rnd_93x64_Mag_Tracer_Dim: ACE_150Rnd_93x64_Mag_Tracer { + author = "$STR_ACE_Common_ACEETeam"; + ammo ="ACE_B_93x64_Ball_Tracer_Dim"; + displayName = "$STR_ACE_150Rnd_93x64_Mag_Tracer_DimName"; + displayNameShort = "$STR_ACE_150Rnd_93x64_Mag_Tracer_DimNameShort"; + descriptionShort = "$STR_ACE_150Rnd_93x64_Mag_Tracer_DimDescription"; + }; + + class ACE_150Rnd_93x64_Mag_AP: 150Rnd_93x64_Mag { + author = "$STR_ACE_Common_ACEETeam"; + ammo = "ACE_B_93x64_Ball_AP"; + displayName = "$STR_ACE_150Rnd_93x64_Mag_APName"; + displayNameShort = "$STR_ACE_150Rnd_93x64_Mag_APNameShort"; + descriptionShort = "$STR_ACE_150Rnd_93x64_Mag_APDescription"; + }; }; diff --git a/addons/magazines/CfgVehicles.hpp b/addons/magazines/CfgVehicles.hpp index a7c2654d71..66e63cfa09 100644 --- a/addons/magazines/CfgVehicles.hpp +++ b/addons/magazines/CfgVehicles.hpp @@ -153,6 +153,20 @@ class CfgVehicles { MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_Tracer_Dim,2); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_SD,2); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_AP,2);*/ + MACRO_ADDMAGAZINE(ACE_10Rnd_338_Mag_Tracer,2); + MACRO_ADDMAGAZINE(ACE_10Rnd_338_Mag_Tracer_Dim,2); + MACRO_ADDMAGAZINE(ACE_10Rnd_338_Mag_AP,2); + MACRO_ADDMAGAZINE(ACE_10Rnd_338_Mag_SD,2); + MACRO_ADDMAGAZINE(ACE_130Rnd_338_Mag_Tracer,2); + MACRO_ADDMAGAZINE(ACE_130Rnd_338_Mag_Tracer_Dim,2); + MACRO_ADDMAGAZINE(ACE_130Rnd_338_Mag_AP,2); + MACRO_ADDMAGAZINE(ACE_10Rnd_93x64_DMR_05_Mag_Tracer,2); + MACRO_ADDMAGAZINE(ACE_10Rnd_93x64_DMR_05_Mag_Tracer_Dim,2); + MACRO_ADDMAGAZINE(ACE_10Rnd_93x64_DMR_05_Mag_AP,2); + MACRO_ADDMAGAZINE(ACE_10Rnd_93x64_DMR_05_Mag_SD,2); + MACRO_ADDMAGAZINE(ACE_150Rnd_93x64_Mag_Tracer,2); + MACRO_ADDMAGAZINE(ACE_150Rnd_93x64_Mag_Tracer_Dim,2); + MACRO_ADDMAGAZINE(ACE_150Rnd_93x64_Mag_AP,2); }; }; }; diff --git a/addons/magazines/CfgWeapons.hpp b/addons/magazines/CfgWeapons.hpp index 46344d5f06..787867070e 100644 --- a/addons/magazines/CfgWeapons.hpp +++ b/addons/magazines/CfgWeapons.hpp @@ -1,15 +1,9 @@ -class SlotInfo; -class MuzzleSlot; class CfgWeapons { /* MX */ - class Rifle; - class Rifle_Base_F: Rifle { - class WeaponSlotsInfo; - }; - + class Rifle_Base_F; class arifle_MX_Base_F: Rifle_Base_F { magazines[] += { "ACE_30Rnd_65x39_caseless_mag_Tracer_Dim", @@ -18,12 +12,6 @@ class CfgWeapons { "100Rnd_65x39_caseless_mag", "100Rnd_65x39_caseless_mag_Tracer" }; - - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot: MuzzleSlot { - compatibleItems[] += {"ACE_muzzle_mzls_H"}; - }; - }; }; class arifle_MX_SW_F: arifle_MX_Base_F { @@ -31,14 +19,6 @@ class CfgWeapons { "30Rnd_65x39_caseless_mag", "30Rnd_65x39_caseless_mag_Tracer" }; - - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot: MuzzleSlot { - // Shit is broken again - //compatibleItems[] += {"ACE_muzzle_mzls_H"}; - compatibleItems[] = {"muzzle_snds_H","muzzle_snds_H_SW","ACE_muzzle_mzls_H"}; - }; - }; }; class arifle_MXM_F: arifle_MX_Base_F { @@ -50,57 +30,46 @@ class CfgWeapons { /* Katiba */ - + class Rifle_Long_Base_F; class arifle_katiba_Base_F: Rifle_Base_F { magazines[] += { "ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim", "ACE_30Rnd_65x39_caseless_green_mag_SD", "ACE_30Rnd_65x39_caseless_green_mag_AP" }; + }; - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot: MuzzleSlot { - compatibleItems[] += {"ACE_muzzle_mzls_H"}; - }; + class DMR_02_base_F: Rifle_Long_Base_F { + magazines[] += { + "ACE_10Rnd_338_Mag_Tracer", + "ACE_10Rnd_338_Mag_Tracer_Dim", + "ACE_10Rnd_338_Mag_AP", + "ACE_10Rnd_338_Mag_SD" }; }; - - /* Other */ - - class Rifle_Long_Base_F: Rifle_Base_F { - class WeaponSlotsInfo; - }; - - class EBR_base_F: Rifle_Long_Base_F { - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot: MuzzleSlot { - compatibleItems[] += {"ACE_muzzle_mzls_B"}; - }; + class MMG_02_base_F: Rifle_Long_Base_F { + magazines[] += { + "ACE_130Rnd_338_Mag_Tracer", + "ACE_130Rnd_338_Mag_Tracer_Dim", + "ACE_130Rnd_338_Mag_AP" }; }; - class DMR_01_base_F: Rifle_Long_Base_F { - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot: MuzzleSlot { - compatibleItems[] += {"ACE_muzzle_mzls_B"}; - }; + class DMR_05_base_F: Rifle_Long_Base_F { + magazines[] += { + "ACE_10Rnd_93x64_DMR_05_Mag_Tracer", + "ACE_10Rnd_93x64_DMR_05_Mag_Tracer_Dim", + "ACE_10Rnd_93x64_DMR_05_Mag_AP", + "ACE_10Rnd_93x64_DMR_05_Mag_SD" }; }; - - class LMG_Mk200_F: Rifle_Long_Base_F { - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot: MuzzleSlot { - compatibleItems[] += {"ACE_muzzle_mzls_H"}; - }; - }; - }; - - class LMG_Zafir_F: Rifle_Long_Base_F { - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot: MuzzleSlot { - compatibleItems[] += {"ACE_muzzle_mzls_B"}; - }; + + class MMG_01_base_F: Rifle_Long_Base_F { + magazines[] += { + "ACE_150Rnd_93x64_Mag_Tracer", + "ACE_150Rnd_93x64_Mag_Tracer_Dim", + "ACE_150Rnd_93x64_Mag_AP" }; }; @@ -113,12 +82,6 @@ class CfgWeapons { "ACE_30Rnd_556x45_Stanag_SD", "ACE_30Rnd_556x45_Stanag_AP" }; - - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot: MuzzleSlot { - compatibleItems[] += {"ACE_muzzle_mzls_L"}; - }; - }; }; class mk20_base_F: Rifle_Base_F { @@ -127,12 +90,6 @@ class CfgWeapons { "ACE_30Rnd_556x45_Stanag_SD", "ACE_30Rnd_556x45_Stanag_AP" }; - - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot: MuzzleSlot { - compatibleItems[] += {"ACE_muzzle_mzls_L"}; - }; - }; }; @@ -146,81 +103,6 @@ class CfgWeapons { }; }; - class pdw2000_base_F: Rifle_Base_F { - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot: MuzzleSlot { - compatibleItems[] += {"ACE_muzzle_mzls_smg_02"}; - }; - }; - }; - - class SMG_01_Base: Rifle_Base_F { - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot: MuzzleSlot { - compatibleItems[] += {"ACE_muzzle_mzls_smg_01"}; - }; - }; - }; - - class SMG_02_base_F: Rifle_Base_F { - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot: MuzzleSlot { - compatibleItems[] += {"ACE_muzzle_mzls_smg_02"}; - }; - }; - }; - - - /* Pistols */ - - class Pistol; - class Pistol_Base_F: Pistol { - class WeaponSlotsInfo; - }; - - class hgun_P07_F: Pistol_Base_F { - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot: MuzzleSlot { - linkProxy = "\A3\data_f\proxies\weapon_slots\MUZZLE"; - compatibleItems[] += {"ACE_muzzle_mzls_smg_02"}; - }; - }; - }; - - class hgun_Rook40_F: Pistol_Base_F { - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot: MuzzleSlot { - linkProxy = "\A3\data_f\proxies\weapon_slots\MUZZLE"; - compatibleItems[] += {"ACE_muzzle_mzls_smg_02"}; - }; - }; - }; - - class hgun_ACPC2_F: Pistol_Base_F { - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot: MuzzleSlot { - compatibleItems[] += {"ACE_muzzle_mzls_smg_01"}; - }; - }; - }; - - class hgun_Pistol_heavy_01_F: Pistol_Base_F { - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot: MuzzleSlot { - compatibleItems[] += {"ACE_muzzle_mzls_smg_01"}; - }; - }; - }; - - /*class hgun_Pistol_heavy_02_F: Pistol_Base_F { - class WeaponSlotsInfo: WeaponSlotsInfo { - class MuzzleSlot { - linkProxy = "\A3\data_f\proxies\weapon_slots\MUZZLE"; - compatibleItems[] += {"ACE_muzzle_mzls_smg_01"}; - }; - }; - };*/ - /* Silencers */ diff --git a/addons/magazines/newclasses.txt b/addons/magazines/newclasses.txt index 1a711e8c37..0c40a1b904 100644 --- a/addons/magazines/newclasses.txt +++ b/addons/magazines/newclasses.txt @@ -18,6 +18,16 @@ ACE_B_762x51_Ball_SD ACE_B_762x51_Ball_AP ACE_B_762x51_M118LR +ACE_B_338_Ball_Tracer_Dim +ACE_B_338_Ball_AP +ACE_B_338_Ball_SD + +ACE_B_338_NM_Ball_Tracer_Dim +ACE_B_338_NM_Ball_AP + +ACE_B_93x64_Ball_Tracer_Dim +ACE_B_93x64_Ball_AP +ACE_B_93x64_Ball_SD // CFGMagazines @@ -37,3 +47,21 @@ ACE_20Rnd_762x51_Mag_Tracer ACE_20Rnd_762x51_Mag_Tracer_Dim ACE_20Rnd_762x51_Mag_SD ACE_20Rnd_762x51_Mag_AP + +ACE_10Rnd_338_Mag_Tracer +ACE_10Rnd_338_Mag_Tracer_Dim +ACE_10Rnd_338_Mag_AP +ACE_10Rnd_338_Mag_SD + +ACE_130Rnd_338_Mag_Tracer +ACE_130Rnd_338_Mag_Tracer_Dim +ACE_130Rnd_338_Mag_AP + +ACE_10Rnd_93x64_DMR_05_Mag_Tracer +ACE_10Rnd_93x64_DMR_05_Mag_Tracer_Dim +ACE_10Rnd_93x64_DMR_05_Mag_AP +ACE_10Rnd_93x64_DMR_05_Mag_SD + +ACE_150Rnd_93x64_Mag_Tracer +ACE_150Rnd_93x64_Mag_Tracer_Dim +ACE_150Rnd_93x64_Mag_AP \ No newline at end of file diff --git a/addons/magazines/stringtable.xml b/addons/magazines/stringtable.xml index c8f652fa39..8257e48936 100644 --- a/addons/magazines/stringtable.xml +++ b/addons/magazines/stringtable.xml @@ -1,490 +1,719 @@  - + - - - - 6.5mm 30Rnd Tracer IR-DIM Mag - 6,5 mm Nyomjelző IR-DIM 30-as Tár - 6,5 mm 30-Schuss-Magazin Leuchtspur IR-DIM - Cargador de 30 balas trazadoras IR-DIM de 6,5mm - Ch. 6,5mm 30Cps Traçantes IR-DIM - Magazynek 6,5mm 30rd Smugacz IR-DIM - 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 мм трассирующих под ПНВ - - - 6.5mm IR-DIM - 6,5 mm IR-DIM - 6,5mm IR-DIM - 6,5mm IR-DIM - 6,5mm IR-DIM - 6,5mm IR-DIM - 6.5mm IR-DIM - 6,5mm IR-DIM - 6.5 IR-DIM - 6.5 мм трассирущие под ПНВ - - - Caliber: 6.5x39 mm Tracer IR-DIM<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL - Kaliber: 6,5x39 mm Nyomjelző IR-DIM<br />Lőszerek: 30<br />Használható: MX/C/M/SW/3GL - Kaliber: 6,5x39 mm Leuchtspur IR-DIM<br />Patronen: 30<br />Eingesetzt von: MX/C/M/SW/3GL - Calibre: 6,5x39 mm Trazadoras IR-DIM<br />Balas: 30<br />Se usa en: MX/C/M/SW/3GL - Calibre: 6,5x39 mm Traçantes IR-DIM<br />Cartouches: 30<br />Utilisé dans: MX/C/M/SW/3GL - Kaliber: 6,5 x 39 mm Smugowy IR-DIM<br />Pociski: 30<br />Używane w: MX/C/M/SW/3GL - 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.5mm 30Rnd SD Mag - 6,5 mm Hangtompítós 30-as Tár - 6,5 mm 30-Schuss-Magazin SD - Cargador de 30 balas SD de 6,5mm - Ch. 6,5mm 30Cps SD - Magazynek 6,5mm 30rd SD - 6.5mm 30ks SD Zásobník - Carregador de 30 projéteis SD de 6,5mm - Caricatore 6.5mm 30Rnd Sil. - Магазин из 30-и 6.5 мм дозвуковых - - - 6.5mm SD - 6,5 mm Hangtompítós - 6,5mm SD - 6,5mm SD - 6,5mm SD - 6,5mm SD - 6.5mm SD - 6,5mm SD - 6.5mm Sil. - 6.5 мм дозвуковые - - - Caliber: 6.5x39 mm SD<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL - Kaliber: 6,5x39 mm Hangtompítós<br />Lőszerek: 30<br />Használható: MX/C/M/SW/3GL - Kaliber: 6,5x39 mm SD<br />Patronen: 30<br />Eingesetzt von: MX/C/M/SW/3GL - Calibre: 6,5x39 mm SD<br />Balas: 30<br />Se usa en: MX/C/M/SW/3GL - Calibre: 6,5x39 mm SD<br />Cartouches: 30<br />Utilisé dans: MX/C/M/SW/3GL - Kaliber: 6,5 x 39 mm SD<br />Pociski: 30<br />Używane w: MX/C/M/SW/3GL - 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.5mm 30Rnd AP Mag - 6,5 mm Páncéltörő 30-as Tár - 6,5 mm 30-Schuss-Magazin AP - Cargador de 30 balas AP de 6,5mm - Ch. 6,5mm 30Cps AP - Magazynek 6,5mm 30rd AP - 6.5mm 30ks AP Zásobník - Carregador de 30 projéteis AP de 6,5mm - Caricatore 6.5mm 30Rnd AP - Магазин из 30-и 6.5 мм бронебойных - - - 6.5mm AP - 6,5 mm Páncéltörő - 6,5mm AP - 6,5mm AP - 6,5mm AP - 6,5mm AP - 6.5mm AP - 6,5mm AP - 6.5mm AP - 6.5 мм бронебойные - - - Caliber: 6.5x39 mm AP<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL - Kaliber: 6,5x39 mm Páncéltörő<br />Lőszerek: 30<br />Használható: MX/C/M/SW/3GL - Kaliber: 6,5x39 mm AP<br />Patronen: 30<br />Eingesetzt von: MX/C/M/SW/3GL - Calibre: 6,5x39 mm AP<br />Balas: 30<br />Se usa en: MX/C/M/SW/3GL - Calibre: 6,5x39 mm AP<br />Cartouches: 30<br />Utilisé dans: MX/C/M/SW/3GL - Kaliber: 6,5 x 39 mm AP<br />Pociski: 30<br />Używane w: MX/C/M/SW/3GL - 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.5mm 30Rnd Tracer IR-DIM Mag - 6,5mm IR-DIM Nyomjelző 30-as Tár - 6,5 mm 30-Schuss-Magazin Leuchtspur IR-DIM - Cargador de 30 balas trazadoras IR-DIM de 6,5mm - Ch. 6,5mm 30Cps Traçantes IR-DIM - Magazynek 6,5mm 30rd Smugacz IR-DIM - 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 мм трассирующих под ПНВ - - - 6.5mm IR-DIM - 6,5mm IR-DIM - 6,5mm IR-DIM - 6,5mm IR-DIM - 6,5mm IR-DIM - 6,5mm IR-DIM - 6.5mm IR-DIM - 6,5mm IR-DIM - 6.5mm IR-DIM - 6.5 мм трассирущие под ПНВ - - - Caliber: 6.5x39 mm Tracer IR-DIM<br />Rounds: 30<br />Used in: Katiba - Kaliber: 6,5x39 mm Nyomjelző IR-DIM<br />Lőszerek: 30<br />Használható: Katiba - Kaliber: 6,5x39 mm Leuchtspur IR-DIM<br />Patronen: 30<br />Eingesetzt von: Katiba - Calibre: 6,5x39 mm Trazadoras IR-DIM<br />Balas: 30<br />Se usa en: Katiba - Calibre: 6,5x39 mm Traçantes IR-DIM<br />Cartouches: 30<br />Utilisé dans: Katiba - Kaliber: 6,5x39 mm Smugowy IR-DIM<br />Pociski: 30<br />Używane w: Katiba - 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.5mm 30Rnd SD Mag - 6,5 mm Hangtompítós 30-as Tár - 6,5 mm 30-Schuss-Magazin SD - Cargador de 30 balas SD de 6,5mm - Ch. 6,5mm 30Cps SD - Magazynek 6,5mm 30rd SD - 6.5mm 30ks SD Zásobník - Carregador de 30 projéteis SD de 6,5mm - Caricatore 6.5mm 30Rnd Sil. - Магазин из 30-и 6.5 мм дозвуковых - - - 6.5mm SD - 6,5 mm Hangtompítós - 6,5mm SD - 6,5mm SD - 6,5mm SD - 6,5mm SD - 6.5mm SD - 6,5mm SD - 6.5mm Sil. - 6.5 мм дозвуковые - - - Caliber: 6.5x39 mm SD<br />Rounds: 30<br />Used in: Katiba - Kaliber: 6,5x39 mm Hangtompítós<br />Lőszerek: 30<br />Használható: Katiba - Kaliber: 6,5x39 mm SD<br />Patronen: 30<br />Eingesetzt von: Katiba - Calibre: 6,5x39 mm SD<br />Balas: 30<br />Se usa en: Katiba - Calibre: 6,5x39 mm SD<br />Cartouches: 30<br />Utilisé dans: Katiba - Kaliber: 6,5 x 39 mm SD<br />Naboje: 30<br />Używane w: Katiba - 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.5mm 30Rnd AP Mag - 6,5 mm Páncéltörő 30-as Tár - 6,5 mm 30-Schuss-Magazin AP - Cargador de 30 balas AP de 6,5mm - Ch. 6,5mm 30Cps AP - Magazynek 6,5mm 30rd AP - 6.5mm 30ks AP Zásobník - Carregador de 30 projéteis AP de 6,5mm - Caricatore 6.5mm 30Rnd AP - Магазин из 30-и 6.5 мм бронебойных - - - 6.5mm AP - 6,5 mm Páncéltörő - 6,5mm AP - 6,5mm AP - 6,5mm AP - 6,5mm AP - 6.5mm AP - 6,5mm AP - 6.5mm AP - 6.5 мм бронебойные - - - Caliber: 6.5x39 mm AP<br />Rounds: 30<br />Used in: Katiba - Kaliber: 6,5x39 mm Páncéltörő<br />Lőszerek: 30<br />Használható: Katiba - Kaliber: 6,5x39 mm AP<br />Patronen: 30<br />Eingesetzt von: Katiba - Calibre: 6,5x39 mm AP<br />Balas: 30<br />Se usa en: Katiba - Calibre: 6,5x39 mm AP<br />Cartouches: 30<br />Utilisé dans: Katiba - Kaliber: 6,5 x 39 mm AP<br />Pociski: 30<br />Używane w: Katiba - 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 - - - - 5.56mm 30rnd Tracer IR-DIM Mag - 5,56 mm Nyomjelző IR-DIM 30-as Tár - 5,56 mm 30-Schuss-Magazin Leuchtspur IR-DIM - Cargador de 30 balas trazadoras IR-DIM de 5,56mm - Ch. 5,56mm 30Cps Traçantes IR-DIM - Magazynek 5,56mm 30rd Smugacz IR-DIM - 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 мм трассирующих под ПНВ - - - 5.56mm IR-DIM - 5,56 mm IR-DIM - 5,56mm IR-DIM - 5,56mm IR-DIM - 5,56mm IR-DIM - 5,56mm IR-DIM - 5.56mm IR-DIM - 5,56mm IR-DIM - 5.56mm IR-DIM - 5.56 мм трассирущие под ПНВ - - - Caliber: 5.56x45 mm Tracer IR-DIM<br />Rounds: 30<br />Used in: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Kaliber: 5,56x45 mm Nyomjelző IR-DIM<br />Lőszerek: 30<br />Használható: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Kaliber: 5,56x45 mm Leuchtspur IR-DIM<br />Patronen: 30<br />Eingesetzt von: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Calibre: 5,56x45 mm Trazadoras IR-DIM<br />Balas: 30<br />Se usa en: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Calibre: 5,56x45 mm Traçantes IR-DIM<br />Cartouches: 30<br />Utilisé dans: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Kaliber: 5,56 x 45 mm Smugowy IR-DIM<br />Pociski: 30<br />Używane w: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - 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.56mm 30Rnd SD Mag - 5,56 mm Hangtompítós 30-as Tár - 5,56 mm 30-Schuss-Magazin SD - Cargador de 30 balas SD de 5,56 mm - Ch. 5,56mm 30Cps SD - Magazynek 5,56mm 30rd SD - 5.56mm 30ks SD Zásobník - Carregador de 30 projéteis SD de 5,56mm - Caricatore 5.56mm 30Rnd Sil. - Магазин из 30-и 5.56 мм дозвуковых - - - 5.56mm SD - 5,56 mm Hangtompítós - 5,56mm SD - 5,56 mm SD - 5,56mm SD - 5,56mm SD - 5.56mm SD - 5,56mm SD - 5.56 Sil. - 5.56 мм дозвуковые - - - Caliber: 5.56x45 mm SD<br />Rounds: 30<br />Used in: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Kaliber: 5,56x45 mm Hangtompítós<br />Lőszerek: 30<br />Használható: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Kaliber: 5,56x45 mm SD<br />Patronen: 30<br />Eingesetzt von: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Calibre: 5,56x45 mm SD<br />Balas: 30<br />Se usa en: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Calibre: 5.56x45 mm SD<br />Cartouches: 30<br />Utilisé dans: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Kaliber: 5,56 x 45 mm SD<br />Pociski: 30<br />Używane w: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Ráže: 5.56x45 mm SD<br />Munice: 30<br />Použití: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Calibre: 5,56x45 mm SD<br />Projéteis: 30<br />Usado em: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Calibro: 5.56x45 mm Sil.<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.56mm 30Rnd AP Mag - 5,56 mm Páncéltörő 30-as Tár - 5,56 mm 30-Schuss-Magazin AP - Cargador de 30 balas AP de 5,56mm - Ch. 5,56mm 30Cps AP - Magazynek 5,56mm 30rd AP - 5.56mm 30ks AP Zásobník - Carregador de 30 projéteis AP de 5,56mm - Caricatore 5.56mm 30Rnd AP - Магазин из 30-и 5.56 мм бронебойных - - - 5.56mm AP - 5,56 mm Páncéltörő - 5,56mm AP - 5,56mm AP - 5,56mm AP - 5,56mm AP - 5.56mm AP - 5,56mm AP - 5.56mm AP - 5.56 мм бронебойные - - - Caliber: 5.56x45 mm AP<br />Rounds: 30<br />Used in: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Kaliber: 5,56x45 mm Páncéltörő<br />Lőszerek: 30<br />Használható: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Kaliber: 5,56x45 mm AP<br />Patronen: 30<br />Eingesetzt von: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Calibre: 5,56x45 mm AP<br />Balas: 30<br />Se usa en: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Calibre: 5,56x45 mm AP<br />Cartouches: 30<br />Utilisé dans: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Kaliber: 5,56 x 45 mm AP<br />Pociski: 30<br />Używane w: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - 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 - - - - 7.62mm 20rnd Tracer Mag - 7,62 mm Nyomjelző IR-DIM 20-as Tár - 7,62 mm 20-Schuss-Magazin Leuchtspur - Cargador de 20 balas trazadores de 7,62mm - Ch. 7,62mm 20Cps Traçantes - Magazynek 7,62mm 20rd Smugacz - 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 мм трассирующих - - - 7.62mm Tracer - 7,62 mm Nyomjelző - 7,62mm Leuchtspur - 7,62mm Trazadora - 7,62mm Traçantes - 7,62mm Smugacz - 7.62mm Svítící - 7,62mm Traçante - 7.62mm Traccianti - 7.62 мм трассирущие - - - Caliber: 7.62x51 mm Tracer<br />Rounds: 20<br />Used in: Mk18 ABR - Kaliber: 7,62x51 mm Nyomjelző<br />Lőszerek: 20<br />Használható: Mk18 ABR - Kaliber: 7,62x51 mm Leuchtspur<br />Patronen: 20<br />Eingesetzt von: EBR - Calibre: 7,62x51 mm Trazadora<br />Balas: 20<br />Se usa en: Mk18 ABR - Calibre: 7,62x51 mm Traçantes<br />Cartouches: 20<br />Utilisé dans: EBR - Kaliber: 7,62 x 51 mm Smugacz<br />Pociski: 20<br />Używane w: Mk18 ABR - 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.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 - 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 - Carregador de 20 projéteis IR-DIM de 7,62mm - Caricatore 7.62mm 20rnd Traccianti IR-DIM - Магазин из 20-и 7.62 мм трассирующих под ПНВ - - - 7.62mm IR-DIM - 7,62 mm IR-DIM - 7,62mm IR-DIM - 7,62mm IR-DIM - 7,62mm IR-DIM - 7,62mm IR-DIM - 7.62mm IR-DIM - 7,62mm IR-DIM - 7.62mm IR-DIM - 7.62 мм трассирущие под ПНВ - - - Caliber: 7.62x51 mm Tracer IR-DIM<br />Rounds: 20<br />Used in: Mk18 ABR - Kaliber: 7,62x51 mm Nyomjelző IR-DIM<br />Lőszerek: 20<br />Használható: Mk18 ABR - Kaliber: 7,62x51 mm Leuchtspur IR-DIM<br />Patronen: 20<br />Eingesetzt von: EBR - Calibre: 7,62x51 mm Trazadoras IR-DIM<br />Balas: 20<br />Se usa en: Mk18 ABR - Calibre: 7,62x51 mm Traçantes IR-DIM<br />Cartouches: 20<br />Utilisé dans: EBR - Kaliber: 7,62 x 51 mm Smugacz IR-DIM<br />Pociski: 20<br />Używane w: Mk18 ABR - 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.62mm 20Rnd SD Mag - 7,62 mm Hangtompítós 20-as Tár - 7,62 mm 20-Schuss-Magazin SD - Cargador de 20 balas SD de 7,62mm - Ch. 7,62mm 20Cps SD - Magazynek 7,62mm 20rd SD - 7.62mm 20ks SD Zásobník - Carregador de 20 projéteis SD de 7,62mm - Caricatore 7.62mm 20Rnd Sil. - Магазин из 20-и 7.62 мм дозвуковых - - - 7.62mm SD - 7,62 mm Hangtompítós - 7,62mm SD - 7,62mm SD - 7,62mm SD - 7,62mm SD - 7.62mm SD - 7,62mm SD - 7.62mm Sil. - 7.62 мм дозвуковые - - - Caliber: 7.62x51 mm SD<br />Rounds: 20<br />Used in: Mk18 ABR - Kaliber: 7,62x51 mm Hangtompítós<br />Lőszerek: 20<br />Használható: Mk18 ABR - Kaliber: 7,62x51 mm SD<br />Patronen: 20<br />Eingesetzt von: EBR - Calibre: 7,62x51 mm SD<br />Balas: 20<br />Se usa en: Mk18 ABR - Calibre: 7,62x51 mm SD<br />Cartouches: 20<br />Utilisé dans: EBR - Kaliber: 7,62 x 51 mm SD<br />Pociski: 20<br />Używane w: Mk18 ABR - 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.62mm 20Rnd AP Mag - 7,62 mm Páncéltörő 20-as Tár - 7,62 mm 20-Schuss-Magazin AP - Cargador de 20 balas AP de 7,62mm - Ch. 7,62mm 20Cps AP - Magazynek 7,62mm 20rd AP - 7.62mm 20ks AP Zásobník - Carregador de 20 projéteis AP de 7,62mm - Caricatore 7.62mm 20Rnd AP - Магазин из 20-и 7.62 мм бронебойных - - - 7.62mm AP - 7,62 mm Páncéltörő - 7,62mm AP - 7,62mm AP - 7,62mm AP - 7,62mm AP - 7.62mm AP - 7,62mm AP - 7.62mm AP - 7.62 мм бронебойные - - - Caliber: 7.62x51 mm AP<br />Rounds: 20<br />Used in: Mk18 ABR - Kaliber: 7,62x51 mm Páncéltörő<br />Lőszerek: 20<br />Használható: Mk18 ABR - Kaliber: 7,62x51 mm AP<br />Patronen: 20<br />Eingesetzt von: EBR - Calibre: 7,62x51 mm AP<br />Balas: 20<br />Se usa en: Mk18 ABR - Calibre: 7,62x51 mm AP<br />Cartouches: 20<br />Utilisé dans: EBR - Kaliber: 7,62 x 51 mm AP<br />Pociski: 20<br />Używane w: Mk18 ABR - 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 - - - Caliber: 7.62x51mm M118LR<br />Rounds: 20<br />Type: M14 - Kaliber: 7,62x51 mm M118LR<br />Lőszerek: 20<br />Típus: M14 - Kaliber: 7,62x51mm M118LR<br />Schuss: 20<br />Typ: M14 - Calibre: 7,62x51mm M118LR<br />Balas: 20<br />Tipo: M14 - Kaliber: 7,62 x 51 mm M118LR<br />Pociski: 20<br />Typ: M14 - Kalibr: 7.62x51mm M118LR<br />Náboje: 20<br />Typ: M14 - Calibre : 7,62x51mm M118LR<br />Cartouches: 20<br />Type: M14 - Calibre: 7,62x51mm M118LR<br />Projéteis: 20<br />Tipo: M14 - Калибр: 7.62x51mm M118LR<br />Патронов: 20<br />Тип: M14 - Calibro: 7.62x51mm M118LR<br />Munizioni:20<br />In uso su: M14 - - - + + + + 6.5mm 30Rnd Tracer IR-DIM Mag + 6,5 mm Nyomjelző IR-DIM 30-as Tár + 6,5 mm 30-Schuss-Magazin Leuchtspur IR-DIM + Cargador de 30 balas trazadoras IR-DIM de 6,5mm + Ch. 6,5mm 30Cps Traçantes IR-DIM + Magazynek 6,5mm 30rd Smugacz IR-DIM + 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 мм трассирующих под ПНВ + + + 6.5mm IR-DIM + 6,5 mm IR-DIM + 6,5mm IR-DIM + 6,5mm IR-DIM + 6,5mm IR-DIM + 6,5mm IR-DIM + 6.5mm IR-DIM + 6,5mm IR-DIM + 6.5 IR-DIM + 6.5 мм ИК-трассирующие + + + Caliber: 6.5x39 mm Tracer IR-DIM<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL + Kaliber: 6,5x39 mm Nyomjelző IR-DIM<br />Lőszerek: 30<br />Használható: MX/C/M/SW/3GL + Kaliber: 6,5x39 mm Leuchtspur IR-DIM<br />Patronen: 30<br />Eingesetzt von: MX/C/M/SW/3GL + Calibre: 6,5x39 mm Trazadoras IR-DIM<br />Balas: 30<br />Se usa en: MX/C/M/SW/3GL + Calibre: 6,5x39 mm Traçantes IR-DIM<br />Cartouches: 30<br />Utilisé dans: MX/C/M/SW/3GL + Kaliber: 6,5 x 39 mm Smugowy IR-DIM<br />Pociski: 30<br />Używane w: MX/C/M/SW/3GL + 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.5mm 30Rnd SD Mag + 6,5 mm Hangtompítós 30-as Tár + 6,5 mm 30-Schuss-Magazin SD + Cargador de 30 balas SD de 6,5mm + Ch. 6,5mm 30Cps SD + Magazynek 6,5mm 30rd SD + 6.5mm 30ks SD Zásobník + Carregador de 30 projéteis SD de 6,5mm + Caricatore 6.5mm 30Rnd Sil. + Магазин из 30-ти 6.5 мм дозвуковых + + + 6.5mm SD + 6,5 mm Hangtompítós + 6,5mm SD + 6,5mm SD + 6,5mm SD + 6,5mm SD + 6.5mm SD + 6,5mm SD + 6.5mm Sil. + 6.5 мм дозвуковые + + + Caliber: 6.5x39 mm SD<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL + Kaliber: 6,5x39 mm Hangtompítós<br />Lőszerek: 30<br />Használható: MX/C/M/SW/3GL + Kaliber: 6,5x39 mm SD<br />Patronen: 30<br />Eingesetzt von: MX/C/M/SW/3GL + Calibre: 6,5x39 mm SD<br />Balas: 30<br />Se usa en: MX/C/M/SW/3GL + Calibre: 6,5x39 mm SD<br />Cartouches: 30<br />Utilisé dans: MX/C/M/SW/3GL + Kaliber: 6,5 x 39 mm SD<br />Pociski: 30<br />Używane w: MX/C/M/SW/3GL + 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.5mm 30Rnd AP Mag + 6,5 mm Páncéltörő 30-as Tár + 6,5 mm 30-Schuss-Magazin AP + Cargador de 30 balas AP de 6,5mm + Ch. 6,5mm 30Cps AP + Magazynek 6,5mm 30rd AP + 6.5mm 30ks AP Zásobník + Carregador de 30 projéteis AP de 6,5mm + Caricatore 6.5mm 30Rnd AP + Магазин из 30-ти 6.5 мм бронебойных + + + 6.5mm AP + 6,5 mm Páncéltörő + 6,5mm AP + 6,5mm AP + 6,5mm AP + 6,5mm AP + 6.5mm AP + 6,5mm AP + 6.5mm AP + 6.5 мм бронебойные + + + Caliber: 6.5x39 mm AP<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL + Kaliber: 6,5x39 mm Páncéltörő<br />Lőszerek: 30<br />Használható: MX/C/M/SW/3GL + Kaliber: 6,5x39 mm AP<br />Patronen: 30<br />Eingesetzt von: MX/C/M/SW/3GL + Calibre: 6,5x39 mm AP<br />Balas: 30<br />Se usa en: MX/C/M/SW/3GL + Calibre: 6,5x39 mm AP<br />Cartouches: 30<br />Utilisé dans: MX/C/M/SW/3GL + Kaliber: 6,5 x 39 mm AP<br />Pociski: 30<br />Używane w: MX/C/M/SW/3GL + 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.5mm 30Rnd Tracer IR-DIM Mag + 6,5mm IR-DIM Nyomjelző 30-as Tár + 6,5 mm 30-Schuss-Magazin Leuchtspur IR-DIM + Cargador de 30 balas trazadoras IR-DIM de 6,5mm + Ch. 6,5mm 30Cps Traçantes IR-DIM + Magazynek 6,5mm 30rd Smugacz IR-DIM + 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 мм трассирующих под ПНВ + + + 6.5mm IR-DIM + 6,5mm IR-DIM + 6,5mm IR-DIM + 6,5mm IR-DIM + 6,5mm IR-DIM + 6,5mm IR-DIM + 6.5mm IR-DIM + 6,5mm IR-DIM + 6.5mm IR-DIM + 6.5 мм ИК-трассирующие + + + Caliber: 6.5x39 mm Tracer IR-DIM<br />Rounds: 30<br />Used in: Katiba + Kaliber: 6,5x39 mm Nyomjelző IR-DIM<br />Lőszerek: 30<br />Használható: Katiba + Kaliber: 6,5x39 mm Leuchtspur IR-DIM<br />Patronen: 30<br />Eingesetzt von: Katiba + Calibre: 6,5x39 mm Trazadoras IR-DIM<br />Balas: 30<br />Se usa en: Katiba + Calibre: 6,5x39 mm Traçantes IR-DIM<br />Cartouches: 30<br />Utilisé dans: Katiba + Kaliber: 6,5x39 mm Smugowy IR-DIM<br />Pociski: 30<br />Używane w: Katiba + 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.5mm 30Rnd SD Mag + 6,5 mm Hangtompítós 30-as Tár + 6,5 mm 30-Schuss-Magazin SD + Cargador de 30 balas SD de 6,5mm + Ch. 6,5mm 30Cps SD + Magazynek 6,5mm 30rd SD + 6.5mm 30ks SD Zásobník + Carregador de 30 projéteis SD de 6,5mm + Caricatore 6.5mm 30Rnd Sil. + Магазин из 30-ти 6.5 мм дозвуковых + + + 6.5mm SD + 6,5 mm Hangtompítós + 6,5mm SD + 6,5mm SD + 6,5mm SD + 6,5mm SD + 6.5mm SD + 6,5mm SD + 6.5mm Sil. + 6.5 мм дозвуковые + + + Caliber: 6.5x39 mm SD<br />Rounds: 30<br />Used in: Katiba + Kaliber: 6,5x39 mm Hangtompítós<br />Lőszerek: 30<br />Használható: Katiba + Kaliber: 6,5x39 mm SD<br />Patronen: 30<br />Eingesetzt von: Katiba + Calibre: 6,5x39 mm SD<br />Balas: 30<br />Se usa en: Katiba + Calibre: 6,5x39 mm SD<br />Cartouches: 30<br />Utilisé dans: Katiba + Kaliber: 6,5 x 39 mm SD<br />Naboje: 30<br />Używane w: Katiba + 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.5mm 30Rnd AP Mag + 6,5 mm Páncéltörő 30-as Tár + 6,5 mm 30-Schuss-Magazin AP + Cargador de 30 balas AP de 6,5mm + Ch. 6,5mm 30Cps AP + Magazynek 6,5mm 30rd AP + 6.5mm 30ks AP Zásobník + Carregador de 30 projéteis AP de 6,5mm + Caricatore 6.5mm 30Rnd AP + Магазин из 30-ти 6.5 мм бронебойных + + + 6.5mm AP + 6,5 mm Páncéltörő + 6,5mm AP + 6,5mm AP + 6,5mm AP + 6,5mm AP + 6.5mm AP + 6,5mm AP + 6.5mm AP + 6.5 мм бронебойные + + + Caliber: 6.5x39 mm AP<br />Rounds: 30<br />Used in: Katiba + Kaliber: 6,5x39 mm Páncéltörő<br />Lőszerek: 30<br />Használható: Katiba + Kaliber: 6,5x39 mm AP<br />Patronen: 30<br />Eingesetzt von: Katiba + Calibre: 6,5x39 mm AP<br />Balas: 30<br />Se usa en: Katiba + Calibre: 6,5x39 mm AP<br />Cartouches: 30<br />Utilisé dans: Katiba + Kaliber: 6,5 x 39 mm AP<br />Pociski: 30<br />Używane w: Katiba + 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 + + + + 5.56mm 30rnd Tracer IR-DIM Mag + 5,56 mm Nyomjelző IR-DIM 30-as Tár + 5,56 mm 30-Schuss-Magazin Leuchtspur IR-DIM + Cargador de 30 balas trazadoras IR-DIM de 5,56mm + Ch. 5,56mm 30Cps Traçantes IR-DIM + Magazynek 5,56mm 30rd Smugacz IR-DIM + 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 мм трассирующих под ПНВ + + + 5.56mm IR-DIM + 5,56 mm IR-DIM + 5,56mm IR-DIM + 5,56mm IR-DIM + 5,56mm IR-DIM + 5,56mm IR-DIM + 5.56mm IR-DIM + 5,56mm IR-DIM + 5.56mm IR-DIM + 5.56 мм ИК-трассирующие + + + Caliber: 5.56x45 mm Tracer IR-DIM<br />Rounds: 30<br />Used in: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Kaliber: 5,56x45 mm Nyomjelző IR-DIM<br />Lőszerek: 30<br />Használható: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Kaliber: 5,56x45 mm Leuchtspur IR-DIM<br />Patronen: 30<br />Eingesetzt von: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Calibre: 5,56x45 mm Trazadoras IR-DIM<br />Balas: 30<br />Se usa en: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Calibre: 5,56x45 mm Traçantes IR-DIM<br />Cartouches: 30<br />Utilisé dans: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Kaliber: 5,56 x 45 mm Smugowy IR-DIM<br />Pociski: 30<br />Używane w: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + 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.56mm 30Rnd SD Mag + 5,56 mm Hangtompítós 30-as Tár + 5,56 mm 30-Schuss-Magazin SD + Cargador de 30 balas SD de 5,56 mm + Ch. 5,56mm 30Cps SD + Magazynek 5,56mm 30rd SD + 5.56mm 30ks SD Zásobník + Carregador de 30 projéteis SD de 5,56mm + Caricatore 5.56mm 30Rnd Sil. + Магазин из 30-ти 5.56 мм дозвуковых + + + 5.56mm SD + 5,56 mm Hangtompítós + 5,56mm SD + 5,56 mm SD + 5,56mm SD + 5,56mm SD + 5.56mm SD + 5,56mm SD + 5.56 Sil. + 5.56 мм дозвуковые + + + Caliber: 5.56x45 mm SD<br />Rounds: 30<br />Used in: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Kaliber: 5,56x45 mm Hangtompítós<br />Lőszerek: 30<br />Használható: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Kaliber: 5,56x45 mm SD<br />Patronen: 30<br />Eingesetzt von: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Calibre: 5,56x45 mm SD<br />Balas: 30<br />Se usa en: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Calibre: 5.56x45 mm SD<br />Cartouches: 30<br />Utilisé dans: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Kaliber: 5,56 x 45 mm SD<br />Pociski: 30<br />Używane w: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Ráže: 5.56x45 mm SD<br />Munice: 30<br />Použití: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Calibre: 5,56x45 mm SD<br />Projéteis: 30<br />Usado em: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Calibro: 5.56x45 mm Sil.<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.56mm 30Rnd AP Mag + 5,56 mm Páncéltörő 30-as Tár + 5,56 mm 30-Schuss-Magazin AP + Cargador de 30 balas AP de 5,56mm + Ch. 5,56mm 30Cps AP + Magazynek 5,56mm 30rd AP + 5.56mm 30ks AP Zásobník + Carregador de 30 projéteis AP de 5,56mm + Caricatore 5.56mm 30Rnd AP + Магазин из 30-ти 5.56 мм бронебойных + + + 5.56mm AP + 5,56 mm Páncéltörő + 5,56mm AP + 5,56mm AP + 5,56mm AP + 5,56mm AP + 5.56mm AP + 5,56mm AP + 5.56mm AP + 5.56 мм бронебойные + + + Caliber: 5.56x45 mm AP<br />Rounds: 30<br />Used in: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Kaliber: 5,56x45 mm Páncéltörő<br />Lőszerek: 30<br />Használható: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Kaliber: 5,56x45 mm AP<br />Patronen: 30<br />Eingesetzt von: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Calibre: 5,56x45 mm AP<br />Balas: 30<br />Se usa en: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Calibre: 5,56x45 mm AP<br />Cartouches: 30<br />Utilisé dans: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Kaliber: 5,56 x 45 mm AP<br />Pociski: 30<br />Używane w: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + 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 + + + + 7.62mm 20rnd Tracer Mag + 7,62 mm Nyomjelző IR-DIM 20-as Tár + 7,62 mm 20-Schuss-Magazin Leuchtspur + Cargador de 20 balas trazadores de 7,62mm + Ch. 7,62mm 20Cps Traçantes + Magazynek 7,62mm 20rd Smugacz + 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 мм трассирующих + + + 7.62mm Tracer + 7,62 mm Nyomjelző + 7,62mm Leuchtspur + 7,62mm Trazadora + 7,62mm Traçantes + 7,62mm Smugacz + 7.62mm Svítící + 7,62mm Traçante + 7.62mm Traccianti + 7.62 мм трассирущие + + + Caliber: 7.62x51 mm Tracer<br />Rounds: 20<br />Used in: Mk18 ABR + Kaliber: 7,62x51 mm Nyomjelző<br />Lőszerek: 20<br />Használható: Mk18 ABR + Kaliber: 7,62x51 mm Leuchtspur<br />Patronen: 20<br />Eingesetzt von: EBR + Calibre: 7,62x51 mm Trazadora<br />Balas: 20<br />Se usa en: Mk18 ABR + Calibre: 7,62x51 mm Traçantes<br />Cartouches: 20<br />Utilisé dans: EBR + Kaliber: 7,62 x 51 mm Smugacz<br />Pociski: 20<br />Używane w: Mk18 ABR + 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.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 + 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 + Carregador de 20 projéteis IR-DIM de 7,62mm + Caricatore 7.62mm 20rnd Traccianti IR-DIM + Магазин из 20-ти 7.62 мм трассирующих под ПНВ + + + 7.62mm IR-DIM + 7,62 mm IR-DIM + 7,62mm IR-DIM + 7,62mm IR-DIM + 7,62mm IR-DIM + 7,62mm IR-DIM + 7.62mm IR-DIM + 7,62mm IR-DIM + 7.62mm IR-DIM + 7.62 мм ИК-трассирующие + + + Caliber: 7.62x51 mm Tracer IR-DIM<br />Rounds: 20<br />Used in: Mk18 ABR + Kaliber: 7,62x51 mm Nyomjelző IR-DIM<br />Lőszerek: 20<br />Használható: Mk18 ABR + Kaliber: 7,62x51 mm Leuchtspur IR-DIM<br />Patronen: 20<br />Eingesetzt von: EBR + Calibre: 7,62x51 mm Trazadoras IR-DIM<br />Balas: 20<br />Se usa en: Mk18 ABR + Calibre: 7,62x51 mm Traçantes IR-DIM<br />Cartouches: 20<br />Utilisé dans: EBR + Kaliber: 7,62 x 51 mm Smugacz IR-DIM<br />Pociski: 20<br />Używane w: Mk18 ABR + 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.62mm 20Rnd SD Mag + 7,62 mm Hangtompítós 20-as Tár + 7,62 mm 20-Schuss-Magazin SD + Cargador de 20 balas SD de 7,62mm + Ch. 7,62mm 20Cps SD + Magazynek 7,62mm 20rd SD + 7.62mm 20ks SD Zásobník + Carregador de 20 projéteis SD de 7,62mm + Caricatore 7.62mm 20Rnd Sil. + Магазин из 20-ти 7.62 мм дозвуковых + + + 7.62mm SD + 7,62 mm Hangtompítós + 7,62mm SD + 7,62mm SD + 7,62mm SD + 7,62mm SD + 7.62mm SD + 7,62mm SD + 7.62mm Sil. + 7.62 мм дозвуковые + + + Caliber: 7.62x51 mm SD<br />Rounds: 20<br />Used in: Mk18 ABR + Kaliber: 7,62x51 mm Hangtompítós<br />Lőszerek: 20<br />Használható: Mk18 ABR + Kaliber: 7,62x51 mm SD<br />Patronen: 20<br />Eingesetzt von: EBR + Calibre: 7,62x51 mm SD<br />Balas: 20<br />Se usa en: Mk18 ABR + Calibre: 7,62x51 mm SD<br />Cartouches: 20<br />Utilisé dans: EBR + Kaliber: 7,62 x 51 mm SD<br />Pociski: 20<br />Używane w: Mk18 ABR + 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.62mm 20Rnd AP Mag + 7,62 mm Páncéltörő 20-as Tár + 7,62 mm 20-Schuss-Magazin AP + Cargador de 20 balas AP de 7,62mm + Ch. 7,62mm 20Cps AP + Magazynek 7,62mm 20rd AP + 7.62mm 20ks AP Zásobník + Carregador de 20 projéteis AP de 7,62mm + Caricatore 7.62mm 20Rnd AP + Магазин из 20-ти 7.62 мм бронебойных + + + 7.62mm AP + 7,62 mm Páncéltörő + 7,62mm AP + 7,62mm AP + 7,62mm AP + 7,62mm AP + 7.62mm AP + 7,62mm AP + 7.62mm AP + 7.62 мм бронебойные + + + Caliber: 7.62x51 mm AP<br />Rounds: 20<br />Used in: Mk18 ABR + Kaliber: 7,62x51 mm Páncéltörő<br />Lőszerek: 20<br />Használható: Mk18 ABR + Kaliber: 7,62x51 mm AP<br />Patronen: 20<br />Eingesetzt von: EBR + Calibre: 7,62x51 mm AP<br />Balas: 20<br />Se usa en: Mk18 ABR + Calibre: 7,62x51 mm AP<br />Cartouches: 20<br />Utilisé dans: EBR + Kaliber: 7,62 x 51 mm AP<br />Pociski: 20<br />Używane w: Mk18 ABR + 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 + + + Caliber: 7.62x51mm M118LR<br />Rounds: 20<br />Type: M14 + Kaliber: 7,62x51 mm M118LR<br />Lőszerek: 20<br />Típus: M14 + Kaliber: 7,62x51mm M118LR<br />Schuss: 20<br />Typ: M14 + Calibre: 7,62x51mm M118LR<br />Balas: 20<br />Tipo: M14 + Kaliber: 7,62 x 51 mm M118LR<br />Pociski: 20<br />Typ: M14 + Kalibr: 7.62x51mm M118LR<br />Náboje: 20<br />Typ: M14 + Calibre : 7,62x51mm M118LR<br />Cartouches: 20<br />Type: M14 + Calibre: 7,62x51mm M118LR<br />Projéteis: 20<br />Tipo: M14 + Калибр: 7.62x51mm M118LR<br />Патронов: 20<br />Тип: M14 + Calibro: 7.62x51mm M118LR<br />Munizioni:20<br />In uso su: M14 + + + + .338 LM 10Rnd Tracer Mag + .338 LM 10-Schuss-Magazin Leuchtspur + Magazynek .338 LM 10rd Smugacz + .338 LM 10Rnd Svítící Zásobník + + + .338 LM Tracer + .338 LM Leuchtspur + .338 LM Smugacz + .338 LM Svítící + + + Caliber: .338 Lapua Magnum Tracer<br />Rounds: 10<br />Used in: MAR-10 + Kaliber: .338 Lapua Magnum Leuchtspur<br />Schuss: 10<br />Verwendet für: MAR-10 + Kaliber: .338 Lapua Magnum Smugacz<br />Pociski: 10<br />Używane w: MAR-10 + + + .338 LM 10Rnd IR-DIM Mag + .338 LM 10-Schuss-Magazin Leuchtspur IR-DIM + Magazynek .338 LM 10rd IR-DIM + + + .338 LM IR-DIM + .338 LM IR-DIM + .338 LM IR-DIM + .338 LM IR-DIM + + + Caliber: .338 Lapua Magnum Tracer IR-DIM<br />Rounds: 10<br />Used in: MAR-10 + Kaliber: .338 Lapua Magnum Leuchtspur IR-DIM<br />Schuss: 10<br />Verwendet für: MAR-10 + Kaliber: .338 Lapua Magnum Smugacz IR-DIM<br />Pociski: 10<br />Używane w: MAR-10 + + + .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 LM 10Rnd SD Mag + .338 LM 10-Schuss-Magazin Unterschall + Magazynek .338 LM 10rd SD + + + .338 LM SD + .338 LM SD + .338 LM SD + .338 LM SD + + + Caliber: .338 Lapua Magnum SD<br />Rounds: 10<br />Used in: MAR-10 + Kaliber: .338 Lapua Magnum Unterschall<br />Schuss: 10<br />Verwendet für: MAR-10 + Kaliber: .338 Lapua Magnum SD<br />Pociski: 10<br />Używany w: MAR-10 + + + + .338 NM 130Rnd Tracer Belt + .338 NM 130-Schuss-Gurt Leuchtspur + Taśma .338 NM 130rd Smugacz + + + .338 NM Tracer + .338 NM Leuchtspur + .338 NM Tracer + .338 NM Svítící + + + 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 + + + .338 NM 130Rnd IR-DIM Belt + .338 NM 130-Schuss-Gurt Leuchtspur IR-DIM + Taśma .338 NM 130rd IR-DIM + + + .338 NM IR-DIM + .338 LM 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 + + + .338 NM 130Rnd AP Belt + .338 NM 130-Schuss-Gurt Hartkern + Taśma .338 NM 130rd 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 + + + + 9.3mm 10Rnd Tracer Mag + 9,3mm 10-Schuss-Magazin Leuchtspur + Magazynek 9.3mm 10rd Smugacz + + + 9.3mm Tracer + 9,3mm Leuchtspur + 9,3mm Smugacz + 9.3mm Svítící + + + 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,3 x 64 mm Smugacz<br />Pociski: 10<br />Używany w: Cyrus + + + 9.3mm 10Rnd Tracer IR-DIM Mag + 9,3mm 10-Schuss-Magazin Leuchtspur IR-DIM + Magazynek 9,3mm 10rd Smugacz 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,3 x 64 mm Smugacz IR-DIM<br />Pociski: 10<br />Używany w: Cyrus + + + 9.3mm 10Rnd AP Mag + 9,3mm 10-Schuss-Magazin Hartkern + Magazynek 9,3mm 10rd 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,3 x 64 mm AP<br />Pociski: 10<br />Używany w: Cyrus + + + 9.3mm 10Rnd SD Mag + 9,3mm 10-Schuss-Magazin Unterschall + Magazynek 9,3mm 10rd SD + + + 9.3mm SD + 9,3mm SD + 9,3mm SD + 9.3mm SD + + + Caliber: 9.3x64mm SD<br />Rounds: 10<br />Used in: Cyrus + Kaliber: 9,3x64mm Unterschall<br />Schuss: 10<br />Verwendet für: Cyrus + Kaliber: 9,3 x 64 mm SD<br />Pociski: 10<br />Używany w: Cyrus + + + + 9.3mm 150Rnd Tracer Belt + 9,3mm 150-Schuss-Gurt Leuchtspur + Taśma 9,3mm 150rd Smugacz + + + 9.3mm Tracer + 9,3mm Leuchtspur + 9,3mm Smugacz + 9.3mm Svítící + + + 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,3 x 64 mm Smugacz<br />Pociski: 150<br />Używane w: Navid + + + 9.3mm 150Rnd Tracer IR-DIM Belt + 9,3mm 150-Schuss-Gurt Leuchtspur IR-DIM + Taśma 9,3mm 150rd Smugacz 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,3 x 64 mm Smugacz IR-DIM<br />Pociski: 150<br />Używane w: Navid + + + 9.3mm 150Rnd AP Belt + 9,3mm 150-Schuss-Gurt Hartkern + Taśma 9,3mm 150rd 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,3 x 64 mm AP<br />Pociski: 150<br />Używane w: Navid + + + \ No newline at end of file diff --git a/addons/maptools/stringtable.xml b/addons/maptools/stringtable.xml index 5dd4578976..bc35651ba9 100644 --- a/addons/maptools/stringtable.xml +++ b/addons/maptools/stringtable.xml @@ -1,5 +1,4 @@  - @@ -8,7 +7,7 @@ Outils de navigation Narzędzia nawigacyjne Kartenwerkzeug - Pomůcky k Mapě + Pomůcky k mapě Strumenti Cartografici Ferramentas de Mapa Térképészeti eszközök @@ -32,7 +31,7 @@ Outils de navigation Narzędzia nawigacyjne Kartenwerkzeug - Pomůcky k Mapě + Pomůcky k mapě Strumenti Cartografici Ferramentas de Mapa Térképészeti eszközök @@ -142,7 +141,7 @@ Kierunek: %1° Dirección: %1° Irány: %1 - Направление:%1 + Направление: %1° - \ No newline at end of file + diff --git a/addons/markers/stringtable.xml b/addons/markers/stringtable.xml index ea6d72990a..65da73a026 100644 --- a/addons/markers/stringtable.xml +++ b/addons/markers/stringtable.xml @@ -1,5 +1,5 @@  - + @@ -9,7 +9,7 @@ Směr: %1° Kierunek: %1° Dirección: %1° - Направление: %1 + Направление: %1° \ No newline at end of file diff --git a/addons/medical/XEH_preInit.sqf b/addons/medical/XEH_preInit.sqf index c18a116e31..8e1fd5856f 100644 --- a/addons/medical/XEH_preInit.sqf +++ b/addons/medical/XEH_preInit.sqf @@ -102,4 +102,7 @@ GVAR(IVBags) = []; call FUNC(parseConfigForInjuries); +GVAR(HITPOINTS) = ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"]; +GVAR(SELECTIONS) = ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"]; + ADDON = true; diff --git a/addons/medical/functions/fnc_handleDamage.sqf b/addons/medical/functions/fnc_handleDamage.sqf index 074f8c41fa..1632a8f55b 100644 --- a/addons/medical/functions/fnc_handleDamage.sqf +++ b/addons/medical/functions/fnc_handleDamage.sqf @@ -17,7 +17,7 @@ #include "script_component.hpp" -private ["_unit", "_selection", "_damage", "_shooter", "_projectile", "_damageReturn", "_hitPoints", "_typeOfDamage"]; +private ["_unit", "_selection", "_damage", "_shooter", "_projectile", "_damageReturn", "_typeOfDamage"]; _unit = _this select 0; _selection = _this select 1; _damage = _this select 2; @@ -32,8 +32,7 @@ if (typeName _projectile == "OBJECT") then { }; // If the damage is being weird, we just tell it to fuck off. -_hitSelections = ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"]; -if !(_selection in (_hitSelections + [""])) exitWith {0}; +if !(_selection in (GVAR(SELECTIONS) + [""])) exitWith {0}; _damageReturn = _damage; if (GVAR(level) < 2) then { @@ -46,8 +45,7 @@ if (GVAR(level) >= 2) then { // lets use basic for the time being.. _damageReturn = _this call FUNC(handleDamage_basic); }; - - [_unit, _selection, _damage, _source, _projectile] call FUNC(handleDamage_caching); + _newDamage = _this call FUNC(handleDamage_caching); if (_damageReturn > 0.9) then { @@ -59,12 +57,6 @@ if (GVAR(level) >= 2) then { _minLethalDamage = GVAR(minLethalDamages) select _typeIndex; }; - _hitPoints = ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"]; - _newDamage = _damage - (damage _unit); - if (_selection in _hitSelections) then { - _newDamage = _damage - (_unit getHitPointDamage (_hitPoints select (_hitSelections find _selection))); - }; - if ((_minLethalDamage <= _newDamage) && {[_unit, [_selection] call FUNC(selectionNameToNumber), _newDamage] call FUNC(determineIfFatal)} && {_selection in ["", "head", "body"]}) then { if ([_unit] call FUNC(setDead)) then { _damageReturn = 1; diff --git a/addons/medical/functions/fnc_handleDamage_advanced.sqf b/addons/medical/functions/fnc_handleDamage_advanced.sqf index 751896be44..ba0eb8af24 100644 --- a/addons/medical/functions/fnc_handleDamage_advanced.sqf +++ b/addons/medical/functions/fnc_handleDamage_advanced.sqf @@ -25,21 +25,21 @@ _selectionName = _this select 1; _amountOfDamage = _this select 2; _sourceOfDamage = _this select 3; _typeOfProjectile = _this select 4; +_newDamage = _this select 5; // Most likely taking exessive fire damage. Lets exit. -if (isNull _sourceOfDamage && (_selectionName == "head" || isBurning _unit) && _typeOfProjectile == "" && vehicle _unit == _unit) exitwith { +if (isNull _sourceOfDamage && {_typeOfProjectile == ""} && {vehicle _unit == _unit} && {(_selectionName == "head" || isBurning _unit)}) exitwith { 0 }; - _typeOfDamage = [_typeOfProjectile] call FUNC(getTypeOfDamage); _part = [_selectionName] call FUNC(selectionNameToNumber); _hitPoints = ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"]; // Sorting out the damage _damageBodyParts = _unit getvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]; -_newDamage = _amountOfDamage - (_unit getHitPointDamage (_hitPoints select _part)); _damageBodyParts set [_part, (_damageBodyParts select _part) + _newDamage]; _unit setvariable [QGVAR(bodyPartStatus), _damageBodyParts, true]; + [_unit] call FUNC(handleDamage_advancedSetDamage); [_unit, _selectionName, _newDamage, _typeOfProjectile, _typeOfDamage] call FUNC(handleDamage_wounds); diff --git a/addons/medical/functions/fnc_handleDamage_advancedSetDamage.sqf b/addons/medical/functions/fnc_handleDamage_advancedSetDamage.sqf index 74db6029d2..f464ef5a94 100644 --- a/addons/medical/functions/fnc_handleDamage_advancedSetDamage.sqf +++ b/addons/medical/functions/fnc_handleDamage_advancedSetDamage.sqf @@ -16,9 +16,7 @@ private ["_unit", "_bodyStatus", "_headDamage", "_torsoDamage", "_handsDamage", "_legsDamage"]; _unit = _this select 0; -if (!local _unit) exitwith { - // execute only local -}; +if (!local _unit) exitwith {}; _bodyStatus = _unit getvariable [QGVAR(bodyPartStatus),[0,0,0,0,0,0]]; // ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"] diff --git a/addons/medical/functions/fnc_handleDamage_basic.sqf b/addons/medical/functions/fnc_handleDamage_basic.sqf index 2986e1b2f7..aa9c2f61df 100644 --- a/addons/medical/functions/fnc_handleDamage_basic.sqf +++ b/addons/medical/functions/fnc_handleDamage_basic.sqf @@ -42,15 +42,25 @@ if (diag_frameno > (_unit getVariable [QGVAR(frameNo), -3]) + 2) then { _unit setVariable [QGVAR(damages), []]; _unit setVariable [QGVAR(structDamage), 0]; _unit setVariable [QGVAR(preventDeath), false]; + // Assign orphan structural damage to torso + [{ + private ["_unit", "_damagesum"]; + _unit = _this select 0; + _damagesum = (_unit getHitPointDamage "HitHead") + + (_unit getHitPointDamage "HitBody") + + (_unit getHitPointDamage "HitLeftArm") + + (_unit getHitPointDamage "HitRightArm") + + (_unit getHitPointDamage "HitLeftLeg") + + (_unit getHitPointDamage "HitRightLeg"); + if (_damagesum < 0.06 and damage _unit > 0.06 and alive _unit) then { + _unit setHitPointDamage ["HitBody", damage _unit]; + }; + }, [_unit], 2, 0.1] call EFUNC(common,waitAndExecute); }; - -_hitSelections = ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"]; -_hitPoints = ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"]; - _newDamage = _damage - (damage _unit); -if (_selectionName in _hitSelections) then { - _newDamage = _damage - (_unit getHitPointDamage (_hitPoints select (_hitSelections find _selectionName))); +if (_selectionName in GVAR(SELECTIONS)) then { + _newDamage = _damage - (_unit getHitPointDamage (GVAR(HITPOINTS) select (GVAR(SELECTIONS) find _selectionName))); }; _damage = _damage - _newDamage; @@ -61,7 +71,7 @@ if (((velocity _unit) select 2 < -5) and (vehicle _unit == _unit)) then { _unit setVariable [QGVAR(isFalling), true]; }; if (_unit getVariable [QGVAR(isFalling), false] and !(_selectionName in ["", "leg_l", "leg_r"])) exitWith { - (_unit getHitPointDamage (_hitPoints select (_hitSelections find _selectionName))) max 0.01; + (_unit getHitPointDamage (GVAR(HITPOINTS) select (GVAR(SELECTIONS) find _selectionName))) max 0.01; }; if (_unit getVariable [QGVAR(isFalling), false]) then { _newDamage = _newDamage * 0.7; @@ -85,12 +95,12 @@ if (_selectionName != "" and !(_unit getVariable QGVAR(isFalling))) then { // Make entry unfindable _cache_projectiles set [_index, objNull]; _cache_projectiles pushBack _projectile; - _cache_hitpoints pushBack (_hitPoints select (_hitSelections find _selectionName)); + _cache_hitpoints pushBack (GVAR(HITPOINTS) select (GVAR(SELECTIONS) find _selectionName)); _cache_damages pushBack _newDamage; }; } else { _cache_projectiles pushBack _projectile; - _cache_hitpoints pushBack (_hitPoints select (_hitSelections find _selectionName)); + _cache_hitpoints pushBack (GVAR(HITPOINTS) select (GVAR(SELECTIONS) find _selectionName)); _cache_damages pushBack _newDamage; }; _unit setVariable [QGVAR(projectiles), _cache_projectiles]; @@ -109,30 +119,12 @@ if (_selectionName == "") then { }; }; - -// Assign orphan structural damage to torso -[{ - private ["_unit", "_damagesum"]; - _unit = _this select 0; - _damagesum = (_unit getHitPointDamage "HitHead") + - (_unit getHitPointDamage "HitBody") + - (_unit getHitPointDamage "HitLeftArm") + - (_unit getHitPointDamage "HitRightArm") + - (_unit getHitPointDamage "HitLeftLeg") + - (_unit getHitPointDamage "HitRightLeg"); - if (_damagesum < 0.06 and damage _unit > 0.06 and alive _unit) then { - _unit setHitPointDamage ["HitBody", damage _unit]; - }; -}, [_unit], 2, 0.1] call EFUNC(common,waitAndExecute); - - if (_selectionName == "") then { _damage = _damage + (_unit getVariable QGVAR(structDamage)); } else { _damage = _damage + _newDamage; }; - // Leg Damage _legdamage = (_unit getHitPointDamage "HitLeftLeg") + (_unit getHitPointDamage "HitRightLeg"); if (_selectionName == "leg_l") then { @@ -143,9 +135,9 @@ if (_selectionName == "leg_r") then { }; if (_legdamage >= LEGDAMAGETRESHOLD1) then { - if (_unit getHitPointDamage "HitLegs" != 1) then {_unit setHitPointDamage ["HitLegs", 1]}; + _unit setHitPointDamage ["HitLegs", 1]; } else { - if (_unit getHitPointDamage "HitLegs" != 0) then {_unit setHitPointDamage ["HitLegs", 0]}; + _unit setHitPointDamage ["HitLegs", 0]; }; // @todo: force prone for completely fucked up legs. @@ -160,9 +152,9 @@ if (_selectionName == "hand_r") then { }; if (_armdamage >= ARMDAMAGETRESHOLD1) then { - if (_unit getHitPointDamage "HitHands" != 1) then {_unit setHitPointDamage ["HitHands", 1]}; + _unit setHitPointDamage ["HitHands", 1]; } else { - if (_unit getHitPointDamage "HitHands" != 0) then {_unit setHitPointDamage ["HitHands", 0]}; + _unit setHitPointDamage ["HitHands", 0]; }; // @todo: Drop weapon for full damage. @@ -174,7 +166,6 @@ if (_selectionName == "") then { _unit setVariable [QGVAR(pain), _pain min 1, true]; }; - // Unconsciousness if (_selectionName == "" and _damage >= UNCONSCIOUSNESSTRESHOLD and diff --git a/addons/medical/functions/fnc_handleDamage_caching.sqf b/addons/medical/functions/fnc_handleDamage_caching.sqf index ddd0b6c920..98b2373c74 100644 --- a/addons/medical/functions/fnc_handleDamage_caching.sqf +++ b/addons/medical/functions/fnc_handleDamage_caching.sqf @@ -25,8 +25,8 @@ _damage = _this select 2; _source = _this select 3; _projectile = _this select 4; -_hitSelections = ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"]; -_hitPoints = ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"]; +_hitSelections = GVAR(SELECTIONS); +_hitPoints = GVAR(HITPOINTS); // Calculate change in damage. _newDamage = _damage - (damage _unit); @@ -34,18 +34,10 @@ if (_selectionName in _hitSelections) then { _newDamage = _damage - (_unit getHitPointDamage (_hitPoints select (_hitSelections find _selectionName))); }; - -// we want to move damage to another selection; have to do it ourselves. -// this is only the case for limbs, so this will not impact the killed EH. -if (_selectionName != (_this select 1)) then { - _unit setHitPointDamage [_hitPoints select (_hitSelections find _selectionName), _damage + _newDamage]; - _newDamage = 0; -}; -// ?????? -_damage = _damage + _newDamage; +//_damage = _damage + _newDamage; // Check for vehicle crash -if (vehicle _unit != _unit && !(vehicle _unit isKindOf "StaticWeapon") && {isNull _source} && {_projectile == ""} && {_selectionName == ""}) then { +if (vehicle _unit != _unit && {!(vehicle _unit isKindOf "StaticWeapon")} && {isNull _source} && {_projectile == ""} && {_selectionName == ""}) then { if (missionNamespace getvariable [QGVAR(allowVehicleCrashDamage), true]) then { _selectionName = _hitSelections select (floor(random(count _hitSelections))); _projectile = "vehiclecrash"; @@ -54,10 +46,11 @@ if (vehicle _unit != _unit && !(vehicle _unit isKindOf "StaticWeapon") && {isNul // From AGM medical: // Exclude falling damage to everything other than legs; reduce structural damage. -if (((velocity _unit) select 2 < -5) && (vehicle _unit == _unit)) then { +if (((velocity _unit) select 2 < -5) && {(vehicle _unit == _unit)}) then { _unit setVariable [QGVAR(isFalling), True]; }; -if (_unit getVariable [QGVAR(isFalling), false] && !(_selectionName in ["", "leg_l", "leg_r"])) exitWith {}; + +if (_unit getVariable [QGVAR(isFalling), false] && {!(_selectionName in ["", "leg_l", "leg_r"])}) exitWith {}; if (_unit getVariable [QGVAR(isFalling), false]) then { _newDamage = _newDamage * 0.7; }; @@ -69,21 +62,16 @@ if (diag_frameno > (_unit getVariable [QGVAR(frameNo_damageCaching), -3]) + 2) t // handle the cached damages 3 frames later [{ - private ["_args","_unit","_frameNo"]; + private ["_args", "_params"]; _args = _this select 0; - _unit = _args select 0; - _frameNo = _args select 1; - if (diag_frameno > _frameNo + 2) then { - _cache_projectiles = _unit getVariable [QGVAR(cachedProjectiles), []]; - _cache_hitpoints = _unit getVariable [QGVAR(cachedHitPoints), []]; - _cache_damages = _unit getVariable [QGVAR(cachedDamages), []]; - _cache_params = _unit getVariable [QGVAR(cachedHandleDamageParams), []]; + if (diag_frameno > (_args select 1) + 2) then { + _cache_params = (_args select 0) getVariable [QGVAR(cachedHandleDamageParams), []]; + _cache_damages = (_args select 0) getVariable QGVAR(cachedDamages); { - if (typeName _x == typeName "") then { - (_cache_params select _foreachIndex) call FUNC(handleDamage_advanced); - }; - }foreach _cache_projectiles; + _params = _x + [_cache_damages select _foreachIndex]; + _params call FUNC(handleDamage_advanced); + }foreach _cache_params; [(_this select 1)] call cba_fnc_removePerFrameHandler; }; }, 0, [_unit, diag_frameno] ] call CBA_fnc_addPerFrameHandler; @@ -94,52 +82,54 @@ if (diag_frameno > (_unit getVariable [QGVAR(frameNo_damageCaching), -3]) + 2) t _unit setVariable [QGVAR(cachedHandleDamageParams), []]; }; -// Make sure there's only one damaged selection per projectile per frame. -_cache_projectiles = _unit getVariable QGVAR(cachedProjectiles); -_cache_hitpoints = _unit getVariable QGVAR(cachedHitPoints); -_cache_damages = _unit getVariable QGVAR(cachedDamages); -_cache_params = _unit getVariable QGVAR(cachedHandleDamageParams); - // Caching of the damage events if (_selectionName != "") then { - + _cache_projectiles = _unit getVariable QGVAR(cachedProjectiles); + private ["_index","_otherDamage"]; + _index = _cache_projectiles find _projectile; // Check if the current projectile has already been handled once - if (_projectile in _cache_projectiles) then { - private ["_index","_otherDamage"]; - // if it has been handled, find the index in the cache - _index = _cache_projectiles find _projectile; - + if (_index >= 0) exitwith { + _cache_damages = _unit getVariable QGVAR(cachedDamages); // Find the previous damage this projectile has done _otherDamage = (_cache_damages select _index); // Take the highest damage of the two - if (_otherDamage > _newDamage) then { - _newDamage = 0; - } else { + if (_newDamage > _otherDamage) then { + _cache_params = _unit getVariable QGVAR(cachedHandleDamageParams); + _cache_hitpoints = _unit getVariable QGVAR(cachedHitPoints); + private ["_hitPoint", "_restore"]; // Restore the damage before the previous damage was processed _hitPoint = _cache_hitpoints select _index; _restore = ((_unit getHitPointDamage _hitPoint) - _otherDamage) max 0; _unit setHitPointDamage [_hitPoint, _restore]; - // Make entry unfindable and add the new damage cache - _cache_projectiles set [_index, objNull]; - _cache_projectiles pushBack _projectile; - _cache_hitpoints pushBack (_hitPoints select (_hitSelections find _selectionName)); - _cache_damages pushBack _newDamage; - _cache_params pushBack [_unit, _selectionName, _damage, _source, _projectile]; + _cache_hitpoints set [_index, (_hitPoints select (_hitSelections find _selectionName))]; + _cache_damages set [_index, _newDamage]; + _cache_params set[_index, _this]; + + _unit setVariable [QGVAR(cachedProjectiles), _cache_projectiles]; + _unit setVariable [QGVAR(cachedHitPoints), _cache_hitpoints]; + _unit setVariable [QGVAR(cachedDamages), _cache_damages]; + _unit setVariable [QGVAR(cachedHandleDamageParams), _cache_params]; }; - } else { - // This is an unhandled projectile - _cache_projectiles pushBack _projectile; - _cache_hitpoints pushBack (_hitPoints select (_hitSelections find _selectionName)); - _cache_damages pushBack _newDamage; - _cache_params pushBack [_unit, _selectionName, _damage, _source, _projectile]; }; + + _cache_hitpoints = _unit getVariable QGVAR(cachedHitPoints); + _cache_damages = _unit getVariable QGVAR(cachedDamages); + _cache_params = _unit getVariable QGVAR(cachedHandleDamageParams); + + // This is an unhandled projectile + _cache_projectiles pushBack _projectile; + _cache_hitpoints pushBack (_hitPoints select (_hitSelections find _selectionName)); + _cache_damages pushBack _newDamage; + _cache_params pushBack _this; + + // Store the new cached values + _unit setVariable [QGVAR(cachedProjectiles), _cache_projectiles]; + _unit setVariable [QGVAR(cachedHitPoints), _cache_hitpoints]; + _unit setVariable [QGVAR(cachedDamages), _cache_damages]; + _unit setVariable [QGVAR(cachedHandleDamageParams), _cache_params]; }; -// Store the new cached values -_unit setVariable [QGVAR(cachedProjectiles), _cache_projectiles]; -_unit setVariable [QGVAR(cachedHitPoints), _cache_hitpoints]; -_unit setVariable [QGVAR(cachedDamages), _cache_damages]; -_unit setVariable [QGVAR(cachedHandleDamageParams), _cache_params]; +_newDamage; diff --git a/addons/medical/functions/fnc_handleDamage_wounds.sqf b/addons/medical/functions/fnc_handleDamage_wounds.sqf index 1eebe038cd..5933651e57 100644 --- a/addons/medical/functions/fnc_handleDamage_wounds.sqf +++ b/addons/medical/functions/fnc_handleDamage_wounds.sqf @@ -52,10 +52,10 @@ _allPossibleInjuries = []; // Check if the damage is higher as the min damage for the specific injury if (_damage >= _minDamage && {_damage <= _maxDamage || _maxDamage < 0}) then { - _classType = _x select 0; + //_classType = _x select 0; _selections = _x select 1; - _bloodLoss = _x select 2; - _pain = _x select 3; + //_bloodLoss = _x select 2; + //_pain = _x select 3; // Check if the injury can be applied to the given selection name if ("All" in _selections || _selectionName in _selections) then { @@ -73,9 +73,7 @@ _allPossibleInjuries = []; }foreach _allInjuriesForDamageType; // No possible wounds available for this damage type or damage amount. -if (_highestPossibleSpot < 0) exitwith { - -}; +if (_highestPossibleSpot < 0) exitwith {}; // Administration for open wounds and ids _openWounds = _unit getvariable[QGVAR(openWounds), []]; @@ -125,7 +123,7 @@ _woundsCreated = []; _painToAdd = _painToAdd + (_toAddInjury select 3); }; }; -}foreach (_injuryTypeInfo select 0); +}foreach (_injuryTypeInfo select 0); // foreach damage thresholds _unit setvariable [QGVAR(openWounds), _openWounds, !USE_WOUND_EVENT_SYNC]; diff --git a/addons/medical/functions/fnc_setUnconscious.sqf b/addons/medical/functions/fnc_setUnconscious.sqf index c518b93a97..89ab5ee3b3 100644 --- a/addons/medical/functions/fnc_setUnconscious.sqf +++ b/addons/medical/functions/fnc_setUnconscious.sqf @@ -52,7 +52,7 @@ if (animationState _unit in ["ladderriflestatic","laddercivilstatic"]) then { }; if (vehicle _unit == _unit) then { if (primaryWeapon _unit == "") then { - _unit addWeapon "ACE_fakeWeapon"; + _unit addWeapon "ACE_FakePrimaryWeapon"; }; _unit selectWeapon (primaryWeapon _unit); _unit switchMove ""; @@ -67,7 +67,8 @@ _unit setUnitPos "DOWN"; [_unit, true] call EFUNC(common,disableAI); // So the AI does not get stuck, we are moving the unit to a temp group on its own. -[_unit, true, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide); +//Unconscious units shouldn't be put in another group #527: +// [_unit, true, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide); [_unit, QGVAR(unconscious), true] call EFUNC(common,setCaptivityStatus); [_unit, [_unit] call EFUNC(common,getDeathAnim), 1, true] call EFUNC(common,doAnimation); @@ -114,9 +115,10 @@ _startingTime = time; [_unit, QGVAR(unconscious), false] call EFUNC(common,setCaptivityStatus); // Swhich the unit back to its original group - [_unit, false, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide); + //Unconscious units shouldn't be put in another group #527: + // [_unit, false, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide); - [_unit, false] call EFUNC(common,disableAI_F); + [_unit, false] call EFUNC(common,disableAI); _unit setUnitPos _originalPos; // This is not position but stance (DOWN, MIDDLE, UP) _unit setUnconscious false; diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index a5dfdbba49..d61118d81b 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -1,19 +1,24 @@  - + Inject Atropine - Atropin + Atropin injizieren + Inyectar Atropina + Ввести атропин + Aplikovat atropin + Wstrzyknij atropinę + Injecter de l'atropine Inject Epinephrine Epinephrine injizieren Inyectar Epinefrina - Wtrzyknij adrenalinę - Aplikovat Adrenalin + Wstrzyknij adrenalinę + Aplikovat adrenalin Ввести андреналил - Adrénaline + Injecter de l'épinéphrine Adrenalin Injetar Epinefrina Inietta Epinefrina @@ -23,7 +28,7 @@ Morphin injizieren Inyectar Morfina Wstrzyknij morfinę - Aplikovat Morfin + Aplikovat morfin Ввести морфин Morphine Morfium @@ -45,14 +50,29 @@ Transfuse Plasma Plasmatransfusion + Transfundir plasma + Перелить плазму + Transfúze plazmy + Przetocz osocze + Transfuser du Plasma Transfuse Saline Salzlösungtransfusion + Transfundir salino + Влить физраствор + Transfúze fyziologický roztoku + Przetocz solankę + Transfuser de la Saline Apply Tourniquet Aderpresse anwenden + Aplicar torniquete + Наложить жгут + Aplikovat škrtidlo + Załóż stazę + Appliquer un garrot Bandage @@ -143,7 +163,7 @@ Morphin injizieren ... Inyectando Morfina ... Wstrzykiwanie morfiny ... - Aplikuju Morfin ... + Aplikuji morfin ... Введение морфина... Injection de Morphine... Morfium beadása... @@ -155,8 +175,8 @@ Epinephrin injizieren ... Inyectando Epinefrina ... Wstrzykiwanie adrenaliny ... - Aplikuju Adrenalin ... - Введение андреналина + Aplikuji adrenalin ... + Введение андреналина ... Injection d'Adrénaline ... Adrenalin beadása... Injetando Epinefrina ... @@ -165,11 +185,16 @@ Injecting Atropine ... Atropin injizieren ... + Inyectando Atropina ... + Введение атропина ... + Aplikuji atropin ... + Wstrzykiwanie atropiny ... + Injection d'Atropine ... Transfusing Blood ... Bluttransfusion ... - Realizando transfusión ... + Transfusión de sangre ... Przetaczanie krwi ... Probíhá transfúze krve ... Переливание крови... @@ -181,10 +206,20 @@ Transfusing Saline ... Sallösungtransfusion ... + Transfusión de salino ... + Вливание физраствора ... + Probíha transfúze fyziologický roztoku ... + Przetaczanie solanki ... + Transfusion de saline ... Transfusing Plasma ... Plasmatransfusion ... + Transfusión de plasma ... + Переливание плзмы ... + Probíha transfúze plazmy ... + Przetaczanie osocza ... + Transfusion de Plasma ... Bandaging ... @@ -200,7 +235,12 @@ Applying Tourniquet ... - Aderpresse ... + Setze Aderpresse an ... + Aplicando torniquete ... + Наложение жгута ... + Aplikuji škrtidlo + Zakładanie stazy ... + Mise en place du garrot Medical @@ -215,78 +255,206 @@ Field Dressing + Verbandpäckchen + Compresa de campaña + Бинтовая повязка + Obinadlo + Bandaż jałowy + Bandage rapide Packing Bandage + Mullbinde + Vendaje compresivo + Компресионный пакет + Bandaż uciskowy Elastic Bandage + Elastischer Verband + Vendaje elástico + Давящая повязка + Elastické obinadlo + Bandaż elastyczny + Bandage Élastique QuikClot + QuikClot + QuikClot + QuickClot + Opatrunek QuikClot + QuikClot Check Pulse Puls überprüfen + Comprobar pulso + Проверить пульс + Zkontrolovat pulz + Sprawdź tętno + Vérifier les pulsations Check Blood Pressure - Blutdruck messen + Blutdruck überprüfen + Comprobar presión arterial + Проверить кровяное давление + Zkontrolovat krevní tlak + Sprawdź ciśnienie krwi + Vérifier la pression sanguine Triage Card - Triage Karte + Verletztenanhängekarte + Tarjeta de triaje + Медкарта + Karta segregacyjna + Karta Triage Tourniquet - Tourniquet + Aderpresse + Torniquete + Жгут + Škrtidlo + Staza + Garrot Remove Tourniquet - Entferne Tourniquet + Aderpresse entfernen + Quitar torniquete + Снять жгут + Sundat škrtidlo + Zdejmij stazę + Enlever le garrot Give Blood IV (1000ml) + Bluttransfusion IV (1000ml) + Dar Sangre IV (1000ml) + Дать кровь для в/в вливания (1000 мл) + Podaj krew IV (1000ml) + Mettre une poche de Sang IV (1000ml) + Podat krev. transfúzi (1000ml) Give Blood IV (500ml) + Bluttransfusion IV (500ml) + Dar Sangre IV (500ml) + Дать кровь для в/в вливания (500 мл) + Podaj krew IV (500ml) + Mettre une poche de Sang IV (500ml) + Podat krev. transfúzi (500ml) Give Blood IV (250ml) + Bluttransfusion IV (250ml) + Dar Sangre IV (250ml) + Дать кровь для в/в вливания (250 мл) + Podaj krew IV (250ml) + Mettre une poche de Sang IV (250ml) + Podat krev. transfúzi (250ml) Give Plasma IV (1000ml) + Plasmatransfusion IV (1000ml) + Dar Plasma IV (1000ml) + Дать плазму для в/в вливания (1000 мл) + Podaj osocze IV (1000ml) + Mettre une poche de Plasma IV (1000ml) + Podat plazmu (1000ml) Give Plasma IV (500ml) + Plasmatransfusion IV (500ml) + Dar Plasma IV (500ml) + Дать плазму для в/в вливания (500 мл) + Podaj osocze IV (500ml) + Mettre une poche de Plasma IV (500ml) + Podat plazmu (500ml) Give Plasma IV (250ml) + Plasmatransfusion IV (250ml) + Dar Plasma IV (250ml) + Дать плазму для в/в вливания (250 мл) + Podaj osocze IV (250ml) + Mettre une poche de Plasma IV (250ml) + Podat plazmu (250ml) Give Saline IV (1000ml) + Kochsaltzlösung IV (1000ml) + Dar Salino IV (1000ml) + Дать физраствор для в/в вливания (1000 мл) + Podaj solankę IV (1000ml) + Mettre une poche de Saline IV (1000ml) + Podaz fyz. roztok (1000ml) Give Saline IV (500ml) + Kochsaltzlösung IV (500ml) + Dar Salino IV (500ml) + Дать физраствор для в/в вливания (500 мл) + Podaj solankę IV (500ml) + Mettre une poche de Saline IV (500ml) + Podaz fyz. roztok (500ml) Give Saline IV (250ml) + Kochsaltzlösung IV (250ml) + Dar Salino IV (250ml) + Дать физраствор для в/в вливания (250 мл) + Podaj solankę IV (250ml) + Mettre une poche de Saline IV (250ml) + Podaz fyz. roztok (250ml) Minor Gering + Menor + Незначительные травмы + Normalny + Mineur + Minimální Delayed + Retrasado + Груз 300 + Opóźniony + Délayé + Verzögert + Odložitelný Immediate + Inmediato + Помощь отложена + Natychmiastowy + Immédiat + Sofort + Okamžiý Deceased + Fallecido + Груз 200 + Nie żyje + Décédé + Verstorben + Mrtvý None + Ninguno + Нет + Brak + Aucun + Keine + Nic Normal breathing @@ -294,13 +462,17 @@ Respiración normal Respiration Normale Normalny oddech + Normale Atmung + Dýchá normálně No breathing + Keine Atmung Дыхания нет No respira Apnée Brak oddechu + Nedýchá Difficult breathing @@ -308,52 +480,71 @@ Dificultad para respirar Difficultée Respiratoire Trudności z oddychaniem + Schwere Atmung + Dýchá s obtížemi Almost no breathing + Fast keine Atmung Дыхания почти нет - Casi sin respirar + Casi sin respiración Respiration Faible Prawie brak oddechu + Skoro nedýchá Bleeding + Blutet Кровотечение Sangrando Seignement Krwawienie zewnętrzne + Krvácí In Pain + Hat Schmerzen Испытывает боль - Con Dolor + Con dolor A De La Douleur W bólu + V bolestech Lost a lot of Blood + Hat eine große Menge Blut verloren Большая кровопотеря - Mucha Sangre perdida + Mucha sangre perdida A Perdu Bcp de Sang Stracił dużo krwi + Ztratil hodně krve Tourniquet [CAT] + Aderpresse [CAT] Жгут Torniquete [CAT] Garot [CAT] - Opaska uciskowa [CAT] + Staza [typ. CAT] + Škrtidlo [CAT] Receiving IV [%1ml] + Erhalte IV [%1ml] + Reciviendo IV [%1ml] + Принимается переливание [%1 мл] + Otrzymywanie IV [%1ml] + Réception IV [%1ml] + Přijímání transfúze [%1ml] - Bandage (Basic) + Bandage (Standard) Повязка (обычная) Vendaje (Básico) Bandage (Standard) Bandaż (jałowy) + Bandáž (standartní) Used to cover a wound @@ -361,79 +552,72 @@ Utilizado para cubrir una herida Utilisé Pour Couvrir Une Blessure Używany w celu przykrycia i ochrony miejsca zranienia + Verwendet, um Wunden abzudecken - A dressing, that is a particular material used to cover a wound, which is applied over the wound - once bleeding has been stemmed. - + A dressing, that is a particular material used to cover a wound, which is applied over the wound once bleeding has been stemmed. + Ein Verband, der aus einem besonderen Material besteht um die Wunde zu schützen, nachdem die Blutung gestoppt wurde. Повязка, накладываемая поверх раны после остановки кровотечения. - Un apósito, material específico utilizado para cubrir una herida, se aplica sobre la herida una vez - ha dejado de sangrar. - - C'est un bandage, qui est fait d'un matériel spécial utiliser pour couvrir une blessure, qui peut - etre appliquer des que le seignement as ete stopper. - - Opatrunek materiałowy, używany do przykrywania ran, zakładany na ranę po zatamowaniu krwawienia. - + Un apósito, material específico utilizado para cubrir una herida, se aplica sobre la herida una vez ha dejado de sangrar. + C'est un bandage, qui est fait d'un matériel spécial utiliser pour couvrir une blessure, qui peut etre appliquer des que le seignement as ete stopper. + Opatrunek materiałowy, używany do przykrywania ran, zakładany na ranę po zatamowaniu krwawienia. Packing Bandage + Mullbinde Тампонирующая повязка - Vendaje Compresivo + Vendaje compresivo Bandage Mèche Bandaż (uciskowy) Used to pack medium to large wounds and stem the bleeding + Verwendet, um mittlere bis große Wunden abzudecken und Blutungen zu stoppen Для тампонирования ран среднего и большого размера и остановки кровотечения. - Se utiliza para vendar heridas medianas y grandes y detener el sangrado + Se utiliza para vendar heridas medianas o grandes y detener el sangrado Utiliser pour remplire la cavité créé dans une blessure moyenne et grande. Używany w celu opatrywania średnich i dużych ran oraz tamowania krwawienia. - 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. - - Un bandage servent a etre inseré dans les blessure pour éponger le seignement et faciliter la - guerrison. Ce bandage est une option pour soigner les lession de politrauma. - + 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. + Un bandage servent a etre inseré dans les blessure pour éponger le seignement et faciliter la guerrison. Ce bandage est une option pour soigner les lession de politrauma. Opatrunek stosowany w celu zatrzymania krwawienia i osłony większych ran. Bandage (Elastic) + Bandage (Elastisch) Повязка (давящая) Vendaje (Elástico) Bandage (Élastique) Bandaż (elastyczny) + Bandáž (elastická) Bandage kit, Elastic + Elastische Binde (Kompressionsbinde) Давящая повязка - Vendaje (Elástico) + Kit de vendaje (Elástico) Bandage Compressif Élastique Zestaw bandaży elastycznych. - + Allows an even compression and extra support to the injured area. + - Ce bandage peut etre utiliser pour compresser la plaie afin de ralentire le seignement et assurer la - tenue du bandage lors de mouvment. - + Ce bandage peut etre utiliser pour compresser la plaie afin de ralentire le seignement et assurer la tenue du bandage lors de mouvment. Elastyczna opaska podtrzymująca opatrunek oraz usztywniająca okolice stawów. Brinda una compresión uniforme y ofrece soporte extra a una zona lesionada Tourniquet (CAT) + Aderpresse (CAT) Жгут Torniquete (CAT) Garot (CAT) Staza (typ. CAT) + Škrtidlo (CAT) Slows down blood loss when bleeding @@ -441,48 +625,49 @@ Reduce la velocidad de pérdida de sangre Ralentit le seignement Zmniejsza ubytek krwi z kończyn w przypadku krwawienia. + Verringert den Blutverlust während einer Blutung - A constricting device used to compress venous and arterial circulation in effect inhibiting or - slowing blood flow and therefore decreasing loss of blood. - - Жгут используется для прижатия сосудов, приводящего к остановке или значительному уменьшению - кровотечения и сокращению кровопотери. - - Dispositivo utilizado para eliminar el pulso distal y de ese modo controlar la pérdida de sangre - + A constricting device used to compress venous and arterial circulation in effect inhibiting or slowing blood flow and therefore decreasing loss of blood. + Жгут используется для прижатия сосудов, приводящего к остановке или значительному уменьшению кровотечения и сокращению кровопотери. + Dispositivo utilizado para eliminar el pulso distal y de ese modo controlar la pérdida de sangre Un appareil servent a compresser les artères et veines afin de reduire la perte de sang. - Opaska zaciskowa CAT służy do tamowanie krwotoków w sytuacji zranienia kończyn z masywnym - krwawieniem tętniczym lub żylnym. - + 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. Morphine autoinjector - Морфин в автоматическом шприце + Morphium Autoinjektor + Морфин в пневмошприце Morfina auto-inyectable Auto-injecteur de Morphine Autostrzykawka z morfiną + Autoinjektor morfin Used to combat moderate to severe pain experiences + Wird verwendet um moderate bis starke Schmärzen zu lindern. Для снятия средних и сильных болевых ощущений. - Usado para combatir los estados dolorosos moderados a severos + Usado para combatir los estados dolorosos de moderados a severos Utiliser pour contrer les douleurs modéré à severes. Morfina. Ma silne działanie przeciwbólowe. An analgesic used to combat moderate to severe pain experiences. Анальгетик для снятия средних и сильных болевых ощущений. - Analgésico usado para combatir los estados dolorosos de moderado a severo. + Analgésico usado para combatir los estados dolorosos de moderados a severos. Un Analgésique puissant servant a contrer les douleur modéré a severe. Organiczny związek chemiczny z grupy alkaloidów. Ma silne działanie przeciwbólowe. + Ein Schmerzmittel um mäßige bis starke Schmerzen zu behandeln Atropin autoinjector - Атропин в автоматическом шприце + Атропин в пневмошприце Atropina auto-inyectable Auto-injecteur d'Atropine Autostrzykawka AtroPen + Atropin Autoinjektor + Autoinjektor atropin Used in NBC scenarios @@ -490,22 +675,24 @@ Usado en escenarios NBQ Utiliser en cas d'attaque CBRN Atropina. Stosowana jako lek rozkurczowy i środek rozszerzający źrenice. + Verwendet bei ABC Kontamination A drug used by the Military in NBC scenarios. Препарат, используемый в войсках для защиты от оружия массового поражения. - Medicamento usado por Militares en escenarios NBQ + Medicamento usado por militares en escenarios NBQ 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. - + 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. Epinephrine autoinjector - Адреналин в автоматическом шприце + Адреналин в пневмошприце Epinefrina auto-inyectable Auto-injecteur d'épinéphrine Autostrzykawka EpiPen + Epiniphrin Autoinjektor + Autoinjektor adrenalin Increase heart rate and counter effects given by allergic reactions @@ -513,36 +700,22 @@ Aumenta la frecuencia cardiaca y contraresta los efectos de las reacciones alérgicas Augmente la Fréquance cadiaque et contré les effet d'une reaction 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 - 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. - - Препарат, вызывающий симпатическую реакцию, приводящую к расширению бронхов, увеличению частоты - сердечных сокращений и купированию аллергических реакций (анафилактического шока). Применяется при - остановке сердца с уменьшением вероятности благоприятного исхода. - - 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. - - Un medicament qui fonctione sur le systeme sympatique créan une dilatation des bronches, augmente la - fréquance cardiaque et contre les effet d'une reaction alergique (anaphylaxie). Utiliser lors d'arret - cardio-respiratoire pour augmenté les chances retrouver un ryhtme. - - 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. - + 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. + Препарат, вызывающий симпатическую реакцию, приводящую к расширению бронхов, увеличению частоты сердечных сокращений и купированию аллергических реакций (анафилактического шока). Применяется при остановке сердца с уменьшением вероятности благоприятного исхода. + 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. + Un medicament qui fonctione sur le systeme sympatique créan une dilatation des bronches, augmente la fréquance cardiaque et contre les effet d'une reaction alergique (anaphylaxie). Utiliser lors d'arret cardio-respiratoire pour augmenté les chances retrouver un ryhtme. + 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. Plasma IV (1000ml) Плазма для в/в вливания (1000 мл) - Plasma Intravenoso (1000ml) + Plasma IV (1000ml) Plasma Sanguin IV (1000ml) Osocze IV (1000ml) + Plasma IV (1000ml) A volume-expanding blood supplement. @@ -561,328 +734,416 @@ Plasma IV (500ml) Плазма для в/в вливания (500 мл) - Plasma Intravenoso (500ml) + Plasma IV (500ml) Plasma Sanguin IV (500ml) Osocze IV (500ml) + Plasma IV (500ml) Plasma IV (250ml) Плазма для в/в вливания (250 мл) - Plasma Intravenoso (250ml) + Plasma IV (250ml) Plasma Sanguin (250ml) Osocze IV (250ml) + Plasma IV (250ml) Blood IV (1000ml) Кровь для переливания (1000 мл) - Sangre Intravenosa (1000ml) + Sangre IV (1000ml) Cullot Sanguin IV (1000ml) Krew IV (1000ml) + Blut IV (1000ml) Blood IV, for restoring a patients blood (keep cold) Пакет крови для возмещения объема потерянной крови (хранить в холодильнике) - Sangre Intravenosa, para restarurar el volumen sanguíneo (mantener frío) + Sangre intravenosa, para restarurar el volumen sanguíneo (mantener frío) Cullot Sanguin IV, pour remplacer le volume sanguin (garder Réfrigeré) Krew IV, używana do uzupełnienia krwi u pacjenta, trzymać w warunkach chłodniczych - O Negative infusion blood used in strict and rare events to replenish blood supply usually - conducted in the transport phase of medical care. - - Кровь I группы, резус-отрицательная, применяется по жизненным показаниям для возмещения объема - потерянной крови на догоспитальном этапе оказания медицинской помощи. - - 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 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 perdido. Uso - habitual durante el transporte de heridos. - + O Negative infusion blood used in strict and rare events to replenish blood supply usually conducted in the transport phase of medical care. + Кровь I группы, резус-отрицательная, применяется по жизненным показаниям для возмещения объема потерянной крови на догоспитальном этапе оказания медицинской помощи. + 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 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. Blood IV (500ml) Кровь для переливания (500 мл) - Sangre Intravenosa (500ml) + Sangre IV (500ml) Cullot Sanguin IV (500ml) Krew IV (500ml) + Blut IV (500ml) Blood IV (250ml) Кровь для переливания (250 мл) - Sangre Intravenosa (250ml) + Sangre IV (250ml) Cullot Sanguin IV (250ml) Krew IV (250ml) + Blut IV (250ml) Saline IV (1000ml) Физраствор для в/в вливания (1000 мл) - Solución Salina Intravenosa (1000ml) + Solución Salina IV (1000ml) solution Saline 0.9% IV (1000ml) Solanka 0,9% IV (1000ml) + Kochsalzlösung (1000ml) Saline IV, for restoring a patients blood Пакет физраствора для возмещения объема потерянной крови - Solución Salina Intravenosa, para restaurar el volumen sanguíneo + Solución salina intravenosa, para restaurar el volumen sanguíneo Solution Saline 0.9% IV, pour retablir temporairement la tention arteriel Solanka 0,9%, podawana dożylnie (IV), używana w celu uzupełnienia krwi u pacjenta - A medical volume-replenishing agent introduced into the blood system through an IV infusion. - - Пакет физиологического раствора для возмещения объема потерянной крови путем внутривенного - вливания. - + 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 remplacment temporaire pour rétablir la tention artériel lors de perte sanguine, étant ajouter - par intraveineuse - - 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). - + Un remplacment temporaire pour rétablir la tention artériel lors de perte sanguine, étant ajouter par intraveineuse + 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). Saline IV (500ml) Физраствор для в/в вливания (500 мл) - Solución Salina Intravenosa (500ml) + Salino IV (500ml) Solution Saline 0.9% IV (500ml) Solanka 0,9% IV (500ml) + Kochsalzlösung (500ml) Saline IV (250ml) Физраствор для в/в вливания (250 мл) - Solución Salina Intravenosa (250ml) + Salino IV (250ml) Solution Saline 0.9% IV (250ml) Solanka 0,9% IV (250ml) + Kochsalzlösung (250ml) Basic Field Dressing (QuikClot) Первичный перевязочный пакет (QuikClot) - Vendaje Básico (Coagulante) + Vendaje básico (QuickClot) Bandage Regulier (Coagulant) - Opatrunek QuikClot + Podstawowy pakiet opatrunkowy (QuikClot) + Verbandpäckchen(Gerinnungsmittel) QuikClot bandage Гемостатический пакет QuikClot - Venda Coagulante + Vendaje QuikClot Bandage coagulant - Podstawowy opatrunek stosowany na rany + Hemostatyczny pakiet QuikClot. Podstawowy opatrunek stosowany na rany. + Bandage mit Gerinnungsmittel - + Hemostatic bandage with coagulant that stops bleeding. Un bandage servant a coaguler les seignements mineur à moyen. - Proszkowy opatrunek adsorbcyjny przeznaczony do tamowania zagrażających życiu krwawień średniej i - dużej intensywności. - - Vendaje Hemostático con coagulante que detiene el sangrado. + 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. Personal Aid Kit Аптечка - Kit de Soporte Vital Avanzado + Botiquín de primeros auxilios Équipement de support Vitale Apteczka osobista + Persönliches Verbandpäckchen Includes various treatment kit needed for stitching or advanced treatment - Содержит различные материалы и инструменты для зашивания ран и оказания специальной медпомощи. - + Содержит различные материалы и инструменты для зашивания ран и оказания специальной медпомощи. Incluye material médico para tratamientos avanzados Inclue du matériel medical pour les traitement avancé, tel les point 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. + W znacznym stopniu poprawia stan pacjenta Surgical Kit + Kit de chirurgien Хирургический набор - Kit Quirúrgico + Kit quirúrgico + Zestaw do szycia ran + Operationsset Surgical Kit for in field advanced medical treatment + Kit de chirurgien pour les soins avancés sur le terrain Набор для хирургической помощи в полевых условиях - Kit Quirúrgico para el tratamiento avanzado en el campo de batalla + 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 Surgical Kit for in field advanced medical treatment Набор для хирургической помощи в полевых условиях - Kit Quirúrgico para el tratamiento avanzado en el campo de batalla + 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 Bodybag + Sac à corps Мешок для трупов Bolsa para cadáveres + Worek na zwłoki + Leichensack A bodybag for dead bodies + Un sac pour les cadavres Мешок для упаковки трупов - Bolsa para cadáveres + Una bolsa para cadáveres + Worek do pakowania zwłok + Ein Leichensack für Tote A bodybag for dead bodies + Un sac pour les cadavres Мешок для упаковки трупов - Bolsa para cadáveres + Una bolsa para cadáveres + Worek do pakowania zwłok + Ein Leichensack für Tote - Blood Pressure + Pression sanguine Артериальное давление - Presión Arterial + Presión arterial + Ciśnienie krwi + Blutdruck Checking Blood Pressure.. + Vérification de la pression sanguine Проверка артериального давления... - Comprobando Presión Arterial... + Comprobando presión arterial... + Sprawdzanie ciśnienia krwi... + Blutdruck kontrollieren... You checked %1 + Vous diagnostiquez %1 Вы осмотрели раненого %1 Examinando a %1 + Zbadałeś %1 + Kontrolliert %1 You find a blood pressure of %2/%3 + Vous pris une pression sanguine de %2/%3 Артериальное давление %2/%3 - La Presión Arterial es %2/%3 + La presión arterial es %2/%3 + Ciśnienie krwi wynosi %2/%3 + Blutdruck ist %2/%3 You find a low blood pressure + Vous avez trouvé une pression sanguine base Давление низкое - La Presión Arterial es baja + La presión arterial es baja + Wyczuwasz niskie ciśnienie krwi + Blutdruck ist niedrig You find a normal blood pressure + Vous avez trouvé une pression sanguine normale Давление нормальное - La Presión Arterial es normal + La presión arterial es normal + Wyczuwasz normalne ciśnienie krwi + Blutdruck ist normal You find a high blood pressure + Vous avez trouvé une forte pression sanguine Давление высокое - La Presión Arterial es alta + La presión arterial es alta + Wyczuwasz wysokie ciśnienie krwi + Blutdruck ist hoch You find no blood pressure + Vous n'avez pas trouvé de pression sanguine Давления нет - No hay Presión Arterial + No hay presión arterial + Nie wyczuwasz ciśnienia krwi + Patient hat keinen Blutdruck You fail to find a blood pressure + Vous avez raté le diagnostique de la pression sanguine Артериальное давление не определяется - No puedes encontrar Presión Arterial + No puedes encontrar presión arterial + Nie udało Ci się sprawdzić ciśnienia krwi + Blutdruck konnte nicht gefunden werden Pulse + Pulsations Пульс Pulso + Tętno + Puls Checking Heart Rate.. + Diagnostique de la fréquence cardiaque Проверка пульса... - Comprobando Pulso... + Comprobando ritmo cardíaco... + Sprawdzanie tętna... + Kontrolliere Herzfrequenz You checked %1 + Vous avez Diagnostiqué %1 Вы осмотрели раненого %1 Examinando a %1 + Zbadałeś %1 + Kontrolliertt %1 You find a Heart Rate of %2 + Vous avez trouvé une fréquence cardiaque de %2 Пульс %2 уд./мин. - El Pulso es %2 + El ritmo cardíaco es de %2 + Wyczuwasz tętno o wartości %2 + Herzfrequenz ist %2 You find a weak Heart Rate + Vous avez trouvé une faible fréquence cardiaque Пульс слабый - El Pulso es débil + El ritmo cardíaco es débil + Wyczuwasz słabe tętno + Schwacher Puls You find a strong Heart Rate + Vous avez trouvé une forte fréquence cardiaque Пульс учащенный - El Pulso está acelerado + El ritmo cardíaco está acelerado + Wyczuwasz silne tętno + Starker Puls You find a normal Heart Rate + Vous avez trouvé une fréquence cardiaque normale Пульс в норме - El Pulso es bueno + El ritmo cardíaco es bueno + Wyczuwasz normalne tętno + Normaler Puls You find no Heart Rate + Vous n'avez trouvé de fréquence cardiaque Пульс не прощупывается - No tiene Pulso + No tiene ritmo cardíaco + Wyczuwasz brak tętna + Kein Puls gefunden Response + Réponse Реакция - Reacciona + Respuesta + Przytomność + Ansprechbarkeit You check response of patient + Vous vérifiez la réponse du patient Вы проверяете реакцию раненого Compruebas si el paciente reacciona + Sprawdzasz przytomność pacjenta + Du prüfst ob der Patient ansprechbar ist %1 is responsive + %1 est conscient %1 реагирует на раздражители %1 ha reaccionado + %1 jest przytomny + %1 ist anprechbar %1 is not responsive + %1 n'est pas conscient %1 не реагирует %1 no reacciona + %1 jest nieprzytomny + %1 ist nicht ansprechbar You checked %1 + Vous diagnostiqué %1 Вы осмотрели раненого %1 Examinas a %1 + Zbadałeś %1 + Du versucht %1 anzusprechen Bandaged + Bandé Повязка наложена Vendado + Zabandażowano You bandage %1 (%2) + Vous bandez %1 (%2) Вы перевязали раненого %1 (%2) Aplicas vendaje a %1 en %2 + Bandażujesz %1 (%2) %1 is bandaging you + %1 vous bande %1 перевязывает вас %1 te está vendando + %1 bandażuje Ciebie You start stitching injures from %1 (%2) Вы зашиваете ранения от %1 (%2) Estás suturando heridas de %1 en %2 + Zszywasz rany %1 (%2) Stitching Наложение швов Suturando + Szycie You treat the airway of %1 Вы интубируете раненого %1 Estás intubando a %1 + Udrażniasz drogi oddechowe %1 Airway Дыхательные пути - Vías Aéreas + Vías aéreas + Drogi oddechowe + Atemwege %1 is treating your airway %1 проводит вам интубацию %1 te está intubando + %1 udrażnia Twoje drogi oddechowe Drag @@ -946,29 +1207,59 @@ Unload patient + Descargar el paciente + Выгрузить пациента + Wyładuj pacjenta + Décharger le patient Load patient + Cargar el paciente en + Погрузить пациента + Załaduj pacjenta + Charger le patient Place body in bodybag + Colocar cuerpo en bolsa para cadáveres + Поместить тело в мешок + Zapakuj ciało do worka na zwłoki + Placer le corps dans le sac à cadavre Placing body in bodybag + Colocando cuerpo en bolsa para cadáveres + Помещение тела в мешок ... + Pakowanie ciała do worka na zwłoki + Mise en sac du corps dans le sac à cadavre - %1 has bandaged patient + %1 has vendado al paciente + %1 перевязал пациента + %1 zabandażował pacjenta + %1 à bandé un patient %1 used %2 + %1 usó %2 + %1 применил %2 + %1 użył %2 + %1 utilise %2 %1 has given an IV + %1 has puesto una IV + %1 провел переливание + %1 podał IV + %1 à donné un IV %1 applied a tourniquet + %1 aplicado torniquete + %1 наложил жгут + %1 założył stazę + %1 à appliqué un garrot - - + \ No newline at end of file diff --git a/addons/microdagr/functions/fnc_updateDisplay.sqf b/addons/microdagr/functions/fnc_updateDisplay.sqf index af577049a0..2a5f34a12c 100644 --- a/addons/microdagr/functions/fnc_updateDisplay.sqf +++ b/addons/microdagr/functions/fnc_updateDisplay.sqf @@ -1,4 +1,4 @@ -/* +/* * Author: PabstMirror * Updates the display (several times a second) called from the pfeh * @@ -53,7 +53,7 @@ case (APP_MODE_INFODISPLAY): { _compassAngleText = if (GVAR(settingUseMils)) then { [(floor ((6400 / 360) * (getDir ace_player))), 4, 0] call CBA_fnc_formatNumber; } else { - ([(floor (getDir ace_player)), 3, 1] call CBA_fnc_formatNumber) + "" //degree symbol is in UTF-8 + ([(floor (getDir ace_player)), 3, 1] call CBA_fnc_formatNumber) + "°" //degree symbol is in UTF-8 }; (_display displayCtrl IDC_MODEDISPLAY_HEADINGNUM) ctrlSetText _compassAngleText; @@ -92,7 +92,7 @@ case (APP_MODE_INFODISPLAY): { _bearingText = if (GVAR(settingUseMils)) then { [(floor ((6400 / 360) * (_bearing))), 4, 0] call CBA_fnc_formatNumber; } else { - ([(floor (_bearing)), 3, 1] call CBA_fnc_formatNumber) + "" //degree symbol is in UTF-8 + ([(floor (_bearing)), 3, 1] call CBA_fnc_formatNumber) + "°" //degree symbol is in UTF-8 }; _2dDistanceKm = ((GVAR(gpsPositionASL) select [0,2]) distance (_targetPosLocationASL select [0,2])) / 1000; _rangeText = format ["%1km", ([_2dDistanceKm, 1, 1] call CBA_fnc_formatNumber)]; @@ -112,7 +112,7 @@ case (APP_MODE_COMPASS): { _compassAngleText = if (GVAR(settingUseMils)) then { [(floor ((6400 / 360) * (getDir ace_player))), 4, 0] call CBA_fnc_formatNumber; } else { - ([(floor (getDir ace_player)), 3, 1] call CBA_fnc_formatNumber) + "M" //degree symbol is in UTF-8 + ([(floor (getDir ace_player)), 3, 1] call CBA_fnc_formatNumber) + "°" //degree symbol is in UTF-8 }; (_display displayCtrl IDC_MODECOMPASS_HEADING) ctrlSetText _compassAngleText; @@ -149,7 +149,7 @@ case (APP_MODE_COMPASS): { _bearingText = if (GVAR(settingUseMils)) then { [(floor ((6400 / 360) * (_bearing))), 4, 0] call CBA_fnc_formatNumber; } else { - ([(floor (_bearing)), 3, 1] call CBA_fnc_formatNumber) + "M" //degree symbol is in UTF-8 + ([(floor (_bearing)), 3, 1] call CBA_fnc_formatNumber) + "°" //degree symbol is in UTF-8 }; _2dDistanceKm = ((GVAR(gpsPositionASL) select [0,2]) distance (_targetPosLocationASL select [0,2])) / 1000; _rangeText = format ["%1km", ([_2dDistanceKm, 1, 1] call CBA_fnc_formatNumber)]; diff --git a/addons/microdagr/stringtable.xml b/addons/microdagr/stringtable.xml index 772a7a172f..fa247f9986 100644 --- a/addons/microdagr/stringtable.xml +++ b/addons/microdagr/stringtable.xml @@ -1,109 +1,236 @@  - + - - - MicroDAGR GPS - - - MicroDAGR advanced GPS receiver - - - Angular Unit: - - - Mils - - - Show Waypoints On Map: - - - Degrees - - - On - Zapnuto - Oui - Ein - - Wł. - Ativar - Вкл. - - - - Off - Vypnuto - Non - Aus - No - Wył. - Desativar - Выкл. - No - - - Enter Grid Cords: - - - Name of [%1] - - - MGRS-New - - - WGD - - - Range: - Reichweite: - - - Compass Direction - - - Mark - - - Waypoints - Wegpunkte - - - Connect To - - - Settings - Einstellungen - Configuración - - - SetWP - - - Add - - - Delete - Smazat - Supprimer - Löschen - Elimina - Usuń - Excluir - Удалить - Suprimir - - - Toggle MicroDAGR Display Mode - - - Show MicoDAGR - - - Configure MicroDAGR - - - Close MicroDAGR - - + + + MicroDAGR GPS + MicroDAGR GPS + GPS MicroDAGR + MicroDAGR GPS + MicroDAGR GPS + MicroDAGR GPS + GPS MicroDAGR + + + MicroDAGR advanced GPS receiver + MicroDAGR verbesserter GPS Empfänger + Receptor avanzado GPS MicroDAGR + Многофункциональный GPS-приёмник. + Zaawansowany odbiornik GPS MicroDAGR + MicroDAGR un GPS avancé + MicroDAGR pokročílá GPS příjímač + + + Angular Unit: + Unidad angular: + Угловые единицы: + Jednostka kątowa: + Unité angulaire: + Winkeleinheit: + Úhlová jednotka: + + + Mils + Mils + Mils + Тысячные + Tysiączne + Mils + Mils + + + Show Waypoints On Map: + Zeige Wegpunkte auf Karte + Mostrar puntos de ruta en el mapa: + Показывать маршрутные точки на карте: + Pokaż PT na mapie: + Afficher les points de passage sur la carte : + Ukázat waypointy na mapě: + + + Degrees + Grad + Grados + Градусы + Stopnie + Degrés + Stupně + + + On + Zapnuto + Oui + Ein + + Wł. + Ativar + Вкл. + Encendido + + + Off + Vypnuto + Non + Aus + No + Wył. + Desativar + Выкл. + Apagado + + + Enter Grid Cords: + Introducir coordenadas de cuadrícula: + Введите координаты: + Wprowadź współrzędne: + Entrer Grid Cords : + Koordinaten eingeben: + Napiš souřadnice: + + + Name of [%1] + Name von [%1] + Nombre de [%1] + Название [%1] + Nazwa [%1] + Nom de [%1] + Název [%1] + + + MGRS-New + MGRS-NEU + Nuevo-MGRS + MGRS-Новая + MGRS-Nowy + Nouveau MGRS + MGRS-Nový + + + WGD + WGD + WGD + WGD + WGD + WGD + WGD + + + Range: + Distancia: + Reichweite: + Дистанция: + Dystans: + Distance : + Vzdálenost: + + + Compass Direction + Kompass Richtung + Dirección de la brújula + Азимут + Azymut + Direction de la boussole + Azimut: + + + Mark + Markieren + Marca + Отметка + Oznacz + Marqueur + Označit + + + Waypoints + Puntos de ruta + Wegpunkte + Машрутные точки + Waypointy + Punkty trasy + Point de passage + + + Connect To + Conectar a + Соединиться с + Verbinde zu + Připojit k + Podłącz do + Connexion à + + + Settings + Paramètres + Einstellungen + Configuración + Настройки + Nastavení + Ustawienia + + + SetWP + WP setzen + Establecer PR + Установить МТ + Nastavit WP + UstawPT + + + Add + Hinzufügen + Añadir + Добавить + Přidat + Dodaj + Ajouter + + + Delete + Smazat + Supprimer + Löschen + Elimina + Usuń + Excluir + Удалить + Borrar + + + Toggle MicroDAGR Display Mode + MicoDAGR Anzeigemodus wählen + Conmutar modo de pantalla del MicroDAGR + Сменить режим показа MicroDAGR + Przełącz tryb wyświetlania MicroDAGR + Basculer sur l'affichage du MicroDAGR + Přepnout zobrazení MircroDAGRu + + + Show MicoDAGR + Zeige MicroDAGR + Mostrar MicroDAGR + Показать MicroDAGR + Ukázat MicroDAGR GPS + Pokaż MicroDAGR + Afficher le MicroDAGR + + + Configure MicroDAGR + Konfiguriere MicroDAGR + Configurar MicroDAGR + Настроить MicroDAGR + Konfigurovat MicroDAGR GPS + Konfiguruj MicroDAGR + Configurer le MicroDAGR + + + Close MicroDAGR + Schließe MicroDAGR + Cerrar MicroDAGR + Закрыть MicroDAGR + Zavřít MicroDAGR GPS + Zamknij MicroDAGR + Fermer le MicroDAGR + + \ No newline at end of file diff --git a/addons/missileguidance/ACE_GuidanceConfig.hpp b/addons/missileguidance/ACE_GuidanceConfig.hpp new file mode 100644 index 0000000000..4c0122c8e4 --- /dev/null +++ b/addons/missileguidance/ACE_GuidanceConfig.hpp @@ -0,0 +1,61 @@ +class GVAR(AttackProfiles) { + class LIN { + name = ""; + visualName = ""; + description = ""; + + functionName = QFUNC(attackProfile_LIN); + }; + class DIR { + name = ""; + visualName = ""; + description = ""; + + functionName = QFUNC(attackProfile_DIR); + }; + class MID { + name = ""; + visualName = ""; + description = ""; + + functionName = QFUNC(attackProfile_MID); + }; + class HI { + name = ""; + visualName = ""; + description = ""; + + functionName = QFUNC(attackProfile_HI); + }; + class TOP { + name = ""; + visualName = ""; + description = ""; + + functionName = QFUNC(attackProfile_TOP); + }; + class PYM { + name = ""; + visualName = ""; + description = ""; + + functionName = QFUNC(attackProfile_PYM); + }; +}; + +class GVAR(SeekerTypes) { + class SALH { + name = ""; + visualName = ""; + description = ""; + + functionName = QFUNC(seekerType_SALH); + }; + class Optic { + name = ""; + visualName = ""; + description = ""; + + functionName = QFUNC(seekerType_Optic); + }; +}; diff --git a/addons/missileguidance/ACE_Settings.hpp b/addons/missileguidance/ACE_Settings.hpp new file mode 100644 index 0000000000..060bde199b --- /dev/null +++ b/addons/missileguidance/ACE_Settings.hpp @@ -0,0 +1,9 @@ +class ACE_Settings { + class GVAR(enabled) { + value = 1; + typeName = "BOOL"; + isClientSetable = 1; + displayName = "$STR_ACE_MissileGuidance"; + description = "$STR_ACE_MissileGuidance_Desc"; + }; +}; \ No newline at end of file diff --git a/addons/missileguidance/CfgAmmo.hpp b/addons/missileguidance/CfgAmmo.hpp index df876ae2ae..5aaee5ff2f 100644 --- a/addons/missileguidance/CfgAmmo.hpp +++ b/addons/missileguidance/CfgAmmo.hpp @@ -1,10 +1,141 @@ +enum { + ACE_LOBL = 1, + ACE_LOAL = 2 +}; + class CfgAmmo { class MissileBase; 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; + 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" }; + }; + }; + + class ACE_Hydra70_DAGR : M_PG_AT { + displayName = "$STR_ACE_Hydra70_DAGR"; + displayNameShort = "$STR_ACE_Hydra70_DAGR_Short"; + + description = "$STR_ACE_Hydra70_DAGR"; + descriptionShort = "$STR_ACE_Hydra70_DAGR_Desc"; + }; + + class ACE_Hellfire_AGM114K : ACE_Hydra70_DAGR { + displayName = "$STR_ACE_Hellfire_AGM114K"; + displayNameShort = "$STR_ACE_Hellfire_AGM114K_Short"; + + description = "$STR_ACE_Hellfire_AGM114K_desc"; + descriptionShort = "$STR_ACE_Hellfire_AGM114K_desc"; + + // @TODO: placeholder model to at least make it look different + model = "\A3\Weapons_F\Ammo\Missile_AT_03_fly_F"; + proxyShape = "\A3\Weapons_F\Ammo\Missile_AT_03_F"; + + hit = 1400; + indirectHit = 71; + indirectHitRange = 4.5; + effectsMissile = "missile2"; + }; + + // Titan + class M_Titan_AT : MissileBase { + irLock = 0; + laserLock = 0; + airLock = 0; + + // Turn off arma crosshair-guidance + manualControl = 0; + + hit = 1400; + + // 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.25; // 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 = "Optic"; + seekerTypes[] = { "Optic" }; + + defaultSeekerLockMode = "LOBL"; + seekerLockModes[] = { "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[] = { "TOP", "LIN" }; + }; }; }; \ No newline at end of file diff --git a/addons/missileguidance/CfgEventhandlers.hpp b/addons/missileguidance/CfgEventhandlers.hpp index 2775490d11..49f067ff46 100644 --- a/addons/missileguidance/CfgEventhandlers.hpp +++ b/addons/missileguidance/CfgEventhandlers.hpp @@ -5,13 +5,13 @@ class Extended_PreInit_EventHandlers { }; class Extended_PostInit_EventHandlers { - class ADDON { + class ADDON { init = QUOTE(call COMPILE_FILE(XEH_post_init)); }; }; class Extended_FiredBIS_EventHandlers { - class AllVehicles { + class All { ADDON = QUOTE(_this call FUNC(fired)); }; }; \ No newline at end of file diff --git a/addons/missileguidance/CfgMagazines.hpp b/addons/missileguidance/CfgMagazines.hpp new file mode 100644 index 0000000000..31f4739417 --- /dev/null +++ b/addons/missileguidance/CfgMagazines.hpp @@ -0,0 +1,53 @@ +class CfgMagazines { + class 12Rnd_PG_missiles; + + class 6Rnd_ACE_Hydra70_DAGR : 12Rnd_PG_missiles { + ammo = "ACE_Hydra70_DAGR"; + count = 12; + displayName = "6 Round DAGR"; + displayNameShort = "6 Round DAGR"; + descriptionShort = "6 Round DAGR"; + weight = 36; + + }; + class 12Rnd_ACE_Hydra70_DAGR : 6Rnd_ACE_Hydra70_DAGR { + count = 12; + displayName = "16 Round DAGR"; + displayNameShort = "16 Round DAGR"; + descriptionShort = "16 Round DAGR"; + weight = 72; + }; + class 24Rnd_ACE_Hydra70_DAGR : 6Rnd_ACE_Hydra70_DAGR { + count = 24; + displayName = "24 Round DAGR"; + displayNameShort = "24 Round DAGR"; + descriptionShort = "24 Round DAGR"; + weight = 72; + }; + + // Hellfires + class 6Rnd_ACE_Hellfire_AGM114K : 12Rnd_PG_missiles { + count = 12; + ammo = "ACE_Hellfire_AGM114K"; + displayName = "6Rnd_ACE_Hellfire_AGM114K"; + displayNameShort = "6Rnd_ACE_Hellfire_AGM114K"; + descriptionShort = "6Rnd_ACE_Hellfire_AGM114K"; + weight = 36; + + }; + class 12Rnd_ACE_Hellfire_AGM114K : 6Rnd_ACE_Hydra70_DAGR { + count = 12; + displayName = "12Rnd_ACE_Hellfire_AGM114K"; + displayNameShort = "12Rnd_ACE_Hellfire_AGM114K"; + descriptionShort = "12Rnd_ACE_Hellfire_AGM114K"; + weight = 72; + }; + class 24Rnd_ACE_Hellfire_AGM114K : 6Rnd_ACE_Hydra70_DAGR { + count = 24; + displayName = "24Rnd_ACE_Hellfire_AGM114K"; + displayNameShort = "24Rnd_ACE_Hellfire_AGM114K"; + descriptionShort = "24Rnd_ACE_Hellfire_AGM114K"; + weight = 72; + }; + +}; \ No newline at end of file diff --git a/addons/missileguidance/CfgVehicles.hpp b/addons/missileguidance/CfgVehicles.hpp new file mode 100644 index 0000000000..7707717c9e --- /dev/null +++ b/addons/missileguidance/CfgVehicles.hpp @@ -0,0 +1,33 @@ +class CfgVehicles { + + class AllVehicles; + class Air: AllVehicles { + class Turrets; + }; + + class Helicopter: Air { + class Turrets { + class MainTurret; + }; + }; + class Helicopter_Base_F: Helicopter {}; + class Heli_Attack_01_base_F: Helicopter_Base_F {}; + class B_Heli_Attack_01_F : Heli_Attack_01_base_F { + class Turrets: Turrets { + class MainTurret; + }; + }; + + class ACE_Comanche_Test : B_Heli_Attack_01_F { + displayName = "ACE_Comanche_Test"; + author = "ACE Team"; + class Library { + libTextDesc = "ACE_Comanche_Test"; + }; + class Turrets: Turrets { + class MainTurret: MainTurret { + magazines[] = {"ACE_500Rnd_20mm_shells_Comanche", "24Rnd_ACE_Hellfire_AGM114K"}; + }; + }; + }; +}; diff --git a/addons/missileguidance/CfgWeapons.hpp b/addons/missileguidance/CfgWeapons.hpp index 739ef3c5e0..ab36d4dd52 100644 --- a/addons/missileguidance/CfgWeapons.hpp +++ b/addons/missileguidance/CfgWeapons.hpp @@ -6,29 +6,8 @@ class CfgWeapons { class RocketPods: LauncherCore { canLock = 1; }; - class missiles_DAGR: RocketPods { + class missiles_DAGR : RocketPods { canLock = 1; + magazines[] += {"24Rnd_ACE_Hydra70_DAGR", "12Rnd_ACE_Hydra70_DAGR", "6Rnd_ACE_Hydra70_DAGR", "24Rnd_ACE_Hellfire_AGM114K", "12Rnd_ACE_Hellfire_AGM114K", "6Rnd_ACE_Hellfire_AGM114K" }; }; - /* - class autocannon_Base_F: CannonCore { - canLock = 1; - }; - class cannon_120mm: CannonCore { - canLock = 1; - - class player : Mode_SemiAuto { - canLock = 1; - }; - }; - class gatling_25mm: CannonCore { - canLock = 1; - }; - class autocannon_35mm: CannonCore { - canLock = 1; - }; - - class launch_NLAW_F: Launcher_Base_F - { - canLock = 1; - };*/ }; \ No newline at end of file diff --git a/addons/missileguidance/Example_ACE_MissileGuidance.hpp b/addons/missileguidance/Example_ACE_MissileGuidance.hpp new file mode 100644 index 0000000000..400a3a9a41 --- /dev/null +++ b/addons/missileguidance/Example_ACE_MissileGuidance.hpp @@ -0,0 +1,65 @@ +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/XEH_post_init.sqf b/addons/missileguidance/XEH_post_init.sqf index 6904ee6c47..dc30361926 100644 --- a/addons/missileguidance/XEH_post_init.sqf +++ b/addons/missileguidance/XEH_post_init.sqf @@ -1,3 +1,2 @@ #include "script_component.hpp" -NO_DEDICATED; diff --git a/addons/missileguidance/XEH_pre_init.sqf b/addons/missileguidance/XEH_pre_init.sqf index 8aa557f838..403d6245ca 100644 --- a/addons/missileguidance/XEH_pre_init.sqf +++ b/addons/missileguidance/XEH_pre_init.sqf @@ -3,12 +3,24 @@ PREP(rotateVectLineGetMap); PREP(rotateVectLine); -PREP(translateToModelSpace); -PREP(translateToWeaponSpace); +PREP(checkSeekerAngle); +PREP(checkLos); PREP(fired); -PREP(guidance_DAGR); -PREP(guidance_LGB); -PREP(guidance_HellfireII); -FUNC(getPosASL) = {visiblePositionASL (_this select 0)}; \ No newline at end of file +PREP(guidancePFH); +PREP(doAttackProfile); +PREP(doSeekerSearch); + +// Attack Profiles +PREP(attackProfile_LIN); +PREP(attackProfile_DIR); +PREP(attackProfile_MID); +PREP(attackProfile_HI); +PREP(attackProfile_TOP); +PREP(attackprofile_PYM); +PREP(attackProfile_AIR); + +// Seeker search functions +PREP(seekerType_SALH); +PREP(seekerType_Optic); \ No newline at end of file diff --git a/addons/missileguidance/config.cpp b/addons/missileguidance/config.cpp index 0341a56df6..42b849b902 100644 --- a/addons/missileguidance/config.cpp +++ b/addons/missileguidance/config.cpp @@ -10,6 +10,11 @@ class CfgPatches { }; }; +#include "ACE_GuidanceConfig.hpp" +#include "ACE_Settings.hpp" + #include "CfgEventhandlers.hpp" #include "CfgAmmo.hpp" -#include "CfgWeapons.hpp" \ No newline at end of file +#include "CfgMagazines.hpp" +#include "CfgWeapons.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/missileguidance/functions/fnc_attackProfile_AIR.sqf b/addons/missileguidance/functions/fnc_attackProfile_AIR.sqf new file mode 100644 index 0000000000..d416b6a9e2 --- /dev/null +++ b/addons/missileguidance/functions/fnc_attackProfile_AIR.sqf @@ -0,0 +1,54 @@ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" + +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"]; +_seekerTargetPos = _this select 0; +_launchParams = _this select 1; + +_target = _launchParams select 0; +_targetLaunchParams = _launchParams select 1; + +_shooterPos = getPosASL _shooter; +_projectilePos = getPosASL _projectile; + +_distanceToTarget = _projectilePos vectorDistance _seekerTargetPos; +_distanceToShooter = _projectilePos vectorDistance _shooterPos; + +TRACE_2("", _distanceToTarget, _distanceToShooter); + +// Add height depending on distance for compensate +_addHeight = [0,0,0]; + +// Always climb an arc on initial launch if we are close to the round +if( ((ASLtoATL _projectilePos) select 2) < 5 && _distanceToShooter < 15) then { + _addHeight = _addHeight vectorAdd [0,0,_distanceToTarget]; +} else { + // If we are below the target, increase the climbing arc + if((_projectilePos select 2) < (_seekerTargetPos select 2) && _distanceToTarget > 100) then { + _addHeight = _addHeight vectorAdd [0,0, ((_seekerTargetPos select 2) - (_projectilePos select 2))]; + }; +}; + +// Handle arcing terminal low for high decent +if( (_projectilePos select 2) > (_seekerTargetPos select 2) && _distanceToTarget < 100) then { + _addHeight = _addHeight vectorDiff [0,0, ((_projectilePos select 2) - (_seekerTargetPos select 2))]; +} else { + if((_projectilePos select 2) > (_seekerTargetPos select 2) && _distanceToTarget > 100) then { + _addHeight = _addHeight vectorAdd [0,0, _distanceToTarget]; + }; +}; + + + +TRACE_3("", _distanceToTarget,_distanceToShooter,_addHeight); + + _returnTargetPos = _seekerTargetPos vectorAdd _addHeight; + +#ifdef DEBUG_MODE_FULL +drawLine3D [(ASLtoATL _returnTargetPos) vectorAdd _addHeight, ASLtoATL _returnTargetPos, [0,1,0,1]]; +#endif + +TRACE_1("Adjusted target position", _returnTargetPos); +_returnTargetPos; \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_attackProfile_DIR.sqf b/addons/missileguidance/functions/fnc_attackProfile_DIR.sqf new file mode 100644 index 0000000000..498b754287 --- /dev/null +++ b/addons/missileguidance/functions/fnc_attackProfile_DIR.sqf @@ -0,0 +1,4 @@ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" + +_this call FUNC(attackProfile_LIN); \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_attackProfile_HI.sqf b/addons/missileguidance/functions/fnc_attackProfile_HI.sqf new file mode 100644 index 0000000000..498b754287 --- /dev/null +++ b/addons/missileguidance/functions/fnc_attackProfile_HI.sqf @@ -0,0 +1,4 @@ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" + +_this call FUNC(attackProfile_LIN); \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_attackProfile_LIN.sqf b/addons/missileguidance/functions/fnc_attackProfile_LIN.sqf new file mode 100644 index 0000000000..90ec75ad7f --- /dev/null +++ b/addons/missileguidance/functions/fnc_attackProfile_LIN.sqf @@ -0,0 +1,54 @@ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" + +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"]; +_seekerTargetPos = _this select 0; +_launchParams = _this select 1; + +_target = _launchParams select 0; +_targetLaunchParams = _launchParams select 1; + +_shooterPos = getPosASL _shooter; +_projectilePos = getPosASL _projectile; + +_distanceToTarget = _projectilePos vectorDistance _seekerTargetPos; +_distanceToShooter = _projectilePos vectorDistance _shooterPos; + +TRACE_2("", _distanceToTarget, _distanceToShooter); + +// Add height depending on distance for compensate +_addHeight = [0,0,0]; + +// Always climb an arc on initial launch if we are close to the round +if( ((ASLtoATL _projectilePos) select 2) < 5 && _distanceToShooter < 15) then { + _addHeight = _addHeight vectorAdd [0,0,_distanceToTarget]; +} else { + // If we are below the target, increase the climbing arc + if((_projectilePos select 2) < (_seekerTargetPos select 2) && _distanceToTarget > 100) then { + _addHeight = _addHeight vectorAdd [0,0, ((_seekerTargetPos select 2) - (_projectilePos select 2))]; + }; +}; + +// Handle arcing terminal low for high decent +if( (_projectilePos select 2) > (_seekerTargetPos select 2) && _distanceToTarget < 100) then { + _addHeight = _addHeight vectorDiff [0,0, ((_projectilePos select 2) - (_seekerTargetPos select 2)) * 0.5]; +} else { + if((_projectilePos select 2) > (_seekerTargetPos select 2) && _distanceToTarget > 100) then { + _addHeight = _addHeight vectorAdd [0,0, _distanceToTarget*0.02]; + }; +}; + + + +TRACE_3("", _distanceToTarget,_distanceToShooter,_addHeight); + + _returnTargetPos = _seekerTargetPos vectorAdd _addHeight; + +#ifdef DEBUG_MODE_FULL +drawLine3D [(ASLtoATL _returnTargetPos) vectorAdd _addHeight, ASLtoATL _returnTargetPos, [0,1,0,1]]; +#endif + +TRACE_1("Adjusted target position", _returnTargetPos); +_returnTargetPos; \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_attackProfile_MID.sqf b/addons/missileguidance/functions/fnc_attackProfile_MID.sqf new file mode 100644 index 0000000000..498b754287 --- /dev/null +++ b/addons/missileguidance/functions/fnc_attackProfile_MID.sqf @@ -0,0 +1,4 @@ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" + +_this call FUNC(attackProfile_LIN); \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_attackProfile_PYM.sqf b/addons/missileguidance/functions/fnc_attackProfile_PYM.sqf new file mode 100644 index 0000000000..498b754287 --- /dev/null +++ b/addons/missileguidance/functions/fnc_attackProfile_PYM.sqf @@ -0,0 +1,4 @@ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" + +_this call FUNC(attackProfile_LIN); \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_attackProfile_TOP.sqf b/addons/missileguidance/functions/fnc_attackProfile_TOP.sqf new file mode 100644 index 0000000000..767f5df351 --- /dev/null +++ b/addons/missileguidance/functions/fnc_attackProfile_TOP.sqf @@ -0,0 +1,52 @@ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" + +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"]; +_seekerTargetPos = _this select 0; +_launchParams = _this select 1; + +_target = _launchParams select 0; +_targetLaunchParams = _launchParams select 1; + +_shooterPos = getPosASL _shooter; +_projectilePos = getPosASL _projectile; + +_distanceToTarget = _projectilePos vectorDistance _seekerTargetPos; +_distanceToShooter = _projectilePos vectorDistance _shooterPos; + +TRACE_2("", _distanceToTarget, _distanceToShooter); + +// Add height depending on distance for compensate +_addHeight = [0,0,0]; + +// Always climb an arc on initial launch if we are close to the round +if( ((ASLtoATL _projectilePos) select 2) < 140 && _distanceToShooter < 50) then { + _addHeight = _addHeight vectorAdd [0,0,_distanceToTarget]; +} else { + // If we are below the target, increase the climbing arc + if((_projectilePos select 2) < (_seekerTargetPos select 2) + 140 && _distanceToTarget > 100) then { + _addHeight = _addHeight vectorAdd [0,0, ((_seekerTargetPos select 2) - (_projectilePos select 2))+50]; + }; +}; + +// Handle arcing terminal low for high decent +if( (_projectilePos select 2) > (_seekerTargetPos select 2) && _distanceToTarget < 140) then { + _addHeight = _addHeight vectorDiff [0,0, ((_projectilePos select 2) - (_seekerTargetPos select 2)) * 0.5]; +} else { + if((_projectilePos select 2) > (_seekerTargetPos select 2) && _distanceToTarget > 140) then { + _addHeight = _addHeight vectorAdd [0,0, ((_projectilePos select 2) - (_seekerTargetPos select 2)) * 0.02]; + }; +}; + +TRACE_3("", _distanceToTarget,_distanceToShooter,_addHeight); + + _returnTargetPos = _seekerTargetPos vectorAdd _addHeight; + +#ifdef DEBUG_MODE_FULL +drawLine3D [(ASLtoATL _returnTargetPos) vectorAdd _addHeight, ASLtoATL _returnTargetPos, [0,1,0,1]]; +#endif + +TRACE_1("Adjusted target position", _returnTargetPos); +_returnTargetPos; \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_checkLos.sqf b/addons/missileguidance/functions/fnc_checkLos.sqf new file mode 100644 index 0000000000..f21a841367 --- /dev/null +++ b/addons/missileguidance/functions/fnc_checkLos.sqf @@ -0,0 +1,29 @@ +/* + * Author: jaynus + * Returns whether the seeker object can see the target position with lineIntersect + * + * Argument: + * 0: Seeker [Object] + * 1: Target [Object] + * + * Return value: + * Boolean + */ +#include "script_component.hpp" +private["_seeker", "_seekerPos", "_target", "_targetPos", "_return", "_vectorTo", "_searchPos"]; +_seeker = _this select 0; +_target = _this select 1; + +_targetPos = getPosASL _target; +_seekerPos = getPosASL _seeker; +_return = true; + +if(!(terrainIntersectASL [ _seekerPos, _targetPos])) then { + if(lineIntersects [_seekerPos, _targetPos, _seeker, _target]) then { + _return = false; + }; +} else { + _return = false; +}; + +_return; \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_checkSeekerAngle.sqf b/addons/missileguidance/functions/fnc_checkSeekerAngle.sqf new file mode 100644 index 0000000000..7308ce1723 --- /dev/null +++ b/addons/missileguidance/functions/fnc_checkSeekerAngle.sqf @@ -0,0 +1,50 @@ +/* + * Author: jaynus + * Returns whether the target position is within the maximum angle FOV of the provided seeker + * objects current direction. + * + * Argument: + * 0: Seeker [Object] + * 1: Target [Position] + * 2: Max Angle [Degrees] + * + * Return value: + * Boolean + */ + + #define DEBUG_MODE_FULL +#include "script_component.hpp" +private["_seeker", "_targetPos", "_seekerMaxAngle", "_vectorTo", "_sensorPos", "_vertOk", "_horzOk", "_dir", "_headingPitch"]; + +_seeker = _this select 0; +_targetPos = _this select 1; +_seekerMaxAngle = _this select 2; + +_vertOk = false; +_horzOk = false; + +_sensorPos = getPosASL _seeker; +_vectorTo = _sensorPos vectorFromTo _targetPos; + +_headingPitch = (vectorDir _seeker) call CBA_fnc_vect2polar; +_polarTo = _vectorTo call CBA_fnc_vect2polar; + +_dir = _polarTo select 1; +_dir = _dir - (_headingPitch select 1); + +if (_dir < 0) then {_dir = _dir + 360}; +if (_dir > 360) then {_dir = _dir - 360}; + _vertOk = false; + _horzOk = false; +if(_dir < _angleFov || {_dir > (360-_angleFov)}) then { + _horzOk = true; +}; +if(abs((abs(_polarTo select 2))-(abs(_headingPitch select 2))) < _angleFov) then { + _vertOk = true; +}; + +if(!_vertOk || !_horzOk ) exitWith { + false +}; + +true \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_doAttackProfile.sqf b/addons/missileguidance/functions/fnc_doAttackProfile.sqf new file mode 100644 index 0000000000..fa7c6f4f8b --- /dev/null +++ b/addons/missileguidance/functions/fnc_doAttackProfile.sqf @@ -0,0 +1,30 @@ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" + +EXPLODE_7_PVT(((_this select 1) select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); +private["_attackProfilePos"]; + +_launchParams = ((_this select 1) select 1); +_attackProfileName = _launchParams select 3; + +TRACE_1("Attacking profile", _attackProfileName); + +_attackProfilesCfg = ( configFile >> QGVAR(AttackProfiles) ); + +_attackProfile = nil; +for [{_i=0}, {_i< (count _attackProfilesCfg) }, {_i=_i+1}] do { + _testProfile = _attackProfilesCfg select _i; + _testName = configName _testProfile; + TRACE_3("", _testName, _testProfile, _attackProfilesCfg); + + if( _testName == _attackProfileName) exitWith { + _attackProfile = _attackProfilesCfg select _i; + }; +}; + +_attackProfilePos = [0,0,0]; +if(!isNil "_attackProfile") then { + _attackProfilePos = _this call (missionNamespace getVariable (getText (_attackProfile >> "functionName"))); +}; + +_attackProfilePos; \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_doSeekerSearch.sqf b/addons/missileguidance/functions/fnc_doSeekerSearch.sqf new file mode 100644 index 0000000000..1e43d83218 --- /dev/null +++ b/addons/missileguidance/functions/fnc_doSeekerSearch.sqf @@ -0,0 +1,30 @@ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" + +EXPLODE_7_PVT(((_this select 1) select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); +private["_seekerProfilePos"]; + +_launchParams = ((_this select 1) select 1); +_seekerTypeName = _launchParams select 2; + +TRACE_1("Seeker type", _seekerTypeName); + +_seekerTypesCfg = ( configFile >> QGVAR(SeekerTypes) ); + +_seekerType = nil; +for [{_i=0}, {_i< (count _seekerTypesCfg) }, {_i=_i+1}] do { + _testProfile = _seekerTypesCfg select _i; + _testName = configName _testProfile; + TRACE_3("", _testName, _testProfile, _seekerTypesCfg); + + if( _testName == _seekerTypeName) exitWith { + _seekerType = _seekerTypesCfg select _i; + }; +}; + +_seekerProfilePos = [0,0,0]; +if(!isNil "_seekerType") then { + _seekerProfilePos = _this call (missionNamespace getVariable (getText (_seekerType >> "functionName"))); +}; + +_seekerProfilePos; \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_fired.sqf b/addons/missileguidance/functions/fnc_fired.sqf index dbe6abfec7..bb162e1f09 100644 --- a/addons/missileguidance/functions/fnc_fired.sqf +++ b/addons/missileguidance/functions/fnc_fired.sqf @@ -1,18 +1,80 @@ //#define DEBUG_MODE_FULL #include "script_component.hpp" -//_this=[TEST_AI_HELICOPTER,"missiles_DAGR","missiles_DAGR","Far_AI","M_PG_AT","24Rnd_PG_missiles",163988: rocket_01_fly_f.p3d] -TRACE_1("enter", _this); + +// Bail if guidance is disabled +if(!GVAR(enabled)) exitWith { false }; + +// Bail on locality of the projectile, it should be local to us +if(!local _projectile) exitWith { false }; + +private["_config", "_enabled", "_target", "_seekerType", "_attackProfile"]; PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); -if(!local _shooter) exitWith { false }; +// Bail on not missile +if(! (_ammo isKindOf "MissileBase") ) exitWith { false }; -switch _weapon do { - case "missiles_DAGR": { - _this call FUNC(guidance_DAGR); - }; - case "GBU12BombLauncher": { - _this call FUNC(guidance_LGB); +_config = configFile >> "CfgAmmo" >> _ammo >> "ACE_MissileGuidance"; +_enabled = getNumber ( _config >> "enabled"); + +// Bail if guidance is not enabled +if(isNil "_enabled" || {_enabled != 1}) exitWith { false }; + +_target = (vehicle _shooter) getVariable [QGVAR(target), nil]; +_seekerType = (vehicle _shooter) getVariable [QGVAR(seekerType), nil]; +_attackProfile = (vehicle _shooter) getVariable [QGVAR(attackProfile), nil]; +_lockMode = (vehicle _shooter) getVariable [QGVAR(lockMode), nil]; + +TRACE_3("Begin guidance", _target, _seekerType, _attackProfile); + +if ( isNil "_seekerType" || { ! ( _seekerType in (getArray (_config >> "seekerTypes" ) ) ) } ) then { + _seekerType = getText (_config >> "defaultSeekerType"); +}; +if ( isNil "_attackProfile" || { ! ( _attackProfile in (getArray (_config >> "attackProfiles" ) ) ) } ) then { + _attackProfile = getText (_config >> "defaultAttackProfile"); +}; +if ( isNil "_lockMode" || { ! ( _lockMode in (getArray (_config >> "seekerLockModes" ) ) ) } ) then { + _lockMode = getText (_config >> "defaultSeekerLockMode"); +}; + +// If we didn't get a target, try to fall back on tab locking +if(isNil "_target") then { + _canUseLock = getNumber (_config >> "canVanillaLock"); + if(_canUseLock > 0) then { + // @TODO: Get vanilla target + _vanillaTarget = cursorTarget; + + TRACE_1("Using Vanilla Locking", _vanillaTarget); + if(!isNil "_vanillaTarget") then { + _target = _vanillaTarget; + }; }; }; -//_this call FUNC(guidance_HellfireII); +TRACE_4("Beginning ACE guidance system",_target,_ammo,_seekerType,_attackProfile); +[FUNC(guidancePFH), 0, [_this, + [ACE_player, + [_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; + +/* Clears locking settings +(vehicle _shooter) setVariable [QGVAR(target), nil]; +(vehicle _shooter) setVariable [QGVAR(seekerType), nil]; +(vehicle _shooter) setVariable [QGVAR(attackProfile), nil]; +(vehicle _shooter) setVariable [QGVAR(lockMode), nil]; +*/ \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_guidancePFH.sqf b/addons/missileguidance/functions/fnc_guidancePFH.sqf new file mode 100644 index 0000000000..7041201ded --- /dev/null +++ b/addons/missileguidance/functions/fnc_guidancePFH.sqf @@ -0,0 +1,97 @@ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" + +#define TIMESTEP_FACTOR 0.01 + +private["_args", "_stateParams", "_launchParams", "_targetLaunchParams", "_config", "_flightParams", "_seekerParams", "_seekerTargetPos"]; +private["_lastRunTime", "_runtimeDelta", "_profileAdjustedTargetPos", "_targetVectorSeeker", "_targetVector"]; +private["_minDeflection", "_maxDeflection", "_incDeflection"]; +private["_yVec", "_zVec", "_xVec"]; + +_args = _this select 0; +EXPLODE_7_PVT((_args select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); + +_launchParams = _args select 1; +_targetLaunchParams = _launchParams select 1; +_flightParams = _args select 2; +_seekerParams = _args select 3; + +_stateParams = _args select 4; + +_lastRunTime = _stateParams select 0; +_runtimeDelta = diag_tickTime - _lastRunTime; + +_config = configFile >> "CfgAmmo" >> _ammo >> "ACE_MissileGuidance"; + +if(!alive _projectile || isNull _projectile || isNull _shooter) exitWith { + [(_this select 1)] call cba_fnc_removePerFrameHandler; +}; + +// TODO: placeholder for "last seek target position" +_seekerTargetPos = [ [0,0,0], _args] call FUNC(doSeekerSearch); +if(!isNil "_seekerTargetPos") then { + + _profileAdjustedTargetPos = [_seekerTargetPos,_args] call FUNC(doAttackProfile); + + _minDeflection = _flightParams select 0; + _maxDeflection = _flightParams select 1; + _incDeflection = _flightParams select 2; + + _yVec = vectorDir _projectile; + _zVec = vectorUp _projectile; + _xVec = vectorNormalized (_yVec vectorCrossProduct _zVec); + + _projectilePos = getPosASL _projectile; + + _targetVectorSeeker = [_projectile, [_xVec, _yVec, _zVec], _profileAdjustedTargetPos] call EFUNC(common,translateToWeaponSpace); + _targetVector = [0,0,0] vectorFromTo _targetVectorSeeker; + TRACE_1("", _targetVectorSeeker, _targetVector); + + private["_yaw", "_pitch"]; + _yaw = 0; + _pitch = 0; + + if((_targetVectorSeeker select 0) < 0) then { + _yaw = - ( (_minDeflection max (abs(_targetVector select 0) min _maxDeflection) ) ); + } else { + if((_targetVectorSeeker select 0) > 0) then { + _yaw = ( (_minDeflection max ((_targetVector select 0) min _maxDeflection) ) ); + }; + }; + if((_targetVectorSeeker select 2) < 0) then { + _pitch = - ( (_minDeflection max (abs(_targetVector select 2) min _maxDeflection) ) ); + } else { + if((_targetVectorSeeker select 2) > 0) then { + _pitch = ( (_minDeflection max ((_targetVector select 2) min _maxDeflection) ) ); + }; + }; + +#ifdef DEBUG_MODE_FULL + 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]]; +#endif + + if(accTime > 0) then { + private["_adjustTime", "_outVector", "_vectorTo"]; + _adjustTime = 1/accTime; + _adjustTime = _adjustTime * (_runtimeDelta / TIMESTEP_FACTOR); + TRACE_4("Adjust timing", 1/accTime, _adjustTime, _runtimeDelta, (_runtimeDelta / TIMESTEP_FACTOR) ); + + // @TODO: Apply velocity multiplier to yaw/pitch. Basically, it can adjust faster at lower speeds + //_adjustDeflection = (vectorMagnitude velocity _projectile); + + _outVector = [_projectile, [_xVec, _yVec, _zVec], [_yaw, _adjustTime, _pitch]] call EFUNC(common,translateToModelSpace); + _vectorTo = _projectilePos vectorFromTo _outVector; + + _projectile setVectorDirAndUp [_vectorTo, vectorUp _projectile]; + }; + +#ifdef DEBUG_MODE_FULL + hintSilent format["d: %1", _distanceToTarget]; +#endif +}; + +_stateParams set[0, diag_tickTime]; + +_args set[4, _stateParams]; +_this set[0, _args]; \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_guidance_DAGR.sqf b/addons/missileguidance/functions/fnc_guidance_DAGR.sqf deleted file mode 100644 index 9055b00a7f..0000000000 --- a/addons/missileguidance/functions/fnc_guidance_DAGR.sqf +++ /dev/null @@ -1,120 +0,0 @@ -//#define DEBUG_MODE_FULL -#include "script_component.hpp" - -FUNC(guidance_DIRECT_LOAL_PFH) = { - //TRACE_1("enter", _this); - private["_args", "_shooter", "_dagr", "_curVelocity", "_targets", "_target", "_yVec", "_xVec", "_zVec", "_dagrPos", "_shooterPos", "_distanceToTarget", "_distanceToShooter", "_def"]; - _args = _this select 0; - //PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); - _shooter = _args select 0; - _dagr = _args select 6; - _curVelocity = velocity _dagr; - - if(!alive _dagr || isNull _dagr || isNull _shooter) exitWith { - [(_this select 1)] call cba_fnc_removePerFrameHandler; - }; - - _targets = [_dagr, ACE_DEFAULT_LASER_CODE, 70, _curVelocity] call ace_laser_fnc_findLaserDesignator; - TRACE_2("Targets", _target, _targets); - - if((_targets select 0)) then { - _target = _targets select 1; - - // player sideChat "FUCK!"; - // drop ["\a3\data_f\Cl_basic","","Billboard",1,20,(getPos _dagr),[0,0,0],1,1.275,1.0,0.0,[5],[[1,0,0,1]],[0],0.0,2.0,"","",""]; - - - _yVec = vectorDir _dagr; - _zVec = vectorUp _dagr; - _xVec = vectorNormalized (_yVec vectorCrossProduct _zVec); - - _dagrPos = getPosASL _dagr; - // player sideChat "G!"; - _targetPos = getPosASL _target; - _shooterPos = getPosASL _shooter; - - if((count _targetPos) > 0) then { - _distanceToTarget = _dagrPos vectorDistance _targetPos; - _distanceToShooter = _dagrPos vectorDistance _shooterPos; - - _addHeight = [0,0,(_dagrPos distance _targetPos)*0.02]; - #ifdef DEBUG_MODE_FULL - drawLine3D [(ASLtoATL _targetPos) vectorAdd _addHeight, ASLtoATL _targetPos, [0,1,0,1]]; - #endif - - _targetPos = _targetPos vectorAdd _addHeight; - - _def = 0.0040; - if(_distanceToShooter > 100) then { - _def = 0.0025; - }; - - _targetVectorSeeker = [_dagr, [_xVec, _yVec, _zVec], _targetPos] call FUNC(translateToWeaponSpace); - // _targetVectorSeeker = _dagr worldToModel (ASLtoATL _targetPos); - // _targetVectorSeeker = [0,0,0] vectorFromTo _targetVectorSeeker; - _yaw = 0.0; - if((_targetVectorSeeker select 0) < 0) then { - _yaw = -_def; - } else { - if((_targetVectorSeeker select 0) > 0) then { - _yaw = _def; - }; - }; - - _pitch = 0.0; - if((_targetVectorSeeker select 2) < 0) then { - _pitch = -_def; - } else { - if((_targetVectorSeeker select 2) > 0) then { - _pitch = _def; - }; - }; - #ifdef DEBUG_MODE_FULL - drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,1,1,1], ASLtoATL _dagrPos, 0.75, 0.75, 0, str _vectorTo, 1, 0.025, "TahomaB"]; - drawLine3D [ASLtoATL _dagrPos, ASLtoATL _targetPos, [1,0,0,1]]; - - _distance = ([getPos startPos, _dagrPos] call BIS_fnc_distance2D); - _marker = createMarkerLocal [format["m%1", MARKERCOUNT], [_distance, _dagrPos select 2]]; - _marker setMarkerTypeLocal "mil_dot"; - _marker setMarkerColorLocal "ColorRed"; - - MARKERCOUNT = MARKERCOUNT + 1; - #endif - - if(accTime > 0) then { - _outVector = [_dagr, [_xVec, _yVec, _zVec], [_yaw, 1/accTime, _pitch]] call FUNC(translateToModelSpace); - // _outVector = _dagr modelToWorldVisual [_yaw, 1, _pitch]; - // _outVector = ATLtoASL _outVector; - _vectorTo = _dagrPos vectorFromTo _outVector; - - // hintSilent format["v: %1", _vectorTo]; - - // _dagr setVectorDir _vectorTo; - _dagr setVectorDirAndUp [_vectorTo, vectorUp _dagr]; - }; - - #ifdef DEBUG_MODE_FULL - hintSilent format["d: %1", _distanceToTarget]; - #endif - }; - }; -}; - -FUNC(guidance_DAGR_DIRECT_LOAL) = { - PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); - - GVAR(lastTime) = time; - [FUNC(guidance_DIRECT_LOAL_PFH), 0, _this] call cba_fnc_addPerFrameHandler; -}; - -PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); -_fireMode = _shooter getVariable ["ACE_FIRE_SELECTION", ACE_DEFAULT_FIRE_SELECTION]; - -switch (_fireMode select 0) do { - // Default to FIREMODE_DIRECT_LOAL - // FIREMODE_DIRECT_LOAL - default { - LOG("Initiating DAGR FIREMODE_DIRECT_LOAL"); - _this call FUNC(guidance_DAGR_DIRECT_LOAL); - }; -}; \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_guidance_HellfireII.sqf b/addons/missileguidance/functions/fnc_guidance_HellfireII.sqf deleted file mode 100644 index 72b8da8c67..0000000000 --- a/addons/missileguidance/functions/fnc_guidance_HellfireII.sqf +++ /dev/null @@ -1,249 +0,0 @@ -//#define DEBUG_MODE_FULL -#include "script_component.hpp" - -FUNC(guidance_Hellfire_LOAL_HI_PFH) = { - //TRACE_1("enter", _this); - _args = _this select 0; - //PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); - _shooter = _args select 0; - _missile = _args select 6; - _curVelocity = velocity _missile; - - if(!alive _missile || isNull _missile || isNull _shooter) exitWith { - [(_this select 1)] call cba_fnc_removePerFrameHandler; - }; - - _launchPos = _shooter getVariable [QGVAR(launchPos), nil]; - if(isNil "_launchPos") then { - TRACE_1("Setting launch parameters", ""); - _launchPos = getPosASL _shooter; - _shooter setVariable [QGVAR(launchPos), _launchPos, false]; - _shooter setVariable [QGVAR(launchTime), diag_tickTime, false]; - }; - - _targets = [_missile, ACE_DEFAULT_LASER_CODE, 70, _curVelocity] call ace_laser_fnc_findLaserDesignator; - _addHeight = [0,0,0]; - if((_targets select 0)) then { - _target = _targets select 1; - TRACE_2("Targets", _target, _targets); - - _yVec = vectorDir _missile; - _zVec = vectorUp _missile; - _xVec = vectorNormalized (_yVec vectorCrossProduct _zVec); - - _missilePos = getPosASL _missile; - // player sideChat "G!"; - _targetPos = getPosASL _target; - TRACE_4("Phase Check", _launchPos, _missilePos, _targetPos, (_missilePos distance _targetPos)); - if((count _targetPos) > 0) then { - _distanceToTarget = _missilePos vectorDistance _targetPos; - - _defPitch = 0.05; - - if((_launchPos distance _missilePos) < 400 && (_targetPos distance _missilePos) > 400) then { - _addHeight = [0,0,(_targetPos select 2) + ((_launchPos distance _targetPos)*2)]; - TRACE_1("Climb phase", _addHeight); - //_defPitch = 0.1; - } else { - // Covered half the distance, go terminal - if((_missilePos distance _targetPos) < (_launchPos distance _targetPos) / 2) then { - TRACE_1("TERMINAL", ""); - } else { - if((_missilePos select 2) > (_targetPos select 2)) then { - _heightDiff = (_missilePos select 2) - (_targetPos select 2); - TRACE_1("Coasting", _heightDiff); - _addHeight = [0,0, _heightDiff]; - }; - }; - }; - _targetPos = _targetPos vectorAdd _addHeight; - - _defYaw = 0.0035; - - - _targetVectorSeeker = [_missile, [_xVec, _yVec, _zVec], _targetPos] call FUNC(translateToWeaponSpace); - _yaw = 0.0; - if((_targetVectorSeeker select 0) < 0) then { - _yaw = -_defYaw; - } else { - if((_targetVectorSeeker select 0) > 0) then { - _yaw = _defYaw; - }; - }; - - _pitch = 0.0; - if((_targetVectorSeeker select 2) < 0) then { - _pitch = -_defPitch; - } else { - if((_targetVectorSeeker select 2) > 0) then { - _pitch = _defPitch; - }; - }; - #ifdef DEBUG_MODE_FULL - drawLine3D [(ASLtoATL _targetPos) vectorAdd _addHeight, ASLtoATL _targetPos, [0,1,0,1]]; - - _light = "#lightpoint" createVehicleLocal (getPos _missile); - _light setLightBrightness 1.0; - _light setLightAmbient [1.0, 0.0, 0.0]; - _light setLightColor [1.0, 0.0, 0.0]; - - drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,1,1,1], ASLtoATL _missilePos, 0.75, 0.75, 0, str _vectorTo, 1, 0.025, "TahomaB"]; - drawLine3D [ASLtoATL _missilePos, ASLtoATL _targetPos, [1,0,0,1]]; - - _distance = ([getPos startPos, _missilePos] call BIS_fnc_distance2D); - _marker = createMarkerLocal [format["m%1", MARKERCOUNT], [_distance, _missilePos select 2]]; - _marker setMarkerTypeLocal "mil_dot"; - _marker setMarkerColorLocal "ColorRed"; - - MARKERCOUNT = MARKERCOUNT + 1; - #endif - - if(accTime > 0) then { - _outVector = [_missile, [_xVec, _yVec, _zVec], [_yaw, 1/accTime, _pitch]] call FUNC(translateToModelSpace); - - _vectorTo = _missilePos vectorFromTo _outVector; - _missile setVectorDirAndUp [_vectorTo, vectorUp _missile]; - }; - - #ifdef DEBUG_MODE_FULL - hintSilent format["d: %1", _distanceToTarget]; - #endif - }; - }; -}; - -FUNC(guidance_Hellfire_LOAL_DIR_PFH) = { - //TRACE_1("enter", _this); - _args = _this select 0; - //PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); - _shooter = _args select 0; - _missile = _args select 6; - _curVelocity = velocity _missile; - - if(!alive _missile || isNull _missile || isNull _shooter) exitWith { - [(_this select 1)] call cba_fnc_removePerFrameHandler; - }; - - _launchPos = _shooter getVariable [QGVAR(launchPos), nil]; - if(isNil "_launchPos") then { - TRACE_1("Setting launch parameters", ""); - _launchPos = getPosASL _shooter; - _shooter setVariable [QGVAR(launchPos), _launchPos, false]; - _shooter setVariable [QGVAR(launchTime), diag_tickTime, false]; - }; - - _targets = [_missile, ACE_DEFAULT_LASER_CODE, 70, _curVelocity] call ace__laser_fnc_findLaserDesignator; - _addHeight = [0,0,0]; - if((_targets select 0)) then { - _target = _targets select 1; - TRACE_2("Targets", _target, _targets); - - _yVec = vectorDir _missile; - _zVec = vectorUp _missile; - _xVec = vectorNormalized (_yVec vectorCrossProduct _zVec); - - _missilePos = getPosASL _missile; - // player sideChat "G!"; - _targetPos = getPosASL _target; - TRACE_4("Phase Check", _launchPos, _missilePos, _targetPos, (_missilePos distance _targetPos)); - if((count _targetPos) > 0) then { - _distanceToTarget = _missilePos vectorDistance _targetPos; - - if((_launchPos distance _missilePos) < 400 && (_targetPos distance _missilePos) > 400) then { - _addHeight = [0,0,(_targetPos select 2) + (_missilePos distance _targetPos)*0.5]; - TRACE_1("Climb phase", _addHeight); - } else { - // Covered half the distance, go terminal - if((_missilePos distance _targetPos) < (_launchPos distance _targetPos) / 2) then { - TRACE_1("TERMINAL", ""); - } else { - if((_missilePos select 2) > (_targetPos select 2)) then { - _heightDiff = (_missilePos select 2) - (_targetPos select 2); - TRACE_1("Coasting", _heightDiff); - _addHeight = [0,0, _heightDiff]; - }; - }; - }; - _targetPos = _targetPos vectorAdd _addHeight; - - _defYaw = 0.0035; - _defPitch = 0.0075; - - _targetVectorSeeker = [_missile, [_xVec, _yVec, _zVec], _targetPos] call FUNC(translateToWeaponSpace); - _yaw = 0.0; - if((_targetVectorSeeker select 0) < 0) then { - _yaw = -_defYaw; - } else { - if((_targetVectorSeeker select 0) > 0) then { - _yaw = _defYaw; - }; - }; - - _pitch = 0.0; - if((_targetVectorSeeker select 2) < 0) then { - _pitch = -_defPitch; - } else { - if((_targetVectorSeeker select 2) > 0) then { - _pitch = _defPitch; - }; - }; - #ifdef DEBUG_MODE_FULL - drawLine3D [(ASLtoATL _targetPos) vectorAdd _addHeight, ASLtoATL _targetPos, [0,1,0,1]]; - - _light = "#lightpoint" createVehicleLocal (getPos _missile); - _light setLightBrightness 1.0; - _light setLightAmbient [1.0, 0.0, 0.0]; - _light setLightColor [1.0, 0.0, 0.0]; - - drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,1,1,1], ASLtoATL _missilePos, 0.75, 0.75, 0, str _vectorTo, 1, 0.025, "TahomaB"]; - drawLine3D [ASLtoATL _missilePos, ASLtoATL _targetPos, [1,0,0,1]]; - - _distance = ([getPos startPos, _missilePos] call BIS_fnc_distance2D); - _marker = createMarkerLocal [format["m%1", MARKERCOUNT], [_distance, _missilePos select 2]]; - _marker setMarkerTypeLocal "mil_dot"; - _marker setMarkerColorLocal "ColorRed"; - - MARKERCOUNT = MARKERCOUNT + 1; - #endif - - if(accTime > 0) then { - _outVector = [_missile, [_xVec, _yVec, _zVec], [_yaw, 1/accTime, _pitch]] call FUNC(translateToModelSpace); - - _vectorTo = _missilePos vectorFromTo _outVector; - _missile setVectorDirAndUp [_vectorTo, vectorUp _missile]; - }; - - #ifdef DEBUG_MODE_FULL - hintSilent format["d: %1", _distanceToTarget]; - #endif - }; - }; -}; - - -FUNC(guidance_Hellfire_LOAL_HI) = { - PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); - - GVAR(lastTime) = time; - [FUNC(guidance_Hellfire_LOAL_HI_PFH), 0, _this] call cba_fnc_addPerFrameHandler; -}; - - -FUNC(guidance_Hellfire_LOAL_DIR) = { - PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); - - GVAR(lastTime) = time; - [FUNC(guidance_Hellfire_LOAL_DIR_PFH), 0, _this] call cba_fnc_addPerFrameHandler; -}; - -PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); -_fireMode = _shooter getVariable ["ACE_FIRE_SELECTION", ACE_DEFAULT_FIRE_SELECTION]; - -switch (_fireMode select 0) do { - // Default to FIREMODE_DIRECT_LOAL - // FIREMODE_DIRECT_LOAL - default { - LOG("Initiating Hellfire II FIREMODE_LOAL_DIR"); - _this call FUNC(guidance_Hellfire_LOAL_HI); - }; -}; \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_guidance_LGB.sqf b/addons/missileguidance/functions/fnc_guidance_LGB.sqf deleted file mode 100644 index 47efa46768..0000000000 --- a/addons/missileguidance/functions/fnc_guidance_LGB.sqf +++ /dev/null @@ -1,109 +0,0 @@ -#define DEBUG_MODE_FULL -#include "script_component.hpp" - -FUNC(guidance_LGB_LOAL_PFH) = { - //TRACE_1("enter", _this); - _args = _this select 0; - //PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); - _lgb = _args select 6; - _curVelocity = velocity _lgb; - - if(!alive _lgb) exitWith { - [(_this select 1)] call cba_fnc_removePerFrameHandler; - }; - - _targets = [_lgb, ACE_DEFAULT_LASER_CODE, 70, _curVelocity] call uo_laser_fnc_findLaserDesignator; - //TRACE_2("Targets", _target, _targets); - - if((_targets select 0)) then { - _target = _targets select 1; - - // player sideChat "FUCK!"; - // drop ["\a3\data_f\Cl_basic","","Billboard",1,20,(getPos _lgb),[0,0,0],1,1.275,1.0,0.0,[5],[[1,0,0,1]],[0],0.0,2.0,"","",""]; - - - _yVec = vectorDir _lgb; - _zVec = vectorUp _lgb; - _xVec = vectorNormalized (_yVec vectorCrossProduct _zVec); - - _lgbPos = getPosASL _lgb; - // player sideChat "G!"; - _targetPos = getPosASL _target; - if((count _targetPos) > 0) then { - // player sideChat format["f: %1", _targetPos]; - _addHeight = [0,0,(_lgbPos distance _targetPos)*0.06]; - // drawLine3D [(ASLtoATL _targetPos) vectorAdd _addHeight, ASLtoATL _targetPos, [0,1,0,1]]; - _targetPos = _targetPos vectorAdd _addHeight; - - - - _def = 0.0025; - - _targetVectorSeeker = [_lgb, [_xVec, _yVec, _zVec], _targetPos] call FUNC(translateToWeaponSpace); - // _targetVectorSeeker = _lgb worldToModel (ASLtoATL _targetPos); - // _targetVectorSeeker = [0,0,0] vectorFromTo _targetVectorSeeker; - _yaw = 0.0; - if((_targetVectorSeeker select 0) < 0) then { - _yaw = -_def; - } else { - if((_targetVectorSeeker select 0) > 0) then { - _yaw = _def; - }; - }; - - _pitch = 0.0; - if((_targetVectorSeeker select 2) < 0) then { - _pitch = -_def; - } else { - if((_targetVectorSeeker select 2) > 0) then { - _pitch = _def; - }; - }; - #ifdef DEBUG_MODE_FULL - drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,1,1,1], ASLtoATL _lgbPos, 0.75, 0.75, 0, str _vectorTo, 1, 0.025, "TahomaB"]; - drawLine3D [ASLtoATL _lgbPos, ASLtoATL _targetPos, [1,0,0,1]]; - - _distance = ([getPos startPos, _lgbPos] call BIS_fnc_distance2D); - _marker = createMarkerLocal [format["m%1", MARKERCOUNT], [_distance, _lgbPos select 2]]; - _marker setMarkerTypeLocal "mil_dot"; - _marker setMarkerColorLocal "ColorRed"; - - MARKERCOUNT = MARKERCOUNT + 1; - #endif - - if(accTime > 0) then { - _outVector = [_lgb, [_xVec, _yVec, _zVec], [_yaw, 1/accTime, _pitch]] call FUNC(translateToModelSpace); - // _outVector = _lgb modelToWorldVisual [_yaw, 1, _pitch]; - // _outVector = ATLtoASL _outVector; - _vectorTo = _lgbPos vectorFromTo _outVector; - - // hintSilent format["v: %1", _vectorTo]; - - // _lgb setVectorDir _vectorTo; - _lgb setVectorDirAndUp [_vectorTo, vectorUp _lgb]; - }; - - #ifdef DEBUG_MODE_FULL - hintSilent format["d: %1", _lgbPos vectorDistance _targetPos]; - #endif - }; - }; -}; - -FUNC(guidance_LGB_LOAL) = { - PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); - - [FUNC(guidance_LGB_LOAL_PFH), 0, _this] call cba_fnc_addPerFrameHandler; -}; - -PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); -_fireMode = _shooter getVariable ["ACE_FIRE_SELECTION", ACE_DEFAULT_FIRE_SELECTION]; - -switch (_fireMode select 0) do { - // Default to FIREMODE_DIRECT_LOAL - // FIREMODE_DIRECT_LOAL - default { - LOG("Initiating FIREMODE_DIRECT_LOAL"); - _this call FUNC(guidance_LGB_LOAL); - }; -}; \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_seekerType_Optic.sqf b/addons/missileguidance/functions/fnc_seekerType_Optic.sqf new file mode 100644 index 0000000000..9539c2c8f6 --- /dev/null +++ b/addons/missileguidance/functions/fnc_seekerType_Optic.sqf @@ -0,0 +1,49 @@ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" + +EXPLODE_7_PVT(((_this select 1) select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); +private["_targets", "_foundTargetPos", "_launchParams", "_seekerParams", "_targetLaunchParams"]; + +_seekerTargetPos = _this select 0; + +_launchParams = _this select 1; +_target = (((_launchParams select 1) select 1) select 0); +_seekerParams = _launchParams select 3; + +TRACE_1("", _this); +TRACE_1("", _launchParams); + +// TODO:: Make sure the missile maintains LOS +_foundTargetPos = [0,0,0]; +if(!isNil "_target") then { + _foundTargetPos = getPosASL _target; +}; + +/* @TODO: This is seeker LOS and angle checks for LOAL only; LOBL does not need visual +_angleFov = _seekerParams select 0; +_angleOkay = [_projectile, _foundTargetPos, _angleFov] call FUNC(checkSeekerAngle); + +_losOkay = false; +if(_angleOkay) then { + _losOkay = [_projectile, _target] call FUNC(checkSeekerLos); +}; +TRACE_2("", _angleOkay, _losOkay); + +// If we got here, it was an invalid target, just return a spot 5m in front of the missile +if(!_angleOkay || !_losOkay) then { + _foundTargetPos = _sensorPos vectorAdd ((velocity _projectile) vectorMultiply 5); +} else { + TRACE_2("", _target, _foundTargetPos); + + // @TODO: Configurable lead for seekers + _projectileSpeed = (vectorMagnitude velocity _projectile); + _distanceToTarget = (getPosASL _projectile) vectorDistance _foundTargetPos; + + _eta = _distanceToTarget / _projectileSpeed; + + _adjustVelocity = (velocity _target) vectorMultiply _eta; + _foundTargetPos = _foundTargetPos vectorAdd _adjustVelocity; +}; + +*/ +_foundTargetPos; \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_seekerType_SALH.sqf b/addons/missileguidance/functions/fnc_seekerType_SALH.sqf new file mode 100644 index 0000000000..828550aeeb --- /dev/null +++ b/addons/missileguidance/functions/fnc_seekerType_SALH.sqf @@ -0,0 +1,26 @@ +//#define DEBUG_MODE_FULL +#include "script_component.hpp" + +EXPLODE_7_PVT(((_this select 1) select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); +_seekerTargetPos = _this select 0; + +_launchParams = _this select 1; +_seekerParams = _launchParams select 3; + +_laserResult = [(getPosASL _projectile), [ACE_DEFAULT_LASER_WAVELENGTH,ACE_DEFAULT_LASER_WAVELENGTH], ACE_DEFAULT_LASER_CODE] call EFUNC(laser,seekerFindLaserSpot); +_foundTargetPos = _laserResult select 0; +TRACE_1("Search", _laserResult); + + +if(!isNil "_foundTargetPos") then { + _angleFov = _seekerParams select 0; + _canSeeTarget = [_projectile, _foundTargetPos, _angleFov] call FUNC(checkSeekerAngle); + + // If we got here, it was an invalid target, just return a spot 5m in front of the missile + if(!_canSeeTarget) then { + _foundTargetPos = _sensorPos vectorAdd ((velocity _projectile) vectorMultiply 5); + }; + +}; + +_foundTargetPos; \ No newline at end of file diff --git a/addons/missileguidance/stringtable.xml b/addons/missileguidance/stringtable.xml new file mode 100644 index 0000000000..e0edd79308 --- /dev/null +++ b/addons/missileguidance/stringtable.xml @@ -0,0 +1,102 @@ + + + + + + Advanced Missile Guidance + Avanzada Misiles Orientación + Avancée Missile orientation + Zaawansowane naprowadzanie rakiet + Erweiterte Missile Guidance + Pokročilé řízení střel + Avanzato Missile Guidance + Avançado Missile Guidance + Részletes rakéta irányító + Расширенный ракетой + + + Enables advanced guidance mechanics and selection for different missiles and fire modes. + + + Włącza zaawansowaną mechanikę i wybór dla różnych rakiet i trybów strzału. + + Povoluje pokročilou mechaniku řízení střel. + + + + + + + Hydra-70 DAGR Missile + + + Hydra-70 DAGR + + Hydra-70 DAGR + + + + + + + DAGR + + + DAGR + + DAGR + + + + + + + Hydra-70 DAGR Laser Guided Missile + + + Laserowo naprowadzana rakieta Hydra-70 DAGR + + Hydra-70 DAGR laserem naváděná střela + + + + + + + Hellfire II AGM-114K Missile + + + Hellfire II AGM-114K + + Hellfire II AGM-114K + + + + + + + AGM-114K + + + AGM-114K + + AGM-114K + + + + + + + Hellfire II AGM-114K Laser Guided Missile + + + Laserowo naprowadzana rakieta Hellfire II AGM-114K + + Hellfire II AGM-114K laserem naváděná střela + + + + + + + diff --git a/addons/movement/XEH_postInit.sqf b/addons/movement/XEH_postInit.sqf index 310b689e15..224cd93273 100644 --- a/addons/movement/XEH_postInit.sqf +++ b/addons/movement/XEH_postInit.sqf @@ -1,6 +1,8 @@ //by commy2 #include "script_component.hpp" +if (!hasInterface) exitWith {}; + ["inventoryDisplayLoaded", { [{ diff --git a/addons/movement/stringtable.xml b/addons/movement/stringtable.xml index d31896acaa..8265c25074 100644 --- a/addons/movement/stringtable.xml +++ b/addons/movement/stringtable.xml @@ -1,5 +1,5 @@  - + @@ -8,7 +8,7 @@ Mostrar peso en libras Afficher le poids en lb Pokaż ciężar w funtach - Zobrazit váhu v lb + Zobrazit váhu v librách Mostra peso in libbre Mostrar peso em libras Súly megjelenítése fontban. @@ -28,6 +28,7 @@ Climb + Monter Klettern Wspinaczka Trepar @@ -36,6 +37,7 @@ Can't climb here + je ne peux pas monter ici Kann hier nicht klettern Nie możesz wspiąć się tutaj No se puede trepar aquí @@ -43,4 +45,4 @@ Не можете подняться здесь - \ No newline at end of file + diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index 622df44aca..4e4bdd0641 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -1,81 +1,98 @@  - + - - - Show Names - Namen anzeigen - Mostrar nombres - Afficher noms - Zobrazit jména - Pokaż nazwy - Nevek mutatása - Показать имена - - - Show player names - Spielernamen anzeigen - Mostrar nombres de jugadores - Pokaż nazwy graczy - Afficher nom des joueurs - Játékosnevek mutatása - Zobrazit jména hráčů - Mostrar nomes de jogadores - Mostra i nomi dei giocatori - Показать имена игроков - - - Show player name only on cursor (requires player names) - Pokaż nazwę gracza tylko pod kursorem - Mostrar nombres solo en el cursor (requiere Mostrar nombres de jugadores) - 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) - Mostrar nome de jogador somente no cursor (requer nome de jogadores) - Játékosok nevének mutatása (névcímke szükséges) - Показать имена игроков только под курсором (требует имен игроков) - - - Show player name only on keypress (requires player names) - Spielernamen nur auf Tastendruck anzeigen (benötigt Spielernamen) - Mostrar nombres solo al pulsar (requiere Mostrar nombres de jugadores) - Noms uniquement sur pression de la touche (si noms affichés) - Zobrazit jména hráčů jen na klávesu (vyžaduje jména hráčů) - Pokaż nazwę gracza tylko po przytrzymaniu klawisza - Játékosnevek mutatása gombnyomásra(névcíme szükséges) - Показать имена игроков только по нажатию клавиши (требует имен игроков) - - - Show player ranks (requires player names) - Spielerränge anzeigen (benötig Spielernamen) - Pokaż rangi graczy (wymaga nazw graczy) - 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) - Mostrar patente de jogadores (requer nome de jogadores) - Játékosok rendfokozatának mutatása (névcímke szükséges) - Показать звания игроков (требует имен игроков) - - - Show vehicle crew info - Zeige Fahrzeugbesatzung - Mostrar tripulantes - Pokaż informacje o załodze pojazdu - Zobrazit info o posádce vozidla - Показать экипаж - - - Show name tags for AI units - - - Show SoundWaves (requires player names) - Zeigen Schallwelle (benötigt spielernamen) - Mostrar onda sonora (requiere Mostrar nombres de jugadores) - - - Default Nametag Color (Non Group Members) - - + + + Show Names + Namen anzeigen + Mostrar nombres + Afficher noms + Zobrazit jména + Pokaż imiona + Nevek mutatása + Показать имена + + + Show player names + Spielernamen anzeigen + Mostrar nombres de jugadores + Pokaż imiona graczy + Afficher nom des joueurs + Játékosnevek mutatása + Zobrazit jména hráčů + Mostrar nomes de jogadores + Mostra i nomi dei giocatori + Показать имена игроков + + + Show player name only on cursor (requires player names) + Pokaż imiona graczy tylko pod kursorem (wymagana opcja Pokaż imiona graczy) + Mostrar nombres solo en el cursor (requiere Mostrar nombres de jugadores) + 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) + Mostrar nome de jogador somente no cursor (requer nome de jogadores) + Játékosok nevének mutatása (névcímke szükséges) + Показать имена игроков только под курсором (требует имен игроков) + + + Show player name only on keypress (requires player names) + Spielernamen nur auf Tastendruck anzeigen (benötigt Spielernamen) + Mostrar nombres solo al pulsar (requiere Mostrar nombres de jugadores) + Noms uniquement sur pression de la touche (si noms affichés) + 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 gombnyomásra(névcíme szükséges) + Показать имена игроков только по нажатию клавиши (требует имен игроков) + + + Show player ranks (requires player names) + Spielerränge anzeigen (benötig Spielernamen) + Pokaż rangi graczy (wymagana opcja Pokaż imiona graczy) + 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) + Mostrar patente de jogadores (requer nome de jogadores) + Játékosok rendfokozatának mutatása (névcímke szükséges) + Показать звания игроков (требует имен игроков) + + + Show vehicle crew info + Afficher les informations de l'équipage du véhicule + Zeige Fahrzeugbesatzung + Mostrar tripulantes + Pokaż załogę pojazdu + Zobrazit info o posádce vozidla + Показать экипаж + + + 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 pour les unités IA + + + 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 l'ondulation audio (requiert les noms des joueurs) + + + Default Nametag Color (Non Group Members) + Voreingestellte Namenfarbe (Spieler außerhalb der Gruppe) + Цвет меток игроков (не членов групп) + Color de etiquetas de nombre por defecto (No miembros de grupo) + Domyślny kolor imion (członkowie spoza grupy) + Couleur par défaut pour les noms (unités non groupées) + Standardní barva jmenovek (pro nečleny jednotky) + + \ No newline at end of file diff --git a/addons/nightvision/XEH_postInitClient.sqf b/addons/nightvision/XEH_postInitClient.sqf index 9d64baecb3..376059ce1b 100644 --- a/addons/nightvision/XEH_postInitClient.sqf +++ b/addons/nightvision/XEH_postInitClient.sqf @@ -40,7 +40,7 @@ GVAR(ppEffectMuzzleFlash) ppEffectCommit 0; ["ACE3", QGVAR(IncreaseNVGBrightness), localize "STR_ACE_NightVision_IncreaseNVGBrightness", { // 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}; // Conditions: specific if ((currentVisionMode _player != 1)) exitWith {false}; @@ -54,7 +54,7 @@ GVAR(ppEffectMuzzleFlash) ppEffectCommit 0; ["ACE3", QGVAR(DecreaseNVGBrightness), localize "STR_ACE_NightVision_DecreaseNVGBrightness", { // 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}; // Conditions: specific if ((currentVisionMode _player != 1)) exitWith {false}; diff --git a/addons/nightvision/stringtable.xml b/addons/nightvision/stringtable.xml index 16ead016da..2dad02e3bd 100644 --- a/addons/nightvision/stringtable.xml +++ b/addons/nightvision/stringtable.xml @@ -1,5 +1,5 @@  - + @@ -84,7 +84,7 @@ NS-Brille (Weitwinkel) Sistema de visión nocturna (Panorámicas) Gogle noktowizyjne (panoramiczne) - Noktovizor (Široký) + Noktovizor (Širokoúhlý) ПНВ (Широкий) @@ -92,7 +92,7 @@ Helligkeit: %1 Brillo: %1 Czułość: %1 - Zvýšení: %1 + Jas: %1 Luminosité : %1 Контраст: Fényerő: %1 @@ -124,4 +124,4 @@ Riduci la luminosità dell'NVG - + \ No newline at end of file diff --git a/addons/noradio/XEH_post_initClient.sqf b/addons/noradio/XEH_post_initClient.sqf index e192a101f8..4f35a1ced9 100644 --- a/addons/noradio/XEH_post_initClient.sqf +++ b/addons/noradio/XEH_post_initClient.sqf @@ -1,31 +1,29 @@ // by commy2 - #include "script_component.hpp" +/* _setupPlayer = { - if (!isNull ACE_player) then { - [(_this select 1)] call cba_fnc_removePerFrameHandler; + if (!isNull ACE_player) then { + [(_this select 1)] call cba_fnc_removePerFrameHandler; - [ACE_player] call EFUNC(common,muteUnit); - ACE_player setVariable [QGVAR(isMuted), true, true]; - }; + [ACE_player, "isPlayer"] call EFUNC(common,muteUnit); + }; }; [_setupPlayer, 0, []] call CBA_fnc_addPerFrameHandler; +*/ + +if (!hasInterface) exitWith {}; // Mutes/unmutes units when the player changes ["playerChanged", { - EXPLODE_2_PVT(_this,_newPlayer,_oldPlayer); + EXPLODE_2_PVT(_this,_newPlayer,_oldPlayer); - // On player change mute the new player - [_newPlayer] call EFUNC(common,muteUnit); - _newPlayer setVariable [QGVAR(isMuted), true, true]; - - // Unmute the old player - //@todo: sort interaction with medical system - if (!(_oldPlayer getVariable ["ACE_isUnconscious", false]) && {alive _oldPlayer}) then { - [_oldPlayer] call EFUNC(common,unMuteUnit); - }; - _oldPlayer setVariable [QGVAR(isMuted), false, true]; + // On player change mute the new player + [_newPlayer, "isPlayer"] call EFUNC(common,muteUnit); + // Unmute the old player + if (alive _oldPlayer) then { + [_oldPlayer, "isPlayer"] call EFUNC(common,unmuteUnit); + }; }] call EFUNC(common,addEventhandler); diff --git a/addons/noradio/XEH_post_initServer.sqf b/addons/noradio/XEH_post_initServer.sqf index 90b7473144..ae2dc16ec1 100644 --- a/addons/noradio/XEH_post_initServer.sqf +++ b/addons/noradio/XEH_post_initServer.sqf @@ -1,10 +1,6 @@ // by commy2 - #include "script_component.hpp" addMissionEventHandler ["HandleDisconnect", { - if !((_this select 0) getVariable ["ACE_isUnconscious", false]) then { //@ToDo: ai waking up will be silent? - _this call EFUNC(common,unMuteUnit); - }; - (_this select 0) setVariable [QGVAR(isMuted), false, true]; + [_this select 0, "isPlayer"] call EFUNC(common,unmuteUnit); }]; diff --git a/addons/optics/CfgVehicles.hpp b/addons/optics/CfgVehicles.hpp index 4ae648964e..92abeac04f 100644 --- a/addons/optics/CfgVehicles.hpp +++ b/addons/optics/CfgVehicles.hpp @@ -13,7 +13,7 @@ class CfgVehicles { MACRO_ADDITEM(ACE_optic_SOS_PIP,2); MACRO_ADDITEM(ACE_optic_LRPS_2D,2); MACRO_ADDITEM(ACE_optic_LRPS_PIP,2); - MACRO_ADDITEM(ACE_optic_DMS,2); + //MACRO_ADDITEM(ACE_optic_DMS,2); }; }; }; diff --git a/addons/optics/CfgWeapons.hpp b/addons/optics/CfgWeapons.hpp index e105a1eab9..e42ae3780f 100644 --- a/addons/optics/CfgWeapons.hpp +++ b/addons/optics/CfgWeapons.hpp @@ -2,6 +2,23 @@ class CfgWeapons { class ItemCore; class InventoryOpticsItem_Base_F; + 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 + // 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; + midRange = 1000; + midRangeProbab = 0.01; + maxRange = 5000; + maxRangeProbab = 0.01; + }; // zooming reticle scopes class optic_DMS: ItemCore { @@ -13,7 +30,7 @@ class CfgWeapons { }; }; - class ACE_optic_DMS: optic_DMS { + /*class ACE_optic_DMS: optic_DMS { author = "$STR_ACE_Common_ACETeam"; _generalMacro = "ACE_optic_DMS"; scope = 1; @@ -36,7 +53,7 @@ class CfgWeapons { class Iron: Iron {}; }; }; - }; + };*/ // PIP scopes class optic_Hamr: ItemCore { @@ -230,6 +247,7 @@ class CfgWeapons { class Snip: Snip { modelOptics[] = {QUOTE(PATHTOF(models\ace_optics_pip.p3d)),QUOTE(PATHTOF(models\ace_optics_pip.p3d))}; }; + class Iron: Iron {}; }; }; }; @@ -297,7 +315,7 @@ class CowsSlot: SlotInfo { "ACE_optic_SOS_2D", "ACE_optic_SOS_PIP", "ACE_optic_LRPS_2D", - "ACE_optic_LRPS_PIP", - "ACE_optic_DMS" + "ACE_optic_LRPS_PIP" + //"ACE_optic_DMS" }; }; diff --git a/addons/optics/README.md b/addons/optics/README.md new file mode 100644 index 0000000000..2d7281cee7 --- /dev/null +++ b/addons/optics/README.md @@ -0,0 +1,11 @@ +ace_optics +=============== + +Adds animated 2D optics. Some of them use picture in picture. + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [commy2](https://github.com/commy2) diff --git a/addons/optics/config.cpp b/addons/optics/config.cpp index bae1da314b..224410cdec 100644 --- a/addons/optics/config.cpp +++ b/addons/optics/config.cpp @@ -13,8 +13,8 @@ class CfgPatches { "ACE_optic_SOS_2D", "ACE_optic_SOS_PIP", "ACE_optic_LRPS_2D", - "ACE_optic_LRPS_PIP", - "ACE_optic_DMS" + "ACE_optic_LRPS_PIP" + //"ACE_optic_DMS" }; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common"}; diff --git a/addons/optics/models/NWD_M22_5x.p3d b/addons/optics/models/NWD_M22_5x.p3d new file mode 100644 index 0000000000..b6df76e30b Binary files /dev/null and b/addons/optics/models/NWD_M22_5x.p3d differ diff --git a/addons/optics/reticles/4x_M22.paa b/addons/optics/reticles/4x_M22.paa new file mode 100644 index 0000000000..c685763a99 Binary files /dev/null and b/addons/optics/reticles/4x_M22.paa differ diff --git a/addons/optics/reticles/M22_font.paa b/addons/optics/reticles/M22_font.paa new file mode 100644 index 0000000000..539907d61f Binary files /dev/null and b/addons/optics/reticles/M22_font.paa differ diff --git a/addons/optics/reticles/bino_dirt.paa b/addons/optics/reticles/bino_dirt.paa new file mode 100644 index 0000000000..ea08efa3a7 Binary files /dev/null and b/addons/optics/reticles/bino_dirt.paa differ diff --git a/addons/optics/reticles/bino_ring.paa b/addons/optics/reticles/bino_ring.paa new file mode 100644 index 0000000000..53499af7ce Binary files /dev/null and b/addons/optics/reticles/bino_ring.paa differ diff --git a/addons/optics/stringtable.xml b/addons/optics/stringtable.xml index d34dd8b633..3e518a63d1 100644 --- a/addons/optics/stringtable.xml +++ b/addons/optics/stringtable.xml @@ -3,7 +3,6 @@ - RCO (2D) RCO (2D) RCO (2D) RCO (2D) @@ -16,11 +15,10 @@ - RCO (PIP) RCO (PIP) RCO (PIP) RCO (PIP) - RCO (PIP) + RCO (BIB) RCO (PIP) RCO (PIP) RCO (PIP) @@ -29,7 +27,6 @@ - ARCO (2D) ARCO (2D) ARCO (2D) ARCO (2D) @@ -42,11 +39,10 @@ - ARCO (PIP) ARCO (PIP) ARCO (PIP) ARCO (PIP) - ARCO (PIP) + ARCO (BIB) ARCO (PIP) ARCO (PIP) ARCO (PIP) @@ -55,7 +51,6 @@ - MRCO (2D) MRCO (2D) MRCO (2D) MRCO (2D) @@ -68,11 +63,10 @@ - MRCO (PIP) MRCO (PIP) MRCO (PIP) MRCO (PIP) - MRCO (PIP) + MRCO (BIB) MRCO (PIP) MRCO (PIP) MRCO (PIP) @@ -81,7 +75,6 @@ - MOS (2D) MOS (2D) MOS (2D) MOS (2D) @@ -94,11 +87,10 @@ - MOS (PIP) MOS (PIP) MOS (PIP) MOS (PIP) - MOS (PIP) + MOS (BIB) MOS (PIP) MOS (PIP) MOS (PIP) @@ -107,7 +99,6 @@ - LRPS (2D) LRPS (2D) LRPS (2D) LRPS (2D) @@ -120,11 +111,10 @@ - LRPS (PIP) LRPS (PIP) LRPS (PIP) LRPS (PIP) - LRPS (PIP) + LRPS (BIB) LRPS (PIP) LRPS (PIP) LRPS (PIP) diff --git a/addons/optionsmenu/stringtable.xml b/addons/optionsmenu/stringtable.xml index 76407da435..1f598a2a75 100644 --- a/addons/optionsmenu/stringtable.xml +++ b/addons/optionsmenu/stringtable.xml @@ -1,107 +1,186 @@  - + - - - ACE Options - ACE Optionen - Opciones ACE - Opcje ACE - ACE Nastavení - ACE Options - ACE Настройки - Opções do ACE - ACE Opciók - Opzioni ACE - - - Fix Animation - - - Reset All - Rücksetzen - - - Colors - Farben - цвета - Colors - - - Options - Optionen - Opciones - Opcje - Nastavení - Options - Настройки - Opções - Opciók - Opzioni - - - Values - - - Yes - Ja - Si - Tak - Ano - Oui - Да - Igen - Sim - Si - - - No - Nein - No - Nie - Ne - Non - Нет - Nem - Não - No - - - Setting: - Nastavení: - Einstellung: - Yстановки: - Ajuste: - - - Export - - - Open Export Menu - - - String input. - - - Array. Seperate elements by using ,. - - - Number - - - Uknown input type - - - Save input - - - Include Client Settings - - - Exclude Client Settings - - - Settings exported to clipboard - - + + + ACE Options + ACE Optionen + Opciones ACE + Ustawienia ACE + ACE Nastavení + ACE Options + ACE Настройки + Opções do ACE + ACE Opciók + Opzioni ACE + + + Fix Animation + Behebe Animation + Arreglar animación + Фикс анимации + Opravit animace + Napraw animację + Corriger l'Animation + + + Reset All + Alles Zurücksetzen + Reiniciar todo + Полный сброс + Vyresetovat vše + Resetuj wszystko + Par défaut + + + Colors + Couleurs + Farben + Colores + Цвета + Barvy + Kolory + + + Options + Optionen + Opciones + Opcje + Nastavení + Options + Настройки + Opções + Opciók + Opzioni + + + Values + Valores + Значения + Hodnoty + Wartości + Valeurs + Werte + + + Yes + Ja + Si + Tak + Ano + Oui + Да + Igen + Sim + Si + + + No + Nein + No + Nie + Ne + Non + Нет + Nem + Não + No + + + Setting: + Nastavení: + Einstellung: + Установки: + Ajuste: + Ustawienie: + + + Export + Exportieren + Exportar + Экспорт + Exportovat + Eksport + Exporter + + + Open Export Menu + Öffne Exportmenü + Abrir menu d'exportación + Открыть меню экспорта + Otevřít exportovací menu + Otwórz menu eksportowania + Ouvrir le menu d'exportation + + + String input. + String input. + Introducir frase + Строчный ввод. + Wpisywanie tekstu. + + + Array. Seperate elements by using ,. + Array. Teile unterschiedliche Elemente mit ,. + Matriz. Separa elementos usando ,. + Массив. Разделяйте элемены, используя запятую. + Tablica. Oddziel elementy używając ,. + Array. Séparer les élements en utilisant ,. + Tabulka. Odděl elementy použitím ,. + + + Number + Nummer + Numero + Число + Číslo + Cyfra + Nombre + + + Uknown input type + Unbekannter Eingabetyp + Tipo de entrada desconocida + Неизвестный тип ввода + Neznámý vstup + Nieznany rodzaj danych + Input inconnue + + + Save input + Speichere Eingabe + Guardar entrada + Сохранить ввод + Uložit vstup + Zapisz dane + Sauvegarder les inputs + + + Include Client Settings + Beinhalte Client-Einstellungen + Incluir configuración de cliente + Включить настройки клиента + Zahrnout nastavení klienta + Zawrzyj ustawienia klienta + Inclure les paramètres de client + + + Exclude Client Settings + Schließe Client-Einstellungen aus + Excluir configuración de cliente + Исключить настройки клиента + Nezahrnout nastavení klienta + Wyklucz ustawienia klienta + Exclure les paramètres de client + + + Settings exported to clipboard + Einstellungen in die Zwischenablage exportiert + Configuración exportada al portapapeles + Настройки экспортированы в буфер обмена + Nastevení exportována do schránky + Ustawienia wyeksportowano do schowka + Paramètres exportés dans le presse-papier + + \ No newline at end of file diff --git a/addons/overheating/CfgVehicles.hpp b/addons/overheating/CfgVehicles.hpp index aa01c66ec7..5c7f7b9eb6 100644 --- a/addons/overheating/CfgVehicles.hpp +++ b/addons/overheating/CfgVehicles.hpp @@ -13,16 +13,16 @@ class CfgVehicles { icon = QUOTE(PATHTOF(UI\spare_barrel_ca.paa)); hotkey = "B"; }; - }; - class ACE_CheckTemperature { - displayName = "$STR_ACE_Overheating_CheckTemperatureShort"; - condition = QUOTE( currentWeapon _player in [ARR_3(primaryWeapon _player, secondaryWeapon _player, handgunWeapon _player)] ); - exceptions[] = {"isNotInside"}; - statement = QUOTE( [ARR_2(_player, currentWeapon _player)] call FUNC(CheckTemperature); ); - showDisabled = 0; - priority = 3.1; - icon = QUOTE(PATHTOF(UI\temp_ca.paa)); - hotkey = "P"; + class ACE_CheckTemperature { + displayName = "$STR_ACE_Overheating_CheckTemperatureShort"; + condition = "switch (currentWeapon _player) do {case (''): {false}; case (primaryWeapon _player); case (secondaryWeapon _player); case (handgunWeapon _player): {true}; default {false}}"; + exceptions[] = {"isNotInside"}; + statement = QUOTE( [ARR_2(_player, currentWeapon _player)] call FUNC(CheckTemperature); ); + showDisabled = 0; + priority = 2.9; + icon = QUOTE(PATHTOF(UI\temp_ca.paa)); + hotkey = "P"; + }; }; }; }; diff --git a/addons/overheating/functions/fnc_displayTemperature.sqf b/addons/overheating/functions/fnc_displayTemperature.sqf index 5c17794cde..6112bea178 100644 --- a/addons/overheating/functions/fnc_displayTemperature.sqf +++ b/addons/overheating/functions/fnc_displayTemperature.sqf @@ -45,7 +45,7 @@ _color = [ 00 ]; -_count = 2 + round (10 * _scaledTemperature); +_count = round (12 * _scaledTemperature); _string = ""; for "_a" from 1 to _count do { _string = _string + "|"; @@ -59,7 +59,7 @@ for "_a" from (_count + 1) to 12 do { _text = composeText [ _text, - [_string, [0.5, 0.5, 0.5]] call EFUNC(common,stringToColoredTex)t + [_string, [0.5, 0.5, 0.5]] call EFUNC(common,stringToColoredText) ]; _picture = getText (configFile >> "CfgWeapons" >> _weapon >> "picture"); diff --git a/addons/overheating/stringtable.xml b/addons/overheating/stringtable.xml index 5d2c9595df..7dec557a2d 100644 --- a/addons/overheating/stringtable.xml +++ b/addons/overheating/stringtable.xml @@ -1,156 +1,162 @@  - + - - - Display text on jam - - - Display a notification whenever your weapon gets jammed - - - Spare barrel - Ersatzlauf - Cañón de repuesto - Zapasowa lufa - Náhradní hlaveň - Deuxième canon - Запасной ствол - Tartalék cső - Cano Reserva - Canna di ricambio - - - Use to swap barrel. - Benutzen, um Lauf zu wechseln. - Permite intercambiar el cañón - Umożliwia wymianę lufy - Používané k výměně hlavně - Utilisé pour changer de canon. - Используется для смены ствола. - Cső kicseréléséhez. - Use para trocar o cano/estriamento. - Usata per cambiare la canna. - - - Weapon jammed! - Ladehemmung! - Arma encasquillada! - Broń się zacięła! - Zbraň se zasekla! - Arme enrayée - Оружие заклинило! - Elakadt a fegyver! - Arma travada! - Arma inceppata! - - - Clear jam - Ladehemmung beheben - Desencasquillar el arma - Usuń zacięcie - Uvolnit zbraň - Désenrayer l'arme - Исправить клин оружия. - Hárítsd el az akadályt! - Destravar arma - Ripulisci l'arma - - - Jam cleared - Ladehemmung behoben - Arma desencasquillada - Zacięcie usunięte - Zbraň uvolněna - Arme désenrayée - Оружие исправлено - Akadály elhárítva! - Arma destravada - Arma pronta al fuoco - - - Swap barrel - Lauf wechseln - Cambiar el cañón - Wymień lufę - Vyměnit hlaveň - Changer de canon - Сменить ствол - Cserélj csövet! - Substituir cano - Sostiuisci la canna - - - Swapping barrel... - Lauf wird gewechselt... - Cambiando el cañón... - Wymienianie lufy... - Vyměňuji hlaveň ... - Changement du canon... - Смена ствола... - Cső cserélése... - Substituindo cano... - Sto sostituendo la canna ... - - - Swapped barrel - Lauf gewechselt - Cañón cambiado - Lufa wymieniona - Hlaveň vyměněna - Canon changé - Ствол сменен - Cső kicserélve! - Cano substituído - Canna sostituita - - - Check weapons temperature - Temperatur der Waffe prüfen - Verificar temperatura del arma - Sprawdź temperaturę broni - Vérifier la température de l'arme - Hőmérséklet ellenőrzése - Zjistit teplotu zbraně - Conferir temperatura da arma - Controlla la temperatura della canna - Проверить температуру оружия - - - Check<br/>temperature - Temperatur<br/>prüfen - Verificar<br/>temperatura - Sprawdź<br/>temperaturę - Vérifier la<br/>température - Hőmérséklet<br/>ellenőrzése - Zjistit<br/>teplotu - Conferir<br/>temperatura - Controlla la<br/>temperatura - Проверить<br/>температуру - - - Checking temperature ... - Prüfe Temperatur ... - Verificando temperatura ... - Sprawdzanie temperatury ... - Vérification de la température ... - Hőmérséklet ellenőrzése... - Zjišťuju teplotu ... - Conferindo temperatura ... - Sto controllando la temperatura ... - Проверка температуры ... - - - Temperature - Temperatur - Temperatura - Temperatura - Température - Hőmérséklet - Teplota - Temperatura - Temperatura - Температура - - + + + Display text on jam + Zeige Text bei Ladehemmung + Mostrar texto al encasquillar + Показывать текст, когда клинит оружие + Zobrazit upozornění při zaseknutí + Wyświetl tekst przy zacięciu broni + Afficher un texte à la surchauffe + + + 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 + Afficher un texte quand votre arme surchauffe + + + Spare barrel + Ersatzlauf + Cañón de repuesto + Zapasowa lufa + Náhradní hlaveň + Deuxième canon + Запасной ствол + Tartalék cső + Cano Reserva + Canna di ricambio + + + Use to swap barrel. + Benutzen, um Lauf zu wechseln. + Permite intercambiar el cañón + Umożliwia wymianę lufy + Používané k výměně hlavně + Utilisé pour changer de canon. + Используется для смены ствола. + Cső kicseréléséhez. + Use para trocar o cano/estriamento. + Usata per cambiare la canna. + + + Weapon jammed! + Ladehemmung! + Arma encasquillada! + Zacięcie! + Zbraň se zasekla! + Arme enrayée + Оружие заклинило! + Elakadt a fegyver! + Arma travada! + Arma inceppata! + + + Clear jam + Ladehemmung beheben + Desencasquillar el arma + Usuń zacięcie + Uvolnit zbraň + Désenrayer l'arme + Исправить клин оружия. + Hárítsd el az akadályt! + Destravar arma + Ripulisci l'arma + + + Jam cleared + Ladehemmung behoben + Arma desencasquillada + Zacięcie usunięte + Zbraň uvolněna + Arme désenrayée + Оружие исправлено + Akadály elhárítva! + Arma destravada + Arma pronta al fuoco + + + Swap barrel + Lauf wechseln + Cambiar el cañón + Wymień lufę + Vyměnit hlaveň + Changer de canon + Сменить ствол + Cserélj csövet! + Substituir cano + Sostiuisci la canna + + + Swapping barrel... + Lauf wird gewechselt... + Cambiando el cañón... + Wymienianie lufy... + Vyměňuji hlaveň ... + Changement du canon... + Смена ствола... + Cső cserélése... + Substituindo cano... + Sto sostituendo la canna ... + + + Swapped barrel + Lauf gewechselt + Cañón cambiado + Lufa wymieniona + Hlaveň vyměněna + Canon changé + Ствол сменен + Cső kicserélve! + Cano substituído + Canna sostituita + + + Check weapons temperature + Temperatur der Waffe prüfen + Verificar temperatura del arma + Sprawdź temperaturę broni + Vérifier la température de l'arme + Hőmérséklet ellenőrzése + Zjistit teplotu zbraně + Conferir temperatura da arma + Controlla la temperatura della canna + Проверить температуру оружия + + + Check weapon<br/>temperature + Verificar temperatura<br/>del arma + Sprawdź temperaturę<br/>broni + Zkontrolovat teplotu<br/>zbraně + + + Checking temperature ... + Prüfe Temperatur ... + Verificando temperatura ... + Sprawdzanie temperatury ... + Vérification de la température ... + Hőmérséklet ellenőrzése... + Zjišťuju teplotu ... + Conferindo temperatura ... + Sto controllando la temperatura ... + Проверка температуры ... + + + Temperature + Temperatur + Temperatura + Temperatura + Température + Hőmérséklet + Teplota + Temperatura + Temperatura + Температура + + \ No newline at end of file diff --git a/addons/parachute/CfgWeapons.hpp b/addons/parachute/CfgWeapons.hpp index 6388bbd5a1..067d065bf0 100644 --- a/addons/parachute/CfgWeapons.hpp +++ b/addons/parachute/CfgWeapons.hpp @@ -1,6 +1,8 @@ class CfgWeapons { class ItemWatch; - class ACE_Altimeter:ItemWatch { + class ACE_Altimeter: ItemWatch { + ACE_hideItemType = "Watch"; + author = "$STR_ACE_Common_ACETeam"; descriptionShort = "$STR_ACE_Parachute_AltimeterDescription"; displayName = "$STR_ACE_Parachute_AltimeterDisplayName"; diff --git a/addons/realisticnames/stringtable.xml b/addons/realisticnames/stringtable.xml index 9ccd7752d2..8f67b3f6cd 100644 --- a/addons/realisticnames/stringtable.xml +++ b/addons/realisticnames/stringtable.xml @@ -1,5 +1,5 @@  - + @@ -31,7 +31,7 @@ XM312 (Hoch) XM312 (Alto) XM312 (Haut) - XM312 (Vysoký) + XM312 (vysoká montáž) XM312 (Wysoki) XM312 (Высокий) XM312 (Alta) @@ -67,7 +67,7 @@ XM307 (Hoch) XM307 (Alto) XM307 (Haut) - XM307 (Vysoký) + XM307 (vysoká montáž) XM307 (Wysoki) XM307 (Высокий) XM307 (Alta) @@ -591,7 +591,7 @@ Typhoon Transport Typhoon de transporte Typhoon Transportowy - Typhoon Valník + Typhoon valník Typhoon Transport Тайфун Транспортный Typhoon Transporte @@ -603,7 +603,7 @@ Typhoon Transport (bedeckt) Typhoon de transporte (cubierto) Typhoon Transportowy (przykryty) - Typhoon Valník (krytý) + Typhoon valník (krytý) Typhoon Transport (bâché) Тайфун Транспортный (kрытый) Typhoon Transporte (coberto) @@ -615,7 +615,7 @@ Typhoon Gerät Typhoon de dispositivo Typhoon Urządzenie - Typhoon Zařízení + Typhoon zařízení Typhoon Dispositif Тайфун Устройство Typhoon Dispositivo @@ -627,7 +627,7 @@ Typhoon Munition Typhoon de munición Typhoon Amunicyjny - Typhoon Muniční + Typhoon muniční Typhoon Munitions Тайфун Боеприпасы Typhoon Munições @@ -639,7 +639,7 @@ Typhoon Treibstoff Typhoon de combustible Typhoon Cysterna - Typhoon Cisterna + Typhoon cisterna Typhoon Citerne Тайфун Заправщик Typhoon Combustível @@ -651,7 +651,7 @@ Typhoon Instandsetzung Typhoon de reparación Typhoon Naprawczy - Typhoon Opravárenský + Typhoon opravárenský Typhoon Réparation Тайфун Ремонтный Typhoon Reparador @@ -663,7 +663,7 @@ Typhoon Sanitäter Typhoon médico Typhoon Medyczny - Typhoon Zdravotnický + Typhoon zdravotnický Typhoon Sanitaire Тайфун Медицинский Typhoon Médico @@ -724,7 +724,7 @@ CH-47I Chinnok (Desarmado) CH-47I Chinook (nieuzbrojony) CH-47I Chinook (невооруженный) - CH-47I Chinook (Neozbrojený) + CH-47I Chinook (neozbrojený) A-10D Thunderbolt II @@ -863,7 +863,7 @@ M18A1 Claymore M18A1 Claymore Mina kierunkowa M18A1 Claymore - M18A1 Mina Claymore + Mina Claymore M18A1 M18A1 Claymore Mine antipersonnel à effet dirigé M18A1 Клеймор M18A1 Claymore @@ -875,7 +875,7 @@ M183 Geballte Sprengladung Conjunto de carga de demolición M183 Ładunek burzący M183 - M183 Demoliční nálož + Demoliční nálož M183 M183 Charge de Démolition M183 Комплектный подрывной заряд M183 Sacola de Demolição @@ -887,7 +887,7 @@ M112 Sprengladung Bloque de demolición M112 Ładunek burzący M112 - M112 Výbušná nálož + Výbušná nálož M112 Pétard M112 M112 подрывной заряд M112 Carga de Demolição @@ -899,7 +899,7 @@ M67 Splittergranate Granada de fragmentación M67 Granat obronny M67 - M67 Granát + Granát M67 M67 Grenade à fragmentation M67 ручная осколочная граната M67 Granada de fragmentação @@ -911,9 +911,9 @@ M83 Rauchgranate (Weiss) Granada de humo M83 (Blanco) Granat dymny M83 (Biały) - M83 Kouřový Granát (Bílý) + M83 Kouřový Granát (bílý) M83 Grenade fumigène (Blanche) - M83 дымовой гранаты (Белый) + M83 дымовая граната (Белый) M83 Granada de fumaça (Branca) M83 füstgránát (Fehér) M83 Granata fumogena (Bianco) @@ -923,9 +923,9 @@ M18 Rauchgranate (Blau) Granada de humo M18 (Azul) Granat dymny M18 (Niebieski) - M18 Kouřový Granát (Modrý) + M18 Kouřový Granát (modrý) M18 Grenade fumigène (Bleue) - M18 дымовой гранаты (Синий) + M18 дымовая граната (Синий) M18 Granada de fumaça (Azul) M18 füstgránát (Kék) M18 Granata fumogena (Blu) @@ -935,9 +935,9 @@ M18 Rauchgranate (Grün) Granada de humo M18 (Verde) Granat dymny M18 (Zielony) - M18 Kouřový Granát (Zelený) + M18 Kouřový Granát (zelený) M18 Grenade fumigène (Verte) - M18 дымовой гранаты (Зелёный) + M18 дымовая граната (Зелёный) M18 Granada de fumaça (Verde) M18 füstgránát (Zöld) M18 Granata fumogena (Verde) @@ -947,9 +947,9 @@ M18 Rauchgranate (Orange) Granada de humo M18 (Naranja) Granat dymny M18 (Pomarańczowy) - M18 Kouřový Granát (Oranžový) + M18 Kouřový Granát (oranžový) M18 Grenade fumigène (Orange) - M18 дымовой гранаты (Оранжевый) + M18 дымовая граната (Оранжевый) M18 Granada de fumaça (Laranja) M18 füstgránát (Narancssárga) M18 Granata fumogena (Arancione) @@ -959,9 +959,9 @@ M18 Rauchgranate (Violett) Granada de humo M18 (Púrpura) Granat dymny M18 (Fioletowy) - M18 Kouřový Granát (Fialový) + M18 Kouřový Granát (fialový) M18 Grenade fumigène (Pourpre) - M18 дымовой гранаты (Пурпурный) + M18 дымовая граната (Пурпурный) M18 Granada de fumaça (Roxa) M18 füstgránát (Lila) M18 Granata fumogena (Viola) @@ -971,9 +971,9 @@ M18 Rauchgranate (Rot) Granada de humo M18 (Rojo) Granat dymny M18 (Czerwony) - M18 Kouřový Granát (Červený) + M18 Kouřový Granát (červený) M18 Grenade fumigène (Rouge) - M18 дымовой гранаты (Красный) + M18 дымовая граната (Красный) M18 Granada de fumaça (Vermelha) M18 füstgránát (Piros) M18 Granata fumogena (Rosso) @@ -983,9 +983,9 @@ M18 Rauchgranate (Gelb) Granada de humo M18 (Amarillo) Granat dymny M18 (Żółty) - M18 Kouřový Granát (Žlutý) + M18 Kouřový Granát (žlutý) M18 Grenade fumigène (Jaune) - M183 дымовой гранаты (Жёлтые) + M183 дымовая граната (Жёлтые) M18 Granada de fumaça (Amarela) M18 füstgránát (Sárga) M18 Granata fumogena (Giallo) @@ -995,7 +995,7 @@ M15 Panzerabwehrmine Mina antitanque M15 Mina przeciwpancerna M15 - M15 Protitanková Mina + Protitanková mina M15 M15 Mine antichar M15 противотанковая мина M15 Mina anticarro @@ -1007,7 +1007,7 @@ VS-50 Antipersonenmine Mina antipersona VS-50 Mina przeciwpiechotna VS-50 - VS-50 Protipěchotní Mina + Protipěchotní mina VS-50 VS-50 Mine antipersonnel à pression VS-50 Противопехотная мина VS-50 Mina antipessoal @@ -1019,7 +1019,7 @@ M26 Antipersonensprungmine Mina antipersona M26 Mina przeciwpiechotna M26 - M26 Šrapnelová Mina + Šrapnelová mina M26 M26 Mine antipersonnel bondissante M26 Противопехотная мина M26 Mina saltadora antipessoal @@ -1031,7 +1031,7 @@ PMR-3 Antipersonenstolperdrahtmine Mina antipersona de alambre PMR-3 Mina przeciwpiechotna PMR-3 - PMR-3 Nástražná Mina + Nástražná mina PMR-3 PMR-3 Mine antipersonnel à traction PMR-3 Противопехотная мина PMR-3 Mina antipessoal (armadilha) @@ -1041,270 +1041,378 @@ P99 P99 + P99 + P99 MP-443 Grach MP-443 Grach + MP-443 Grach + MP-443 Grach ACP-C2 ACP-C2 + ACP-C2 + ACP-C2 FNX-45 Tactical FNX-45 Tactical + FNX-45 Tactical + FNX-45 Tactical Chiappa Rhino 60DS Chiappa Rhino 60DS + Chiappa Rhino 60DS + Chiappa Rhino 60DS Taurus Judge Taurus Judge + Taurus Judge + Taurus Judge NLAW NLAW + NLAW + NLAW RPG-32 RPG-32 + RPG-32 + RPG-32 Mini-Spike (AA) Mini-Spike (AA) + Mini-Spike (PL) + Mini-Spike (AA) Mini-Spike (AT) Mini-Spike (AT) + Mini-Spike (PT) + Mini-Spike (AA) MX MX + MX + MX MX (Black) MX (Black) + MX (Czarny) + MX (černý) MXC MXC + MXC + MXC MXC (Black) MXC (Black) + MXC (Czarny) + MXC (černý) MX 3GL MX 3GL + MX 3GL + MX 3GL MX 3GL (Black) MX 3GL (Black) + MX 3GL (Czarny) + MX 3GL (černý) MX LSW MX LSW + MX LSW + MX LSW MX LSW (Black) MX LSW (Black) + MX LSW (Czarny) + MX LSW (černý) MXM MXM + MXM + MXM MXM (Black) MXM (Black) + MXM (Czarny) + MXM (černý) KT2002 Katiba KT2002 Katiba + KT2002 Katiba + KT2002 Katiba KT2002C Katiba KT2002C Katiba + KT2002C Katiba + KT2002C Katiba KT2002 Katiba KGL KT2002 Katiba KGL + KT2002 Katiba KGL + KT2002 Katiba KGL F2000 (Camo) F2000 (Camo) + F2000 (kamuflaż) + F2000 (kamufláž F2000 F2000 + F2000 + F2000 F2000 Tactical (Camo) F2000 Tactical (Camo) + F2000 Tactical (kamuflaż) + F2000 Tactical (černý) F2000 Tactical F2000 Tactical + F2000 Tactical + F2000 Tactical F2000 EGLM (Camo) F2000 EGLM (Camo) + F2000 EGLM (kamuflaż) + F2000 EGLM (kamufláž) F2000 EGLM F2000 EGLM + F2000 EGLM + F2000 EGLM TAR-21 TAR-21 + TAR-21 + TAR-21 CTAR-21 CTAR-21 + CTAR-21 + CTAR-21 TAR-21 EGLM TAR-21 EGLM + TAR-21 EGLM + TAR-21 EGLM Vector SMG Vector SMG + Vector SMG + Vector SMG Scorpion Evo 3 A1 Scorpion Evo 3 A1 + Scorpion Evo 3 A1 + Scorpion Evo 3 A1 CPW CPW + CPW + CPW RFB SDAR RFB SDAR + RFB SDAR + RFB SDAR Stoner 99 LMG Stoner 99 LMG + Stoner 99 LMG + Stoner 99 LMG Negev NG7 Negev NG7 + Negev NG7 + Negev NG7 Mk14 Mod 1 EBR Mk14 Mod 1 EBR + Mk14 Mod 1 EBR + Mk14 Mod 1 EBR GM6 Lynx GM6 Lynx + GM6 Lynx + GM6 Lynx GM6 Lynx (Camo) GM6 Lynx (Camo) + GM6 Lynx (kamuflaż) + GM6 Lynx (kamufláž) M200 Intervention M200 Intervention + M200 Intervention + M200 Intervention M200 Intervention (Camo) M200 Intervention (Camo) + M200 Intervention (kamuflaż) + M200 Intervention (kamufláž) VS-121 VS-121 + VS-121 + VS-121 - TODO: MAR-10 .338 + TODO: MAR-10 .338 TODO: MAR-10 .338 (Black) + TODO: MAR-10 .338 (Black) TODO: MAR-10 .338 (Camo) + TODO: MAR-10 .338 (Camo) TODO: MAR-10 .338 (Sand) + TODO: MAR-10 .338 (Sand) - 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 (Black) TODO: Mk-I EMR 7.62 mm (Khaki) + TODO: Mk-I EMR 7.62 mm (Khaki) TODO: Mk-I EMR 7.62 mm (Sand) + TODO: Mk-I EMR 7.62 mm (Sand) TODO: Mk-I EMR 7.62 mm (Camo) + TODO: Mk-I EMR 7.62 mm (Camo) TODO: Mk-I EMR 7.62 mm (Woodland) + TODO: Mk-I EMR 7.62 mm (Woodland) TODO: NATO DMR (provisional) spotter + TODO: NATO DMR (provisional) spotter - 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 (Black) 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 (Black) 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 (Camo) TODO: Mk14 7.62 mm (Olive) + TODO: Mk14 7.62 mm (Olive) - 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 (Black) TODO: SPMG .338 (Sand) + TODO: SPMG .338 (Sand) - - + \ No newline at end of file diff --git a/addons/reload/stringtable.xml b/addons/reload/stringtable.xml index 40f36c6549..8911c288ea 100644 --- a/addons/reload/stringtable.xml +++ b/addons/reload/stringtable.xml @@ -1,12 +1,23 @@ - - + Check ammo on weapon reload + Prüfe Munition beim Nachladen + Comprovar munición al recargar el arma + Проверять боезапас при перезарядке + Zkontrolovat munici při nabití + Sprawdź stan amunicji przy przeładowaniu broni + Vérifier les munitions pendant le rechargement d'une arme Check the ammo in your new magazine on magazine reload. + Prüfe nachgeladenes Magazin + Comprueva la munición del nuevo cargador al recargar. + Проверяет количество патронов в новом магазине при перезарядке. + Kontroluje munice při nabití nového zásobníku. + Pokaż stan amunicji w nowym magazynku przy przeładowaniu broni + Vérifier les munitions dans votre nouveau chargeur au rechargement de vos chargeurs. Check Ammo @@ -34,9 +45,21 @@ Link belt + Attacher bande + Enlazar cinta + Сцепить ленты + Spojit pás munice + Podłącz taśmę + Gurt anhängen Linking belt... + Attachement de la bande ... + Enlazando cinta... + Сцепка лент ... + Spojuji pás... + Podłączanie taśmy... + Gurt anhängen ... diff --git a/addons/reloadlaunchers/stringtable.xml b/addons/reloadlaunchers/stringtable.xml index 6677153419..a7be29cc96 100644 --- a/addons/reloadlaunchers/stringtable.xml +++ b/addons/reloadlaunchers/stringtable.xml @@ -1,24 +1,40 @@  - Load launcher Panzerabwehr laden + Cargar lanzador + Зарядить ПУ + Nabít odpalovač + Załaduj wyrzutnię Loading launcher ... + Chargement du tube ... Panzerabwehr wird geladen ... + Cargando lanzador ... + Зарядка ПУ ... + Nabíjím odpalovač ... + Ładowanie wyrzutni ... Launcher loaded + Tube chargé Panzerabwehr geladen + Lanzador cargado + ПУ заряжено + Odpalovač nabit + Wyrzutnia załadowana - Load %1 + Chargé %1 Lade %1 + Cargar %1 + Загрузка %1 + Nabít %1 + Załadowano %1 - diff --git a/addons/respawn/stringtable.xml b/addons/respawn/stringtable.xml index 59a9b2b31c..ab229f727f 100644 --- a/addons/respawn/stringtable.xml +++ b/addons/respawn/stringtable.xml @@ -1,21 +1,42 @@  + - - - Deploy in 5 seconds ... - Wird in 5 Sekunden errichtet ... - - - Rallypoint deployed - Rallypoint errichtet - - - Teleported to Base - Zur Basis teleportiert - - - Teleported to Rallypoint - Zum Rallypoint teleportiert - - - + + + Deploy in 5 seconds ... + Déploiement dans 5 secondes ... + Wird in 5 Sekunden errichtet ... + Desplegando en 5 segundos ... + Возрождение через 5 секунд ... + Rozmieszczenie za 5 sekund ... + Respawn za 5 sekund... + + + Rallypoint deployed + Point de ralliement déployé + Rallypoint errichtet + Punto de reunión desplegado + Точка сбора установлена + Punkt zbiórki rozmieszczony + Rallypoint umístěn + + + Teleported to Base + Téléporté à la base + Zur Basis teleportiert + Teletransportado a base + Телепорт на базу + Przeteleportowano do bazy + Odteleportován na základnu + + + Teleported to Rallypoint + Téléporté au point de ralliement + Zum Rallypoint teleportiert + Teletransportado al punto de reunión + Телепорт на точку сбора + Przeteleportowano do punktu zbiórki + Odteleportován na rallypoint + + + \ No newline at end of file diff --git a/addons/safemode/XEH_postInit.sqf b/addons/safemode/XEH_postInit.sqf index ff6a76d834..aa13029547 100644 --- a/addons/safemode/XEH_postInit.sqf +++ b/addons/safemode/XEH_postInit.sqf @@ -1,6 +1,8 @@ // by esteldunedain #include "script_component.hpp" +if (!hasInterface) exitWith {}; + //["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/safemode/stringtable.xml b/addons/safemode/stringtable.xml index 9684babfdf..cb74ef060e 100644 --- a/addons/safemode/stringtable.xml +++ b/addons/safemode/stringtable.xml @@ -4,6 +4,7 @@ Safe Mode + Mode de sécurité Waffe sichern Seguro puesto Bezpiecznik @@ -13,6 +14,7 @@ Take off Safety + Retirer le cran de sureté Waffe entsichern Quitar seguro Zwolnij bezpiecznik @@ -22,6 +24,7 @@ Put on Safety + Mettre le cran de sureté Waffe gesichert Poner seguro Zabezpiecz broń @@ -31,6 +34,7 @@ Took off Safety + Enlever le cran de sureté Waffe entsichert Seguro quitado Odbezpieczono broń @@ -39,4 +43,4 @@ Снят с предохранителя - \ No newline at end of file + diff --git a/addons/switchunits/stringtable.xml b/addons/switchunits/stringtable.xml index 842bf89127..007b37b24f 100644 --- a/addons/switchunits/stringtable.xml +++ b/addons/switchunits/stringtable.xml @@ -1,8 +1,10 @@  + Switched unit + Unité à transférer Einheit gewechselt Юнит переключен Prohozená jednotka @@ -11,11 +13,12 @@ This unit is too close to the enemy. + Cette unité est trop près d'un ennemi. Diese Einheit ist zu nah am Feind. - Юнит слишком близок к противнику + Юнит слишком близок к противнику. Tato jednotka je moc blízko k nepříteli. Ta jednostka jest zbyt blisko przeciwnika. Esta unidad está demasiado cerca del enemigo. - + \ No newline at end of file diff --git a/addons/vector/XEH_postInit.sqf b/addons/vector/XEH_postInit.sqf index 8bbf7d7aa6..12f643ece3 100644 --- a/addons/vector/XEH_postInit.sqf +++ b/addons/vector/XEH_postInit.sqf @@ -1,4 +1,16 @@ // by commy2 #include "script_component.hpp" +if (!hasInterface) exitWith {}; + +GVAR(holdKeyHandler) = -1; +GVAR(isKeyDownAzimuth) = false; +GVAR(isKeyDownDistance) = false; +GVAR(keyDownTimeAzimuth) = -1; +GVAR(keyDownTimeDistance) = -1; +GVAR(useMil) = false; +GVAR(useFeet) = false; +GVAR(modeReticle) = 0; +GVAR(illuminate) = false; + #include "initKeybinds.sqf" diff --git a/addons/vector/XEH_preInit.sqf b/addons/vector/XEH_preInit.sqf index fcae0f282b..f170198a15 100644 --- a/addons/vector/XEH_preInit.sqf +++ b/addons/vector/XEH_preInit.sqf @@ -31,14 +31,6 @@ PREP(showText); PREP(nextMode); PREP(adjustBrightness); PREP(showReticle); - -GVAR(holdKeyHandler) = -1; -GVAR(isKeyDownAzimuth) = false; -GVAR(isKeyDownDistance) = false; -GVAR(keyDownTimeAzimuth) = -1; -GVAR(keyDownTimeDistance) = -1; -GVAR(useMil) = false; -GVAR(useFeet) = false; -GVAR(modeReticle) = 0; +PREP(illuminate); ADDON = true; diff --git a/addons/vector/functions/fnc_adjustBrightness.sqf b/addons/vector/functions/fnc_adjustBrightness.sqf index 8832329796..13c604315d 100644 --- a/addons/vector/functions/fnc_adjustBrightness.sqf +++ b/addons/vector/functions/fnc_adjustBrightness.sqf @@ -26,3 +26,7 @@ _color = [[1,0,0,0.5], [1,0,0,1]] select (_this select 0); (_dlgVector displayCtrl 1322) ctrlSetTextColor _color; (_dlgVector displayCtrl 1323) ctrlSetTextColor _color; (_dlgVector displayCtrl 1324) ctrlSetTextColor _color; + +GVAR(illuminate) = _this select 0; + +_this call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_illuminate.sqf b/addons/vector/functions/fnc_illuminate.sqf new file mode 100644 index 0000000000..0c3779e441 --- /dev/null +++ b/addons/vector/functions/fnc_illuminate.sqf @@ -0,0 +1,41 @@ +// by commy2 +#include "script_component.hpp" + +private "_dlgVector"; + +disableSerialization; +_dlgVector = GETUVAR(ACE_dlgVector,displayNull); + +if (_this select 0) then { + + { + private ["_string", "_index"]; + + _string = ctrlText _x; + _index = _string find ".paa"; + + if (_index != -1 && {_string find "_illum.paa" == -1}) then { + _string = toArray _string; + _string resize _index; + + _x ctrlSetText format ["%1_illum.paa", toString _string]; + }; + } forEach allControls _dlgVector; + +} else { + + { + private ["_string", "_index"]; + + _string = ctrlText _x; + _index = _string find "_illum.paa"; + + if (_index != -1) then { + _string = toArray _string; + _string resize _index; + + _x ctrlSetText format ["%1.paa", toString _string]; + }; + } forEach allControls _dlgVector; + +}; diff --git a/addons/vector/functions/fnc_showAzimuth.sqf b/addons/vector/functions/fnc_showAzimuth.sqf index d4b5421cc3..42e874d83c 100644 --- a/addons/vector/functions/fnc_showAzimuth.sqf +++ b/addons/vector/functions/fnc_showAzimuth.sqf @@ -16,3 +16,5 @@ _digits = _direction call FUNC(convertToTexturesDegree); (_dlgVector displayCtrl 1316) ctrlSetText (_digits select 1); (_dlgVector displayCtrl 1317) ctrlSetText (_digits select 2); (_dlgVector displayCtrl 1318) ctrlSetText (_digits select 3); + +[GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showAzimuthInclination.sqf b/addons/vector/functions/fnc_showAzimuthInclination.sqf index 9d5bb82506..3daed0d4df 100644 --- a/addons/vector/functions/fnc_showAzimuthInclination.sqf +++ b/addons/vector/functions/fnc_showAzimuthInclination.sqf @@ -25,3 +25,5 @@ _digits = [_direction select 1] call FUNC(convertToTexturesDegree); (_dlgVector displayCtrl 1312) ctrlSetText (_digits select 1); (_dlgVector displayCtrl 1313) ctrlSetText (_digits select 2); (_dlgVector displayCtrl 1314) ctrlSetText (_digits select 3); + +[GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showCenter.sqf b/addons/vector/functions/fnc_showCenter.sqf index 58899ff1e7..1293e1286d 100644 --- a/addons/vector/functions/fnc_showCenter.sqf +++ b/addons/vector/functions/fnc_showCenter.sqf @@ -8,3 +8,5 @@ Shows or hides the vectors center square thingy. #include "script_component.hpp" ((GETUVAR(ACE_dlgVector,displayNull)) displayCtrl 1301) ctrlSetText (["", QUOTE(PATHTOF(rsc\vector_center.paa))] select (_this select 0)); + +[GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showDistance.sqf b/addons/vector/functions/fnc_showDistance.sqf index 69d17faa9e..540bd01824 100644 --- a/addons/vector/functions/fnc_showDistance.sqf +++ b/addons/vector/functions/fnc_showDistance.sqf @@ -16,3 +16,5 @@ _digits = [_distance] call FUNC(convertToTexturesDistance); (_dlgVector displayCtrl 1312) ctrlSetText (_digits select 1); (_dlgVector displayCtrl 1313) ctrlSetText (_digits select 2); (_dlgVector displayCtrl 1314) ctrlSetText (_digits select 3); + +[GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showFallOfShot.sqf b/addons/vector/functions/fnc_showFallOfShot.sqf index 45a2232daf..24d933815d 100644 --- a/addons/vector/functions/fnc_showFallOfShot.sqf +++ b/addons/vector/functions/fnc_showFallOfShot.sqf @@ -53,3 +53,5 @@ if !(_this select 0) then { (_dlgVector displayCtrl 1319) ctrlSetText ""; }; + +[GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showHeightDistance.sqf b/addons/vector/functions/fnc_showHeightDistance.sqf index cc563ae11d..67dde19547 100644 --- a/addons/vector/functions/fnc_showHeightDistance.sqf +++ b/addons/vector/functions/fnc_showHeightDistance.sqf @@ -25,3 +25,5 @@ _digits = [_heightDistance select 1] call FUNC(convertToTexturesDistance); (_dlgVector displayCtrl 1316) ctrlSetText (_digits select 1); (_dlgVector displayCtrl 1317) ctrlSetText (_digits select 2); (_dlgVector displayCtrl 1318) ctrlSetText (_digits select 3); + +[GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showP1.sqf b/addons/vector/functions/fnc_showP1.sqf index 6d7baf7412..73453961c1 100644 --- a/addons/vector/functions/fnc_showP1.sqf +++ b/addons/vector/functions/fnc_showP1.sqf @@ -23,3 +23,5 @@ if (_this select 0) then { (_dlgVector displayCtrl 1323) ctrlSetText ""; (_dlgVector displayCtrl 1324) ctrlSetText ""; }; + +[GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showRelativeAzimuthDistance.sqf b/addons/vector/functions/fnc_showRelativeAzimuthDistance.sqf index 7dfc157571..e7c4378866 100644 --- a/addons/vector/functions/fnc_showRelativeAzimuthDistance.sqf +++ b/addons/vector/functions/fnc_showRelativeAzimuthDistance.sqf @@ -25,3 +25,5 @@ _digits = [_azimuthDistance select 1] call FUNC(convertToTexturesDistance); (_dlgVector displayCtrl 1312) ctrlSetText (_digits select 1); (_dlgVector displayCtrl 1313) ctrlSetText (_digits select 2); (_dlgVector displayCtrl 1314) ctrlSetText (_digits select 3); + +[GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showRelativeHeightLength.sqf b/addons/vector/functions/fnc_showRelativeHeightLength.sqf index 599195f376..7fed122786 100644 --- a/addons/vector/functions/fnc_showRelativeHeightLength.sqf +++ b/addons/vector/functions/fnc_showRelativeHeightLength.sqf @@ -25,3 +25,5 @@ _digits = [_heightLength select 1] call FUNC(convertToTexturesDistance); (_dlgVector displayCtrl 1316) ctrlSetText (_digits select 1); (_dlgVector displayCtrl 1317) ctrlSetText (_digits select 2); (_dlgVector displayCtrl 1318) ctrlSetText (_digits select 3); + +[GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showReticle.sqf b/addons/vector/functions/fnc_showReticle.sqf index a3c07010dc..d44adfb68d 100644 --- a/addons/vector/functions/fnc_showReticle.sqf +++ b/addons/vector/functions/fnc_showReticle.sqf @@ -8,3 +8,5 @@ Shows or hides the electronic reticle. #include "script_component.hpp" ((GETUVAR(ACE_dlgVector,displayNull)) displayCtrl 1302) ctrlSetText (["", QUOTE(PATHTOF(rsc\vector_crosshair.paa))] select (_this select 0)); + +[GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/functions/fnc_showText.sqf b/addons/vector/functions/fnc_showText.sqf index 33e1c4766f..68dbe9d642 100644 --- a/addons/vector/functions/fnc_showText.sqf +++ b/addons/vector/functions/fnc_showText.sqf @@ -153,3 +153,5 @@ switch (_this select 0) do { (_dlgVector displayCtrl 1324) ctrlSetText ""; }; }; + +[GVAR(illuminate)] call FUNC(illuminate); diff --git a/addons/vector/initKeybinds.sqf b/addons/vector/initKeybinds.sqf index 1e186f36ca..31fb3bbd1b 100644 --- a/addons/vector/initKeybinds.sqf +++ b/addons/vector/initKeybinds.sqf @@ -3,9 +3,9 @@ ["ACE3", QGVAR(AzimuthKey), localize "STR_ACE_Vector_AzimuthKey", { // Conditions: canInteract - if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific - if !(currentWeapon ACE_player == "ACE_Vector" && {ACE_player == cameraOn} && {cameraView == "GUNNER"}) exitWith {false}; + if !(currentWeapon ACE_player == "ACE_Vector" && {cameraView == "GUNNER"}) exitWith {false}; // prevent holding down if (GETGVAR(isDownStateKey1,false)) exitWith {false}; @@ -20,7 +20,7 @@ GVAR(isDownStateKey1) = false; // Conditions: canInteract - if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Statement ["azimuth"] call FUNC(onKeyUp); @@ -32,9 +32,9 @@ ["ACE3", QGVAR(DistanceKey), localize "STR_ACE_Vector_DistanceKey", { // Conditions: canInteract - if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific - if !(currentWeapon ACE_player == "ACE_Vector" && {ACE_player == cameraOn} && {cameraView == "GUNNER"}) exitWith {false}; + if !(currentWeapon ACE_player == "ACE_Vector" && {cameraView == "GUNNER"}) exitWith {false}; // prevent holding down if (GETGVAR(isDownStateKey2,false)) exitWith {false}; @@ -49,7 +49,7 @@ GVAR(isDownStateKey2) = false; // Conditions: canInteract - if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Statement ["distance"] call FUNC(onKeyUp); diff --git a/addons/vector/rsc/vector_0_illum.paa b/addons/vector/rsc/vector_0_illum.paa new file mode 100644 index 0000000000..74f5af5a16 Binary files /dev/null and b/addons/vector/rsc/vector_0_illum.paa differ diff --git a/addons/vector/rsc/vector_1_illum.paa b/addons/vector/rsc/vector_1_illum.paa new file mode 100644 index 0000000000..f486e82faa Binary files /dev/null and b/addons/vector/rsc/vector_1_illum.paa differ diff --git a/addons/vector/rsc/vector_2_illum.paa b/addons/vector/rsc/vector_2_illum.paa new file mode 100644 index 0000000000..41c5db21a8 Binary files /dev/null and b/addons/vector/rsc/vector_2_illum.paa differ diff --git a/addons/vector/rsc/vector_3_illum.paa b/addons/vector/rsc/vector_3_illum.paa new file mode 100644 index 0000000000..1a466bbcb4 Binary files /dev/null and b/addons/vector/rsc/vector_3_illum.paa differ diff --git a/addons/vector/rsc/vector_4_illum.paa b/addons/vector/rsc/vector_4_illum.paa new file mode 100644 index 0000000000..50ffff1d49 Binary files /dev/null and b/addons/vector/rsc/vector_4_illum.paa differ diff --git a/addons/vector/rsc/vector_5_illum.paa b/addons/vector/rsc/vector_5_illum.paa new file mode 100644 index 0000000000..704aba781f Binary files /dev/null and b/addons/vector/rsc/vector_5_illum.paa differ diff --git a/addons/vector/rsc/vector_6_illum.paa b/addons/vector/rsc/vector_6_illum.paa new file mode 100644 index 0000000000..0ed4b7390d Binary files /dev/null and b/addons/vector/rsc/vector_6_illum.paa differ diff --git a/addons/vector/rsc/vector_7_illum.paa b/addons/vector/rsc/vector_7_illum.paa new file mode 100644 index 0000000000..b7f597f8da Binary files /dev/null and b/addons/vector/rsc/vector_7_illum.paa differ diff --git a/addons/vector/rsc/vector_8_illum.paa b/addons/vector/rsc/vector_8_illum.paa new file mode 100644 index 0000000000..76ac62a41f Binary files /dev/null and b/addons/vector/rsc/vector_8_illum.paa differ diff --git a/addons/vector/rsc/vector_9_illum.paa b/addons/vector/rsc/vector_9_illum.paa new file mode 100644 index 0000000000..7d2aed09a9 Binary files /dev/null and b/addons/vector/rsc/vector_9_illum.paa differ diff --git a/addons/vector/rsc/vector_a_illum.paa b/addons/vector/rsc/vector_a_illum.paa new file mode 100644 index 0000000000..b6188a951e Binary files /dev/null and b/addons/vector/rsc/vector_a_illum.paa differ diff --git a/addons/vector/rsc/vector_b_illum.paa b/addons/vector/rsc/vector_b_illum.paa new file mode 100644 index 0000000000..82c9ed9c64 Binary files /dev/null and b/addons/vector/rsc/vector_b_illum.paa differ diff --git a/addons/vector/rsc/vector_c_illum.paa b/addons/vector/rsc/vector_c_illum.paa new file mode 100644 index 0000000000..c599588d8d Binary files /dev/null and b/addons/vector/rsc/vector_c_illum.paa differ diff --git a/addons/vector/rsc/vector_center_illum.paa b/addons/vector/rsc/vector_center_illum.paa new file mode 100644 index 0000000000..d3f6bfb894 Binary files /dev/null and b/addons/vector/rsc/vector_center_illum.paa differ diff --git a/addons/vector/rsc/vector_crosshair_illum.paa b/addons/vector/rsc/vector_crosshair_illum.paa new file mode 100644 index 0000000000..ddef5eccd7 Binary files /dev/null and b/addons/vector/rsc/vector_crosshair_illum.paa differ diff --git a/addons/vector/rsc/vector_d_illum.paa b/addons/vector/rsc/vector_d_illum.paa new file mode 100644 index 0000000000..b16ee7ef30 Binary files /dev/null and b/addons/vector/rsc/vector_d_illum.paa differ diff --git a/addons/vector/rsc/vector_degree_illum.paa b/addons/vector/rsc/vector_degree_illum.paa new file mode 100644 index 0000000000..840713d8cf Binary files /dev/null and b/addons/vector/rsc/vector_degree_illum.paa differ diff --git a/addons/vector/rsc/vector_e_illum.paa b/addons/vector/rsc/vector_e_illum.paa new file mode 100644 index 0000000000..28421e11ec Binary files /dev/null and b/addons/vector/rsc/vector_e_illum.paa differ diff --git a/addons/vector/rsc/vector_f_illum.paa b/addons/vector/rsc/vector_f_illum.paa new file mode 100644 index 0000000000..bf542f37f4 Binary files /dev/null and b/addons/vector/rsc/vector_f_illum.paa differ diff --git a/addons/vector/rsc/vector_g_illum.paa b/addons/vector/rsc/vector_g_illum.paa new file mode 100644 index 0000000000..382604f6c5 Binary files /dev/null and b/addons/vector/rsc/vector_g_illum.paa differ diff --git a/addons/vector/rsc/vector_i_illum.paa b/addons/vector/rsc/vector_i_illum.paa new file mode 100644 index 0000000000..456b14c6ee Binary files /dev/null and b/addons/vector/rsc/vector_i_illum.paa differ diff --git a/addons/vector/rsc/vector_l_illum.paa b/addons/vector/rsc/vector_l_illum.paa new file mode 100644 index 0000000000..b0e0cfccce Binary files /dev/null and b/addons/vector/rsc/vector_l_illum.paa differ diff --git a/addons/vector/rsc/vector_minus_illum.paa b/addons/vector/rsc/vector_minus_illum.paa new file mode 100644 index 0000000000..6e66787a36 Binary files /dev/null and b/addons/vector/rsc/vector_minus_illum.paa differ diff --git a/addons/vector/rsc/vector_n_illum.paa b/addons/vector/rsc/vector_n_illum.paa new file mode 100644 index 0000000000..44d31d9654 Binary files /dev/null and b/addons/vector/rsc/vector_n_illum.paa differ diff --git a/addons/vector/rsc/vector_o_illum.paa b/addons/vector/rsc/vector_o_illum.paa new file mode 100644 index 0000000000..ecf355c110 Binary files /dev/null and b/addons/vector/rsc/vector_o_illum.paa differ diff --git a/addons/vector/rsc/vector_p_illum.paa b/addons/vector/rsc/vector_p_illum.paa new file mode 100644 index 0000000000..c3c8da6a8b Binary files /dev/null and b/addons/vector/rsc/vector_p_illum.paa differ diff --git a/addons/vector/rsc/vector_plus_illum.paa b/addons/vector/rsc/vector_plus_illum.paa new file mode 100644 index 0000000000..f9259c06de Binary files /dev/null and b/addons/vector/rsc/vector_plus_illum.paa differ diff --git a/addons/vector/rsc/vector_r_illum.paa b/addons/vector/rsc/vector_r_illum.paa new file mode 100644 index 0000000000..b60b65202d Binary files /dev/null and b/addons/vector/rsc/vector_r_illum.paa differ diff --git a/addons/vector/rsc/vector_t_illum.paa b/addons/vector/rsc/vector_t_illum.paa new file mode 100644 index 0000000000..49af435989 Binary files /dev/null and b/addons/vector/rsc/vector_t_illum.paa differ diff --git a/addons/vector/rsc/vector_u_illum.paa b/addons/vector/rsc/vector_u_illum.paa new file mode 100644 index 0000000000..42a0df66af Binary files /dev/null and b/addons/vector/rsc/vector_u_illum.paa differ diff --git a/addons/vector/stringtable.xml b/addons/vector/stringtable.xml index 7a27cf272e..05289d189f 100644 --- a/addons/vector/stringtable.xml +++ b/addons/vector/stringtable.xml @@ -1,54 +1,54 @@  - + - - - Vector IV - Vector IV - Vector IV - Vector IV - Vector IV - Vector IV - Vector IV - Vector IV - Vector IV - Vector IV - - - Rangefinder - Laserentfernungsmesser - Telémetro - Télémètre - Dalmierz - Dálkoměr - Telemetro - Távolságmérő - Telêmetro - Дальномер - - - Vector - Azimuth Key - Vector - Azimuth-Taste - Vector - Tecla de acimut - Vector - Touche Azimuth - Vector - Azymut - Vector - Zobrazit Azimut - Vector - Tasto Azimuth - Vector - Tecla de Azimute - Vector - Irányszög gomb - Vector – Азимут - - - Vector - Distance Key - Vector - Entfernungs-Taste - Vector - Tecla de distancia - Vector - Touche Distance - Vector - Odległość - Vector - Zobrazit vzdálenost - Vecto - Tasto Distanza - Vector - Tecla de Distância - Vector - Távolság gomb - Vector – Расстояние - - + + + Vector IV + Vector IV + Vector IV + Vector IV + Vector IV + Vector IV + Vector IV + Vector IV + Vector IV + Vector IV + + + Rangefinder + Laserentfernungsmesser + Telémetro + Télémètre + Dalmierz laserowy + Dálkoměr + Telemetro + Távolságmérő + Telêmetro + Дальномер + + + Vector - Azimuth Key + Vector - Azimuth-Taste + Vector - Tecla de acimut + Vector - Touche Azimuth + Vector - Azymut + Vector - Zobrazit azimut + Vector - Tasto Azimuth + Vector - Tecla de Azimute + Vector - Irányszög gomb + Vector – Азимут + + + Vector - Distance Key + Vector - Entfernungs-Taste + Vector - Tecla de distancia + Vector - Touche Distance + Vector - Odległość + Vector - Zobrazit vzdálenost + Vecto - Tasto Distanza + Vector - Tecla de Distância + Vector - Távolság gomb + Vector – Расстояние + + \ No newline at end of file diff --git a/addons/vehiclelock/functions/fnc_lockpick.sqf b/addons/vehiclelock/functions/fnc_lockpick.sqf index 4fee354824..fc7fecc693 100644 --- a/addons/vehiclelock/functions/fnc_lockpick.sqf +++ b/addons/vehiclelock/functions/fnc_lockpick.sqf @@ -27,6 +27,9 @@ PARAMS_3(_unit,_veh,_funcType); if (isNull _unit) exitWith {ERROR("null unit"); false}; if (isNull _veh) exitWith {ERROR("null vehicle"); false}; +//Exit if vehicle unlocked: +if ((locked _veh) == 0) exitWith {false}; + //need lockpick item if (!("ACE_key_lockpick" in (items _unit))) exitWith {false}; diff --git a/addons/vehiclelock/stringtable.xml b/addons/vehiclelock/stringtable.xml index 580283dcab..d2dcde42e9 100644 --- a/addons/vehiclelock/stringtable.xml +++ b/addons/vehiclelock/stringtable.xml @@ -1,116 +1,116 @@  - + - - - Unlock Vehicle - Fahrzeug aufschließen - Vehículo abierto - Déverrouiller le véhicule - Odblokuj pojazd - Odemknout vozidlo - Jármű nyitása - Открыть машину - - - Lock Vehicle - Fahrzeug abschließen - Vehículo cerrado - Verrouiller le véhicule - Zablokuj pojazd - Zamknout vozidlo - Jármű zárása - Закрыть машину - - - Lockpick Vehicle - Fahrzeug knacken - Forzar vehículo - Crocheter le véhicule - Otwórz zamek - Vypáčit vozidlo - Jármű feltörése - Взломать замок - - - Picking Lock.... - Schloss knacken... - Forzando cierre... - Crochetage... - Otwieranie zamka... - Páčim vozidlo... - Feltörés... - Взламываем замок... - - - A custom key that will open a specific vehicle. - Ein Schlüssel der ein bestimmtes Fahrzeug aufschließt. - Una llave concreta abrirá un vehículo concreto. - Une clé propre à un seul véhicule. - Unikatowy klucz który otworzy konkretny pojazd. - Vlastní klíč, který otevře konkrétní vozidlo. - Kulcs egy járműhez - Ключ от конкретной машины. - - - A Master Key will open any lock, no matter what! - Ein Generalschlüssel der jedes Schloss öffnet... - Una llave maestra abrirá cualquier cierre, no importa cual! - Un passe-partout qui ouvrira n'importe quelle serrure. - Uniwersalny klucz który otworzy każdy zamek. - Hlavní klíč otevře libovolný zámek, bez vyjímek! - Általános kulcs minden járműhez - Универсальный ключ, открывающий любой замок. - - - A lockpick set that can pick the locks of most vehicles. - Ein Dietrich der die meisten Fahrzeugschlösser knacken kann... - Un set de ganzúas puede abrir la mayoría de cerraduras de vehículos. - Un crochet qui ouvrira la plupart des véhicules. - Zestaw wytrychów dzięki któremu można otworzyć zamki w większości pojazdów. - Sada paklíčů, která dokáže odemknout zámky u většiny vozidel. - Álkulcs melyik minden járműt nyitni tud - Набор отмычек, которым можно взломать почти любую машину. - - - A key that should open most WEST vehicles. - Ein Schlüssel der die meisten westlichen Fahrzeuge öffnen sollte... - Una llave que puede abrir la mayoría de vehículos occidentales. - Une clé qui ouvrira la plupart des véhicules WEST. - Klucz który powinien otworzyć większość pojazdów ZACHODU. - Klíč který by měl otevřít většinou Západních vozidel. - Általános kulcs WEST járművekhez - Ключ для открытия большинства машин Запада. - - - A key that should open most EAST vehicle. - Ein Schlüssel der die meisten östlichen Fahrzeuge öffnen sollte... - Una llave que puede abrir la mayoría de vehículos orientales. - Une clé qui ouvrira la plupart des véhicules EAST. - Klucz który powinien otworzyć większość pojazdów WSCHODU. - Általános kulcs EAST járművekhez - Klíč který by měl otevřít vetšinu Východních vozidel. - Ключ для открытия большинства машин Востока. - - - A key that should open most INDEP vehicle. - Ein Schlüssel der die meisten Fahrzeuge der Aufständischen öffnen sollte... - Una llave que puede abrir la mayoría de vehículos independientes. - Une clé qui ouvrira la plupart des véhicules INDEP. - Klucz który powinien otworzyć większość pojazdów INDFOR. - Általános kulcs INDEPENDENT járművekhez - Klíč který by měl otevřít většinu Nezávislých vozidel. - Ключ для открытия большинства машин Независимых. - - - A key that should open most CIV vehicle. - Ein Schlüssel der die meisten zivilen Fahrzeuge öffnen sollte... - Una llave que puede abrir la mayoría de vehículos civiles. - Une clé qui ouvrira la plupart des véhicules CIV. - Klucz który powinien otworzyć większość pojazdów CYWILNYCH. - Klíč který by měl otevřít většinu Civilních vozidel. - Általános kulcs CIVILIAN járművekhez - Ключ для открытия большинства машин Гражданских. - - + + + Unlock Vehicle + Fahrzeug aufschließen + Vehículo abierto + Déverrouiller le véhicule + Odblokuj pojazd + Odemknout vozidlo + Jármű nyitása + Открыть машину + + + Lock Vehicle + Fahrzeug abschließen + Vehículo cerrado + Verrouiller le véhicule + Zablokuj pojazd + Zamknout vozidlo + Jármű zárása + Закрыть машину + + + Lockpick Vehicle + Fahrzeug knacken + Forzar vehículo + Crocheter le véhicule + Otwórz zamek + Vypáčit vozidlo + Jármű feltörése + Взломать замок + + + Picking Lock.... + Schloss knacken... + Forzando cierre... + Crochetage... + Otwieranie zamka... + Páčim vozidlo... + Feltörés... + Взламываем замок... + + + A custom key that will open a specific vehicle. + Ein Schlüssel der ein bestimmtes Fahrzeug aufschließt. + Una llave concreta abrirá un vehículo concreto. + Une clé propre à un seul véhicule. + Unikatowy klucz, który otworzy konkretny pojazd. + Vlastní klíč, který otevře konkrétní vozidlo. + Kulcs egy járműhez + Ключ от конкретной машины. + + + A Master Key will open any lock, no matter what! + Ein Generalschlüssel der jedes Schloss öffnet... + Una llave maestra abrirá cualquier cierre, no importa cual! + Un passe-partout qui ouvrira n'importe quelle serrure. + Uniwersalny klucz, który otworzy każdy zamek. + Hlavní klíč otevře libovolný zámek, bez vyjímek! + Általános kulcs minden járműhez + Универсальный ключ, открывающий любой замок. + + + A lockpick set that can pick the locks of most vehicles. + Ein Dietrich der die meisten Fahrzeugschlösser knacken kann... + Un set de ganzúas puede abrir la mayoría de cerraduras de vehículos. + Un crochet qui ouvrira la plupart des véhicules. + Zestaw wytrychów, dzięki któremu można otworzyć zamki w większości pojazdów. + Sada paklíčů, která dokáže odemknout zámky u většiny vozidel. + Álkulcs melyik minden járműt nyitni tud + Набор отмычек, которым можно взломать почти любую машину. + + + A key that should open most WEST vehicles. + Ein Schlüssel der die meisten westlichen Fahrzeuge öffnen sollte... + Una llave que puede abrir la mayoría de vehículos occidentales. + Une clé qui ouvrira la plupart des véhicules WEST. + Klucz, który powinien otworzyć większość pojazdów ZACHODU. + Klíč který by měl otevřít většinou Západních vozidel. + Általános kulcs WEST járművekhez + Ключ для открытия большинства машин Запада. + + + A key that should open most EAST vehicle. + Ein Schlüssel der die meisten östlichen Fahrzeuge öffnen sollte... + Una llave que puede abrir la mayoría de vehículos orientales. + Une clé qui ouvrira la plupart des véhicules EAST. + Klucz, który powinien otworzyć większość pojazdów WSCHODU. + Általános kulcs EAST járművekhez + Klíč který by měl otevřít vetšinu Východních vozidel. + Ключ для открытия большинства машин Востока. + + + A key that should open most INDEP vehicle. + Ein Schlüssel der die meisten Fahrzeuge der Aufständischen öffnen sollte... + Una llave que puede abrir la mayoría de vehículos independientes. + Une clé qui ouvrira la plupart des véhicules INDEP. + Klucz, który powinien otworzyć większość pojazdów INDFOR. + Általános kulcs INDEPENDENT járművekhez + Klíč který by měl otevřít většinu Nezávislých vozidel. + Ключ для открытия большинства машин Независимых. + + + A key that should open most CIV vehicle. + Ein Schlüssel der die meisten zivilen Fahrzeuge öffnen sollte... + Una llave que puede abrir la mayoría de vehículos civiles. + Une clé qui ouvrira la plupart des véhicules CIV. + Klucz, który powinien otworzyć większość pojazdów CYWILNYCH. + Klíč který by měl otevřít většinu Civilních vozidel. + Általános kulcs CIVILIAN járművekhez + Ключ для открытия большинства машин Гражданских. + + \ No newline at end of file diff --git a/addons/weaponselect/stringtable.xml b/addons/weaponselect/stringtable.xml index 3a39d59396..bdac2fbc65 100644 --- a/addons/weaponselect/stringtable.xml +++ b/addons/weaponselect/stringtable.xml @@ -1,12 +1,21 @@  - Display text on grenade throw + Zeige Text beim Granatwurf + Mostrar texto al lanzar granada + Показывать текст при броске + Zobrazí text při hodu granátem + Wyświetl tekst przy rzucie granatem Display a hint or text on grenade throw. + Zeige Hinweis oder Text beim Granatwurf + Muestra una notificación o texto al lanzar granada + Показывать текст или подсказку при броске гранаты. + Zobrazí upozornění nebo text při hodu granátem. + Wyświetla powiadomienie lub tekst przy rzucie granatem. Select Pistol @@ -142,6 +151,7 @@ Grenade %1 + Grenade %1 Granate %1 Granada %1 Granat %1 @@ -151,6 +161,7 @@ Ready Grenade + Grenade Prête Granate nehmen Granada lista Przygotuj granat @@ -163,7 +174,7 @@ Explosive Granate auswählen Seleccionar granada de fragmenación Wybierz granat odłamkowy - Sélectionner grenade à fragmentation + Sélectionner une grenade à fragmentation Repeszgránát Kiválasztása Zvolit Výbušný Granát Selecionar Granada de Fragmentação @@ -226,7 +237,7 @@ Už nejsou žádné ostatní granáty Não há outras granadas restantes Nessun'altra granata rimanente. - Невзрывоопасные гранаты закончились + Летальные гранаты закончились No grenade selected @@ -251,4 +262,4 @@ Запустить дымовую завесу - \ No newline at end of file + diff --git a/addons/wep_javelin/$PBOPREFIX$ b/addons/wep_javelin/$PBOPREFIX$ deleted file mode 100644 index 311c0dad43..0000000000 --- a/addons/wep_javelin/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -z\ace\addons\wep_javelin \ No newline at end of file diff --git a/addons/wep_javelin/XEH_clientInit.sqf b/addons/wep_javelin/XEH_clientInit.sqf deleted file mode 100644 index 1d3b546e39..0000000000 --- a/addons/wep_javelin/XEH_clientInit.sqf +++ /dev/null @@ -1,3 +0,0 @@ -#include "script_component.hpp" - -#include "initKeybinds.sqf" \ No newline at end of file diff --git a/addons/wep_javelin/functions/fnc_cycleFireMode.sqf b/addons/wep_javelin/functions/fnc_cycleFireMode.sqf deleted file mode 100644 index 7902c6d265..0000000000 --- a/addons/wep_javelin/functions/fnc_cycleFireMode.sqf +++ /dev/null @@ -1,19 +0,0 @@ -#define DEBUG_MODE_FULL -#include "script_component.hpp" -TRACE_1("enter", _this); - -private["_player", "_currentFireMode"]; - -_currentFireMode = ACE_player getVariable["ACE_FIRE_SELECTION", ACE_JAV_FIREMODE_TOP]; -if(_currentFireMode == ACE_JAV_FIREMODE_DIR) then { - _currentFireMode = ACE_JAV_FIREMODE_TOP; - - __JavelinIGUITop ctrlSetTextColor __ColorGreen; - __JavelinIGUIDir ctrlSetTextColor __ColorGray; -} else { - _currentFireMode = ACE_JAV_FIREMODE_DIR; - - __JavelinIGUITop ctrlSetTextColor __ColorGray; - __JavelinIGUIDir ctrlSetTextColor __ColorGreen; -}; -ACE_player setVariable["ACE_FIRE_SELECTION", _currentFireMode, false]; diff --git a/addons/wep_javelin/functions/fnc_fired.sqf b/addons/wep_javelin/functions/fnc_fired.sqf deleted file mode 100644 index 139f8f4b7e..0000000000 --- a/addons/wep_javelin/functions/fnc_fired.sqf +++ /dev/null @@ -1,285 +0,0 @@ -//#define DEBUG_MODE_FULL -#include "script_component.hpp" -//_this=[TEST_AI_HELICOPTER,"missiles_DAGR","missiles_DAGR","Far_AI","M_PG_AT","24Rnd_PG_missiles",163988: rocket_01_fly_f.p3d] -TRACE_1("Launch", _this); -PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); - -FUNC(guidance_Javelin_LOBL_DIR_PFH) = { - TRACE_1("enter", _this); - private["_pitch", "_yaw", "_wentTerminal", "_target", "_targetPos", "_curVelocity", "_missile", - "_launchPos", "_targetStartPos", "_defPitch", "_defYaw"]; - _args = _this select 0; - //PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); - _shooter = _args select 0; - _missile = _args select 6; - - if((count _args) > 7) then { - _saveArgs = _args select 7; - _target = _saveArgs select 0; - _targetStartPos = _saveArgs select 1; - _launchPos = _saveArgs select 2; - _wentTerminal = _saveArgs select 3; - } else { - _wentTerminal = false; - _launchPos = getPosASL _shooter; - _target = ACE_player getVariable[QGVAR(currentTarget), objNull]; - _targetStartPos = ACE_player getVariable[QGVAR(currentTargetPos), [0,0,0]]; - }; - - if(!alive _missile || isNull _missile || isNull _target) exitWith { - [(_this select 1)] call cba_fnc_removePerFrameHandler; - }; - - _targetPos = getPosASL _target; - _curVelocity = velocity _missile; - - TRACE_4("", _target, _targetPos, _launchPos, _targetStartPos); - - _addHeight = [0,0,0]; - if(!isNil "_target") then { - - _yVec = vectorDir _missile; - _zVec = vectorUp _missile; - _xVec = vectorNormalized (_yVec vectorCrossProduct _zVec); - - _missilePos = getPosASL _missile; - // player sideChat "G!"; - - TRACE_4("Phase Check", _launchPos, _missilePos, _targetPos, (_missilePos distance _targetPos)); - if((count _targetPos) > 0) then { - _distanceToTarget = [(_missilePos select 0), (_missilePos select 1), (_targetPos select 2)] vectorDistance _targetPos; - - if( (_missilePos select 2) < (_targetPos select 2) + 60 && !_wentTerminal) then { - _addHeight = [0,0,(_targetPos select 2) + 120]; - - _defPitch = 0.15; - _defYaw = 0.035; - - TRACE_1("Climb phase", _addHeight); - } else { - _wentTerminal = true; - _this set[2, _wentTerminal]; - - _defPitch = 0.15; - _defYaw = 0.035; - - TRACE_1("TERMINAL", ""); - }; - _targetPos = _targetPos vectorAdd _addHeight; - - _targetVectorSeeker = [_missile, [_xVec, _yVec, _zVec], _targetPos] call FUNC(translateToWeaponSpace); - TRACE_5("", _missile, _xVec, _yVec, _zVec, _targetPos); - - _yaw = 0.0; - _pitch = 0.0; - - if((_targetVectorSeeker select 0) < 0) then { - _yaw = -_defYaw; - } else { - if((_targetVectorSeeker select 0) > 0) then { - _yaw = _defYaw; - }; - }; - - if((_targetVectorSeeker select 2) < 0) then { - _pitch = -_defPitch; - } else { - if((_targetVectorSeeker select 2) > 0) then { - _pitch = _defPitch; - }; - }; - - TRACE_3("", _targetVectorSeeker, _pitch, _yaw); - - #ifdef DEBUG_MODE_FULL - drawLine3D [(ASLtoATL _targetPos) vectorAdd _addHeight, ASLtoATL _targetPos, [0,1,0,1]]; - - _light = "#lightpoint" createVehicleLocal (getPos _missile); - _light setLightBrightness 1.0; - _light setLightAmbient [1.0, 0.0, 0.0]; - _light setLightColor [1.0, 0.0, 0.0]; - - drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,1,1,1], ASLtoATL _missilePos, 0.75, 0.75, 0, str _vectorTo, 1, 0.025, "TahomaB"]; - drawLine3D [ASLtoATL _missilePos, ASLtoATL _targetPos, [1,0,0,1]]; - - MARKERCOUNT = MARKERCOUNT + 1; - #endif - - if(accTime > 0) then { - TRACE_5("", _xVec, _yVec, _zVec, _yaw, _pitch); - _outVector = [_missile, [_xVec, _yVec, _zVec], [_yaw, 1/accTime, _pitch]] call FUNC(translateToModelSpace); - - _vectorTo = _missilePos vectorFromTo _outVector; - TRACE_3("", _missile, _outVector, _vectorTo); - _missile setVectorDirAndUp [_vectorTo, vectorUp _missile]; - }; - - #ifdef DEBUG_MODE_FULL - hintSilent format["d: %1", _distanceToTarget]; - #endif - }; - }; - - _saveArgs = [_target,_targetStartPos, _launchPos, _wentTerminal]; - _args set[7, _saveArgs ]; - _this set[0, _args]; -}; - -FUNC(guidance_Javelin_LOBL_TOP_PFH) = { - TRACE_1("enter", _this); - private["_pitch", "_yaw", "_wentTerminal", "_target", "_targetPos", "_curVelocity", "_missile", - "_launchPos", "_targetStartPos", "_defPitch", "_defYaw"]; - _args = _this select 0; - //PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); - _shooter = _args select 0; - _missile = _args select 6; - - if((count _args) > 7) then { - _saveArgs = _args select 7; - _target = _saveArgs select 0; - _targetStartPos = _saveArgs select 1; - _launchPos = _saveArgs select 2; - _wentTerminal = _saveArgs select 3; - } else { - _wentTerminal = false; - _launchPos = getPosASL _shooter; - _target = ACE_player getVariable[QGVAR(currentTarget), objNull]; - _targetStartPos = ACE_player getVariable[QGVAR(currentTargetPos), [0,0,0]]; - }; - - if(!alive _missile || isNull _missile || isNull _target) exitWith { - [(_this select 1)] call cba_fnc_removePerFrameHandler; - }; - - _targetPos = getPosASL _target; - _curVelocity = velocity _missile; - - TRACE_4("", _target, _targetPos, _launchPos, _targetStartPos); - - _addHeight = [0,0,0]; - if(!isNil "_target") then { - - _yVec = vectorDir _missile; - _zVec = vectorUp _missile; - _xVec = vectorNormalized (_yVec vectorCrossProduct _zVec); - - _missilePos = getPosASL _missile; - // player sideChat "G!"; - - TRACE_4("Phase Check", _launchPos, _missilePos, _targetPos, (_missilePos distance _targetPos)); - if((count _targetPos) > 0) then { - _distanceToTarget = [(_missilePos select 0), (_missilePos select 1), (_targetPos select 2)] vectorDistance _targetPos; - - if( (_missilePos select 2) < (_targetPos select 2) + 200 && !_wentTerminal) then { - _addHeight = [0,0, ( (_distanceToTarget * 2) + 400)]; - - _defPitch = 0.25; - _defYaw = 0.035; - - TRACE_1("Climb phase", _addHeight); - } else { - _wentTerminal = true; - _this set[2, _wentTerminal]; - - _defPitch = 0.25; - _defYaw = 0.25; - - TRACE_1("TERMINAL", ""); - }; - _targetPos = _targetPos vectorAdd _addHeight; - - _targetVectorSeeker = [_missile, [_xVec, _yVec, _zVec], _targetPos] call FUNC(translateToWeaponSpace); - TRACE_5("", _missile, _xVec, _yVec, _zVec, _targetPos); - - _yaw = 0.0; - _pitch = 0.0; - - // Stop jinking on terminal final decent - if((_missilePos distance _targetPos) < 150) then { - _defPitch = 0.0015; - _defYaw = 0.0015; - }; - - if((_targetVectorSeeker select 0) < 0) then { - _yaw = -_defYaw; - } else { - if((_targetVectorSeeker select 0) > 0) then { - _yaw = _defYaw; - }; - }; - - if((_targetVectorSeeker select 2) < 0) then { - _pitch = -_defPitch; - } else { - if((_targetVectorSeeker select 2) > 0) then { - _pitch = _defPitch; - }; - }; - - TRACE_3("", _targetVectorSeeker, _pitch, _yaw); - - #ifdef DEBUG_MODE_FULL - drawLine3D [(ASLtoATL _targetPos) vectorAdd _addHeight, ASLtoATL _targetPos, [0,1,0,1]]; - - _light = "#lightpoint" createVehicleLocal (getPos _missile); - _light setLightBrightness 1.0; - _light setLightAmbient [1.0, 0.0, 0.0]; - _light setLightColor [1.0, 0.0, 0.0]; - - drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,1,1,1], ASLtoATL _missilePos, 0.75, 0.75, 0, str _vectorTo, 1, 0.025, "TahomaB"]; - drawLine3D [ASLtoATL _missilePos, ASLtoATL _targetPos, [1,0,0,1]]; - - MARKERCOUNT = MARKERCOUNT + 1; - #endif - - if(accTime > 0) then { - TRACE_5("", _xVec, _yVec, _zVec, _yaw, _pitch); - _outVector = [_missile, [_xVec, _yVec, _zVec], [_yaw, 1/accTime, _pitch]] call FUNC(translateToModelSpace); - - _vectorTo = _missilePos vectorFromTo _outVector; - TRACE_3("", _missile, _outVector, _vectorTo); - _missile setVectorDirAndUp [_vectorTo, vectorUp _missile]; - }; - - #ifdef DEBUG_MODE_FULL - hintSilent format["d: %1", _distanceToTarget]; - #endif - }; - }; - - _saveArgs = [_target,_targetStartPos, _launchPos, _wentTerminal]; - _args set[7, _saveArgs ]; - _this set[0, _args]; -}; - -FUNC(guidance_Javelin_LOBL_TOP) = { - PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); - - GVAR(lastTime) = time; - [FUNC(guidance_Javelin_LOBL_TOP_PFH), 0, _this] call cba_fnc_addPerFrameHandler; -}; - -FUNC(guidance_Javelin_LOBL_DIR) = { - PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); - - GVAR(lastTime) = time; - [FUNC(guidance_Javelin_LOBL_DIR_PFH), 0, _this] call cba_fnc_addPerFrameHandler; -}; - -if(!local _shooter) exitWith { false }; -if(_ammo == "M_Titan_AT") then { - _fireMode = _shooter getVariable ["ACE_FIRE_SELECTION", ACE_JAV_FIREMODE_TOP]; - - switch (_fireMode) do { - // Default to FIREMODE_DIRECT_LOAL - // FIREMODE_DIRECT_LOAL - case ACE_JAV_FIREMODE_DIR: { - LOG("Initiating Javelin FIREMODE_LOBL_DIR"); - _this call FUNC(guidance_Javelin_LOBL_DIR); - }; - default { - LOG("Initiating Javelin FIREMODE_LOBL_TOP"); - _this call FUNC(guidance_Javelin_LOBL_TOP); - }; - }; -}; \ No newline at end of file diff --git a/addons/wep_javelin/functions/fnc_lockKeyDown.sqf b/addons/wep_javelin/functions/fnc_lockKeyDown.sqf deleted file mode 100644 index bc3198915b..0000000000 --- a/addons/wep_javelin/functions/fnc_lockKeyDown.sqf +++ /dev/null @@ -1,3 +0,0 @@ -#define DEBUG_MODE_FULL -#include "script_component.hpp" -TRACE_1("enter", _this); \ No newline at end of file diff --git a/addons/wep_javelin/functions/fnc_lockKeyUp.sqf b/addons/wep_javelin/functions/fnc_lockKeyUp.sqf deleted file mode 100644 index bc3198915b..0000000000 --- a/addons/wep_javelin/functions/fnc_lockKeyUp.sqf +++ /dev/null @@ -1,3 +0,0 @@ -#define DEBUG_MODE_FULL -#include "script_component.hpp" -TRACE_1("enter", _this); \ No newline at end of file diff --git a/addons/wep_javelin/functions/fnc_onOpticDraw.sqf b/addons/wep_javelin/functions/fnc_onOpticDraw.sqf deleted file mode 100644 index 6a74b3ed57..0000000000 --- a/addons/wep_javelin/functions/fnc_onOpticDraw.sqf +++ /dev/null @@ -1,132 +0,0 @@ -//#define DEBUG_MODE_FULL -#include "script_component.hpp" -//TRACE_1("enter", _this); - -#define __TRACKINTERVAL 0.1 // how frequent the check should be. -#define __LOCKONTIME 1.85 // Lock on won't occur sooner -#define __LOCKONTIMERANDOM 0.3 // Deviation in lock on time -#define __SENSORSQUARE 1 // Locking on sensor square side in angles - -#define __ConstraintTop (((ctrlPosition __JavelinIGUITargetingConstrainTop) select 1) + ((ctrlPosition (__JavelinIGUITargetingConstrainTop)) select 3)) -#define __ConstraintBottom ((ctrlPosition __JavelinIGUITargetingConstrainBottom) select 1) -#define __ConstraintLeft (((ctrlPosition __JavelinIGUITargetingConstrainLeft) select 0) + ((ctrlPosition (__JavelinIGUITargetingConstrainLeft)) select 2)) -#define __ConstraintRight ((ctrlPosition __JavelinIGUITargetingConstrainRight) select 0) - -#define __OffsetX ((ctrlPosition __JavelinIGUITargetingLineV) select 0) - 0.5 -#define __OffsetY ((ctrlPosition __JavelinIGUITargetingLineH) select 1) - 0.5 - - -private["_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 { - _lastTick = _args select 0; - if(diag_tickTime - _lastTick > 1) then { - [] call FUNC(onOpticLoad); - }; -}; - -// Pull the arguments -_currentTarget = _args select 1; -_runTime = _args select 2; -_lockTime = _args select 3; -_soundTime = _args select 4; - -// Find a target within the optic range -_newTarget = objNull; - -// Bail on fast movement -if ((velocity ACE_player) distance [0,0,0] > 0.5 && {cameraView == "GUNNER"} && {cameraOn == ACE_player}) exitWith { // keep it steady. - ACE_player switchCamera "INTERNAL"; -}; - -// Only start locking on holding tab -if(!GVAR(isLockKeyDown)) exitWith { false }; - -_range = parseNumber (ctrlText __JavelinIGUIRangefinder); -if (_range > 50 && {_range < 2500}) then { - _pos = positionCameraToWorld [0,0,_range]; - _targetArray = _pos nearEntities ["AllVehicles", _range/25]; - if (count (_targetArray) > 0) then { - _newTarget = _targetArray select 0; - }; -}; - -if (isNull _newTarget) then { - _newTarget = cursorTarget; -}; - -if (isNull _newTarget) then { - // No targets found - _currentTarget = objNull; - _lockTime = 0; - - __JavelinIGUISeek ctrlSetTextColor __ColorGray; - __JavelinIGUINFOV ctrlSetTextColor __ColorGreen; - __JavelinIGUITargetingConstrains ctrlShow false; - __JavelinIGUITargetingGate ctrlShow false; - __JavelinIGUITargetingLines ctrlShow false; - - ACE_player setVariable [QGVAR(currentTarget),nil, false]; - - // Disallow fire - //if (ACE_player ammo "Javelin" > 0 || {ACE_player ammo "ACE_Javelin_Direct" > 0}) then {ACE_player setWeaponReloadingTime //[player, "Javelin", 0.2];}; -} else { - if (_newTarget distance ACE_player < 2500 - // && {(call CBA_fnc_getFoV) select 1 > 7} - // && { (currentVisionMode ACE_player == 2)} - ) then { - // Lock on after 3 seconds - if(_currentTarget != _newTarget) then { - TRACE_1("New Target, reseting locking", _newTarget); - _lockTime = diag_tickTime; - _currentTarget = _newTarget; - - playSound "ACE_Javelin_Locking"; - } else { - if(diag_tickTime - _lockTime > 3) then { - TRACE_2("LOCKED!", _currentTarget, _lockTime); - __JavelinIGUISeek ctrlSetTextColor __ColorGreen; - __JavelinIGUINFOV ctrlSetTextColor __ColorNull; - __JavelinIGUITargetingConstrains ctrlShow true; - - ACE_player setVariable[QGVAR(currentTarget), _currentTarget, false]; - ACE_player setVariable[QGVAR(currentTargetPos), getPosASL _currentTarget, false]; - - if(diag_tickTime > _soundTime) then { - playSound "ACE_Javelin_Locked"; - _soundTime = diag_tickTime + 0.25; - }; - } else { - if(diag_tickTime > _soundTime) then { - playSound "ACE_Javelin_Locking"; - _soundTime = diag_tickTime + 0.25; - }; - }; - }; - } else { - // Something is wrong with our seek - _currentTarget = objNull; - - __JavelinIGUISeek ctrlSetTextColor __ColorGray; - __JavelinIGUINFOV ctrlSetTextColor __ColorGray; - __JavelinIGUITargetingConstrains ctrlShow false; - __JavelinIGUITargetingGate ctrlShow false; - __JavelinIGUITargetingLines ctrlShow false; - - ACE_player setVariable [QGVAR(currentTarget),nil, false]; - }; - -}; - -//TRACE_2("", _newTarget, _currentTarget); - -// Save arguments for next run -_args set[0, diag_tickTime]; -_args set[1, _currentTarget]; -_args set[2, _runTime]; -_args set[3, _lockTime]; -_args set[4, _soundTime]; - -uiNamespace setVariable[QGVAR(arguments), _args ]; \ No newline at end of file diff --git a/addons/wep_javelin/functions/fnc_onOpticLoad.sqf b/addons/wep_javelin/functions/fnc_onOpticLoad.sqf deleted file mode 100644 index c4a7069630..0000000000 --- a/addons/wep_javelin/functions/fnc_onOpticLoad.sqf +++ /dev/null @@ -1,17 +0,0 @@ -//#define DEBUG_MODE_FULL -#include "script_component.hpp" -TRACE_1("enter", _this); - -if((count _this) > 0) then { - uiNameSpace setVariable ['ACE_RscOptics_javelin',_this select 0]; -}; - -uiNameSpace setVariable [QGVAR(arguments), - [ - 0, // Last runtime - objNull, // currentTargetObject - 0, // Run Time - 0, // Lock Time - 0 // Sound timer - ] -]; \ No newline at end of file diff --git a/addons/wep_javelin/functions/fnc_translateToModelSpace.sqf b/addons/wep_javelin/functions/fnc_translateToModelSpace.sqf deleted file mode 100644 index 12f828769a..0000000000 --- a/addons/wep_javelin/functions/fnc_translateToModelSpace.sqf +++ /dev/null @@ -1,20 +0,0 @@ -//#define DEBUG_MODE_FULL -#include "script_component.hpp" -TRACE_1("enter", _this); - -_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/wep_javelin/functions/fnc_translateToWeaponSpace.sqf b/addons/wep_javelin/functions/fnc_translateToWeaponSpace.sqf deleted file mode 100644 index 8f85005d48..0000000000 --- a/addons/wep_javelin/functions/fnc_translateToWeaponSpace.sqf +++ /dev/null @@ -1,26 +0,0 @@ -//#define DEBUG_MODE_FULL -#include "script_component.hpp" -TRACE_1("enter", _this); - -_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/wep_javelin/functions/script_component.hpp b/addons/wep_javelin/functions/script_component.hpp deleted file mode 100644 index fdc194ff7b..0000000000 --- a/addons/wep_javelin/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\wep_javelin\script_component.hpp" \ No newline at end of file diff --git a/addons/wep_javelin/stringtable.xml b/addons/wep_javelin/stringtable.xml deleted file mode 100644 index 4068d6f0a6..0000000000 --- a/addons/wep_javelin/stringtable.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - Lock Target (Hold) - Lock Target (Hold) - Lock Target (Hold) - Lock Target (Hold) - Lock Target (Hold) - Lock Target (Hold) - Lock Target (Hold) - - - Cycle Fire Mode - Cycle Fire Mode - Cycle Fire Mode - Cycle Fire Mode - Cycle Fire Mode - Cycle Fire Mode - Cycle Fire Mode - - - diff --git a/addons/winddeflection/stringtable.xml b/addons/winddeflection/stringtable.xml index b52100046f..59a07bd33b 100644 --- a/addons/winddeflection/stringtable.xml +++ b/addons/winddeflection/stringtable.xml @@ -1,32 +1,52 @@ - - - - - - Wind Information - Informacje o wietrze - Información del viento - - - Direction: %1 - Kierunek: %1 - Dirección: %1 - - - Speed: %1 m/s - Prędkość: %1 - Velocidad: %1 m/s - - - Weather Information - Informacje o pogodzie - Información Meteorológica - - - Humidity: %1% - Wilgotność: %1 - Humedad: %1% - - - + + + + + + Wind Information + Informacje o wietrze + Información del viento + Ветер + Informace o větru + Informations sur le Vent + Windinformationen + + + Direction: %1 + Kierunek: %1 + Dirección: %1 + Направление: %1 + Směr: %1 + Direction : %1 + Richtung: %1 + + + Speed: %1 m/s + Prędkość: %1 + Velocidad: %1 m/s + Скорость: %1 м/с + Rychlost: %1 m/s + Vitesse : %1 m/s + Geschwindigkeit: %1m/s + + + Weather Information + Informacje o pogodzie + Información Meteorológica + Погода + Informace o počasí + Informations sur la Météo + Wetterinformationen + + + Humidity: %1% + Wilgotność: %1 + Humedad: %1% + Влажность: %1% + Vlhkost: %1% + Humidité : %1 + Feuchtigkeit: %1% + + + diff --git a/documentation/development/ace3-config-entries.md b/documentation/development/ace3-config-entries.md index f56285052d..cc0104a8b1 100644 --- a/documentation/development/ace3-config-entries.md +++ b/documentation/development/ace3-config-entries.md @@ -1,7 +1,7 @@ --- layout: wiki title: ACE3 Config Entries -group: dev +group: development parent: wiki order: 2 --- diff --git a/documentation/development/ace3-events-system.md b/documentation/development/ace3-events-system.md index 9075347f71..d7c99e558e 100644 --- a/documentation/development/ace3-events-system.md +++ b/documentation/development/ace3-events-system.md @@ -1,7 +1,7 @@ --- layout: wiki title: ACE3 Events System -group: dev +group: development parent: wiki order: 3 --- @@ -40,6 +40,7 @@ PREP(onTapShoulder); Event Key Description Source(s) + Passed Parameter(s) (_this) Locality @@ -48,6 +49,7 @@ PREP(onTapShoulder); "playerChanged" `player` changed (zeus/respawn) common + [_newPlayer, _oldPlayer] local @@ -55,6 +57,7 @@ PREP(onTapShoulder); "playerInventoryChanged" Inventory changed common + getAllGear-Array local @@ -62,13 +65,23 @@ PREP(onTapShoulder); "playerVisionModeChanged" Vision mode changed (e.g. NVG on) common + [_unit, _newVisionMode] local + + + "inventoryDisplayChanged" + Inventory display opened/closed + common + [_unit, _isOpen] + local + "zeusDisplayChanged" Zeus display opened/closed common + [_unit, _isOpen] local @@ -76,72 +89,91 @@ PREP(onTapShoulder); "cameraViewChanged" Camera view changed common + [_unit, _newCameraView] local "playerVehicleChanged" Player vehicle changed common + [_unit, _newVehicle] local "playerTurretChanged" Player turret changed common + [_unit, _newTurretIndexArray] local "infoDisplayChanged" On info box change (e.g. entering and leaving a vehicle) common + [_display, _type] local "inventoryDisplayLoaded" On opening the inventory display common + [_display] + local + + + "mapDisplayLoaded" + On loading the map (briefing and mission start) + common + [_display, _mapType] local "interactionMenuOpened" Interaction Menu Opened interaction + local "killedByFriendly" On TK/Civilian Killed respawn + local "drawing_requestMarkers" Request Drawing Markers map + target "drawing_sendbackMarkers" Send Drawing Markers map + target "drawing_addLineMarker" Line Drawn map + global "drawing_removeLineMarker" Line Deleted map + global "flashbangExplosion" Flashbang Goes Bang grenades + target diff --git a/documentation/development/arma-3-issues.md b/documentation/development/arma-3-issues.md index b6ef063cbc..3b4a6f036b 100644 --- a/documentation/development/arma-3-issues.md +++ b/documentation/development/arma-3-issues.md @@ -1,7 +1,7 @@ --- layout: wiki title: Arma 3 Issues -group: dev +group: development parent: wiki order: 6 --- @@ -18,6 +18,8 @@ Keeping track of Arma 3 issues that need to be fixed. If you want to support us * [commy2: 0021443: Unexpected behavior of += array in configs](http://feedback.arma3.com/view.php?id=21443) * [commy2: 0022671: setVariable is not always JIP persistent](http://feedback.arma3.com/view.php?id=22671) * [CorruptedHeart: 0022318: Can no longer use "MenuBack" shortcut in AddAction](http://feedback.arma3.com/view.php?id=22318) +* [James2464: 0023725: All Environment Rocks Should Have PhysX LODs](http://feedback.arma3.com/view.php?id=23725) +* [Jaynus: 0023679: Display event handler return values for mouse buttons should be respected](http://feedback.arma3.com/view.php?id=23679) **Resolved:** diff --git a/documentation/development/arma-3-scheduler-and-our-practices.md b/documentation/development/arma-3-scheduler-and-our-practices.md index 90646b3b4a..bef0224819 100644 --- a/documentation/development/arma-3-scheduler-and-our-practices.md +++ b/documentation/development/arma-3-scheduler-and-our-practices.md @@ -1,7 +1,7 @@ --- layout: wiki title: Arma 3 Scheduler And Our Practices -group: dev +group: development parent: wiki order: 8 --- diff --git a/documentation/development/coding-guidelines.md b/documentation/development/coding-guidelines.md index c3517dec1d..f72263eeaa 100644 --- a/documentation/development/coding-guidelines.md +++ b/documentation/development/coding-guidelines.md @@ -1,7 +1,7 @@ --- layout: wiki title: Coding Guidelines -group: dev +group: development parent: wiki order: 1 --- diff --git a/documentation/development/extension-guidelines.md b/documentation/development/extension-guidelines.md index b56349e82b..0558d49d5e 100644 --- a/documentation/development/extension-guidelines.md +++ b/documentation/development/extension-guidelines.md @@ -1,7 +1,7 @@ --- layout: wiki title: Extension Guidelines -group: dev +group: development parent: wiki order: 9 --- diff --git a/documentation/development/fragmentation-configuration.md b/documentation/development/fragmentation-configuration.md index ab0baa0612..17ff36fa13 100644 --- a/documentation/development/fragmentation-configuration.md +++ b/documentation/development/fragmentation-configuration.md @@ -1,7 +1,7 @@ --- layout: wiki title: Fragmentation Configuration -group: dev +group: development parent: wiki order: 7 --- diff --git a/documentation/development/how-to-translate-ace3.md b/documentation/development/how-to-translate-ace3.md index a6f81c3b30..b7e23fa575 100644 --- a/documentation/development/how-to-translate-ace3.md +++ b/documentation/development/how-to-translate-ace3.md @@ -1,7 +1,7 @@ --- layout: wiki title: How to translate ACE3 -group: dev +group: development parent: wiki order: 20 --- diff --git a/documentation/development/merging-pull-requests.md b/documentation/development/merging-pull-requests.md index 2e754efe93..6bc34464f0 100644 --- a/documentation/development/merging-pull-requests.md +++ b/documentation/development/merging-pull-requests.md @@ -1,7 +1,7 @@ --- layout: wiki title: Merging Pull Requests -group: dev +group: development parent: wiki order: 5 --- @@ -33,4 +33,4 @@ Non-trivial pull requests remain open for a minimum of 48 hours, to give all oth If a pull request adds a new addon, or changes something else, like the README, everyone has 72 hours to comment on the changes. After that, one of the team leads ([NouberNou](https://github.com/NouberNou), [KoffeinFlummi](https://github.com/KoffeinFlummi), [Glowbal](https://github.com/Glowbal)) will merge it. -Trivial changes such as spelling fixes can be merged immediately by any contributor. \ No newline at end of file +Trivial changes such as spelling fixes can be merged immediately by any contributor. diff --git a/documentation/development/modularity-and-pbo-structure.md b/documentation/development/modularity-and-pbo-structure.md index b992455db7..ad1194e39c 100644 --- a/documentation/development/modularity-and-pbo-structure.md +++ b/documentation/development/modularity-and-pbo-structure.md @@ -1,7 +1,7 @@ --- layout: wiki title: Modularity And PBO Structure -group: dev +group: development parent: wiki order: 4 --- diff --git a/documentation/development/setting-up-the-development-environment.md b/documentation/development/setting-up-the-development-environment.md index 3d0f0b1937..0fbc0793f2 100644 --- a/documentation/development/setting-up-the-development-environment.md +++ b/documentation/development/setting-up-the-development-environment.md @@ -1,7 +1,7 @@ --- layout: wiki title: Setting Up The Development Environment -group: dev +group: development parent: wiki order: 0 --- diff --git a/documentation/missionmaker/modules.md b/documentation/missionmaker/modules.md index 1ea5b6c4eb..0b0f13f8d6 100644 --- a/documentation/missionmaker/modules.md +++ b/documentation/missionmaker/modules.md @@ -1,7 +1,7 @@ --- layout: wiki title: Modules -group: missionMaker +group: missionmaker order: 5 parent: wiki --- diff --git a/extras/assets/icons/Icons_Actions.psd b/extras/assets/icons/Icons_Actions.psd new file mode 100644 index 0000000000..616ab7a7fa Binary files /dev/null and b/extras/assets/icons/Icons_Actions.psd differ diff --git a/extras/assets/icons/png/Icon_Actions/disarm.png b/extras/assets/icons/png/Icon_Actions/disarm.png new file mode 100644 index 0000000000..1bf8de1548 Binary files /dev/null and b/extras/assets/icons/png/Icon_Actions/disarm.png differ diff --git a/extras/assets/icons/png/Icon_Module_Ambient_Sounds_ca.png b/extras/assets/icons/png/Icon_Module/Icon_Module_Ambient_Sounds_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module_Ambient_Sounds_ca.png rename to extras/assets/icons/png/Icon_Module/Icon_Module_Ambient_Sounds_ca.png diff --git a/extras/assets/icons/png/Icon_Module_BFTracking_ca.png b/extras/assets/icons/png/Icon_Module/Icon_Module_BFTracking_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module_BFTracking_ca.png rename to extras/assets/icons/png/Icon_Module/Icon_Module_BFTracking_ca.png diff --git a/extras/assets/icons/png/Icon_Module_CheckPBO_ca.png b/extras/assets/icons/png/Icon_Module/Icon_Module_CheckPBO_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module_CheckPBO_ca.png rename to extras/assets/icons/png/Icon_Module/Icon_Module_CheckPBO_ca.png diff --git a/extras/assets/icons/png/Icon_Module_Explosives_ca.png b/extras/assets/icons/png/Icon_Module/Icon_Module_Explosives_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module_Explosives_ca.png rename to extras/assets/icons/png/Icon_Module/Icon_Module_Explosives_ca.png diff --git a/extras/assets/icons/png/Icon_Module_FriendlyFire_ca.png b/extras/assets/icons/png/Icon_Module/Icon_Module_FriendlyFire_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module_FriendlyFire_ca.png rename to extras/assets/icons/png/Icon_Module/Icon_Module_FriendlyFire_ca.png diff --git a/extras/assets/icons/png/Icon_Module_Hearing_ca.png b/extras/assets/icons/png/Icon_Module/Icon_Module_Hearing_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module_Hearing_ca.png rename to extras/assets/icons/png/Icon_Module/Icon_Module_Hearing_ca.png diff --git a/extras/assets/icons/png/Icon_Module_Interaction_ca.png b/extras/assets/icons/png/Icon_Module/Icon_Module_Interaction_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module_Interaction_ca.png rename to extras/assets/icons/png/Icon_Module/Icon_Module_Interaction_ca.png diff --git a/extras/assets/icons/png/Icon_Module_LSD_ca.png b/extras/assets/icons/png/Icon_Module/Icon_Module_LSD_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module_LSD_ca.png rename to extras/assets/icons/png/Icon_Module/Icon_Module_LSD_ca.png diff --git a/extras/assets/icons/png/Icon_Module_Make_Unit_Surrender_ca.png b/extras/assets/icons/png/Icon_Module/Icon_Module_Make_Unit_Surrender_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module_Make_Unit_Surrender_ca.png rename to extras/assets/icons/png/Icon_Module/Icon_Module_Make_Unit_Surrender_ca.png diff --git a/extras/assets/icons/png/Icon_Module_Map_ca.png b/extras/assets/icons/png/Icon_Module/Icon_Module_Map_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module_Map_ca.png rename to extras/assets/icons/png/Icon_Module/Icon_Module_Map_ca.png diff --git a/extras/assets/icons/png/Icon_Module_Medical_ca.png b/extras/assets/icons/png/Icon_Module/Icon_Module_Medical_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module_Medical_ca.png rename to extras/assets/icons/png/Icon_Module/Icon_Module_Medical_ca.png diff --git a/extras/assets/icons/png/Icon_Module_NameTags_ca.png b/extras/assets/icons/png/Icon_Module/Icon_Module_NameTags_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module_NameTags_ca.png rename to extras/assets/icons/png/Icon_Module/Icon_Module_NameTags_ca.png diff --git a/extras/assets/icons/png/Icon_Module_Rallypoint_ca.png b/extras/assets/icons/png/Icon_Module/Icon_Module_Rallypoint_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module_Rallypoint_ca.png rename to extras/assets/icons/png/Icon_Module/Icon_Module_Rallypoint_ca.png diff --git a/extras/assets/icons/png/Icon_Module_Respawn_ca.png b/extras/assets/icons/png/Icon_Module/Icon_Module_Respawn_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module_Respawn_ca.png rename to extras/assets/icons/png/Icon_Module/Icon_Module_Respawn_ca.png diff --git a/extras/assets/icons/png/Icon_Module_SwitchUnits_ca.png b/extras/assets/icons/png/Icon_Module/Icon_Module_SwitchUnits_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module_SwitchUnits_ca.png rename to extras/assets/icons/png/Icon_Module/Icon_Module_SwitchUnits_ca.png diff --git a/extras/assets/icons/png/Icon_Module_VehicleKey_ca.png b/extras/assets/icons/png/Icon_Module/Icon_Module_VehicleKey_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module_VehicleKey_ca.png rename to extras/assets/icons/png/Icon_Module/Icon_Module_VehicleKey_ca.png diff --git a/extras/assets/icons/png/Icon_Module_VehicleLock_ca.png b/extras/assets/icons/png/Icon_Module/Icon_Module_VehicleLock_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module_VehicleLock_ca.png rename to extras/assets/icons/png/Icon_Module/Icon_Module_VehicleLock_ca.png diff --git a/extras/assets/icons/png/Icon_Module_Wind_ca.png b/extras/assets/icons/png/Icon_Module/Icon_Module_Wind_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module_Wind_ca.png rename to extras/assets/icons/png/Icon_Module/Icon_Module_Wind_ca.png diff --git a/extras/assets/icons/png/Icon_Module_microDAGR_ca.png b/extras/assets/icons/png/Icon_Module/Icon_Module_microDAGR_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module_microDAGR_ca.png rename to extras/assets/icons/png/Icon_Module/Icon_Module_microDAGR_ca.png diff --git a/tools/make.py b/tools/make.py index cdd2de22ed..6222932727 100644 --- a/tools/make.py +++ b/tools/make.py @@ -606,14 +606,17 @@ See the make.cfg file for additional build options. 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)) - input("Press Enter to continue...") + 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)) - input("Press Enter to continue...") + 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: @@ -622,13 +625,16 @@ See the make.cfg file for additional build options. configtext = f.read() f.close() - 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() + 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") @@ -675,7 +681,6 @@ See the make.cfg file for additional build options. if not build_successful: print_error("pboProject return code == " + str(ret)) print_error("Module not successfully built/signed.") - input("Press Enter to continue...") print ("Resuming build...") continue diff --git a/tools/make64.py b/tools/make64.py new file mode 100644 index 0000000000..24f8ea2b0b --- /dev/null +++ b/tools/make64.py @@ -0,0 +1,833 @@ +#!/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 = "" + + # 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...")