diff --git a/addons/advanced_ballistics/stringtable.xml b/addons/advanced_ballistics/stringtable.xml index 8ba88dee2b..5c6dd58d6e 100644 --- a/addons/advanced_ballistics/stringtable.xml +++ b/addons/advanced_ballistics/stringtable.xml @@ -210,7 +210,6 @@ Define o raio ao redor do jogador (em metros) onde a balística avançada será aplicada aos projéteis - Moduł ten pozwala aktywować zaawansowaną balistykę biorącą przy obliczeniach trajektorii lotu pocisku pod uwagę takie rzeczy jak temperatura powietrza, ciśnienie atmosferyczne, wilgotność powietrza, siły Coriolisa i Eotvosa, grawitację a także broń z jakiej wykonywany jest strzał oraz rodzaj amunicji. Wszystko to sprowadza się na bardzo dokładne odwzorowanie balistyki. Tento modul umožňuje aktivovat pokročilou balistiku, která vypočítává trajektorii kulky a bere do úvahy věci jako je teplota vzduchu, atmosférický tlak, vlhkost vzduchu, gravitaci, typ munice a zbraň, ze které je náboj vystřelen. To vše přispívá k velmi přesné balistice. Este módulo permite que você ative cálculos de balística avançada, fazendo a trajetória do projétil levar em consideração coisas como temperatura do ar, pressão atmosférica, umidade, força de Coriolis, a gravidade, o modelo da arma no qual o disparo é realizado e o tipo de munição. Tudo isso acrescenta-se a um balística muito precisa. diff --git a/addons/common/functions/fnc_checkFiles.sqf b/addons/common/functions/fnc_checkFiles.sqf index 631329ecee..647a1b00a6 100644 --- a/addons/common/functions/fnc_checkFiles.sqf +++ b/addons/common/functions/fnc_checkFiles.sqf @@ -56,20 +56,23 @@ _addons = [_addons, {_this find "ace_" == 0}] call FUNC(filter); } forEach getArray (configFile >> "ACE_Extensions" >> "extensions"); /////////////// -// check server version +// check server version/addons /////////////// if (isMultiplayer) then { if (isServer) then { // send servers version of ACE to all clients GVAR(ServerVersion) = _version; + GVAR(ServerAddons) = _addons; publicVariable QGVAR(ServerVersion); + publicVariable QGVAR(ServerAddons); } else { - // clients have to wait for the variable + // clients have to wait for the variables [{ - if (isNil QGVAR(ServerVersion)) exitWith {}; + if (isNil QGVAR(ServerVersion) || isNil QGVAR(ServerAddons)) exitWith {}; - private "_version"; - _version = _this select 0; + private ["_version","_addons"]; + _version = (_this select 0) select 0; + _addons = (_this select 0) select 1; if (_version != GVAR(ServerVersion)) then { private "_errorMsg"; @@ -82,7 +85,18 @@ if (isMultiplayer) then { }; }; + _addons = _addons - GVAR(ServerAddons); + if !(_addons isEqualTo []) then { + _errorMsg = format ["Client/Server Addon Mismatch. Client has extra addons: %1.",_addons]; + + diag_log text format ["[ACE] ERROR: %1", _errorMsg]; + + if (hasInterface) then {diag_log str "1"; + ["[ACE] ERROR", _errorMsg, {findDisplay 46 closeDisplay 0}] call FUNC(errorMessage); + }; + }; + [_this select 1] call CBA_fnc_removePerFrameHandler; - }, 1, _version] call CBA_fnc_addPerFrameHandler; + }, 1, [_version,_addons]] call CBA_fnc_addPerFrameHandler; }; }; diff --git a/addons/common/functions/fnc_checkPBOs.sqf b/addons/common/functions/fnc_checkPBOs.sqf index 4733f1a81f..ac6d8fb270 100644 --- a/addons/common/functions/fnc_checkPBOs.sqf +++ b/addons/common/functions/fnc_checkPBOs.sqf @@ -8,8 +8,8 @@ * 0: Warn once * 1: Warn permanently * 2: Kick - * 1: Check all PBOs? (Optional - default: "[]") - * 2: Whitelist (Optinal - default: false) + * 1: Check all PBOs? (Optional - default: false) + * 2: Whitelist (Optinal - default: "[]") * * Return value: * None diff --git a/addons/common/functions/fnc_hideUnit.sqf b/addons/common/functions/fnc_hideUnit.sqf index b3cd6f7b77..94857335f4 100644 --- a/addons/common/functions/fnc_hideUnit.sqf +++ b/addons/common/functions/fnc_hideUnit.sqf @@ -29,6 +29,6 @@ if !(_reason in _setHiddenReasons) then { _unit setVariable [QGVAR(setHiddenReasons), _setHiddenReasons, true]; }; -if !(isObjectHidden _unit) then { +//if !(isObjectHidden _unit) then { (Uncomment when isObjectHidden hits stable branch) ["hideObjectGlobal",[_unit,true]] call FUNC(serverEvent); -}; +//}; diff --git a/addons/common/functions/fnc_moduleCheckPBOs.sqf b/addons/common/functions/fnc_moduleCheckPBOs.sqf index 9543b3a5c9..c75324c9a3 100644 --- a/addons/common/functions/fnc_moduleCheckPBOs.sqf +++ b/addons/common/functions/fnc_moduleCheckPBOs.sqf @@ -3,7 +3,9 @@ * Initializes the check-PBOs module. * * Arguments: - * Whatever the module provides. (I dunno.) + * 0: The module logic + * 1: units + * 2: activated * * Return Value: * None diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index ccc94b361b..28a40e382a 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -579,18 +579,21 @@ Seleccionar dispositivo de mano Ativa dispositivo de mão Przełącz urządzenie podręczne + Přepnout ruční zařízení Close Handheld Device Cerrar dispositivo de mano Fecha dispositivo de mão Zamknij urządzenie podręczne + Zavřít ruční zařízení Cycle Handheld Devices Cambiar dispositivos de mano Troca dispositivos de mão Następne urządzenie podręczne + Procházet ruční zařízení \ No newline at end of file diff --git a/addons/explosives/stringtable.xml b/addons/explosives/stringtable.xml index 40e436656b..a2c3612b24 100644 --- a/addons/explosives/stringtable.xml +++ b/addons/explosives/stringtable.xml @@ -549,11 +549,13 @@ Explode on defusal? Explosão no desarmamento? Eksplozja przy rozbrajaniu? + Explodovat při zneškodňování? Enable certain explosives to explode on defusal? Default: Yes Ativa certos explosivos para detonar no desarmamento? Padrão: Sim Spraw, aby niektóre ładunki wybuchowe eksplodowały przy próbie ich rozbrojenia? Domyślnie:Tak + Umožnit u některých výbušnin explozi při pokusu je zneškodnit? Výchozí: Ano diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index f87880e83c..4ab84e1c51 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -88,6 +88,7 @@ Zeus Actions Akcje Zeusa + Akce Zeuse Interaction - Text Max @@ -252,10 +253,12 @@ Show actions for buildings Pokazuj akcje dla budynków + Zobrazit akci pro budovy Adds interaction actions for opening doors and mounting ladders on buildings. (Note: There is a performance cost when opening interaction menu, especially in towns) Dodaje opcje interakcji dla otwierania drzwi oraz wchodzenia po drabinach do budynków. Uwaga: Użycie tej opcji może spowodować spadek wydajności menu interakcji, szczególnie w dużych miastach. + Přidá možnost interakce pro otevření dvěří a umistňovat žebříky na budovy. (Poznámka: Použití této možnosti snižuje výkon při otevírání pomocí interakčního menu, zejména ve velkých městech.) \ No newline at end of file diff --git a/addons/interaction/ACE_ZeusActions.hpp b/addons/interaction/ACE_ZeusActions.hpp index 913e7a7c85..195a979955 100644 --- a/addons/interaction/ACE_ZeusActions.hpp +++ b/addons/interaction/ACE_ZeusActions.hpp @@ -8,23 +8,23 @@ class ACE_ZeusActions { class stance { displayName = "$STR_A3_RscAttributeUnitPos_Title"; - class limited { - displayName = "$STR_A3_RscAttributeUnitPos_Down_tooltip"; + class prone { + displayName = "$STR_Pos_Down"; icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_prone_ca.paa"; statement = "{_x setUnitPos 'DOWN';} forEach (curatorSelected select 0);"; }; - class normal { - displayName = "$STR_A3_RscAttributeUnitPos_Crouch_tooltip"; + class crouch { + displayName = "$STR_Pos_Crouch"; icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_crouch_ca.paa"; statement = "{_x setUnitPos 'MIDDLE';} forEach (curatorSelected select 0);"; }; - class full { - displayName = "$STR_A3_RscAttributeUnitPos_Up_tooltip"; + class stand { + displayName = "$STR_Pos_Up"; icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_stand_ca.paa"; statement = "{_x setUnitPos 'UP';} forEach (curatorSelected select 0);"; }; class auto { - displayName = "$STR_A3_RscAttributeUnitPos_Auto_tooltip"; + displayName = "$STR_Pos_Automatic"; icon = "\A3\UI_F_Curator\Data\default_ca.paa"; statement = "{_x setUnitPos 'AUTO';} forEach (curatorSelected select 0);"; }; @@ -40,121 +40,97 @@ class ACE_ZeusActions { icon = "\A3\UI_F_Curator\Data\Displays\RscDisplayCurator\modeGroups_ca.paa"; class behaviour { - displayName = CSTRING(Zeus_Behaviour); + displayName = "$STR_Combat_Mode"; class careless { - displayName = CSTRING(Zeus_Behaviour_careless); + displayName = "$STR_Combat_Careless"; statement = "{ _x setBehaviour 'CARELESS'; } forEach (curatorSelected select 1);"; }; class safe { - displayName = "$STR_safe"; + displayName = "$STR_Combat_Safe"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\safe_ca.paa"; statement = "{ _x setBehaviour 'SAFE'; } forEach (curatorSelected select 1);"; }; class aware { - displayName = "$STR_aware"; + displayName = "$STR_Combat_Aware"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\aware_ca.paa"; statement = "{ _x setBehaviour 'AWARE'; } forEach (curatorSelected select 1);"; }; class combat { - displayName = "$STR_combat"; + displayName = "$STR_Combat_Combat"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\combat_ca.paa"; statement = "{ _x setBehaviour 'COMBAT'; } forEach (curatorSelected select 1);"; }; class stealth { - displayName = "$STR_stealth"; + displayName = "$STR_Combat_Stealth"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\stealth_ca.paa"; statement = "{ _x setBehaviour 'STEALTH'; } forEach (curatorSelected select 1);"; }; }; class speed { - displayName = CSTRING(Zeus_Speed); + displayName = "$STR_HC_Menu_Speed"; class limited { - displayName = "$STR_speed_limited"; + displayName = "$STR_Speed_Limited"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeSpeedMode\limited_ca.paa"; statement = "{_x setSpeedMode 'LIMITED';} forEach (curatorSelected select 1);"; }; class normal { - displayName = "$STR_speed_normal"; + displayName = "$STR_Speed_Normal"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeSpeedMode\normal_ca.paa"; statement = "{_x setSpeedMode 'NORMAL';} forEach (curatorSelected select 1);"; }; class full { - displayName = "$STR_speed_full"; + displayName = "$STR_Speed_Full"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeSpeedMode\full_ca.paa"; statement = "{_x setSpeedMode 'FULL';} forEach (curatorSelected select 1);"; }; }; - class stance { - displayName = "$STR_A3_RscAttributeUnitPos_Title"; - - class limited { - displayName = "$STR_A3_RscAttributeUnitPos_Down_tooltip"; - icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_prone_ca.paa"; - statement = "{ {_x setUnitPos 'DOWN'} forEach (units _x); } forEach (curatorSelected select 1);"; - }; - class normal { - displayName = "$STR_A3_RscAttributeUnitPos_Crouch_tooltip"; - icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_crouch_ca.paa"; - statement = "{ {_x setUnitPos 'MIDDLE'} forEach (units _x); } forEach (curatorSelected select 1);"; - }; - class full { - displayName = "$STR_A3_RscAttributeUnitPos_Up_tooltip"; - icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_stand_ca.paa"; - statement = "{ {_x setUnitPos 'UP'} forEach (units _x); } forEach (curatorSelected select 1);"; - }; - class auto { - displayName = "$STR_A3_RscAttributeUnitPos_Auto_tooltip"; - icon = "\A3\UI_F_Curator\Data\default_ca.paa"; - statement = "{ {_x setUnitPos 'AUTO'} forEach (units _x); } forEach (curatorSelected select 1);"; - }; - }; class formation { - displayName = CSTRING(Zeus_Formation); + displayName = "$STR_Formation"; class wedge { - displayName = "$STR_wedge"; + displayName = "$STR_Wedge"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\wedge_ca.paa"; statement = "{_x setFormation 'WEDGE';} forEach (curatorSelected select 1);"; }; class vee { - displayName = "$STR_vee"; + displayName = "$STR_Vee"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\vee_ca.paa"; statement = "{_x setFormation 'VEE';} forEach (curatorSelected select 1);"; }; class line { - displayName = "$STR_line"; + displayName = "$STR_Line"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\line_ca.paa"; statement = "{_x setFormation 'LINE';} forEach (curatorSelected select 1);"; }; class column { - displayName = "$STR_column"; + displayName = "$STR_Column"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\column_ca.paa"; statement = "{_x setFormation 'COLUMN';} forEach (curatorSelected select 1);"; }; class file { - displayName = "$STR_file"; + displayName = "$STR_File"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\file_ca.paa"; statement = "{_x setFormation 'FILE';} forEach (curatorSelected select 1);"; }; class stag_column { - displayName = "$STR_staggered"; + displayName = "$STR_Staggered"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\stag_column_ca.paa"; statement = "{_x setFormation 'STAG COLUMN';} forEach (curatorSelected select 1);"; }; class ech_left { - displayName = "$STR_echl"; + displayName = "$STR_EchL"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\ech_left_ca.paa"; statement = "{_x setFormation 'ECH LEFT';} forEach (curatorSelected select 1);"; }; class ech_right { - displayName = "$STR_echr"; + displayName = "$STR_EchR"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\ech_right_ca.paa"; statement = "{_x setFormation 'ECH RIGHT';} forEach (curatorSelected select 1);"; }; class diamond { - displayName = "$STR_diamond"; + displayName = "$STR_Diamond"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\diamond_ca.paa"; statement = "{_x setFormation 'DIAMOND';} forEach (curatorSelected select 1);"; }; @@ -165,97 +141,97 @@ class ACE_ZeusActions { icon = "\A3\UI_F_Curator\Data\CfgCurator\waypoint_ca.paa"; class behaviour { - displayName = CSTRING(Zeus_Behaviour); + displayName = "$STR_Combat_Mode"; class careless { - displayName = CSTRING(Zeus_Behaviour_careless); + displayName = "$STR_Combat_Careless"; statement = "{ _x setWaypointBehaviour 'CARELESS'; } forEach (curatorSelected select 2);"; }; class safe { - displayName = "$STR_safe"; + displayName = "$STR_Combat_Safe"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\safe_ca.paa"; statement = "{ _x setWaypointBehaviour 'SAFE'; } forEach (curatorSelected select 2);"; }; class aware { - displayName = "$STR_aware"; + displayName = "$STR_Combat_Aware"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\aware_ca.paa"; statement = "{ _x setWaypointBehaviour 'AWARE'; } forEach (curatorSelected select 2);"; }; class combat { - displayName = "$STR_combat"; + displayName = "$STR_Combat_Combat"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\combat_ca.paa"; statement = "{ _x setWaypointBehaviour 'COMBAT'; } forEach (curatorSelected select 2);"; }; class stealth { - displayName = "$STR_stealth"; + displayName = "$STR_Combat_Stealth"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\stealth_ca.paa"; statement = "{ _x setWaypointBehaviour 'STEALTH'; } forEach (curatorSelected select 2);"; }; }; class speed { - displayName = CSTRING(Zeus_Speed); + displayName = "$STR_HC_Menu_Speed"; class limited { - displayName = "$STR_speed_limited"; + displayName = "$STR_Speed_Limited"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeSpeedMode\limited_ca.paa"; statement = "{ _x setWaypointSpeed 'LIMITED'; } forEach (curatorSelected select 2);"; }; class normal { - displayName = "$STR_speed_normal"; + displayName = "$STR_Speed_Normal"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeSpeedMode\normal_ca.paa"; statement = "{ _x setWaypointSpeed 'NORMAL'; } forEach (curatorSelected select 2);"; }; class full { - displayName = "$STR_speed_full"; + displayName = "$STR_Speed_Full"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeSpeedMode\full_ca.paa"; statement = "{ _x setWaypointSpeed 'FULL'; } forEach (curatorSelected select 2);"; }; }; class formation { - displayName = CSTRING(Zeus_Formation); + displayName = "$STR_Formation"; class wedge { - displayName = "$STR_wedge"; + displayName = "$STR_Wedge"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\wedge_ca.paa"; statement = "{_x setWaypointFormation 'WEDGE';} forEach (curatorSelected select 1);"; }; class vee { - displayName = "$STR_vee"; + displayName = "$STR_Vee"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\vee_ca.paa"; statement = "{_x setWaypointFormation 'VEE';} forEach (curatorSelected select 1);"; }; class line { - displayName = "$STR_line"; + displayName = "$STR_Line"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\line_ca.paa"; statement = "{_x setWaypointFormation 'LINE';} forEach (curatorSelected select 1);"; }; class column { - displayName = "$STR_column"; + displayName = "$STR_Column"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\column_ca.paa"; statement = "{_x setWaypointFormation 'COLUMN';} forEach (curatorSelected select 1);"; }; class file { - displayName = "$STR_file"; + displayName = "$STR_File"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\file_ca.paa"; statement = "{_x setWaypointFormation 'FILE';} forEach (curatorSelected select 1);"; }; class stag_column { - displayName = "$STR_staggered"; + displayName = "$STR_Staggered"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\stag_column_ca.paa"; statement = "{_x setWaypointFormation 'STAG COLUMN';} forEach (curatorSelected select 1);"; }; class ech_left { - displayName = "$STR_echl"; + displayName = "$STR_EchL"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\ech_left_ca.paa"; statement = "{_x setWaypointFormation 'ECH LEFT';} forEach (curatorSelected select 1);"; }; class ech_right { - displayName = "$STR_echr"; + displayName = "$STR_EchR"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\ech_right_ca.paa"; statement = "{_x setWaypointFormation 'ECH RIGHT';} forEach (curatorSelected select 1);"; }; class diamond { - displayName = "$STR_diamond"; + displayName = "$STR_Diamond"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\diamond_ca.paa"; statement = "{_x setWaypointFormation 'DIAMOND';} forEach (curatorSelected select 1);"; }; diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index 2e99ed0cef..7b20dde7c0 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -796,6 +796,7 @@ Open Otwórz + Otevřít Interaction System @@ -828,21 +829,5 @@ Správa týmu se skládá z: přidělení barev pro členy týmu, převzetí velení, připojení/odpojení. O módulo de gestão de equipe é composto por: a atribuição de cores para os membros da equipe, comando das equipes, juntando-se / deixando equipes. - - Behaviour - Zachowanie - - - Careless - Beztroski - - - Formation - Formacja - - - Speed Mode - Prędkość - \ No newline at end of file diff --git a/addons/map/stringtable.xml b/addons/map/stringtable.xml index 89e7bf5571..0f252d5b97 100644 --- a/addons/map/stringtable.xml +++ b/addons/map/stringtable.xml @@ -92,11 +92,13 @@ BFT Enable RFA ativo Aktywuj BFT + Povolit BFT Enable Blue Force Tracking. Default: No Ativa Rastreio de Forças Azuis. Padrão: Não Aktywuj Blue Force Tracking. Domyślnie: Nie + Povolit Blue Force Tracking. Výchozí: Ne Interval diff --git a/addons/medical/ACE_Medical_Treatments.hpp b/addons/medical/ACE_Medical_Treatments.hpp index 8eacf39006..079ae40506 100644 --- a/addons/medical/ACE_Medical_Treatments.hpp +++ b/addons/medical/ACE_Medical_Treatments.hpp @@ -11,6 +11,7 @@ class ACE_Medical_Actions { treatmentTimeSelfCoef = 1; items[] = {{"ACE_fieldDressing", "ACE_packingBandage", "ACE_elasticBandage", "ACE_quikclot"}}; condition = ""; + patientStateCondition = 0; itemConsumed = 1; callbackSuccess = QUOTE(DFUNC(treatmentBasic_bandage)); @@ -107,6 +108,7 @@ class ACE_Medical_Actions { // Item required for the action. Leave empty for no item required. items[] = {"ACE_fieldDressing"}; condition = ""; + patientStateCondition = 0; // Callbacks callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_bandage)); callbackFailure = ""; @@ -206,6 +208,7 @@ class ACE_Medical_Actions { items[] = {"ACE_surgicalKit"}; treatmentLocations[] = {QGVAR(useLocation_SurgicalKit)}; requiredMedic = QGVAR(medicSetting_SurgicalKit); + patientStateCondition = QGVAR(useCondition_SurgicalKit); treatmentTime = "(count ((_this select 1) getVariable ['ACE_Medical_bandagedWounds', []]) * 5)"; callbackSuccess = ""; callbackProgress = QUOTE(DFUNC(treatmentAdvanced_surgicalKit_onProgress)); @@ -219,6 +222,7 @@ class ACE_Medical_Actions { items[] = {"ACE_personalAidKit"}; treatmentLocations[] = {QGVAR(useLocation_PAK)}; requiredMedic = QGVAR(medicSetting_PAK); + patientStateCondition = QGVAR(useCondition_PAK); treatmentTime = QUOTE((_this select 1) call FUNC(treatmentAdvanced_fullHealTreatmentTime)); callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_fullHeal)); itemConsumed = QGVAR(consumeItem_PAK); @@ -266,10 +270,10 @@ class ACE_Medical_Actions { requiredMedic = 0; treatmentTime = 15; items[] = {}; - condition = "((_this select 1) getvariable ['ACE_medical_inCardiacArrest', false])"; + condition = "!([(_this select 1)] call ace_common_fnc_isAwake)"; callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_CPR)); callbackFailure = ""; - callbackProgress = "(((_this select 0) select 1) getvariable ['ACE_medical_inCardiacArrest', false])"; + callbackProgress = "!([((_this select 0) select 1)] call ace_common_fnc_isAwake)"; animationPatient = ""; animationPatientUnconscious = "AinjPpneMstpSnonWrflDnon_rolltoback"; animationCaller = "AinvPknlMstpSlayWnonDnon_medic"; diff --git a/addons/medical/ACE_Settings.hpp b/addons/medical/ACE_Settings.hpp index 2b28e91882..fcaba03aa0 100644 --- a/addons/medical/ACE_Settings.hpp +++ b/addons/medical/ACE_Settings.hpp @@ -133,6 +133,20 @@ class ACE_Settings { value = 2; values[] = {"Anywhere", "Medical vehicles", "Medical facility", "vehicle & facility", "Disabled"}; }; + class GVAR(useCondition_PAK) { + displayName = CSTRING(AdvancedMedicalSettings_useCondition_PAK_DisplayName); + description = CSTRING(AdvancedMedicalSettings_useCondition_PAK_Description); + typeName = "SCALAR"; + value = 0; + values[] = {"Anytime", "Stable"}; + }; + class GVAR(useCondition_SurgicalKit) { + displayName = CSTRING(AdvancedMedicalSettings_useCondition_SurgicalKit_DisplayName); + description = CSTRING(AdvancedMedicalSettings_useCondition_SurgicalKit_Description); + typeName = "SCALAR"; + value = 0; + values[] = {"Anytime", "Stable"}; + }; class GVAR(keepLocalSettingsSynced) { typeName = "BOOL"; value = 1; diff --git a/addons/medical/CfgVehicles.hpp b/addons/medical/CfgVehicles.hpp index c8a4528ca5..66df5550fc 100644 --- a/addons/medical/CfgVehicles.hpp +++ b/addons/medical/CfgVehicles.hpp @@ -196,13 +196,21 @@ class CfgVehicles { class consumeItem_PAK { displayName = CSTRING(AdvancedMedicalSettings_consumeItem_PAK_DisplayName); description = CSTRING(AdvancedMedicalSettings_consumeItem_PAK_Description); - typeName = "NUMBER"; class values { class keep { name = CSTRING(No); value = 0; }; class remove { name = CSTRING(Yes); value = 1; default = 1; }; }; }; + class useCondition_PAK { + displayName = CSTRING(AdvancedMedicalSettings_useCondition_PAK_DisplayName); + description = CSTRING(AdvancedMedicalSettings_useCondition_PAK_Description); + typeName = "NUMBER"; + class values { + class AnyTime { name = CSTRING(AnyTime); value = 0; }; + class Stable { name = CSTRING(Stable); value = 1; default = 1; }; + }; + }; class useLocation_PAK { displayName = CSTRING(AdvancedMedicalSettings_useLocation_PAK_DisplayName); description = CSTRING(AdvancedMedicalSettings_useLocation_PAK_Description); @@ -227,15 +235,23 @@ class CfgVehicles { displayName = CSTRING(AdvancedMedicalSettings_useLocation_SurgicalKit_DisplayName); description = CSTRING(AdvancedMedicalSettings_useLocation_SurgicalKit_Description); }; + class useCondition_SurgicalKit: useCondition_PAK { + displayName = CSTRING(AdvancedMedicalSettings_useCondition_SurgicalKit_DisplayName); + description = CSTRING(AdvancedMedicalSettings_useCondition_SurgicalKit_Description); + class values { + class AnyTime { name = CSTRING(AnyTime); value = 0; default = 1; }; + class Stable { name = CSTRING(Stable); value = 1; }; + }; + }; class healHitPointAfterAdvBandage { displayName = CSTRING(AdvancedMedicalSettings_healHitPointAfterAdvBandage_DisplayName); - description = CSTRING(AdvancedMedicalSettings_healHitPointAfterAdvBandage_Description); + description = CSTRING(AdvancedMedicalSettings_healHitPointAfterAdvBandage_Description); typeName = "BOOL"; defaultValue = 0; }; class painIsOnlySuppressed { displayName = CSTRING(AdvancedMedicalSettings_painIsOnlySuppressed_DisplayName); - description = CSTRING(AdvancedMedicalSettings_painIsOnlySuppressed_Description); + description = CSTRING(AdvancedMedicalSettings_painIsOnlySuppressed_Description); typeName = "BOOL"; defaultValue = 1; }; diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index 0b51f57165..f9f821eeb3 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -92,7 +92,7 @@ GVAR(effectTimeBlood) = ACE_time; [{ private["_bleeding", "_blood"]; // Zeus interface is open or player is dead; disable everything - if (!(isNull (findDisplay 312)) or !(alive ACE_player)) exitWith { + if (!(isNull curatorCamera) or !(alive ACE_player)) exitWith { GVAR(effectUnconsciousCC) ppEffectEnable false; GVAR(effectUnconsciousRB) ppEffectEnable false; GVAR(effectBlindingCC) ppEffectEnable false; @@ -174,52 +174,54 @@ GVAR(lastHeartBeatSound) = ACE_time; if ((ACE_time > GVAR(lastHeartBeat) + _interval)) then { GVAR(lastHeartBeat) = ACE_time; - // Pain effect - _strength = (_pain - (ACE_player getvariable [QGVAR(painSuppress), 0])) max 0; - _strength = _strength * (ACE_player getVariable [QGVAR(painCoefficient), GVAR(painCoefficient)]); - if (GVAR(painEffectType) == 1) then { - GVAR(effectPainCC) ppEffectEnable false; - if (_pain > (ACE_player getvariable [QGVAR(painSuppress), 0]) && {alive ACE_player}) then { - _strength = _strength * 0.15; - GVAR(effectPainCA) ppEffectEnable true; - GVAR(effectPainCA) ppEffectAdjust [_strength, _strength, false]; - GVAR(effectPainCA) ppEffectCommit 0.01; - [{ - GVAR(effectPainCA) ppEffectAdjust [(_this select 0), (_this select 0), false]; - GVAR(effectPainCA) ppEffectCommit (_this select 1); - }, [_strength * 0.1, _interval * 0.2], _interval * 0.05, 0] call EFUNC(common,waitAndExecute); - [{ - GVAR(effectPainCA) ppEffectAdjust [(_this select 0), (_this select 0), false]; + // Pain effect, no pain effect in zeus camera + if (isNull curatorCamera) then { + _strength = (_pain - (ACE_player getvariable [QGVAR(painSuppress), 0])) max 0; + _strength = _strength * (ACE_player getVariable [QGVAR(painCoefficient), GVAR(painCoefficient)]); + if (GVAR(painEffectType) == 1) then { + GVAR(effectPainCC) ppEffectEnable false; + if (_pain > (ACE_player getvariable [QGVAR(painSuppress), 0]) && {alive ACE_player}) then { + _strength = _strength * 0.15; + GVAR(effectPainCA) ppEffectEnable true; + GVAR(effectPainCA) ppEffectAdjust [_strength, _strength, false]; GVAR(effectPainCA) ppEffectCommit 0.01; - }, [_strength * 0.7], _interval * 0.3, 0] call EFUNC(common,waitAndExecute); - [{ - GVAR(effectPainCA) ppEffectAdjust [(_this select 0), (_this select 0), false]; - GVAR(effectPainCA) ppEffectCommit (_this select 1); - }, [_strength * 0.1, _interval * 0.55], _interval * 0.4, 0] call EFUNC(common,waitAndExecute); + [{ + GVAR(effectPainCA) ppEffectAdjust [(_this select 0), (_this select 0), false]; + GVAR(effectPainCA) ppEffectCommit (_this select 1); + }, [_strength * 0.1, _interval * 0.2], _interval * 0.05, 0] call EFUNC(common,waitAndExecute); + [{ + GVAR(effectPainCA) ppEffectAdjust [(_this select 0), (_this select 0), false]; + GVAR(effectPainCA) ppEffectCommit 0.01; + }, [_strength * 0.7], _interval * 0.3, 0] call EFUNC(common,waitAndExecute); + [{ + GVAR(effectPainCA) ppEffectAdjust [(_this select 0), (_this select 0), false]; + GVAR(effectPainCA) ppEffectCommit (_this select 1); + }, [_strength * 0.1, _interval * 0.55], _interval * 0.4, 0] call EFUNC(common,waitAndExecute); + } else { + GVAR(effectPainCA) ppEffectEnable false; + }; } else { GVAR(effectPainCA) ppEffectEnable false; - }; - } else { - GVAR(effectPainCA) ppEffectEnable false; - if (_pain > (ACE_player getvariable [QGVAR(painSuppress), 0]) && {alive ACE_player}) then { - _strength = _strength * 0.9; - GVAR(effectPainCC) ppEffectEnable true; - GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - _strength,1 - _strength,0,0,0,0.2,2]]; - GVAR(effectPainCC) ppEffectCommit 0.01; - [{ - GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - (_this select 0),1 - (_this select 0),0,0,0,0.2,2]]; - GVAR(effectPainCC) ppEffectCommit (_this select 1); - }, [_strength * 0.1, _interval * 0.2], _interval * 0.05, 0] call EFUNC(common,waitAndExecute); - [{ - GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - (_this select 0),1 - (_this select 0),0,0,0,0.2,2]]; + if (_pain > (ACE_player getvariable [QGVAR(painSuppress), 0]) && {alive ACE_player}) then { + _strength = _strength * 0.9; + GVAR(effectPainCC) ppEffectEnable true; + GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - _strength,1 - _strength,0,0,0,0.2,2]]; GVAR(effectPainCC) ppEffectCommit 0.01; - }, [_strength * 0.7], _interval * 0.3, 0] call EFUNC(common,waitAndExecute); - [{ - GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - (_this select 0),1 - (_this select 0),0,0,0,0.2,2]]; - GVAR(effectPainCC) ppEffectCommit (_this select 1); - }, [_strength * 0.1, _interval * 0.55], _interval * 0.4, 0] call EFUNC(common,waitAndExecute); - } else { - GVAR(effectPainCC) ppEffectEnable false; + [{ + GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - (_this select 0),1 - (_this select 0),0,0,0,0.2,2]]; + GVAR(effectPainCC) ppEffectCommit (_this select 1); + }, [_strength * 0.1, _interval * 0.2], _interval * 0.05, 0] call EFUNC(common,waitAndExecute); + [{ + GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - (_this select 0),1 - (_this select 0),0,0,0,0.2,2]]; + GVAR(effectPainCC) ppEffectCommit 0.01; + }, [_strength * 0.7], _interval * 0.3, 0] call EFUNC(common,waitAndExecute); + [{ + GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - (_this select 0),1 - (_this select 0),0,0,0,0.2,2]]; + GVAR(effectPainCC) ppEffectCommit (_this select 1); + }, [_strength * 0.1, _interval * 0.55], _interval * 0.4, 0] call EFUNC(common,waitAndExecute); + } else { + GVAR(effectPainCC) ppEffectEnable false; + }; }; }; }; diff --git a/addons/medical/XEH_preInit.sqf b/addons/medical/XEH_preInit.sqf index a932ee5c9d..b479383468 100644 --- a/addons/medical/XEH_preInit.sqf +++ b/addons/medical/XEH_preInit.sqf @@ -56,6 +56,7 @@ PREP(isInMedicalFacility); PREP(isInMedicalVehicle); PREP(isMedic); PREP(isMedicalVehicle); +PREP(isInStableCondition); PREP(itemCheck); PREP(modifyMedicalAction); PREP(onMedicationUsage); diff --git a/addons/medical/functions/fnc_canTreat.sqf b/addons/medical/functions/fnc_canTreat.sqf index 062a696fcd..4795ccc561 100644 --- a/addons/medical/functions/fnc_canTreat.sqf +++ b/addons/medical/functions/fnc_canTreat.sqf @@ -16,7 +16,7 @@ #include "script_component.hpp" -private ["_caller", "_target", "_selectionName", "_className", "_config", "_medicRequired", "_items", "_locations", "_return", "_condition"]; +private ["_caller", "_target", "_selectionName", "_className", "_config", "_medicRequired", "_items", "_locations", "_return", "_condition", "_patientStateCondition"]; _caller = _this select 0; _target = _this select 1; _selectionName = _this select 2; @@ -44,7 +44,6 @@ if !([_caller, _medicRequired] call FUNC(isMedic)) exitwith {false}; _items = getArray (_config >> "items"); if (count _items > 0 && {!([_caller, _target, _items] call FUNC(hasItems))}) exitwith {false}; -_locations = getArray (_config >> "treatmentLocations"); _return = true; if (getText (_config >> "condition") != "") then { @@ -62,6 +61,14 @@ if (getText (_config >> "condition") != "") then { }; if (!_return) exitwith {false}; +_patientStateCondition = if (isText(_config >> "patientStateCondition")) then { + missionNamespace getvariable [getText(_config >> "patientStateCondition"), 0] +} else { + getNumber(_config >> "patientStateCondition") +}; +if (_patientStateCondition == 1 && {!([_target] call FUNC(isInStableCondition))}) exitwith {false}; + +_locations = getArray (_config >> "treatmentLocations"); if ("All" in _locations) exitwith {true}; private [ "_medFacility", "_medVeh"]; diff --git a/addons/medical/functions/fnc_getUnconsciousCondition.sqf b/addons/medical/functions/fnc_getUnconsciousCondition.sqf index 83955f7bd1..19d3bdec1d 100644 --- a/addons/medical/functions/fnc_getUnconsciousCondition.sqf +++ b/addons/medical/functions/fnc_getUnconsciousCondition.sqf @@ -16,7 +16,6 @@ private ["_unit","_return"]; _unit = _this select 0; -if (GVAR(level) == 1) exitwith {true}; if (isnil QGVAR(unconsciousConditions)) then { GVAR(unconsciousConditions) = []; }; diff --git a/addons/medical/functions/fnc_handleBandageOpening.sqf b/addons/medical/functions/fnc_handleBandageOpening.sqf index a92bf9029c..a86077cb3b 100644 --- a/addons/medical/functions/fnc_handleBandageOpening.sqf +++ b/addons/medical/functions/fnc_handleBandageOpening.sqf @@ -58,10 +58,10 @@ if (isClass (_config >> _className)) then { _bandagedWounds = _target getvariable [QGVAR(bandagedWounds), []]; _exist = false; -_injuryId = _injury select 0; +_injuryType = _injury select 1; _bandagedInjury = []; { - if ((_x select 0) == _injuryId) exitwith { + if ((_x select 1) == _injuryType && (_x select 2) == (_injury select 2)) exitwith { _exist = true; _existingInjury = _x; _existingInjury set [3, (_existingInjury select 3) + _impact]; @@ -73,16 +73,11 @@ _bandagedInjury = []; if !(_exist) then { // [ID, classID, bodypart, percentage treated, bloodloss rate] - _bandagedInjury = [_injuryId, _injury select 1, _injury select 2, _impact, _injury select 4]; + _bandagedInjury = [_injury select 0, _injury select 1, _injury select 2, _impact, _injury select 4]; _bandagedWounds pushback _bandagedInjury; }; -_target setvariable [QGVAR(bandagedWounds), _bandagedWounds, !USE_WOUND_EVENT_SYNC]; - -if (USE_WOUND_EVENT_SYNC) then { - // sync _bandagedInjury - -}; +_target setvariable [QGVAR(bandagedWounds), _bandagedWounds, true]; // Check if we are ever going to reopen this if (random(1) <= _reopeningChance) then { @@ -95,22 +90,19 @@ if (random(1) <= _reopeningChance) then { _injuryIndex = _this select 3; _injury = _this select 4; - if (alive _target) then { + //if (alive _target) then { _openWounds = _target getvariable [QGVAR(openWounds), []]; if ((count _openWounds)-1 < _injuryIndex) exitwith {}; _selectedInjury = _openWounds select _injuryIndex; - if (_selectedInjury select 0 == _injury select 0) then { // matching the IDs + if (_selectedInjury select 1 == _injury select 1 && (_selectedInjury select 2) == (_injury select 2)) then { // matching the IDs _selectedInjury set [3, (_selectedInjury select 3) + _impact]; _openWounds set [_injuryIndex, _selectedInjury]; - _target setvariable [QGVAR(openWounds), _openWounds, !USE_WOUND_EVENT_SYNC]; - if (USE_WOUND_EVENT_SYNC) then { - ["medical_propagateWound", [_target, _selectedInjury]] call EFUNC(common,globalEvent); - }; + _bandagedWounds = _target getvariable [QGVAR(bandagedWounds), []]; _exist = false; - _injuryId = _injury select 0; + _injuryId = _injury select 1; { - if ((_x select 0) == _injuryId) exitwith { + if ((_x select 1) == _injuryId && (_x select 2) == (_injury select 2)) exitwith { _exist = true; _existingInjury = _x; _existingInjury set [3, ((_existingInjury select 3) - _impact) max 0]; @@ -119,10 +111,11 @@ if (random(1) <= _reopeningChance) then { }foreach _bandagedWounds; if (_exist) then { - _target setvariable [QGVAR(bandagedWounds), _bandagedWounds, !USE_WOUND_EVENT_SYNC]; + _target setvariable [QGVAR(bandagedWounds), _bandagedWounds, true]; + _target setvariable [QGVAR(openWounds), _openWounds, true]; }; }; // Otherwise something went wrong, we we don't reopen them.. - }; - }, [_target, _impact, _part, _injuryIndex, _injury], _delay, 0] call EFUNC(common,waitAndExecute); + //}; + }, [_target, _impact, _part, _injuryIndex, +_injury], _delay, 0] call EFUNC(common,waitAndExecute); }; diff --git a/addons/medical/functions/fnc_handleDamage.sqf b/addons/medical/functions/fnc_handleDamage.sqf index ab6e6f2a68..aad69ee2fa 100644 --- a/addons/medical/functions/fnc_handleDamage.sqf +++ b/addons/medical/functions/fnc_handleDamage.sqf @@ -80,10 +80,10 @@ if (GVAR(level) < 2) then { } else { _damageReturn = _damageReturn min 0.89; }; + }; [_unit] call FUNC(addToInjuredCollection); - if (_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)]) exitWith { if (vehicle _unit != _unit and {damage (vehicle _unit) >= 1}) then { [_unit] call EFUNC(common,unloadPerson); @@ -99,7 +99,7 @@ if (_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)]) exitW if (_damageReturn >= 0.9 && {_selection in ["", "head", "body"]}) exitWith { if (_unit getvariable ["ACE_isUnconscious", false]) exitwith { [_unit] call FUNC(setDead); - 0.89 + 0.89; }; if (_delayedUnconsicous) then { [{ @@ -110,9 +110,9 @@ if (_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)]) exitW [_this select 0, true] call FUNC(setUnconscious); }, [_unit]] call EFUNC(common,execNextFrame); }; - 0.89 + 0.89; }; - _damageReturn min 0.89; + 0.89; }; if (((_unit getVariable [QGVAR(enableRevive), GVAR(enableRevive)]) > 0) && {_damageReturn >= 0.9} && {_selection in ["", "head", "body"]}) exitWith { @@ -120,8 +120,7 @@ if (((_unit getVariable [QGVAR(enableRevive), GVAR(enableRevive)]) > 0) && {_dam [_unit] call EFUNC(common,unloadPerson); }; [_unit] call FUNC(setDead); - - 0.89 + 0.89; }; -_damageReturn +_damageReturn; diff --git a/addons/medical/functions/fnc_handleDamage_advanced.sqf b/addons/medical/functions/fnc_handleDamage_advanced.sqf index 9da0d065ed..e617738a90 100644 --- a/addons/medical/functions/fnc_handleDamage_advanced.sqf +++ b/addons/medical/functions/fnc_handleDamage_advanced.sqf @@ -39,8 +39,6 @@ _damageBodyParts = _unit getvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]; _damageBodyParts set [_part, (_damageBodyParts select _part) + _newDamage]; _unit setvariable [QGVAR(bodyPartStatus), _damageBodyParts, true]; -[_unit] call FUNC(handleDamage_advancedSetDamage); - _typeOfDamage = [_typeOfProjectile] call FUNC(getTypeOfDamage); [_unit, _selectionName, _newDamage, _typeOfProjectile, _typeOfDamage] call FUNC(handleDamage_assignWounds); diff --git a/addons/medical/functions/fnc_handleDamage_caching.sqf b/addons/medical/functions/fnc_handleDamage_caching.sqf index 9760770d71..99816ee274 100644 --- a/addons/medical/functions/fnc_handleDamage_caching.sqf +++ b/addons/medical/functions/fnc_handleDamage_caching.sqf @@ -81,12 +81,17 @@ if (diag_frameno > (_unit getVariable [QGVAR(frameNo_damageCaching), -3]) + 2) t _args = _this select 0; if (diag_frameno > (_args select 1) + 2) then { + (_args select 0) setDamage 0; + _cache_params = (_args select 0) getVariable [QGVAR(cachedHandleDamageParams), []]; _cache_damages = (_args select 0) getVariable QGVAR(cachedDamages); { _params = _x + [_cache_damages select _foreachIndex]; _params call FUNC(handleDamage_advanced); }foreach _cache_params; + + [(_args select 0)] call FUNC(handleDamage_advancedSetDamage); + [(_this select 1)] call cba_fnc_removePerFrameHandler; }; }, 0, [_unit, diag_frameno] ] call CBA_fnc_addPerFrameHandler; diff --git a/addons/medical/functions/fnc_isInStableCondition.sqf b/addons/medical/functions/fnc_isInStableCondition.sqf new file mode 100644 index 0000000000..f7c22ed085 --- /dev/null +++ b/addons/medical/functions/fnc_isInStableCondition.sqf @@ -0,0 +1,30 @@ +/* +* Author: Glowbal +* Check if a unit is in a stable condition +* +* Arguments: +* 0: The patient +* +* Return Value: +* Is in stable condition +* +* Public: No +*/ + +#include "script_component.hpp" + +private ["_unit"]; +_unit = _this select 0; + +if (GVAR(level) <= 1) exitwith { + ([_unit] call FUNC(getBloodloss)) == 0; +}; + +_totalBloodLoss = 0; +_openWounds = _unit getvariable [QGVAR(openWounds), []]; +{ + // total bleeding ratio * percentage of injury left + _totalBloodLoss = _totalBloodLoss + ((_x select 4) * (_x select 3)); +}foreach _openWounds; + +(_totalBloodLoss == 0); diff --git a/addons/medical/functions/fnc_moduleAdvancedMedicalSettings.sqf b/addons/medical/functions/fnc_moduleAdvancedMedicalSettings.sqf index 5263044583..2960c65b9d 100644 --- a/addons/medical/functions/fnc_moduleAdvancedMedicalSettings.sqf +++ b/addons/medical/functions/fnc_moduleAdvancedMedicalSettings.sqf @@ -33,5 +33,7 @@ if !(_activated) exitWith {}; [_logic, QGVAR(consumeItem_SurgicalKit), "consumeItem_SurgicalKit"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(useLocation_PAK), "useLocation_PAK"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(useLocation_SurgicalKit), "useLocation_SurgicalKit"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(useCondition_PAK), "useCondition_PAK"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(useCondition_SurgicalKit), "useCondition_SurgicalKit"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(healHitPointAfterAdvBandage), "healHitPointAfterAdvBandage"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(painIsOnlySuppressed), "painIsOnlySuppressed"] call EFUNC(common,readSettingFromModule); diff --git a/addons/medical/functions/fnc_setDead.sqf b/addons/medical/functions/fnc_setDead.sqf index fe18ac581f..831a1fa6a0 100644 --- a/addons/medical/functions/fnc_setDead.sqf +++ b/addons/medical/functions/fnc_setDead.sqf @@ -66,6 +66,11 @@ if (((_reviveVal == 1 && {[_unit] call EFUNC(common,isPlayer)} || _reviveVal == _unit setvariable [QGVAR(reviveStartTime), nil]; [(_this select 1)] call cba_fnc_removePerFrameHandler; }; + if (GVAR(level) >= 2) then { + if (_unit getvariable [QGVAR(heartRate), 60] > 0) then { + _unit setvariable [QGVAR(heartRate), 0]; + }; + }; }, 1, [_unit] ] call CBA_fnc_addPerFrameHandler; false; }; diff --git a/addons/medical/functions/fnc_treatment.sqf b/addons/medical/functions/fnc_treatment.sqf index 06cea8dfe3..18f3406df2 100644 --- a/addons/medical/functions/fnc_treatment.sqf +++ b/addons/medical/functions/fnc_treatment.sqf @@ -16,7 +16,7 @@ #include "script_component.hpp" -private ["_caller", "_target", "_selectionName", "_className", "_config", "_medicRequired", "_items", "_locations", "_return", "_callbackProgress", "_treatmentTime", "_callerAnim", "_patientAnim", "_iconDisplayed", "_return", "_usersOfItems", "_consumeItems", "_condition", "_displayText", "_wpn", "_treatmentTimeConfig"]; +private ["_caller", "_target", "_selectionName", "_className", "_config", "_medicRequired", "_items", "_locations", "_return", "_callbackProgress", "_treatmentTime", "_callerAnim", "_patientAnim", "_iconDisplayed", "_return", "_usersOfItems", "_consumeItems", "_condition", "_displayText", "_wpn", "_treatmentTimeConfig", "_patientStateCondition"]; _caller = _this select 0; _target = _this select 1; _selectionName = _this select 2; @@ -53,9 +53,6 @@ if !([_caller, _medicRequired] call FUNC(isMedic)) exitwith {false}; _items = getArray (_config >> "items"); if (count _items > 0 && {!([_caller, _target, _items] call FUNC(hasItems))}) exitwith {false}; -// Check allowed locations -_locations = getArray (_config >> "treatmentLocations"); - _return = true; if (isText (_config >> "Condition")) then { _condition = getText(_config >> "condition"); @@ -74,6 +71,16 @@ if (isText (_config >> "Condition")) then { }; if (!_return) exitwith {false}; +_patientStateCondition = if (isText(_config >> "patientStateCondition")) then { + missionNamespace getvariable [getText(_config >> "patientStateCondition"), 0] +} else { + getNumber(_config >> "patientStateCondition") +}; +if (_patientStateCondition == 1 && {!([_target] call FUNC(isInStableCondition))}) exitwith {false}; + +// Check allowed locations +_locations = getArray (_config >> "treatmentLocations"); + if ("All" in _locations) then { _return = true; } else { diff --git a/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf b/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf index 0a49420783..ade74a6ccb 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf @@ -23,7 +23,7 @@ _selectionName = _this select 2; _className = _this select 3; _items = _this select 4; -// TODO replace by event system instead -[[_caller, _target], QUOTE(DFUNC(treatmentAdvanced_CPRLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ - +if (alive _target && {(_target getvariable [QGVAR(inCardiacArrest), false] || _target getvariable [QGVAR(inReviveState), false])}) then { + [[_caller, _target], QUOTE(DFUNC(treatmentAdvanced_CPRLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ +}; true; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf index 4bb14e1139..61723319a5 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf @@ -14,17 +14,15 @@ #include "script_component.hpp" -private ["_caller","_target", "_n"]; +private ["_caller","_target", "_reviveStartTime"]; _caller = _this select 0; _target = _this select 1; -_n = _target getvariable [QEGVAR(common,ENABLE_REVIVE_COUNTER),0]; -if (_n > 0) then { - _n = _n - random(20); - if (_n < 0) then { - _n = 0; +if (_target getvariable [QGVAR(inReviveState), false]) exitwith { + _reviveStartTime = _target getvariable [QGVAR(reviveStartTime),0]; + if (_reviveStartTime > 0) then { + _target setvariable [QGVAR(reviveStartTime), (_reviveStartTime + random(20)) min ACE_time]; }; - _target setvariable [QEGVAR(common,ENABLE_REVIVE_COUNTER), _n]; }; if (random(1)>= 0.6) exitwith { diff --git a/addons/medical/functions/fnc_treatment_failure.sqf b/addons/medical/functions/fnc_treatment_failure.sqf index 19352e5441..53fd03d2f3 100644 --- a/addons/medical/functions/fnc_treatment_failure.sqf +++ b/addons/medical/functions/fnc_treatment_failure.sqf @@ -60,4 +60,4 @@ if (isNil _callback) then { _args call _callback; -_args call FUNC(createLitter); +// _args call FUNC(createLitter); diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index e836ebf395..35f989e8a1 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -2919,12 +2919,14 @@ IA controlada remotamente IA controlada remotamente Zdalnie sterowane AI + Vzdáleně ovládané AI Treat remote controlled units as AI not players? ¿Tratar unidades remotamente controladas como IA? Tratar unidades remotamente controladas como IA? Traktuj jednostki zdalnie sterowane (przez Zeusa) jako AI, nie jako graczy? + Ošetřit vzdáleně ovládané jednotky jako AI, ne jako hráče? Disabled @@ -3179,14 +3181,22 @@ Localizações do KPS - Where can the personal aid kit be used? + Where can the Personal Aid Kit be used? Где может использоваться аптечка? Gdzie można korzystać z apteczek osobistych? ¿Dónde se puede utilizar el equipo de primeros auxilios? Wo kann der Erstehilfekasten verwendet werden? - Kde může být osobní lékárnička použita? + Kde může být použita osobní lékárnička? Onde o kit de primeiros socorros pode ser utilizado? + + Condition PAK + Podmínka osobní lékárničky + + + When can the Personal Aid Kit be used? + Kde může být použita osobní lékárnička? + Anywhere Где угодно @@ -3286,6 +3296,14 @@ Kde může být použita chirurgická souprava? Onde o kit cirúrgico pode ser utilizado? + + Condition Surgical kit (Adv) + Podmínka chirurgické soupravy (Pokr.) + + + When can the Surgical kit be used? + Kde může být použita chirurgická souprava? + Bloodstains Blutflecken @@ -3611,5 +3629,13 @@ Não No + + Anytime + Kdykoli + + + Stable + Stabilní + \ No newline at end of file diff --git a/addons/nametags/functions/fnc_drawNameTagIcon.sqf b/addons/nametags/functions/fnc_drawNameTagIcon.sqf index 7b6bbda138..021a4e2a0b 100644 --- a/addons/nametags/functions/fnc_drawNameTagIcon.sqf +++ b/addons/nametags/functions/fnc_drawNameTagIcon.sqf @@ -35,7 +35,7 @@ if ((_iconType == ICON_NAME_SPEAK) || (_iconType == ICON_SPEAK)) then { _alpha = _alpha max 0.6;//Boost alpha when speaking } else { if (_iconType == ICON_NAME_RANK) then { - _icon = TEXTURES_RANKS select ((["PRIVATE", "CORPORAL", "SERGEANT", "LIEUTENANT", "CAPTAIN", "MAJOR", "COLONEL"] find (rank _target)) + 1); + _icon = format["\A3\Ui_f\data\GUI\Cfg\Ranks\%1_gs.paa",(toLower(rank _target))]; _size = 1; }; }; diff --git a/addons/nametags/script_component.hpp b/addons/nametags/script_component.hpp index da912b48c4..7bf0acbc4a 100644 --- a/addons/nametags/script_component.hpp +++ b/addons/nametags/script_component.hpp @@ -16,15 +16,3 @@ #define ICON_NAME_RANK 2 #define ICON_NAME_SPEAK 3 #define ICON_SPEAK 4 - -//todo?: custom rank icons?? -#define TEXTURES_RANKS [ \ - "", \ - "\A3\Ui_f\data\GUI\Cfg\Ranks\private_gs.paa", \ - "\A3\Ui_f\data\GUI\Cfg\Ranks\corporal_gs.paa", \ - "\A3\Ui_f\data\GUI\Cfg\Ranks\sergeant_gs.paa", \ - "\A3\Ui_f\data\GUI\Cfg\Ranks\lieutenant_gs.paa", \ - "\A3\Ui_f\data\GUI\Cfg\Ranks\captain_gs.paa", \ - "\A3\Ui_f\data\GUI\Cfg\Ranks\major_gs.paa", \ - "\A3\Ui_f\data\GUI\Cfg\Ranks\colonel_gs.paa" \ - ] \ No newline at end of file diff --git a/addons/optionsmenu/stringtable.xml b/addons/optionsmenu/stringtable.xml index 3af9ca8b30..d1b6199413 100644 --- a/addons/optionsmenu/stringtable.xml +++ b/addons/optionsmenu/stringtable.xml @@ -348,12 +348,14 @@ Noticias ACE Notícias do ACE Wiadomości ACE + ACE Novinky Show News on Main Menu Mostrar noticias en el menú principal Mostrar notícias no menu principal Pokazuj wiadomości ACE w menu głównym + Zobrazit novinky v hlavním menu \ No newline at end of file diff --git a/addons/sitting/stringtable.xml b/addons/sitting/stringtable.xml index 2287ba2ae8..cbf63d2117 100644 --- a/addons/sitting/stringtable.xml +++ b/addons/sitting/stringtable.xml @@ -5,26 +5,31 @@ Sit Down Usiądź Sentar + Sednout si Stand Up Wstań Levantar + Vstát Enable Sitting Habilitar opção para sentar Aktywuj siadanie + Povolit sezení Sitting Sentado Siadanie + Sedící This module allows you to disable the ability to sit on chairs and toilets. Este módulo permite que você desabilite a capacidade de sentar-se em cadeiras e banheiros. Moduł ten pozwala na włączenie lub wyłączenie możliwości siadania na krzesłach i toaletach. + Tento modul dovoluje zakázat možnost sedět na židlých a toaletách. \ No newline at end of file diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml index 368944c3d3..f271bfabf5 100644 --- a/addons/spectator/stringtable.xml +++ b/addons/spectator/stringtable.xml @@ -4,107 +4,77 @@ Spectator Obserwator - - - + Pozorovatel Enable Spectator Aktywuj obserwatora - - - + Povolit pozorovatele Begin spectating on player death? Włącz obserwatora po śmierci gracza? - - - + Přepnout do pozorovatele po hráčově smrti? Player Side Only Tylko strona gracza - - - + Pouze strana hráče Only spectate units belonging to player's side? Pozwól obserwować jednostki będące tylko po stronie gracza? - - - + Pozorovat pouze jednotky patřící k hráčově straně? Spectate AI Obserwacja AI - - - + Pozorovat AI Allow spectating of AI units? Pozwól obserwować jednostki AI? - - - + Umožnit pozorovat AI jednotky? Track Units Śledź jednostki - - - + Sledovat jednotky Track units' movements throughout mission? Śledź ruch jednostek w trakcie misji? - - - + Sledovat pohyby jednotek napříč misí? Start Position Pozycja startowa - - - + Počáteční pozice Use this module as a starting position for spectator camera? Użyj pozycji modułu jako pozycje startową dla kamery obserwatora? - - - + Použít tento modul jako počáteční pozici pro pozorovací kameru? End Mission Zakończ misję - - - + Konec mise End mission when all players dead (default BIS behaviour)? Zakończ misję kiedy wszyscy gracze będą martwi (domyślne zachowanie BIS)? - - - + Ukončit misi když umřou všichni hráči (výchozí BIS chování)? View Distance Zasięg widzenia - - - + Dohlednost OK OK - - - + OK \ No newline at end of file diff --git a/documentation/development/setting-up-the-development-environment.md b/documentation/development/setting-up-the-development-environment.md index 5264760785..e02760f96d 100644 --- a/documentation/development/setting-up-the-development-environment.md +++ b/documentation/development/setting-up-the-development-environment.md @@ -23,7 +23,7 @@ This page describes how you can setup your development environment for ACE3, all ## 2. Why so complicated? -If you have contributed to AGM you might be used to an easier build process, where there was even an .exe you could use for building. ACE3, however, makes use of CBA macros to simplify things and give the developer access to a better debug process, which requires a stricter build environment. Additionally, Mikero's tools are stricter and report more errors than AddonBuilder does. The structure of this development environment also allows for [file patching](#file-patching), which is very useful for debugging. +If you have contributed to AGM you might be used to an easier build process, where there was even an .exe you could use for building. ACE3, however, makes use of CBA macros to simplify things and give the developer access to a better debug process, which requires a stricter build environment. Additionally, Mikero's tools are stricter and report more errors than AddonBuilder does. The structure of this development environment also allows for [file patching](#7-file-patching), which is very useful for debugging. Not offering .exes for the Python scripts we use allows us to make easy changes without the hassle of compiling self-extracting exes all the time.