diff --git a/AUTHORS.txt b/AUTHORS.txt index b931d774ac..86245ccd90 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -50,7 +50,7 @@ havena <silveredenis@gmail.com> Hawkins jokoho48 Jonpas <jonpas33@gmail.com> -Legolasindar +Legolasindar "Viper" <legolasindar@gmail.com> licht-im-Norden87 MarcBook Michail Nikolaev @@ -62,6 +62,7 @@ Raspu86 Riccardo Petricca <petriccarcc@gmail.com> Robert Boklahánics <bokirobi@gmail.com> simon84 +Sniperwolf572 <tenga6@gmail.com> Tonic Tourorist <tourorist@gmail.com> Valentin Torikian <valentin.torikian@gmail.com> 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/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_preInit.sqf b/addons/common/XEH_preInit.sqf index a88c349180..3b47153c7a 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -107,6 +107,7 @@ PREP(isAutoWind); PREP(isAwake); PREP(isEngineer); PREP(isEOD); +PREP(isFeatureCameraActive); PREP(isInBuilding); PREP(isModLoaded); PREP(isPlayer); @@ -177,6 +178,9 @@ PREP(useItem); PREP(useMagazine); PREP(waitAndExecute); +PREP(translateToWeaponSpace); +PREP(translateToModelSpace); + // config items PREP(getConfigType); PREP(getItemType); 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 <OBJECT> + * 1: Disable AI <BOOL> + * + * 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_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/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/stringtable.xml b/addons/common/stringtable.xml index a5f5368cd0..04a98e6b38 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -296,68 +296,78 @@ <Hungarian>Nincs hang</Hungarian> </Key> <Key ID="STR_ACE_ACTION_ACCEPT_REQUEST_KEY_TITLE"> - <Polish>Akceptuj prośby</Polish> - <Spanish>Aceptar Peticiones</Spanish> <English>Accept Requests</English> <German>Anfrage annehmen</German> + <Spanish>Aceptar peticiones</Spanish> + <Polish>Akceptuj prośby</Polish> </Key> <Key ID="STR_ACE_ACTION_DECLINE_REQUEST_KEY_TITLE"> - <Polish>Ignoruj prośby</Polish> - <Spanish>Rechazar Peticiones</Spanish> <English>Decline Requests</English> <German>Anfrage ablehnen</German> + <Spanish>Rechazar peticiones</Spanish> + <Polish>Ignoruj prośby</Polish> </Key> <Key ID="STR_ACE_ACTION_ACCEPT_REQUEST_KEY_TOOLTIP"> - <Polish>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.</Polish> - <Spanish>Acepta Peticiones de otros jugadores. Pueden ser solicitudes para usar / compartir equipamiento, realizar ciertas acciones.</Spanish> <English>Accept Requests send by other players. These can be requests to use / share equipment, perform certain actions.</English> <German>Anfragen anderer Spieler annehmen. Diese Anfragen können sich auf das Benutzen / Teilen von Equipment beziehen oder das Ausführen bestimmter Aktionen.</German> + <Spanish>Acepta peticiones de otros jugadores. Pueden ser solicitudes para usar / compartir equipamiento, realizar ciertas acciones.</Spanish> + <Polish>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.</Polish> </Key> <Key ID="STR_ACE_ACTION_DECLINE_REQUEST_KEY_TOOLTIP"> - <Polish>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.</Polish> - <Spanish>Rechazar Peticiones de otros jugadores. Pueden ser solicitudes para usar / compartir equipamiento, realizar ciertas acciones.</Spanish> <English>Decline Requests send by other players. These can be requests to use / share equipment, perform certain actions.</English> <German>Anfragen anderer Spieler ablehnen. Diese Anfragen können sich auf das Benutzen / Teilen von Equipment beziehen oder das Ausführen bestimmter Aktionen.</German> + <Spanish>Rechazar peticiones de otros jugadores. Pueden ser solicitudes para usar / compartir equipamiento, realizar ciertas acciones.</Spanish> + <Polish>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.</Polish> </Key> <Key ID="STR_ACE_Common_SettingFeedbackIconsName"> <English>Feedback icons</English> <German>Feedback-Icons</German> + <Spanish>Iconos de respuesta</Spanish> </Key> <Key ID="STR_ACE_Common_SettingFeedbackIconsDesc"> <English>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.</English> <German>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.</German> + <Spanish>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.</Spanish> </Key> <Key ID="STR_ACE_Common_SettingProgressbarLocationName"> <English>Progress bar location</English> <German>Position des Fortschrittsanzeige</German> + <Spanish>Ubicación de la barra de progreso</Spanish> </Key> <Key ID="STR_ACE_Common_SettingProgressbarLocationDesc"> <English>Set the desired location of the progress bar on your screen.</English> <German>Wähle die Position der Fortschrittsanzeige.</German> + <Spanish>Seleccionar la ubicación deseada de la barra de progreso en tu pantalla</Spanish> </Key> <Key ID="STR_ACE_Common_SettingDisplayTextColorName"> <English>Hint Background color</English> <German>Hinweis Hintergrundfarbe</German> + <Spanish>Color de fondo de las notificaciones</Spanish> </Key> <Key ID="STR_ACE_Common_SettingDisplayTextColorDesc"> <English>The color of the background from the ACE hints.</English> <German>Wähle die Hintergrundfarbe für ACE-Hinweise.</German> + <Spanish>El color de fondo de las notificaciones del ACE</Spanish> </Key> <Key ID="STR_ACE_Common_SettingDisplayTextFontColorName"> <English>Hint text font color</English> <German>Hinweis Textfarbe</German> + <Spanish>Color del texto de las notificaciones</Spanish> </Key> <Key ID="STR_ACE_Common_SettingDisplayTextFontColorDesc"> <English>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.</English> <German>Wähle die Textfarbe für ACE-Hinweise. </German> + <Spanish>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.</Spanish> </Key> <Key ID="STR_ACE_Common_bananaDisplayName"> <English>Banana</English> <German>Banane</German> + <Spanish>Banana</Spanish> </Key> <Key ID="STR_ACE_Common_bananaDescr"> <English>A banana is an edible fruit, botanically a berry, produced by several kinds of large herbaceous flowering plants in the genus Musa.</English> <German>Die Bananen (Musa) sind eine Pflanzengattung in der Familie der Bananengewächse (Musaceae) innerhalb der Einkeimblättrigen Pflanzen (Monokotyledonen).</German> + <Spanish>Una banana es una fruta comestible, botanicamente una baya, producida por varios tipos de grandes plantas herbáceas del género Musa.</Spanish> </Key> </Package> -</Project> \ No newline at end of file +</Project> diff --git a/addons/explosives/stringtable.xml b/addons/explosives/stringtable.xml index 1d010a0a7e..386e1677ed 100644 --- a/addons/explosives/stringtable.xml +++ b/addons/explosives/stringtable.xml @@ -493,6 +493,7 @@ <Key ID="STR_ACE_Explosives_Pickup"> <English>Pick up</English> <German>Aufnehmen</German> + <Spanish>Recoger</Spanish> </Key> </Package> -</Project> \ No newline at end of file +</Project> diff --git a/addons/frag/stringtable.xml b/addons/frag/stringtable.xml index 4ae3979667..6bfd3c2b46 100644 --- a/addons/frag/stringtable.xml +++ b/addons/frag/stringtable.xml @@ -7,9 +7,10 @@ <English>Disable Fragmentation</English> <Czech>Zakázat fragmentaci granátů</Czech> <German>Weapons: Keine Schrapnelle</German> + <Spanish>Desactivar fragmentación</Spanish> <Polish>Wyłącz głowice fragmentacyjne</Polish> <Russian>Выключить разлёт осколков</Russian> </Key> </Container> </Package> -</Project> \ No newline at end of file +</Project> 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/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index b3de5efddf..e0f2c4967e 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -5,22 +5,27 @@ <Key ID="STR_ACE_Interact_Menu_AlwaysUseCursorSelfInteraction"> <English>Always display cursor for self interaction</English> <German>Immer den Cursor für Selbst-Interaktionen anzeigen.</German> + <Spanish>Mostrar siempre el cursor para la interacción propia</Spanish> </Key> <Key ID="STR_ACE_Interact_Menu_InteractKey"> <English>Interact Key</English> <German>Interaktionstaste</German> + <Spanish>Tecla de interacción</Spanish> </Key> <Key ID="STR_ACE_Interact_Menu_SelfInteractKey"> <English>Self Interaction Key</English> <German>Selbst-Interaktionstaste</German> + <Spanish>Tecla de interacción propia</Spanish> </Key> <Key ID="STR_ACE_Interact_Menu_SelfActionsRoot"> <English>Self Actions</English> <German>Selbst-Interaktion</German> + <Spanish>Acciones propias</Spanish> </Key> <Key ID="STR_ACE_Interact_Menu_VehicleActionsRoot"> <English>Vehicle Actions</English> <German>Fahrzeug-Interaktion</German> + <Spanish>Acciones de vehículo</Spanish> </Key> </Package> -</Project> \ No newline at end of file +</Project> diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index e85d0d3b47..cd2d6ece01 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -5,34 +5,42 @@ <Key ID="STR_ACE_Interaction_MainAction"> <English>Interactions</English> <German>Interaktion</German> + <Spanish>Interacciones</Spanish> </Key> <Key ID="STR_ACE_Interaction_Torso"> <English>Torso</English> <German>Torso</German> + <Spanish>Torso</Spanish> </Key> <Key ID="STR_ACE_Interaction_Head"> <English>Head</English> <German>Kopf</German> + <Spanish>Cabeza</Spanish> </Key> <Key ID="STR_ACE_Interaction_ArmLeft"> <English>Left Arm</English> <German>Arm links</German> + <Spanish>Brazo izquierdo</Spanish> </Key> <Key ID="STR_ACE_Interaction_ArmRight"> <English>Right Arm</English> <German>Arm rechts</German> + <Spanish>Brazo derecho</Spanish> </Key> <Key ID="STR_ACE_Interaction_LegLeft"> <English>Left Leg</English> <German>Bein links</German> + <Spanish>Pierna izquierda</Spanish> </Key> <Key ID="STR_ACE_Interaction_LegRight"> <English>Right Leg</English> <German>Bein rechts</German> + <Spanish>Pierna derecha</Spanish> </Key> <Key ID="STR_ACE_Interaction_Weapon"> <English>Weapon</English> <German>Waffe</German> + <Spanish>Arma</Spanish> </Key> <Key ID="STR_ACE_Interaction_InteractionMenu"> <English>Interaction Menu</English> @@ -664,6 +672,7 @@ <Key ID="STR_ACE_Interaction_Passengers"> <English>Passengers</English> <German>Passagiere</German> + <Spanish>Pasajeros</Spanish> </Key> </Package> -</Project> \ No newline at end of file +</Project> diff --git a/addons/inventory/stringtable.xml b/addons/inventory/stringtable.xml index f93e0d9627..bd84935808 100644 --- a/addons/inventory/stringtable.xml +++ b/addons/inventory/stringtable.xml @@ -5,10 +5,12 @@ <Key ID="STR_ACE_Inventory_SettingName"> <English>Make Inventory Display Bigger</English> <German>Die Anzeige des Inventar vergrößern.</German> + <Spanish>Hacer la pantalla de inventario mas grande</Spanish> </Key> <Key ID="STR_ACE_Inventory_SettingDescription"> <English>Normally inventory display is scaled by UI size. This allows scaling the Inventory UI size up, but doesn't increase font size allowing more rows displayed.</English> <German>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.</German> + <Spanish>Normalmente la pantalla de inventario se escala por el tamaño de la interfaz de usuario. Esto permite ampliar el tamaño de la interfaz de usuario de inventario, pero no aumenta el tamaño de fuente, permitiendo mostrar más filas.</Spanish> </Key> </Package> -</Project> \ No newline at end of file +</Project> 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/XEH_pre_init.sqf b/addons/laser/XEH_pre_init.sqf index 8b39c429b6..4e4a39e8bf 100644 --- a/addons/laser/XEH_pre_init.sqf +++ b/addons/laser/XEH_pre_init.sqf @@ -14,13 +14,7 @@ PREP(translateToWeaponSpace); PREP(laser_init); -GVAR(laser) = nil; // a single hud draws 1 laser at a time - PREP(laserTargetPFH); ACE_LASERS = []; - -ACE_DEFAULT_LASER_CODE = 1000; -ACE_DEFAULT_FIRE_SELECTION = [FIREMODE_DIRECT_LOAL, ACE_DEFAULT_LASER_CODE]; - -FUNC(getPosASL) = {visiblePositionASL (_this select 0)}; \ No newline at end of file +ACE_DEFAULT_LASER_CODE = 1001; \ No newline at end of file diff --git a/addons/laser/functions/fnc_findLaserDesignator.sqf b/addons/laser/functions/fnc_findLaserDesignator.sqf index d10e221501..902775ebd5 100644 --- a/addons/laser/functions/fnc_findLaserDesignator.sqf +++ b/addons/laser/functions/fnc_findLaserDesignator.sqf @@ -1,17 +1,21 @@ +//#define DEBUG_MODE_FULL #include "script_component.hpp" -private ["_missile", "_headingPitch", "_found", "_vectorTo", "_polarTo", "_dir", "_vertOk", "_horzOk", "_fov", +private ["_seeker", "_headingPitch", "_found", "_vectorTo", "_polarTo", "_dir", "_vertOk", "_horzOk", "_fov", "_closestDistance", "_pos1", "_pos2", "_disCheck", "_currentTarget", "_potentialTargets", "_offset", "_vector"]; -_missile = _this select 0; + +_seeker = _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}; +_vector = if (count _this > 3) then {_this select 3} else {vectorDir _seeker}; _offset = if (count _this > 4) then {_this select 4} else {[0,0,0]}; _headingPitch = _vector call CBA_fnc_vect2polar; _currentTarget = nil; _found = false; +_getPosASL = {visiblePositionASL (_this select 0)}; + LOG("Searching lasers"); if(!(isNil "ACE_LASERS")) then { _potentialTargets = []; @@ -19,8 +23,8 @@ if(!(isNil "ACE_LASERS")) then { { if(!(isNull _x)) then { - _sensorPos = ATLtoASL(_missile modelToWorldVisual _offset); - _vectorTo = [_sensorPos, ([_x] call FUNC(getPosASL))] call BIS_fnc_vectorFromXToY; + _sensorPos = ATLtoASL(_seeker modelToWorldVisual _offset); + _vectorTo = [_sensorPos, ([_x] call _getPosASL)] call BIS_fnc_vectorFromXToY; _polarTo = _vectorTo call CBA_fnc_vect2polar; _dir = _polarTo select 1; _dir = _dir - (_headingPitch select 1); @@ -42,7 +46,7 @@ if(!(isNil "ACE_LASERS")) then { 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]; + _targetCode = _x getVariable ["ACE_LASER_CODE", ACE_DEFAULT_LASER_CODE]; TRACE_1("Target in sight, checking code", _targetCode, _laserCode); if(_targetCode == _laserCode) then { _potentialTargets set[(count _potentialTargets), _x]; @@ -56,11 +60,11 @@ if(!(isNil "ACE_LASERS")) then { _closestDistance = 100000; { - _pos1 = (getPosASL _missile); - _pos2 = ([_x] call FUNC(getPosASL)); + _pos1 = (getPosASL _seeker); + _pos2 = ([_x] call _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 { + if(_disCheck < _closestDistance && {[_pos1, _pos2, _x, _seeker] call FUNC(checkLos)}) then { _found = true; _currentTarget = _x; _closestDistance = _disCheck; diff --git a/addons/laser/functions/fnc_laser_init.sqf b/addons/laser/functions/fnc_laser_init.sqf index 9fcb439032..2790459724 100644 --- a/addons/laser/functions/fnc_laser_init.sqf +++ b/addons/laser/functions/fnc_laser_init.sqf @@ -9,16 +9,16 @@ TRACE_1("enter", _this); // Add the laser localized to the laser array, and give it the default localized code PUSH(ACE_LASERS, _laserTarget); // Check the vehicle, otherwise use the default -_laserTarget setVariable ["ACE_LASERTARGET_CODE", ACE_DEFAULT_LASER_CODE, false]; +_laserTarget setVariable ["ACE_LASER_CODE", ACE_DEFAULT_LASER_CODE, false]; // Clean the lasers of any null objects while we are here REM(ACE_LASERS, objNull); if(!(local _laserTarget)) exitWith { }; // The target is local, so its on this client if(!isDedicated) then { - _laserTarget setVariable ["ACE_LASERTARGET_SHOOTER", player, true]; + _laserTarget setVariable ["ACE_LASERTARGET_SHOOTER", ACE_player, true]; - [FUNC(laserTargetPFH), 0, [_laserTarget, player]] call cba_fnc_addPerFrameHandler; + [FUNC(laserTargetPFH), 0, [_laserTarget, ACE_player]] call cba_fnc_addPerFrameHandler; } else { // server side ownership of laser //_laserTarget setVariable ["ACE_LASERTARGET_SHOOTER", nil, false]; diff --git a/addons/laser_selfdesignate/XEH_pre_init.sqf b/addons/laser_selfdesignate/XEH_pre_init.sqf index a8d4b1779d..dd971b9539 100644 --- a/addons/laser_selfdesignate/XEH_pre_init.sqf +++ b/addons/laser_selfdesignate/XEH_pre_init.sqf @@ -6,6 +6,6 @@ PREP(laserHudDesignateOff); PREP(unitTurretHasDesignator); GVAR(laser) = nil; -GVAR(laserActive) = false; +GVAR(active) = false; FUNC(getPosASL) = {visiblePositionASL (_this select 0)}; 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..02ea7e6e70 100644 --- a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOff.sqf +++ b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOff.sqf @@ -1,5 +1,11 @@ #include "script_component.hpp" +if( (count _this) > 2) then { + EXPLODE_3_PVT(_this,_vehicle,_shooter,_laserTarget); + // We got the optional vehicle list, clear the parameters + _vehicle setVariable[QGVAR(currentTarget), [], true]; +}; + if(isNil QGVAR(laser)) exitWith { false }; @@ -15,6 +21,8 @@ if(!isNil "_handle") then { 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..a6c8fc2295 100644 --- a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf +++ b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOn.sqf @@ -5,25 +5,21 @@ 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", "_laserTarget", "_shooter", "_vehicle", "_weapon", "_gunnerInfo", "_turret", "_pov", "_gunBeg", "_gunEnd", "_povPos", "_povDir", "_result", "_resultPositions", "_firstResult", "_forceUpdateTime"]; _args = _this select 0; _laserTarget = _args select 0; _shooter = _args select 1; + + TRACE_1("", _args, (_laserTarget getVariable["ACE_LASER_CODE"])); + if((vehicle ACE_player) != _shooter || !alive _shooter || isNull _vehicle || isNull _laserTarget || !GVAR(active) ) exitWith { + [_vehicle, _shooter, _laserTarget] call FUNC(laserHudDesignateOff); + }; + if(!([_shooter] call FUNC(unitTurretHasDesignator)) ) exitWith { + [_vehicle, _shooter, _laserTarget] call FUNC(laserHudDesignateOff); + }; + if( (count _args) < 3) then { _args set[2, diag_tickTime + FCS_UPDATE_DELAY]; }; @@ -32,21 +28,23 @@ FUNC(laserHudDesignatePFH) = { _vehicle = vehicle _shooter; _weapon = currentWeapon _vehicle; - TRACE_1("", _args); - - if(!alive _shooter || isNull _vehicle || isNull _laserTarget || !GVAR(laserActive) ) exitWith { - [] call FUNC(laserHudDesignateOff); - }; - if(!([ACE_player] call FUNC(unitTurretHasDesignator)) ) exitWith { - [] call FUNC(laserHudDesignateOff); - }; - // Retrieve the gunner and turret memory point information _gunnerInfo = [_vehicle, _weapon] call CBA_fnc_getFirer; _turretInfo = [_vehicle, _gunnerInfo select 1] call EFUNC(common,getTurretDirection); _povPos = _turretInfo select 0; _povDir = _turretInfo select 1; + _targetInfo = _vehicle getVariable[QGVAR(currentTarget), [] ]; + if( (count _targetInfo) > 0) then { + if(_laserTarget != (_targetInfo select 0) ) then { + _targetInfo = [] + }; + }; + if( (count _targetInfo) < 1) then { + _targetInfo = [_laserTarget, 1001]; // TODO: set laser code + _vehicle setVariable[QGVAR(currentTarget), _targetInfo, true]; + _laserTarget setVariable[QGVAR(owner), _vehicle, true]; + }; _result = [_povPos, _povDir] call EFUNC(laser,shootCone); @@ -54,24 +52,23 @@ FUNC(laserHudDesignatePFH) = { _resultPositions = _result select 2; if((count _resultPositions) > 0) then { - _firstResult = _resultPositions select 0; - _pos = _firstResult select 0; + _strongestResultPos = [_resultPositions, _povPos] call EFUNC(laser,findStrongestRay); // 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)); + TRACE_5("", diag_tickTime, _forceUpdateTime, getPosASL _laserTarget, _strongestResultPos, ((getPosASL _laserTarget) distance _pos)); if(diag_tickTime > _forceUpdateTime) then { TRACE_1("FCS Update", ""); ["ace_fcs_forceUpdate", []] call ace_common_fnc_localEvent; }; - if( (_laserTarget distance _pos) > 0.1) then { + //if( (_laserTarget distance _strongestResultPos) > 0.1) then { TRACE_1("LaserPos Update", ""); - _laserTarget setPosATL (ASLToATL _pos); - }; + _laserTarget setPosATL (ASLToATL _strongestResultPos); + //}; if(diag_tickTime > _forceUpdateTime) then { _args set[2, diag_tickTime + FCS_UPDATE_DELAY]; @@ -91,18 +88,19 @@ FUNC(laserHudDesignatePFH) = { _this set[0, _args]; }; -private "_laserTarget"; -private "_handle"; +private ["_laserTarget", "_handle", "_vehicle"]; if(isNil QGVAR(laser)) then { + _laserTarget = "LaserTargetW" createVehicle (getpos ACE_player); - _laserTarget = "LaserTargetW" createVehicle (getpos player); + GVAR(active) = true; - GVAR(laserActive) = true; - - _handle = [FUNC(laserHudDesignatePFH), 0.1, [_laserTarget, player]] call cba_fnc_addPerFrameHandler; + _handle = [FUNC(laserHudDesignatePFH), 0.1, [_laserTarget, ACE_player]] call cba_fnc_addPerFrameHandler; _laserTarget setVariable ["ACE_PFH_HANDLE", _handle, false]; + // Clear the vehicle parameters + _vehicle setVariable[QGVAR(currentTarget), [], true]; + GVAR(laser) = _laserTarget; } else { [] call FUNC(laserHudDesignateOff); diff --git a/addons/laser_selfdesignate/stringtable.xml b/addons/laser_selfdesignate/stringtable.xml index 03d28814ec..da8030cb69 100644 --- a/addons/laser_selfdesignate/stringtable.xml +++ b/addons/laser_selfdesignate/stringtable.xml @@ -5,10 +5,12 @@ <Key ID="STR_ACE_Laser_SelfDesignate_DesignatorOn"> <English>Laser<br/>Designator On</English> <German>Lasermarkierer<br/>an</German> + <Spanish>Laser<br/>Designador encendido</Spanish> </Key> <Key ID="STR_ACE_Laser_SelfDesignate_DesignatorOff"> <English>Laser<br/>Designator Off</English> <German>Lasermarkierer<br/>aus</German> + <Spanish>Laser<br/>Designador apagado</Spanish> </Key> </Package> -</Project> \ No newline at end of file +</Project> diff --git a/addons/logistics_wirecutter/stringtable.xml b/addons/logistics_wirecutter/stringtable.xml index f23af6b1e5..91d321d75c 100644 --- a/addons/logistics_wirecutter/stringtable.xml +++ b/addons/logistics_wirecutter/stringtable.xml @@ -5,11 +5,12 @@ <Key ID="STR_ACE_logistics_wirecutter_wirecutterName"> <English>Wirecutter</English> <German>Drahtschneider</German> - <Spanish>Wirecutter</Spanish> + <Spanish>Cortador de cables</Spanish> </Key> <Key ID="STR_ACE_logistics_wirecutter_wirecutterDescription"> <English>Wirecutter</English> <German>Schneidet Draht.</German> + <Spanish>Cortador de cables</Spanish> </Key> <Key ID="STR_ACE_logistics_wirecutter_CutFence"> <English>Cut Fence</English> @@ -48,4 +49,4 @@ <Russian>Забор вырезан</Russian> </Key> </Package> -</Project> \ No newline at end of file +</Project> diff --git a/addons/magazinerepack/stringtable.xml b/addons/magazinerepack/stringtable.xml index d8fd5ca177..d63dd2d2cd 100644 --- a/addons/magazinerepack/stringtable.xml +++ b/addons/magazinerepack/stringtable.xml @@ -77,12 +77,12 @@ <Key ID="STR_ACE_MagazineRepack_RepackComplete"> <English>Repacking Finished</English> <German>Wiederverpacken Fertig</German> - <Spanish>Reembalaje Finalizado</Spanish> + <Spanish>Reembalaje finalizado</Spanish> </Key> <Key ID="STR_ACE_MagazineRepack_RepackInterrupted"> <English>Repacking Interrupted</English> <German>Umpacken Unterbrochen</German> - <Spanish>Reempaque Interrupted</Spanish> + <Spanish>Reembalaje interrumpido</Spanish> </Key> <Key ID="STR_ACE_MagazineRepack_RepackedMagazinesCount"> <English>%1 Full and %2 Partial</English> @@ -90,4 +90,4 @@ <Spanish>%1 Total y %2 Parcial</Spanish> </Key> </Package> -</Project> \ No newline at end of file +</Project> diff --git a/addons/medical/functions/fnc_setUnconscious.sqf b/addons/medical/functions/fnc_setUnconscious.sqf index c518b93a97..e373901610 100644 --- a/addons/medical/functions/fnc_setUnconscious.sqf +++ b/addons/medical/functions/fnc_setUnconscious.sqf @@ -116,7 +116,7 @@ _startingTime = time; // Swhich the unit back to its original group [_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..7036e6863d 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -1,974 +1,1012 @@ <?xml version="1.0" encoding="utf-8"?> <!-- Edited with tabler - 2015-04-07 --> <Project name="ACE"> - <Package name="Medical"> - <Key ID="STR_ACE_Medical_Inject_Atropine"> - <English>Inject Atropine</English> - <German>Atropin</German> - </Key> - <Key ID="STR_ACE_Medical_Inject_Epinephrine"> - <English>Inject Epinephrine</English> - <German>Epinephrine injizieren</German> - <Spanish>Inyectar Epinefrina</Spanish> - <Polish>Wtrzyknij adrenalinę</Polish> - <Czech>Aplikovat Adrenalin</Czech> - <Russian>Ввести андреналил</Russian> - <French>Adrénaline</French> - <Hungarian>Adrenalin</Hungarian> - <Portuguese>Injetar Epinefrina</Portuguese> - <Italian>Inietta Epinefrina</Italian> - </Key> - <Key ID="STR_ACE_Medical_Inject_Morphine"> - <English>Inject Morphine</English> - <German>Morphin injizieren</German> - <Spanish>Inyectar Morfina</Spanish> - <Polish>Wstrzyknij morfinę</Polish> - <Czech>Aplikovat Morfin</Czech> - <Russian>Ввести морфин</Russian> - <French>Morphine</French> - <Hungarian>Morfium</Hungarian> - <Portuguese>Injetar Morfina</Portuguese> - <Italian>Inietta Morfina</Italian> - </Key> - <Key ID="STR_ACE_Medical_Transfuse_Blood"> - <English>Transfuse Blood</English> - <German>Bluttransfusion</German> - <Spanish>Transfundir sangre</Spanish> - <Polish>Przetocz krew</Polish> - <Czech>Transfúze krve</Czech> - <Russian>Перелить кровь</Russian> - <French>Transfusion</French> - <Hungarian>Infúzió</Hungarian> - <Portuguese>Transfundir Sangue</Portuguese> - <Italian>Effettua Trasfusione</Italian> - </Key> - <Key ID="STR_ACE_Medical_Transfuse_Plasma"> - <English>Transfuse Plasma</English> - <German>Plasmatransfusion</German> - </Key> - <Key ID="STR_ACE_Medical_Transfuse_Saline"> - <English>Transfuse Saline</English> - <German>Salzlösungtransfusion</German> - </Key> - <Key ID="STR_ACE_Medical_Apply_Tourniquet"> - <English>Apply Tourniquet</English> - <German>Aderpresse anwenden</German> - </Key> - <Key ID="STR_ACE_Medical_Bandage"> - <English>Bandage</English> - <German>Verbinden</German> - <Spanish>Venda</Spanish> - <Polish>Bandaż</Polish> - <Czech>Obvázat</Czech> - <French>Pansement</French> - <Italian>Benda</Italian> - <Hungarian>Kötözés</Hungarian> - <Portuguese>Atadura</Portuguese> - <Russian>Перевязать</Russian> - </Key> - <Key ID="STR_ACE_Medical_Bandage_HitHead"> - <English>Bandage Head</English> - <German>Kopf verbinden</German> - <Spanish>Vendar la cabeza</Spanish> - <Polish>Bandażuj głowę</Polish> - <Czech>Obvázat hlavu</Czech> - <Russian>Перевязать голову</Russian> - <French>Pansement Tête</French> - <Hungarian>Fej kötözése</Hungarian> - <Portuguese>Atar Cabeça</Portuguese> - <Italian>Benda la testa</Italian> - </Key> - <Key ID="STR_ACE_Medical_Bandage_HitBody"> - <English>Bandage Torso</English> - <German>Torso verbinden</German> - <Spanish>Vendar el torso</Spanish> - <Polish>Bandażuj tors</Polish> - <Czech>Obvázat hruď</Czech> - <Russian>Перевязать торс</Russian> - <French>Pansement Torse</French> - <Hungarian>Felsőtest kötözése</Hungarian> - <Portuguese>Atar Tronco</Portuguese> - <Italian>Benda il torso</Italian> - </Key> - <Key ID="STR_ACE_Medical_Bandage_HitLeftArm"> - <English>Bandage Left Arm</English> - <German>Arm links verbinden</German> - <Spanish>Vendar el brazo izquierdo</Spanish> - <Polish>Bandażuj lewe ramię</Polish> - <Czech>Obvázat levou ruku</Czech> - <Russian>Перевязать левую руку</Russian> - <French>Pansement Bras Gauche</French> - <Hungarian>Bal kar kötözése</Hungarian> - <Portuguese>Atar Braço Esquerdo</Portuguese> - <Italian>Benda il braccio sinistro</Italian> - </Key> - <Key ID="STR_ACE_Medical_Bandage_HitRightArm"> - <English>Bandage Right Arm</English> - <German>Arm rechts verbinden</German> - <Spanish>Vendar el brazo derecho</Spanish> - <Polish>Bandażuj prawe ramię</Polish> - <Czech>Obvázat pravou ruku</Czech> - <Russian>Перевязать правую руку</Russian> - <French>Pansement Bras Droit</French> - <Hungarian>Jobb kar kötözése</Hungarian> - <Portuguese>Atar Braço Direito</Portuguese> - <Italian>Benda il braccio destro</Italian> - </Key> - <Key ID="STR_ACE_Medical_Bandage_HitLeftLeg"> - <English>Bandage Left Leg</English> - <German>Bein links verbinden</German> - <Spanish>Vendar la pierna izquierda</Spanish> - <Polish>Bandażuj lewą nogę</Polish> - <Czech>Obvázat levou nohu</Czech> - <Russian>Перевязать левую ногу</Russian> - <French>Pansement Jambe Gauche</French> - <Hungarian>Bal láb kötözése</Hungarian> - <Portuguese>Atar Perna Esquerda</Portuguese> - <Italian>Benda la gamba sinistra</Italian> - </Key> - <Key ID="STR_ACE_Medical_Bandage_HitRightLeg"> - <English>Bandage Right Leg</English> - <German>Bein rechts verbinden</German> - <Spanish>Vendar la pierna derecha</Spanish> - <Polish>Bandażuj prawą nogę</Polish> - <Czech>Obvázat pravou nohu</Czech> - <Russian>Перевязать правую ногу</Russian> - <French>Pansement Jambe Droite</French> - <Hungarian>Jobb láb kötözése</Hungarian> - <Portuguese>Atar Perna Direita</Portuguese> - <Italian>Benda la gamba destra</Italian> - </Key> - <Key ID="STR_ACE_Medical_Injecting_Morphine"> - <English>Injecting Morphine ...</English> - <German>Morphin injizieren ...</German> - <Spanish>Inyectando Morfina ...</Spanish> - <Polish>Wstrzykiwanie morfiny ...</Polish> - <Czech>Aplikuju Morfin ...</Czech> - <Russian>Введение морфина...</Russian> - <French>Injection de Morphine...</French> - <Hungarian>Morfium beadása...</Hungarian> - <Portuguese>Injetando Morfina ...</Portuguese> - <Italian>Inietto la morfina ...</Italian> - </Key> - <Key ID="STR_ACE_Medical_Injecting_Epinephrine"> - <English>Injecting Epinephrine ...</English> - <German>Epinephrin injizieren ...</German> - <Spanish>Inyectando Epinefrina ...</Spanish> - <Polish>Wstrzykiwanie adrenaliny ...</Polish> - <Czech>Aplikuju Adrenalin ...</Czech> - <Russian>Введение андреналина</Russian> - <French>Injection d'Adrénaline ...</French> - <Hungarian>Adrenalin beadása...</Hungarian> - <Portuguese>Injetando Epinefrina ...</Portuguese> - <Italian>Inietto l'epinefrina ...</Italian> - </Key> - <Key ID="STR_ACE_Medical_Injecting_Atropine"> - <English>Injecting Atropine ...</English> - <German>Atropin injizieren ...</German> - </Key> - <Key ID="STR_ACE_Medical_Transfusing_Blood"> - <English>Transfusing Blood ...</English> - <German>Bluttransfusion ...</German> - <Spanish>Realizando transfusión ...</Spanish> - <Polish>Przetaczanie krwi ...</Polish> - <Czech>Probíhá transfúze krve ...</Czech> - <Russian>Переливание крови...</Russian> - <French>Transfusion Sanguine ...</French> - <Hungarian>Infúzió...</Hungarian> - <Portuguese>Transfundindo Sangue ...</Portuguese> - <Italian>Effettuo la trasfusione ...</Italian> - </Key> - <Key ID="STR_ACE_Medical_Transfusing_Saline"> - <English>Transfusing Saline ...</English> - <German>Sallösungtransfusion ...</German> - </Key> - <Key ID="STR_ACE_Medical_Transfusing_Plasma"> - <English>Transfusing Plasma ...</English> - <German>Plasmatransfusion ...</German> - </Key> - <Key ID="STR_ACE_Medical_Bandaging"> - <English>Bandaging ...</English> - <German>Verbinden ...</German> - <Spanish>Vendando ...</Spanish> - <Polish>Bandażowanie ...</Polish> - <Czech>Obvazuji ...</Czech> - <French>Pansement ...</French> - <Italian>Sto applicando la benda ...</Italian> - <Hungarian>Bekötözés...</Hungarian> - <Portuguese>Atando ...</Portuguese> - <Russian>Перевязывание....</Russian> - </Key> - <Key ID="STR_ACE_Medical_Applying_Tourniquet"> - <English>Applying Tourniquet ...</English> - <German>Aderpresse ...</German> - </Key> - <Key ID="STR_ACE_MEDICAL_ACTIONS_Medical"> - <English>Medical</English> - <Czech>Zdravotní</Czech> - <French>Médical</French> - <German>Sanitäter</German> - <Italian>Medico</Italian> - <Polish>Medyczne</Polish> - <Portuguese>Médico</Portuguese> - <Russian>Медик</Russian> - <Spanish>Médico</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_ACTIONS_FieldDressing"> - <English>Field Dressing</English> - </Key> - <Key ID="STR_ACE_MEDICAL_ACTIONS_PackingBandage"> - <English>Packing Bandage</English> - </Key> - <Key ID="STR_ACE_MEDICAL_ACTIONS_ElasticBandage"> - <English>Elastic Bandage</English> - </Key> - <Key ID="STR_ACE_MEDICAL_ACTIONS_QuikClot"> - <English>QuikClot</English> - </Key> - <Key ID="STR_ACE_MEDICAL_ACTIONS_CheckPulse"> - <English>Check Pulse</English> - <German>Puls überprüfen</German> - </Key> - <Key ID="STR_ACE_MEDICAL_ACTIONS_CheckBloodPressure"> - <English>Check Blood Pressure</English> - <German>Blutdruck messen</German> - </Key> - <Key ID="STR_ACE_MEDICAL_ACTIONS_TriageCard"> - <English>Triage Card</English> - <German>Triage Karte</German> - </Key> - <Key ID="STR_ACE_MEDICAL_ACTIONS_Tourniquet"> - <English>Tourniquet</English> - <German>Tourniquet</German> - </Key> - <Key ID="STR_ACE_MEDICAL_ACTIONS_RemoveTourniquet"> - <English>Remove Tourniquet</English> - <German>Entferne Tourniquet</German> - </Key> - <Key ID="STR_ACE_MEDICAL_ACTIONS_Blood4_1000"> - <English>Give Blood IV (1000ml)</English> - </Key> - <Key ID="STR_ACE_MEDICAL_ACTIONS_Blood4_500"> - <English>Give Blood IV (500ml)</English> - </Key> - <Key ID="STR_ACE_MEDICAL_ACTIONS_Blood4_250"> - <English>Give Blood IV (250ml)</English> - </Key> - <Key ID="STR_ACE_MEDICAL_ACTIONS_Plasma4_1000"> - <English>Give Plasma IV (1000ml)</English> - </Key> - <Key ID="STR_ACE_MEDICAL_ACTIONS_Plasma4_500"> - <English>Give Plasma IV (500ml)</English> - </Key> - <Key ID="STR_ACE_MEDICAL_ACTIONS_Plasma4_250"> - <English>Give Plasma IV (250ml)</English> - </Key> - <Key ID="STR_ACE_MEDICAL_ACTIONS_Saline4_1000"> - <English>Give Saline IV (1000ml)</English> - </Key> - <Key ID="STR_ACE_MEDICAL_ACTIONS_Saline4_500"> - <English>Give Saline IV (500ml)</English> - </Key> - <Key ID="STR_ACE_MEDICAL_ACTIONS_Saline4_250"> - <English>Give Saline IV (250ml)</English> - </Key> - <Key ID="STR_ACE_MEDICAL_TRIAGE_STATUS_MINOR"> - <English>Minor</English> - <German>Gering</German> - </Key> - <Key ID="STR_ACE_MEDICAL_TRIAGE_STATUS_DELAYED"> - <English>Delayed</English> - </Key> - <Key ID="STR_ACE_MEDICAL_TRIAGE_STATUS_IMMEDIATE"> - <English>Immediate</English> - </Key> - <Key ID="STR_ACE_MEDICAL_TRIAGE_STATUS_DECEASED"> - <English>Deceased</English> - </Key> - <Key ID="STR_ACE_MEDICAL_TRIAGE_STATUS_NONE"> - <English>None</English> - </Key> - <Key ID="STR_ACE_MEDICAL_NORMAL_BREATHING"> - <English>Normal breathing</English> - <Russian>Дыхание в норме</Russian> - <Spanish>Respiración normal</Spanish> - <French>Respiration Normale</French> - <Polish>Normalny oddech</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_NO_BREATHING"> - <English>No breathing</English> - <Russian>Дыхания нет</Russian> - <Spanish>No respira</Spanish> - <French>Apnée</French> - <Polish>Brak oddechu</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_DIFFICULT_BREATHING"> - <English>Difficult breathing</English> - <Russian>Дыхание затруднено</Russian> - <Spanish>Dificultad para respirar</Spanish> - <French>Difficultée Respiratoire</French> - <Polish>Trudności z oddychaniem</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_ALMOST_NO_BREATHING"> - <English>Almost no breathing</English> - <Russian>Дыхания почти нет</Russian> - <Spanish>Casi sin respirar</Spanish> - <French>Respiration Faible</French> - <Polish>Prawie brak oddechu</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_STATUS_BLEEDING"> - <English>Bleeding</English> - <Russian>Кровотечение</Russian> - <Spanish>Sangrando</Spanish> - <French>Seignement</French> - <Polish>Krwawienie zewnętrzne</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_STATUS_PAIN"> - <English>In Pain</English> - <Russian>Испытывает боль</Russian> - <Spanish>Con Dolor</Spanish> - <French>A De La Douleur</French> - <Polish>W bólu</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_STATUS_LOST_BLOOD"> - <English>Lost a lot of Blood</English> - <Russian>Большая кровопотеря</Russian> - <Spanish>Mucha Sangre perdida</Spanish> - <French>A Perdu Bcp de Sang</French> - <Polish>Stracił dużo krwi</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_STATUS_TOURNIQUET_APPLIED"> - <English>Tourniquet [CAT]</English> - <Russian>Жгут</Russian> - <Spanish>Torniquete [CAT]</Spanish> - <French>Garot [CAT]</French> - <Polish>Opaska uciskowa [CAT]</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_receivingIvVolume"> - <English>Receiving IV [%1ml]</English> - </Key> + <Package name="Medical"> + <Key ID="STR_ACE_Medical_Inject_Atropine"> + <English>Inject Atropine</English> + <German>Atropin</German> + <Spanish>Inyectar atropina</Spanish> + </Key> + <Key ID="STR_ACE_Medical_Inject_Epinephrine"> + <English>Inject Epinephrine</English> + <German>Epinephrine injizieren</German> + <Spanish>Inyectar Epinefrina</Spanish> + <Polish>Wtrzyknij adrenalinę</Polish> + <Czech>Aplikovat Adrenalin</Czech> + <Russian>Ввести андреналил</Russian> + <French>Adrénaline</French> + <Hungarian>Adrenalin</Hungarian> + <Portuguese>Injetar Epinefrina</Portuguese> + <Italian>Inietta Epinefrina</Italian> + </Key> + <Key ID="STR_ACE_Medical_Inject_Morphine"> + <English>Inject Morphine</English> + <German>Morphin injizieren</German> + <Spanish>Inyectar Morfina</Spanish> + <Polish>Wstrzyknij morfinę</Polish> + <Czech>Aplikovat Morfin</Czech> + <Russian>Ввести морфин</Russian> + <French>Morphine</French> + <Hungarian>Morfium</Hungarian> + <Portuguese>Injetar Morfina</Portuguese> + <Italian>Inietta Morfina</Italian> + </Key> + <Key ID="STR_ACE_Medical_Transfuse_Blood"> + <English>Transfuse Blood</English> + <German>Bluttransfusion</German> + <Spanish>Transfundir sangre</Spanish> + <Polish>Przetocz krew</Polish> + <Czech>Transfúze krve</Czech> + <Russian>Перелить кровь</Russian> + <French>Transfusion</French> + <Hungarian>Infúzió</Hungarian> + <Portuguese>Transfundir Sangue</Portuguese> + <Italian>Effettua Trasfusione</Italian> + </Key> + <Key ID="STR_ACE_Medical_Transfuse_Plasma"> + <English>Transfuse Plasma</English> + <German>Plasmatransfusion</German> + <Spanish>Transfundir plasma</Spanish> + </Key> + <Key ID="STR_ACE_Medical_Transfuse_Saline"> + <English>Transfuse Saline</English> + <German>Salzlösungtransfusion</German> + <Spanish>Transfundir salina</Spanish> + </Key> + <Key ID="STR_ACE_Medical_Apply_Tourniquet"> + <English>Apply Tourniquet</English> + <German>Aderpresse anwenden</German> + <Spanish>Aplicar torniquete</Spanish> + </Key> + <Key ID="STR_ACE_Medical_Bandage"> + <English>Bandage</English> + <German>Verbinden</German> + <Spanish>Venda</Spanish> + <Polish>Bandaż</Polish> + <Czech>Obvázat</Czech> + <French>Pansement</French> + <Italian>Benda</Italian> + <Hungarian>Kötözés</Hungarian> + <Portuguese>Atadura</Portuguese> + <Russian>Перевязать</Russian> + </Key> + <Key ID="STR_ACE_Medical_Bandage_HitHead"> + <English>Bandage Head</English> + <German>Kopf verbinden</German> + <Spanish>Vendar la cabeza</Spanish> + <Polish>Bandażuj głowę</Polish> + <Czech>Obvázat hlavu</Czech> + <Russian>Перевязать голову</Russian> + <French>Pansement Tête</French> + <Hungarian>Fej kötözése</Hungarian> + <Portuguese>Atar Cabeça</Portuguese> + <Italian>Benda la testa</Italian> + </Key> + <Key ID="STR_ACE_Medical_Bandage_HitBody"> + <English>Bandage Torso</English> + <German>Torso verbinden</German> + <Spanish>Vendar el torso</Spanish> + <Polish>Bandażuj tors</Polish> + <Czech>Obvázat hruď</Czech> + <Russian>Перевязать торс</Russian> + <French>Pansement Torse</French> + <Hungarian>Felsőtest kötözése</Hungarian> + <Portuguese>Atar Tronco</Portuguese> + <Italian>Benda il torso</Italian> + </Key> + <Key ID="STR_ACE_Medical_Bandage_HitLeftArm"> + <English>Bandage Left Arm</English> + <German>Arm links verbinden</German> + <Spanish>Vendar el brazo izquierdo</Spanish> + <Polish>Bandażuj lewe ramię</Polish> + <Czech>Obvázat levou ruku</Czech> + <Russian>Перевязать левую руку</Russian> + <French>Pansement Bras Gauche</French> + <Hungarian>Bal kar kötözése</Hungarian> + <Portuguese>Atar Braço Esquerdo</Portuguese> + <Italian>Benda il braccio sinistro</Italian> + </Key> + <Key ID="STR_ACE_Medical_Bandage_HitRightArm"> + <English>Bandage Right Arm</English> + <German>Arm rechts verbinden</German> + <Spanish>Vendar el brazo derecho</Spanish> + <Polish>Bandażuj prawe ramię</Polish> + <Czech>Obvázat pravou ruku</Czech> + <Russian>Перевязать правую руку</Russian> + <French>Pansement Bras Droit</French> + <Hungarian>Jobb kar kötözése</Hungarian> + <Portuguese>Atar Braço Direito</Portuguese> + <Italian>Benda il braccio destro</Italian> + </Key> + <Key ID="STR_ACE_Medical_Bandage_HitLeftLeg"> + <English>Bandage Left Leg</English> + <German>Bein links verbinden</German> + <Spanish>Vendar la pierna izquierda</Spanish> + <Polish>Bandażuj lewą nogę</Polish> + <Czech>Obvázat levou nohu</Czech> + <Russian>Перевязать левую ногу</Russian> + <French>Pansement Jambe Gauche</French> + <Hungarian>Bal láb kötözése</Hungarian> + <Portuguese>Atar Perna Esquerda</Portuguese> + <Italian>Benda la gamba sinistra</Italian> + </Key> + <Key ID="STR_ACE_Medical_Bandage_HitRightLeg"> + <English>Bandage Right Leg</English> + <German>Bein rechts verbinden</German> + <Spanish>Vendar la pierna derecha</Spanish> + <Polish>Bandażuj prawą nogę</Polish> + <Czech>Obvázat pravou nohu</Czech> + <Russian>Перевязать правую ногу</Russian> + <French>Pansement Jambe Droite</French> + <Hungarian>Jobb láb kötözése</Hungarian> + <Portuguese>Atar Perna Direita</Portuguese> + <Italian>Benda la gamba destra</Italian> + </Key> + <Key ID="STR_ACE_Medical_Injecting_Morphine"> + <English>Injecting Morphine ...</English> + <German>Morphin injizieren ...</German> + <Spanish>Inyectando Morfina ...</Spanish> + <Polish>Wstrzykiwanie morfiny ...</Polish> + <Czech>Aplikuju Morfin ...</Czech> + <Russian>Введение морфина...</Russian> + <French>Injection de Morphine...</French> + <Hungarian>Morfium beadása...</Hungarian> + <Portuguese>Injetando Morfina ...</Portuguese> + <Italian>Inietto la morfina ...</Italian> + </Key> + <Key ID="STR_ACE_Medical_Injecting_Epinephrine"> + <English>Injecting Epinephrine ...</English> + <German>Epinephrin injizieren ...</German> + <Spanish>Inyectando Epinefrina ...</Spanish> + <Polish>Wstrzykiwanie adrenaliny ...</Polish> + <Czech>Aplikuju Adrenalin ...</Czech> + <Russian>Введение андреналина</Russian> + <French>Injection d'Adrénaline ...</French> + <Hungarian>Adrenalin beadása...</Hungarian> + <Portuguese>Injetando Epinefrina ...</Portuguese> + <Italian>Inietto l'epinefrina ...</Italian> + </Key> + <Key ID="STR_ACE_Medical_Injecting_Atropine"> + <English>Injecting Atropine ...</English> + <German>Atropin injizieren ...</German> + </Key> + <Key ID="STR_ACE_Medical_Transfusing_Blood"> + <English>Transfusing Blood ...</English> + <German>Bluttransfusion ...</German> + <Spanish>Realizando transfusión ...</Spanish> + <Polish>Przetaczanie krwi ...</Polish> + <Czech>Probíhá transfúze krve ...</Czech> + <Russian>Переливание крови...</Russian> + <French>Transfusion Sanguine ...</French> + <Hungarian>Infúzió...</Hungarian> + <Portuguese>Transfundindo Sangue ...</Portuguese> + <Italian>Effettuo la trasfusione ...</Italian> + </Key> + <Key ID="STR_ACE_Medical_Transfusing_Saline"> + <English>Transfusing Saline ...</English> + <German>Sallösungtransfusion ...</German> + <Spanish>Transfusión de salina ...</Spanish> + </Key> + <Key ID="STR_ACE_Medical_Transfusing_Plasma"> + <English>Transfusing Plasma ...</English> + <German>Plasmatransfusion ...</German> + <Spanish>Transfusión de plasma ...</Spanish> + </Key> + <Key ID="STR_ACE_Medical_Bandaging"> + <English>Bandaging ...</English> + <German>Verbinden ...</German> + <Spanish>Vendando ...</Spanish> + <Polish>Bandażowanie ...</Polish> + <Czech>Obvazuji ...</Czech> + <French>Pansement ...</French> + <Italian>Sto applicando la benda ...</Italian> + <Hungarian>Bekötözés...</Hungarian> + <Portuguese>Atando ...</Portuguese> + <Russian>Перевязывание....</Russian> + </Key> + <Key ID="STR_ACE_Medical_Applying_Tourniquet"> + <English>Applying Tourniquet ...</English> + <German>Aderpresse ...</German> + <Spanish>Aplicando torniquete ...</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_ACTIONS_Medical"> + <English>Medical</English> + <Czech>Zdravotní</Czech> + <French>Médical</French> + <German>Sanitäter</German> + <Italian>Medico</Italian> + <Polish>Medyczne</Polish> + <Portuguese>Médico</Portuguese> + <Russian>Медик</Russian> + <Spanish>Médico</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_ACTIONS_FieldDressing"> + <English>Field Dressing</English> + <Spanish>Compresa de campaña</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_ACTIONS_PackingBandage"> + <English>Packing Bandage</English> + <Spanish>Vendaje compresivo</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_ACTIONS_ElasticBandage"> + <English>Elastic Bandage</English> + <Spanish>Vendaje elástico</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_ACTIONS_QuikClot"> + <English>QuikClot</English> + <Spanish>QuikClot</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_ACTIONS_CheckPulse"> + <English>Check Pulse</English> + <German>Puls überprüfen</German> + <Spanish>Comprobar pulso</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_ACTIONS_CheckBloodPressure"> + <English>Check Blood Pressure</English> + <German>Blutdruck messen</German> + <Spanish>Comprobar presión arterial</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_ACTIONS_TriageCard"> + <English>Triage Card</English> + <German>Triage Karte</German> + <Spanish>Tarjeta de triaje</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_ACTIONS_Tourniquet"> + <English>Tourniquet</English> + <German>Tourniquet</German> + <Spanish>Torniquete</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_ACTIONS_RemoveTourniquet"> + <English>Remove Tourniquet</English> + <German>Entferne Tourniquet</German> + <Spanish>Quitar torniquete</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_ACTIONS_Blood4_1000"> + <English>Give Blood IV (1000ml)</English> + <Spanish>Dar Sangre IV (1000ml)</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_ACTIONS_Blood4_500"> + <English>Give Blood IV (500ml)</English> + <Spanish>Dar Sangre IV (500ml)</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_ACTIONS_Blood4_250"> + <English>Give Blood IV (250ml)</English> + <Spanish>Dar Sangre IV (250ml)</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_ACTIONS_Plasma4_1000"> + <English>Give Plasma IV (1000ml)</English> + <Spanish>Dar Plasma IV (1000ml)</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_ACTIONS_Plasma4_500"> + <English>Give Plasma IV (500ml)</English> + <Spanish>Dar Plasma IV (500ml)</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_ACTIONS_Plasma4_250"> + <English>Give Plasma IV (250ml)</English> + <Spanish>Dar Plasma IV (250ml)</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_ACTIONS_Saline4_1000"> + <English>Give Saline IV (1000ml)</English> + <Spanish>Dar Salino IV (1000ml)</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_ACTIONS_Saline4_500"> + <English>Give Saline IV (500ml)</English> + <Spanish>Dar Salino IV (500ml)</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_ACTIONS_Saline4_250"> + <English>Give Saline IV (250ml)</English> + <Spanish>Dar Salino IV (250ml)</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_TRIAGE_STATUS_MINOR"> + <English>Minor</English> + <German>Gering</German> + <Spanish>Menor</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_TRIAGE_STATUS_DELAYED"> + <English>Delayed</English> + <Spanish>Retrasado</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_TRIAGE_STATUS_IMMEDIATE"> + <English>Immediate</English> + <Spanish>Inmediato</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_TRIAGE_STATUS_DECEASED"> + <English>Deceased</English> + <Spanish>Fallecido</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_TRIAGE_STATUS_NONE"> + <English>None</English> + <Spanish>Ninguno</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_NORMAL_BREATHING"> + <English>Normal breathing</English> + <Russian>Дыхание в норме</Russian> + <Spanish>Respiración normal</Spanish> + <French>Respiration Normale</French> + <Polish>Normalny oddech</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_NO_BREATHING"> + <English>No breathing</English> + <Russian>Дыхания нет</Russian> + <Spanish>No respira</Spanish> + <French>Apnée</French> + <Polish>Brak oddechu</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_DIFFICULT_BREATHING"> + <English>Difficult breathing</English> + <Russian>Дыхание затруднено</Russian> + <Spanish>Dificultad para respirar</Spanish> + <French>Difficultée Respiratoire</French> + <Polish>Trudności z oddychaniem</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_ALMOST_NO_BREATHING"> + <English>Almost no breathing</English> + <Russian>Дыхания почти нет</Russian> + <Spanish>Casi sin respiración</Spanish> + <French>Respiration Faible</French> + <Polish>Prawie brak oddechu</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_STATUS_BLEEDING"> + <English>Bleeding</English> + <Russian>Кровотечение</Russian> + <Spanish>Sangrando</Spanish> + <French>Seignement</French> + <Polish>Krwawienie zewnętrzne</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_STATUS_PAIN"> + <English>In Pain</English> + <Russian>Испытывает боль</Russian> + <Spanish>Con Dolor</Spanish> + <French>A De La Douleur</French> + <Polish>W bólu</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_STATUS_LOST_BLOOD"> + <English>Lost a lot of Blood</English> + <Russian>Большая кровопотеря</Russian> + <Spanish>Mucha Sangre perdida</Spanish> + <French>A Perdu Bcp de Sang</French> + <Polish>Stracił dużo krwi</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_STATUS_TOURNIQUET_APPLIED"> + <English>Tourniquet [CAT]</English> + <Russian>Жгут</Russian> + <Spanish>Torniquete [CAT]</Spanish> + <French>Garot [CAT]</French> + <Polish>Opaska uciskowa [CAT]</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_receivingIvVolume"> + <English>Receiving IV [%1ml]</English> + <Spanish>Reciviendo IV [%1ml]</Spanish> + </Key> - <Key ID="STR_ACE_MEDICAL_BANDAGE_BASIC_DISPLAY"> - <English>Bandage (Basic)</English> - <Russian>Повязка (обычная)</Russian> - <Spanish>Vendaje (Básico)</Spanish> - <French>Bandage (Standard)</French> - <Polish>Bandaż (jałowy)</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_BANDAGE_BASIC_DESC_SHORT"> - <English>Used to cover a wound</English> - <Russian>Для перевязки ран</Russian> - <Spanish>Utilizado para cubrir una herida</Spanish> - <French>Utilisé Pour Couvrir Une Blessure</French> - <Polish>Używany w celu przykrycia i ochrony miejsca zranienia</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_BANDAGE_BASIC_DESC_USE"> - <English>A dressing, that is a particular material used to cover a wound, which is applied over the wound - once bleeding has been stemmed. - </English> - <Russian>Повязка, накладываемая поверх раны после остановки кровотечения.</Russian> - <Spanish>Un apósito, material específico utilizado para cubrir una herida, se aplica sobre la herida una vez - ha dejado de sangrar. - </Spanish> - <French>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. - </French> - <Polish>Opatrunek materiałowy, używany do przykrywania ran, zakładany na ranę po zatamowaniu krwawienia. - </Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_PACKING_BANDAGE_DISPLAY"> - <English>Packing Bandage</English> - <Russian>Тампонирующая повязка</Russian> - <Spanish>Vendaje Compresivo</Spanish> - <French>Bandage Mèche</French> - <Polish>Bandaż (uciskowy)</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_PACKING_BANDAGE_DESC_SHORT"> - <English>Used to pack medium to large wounds and stem the bleeding</English> - <Russian>Для тампонирования ран среднего и большого размера и остановки кровотечения.</Russian> - <Spanish>Se utiliza para vendar heridas medianas y grandes y detener el sangrado</Spanish> - <French>Utiliser pour remplire la cavité créé dans une blessure moyenne et grande.</French> - <Polish>Używany w celu opatrywania średnich i dużych ran oraz tamowania krwawienia.</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_PACKING_BANDAGE_DESC_USE"> - <English>A bandage used to pack the wound to stem bleeding and facilitate wound healing. Packing a wound is - an option in large polytrauma injuries. - </English> - <Russian>Повязка для тампонирования раны, остановки кровотечения и лучшего заживления. При тяжелых - сочетанных ранениях возможно тампонирование раны. - </Russian> - <Spanish>Se utiliza para detener la hemorragia de una herida y favorecer su cicatrización. Se usa en grandes - lesiones o politraumatismos. - </Spanish> - <French>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. - </French> - <Polish>Opatrunek stosowany w celu zatrzymania krwawienia i osłony większych ran.</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_BANDAGE_ELASTIC_DISPLAY"> - <English>Bandage (Elastic)</English> - <Russian>Повязка (давящая)</Russian> - <Spanish>Vendaje (Elástico)</Spanish> - <French>Bandage (Élastique)</French> - <Polish>Bandaż (elastyczny)</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_BANDAGE_ELASTIC_DESC_SHORT"> - <English>Bandage kit, Elastic</English> - <Russian>Давящая повязка</Russian> - <Spanish>Vendaje (Elástico)</Spanish> - <French>Bandage Compressif Élastique</French> - <Polish>Zestaw bandaży elastycznych.</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_BANDAGE_ELASTIC_DESC_USE"> - <English></English> - <Russian></Russian> - <French>Ce bandage peut etre utiliser pour compresser la plaie afin de ralentire le seignement et assurer la - tenue du bandage lors de mouvment. - </French> - <Polish>Elastyczna opaska podtrzymująca opatrunek oraz usztywniająca okolice stawów.</Polish> - <Spanish>Brinda una compresión uniforme y ofrece soporte extra a una zona lesionada</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_TOURNIQUET_DISPLAY"> - <English>Tourniquet (CAT)</English> - <Russian>Жгут</Russian> - <Spanish>Torniquete (CAT)</Spanish> - <French>Garot (CAT)</French> - <Polish>Staza (typ. CAT)</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_TOURNIQUET_DESC_SHORT"> - <English>Slows down blood loss when bleeding</English> - <Russian>Уменьшает кровопотерю при кровотечении.</Russian> - <Spanish>Reduce la velocidad de pérdida de sangre</Spanish> - <French>Ralentit le seignement</French> - <Polish>Zmniejsza ubytek krwi z kończyn w przypadku krwawienia.</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_TOURNIQUET_DESC_USE"> - <English>A constricting device used to compress venous and arterial circulation in effect inhibiting or - slowing blood flow and therefore decreasing loss of blood. - </English> - <Russian>Жгут используется для прижатия сосудов, приводящего к остановке или значительному уменьшению - кровотечения и сокращению кровопотери. - </Russian> - <Spanish>Dispositivo utilizado para eliminar el pulso distal y de ese modo controlar la pérdida de sangre - </Spanish> - <French>Un appareil servent a compresser les artères et veines afin de reduire la perte de sang.</French> - <Polish>Opaska zaciskowa CAT służy do tamowanie krwotoków w sytuacji zranienia kończyn z masywnym - krwawieniem tętniczym lub żylnym. - </Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_MORPHINE_DISPLAY"> - <English>Morphine autoinjector</English> - <Russian>Морфин в автоматическом шприце</Russian> - <Spanish>Morfina auto-inyectable</Spanish> - <French>Auto-injecteur de Morphine</French> - <Polish>Autostrzykawka z morfiną</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_MORPHINE_DESC_SHORT"> - <English>Used to combat moderate to severe pain experiences</English> - <Russian>Для снятия средних и сильных болевых ощущений.</Russian> - <Spanish>Usado para combatir los estados dolorosos moderados a severos</Spanish> - <French>Utiliser pour contrer les douleurs modéré à severes.</French> - <Polish>Morfina. Ma silne działanie przeciwbólowe.</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_MORPHINE_DESC_USE"> - <English>An analgesic used to combat moderate to severe pain experiences.</English> - <Russian>Анальгетик для снятия средних и сильных болевых ощущений.</Russian> - <Spanish>Analgésico usado para combatir los estados dolorosos de moderado a severo.</Spanish> - <French>Un Analgésique puissant servant a contrer les douleur modéré a severe.</French> - <Polish>Organiczny związek chemiczny z grupy alkaloidów. Ma silne działanie przeciwbólowe.</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_ATROPINE_DISPLAY"> - <English>Atropin autoinjector</English> - <Russian>Атропин в автоматическом шприце</Russian> - <Spanish>Atropina auto-inyectable</Spanish> - <French>Auto-injecteur d'Atropine</French> - <Polish>Autostrzykawka AtroPen</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_ATROPINE_DESC_SHORT"> - <English>Used in NBC scenarios</English> - <Russian>Применяется для защиты от ОМП</Russian> - <Spanish>Usado en escenarios NBQ</Spanish> - <French>Utiliser en cas d'attaque CBRN</French> - <Polish>Atropina. Stosowana jako lek rozkurczowy i środek rozszerzający źrenice.</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_ATROPINE_DESC_USE"> - <English>A drug used by the Military in NBC scenarios.</English> - <Russian>Препарат, используемый в войсках для защиты от оружия массового поражения.</Russian> - <Spanish>Medicamento usado por Militares en escenarios NBQ</Spanish> - <French>Médicament utilisé par l'armée en cas d'attaque CBRN</French> - <Polish>Atropina. Stosowana jako lek rozkurczowy i środek rozszerzający źrenice. Środek stosowany w - przypadku zagrożeń NBC. - </Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_EPINEPHRINE_DISPLAY"> - <English>Epinephrine autoinjector</English> - <Russian>Адреналин в автоматическом шприце</Russian> - <Spanish>Epinefrina auto-inyectable</Spanish> - <French>Auto-injecteur d'épinéphrine</French> - <Polish>Autostrzykawka EpiPen</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_EPINEPHRINE_DESC_SHORT"> - <English>Increase heart rate and counter effects given by allergic reactions</English> - <Russian>Стимулирует работу сердца и купирует аллергические реакции.</Russian> - <Spanish>Aumenta la frecuencia cardiaca y contraresta los efectos de las reacciones alérgicas</Spanish> - <French>Augmente la Fréquance cadiaque et contré les effet d'une reaction Anaphylactique</French> - <Polish>Adrenalina. Zwiększa puls i przeciwdziała efektom wywołanym przez reakcje alergiczne</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_EPINEPHRINE_DESC_USE"> - <English>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. - </English> - <Russian>Препарат, вызывающий симпатическую реакцию, приводящую к расширению бронхов, увеличению частоты - сердечных сокращений и купированию аллергических реакций (анафилактического шока). Применяется при - остановке сердца с уменьшением вероятности благоприятного исхода. - </Russian> - <Spanish>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. - </Spanish> - <French>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. - </French> - <Polish>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. - </Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_PLASMA_IV"> - <English>Plasma IV (1000ml)</English> - <Russian>Плазма для в/в вливания (1000 мл)</Russian> - <Spanish>Plasma Intravenoso (1000ml)</Spanish> - <French>Plasma Sanguin IV (1000ml)</French> - <Polish>Osocze IV (1000ml)</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_PLASMA_IV_DESC_SHORT"> - <English>A volume-expanding blood supplement.</English> - <Russian>Дополнительный препарат, применяемый при возмещении объема крови.</Russian> - <Spanish>Suplemento para expandir el volumen sanguíneo.</Spanish> - <French>Supplement visant a remplacer les volume sanguin</French> - <Polish>Składnik krwi, używany do zwiększenia jej objętości.</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_PLASMA_IV_DESC_USE"> - <English>A volume-expanding blood supplement.</English> - <Russian>Дополнительный препарат, применяемый при возмещении объема крови.</Russian> - <Spanish>Suplemento para expandir el volumen sanguíneo.</Spanish> - <French>Supplement visant a remplacer le volume sanguin et remplace les plaquettes.</French> - <Polish>Składnik krwi, używany do zwiększenia jej objętości.</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_PLASMA_IV_500"> - <English>Plasma IV (500ml)</English> - <Russian>Плазма для в/в вливания (500 мл)</Russian> - <Spanish>Plasma Intravenoso (500ml)</Spanish> - <French>Plasma Sanguin IV (500ml)</French> - <Polish>Osocze IV (500ml)</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_PLASMA_IV_250"> - <English>Plasma IV (250ml)</English> - <Russian>Плазма для в/в вливания (250 мл)</Russian> - <Spanish>Plasma Intravenoso (250ml)</Spanish> - <French>Plasma Sanguin (250ml)</French> - <Polish>Osocze IV (250ml)</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_BLOOD_IV"> - <English>Blood IV (1000ml)</English> - <Russian>Кровь для переливания (1000 мл)</Russian> - <Spanish>Sangre Intravenosa (1000ml)</Spanish> - <French>Cullot Sanguin IV (1000ml)</French> - <Polish>Krew IV (1000ml)</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_BLOOD_IV_DESC_SHORT"> - <English>Blood IV, for restoring a patients blood (keep cold)</English> - <Russian>Пакет крови для возмещения объема потерянной крови (хранить в холодильнике)</Russian> - <Spanish>Sangre Intravenosa, para restarurar el volumen sanguíneo (mantener frío)</Spanish> - <French>Cullot Sanguin IV, pour remplacer le volume sanguin (garder Réfrigeré)</French> - <Polish>Krew IV, używana do uzupełnienia krwi u pacjenta, trzymać w warunkach chłodniczych</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_BLOOD_IV_DESC_USE"> - <English>O Negative infusion blood used in strict and rare events to replenish blood supply usually - conducted in the transport phase of medical care. - </English> - <Russian>Кровь I группы, резус-отрицательная, применяется по жизненным показаниям для возмещения объема - потерянной крови на догоспитальном этапе оказания медицинской помощи. - </Russian> - <French>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. - </French> - <Polish>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. - </Polish> - <Spanish>Utilice sólo durante gran pérdida de sangre para reemplazar el volumen de sangre perdido. Uso - habitual durante el transporte de heridos. - </Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_BLOOD_IV_500"> - <English>Blood IV (500ml)</English> - <Russian>Кровь для переливания (500 мл)</Russian> - <Spanish>Sangre Intravenosa (500ml)</Spanish> - <French>Cullot Sanguin IV (500ml)</French> - <Polish>Krew IV (500ml)</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_BLOOD_IV_250"> - <English>Blood IV (250ml)</English> - <Russian>Кровь для переливания (250 мл)</Russian> - <Spanish>Sangre Intravenosa (250ml)</Spanish> - <French>Cullot Sanguin IV (250ml)</French> - <Polish>Krew IV (250ml)</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_SALINE_IV"> - <English>Saline IV (1000ml)</English> - <Russian>Физраствор для в/в вливания (1000 мл)</Russian> - <Spanish>Solución Salina Intravenosa (1000ml)</Spanish> - <French>solution Saline 0.9% IV (1000ml)</French> - <Polish>Solanka 0,9% IV (1000ml)</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_SALINE_IV_DESC_SHORT"> - <English>Saline IV, for restoring a patients blood</English> - <Russian>Пакет физраствора для возмещения объема потерянной крови</Russian> - <Spanish>Solución Salina Intravenosa, para restaurar el volumen sanguíneo</Spanish> - <French>Solution Saline 0.9% IV, pour retablir temporairement la tention arteriel</French> - <Polish>Solanka 0,9%, podawana dożylnie (IV), używana w celu uzupełnienia krwi u pacjenta</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_SALINE_IV_DESC_USE"> - <English>A medical volume-replenishing agent introduced into the blood system through an IV infusion. - </English> - <Russian>Пакет физиологического раствора для возмещения объема потерянной крови путем внутривенного - вливания. - </Russian> - <Spanish>Suero fisiológico inoculado al torrente sanguíneo de forma intravenosa.</Spanish> - <French>Un remplacment temporaire pour rétablir la tention artériel lors de perte sanguine, étant ajouter - par intraveineuse - </French> - <Polish>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). - </Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_SALINE_IV_500"> - <English>Saline IV (500ml)</English> - <Russian>Физраствор для в/в вливания (500 мл)</Russian> - <Spanish>Solución Salina Intravenosa (500ml)</Spanish> - <French>Solution Saline 0.9% IV (500ml)</French> - <Polish>Solanka 0,9% IV (500ml)</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_SALINE_IV_250"> - <English>Saline IV (250ml)</English> - <Russian>Физраствор для в/в вливания (250 мл)</Russian> - <Spanish>Solución Salina Intravenosa (250ml)</Spanish> - <French>Solution Saline 0.9% IV (250ml)</French> - <Polish>Solanka 0,9% IV (250ml)</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_QUIKCLOT_DISPLAY"> - <English>Basic Field Dressing (QuikClot)</English> - <Russian>Первичный перевязочный пакет (QuikClot)</Russian> - <Spanish>Vendaje Básico (Coagulante)</Spanish> - <French>Bandage Regulier (Coagulant)</French> - <Polish>Opatrunek QuikClot</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_QUIKCLOT_DESC_SHORT"> - <English>QuikClot bandage</English> - <Russian>Гемостатический пакет QuikClot</Russian> - <Spanish>Venda Coagulante</Spanish> - <French>Bandage coagulant</French> - <Polish>Podstawowy opatrunek stosowany na rany</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_QUIKCLOT_DESC_USE"> - <English></English> - <Russian></Russian> - <French>Un bandage servant a coaguler les seignements mineur à moyen.</French> - <Polish>Proszkowy opatrunek adsorbcyjny przeznaczony do tamowania zagrażających życiu krwawień średniej i - dużej intensywności. - </Polish> - <Spanish>Vendaje Hemostático con coagulante que detiene el sangrado.</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_AID_KIT_DISPLAY"> - <English>Personal Aid Kit</English> - <Russian>Аптечка</Russian> - <Spanish>Kit de Soporte Vital Avanzado</Spanish> - <French>Équipement de support Vitale</French> - <Polish>Apteczka osobista</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_AID_KIT_DESC_SHORT"> - <English>Includes various treatment kit needed for stitching or advanced treatment</English> - <Russian>Содержит различные материалы и инструменты для зашивания ран и оказания специальной медпомощи. - </Russian> - <Spanish>Incluye material médico para tratamientos avanzados</Spanish> - <French>Inclue du matériel medical pour les traitement avancé, tel les point de suture.</French> - <Polish>Zestaw środków medycznych do opatrywania ran i dodatkowego leczenia po-urazowego</Polish> - </Key> - <Key ID="STR_ACE_MEDICAL_AID_KIT_DESC_USE"> - <English></English> - <Russian></Russian> - <French></French> - <Spanish></Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_SURGICALKIT_DISPLAY"> - <English>Surgical Kit</English> - <Russian>Хирургический набор</Russian> - <Spanish>Kit Quirúrgico</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_SURGICALKIT_DESC_SHORT"> - <English>Surgical Kit for in field advanced medical treatment</English> - <Russian>Набор для хирургической помощи в полевых условиях</Russian> - <Spanish>Kit Quirúrgico para el tratamiento avanzado en el campo de batalla</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_SURGICALKIT_DESC_USE"> - <English>Surgical Kit for in field advanced medical treatment</English> - <Russian>Набор для хирургической помощи в полевых условиях</Russian> - <Spanish>Kit Quirúrgico para el tratamiento avanzado en el campo de batalla</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_BODYBAG_DISPLAY"> - <English>Bodybag</English> - <Russian>Мешок для трупов</Russian> - <Spanish>Bolsa para cadáveres</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_BODYBAG_DESC_SHORT"> - <English>A bodybag for dead bodies</English> - <Russian>Мешок для упаковки трупов</Russian> - <Spanish>Bolsa para cadáveres</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_BODYBAG_DESC_USE"> - <English>A bodybag for dead bodies</English> - <Russian>Мешок для упаковки трупов</Russian> - <Spanish>Bolsa para cadáveres</Spanish> - </Key> + <Key ID="STR_ACE_MEDICAL_BANDAGE_BASIC_DISPLAY"> + <English>Bandage (Basic)</English> + <Russian>Повязка (обычная)</Russian> + <Spanish>Vendaje (Básico)</Spanish> + <French>Bandage (Standard)</French> + <Polish>Bandaż (jałowy)</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_BANDAGE_BASIC_DESC_SHORT"> + <English>Used to cover a wound</English> + <Russian>Для перевязки ран</Russian> + <Spanish>Utilizado para cubrir una herida</Spanish> + <French>Utilisé Pour Couvrir Une Blessure</French> + <Polish>Używany w celu przykrycia i ochrony miejsca zranienia</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_BANDAGE_BASIC_DESC_USE"> + <English>A dressing, that is a particular material used to cover a wound, which is applied over the wound + once bleeding has been stemmed. + </English> + <Russian>Повязка, накладываемая поверх раны после остановки кровотечения.</Russian> + <Spanish>Un apósito, material específico utilizado para cubrir una herida, se aplica sobre la herida una vez + ha dejado de sangrar. + </Spanish> + <French>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. + </French> + <Polish>Opatrunek materiałowy, używany do przykrywania ran, zakładany na ranę po zatamowaniu krwawienia. + </Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_PACKING_BANDAGE_DISPLAY"> + <English>Packing Bandage</English> + <Russian>Тампонирующая повязка</Russian> + <Spanish>Vendaje Compresivo</Spanish> + <French>Bandage Mèche</French> + <Polish>Bandaż (uciskowy)</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_PACKING_BANDAGE_DESC_SHORT"> + <English>Used to pack medium to large wounds and stem the bleeding</English> + <Russian>Для тампонирования ран среднего и большого размера и остановки кровотечения.</Russian> + <Spanish>Se utiliza para vendar heridas medianas y grandes y detener el sangrado</Spanish> + <French>Utiliser pour remplire la cavité créé dans une blessure moyenne et grande.</French> + <Polish>Używany w celu opatrywania średnich i dużych ran oraz tamowania krwawienia.</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_PACKING_BANDAGE_DESC_USE"> + <English>A bandage used to pack the wound to stem bleeding and facilitate wound healing. Packing a wound is + an option in large polytrauma injuries. + </English> + <Russian>Повязка для тампонирования раны, остановки кровотечения и лучшего заживления. При тяжелых + сочетанных ранениях возможно тампонирование раны. + </Russian> + <Spanish>Se utiliza para detener la hemorragia de una herida y favorecer su cicatrización. Se usa en grandes + lesiones o politraumatismos. + </Spanish> + <French>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. + </French> + <Polish>Opatrunek stosowany w celu zatrzymania krwawienia i osłony większych ran.</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_BANDAGE_ELASTIC_DISPLAY"> + <English>Bandage (Elastic)</English> + <Russian>Повязка (давящая)</Russian> + <Spanish>Vendaje (Elástico)</Spanish> + <French>Bandage (Élastique)</French> + <Polish>Bandaż (elastyczny)</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_BANDAGE_ELASTIC_DESC_SHORT"> + <English>Bandage kit, Elastic</English> + <Russian>Давящая повязка</Russian> + <Spanish>Vendaje (Elástico)</Spanish> + <French>Bandage Compressif Élastique</French> + <Polish>Zestaw bandaży elastycznych.</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_BANDAGE_ELASTIC_DESC_USE"> + <English></English> + <Russian></Russian> + <French>Ce bandage peut etre utiliser pour compresser la plaie afin de ralentire le seignement et assurer la + tenue du bandage lors de mouvment. + </French> + <Polish>Elastyczna opaska podtrzymująca opatrunek oraz usztywniająca okolice stawów.</Polish> + <Spanish>Brinda una compresión uniforme y ofrece soporte extra a una zona lesionada</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_TOURNIQUET_DISPLAY"> + <English>Tourniquet (CAT)</English> + <Russian>Жгут</Russian> + <Spanish>Torniquete (CAT)</Spanish> + <French>Garot (CAT)</French> + <Polish>Staza (typ. CAT)</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_TOURNIQUET_DESC_SHORT"> + <English>Slows down blood loss when bleeding</English> + <Russian>Уменьшает кровопотерю при кровотечении.</Russian> + <Spanish>Reduce la velocidad de pérdida de sangre</Spanish> + <French>Ralentit le seignement</French> + <Polish>Zmniejsza ubytek krwi z kończyn w przypadku krwawienia.</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_TOURNIQUET_DESC_USE"> + <English>A constricting device used to compress venous and arterial circulation in effect inhibiting or + slowing blood flow and therefore decreasing loss of blood. + </English> + <Russian>Жгут используется для прижатия сосудов, приводящего к остановке или значительному уменьшению + кровотечения и сокращению кровопотери. + </Russian> + <Spanish>Dispositivo utilizado para eliminar el pulso distal y de ese modo controlar la pérdida de sangre + </Spanish> + <French>Un appareil servent a compresser les artères et veines afin de reduire la perte de sang.</French> + <Polish>Opaska zaciskowa CAT służy do tamowanie krwotoków w sytuacji zranienia kończyn z masywnym + krwawieniem tętniczym lub żylnym. + </Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_MORPHINE_DISPLAY"> + <English>Morphine autoinjector</English> + <Russian>Морфин в автоматическом шприце</Russian> + <Spanish>Morfina auto-inyectable</Spanish> + <French>Auto-injecteur de Morphine</French> + <Polish>Autostrzykawka z morfiną</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_MORPHINE_DESC_SHORT"> + <English>Used to combat moderate to severe pain experiences</English> + <Russian>Для снятия средних и сильных болевых ощущений.</Russian> + <Spanish>Usado para combatir los estados dolorosos moderados a severos</Spanish> + <French>Utiliser pour contrer les douleurs modéré à severes.</French> + <Polish>Morfina. Ma silne działanie przeciwbólowe.</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_MORPHINE_DESC_USE"> + <English>An analgesic used to combat moderate to severe pain experiences.</English> + <Russian>Анальгетик для снятия средних и сильных болевых ощущений.</Russian> + <Spanish>Analgésico usado para combatir los estados dolorosos de moderado a severo.</Spanish> + <French>Un Analgésique puissant servant a contrer les douleur modéré a severe.</French> + <Polish>Organiczny związek chemiczny z grupy alkaloidów. Ma silne działanie przeciwbólowe.</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_ATROPINE_DISPLAY"> + <English>Atropin autoinjector</English> + <Russian>Атропин в автоматическом шприце</Russian> + <Spanish>Atropina auto-inyectable</Spanish> + <French>Auto-injecteur d'Atropine</French> + <Polish>Autostrzykawka AtroPen</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_ATROPINE_DESC_SHORT"> + <English>Used in NBC scenarios</English> + <Russian>Применяется для защиты от ОМП</Russian> + <Spanish>Usado en escenarios NBQ</Spanish> + <French>Utiliser en cas d'attaque CBRN</French> + <Polish>Atropina. Stosowana jako lek rozkurczowy i środek rozszerzający źrenice.</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_ATROPINE_DESC_USE"> + <English>A drug used by the Military in NBC scenarios.</English> + <Russian>Препарат, используемый в войсках для защиты от оружия массового поражения.</Russian> + <Spanish>Medicamento usado por Militares en escenarios NBQ</Spanish> + <French>Médicament utilisé par l'armée en cas d'attaque CBRN</French> + <Polish>Atropina. Stosowana jako lek rozkurczowy i środek rozszerzający źrenice. Środek stosowany w + przypadku zagrożeń NBC. + </Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_EPINEPHRINE_DISPLAY"> + <English>Epinephrine autoinjector</English> + <Russian>Адреналин в автоматическом шприце</Russian> + <Spanish>Epinefrina auto-inyectable</Spanish> + <French>Auto-injecteur d'épinéphrine</French> + <Polish>Autostrzykawka EpiPen</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_EPINEPHRINE_DESC_SHORT"> + <English>Increase heart rate and counter effects given by allergic reactions</English> + <Russian>Стимулирует работу сердца и купирует аллергические реакции.</Russian> + <Spanish>Aumenta la frecuencia cardiaca y contraresta los efectos de las reacciones alérgicas</Spanish> + <French>Augmente la Fréquance cadiaque et contré les effet d'une reaction Anaphylactique</French> + <Polish>Adrenalina. Zwiększa puls i przeciwdziała efektom wywołanym przez reakcje alergiczne</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_EPINEPHRINE_DESC_USE"> + <English>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. + </English> + <Russian>Препарат, вызывающий симпатическую реакцию, приводящую к расширению бронхов, увеличению частоты + сердечных сокращений и купированию аллергических реакций (анафилактического шока). Применяется при + остановке сердца с уменьшением вероятности благоприятного исхода. + </Russian> + <Spanish>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. + </Spanish> + <French>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. + </French> + <Polish>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. + </Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_PLASMA_IV"> + <English>Plasma IV (1000ml)</English> + <Russian>Плазма для в/в вливания (1000 мл)</Russian> + <Spanish>Plasma Intravenoso (1000ml)</Spanish> + <French>Plasma Sanguin IV (1000ml)</French> + <Polish>Osocze IV (1000ml)</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_PLASMA_IV_DESC_SHORT"> + <English>A volume-expanding blood supplement.</English> + <Russian>Дополнительный препарат, применяемый при возмещении объема крови.</Russian> + <Spanish>Suplemento para expandir el volumen sanguíneo.</Spanish> + <French>Supplement visant a remplacer les volume sanguin</French> + <Polish>Składnik krwi, używany do zwiększenia jej objętości.</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_PLASMA_IV_DESC_USE"> + <English>A volume-expanding blood supplement.</English> + <Russian>Дополнительный препарат, применяемый при возмещении объема крови.</Russian> + <Spanish>Suplemento para expandir el volumen sanguíneo.</Spanish> + <French>Supplement visant a remplacer le volume sanguin et remplace les plaquettes.</French> + <Polish>Składnik krwi, używany do zwiększenia jej objętości.</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_PLASMA_IV_500"> + <English>Plasma IV (500ml)</English> + <Russian>Плазма для в/в вливания (500 мл)</Russian> + <Spanish>Plasma Intravenoso (500ml)</Spanish> + <French>Plasma Sanguin IV (500ml)</French> + <Polish>Osocze IV (500ml)</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_PLASMA_IV_250"> + <English>Plasma IV (250ml)</English> + <Russian>Плазма для в/в вливания (250 мл)</Russian> + <Spanish>Plasma Intravenoso (250ml)</Spanish> + <French>Plasma Sanguin (250ml)</French> + <Polish>Osocze IV (250ml)</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_BLOOD_IV"> + <English>Blood IV (1000ml)</English> + <Russian>Кровь для переливания (1000 мл)</Russian> + <Spanish>Sangre Intravenosa (1000ml)</Spanish> + <French>Cullot Sanguin IV (1000ml)</French> + <Polish>Krew IV (1000ml)</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_BLOOD_IV_DESC_SHORT"> + <English>Blood IV, for restoring a patients blood (keep cold)</English> + <Russian>Пакет крови для возмещения объема потерянной крови (хранить в холодильнике)</Russian> + <Spanish>Sangre Intravenosa, para restarurar el volumen sanguíneo (mantener frío)</Spanish> + <French>Cullot Sanguin IV, pour remplacer le volume sanguin (garder Réfrigeré)</French> + <Polish>Krew IV, używana do uzupełnienia krwi u pacjenta, trzymać w warunkach chłodniczych</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_BLOOD_IV_DESC_USE"> + <English>O Negative infusion blood used in strict and rare events to replenish blood supply usually + conducted in the transport phase of medical care. + </English> + <Russian>Кровь I группы, резус-отрицательная, применяется по жизненным показаниям для возмещения объема + потерянной крови на догоспитальном этапе оказания медицинской помощи. + </Russian> + <French>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. + </French> + <Polish>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. + </Polish> + <Spanish>Utilice sólo durante gran pérdida de sangre para reemplazar el volumen de sangre perdido. Uso + habitual durante el transporte de heridos. + </Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_BLOOD_IV_500"> + <English>Blood IV (500ml)</English> + <Russian>Кровь для переливания (500 мл)</Russian> + <Spanish>Sangre Intravenosa (500ml)</Spanish> + <French>Cullot Sanguin IV (500ml)</French> + <Polish>Krew IV (500ml)</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_BLOOD_IV_250"> + <English>Blood IV (250ml)</English> + <Russian>Кровь для переливания (250 мл)</Russian> + <Spanish>Sangre Intravenosa (250ml)</Spanish> + <French>Cullot Sanguin IV (250ml)</French> + <Polish>Krew IV (250ml)</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_SALINE_IV"> + <English>Saline IV (1000ml)</English> + <Russian>Физраствор для в/в вливания (1000 мл)</Russian> + <Spanish>Solución Salina Intravenosa (1000ml)</Spanish> + <French>solution Saline 0.9% IV (1000ml)</French> + <Polish>Solanka 0,9% IV (1000ml)</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_SALINE_IV_DESC_SHORT"> + <English>Saline IV, for restoring a patients blood</English> + <Russian>Пакет физраствора для возмещения объема потерянной крови</Russian> + <Spanish>Solución Salina Intravenosa, para restaurar el volumen sanguíneo</Spanish> + <French>Solution Saline 0.9% IV, pour retablir temporairement la tention arteriel</French> + <Polish>Solanka 0,9%, podawana dożylnie (IV), używana w celu uzupełnienia krwi u pacjenta</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_SALINE_IV_DESC_USE"> + <English>A medical volume-replenishing agent introduced into the blood system through an IV infusion. + </English> + <Russian>Пакет физиологического раствора для возмещения объема потерянной крови путем внутривенного + вливания. + </Russian> + <Spanish>Suero fisiológico inoculado al torrente sanguíneo de forma intravenosa.</Spanish> + <French>Un remplacment temporaire pour rétablir la tention artériel lors de perte sanguine, étant ajouter + par intraveineuse + </French> + <Polish>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). + </Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_SALINE_IV_500"> + <English>Saline IV (500ml)</English> + <Russian>Физраствор для в/в вливания (500 мл)</Russian> + <Spanish>Solución Salina Intravenosa (500ml)</Spanish> + <French>Solution Saline 0.9% IV (500ml)</French> + <Polish>Solanka 0,9% IV (500ml)</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_SALINE_IV_250"> + <English>Saline IV (250ml)</English> + <Russian>Физраствор для в/в вливания (250 мл)</Russian> + <Spanish>Solución Salina Intravenosa (250ml)</Spanish> + <French>Solution Saline 0.9% IV (250ml)</French> + <Polish>Solanka 0,9% IV (250ml)</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_QUIKCLOT_DISPLAY"> + <English>Basic Field Dressing (QuikClot)</English> + <Russian>Первичный перевязочный пакет (QuikClot)</Russian> + <Spanish>Vendaje Básico (Coagulante)</Spanish> + <French>Bandage Regulier (Coagulant)</French> + <Polish>Opatrunek QuikClot</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_QUIKCLOT_DESC_SHORT"> + <English>QuikClot bandage</English> + <Russian>Гемостатический пакет QuikClot</Russian> + <Spanish>Venda Coagulante</Spanish> + <French>Bandage coagulant</French> + <Polish>Podstawowy opatrunek stosowany na rany</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_QUIKCLOT_DESC_USE"> + <English></English> + <Russian></Russian> + <French>Un bandage servant a coaguler les seignements mineur à moyen.</French> + <Polish>Proszkowy opatrunek adsorbcyjny przeznaczony do tamowania zagrażających życiu krwawień średniej i + dużej intensywności. + </Polish> + <Spanish>Vendaje Hemostático con coagulante que detiene el sangrado.</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_AID_KIT_DISPLAY"> + <English>Personal Aid Kit</English> + <Russian>Аптечка</Russian> + <Spanish>Kit de Soporte Vital Avanzado</Spanish> + <French>Équipement de support Vitale</French> + <Polish>Apteczka osobista</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_AID_KIT_DESC_SHORT"> + <English>Includes various treatment kit needed for stitching or advanced treatment</English> + <Russian>Содержит различные материалы и инструменты для зашивания ран и оказания специальной медпомощи. + </Russian> + <Spanish>Incluye material médico para tratamientos avanzados</Spanish> + <French>Inclue du matériel medical pour les traitement avancé, tel les point de suture.</French> + <Polish>Zestaw środków medycznych do opatrywania ran i dodatkowego leczenia po-urazowego</Polish> + </Key> + <Key ID="STR_ACE_MEDICAL_AID_KIT_DESC_USE"> + <English></English> + <Russian></Russian> + <French></French> + <Spanish></Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_SURGICALKIT_DISPLAY"> + <English>Surgical Kit</English> + <Russian>Хирургический набор</Russian> + <Spanish>Kit Quirúrgico</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_SURGICALKIT_DESC_SHORT"> + <English>Surgical Kit for in field advanced medical treatment</English> + <Russian>Набор для хирургической помощи в полевых условиях</Russian> + <Spanish>Kit Quirúrgico para el tratamiento avanzado en el campo de batalla</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_SURGICALKIT_DESC_USE"> + <English>Surgical Kit for in field advanced medical treatment</English> + <Russian>Набор для хирургической помощи в полевых условиях</Russian> + <Spanish>Kit Quirúrgico para el tratamiento avanzado en el campo de batalla</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_BODYBAG_DISPLAY"> + <English>Bodybag</English> + <Russian>Мешок для трупов</Russian> + <Spanish>Bolsa para cadáveres</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_BODYBAG_DESC_SHORT"> + <English>A bodybag for dead bodies</English> + <Russian>Мешок для упаковки трупов</Russian> + <Spanish>Bolsa para cadáveres</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_BODYBAG_DESC_USE"> + <English>A bodybag for dead bodies</English> + <Russian>Мешок для упаковки трупов</Russian> + <Spanish>Bolsa para cadáveres</Spanish> + </Key> - <Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE"> - <English>Blood Pressure</English> - <Russian>Артериальное давление</Russian> - <Spanish>Presión Arterial</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_CONTENT"> - <English>Checking Blood Pressure..</English> - <Russian>Проверка артериального давления...</Russian> - <Spanish>Comprobando Presión Arterial...</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_CHECKED_MEDIC"> - <English>You checked %1</English> - <Russian>Вы осмотрели раненого %1</Russian> - <Spanish>Examinando a %1</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_OUTPUT_1"> - <English>You find a blood pressure of %2/%3</English> - <Russian>Артериальное давление %2/%3</Russian> - <Spanish>La Presión Arterial es %2/%3</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_OUTPUT_2"> - <English>You find a low blood pressure</English> - <Russian>Давление низкое</Russian> - <Spanish>La Presión Arterial es baja</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_OUTPUT_3"> - <English>You find a normal blood pressure</English> - <Russian>Давление нормальное</Russian> - <Spanish>La Presión Arterial es normal</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_OUTPUT_4"> - <English>You find a high blood pressure</English> - <Russian>Давление высокое</Russian> - <Spanish>La Presión Arterial es alta</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_OUTPUT_5"> - <English>You find no blood pressure</English> - <Russian>Давления нет</Russian> - <Spanish>No hay Presión Arterial</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_OUTPUT_6"> - <English>You fail to find a blood pressure</English> - <Russian>Артериальное давление не определяется</Russian> - <Spanish>No puedes encontrar Presión Arterial</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_CHECK_PULSE"> - <English>Pulse</English> - <Russian>Пульс</Russian> - <Spanish>Pulso</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_CHECK_PULSE_CONTENT"> - <English>Checking Heart Rate..</English> - <Russian>Проверка пульса...</Russian> - <Spanish>Comprobando Pulso...</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_CHECK_PULSE_CHECKED_MEDIC"> - <English>You checked %1</English> - <Russian>Вы осмотрели раненого %1</Russian> - <Spanish>Examinando a %1</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_CHECK_PULSE_OUTPUT_1"> - <English>You find a Heart Rate of %2</English> - <Russian>Пульс %2 уд./мин.</Russian> - <Spanish>El Pulso es %2</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_CHECK_PULSE_OUTPUT_2"> - <English>You find a weak Heart Rate</English> - <Russian>Пульс слабый</Russian> - <Spanish>El Pulso es débil</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_CHECK_PULSE_OUTPUT_3"> - <English>You find a strong Heart Rate</English> - <Russian>Пульс учащенный</Russian> - <Spanish>El Pulso está acelerado</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_CHECK_PULSE_OUTPUT_4"> - <English>You find a normal Heart Rate</English> - <Russian>Пульс в норме</Russian> - <Spanish>El Pulso es bueno</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_CHECK_PULSE_OUTPUT_5"> - <English>You find no Heart Rate</English> - <Russian>Пульс не прощупывается</Russian> - <Spanish>No tiene Pulso</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_CHECK_RESPONSE"> - <English>Response</English> - <Russian>Реакция</Russian> - <Spanish>Reacciona</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_CHECK_RESPONSE_CONTENT"> - <English>You check response of patient</English> - <Russian>Вы проверяете реакцию раненого</Russian> - <Spanish>Compruebas si el paciente reacciona</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_CHECK_REPONSE_RESPONSIVE"> - <English>%1 is responsive</English> - <Russian>%1 реагирует на раздражители</Russian> - <Spanish>%1 ha reaccionado</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_CHECK_REPONSE_UNRESPONSIVE"> - <English>%1 is not responsive</English> - <Russian>%1 не реагирует</Russian> - <Spanish>%1 no reacciona</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_CHECK_REPONSE_YOU_CHECKED"> - <English>You checked %1</English> - <Russian>Вы осмотрели раненого %1</Russian> - <Spanish>Examinas a %1</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_BANDAGED"> - <English>Bandaged</English> - <Russian>Повязка наложена</Russian> - <Spanish>Vendado</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_APPLY_BANDAGE"> - <English>You bandage %1 (%2)</English> - <Russian>Вы перевязали раненого %1 (%2)</Russian> - <Spanish>Aplicas vendaje a %1 en %2</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_IS_BANDAGING_YOU"> - <English>%1 is bandaging you</English> - <Russian>%1 перевязывает вас</Russian> - <Spanish>%1 te está vendando</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_START_STITCHING_INJURIES"> - <English>You start stitching injures from %1 (%2)</English> - <Russian>Вы зашиваете ранения от %1 (%2)</Russian> - <Spanish>Estás suturando heridas de %1 en %2</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_STITCHING"> - <English>Stitching</English> - <Russian>Наложение швов</Russian> - <Spanish>Suturando</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_YOU_TREAT_AIRWAY"> - <English>You treat the airway of %1</English> - <Russian>Вы интубируете раненого %1</Russian> - <Spanish>Estás intubando a %1</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_AIRWAY"> - <English>Airway</English> - <Russian>Дыхательные пути</Russian> - <Spanish>Vías Aéreas</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_IS_TREATING_YOUR_AIRWAY"> - <English>%1 is treating your airway</English> - <Russian>%1 проводит вам интубацию</Russian> - <Spanish>%1 te está intubando</Spanish> - </Key> - <Key ID="STR_ACE_MEDICAL_DRAG"> - <English>Drag</English> - <German>Ziehen</German> - <Spanish>Arrastrar</Spanish> - <Polish>Ciągnij</Polish> - <Czech>Táhnout</Czech> - <Russian>Тащить</Russian> - <French>Tracter</French> - <Hungarian>Húzás</Hungarian> - <Portuguese>Arrastar</Portuguese> - <Italian>Trascina</Italian> - </Key> - <Key ID="STR_ACE_MEDICAL_CARRY"> - <English>Carry</English> - <German>Tragen</German> - <Spanish>Cargar</Spanish> - <Polish>Nieś</Polish> - <Czech>Nést</Czech> - <Russian>Нести</Russian> - <French>Porter</French> - <Hungarian>Cipelés</Hungarian> - <Portuguese>Carregar</Portuguese> - <Italian>Trasporta</Italian> - </Key> - <Key ID="STR_ACE_MEDICAL_RELEASE"> - <English>Release</English> - <German>Loslassen</German> - <Spanish>Soltar</Spanish> - <Polish>Połóż</Polish> - <Czech>Položit</Czech> - <Russian>Отпустить</Russian> - <French>Déposer</French> - <Hungarian>Elenged</Hungarian> - <Portuguese>Largar</Portuguese> - <Italian>Lascia</Italian> - </Key> - <Key ID="STR_ACE_MEDICAL_LOAD"> - <English>Load Patient Into</English> - <German>Patient Einladen</German> - <Spanish>Cargar el paciente en</Spanish> - <Polish>Załaduj pacjenta</Polish> - <Czech>Naložit pacianta do</Czech> - <Russian>Погрузить пациента в</Russian> - <French>Embarquer le Patient</French> - <Hungarian>Sebesült berakása</Hungarian> - <Portuguese>Carregar Paciente Em</Portuguese> - <Italian>Carica paziente nel</Italian> - </Key> - <Key ID="STR_ACE_MEDICAL_UNLOAD"> - <English>Unload Patient</English> - <German>Patient Ausladen</German> - <Spanish>Descargar el paciente</Spanish> - <Polish>Wyładuj pacjenta</Polish> - <Czech>Vyložit pacienta</Czech> - <Russian>Выгрузить пациента</Russian> - <French>Débarquer le Patient</French> - <Hungarian>Sebesült kihúzása</Hungarian> - <Portuguese>Descarregar Paciente</Portuguese> - <Italian>Scarica il paziente</Italian> - </Key> - <Key ID="STR_ACE_Medical_UnloadPatient"> - <English>Unload patient</English> - </Key> - <Key ID="STR_ACE_Medical_LoadPatient"> - <English>Load patient</English> - </Key> - <Key ID="STR_ACE_MEDICAL_PlaceInBodyBag"> - <English>Place body in bodybag</English> - </Key> - <Key ID="STR_ACE_MEDICAL_PlacingInBodyBag"> - <English>Placing body in bodybag</English> - </Key> + <Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE"> + <English>Blood Pressure</English> + <Russian>Артериальное давление</Russian> + <Spanish>Presión Arterial</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_CONTENT"> + <English>Checking Blood Pressure..</English> + <Russian>Проверка артериального давления...</Russian> + <Spanish>Comprobando Presión Arterial...</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_CHECKED_MEDIC"> + <English>You checked %1</English> + <Russian>Вы осмотрели раненого %1</Russian> + <Spanish>Examinando a %1</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_OUTPUT_1"> + <English>You find a blood pressure of %2/%3</English> + <Russian>Артериальное давление %2/%3</Russian> + <Spanish>La Presión Arterial es %2/%3</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_OUTPUT_2"> + <English>You find a low blood pressure</English> + <Russian>Давление низкое</Russian> + <Spanish>La Presión Arterial es baja</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_OUTPUT_3"> + <English>You find a normal blood pressure</English> + <Russian>Давление нормальное</Russian> + <Spanish>La Presión Arterial es normal</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_OUTPUT_4"> + <English>You find a high blood pressure</English> + <Russian>Давление высокое</Russian> + <Spanish>La Presión Arterial es alta</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_OUTPUT_5"> + <English>You find no blood pressure</English> + <Russian>Давления нет</Russian> + <Spanish>No hay Presión Arterial</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_OUTPUT_6"> + <English>You fail to find a blood pressure</English> + <Russian>Артериальное давление не определяется</Russian> + <Spanish>No puedes encontrar Presión Arterial</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_CHECK_PULSE"> + <English>Pulse</English> + <Russian>Пульс</Russian> + <Spanish>Pulso</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_CHECK_PULSE_CONTENT"> + <English>Checking Heart Rate..</English> + <Russian>Проверка пульса...</Russian> + <Spanish>Comprobando Pulso...</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_CHECK_PULSE_CHECKED_MEDIC"> + <English>You checked %1</English> + <Russian>Вы осмотрели раненого %1</Russian> + <Spanish>Examinando a %1</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_CHECK_PULSE_OUTPUT_1"> + <English>You find a Heart Rate of %2</English> + <Russian>Пульс %2 уд./мин.</Russian> + <Spanish>El Pulso es %2</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_CHECK_PULSE_OUTPUT_2"> + <English>You find a weak Heart Rate</English> + <Russian>Пульс слабый</Russian> + <Spanish>El Pulso es débil</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_CHECK_PULSE_OUTPUT_3"> + <English>You find a strong Heart Rate</English> + <Russian>Пульс учащенный</Russian> + <Spanish>El Pulso está acelerado</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_CHECK_PULSE_OUTPUT_4"> + <English>You find a normal Heart Rate</English> + <Russian>Пульс в норме</Russian> + <Spanish>El Pulso es bueno</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_CHECK_PULSE_OUTPUT_5"> + <English>You find no Heart Rate</English> + <Russian>Пульс не прощупывается</Russian> + <Spanish>No tiene Pulso</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_CHECK_RESPONSE"> + <English>Response</English> + <Russian>Реакция</Russian> + <Spanish>Reacciona</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_CHECK_RESPONSE_CONTENT"> + <English>You check response of patient</English> + <Russian>Вы проверяете реакцию раненого</Russian> + <Spanish>Compruebas si el paciente reacciona</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_CHECK_REPONSE_RESPONSIVE"> + <English>%1 is responsive</English> + <Russian>%1 реагирует на раздражители</Russian> + <Spanish>%1 ha reaccionado</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_CHECK_REPONSE_UNRESPONSIVE"> + <English>%1 is not responsive</English> + <Russian>%1 не реагирует</Russian> + <Spanish>%1 no reacciona</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_CHECK_REPONSE_YOU_CHECKED"> + <English>You checked %1</English> + <Russian>Вы осмотрели раненого %1</Russian> + <Spanish>Examinas a %1</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_BANDAGED"> + <English>Bandaged</English> + <Russian>Повязка наложена</Russian> + <Spanish>Vendado</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_APPLY_BANDAGE"> + <English>You bandage %1 (%2)</English> + <Russian>Вы перевязали раненого %1 (%2)</Russian> + <Spanish>Aplicas vendaje a %1 en %2</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_IS_BANDAGING_YOU"> + <English>%1 is bandaging you</English> + <Russian>%1 перевязывает вас</Russian> + <Spanish>%1 te está vendando</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_START_STITCHING_INJURIES"> + <English>You start stitching injures from %1 (%2)</English> + <Russian>Вы зашиваете ранения от %1 (%2)</Russian> + <Spanish>Estás suturando heridas de %1 en %2</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_STITCHING"> + <English>Stitching</English> + <Russian>Наложение швов</Russian> + <Spanish>Suturando</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_YOU_TREAT_AIRWAY"> + <English>You treat the airway of %1</English> + <Russian>Вы интубируете раненого %1</Russian> + <Spanish>Estás intubando a %1</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_AIRWAY"> + <English>Airway</English> + <Russian>Дыхательные пути</Russian> + <Spanish>Vías Aéreas</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_IS_TREATING_YOUR_AIRWAY"> + <English>%1 is treating your airway</English> + <Russian>%1 проводит вам интубацию</Russian> + <Spanish>%1 te está intubando</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_DRAG"> + <English>Drag</English> + <German>Ziehen</German> + <Spanish>Arrastrar</Spanish> + <Polish>Ciągnij</Polish> + <Czech>Táhnout</Czech> + <Russian>Тащить</Russian> + <French>Tracter</French> + <Hungarian>Húzás</Hungarian> + <Portuguese>Arrastar</Portuguese> + <Italian>Trascina</Italian> + </Key> + <Key ID="STR_ACE_MEDICAL_CARRY"> + <English>Carry</English> + <German>Tragen</German> + <Spanish>Cargar</Spanish> + <Polish>Nieś</Polish> + <Czech>Nést</Czech> + <Russian>Нести</Russian> + <French>Porter</French> + <Hungarian>Cipelés</Hungarian> + <Portuguese>Carregar</Portuguese> + <Italian>Trasporta</Italian> + </Key> + <Key ID="STR_ACE_MEDICAL_RELEASE"> + <English>Release</English> + <German>Loslassen</German> + <Spanish>Soltar</Spanish> + <Polish>Połóż</Polish> + <Czech>Položit</Czech> + <Russian>Отпустить</Russian> + <French>Déposer</French> + <Hungarian>Elenged</Hungarian> + <Portuguese>Largar</Portuguese> + <Italian>Lascia</Italian> + </Key> + <Key ID="STR_ACE_MEDICAL_LOAD"> + <English>Load Patient Into</English> + <German>Patient Einladen</German> + <Spanish>Cargar el paciente en</Spanish> + <Polish>Załaduj pacjenta</Polish> + <Czech>Naložit pacianta do</Czech> + <Russian>Погрузить пациента в</Russian> + <French>Embarquer le Patient</French> + <Hungarian>Sebesült berakása</Hungarian> + <Portuguese>Carregar Paciente Em</Portuguese> + <Italian>Carica paziente nel</Italian> + </Key> + <Key ID="STR_ACE_MEDICAL_UNLOAD"> + <English>Unload Patient</English> + <German>Patient Ausladen</German> + <Spanish>Descargar el paciente</Spanish> + <Polish>Wyładuj pacjenta</Polish> + <Czech>Vyložit pacienta</Czech> + <Russian>Выгрузить пациента</Russian> + <French>Débarquer le Patient</French> + <Hungarian>Sebesült kihúzása</Hungarian> + <Portuguese>Descarregar Paciente</Portuguese> + <Italian>Scarica il paziente</Italian> + </Key> + <Key ID="STR_ACE_Medical_UnloadPatient"> + <English>Unload patient</English> + <Spanish>Descargar el paciente</Spanish> + </Key> + <Key ID="STR_ACE_Medical_LoadPatient"> + <English>Load patient</English> + <Spanish>Cargar el paciente en</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_PlaceInBodyBag"> + <English>Place body in bodybag</English> + <Spanish>Colocar cuerpo en bolsa para cadáveres</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_PlacingInBodyBag"> + <English>Placing body in bodybag</English> + <Spanish>Colocando cuerpo en bolsa para cadáveres</Spanish> + </Key> - <Key ID="STR_ACE_MEDICAL_ACTIVITY_bandagedPatient"> - <English>%1 has bandaged patient</English> - </Key> - <Key ID="STR_ACE_MEDICAL_ACTIVITY_usedItem"> - <English>%1 used %2</English> - </Key> - <Key ID="STR_ACE_MEDICAL_ACTIVITY_gaveIV"> - <English>%1 has given an IV</English> - </Key> - <Key ID="STR_ACE_MEDICAL_ACTIVITY_appliedTourniquet"> - <English>%1 applied a tourniquet</English> - </Key> - - </Package> + <Key ID="STR_ACE_MEDICAL_ACTIVITY_bandagedPatient"> + <English>%1 has bandaged patient</English> + <Spanish>%1 has vendado al paciente</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_ACTIVITY_usedItem"> + <English>%1 used %2</English> + <Spanish>%1 usó %2</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_ACTIVITY_gaveIV"> + <English>%1 has given an IV</English> + <Spanish>%1 has puesto una IV</Spanish> + </Key> + <Key ID="STR_ACE_MEDICAL_ACTIVITY_appliedTourniquet"> + <English>%1 applied a tourniquet</English> + <Spanish>%1 aplicado torniquete</Spanish> + </Key> + </Package> </Project> diff --git a/addons/microdagr/stringtable.xml b/addons/microdagr/stringtable.xml index 772a7a172f..3431ad8fa9 100644 --- a/addons/microdagr/stringtable.xml +++ b/addons/microdagr/stringtable.xml @@ -4,21 +4,27 @@ <Package name="microdagr"> <Key ID="STR_ACE_microdagr_itemName"> <English>MicroDAGR GPS</English> + <Spanish>GPS MicroDAGR</Spanish> </Key> <Key ID="STR_ACE_microdagr_itemDescription"> <English>MicroDAGR advanced GPS receiver</English> + <Spanish>Receptor avanzado GPS MicroDAGR</Spanish> </Key> <Key ID="STR_ACE_microdagr_settingUseMils"> <English>Angular Unit:</English> + <Spanish>Unidad angular:</Spanish> </Key> <Key ID="STR_ACE_microdagr_settingMils"> <English>Mils</English> + <Spanish>Mils</Spanish> </Key> <Key ID="STR_ACE_microdagr_settingShowWP"> <English>Show Waypoints On Map:</English> + <Spanish>Mostrar puntos de ruta en el mapa:</Spanish> </Key> <Key ID="STR_ACE_microdagr_settingDegrees"> <English>Degrees</English> + <Spanish>Grados</Spanish> </Key> <Key ID="STR_ACE_microdagr_settingOn"> <English>On</English> @@ -29,7 +35,7 @@ <Polish>Wł.</Polish> <Portuguese>Ativar</Portuguese> <Russian>Вкл.</Russian> - <Spanish>Sí</Spanish> + <Spanish>Encendido</Spanish> </Key> <Key ID="STR_ACE_microdagr_settingOff"> <English>Off</English> @@ -40,36 +46,45 @@ <Polish>Wył.</Polish> <Portuguese>Desativar</Portuguese> <Russian>Выкл.</Russian> - <Spanish>No</Spanish> + <Spanish>Apagado</Spanish> </Key> <Key ID="STR_ACE_microdagr_wpEnterCords"> <English>Enter Grid Cords:</English> + <Spanish>Introducir coordenadas de cuadrícula:</Spanish> </Key> <Key ID="STR_ACE_microdagr_wpEnterName"> <English>Name of [%1]</English> + <Spanish>Nombre de [%1]</Spanish> </Key> <Key ID="STR_ACE_microdagr_controlMGRS"> <English>MGRS-New</English> + <Spanish>Nuevo-MGRS</Spanish> </Key> <Key ID="STR_ACE_microdagr_controlWGD"> <English>WGD</English> + <Spanish>WGD</Spanish> </Key> <Key ID="STR_ACE_microdagr_controlRange"> <English>Range:</English> + <Spanish>Distancia</Spanish> <German>Reichweite:</German> </Key> <Key ID="STR_ACE_microdagr_compasDirection"> <English>Compass Direction</English> + <Spanish>Dirección de la brújula</Spanish> </Key> <Key ID="STR_ACE_microdagr_menuMark"> <English>Mark</English> + <Spanish>Marca</Spanish> </Key> <Key ID="STR_ACE_microdagr_menuWaypoints"> <English>Waypoints</English> + <Spanish>Puntos de ruta</Spanish> <German>Wegpunkte</German> </Key> <Key ID="STR_ACE_microdagr_menuConnectTo"> <English>Connect To</English> + <Spanish>Conectar a</Spanish> </Key> <Key ID="STR_ACE_microdagr_menuSettings"> <English>Settings</English> @@ -78,9 +93,11 @@ </Key> <Key ID="STR_ACE_microdagr_waypointsSet"> <English>SetWP</English> + <Spanish>Establecer PR</Spanish> </Key> <Key ID="STR_ACE_microdagr_waypointsAdd"> <English>Add</English> + <Spanish>Añadir</Spanish> </Key> <Key ID="STR_ACE_microdagr_waypointsDelete"> <English>Delete</English> @@ -91,19 +108,23 @@ <Polish>Usuń</Polish> <Portuguese>Excluir</Portuguese> <Russian>Удалить</Russian> - <Spanish>Suprimir</Spanish> + <Spanish>Borrar</Spanish> </Key> <Key ID="STR_ACE_microdagr_toggleUnit"> <English>Toggle MicroDAGR Display Mode</English> + <Spanish>Conmutar modo de pantalla del MicroDAGR</Spanish> </Key> <Key ID="STR_ACE_microdagr_show"> <English>Show MicoDAGR</English> + <Spanish>Mostrar MicroDAGR</Spanish> </Key> <Key ID="STR_ACE_microdagr_configure"> <English>Configure MicroDAGR</English> + <Spanish>Configurar MicroDAGR</Spanish> </Key> <Key ID="STR_ACE_microdagr_closeUnit"> <English>Close MicroDAGR</English> + <Spanish>Cerrar MicroDAGR</Spanish> </Key> </Package> -</Project> \ No newline at end of file +</Project> 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..46d22e19e9 --- /dev/null +++ b/addons/missileguidance/CfgVehicles.hpp @@ -0,0 +1,24 @@ +class CfgVehicles { + class Heli_Attack_01_base_F; + + class B_Heli_Attack_01_F : Heli_Attack_01_base_F { + class 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..873715fef8 100644 --- a/addons/missileguidance/XEH_pre_init.sqf +++ b/addons/missileguidance/XEH_pre_init.sqf @@ -3,12 +3,21 @@ PREP(rotateVectLineGetMap); PREP(rotateVectLine); -PREP(translateToModelSpace); -PREP(translateToWeaponSpace); - 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_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..3ce123d89c --- /dev/null +++ b/addons/missileguidance/functions/fnc_seekerType_Optic.sqf @@ -0,0 +1,32 @@ +//#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; +}; + +TRACE_2("", _target, _foundTargetPos); + +_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..f4d36285d8 --- /dev/null +++ b/addons/missileguidance/functions/fnc_seekerType_SALH.sqf @@ -0,0 +1,17 @@ +//#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; +_seekerParams = _launchParams select 3; + +// TODO: this needs to be shootCone/findStrongestRay after testing +_targets = [_projectile, ACE_DEFAULT_LASER_CODE, (_seekerParams select 0)] call ace_laser_fnc_findLaserDesignator; +_foundTargetPos = getPosASL (_targets select 1); + +TRACE_1("Seeker return target pos", _foundTargetPos); +_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..fc17de4722 --- /dev/null +++ b/addons/missileguidance/stringtable.xml @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Edited with tabler - 2014-12-22 --> +<Project name="ACE"> + <Package name="missileguidance"> + <Key ID="STR_ACE_MissileGuidance"> + <English>Advanced Missile Guidance</English> + <Spanish>Avanzada Misiles Orientación</Spanish> + <French>Avancée Missile orientation</French> + <Polish>Asystent Missile</Polish> + <German>Erweiterte Missile Guidance</German> + <Czech>Advanced Missile Guidance</Czech> + <Italian>Avanzato Missile Guidance</Italian> + <Portuguese>Avançado Missile Guidance</Portuguese> + <Hungarian>Részletes rakéta irányító</Hungarian> + <Russian>Расширенный ракетой</Russian> + </Key> + <Key ID="STR_ACE_MissileGuidance_Desc"> + <English>Enables advanced guidance mechanics and selection for different missiles and fire modes.</English> + <Spanish></Spanish> + <French></French> + <Polish></Polish> + <German></German> + <Czech></Czech> + <Italian></Italian> + <Portuguese></Portuguese> + <Hungarian></Hungarian> + <Russian></Russian> + </Key> + + /* Weapons */ + <Key ID="STR_ACE_Hydra70_DAGR"> + <English>Hydra-70 DAGR Missile</English> + <Spanish></Spanish> + <French></French> + <Polish></Polish> + <German></German> + <Czech></Czech> + <Italian></Italian> + <Portuguese></Portuguese> + <Hungarian></Hungarian> + <Russian></Russian> + </Key> + <Key ID="STR_ACE_Hydra70_DAGR_Short"> + <English>DAGR</English> + <Spanish></Spanish> + <French></French> + <Polish></Polish> + <German></German> + <Czech></Czech> + <Italian></Italian> + <Portuguese></Portuguese> + <Hungarian></Hungarian> + <Russian></Russian> + </Key> + <Key ID="STR_ACE_Hydra70_DAGR_Desc"> + <English>Hydra-70 DAGR Laser Guided Missile</English> + <Spanish></Spanish> + <French></French> + <Polish></Polish> + <German></German> + <Czech></Czech> + <Italian></Italian> + <Portuguese></Portuguese> + <Hungarian></Hungarian> + <Russian></Russian> + </Key> + + /* Weapons */ + <Key ID="STR_ACE_Hellfire_AGM114K"> + <English>Hellfire II AGM-114K Missile</English> + <Spanish></Spanish> + <French></French> + <Polish></Polish> + <German></German> + <Czech></Czech> + <Italian></Italian> + <Portuguese></Portuguese> + <Hungarian></Hungarian> + <Russian></Russian> + </Key> + <Key ID="STR_ACE_Hellfire_AGM114K_Short"> + <English>AGM-114K</English> + <Spanish></Spanish> + <French></French> + <Polish></Polish> + <German></German> + <Czech></Czech> + <Italian></Italian> + <Portuguese></Portuguese> + <Hungarian></Hungarian> + <Russian></Russian> + </Key> + <Key ID="STR_ACE_Hellfire_AGM114K_desc"> + <English>Hellfire II AGM-114K Laser Guided Missile</English> + <Spanish></Spanish> + <French></French> + <Polish></Polish> + <German></German> + <Czech></Czech> + <Italian></Italian> + <Portuguese></Portuguese> + <Hungarian></Hungarian> + <Russian></Russian> + </Key> + + </Package> +</Project> \ No newline at end of file diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index 622df44aca..2f37193b17 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -68,6 +68,7 @@ </Key> <Key ID="STR_ACE_NameTags_ShowNamesForAI"> <English>Show name tags for AI units</English> + <Spanish>Mostrar etiquetas de nombre para unidades IA </Spanish> </Key> <Key ID="STR_ACE_NameTags_ShowSoundWaves"> <English>Show SoundWaves (requires player names)</English> @@ -76,6 +77,7 @@ </Key> <Key ID="STR_ACE_NameTags_DefaultNametagColor"> <English>Default Nametag Color (Non Group Members)</English> + <Spanish>Color de etiquetas de nombre por defecto (No miembros de grupo)</Spanish> </Key> </Package> -</Project> \ No newline at end of file +</Project> 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/optics/CfgWeapons.hpp b/addons/optics/CfgWeapons.hpp index d947e73047..29a3ff8c98 100644 --- a/addons/optics/CfgWeapons.hpp +++ b/addons/optics/CfgWeapons.hpp @@ -230,6 +230,7 @@ class CfgWeapons { class Snip: Snip { modelOptics[] = {QUOTE(PATHTOF(models\ace_optics_pip.p3d)),QUOTE(PATHTOF(models\ace_optics_pip.p3d))}; }; + class Iron: Iron {}; }; }; }; diff --git a/addons/optionsmenu/stringtable.xml b/addons/optionsmenu/stringtable.xml index 76407da435..6975ff4223 100644 --- a/addons/optionsmenu/stringtable.xml +++ b/addons/optionsmenu/stringtable.xml @@ -16,16 +16,18 @@ </Key> <Key ID="STR_ACE_OptionsMenu_FixAnimation"> <English>Fix Animation</English> + <Spanish>Arreglar animación</Spanish> </Key> <Key ID="STR_ACE_OptionsMenu_ResetAll"> <English>Reset All</English> <German>Rücksetzen</German> + <Spanish>Reiniciar todo</Spanish> </Key> <Key ID="STR_ACE_OptionsMenu_TabColors"> <English>Colors</English> <German>Farben</German> <Russian>цвета</Russian> - <Spanish>Colors</Spanish> + <Spanish>Colores</Spanish> </Key> <Key ID="STR_ACE_OptionsMenu_TabOptions"> <English>Options</English> @@ -41,6 +43,7 @@ </Key> <Key ID="STR_ACE_OptionsMenu_TabValues"> <English>Values</English> + <Spanish>Valores</Spanish> </Key> <Key ID="STR_ACE_OptionsMenu_Enabled"> <English>Yes</English> @@ -75,33 +78,43 @@ </Key> <Key ID="STR_ACE_OptionsMenu_Export"> <English>Export</English> + <Spanish>Exportar</Spanish> </Key> <Key ID="STR_ACE_OptionsMenu_OpenExport"> <English>Open Export Menu</English> + <Spanish>Abrir menu d'exportación</Spanish> </Key> <Key ID="STR_ACE_OptionsMenu_stringType"> <English>String input.</English> + <Spanish>Introducir frase</Spanish> </Key> <Key ID="STR_ACE_OptionsMenu_arrayType"> <English>Array. Seperate elements by using ,.</English> + <Spanish>Matriz. Separa elementos usando ,.</Spanish> </Key> <Key ID="STR_ACE_OptionsMenu_scalarType"> <English>Number</English> + <Spanish>Numero</Spanish> </Key> <Key ID="STR_ACE_optionsMenu_unknownType"> <English>Uknown input type</English> + <Spanish>Tipo de entrada desconocida</Spanish> </Key> <Key ID="STR_ACE_OptionsMenu_SaveInput"> <English>Save input</English> + <Spanish>Guardar entrada</Spanish> </Key> <Key ID="STR_ACE_OptionsMenu_inClientSettings"> <English>Include Client Settings</English> + <Spanish>Incluir configuración de cliente</Spanish> </Key> <Key ID="STR_ACE_OptionsMenu_exClientSettings"> <English>Exclude Client Settings</English> + <Spanish>Excluir configuración de cliente</Spanish> </Key> <Key ID="STR_ACE_OptionsMenu_settingsExported"> <English>Settings exported to clipboard</English> + <Spanish>Configuración exportada al portapapeles</Spanish> </Key> </Package> -</Project> \ No newline at end of file +</Project> diff --git a/addons/overheating/stringtable.xml b/addons/overheating/stringtable.xml index 5d2c9595df..bc28c3a47d 100644 --- a/addons/overheating/stringtable.xml +++ b/addons/overheating/stringtable.xml @@ -4,9 +4,11 @@ <Package name="Overheating"> <Key ID="STR_ACE_overheating_SettingDisplayTextName"> <English>Display text on jam</English> + <Spanish>Mostrar texto al encasquillar</Spanish> </Key> <Key ID="STR_ACE_overheating_SettingDisplayTextDesc"> <English>Display a notification whenever your weapon gets jammed</English> + <Spanish>Mostrar notificación cada vez que el arma se encasquille</Spanish> </Key> <Key ID="STR_ACE_Overheating_SpareBarrelName"> <English>Spare barrel</English> @@ -153,4 +155,4 @@ <Russian>Температура</Russian> </Key> </Package> -</Project> \ No newline at end of file +</Project> diff --git a/addons/reload/stringtable.xml b/addons/reload/stringtable.xml index 40f36c6549..a7873948b1 100644 --- a/addons/reload/stringtable.xml +++ b/addons/reload/stringtable.xml @@ -4,9 +4,11 @@ <Package name="Reload"> <Key ID="STR_ACE_reload_SettingDisplayTextName"> <English>Check ammo on weapon reload</English> + <Spanish>Comprovar munición al recargar el arma</Spanish> </Key> <Key ID="STR_ACE_reload_SettingDisplayTextDesc"> <English>Check the ammo in your new magazine on magazine reload.</English> + <Spanish>Comprueva la munición del nuevo cargador al recargar.</Spanish> </Key> <Key ID="STR_ACE_Reload_checkAmmo"> <English>Check Ammo</English> @@ -34,9 +36,11 @@ </Key> <Key ID="STR_ACE_Reload_LinkBelt"> <English>Link belt</English> + <Spanish>Enlazar cinta</Spanish> </Key> <Key ID="STR_ACE_Reload_LinkingBelt"> <English>Linking belt...</English> + <Spanish>Enlazando cinta...</Spanish> </Key> </Package> </Project> diff --git a/addons/reloadlaunchers/stringtable.xml b/addons/reloadlaunchers/stringtable.xml index 6677153419..87ebbe4b75 100644 --- a/addons/reloadlaunchers/stringtable.xml +++ b/addons/reloadlaunchers/stringtable.xml @@ -5,19 +5,23 @@ <Key ID="STR_ACE_ReloadLaunchers_LoadLauncher"> <English>Load launcher</English> <German>Panzerabwehr laden</German> + <Spanish>Cargar lanzador</Spanish> </Key> <Key ID="STR_ACE_ReloadLaunchers_LoadingLauncher"> <English>Loading launcher ...</English> <German>Panzerabwehr wird geladen ...</German> + <Spanish>Cargando lanzador ...</Spanish> </Key> <Key ID="STR_ACE_ReloadLaunchers_LauncherLoaded"> <English>Launcher loaded</English> <German>Panzerabwehr geladen</German> + <Spanish>Lanzador cargado</Spanish> </Key> <Key ID="STR_ACE_ReloadLaunchers_LoadMagazine"> <English>Load %1</English> <German>Lade %1</German> + <Spanish>Cargar %1</Spanish> </Key> </Package> diff --git a/addons/respawn/stringtable.xml b/addons/respawn/stringtable.xml index 59a9b2b31c..ae1f5d819f 100644 --- a/addons/respawn/stringtable.xml +++ b/addons/respawn/stringtable.xml @@ -4,18 +4,22 @@ <Key ID="STR_ACE_Respawn_Deploy"> <English>Deploy in 5 seconds ...</English> <German>Wird in 5 Sekunden errichtet ...</German> + <Spanish>Desplegando en 5 segundos ...</Spanish> </Key> <Key ID="STR_ACE_Respawn_Deployed"> <English>Rallypoint deployed</English> <German>Rallypoint errichtet</German> + <Spanish>Punto de reunión desplegado</Spanish> </Key> <Key ID="STR_ACE_Respawn_TeleportedToBase"> <English>Teleported to Base</English> <German>Zur Basis teleportiert</German> + <Spanish>Teletransportado a base</Spanish> </Key> <Key ID="STR_ACE_Respawn_TeleportedToRallypoint"> <English>Teleported to Rallypoint</English> <German>Zum Rallypoint teleportiert</German> + <Spanish>Teletransportado al punto de reunión</Spanish> </Key> </Package> </Project> 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/weaponselect/stringtable.xml b/addons/weaponselect/stringtable.xml index 3a39d59396..dd65d3a4d9 100644 --- a/addons/weaponselect/stringtable.xml +++ b/addons/weaponselect/stringtable.xml @@ -4,9 +4,11 @@ <Package name="WeaponSelect"> <Key ID="STR_ACE_Weaponselect_SettingDisplayTextName"> <English>Display text on grenade throw</English> + <Spanish>Mostrar texto al lanzar granada</Spanish> </Key> <Key ID="STR_ACE_Weaponselect_SettingDisplayTextDesc"> <English>Display a hint or text on grenade throw.</English> + <Spanish>Muestra una notificación o texto al lanzar granada</Spanish> </Key> <Key ID="STR_ACE_WeaponSelect_SelectPistol"> <English>Select Pistol</English> @@ -251,4 +253,4 @@ <Russian>Запустить дымовую завесу</Russian> </Key> </Package> -</Project> \ No newline at end of file +</Project> diff --git a/addons/wep_javelin/CfgEventhandlers.hpp b/addons/wep_javelin/CfgEventhandlers.hpp index a61ea9c746..2c44a05e3a 100644 --- a/addons/wep_javelin/CfgEventhandlers.hpp +++ b/addons/wep_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/XEH_pre_init.sqf b/addons/wep_javelin/XEH_pre_init.sqf index 1b6682f0fc..119eb25975 100644 --- a/addons/wep_javelin/XEH_pre_init.sqf +++ b/addons/wep_javelin/XEH_pre_init.sqf @@ -1,13 +1,13 @@ #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/wep_javelin/config.cpp index c7ea1c867a..0a38583ed9 100644 --- a/addons/wep_javelin/config.cpp +++ b/addons/wep_javelin/config.cpp @@ -5,7 +5,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_laser"}; + requiredAddons[] = { "ace_main", "ace_common", "ace_missileguidance" }; VERSION_CONFIG; }; }; diff --git a/addons/wep_javelin/functions/fnc_cycleFireMode.sqf b/addons/wep_javelin/functions/fnc_cycleFireMode.sqf index 7902c6d265..4fed8e05cc 100644 --- a/addons/wep_javelin/functions/fnc_cycleFireMode.sqf +++ b/addons/wep_javelin/functions/fnc_cycleFireMode.sqf @@ -1,19 +1,13 @@ -#define DEBUG_MODE_FULL +//#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; +_currentFireMode = ACE_player getVariable["ace_missileguidance_attackProfile", "TOP"]; +if(_currentFireMode == "LIN") then { + _currentFireMode = "TOP"; } else { - _currentFireMode = ACE_JAV_FIREMODE_DIR; - - __JavelinIGUITop ctrlSetTextColor __ColorGray; - __JavelinIGUIDir ctrlSetTextColor __ColorGreen; + _currentFireMode = "LIN"; }; -ACE_player setVariable["ACE_FIRE_SELECTION", _currentFireMode, false]; +ACE_player setVariable["ace_missileguidance_attackProfile", _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 index bc3198915b..2a537e2ae9 100644 --- a/addons/wep_javelin/functions/fnc_lockKeyDown.sqf +++ b/addons/wep_javelin/functions/fnc_lockKeyDown.sqf @@ -1,3 +1,3 @@ -#define DEBUG_MODE_FULL +//#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 index bc3198915b..2a537e2ae9 100644 --- a/addons/wep_javelin/functions/fnc_lockKeyUp.sqf +++ b/addons/wep_javelin/functions/fnc_lockKeyUp.sqf @@ -1,3 +1,3 @@ -#define DEBUG_MODE_FULL +//#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 index 6a74b3ed57..586f4cb99e 100644 --- a/addons/wep_javelin/functions/fnc_onOpticDraw.sqf +++ b/addons/wep_javelin/functions/fnc_onOpticDraw.sqf @@ -7,15 +7,6 @@ #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 @@ -41,6 +32,9 @@ if ((velocity ACE_player) distance [0,0,0] > 0.5 && {cameraView == "GUNNER"} && ACE_player switchCamera "INTERNAL"; }; +// Refresh the firemode +[] call FUNC(showFireMode); + // Only start locking on holding tab if(!GVAR(isLockKeyDown)) exitWith { false }; @@ -68,7 +62,7 @@ if (isNull _newTarget) then { __JavelinIGUITargetingGate ctrlShow false; __JavelinIGUITargetingLines ctrlShow false; - ACE_player setVariable [QGVAR(currentTarget),nil, 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];}; @@ -91,8 +85,7 @@ if (isNull _newTarget) then { __JavelinIGUINFOV ctrlSetTextColor __ColorNull; __JavelinIGUITargetingConstrains ctrlShow true; - ACE_player setVariable[QGVAR(currentTarget), _currentTarget, false]; - ACE_player setVariable[QGVAR(currentTargetPos), getPosASL _currentTarget, false]; + ACE_player setVariable["ace_missileguidance_target", _currentTarget, false]; if(diag_tickTime > _soundTime) then { playSound "ACE_Javelin_Locked"; @@ -115,7 +108,7 @@ if (isNull _newTarget) then { __JavelinIGUITargetingGate ctrlShow false; __JavelinIGUITargetingLines ctrlShow false; - ACE_player setVariable [QGVAR(currentTarget),nil, false]; + ACE_player setVariable ["ace_missileguidance_target",nil, false]; }; }; diff --git a/addons/wep_javelin/functions/fnc_onOpticLoad.sqf b/addons/wep_javelin/functions/fnc_onOpticLoad.sqf index c4a7069630..b2192b8883 100644 --- a/addons/wep_javelin/functions/fnc_onOpticLoad.sqf +++ b/addons/wep_javelin/functions/fnc_onOpticLoad.sqf @@ -6,6 +6,11 @@ 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; + uiNameSpace setVariable [QGVAR(arguments), [ 0, // Last runtime diff --git a/addons/wep_javelin/functions/fnc_showFireMode.sqf b/addons/wep_javelin/functions/fnc_showFireMode.sqf new file mode 100644 index 0000000000..35dff9dbd3 --- /dev/null +++ b/addons/wep_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/wep_javelin/script_component.hpp b/addons/wep_javelin/script_component.hpp index 3df1273422..69fe7efe57 100644 --- a/addons/wep_javelin/script_component.hpp +++ b/addons/wep_javelin/script_component.hpp @@ -46,6 +46,15 @@ #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) + +#define __OffsetX ((ctrlPosition __JavelinIGUITargetingLineV) select 0) - 0.5 +#define __OffsetY ((ctrlPosition __JavelinIGUITargetingLineH) select 1) - 0.5 + + // 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/wep_javelin/stringtable.xml b/addons/wep_javelin/stringtable.xml index 4068d6f0a6..a691c750cb 100644 --- a/addons/wep_javelin/stringtable.xml +++ b/addons/wep_javelin/stringtable.xml @@ -8,7 +8,7 @@ <French>Lock Target (Hold)</French> <Polish>Lock Target (Hold)</Polish> <Czech>Lock Target (Hold)</Czech> - <Spanish>Lock Target (Hold)</Spanish> + <Spanish>Fijar objetivo (Mantener)</Spanish> <Russian>Lock Target (Hold)</Russian> </Key> <Key ID="STR_ACE_WEP_JAVELIN_CycleFireMode"> @@ -17,7 +17,7 @@ <French>Cycle Fire Mode</French> <Polish>Cycle Fire Mode</Polish> <Czech>Cycle Fire Mode</Czech> - <Spanish>Cycle Fire Mode</Spanish> + <Spanish>Cambiar modo de fuego</Spanish> <Russian>Cycle Fire Mode</Russian> </Key> </Package> diff --git a/addons/winddeflection/stringtable.xml b/addons/winddeflection/stringtable.xml index b52100046f..a1e67fa0d4 100644 --- a/addons/winddeflection/stringtable.xml +++ b/addons/winddeflection/stringtable.xml @@ -20,7 +20,7 @@ <Key ID="STR_ACE_WEATHER_METER_WEATHER_CATEGORY"> <English>Weather Information</English> <Polish>Informacje o pogodzie</Polish> - <Spanish>Información Meteorológica</Spanish> + <Spanish>Información meteorológica</Spanish> </Key> <Key ID="STR_ACE_WEATHER_METER_WEATHER_HUMIDITY"> <English>Humidity: %1%</English> diff --git a/documentation/development/ace3-events-system.md b/documentation/development/ace3-events-system.md index 9075347f71..6b708b01dd 100644 --- a/documentation/development/ace3-events-system.md +++ b/documentation/development/ace3-events-system.md @@ -40,6 +40,7 @@ PREP(onTapShoulder); <th>Event Key</th> <th>Description</th> <th>Source(s)</th> + <th>Passed Parameter(s) (_this)</th> <th>Locality</th> </tr> </thead> @@ -48,6 +49,7 @@ PREP(onTapShoulder); <td>"playerChanged"</td> <td>`player` changed (zeus/respawn)</td> <td>common</td> + <td>[_newPlayer, _oldPlayer]</td> <td>local</td> </tr> </tr> @@ -55,6 +57,7 @@ PREP(onTapShoulder); <td>"playerInventoryChanged"</td> <td>Inventory changed</td> <td>common</td> + <td>getAllGear-Array</td> <td>local</td> </tr> </tr> @@ -62,13 +65,23 @@ PREP(onTapShoulder); <td>"playerVisionModeChanged"</td> <td>Vision mode changed (e.g. NVG on)</td> <td>common</td> + <td>[_unit, _newVisionMode]</td> <td>local</td> </tr> + </tr> + <tr> + <td>"inventoryDisplayChanged"</td> + <td>Inventory display opened/closed</td> + <td>common</td> + <td>[_unit, _isOpen]</td> + <td>local</td> + </tr> </tr> <tr> <td>"zeusDisplayChanged"</td> <td>Zeus display opened/closed</td> <td>common</td> + <td>[_unit, _isOpen]</td> <td>local</td> </tr> </tr> @@ -76,72 +89,91 @@ PREP(onTapShoulder); <td>"cameraViewChanged"</td> <td>Camera view changed</td> <td>common</td> + <td>[_unit, _newCameraView]</td> <td>local</td> </tr> <tr> <td>"playerVehicleChanged"</td> <td>Player vehicle changed</td> <td>common</td> + <td>[_unit, _newVehicle]</td> <td>local</td> </tr> <tr> <td>"playerTurretChanged"</td> <td>Player turret changed</td> <td>common</td> + <td>[_unit, _newTurretIndexArray]</td> <td>local</td> </tr> <tr> <td>"infoDisplayChanged"</td> <td>On info box change (e.g. entering and leaving a vehicle)</td> <td>common</td> + <td>[_display, _type]</td> <td>local</td> </tr> <tr> <td>"inventoryDisplayLoaded"</td> <td>On opening the inventory display</td> <td>common</td> + <td>[_display]</td> + <td>local</td> + </tr> + <tr> + <td>"mapDisplayLoaded"</td> + <td>On loading the map (briefing and mission start)</td> + <td>common</td> + <td>[_display, _mapType]</td> <td>local</td> </tr> <tr> <td>"interactionMenuOpened"</td> <td>Interaction Menu Opened</td> <td>interaction</td> + <td></td> <td>local</td> </tr> <tr> <td>"killedByFriendly"</td> <td>On TK/Civilian Killed</td> <td>respawn</td> + <td></td> <td>local</td> </tr> <tr> <td>"drawing_requestMarkers"</td> <td>Request Drawing Markers</td> <td>map</td> + <td></td> <td>target</td> </tr> <tr> <td>"drawing_sendbackMarkers"</td> <td>Send Drawing Markers</td> <td>map</td> + <td></td> <td>target</td> </tr> <tr> <td>"drawing_addLineMarker"</td> <td>Line Drawn</td> <td>map</td> + <td></td> <td>global</td> </tr> <tr> <td>"drawing_removeLineMarker"</td> <td>Line Deleted</td> <td>map</td> + <td></td> <td>global</td> </tr> <tr> <td>"flashbangExplosion"</td> <td>Flashbang Goes Bang</td> <td>grenades</td> + <td></td> <td>target</td> </tr> </tbody> diff --git a/tools/make64.py b/tools/make64.py new file mode 100644 index 0000000000..61dee96310 --- /dev/null +++ b/tools/make64.py @@ -0,0 +1,828 @@ +#!/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 <name>] [target <name>] [release <version>] + [module name] [module name] [...] + +test -- Copy result to Arma 3. +release <version> -- Make archive with <version>. +force -- Ignore cache and build all. +target <name> -- Use rules in make.cfg under heading [<name>] rather than + default [Make] +key <name> -- Use key in working directory with <name> 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)) + input("Press Enter to continue...") + + 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...") + + # Include build number + try: + configpath = os.path.join(work_drive, prefix, module, "config.cpp") + f = open(configpath, "r") + 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() + 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.") + input("Press Enter to continue...") + 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...")