diff --git a/.hemtt/launch.toml b/.hemtt/launch.toml index 662ac1232..599ddc3f4 100644 --- a/.hemtt/launch.toml +++ b/.hemtt/launch.toml @@ -2,5 +2,11 @@ workshop = [ "450814997", # CBA_A3's Workshop ID "463939057", # ACE3's Workshop ID - "2369477168", # Advanced Developer Tools's Workshop ID -] \ No newline at end of file + "2369477168" # Advanced Developer Tools's Workshop ID +] + +[rhs] +extends = "default" +workshop = [ + "843577117", # RHS USAF Workshop ID +] diff --git a/addons/airway/ACE_Medical_Treatment_Actions.hpp b/addons/airway/ACE_Medical_Treatment_Actions.hpp index 521ca2d6b..922185fa2 100644 --- a/addons/airway/ACE_Medical_Treatment_Actions.hpp +++ b/addons/airway/ACE_Medical_Treatment_Actions.hpp @@ -9,7 +9,7 @@ class ACE_Medical_Treatment_Actions { medicRequired = QGVAR(medLvl_Larynxtubus); treatmentTime = QGVAR(Larynxtubus_time); items[] = {"kat_larynx"}; - condition = QUOTE(!([_patient] call ACEFUNC(common,isAwake)) && (missionNamespace getVariable [ARR_2(QQGVAR(enable),true)]) && !(_patient getVariable [ARR_2(QQGVAR(airway_item),'')] == 'Larynxtubus') && !(_patient getVariable [ARR_2(QQGVAR(airway_item),'')] == 'Guedeltubus')); + condition = QUOTE(!([_patient] call ACEFUNC(common,isAwake)) && (missionNamespace getVariable [ARR_2(QQGVAR(enable),true)]) && !(_patient getVariable [ARR_2(QQGVAR(airway_item),'')] == 'Larynxtubus') && !(_patient getVariable [ARR_2(QQGVAR(airway_item),'')] == 'Guedeltubus') && !([_patient] call FUNC(checkMask))); callbackSuccess = QUOTE([ARR_3(_medic,_patient,(_patient getVariable [ARR_2(QQGVAR(occluded),false)]))] call FUNC(handleRecoveryPosition); [ARR_6(_medic,_patient,_bodyPart,_className,objNull,_usedItem)] call FUNC(treatmentAdvanced_airway);); callbackFailure = ""; callbackProgress = ""; @@ -57,7 +57,7 @@ class ACE_Medical_Treatment_Actions { displayName = CSTRING(AccuvacTreatment_displayName); treatmentTime = QGVAR(Accuvac_time); items[] = {"kat_accuvac"}; - condition = QUOTE(!([_patient] call ACEFUNC(common,isAwake)) && (missionNamespace getVariable [ARR_2(QQGVAR(enable),true)]) && !(_patient getVariable [ARR_2(QQGVAR(recovery),false)]) && !(_patient getVariable [ARR_2(QQGVAR(airway_item),'')] == 'Larynxtubus')); + condition = QUOTE(!([_patient] call ACEFUNC(common,isAwake)) && (missionNamespace getVariable [ARR_2(QQGVAR(enable),true)]) && !(_patient getVariable [ARR_2(QQGVAR(recovery),false)]) && !(_patient getVariable [ARR_2(QQGVAR(airway_item),'')] == 'Larynxtubus') && !([_patient] call FUNC(checkMask))); icon = QPATHTOF(ui\accuvac.paa); consumeItem = 0; medicRequired = QGVAR(medLvl_Accuvac); @@ -140,7 +140,7 @@ class ACE_Medical_Treatment_Actions { allowedSelections[] = {"Head"}; allowSelfTreatment = 0; callbackSuccess = QFUNC(checkAirway); - condition = QUOTE(!([_patient] call ACEFUNC(common,isAwake)) && (missionNamespace getVariable [ARR_2(QQGVAR(enable),true)])); + condition = QUOTE((missionNamespace getVariable [ARR_2(QQGVAR(enable),true)]) && !([_patient] call FUNC(checkMask))); animationPatientUnconscious = "AinjPpneMstpSnonWrflDnon_rolltoback"; animationPatientUnconsciousExcludeOn[] = {"ainjppnemstpsnonwrfldnon", "kat_recoveryposition"}; }; diff --git a/addons/airway/XEH_PREP.hpp b/addons/airway/XEH_PREP.hpp index e19feb989..1d1e6eda0 100644 --- a/addons/airway/XEH_PREP.hpp +++ b/addons/airway/XEH_PREP.hpp @@ -1,5 +1,6 @@ PREP(checkAirway); PREP(checkRecovery); +PREP(checkMask); PREP(fullHealLocal); PREP(gui_updateBodyImage); PREP(gui_updateInjuryListGeneral); diff --git a/addons/airway/functions/fnc_checkAirway.sqf b/addons/airway/functions/fnc_checkAirway.sqf index ffa120a50..f74c24436 100644 --- a/addons/airway/functions/fnc_checkAirway.sqf +++ b/addons/airway/functions/fnc_checkAirway.sqf @@ -55,6 +55,15 @@ if (!(_patient getVariable [QGVAR(occluded), false]) && !(_patient getVariable [ _hintWidth = 10; }; +if (_patient getVariable [QEGVAR(chemical,airPoisoning), false]) exitWith { + _message = LLSTRING(AirwayStatus_Poison); + + [_message, _hintSize, _medic, _hintWidth] call ACEFUNC(common,displayTextStructured); + [_patient, "quick_view", LSTRING(checkAirway_log)] call EFUNC(circulation,removeLog); + [_patient, "quick_view", LSTRING(checkAirway_poisonLog)] call EFUNC(circulation,removeLog); + [_patient, "quick_view", LSTRING(checkAirway_poisonLog), [[_medic] call ACEFUNC(common,getName)]] call ACEFUNC(medical_treatment,addToLog); +}; + [_message, _hintSize, _medic, _hintWidth] call ACEFUNC(common,displayTextStructured); [_patient, "quick_view", LSTRING(checkAirway_log)] call EFUNC(circulation,removeLog); diff --git a/addons/airway/functions/fnc_checkMask.sqf b/addons/airway/functions/fnc_checkMask.sqf new file mode 100644 index 000000000..fafcaec4d --- /dev/null +++ b/addons/airway/functions/fnc_checkMask.sqf @@ -0,0 +1,24 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Checks if patient has mask on + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * [player] call kat_airway_fnc_checkMask; + * + * Public: No + */ + +params ["_patient"]; + +if ((goggles _patient in (missionNamespace getVariable [QEGVAR(chemical,availGasmaskList), []])) || (goggles _patient in (missionNamespace getVariable [QEGVAR(breathing,availOxyMaskList), []]))) exitWith { + true +}; + +false \ No newline at end of file diff --git a/addons/airway/stringtable.xml b/addons/airway/stringtable.xml index ccb088d61..ffd5f3724 100644 --- a/addons/airway/stringtable.xml +++ b/addons/airway/stringtable.xml @@ -14,7 +14,7 @@ ACE-Havayolu yaralanmaları aktive edildi mi? Attivare ACE-Lesioni Respiratorie? Активированы травмы ACE-Airway? - 気道損傷モジュールを有効化 + 気道障害モジュールを有効化 ACE - Lesões nas vias aéreas ativadas? ACE - Luftveiskade aktivert? Hengitysteiden vammat aktivoituivat? @@ -117,6 +117,7 @@ Okkluusiojäähdytyssykli Период восстановления окклюзии Verstoppings afkoelingsperiode + Periodo di Recupero dell'Occlusione Activate the puking sound? @@ -194,6 +195,9 @@ %1 检查呼吸道: %2, %3 %1 Heeft de luchtwegen gecheckt: %2, %3 + + %1 checked airways: Heavily Blistered + %1 inserted a %2 %1 intubierte mit %2 @@ -335,6 +339,7 @@ 气道未被阻塞 Vias aéreas não obstruídas Luchtweg is niet geblokkeerd + Le vie aeree non sono ostruite Airway is not occluded @@ -348,6 +353,7 @@ 气道未闭塞 Vias aéreas não ocluídas Luchtweg is niet verstopt + Le vie aeree non sono occluse Airway is obstructed, airway management needed @@ -361,6 +367,7 @@ 气道阻塞,需要气道管理 Vias aéreas obstruídas, gerenciamento de vias aéreas necessário Luchtweg is geblokkeerd, luchtwegmanagement is vereist + Le vie aeree sono ostruite, è necessario un intervento sulle vie aeree Airway is occluded, medical suction needed @@ -374,6 +381,7 @@ 气道堵塞,需要吸痰 Vias aéreas ocluídas, sucção médica necessária Luchtweg is verstopt, medische suctie is vereist + Le vie aeree sono occluse, è necessaria l'aspirazione medica Airway is clear @@ -394,6 +402,9 @@ Tuuliputki on selkeä Luchtweg is vrij + + Airway is heavily blistered + Item could not be used, airways are not clear Gegenstand konnte nicht verwendet werden, Atemwege sind nicht frei @@ -463,6 +474,7 @@ 病人的头部已经过度伸展 A cabeça do paciente já está hiperestendida Patiënts hoofd is al overstrekt + La testa del paziente è già iperestesa Hyperextending head @@ -514,6 +526,7 @@ 头部拉伸成功 Cabeça hiperestendida com sucesso Hoofd succesvol overstrekt + Testa iperestesa con successo %1 hyperextended %2s head @@ -524,6 +537,7 @@ %1 a placé la tête de %2 en hyperextension %1 hiperestendeu a cabeça de %2 %1 overstrekte %2s hoofd + %1 ha posto la testa di %2 in iperestensione Head turn performed, airways are still not clear @@ -575,6 +589,7 @@ Aloita potilaan pään kääntäminen Начать поворачивать голову Begin hoofddraaiing + Iniziata la rotazione della testa Head turning cancelled @@ -589,6 +604,7 @@ Поворот головы отменен 异物清除停止了 Hoofddraaiing gestopt + Rotazione della testa annullata Head Turning Started @@ -602,6 +618,7 @@ 开始清除异物 Rotação de cabeça iniciada Hoofddraaiing gestart + Rotazione della testa avviata Stop head turning @@ -616,6 +633,7 @@ Перестаньте поворачивать голову 停止清除异物 Stop de hoofddraaiing + Fermare la rotazione della testa Medical suction not needed @@ -646,6 +664,7 @@ Aspiration médicale effectuée. Occlusion retirée Sucção médica completa. Oclusão removida. Medische suctie voltooid, Verstopping verwijderd + Aspirazione medica completata, occlusione rimossa Checking Airway @@ -770,6 +789,7 @@ ACCUVAC ACCUVAC ACCUVAC + ACCUVAC ACCUVAC is a medical suction device for airway suction with battery drive for mobile use in emergency medicine. @@ -801,6 +821,7 @@ Aspiration des voies respiratoires Sucção de vias aéreas Luchtweg suctie + Aspirazione delle vie aeree Manual Suction Pump @@ -812,6 +833,7 @@ Pompe d'aspiration manuelle Bomba de Sucção Manual Handmatige suctiepomp + Pompa di aspirazione manuale %1 did a medical suction using a %2 @@ -822,6 +844,7 @@ %1 a effectué une aspiration médicale en utilisant un(e) %2 %1 executou uma sucção médica usando %2 %1 voerde een medische suctie uit met een %2 + %1 ha eseguito un'aspirazione medica utilizzando un/a %2 Manual Suction Pump is a medical suction device for airway suction manually. This is an alternative to electrical devices. @@ -833,6 +856,7 @@ La pompe d’aspiration manuelle est un dispositif d’aspiration médical pour l’aspiration manuelle des voies respiratoires. C’est une alternative aux appareils électriques. A Bomba de Sucção Manual é um dispositivo médico que possibilita a sucção manual das vias aéras, sendo uma alternativa aos dispositivos elétricos. De handmatige suctiepomp is een apparaat om handmatig de luchtwegen af te zuigen. Dit is een alternatief voor electrische apparaten + La pompa di aspirazione manuale è un dispositivo medico per l'aspirazione delle vie aeree manualmente. Questa è un'alternativa ai dispositivi elettrici. Airway Suction (Manual) @@ -844,6 +868,7 @@ Aspiration des voies respiratoires (Manuel) Sucção de vias aéreas (manual) Handmatige luchtweg suctie + Aspirazione delle vie aeree (manuale) Reusable Manual Suction Pump @@ -855,6 +880,7 @@ Pompre d'aspiration manuelle réutilisable Bomba de Sucção Manual Reutilizável Herbruikbare handmatige suctiepomp + Pompa di aspirazione manuale riutilizzabile Regain the Manual Suction Pump after use @@ -866,6 +892,7 @@ Récupère la pompe d'asipiration manuelle après utilisation Recupere a Bomba de Sucção Manual após o uso Krijg de handmatige suctiepomp terug na gebruik + Recuperare la pompa di aspirazione manuale dopo l'uso Vomit (Small) @@ -1048,6 +1075,7 @@ Autoriser la pompe d'aspiration manuelle Permitir Bomba de Sucção Manual Sta handmatige suctiepomp toe + Permettere l'uso della pompa di aspirazione manuale Training level required to use an Manual Suction Pump @@ -1059,6 +1087,7 @@ Niveau d'entrainement requis pour utiliser une pompe d'aspiration manuelle Nível de formação necessário para utilizar uma Bomba de Sucção Manual Trainingsniveau benodigd om een handmatige suctiepomp te gebruiken + Livello di formazione richiesto per utilizzare una pompa di aspirazione manuale Time to check Airway @@ -1148,6 +1177,7 @@ pään käännösväli Интервал поворота головы Hoofddraaiing interval + Intervallo di rotazione della testa Time between head turning attempts @@ -1161,6 +1191,7 @@ pään käännösyritysten välinen aika Время между попытками поворота головы Tijd tussen hoofddraaiing pogingen + Tempo tra i tentativi di rotazione della testa %1 finished head turning (x%2) @@ -1174,6 +1205,7 @@ %1 lopetti pään kääntämisen (x%2) %1 закончил поворот головы (x%2) %1 heeft het hoofd gedraaid (x%2) + %1 ha completato la rotazione della testa (x%2) Time for ACCUVAC @@ -1223,6 +1255,7 @@ Durée d'aspiration avec la pompe d'aspiration manuelle Tempo de uso da Bomba de Sucção Manual Behandelstijd van een handmatige suctiepomp + Tempo per la pompa di aspirazione manuale How long it will take to use Manual Suction Pump @@ -1234,6 +1267,7 @@ Temps nécessaire pour utiliser la pompe d'aspiration manuelle Quanto tempo leva o uso da Bomba de Sucção Manual Hoe lang het gaat duren om een handmatige suctiepomp te gebruiken + Quanto tempo ci vorrà per utilizzare la pompa di aspirazione manuale Time for Larynxtubus @@ -1430,6 +1464,7 @@ %1 cancelada posición lateral de seguridad %1 cancelou a posição de recuperação %1 stopte de stabiele zijligging + %1 ha annullato la posizione laterale di sicurezza Time for recovery position @@ -1532,6 +1567,7 @@ Benötigte Zeit, um eine stabile Seitenlage rückganging zu machen. Quanto tempo leva para cancelar manualmente a posição de recuperação Hoe lang het gaat duren om de stabiele zijligging te stoppen + Quanto tempo ci vorrà per annullare manualmente la posizione laterale di sicurezza Recovery Position time to drain occlusion @@ -1544,6 +1580,7 @@ Stabile Seitenlage: Benötigte Zeit zum Entgegenwirken einer Verstopfung Tempo para remover a oclusão durante a posição de recuperação Stabiele zijligging: Benodigde tijd om zich te ontdoen van een verstopping + Tempo in posizione laterale di sicurezza per drenare l'occlusione Maximum time required for patient in recovery position to be drained of occlusion. @@ -1556,6 +1593,7 @@ Beschreibt die maximal benötigte Dauer, bei welcher eine Stabile Seitenlage zur zur Freilegung der verstopften Atemwege führt. O tempo máximo necessário para o paciente em posição de recuperação ter sua oclusão removida. Maximale tijd die nodig is om een patiënt in de stabiele zijligging te ontdoen van een verstopping. + Tempo massimo richiesto per drenare l'occlusione nel paziente in posizione laterale di sicurezza Recovery Position + Head Hyperextend Settings @@ -1568,6 +1606,7 @@ Einstellungen für Stabile Seitenlage und Kopfüberstreckung Configurações de posição de recuperação + hiperestensão Stabiele zijliggings- en hoofd overstrekkings opties + Impostazioni della posizione laterale di sicurezza + iperestensione della testa Suction devices Settings @@ -1579,6 +1618,7 @@ Paramètres des appareils d'aspiration Configurações de dispositivos de sucção Suctie apparaten instellingen + Impostazioni dei dispositivi di aspirazione Airway items Settings diff --git a/addons/breathing/ACE_Medical_Treatment_Actions.hpp b/addons/breathing/ACE_Medical_Treatment_Actions.hpp index 26f725246..c355b107e 100644 --- a/addons/breathing/ACE_Medical_Treatment_Actions.hpp +++ b/addons/breathing/ACE_Medical_Treatment_Actions.hpp @@ -280,7 +280,7 @@ class ACE_Medical_Treatment_Actions { medicRequired = QGVAR(medLvl_NasalCannula); treatmentTime = QGVAR(NasalCannula_time); items[] = {"kat_nasal"}; - condition = QUOTE((missionNamespace getVariable [ARR_2(QQGVAR(enable),true)]) && !((_patient getVariable [ARR_2(QQGVAR(etco2Monitor),[])] findIf {_x == 'NasalCannula'}) > -1)); + condition = QUOTE((missionNamespace getVariable [ARR_2(QQGVAR(enable),true)]) && !((_patient getVariable [ARR_2(QQGVAR(etco2Monitor),[])] findIf {_x == 'NasalCannula'}) > -1) && !([_patient] call EFUNC(airway,checkMask))); callbackSuccess = QFUNC(treatmentAdvanced_nasalCannula); callbackFailure = ""; callbackProgress = ""; @@ -305,4 +305,13 @@ class ACE_Medical_Treatment_Actions { condition = QUOTE((missionNamespace getVariable [ARR_2(QQGVAR(enable),true)]) && ((_patient getVariable [ARR_2(QQGVAR(etco2Monitor),[])] findIf {_x == 'NasalCannula'}) > -1)); callbackSuccess = QFUNC(treatmentAdvanced_removeNasalCannula); }; + class RemoveOxyMask : NasalCannula { + displayName = CSTRING(Remove_OxyMask); + displayNameProgress = ECSTRING(airway,action_removing); + medicRequired = 0; + treatmentTime = 5; + items[] = {}; + condition = QUOTE(_patient call EFUNC(airway,checkMask)); + callbackSuccess = QFUNC(removeOxygenMask); + }; }; diff --git a/addons/breathing/CfgMagazines.hpp b/addons/breathing/CfgMagazines.hpp index eae0f01e9..78f4f8312 100644 --- a/addons/breathing/CfgMagazines.hpp +++ b/addons/breathing/CfgMagazines.hpp @@ -37,4 +37,22 @@ class CfgMagazines { ACE_isMedicalItem = 1; ACE_asItem = 1; }; + class kat_personal_oxygen: CA_Magazine { + scope = 2; + scopeCurator = 2; + scopeArsenal = 2; + author = "Mazinski"; + displayName = CSTRING(PersonalOxygen_Display); + descriptionShort = CSTRING(PersonalOxygen_Desc_Short); + picture = QPATHTOF(ui\oxygenTank.paa); + + ammo = ""; + count = 30; + initSpeed = 0; + tracersEvery = 0; + lastRoundsTracer = 0; + mass = 5; + ACE_isMedicalItem = 1; + ACE_asItem = 1; + }; }; diff --git a/addons/breathing/CfgSounds.hpp b/addons/breathing/CfgSounds.hpp index ea57583fe..d10da34cb 100644 --- a/addons/breathing/CfgSounds.hpp +++ b/addons/breathing/CfgSounds.hpp @@ -30,4 +30,11 @@ class CfgSounds sound[] = { QPATHTOF(audio\pneumothoraxcough.ogg), 5, 1, 2 }; titles[] = {}; }; + class GVAR(respiratorTone) { + name = QGVAR(respiratorTone); + + // filename, volume, pitch, distance (optional) + sound[] = { QPATHTOF(audio\respiratorTone.ogg), 5, 1, 2 }; + titles[] = {}; + }; }; \ No newline at end of file diff --git a/addons/breathing/CfgVehicles.hpp b/addons/breathing/CfgVehicles.hpp index 59c8dd38c..5b5410c84 100644 --- a/addons/breathing/CfgVehicles.hpp +++ b/addons/breathing/CfgVehicles.hpp @@ -126,6 +126,24 @@ class CfgVehicles { condition = QUOTE((GVAR(locationProvideOxygen) in [ARR_2(2,3)]) && 'kat_oxygenTank_300_Empty' in (items _player) && _player call ACEFUNC(medical_treatment,isInMedicalFacility)); statement = QUOTE([ARR_3(_player,'kat_oxygenTank_300',GVAR(PortableOxygenTank_RefillTime)*2)] call FUNC(refillOxygenTank)); }; + class Attach_PersonalOxygen { + displayName = CSTRING(AttachPersonalOxygenTank); + condition = QUOTE(([ARR_2(_player,'kat_personal_oxygen')] call ACEFUNC(common,hasMagazine)) && (_player call FUNC(checkOxygenMask))); + statement = QUOTE(_player call FUNC(attachPersonalOxygen)); + showDisabled = 0; + exceptions[] = {"isNotSwimming", "isNotOnLadder"}; + icon = QPATHTOF(ui\oxygenTank_ui.paa); + }; + class Detach_PersonalOxygen: Attach_PersonalOxygen { + displayName = CSTRING(RemovePersonalOxygenTank); + condition = QUOTE(_player getVariable [ARR_2(QQGVAR(oxygenMaskActive),false)]); + statement = QUOTE(_player call FUNC(detachPersonalOxygen)); + }; + class Check_PersonalOxygen: Attach_PersonalOxygen { + displayName = CSTRING(CheckPersonalOxygenTank); + condition = QUOTE(_player getVariable [ARR_2(QQGVAR(oxygenMaskActive),false)]); + statement = QUOTE(_player call FUNC(checkPersonalOxygen)); + }; }; }; }; @@ -152,4 +170,31 @@ class CfgVehicles { }; }; }; + + class Air; + class Helicopter: Air { + class ACE_SelfActions { + class KAT_AttachOxygenVehicle { + displayName = CSTRING(AttachOxygenVehicle); + condition = QUOTE((_player call FUNC(checkAircraftOxygen)) && (_player call FUNC(checkOxygenMask))); + statement = QUOTE(_player call FUNC(attachVehicleOxygen)); + insertChildren = ""; + exceptions[] = {}; + icon = QACEPATHTOF(medical_gui,ui\cross.paa); + }; + }; + }; + + class Plane: Air { + class ACE_SelfActions { + class KAT_AttachOxygenVehicle { + displayName = CSTRING(AttachOxygenVehicle); + condition = QUOTE((_player call FUNC(checkAircraftOxygen)) && (_player call FUNC(checkOxygenMask))); + statement = QUOTE(_player call FUNC(attachVehicleOxygen)); + insertChildren = ""; + exceptions[] = {}; + icon = QACEPATHTOF(medical_gui,ui\cross.paa); + }; + }; + }; }; diff --git a/addons/breathing/XEH_PREP.hpp b/addons/breathing/XEH_PREP.hpp index 9986f02b8..6c4614e16 100644 --- a/addons/breathing/XEH_PREP.hpp +++ b/addons/breathing/XEH_PREP.hpp @@ -1,11 +1,18 @@ +PREP(attachPersonalOxygen); +PREP(attachVehicleOxygen); PREP(canUseBVM); +PREP(checkAircraftOxygen); PREP(checkBreathing); +PREP(checkOxygenMask); +PREP(checkPersonalOxygen); PREP(checkPulseOximeter); +PREP(detachPersonalOxygen); PREP(fullHealLocal); PREP(gui_updateBodyImage); PREP(gui_updateInjuryListPart); PREP(gui_updateInjuryListWounds); PREP(handleBreathing); +PREP(handleBreathingConditions); PREP(handlePneumothoraxDeterioration); PREP(handlePulmoHit); PREP(handleRespawn); @@ -16,6 +23,7 @@ PREP(init); PREP(inspectChest); PREP(listenLungs); PREP(refillOxygenTank); +PREP(removeOxygenMask); PREP(treatmentAdvanced_chestSeal); PREP(treatmentAdvanced_chestSealLocal); PREP(treatmentAdvanced_hemopneumothorax); @@ -24,9 +32,9 @@ PREP(treatmentAdvanced_nasalCannula); PREP(treatmentAdvanced_nasalCannulaLocal); PREP(treatmentAdvanced_pulseoximeter); PREP(treatmentAdvanced_pulseoximeterLocal); -PREP(treatmentAdvanced_removePulseoximeter); PREP(treatmentAdvanced_removeNasalCannula); PREP(treatmentAdvanced_removeNasalCannulaLocal); +PREP(treatmentAdvanced_removePulseoximeter); PREP(treatmentAdvanced_tensionpneumothorax); PREP(treatmentAdvanced_tensionpneumothoraxLocal); -PREP(useBVM); +PREP(useBVM); \ No newline at end of file diff --git a/addons/breathing/XEH_postInit.sqf b/addons/breathing/XEH_postInit.sqf index 41d13854e..62efb8271 100644 --- a/addons/breathing/XEH_postInit.sqf +++ b/addons/breathing/XEH_postInit.sqf @@ -14,10 +14,23 @@ _unit say3D [QGVAR(pneumothoraxcough), 15]; }] call CBA_fnc_addEventHandler; +[QGVAR(playRespiratorTone), { + params ["_unit"]; + _unit say3D [QGVAR(respiratorTone), 10]; +}] call CBA_fnc_addEventHandler; + + [QEGVAR(misc,handleRespawn), LINKFUNC(handleRespawn)] call CBA_fnc_addEventHandler; +[QACEGVAR(medical_status,initialized), LINKFUNC(handleBreathingConditions)] call CBA_fnc_addEventHandler; + [QACEGVAR(medical_gui,updateInjuryListPart), LINKFUNC(gui_updateInjuryListPart)] call CBA_fnc_addEventHandler; [QACEGVAR(medical_gui,updateInjuryListWounds), LINKFUNC(gui_updateInjuryListWounds)] call CBA_fnc_addEventHandler; [QACEGVAR(medical_gui,updateBodyImage), LINKFUNC(gui_updateBodyImage)] call CBA_fnc_addEventHandler; [QACEGVAR(medical_treatment,fullHealLocalMod), LINKFUNC(fullHealLocal)] call CBA_fnc_addEventHandler; [QACEGVAR(medical,woundReceived),LINKFUNC(handlePulmoHit)] call CBA_fnc_addEventHandler; + +private _items = missionNamespace getVariable [QGVAR(availOxyMask), "'G_AirPurifyingRespirator_01_F'"]; +private _array = [_items, "CfgGlasses"] call EFUNC(chemical,getList); + +missionNamespace setVariable [QGVAR(availOxyMaskList), _array, true]; \ No newline at end of file diff --git a/addons/breathing/XEH_preInit.sqf b/addons/breathing/XEH_preInit.sqf index 47eaed3b6..128413d50 100644 --- a/addons/breathing/XEH_preInit.sqf +++ b/addons/breathing/XEH_preInit.sqf @@ -18,6 +18,21 @@ PREP_RECOMPILE_END; true ] call CBA_Settings_fnc_init; +//Adds available oxygen masks +[ + QGVAR(availOxyMask), + "EDITBOX", + [LLSTRING(SETTING_AVAIL_OXYMASK), LLSTRING(SETTING_AVAIL_OXYMASK_DISC)], + [CBA_SETTINGS_CAT, ELSTRING(GUI,SubCategory_Basic)], + "'G_AirPurifyingRespirator_01_F'", + 1, + { + private _array = [_this, "CfgGlasses"] call EFUNC(chemical,getList); + missionNamespace setVariable [QGVAR(availOxyMaskList), _array, true]; + }, + true +] call CBA_Settings_fnc_init; + //Enable Check Breathing medical action [ QGVAR(enableCheckBreathing), diff --git a/addons/breathing/audio/respiratorTone.ogg b/addons/breathing/audio/respiratorTone.ogg new file mode 100644 index 000000000..6a0b70b7d Binary files /dev/null and b/addons/breathing/audio/respiratorTone.ogg differ diff --git a/addons/breathing/functions/fnc_attachPersonalOxygen.sqf b/addons/breathing/functions/fnc_attachPersonalOxygen.sqf new file mode 100644 index 000000000..8a38d90b1 --- /dev/null +++ b/addons/breathing/functions/fnc_attachPersonalOxygen.sqf @@ -0,0 +1,90 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Attaches personal oxygen tank to player + * Main function + * + * Arguments: + * 0: Patient + * + * Return Value: + * None + * + * Example: + * [player] call kat_breathing_fnc_attachPersonalOxygen; + * + * Public: No + */ + +params ["_patient"]; + +if ((_patient getVariable [QGVAR(oxygenMaskActive), false])) exitWith { + [LSTRING(PersonalOxygen_Affirm), 1.5, _patient] call ACEFUNC(common,displayTextStructured); +}; + +_patient setVariable [QGVAR(oxygenMaskActive), true, true]; + +private _availableTanks = (magazinesAmmo [_patient, false]) select {(_x select 0) isEqualTo "kat_personal_oxygen"}; +private _largestTank = 0; + +{ + if (_x select 1 > ((_availableTanks select _largestTank) select 1)) then { + _largestTank = _y; + }; +} forEach _availableTanks; + +private _largestTankValue = (_availableTanks select _largestTank) select 1; + +_availableTanks deleteAt _largestTank; +_patient removeMagazines "kat_personal_oxygen"; + +{ _patient addMagazine _x; } forEach _availableTanks; + +_patient setVariable [QGVAR(oxygenMaskStatus), [(_largestTankValue + 1), 1], true]; + +[QGVAR(playRespiratorTone), [_patient], _patient] call CBA_fnc_targetEvent; + +[{ + _this params ["_args", "_pfhID"]; + _args params ["_patient"]; + + if !((_patient call EFUNC(airway,checkMask))) exitWith { + _patient call FUNC(detachPersonalOxygen); + _pfhID call CBA_fnc_removePerFrameHandler; + }; + +}, 5, [ + _patient +]] call CBA_fnc_addPerFrameHandler; + +[{ + _this params ["_args", "_pfhID"]; + _args params ["_patient"]; + + if !(alive _patient) exitWith { + _pfhID call CBA_fnc_removePerFrameHandler; + }; + + if !(_patient setVariable [QGVAR(oxygenMaskActive), true]) exitWith { + _pfhID call CBA_fnc_removePerFrameHandler; + }; + + private _maskStatus = _patient getVariable [QGVAR(oxygenMaskStatus), [0,0]]; + _patient setVariable [QGVAR(oxygenMaskStatus), [((_maskStatus select 0) - 1), _pfhID]]; + + if ((_maskStatus select 0) < 4) then { + [QGVAR(playRespiratorTone), [_patient], _patient] call CBA_fnc_targetEvent; + }; + + if ((_maskStatus select 0) == 0) exitWith { + [LLSTRING(PersonalOxygen_Empty), 1.5, _patient] call ACEFUNC(common,displayTextStructured); + _pfhID call CBA_fnc_removePerFrameHandler; + }; + + if ((_maskStatus select 1) == 0) exitWith { + _pfhID call CBA_fnc_removePerFrameHandler; + }; + +}, 60, [ + _patient +]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/breathing/functions/fnc_attachVehicleOxygen.sqf b/addons/breathing/functions/fnc_attachVehicleOxygen.sqf new file mode 100644 index 000000000..808821932 --- /dev/null +++ b/addons/breathing/functions/fnc_attachVehicleOxygen.sqf @@ -0,0 +1,49 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Attaches vehicle oxygen to player + * Main function + * + * Arguments: + * 0: Patient + * + * Return Value: + * None + * + * Example: + * [player] call kat_breathing_fnc_attachVehicleOxygen; + * + * Public: No + */ + +params ["_patient"]; + +if (_patient getVariable [QGVAR(oxygenMaskActive), false]) exitWith { + [LSTRING(PersonalOxygen_Affirm), 1.5, _patient] call ACEFUNC(common,displayTextStructured); +}; + +_patient setVariable [QGVAR(oxygenMaskActive), true, true]; + +[QGVAR(playRespiratorTone), [_patient], _patient] call CBA_fnc_targetEvent; + +[{ + _this params ["_args", "_pfhID"]; + _args params ["_patient"]; + + if !(alive _patient) exitWith { + _patient setVariable [QGVAR(oxygenMaskActive), false, true]; + _pfhID call CBA_fnc_removePerFrameHandler; + }; + + if (isNull objectParent _patient) exitWith { + _patient setVariable [QGVAR(oxygenMaskActive), false, true]; + _pfhID call CBA_fnc_removePerFrameHandler; + }; + + if !((_patient call EFUNC(airway,checkMask))) exitWith { + _patient setVariable [QGVAR(oxygenMaskActive), false, true]; + _pfhID call CBA_fnc_removePerFrameHandler; + }; +}, 10, [ + _patient +]] call CBA_fnc_addPerFrameHandler; \ No newline at end of file diff --git a/addons/breathing/functions/fnc_canUseBVM.sqf b/addons/breathing/functions/fnc_canUseBVM.sqf index 3de662f96..39e0a70e9 100644 --- a/addons/breathing/functions/fnc_canUseBVM.sqf +++ b/addons/breathing/functions/fnc_canUseBVM.sqf @@ -17,4 +17,4 @@ params ["_patient"]; -!(_patient call ACEFUNC(common,isAwake)) && !(_patient getVariable [QGVAR(BVMInUse), false] && {["",_patient] call ACEFUNC(medical_treatment,canCPR)}); +!(_patient call ACEFUNC(common,isAwake)) && !(_patient getVariable [QGVAR(BVMInUse), false] && {["",_patient] call ACEFUNC(medical_treatment,canCPR)} && !(_patient getVariable [QGVAR(oxygenMaskActive), false])); diff --git a/addons/breathing/functions/fnc_checkAircraftOxygen.sqf b/addons/breathing/functions/fnc_checkAircraftOxygen.sqf new file mode 100644 index 000000000..62a9ca228 --- /dev/null +++ b/addons/breathing/functions/fnc_checkAircraftOxygen.sqf @@ -0,0 +1,31 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Checks status of attached oxygen + * Main function + * + * Arguments: + * 0: Patient + * + * Return Value: + * None + * + * Example: + * [player] call kat_breathing_fnc_checkAircraftOxygen; + * + * Public: No + */ + +params ["_patient"]; + +if (isNull objectParent _patient) exitWith { + false +}; + +private _playerPosition = assignedVehicleRole _patient; + +if ((_playerPosition select 0) isEqualTo "cargo") exitWith { + false +}; + +true \ No newline at end of file diff --git a/addons/breathing/functions/fnc_checkBreathing.sqf b/addons/breathing/functions/fnc_checkBreathing.sqf index b7d24d297..953aeae4f 100644 --- a/addons/breathing/functions/fnc_checkBreathing.sqf +++ b/addons/breathing/functions/fnc_checkBreathing.sqf @@ -29,7 +29,7 @@ private _breathing_log = localize ACELSTRING(medical_treatment,Check_Pulse_Norma private _breath = ""; private _respiratoryDepth = _patient getVariable [QEGVAR(vitals,respiratoryDepth), 10]; -if ((10 > _respiratoryDepth) && (_respiratoryDepth >= 7)) then { +if (((10 > _respiratoryDepth) && (_respiratoryDepth >= 7)) || (_patient getVariable [QEGVAR(chemical,airPoisoning), false])) then { _breathing = LLSTRING(breathing_isShallow); _breathing_log = LLSTRING(breathing_shallow); }; @@ -50,6 +50,7 @@ if (_ph < 7.2) then { _output = format ["%1%2", _breathing ,_breath]; _output_log = format ["%1%2", _breathing_log, _breath]; + if (_hr == 0 || !(alive _patient) || (_patient getVariable [QEGVAR(airway,obstruction), false] && !(_patient getVariable [QEGVAR(airway,overstretch), false])) || _patient getVariable [QEGVAR(airway,occluded), false] || _patient getVariable [QGVAR(hemopneumothorax), false] || _patient getVariable [QGVAR(tensionpneumothorax), false]) then { _output = LLSTRING(breathing_none); _output_log = ACELSTRING(medical_treatment,Check_Pulse_None); diff --git a/addons/breathing/functions/fnc_checkOxygenMask.sqf b/addons/breathing/functions/fnc_checkOxygenMask.sqf new file mode 100644 index 000000000..5be7d89e3 --- /dev/null +++ b/addons/breathing/functions/fnc_checkOxygenMask.sqf @@ -0,0 +1,24 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Checks if patient has an oxygen mask on + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * [player] call kat_breathing_fnc_checkOxygenMask; + * + * Public: No + */ + +params ["_patient"]; + +if ((goggles _patient in (missionNamespace getVariable [QGVAR(availOxyMaskList), []]))) exitWith { + true +}; + +false \ No newline at end of file diff --git a/addons/breathing/functions/fnc_checkPersonalOxygen.sqf b/addons/breathing/functions/fnc_checkPersonalOxygen.sqf new file mode 100644 index 000000000..4af1f6db2 --- /dev/null +++ b/addons/breathing/functions/fnc_checkPersonalOxygen.sqf @@ -0,0 +1,27 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Checks status of attached oxygen + * Main function + * + * Arguments: + * 0: Patient + * + * Return Value: + * None + * + * Example: + * [player] call kat_breathing_fnc_checkPersonalOxygen; + * + * Public: No + */ + +params ["_patient"]; + +private _maskStatus = _patient getVariable [QGVAR(oxygenMaskStatus), [0,0]]; + +if (_maskStatus isEqualTo [0,0]) exitWith { + [LSTRING(VehicleOxygen_Affirm), 1.5, _patient] call ACEFUNC(common,displayTextStructured); +}; + +[format ["%1 %2", (_maskStatus select 0), LLSTRING(PersonalOxygen_Remaining)], 1.5, _patient] call ACEFUNC(common,displayTextStructured); \ No newline at end of file diff --git a/addons/breathing/functions/fnc_detachPersonalOxygen.sqf b/addons/breathing/functions/fnc_detachPersonalOxygen.sqf new file mode 100644 index 000000000..931e30f56 --- /dev/null +++ b/addons/breathing/functions/fnc_detachPersonalOxygen.sqf @@ -0,0 +1,34 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Detaches personal oxygen mask from player + * Main function + * + * Arguments: + * 0: Patient + * + * Return Value: + * None + * + * Example: + * [player] call kat_breathing_fnc_detachPersonalOxygen; + * + * Public: No + */ + +params ["_patient"]; + +private _maskStatus = _patient getVariable [QGVAR(oxygenMaskStatus), [0,0]]; + +if ((_maskStatus select 0) > 0) then { + _patient addMagazine ["kat_personal_oxygen", (_maskStatus select 0)]; +}; + +[LSTRING(PersonalOxygen_Disconnect), 1.5, _patient] call ACEFUNC(common,displayTextStructured); + +if ((_maskStatus select 1) != 1) then { + (_maskStatus select 1) call CBA_fnc_removePerFrameHandler; +}; + +_patient setVariable [QGVAR(oxygenMaskActive), false, true]; +_patient setVariable [QGVAR(oxygenMaskStatus), [0,0], true]; \ No newline at end of file diff --git a/addons/breathing/functions/fnc_handleBreathingConditions.sqf b/addons/breathing/functions/fnc_handleBreathingConditions.sqf new file mode 100644 index 000000000..718d554f3 --- /dev/null +++ b/addons/breathing/functions/fnc_handleBreathingConditions.sqf @@ -0,0 +1,43 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Monitors breathing conditions. + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * [player] call kat_breathing_fnc_handleBreathingConcidtions; + * + * Public: No + */ + +params ["_unit"]; + +[{ + params ["_args", "_idPFH"]; + _args params ["_unit"]; + + private _alive = alive _unit; + + if (!_alive) exitWith { + [_idPFH] call CBA_fnc_removePerFrameHandler; + }; + + private _spo2 = GET_KAT_SPO2(_unit); + + if (GVAR(staminaLossAtLowSPO2)) then { + if (!(_unit getVariable ["ACE_isUnconscious",false]) && {_spo2 <= GVAR(lowSPO2Level)}) then { + if (ACEGVAR(advanced_fatigue,enabled)) then { + ["kat_LSDF", 1.5] call ACEFUNC(advanced_fatigue,addDutyFactor); + } else { + _unit setStamina(getStamina _unit - 3); + }; + } else { + ["kat_LSDF"] call ACEFUNC(advanced_fatigue,removeDutyFactor); + }; + }; +}, 10, [_unit]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/breathing/functions/fnc_handleRespawn.sqf b/addons/breathing/functions/fnc_handleRespawn.sqf index fcf114ebb..6336bd964 100644 --- a/addons/breathing/functions/fnc_handleRespawn.sqf +++ b/addons/breathing/functions/fnc_handleRespawn.sqf @@ -36,3 +36,6 @@ _unit setVariable ["kat_PulseoxiInUse_PFH", nil, true]; _unit setVariable ["kat_O2Breathing_PFH", nil, true]; _unit setVariable [QGVAR(usingStethoscope), nil]; + +_unit setVariable [QGVAR(oxygenMaskActive), false, true]; +_unit setVariable [QGVAR(oxygenMaskStatus), [0,0], true]; diff --git a/addons/breathing/functions/fnc_init.sqf b/addons/breathing/functions/fnc_init.sqf index 3bf92c07e..ff579259c 100644 --- a/addons/breathing/functions/fnc_init.sqf +++ b/addons/breathing/functions/fnc_init.sqf @@ -25,3 +25,6 @@ if !(GVAR(enable)) exitWith {}; _unit setVariable [QGVAR(pulseoximeter), false, true]; _unit setVariable [QGVAR(PulseOximeter_Volume), true, true]; _unit setVariable [QGVAR(PulseOximeter_VolumePatient), false, true]; + +_unit setVariable [QGVAR(oxygenMaskActive), false, true]; +_unit setVariable [QGVAR(oxygenMaskStatus), [0,0], true]; \ No newline at end of file diff --git a/addons/breathing/functions/fnc_removeOxygenMask.sqf b/addons/breathing/functions/fnc_removeOxygenMask.sqf new file mode 100644 index 000000000..a9f1497d6 --- /dev/null +++ b/addons/breathing/functions/fnc_removeOxygenMask.sqf @@ -0,0 +1,33 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Removes oxygen mask from player + * Main function + * + * Arguments: + * 0: Patient + * + * Return Value: + * None + * + * Example: + * [player] call kat_breathing_fnc_removeOxygenMask; + * + * Public: No + */ + +params ["_medic", "_patient"]; + +private _maskStatus = _patient getVariable [QGVAR(oxygenMaskStatus), [0,0]]; + +if ((_maskStatus select 1) > 1) then { + [_maskStatus select 1] call CBA_fnc_removePerFrameHandler; +}; + +if ((_maskStatus select 0) > 0) then { + _patient addMagazine ["kat_personal_oxygen", (_maskStatus select 0)]; +}; + +_patient unassignItem (goggles _patient); +_patient setVariable [QGVAR(oxygenMaskActive), false, true]; +_patient setVariable [QGVAR(oxygenMaskStatus), [0,0], true]; \ No newline at end of file diff --git a/addons/breathing/functions/fnc_treatmentAdvanced_pulseoximeterLocal.sqf b/addons/breathing/functions/fnc_treatmentAdvanced_pulseoximeterLocal.sqf index c58a88396..329d94ede 100644 --- a/addons/breathing/functions/fnc_treatmentAdvanced_pulseoximeterLocal.sqf +++ b/addons/breathing/functions/fnc_treatmentAdvanced_pulseoximeterLocal.sqf @@ -25,7 +25,6 @@ _patient setVariable ["kat_PulseoxiInUse_PFH", true]; _patient setVariable [QGVAR(pulseoximeter), true, true]; _patient setVariable [QGVAR(PulseOximeter_VolumePatient), _medic getVariable QGVAR(PulseOximeter_Volume), true]; - private _attachedPulseOximeter = _patient getVariable [QGVAR(PulseOximeter_Attached), [0,0]]; _attachedPulseOximeter set [(ALL_BODY_PARTS find toLower _bodyPart)-2,1]; _patient setVariable [QGVAR(PulseOximeter_Attached), _attachedPulseOximeter, true]; diff --git a/addons/breathing/stringtable.xml b/addons/breathing/stringtable.xml index 26929f50d..5c7815841 100644 --- a/addons/breathing/stringtable.xml +++ b/addons/breathing/stringtable.xml @@ -10,6 +10,7 @@ Activer le module de respiration Ativar o Módulo de Respiração Activeer ademhalingsmodule + Attivare il modulo di respirazione Sets if SPO2 simulation and according functionality like Pneumothorax and \nAirway: occlusion & obstruction (SPO2 reduction will be deactivated) should be activated @@ -20,6 +21,7 @@ Définit si la simulation SpO2 et les fonctionnalités correspondantes telles que les pneumothorax et \nvoies respiratoires : occlusion & obstruction (la réduction de la SPO2 sera désactivée) doivent être activées Define se a simulação de SpO2 e suas funcionalidades como Pneumotórax e \nOclusão/Obstrução de Vias Aéreas (redução de SpO2 será desabilitada) deve ser habilitada. Activeert SpO2 simulatie omtrend pneumothorax en luchtwegen: verstopping en obstructie (SpO2 reductie wordt gedeactiveerd) + Imposta se la simulazione SPO2 e le relative funzionalità, come Pneumotorace e Vie aeree: occlusione e ostruzione (la riduzione SPO2 sarà disattivata), devono essere attivate Lethal SpO2 value @@ -34,7 +36,7 @@ Ölümcül SpO2 değeri Valore letale di SpO2 Смертельное значение SpO2 - SpO2の致命値 + 致死に至るSpO2値 Valor letal de SpO2 Tappava SpO2-arvo Dodelijke SpO2 waarde @@ -52,7 +54,7 @@ Ölümcül SpO2 değerini etkinleştir Attivare il valore letale di SpO2 Активировать летальное значение SpO2 - SpO2の致命値を有効化 + SpO2値による致死を有効化 Ativar o valor letal de SpO2 Aktivoi tappava SpO2-arvo Activeer dodelijke SpO2 waarde @@ -61,19 +63,21 @@ Cardiac arrest SpO2 value Значение SpO2 при остановке сердца Valor de SpO2 de parada cardíaca - SpO2の心停止値 + 心停止に至るSpO2値 Valeur d'arrêt cardiaque de la SpO2 Valor de SpO2 para parada cardíaca Hartstilstand SpO2 waarde + Valore SpO2 arresto cardiaco Activate cardiac arrest SpO2 value Активируйте значение SpO2 при остановке сердца Activar parada cardíaca por valor de SpO2 - SpO2の心停止値を有効化 + SpO2値による心停止を有効化 Activer la valeur d'arrêt cardique de la SpO2 Ativar parada cardíaca por valor de SpO2 Activeer hartstilstand SpO2 waarde + Attivare il valore SpO2 arresto cardiaco SpO2 positive multiplier @@ -141,10 +145,14 @@ Enable PaCO2 PaCO2を有効化 + Abilitare PaCO2 + Activation de la PaCO2 Enables PaCO2 movement and effects on ph and breathing rate phや呼吸速度へ影響を与えるPaCO2(動脈血二酸化炭素分圧)の変動を有効にします + Abilita il movimento di PaCO2 e gli effetti su pH e frequenza respiratoria + Permet le déplacement de la PaCO2 et les effets sur le pH et la fréquence respiratoire Probability for a pneumothorax @@ -172,6 +180,7 @@ Habilitar monitoramento de ETCo2 Permitir monitoreo de ETCo2 Activeer ETCo2 monitor + Abilitare il monitoraggio ETCo2 Sets if medics can view a patient's ETCo2 and Respiratory Rate in the Vitals Monitor when a device capable of monitoring ETCo2 is connected @@ -181,6 +190,7 @@ Define se um médico pode ver o ETCo2 e a Frequência Respiratória no Monitor de Sinais Vitais quando um dispositivo capaz de monitorar ETCo2 estiver conectado Establece si los médicos puede ver el ETCo2 y la Frecuencia Respiratoria de una paciente en el monitor de Signos Vitales cuando se conecta un dispositivo capaz de monitorear ETCo2 Activeert het zien van ETCo2 en ademhalingstempo op de vitale waarden monitor wanneer een apparaat die ETCo2 kan monitoren is aangesloten + Imposta se i medici possono visualizzare l'ETCo2 e la frequenza respiratoria del paziente nel monitor dei parametri vitali quando è connesso un dispositivo in grado di monitorare l'ETCo2 Desired units for ETCo2 Monitoring @@ -190,6 +200,7 @@ Unidades desejadas para monitoramento de ETCo2 Unidades deseadas para el monitoreo de ETCo2 Geprefereerde eenheden voor ETCo2 monitoren + Unità desiderate per il monitoraggio ETCo2 Allow Nasal Cannula @@ -199,6 +210,7 @@ Permitir Cânula Nasal Permitir cánula nasal Sta nasale canule toe + Consentire l'uso della cannula nasale Training level required to insert a Nasal Cannula @@ -208,6 +220,7 @@ Nível de treinamento necessário para inserir uma Cânula Nasal Nivel de formación requerido para insertar una cánula nasal Trainingsniveau benodigd voor het inbrengen van een nasale canule + Livello di formazione richiesto per inserire una cannula nasal Time for Nasal Cannula @@ -217,6 +230,7 @@ Tempo para Cânula Nasal Tiempo de la cánula nasal Tijd voor het inbrengen van een nasale canule + Tempo per la cannula nasale How long it will take to insert a Nasal Cannula @@ -226,6 +240,7 @@ Quanto tempo levará para inserir uma Cânula Nasal Tiempo necesario para insertar una cánula nasal Hoelang het gaat duren om een nasale canule in te brengen + Quanto tempo ci vorrà per inserire una cannula nasale Attach Pulse Oximeter @@ -287,6 +302,7 @@ Wordt gebruikt om polsslag en SpO2 te meten Utilisé pour vérifier le rythme cardiaque et la SpO2 Utilizado para analizar el pulso sanguíneo y el SpO2 + Utilizzato per leggere la frequenza del polso e il valore SpO2 Placing @@ -529,6 +545,7 @@ Poista rintatiiviste hoidon jälkeen Устранить уплотнение в грудной клетке после лечения Verwijder chest seal na behandeling + Rimuovere il Chest Seal dopo il trattamento Stable SpO2 value to gain consciousness @@ -804,6 +821,7 @@ Die Wahrscheinlichkeit in Prozent, welche bestimmt, ob sich ein vollständig verschlechterter Pneumothorax in einen fortgeschrittenen Pneumothorax entwickelt.\nDies wird fortlaufend, auf Basis des Pneumothorax Verschlechterungs Intervals, ermittelt. A porcentagem de chance que determina se um pneumotórax completamente deteriorado irá se deteriorar em um pneumotórax avançado, isso é calculado continuamente conforme o intervalo de deterioração de pneumotórax De kans in procenten, dat bepaalt of een pneumothorax zich doorontwikkeld naar een geadvanceerde pneumothorax. Dit wordt doorlopend gerold op basis van de pneumothorax verslechterings interval + La percentuale di probabilità che determina se un pneumotorace completamente deteriorato degenererà in un pneumotorace avanzato, questo viene calcolato continuamente come impostato nell'intervallo di deterioramento del pneumotorace. Hemothorax / Tension Pnuemothorax Treament Minimum Level @@ -888,6 +906,7 @@ Lisää pneumotoraksin mahdollisuutta vaurion perusteella Увеличивает вероятность пневмоторакса в зависимости от повреждения Verhoogt pneumothorax kans op basis van schade + Aumentare la probabilità di pneumotorace in base al danno subito Increase chance of a pneumothorax and advanced pneumothorax occurring based on damage taken if over the pneumothorax damage threshold @@ -900,6 +919,7 @@ Lisää ilmarintakehän ja pitkälle edenneen ilmarinnan esiintymisen todennäköisyyttä tehdyn vaurion perusteella, jos vaurio on suurempi kuin ilmarintakehän kehittymiseen vaadittava vähimmäisvaurio. Увеличивает вероятность возникновения пневмоторакса и прогрессирующего пневмоторакса в зависимости от полученного повреждения, если оно превышает порог повреждения от пневмоторакса Verhoogt de kans op een (geadvanceerde) pneumothorax wanneer de schade hoger is dan de drempelwaarde + Aumentare la probabilità che si verifichi un pneumotorace e un pneumotorace avanzato in base al danno subito, se oltre la soglia di danno del pneumotorace Deep Penetrating Injury Chance @@ -912,6 +932,7 @@ Mahdollisuus syvään tunkeutuvaan vammaan Вероятность глубокого проникающего ранения Kans op diep penetrerende wond. + Probabilità di lesione penetrante profonda Chance for deep penetrating injury to appear when pneumothorax damage threshold is passed but no pneumothorax is inflicted @@ -924,6 +945,7 @@ Mahdollisuus syvään tunkeutuvaan vammaan syntyy, kun ilmarintakehän vaurioituminen on minimaalista, mutta ilmarintaa ei ole kehittynyt. Вероятность получения глубокого проникающего ранения возникает, когда порог повреждения пневмотораксом превышен, но пневмоторакс не причинен Kans voor het verschijnen van een diep penetrerende wond wanneer de drempelwaarde voor een pneumothorax overschreden wordt maar er geen pneumothorax gerold wordt. + Probabilità che si verifichi una lesione penetrante profonda quando la soglia di danno del pneumotorace è superata, ma non si verifica pneumotorace Deep Penetrating Injury @@ -936,6 +958,7 @@ Syvä tunkeutuva vamma Глубокое проникающее ранение Diep penetrerende wond + Lesione penetrante profonda Chest Seal Applied @@ -948,6 +971,7 @@ Rintatiiviste on kiinnitetty Наложен оклюзивный пластырь на грудную клетку Chest seal aangebracht + Sigillo toracico applicato Hemopneumothorax internal bleeding amount @@ -990,6 +1014,7 @@ Pneumothorax on aina näkyvissä Пневмоторакс всегда виден Pneumothorax altijd zichtbaar + Pneumotorace sempre visibile Sets if pneumothorax should always be visible in the medical menu as an injury instead of requiring diagnosis (1x pneumothorax) @@ -1002,6 +1027,7 @@ Määrittää, näkyykö ilmarinta aina lääkärille vammana diagnoosin vaatimisen sijaan (1x ilmarinta) Устанавливает, должен ли пневмоторакс всегда отображаться в медицинском меню как травма, а не требовать постановки диагноза (1x пневмоторакс) Defineert of een pneumothorax altijd zichbaar is in het medische menu als een wond, zonder dat deze een diagnose vereist (1x pneumothorax) + Imposta se il pneumotorace deve essere sempre visibile nel menu medico come lesione, invece di richiedere una diagnosi (1x pneumotorace) Tension pneumothorax and hemothorax always visible @@ -1014,6 +1040,7 @@ Jännitysilmarinta ja hemothorax ovat aina näkyvissä Напряженный пневмоторакс и гемоторакс всегда видны Spannings- en hemopneumothorax altijd zichtbaar + Pneumotorace da tensione e emotorace sempre visibili Sets if tension pneumothorax and hemopneumothorax should always be visible in the medical menu as an injury instead of requiring diagnosis (1x tensionpneumothorax/1x hemopneumothorax) @@ -1026,6 +1053,7 @@ Määrittää, pitäisikö jännityspneumotoraksin ja hemopneumotoraksin aina näkyä lääkärille vammana diagnoosin vaatimisen sijaan (1x jännitysilmarinta tai hemopneumotoraksi) Устанавливает, должны ли напряженный пневмоторакс и гемопневмоторакс всегда отображаться в медицинском меню как травма, а не требовать постановки диагноза (1x напряженный пневмоторакс/1x гемопневмоторакс). Defineert of spannings- en hemopneumothoraxen altijd zichtbaar zijn in het medische menu als een wond, zonder dat deze een diagnose vereist (1x spanningspneumothorax / 1x hemopneumothorax) + Imposta se il pneumotorace da tensione e l'emopneumotorace devono essere sempre visibili nel menu medico come lesioni, invece di richiedere una diagnosi (1x pneumotorace da tensione/1x emopneumotorace) Stethoscope @@ -1296,6 +1324,7 @@ Näytä syanoosi Показать цианоз Toon cyanose + Mostra cianosi Shows cyanosis of patient in overview tab @@ -1308,6 +1337,7 @@ Näyttää potilaan syanoosin lääketieteellisen yleiskuvan näytössä Показывает цианоз пациента на вкладке обзор Toont de cyanose van de patiënt op de overzichtspagina + Mostra la cianosi del paziente nella scheda panoramica Slight cyanosis SpO2 value @@ -1438,6 +1468,7 @@ Pneumotoraksin mahdollisuus pahentua Вероятность обострения пневмоторакса Kans voor een pneumothorax om te verslechteren + Probabilità che il pneumotorace peggiori Deteriorating pneumothorax interval @@ -1450,6 +1481,7 @@ Aika pneumotoraksin pahenemismahdollisuuksien välillä Интервал ухудшения состояния при пневмотораксе Pneumothorax verslechteringsinterval + Intervallo di deterioramento del pneumotorace After each interval a chance will be rolled whether or not the pneumothorax will deteriorate @@ -1462,6 +1494,7 @@ Jokaisen ajanjakson jälkeen lasketaan mahdollisuus, paheneeko ilmarinta vai ei После каждого интервала будет проверяться, ухудшится пневмоторакс или нет Na elke interval wordt een nieuwe kansrol uitgevoerd die bepaald of de pneumothorax verslechterd + Dopo ogni intervallo, verrà calcolata una probabilità che il pneumotorace peggiori Enable Pneumothorax Arrest @@ -1471,6 +1504,7 @@ Activer l'arrêt dû au pneumothorax Habilitar Parada por Pneumotórax Sta pneumothorax hartstilstand toe + Abilitare l'arresto del pneumotorace Enables a chance for cardiac arrest following pneumothorax @@ -1480,6 +1514,7 @@ Active la chance qu'un arrêt cardiaque se produise en cas de pneumothorax Habilita uma chance de parada cardíaca após o pneumotórax Staat de kans op een hartstilstand na een pneumothorax toe + Abilita una probabilità di arresto cardiaco a seguito di pneumotorace Deteriorating pneumothorax arrest interval @@ -1489,6 +1524,7 @@ Intervalle de détérioration du pneumothorax en arrêt Intervalo de parada por pneumotórax deteriorado Pneumothorax verslechterings hartstilstand interval + Intervallo di arresto del pneumotorace in deterioramento After each interval a chance will be rolled whether or not a pneumothorax will result in cardiac arrest @@ -1498,6 +1534,7 @@ Après chaque intervalle de temps, un pourcentage de chance sera lancé pour savoir si oui ou non le pneumothorax va résulter en un arrêt cardiaque Após cada intervalo, será calculado se o pneumotórax vai resultar em uma parada cardíaca na elke interval wordt er een kansrol uitgevoerd die bepaald of een pneumothorax leidt tot een hartstilstand + Dopo ogni intervallo, verrà calcolata una probabilità che un pneumotorace porti a un arresto cardiaco Breathing items Settings @@ -1659,6 +1696,7 @@ Iniciada asistencia respiratoria Ventilação com BVM iniciada Beademing gestart + Respirazione di salvataggio avviata Put away BVM @@ -1671,6 +1709,7 @@ Varastoi BVM Убрать BVM BVM wegleggen + Riporre il BVM Rescue Breaths Cancelled @@ -1683,6 +1722,7 @@ Pelastushengitykset peruttu Отмена спасения с помощью BVM Beademing is gestopt + Respirazione di salvataggio annullata Use Pocket BVM @@ -1740,6 +1780,7 @@ Käytä BVM:ää ajoneuvon happisäiliön kanssa Использовать BVM с кислородным баллоном (автомобиль) Gebruik BVM met zuurstoftank (voertuig) + Usare il BVM con bombola di ossigeno (veicolo) Using BVM with Oxygen Tank (Vehicle) @@ -1979,6 +2020,14 @@ Портативный кислородный баллон, содержащий 300 литров кислорода. Подключите к BVM для дальнейшего облегчения дыхания пациентов в критическом состоянии. Draagbare zuurstoftank, bevat 300L van zuurstof. Helpt met het beademen van kritieke patiënten wanneer verbonden aan een BVM + + Personal Oxygen Tank + 個人用酸素ボンベ + + + Personal oxygen tank for high altitude operations + 高高度作戦に用いる個人用酸素ボンベ + Empty Portable Oxygen Tank (150L) Bombona de oxigeno portátil vacío (150L) @@ -2250,6 +2299,7 @@ Tarkista potilaan hengitys Проверить дыхание Check ademhaling + Controllare la respirazione Checking Breathing @@ -2262,6 +2312,7 @@ Potilaan hengityksen tarkistaminen Проверка дыхания Ademhaling controleren + Controllando la respirazione , harsh and metallic @@ -2274,6 +2325,7 @@ , kova ja metallinen , резкий и металлический , hard en metaalachtig + , aspra e metallica , slightly fruity @@ -2286,6 +2338,7 @@ , hieman hedelmäinen , слегка фруктовый , lichtelijk fruitig + , leggermente fruttata Patient is breathing normally @@ -2298,6 +2351,7 @@ Potilas hengittää normaalisti Пациент дышит нормально Patiënt ademt normaal + Il paziente respira normalmente Patient's breathing is shallow @@ -2310,6 +2364,7 @@ Potilaan hengitys on pinnallista Дыхание пациента поверхностное Patiënts ademhaling is oppervlakkig + La respirazione del paziente è superficiale Shallow @@ -2322,6 +2377,7 @@ Matala Дыхание поверхностное Oppervlakkig + Superficiale Patient's breathing is very shallow @@ -2355,6 +2411,7 @@ %1 tarkistettu hengitys: %2 %1 проверил дыхание: %2 %1 controleerde ademhaling: %2 + %1 ha controllato la respirazione: %2 Enable Inspect Chest @@ -2367,6 +2424,7 @@ Ota rinnan tarkastus käyttöön Активировать осмотр грудной клетки Sta Thoraxinspectie toe + Abilitare l'ispezione del torace Simple @@ -2379,6 +2437,7 @@ Yksinkertainen Простой Simpel + Semplice Default @@ -2391,6 +2450,7 @@ Default Значение по умолчанию Standaard + Predefinito Inspect Chest Time @@ -2403,6 +2463,7 @@ Kuinka kauan rintakehän tarkastus kestää Время осмотра грудной клетки Thorax inspectie tijd + Tempo di ispezione del torace Allow Inspecting Chest @@ -2415,6 +2476,7 @@ Salli rintatutkimus Разрешить осмотр грудной клетки Sta thorax inspectie toe + Consentire l'ispezione del torace Inspect Chest @@ -2427,6 +2489,7 @@ Tutki rintakehä Осмотреть грудную клетку Thoraxinspectie + Ispezionare il torace Inspecting Chest @@ -2439,6 +2502,7 @@ Rintakehän tutkiminen Осмотр грудной клетки Thoraxinspectie + Ispezionando il torace %1 inspected chest: %2 @@ -2451,6 +2515,7 @@ %1 tarkastettu rintakehä: %2 %1 проверил грудную клетку: %2 %1 inspecteerde thorax:%2 + %1 ha ispezionato il torace: %2 Chest rise and fall observed @@ -2463,6 +2528,7 @@ Rintakehän nousu ja lasku havaittu Наблюдается подъем и опускание грудной клетки Stijging en daling van thorax worden geobserveerd + Sollevamento e abbassamento del torace osservati No chest movement observed @@ -2475,6 +2541,7 @@ Rintakehän liikettä ei havaittu Движений грудной клетки не наблюдается Geen thorax beweging wordt geobserveerd + Nessun movimento del torace osservato No chest movement @@ -2487,6 +2554,7 @@ Ei liikettä rinnassa Отсутствие движения грудной клетки Geen thorax beweging + Nessun movimento del torace Chest sides are uneven @@ -2499,6 +2567,7 @@ Rintakehän sivut ovat epätasaiset Бока грудной клетки неровные Thoraxzijden zijn oneven + I lati del torace sono irregolari , chest sides uneven @@ -2511,6 +2580,7 @@ , rintakehän sivut epätasaiset , бока грудной клетки неровные , thoraxzijden oneven + , lati del torace irregolari Uneven chest rise and fall @@ -2523,6 +2593,7 @@ Epätasainen rintakehän nousu ja lasku Неравномерный подъем и опускание грудной клетки Ongelijkmatige stijging en daling van thorax + Sollevamento e abbassamento del torace irregolari Skin is rigid, looks bruised @@ -2535,6 +2606,7 @@ Iho on jäykkä ja näyttää mustelmalta Кожа жесткая, выглядит ушибленной Huid is stijf, ziet er gekneusd uit + La pelle è rigida, appare lividi Symptoms indicate %1 @@ -2547,6 +2619,7 @@ Oireet osoittavat %1 Симптомы указывают на %1 Symptomen indiceren %1 + I sintomi indicano %1 Pneumothorax @@ -2559,6 +2632,7 @@ Pneumotoraksi Пневмоторакс (PTX) Pneumothorax + Pneumotorace Tension Pneumothorax @@ -2571,6 +2645,7 @@ jännitysilmarinta Напряженный пневмотораксе Spanningspneumothorax + Pneumotorace da tensione Hemopneumothorax @@ -2583,6 +2658,7 @@ hemopneumotoraksi Гемоторакс Hemopneumothorax + Emopneumotorace PTX @@ -2595,6 +2671,7 @@ PTK PTX PTX + PTX TPTX @@ -2607,6 +2684,7 @@ JSA TPTX SPTX + TPTX HPTX @@ -2619,6 +2697,7 @@ HPT HPTX HPTX + HPTX Nasal Cannula @@ -2628,6 +2707,7 @@ Cânula Nasal Cánula Nasal Nasale canule + Cannula nasale The Nasal Cannula can be inserted into a patient's nostrils and connected to a vitals monitor to record a patient's ETCo2 level and respiratory rate. @@ -2637,6 +2717,7 @@ A Cânula Nasal pode ser inserida nas narinas de um paciente e conectada ao monitor de sinais vitais para mensurar o nível de ETCo2 e a frequência respiratória. La cánula nasal se puede insertar en las fosas nasales de un paciente y conectarse a un monitor de signos vitales para registrar el nivel de ETCo2 y la frecuencia respiratoria del paciente. De nasale canule kan in de neusgaten van de patiënt aangebracht worden en verbonden aan een vitale waarden monitor om de ETCo2 waarden en het ademhalingstempo van de patiënt te monitoren + La cannula nasale può essere inserita nelle narici di un paziente e collegata a un monitor dei parametri vitali per registrare il livello di ETCo2 e la frequenza respiratoria del paziente. Remove Nasal Cannula @@ -2646,6 +2727,7 @@ Remover Cânula Nasal Quitar la cánula nasal Verwijder nasale canule + Rimuovere la cannula nasale %1 removed Nasal Cannula @@ -2655,12 +2737,79 @@ %1 removeu a Cânula Nasal %1 retiró la cánula nasal %1 verwijderde nasale canule + %1 ha rimosso la cannula nasale Enable Check Breathing + Activer le contrôle de la respiration + Abilitare il controllo della respirazione + "呼吸を確認"を有効化 Whether or not Check Breathing medical action is enabled + Se l'azione medica di controllo della respirazione è abilitata o meno + Si "Contrôle de la respiration" est activée ou non + 呼吸を確認のアクションを可能にするかどうかを設定します + + + Available Oxygen Masks + 使用可能な酸素マスク + Masques à oxygène disponibles + + + Sets which goggles can act as oxygen masks + 酸素マスクとして動作させたいゴーグルを指定します + Spécifiez les masques que vous souhaitez utiliser comme masque à oxygène. + + + Connect Personal Oxygen + 個人用酸素供給機に接続 + Connecter de l'oxygène personnel + + + Disconnect Personal Oxygen + 個人用酸素供給機を切断 + Déconnexion de l'oxygène personnel + + + Check Personal Oxygen Status + 個人用酸素供給機の状態を確認 + Vérifier l'état de l'oxygène personnel + + + Minutes Remaining + 分残っています + Minutes restantes + + + Oxygen Tank Empty + 酸素ボンベは空です + Réservoir d'oxygène vide + + + Connect to Aircraft Oxygen + 航空機酸素供給機に接続 + Connexion à l'oxygène de l'aéronef + + + Attached to Aircraft Oxygen + 航空機酸素供給機に接続済 + Attaché à l'oxygène de l'aéronef + + + Oxygen already connected + 既に酸素供給機に接続済です + Oxygène déjà connecté + + + Oxygen tank disconnected + 酸素供給機から切断しました + Réservoir d'oxygène déconnecté + + + Remove Oxygen Mask + 酸素マスクを取り外す + Retirer le masque à oxygène diff --git a/addons/chemical/CfgAmmo.hpp b/addons/chemical/CfgAmmo.hpp index 3d40ed641..cec60e938 100644 --- a/addons/chemical/CfgAmmo.hpp +++ b/addons/chemical/CfgAmmo.hpp @@ -1,17 +1,16 @@ -class CfgAmmo -{ +class CfgAmmo { + class SmokeShellArty; - class KAT_SmokeShellArty: SmokeShellArty{ + class KAT_SmokeShellArty: SmokeShellArty { smokeColor[] = {0,0,0,0}; }; class Smoke_82mm_AMOS_White; - class Sh_82mm_AMOS_Type0: Smoke_82mm_AMOS_White - { + class Sh_82mm_AMOS_Type0: Smoke_82mm_AMOS_White { KAT_projectile = 1; KAT_lifetime = 90; KAT_radius = 10; - KAT_toxicLvL = 0; + KAT_toxicLvL = 1; soundFakeFall[] = {"soundFakeFall0",0.25,"soundFakeFall1",0.25,"soundFakeFall2",0.25,"soundFakeFall3",0.25}; soundFakeFall0[] = {"a3\Sounds_F\weapons\falling_bomb\fall_01",3.16228,1,1000}; soundFakeFall1[] = {"a3\Sounds_F\weapons\falling_bomb\fall_02",3.16228,1,1000}; @@ -21,17 +20,16 @@ class CfgAmmo whistleOnFire = 2; submunitionAmmo = "KAT_SmokeShellArty"; }; - class Sh_82mm_AMOS_TypeCS: Sh_82mm_AMOS_Type0 - { + + class Sh_82mm_AMOS_TypeCS: Sh_82mm_AMOS_Type0 { KAT_projectile = 1; KAT_lifetime = 60; KAT_radius = 10; - KAT_toxicLvL = 1; //cs + KAT_toxicLvL = 0; //cs }; class SmokeShell; - class KAT_G_M7A3: SmokeShell - { + class KAT_G_M7A3: SmokeShell { KAT_csGas = 1; model = QPATHTOF(ui\m7a3_throw.p3d); dangerRadiusHit = -1; @@ -58,7 +56,7 @@ class CfgAmmo indirectHit = 0; indirectHitRange = 0; soundHit[] = {"A3\Sounds_F\weapons\smokeshell\smoke_3",1.25893,1,100}; - explosionEffects = "KAT_GASTripEffect"; + explosionEffects = "KAT_TripWireGasEffect"; CraterEffects = ""; soundTrigger[] = {"",1,1}; class CamShakeExplode { @@ -115,9 +113,8 @@ class CfgAmmo frequency = 5; distance = 250; }; - - }; + class Mo_cluster_Bomb_01_F; class KAT_CAS_M43_Ammo_sub: Mo_cluster_Bomb_01_F { hit = 0; diff --git a/addons/chemical/CfgCloudlets.hpp b/addons/chemical/CfgCloudlets.hpp index b7ad16364..1fac4e64c 100644 --- a/addons/chemical/CfgCloudlets.hpp +++ b/addons/chemical/CfgCloudlets.hpp @@ -1,16 +1,16 @@ class CfgCloudlets { class Default; - class ACE_GasTrip: Default { + class KAT_TripWireGas: Default { lifeTime = 0; beforeDestroyScript = QPATHTOF(functions\fnc_GasTripEffect.sqf); }; - class CAS_GAS_Explosion_FX_Script: Default { + class KAT_CAS_GAS_Explosion_FX_Script: Default { lifeTime = 0; beforeDestroyScript = QPATHTOF(functions\fnc_CASCreateGas.sqf); }; - class CAS_GAS_Explosion_FX: Default { + class KAT_CAS_GAS_Explosion_FX: Default { interval = 0.03; circleRadius = 0; circleVelocity[] = {0,0,0}; @@ -63,7 +63,7 @@ class CfgCloudlets { position[] = {0,0,0}; }; - class CAS_GAS_FX: Default { + class KAT_CAS_GAS_FX: Default { interval = 0.03; circleRadius = 0; circleVelocity[] = {0,0,0}; @@ -113,10 +113,10 @@ class CfgCloudlets { }; }; -class KAT_GASTripEffect { +class KAT_TripWireGasEffect { class spawnGAS { simulation = "particles"; - type = "ACE_GasTrip"; + type = "KAT_TripWireGas"; position = "explosionPos"; }; }; @@ -124,21 +124,21 @@ class KAT_GASTripEffect { class KAT_GAS_ClusterExplosion { class ExplosionEffect { simulation = "particles"; - type = "CAS_GAS_Explosion_FX"; + type = "KAT_CAS_GAS_Explosion_FX"; position = "explosionPos"; lifeTime = 2; particleFSLoop = 1; }; class CAS_GAS_Effect { simulation = "particles"; - type = "CAS_GAS_FX"; + type = "KAT_CAS_GAS_FX"; position = "explosionPos"; lifeTime = 240; particleFSLoop = 1; }; class GAS_Script { simulation = "particles"; - type = "CAS_GAS_Explosion_FX_Script"; + type = "KAT_CAS_GAS_Explosion_FX_Script"; position = "explosionPos"; }; }; @@ -146,14 +146,14 @@ class KAT_GAS_ClusterExplosion { class KAT_CAS_R_HYDRA_Explosion { class CAS_R_GAS_Effect { simulation = "particles"; - type = "CAS_GAS_FX"; + type = "KAT_CAS_GAS_FX"; position = "explosionPos"; lifeTime = 240; particleFSLoop = 1; }; class R_GAS_Script { simulation = "particles"; - type = "CAS_GAS_Explosion_FX_Script"; + type = "KAT_CAS_GAS_Explosion_FX_Script"; position = "explosionPos"; }; }; diff --git a/addons/chemical/CfgGlasses.hpp b/addons/chemical/CfgGlasses.hpp index 24b7626a2..17e002c4b 100644 --- a/addons/chemical/CfgGlasses.hpp +++ b/addons/chemical/CfgGlasses.hpp @@ -1,4 +1,4 @@ -class cfgGlasses +class CfgGlasses { class G_RegulatorMask_F; class kat_mask_M50: G_RegulatorMask_F @@ -11,7 +11,7 @@ class cfgGlasses mass = 4; }; - + class kat_mask_M04: kat_mask_M50 { author = "Assaultboy"; @@ -19,4 +19,4 @@ class cfgGlasses model = QPATHTOF(models\kat_mask_m04.p3d); picture = QPATHTOF(ui\maskM04.paa); }; -}; \ No newline at end of file +}; diff --git a/addons/chemical/CfgMagazines.hpp b/addons/chemical/CfgMagazines.hpp index 4355d6b66..498ca3691 100644 --- a/addons/chemical/CfgMagazines.hpp +++ b/addons/chemical/CfgMagazines.hpp @@ -1,4 +1,4 @@ -class cfgMagazines +class CfgMagazines { class ACE_1Rnd_82mm_Mo_HE; class KAT_1Rnd_82mm_Mo_Type0: ACE_1Rnd_82mm_Mo_HE @@ -14,7 +14,7 @@ class cfgMagazines scope = 1; count = 5; }; - class KAT_1Rnd_82mm_Mo_TypeCS: ACE_1Rnd_82mm_Mo_HE + class KAT_1Rnd_82mm_Mo_TypeCS: ACE_1Rnd_82mm_Mo_HE { author="DiGii"; ammo="Sh_82mm_AMOS_TypeCS"; @@ -22,7 +22,7 @@ class cfgMagazines displayNameShort= CSTRING(CSGas_MFDNAME); displayName= CSTRING(CSGas_DisplayName); }; - class KAT_3Rnd_82mm_Mo_TypeCS_AI: KAT_1Rnd_82mm_Mo_TypeCS + class KAT_3Rnd_82mm_Mo_TypeCS_AI: KAT_1Rnd_82mm_Mo_TypeCS { scope = 1; count = 3; @@ -36,7 +36,7 @@ class cfgMagazines descriptionShort = CSTRING(M7A3_DcsShort); displayNameShort = CSTRING(M7A3_CSGrenade_ShortName); model = QPATHTOF(ui\m7a3.p3d); - picture = QPATHTOF(ui\KAT_m7a3_ca.paa); + picture = QPATHTOF(ui\KAT_m7a3_ca.paa); ammo = "KAT_G_M7A3"; mass = 4; }; @@ -69,7 +69,7 @@ class cfgMagazines pylonWeapon = "KAT_CAS_M43_Bomb"; }; - class KAT_CAS_M43_Mag_x2 : PylonRack_Bomb_GBU12_x2 + class KAT_CAS_M43_Mag_x2 : PylonRack_Bomb_GBU12_x2 { ammo = "KAT_CAS_M43_Ammo"; author = "DiGii"; @@ -82,7 +82,7 @@ class cfgMagazines mass = 200; pylonWeapon = "KAT_CAS_M43_Bomb"; }; - + class PylonRack_19Rnd_Rocket_Skyfire; class KAT_CAS_R_80mm_GAS_MAG: PylonRack_19Rnd_Rocket_Skyfire { ammo = "KAT_CAS_R_80mm_GAS_AMMO"; @@ -93,4 +93,4 @@ class cfgMagazines pylonWeapon = "KAT_CAS_R_80mm_GAS_POD"; hardpoints[] = {"RHS_HP_UPK23_KA52","RHS_HP_9m120_Mi28","RHS_HP_KH55SM_INT","RHS_HP_TU95MS6_INT","RHS_HP_FFAR_ARMY","RHS_HP_MELB","O_MISSILE_PYLON","O_SKYFIRE","B_MISSILE_PYLON","DAGR","DAR","B_SHIEKER","CUP_PylonPod_19Rnd_Rocket_FFAR_plane_M","CUP_NATO_HELO_ROCKETS","CUP_19Rnd_FFAR","B_AH_99_PYLON","CUP_SUPER_PYLON","CUP_32Rnd_S5","pook_RPOD","RHS_HP_FFAR_USMC", "RHS_HP_INGWE", "RHS_HP_MELB_R", "RHS_HP_MELB","RHS_HP_UB32","pook_HELI_BMB","pook_HELI_MISSILERACK"}; }; -}; \ No newline at end of file +}; diff --git a/addons/chemical/CfgSounds.hpp b/addons/chemical/CfgSounds.hpp index dfd199f19..8ce062af6 100644 --- a/addons/chemical/CfgSounds.hpp +++ b/addons/chemical/CfgSounds.hpp @@ -1,4 +1,15 @@ class CfgSounds { + class GVAR(cough_0) { + name = QGVAR(cough_0); + sound[] = + { + QPATHTOF(audio\cough_0.ogg), + 2, + 1, + 10 + }; + titles[] = {}; + }; class GVAR(cough_1) { name = QGVAR(cough_1); sound[] = @@ -10,6 +21,28 @@ class CfgSounds { }; titles[] = {}; }; + class GVAR(cough_2) { + name = QGVAR(cough_2); + sound[] = + { + QPATHTOF(audio\cough_2.ogg), + 2, + 1, + 10 + }; + titles[] = {}; + }; + class GVAR(cough_3) { + name = QGVAR(cough_3); + sound[] = + { + QPATHTOF(audio\cough_3.ogg), + 2, + 1, + 10 + }; + titles[] = {}; + }; class GVAR(mask_breath_1) { name = QGVAR(mask_breath_1); @@ -58,5 +91,70 @@ class CfgSounds { }; titles[] = {}; }; - + class GVAR(chemBaseChime) { + name = QGVAR(chemBaseChime); + sound[] = + { + QPATHTOF(audio\baseChime.ogg), + 2, + 1.0, + 5 + }; + titles[] = {}; + }; + class GVAR(chemSlowChime) { + name = QGVAR(chemSlowChime); + sound[] = + { + QPATHTOF(audio\slowChime.ogg), + 2, + 1.0, + 5 + }; + titles[] = {}; + }; + class GVAR(chemNormalChime) { + name = QGVAR(chemNormalChime); + sound[] = + { + QPATHTOF(audio\normalChime.ogg), + 2, + 1.0, + 5 + }; + titles[] = {}; + }; + class GVAR(chemFastChime) { + name = QGVAR(chemFastChime); + sound[] = + { + QPATHTOF(audio\fastChime.ogg), + 2, + 1.0, + 5 + }; + titles[] = {}; + }; + class GVAR(chemRapidChime) { + name = QGVAR(chemRapidChime); + sound[] = + { + QPATHTOF(audio\rapidChime.ogg), + 2, + 1.0, + 5 + }; + titles[] = {}; + }; + class GVAR(chemTone) { + name = QGVAR(chemTone); + sound[] = + { + QPATHTOF(audio\tone.ogg), + 2, + 1.0, + 5 + }; + titles[] = {}; + }; }; diff --git a/addons/chemical/CfgVehicles.hpp b/addons/chemical/CfgVehicles.hpp index 3dfc8842c..3c817c66d 100644 --- a/addons/chemical/CfgVehicles.hpp +++ b/addons/chemical/CfgVehicles.hpp @@ -6,7 +6,7 @@ class CfgVehicles { class KAT_CheckGasMaskDur { displayName = CSTRING(CheckGasMaskDurability); condition = QUOTE([_player] call FUNC(hasGasMaskOn)); - exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting"}; + exceptions[] = {"isNotSwimming"}; statement = QUOTE(_this call FUNC(checkGasMaskDur)); showDisabled = 0; icon = QPATHTOF(ui\Gasmask_icon.paa); @@ -14,24 +14,57 @@ class CfgVehicles { class KAT_ChangeGasMaskFilter { displayName = CSTRING(ChangeGasMaskFilter); condition = QUOTE([_player] call FUNC(canReplaceFilter)); - exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting"}; + exceptions[] = {"isNotSwimming"}; statement = QUOTE(_this call FUNC(changeGasMaskFilter)); showDisabled = 0; icon = QPATHTOF(ui\gasmaskfilter_ca.paa); }; - class KAT_MuteChemDetector { - displayName = CSTRING(ChemDetector_Mute); - condition = QUOTE([ARR_2(_player,true)] call FUNC(getChemDetectorState)); - statement = QUOTE(_player setVariable [ARR_3(QQGVAR(chemDetectorState),false,true)]); + class KAT_PutOnGasMask { + displayName = CSTRING(PutOnGasMask); + condition = QUOTE([_player] call FUNC(canPutOnGasMask)); + exceptions[] = {"isNotSwimming"}; + statement = QUOTE([_player] call FUNC(putOnGasMask)); showDisabled = 0; - icon = QPATHTOF(ui\ChemDetectorIcon.paa); + icon = QPATHTOF(ui\Gasmask_icon.paa); }; - class KAT_UnmuteChemDetector { - displayName = CSTRING(ChemDetector_Unmute); - condition = QUOTE([ARR_2(_player,false)] call FUNC(getChemDetectorState)); - statement = QUOTE(_player setVariable [ARR_3(QQGVAR(chemDetectorState),true,true)]); + class KAT_TakeOffGasMask { + displayName = CSTRING(TakeOffGasMask); + condition = QUOTE([_player] call FUNC(canTakeOffGasMask)); + exceptions[] = {"isNotSwimming"}; + statement = QUOTE([_player] call FUNC(takeOffGasMask)); showDisabled = 0; - icon = QPATHTOF(ui\ChemDetectorIcon.paa); + icon = QPATHTOF(ui\Gasmask_icon.paa); + }; + + class KAT_ChemicalDetector { + displayName = CSTRING(ChemicalDetector_Menu); + icon = QPATHTOF(ui\kat_chemicalDet_icon.paa); + exceptions[] = {"isNotSwimming"}; + + class KAT_ChemicalDetector_Enable { + displayName = CSTRING(EnableDetector); + condition = QUOTE(([_player] call FUNC(hasDetector)) && !(_player getVariable [ARR_2(QQGVAR(detectorEnabled),false)])); + exceptions[] = {"isNotSwimming"}; + statement = QUOTE([_player] call FUNC(enableChemDetector)); + showDisabled = 0; + icon = QPATHTOF(ui\kat_chemicalDet_icon.paa); + }; + class KAT_ChemicalDetector_SoundOn { + displayName = CSTRING(EnableDetectorSound); + condition = QUOTE(!(_player getVariable [ARR_2(QQGVAR(detectorSound),false)]) && ([_player] call FUNC(hasDetector))); + exceptions[] = {"isNotSwimming"}; + statement = QUOTE(_player setVariable [ARR_3(QQGVAR(detectorSound),true,true)]); + showDisabled = 0; + icon = QPATHTOF(ui\kat_chemicalDet_icon.paa); + }; + class KAT_ChemicalDetector_SoundOff { + displayName = CSTRING(DisableDetectorSound); + condition = QUOTE((_player getVariable [ARR_2(QQGVAR(detectorSound),false)]) && ([_player] call FUNC(hasDetector))); + exceptions[] = {"isNotSwimming"}; + statement = QUOTE(_player setVariable [ARR_3(QQGVAR(detectorSound),false,true)]); + showDisabled = 0; + icon = QPATHTOF(ui\kat_chemicalDet_icon.paa); + }; }; }; }; @@ -96,32 +129,25 @@ class CfgVehicles { function = QFUNC(gasmodule); isTriggerActivated = 0; functionPriority = 1; - isGlobal = 1; + isGlobal = 0; class Arguments: AttributesBase { - class Radius_Max + class Radius { displayName = CSTRING(UI_max_range); tooltip = CSTRING(GasModule_min_radius_dcs); typeName = "NUMBER"; defaultValue = 20; }; - class Radius_Min - { - displayName = CSTRING(UI_min_range); - tooltip = CSTRING(GasModule_max_radius_dcs); - typeName = "NUMBER"; - defaultValue = 10; - }; class GAS_Type { displayName = CSTRING(UI_gasType); typeName = "NUMBER"; class values { - class toxicgas { + class ToxicGas { name = CSTRING(LvL1_Gas); - value = 0; + value = 1; default = 1; }; /* class csgas { @@ -160,10 +186,11 @@ class CfgVehicles { curatorCanAttach = 1; displayName = CSTRING(GasModule_Displayname); category = QEGVAR(zeus,KAM); + function = QACEFUNC(common,dummy); curatorInfoType = QGVAR(kat_RscGasModul); isTriggerActivated = 0; functionPriority = 1; - isGlobal = 1; + isGlobal = 0; }; @@ -214,4 +241,11 @@ class CfgVehicles { ammo = "KAT_Gas_TripWireMine_Ammo"; displayName = CSTRING(TriWire_Gas_Name); }; + + + class Static; + class GVAR(logic): Static { + scope = 1; + displayName = ""; + }; }; diff --git a/addons/chemical/XEH_PREP.hpp b/addons/chemical/XEH_PREP.hpp index 6ec1136ba..417529772 100644 --- a/addons/chemical/XEH_PREP.hpp +++ b/addons/chemical/XEH_PREP.hpp @@ -1,39 +1,38 @@ -PREP(afterWait); PREP(AttributeRadius); PREP(breathing); PREP(canPutGasMask); +PREP(canPutOnGasMask); PREP(canReplaceFilter); +PREP(canTakeOffGasMask); PREP(CASCreateGas); PREP(changeGasMaskFilter); PREP(checkGasMaskDur); -PREP(chemDetector); -PREP(coughing); PREP(createSealAction); -PREP(createZone); PREP(csGrenade); PREP(displayGasMaskDur); +PREP(enableChemDetector); PREP(fullHealLocal); -PREP(gasAI); -PREP(gasCheck); -PREP(gasCheckLocal); +PREP(gasManagerPFH); PREP(gasmodule); PREP(GasTripEffect); -PREP(getChemDetectorState); PREP(getList); PREP(giveUnitGasMask); PREP(gui_updateBodyImage); PREP(gui_updateInjuryListGeneral); -PREP(handleCSGas); PREP(handleFired); PREP(handleGasMaskDur); PREP(handleRespawn); +PREP(hasDetector); PREP(hasGasmask); PREP(hasGasMaskON); PREP(hideChemDetector); PREP(init); PREP(initModule); +PREP(poison); +PREP(putOnGasMask); PREP(showChemDetector); PREP(spawnSmoke); +PREP(takeOffGasMask); PREP(throwGrenade); PREP(treatmentAdvanced_AtropineLocal); PREP(ui_gasModule); diff --git a/addons/chemical/XEH_postInit.sqf b/addons/chemical/XEH_postInit.sqf index 8d1202fb7..912450623 100644 --- a/addons/chemical/XEH_postInit.sqf +++ b/addons/chemical/XEH_postInit.sqf @@ -1,13 +1,15 @@ #include "script_component.hpp" //Events -[QGVAR(gasCheck), LINKFUNC(gasCheck)] call CBA_fnc_addEventHandler; -[QGVAR(gasPlayer), LINKFUNC(gasCheckLocal)] call CBA_fnc_addEventHandler; -[QGVAR(gasAI), LINKFUNC(gasAI)] call CBA_fnc_addEventHandler; -[QGVAR(afterWait), LINKFUNC(afterWait)] call CBA_fnc_addEventHandler; -[QGVAR(enteredZone), LINKFUNC(chemDetector)] call CBA_fnc_addEventHandler; -[QGVAR(createZoneGlobal), LINKFUNC(createZone)] call CBA_fnc_addEventHandler; -[QGVAR(createSealActionGlobal), LINKFUNC(createSealAction)] call CBA_fnc_addEventHandler; +["ace_glassesChanged", LINKFUNC(breathing)] call CBA_fnc_addEventHandler; +[QGVAR(poison), LINKFUNC(poison)] call CBA_fnc_addEventHandler; +[QGVAR(handleGasMaskDur), LINKFUNC(handleGasMaskDur)] call CBA_fnc_addEventHandler; +[QGVAR(addSealAction), LINKFUNC(createSealAction)] call CBA_fnc_addEventHandler; + +[QGVAR(playTone), { + params ["_unit", "_tone"]; + _unit say3D [_tone, 5]; +}] call CBA_fnc_addEventHandler; // ACE Events [QACEGVAR(medical_gui,updateInjuryListGeneral), LINKFUNC(gui_updateInjuryListGeneral)] call CBA_fnc_addEventHandler; @@ -27,19 +29,6 @@ KAT_ProjectileCache = ("([_x, 'KAT_projectile', 0] call BIS_fnc_returnConfigEntr ["ace_firedPlayerNonLocal", LINKFUNC(throwGrenade)] call CBA_fnc_addEventHandler; ["ace_firedNonPlayer", LINKFUNC(throwGrenade)] call CBA_fnc_addEventHandler; -if (hasInterface) then { - ppBlur_priority = 399; - [{ - ppBlur_priority = ppBlur_priority + 1; - ppBlur = ppEffectCreate ["DynamicBlur", ppBlur_priority]; - ppBlur != -1 - }, { - ppBlur ppEffectEnable false; - ppBlurAmount = 0; - ppBluring = false; - }] call CBA_fnc_waitUntilAndExecute; -}; - private _items = missionNamespace getVariable [QGVAR(availGasmask), "'G_AirPurifyingRespirator_01_F'"]; private _array = [_items, "CfgGlasses"] call FUNC(getList); missionNamespace setVariable [QGVAR(availGasmaskList), _array, true]; @@ -56,3 +45,79 @@ missionNamespace setVariable [QGVAR(availGasmaskList), _array, true]; true }, { false }, [24, [false, false, false]], false] call CBA_fnc_addKeybind; + +if (!isServer) exitWith {}; + +GVAR(gasSources) = createHashMap; + +[QGVAR(addGasSource), { + params [ + ["_source", objNull, [objNull, []]], + ["_radius", 0, [0]], + ["_gasLevel", 0, [0]], + ["_key", ""], + ["_condition", {true}, [{}]], + ["_conditionArgs", []], + ["_isSealable", false] + ]; + + private _isObject = _source isEqualType objNull; + + // Check if the source is valid + if !(_isObject || {_source isEqualTypeParams [0, 0, 0]}) exitWith {}; + + if (_isObject && {isNull _source}) exitWith {}; + if (_radius == 0) exitWith {}; + if (_key isEqualTo "") exitWith {}; // key can be many types + + // hashValue supports more types than hashmaps do by default, but not all (e.g. locations) + private _hashedKey = hashValue _key; + + if (isNil "_hashedKey") exitWith { + ERROR_2("Unsupported key type used: %1 - %2",_key,typeName _key); + }; + + // If a position is passed, create a static object at said position + private _sourcePos = if (_isObject) then { + getPosATL _source + } else { + ASLToATL _source + }; + + private _gasLogic = createVehicle [QGVAR(logic), _sourcePos, [], 0, "CAN_COLLIDE"]; + + // If an object was passed, attach logic to the object + if (_isObject) then { + _gasLogic attachTo [_source]; + }; + + // To avoid issues, remove existing entries first before overwriting + if (_hashedKey in GVAR(gasSources)) then { + [QGVAR(removeGasSource), _key] call CBA_fnc_localEvent; + }; + + if (_isSealable) then { + private _jipID = [QGVAR(addSealAction), [_source, _gasLogic, _key]] call CBA_fnc_globalEventJIP; + [_jipID, _source] call CBA_fnc_removeGlobalEventJIP; + _source setVariable [QGVAR(sealable), true, true]; + }; + + GVAR(gasSources) set [_hashedKey, [_gasLogic, _radius, _gasLevel, _condition, _conditionArgs]]; +}] call CBA_fnc_addEventHandler; + +[QGVAR(removeGasSource), { + params ["_key"]; + private _hashedKey = hashValue _key; + + if (isNil "_hashedKey") exitWith { + ERROR_2("Unsupported key type used: %1 - %2",_key,typeName _key); + }; + + (GVAR(gasSources) deleteAt _hashedKey) params [["_gasLogic", objNull]]; + + detach _gasLogic; + deleteVehicle _gasLogic; +}] call CBA_fnc_addEventHandler; + +[LINKFUNC(gasManagerPFH), GAS_MANAGER_PFH_DELAY, []] call CBA_fnc_addPerFrameHandler; + diff --git a/addons/chemical/XEH_preInit.sqf b/addons/chemical/XEH_preInit.sqf index 065630bd0..fbcb62f72 100644 --- a/addons/chemical/XEH_preInit.sqf +++ b/addons/chemical/XEH_preInit.sqf @@ -22,7 +22,6 @@ PREP_RECOMPILE_END; true ] call CBA_Settings_fnc_init; - [ QGVAR(gasmask_durability), "TIME", @@ -32,24 +31,47 @@ PREP_RECOMPILE_END; true ] call CBA_Settings_fnc_init; +// Sets sound volume of gas mask breathing +[ + QGVAR(gasMaskSoundVolume), + "SLIDER", + [LLSTRING(SETTING_gasMaskSoundVolume), LLSTRING(SETTING_gasMaskSoundVolume_DESC)], + CBA_SETTINGS_CHEM, + [0, 2, 1, 1], + 2, + { + player setVariable [QGVAR(gasMaskSoundVolume), _this, true]; + }, + false +] call CBA_Settings_fnc_init; + +// Chance of weapon drop by tear gas +[ + QGVAR(tearGasDropChance), + "SLIDER", + [LLSTRING(SETTING_dropWeaponChance), LLSTRING(SETTING_dropWeaponChance_DESC)], + CBA_SETTINGS_CHEM, + [0, 1, 0, 2, true], + true +] call CBA_Settings_fnc_init; + +// Infection time [ QGVAR(infectionTime), "TIME", - [LLSTRING(SETTING_infection_time),LLSTRING(SETTING_infection_time_disc)], + [LLSTRING(SETTING_infectionTime), LLSTRING(SETTING_infectionTime_DESC)], CBA_SETTINGS_CHEM, - [1, 600, 60], + [0, 3600, 60], true ] call CBA_Settings_fnc_init; +// Shows poisioning image [ - QGVAR(affectAI), + QGVAR(showPoisoning), "CHECKBOX", - [LLSTRING(SETTING_affectAI),LLSTRING(SETTING_affectAI_disc)], + [LLSTRING(SETTING_showPoisoning), LLSTRING(SETTING_showPoisoning_DESC)], CBA_SETTINGS_CHEM, - false, - true, - {}, + [true], true ] call CBA_Settings_fnc_init; - ADDON = true; diff --git a/addons/chemical/audio/baseChime.ogg b/addons/chemical/audio/baseChime.ogg new file mode 100644 index 000000000..1b76678a7 Binary files /dev/null and b/addons/chemical/audio/baseChime.ogg differ diff --git a/addons/chemical/audio/cough_0.ogg b/addons/chemical/audio/cough_0.ogg new file mode 100644 index 000000000..2a38c91f0 Binary files /dev/null and b/addons/chemical/audio/cough_0.ogg differ diff --git a/addons/chemical/audio/cough_1.ogg b/addons/chemical/audio/cough_1.ogg index 2a38c91f0..a061cbe78 100644 Binary files a/addons/chemical/audio/cough_1.ogg and b/addons/chemical/audio/cough_1.ogg differ diff --git a/addons/chemical/audio/cough_2.ogg b/addons/chemical/audio/cough_2.ogg new file mode 100644 index 000000000..c237c6746 Binary files /dev/null and b/addons/chemical/audio/cough_2.ogg differ diff --git a/addons/chemical/audio/cough_3.ogg b/addons/chemical/audio/cough_3.ogg new file mode 100644 index 000000000..f04a4bc7f Binary files /dev/null and b/addons/chemical/audio/cough_3.ogg differ diff --git a/addons/chemical/audio/fastChime.ogg b/addons/chemical/audio/fastChime.ogg new file mode 100644 index 000000000..a527d8230 Binary files /dev/null and b/addons/chemical/audio/fastChime.ogg differ diff --git a/addons/chemical/audio/normalChime.ogg b/addons/chemical/audio/normalChime.ogg new file mode 100644 index 000000000..ad09cbe5e Binary files /dev/null and b/addons/chemical/audio/normalChime.ogg differ diff --git a/addons/chemical/audio/rapidChime.ogg b/addons/chemical/audio/rapidChime.ogg new file mode 100644 index 000000000..a5ceaf32d Binary files /dev/null and b/addons/chemical/audio/rapidChime.ogg differ diff --git a/addons/chemical/audio/slowChime.ogg b/addons/chemical/audio/slowChime.ogg new file mode 100644 index 000000000..c2ce41335 Binary files /dev/null and b/addons/chemical/audio/slowChime.ogg differ diff --git a/addons/chemical/audio/tone.ogg b/addons/chemical/audio/tone.ogg new file mode 100644 index 000000000..b5c644575 Binary files /dev/null and b/addons/chemical/audio/tone.ogg differ diff --git a/addons/chemical/config.cpp b/addons/chemical/config.cpp index a8c873fb0..aac13d177 100644 --- a/addons/chemical/config.cpp +++ b/addons/chemical/config.cpp @@ -20,7 +20,7 @@ class CfgPatches { }; ammo[] = { "KAT_Gas_TripWireMine_Ammo", - "KAT_GASTripEffect", + "KAT_TripWireGasEffect", "KAT_GASTrip_SmokeEffect", "KAT_CAS_M43_Ammo", "KAT_CAS_M43_Ammo_sub", diff --git a/addons/chemical/functions/fnc_AttributeRadius.sqf b/addons/chemical/functions/fnc_AttributeRadius.sqf index b7d2f8f3e..9accdfccc 100644 --- a/addons/chemical/functions/fnc_AttributeRadius.sqf +++ b/addons/chemical/functions/fnc_AttributeRadius.sqf @@ -27,7 +27,6 @@ private _placeText = _display displayCtrl 1616; if !(isNull attachedTo _logic) then { _sealCheckBox ctrlShow true; _sealText ctrlShow true; - _placeText ctrlSetText LLSTRING(GasModule_createContaminatedObject); } else { _sealCheckBox ctrlShow false; @@ -37,18 +36,14 @@ if !(isNull attachedTo _logic) then { private _gasTypeCombo = _display displayCtrl 1615; private _maxEdit = _control controlsGroupCtrl 1611; -private _minEdit = _control controlsGroupCtrl 1612; _maxEdit ctrlSetText "100"; -_minEdit ctrlSetText "50"; private _fnc_onKeyUp = { params ["_display"]; private _maxEdit = _display displayCtrl 1611; - private _minEdit = _display displayCtrl 1612; private _maxradius = parseNumber (ctrlText _maxEdit); - private _minradius = parseNumber (ctrlText _minEdit); // Handle invalid radius (non-numerical input) if (_maxradius == 0) then { @@ -57,21 +52,7 @@ private _fnc_onKeyUp = { } else { _maxEdit ctrlSetTooltip ""; _maxEdit ctrlSetTextColor [1,1,1,1]; - _display setVariable [QGVAR(ui_radiusMax),_maxradius]; - }; - - if (_minradius == 0) then { - _minEdit ctrlSetTooltip (ACELSTRING(Zeus,AttributeRadiusInvalid)); - _minEdit ctrlSetTextColor [1,0,0,1]; - } else { - if(_minradius > _maxradius) then { - _minEdit ctrlSetTooltip (ACELSTRING(Zeus,AttributeRadiusInvalid)); - _minEdit ctrlSetTextColor [1,0,0,1]; - } else { - _minEdit ctrlSetTooltip ""; - _minEdit ctrlSetTextColor [1,1,1,1]; - _display setVariable [QGVAR(ui_radiusMin),_minradius]; - }; + _display setVariable [QGVAR(ui_radius),_maxradius]; }; }; @@ -86,7 +67,7 @@ private _fnc_onLBSelChange = { params ["_gasTypeCombo"]; _display = ctrlParent _gasTypeCombo; private _gastype = lbCurSel _gasTypeCombo; - _display setVariable [QGVAR(ui_gastype),_gastype]; + _display setVariable [QGVAR(ui_gastype), _gastype]; }; [_display] call _fnc_onKeyUp; diff --git a/addons/chemical/functions/fnc_CASCreateGas.sqf b/addons/chemical/functions/fnc_CASCreateGas.sqf index e9ac1fca8..903c5845b 100644 --- a/addons/chemical/functions/fnc_CASCreateGas.sqf +++ b/addons/chemical/functions/fnc_CASCreateGas.sqf @@ -18,4 +18,21 @@ params ["_posX", "_posY", "_posZ"]; -[QGVAR(createZoneGlobal), [[_posX, _posY, _posZ], 240, 15, 0]] call CBA_fnc_globalEventJIP; +private _projectile = QGVAR(logic) createVehicle [_posX,_posY,_posZ]; + +if (isServer) then { + private _radius = 15; + private _timeToLive = 240; + private _gasLevel = 1; + + [QGVAR(addGasSource), [_projectile, _radius, _gasLevel, _projectile, { + params ["_endTime", "_projectile"]; + + // If projectile no longer exists, exit + if (isNull _projectile) exitWith { + false // return + }; + + CBA_missionTime < _endTime // return + }, [CBA_missionTime + _timeToLive, _projectile]]] call CBA_fnc_serverEvent; +}; diff --git a/addons/chemical/functions/fnc_GasTripEffect.sqf b/addons/chemical/functions/fnc_GasTripEffect.sqf index 0a3a4ea80..0afe374f9 100644 --- a/addons/chemical/functions/fnc_GasTripEffect.sqf +++ b/addons/chemical/functions/fnc_GasTripEffect.sqf @@ -17,4 +17,4 @@ * Cant be called manualy! */ -[FUNC(spawnSmoke), _this] call CBA_fnc_directcall; +[FUNC(spawnSmoke), _this] call CBA_fnc_directCall; diff --git a/addons/chemical/functions/fnc_afterWait.sqf b/addons/chemical/functions/fnc_afterWait.sqf deleted file mode 100644 index a3fe41732..000000000 --- a/addons/chemical/functions/fnc_afterWait.sqf +++ /dev/null @@ -1,95 +0,0 @@ -#include "..\script_component.hpp" -/* -* Author: DiGii -* This cant be called manualy! -* Handles the Gas effect for the player -* -* Arguments: -* 0: Unit -* 1: Module -* 2: Gastype -* 3: Max_radius -* -* Return Value: -* NONE -* -* Example: -* [player, logic, 0, 50] call kat_chemical_fnc_afterWait; -* -* Public: No -*/ - -params ["_unit", "_logic", "_gastype", "_radius_max"]; - -if (!isDamageAllowed _unit) exitWith { - [_unit] call FUNC(fullHealLocal); -}; - -if ((goggles _unit) in (missionNamespace getVariable [QGVAR(availGasmaskList), []])) then { - private _isinGas = true; - [ - { - params ["_args", "_pfhHandler"]; - _args params["_unit", "_logic", "_gastype", "_radius_max", "_isinGas"]; - - if !(_isinGas) exitWith { - [_pfhHandler] call CBA_fnc_removePerFrameHandler; - }; - - private _timeleft = _unit getVariable [QGVAR(gasmask_durability), 10]; - _pos = _logic getVariable [QGVAR(gas_position), [0, 0, 0]]; - if (_unit distance _pos > _radius_max || !(_logic getVariable[QGVAR(gas_active), false]) || isNull _logic) exitWith { - _unit setVariable [QGVAR(enteredPoison), false, true]; - _isinGas = false; - }; - - if !((goggles _unit) in (missionNamespace getVariable [QGVAR(availGasmaskList), []]) && _timeleft > 0) then { - _unit setVariable [QGVAR(poisonType), _gastype, true]; - switch (_gastype) do { - case 1: { - _unit setVariable [QGVAR(CS), true, true]; - [_unit, _logic, _radius_max] call FUNC(handleCSGas); - }; - case 0: { - _unit setVariable [QGVAR(airPoisoning), true, true]; - }; - }; - _isinGas = false; - }; - - if (_timeleft <= 0 && _unit getVariable [QGVAR(enteredPoison), false]) then { - _unit setVariable [QGVAR(poisonType), _gastype, true]; - switch (_gastype) do { - case 1: { - _unit setVariable [QGVAR(CS), true, true]; - [_unit, _logic, _radius_max] call FUNC(handleCSGas); - }; - case 0: { - _unit setVariable [QGVAR(airPoisoning), true, true]; - }; - }; - _isinGas = false; - }; - - if (!(_unit getVariable [QGVAR(enteredPoison), false]) || !(_logic getVariable [QGVAR(gas_active), false])) then { - _isinGas = false; - _unit setVariable [QGVAR(enteredPoison), false]; - }; - }, - 1, - [_unit, _logic, _gastype, _radius_max, _isinGas] - ] call CBA_fnc_addPerFrameHandler; -} else { - if (_unit getVariable [QGVAR(enteredPoison), false]) then { - _unit setVariable [QGVAR(poisonType), _gastype, true]; - switch (_gastype) do { - case 1: { - _unit setVariable [QGVAR(CS), true, true]; - [_unit, _logic, _radius_max] call FUNC(handleCSGas); - }; - case 0: { - _unit setVariable [QGVAR(airPoisoning), true, true]; - }; - }; - }; -}; diff --git a/addons/chemical/functions/fnc_breathing.sqf b/addons/chemical/functions/fnc_breathing.sqf index f4ab4b46d..60c7150c8 100644 --- a/addons/chemical/functions/fnc_breathing.sqf +++ b/addons/chemical/functions/fnc_breathing.sqf @@ -2,47 +2,53 @@ /* * Author: DiGii * +* Handles the breathing sound for gasMasks +* * Arguments: * 0: Unit +* 1: Glasses Class * * Return Value: * NONE * * Example: -* [player] call kat_chemical_fnc_breathing; +* [player, "kat_mask_M50"] call kat_chemical_fnc_breathing; * * Public: No * -* Handles the breathing sound for gasMasks */ -params ["_unit"]; +params ["_unit", "_glassesClass"]; + +if !(_glassesClass in (missionNamespace getVariable [QGVAR(availGasmaskList), []])) exitWith {}; +GVAR(soundPlaying) = false; [ { - params ["_unit"]; - (goggles _unit) in (missionNamespace getVariable [QGVAR(availGasmaskList), []]) - }, - { - params ["_unit"]; - [ - { - params["_args", "_handler"]; - _args params ["_unit"]; - if (!(goggles _unit in (missionNamespace getVariable [QGVAR(availGasmaskList), []])) || !(alive _unit) || _unit getVariable [QACEGVAR(medical,heartrate), 80] <= 0) then { - [_handler] call CBA_fnc_removePerFrameHandler; - [_unit] call FUNC(breathing); + params["_args", "_handler"]; + _args params ["_unit", "_volume"]; + if (!(goggles _unit in (missionNamespace getVariable [QGVAR(availGasmaskList), []])) || !(alive _unit) || (_unit getVariable [QACEGVAR(medical,inCardiacArrest), false])) then { + [_handler] call CBA_fnc_removePerFrameHandler; + } else { + if (!GVAR(soundPlaying)) then { + if ((GET_PAIN_PERCEIVED(_unit) >= 0.4) || (_unit getVariable [QACEGVAR(medical,heartrate), 80] >= 105)) then { + playSoundUI [QPATHTOF(audio\heavyBreath.ogg), GVAR(gasMaskSoundVolume), 1]; + GVAR(soundPlaying) = true; } else { - if (GET_PAIN_PERCEIVED(_unit) >= 0.4) || (_unit getVariable[QACEGVAR(medical,heartrate), 80] >= 105) then { - _unit say3D QGVAR(mask_breath_heavy); + if (round random 1 >= 0.5) then { + playSoundUI [QPATHTOF(audio\breath1.ogg), GVAR(gasMaskSoundVolume), 1]; + GVAR(soundPlaying) = true; } else { - private _random = selectRandom[QGVAR(mask_breath_1), QGVAR(mask_breath_2)]; - _unit say3D _random; + playSoundUI [QPATHTOF(audio\breath2.ogg), GVAR(gasMaskSoundVolume), 1]; + GVAR(soundPlaying) = true; }; }; - }, - 5, - [_unit] - ] call CBA_fnc_addPerFrameHandler; + [{ + GVAR(soundPlaying) = false; + }, [], 4] call CBA_fnc_waitAndExecute; + }; + }; }, + 0, [_unit] -] call CBA_fnc_waitUntilAndExecute; +] call CBA_fnc_addPerFrameHandler; + diff --git a/addons/chemical/functions/fnc_canPutOnGasMask.sqf b/addons/chemical/functions/fnc_canPutOnGasMask.sqf new file mode 100644 index 000000000..5688a31de --- /dev/null +++ b/addons/chemical/functions/fnc_canPutOnGasMask.sqf @@ -0,0 +1,6 @@ +#include "..\script_component.hpp" + +params ["_player"]; + +(((_player call ACEFUNC(common,uniqueItems)) findAny GVAR(availGasmaskList)) != -1) && +(!((goggles _player) in GVAR(availGasmaskList))) diff --git a/addons/chemical/functions/fnc_canTakeOffGasMask.sqf b/addons/chemical/functions/fnc_canTakeOffGasMask.sqf new file mode 100644 index 000000000..67e9e48b4 --- /dev/null +++ b/addons/chemical/functions/fnc_canTakeOffGasMask.sqf @@ -0,0 +1,5 @@ +#include "..\script_component.hpp" + +params ["_player"]; + +((goggles _player) in GVAR(availGasmaskList)) diff --git a/addons/chemical/functions/fnc_changeGasMaskFilter.sqf b/addons/chemical/functions/fnc_changeGasMaskFilter.sqf index 40e73a42c..7ea103422 100644 --- a/addons/chemical/functions/fnc_changeGasMaskFilter.sqf +++ b/addons/chemical/functions/fnc_changeGasMaskFilter.sqf @@ -19,6 +19,4 @@ params ["_target"]; [_target, "AinvPknlMstpSlayWlnrDnon_medicOther"] call ACEFUNC(common,doAnimation); _target removeItem "kat_gasmaskFilter"; -_target setVariable [QGVAR(gasmask_durability),10,true]; - -_target setVariable [QGVAR(gasmask_durability_reset), true, true]; +_target setVariable [QGVAR(gasmask_durability), 10, true]; diff --git a/addons/chemical/functions/fnc_chemDetector.sqf b/addons/chemical/functions/fnc_chemDetector.sqf deleted file mode 100644 index 64d37996d..000000000 --- a/addons/chemical/functions/fnc_chemDetector.sqf +++ /dev/null @@ -1,60 +0,0 @@ -#include "..\script_component.hpp" -/* - * Author: DiGii - * - * Arguments: - * 0: Unit - * - * Return Value: - * NONE - * - * Example: - * [player] call kat_chemical_fnc_chemDetector; - * - * Public: No -*/ -params ["_unit"]; - - -[ -{ - params["_args", "_pfhHandler"]; - _args params ["_unit"]; - - "KAT_CHEM_DETECTOR" cutRsc ["RscWeaponChemicalDetector", "PLAIN", 1, false]; - private _ui = GETUVAR(RscWeaponChemicalDetector,displayNull); - private _obj = _ui displayCtrl 101; - - if ("ChemicalDetector_01_watch_F" in (assignedItems _unit)) then - { - private _percent = _unit getVariable [QGVAR(gasPercentage),0]; - private _thread = parseNumber (_percent toFixed 1); - if (_thread < 0) then { _thread = 0}; - if (_thread > 1) then { _thread = 1}; - _obj ctrlAnimateModel ["Threat_Level_Source", _thread, true]; - }; - - if (!(_unit getVariable[QGVAR(enteredPoison),false])) exitWith { - - _obj ctrlAnimateModel ["Threat_Level_Source", 0, true]; - - [_pfhHandler] call CBA_fnc_removePerFrameHandler; - }; -}, -1, [_unit]] call CBA_fnc_addPerFramehandler; - -[ -{ - params["_args", "_pfhHandler"]; - _args params ["_unit"]; - - if (_unit getVariable [QGVAR(chemDetectorState), false] && _unit getVariable [QGVAR(gasPercentage), 0] >= 0.1 && "ChemicalDetector_01_watch_F" in (assignedItems _unit)) then { - playSound3D [QPATHTOF(audio\chemDetector.ogg), _unit, false, getPosASL _unit, 4, 1, 10]; - }; - - if (!(_unit getVariable[QGVAR(enteredPoison),false])) exitWith { - [_pfhHandler] call CBA_fnc_removePerFrameHandler; - }; - -}, -6, [_unit]] call CBA_fnc_addPerFramehandler; diff --git a/addons/chemical/functions/fnc_coughing.sqf b/addons/chemical/functions/fnc_coughing.sqf deleted file mode 100644 index a841b8a36..000000000 --- a/addons/chemical/functions/fnc_coughing.sqf +++ /dev/null @@ -1,69 +0,0 @@ -#include "..\script_component.hpp" -/* - * Author: DiGii - * - * Arguments: - * 0: Unit - * - * Return Value: - * NONE - * - * Example: - * [player] call kat_chemical_fnc_coughing; - * - * Public: No -*/ -params ["_unit"]; - -[ - { - params["_unit"]; - _unit getVariable [QGVAR(airPoisoning), false] - }, - { - params["_unit"]; - private _lastcought = CBA_missionTime; - [ - { - params ["_args", "_pfhID"]; - _args params ["_unit", "_lastcought"]; - if (_unit getVariable ["ACE_isUnconscious", false] || !(alive _unit) || !(_unit getVariable [QGVAR(airPoisoning), false])) exitWith { - [_pfhID] call CBA_fnc_removePerFrameHandler; - [_unit] call FUNC(coughing); - }; - private _nextcought = random [20,50,80]; - [ - { - params["_unit","_lastcought","_nextcought"]; - (CBA_missionTime - (_unit getVariable [QGVAR(lastCought), 0])) > _nextcought - }, - { - params["_unit"]; - if (_unit getVariable [QGVAR(airPoisoning),false]) then { - _unit say3D QGVAR(cough_1); - addCamShake [3, 4, 0]; - - _unit setVariable [QGVAR(lastCought), CBA_missionTime, true]; - - private _effect = ppEffectCreate ["ChromAberration",2005]; - KAT_PAIN_EFFECT = _effect; - _unit setVariable [QGVAR(painEffect), KAT_PAIN_EFFECT, true]; - KAT_PAIN_EFFECT ppEffectAdjust [0, 0, false]; - KAT_PAIN_EFFECT ppEffectCommit 0; - KAT_PAIN_EFFECT ppEffectEnable true; - private _intensity = linearConversion [0, 1, 0.5, 0, 0.06, true]; - private _initialAdjust = [_intensity, _intensity, true]; - private _delayedAdjust = [_intensity * 0.15, _intensity * 0.15, true]; - KAT_PAIN_EFFECT ppEffectAdjust _initialAdjust; - KAT_PAIN_EFFECT ppEffectCommit 0.3; - - [{ - params ["_adjust"]; - KAT_PAIN_EFFECT ppEffectAdjust _adjust; - KAT_PAIN_EFFECT ppEffectCommit 0.7; - }, [_delayedAdjust], 3] call CBA_fnc_waitAndExecute; - }; - }, - [_unit,_lastcought,_nextcought]] call CBA_fnc_waitUntilAndExecute; - }, 1, [_unit, _lastcought]] call CBA_fnc_addPerFrameHandler; - }, [_unit]] call CBA_fnc_waitUntilAndExecute; diff --git a/addons/chemical/functions/fnc_createSealAction.sqf b/addons/chemical/functions/fnc_createSealAction.sqf index f7df5adb5..a7451dfed 100644 --- a/addons/chemical/functions/fnc_createSealAction.sqf +++ b/addons/chemical/functions/fnc_createSealAction.sqf @@ -1,6 +1,6 @@ #include "..\script_component.hpp" /* - * Author: DiGii + * Author: DiGii, MiszczuZPolski * * Arguments: * 0: Target @@ -13,7 +13,9 @@ * * Public: No */ -params ["_target", "_logic"]; +params ["_target", "_logic", "_key"]; + +[_target, 0, ["ACE_MainActions", QGVAR(sealLeak)]] call ACEFUNC(interact_menu,removeActionFromObject); private _action = [ QGVAR(sealLeak), @@ -21,20 +23,21 @@ private _action = [ "", { params ["_target", "_player", "_params"]; - _params params ["_logic"]; + _params params ["_key"]; [_player, "Acts_carFixingWheel"] call ACEFUNC(common,doAnimation); //add time to addon options [ - 20, - [_target,_player, _logic], + 5, + [_target, _player, _key], { - params["_args"]; - _args params ["_target","_player", "_logic"]; - _logic setVariable [QGVAR(gas_active), false, true]; - [_target, 0, ["ACE_MainActions", QGVAR(sealLeak)]] call ACEFUNC(interact_menu,removeActionFromObject); + params ["_args"]; + _args params ["_target","_player", "_key"]; [_player, "kat_sealant"] call ACEFUNC(common,useItem); + [QGVAR(removeGasSource), _key] call CBA_fnc_serverEvent; + _target setVariable [QGVAR(sealable), false, true]; + [_target, 0, ["ACE_MainActions", QGVAR(sealLeak)]] call ACEFUNC(interact_menu,removeActionFromObject); }, { params["_args"]; @@ -47,13 +50,18 @@ private _action = [ ] call ace_common_fnc_progressBar; }, { - params["_target","_player"]; + params ["_target","_player"]; - [_player, _target] call ACEFUNC(common,canInteractWith); - [_player, _player, ["kat_sealant"]] call ACEFUNC(medical_treatment,hasItem); + ([_player, _target] call ACEFUNC(common,canInteractWith)) && + ([_player, _player, ["kat_sealant"]] call ACEFUNC(medical_treatment,hasItem)) && + (_target getVariable [QGVAR(sealable), false]) }, {}, - [_logic] + [_key] ] call ACEFUNC(interact_menu,createAction); + [_target, 0, ["ACE_MainActions"], _action] call ACEFUNC(interact_menu,addActionToObject); + + + diff --git a/addons/chemical/functions/fnc_createZone.sqf b/addons/chemical/functions/fnc_createZone.sqf deleted file mode 100644 index bb62c4bbd..000000000 --- a/addons/chemical/functions/fnc_createZone.sqf +++ /dev/null @@ -1,36 +0,0 @@ -#include "..\script_component.hpp" -/* - * Author: DiGii - * - * Arguments: - * 0: Position (position) - * 1: Lifetime (number) - * 2: Radius (number) - * 3: GasLevel (int of gas) - * - * Return Value: - * NONE - * - * Example: - * [pos player, 60, 100, 0] call kat_chemical_fnc_createZone; - * - * Public: No - * -*/ -params ["_position", "_lifetime", "_radius", "_gasType"]; - -private _logic = "ACE_LogicDummy" createVehicle _position; - -[_logic, _position, _radius, 0, _gasType] call FUNC(gasCheck); -private _currentTime = CBA_missionTime; - -[{ - params ["_logic","_lifetime","_currentTime"]; - - (CBA_missionTime - (_currentTime)) > _lifetime -}, -{ - params ["_logic"]; - _logic setVariable [QGVAR(gas_active), false, true]; - deleteVehicle _logic; -}, [_logic, _lifetime, _currentTime]] call CBA_fnc_waitUntilAndExecute; diff --git a/addons/chemical/functions/fnc_csGrenade.sqf b/addons/chemical/functions/fnc_csGrenade.sqf index 88478a636..55657d0cb 100644 --- a/addons/chemical/functions/fnc_csGrenade.sqf +++ b/addons/chemical/functions/fnc_csGrenade.sqf @@ -1,6 +1,6 @@ #include "..\script_component.hpp" /* - * Author: DiGii + * Author: DiGii, MiszczuPolski * Spawns Patricles for the Gas zone * * Arguments: @@ -39,25 +39,12 @@ params ["_projectile", "_timeToLive", "_center"]; private _position = position _projectile; -[QGVAR(createZoneGlobal), [_position, _timeToLive, 6, 1]] call CBA_fnc_globalEventJIP; - -// --- AI -private _nearLocalEnemies = []; - -{ - { - if (local _x && {[_center, side _x] call BIS_fnc_sideIsEnemy}) then { // WE WANT THE OBJECTS SIDE HERE! - _nearLocalEnemies pushBackUnique _x; - }; - } forEach crew _x; -} forEach (_position nearObjects ALERT_NEAR_ENEMY_RANGE); - +// Alert nearby hostile AI { - if (behaviour _x in ["SAFE", "AWARE"]) then { + if (local _x && {[_center, side group _x] call BIS_fnc_sideIsEnemy} && {behaviour _x in ["SAFE", "AWARE"]}) then { // WE WANT THE OBJECT'S SIDE HERE! _x setBehaviour "COMBAT"; }; -} forEach _nearLocalEnemies; - +} forEach ([_position, ALERT_NEAR_ENEMY_RANGE, ALERT_NEAR_ENEMY_RANGE, 0, false] nearEntities [["CAManBase"], false, true, true]); private _particleSource = "#particlesource" createVehicleLocal _position; @@ -87,4 +74,23 @@ _particleSource setParticleParams [ _particleSource setParticleRandom [PARTICLE_SMOKE_LIFE_TIME / 2, [0.5 * EFFECT_SIZE, 0.5 * EFFECT_SIZE, 0.2 * EFFECT_SIZE], [0.3,0.3,0.5], 1, 0, [0,0,0,0.06], 0, 0]; _particleSource setDropInterval (1 / PARTICLE_SMOKE_DENSITY); +if (isServer) then { + private _radius = 6; + private _gasLevel = 0; + + [QGVAR(addGasSource), [_projectile, _radius, _gasLevel, _projectile, { + params ["_endTime", "_projectile"]; + + // If incendiary no longer exists, exit + if (isNull _projectile) exitWith { + false // return + }; + + // Need to get the position every time, as grenade might have been moved + private _position = position _projectile; + + CBA_missionTime < _endTime // return + }, [CBA_missionTime + _timeToLive, _projectile]]] call CBA_fnc_serverEvent; +}; + [{deleteVehicle _this}, _particleSource, _timeToLive] call CBA_fnc_waitAndExecute; diff --git a/addons/chemical/functions/fnc_enableChemDetector.sqf b/addons/chemical/functions/fnc_enableChemDetector.sqf new file mode 100644 index 000000000..6747b569d --- /dev/null +++ b/addons/chemical/functions/fnc_enableChemDetector.sqf @@ -0,0 +1,50 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Enables the audio on the Chemical Detector. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * call kat_chemical_enableChemDetector + * + * Public: No + */ + +params ["_unit"]; + +_unit setVariable [QGVAR(detectorEnabled), true, true]; + +[{ + params ["_args", "_idPFH"]; + _args params ["_unit"]; + + private _alive = alive _unit; + + if (!_alive) exitWith { + [_idPFH] call CBA_fnc_removePerFrameHandler; + }; + + if !("KAT_ChemicalDetector" in assignedItems _unit) exitWith { + _unit setVariable [QGVAR(detectorEnabled), false, true]; + _pfhID call CBA_fnc_removePerFrameHandler; + }; + + private _detectorSound = _unit getVariable [QGVAR(detectorSound), false]; + private _intensity = _unit getVariable [QGVAR(areaIntensity), 0]; + + if (_detectorSound) then { + switch true do { + case (_intensity > 0.9): { [QGVAR(playTone), [_unit, QGVAR(chemTone)], _unit] call CBA_fnc_targetEvent; }; + case (_intensity > 0.7): { [QGVAR(playTone), [_unit, QGVAR(chemRapidChime)], _unit] call CBA_fnc_targetEvent; }; + case (_intensity > 0.5): { [QGVAR(playTone), [_unit, QGVAR(chemFastChime)], _unit] call CBA_fnc_targetEvent; }; + case (_intensity > 0.3): { [QGVAR(playTone), [_unit, QGVAR(chemNormalChime)], _unit] call CBA_fnc_targetEvent; }; + case (_intensity > 0): { [QGVAR(playTone), [_unit, QGVAR(chemSlowChime)], _unit] call CBA_fnc_targetEvent; }; + default { [QGVAR(playTone), [_unit, QGVAR(chemBaseChime)], _unit] call CBA_fnc_targetEvent; }; + }; + }; +}, 5, [_unit]] call CBA_fnc_addPerFrameHandler; \ No newline at end of file diff --git a/addons/chemical/functions/fnc_fullHealLocal.sqf b/addons/chemical/functions/fnc_fullHealLocal.sqf index e0cd29a97..a5f155169 100644 --- a/addons/chemical/functions/fnc_fullHealLocal.sqf +++ b/addons/chemical/functions/fnc_fullHealLocal.sqf @@ -18,12 +18,9 @@ params ["_patient"]; TRACE_1("fullHealLocal kat chemical",_patient); -_patient setVariable [QGVAR(enteredPoison), false, true]; -_patient setVariable [QGVAR(timeleft), missionNamespace getVariable [QGVAR(infectionTime),60], true]; -_patient setVariable [QGVAR(poisonType), "", true]; -_patient setVariable [QGVAR(airPoisoning), false, true]; -_patient setVariable [QGVAR(CS), false, true]; _patient setVariable [QGVAR(gasmask_durability), 10, true]; -if (_patient getVariable [QGVAR(painEffect),0] != 0) then { - KAT_PAIN_EFFECT ppEffectEnable false; -}; +_patient setVariable [QGVAR(CSGas), 0, true]; +_patient setVariable [QGVAR(airPoisoning), false, true]; +_patient setVariable [QGVAR(infectionTime), missionNamespace getVariable [QGVAR(infectionTime), 60], true]; +_patient setVariable [QGVAR(infectionArray), [], true]; +_patient setVariable [QGVAR(CoughCooldown), false, true]; \ No newline at end of file diff --git a/addons/chemical/functions/fnc_gasAI.sqf b/addons/chemical/functions/fnc_gasAI.sqf deleted file mode 100644 index 499890608..000000000 --- a/addons/chemical/functions/fnc_gasAI.sqf +++ /dev/null @@ -1,113 +0,0 @@ -#include "..\script_component.hpp" -/* - * Author: DiGii - * This cant be called manualy! - * Handles the Gas effect for the AI - * - * Arguments: - * 0: Target - * 1: Module - * 2: Position - * 3: Radius - * 4: GasType - * - * Return Value: - * NONE - * - * Example: - * [player, logic, getPos player, 50, 0] call kat_chemical_fnc_gasAI; - * - * Public: No -*/ - -params ["_unit", "_logic", "_pos", "_radius_max", "_gastype"]; - -if (!isDamageAllowed _unit) exitWith { - [_unit] call FUNC(fullHealLocal); -}; - -[ - { - params["_args","_handler"]; - _args params ["_logic","_unit"]; - if (!(_logic getVariable [QGVAR(gas_active),false]) || !(alive _unit) || isNull _unit) then { - _unit setVariable [QGVAR(enteredPoison), false, true]; - [_handler] call CBA_fnc_removePerFrameHandler; - }; - }, - 3, - [_logic,_unit] -] call CBA_fnc_addPerFrameHandler; - -[ - { - params["_args","_handler"]; - _args params ["_unit", "_logic", "_pos", "_radius_max", "_gastype"]; - - if (!(_logic getVariable [QGVAR(gas_active), false]) || isNull _logic || !(alive _unit) || _unit getVariable ["ACE_isUnconscious", false]) exitWith { - [_handler] call CBA_fnc_removePerFrameHandler; - }; - - if ((_unit distance _pos) <= _radius_max && !(_unit getVariable [QGVAR(enteredPoison), false])) then { - _unit setVariable [QGVAR(enteredPoison), true, true]; - private _skill = _unit skill "aimingAccuracy"; - private _fnc_afterwait = { - params ["_unit", "_gastype", "_pos", "_skill"]; - - if !((goggles _unit) in (missionNamespace getVariable [QGVAR(availGasmaskList), []])) exitWith { - if (_gastype isEqualTo 1) then { - if (_unit distance _pos < 10 && _unit getVariable [QGVAR(enteredPoison), false]) then { - _unit say3D QGVAR(cough_1); - _unit setSkill ["aimingAccuracy", 0.001]; - [ - { - params["_unit", "_skill"]; - _unit setSkill ["aimingAccuracy", _skill]; - }, - [_unit, _skill], - 30 - ] call CBA_fnc_waitAndExecute; - }; - } else { - if (ACEGVAR(medical_statemachine,AIUnconsciousness)) then { - for "_i" from 0 to 10 step 1 do { - [ - { - params["_unit"]; - [_unit, "PoisenBP", 300, 30, -10, 0, -10] call ACEFUNC(medical_status,addMedicationAdjustment); - }, - [_unit], - 5 - ] call CBA_fnc_waitAndExecute; - }; - } else { - [{ - private _unit = _this select 0; - _unit setDamage 1; - }, [_unit], 20]call CBA_fnc_waitAndExecute; - }; - }; - }; - }; - private _timeleft = 30; - for "_i" from 0 to 1 step 0 do { - _timeleft = _timeleft - 1; - if (_timeleft <= 0) exitWith { - [_unit, _gastype, _pos, _skill] call _fnc_afterwait; - _i = 2; - }; - if (_gastype isEqualTo 1) exitWith { - [_unit, _gastype, _pos, _skill] call _fnc_afterwait; - _i = 2; - }; - _pos = _logic getVariable [QGVAR(gas_position), [0, 0, 0]]; - if (_unit distance _pos > _radius_max || !(_logic getVariable [QGVAR(gas_active), false]) || isNull _logic) exitWith { - _unit setVariable [QGVAR(enteredPoison), false, true]; - _i = 2; - }; - }; - }; - }, - 5, - [_unit,_logic,_pos,_radius_max,_gastype] -] call CBA_fnc_addPerFrameHandler; diff --git a/addons/chemical/functions/fnc_gasCheck.sqf b/addons/chemical/functions/fnc_gasCheck.sqf deleted file mode 100644 index f08c7d5e9..000000000 --- a/addons/chemical/functions/fnc_gasCheck.sqf +++ /dev/null @@ -1,96 +0,0 @@ -#include "..\script_component.hpp" -/* - * Author: DiGii - * This cannot be called manually! - * - * Arguments: - * 0: Module - * 1: Position - * 2: Max_Radius - * 3: Min_Radius - * 4: GasType - * - * Return Value: - * NONE - * - * Example: - * [logic, getPos player, 50, 20, 1] call kat_chemical_fnc_gasCheck; - * - * Public: No - */ - -params ["_logic", "_position", "_radius_max", "_radius_min", "_gasType"]; - -// Set default values if needed -_radius_min = if (_radius_min isEqualTo 0) then {_radius_max / 2} else {_radius_min}; - -_logic setVariable [QGVAR(gas_active), true, true]; -_logic setVariable [QGVAR(gas_playerArr), [], true]; -_logic setVariable [QGVAR(gas_position), _position, true]; -_logic setVariable [QGVAR(gas_radius), _radius_max, true]; - -// Function to check players within the gas zone -private _checkPlayers = { - params ["_args"]; - _args params ["_logic", "_position", "_radius_max", "_radius_min", "_gasType"]; - private _playerArr = _logic getVariable [QGVAR(gas_playerArr), []]; - private _allUnits = if (missionNamespace getVariable [QGVAR(affectAI), false]) then {allUnits} else {allPlayers}; - - - { - if (!isDamageAllowed _x) then { - [_x] call FUNC(fullHealLocal); - continue; - }; - - _position = if ((toString (_position) != toString (getPos _logic))) then {getPos _logic} else {_position}; - _logic setVariable [QGVAR(gas_position), _position, true]; - - private _distance = _x distance _position; - - if (isPlayer _x) then { - if (_x getVariable [QGVAR(isTreated), false]) then { - _x setVariable [QGVAR(isTreated), false, true]; - - _playerArr deleteAt (_playerArr find _x); - _logic setVariable [QGVAR(gas_playerArr), _playerArr, true]; - }; - - if (!(_x in _playerArr) && _distance < _radius_max) then { - _playerArr pushBack _x; - - _logic setVariable [QGVAR(gas_playerArr), _playerArr, true]; - [QGVAR(gasPlayer), [_x, _logic, _position, _radius_max, _radius_min, _gasType], _x] call CBA_fnc_targetEvent; - } else { - if (_x in _playerArr && _distance > _radius_max) then { - - _playerArr deleteAt (_playerArr find _x); - _logic setVariable [QGVAR(gas_playerArr), _playerArr, true]; - }; - }; - } else { - if (_distance < _radius_max && alive _x && !(_x getVariable [QGVAR(enteredPoison), false])) then { - [QGVAR(gasAI), [_x, _logic, _position, _radius_max, _gasType], _x] call CBA_fnc_targetEvent; - }; - }; - } forEach _allUnits; -}; - -// Add per frame handler to check players -private _handle = [_checkPlayers, 3, [_logic, _position, _radius_max, _radius_min, _gasType]] call CBA_fnc_addPerFrameHandler; - -// Remove handler when logic is no longer valid -[ - { - params ["_args", "_pfhHandle"]; - _args params ["_logic", "_handle"]; - - if (isNull _logic || !alive _logic || !(_logic getVariable [QGVAR(gas_active), false])) exitWith { - _logic setVariable [QGVAR(gas_active), false, true]; - [_handle] call CBA_fnc_removePerFrameHandler; - [_pfhHandle] call CBA_fnc_removePerFrameHandler; - }; - }, - 0, - [_logic, _handle] -] call CBA_fnc_addPerFrameHandler; diff --git a/addons/chemical/functions/fnc_gasCheckLocal.sqf b/addons/chemical/functions/fnc_gasCheckLocal.sqf deleted file mode 100644 index 769499f66..000000000 --- a/addons/chemical/functions/fnc_gasCheckLocal.sqf +++ /dev/null @@ -1,92 +0,0 @@ -#include "..\script_component.hpp" -/* -* Author: DiGii -* This cannot be called manually! -* Handles the Gas effect for the player -* -* Arguments: -* 0: Target -* 1: Module -* 2: Position -* 3: Max_radius -* 4: Min_radius -* 5: Gastype -* -* Return Value: -* NONE -* -* Example: -* [player, logic, getPos player, 50, 20, 0] call kat_chemical_fnc_gasChecklocal; -* -* Public: No -*/ - -params ["_unit", "_logic", "_position", "_radius_max", "_radius_min", "_gasType"]; - -if (!isDamageAllowed _unit) exitWith { - [_unit] call FUNC(fullHealLocal); -}; - -private _timeEntered = CBA_MissionTime; - -// Function to handle the per-frame logic for gas effects - -[{ - params ["_args", "_handler"]; - _args params ["_logic", "_unit", "_position"]; - - if (_unit getVariable [QGVAR(isTreated), false] || !(_logic getVariable [QGVAR(gas_active), false])) exitWith { - _unit setVariable [QGVAR(enteredPoison), false, true]; - [_handler] call CBA_fnc_removePerFrameHandler; - }; - -}, 3, [_logic, _unit, _position]] call CBA_fnc_addPerFrameHandler; - -[{ - params ["_args", "_handler"]; - _args params ["_unit", "_logic", "_position", "_radius_max", "_radius_min", "_gasType", "_timeEntered"]; - - if (!(_logic getVariable [QGVAR(gas_active), false]) || isNull _logic || _unit getVariable [QGVAR(isTreated), false]) exitWith { - [_handler] call CBA_fnc_removePerFrameHandler; - }; - - _position = _logic getVariable [QGVAR(gas_position), [0, 0, 0]]; - private _distance = _unit distance _position; - private _min_to_max = _radius_max - _radius_min; - private _dis_to_min = _distance - _radius_min; - private _percent = 0; - - if (_distance > _radius_min) then { - _percent = _dis_to_min / _min_to_max; - }; - - private _timeLeft = _unit getVariable [QGVAR(timeleft), 0]; - if (_timeLeft <= 0) exitWith - { - [_handler] call CBA_fnc_removePerFrameHandler; - [QGVAR(afterWait), [_unit, _logic, _gastype, _radius_max], _unit] call CBA_fnc_targetEvent; - _unit setVariable [QGVAR(timeleft), 0]; - }; - - if (_distance < _radius_max) then { - if !(_unit getVariable [QGVAR(enteredPoison), false]) then { - _unit setVariable [QGVAR(enteredPoison), true, true]; - [QGVAR(enteredZone), [_unit], _unit] call CBA_fnc_targetEvent; - _unit setVariable [QGVAR(Poisen_logic), _logic, true]; - }; - - _timeLeft = (missionNamespace getVariable [QGVAR(infectionTime),60]) - (CBA_MissionTime - _timeEntered); - _unit setVariable [QGVAR(timeleft), _timeLeft]; - }; - - if (_distance > _radius_max || !(_logic getVariable [QGVAR(gas_active), false]) || isNull _logic) then { - _unit setVariable [QGVAR(enteredPoison), false, true]; - [_handler] call CBA_fnc_removePerFrameHandler; - }; - - if (_gasType isEqualTo 1) then { - [_handler] call CBA_fnc_removePerFrameHandler; - [QGVAR(afterWait), [_unit, _logic, _gasType, _radius_max], _unit] call CBA_fnc_targetEvent; - }; - -}, 2, [_unit, _logic, _position, _radius_max, _radius_min, _gasType, _timeEntered]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/chemical/functions/fnc_gasManagerPFH.sqf b/addons/chemical/functions/fnc_gasManagerPFH.sqf new file mode 100644 index 000000000..c49c3058b --- /dev/null +++ b/addons/chemical/functions/fnc_gasManagerPFH.sqf @@ -0,0 +1,53 @@ +#include "..\script_component.hpp" +/* + * Author: tcvm, johnb43 + * Modified by: MiszczuZPolski + * Handles various objects on gas and determines if units close to objects deserve to get poisoned + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * kat_chemical_fnc_gasManagerPFH call CBA_fnc_addPerFrameHandler + * + * Public: No + */ + +{ + _y params ["_gasLogic", "_radius", "_gasLevel", "_condition", "_conditionArgs", "_isSealable"]; + TRACE_2("gasManagerPFH loop",_x,_y); + + private _infectedObject = _y; + + // Remove when condition is no longer valid + if !(_conditionArgs call _condition) then { + TRACE_2("condition no longer valid, deleting",_x,_y); + + detach _gasLogic; + deleteVehicle _gasLogic; + + GVAR(gasSources) deleteAt _x; + + continue; + }; + + // Poison units (alive or dead) close to the gas source + { + // Get the distance of the unit from the center of the sphere (_gasLogic) + private _distance = _x distance _gasLogic; + + // Ensure the distance does not exceed the radius (prevents going beyond the sphere) + _distance = _distance min _radius; + + // Calculate the intensity as a normalized value (1 at center, 0 at the edge) + private _intensity = 1 - (_distance / _radius); + + _x setVariable [QGVAR(areaIntensity), _intensity, true]; + + [QGVAR(poison), [_x, _gasLevel, _infectedObject], _x] call CBA_fnc_targetEvent; + + } forEach nearestObjects [_gasLogic, ["CAManBase"], _radius]; +} forEach GVAR(gasSources); diff --git a/addons/chemical/functions/fnc_gasmodule.sqf b/addons/chemical/functions/fnc_gasmodule.sqf index ad0f34dd4..15a57154f 100644 --- a/addons/chemical/functions/fnc_gasmodule.sqf +++ b/addons/chemical/functions/fnc_gasmodule.sqf @@ -1,6 +1,6 @@ #include "..\script_component.hpp" /* -* Author: DiGii +* Author: DiGii, MiszczuZPolski * This cant be called manualy! * * Arguments: @@ -16,23 +16,34 @@ * * Public: No */ +params ["_logic", "_units", "_activated"]; -private _logic = param [0, objNull, [objNull]]; -private _activated = param [2, true, [true]]; -private _radius_max = _logic getVariable ["Radius_Max", 20]; -private _radius_min = _logic getVariable ["Radius_Min", 10]; -private _gastype = _logic getVariable ["GAS_type", 0]; +private _radius = _logic getVariable ["Radius", 20]; +private _gasLevel = _logic getVariable ["GAS_type", 0]; private _isSealable = _logic getVariable ["IsSealable", false]; -if (_activated) then { - if (count synchronizedObjects _logic > 0) then { - private _object = (synchronizedObjects _logic) select 0; - if (_isSealable) then { - [QGVAR(createSealActionGlobal), [_object, _logic]] call CBA_fnc_globalEventJIP; - }; - - [_object, getPos _object, _radius_max, _radius_min, _gastype] call FUNC(gasCheck); - } else { - [_logic, getPos _logic, _radius_max, _radius_min, _gastype] call FUNC(gasCheck); - }; +if (count _units == 0) then {_units pushBack _logic;}; + +if (!_activated) exitWith {}; +if (isServer) then { + + [{ + params ["_logic", "_radius", "_gasLevel", "_isSealable", "_units"]; + + { + [QGVAR(addGasSource), [_x, _radius, _gasLevel, _x, { + params ["_endTime", "_logic"]; + + // If logic no longer exists, exit + if (isNull _logic) exitWith { + false // returns + }; + + CBA_missionTime < _endTime // return + }, [CBA_missionTime + 1e10, _logic], _isSealable]] call CBA_fnc_serverEvent; + + } forEach _units; + + }, [_logic, _radius, _gasLevel, _isSealable, _units], 1] call CBA_fnc_waitAndExecute; + }; diff --git a/addons/chemical/functions/fnc_getChemDetectorState.sqf b/addons/chemical/functions/fnc_getChemDetectorState.sqf deleted file mode 100644 index 528657971..000000000 --- a/addons/chemical/functions/fnc_getChemDetectorState.sqf +++ /dev/null @@ -1,21 +0,0 @@ -#include "..\script_component.hpp" -/* - * Author: DiGii - * - * Arguments: - * 0: Unit - * 1: Is On/Off - * - * Return Value: - * NONE - * - * Example: - * [] call kat_chemical_fnc_getChemDetectorState; - * - * Public: No -*/ -params ["_unit", "_isOnOff"]; - -private _currentState = _unit getVariable [QGVAR(chemDetectorState), false]; - -[false, true] select ("ChemicalDetector_01_watch_F" in (assignedItems _unit) && _currentState == _isOnOff); \ No newline at end of file diff --git a/addons/chemical/functions/fnc_gui_updateBodyImage.sqf b/addons/chemical/functions/fnc_gui_updateBodyImage.sqf index 193f93035..4dfc12897 100644 --- a/addons/chemical/functions/fnc_gui_updateBodyImage.sqf +++ b/addons/chemical/functions/fnc_gui_updateBodyImage.sqf @@ -20,7 +20,7 @@ params ["_ctrlGroup", "_target", "_selectionN"]; private _ctrlAirInfected = _ctrlGroup controlsGroupCtrl IDC_BODY_TORSO_I; -if (_target getVariable [QGVAR(airPoisoning), false]) then { +if ((_target getVariable [QGVAR(airPoisoning), false]) && (missionNamespace getVariable [QGVAR(showPoisoning), true])) then { _ctrlAirInfected ctrlShow true; } else { _ctrlAirInfected ctrlShow false; diff --git a/addons/chemical/functions/fnc_gui_updateInjuryListGeneral.sqf b/addons/chemical/functions/fnc_gui_updateInjuryListGeneral.sqf index 75dfa6985..aef0ab087 100644 --- a/addons/chemical/functions/fnc_gui_updateInjuryListGeneral.sqf +++ b/addons/chemical/functions/fnc_gui_updateInjuryListGeneral.sqf @@ -21,6 +21,7 @@ params ["_ctrl", "_target", "_selectionN", "_entries"]; private _poisontype = _target getVariable [QGVAR(poisonType),""]; -if (_target getVariable [QGVAR(airPoisoning),false]) then{ + +if (_target getVariable [QGVAR(airPoisoning),false] && (missionNamespace getVariable [QGVAR(showPoisoning), true])) then{ _entries pushBack [LLSTRING(Intoxication), [0.4,0,0.5,1]]; }; diff --git a/addons/chemical/functions/fnc_handleCSGas.sqf b/addons/chemical/functions/fnc_handleCSGas.sqf deleted file mode 100644 index 3a4e01174..000000000 --- a/addons/chemical/functions/fnc_handleCSGas.sqf +++ /dev/null @@ -1,64 +0,0 @@ -#include "..\script_component.hpp" -/* - * Author: DiGii - * - * Arguments: - * 0: Logic - * 1: Radius - * - * Return Value: - * NONE - * - * Example: - * [player, logic, 10] call kat_chemical_fnc_handleCSGas; - * - * Public: No -*/ -params ["_unit", "_logic", "_radius"]; - -[{ - params["_args","_handler"]; - _args params ["_unit"]; - - if (!isDamageAllowed _unit) exitWith { - [_unit] call FUNC(fullHealLocal); - }; - - if (_unit getVariable [QGVAR(enteredPoison), false]) then { - if (_unit getVariable [QACEGVAR(medical,pain), 0] < 0.25) then {_unit setVariable [QACEGVAR(medical,pain), 0.41]}; - if ((goggles _unit) in (missionNamespace getVariable [QGVAR(availGasmaskList), []])) then {_unit setVariable[QGVAR(enteredPoison), false, true]}; - _unit setVariable [QGVAR(CS), true, true]; - _unit say3D QGVAR(cough_1); - if (hasInterface) then { - private _rndBlur = selectRandom [5, 6, 7, 8]; - ppBlur ppEffectAdjust [_rndBlur]; - ppBlur ppEffectEnable true; - ppBlur ppEffectCommit 5; - }; - } else { - if (hasInterface) then { - ppBlur ppEffectAdjust [0]; - ppBlur ppEffectEnable true; - ppBlur ppEffectCommit 20; - }; - _unit setVariable [QGVAR(CS), false, true]; - [_handler] call CBA_fnc_removePerFrameHandler; - - }; -}, 5, [_unit]] call CBA_fnc_addPerFrameHandler; - -//Position Check -[{ - params ["_param","_handler"]; - _param params ["_logic", "_radius", "_unit"]; - - if (!isDamageAllowed _unit) exitWith { - [_unit] call FUNC(fullHealLocal); - }; - - private _position = _logic getVariable [QGVAR(gas_position), [0,0,0]]; - if ( _unit distance _position > _radius || !(_logic getVariable[QGVAR(gas_active),false]) || isNull _logic ) exitWith { - _unit setVariable [QGVAR(enteredPoison), false, true]; - [_handler] call CBA_fnc_removePerFrameHandler; - }; -}, 2, [_logic, _radius, _unit]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/chemical/functions/fnc_handleFired.sqf b/addons/chemical/functions/fnc_handleFired.sqf index a531b1cb5..03b934ec0 100644 --- a/addons/chemical/functions/fnc_handleFired.sqf +++ b/addons/chemical/functions/fnc_handleFired.sqf @@ -33,18 +33,21 @@ private _configClass = (configFile >> "CfgAmmo" >> _ammo); private _lifetime = [_configClass, "KAT_lifetime", 60] call BIS_fnc_returnConfigEntry; private _radius = [_configClass, "KAT_radius", 10] call BIS_fnc_returnConfigEntry; -private _gasLvL = [_configClass, "KAT_toxicLvL", 1] call BIS_fnc_returnConfigEntry; +private _gasLevel = [_configClass, "KAT_toxicLvL", 1] call BIS_fnc_returnConfigEntry; [{ params ["_args", "_handler"]; - _args params ["_projectile", "_posArr", "_gasInfo"]; - _gasInfo params ["_lifetime", "_radius", "_gasLvL"]; + _args params ["_projectile", "_gasInfo"]; + _gasInfo params ["_lifetime", "_radius", "_gasLeveL"]; - if (!isNull _projectile) exitWith { - _args set [1, getPos _projectile]; + if (isNull _projectile || {!alive _projectile}) exitWith { + [_handler] call CBA_fnc_removePerFrameHandler; }; - [QGVAR(createZoneGlobal), [_posArr, _lifetime, _radius, _gasLvL]] call CBA_fnc_globalEventJIP; + [QGVAR(addGasSource), [_projectile, _radius, _gasLevel, _projectile, { + params ["_endTime"]; - [_handler] call CBA_fnc_removePerFrameHandler; -}, 0, [_projectile, [0, 0, 0], [_lifetime, _radius, _gasLvL]]] call CBA_fnc_addPerFrameHandler; + CBA_missionTime < _endTime // return + }, [CBA_missionTime + _lifetime]]] call CBA_fnc_serverEvent; + +}, 0, [_projectile, [_lifetime, _radius, _gasLevel]]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/chemical/functions/fnc_handleGasMaskDur.sqf b/addons/chemical/functions/fnc_handleGasMaskDur.sqf index 133fbfd2e..1b0d62ca6 100644 --- a/addons/chemical/functions/fnc_handleGasMaskDur.sqf +++ b/addons/chemical/functions/fnc_handleGasMaskDur.sqf @@ -1,6 +1,6 @@ #include "..\script_component.hpp" /* - * Author: DiGii + * Author: MiszczuZPolski * * Arguments: * 0: Unit @@ -9,66 +9,42 @@ * NONE * * Example: - * [player] call kat_chemical_fnc_handleGasMAskDur; + * [player] call kat_chemical_fnc_handleGasMaskDur; * * Public: No */ params ["_unit"]; -[ - { - params["_unit"]; - !(missionNamespace getVariable [QGVAR(availGasmaskList), []] isEqualTo []) && _unit getVariable [QGVAR(enteredPoison), false] - }, - { - params["_unit"]; - if (_unit getVariable [QGVAR(enteredPoison), false] && (goggles _unit) in (missionNamespace getVariable [QGVAR(availGasmaskList), []])) then { - private _timeEntered = CBA_missionTime; - private _maxTime = missionNamespace getVariable [QGVAR(gasmask_durability), 900]; - private _currentDurability = _unit getVariable [QGVAR(gasmask_durability), 10]; - [{ - params ["_args","_handler"]; - _args params ["_unit","_timeEntered","_maxTime","_currentDurability"]; - private _currentDurability = _unit getVariable [QGVAR(gasmask_durability), 10]; +if !(goggles _unit in (missionNamespace getVariable [QGVAR(availGasmaskList), []])) exitWith {}; - if (_unit getVariable [QGVAR(gasmask_durability_reset), false]) then { - _unit setVariable [QGVAR(gasmask_durability_reset), false, true]; - [_handler] call CBA_fnc_removePerFrameHandler; - [_unit] call FUNC(handleGasMaskDur); - }; +// Get the maximum time the gas mask filter can last (from settings) +private _maxTime = missionNamespace getVariable [QGVAR(gasmask_durability), 60]; // Max durability in seconds - private _timeLeft = _maxTime - (CBA_missionTime - _timeEntered); - private _percent = round ((10/_maxTime) * _timeLeft); +// Get the current health (0-10) of the gas mask filter for this unit +private _currentHealth = _unit getVariable [QGVAR(gasmask_durability), 10]; // Default to full health (10) if not set - if (_currentDurability != _percent) then { - _unit setVariable [QGVAR(gasmask_durability), _percent, true]; - }; +// Scale the current health (0-10) to the actual time left based on maxTime +private _timeLeft = (_currentHealth / 10) * _maxTime; // Convert 0-10 health scale to time left - if (_currentDurability <= 0 || _percent <= 0 || !(alive _unit)) exitWith { - [_handler] call CBA_fnc_removePerFrameHandler; - _unit setVariable [QGVAR(gasmask_durability), 0, true]; - [_unit] call FUNC(handleGasMaskDur); - }; +// Reduce the time left by 1 seconds (each tick reduces by 1 seconds) +_timeLeft = _timeLeft - 1; - if !(_unit getVariable [QGVAR(enteredPoison), false]) exitWith{ - [_handler] call CBA_fnc_removePerFrameHandler; - [_unit] call FUNC(handleGasMaskDur); - }; +// Prevent negative durability +_timeLeft = _timeLeft max 0; - },1,[_unit,_timeEntered,_maxTime,_currentDurability]] call CBA_fnc_addPerFrameHandler; - } else { - [ - { - params ["_unit"]; - _unit getVariable [QGVAR(enteredPoison), false] || (goggles _unit) in (missionNamespace getVariable [QGVAR(availGasmaskList), []]) - }, - { - [_unit] call FUNC(handleGasMaskDur); - }, - [_unit] - ] call CBA_fnc_waitUntilAndExecute; - }; - }, - [_unit] -] call CBA_fnc_waitUntilAndExecute; +// Convert the remaining time back to the 0-10 health scale +private _newHealth = (_timeLeft / _maxTime) * 10; + +// Calculate percentage of health remaining +private _percent = (_newHealth / 10) * 100; + +// Exit if the gas mask health reaches 0 or the unit is dead +if (_newHealth <= 0) exitWith { + _unit setVariable [QGVAR(gasmask_durability), 0, true]; +}; + +// Update the gas mask health if it has changed +if (_currentHealth != _newHealth) then { + _unit setVariable [QGVAR(gasmask_durability), _newHealth, true]; +}; diff --git a/addons/chemical/functions/fnc_handleRespawn.sqf b/addons/chemical/functions/fnc_handleRespawn.sqf index c52862d13..2f60a8c9b 100644 --- a/addons/chemical/functions/fnc_handleRespawn.sqf +++ b/addons/chemical/functions/fnc_handleRespawn.sqf @@ -11,7 +11,7 @@ * None * * Example: - * [alive, body] call kat_misc_fnc_handleRespawn; + * [alive, body] call kat_chemical_fnc_handleRespawn; * * Public: No */ @@ -25,7 +25,4 @@ params ["_unit"]; [_unit] call FUNC(fullHealLocal); -"kat_CHEM_DETECTOR" cutRsc ["RscWeaponChemicalDetector", "PLAIN", 1, false]; -private _ui = uiNamespace getVariable "RscWeaponChemicalDetector"; -private _obj = _ui displayCtrl 101; -_obj ctrlAnimateModel ["Threat_Level_Source", 0, true]; +_unit setVariable [QGVAR(detectorSound), false, true]; diff --git a/addons/chemical/functions/fnc_hasDetector.sqf b/addons/chemical/functions/fnc_hasDetector.sqf new file mode 100644 index 000000000..fb79a915e --- /dev/null +++ b/addons/chemical/functions/fnc_hasDetector.sqf @@ -0,0 +1,24 @@ +#include "..\script_component.hpp" +/* + * Author: DiGii + * + * Arguments: + * 0: Player + * 1: Target + * + * Return Value: + * Bool + * + * Example: + * [player, cursorTarget] call kat_chemical_fnc_hasGasmask; + * + * Public: No +*/ + +params ["_unit"]; + +if ("KAT_ChemicalDetector" in assignedItems _unit) exitWith { + true +}; + +false \ No newline at end of file diff --git a/addons/chemical/functions/fnc_init.sqf b/addons/chemical/functions/fnc_init.sqf index f5905b8df..1810233b1 100644 --- a/addons/chemical/functions/fnc_init.sqf +++ b/addons/chemical/functions/fnc_init.sqf @@ -19,22 +19,4 @@ if (!local _unit) exitWith {}; [_unit] call FUNC(fullHealLocal); -[_unit] call FUNC(coughing); -[_unit] call FUNC(handleGasMaskDur); -[_unit] call FUNC(breathing); - -[{ - params ["_args", "_pfhID"]; - _args params ["_unit"]; - private _playertime = _unit getVariable [QGVAR(timeleft), 60]; - private _maxtime = missionNamespace getVariable [QGVAR(infectionTime), 60]; - if (!(_unit getVariable [QGVAR(enteredPoison), false])) then { - if (_playertime < missionNamespace getVariable [QGVAR(infectionTime), 60]) then { - _playertime = _playertime + 1; - if (_playertime >= _maxtime) then { - _playertime = _maxtime; - }; - _unit setVariable[QGVAR(timeleft), _playertime, true]; - }; - }; -}, 2, _unit]call CBA_fnc_addPerFrameHandler; +_unit setVariable [QGVAR(detectorSound), false, true]; \ No newline at end of file diff --git a/addons/chemical/functions/fnc_poison.sqf b/addons/chemical/functions/fnc_poison.sqf new file mode 100644 index 000000000..1d9b58459 --- /dev/null +++ b/addons/chemical/functions/fnc_poison.sqf @@ -0,0 +1,82 @@ +#include "..\script_component.hpp" +/* + * Author: MiszczuZPolski + * Handles various objects on fire and determines if units close to objects deserve to get burned. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * ace_fire_fnc_fireManagerPFH call CBA_fnc_addPerFrameHandler + * + * Public: No + */ + +params ["_unit", "_gasLevel", "_infectedObject"]; + +// Check if unit is remote (objNull is remote) +if (!local _unit) exitWith { + TRACE_1("unit is null or not local",_unit); +}; + +// Check if the unit can poison (takes care of spectators and curators) +if (getNumber (configOf _unit >> "isPlayableLogic") == 1 || {!(_unit isKindOf "CAManBase")}) exitWith { + TRACE_1("unit is virtual or not a man",_unit); +}; + +// If unit is invulnerable, don't poison the unit +if !(isDamageAllowed _unit && {_unit getVariable [QACEGVAR(medical,allowDamage), true]}) exitWith { + TRACE_1("unit is invulnerable",_unit); +}; + +if ((goggles _unit in (missionNamespace getVariable [QGVAR(availGasmaskList), []])) && {_unit getVariable [QGVAR(gasmask_durability), 10] > 0}) exitWith { + TRACE_1("unit has gas mask",_unit); + [QGVAR(handleGasMaskDur), _unit, _unit] call CBA_fnc_targetEvent; +}; + +if (_gasLevel == 0) exitWith { + _unit setVariable [QGVAR(CSGas), 30, true]; + if (random 1 <= GVAR(tearGasDropChance)) then { + [QACEGVAR(hitreactions,dropWeapon), _unit, _unit] call CBA_fnc_targetEvent; + }; +}; + +// We assume that oxygen masks only cover the mouth and nose, leaving the eyes exposed to CS gas +if ((_unit getVariable [QEGVAR(breathing,oxygenMaskActive), false])) exitWith { + TRACE_1("unit has oxygen mask",_unit); +}; + +private _currentInfectionArray = _unit getVariable [QGVAR(infectionArray), []]; + +if ((_currentInfectionArray findIf { _x isEqualTo _infectedObject}) == -1) then { + _currentInfectionArray append [_infectedObject]; +}; + +_unit setVariable [QGVAR(infectionArray), _currentInfectionArray, true]; + +//Get max infection time +private _infectionTime = missionNamespace getVariable [QGVAR(infectionTime), 60]; + +//Get current time left for player +private _currentInfection = _unit getVariable [QGVAR(infectionTime), 60]; + +private _timeLeft = _currentInfection - 1; +_timeLeft = _timeLeft max 0; + +private _newTime = _timeLeft; + +if (_currentInfection != _newTime) then { + _unit setVariable [QGVAR(infectionTime), _newTime, true]; +}; + +// Exit if infection reaches 0 +if (_newTime <= 0) then { + if !(_unit getVariable [QGVAR(airPoisoning), false]) then { + [QEGVAR(breathing,playCough), [_unit], _unit] call CBA_fnc_targetEvent; + }; + + _unit setVariable [QGVAR(airPoisoning), true, true]; +}; \ No newline at end of file diff --git a/addons/chemical/functions/fnc_putOnGasMask.sqf b/addons/chemical/functions/fnc_putOnGasMask.sqf new file mode 100644 index 000000000..878ba9f62 --- /dev/null +++ b/addons/chemical/functions/fnc_putOnGasMask.sqf @@ -0,0 +1,13 @@ +#include "..\script_component.hpp" + +params ["_player"]; + +private _itemList = _player call ACEFUNC(common,uniqueItems); + +{ + if (_x in GVAR(availGasmaskList)) then { + _player assignItem _x; + break; + }; + +} forEach _itemList; diff --git a/addons/chemical/functions/fnc_showChemDetector.sqf b/addons/chemical/functions/fnc_showChemDetector.sqf index 6b0e51908..d7b5f1a34 100644 --- a/addons/chemical/functions/fnc_showChemDetector.sqf +++ b/addons/chemical/functions/fnc_showChemDetector.sqf @@ -2,7 +2,7 @@ /* * Author: Garth 'L-H' de Wet * Modified: Mazinski - * Displays the KWatch on screen. + * Displays the JCAD on screen. * * Arguments: * 0: unit @@ -11,7 +11,7 @@ * None * * Example: - * [player] call kat_watch_fnc_showKWatch + * [player] call kat_chemical_fnc_showChemDetector * * Public: Yes */ @@ -47,20 +47,21 @@ private _exposure = _display displayCtrl 18805; _pfhID call CBA_fnc_removePerFrameHandler; }; - private _hour = floor dayTime; - private _minute = floor ((dayTime - _hour) * 60); + private _intensity = _unit getVariable [QGVAR(areaIntensity), 0]; - _time ctrlSetText (format ["%1:%2", [_hour, 2] call CBA_fnc_formatNumber, [_minute, 2] call CBA_fnc_formatNumber]); + if ((_unit getVariable [QGVAR(detectorEnabled), false])) then { - private _gas = nearestObjects [_unit, ["kat_module_zeus_gas"], 2000]; + private _hour = floor dayTime; + private _minute = floor ((dayTime - _hour) * 60); + + _time ctrlSetText (format ["%1:%2", [_hour, 2] call CBA_fnc_formatNumber, [_minute, 2] call CBA_fnc_formatNumber]); - if ((count _gas) > 0) then { - private _distance = _unit distance (_gas select 0); - private _radius = (_gas select 0) getVariable [QGVAR(gas_radius), 0]; + _exposure ctrlSetText (_intensity toFixed 2); - _exposure ctrlSetText ((linearConversion[0, _radius, _distance, 1, 0, true]) toFixed 2); + _unit setVariable [QGVAR(areaIntensity), _intensity, true]; } else { - _exposure ctrlSetText str (0); + _time ctrlSetText (LLSTRING(ChemicalDetector_Off)); + _exposure ctrlSetText ("-.--"); }; }, 1, [ diff --git a/addons/chemical/functions/fnc_spawnSmoke.sqf b/addons/chemical/functions/fnc_spawnSmoke.sqf index de25e2343..67cb83127 100644 --- a/addons/chemical/functions/fnc_spawnSmoke.sqf +++ b/addons/chemical/functions/fnc_spawnSmoke.sqf @@ -23,6 +23,20 @@ private _smoke = "KAT_GASTrip_SmokeEffect" createVehicle [_posX,_posY,_posZ]; hideObjectGlobal _smoke; [_smoke, 0, ["ACE_MainActions", "ACTION"]] call ACEFUNC(interact_menu,removeActionFromObject); -private _pos = [_posX,_posY,_posZ]; +if (isServer) then { + private _timeToLive = 10; + private _radius = 10; + private _gasLevel = 1; + + [QGVAR(addGasSource), [_smoke, _radius, _gasLevel, _smoke, { + params ["_endTime", "_smoke"]; + + // If smoke no longer exists, exit + if (isNull _smoke) exitWith { + false // return + }; + + CBA_missionTime < _endTime // return + }, [CBA_missionTime + _timeToLive, _smoke]]] call CBA_fnc_serverEvent; +}; -[QGVAR(createZoneGlobal), [_pos, 240, 5, 0]] call CBA_fnc_globalEventJIP; diff --git a/addons/chemical/functions/fnc_takeOffGasMask.sqf b/addons/chemical/functions/fnc_takeOffGasMask.sqf new file mode 100644 index 000000000..0d64c4bce --- /dev/null +++ b/addons/chemical/functions/fnc_takeOffGasMask.sqf @@ -0,0 +1,5 @@ +#include "..\script_component.hpp" + +params ["_player"]; + +_player unassignItem (goggles _player); diff --git a/addons/chemical/functions/fnc_treatmentAdvanced_AtropineLocal.sqf b/addons/chemical/functions/fnc_treatmentAdvanced_AtropineLocal.sqf index ede9e02ae..fd15874e9 100644 --- a/addons/chemical/functions/fnc_treatmentAdvanced_AtropineLocal.sqf +++ b/addons/chemical/functions/fnc_treatmentAdvanced_AtropineLocal.sqf @@ -18,9 +18,3 @@ params ["_patient"]; _patient setVariable [QGVAR(airPoisoning), false, true]; -_patient setVariable [QGVAR(isTreated), true, true]; -_patient setVariable [QGVAR(enteredPoison), false, true]; -_patient setVariable [QGVAR(timeleft), missionNamespace getVariable [QGVAR(infectionTime), 60], true]; -if (_patient getVariable [QGVAR(painEffect),0] != 0) then { - KAT_PAIN_EFFECT ppEffectEnable false; -}; diff --git a/addons/chemical/functions/fnc_ui_gasModule.sqf b/addons/chemical/functions/fnc_ui_gasModule.sqf index 167f12e33..7a229d7ce 100644 --- a/addons/chemical/functions/fnc_ui_gasModule.sqf +++ b/addons/chemical/functions/fnc_ui_gasModule.sqf @@ -1,6 +1,6 @@ #include "..\script_component.hpp" /* - * Author: DiGii + * Author: DiGii, MiszczuZPolski * Creates the UI for the Zeus Module * * Arguments: @@ -47,7 +47,6 @@ if !(isNull attachedTo _logic) then { }; default {}; }; - }; private _fnc_onUnload = { @@ -55,11 +54,9 @@ private _fnc_onUnload = { if (isNull _logic) exitWith {}; if !(_display getVariable [QGVAR(Confirmed), false]) then { - if !(isNull attachedTo _logic) then - { + if !(isNull attachedTo _logic) then { deleteVehicle _logic; - } else - { + } else { detach (attachedTo _logic); deleteVehicle _logic; }; @@ -75,31 +72,30 @@ private _fnc_onConfirm = { private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objNull); if (isNull _logic) exitWith {}; - private _gasType = _display getVariable [QGVAR(ui_gastype),0]; + private _gasLevel = _display getVariable [QGVAR(ui_gastype), 0]; + private _radius = _display getVariable [QGVAR(ui_radius), 20]; + private _isSealable = _display getVariable [QGVAR(ui_sealable), false]; + private _center = objNull; - private _radius_max = _display getVariable [QGVAR(ui_radiusMax), 20]; - private _radius_min = _display getVariable [QGVAR(ui_radiusMin), 10]; - if (_radius_min > _radius_max) then { - [CSTRING(GasModule_Needbigger)] call ACEFUNC(zeus,showMessage); + if (isNull attachedTo _logic) then { + _center = _logic; } else { - private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objNull); - if (isNull _logic) exitWith {}; + _center = attachedTo _logic; + }; - if !(isNull attachedTo _logic) then { - private _object = attachedTo _logic; + [QGVAR(addGasSource), [_center, _radius, _gasLevel, _logic, { + params ["_endTime", "_logic"]; - [_logic, getPos _object, _radius_max, _radius_min, _gasType] call FUNC(gasCheck); + // If logic no longer exists, exit + if (isNull _logic) exitWith { + false // return + }; - if (_display getVariable [QGVAR(ui_sealable), false]) then { - [QGVAR(createSealActionGlobal), [_object, _logic]] call CBA_fnc_globalEventJIP; - }; + CBA_missionTime < _endTime // return + }, [CBA_missionTime + 1e10, _logic], _isSealable]] call CBA_fnc_serverEvent; - } else { - [_logic, getPos _logic, _radius_max, _radius_min, _gasType] call FUNC(gasCheck); - }; + _display setVariable [QGVAR(Confirmed), true]; - _display setVariable [QGVAR(Confirmed), true]; - }; }; _display displayAddEventHandler ["Unload", _fnc_onUnload]; diff --git a/addons/chemical/script_component.hpp b/addons/chemical/script_component.hpp index 0a66b8add..aee23a6cd 100644 --- a/addons/chemical/script_component.hpp +++ b/addons/chemical/script_component.hpp @@ -25,3 +25,4 @@ #define X_PART(num) (W_PART(num) + (safeZoneX + (safeZoneW - SIZEX) / 2)) #define Y_PART(num) (H_PART(num) + (safeZoneY + (safeZoneH - SIZEY) / 2)) +#define GAS_MANAGER_PFH_DELAY 1 diff --git a/addons/chemical/stringtable.xml b/addons/chemical/stringtable.xml index 7b61fed95..b2243d322 100644 --- a/addons/chemical/stringtable.xml +++ b/addons/chemical/stringtable.xml @@ -61,7 +61,7 @@ Определяет, как долго вы можете находиться в газе с противогазом без заражения. Bepaald hoelang je in gas kan staan zonder dat je geïnfecteerd raakt. - + Time until infection Tiempo hasta la infeccion Zeit bis zur Infektion @@ -76,7 +76,7 @@ Время до заражения Tijd tot infectie - + Time you can stand in the gas before you get infected or need a gas mask. Tiempo que puedes resistir en el gas hasta que resultes infectado o requieras una mascara de gas Die Zeit, in der man im Gas stehen kann, bevor man infiziert wird bzw. eine Gasmaske benötigt. @@ -121,6 +121,12 @@ Определяет, влияет ли GAS на искусственный интеллект (если вы запускаете его на локальном сервере, это может вызвать проблемы с производительностью). Bepaald of KI/AI beïnvloed wordt door gas (als je dit doet op een lokale server kan dit leiden tot prestatieproblemen) + + Show Poisoning + + + Determines if poisoning and intoxication is shown in the medical menu + Gas mask filter Filtro de la mascara de gas @@ -183,9 +189,18 @@ JCAD Chemical Detector + Rilevatore chimico JCAD + Détecteur de produits chimiques JCAD + JCAD 化学剤検知器 Used to detect KAT toxic chemicals + Utilizzato per rilevare sostanze chimiche tossiche KAT + Utilisé pour détecter les produits chimiques toxiques KAT + KAT毒性化学物質の検出に使用 + + + OFF Put on gas mask @@ -253,7 +268,7 @@ Chemischen Detektor stumm schalten. Désactiver le son du détecteur de produits chimiques 화학물 탐지기 음소거 - 化学検知器をミュート + 化学剤検知器をミュート Silenzia il rilevatore chimico Silenciar detector químico Wycisz Detektor chemiczny @@ -267,7 +282,7 @@ Desilenciar Detector Quimico Chemischen Detektor laut schalten. Activer le son du détecteur de produits chimiques - 化学検知器のミュート解除 + 化学剤検知器のミュート解除 화학물 탐지기 음소거 해제 Smuta il rilevatore chimico Ativar som de detector químico @@ -307,21 +322,6 @@ Радиус вокруг модуля, заполненного газом. Radius om de module dat gevuld is met gas. - - The Minimal Range describes the area around the module where the gas is most lethal - El rango minimo describe el area alrededor del modulo en el cual el gas sera mas letal - Die minimale Reichweite beschreibt den Bereich im Umkreis des Moduls, in dem das Gas am tödlichsten wirkt. - Le rayon minimal décrit la zone autour du module ou le gaz est le plus létal - 最小範囲は、ガスが最も致死的であるモジュールの周辺を表します。 - 최소 범위는 가스가 가장 치명적으로 작동하는 모듈 주변 영역을 나타냅니다. - Il raggio minimo descrive l'area attorno al modulo dove il gas è più letale - O Alcance Mínimo descreve a área ao redor do módulo onde o gás é mais letal - Minimalny zasięg określa obszar wokół modułu, gdzie gaz jest bardziej śmiertelny - Minimální vzdálenost vyjadřuje oblast kolem modulu kde je plyn nejvíce smrtící - Minimialue kuvaa moduulia ympäröivän alueen, jossa kaasu on tappavin - Минимальный радиус, описывающий область вокруг модели, в которой газ является наиболее смертоносным - Het minimale bereik beschrijft het gebied om de module waar het gas het dodelijkst is - The Maximum Range is a range around the Minimal Range where the gas is less lethal and you have a longer chance of survival.(distance from module to outer ring) El rango maximo es el rango alrededor del rango minimo en el cual el gas es menos letal y tienes mas posibilidades de sobrevivir (distancia desde el modulo al anillo exterior) @@ -412,21 +412,6 @@ Герметизация утечки Dicht lek - - Minimal Range need to be less than Maximum Range! - ¡El rango minimo tiene que ser menor al rango maximo! - Minimale Reichweite muss kleiner als maximale Reichweite sein! - Le rayon minimal a besoin d'être plus petit que le rayon maximal ! - 最小範囲は最大範囲よりも小さくする必要があります! - 최소 범위는 반드시 최대 범위보다 작아야 합니다! - Il raggio minimo deve essere minore del raggio massimo! - O Alcance Mínimo precisa ser menor que o Alcance Máximo! - Minimalny zasięg musi być mniejszy niż maksymalny zasięg - Minimální vzdálenost musí být menší než Maximální vzdálenost! - Vähimmäisalueen on oltava pienempi kuin enimmäisetäisyys - Минимальный радиус должен быть меньше максимального радиуса ! - Het minimale bereik moet kleiner zijn dan het maximale bereik! - Intoxication Intoxicación @@ -741,21 +726,6 @@ Максимальная дальность действия. Maximaal bereik. - - Minimal Range. - Rango minimo - Minimale Reichweite. - Portée minimale - 最小範囲 - 최소 범위. - Raggio minimo. - Alcance Mínimo - Minimalny zasięg - Minimální vzdálenost. - Vähimmäisalue - Минимальный радиус действия. - Minimaal bereik. - Is sealable? ¿Es sellable? @@ -816,5 +786,45 @@ Тип газа: Gas type: + + Gas Mask Sound Volume + ガスマスクの音量 + Volume sonore du masque à gaz + + + Determines how loud the breathing sounds are when using the gas mask + ガスマスク使用時の呼吸音の大きさを設定します + Détermine l'intensité des bruits respiratoires lors de l'utilisation du masque à gaz. + + + Put on gas mask + ガスマスクを装着 + Mettre le masque à gaz + + + Take off gas mask + ガスマスクを外す + Enlever le masque à gaz + + + JCAD + + + Turn On Detector + + + Enable Warning Tone + + + Disable Warning Tone + + + Drop Weapon Chance + Chance de lâcher l'arme + + + Determines chance for dropping weapon while in tear gas + Détermine les chances de lâcher l'arme en cas d'exposition aux gaz lacrymogènes. + - + \ No newline at end of file diff --git a/addons/chemical/ui/RscAttributes.hpp b/addons/chemical/ui/RscAttributes.hpp index ba9271f2c..3ad810ea9 100644 --- a/addons/chemical/ui/RscAttributes.hpp +++ b/addons/chemical/ui/RscAttributes.hpp @@ -49,16 +49,6 @@ class GVAR(kat_RscAtributeRadius): RscControlsGroupNoScrollbars { w = QUOTE(W_PART(15.9)); h = QUOTE(H_PART(1)); }; - class Title2: Title1 { - idc = 16108; - text = CSTRING(UI_min_range); - toolTip = CSTRING(GasModule_min_radius_dcs); - y = QUOTE(H_PART(1.1)); - }; - class radius_min: radius_max { - idc = 1612; - y = QUOTE(H_PART(1.1)); - }; class Title3: Title1 { idc = 1614; text = CSTRING(UI_sealable); diff --git a/addons/circulation/ACE_Medical_Treatment_Actions.hpp b/addons/circulation/ACE_Medical_Treatment_Actions.hpp index 5c88d80e1..7ada5aa1c 100644 --- a/addons/circulation/ACE_Medical_Treatment_Actions.hpp +++ b/addons/circulation/ACE_Medical_Treatment_Actions.hpp @@ -67,8 +67,8 @@ class ACE_Medical_Treatment_Actions { displayName = CSTRING(DrawArterial_Action_Use); displayNameProgress = CSTRING(DrawBlood_Action_Progress); treatmentTime = 10; + condition = QUOTE(GVAR(abgEnable)); callbackSuccess = QFUNC(drawArterial); - condition = "true"; items[] = {"kat_IV_16"}; }; diff --git a/addons/circulation/CfgVehicles.hpp b/addons/circulation/CfgVehicles.hpp index 932e1a86a..2caa43f7a 100644 --- a/addons/circulation/CfgVehicles.hpp +++ b/addons/circulation/CfgVehicles.hpp @@ -235,6 +235,15 @@ class CfgVehicles { class LandVehicle; class Car: LandVehicle { + class ACE_SelfActions { + class KAT_ArterialTest { + displayName = CSTRING(Arterial_Test_Action); + condition = QUOTE(_target call ACEFUNC(medical_treatment,isMedicalVehicle)); + statement = ""; + insertChildren = QUOTE([ARR_2(_target,_player)] call FUNC(addArterialTestActions)); + icon = QACEPATHTOF(medical_gui,ui\cross.paa); + }; + }; class ACE_Actions { class ACE_MainActions { class KAT_ArterialTest { @@ -250,6 +259,15 @@ class CfgVehicles { class Car_F: Car {}; class Quadbike_01_base_F: Car_F { + class ACE_SelfActions { + class KAT_ArterialTest { + displayName = CSTRING(Arterial_Test_Action); + condition = QUOTE(_target call ACEFUNC(medical_treatment,isMedicalVehicle)); + statement = ""; + insertChildren = QUOTE([ARR_2(_target,_player)] call FUNC(addArterialTestActions)); + icon = QACEPATHTOF(medical_gui,ui\cross.paa); + }; + }; class ACE_Actions: ACE_Actions { class ACE_MainActions: ACE_MainActions { class KAT_ArterialTest { @@ -264,6 +282,15 @@ class CfgVehicles { }; class Kart_01_Base_F: Car_F { + class ACE_SelfActions { + class KAT_ArterialTest { + displayName = CSTRING(Arterial_Test_Action); + condition = QUOTE(_target call ACEFUNC(medical_treatment,isMedicalVehicle)); + statement = ""; + insertChildren = QUOTE([ARR_2(_target,_player)] call FUNC(addArterialTestActions)); + icon = QACEPATHTOF(medical_gui,ui\cross.paa); + }; + }; class ACE_Actions: ACE_Actions { class ACE_MainActions: ACE_MainActions { class KAT_ArterialTest { @@ -278,6 +305,15 @@ class CfgVehicles { }; class Tank: LandVehicle { + class ACE_SelfActions { + class KAT_ArterialTest { + displayName = CSTRING(Arterial_Test_Action); + condition = QUOTE(_target call ACEFUNC(medical_treatment,isMedicalVehicle)); + statement = ""; + insertChildren = QUOTE([ARR_2(_target,_player)] call FUNC(addArterialTestActions)); + icon = QACEPATHTOF(medical_gui,ui\cross.paa); + }; + }; class ACE_Actions { class ACE_MainActions { class KAT_ArterialTest { @@ -292,6 +328,15 @@ class CfgVehicles { }; class Motorcycle: LandVehicle { + class ACE_SelfActions { + class KAT_ArterialTest { + displayName = CSTRING(Arterial_Test_Action); + condition = QUOTE(_target call ACEFUNC(medical_treatment,isMedicalVehicle)); + statement = ""; + insertChildren = QUOTE([ARR_2(_target,_player)] call FUNC(addArterialTestActions)); + icon = QACEPATHTOF(medical_gui,ui\cross.paa); + }; + }; class ACE_Actions { class ACE_MainActions { class KAT_ArterialTest { @@ -307,6 +352,15 @@ class CfgVehicles { class Air; class Helicopter: Air { + class ACE_SelfActions { + class KAT_ArterialTest { + displayName = CSTRING(Arterial_Test_Action); + condition = QUOTE(_target call ACEFUNC(medical_treatment,isMedicalVehicle)); + statement = ""; + insertChildren = QUOTE([ARR_2(_target,_player)] call FUNC(addArterialTestActions)); + icon = QACEPATHTOF(medical_gui,ui\cross.paa); + }; + }; class ACE_Actions { class ACE_MainActions { class KAT_ArterialTest { @@ -321,6 +375,15 @@ class CfgVehicles { }; class Plane: Air { + class ACE_SelfActions { + class KAT_ArterialTest { + displayName = CSTRING(Arterial_Test_Action); + condition = QUOTE(_target call ACEFUNC(medical_treatment,isMedicalVehicle)); + statement = ""; + insertChildren = QUOTE([ARR_2(_target,_player)] call FUNC(addArterialTestActions)); + icon = QACEPATHTOF(medical_gui,ui\cross.paa); + }; + }; class ACE_Actions { class ACE_MainActions { class KAT_ArterialTest { @@ -336,6 +399,15 @@ class CfgVehicles { class Ship; class Ship_F: Ship { + class ACE_SelfActions { + class KAT_ArterialTest { + displayName = CSTRING(Arterial_Test_Action); + condition = QUOTE(_target call ACEFUNC(medical_treatment,isMedicalVehicle)); + statement = ""; + insertChildren = QUOTE([ARR_2(_target,_player)] call FUNC(addArterialTestActions)); + icon = QACEPATHTOF(medical_gui,ui\cross.paa); + }; + }; class ACE_Actions { class ACE_MainActions { class KAT_ArterialTest { @@ -354,12 +426,12 @@ class CfgVehicles { class ACE_Actions { class ACE_MainActions { class KAT_ApplyBloodTest { - displayName = CSTRING(Arterial_Test); - condition = "true"; - statement = "true"; - insertChildren = QUOTE([ARR_2(_target,_player)] call FUNC(addArterialApplyActions)); - icon = QACEPATHTOF(medical_gui,ui\cross.paa); - }; + displayName = CSTRING(Arterial_Test); + condition = QUOTE(GVAR(abgEnable)); + statement = "true"; + insertChildren = QUOTE([ARR_2(_target,_player)] call FUNC(addArterialApplyActions)); + icon = QACEPATHTOF(medical_gui,ui\cross.paa); + }; }; class ACE_Head { class CheckBloodPressure {}; // Remove the ability to check blood pressure at the head diff --git a/addons/circulation/RscTitles.hpp b/addons/circulation/RscTitles.hpp new file mode 100644 index 000000000..818c75dac --- /dev/null +++ b/addons/circulation/RscTitles.hpp @@ -0,0 +1,343 @@ +#include "defines.hpp" + +#define pixelW (1 / (getResolution select 2)) +#define pixelH (1 / (getResolution select 3)) +#define pixelScale 0.50 + +// pixel grids macros +#define UI_GRID_W (pixelW * pixelGridBase) +#define UI_GRID_H (pixelH * pixelGridBase) + +#define SAFEZONE_X_RIGHTEDGE ((safeZoneX - 1) * -1) +#define SAFEZONE_Y_LOWEDGE ((safeZoneY - 1) * -1) + +#define FRAME_W(N) ((UI_GRID_W * (N)) * (1.7777 / (getResolution select 4))) +#define FRAME_H(N) ((UI_GRID_H * (N))) + +class RscText; +class RscPicture; +class RscTitles +{ + class CPR_PulseOx + { + idd = 22835; + enableSimulation = 1; + movingEnable = 0; + fadeIn=0; + fadeOut=1; + duration = 10e10; + onLoad = "uiNamespace setVariable ['kat_pulseox', _this select 0];"; + class controls + { + class KatPulseOxIcon: RscPicture + { + idc = 22801; + text = "\x\kat\addons\circulation\UI\kat_pulseox.paa"; + x = QUOTE(0.5 - (FRAME_W(25) / 2)); + y = QUOTE(0.5 - (FRAME_H(45) / 2)); + w = QUOTE(FRAME_W(30)); + h = QUOTE(FRAME_H(30)); + }; + class KatPulseOxSpo2: RscText + { + idc = 22802; + x = QUOTE(0.5 - (FRAME_W(1) / 2)); + y = QUOTE(0.5 - (FRAME_H(25) / 2)); + w = QUOTE(FRAME_W(10)); + h = QUOTE(FRAME_H(10)); + type = 0; + style = 0; + font = "RobotoCondensed"; + sizeEx = QUOTE(KAT_GRID_H * 1.7 * (0.55 / (getResolution select 5))); + shadow = 0; + colorBackground[] = {0,0,0,0}; + colorText[] = {0.8,0.8,0,1}; + text = "O2"; + }; + class KatPulseOxHR: KatPulseOxSpo2 + { + idc = 22803; + x = QUOTE(0.5 + (FRAME_W(7) / 2)); + text = "HR"; + }; + }; + }; + + class CPR_AED_X + { + idd = IDC_AEDX_MONITOR_TITLE; + movingEnable = 0; + fadeIn=0; + fadeOut=1; + duration = 10e10; + onLoad = "uiNamespace setVariable ['KAT_Circulation_AEDX_Monitor_Display', _this select 0];"; + objects[] = {}; + + class ControlsBackground { + class BlackBackground_Title: RscText { + idc = -1; + x = QUOTE(KAT_pxToScreen_X(450)); + y = QUOTE(KAT_pxToScreen_Y(290)); + w = QUOTE(KAT_pxToScreen_W(1062)); + h = QUOTE(KAT_pxToScreen_H(824)); + type = 0; + style = 80; + colorBackground[] = {0,0,0,1}; + colorText[] = {0,0,0,1}; + text = ""; + }; + class Background: BlackBackground_Title {}; + class EKG_Title: RscPicture { + idc = IDC_EKG_DISPLAY_TITLE; + x = QUOTE(KAT_pxToScreen_X(475)); + y = QUOTE(KAT_pxToScreen_Y(234)); + w = QUOTE(KAT_pxToScreen_W(1024)); + h = QUOTE(KAT_pxToScreen_H(1024)); + type = 0; + style = 48; + size = 0; + colorBackground[] = {0,0,0,1}; + colorText[] = {1,1,1,1}; + text = QPATHTOF(ui\ekg_off.paa); + }; + class EKGSlider_Title: RscPicture { + idc = IDC_EKG_SLIDER_TITLE; + x = QUOTE(KAT_pxToScreen_X(250)); + y = QUOTE(KAT_pxToScreen_Y(426)); + w = QUOTE(KAT_pxToScreen_W(256)); + h = QUOTE(KAT_pxToScreen_H(256)); + type = 0; + style = 48; + colorBackground[] = {0,0,0,0}; + colorText[] = {1,1,1,1}; + text = QPATHTOF(ui\ekg_slider.paa); + }; + class HeartRateVitalsDisplayBackground_Title: RscText { + idc = IDC_DISPLAY_HEARTRATE_TEXT_TITLE; + x = QUOTE(KAT_pxToScreen_X(552)); + y = QUOTE(KAT_pxToScreen_Y(866)); + w = QUOTE(KAT_pxToScreen_W(190)); + h = QUOTE(KAT_pxToScreen_H(30)); + type = 0; + style = 0; + font = "RobotoCondensed"; + sizeEx = QUOTE(KAT_GRID_H * 0.6 * (0.55 / (getResolution select 5))); + shadow = 0; + colorBackground[] = {0.77,0.96,0.32,1}; + colorText[] = {0,0,0,1}; + text = "HR"; + }; + class HeartRateVitalsDisplayBackgroundText_Title: HeartRateVitalsDisplayBackground_Title { + idc = -1; + style = 1; + colorBackground[] = {0,0,0,0}; + font = "RobotoCondensedLight"; + text = "bpm"; + }; + class BloodPressureVitalsDisplayBackground_Title: HeartRateVitalsDisplayBackground_Title { + idc = -1; + x = QUOTE(KAT_pxToScreen_X(746)); + w = QUOTE(KAT_pxToScreen_W(260)); + colorBackground[] = {0.04,0.96,0.98,1}; + colorText[] = {0,0,0,1}; + text = "NIBP"; + }; + class BloodPressureVitalsDisplayBackgroundText_Title: BloodPressureVitalsDisplayBackground_Title { + idc = -1; + style = 1; + colorBackground[] = {0,0,0,0}; + font = "RobotoCondensedLight"; + text = "mmHg"; + }; + class BloodPressureVitalsDisplayLine_Title: RscText + { + idc = -1; + style = 2; + x = QUOTE(KAT_pxToScreen_X(760)); + y = QUOTE(KAT_pxToScreen_Y(979)); + w = QUOTE(KAT_pxToScreen_W(120)); + h = QUOTE(KAT_pxToScreen_H(3)); + colorBackground[] = {0.04,0.96,0.98,1}; + colorText[] = {1,1,1,1}; + text = ""; + }; + class RespirationRateDisplayBackground_Title: HeartRateVitalsDisplayBackground_Title { + idc = -1; + x = QUOTE(KAT_pxToScreen_X(1010)); + colorBackground[] = {0.73,0.02,0.74,1}; + colorText[] = {0,0,0,1}; + text = "Resp"; + }; + class RespirationRateDisplayBackgroundText_Title: RespirationRateDisplayBackground_Title { + idc = -1; + style = 1; + colorBackground[] = {0,0,0,0}; + font = "RobotoCondensedLight"; + text = "/min"; + }; + class SpO2DisplayBackground_Title: HeartRateVitalsDisplayBackground_Title { + idc = -1; + x = QUOTE(KAT_pxToScreen_X(1204)); + colorBackground[] = {0.99,0.97,0.02,1}; + colorText[] = {0,0,0,1}; + text = "SpO2"; + }; + class SpO2DisplayBackgroundText_Title: SpO2DisplayBackground_Title { + idc = -1; + style = 1; + colorBackground[] = {0,0,0,0}; + font = "RobotoCondensedLight"; + text = "%"; + }; + class SpO2PulseRateDisplayBorder_Title: RscText { + idc = IDC_DISPLAY_PULSERATEBORDER_TITLE; + x = QUOTE(KAT_pxToScreen_X(1366)); + y = QUOTE(KAT_pxToScreen_Y(907)); + w = QUOTE(KAT_pxToScreen_W(26)); + h = QUOTE(KAT_pxToScreen_H(80)); + type = 0; + style = 0; + font = "RobotoCondensed"; + sizeEx = QUOTE(KAT_GRID_H * 0.6 * (0.55 / (getResolution select 5))); + shadow = 0; + colorBackground[] = {0.99,0.97,0.02,1}; + colorText[] = {0,0,0,0}; + text = ""; + show = 0; + }; + class SpO2PulseRateDisplayBackground_Title: SpO2PulseRateDisplayBorder_Title { + idc = IDC_DISPLAY_PULSERATEBG_TITLE; + x = QUOTE(KAT_pxToScreen_X(1368)); + y = QUOTE(KAT_pxToScreen_Y(910)); + w = QUOTE(KAT_pxToScreen_W(20)); + h = QUOTE(KAT_pxToScreen_H(74)); + colorBackground[] = {0,0,0,1}; + }; + class SpO2PulseRateDisplayBar_Title: SpO2PulseRateDisplayBorder_Title { + idc = IDC_DISPLAY_PULSERATEDSPBAR_TITLE; + x = QUOTE(KAT_pxToScreen_X(1370)); + y = QUOTE(KAT_pxToScreen_Y(911)); + w = QUOTE(KAT_pxToScreen_W(17)); + h = QUOTE(KAT_pxToScreen_H(71)); + }; + class SpO2PulseRateDisplayBarB_Title: SpO2PulseRateDisplayBar_Title { + idc = IDC_DISPLAY_PULSERATEBAR_TITLE; + colorBackground[] = {0,0,0,1}; + }; + class HeartRateDisplay_Title: RscText { + idc = IDC_DISPLAY_HEARTRATE_TITLE; + x = QUOTE(KAT_pxToScreen_X(552)); + y = QUOTE(KAT_pxToScreen_Y(896)); + w = QUOTE(KAT_pxToScreen_W(190)); + h = QUOTE(KAT_pxToScreen_H(80)); + type = 0; + style = 2; + font = "RobotoCondensed"; + sizeEx = QUOTE(KAT_GRID_H * 2.5 * (0.55 / (getResolution select 5))); + shadow = 0; + colorBackground[] = {0,0,0,0}; + colorText[] = {0.77,0.96,0.32,1}; + text = "---"; + }; + class TopBloodPressureDisplay_Title: HeartRateDisplay_Title { + idc = IDC_DISPLAY_BLOODPRESSURE_T_TITLE; + style = 1; + x = QUOTE(KAT_pxToScreen_X(760)); + w = QUOTE(KAT_pxToScreen_W(120)); + h = QUOTE(KAT_pxToScreen_H(70)); + sizeEx = QUOTE(KAT_GRID_H * 1.8 * (0.55 / (getResolution select 5))); + colorText[] = {0.04,0.96,0.98,1}; + text = "---"; + }; + class BottomBloodPressureDisplay_Title: TopBloodPressureDisplay_Title { + idc = IDC_DISPLAY_BLOODPRESSURE_B_TITLE; + y = QUOTE(KAT_pxToScreen_Y(990)); + colorText[] = {0.04,0.96,0.98,1}; + text = "---"; + }; + class MeanBloodPressureDisplay_Title: TopBloodPressureDisplay_Title { + idc = IDC_DISPLAY_BLOODPRESSURE_M_TITLE; + x = QUOTE(KAT_pxToScreen_X(910)); + w = QUOTE(KAT_pxToScreen_W(100)); + h = QUOTE(KAT_pxToScreen_H(60)); + sizeEx = QUOTE(KAT_GRID_H * 1.1 * (0.55 / (getResolution select 5))); + colorText[] = {0.04,0.96,0.98,1}; + text = ""; + }; + class RespirationRateDisplay_Title: HeartRateDisplay_Title { + idc = IDC_DISPLAY_RESP_TITLE; + x = QUOTE(KAT_pxToScreen_X(1010)); + h = QUOTE(KAT_pxToScreen_H(120)); + sizeEx = QUOTE(KAT_GRID_H * 0.7 * (0.55 / (getResolution select 5))); + colorText[] = {0.73,0.02,0.74,1}; + text = "Resp off"; + }; + class SpO2Display_Title: HeartRateDisplay_Title { + idc = IDC_DISPLAY_SPO2_TITLE; + x = QUOTE(KAT_pxToScreen_X(1200)); + w = QUOTE(KAT_pxToScreen_W(170)); + colorText[] = {0.99,0.97,0.02,1}; + text = "---"; + }; + class DateAndTime_Title: RscText { + idc = IDC_DISPLAY_DATEANDTIME_TITLE; + x = QUOTE(KAT_pxToScreen_X(505)); + y = QUOTE(KAT_pxToScreen_Y(318)); + w = QUOTE(KAT_pxToScreen_W(400)); + h = QUOTE(KAT_pxToScreen_H(40)); + type = 0; + style = 0; + font = "RobotoCondensed"; + sizeEx = QUOTE(KAT_GRID_H * 0.8 * (0.55 / (getResolution select 5))); + shadow = 0; + colorBackground[] = {0,0,0,0}; + colorText[] = {1,1,1,1}; + text = "00/00/0000 00:00"; + }; + class Battery_Title: RscPicture { + idc = -1; + x = QUOTE(KAT_pxToScreen_X(1256)); + y = QUOTE(KAT_pxToScreen_Y(322)); + w = QUOTE(KAT_pxToScreen_W(64)); + h = QUOTE(KAT_pxToScreen_H(64)); + style = 48; + colorBackground[] = {0,0,0,0}; + colorText[] = {1,1,1,1}; + text = QPATHTOF(ui\battery.paa); + }; + class ElapsedTime_Title: DateAndTime_Title { + idc = IDC_DISPLAY_ELAPSEDTIME_TITLE; + x = QUOTE(KAT_pxToScreen_X(1335)); + w = QUOTE(KAT_pxToScreen_W(130)); + style = 2; + text = "00:00:00"; + }; + class AEDBackground_Title: RscPicture { + idc = -1; + x = QUOTE(KAT_GUI_GRID_X); + y = QUOTE(KAT_pxToScreen_Y(-300)); + w = QUOTE(KAT_GUI_GRID_W); + h = QUOTE(KAT_GUI_GRID_H); + type = 0; + style = 48; + font = "TahomaB"; + size = 0; + colorBackground[] = {0,0,0,0}; + colorText[] = {1,1,1,1}; + text = QPATHTOF(ui\zoll.paa); + }; + class ShockButton_Title: RscPicture { + idc = IDC_SHOCKBUTTON; + x = QUOTE(KAT_pxToScreen_X(1487)); + y = QUOTE(KAT_pxToScreen_Y(1080)); + w = QUOTE(KAT_pxToScreen_W(256)); + h = QUOTE(KAT_pxToScreen_H(256)); + style = 48; + colorBackground[] = {0,0,0,0}; + colorText[] = {1,1,1,1}; + text = QPATHTOF(ui\shockbutton.paa); + show = 0; + }; + }; + }; +}; diff --git a/addons/circulation/XEH_PREP.hpp b/addons/circulation/XEH_PREP.hpp index a207e6fc7..46ae44a37 100644 --- a/addons/circulation/XEH_PREP.hpp +++ b/addons/circulation/XEH_PREP.hpp @@ -9,6 +9,7 @@ PREP(AEDX_DisconnectVitalsMonitor); PREP(AEDX_ViewMonitor_AnalyzeFeedback); PREP(AEDX_ViewMonitor_Charging); PREP(AEDX_ViewMonitor_Condition); +PREP(AEDX_ViewMonitor_CPR); PREP(AEDX_ViewMonitor); PREP(AEDX_VitalsMonitor_CheckCondition); PREP(AEDX_VitalsMonitor); @@ -45,6 +46,7 @@ PREP(placeAED); PREP(removeLog); PREP(showBloodGas); PREP(treatmentAdvanced_IV); +PREP(PulseOx_ViewMonitor); PREP(updateBloodPressureChange); PREP(updateHeartRate); PREP(updateInternalBleeding); diff --git a/addons/circulation/XEH_preInit.sqf b/addons/circulation/XEH_preInit.sqf index e4971657e..577b7236b 100644 --- a/addons/circulation/XEH_preInit.sqf +++ b/addons/circulation/XEH_preInit.sqf @@ -73,6 +73,16 @@ if (isServer) then { true ] call CBA_Settings_fnc_init; +// Enables ABG Menu and Testing +[ + QGVAR(abgEnable), + "CHECKBOX", + [LLSTRING(SETTING_abg_enable), LLSTRING(SETTING_abg_enable_DESC)], + [CBA_SETTINGS_CAT, ELSTRING(GUI,SubCategory_Basic)], + [false], + true +] call CBA_Settings_fnc_init; + //location for AED - Defi: [ QGVAR(useLocation_AED), diff --git a/addons/circulation/config.cpp b/addons/circulation/config.cpp index 9a681577f..20b716de7 100644 --- a/addons/circulation/config.cpp +++ b/addons/circulation/config.cpp @@ -62,6 +62,7 @@ class CfgPatches { }; }; +#include "RscTitles.hpp" #include "CfgFunctions.hpp" #include "CfgMoves.hpp" #include "CfgEventHandlers.hpp" diff --git a/addons/circulation/defines.hpp b/addons/circulation/defines.hpp index af16c3936..67d707168 100644 --- a/addons/circulation/defines.hpp +++ b/addons/circulation/defines.hpp @@ -9,7 +9,7 @@ #define KAT_pxToScreen_W(X) (X / 2048 * KAT_GUI_GRID_W) #define KAT_pxToScreen_H(X) (X / 2048 * KAT_GUI_GRID_H) -#define KAT_GRID_H ((((safezoneW / safezoneH) min 1.2) / 1.2) / 22) +#define KAT_GRID_H ((((safeZoneW / safeZoneH) min 1.2) / 1.2) / 22) #define IDC_AEDX_MONITOR 70000 #define IDC_EKG_SLIDER 70010 @@ -60,4 +60,26 @@ #define IDC_CHARGE_BAR_100 70057 #define IDC_CHARGE_BAR_120 70058 #define IDC_CHARGE_BAR_150 70059 -#define IDC_CHARGE_BAR_200 70060 \ No newline at end of file +#define IDC_CHARGE_BAR_200 70060 + +#define IDC_AEDX_MONITOR_TITLE 71000 +#define IDC_EKG_SLIDER_TITLE 71001 +#define IDC_DISPLAY_HEARTRATE_TITLE 71002 +#define IDC_DISPLAY_HEARTRATE_TEXT_TITLE 71003 +#define IDC_DISPLAY_BLOODPRESSURE_T_TITLE 71004 +#define IDC_DISPLAY_BLOODPRESSURE_B_TITLE 71005 +#define IDC_DISPLAY_BLOODPRESSURE_M_TITLE 71006 +#define IDC_DISPLAY_RESP_TITLE 71007 +#define IDC_DISPLAY_SPO2_TITLE 71008 +#define IDC_DISPLAY_PULSERATEBORDER_TITLE 71009 +#define IDC_DISPLAY_PULSERATEBG_TITLE 71010 +#define IDC_DISPLAY_PULSERATEDSPBAR_TITLE 71011 +#define IDC_DISPLAY_PULSERATEBAR_TITLE 71012 +#define IDC_DISPLAY_DATEANDTIME_TITLE 71013 +#define IDC_DISPLAY_ELAPSEDTIME_TITLE 71014 +#define IDC_EKG_DISPLAY_TITLE 71015 +#define IDC_EKG_DISPLAY_MIDTEXT_TITLE 71016 +#define IDC_SHOCKBUTTON_TITLE 71017 +#define IDC_AEDMODE_MSG_BG_TITLE 71018 +#define IDC_AEDMODE_MSG_TOP_TITLE 71019 +#define IDC_AEDMODE_MSG_TITLE 71020 \ No newline at end of file diff --git a/addons/circulation/functions/fnc_AEDX_ViewMonitor_CPR.sqf b/addons/circulation/functions/fnc_AEDX_ViewMonitor_CPR.sqf new file mode 100644 index 000000000..1e8de9965 --- /dev/null +++ b/addons/circulation/functions/fnc_AEDX_ViewMonitor_CPR.sqf @@ -0,0 +1,269 @@ +#include "..\script_component.hpp" +#include "..\defines.hpp" +/* + * Author: Blue + * Open AED-X Vitals Monitor dialog + * + * Arguments: + * 0: Medic + * 1: Target + * + * Return Value: + * None + * + * Example: + * [player, cursorTarget, 1] call kat_circulation_fnc_AEDX_ViewMonitor; + * + * Public: No + */ + +params ["_medic", "_target"]; + +GVAR(AEDX_MonitorTarget_Title) = _target; +GVAR(PulseRateReady) = true; + +private _dlg = uiNamespace getVariable ["KAT_Circulation_AEDX_Monitor_Display", displayNull]; + +[{ + params ["_args", "_idPFH"]; + _args params ["_dlg"]; + + if !(GVAR(CPRDisplayActive)) exitWith { + [_idPFH] call CBA_fnc_removePerFrameHandler; + }; + + private _slider = _dlg displayCtrl IDC_EKG_SLIDER_TITLE; + + _slider ctrlSetPosition [KAT_pxToScreen_X(250), (ctrlPosition _slider) select 1, (ctrlPosition _slider) select 2, (ctrlPosition _slider) select 3]; + _slider ctrlCommit 0; + + _slider ctrlSetPosition [KAT_pxToScreen_X(1460), (ctrlPosition _slider) select 1, (ctrlPosition _slider) select 2, (ctrlPosition _slider) select 3]; + _slider ctrlCommit 4; +}, 4, [_dlg]] call CBA_fnc_addPerFrameHandler; + +[{ + params ["_args", "_idPFH"]; + _args params ["_dlg", "_target"]; + + if !(GVAR(CPRDisplayActive)) exitWith { + [_idPFH] call CBA_fnc_removePerFrameHandler; + }; + + private _pads = false; + + if !(GVAR(AEDX_MonitorTarget_Title) isEqualTo objNull) then { + _pads = GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(DefibrillatorPads_Connected), false]; + }; + + if !(_pads) then { + (_dlg displayCtrl IDC_EKG_DISPLAY_MIDTEXT_TITLE) ctrlSetText (LLSTRING(AEDX_Monitor_CheckPads)); + (_dlg displayCtrl IDC_EKG_DISPLAY_TITLE) ctrlSetText (QPATHTOF(ui\ekg_off.paa)); + } else { + (_dlg displayCtrl IDC_EKG_DISPLAY_MIDTEXT_TITLE) ctrlSetText ""; + private _ekgDisplay = QPATHTOF(ui\ekg_off.paa); + + if !(GVAR(AEDX_MonitorTarget_Title) getVariable [QACEGVAR(medical,CPR_provider), objNull] isEqualTo objNull) then { + _ekgDisplay = QPATHTOF(ui\ekg_cpr.paa); + } else { + if (!(GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(heartRestart), false]) && alive GVAR(AEDX_MonitorTarget_Title)) then { + switch (GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(cardiacArrestType), 0]) do { + case 4: {_ekgDisplay = QPATHTOF(ui\ekg_vt.paa);}; + case 3: {_ekgDisplay = QPATHTOF(ui\ekg_vf.paa);}; + case 2: {_ekgDisplay = QPATHTOF(ui\ekg_sinus.paa);}; + case 1: {_ekgDisplay = QPATHTOF(ui\ekg_asystole.paa);}; + default { + if ((GVAR(AEDX_MonitorTarget_Title) getVariable [QACEGVAR(medical,inCardiacArrest), false] && !(GVAR(AdvRhythm))) || !(alive GVAR(AEDX_MonitorTarget_Title))) then { + _ekgDisplay = QPATHTOF(ui\ekg_asystole.paa); + } else { + private _hr = 0; + if (GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(cardiacArrestType), 0] isEqualTo 2) then { + _hr = GVAR(AEDX_MonitorTarget_Title) call FUNC(getCardiacArrestHeartRate); + } else { + _hr = GVAR(AEDX_MonitorTarget_Title) getVariable [QACEGVAR(medical,heartRate), 0]; + }; + + switch (true) do { + case (_hr > 130): {_ekgDisplay = QPATHTOF(ui\ekg_sinus_130.paa);}; + case (_hr > 110 && _hr < 130): {_ekgDisplay = QPATHTOF(ui\ekg_sinus_120.paa);}; + case (_hr > 90 && _hr < 110): {_ekgDisplay = QPATHTOF(ui\ekg_sinus_100.paa);}; + case (_hr > 70 && _hr < 90): {_ekgDisplay = QPATHTOF(ui\ekg_sinus.paa);}; + case (_hr > 50 && _hr < 70): {_ekgDisplay = QPATHTOF(ui\ekg_sinus_60.paa);}; + case (_hr > 0): {_ekgDisplay = QPATHTOF(ui\ekg_sinus_40.paa);}; + default { + _ekgDisplay = QPATHTOF(ui\ekg_asystole.paa); + }; + }; + }; + }; + }; + } else { + _ekgDisplay = QPATHTOF(ui\ekg_asystole.paa); + }; + }; + + (_dlg displayCtrl IDC_EKG_DISPLAY_TITLE) ctrlSetText (_ekgDisplay); + }; + + // Handle date and time display - [year,month,day,hour,min] + + (_dlg displayCtrl IDC_DISPLAY_DATEANDTIME_TITLE) ctrlSetText (format ["%1/%2/%3 %4:%5", (["", "0"] select (date select 2 < 10)) + str (date select 2), (["", "0"] select (date select 1 < 10)) + str (date select 1), date select 0, (["", "0"] select (date select 3 < 10)) + str (date select 3), (["", "0"] select (date select 4 < 10)) + str (date select 4)]); + (_dlg displayCtrl IDC_DISPLAY_ELAPSEDTIME_TITLE) ctrlSetText (format ["%1:%2:%3", (["", "0"] select (floor time / 3600 < 10)) + str (floor(time/3600)), (["", "0"] select (floor time / 3600 - floor time / 3600 * 60 < 10)) + str (floor(((time/3600) - floor(time/3600)) * 60)), (["", "0"] select (floor time / 60 - floor time / 60 * 60 < 10)) + str (floor(((time/60) - floor(time/60)) * 60))]); + + if (GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(AED_X_VitalsMonitor_Connected), false]) then { + private _partIndex = ((GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(AED_X_VitalsMonitor_Provider), [-1, -1, -1]]) select 2); + + (_dlg displayCtrl IDC_DISPLAY_PULSERATEBORDER_TITLE) ctrlShow true; + (_dlg displayCtrl IDC_DISPLAY_PULSERATEBG_TITLE) ctrlShow true; + (_dlg displayCtrl IDC_DISPLAY_PULSERATEDSPBAR_TITLE) ctrlShow true; + (_dlg displayCtrl IDC_DISPLAY_PULSERATEBAR_TITLE) ctrlShow true; + + private _PRBar = _dlg displayCtrl IDC_DISPLAY_PULSERATEBAR_TITLE; + + if (!(HAS_TOURNIQUET_APPLIED_ON(GVAR(AEDX_MonitorTarget_Title),_partIndex))) then { + if (GVAR(PulseRateReady)) then { + GVAR(PulseRateReady) = false; + private _pr = GVAR(AEDX_MonitorTarget_Title) getVariable [QACEGVAR(medical,heartRate), 0]; + + if (_pr > 0) then { + private _delay = 60/_pr; + + private _randomHigh = round(random [2, 2, 3]); + _PRBar ctrlSetPosition [(ctrlPosition _PRBar) select 0, (ctrlPosition _PRBar) select 1, (ctrlPosition _PRBar) select 2, KAT_pxToScreen_H(_randomHigh)]; + _PRBar ctrlCommit (0.2 max (_delay/4)); + + [{ + params ["_PRBar", "_delay"]; + + private _randomMid = round(random [24, 25, 29]); + + _PRBar ctrlSetPosition [(ctrlPosition _PRBar) select 0, (ctrlPosition _PRBar) select 1, (ctrlPosition _PRBar) select 2, KAT_pxToScreen_H(_randomMid)]; + _PRBar ctrlCommit 0.1; + + [{ + params ["_PRBar", "_delay"]; + + private _randomLow = round(random [67, 68, 70]); + _PRBar ctrlSetPosition [(ctrlPosition _PRBar) select 0, (ctrlPosition _PRBar) select 1, (ctrlPosition _PRBar) select 2, KAT_pxToScreen_H(_randomLow)]; + _PRBar ctrlCommit (0.2 max (_delay/2)); + }, [_PRBar, _delay], 0.1] call CBA_fnc_waitAndExecute; + }, [_PRBar, _delay], (0.2 max (_delay/3))] call CBA_fnc_waitAndExecute; + + [{ + GVAR(PulseRateReady) = true; + }, [], _delay] call CBA_fnc_waitAndExecute; + } else { + _PRBar ctrlSetPosition [(ctrlPosition _PRBar) select 0, (ctrlPosition _PRBar) select 1, (ctrlPosition _PRBar) select 2, KAT_pxToScreen_H(71)]; + _PRBar ctrlCommit 0.1; + + [{ + GVAR(PulseRateReady) = true; + }, [], 0.1] call CBA_fnc_waitAndExecute; + }; + }; + } else { + _PRBar ctrlSetPosition [(ctrlPosition _PRBar) select 0, (ctrlPosition _PRBar) select 1, (ctrlPosition _PRBar) select 2, KAT_pxToScreen_H(71)]; + _PRBar ctrlCommit 0; + }; + } else { + (_dlg displayCtrl IDC_DISPLAY_PULSERATEBORDER_TITLE) ctrlShow false; + (_dlg displayCtrl IDC_DISPLAY_PULSERATEBG_TITLE) ctrlShow false; + (_dlg displayCtrl IDC_DISPLAY_PULSERATEDSPBAR_TITLE) ctrlShow false; + (_dlg displayCtrl IDC_DISPLAY_PULSERATEBAR_TITLE) ctrlShow false; + }; +}, 0, [_dlg, _target]] call CBA_fnc_addPerFrameHandler; + +[{ + params ["_args", "_idPFH"]; + _args params ["_dlg"]; + + private _pads = false; + private _vitalsMonitor = false; + + if !(GVAR(AEDX_MonitorTarget_Title) isEqualTo objNull) then { + _pads = GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(DefibrillatorPads_Connected), false]; + _vitalsMonitor = GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(AED_X_VitalsMonitor_Connected), false]; + }; + + private _hr = 0; + private _pr = 0; + private _bp = [0,0]; + private _spO2 = 0; + + if !(GVAR(CPRDisplayActive)) exitWith { + [_idPFH] call CBA_fnc_removePerFrameHandler; + }; + + if (!_pads && !_vitalsMonitor) exitWith { + (_dlg displayCtrl IDC_DISPLAY_HEARTRATE_TITLE) ctrlSetText "---"; + (_dlg displayCtrl IDC_DISPLAY_BLOODPRESSURE_T_TITLE) ctrlSetText "---"; + (_dlg displayCtrl IDC_DISPLAY_BLOODPRESSURE_B_TITLE) ctrlSetText "---"; + (_dlg displayCtrl IDC_DISPLAY_BLOODPRESSURE_M_TITLE) ctrlSetText ""; + (_dlg displayCtrl IDC_DISPLAY_SPO2_TITLE) ctrlSetText "---"; + }; + + if !(GVAR(AEDX_MonitorTarget_Title) getVariable [QACEGVAR(medical,CPR_provider), objNull] isEqualTo objNull) then { + + private _rhythmHR = 0; + + if(GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(cardiacArrestType), 0] > 0) then { + _rhythmHR = GVAR(AEDX_MonitorTarget_Title) call FUNC(getCardiacArrestHeartRate); + } else { + _rhythmHR = GVAR(AEDX_MonitorTarget_Title) getVariable [QACEGVAR(medical,heartRate), 0]; + }; + + _hr = random [100, 100 + _rhythmHR / 2, _rhythmHR]; + + if (GVAR(AED_X_VitalsMonitor_BloodPressureInterval) > 0) then { + _bp = GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(StoredBloodPressure), [0,0]]; + } else { + _bp = GVAR(AEDX_MonitorTarget_Title) getVariable [QACEGVAR(medical,bloodPressure), [0,0]]; + }; + } else { + if !(GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(heartRestart), false]) then { + if (GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(cardiacArrestType), 0] > 0) then { + _hr = GVAR(AEDX_MonitorTarget_Title) call FUNC(getCardiacArrestHeartRate); + + if (GVAR(AED_X_VitalsMonitor_BloodPressureInterval) > 0) then { + _bp = GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(StoredBloodPressure), [0,0]]; + }; + } else { + _hr = GVAR(AEDX_MonitorTarget_Title) getVariable [QACEGVAR(medical,heartRate), 0]; + + if (GVAR(AED_X_VitalsMonitor_BloodPressureInterval) > 0) then { + _bp = GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(StoredBloodPressure), [0,0]]; + } else { + _bp = GVAR(AEDX_MonitorTarget_Title) getVariable [QACEGVAR(medical,bloodPressure), [0,0]]; + }; + }; + }; + }; + + private _partIndex = ((GVAR(AEDX_MonitorTarget_Title) getVariable [QGVAR(AED_X_VitalsMonitor_Provider), [-1, -1, -1]]) select 2); + + if (HAS_TOURNIQUET_APPLIED_ON(GVAR(AEDX_MonitorTarget_Title),_partIndex)) then { + _bp = [0,0]; + } else { + _spO2 = GET_KAT_SPO2(GVAR(AEDX_MonitorTarget_Title)); + _pr = GVAR(AEDX_MonitorTarget_Title) getVariable [QACEGVAR(medical,heartRate), 0]; + }; + + if (_pads) then { + (_dlg displayCtrl IDC_DISPLAY_HEARTRATE_TITLE) ctrlSetText (format["%1", round(_hr)]); + (_dlg displayCtrl IDC_DISPLAY_HEARTRATE_TEXT_TITLE) ctrlSetText (LLSTRING(AEDX_Monitor_HR)); + } else { + (_dlg displayCtrl IDC_DISPLAY_HEARTRATE_TITLE) ctrlSetText (format["%1", round(_pr)]); + (_dlg displayCtrl IDC_DISPLAY_HEARTRATE_TEXT_TITLE) ctrlSetText (LLSTRING(AEDX_Monitor_PR)); + }; + + if (_vitalsMonitor) then { + (_dlg displayCtrl IDC_DISPLAY_BLOODPRESSURE_T_TITLE) ctrlSetText (format["%1", round(_bp select 1)]); + (_dlg displayCtrl IDC_DISPLAY_BLOODPRESSURE_B_TITLE) ctrlSetText (format["%1", round(_bp select 0)]); + (_dlg displayCtrl IDC_DISPLAY_BLOODPRESSURE_M_TITLE) ctrlSetText (format["(%1)", round(((_bp select 1) - (_bp select 0))/3 + (_bp select 0))]); + (_dlg displayCtrl IDC_DISPLAY_SPO2_TITLE) ctrlSetText (format["%1", round(_spO2)]); + } else { + (_dlg displayCtrl IDC_DISPLAY_BLOODPRESSURE_T_TITLE) ctrlSetText "---"; + (_dlg displayCtrl IDC_DISPLAY_BLOODPRESSURE_B_TITLE) ctrlSetText "---"; + (_dlg displayCtrl IDC_DISPLAY_BLOODPRESSURE_M_TITLE) ctrlSetText ""; + (_dlg displayCtrl IDC_DISPLAY_SPO2_TITLE) ctrlSetText "---"; + }; +}, 1, [_dlg]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/circulation/functions/fnc_AEDX_ViewMonitor_Charging.sqf b/addons/circulation/functions/fnc_AEDX_ViewMonitor_Charging.sqf index 1f4f00b67..f6e6585c6 100644 --- a/addons/circulation/functions/fnc_AEDX_ViewMonitor_Charging.sqf +++ b/addons/circulation/functions/fnc_AEDX_ViewMonitor_Charging.sqf @@ -261,7 +261,7 @@ if (_skip) then { // Skip visual charging process if (GVAR(AEDX_MonitorShockAdministered)) then { ctrlSetText [IDC_CHARGE_STATUS, LLSTRING(AEDX_Monitor_DeliveredEnergy)]; (_dlg displayCtrl IDC_CHARGE_STATUS) ctrlSetBackgroundColor [0.05, 0.85, 0.36, 1]; - (_dlg displayCtrl IDC_CHARGE_STATUS) ctrlSetFontHeight (GRID_H * 1.1); + (_dlg displayCtrl IDC_CHARGE_STATUS) ctrlSetFontHeight (KAT_GRID_H * 1.1); } else { ctrlSetText [IDC_CHARGE_STATUS, LLSTRING(AEDX_Monitor_DISARMED)]; (_dlg displayCtrl IDC_CHARGE_STATUS) ctrlSetBackgroundColor [0.94, 0.94, 0.03, 1]; @@ -274,7 +274,7 @@ if (_skip) then { // Skip visual charging process (_dlg displayCtrl IDC_CHARGE_STATUS) ctrlSetBackgroundColor [1, 0.35, 0, 0]; ctrlSetText [IDC_CHARGE_STATUS, LLSTRING(AEDX_Monitor_CHARGING)]; - (_dlg displayCtrl IDC_CHARGE_STATUS) ctrlSetFontHeight (GRID_H * 1.5); + (_dlg displayCtrl IDC_CHARGE_STATUS) ctrlSetFontHeight (KAT_GRID_H * 1.5); (_dlg displayCtrl IDC_CHARGE_ENERGY_AMOUNT) ctrlSetTextColor [1, 1, 1, 1]; (_dlg displayCtrl IDC_CHARGE_ENERGY_AMOUNT) ctrlSetBackgroundColor [0, 0, 0, 1]; diff --git a/addons/circulation/functions/fnc_CPRStart.sqf b/addons/circulation/functions/fnc_CPRStart.sqf index 4d983776f..b7129b3cd 100644 --- a/addons/circulation/functions/fnc_CPRStart.sqf +++ b/addons/circulation/functions/fnc_CPRStart.sqf @@ -22,6 +22,9 @@ _patient setVariable [QACEGVAR(medical,CPR_provider), _medic, true]; _medic setVariable [QGVAR(isPerformingCPR), true, true]; GVAR(CPRTarget) = _patient; +GVAR(CPRProvider) = _medic; +GVAR(CPRDisplayActive) = false; +GVAR(PulseOxDisplay) = false; GVAR(CPRCancel_EscapeID) = [0x01, [false, false, false], { GVAR(CPRTarget) setVariable [QACEGVAR(medical,CPR_provider), objNull, true]; @@ -31,6 +34,17 @@ GVAR(CPRCancel_MouseID) = [0xF0, [false, false, false], { GVAR(CPRTarget) setVariable [QACEGVAR(medical,CPR_provider), objNull, true]; }, "keydown", "", false, 0] call CBA_fnc_addKeyHandler; +GVAR(CPRDevice_Iterate) = [0xF1, [false, false, false], { + private _deviceCode = GVAR(CPRTarget) getVariable [QGVAR(deviceCode), 0]; + _deviceCode = [(_deviceCode + 1), 1] select (_deviceCode == 2); + private _deviceArray = [true,(GVAR(CPRTarget) getVariable [QEGVAR(breathing,pulseoximeter), false]),((GVAR(CPRTarget) getVariable [QGVAR(AED_X_VitalsMonitor_Connected), false]) || (GVAR(CPRTarget) getVariable [QGVAR(DefibrillatorPads_Connected), false]))]; + while { !(_deviceArray select _deviceCode) } do { + _deviceCode = [0, (_deviceCode + 1)] select (_deviceCode < 2); + }; + GVAR(CPRTarget) setVariable [QGVAR(deviceCode), _deviceCode, true]; + true +}, "keydown", "", false, 0] call CBA_fnc_addKeyHandler; + private _CPRStartTime = CBA_missionTime + 2.5; ACEGVAR(medical_gui,pendingReopen) = false; // Prevent medical menu from reopening @@ -47,10 +61,56 @@ if (_notInVehicle) then { loopCPR = true; }; +[{ + params ["_args", "_idPFH"]; + _args params ["_medic", "_patient"]; + + private _deviceCode = _patient getVariable [QGVAR(deviceCode), 0]; + + if ((_patient getVariable [QACEGVAR(medical,CPR_provider), objNull]) isEqualTo objNull) exitWith { + [_idPFH] call CBA_fnc_removePerFrameHandler; + GVAR(CPRDisplayActive) = false; + GVAR(PulseOxDisplay) = false; + + "CPR_MONITOR" cutText ["", "PLAIN",0,true]; + _patient setVariable [QGVAR(deviceCode), 0, true]; + }; + + switch (true) do { + case (_deviceCode == 2): { + if ((_patient getVariable [QGVAR(AED_X_VitalsMonitor_Connected), false]) || (_patient getVariable [QGVAR(DefibrillatorPads_Connected), false])) then { + if !(GVAR(CPRDisplayActive)) then { + "CPR_MONITOR" cutText ["", "PLAIN",0,true]; + "CPR_MONITOR" cutRsc ["CPR_AED_X", "PLAIN", 0, true]; + GVAR(CPRDisplayActive) = true; + [_medic, GVAR(CPRTarget)] call FUNC(AEDX_ViewMonitor_CPR); + }; + } else { + "CPR_MONITOR" cutText ["", "PLAIN",0,true]; + GVAR(CPRDisplayActive) = false; + }; + }; + case (_deviceCode == 1): { + if ((_patient getVariable [QEGVAR(breathing,pulseoximeter), false])) then { + if !(GVAR(PulseOxDisplay)) then { + "CPR_MONITOR" cutText ["", "PLAIN",0,true]; + "CPR_MONITOR" cutRsc ["CPR_PulseOx", "PLAIN", 0, true]; + GVAR(PulseOxDisplay) = true; + [_medic, GVAR(CPRTarget)] call FUNC(PulseOx_ViewMonitor); + }; + } else { + "CPR_MONITOR" cutText ["", "PLAIN",0,true]; + GVAR(PulseOxDisplay) = false; + }; + }; + case (_deviceCode == 0): { "CPR_MONITOR" cutText ["", "PLAIN"]; GVAR(PulseOxDisplay) = false; GVAR(CPRDisplayActive) = false;}; + }; +}, 2, [_medic, _patient]] call CBA_fnc_addPerFrameHandler; + [{ params ["_medic", "_patient", "_notInVehicle", "_CPRStartTime"]; - [LLSTRING(StopCPR), "", ""] call ACEFUNC(interaction,showMouseHint); + [LLSTRING(StopCPR), LLSTRING(ChangeCPRDevice), ""] call ACEFUNC(interaction,showMouseHint); [LLSTRING(StartCPR), 1.5, _medic] call ACEFUNC(common,displayTextStructured); [{ @@ -74,6 +134,7 @@ if (_notInVehicle) then { [] call ACEFUNC(interaction,hideMouseHint); [GVAR(CPRCancel_EscapeID), "keydown"] call CBA_fnc_removeKeyHandler; [GVAR(CPRCancel_MouseID), "keydown"] call CBA_fnc_removeKeyHandler; + [GVAR(CPRDevice_Iterate), "keydown"] call CBA_fnc_removeKeyHandler; if (_notInVehicle) then { [_medic, "AinvPknlMstpSnonWnonDnon_medicEnd", 2] call ACEFUNC(common,doAnimation); diff --git a/addons/circulation/functions/fnc_PulseOx_ViewMonitor.sqf b/addons/circulation/functions/fnc_PulseOx_ViewMonitor.sqf new file mode 100644 index 000000000..440cfe23e --- /dev/null +++ b/addons/circulation/functions/fnc_PulseOx_ViewMonitor.sqf @@ -0,0 +1,34 @@ +#include "..\script_component.hpp" +#include "..\defines.hpp" +/* + * Author: Mazinski + * Open PulseOx View Monitor + * + * Arguments: + * 0: Medic + * 1: Target + * + * Return Value: + * None + * + * Example: + * [player, cursorTarget, 1] call kat_circulation_fnc_PulseOx_ViewMonitor.sqf; + * + * Public: No + */ + +params ["_medic", "_target"]; + +private _dlg = uiNamespace getVariable ["kat_pulseox", displayNull]; + +[{ + params ["_args", "_idPFH"]; + _args params ["_dlg", "_target"]; + + if !(GVAR(PulseOxDisplay)) exitWith { + [_idPFH] call CBA_fnc_removePerFrameHandler; + }; + + (_dlg displayCtrl 22802) ctrlSetText (format["%1", (GET_KAT_SPO2(_target)) toFixed 1]); + (_dlg displayCtrl 22803) ctrlSetText (format["%1", round(GET_HEART_RATE(_target))]); +}, 1, [_dlg, _target]] call CBA_fnc_addPerFrameHandler; \ No newline at end of file diff --git a/addons/circulation/functions/fnc_addArterialApplyActions.sqf b/addons/circulation/functions/fnc_addArterialApplyActions.sqf index 2e469d019..c75861697 100644 --- a/addons/circulation/functions/fnc_addArterialApplyActions.sqf +++ b/addons/circulation/functions/fnc_addArterialApplyActions.sqf @@ -30,9 +30,9 @@ private _fnc_getActions = { if (_idNumber > 0) then { private _resultSampleMap = missionNamespace getVariable [QEGVAR(circulation,resultSampleMap), []]; - _resultSampleMap = _resultSampleMap get _idNumber; - _resultSampleMap = _resultSampleMap select 1; - private _patient = _resultSampleMap select 0; + _resultSampleArray = _resultSampleMap get _idNumber; + _resultSampleActual = _resultSampleArray select 1; + private _patient = _resultSampleArray select 0; _actions pushBack [ [ @@ -45,7 +45,7 @@ private _fnc_getActions = { [] ] call ACEFUNC(interact_menu,createAction), [], - [_resultSampleMap, _target, _idNumber, _player] + [_resultSampleActual, _target, _idNumber, _player] ]; }; } forEach ([_player, 0] call ACEFUNC(common,uniqueItems)); @@ -54,4 +54,4 @@ private _fnc_getActions = { }; -[[], _fnc_getActions, _player, QGVAR(actionsCache), 9999, "cba_events_loadoutEvent"] call ACEFUNC(common,cachedCall); \ No newline at end of file +[[], _fnc_getActions, _player, QGVAR(actionsCache), 9999, "cba_events_loadoutEvent"] call ACEFUNC(common,cachedCall); diff --git a/addons/circulation/functions/fnc_addArterialTestActions.sqf b/addons/circulation/functions/fnc_addArterialTestActions.sqf index 2631a67d9..b73ce230b 100644 --- a/addons/circulation/functions/fnc_addArterialTestActions.sqf +++ b/addons/circulation/functions/fnc_addArterialTestActions.sqf @@ -56,4 +56,4 @@ private _fnc_getActions = { }; -[[], _fnc_getActions, _player, QGVAR(actionsCache), 9999, "cba_events_loadoutEvent"] call ACEFUNC(common,cachedCall); \ No newline at end of file +[[], _fnc_getActions, _player, QGVAR(actionsCache), 9999, "cba_events_loadoutEvent"] call ACEFUNC(common,cachedCall); diff --git a/addons/circulation/functions/fnc_attachBloodGas.sqf b/addons/circulation/functions/fnc_attachBloodGas.sqf index cb974d473..8205f01be 100644 --- a/addons/circulation/functions/fnc_attachBloodGas.sqf +++ b/addons/circulation/functions/fnc_attachBloodGas.sqf @@ -16,8 +16,7 @@ */ params ["_entries"]; _entries params ["_bloodGas", "_patient", "_idNumber", "_player"]; -_bloodGas params ["_patientName", "_bloodGasArray"]; -_patient setVariable [QGVAR(testedBloodGas), _bloodGasArray, true]; +_patient setVariable [QGVAR(testedBloodGas), _bloodGas, true]; _player removeItem (format ["KAT_bloodResult_%1",_idNumber]); \ No newline at end of file diff --git a/addons/circulation/functions/fnc_handleRespawn.sqf b/addons/circulation/functions/fnc_handleRespawn.sqf index 9a77acc69..a05ad3097 100644 --- a/addons/circulation/functions/fnc_handleRespawn.sqf +++ b/addons/circulation/functions/fnc_handleRespawn.sqf @@ -39,4 +39,6 @@ _unit setVariable [QGVAR(bloodtype), [_unit, _dead, true] call FUNC(generateBloo _unit setVariable [QGVAR(internalBleeding), 0, true]; _unit setVariable [QGVAR(StoredBloodPressure), [0,0], true]; +_unit setVariable [QGVAR(deviceCode), 0, true]; + [_unit] call FUNC(fullHealLocal); diff --git a/addons/circulation/functions/fnc_init.sqf b/addons/circulation/functions/fnc_init.sqf index ad79f1a3a..93f3068b4 100644 --- a/addons/circulation/functions/fnc_init.sqf +++ b/addons/circulation/functions/fnc_init.sqf @@ -19,4 +19,6 @@ params ["_unit", ["_isRespawn", true]]; if (!local _unit) exitWith {}; -[_unit] call FUNC(fullHealLocal); \ No newline at end of file +[_unit] call FUNC(fullHealLocal); + +_unit setVariable [QGVAR(deviceCode), 0, true]; \ No newline at end of file diff --git a/addons/circulation/functions/fnc_showBloodGas.sqf b/addons/circulation/functions/fnc_showBloodGas.sqf index d683e904b..808636bdc 100644 --- a/addons/circulation/functions/fnc_showBloodGas.sqf +++ b/addons/circulation/functions/fnc_showBloodGas.sqf @@ -28,7 +28,7 @@ private _resultSampleMap = missionNamespace getVariable [QEGVAR(circulation,resu _resultCounter = [_resultCounter +1, 1] select (_resultCounter == 20); missionNamespace setVariable [QEGVAR(circulation,resultCounter), _resultCounter, true]; -_resultSampleMap set [_resultCounter, [name(_patient), _bloodGas]]; +_resultSampleMap set [_resultCounter, [_patientName, _bloodGasArray]]; missionNamespace setVariable [QEGVAR(circulation,resultSampleMap), _resultSampleMap, true]; private _itemStr = format ["KAT_bloodResult_%1", _resultCounter]; diff --git a/addons/circulation/stringtable.xml b/addons/circulation/stringtable.xml index 90b38effd..c8e8f400d 100644 --- a/addons/circulation/stringtable.xml +++ b/addons/circulation/stringtable.xml @@ -23,7 +23,9 @@ AI Simple Medical activated? AI/KI simpel medische simulatie geactiveerd? ¿Activar Médico Simple para IA? - AI用単純化医療を有効化しますか? + AI用単純化医療を有効化 + AI Simple Medical attivato? + Médecine simplifiée pour l'IA ? Advanced Rhythms activated? @@ -37,7 +39,7 @@ Ritmo avanzato attivato? ¿Ritmo avanzado activado? Pokročilý Rytmus aktivován? - 高度な心調律を有効化しますか? + 高度な心調律を有効化 Продвинутый ритм активирован? Ritmo avançado ativado? Edistyneet sykerytmit aktivoitu? @@ -937,6 +939,7 @@ Analysoi rytmiä Анализировать частоту сердечных сокращений Analyseer hartritme + Analizzare il ritmo Check Dogtags @@ -1040,6 +1043,7 @@ Aseta AUD-tyynyt Установить электроды AED Plaats AED pads + Posizionare i pad AED Station: Place AED Pads @@ -1052,6 +1056,7 @@ Asema: aseta AUD-tyynyt Станция: установить электродов AED Station: Plaats AED pads + Postazione: Posizionare i pad AED Vehicle: Place AED Pads @@ -1064,6 +1069,7 @@ Ajoneuvo: aseta AUD-tyynyt Транспорт: установить электроды AED Voertuig: Plaats AED pads + Veicolo: Posizionare i pad AED Place AED-X Pads @@ -1077,6 +1083,7 @@ Aseta AUD-X-tyynyt Установить электроды AED-X Plaats AED-X pads + Posizionare i pad AED-X Station: Place AED-X Pads @@ -1089,6 +1096,7 @@ Asema: aseta AUD-X-tyynyt Станция: установить электроды AED-X Station: Plaats AED-X pads + Postazione: Posizionare i pad AED-X Vehicle: Place AED-X Pads @@ -1101,6 +1109,7 @@ Ajonuevo: aseta AUD-X-tyynyt Транспорт: установить электроды AED-X Voertuig: Plaats AED-X pads + Veicolo: Posizionare i pad AED-X Remove Defibrillator Pads @@ -1114,6 +1123,7 @@ Poista defibrillaattorityynyt Снять электроды дефибриллятора Verwijder defibrillatiepads + Rimuovere i pad del defibrillatore Placing Defibrillator Pads @@ -1127,6 +1137,7 @@ Defibrillaattorityynyjen asettaminen Установка электродов дефибриллятора Defibrillatiepads worden geplaatst + Posizionamento dei pad del defibrillatore Removing Defibrillator Pads @@ -1140,6 +1151,7 @@ Defibrillaattorityynyjen poistaminen Снять электроды дефибриллятора Defibrillatiepads worden verwijderd + Rimozione dei pad del defibrillatore Administer Shock @@ -1153,6 +1165,7 @@ Anna sokki potilaalle Применить разряд Dien schok toe + Somministrare la scarica Charge Defibrillator @@ -1166,6 +1179,7 @@ Lataa defibrillaattori Зарядить дифибриллятор Laad defribrillator op + Caricare il defibrillatore Cancel Charge @@ -1179,6 +1193,7 @@ Peruuta sähkölataus Отменить заряд Annuleer lading + Annullare la carica View Monitor @@ -1192,6 +1207,7 @@ Näytä monitori Просмотр монитора Kijk op monitor + Visualizzare il monitor Connect Vitals Monitor @@ -1205,6 +1221,7 @@ Liitä terveysmonitori Подключить монитор жизненно важных показателей Verbind de vitale waarden monitor + Collegare il monitor dei parametri vitali Station: Connect Vitals Monitor @@ -1218,6 +1235,7 @@ Asema: Liitä kuntomonitori Станция: Подключить монитор жизненно важных показателей Station: Verbind de vitale waarden monitor + Postazione: Collegare il monitor dei parametri vitali Vehicle: Connect Vitals Monitor @@ -1267,6 +1285,7 @@ Terveysmonitorin ääni päällä Звук монитора жизненно важных органов ВКЛЮЧЕН Vitale waarden monitor audio AAN + Audio monitor dei parametri vitali ATTIVO Vitals Monitor Audio OFF @@ -1280,6 +1299,7 @@ Tärkeän näytön ääni pois päältä Звук монитора жизненно важных функций ВЫКЛЮЧЕН Vitale waarden monitor UIT + Audio monitor dei parametri vitali SPENTO Connecting @@ -1418,6 +1438,7 @@ Aseta AUD-X Разместить AED-X Plaats AED-X + Posizionare AED-X Pick Up AED @@ -1448,6 +1469,7 @@ Hae AUD-X Подобрать AED-X Pak AED-X op + Prendere AED-X Toggle Volume @@ -1460,6 +1482,7 @@ Vaihda äänenvoimakkuutta Переключить громкость Geluid omwisselen + Commutare volume Measure Blood Pressure @@ -1472,6 +1495,7 @@ Mittaa verenpaine Измерить артериальное давление Meet bloeddruk + Misurare la pressione sanguigna Check Pads @@ -1484,6 +1508,7 @@ Tarkista tyynyt Проверить электроды Controleer pads + Controllare i pad SHOCK ADVISED @@ -1496,6 +1521,7 @@ SOKI SUOSITELLAAN Подсказка о разряде SCHOK GEADVISEERD + SCARICA CONSIGLIATA NO SHOCK ADVISED @@ -1508,6 +1534,7 @@ EI SUOSITTELUA SHOCKIA Никаких подсказок о разряде SCHOK NIET GEADVISEERD + NESSUNA SCARICA CONSIGLIATA ANALYZING ECG @@ -1520,6 +1547,7 @@ EKG:N ANALYSOINTI Анализ ЭКГ ECG-ANALYSE + ANALIZZANDO ECG CHARGED @@ -1532,6 +1560,7 @@ LAADUT Заряженный OPGELADEN + CARICATO CHARGING @@ -1544,6 +1573,7 @@ LATAUS Зарядка WORDT GELADEN + CARICAMENTO IN CORSO AED DISARMED @@ -1556,6 +1586,7 @@ AED POIS KÄYTÖSTÄ AED разобран AED GEDEACTIVEERD + AED DISARMATO DISARMED @@ -1568,6 +1599,7 @@ POIS KÄYTÖSTÄ Разобран GEDEACTIVEERD + DISARMATO Delivered Energy @@ -1580,6 +1612,7 @@ Toimitettu shokki Передаваемая энергия Geleverde energie + Energia erogata Defibrillator @@ -1591,6 +1624,7 @@ Defibrillator Desfibrilador Defibrillator + Defibrillatore Selected Energy @@ -1602,6 +1636,7 @@ Ausgewählte Leistung Energia selecionada Geselecteerde energie + Energia selezionata ENERGY DELIVERED @@ -1614,6 +1649,7 @@ ISKU TOIMITETTU Передаваемая энергия GELEVERDE ENERGIE + ENERGIA EROGATA Stand Clear @@ -1626,6 +1662,7 @@ Väistyä Не прикасайтесь к пациенту Afstand houden + Allontanarsi Perform CPR @@ -1638,6 +1675,7 @@ Suorita elvytys Выполнить СЛР Voer CPR uit + Eseguire RCP PUSH SHOCK @@ -1650,6 +1688,7 @@ PAINA SHOKKI РАЗРЯД DRUK SCHOK + PREMERE SCARICA Push Analyze @@ -1662,6 +1701,7 @@ Paina analysoida Анализировать Druk analyse + Premere Analizza HR @@ -1674,6 +1714,7 @@ HR ЧСС HR + HR PR @@ -1686,30 +1727,39 @@ PR Ритм (PR) PR + PR %1 Blood Sample %1 bloedstaal %1 Muestra de sangre %1 血液サンプル + %1 Campione di sangue + %1 échantillon de sang Run ABG Test Voer ABG test uit Realizar prueba ABG ABGテストを行う + Eseguire test ABG + Exécuter le test ABG ABG Test ABG test Prueba ABG ABGテスト + Test ABG + Test ABG Apply %1 Test Voer %1 test uit Realizar prueba %1 %1 テストを実施 + Applicare il %1 Test + Appliquer le test %1 Blood groups cheat sheet @@ -1945,6 +1995,16 @@ Устанавливает группы крови, которые будут присвоены игрокам на основе их Steam ID \nГруппы крови разделены запятой (","), список должен содержать в общей сложности 10 групп крови Bepaald de bloedgroepen die aan spelers worden gegeven op basis van hun SteamID. \nBloedgroepen zijn gescheiden met een comma(","). De lijst moet 10 verschillende bloedgroepen bevatten + + Enable ABG Testing + Activer le test ABG + ABGテストを有効化 + + + Enables ABG Testing and ACE Menu Visibility + Permet le test ABG et la visibilité du menu ACE + ABGテストを有効化しACEメニューに表示します + %1 checked dogtags blood group: %2 %1 hat die Blutgruppe der Erkennungsmarke überprüft: %2 @@ -1954,6 +2014,7 @@ %1 a vérifié le groupe sanguin sur la plaque d'identité : %2 %1 checou %1 heeft de bloedgroep van het herkeningsplaatje gecontroleerd: %2 + %1 ha controllato il gruppo sanguigno delle targhette identificative: %2 Locations AED @@ -2002,6 +2063,7 @@ AUD AED AED + AED AED-X @@ -2014,6 +2076,7 @@ AUD-X AED-X AED-X + AED-X Automated External Defibrillator @@ -2062,6 +2125,7 @@ %1 annettu sokki (%2) % 1 использовал разряд (% 2) %1 heeft een schok toegediend (%2) + %1 ha somministrato la scarica (%2) %1 attached defibrillator pads (%2) @@ -2074,6 +2138,7 @@ %1 kiinnitetyt defibrillaattorityynyt (%2) %1 прикрепил электроды (%2) %1 heeft defibrillator pad geplaatst (%2) + %1 ha attaccato i pad del defibrillatore (%2) %1 removed defibrillator pads @@ -2086,6 +2151,7 @@ %1 poistettu defibrillaattorityynyt %1 снял электроды %1 heeft defibrillator pads verwijderd + %1 ha rimosso i pad del defibrillatore %1 connected vitals monitor @@ -2098,6 +2164,7 @@ %1 kytketty terveysmonitori %1 подключил монитор жизненно важных показателей %1 heeft een vitale waarden monitor verbonden + %1 ha collegato il monitor dei parametri vitali %1 disconnected vitals monitor @@ -2110,6 +2177,7 @@ %1 irrotettu terveysmonitori %1 отсоединил монитор жизненно важных показателей %1 heeft een vitale waarden monitor losgekoppeld + %1 ha scollegato il monitor dei parametri vitali Patient Disconnected @@ -2122,6 +2190,7 @@ Potilas on katkaistu Пациент отключен Patiënt losgekoppeld + Paziente scollegato Max Success chance for AED-X @@ -2246,6 +2315,7 @@ Autoriser l'application des électrodes de l'AED pendant la RCP Permitir aplicação de pás do desfibrilador durante RCP Sta het plaatsen van AED pads tijdens CPR toe + Consentire l'applicazione dei pad AED durante la RCP Training level required to use an AED-X @@ -2276,6 +2346,7 @@ Salli AUD-X-vuorovaikutus aseman kanssa Разрешить взаимодействие станции AED/X Sta AED/X stations interactie toe + Consentire l'interazione con la stazione AED/X Medical level required to pick up placed AED/X station @@ -2286,6 +2357,7 @@ Niveau médical requis pour ramasser un AED-X posé au sol Nível médico necessário para pegar uma estação DEA/X colocada Benodigd medisch niveau om geplaatste AED/X stations op te pakken + Livello medico richiesto per raccogliere la stazione AED/X posizionata Attach AED-X Vitals Monitor Time @@ -2298,6 +2370,7 @@ Kuinka kauan AUD-X-terveysmonitorin kiinnittäminen kestää Время подключения мониторинга жизненно важных показателей AED-X Benodigde tijd om AED-X vitale waarden monitor aan te sluiten + Tempo di collegamento del monitor dei parametri vitali AED-X Detach AED-X Vitals Monitor Time @@ -2310,6 +2383,7 @@ Kuinka kauan AUD-X-terveysmonitorin irrottaminen kestää Время отключения мониторинга жизненно важных показателей AED-X Benodigde tijd om AED-X vitale waarden monitor los te koppelen + Tempo di scollegamento del monitor dei parametri vitali AED-X Attach Defibrillator Pads Time @@ -2322,6 +2396,7 @@ Kuinka kauan defibrillaattorityynyjen kiinnittäminen kestää Время подключения электродов Benodigde tijd op defibrillator pads aan te brengen + Tempo di collegamento dei pad del defibrillatore Detach Defibrillator Pads Time @@ -2334,6 +2409,7 @@ Kuinka kauan defibrillaattorityynyjen irrottaminen kestää Время отсоединеия электродов Benodigde tijd om defibrillator pads te verwijderen + Tempo di scollegamento dei pad del defibrillatore Distance limit for defibrillators in meters @@ -2346,6 +2422,7 @@ Defibrillaattorien etäisyysraja metreinä Предельное расстояние для дефибрилляторов в метрах Afstandslimiet voor defibrillators in meters + Limite di distanza per i defibrillatori in metri Enable different CPR chances per medical level @@ -2472,6 +2549,7 @@ Elvytyksen onnistumislaskelmien välinen aika Интервал шанса СЛР CPR kans interval + Intervallo di probabilità RCP Oxygenation Period @@ -2484,6 +2562,7 @@ Happisaturaatiojakso Период насыщения кислородом Oxygenatie periode + Periodo di ossigenazione %1 performed CPR (%2) @@ -2496,6 +2575,7 @@ %1 suoritettu elyytys (%2) %1 выполнил СЛР (%2) %1 heeft CPR uitgevoerd (%2) + %1 ha eseguito la RCP (%2) Stop CPR @@ -2508,6 +2588,12 @@ Lopeta elvytys Прекратить СЛР Stop CPR + Interrompere la RCP + + + Change Monitoring Device + モニタリングする装置を変更 + Changer le dispositif de surveillance CPR Started @@ -2519,6 +2605,7 @@ RCP iniciada RCP iniciada CPR gestart + RCP iniziata CPR Cancelled @@ -2531,6 +2618,7 @@ Elvytys peruttu СЛР отменена CPR afgebroken + RCP annullata Field Blood Transfusion Kit (500ml) @@ -2628,18 +2716,24 @@ Neem Arterieel bloedstaal Extraer muestra arterial 動脈サンプルを採る + Prelevare campione arterioso + Prélèvement d'un échantillon artériel Blood Sample Bloedstaal Muestra de sangre 血液サンプル + Campione di sangue + Echantillon de sang ABG Result ABG resultaat Resultado ABG ABG結果 + Risultato del test ABG + Résultat de l'ABG Drawing Blood @@ -2826,6 +2920,7 @@ Edistyneet sydämen rytmit Продвинутые ритмы Geadvanceerde hartritmen + Ritmi avanzati Can Deteriorate @@ -2839,6 +2934,7 @@ voivatko ne pahentua? Может ухудшиться Kan verslechteren + Può deteriorarsi Random Deteriorate Time Maximum @@ -2851,6 +2947,7 @@ Satunnainen huononemisajan maksimiarvo Максимальное значение времени случайного ухудшения функции сердца Maximale willekeurige tijd voor een verslechtering + Tempo massimo di deterioramento casuale Random Deteriorate Time Weight @@ -2863,6 +2960,7 @@ Satunnainen huononemisajan paino Взвешивание времени случайного ухудшения функции сердца Tijdsgewicht willekeurige verslechtering + Peso del tempo di deterioramento casuale Deteriorate After Treatment @@ -2875,6 +2973,7 @@ Voiko se pahentua hoidon jälkeen? Ухудшается после лечения Verslechterd na behandeling + Deterioramento dopo il trattamento PEA Chance @@ -2887,6 +2986,7 @@ Pulssittoman sähköisen toiminnan mahdollisuus Показатель точности безимпульсной электрической активности (PEA) PEA kans + Probabilità di attività elettrica senza polso (PEA) VT Chance @@ -2899,6 +2999,7 @@ Kammiotakykardian mahdollisuus Вероятность желудочковой тахикардии (VT) VT kans + Probabilità di tachicardia ventricolare (TV) Asystole blood loss threshold @@ -2911,6 +3012,7 @@ Asystolan vuoksi menetettävä veren määrä Порог кровопотери при асистолии Asystole bloedverlies drempelwaarde + Soglia di perdita di sangue per asistolia ROSC After CPR Chance @@ -2923,6 +3025,7 @@ ROSC elvytysmahdollisuuden jälkeen Шанс вернуться в спонтанное кровообращение после СЛР Kans voor ROSC na CPR (Terugkeer naar spontane circulatie) + Probabilità di ritorno alla circolazione spontanea dopo RCP ROSC After AED Chance @@ -2935,6 +3038,7 @@ ROSC AUD-mahdollisuuden jälkeen Шанс вернуться в спонтанное кровообращение после AED Kans voor ROSC na CPR (Terugkeer naar spontane circulatie) + Probabilità di ritorno alla circolazione spontanea dopo AED Hardcore Rhythms @@ -2947,6 +3051,7 @@ Vaikeat sydämen rytmit Интенсивность сердечного ритма Hardcore hartritmen + Ritmi cardiaci intensi Hardcore Deterioration Chance @@ -2959,6 +3064,7 @@ Vaikean sydämen rytmin heikkenemismahdollisuus Вероятность сильного ухудшения Hardcore verslechteringskans + Probabilità di deterioramento intenso Blood draw Settings @@ -3001,6 +3107,7 @@ AUD-X: PR: %1 BP: %2/%3 SpO2: %4 AED-X: ЧСС: %1 АД: %2/%3 SpO2: %4 AED-X: PR %1 BD: %2/%3 SpO2: %4 + AED-X: PR: %1 BP: %2/%3 SpO2: %4 AED-X: HR: %1 BP: %2/%3 SpO2: %4 @@ -3025,6 +3132,7 @@ DEA-X: RC: %1 PS: --/-- SpO2: --- ETCo2: %2 Respiraciones/min: %3 DEA-X: FC: %1 PA: --/-- SpO2: --- ETCo2: %2 Respirações/min: %3 AED-X: HR %1 BD: --/-- SpO2: --- ETCo2: %2 Ademhalingen/min: %3 + AED-X: HR: %1 BP: --/-- SpO2: --- ETCo2: %2 Respiri/min: %3 AED-X: PR: %1 BP: %2/%3 SpO2: %4 ETCo2: %5 Breaths/min: %6 @@ -3034,6 +3142,7 @@ DEA-X: RC: %1 PS: %2/%3 SpO2: %4 ETCo2: %5 Respiraciones/min: %6 DEA-X: FP: %1 PA: %2/%3 SpO2: %4 ETCo2: %5 Respirações/min: %6 AED-X: PR %1 BD: %2/%3 SpO2: %4 ETCo2: %5 Ademhalingen/min: %6 + AED-X: PR: %1 BP: %2/%3 SpO2: %4 ETCo2: %5 Respiri/min: %6 AED-X: HR: %1 BP: %2/%3 SpO2: %4 ETCo2: %5 Breaths/min: %6 @@ -3043,6 +3152,7 @@ DEA-X: RC: %1 PS: %2/%3 SpO2: %4 ETCo2: %5 Respiraciones/min: %6 DEA-X: FC: %1 PA: %2/%3 SpO2: %4 ETCo2: %5 Respirações/min: %6 AED-X: HR %1 BD: %2/%3 SpO2: %4 ETCo2: %5 Ademhalingen/min: %6 + AED-X: HR: %1 BP: %2/%3 SpO2: %4 ETCo2: %5 Respiri/min: %6 AED-X Vitals Monitor Sounds @@ -3055,6 +3165,7 @@ AUD-X terveysmonitorin ääni Звуки монитора жизненно важных функций AED-X Geluiden van de AED-X vitale waarde monitor + Suoni del monitor dei parametri vitali AED-X Original @@ -3067,6 +3178,7 @@ Alkuperäinen Оригинал Origineel + Originale Default @@ -3079,6 +3191,7 @@ Oletus По умолчанию Standaard + Predefinito AED-X alarm SpO2 threshold @@ -3105,6 +3218,7 @@ AUD-X terveysmonitorin verenpaineen mittausväli Интервал измерения артериального давления на мониторе AED-X AED-X vitale waarden monitor BD metingsinterval + Intervallo di misurazione BP del monitor dei parametri vitali AED-X Automatic Instant @@ -3117,6 +3231,7 @@ Automaattinen (välitön) Автоматический постоянный Automatisch direct + Automatico istantaneo Automatic (Interval) @@ -3129,6 +3244,7 @@ Automaattinen (väli) Автоматический (интервал) Automatisch (interval) + Automatico (Intervallo) Manual @@ -3141,6 +3257,7 @@ Manuaalinen Инструкция Handmatig + Manuale AED-X Vitals Monitor BP Measurement Interval Time @@ -3153,6 +3270,7 @@ AUD-X terveysmittarin verenpaineen mittausvälin aika Интервал измерения артериального давления на мониторе AED-X Tijd van de AED-X vitale waarde monitor BD metingsinterval + Tempo di intervallo di misurazione BP del monitor dei parametri vitali AED-X Cardiac Arrest Bleed Rate @@ -3165,6 +3283,7 @@ Verenvuoto sydämenpysähdyksen aikana Частота кровотечений после остановки сердца Bloedingsnelheid bij hartstilstand + Tasso di sanguinamento durante l'arresto cardiaco Chance for tamponade in penetrating wounds @@ -3174,6 +3293,7 @@ Chance de tamponnade au cours d'une blessure pénétrante Probabilidade de tamponamento em ferimentos penetrantes Kans voor tamponade door penetrerende wonden + Probabilità di tamponade in ferite penetranti Tamponade progression timer @@ -3183,6 +3303,7 @@ Timer de progression de la tamponnade Temporizador de progresso de tamponamento Tamponade progressie timer + Timer di progressione della tamponade Tamponade progression chance @@ -3192,6 +3313,7 @@ Chance de progression de la tamponnade Probabilidade de progressão de tamponamento Tamponade progressie kans + Probabilità di progressione della tamponade diff --git a/addons/circulation/ui/AEDX_Monitor_Dialog.hpp b/addons/circulation/ui/AEDX_Monitor_Dialog.hpp index 30818e2d6..bd3edf77a 100644 --- a/addons/circulation/ui/AEDX_Monitor_Dialog.hpp +++ b/addons/circulation/ui/AEDX_Monitor_Dialog.hpp @@ -1,8 +1,4 @@ -#include "..\defines.hpp" - -class RscPicture; class RscLine; -class RscText; class RscBackground; class RscButton; class RscStructuredText; @@ -597,4 +593,4 @@ class GVAR(AEDX_Monitor_Dialog) { tooltip = CSTRING(AEDX_Monitor_MeasureBloodPressure); }; }; -}; +}; \ No newline at end of file diff --git a/addons/circulation/ui/kat_pulseox.paa b/addons/circulation/ui/kat_pulseox.paa new file mode 100644 index 000000000..dc540d3e3 Binary files /dev/null and b/addons/circulation/ui/kat_pulseox.paa differ diff --git a/addons/compat_rhs_usf3/$PBOPREFIX$ b/addons/compat_rhs_usf3/$PBOPREFIX$ new file mode 100644 index 000000000..e40cfec20 --- /dev/null +++ b/addons/compat_rhs_usf3/$PBOPREFIX$ @@ -0,0 +1 @@ +x\kat\addons\compat_rhs_usf3 diff --git a/addons/compat_rhs_usf3/CfgVehicles.hpp b/addons/compat_rhs_usf3/CfgVehicles.hpp new file mode 100644 index 000000000..d26f53925 --- /dev/null +++ b/addons/compat_rhs_usf3/CfgVehicles.hpp @@ -0,0 +1,46 @@ +class CfgVehicles { + class Truck_01_base_F; + class rhsusf_fmtv_base: Truck_01_base_F {}; + class rhsusf_M1078A1P2_fmtv_usarmy: rhsusf_fmtv_base {}; + class rhsusf_M1078A1P2_D_fmtv_usarmy: rhsusf_M1078A1P2_fmtv_usarmy { + kat_stretcherPos[] = {0,-1,-0.4}; + kat_stretcherVector[] = {{0, 0, 0}, {0, 0, 0}}; + }; + class rhsusf_M1083A1P2_fmtv_usarmy: rhsusf_M1078A1P2_fmtv_usarmy {}; + class rhsusf_M1083A1P2_B_fmtv_usarmy: rhsusf_M1083A1P2_fmtv_usarmy {}; + class rhsusf_M1085A1P2_B_Medical_fmtv_usarmy: rhsusf_M1083A1P2_B_fmtv_usarmy { + kat_stretcherPos[] = {-0.9,3,0.67}; + kat_stretcherVector[] = {{0,0,0},{0,0,0}}; + }; + + class Heli_Transport_01_base_F; + class RHS_UH60_Base: Heli_Transport_01_base_F { + kat_stretcherPos[] = {0,1.25,-1.86}; + kat_stretcherVector[] = {{1, 0, 0}, {0, 0, 1}}; + }; + + class Heli_Transport_02_base_F; + class RHS_CH_47F_base: Heli_Transport_02_base_F { + kat_stretcherPos[] = {0,-0.43,-2.63}; + kat_stretcherVector[] = {{0, 0, 0}, {0, 0, 0}}; + }; + + class MRAP_01_base_F; + class rhsusf_hmmwe_base: MRAP_01_base_F { + kat_stretcherPos[] = {0,-0.5,-0.85}; + kat_stretcherVector[] = {{0, 0, 0}, {0, 0, 0}}; + }; + + class APC_Tracked_03_base_F; + class RHS_M2A2_Base: APC_Tracked_03_base_F { + kat_stretcherPos[] = {-1.19,-0.6,-0.45}; + kat_stretcherVector[] = {{0,0,0},{0,0,0}}; + }; + + class Tank_F; + class APC_Tracked_02_base_F: Tank_F {}; + class rhsusf_m113tank_base: APC_Tracked_02_base_F { + kat_stretcherPos[] = {0,-0.5,-2.05}; + kat_stretcherVector[] = {{0,0,0},{0,0,0}}; + }; +}; diff --git a/optionals/usaf/config.cpp b/addons/compat_rhs_usf3/config.cpp similarity index 66% rename from optionals/usaf/config.cpp rename to addons/compat_rhs_usf3/config.cpp index c09f257f7..98edf92af 100644 --- a/optionals/usaf/config.cpp +++ b/addons/compat_rhs_usf3/config.cpp @@ -3,19 +3,17 @@ class CfgPatches { class ADDON { name = COMPONENT_NAME; - requiredVersion = REQUIRED_VERSION; units[] = {}; weapons[] = {}; - magazines[] = {}; - requiredAddons[] = { - "kat_misc", - "rhsusf_main" - }; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"kat_main", "rhsusf_main_loadorder"}; + skipWhenMissingDependencies = 1; author = "Katalam"; - authors[] = {"Katalam"}; + authors[] = {"MiszczuZPolski", "Katalam"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; }; #include "CfgVehicles.hpp" + diff --git a/addons/compat_rhs_usf3/script_component.hpp b/addons/compat_rhs_usf3/script_component.hpp new file mode 100644 index 000000000..14741af1f --- /dev/null +++ b/addons/compat_rhs_usf3/script_component.hpp @@ -0,0 +1,5 @@ +#define COMPONENT compat_rhs_usf3 +#define COMPONENT_BEAUTIFIED RHS USAF Compatibility + +#include "\x\kat\addons\main\script_mod.hpp" +#include "\x\kat\addons\main\script_macros.hpp" diff --git a/addons/feedback/XEH_PREP.hpp b/addons/feedback/XEH_PREP.hpp index 42df1399d..82eba5926 100644 --- a/addons/feedback/XEH_PREP.hpp +++ b/addons/feedback/XEH_PREP.hpp @@ -1,4 +1,7 @@ +PREP(effectBreathingWheeze); +PREP(effectCoughing); PREP(effectLowSpO2); PREP(effectOpioid); +PREP(effectTearHaze); PREP(handleEffects); -PREP(initEffects); \ No newline at end of file +PREP(initEffects); diff --git a/addons/feedback/functions/fnc_effectBreathingWheeze.sqf b/addons/feedback/functions/fnc_effectBreathingWheeze.sqf new file mode 100644 index 000000000..753f647c1 --- /dev/null +++ b/addons/feedback/functions/fnc_effectBreathingWheeze.sqf @@ -0,0 +1,37 @@ +#include "..\script_component.hpp" +/* + * Author: Mazinski + * Triggers the wheezing effect. + * + * Arguments: + * 0: Enable + * 1: Intensity + * 2: Unit + * + * Return Value: + * None + * + * Example: + * [true, 0.5, player] call kat_feedback_fnc_effectBreathingWheeze; + * + * Public: No + */ + +params ["_enable", "_effected", "_unit"]; +if (!_enable || !_effected) exitWith { false }; + +if (!(_unit getVariable [QEGVAR(breathing,PneumoBreathCooldownOn), false])) then { + _unit setVariable [QEGVAR(breathing,PneumoBreathCooldownOn), true, true]; + + private _soundTargets = allPlayers inAreaArray [ASLToAGL getPosASL _unit, 15, 15, 0, false, 15]; + + if !(_soundTargets isEqualTo []) then { + [QEGVAR(breathing,playCough), [_unit], _soundTargets] call CBA_fnc_targetEvent; + }; + + [{ + params["_unit"]; + _unit setVariable [QEGVAR(breathing,PneumoBreathCooldownOn), false, true]; + }, + [_unit], 20] call CBA_fnc_waitAndExecute; +}; \ No newline at end of file diff --git a/addons/feedback/functions/fnc_effectCoughing.sqf b/addons/feedback/functions/fnc_effectCoughing.sqf new file mode 100644 index 000000000..343e9fb71 --- /dev/null +++ b/addons/feedback/functions/fnc_effectCoughing.sqf @@ -0,0 +1,65 @@ +#include "..\script_component.hpp" +/* + * Author: MiszczuZPolski & Digii + * Triggers the coughing effect. + * + * Arguments: + * 0: Enable + * 1: Intensity + * 2: Unit + * + * Return Value: + * None + * + * Example: + * [true, 0.5, player] call kat_feedback_fnc_effectCoughing; + * + * Public: No + */ + +params ["_enable", "_poisoned", "_unit"]; +if (!_enable || !_poisoned) exitWith { + if (GVAR(airPoisoning) != -1) then { GVAR(airPoisoning) ppEffectEnable false; }; +}; +if (GVAR(airPoisoning) != -1) then { GVAR(airPoisoning) ppEffectEnable true; }; + +if (!(_unit getVariable [QEGVAR(chemical,CoughCooldown), false])) then { + _unit setVariable [QEGVAR(chemical,CoughCooldown), true, true]; + + private _random = floor (random 4); + switch (_random) do { + case 0: { _unit say3D QEGVAR(chemical,cough_0); }; + case 1: { _unit say3D QEGVAR(chemical,cough_1); }; + case 2: { _unit say3D QEGVAR(chemical,cough_2); }; + case 3: { _unit say3D QEGVAR(chemical,cough_3); }; + }; + + addCamShake [3, 4, 0]; + + [{ + params["_unit"]; + _unit setVariable [QEGVAR(chemical,CoughCooldown), false, true]; + }, + [_unit], 7] call CBA_fnc_waitAndExecute; +}; + +// Trigger effect every 2s +private _showNextTick = missionNamespace getVariable [QGVAR(showCoughNextTick), true]; +GVAR(showCoughNextTick) = !_showNextTick; +if (_showNextTick) exitWith {}; + +private _initialAdjust = []; +private _delayedAdjust = []; + +private _intensity = linearConversion [0, 1, 0.5, 0, 0.06, true]; +_initialAdjust = [_intensity, _intensity, true]; +_delayedAdjust = [_intensity * 0.15, _intensity * 0.15, true]; + +GVAR(airPoisoning) ppEffectAdjust _initialAdjust; +GVAR(airPoisoning) ppEffectCommit FX_COUGH_FADE_IN; + +[{ + params ["_adjust"]; + GVAR(airPoisoning) ppEffectAdjust _adjust; + GVAR(airPoisoning) ppEffectCommit FX_COUGH_FADE_OUT; +}, [_delayedAdjust], 3] call CBA_fnc_waitAndExecute; diff --git a/addons/feedback/functions/fnc_effectTearHaze.sqf b/addons/feedback/functions/fnc_effectTearHaze.sqf new file mode 100644 index 000000000..b58d3e165 --- /dev/null +++ b/addons/feedback/functions/fnc_effectTearHaze.sqf @@ -0,0 +1,26 @@ +#include "..\script_component.hpp" +/* + * Author: MiszczuZPolski & Digii + * Triggers the coughing effect. + * + * Arguments: + * 0: Enable + * 1: Intensity + * + * Return Value: + * None + * + * Example: + * [true, 0.5] call kat_feedback_fnc_effectCoughing; + * + * Public: No + */ + +params ["_enable", "_tear"]; +if (!_enable || _tear == 0) exitWith { + if (GVAR(tearHaze) != -1) then { GVAR(tearHaze) ppEffectEnable false; }; +}; +if (GVAR(tearHaze) != -1) then { GVAR(tearHaze) ppEffectEnable true; }; + +GVAR(tearHaze) ppEffectAdjust [1.5,0.3,0.3,1.02,1.02,1.02,1.02,0.05,0.01,0.05,0.01,0.1,0.1,0.2,0.2]; +GVAR(tearHaze) ppEffectCommit 0; diff --git a/addons/feedback/functions/fnc_handleEffects.sqf b/addons/feedback/functions/fnc_handleEffects.sqf index feea1febc..119fdb3dc 100644 --- a/addons/feedback/functions/fnc_handleEffects.sqf +++ b/addons/feedback/functions/fnc_handleEffects.sqf @@ -27,6 +27,9 @@ BEGIN_COUNTER(handleEffects); private _opioid = GET_PP(ACE_player); private _spO2 = GET_KAT_SPO2(ACE_player); private _unconscious = IS_UNCONSCIOUS(ACE_player); +private _poisoned = IS_AIRPOISONED(ACE_player); +private _tear = IN_TEARGAS(ACE_player); +private _wheeze = ((ACE_player getVariable [QGVAR(pneumothorax), 0] > 0) || ACE_player getVariable [QGVAR(hemopneumothorax), false] || ACE_player getVariable [QGVAR(tensionpneumothorax), false] || ACE_player getVariable [QEGVAR(chemical,airPoisoning), false]); // - Visual effects ----------------------------------------------------------- @@ -37,5 +40,8 @@ private _unconscious = IS_UNCONSCIOUS(ACE_player); linearConversion [GVAR(effectLowSpO2), EGVAR(breathing,SpO2_dieValue), _spO2, 0, 1, true] ] call FUNC(effectLowSpO2); +[!_unconscious, _poisoned, ACE_player] call FUNC(effectCoughing); +[!_unconscious, _tear] call FUNC(effectTearHaze); +[!_unconscious, _wheeze, ACE_player] call (effectBreathingWheeze); END_COUNTER(handleEffects); diff --git a/addons/feedback/functions/fnc_initEffects.sqf b/addons/feedback/functions/fnc_initEffects.sqf index ff0cbe28b..906106192 100644 --- a/addons/feedback/functions/fnc_initEffects.sqf +++ b/addons/feedback/functions/fnc_initEffects.sqf @@ -42,6 +42,22 @@ GVAR(opioidEffect) = [ // - Low SpO2 ----------------------------------------------------------- GVAR(lowSpO2) = [ "ColorCorrections", - 21370, + 213702, [1, 1, 0, [0, 0, 0, 0], [0, 0, 0, 1], [0.33, 0.33, 0.33, 0], [0.55, 0.5, 0, 0, 0, 0, 4]] ] call _fnc_createEffect; + +GVAR(airPoisoning) = [ + "ChromAberration", + 213703, + [0, 0, true] +] call _fnc_createEffect; + +GVAR(tearHaze) = [ + "WetDistortion", + 213704, + [1, + 1, 1, + 4.10, 3.70, 2.50, 1.85, + 0.0054, 0.0041, 0.0090, 0.0070, + 0.5, 0.3, 10.0, 6.0] +] call _fnc_createEffect; diff --git a/addons/feedback/script_component.hpp b/addons/feedback/script_component.hpp index 334ceebe7..8f1e3109f 100644 --- a/addons/feedback/script_component.hpp +++ b/addons/feedback/script_component.hpp @@ -20,4 +20,7 @@ #define FX_OPIOD_FADE_OUT 0.7 #define FX_SPO2_FADE_IN 0.7 -#define FX_SPO2_FADE_OUT 1.6 \ No newline at end of file +#define FX_SPO2_FADE_OUT 1.6 + +#define FX_COUGH_FADE_IN 0.3 +#define FX_COUGH_FADE_OUT 0.7 diff --git a/addons/feedback/stringtable.xml b/addons/feedback/stringtable.xml index 87b1e7830..4e7286b1f 100644 --- a/addons/feedback/stringtable.xml +++ b/addons/feedback/stringtable.xml @@ -32,10 +32,14 @@ Enable opioid effect オピオイド効果を有効化 + Abilita l'effetto degli oppioidi + Activer l'effet opioïde Enables opioid effect on ketamine, fentanyl and pervitin ケタミン、フェンタニル、ペルビチンなどでオピオイドの効果を有効にします + Abilita l'effetto degli oppioidi su ketamina, fentanil e pervitina + Permet un effet opioïde sur la kétamine, le fentanyl et la pervitine diff --git a/addons/gui/functions/fnc_onMenuOpen.sqf b/addons/gui/functions/fnc_onMenuOpen.sqf index 59742a629..18398cc1f 100644 --- a/addons/gui/functions/fnc_onMenuOpen.sqf +++ b/addons/gui/functions/fnc_onMenuOpen.sqf @@ -98,6 +98,10 @@ if (EGVAR(pharma,RequireInsIV) && EGVAR(pharma,IVflowControl)) then { (_display displayCtrl IDC_IV_FLOW_SHOWBUTTON) ctrlShow true; }; +if (EGVAR(circulation,abgEnable)) then { + (_display displayCtrl IDC_TEST_SHOWBUTTON) ctrlShow true; +}; + // Set toggle button icon and tooltip private _ctrl = _display displayCtrl IDC_TOGGLE; if (ACEGVAR(medical_gui,target) == ACE_player) then { diff --git a/addons/gui/functions/fnc_updateABGStatus.sqf b/addons/gui/functions/fnc_updateABGStatus.sqf index eea6d0861..b26b63e81 100644 --- a/addons/gui/functions/fnc_updateABGStatus.sqf +++ b/addons/gui/functions/fnc_updateABGStatus.sqf @@ -48,4 +48,4 @@ if (_ABGmenuShow) then { }; }; -} forEach [IDC_TEST_PACO2, IDC_TEST_PAO2, IDC_TEST_SPO2, IDC_TEST_HCO3, IDC_TEST_PH]; \ No newline at end of file +} forEach [IDC_TEST_PACO2, IDC_TEST_PAO2, IDC_TEST_SPO2, IDC_TEST_HCO3, IDC_TEST_PH]; diff --git a/addons/gui/gui.hpp b/addons/gui/gui.hpp index 5c94d09f8..4a10981b0 100644 --- a/addons/gui/gui.hpp +++ b/addons/gui/gui.hpp @@ -136,6 +136,7 @@ class ACE_Medical_Menu { y = QUOTE(POS_Y(1.1)); w = QUOTE(POS_W(9)); h = QUOTE(POS_H(3.3)); + show = 0; }; class ABGTitle: IVFlowTitle { idc = IDC_ABG_TITLE; // LOOK HERE @@ -144,7 +145,7 @@ class ACE_Medical_Menu { y = QUOTE(POS_Y(0)); w = QUOTE(POS_W(9)); h = QUOTE(POS_H(1)); - show = 1; + show = 0; class Attributes { color = "#E5E5E5"; font = "RobotoCondensed"; @@ -535,7 +536,7 @@ class ACE_Medical_Menu { y = QUOTE(POS_Y(0)); w = QUOTE(POS_W(4.2)); h = QUOTE(POS_H(1)); - show = 1; + show = 0; colorBackground[] = {0, 0, 0, 0}; colorBackgroundActive[] = {1, 1, 1, 0.4}; colorBackgroundDisabled[] = {0, 0, 0, 0}; diff --git a/addons/gui/gui_defines.hpp b/addons/gui/gui_defines.hpp index 6192eb7b2..470885a1d 100644 --- a/addons/gui/gui_defines.hpp +++ b/addons/gui/gui_defines.hpp @@ -143,4 +143,4 @@ #define IDC_TEST_SHOWBUTTON 71208 -#define IDC_ABG_BACKGROUND 71299 +#define IDC_ABG_BACKGROUND 71299 diff --git a/addons/gui/stringtable.xml b/addons/gui/stringtable.xml index 056595910..9b958102a 100644 --- a/addons/gui/stringtable.xml +++ b/addons/gui/stringtable.xml @@ -66,6 +66,7 @@ Ei lisätty nesteitä Никаких переливаний Geen toegediende vloeistoffen + Nessun fluido somministrato Overlay Selected Body Part @@ -79,6 +80,7 @@ Korosta valittu kehon osa Показать выбранную часть тела Omtrekking geselecteerd lichaamsdeel + Visualizza la parte del corpo selezionata Label Patient Sides @@ -92,144 +94,191 @@ Merkitse potilaan sivut Маркировка сторон пациента Label zijden van patiënt + Etichettare i lati del paziente HEAD - NO LINE HOOFD - GEEN LIJN CABEZA - SIN LINEA 頭部 - ライン無し + TESTA - SENZA LINEA + TETE - PAS DE LIGNES CHEST - NO LINE TORSO - GEEN LIJN TORSO - SIN LINEA 胸部 - ライン無し + TORACE - SENZA LINEA + POITRINE - PAS DE LIGNES RIGHT ARM - NO LINE RECHTERARM - GEEN LIJN BRAZO DERECHO - SIN LINEA 右腕 - ライン無し + BRACCIO DESTRO - SENZA LINEA + BRAS DROIT - PAS DE LIGNES LEFT ARM - NO LINE LINKERARM - GEEN LIJN BRAZO IZQUIERDO - SIN LINEA 左腕 - ライン無し + BRACCIO SINISTRO - SENZA LINEA + BRAS GAUCHE - PAS DE LIGNES RIGHT LEG - NO LINE RECHTERBEEN - GEEN LIJN PIERNA DERECHA - SIN LINEA 右脚 - ライン無し + GAMBA DESTRA - SENZA LINEA + JAMBE DROITE - PAS DE LIGNES LEFT LEG - NO LINE LINKERBEEN - GEEN LIJN PIERNA IZQUIERDA - SIN LINEA 左脚 - ライン無し + GAMBA SINISTRA - SENZA LINEA + JAMBE GAUCHE - PAS DE LIGNES IV Flow Control IV-Stroomregeling Control de Flujo IV IV流量操作 + Controllo del flusso IV + Fonctionnement du flux IV ABG Results ABG resultaten Resultados ABG ABG 結果 + Risultati ABG + Résultats de l'ABG 0.0 0.0 0.0 0.0 + 0.0 + 0.0 Head Hoofd Cabeza 頭部 + Testa + Tête IV IV IV IV + IV + IV Chest Torso Torso 胸部 + Torace + Torse IV IV IV IV + IV + IV LA LA BI 左腕 + BS + BG IV IV IV IV + IV + IV RA RA BD 右腕 + BD + BD IV IV IV IV + IV + IV LL LB PI 左脚 + GS + JG IV IV IV IV + IV + IV RL RB PD 右脚 + GB + JD IV IV IV IV + IV + IV --.- --.- --.- --.- + --.- + --.- Reset Reset Restaurar リセット + Ripristina + Réinitialiser diff --git a/addons/hypothermia/stringtable.xml b/addons/hypothermia/stringtable.xml index ec71e7779..ea6bc1f15 100644 --- a/addons/hypothermia/stringtable.xml +++ b/addons/hypothermia/stringtable.xml @@ -24,228 +24,304 @@ Schakel hypothermie in Habilitar hipotermia 低体温症を有効化 + Abilita l'ipotermia + Permettre l'hypothermie Hand Warmer Impact Handwarmer impact Impacto de Calentador de Manos ハンドウォーマーの影響 + Impatto dei riscaldatori per le mani + Impact du chauffe-mains Multipler for impact of hand warmers on heat gain Vermenigvuldiger voor de impact die handwarmers hebben op de stijging van temperatuur Multiplicador del impacto del calentador de manos en la ganancia de calor ハンドウォーマーが熱獲得に与える影響の乗数 + Moltiplicatore per l'impatto dei riscaldatori per le mani sull'aumento del calore + Multiplicateur pour l'impact des chauffe-mains sur le gain de chaleur Fluid Warmer Impact Vloeistofverwarmer impact Impacto del Calentador de Fluidos 輸液ウォーマーの影響 + Impatto del riscaldatore per liquidi + Impact du réchauffeur de fluide Multipler for impact of fluid warmer on heat gain Vermenigvuldiger voor de impact die vloeistofverwarmers hebben op de stijging van temperatuur Multiplicador del impacto del calentador de fluidos en la ganancia de calor 輸液ウォーマーが熱獲得に与える影響の乗数 + Moltiplicatore per l'impatto del riscaldatore per liquidi sull'aumento del calore + Multiplicateur pour l'impact du réchauffement des fluides sur le gain de chaleur Warm Uniforms Warme uniformen Uniformes Calientes 暖かいユニフォーム + Uniformi riscaldate + Uniformes chauds List of clothing marked that reduces heat loss Lijst van kleding die temperatuurdalingen verminderen Listado de ropa marcada como reductora de la pérdida de calor 熱損失を減らすことが出来るとマークされた衣類のリスト + Elenco degli indumenti segnati che riducono la perdita di calore + Liste des vêtements qui réduisent les chutes de température Check Hand Warmers Check handwarmers Comprobar Calentadores de Manos ハンドウォーマーを確認する + Controlla i riscaldatori per le mani + Vérifier les chauffe-mains Hand Warmer Handwarmers Calentador de Manos ハンドウォーマー + Riscaldatore per le mani + Chauffe-mains Small hand warmers to provide warmth in colder climates Kleine handwarmers die warmte bieden in koude klimaten Pequeños calentadores de manos para dar calor en climas fríos 寒冷地でも体を温めることが出来る小さなハンドウォーマー (懐炉) + Piccoli riscaldatori per le mani per fornire calore in climi freddi + Petits chauffe-mains pour réchauffer les mains dans les climats plus froids Use Hand Warmer Gebruik handwarmer Usar Calentador de Manos ハンドウォーマーを使用する + Usa il riscaldatore per le mani + Utiliser des chauffe-mains This is where you have handwarmers and how much longer you think they have in minutes: %1, %2, %3, %4, %5 Dit is waar je handwarmers hebt en hoelang je denkt dat ze nog werken in minuten: %1, %2, %3, %4, %5 Aquí es donde tienes calentadores de manos y cuanto piensas que les queda de duración en minutos: %1, %2, %3, %4, %5 あなたが使用中の ハンドウォーマーの 位置と残り持続時間は 次の通りです (分単位): %1, %2, %3, %4, %5 + Ecco dove hai i riscaldatori per le mani e quanto tempo pensi che rimangano in minuti: %1, %2, %3, %4, %5 + La position et la durée restante du chauffe-mains que vous utilisez sont les suivantes (en minutes) : %1, %2, %3, %4, %5 This patient has handwarmers and they will probably last this many more minutes at this locations: %1, %2, %3, %4, %5 Deze patient heeft handwarmers op deze locaties en dit is hoelang ze ongeveer nog werken: %1, %2, %3, %4, %5 Este paciente tiene calentadores de manos y probablemente le duren muchos mas minutos en esos sitios: %1, %2, %3, %4, %5 この患者が使用中の ハンドウォーマーの 位置と残り持続時間は 次の通りです (分単位): %1, %2, %3, %4, %5 + Questo paziente ha riscaldatori per le mani e probabilmente dureranno ancora questi minuti in queste posizioni: %1, %2, %3, %4, %5 + La position et la durée restante du chauffe-main utilisé par ce patient sont les suivantes (en minutes) : %1, %2, %3, %4, %5 Fluid Line Warmer IV-lijn verwarmers Calentador de Línea de Fluidos 輸液ラインウォーマー + Riscaldatore per linea endovenosa + Chauffe-ligne fluide Provides heating to IV fluids. Must be placed on an already existing line Verwarmt IV-vloeistoffen. Moet geplaatst worden op een al aangelegde lijn. Provee calor a los fluidos IV. Deben ser colocados en una línea ya existentes IVの輸液を温めます。既存のライン上に配置する必要があります + Fornisce riscaldamento ai liquidi IV. Deve essere posizionato su una linea già esistente + Permet de chauffer les fluides IV. Doit être placé sur une ligne déjà existante Attach Fluid Warmer Maak vloeistofverwarmer vast Poner Calentador de Fluidos 輸液ウォーマーを取り付ける + Attacca il riscaldatore per liquidi + Attacher le réchauffeur de fluide Remove Fluid Warmer Maak vloeistofverwarmer los Quitar Calentador de Fluidos 輸液ウォーマーを取り外す + Rimuovi il riscaldatore per liquidi + Enlever le réchauffeur de fluide Patient feels frigid Patiënt voelt ijskoud aan El paciente se siente frígido - 患者は凍ったように冷たく感じます + 患者は凍ったように冷たい + Il paziente sente gelato + Le patient se sent frigorifié Patient feels remarkably cold Patiënt voel opmerkelijk koud aan El paciente se siente realmente frío - 患者は著しく冷たく感じます + 患者は著しく冷たい + Il paziente sente notevolmente freddo + Le patient a une sensation de froid intense Patient feels moderately cold Patiënt voelt redelijk koud aan El paciente se siente moderadamente frío - 患者は少し冷たく感じます + 患者は少し冷たい + Il paziente sente moderatamente freddo + Le patient a modérément froid Patient feels mildly cool Patiënt voelt een klein beetje koud aan El paciente se siente algo frío - 患者は少しひんやりと感じます + 患者は少しひんやりしている + Il paziente sente lievemente fresco + Le patient ressent une légère fraîcheur Patient feels warm Patiënt voelt warm aan El paciente se siente cálido - 患者は暖かく感じます + 患者は暖かい + Il paziente sente caldo + Le patient ressent de la chaleur Check Temperature Check temperatuur Comprobar Temperatura 体温を確認 + Controlla la temperatura + Vérifier la température Checking Temperature Temperatuur wordt gecheckt ComprobandoTemperatura 体温をチェックしています + Controllo della temperatura in corso + La température est vérifiée Check Hand Warmers Check handwarmers Comprobar Calentadores de Mano ハンドウォーマーをチェックします + Controlla i riscaldatori per le mani + Vérifier les chauffe-mains. Performing Wordt uitgevoerd Realizando 適用中 + Esecuzione in corso + En cours de mise en place Line Warmer Active Lijnwarmer actief Calentador de Línea Activo ラインウォーマーを利用中 + Riscaldatore per linea attivo + Chauffe-lignes en service. No Hand Warmers are active at this time Momenteel zijn er geen handwarmers actief No hay calentadores de mano activos actualmente 現在ハンドウォーマーは使っていません + Nessun riscaldatore per le mani è attivo in questo momento + Les chauffe-mains ne sont pas utilisés actuellement. Body: %1 Torso: %1 Cuerpo: %1 胴体: %1 + Corpo: %1 + Corps : %1 Body: None Torso: Geen Cuerpo: Ninguno 胴体: なし + Corpo: Nessuno + Corps : Aucun Left Arm: %1 Linkerarm: %1 Brazo Izquierdo: %1 左腕: %1 + Braccio Sinistro: %1 + Bras gauche : %1 Left Arm: None Linkerarm: Geen Brazo Izquierdo: Ninguno 左腕: なし + Braccio Sinistro: Nessuno + Bras gauche : aucun Right Arm: %1 Rechterarm: %1 Brazo Derecho: %1 右腕: %1 + Braccio Destro: %1 + Bras droit : %1 Right Arm: None Rechterarm: Geen Brazo Derecho: Ninguno 右腕: なし + Braccio Destro: Nessuno + Bras droit : aucun Left Leg: %1 Linkerbeen: %1 Pierna Izquierda: %1 左脚: %1 + Gamba Sinistra: %1 + Jambe gauche : %1 Left Leg: None Linkerbeen: Geen Pierna Izquierda: Ninguno 左脚: なし + Gamba Sinistra: Nessuna + Jambe gauche : aucune Right Leg: %1 Rechterbeen: %1 Pierna Derecha: %1 右脚: %1 + Gamba Destra: %1 + Jambe droite : %1 Right Leg: None Rechterbeen: Geen Pierna Derecha: Ninguno 右脚: なし + Gamba Destra: Nessuna + Jambe droite : non diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index 376306636..610707747 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -186,7 +186,7 @@ #undef GET_SM_STATE #define GET_SM_STATE(_unit) ([_unit, ACEGVAR(medical,STATE_MACHINE)] call CBA_statemachine_fnc_getCurrentState) -#undef GET_BLOOD_VOLUME +#undef GET_BLOOD_VOLUME #define GET_OPIOID_FACTOR(unit) (unit getVariable [QEGVAR(pharma,opioidFactor), 0]) #define GET_PAIN_PERCEIVED(unit) (0 max ((GET_PAIN(unit) - GET_PAIN_SUPPRESS(unit)) min 1)) @@ -344,3 +344,6 @@ //Feedback #define VAR_PP QEGVAR(feedback,ppEffect) #define GET_PP(unit) (unit getVariable [VAR_PP, 0]) + +#define IS_AIRPOISONED(unit) (unit getVariable [QEGVAR(chemical,airPoisoning), false]) +#define IN_TEARGAS(unit) (unit getVariable [QEGVAR(chemical,CSGas), 0]) diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index f353b30a8..5f6090b80 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 3 #define MINOR 0 -#define PATCH 3 -#define BUILD 57 +#define PATCH 4 +#define BUILD 60 diff --git a/addons/misc/functions/fnc_carryObject.sqf b/addons/misc/functions/fnc_carryObject.sqf index b6a2a0b30..e0fefc80f 100644 --- a/addons/misc/functions/fnc_carryObject.sqf +++ b/addons/misc/functions/fnc_carryObject.sqf @@ -75,6 +75,6 @@ if (_UAVCrew isNotEqualTo []) then { }; // Check everything -[ACEFUNC(cdragging,carryObjectPFH), 0.5, [_unit, _target, CBA_missionTime]] call CBA_fnc_addPerFrameHandler; +[ACEFUNC(dragging,carryObjectPFH), 0.5, [_unit, _target, CBA_missionTime]] call CBA_fnc_addPerFrameHandler; [QACEGVAR(dragging,startedCarry), [_unit, _target]] call CBA_fnc_localEvent; diff --git a/addons/misc/script_component.hpp b/addons/misc/script_component.hpp index 56d64c140..1f7a8ff7a 100644 --- a/addons/misc/script_component.hpp +++ b/addons/misc/script_component.hpp @@ -19,4 +19,10 @@ #define MEDICAL_TREATMENT_ITEMS (call (uiNamespace getVariable [QACEGVAR(medical_treatment,treatmentItems), {[]}])) #define DAMAGED_MIN_THRESHOLD 0.45 -#define LIMPING_MIN_DAMAGE 0.5 \ No newline at end of file +#define LIMPING_MIN_DAMAGE 0.5 + +// Animations that would be played slower than this are instead played exactly as slow as this. (= Progress bar will take longer than the slowed down animation). +#define ANIMATION_SPEED_MIN_COEFFICIENT 0.5 + +// Animations that would be played faster than this are instead skipped. (= Progress bar too quick for animation). +#define ANIMATION_SPEED_MAX_COEFFICIENT 2.5 \ No newline at end of file diff --git a/addons/misc/stringtable.xml b/addons/misc/stringtable.xml index dcdc9bfaf..b532cc640 100644 --- a/addons/misc/stringtable.xml +++ b/addons/misc/stringtable.xml @@ -10,6 +10,7 @@ Equipement KAT Equipamento KAT KAT apparatuur + Equipaggiamento KAT ACE-Misc activated? @@ -864,6 +865,7 @@ (IFAK) Индивидуальная аптечка первой помощи (KPSI) Kit de Primeiros Socorros Individual (IFAK) Individuele Eerste hulpkit + (IFAK) Kit di Pronto Soccorso Individuale (MFAK) Multiple First Aid Kit @@ -875,6 +877,7 @@ (MFAK) Многофункциональная аптечка первой помощи (KPSM) Kit de Primeiros Socorros Múltiplo (MFAK) Meervoudige Eerste hulpkit + (MFAK) Kit di Pronto Soccorso Multiplo (AFAK) Advanced First Aid Kit @@ -886,6 +889,7 @@ (AFAK) Усовершенствованная аптечка первой помощи (KPSA) Kit de Primeiros Socorros Avançado (AFAK) Geadvanceerde Eerste hulpkit + (AFAK) Kit di Pronto Soccorso Avanzato Items unload Container @@ -896,6 +900,7 @@ Säiliö tavaroiden purkamiseen Предметы выгружаются с контейнера Items ontlaad container + Contenitore per scaricare gli articoli Defines where the items from the First Aid Kit are added into. If there is no space left they will be dropped on the ground. \n Default: Items are added where space is left. @@ -906,6 +911,7 @@ Määrittää, mihin ensiapulaukun tuotteet lisätään. jos tilaa ei ole jäljellä, ne pudotetaan maahan. \n Oletus: kohteet lisätään sinne, missä on vielä tilaa. Определяет, куда складываются предметы из аптечки первой помощи. Если не останется свободного места, они будут брошены на землю. \n По умолчанию: Предметы добавляются туда, где осталось свободное место. Bepaald waar de items van een Eerste hulpkit worden geplaatst. Als er geen plek is, worden ze op de grond geplaatst. \n Standaard: Items worden geplaatst waar plek is. + Definisce dove gli articoli del Kit di Pronto Soccorso vengono aggiunti. Se non c'è spazio disponibile, verranno lasciati a terra. \n Predefinito: Gli articoli vengono aggiunti dove c'è spazio. Default @@ -916,6 +922,7 @@ Oletus По умолчанию Standaard + Predefinito Uniform @@ -926,6 +933,7 @@ Univormu Униформа Uniform + Uniforme Vest @@ -936,6 +944,7 @@ Liivi Жилет Vest + Gibernaggio Backpack @@ -946,6 +955,7 @@ Reppu Рюкзак Rugzak + Zaino The items & quantity that is given to the player.\n If you want to add/change items remove existing entry & insert item name-tag & quantity you want. \n Example: [['ACE_packingBandage', 10], ['ACE_quikclot', 15]] TO [['ACE_packingBandage', 10], ['ACE_quikclot', 15], ['ACE_Banana', 10]] @@ -956,6 +966,7 @@ Pelaajalle annetut tuotteet ja määrä. \n Jos haluat lisätä/muuttaa kohteita, poista olemassa oleva merkintä ja lisää haluamasi nimikkeen nimilappu ja nimikemäärä. \n Esimerkki: [[`ACE_packingBandage`, 10]. Предметы и количество, которые выдаются игроку.\n Если вы хотите добавить / изменить предметы, удалите существующую запись и вставьте название предмета-тег и количество, которое вы хотите. \n Пример: [['ACE_packingBandage', 10], ['ACE_quikclot', 15]] В [['ACE_packingBandage', 10], ['ACE_quikclot', 15], ['ACE_Banana', 10]] De items en de hoeveelheid dat gegeven wordt aan de speler. \n Als je items wilt toevoegen of veranderen, verwijder dan de bestaande entree en voeg item naam en de hoeveelheid die je wilt in. \n Voorbeeld: [['ACE_packingBandage', 10], ['ACE_quikclot', 15]] NAAR [['ACE_packingBandage', 10], ['ACE_quikclot', 15], ['ACE_Banana', 10]] + Gli articoli e la quantità che vengono dati al giocatore. \n Se desideri aggiungere/cambiare articoli, rimuovi la voce esistente e inserisci il nome dell'articolo con il tag e la quantità che desideri. \n Esempio: [['ACE_packingBandage', 10], ['ACE_quikclot', 15]] A [['ACE_packingBandage', 10], ['ACE_quikclot', 15], ['ACE_Banana', 10]] Trauma Section Items & Quantity @@ -965,6 +976,7 @@ Предметы и количество травматологического раздела Objets et quantité de la section de traumatologie Trauma sectie items & hoeveelheden + Articoli e quantità della sezione trauma Bandage Section Items & Quantity @@ -974,6 +986,7 @@ Предметы и количество в разделе бинтов Objets et quantité de la section de bandages Verbandssectie items & hoeveelheden + Articoli e quantità della sezione bende Pain Management Section Items & Quantity @@ -983,6 +996,7 @@ Предметы и количество раздела обезболивающих Objets et quantité de la section de régulation de la douleur Pijnbestrijdingssectie items & hoeveelheden + Articoli e quantità della sezione gestione del dolore Breathing Section Items & Quantity @@ -992,6 +1006,7 @@ Предметы и количество раздела дыхательной системы Objets et quantité de la section d'articles respiratoires Ademhalingssectie items & hoeveelheden + Articoli e quantità della sezione respirazione Airway Section Items & Quantity @@ -1001,6 +1016,7 @@ Предметы и количество раздела дыхательных путей Objets et quantité de la section des voies aériennes Luchtweg sectie items & hoeveelheden + Articoli e quantità della sezione vie aeree Pharmaceutical Section Items & Quantity @@ -1010,6 +1026,7 @@ Предметы и количество раздела фармацевтики Objets et quantités de la section pharmaceutique Pharmaceutische sectie items & hoeveelheden + Articoli e quantità della sezione farmaceutica Fluid Section Items & Quantity @@ -1019,6 +1036,7 @@ Предметы и количество раздела жидкостей Objets et quantités de la section des fluides Vloeistofsectie items & hoeveelheden + Articoli e quantità della sezione fluidi Miscellaneous Section Items & Quantity @@ -1028,6 +1046,7 @@ Предметы и количества прочего раздела Objets et quantités de la section autres Overige sectie items & hoeveelheden + Articoli e quantità della sezione miscellanea Individual First Aid Kit @@ -1039,6 +1058,7 @@ Индивидуальная аптечка первой помощи Kit de Primeiros Socorros Individual Individuele Eerste hulpskit + Kit di Primo Soccorso Individuale (IFAK) The IFAK can be unpacked to provide useful medical items @@ -1050,6 +1070,7 @@ IFAK можно распаковать, чтобы получить полезные медицинские принадлежности O KPSI pode ser desembalado para prover itens médicos úteis De IFAK kan uitgepakt worden om nuttige producten te verschaffen + Il IFAK può essere disimballato per fornire articoli medici utili Multiple First Aid Kit @@ -1061,6 +1082,7 @@ Многофункциональная аптечка первой помощи Kit de Primeiros Socorros Múltiplo Meervoudige Eerste hulpskit + Kit di Primo Soccorso Multiplo (MFAK) The MFAK can be unpacked to provide useful medical items @@ -1072,6 +1094,7 @@ MFAK можно распаковать, чтобы получить полезные медицинские принадлежности O KPSM pode ser desembalado para prover itens médicos úteis De MFAK kan uitgepakt worden om nuttige producten te verschaffen + Il MFAK può essere disimballato per fornire articoli medici utili Advanced First Aid Kit @@ -1083,6 +1106,7 @@ Усовершенствованная аптечка первой помощи Kit de Primeiros Socorros Avançado Geadvanceerde Eerste hulpskit + Kit di Primo Soccorso Avanzato (AFAK) The AFAK can be unpacked to provide useful medical items @@ -1094,6 +1118,7 @@ AFAK можно распаковать, чтобы получить полезные медицинские принадлежности O KPSA pode ser desembalado para prover itens médicos úteis de AFAK kan uitgepakt worden om nuttige producten te verschaffen + Il AFAK può essere disimballato per fornire articoli medici utili IFAK @@ -1105,6 +1130,7 @@ IFAK KPSI IFAK + IFAK MFAK @@ -1116,6 +1142,7 @@ MFAK KPSM MFAK + MFAK AFAK @@ -1127,6 +1154,7 @@ AFAK KPSA AFAK + AFAK View Packing List @@ -1138,6 +1166,7 @@ Voir la liste de remplissage Ver lista Zie paklijst + Visualizza la lista di imballaggio Trauma Section: @@ -1149,6 +1178,7 @@ Section de traumatologie : Seção de trauma: Trauma sectie: + Sezione Trauma: Bandage Section: @@ -1160,6 +1190,7 @@ Section de bandages : Seção de bandagens: Verbandssectie: + Sezione Bende: Pain Management Section: @@ -1171,6 +1202,7 @@ Section de régulation de la douleur : Seção de gerenciamento de dor: Pijnbestrijdingssectie: + Sezione Gestione del Dolore: Breathing Section: @@ -1182,6 +1214,7 @@ Section d'articles respiratoires : Seção de respiração: Ademhalingssectie: + Sezione Respirazione: Airway Section: @@ -1193,6 +1226,7 @@ Section des voies aériennes : Seção de vias aéreas: Luchtweg sectie: + Sezione Vie Aeree: Pharmaceutical Section: @@ -1204,6 +1238,7 @@ Section pharmaceutique : Seção farmacêutica: Pharmaceutische sectie: + Sezione Farmaceutica: Fluid Section: @@ -1215,6 +1250,7 @@ Section des fluides : Seção de flúidos: Vloeistofsectie: + Sezione Fluidi: Miscellaneous Section: @@ -1226,6 +1262,7 @@ Sections autres : Seção miscelânea: Overige sectie: + Sezione Miscellanea: Unpack Trauma Section @@ -1237,6 +1274,7 @@ Déballer la section de traumatologie Descompactar seção de trauma Pak trauma sectie uit + Sblocca la Sezione Trauma Unpack Bandage Section @@ -1248,6 +1286,7 @@ Déballer la section de bandages Descompactar seção de bandagem Pak verbandssectie uit + Sblocca la Sezione Bende Unpack Pain Management Section @@ -1259,6 +1298,7 @@ Déballer la section de régulation de la douleur Descompactar seção de gerenciamento de dor Pak pijnbestrijdingssectie uit + Sblocca la Sezione Gestione del Dolore Unpack Breathing Section @@ -1270,6 +1310,7 @@ Déballer la section d'articles respiratoires Descompactar seção de respiração Pak ademhalingssectie uit + Sblocca la Sezione Respirazione Unpack Airway Section @@ -1281,6 +1322,7 @@ Déballer la section des voies aériennes Descompactar seção de vias aéreas Pak luchtweg sectie uit + Sblocca la Sezione Vie Aeree Unpack Pharmaceutical Section @@ -1292,6 +1334,7 @@ Déballer la section pharmaceutique Descompactar seção farmacêutica Pak pharmaceutische sectie uit + Sblocca la Sezione Farmaceutica Unpack Fluid Section @@ -1303,6 +1346,7 @@ Déballer la section des fluides Descompactar seção de fluidos Pak vloeistoffen sectie uit + Sblocca la Sezione Fluidi Unpack Miscellaneous Section @@ -1314,6 +1358,7 @@ Déballer la section autres Descompactar seção miscelânea Pak overige sectie uit + Sblocca la Sezione Miscellanea Repack Trauma Section @@ -1325,6 +1370,7 @@ Remballer la section de traumatologie Compactar seção de trauma Herpak trauma sectie + Rimballa la Sezione Trauma Repack Bandage Section @@ -1336,6 +1382,7 @@ Remballer la section de bandages Compactar seção de bandagem Herpak verbandssectie + Rimballa la Sezione Bende Repack Pain Management Section @@ -1347,6 +1394,7 @@ Remballer la section de régulation de la douleur Compactar seção de gerenciamento de dor Herpack pijnbestrijdingssectie + Rimballa la Sezione Gestione del Dolore Repack Breathing Section @@ -1358,6 +1406,7 @@ Remballer la section d'articles respiratoires Compactar seção de respiração Herpack ademhalingssectie + Rimballa la Sezione Respirazione Repack Airway Section @@ -1369,6 +1418,7 @@ Remballer la section des voies aériennes Compactar seção de vias aéreas Herpack luchtweg sectie + Rimballa la Sezione Vie Aeree Repack Pharmaceutical Section @@ -1380,6 +1430,7 @@ Remballer la section pharmaceutique Compactar seção farmacêutica Herpak pharmaceutische sectie + Rimballa la Sezione Farmaceutica Repack Fluid Section @@ -1391,6 +1442,7 @@ Remballer la section des fluides Compactar seção de fluidos Herpak vloeistoffen sectie + Rimballa la Sezione Fluidi Repack Miscellaneous Section @@ -1402,6 +1454,7 @@ Remballer la section autres Compactar seção miscelânea Herpak overige sectie + Rimballa la Sezione Miscellanea Hint Item Color @@ -1412,6 +1465,7 @@ Подсказка по цвету элемента Couleur d'indice de l'objet kleur van itemhint + Colore dell'Articolo Suggerito The item color of the text that is displayed via a hint @@ -1422,6 +1476,7 @@ Цвет элемента текста, отображаемого с помощью подсказки La couleur de l'objet du texte affiché via un indice De kleur van de tekstitem die weergeven wordt via een hint + Il colore dell'articolo del testo che viene mostrato tramite un suggerimento Hint Section Color @@ -1431,6 +1486,7 @@ Цвет раздела подсказок Couleur d'indice de la section Hint sectie kleur + Colore della Sezione Suggerita The Section color of the text that is displayed via a hint @@ -1440,6 +1496,7 @@ Цвет раздела текста, отображаемого с помощью подсказки La couleur de la section du texte affiché via un indice De kleur van de sectie die weergeven wordt met een hint + Il colore della sezione del testo che viene mostrato tramite un suggerimento Remove when empty @@ -1450,6 +1507,7 @@ Poista tyhjänä Удалить, когда опустеет Verwijder wanneer leeg + Rimuovi quando vuoto Carry Patient @@ -1462,6 +1520,7 @@ Kanna potilasta Нести пациента Draag patiënt + Trasporta il paziente Cancel Carrying @@ -1474,6 +1533,7 @@ Peruuta potilaan kuljettaminen Прекратить нести Dragen annuleren + Annulla il Trasporto Stopped carrying %1 @@ -1486,6 +1546,7 @@ Lakkasi kantamisen %1 Прекратил нести %1 Gestopt met het dragen van %1 + Trasporto interrotto di %1 Use Surgical Kit (Full Body) @@ -1496,6 +1557,7 @@ Utiliser la trousse chirurgicale (Corps complet) Utilizar kit cirúrgico (corpo inteiro) Gebruik chirurgische kit (volledig lichaam) + Usa il Kit Chirurgico (Corpo Intero) Enable Full Body Stitching @@ -1504,6 +1566,7 @@ 全身縫合を有効化 Activer la suture complète du corps Schakel hechten van het volledige lichaam in + Abilita la Cucitura del Corpo Intero Adds a full-body stitching option alongside the individual body part stitching, using ACE's established settings and values for consistency @@ -1512,6 +1575,7 @@ 身体部位毎に縫合するアクションに加え、ACEの設定値と同様の動きを保ったままの、全身を一括で縫合するオプションを追加します。 Ajoute une option de suture complète du corps à côté de la suture de chaque partie du corps, en utilisant les paramètres et les valeurs établis par ACE pour plus de cohérence Voegt een hechtingsactie toe voor het gehele lichaam, naast de standaard individuele hechtingsopties, die de waarden en instellingen van ACE gebruikt voor consistentie + Aggiunge un'opzione di cucitura del corpo intero insieme alla cucitura dei singoli arti, utilizzando le impostazioni e i valori stabiliti di ACE per coerenza diff --git a/addons/pharma/ACE_Medical_Treatment.hpp b/addons/pharma/ACE_Medical_Treatment.hpp index 71ec22cca..eb0689565 100644 --- a/addons/pharma/ACE_Medical_Treatment.hpp +++ b/addons/pharma/ACE_Medical_Treatment.hpp @@ -257,7 +257,7 @@ class ACE_ADDON(Medical_Treatment) { hrIncreaseLow[] = {-5, -10}; hrIncreaseNormal[] = {-15, -20}; hrIncreaseHigh[] = {-20, -30}; - timeInSystem = 45; + timeInSystem = 60; timeTillMaxEffect = 5; maxDose = 10; incompatibleMedication[] = {}; diff --git a/addons/pharma/stringtable.xml b/addons/pharma/stringtable.xml index 6a6058359..31f81a9c6 100644 --- a/addons/pharma/stringtable.xml +++ b/addons/pharma/stringtable.xml @@ -178,6 +178,7 @@ Paquete de medicación para heridas de combate. Se utiliza para suprimir el dolor leve y aliviar los síntomas de incompatibilidad sanguínea Gevechts wond medicatie pil pak<br/>Wordt gebruikt om milde pijn en bloed incompatibiliteit op te lossen Pack de Pilules Médicales pour Blessures de Combat </br> Utilisé pour supprimer les douleurs mineures et soulager les symptômes d'incompatibilité sanguine. + Pacchetto di Pillole per Medicazioni da Combattimento<br/>Usato per sopprimere il dolore lieve e alleviare i sintomi di incompatibilità del sangue Combat Pill Pack @@ -186,6 +187,7 @@ Comprimidos de Combate Gevechtspillendoosje Pack de Pilules de combat + Pacchetto di Pillole da Combattimento Use CWMP @@ -195,6 +197,7 @@ Utilizar Comprimidos de Combate Gebruik Gevechtspillendoosje Utiliser le PMBC + Usa il Pacchetto di Pillole da Combattimento (CWMP) Used to restore consciousness @@ -261,6 +264,7 @@ Penthrox inhalaattori Ингалятор Пентрокс Penthrox inhalator + Inalatore Penthrox Use Penthrox Inhaler @@ -274,6 +278,7 @@ Käytä penthrox-inhalaattoria Использовать ингалятор Пентрокс Gebruik Penthrox inhalator + Usa l'Inalatore Penthrox Volatile anesthetic, used to suppress moderate pain @@ -281,6 +286,7 @@ Anestésico inhalable, utilizado para suprimir el dolor moderado volatiel anestheticum, wordt gebruik om stevige pijn te onderdrukken Anesthésique volatil, utilisé pour supprimer les douleurs modérées + Anestetico volatile, usato per sopprimere il dolore moderato Used to reverse opioid overdoses @@ -668,10 +674,13 @@ Autoinjecteur de Phényléphrine Autoinjetor de Fenilefrina Fenylefrine autoinjector + Autoiniettore di Fenilefrina Used to raise blood pressure 血圧を上げるために使用される + Usato per aumentare la pressione sanguigna + Utilisé pour augmenter la pression artérielle Inject Phenylephrine @@ -1112,6 +1121,7 @@ Les fluides nécessitent une IV/IO insérée Fluido necessita de inserção IV/IO Vloeistoffen vereisen een aangelegde IV/IO + Fluido richiede IV/IO inserito Default false. If true, you will need to insert IV/IO first before being able to give someone saline/blood/plasma. \nIf false, it retains standard ACE behaviour for using saline/blood/plasma. @@ -1172,6 +1182,7 @@ La prise de sang nécessite une IV/IO Extração de sangue necessita de IV/IO Bloedoptrekken vereist IV/IO + Prelievo di sangue richiede IV/IO Default false. If true, you will need to insert IV/IO first before being able to draw blood from someone. \nIf false, you can draw without it. @@ -1182,14 +1193,19 @@ Désactivé par défaut. Si activé, vous devrez d’abord insérer une IV/IO avant de pouvoir prélever du sang sur quelqu’un. \nSi désactivé, vous pouvez effectuer une prise de sang sans IV/IO. Desativado, por padrão. Quando ativado, você precisará inserir IV/IO primeiro antes de poder retirar sangue de alguém. \nSe desativado, você pode retirar sem ele. Standaard vals. Wanneer waar moet er eerst een IV/IO toegediend worden voordat je bloed kan optrekken. \nWanneer vals is dit niet vereist. + Impostazione predefinita falsa. Se vera, dovrai inserire prima IV/IO prima di poter prelevare sangue da qualcuno. \nSe falsa, puoi prelevare senza di esso. Enable IV/IO Flow Control IV/IO流量操作を有効化 + Abilita il controllo del flusso IV/IO + Activer les opérations de flux IV/IO Enables the IV/IO flow control menu which gives the medic fine control over the volume running through the active line IV/IO流量操作メニューを有効にし、輸液がラインを流れる液量を衛生兵が細かく制御できるようにします。 + Abilita il menu di controllo del flusso IV/IO che consente al medico di controllare con precisione il volume che scorre attraverso la linea attiva. + Active le menu de contrôle du débit IV/IO qui permet à l'infirmier de contrôler finement le volume circulant dans la ligne active. Reorientation slap sound @@ -1239,7 +1255,7 @@ Stimulation activé? Yeniden yönlendirme etkin mi? Stimolazione abilitata? - 患者を刺激するアクションを有効化しますか? + "患者を刺激する"アクションを有効化 Переориентация включена? Reorientação habilitada? Uudelleensuuntaus käytössä? @@ -1257,7 +1273,7 @@ Activer stimulation Yeniden yönlendirmeyi etkinleştirir Stimolazione abilitata - 安定化している患者を刺激(平手打ち)することで、目覚めさせる機能を有効化します + 安定化している患者を刺激(平手打ち)することで、目覚めさせる機能とアクションを有効化します Включает переориентация Habilita a reorientação Mahdollistaa suunnanmuutoksen @@ -1605,6 +1621,7 @@ Anestésico disociativo, utilizado para suprimir el dolor severo Dissociatieve anestheticum, wordt gebruikt om ernstige pijn te onderdrukken Anesthésiques dissociatifs, utilisés pour supprimer les douleurs sévères + Anestetici dissociativi, usati per sopprimere il dolore severo Push Fentanyl @@ -1645,6 +1662,7 @@ Analgésico opioide, utilizado para suprimir el dolor severo Opïode analgeticum, wordt gebruikt om ernstige pijn te onderdrukken Analgésique opioïde, utilisé pour supprimer les douleurs sévères + Analgesico oppioide, usato per sopprimere il dolore severo Push Nalbuphine @@ -1685,6 +1703,7 @@ Analgésico opioide, utilizado para suprimir el dolor moderador Opïode analgeticum, wordt gebruikt om matige pijn te onderdrukken Analgésique opioïde, utilisé pour supprimer les douleurs modérées + Analgesico oppioide, usato per sopprimere il dolore moderato Maximum Reorientation Success Chance @@ -2271,6 +2290,7 @@ Lääketieteellinen koulutustaso vaatii penthrox-inhalaattorin Медицинский уровень, необходимый для использования ингалятора Пентрокс Medisch niveau benodigd voor het gebruik van Penthrox inhalators + Livello medico richiesto per l'inalatore Penthrox Treatment time for Penthrox Inhaler @@ -2283,6 +2303,7 @@ Penthrox-inhalaattorin hoitoaika Время обработки ингалятором Пентрокс Behandeltijd van Penthrox inhalators + Tempo di trattamento per l'inalatore Penthrox Basic Settings @@ -2645,6 +2666,7 @@ Penthrox-inhalaattorin asetukset Настройки ингалятора Пентрокс Penthrox inhalator instellingen + Impostazioni dell'inalatore Penthrox %1 performed a saline flush @@ -2657,6 +2679,7 @@ %1 suoritti suolaliuoksen huuhtelun %1 провел промывание физиологическим раствором %1 voerde een salinespoeling uit + %1 ha eseguito un lavaggio salino Patient's IV is blocked @@ -2870,6 +2893,7 @@ Fármaco para mejorar el rendimiento, utilizado para suprimir el dolor moderado Prestatieverhogend medicijn, wordt gebruikt om matige pijn te onderdrukken Drogue améliorant les performances, utilisée pour supprimer les douleurs modérées + Farmaco migliorante le prestazioni, utilizzato per sopprimere il dolore moderato Take Pervitin @@ -3044,6 +3068,7 @@ Estimula el sistema nervioso central y aporta energía. Stimuleert het centraal zenuwstelsel en geeft energie Stimule le système nerveux central et revitalise + Stimola il sistema nervoso centrale e aumenta l'energia Take Caffeine @@ -3213,6 +3238,7 @@ Lääkitys muuttaa kestävyyttä Лекарства изменяют выносливость Medicatie heeft invloed op uithoudingsvermogen + Il farmaco modifica la resistenza Allow certain medications to modify (vanilla/advanced fatigue) stamina as a side effect @@ -3225,6 +3251,7 @@ Salli tiettyjen lääkkeiden muuttaa kestävyyttä (vanilja/edistynyt väsymys) sivuvaikutuksena Позволяют определенным лекарствам изменять выносливость (ваниль/повышенная утомляемость) в качестве побочного эффекта Bepaald of sommige medicijnen het uithoudingsvermogen (vanilla/geadvanceerde uitputting) beïnvloeden als een bijwerking + Consenti a determinati farmaci di modificare la resistenza (fatica normale/avanzata) come effetto collaterale EACA Clears Trauma @@ -3234,6 +3261,7 @@ L'EACA soigne les traumatismes EACA Remove Traumas EACA verwijderd trauma + EACA elimina il trauma Allows Trauma to be cleared by EACA in addition to stitching @@ -3243,6 +3271,7 @@ Autorise le soin complet des traumatismes par l'EACA en plus de la suture Permite que o EACA remova traumas além de suturar Staat toe dat EACA trauma verwijderd, als additie van hechten + Consente al trauma di essere rimosso da EACA oltre alla sutura. Allow Stacking @@ -3250,6 +3279,7 @@ Permitir acumulación Sta stapelen toe Autoriser l'empilage + Permetti l'impilamento If enabled TXA will be stackable and double it's efficiency @@ -3257,6 +3287,7 @@ Si el ATX esta permitido, se podrá acumular y duplicará su eficiencia Wanneer ingeschakeld: sta het stapelen van TXA toe, wat de effectiviteit verdubbeld) Si activé, le TXA sera empilable et doublera son efficacité + Se abilitato, il TXA sarà impilabile e raddoppierà la sua efficienza Keep Bandaging Until Out Of System @@ -3264,6 +3295,7 @@ Mantiene el Vendaje hasta que desaparezca del organismo Blijf verbinden tot uit het systeem Continuer à bander jusqu'à ce que le produit soit éliminé du système + Continua a fasciarti finché non esce dal sistema If enabled TXA will keep bandaging until it's out of your system\nIf disabled TXA will stop working after bandaging the last wound it can find @@ -3271,6 +3303,7 @@ Si el ATX esta permitido, seguirá vendando hasta que desaparezca del organismo\nSi el ATX no esta permitido, dejará de funcionar después de vendar la última herida que pueda encontrar Wanneer ingeschakeld: TXA blijft verbinden tot het uit jouw systeem is.\nWanneer uitgeschakeld: TXA Stopt met werken wanneer alle wonden gedicht zijn. Si activé, le TXA continuera à bander jusqu'à ce qu'il soit éliminé du système.\nSi désactivé, le TXA cessera de fonctionner après avoir bandé la dernière plaie qu'il peut trouver. + Se abilitato, TXA continuerà a fasciarsi finché non sarà eliminato dal sistema.\nSe disabilitato, TXA smetterà di funzionare dopo aver fasciato l'ultima ferita che trova. TXA Cycle Time @@ -3278,6 +3311,7 @@ Ciclo de tiempo del ATX TXA cyclustijd Temps de cycle du TXA + Tempo del ciclo TXA The time it takes for TXA to close a wound @@ -3285,6 +3319,7 @@ El tiempo que tarda el ATX en cerrar una herida Hoe lang het duurt voordat TXA een wond dicht Temps requis pour permettre au TXA de refermer une blessure + Il tempo necessario affinché TXA chiuda una ferita Coagulation Settings @@ -3293,6 +3328,7 @@ Configurações de coagulação Coagulatie instellingen Paramètres de coagulation + Impostazioni di coagulazione Require Heart Rate @@ -3300,6 +3336,7 @@ Requiere Ritmo Cardiaco Vereist hartslag Fréquence cardiaque requise + Richiede la Frequenza Cardiaca Should coagulation require a heart rate above 20BPM? (Doing CPR will keep HR above 20BPM) @@ -3307,6 +3344,7 @@ La coagulación requerirá de un ritmo cardiaco superior a 20 PPM (Hacer RCP mantendrá el RC por encima de 20 PPM) Is een hartslag van meer dan 20SPM benodigt voor coagulatie? (Het uitvoeren van CPR houdt de hartslag boven 20SPM) La coagulation nécessite-elle un fréquence cardiaque supérieure à 20 BPM ? (Effectuer la RCP gardera le FC au dessus de 20 BPM) + La coagulazione dovrebbe richiedere una frequenza cardiaca superiore a 20 BPM? (Fare RCP manterrà la frequenza cardiaca sopra i 20 BPM) Required Blood Volume @@ -3314,6 +3352,7 @@ Volumen de sangre requerido Benodigd bloedvolume Volume sanguin requis + Volume di sangue richiesto Minimum volume of blood required for coagulation to work @@ -3321,6 +3360,7 @@ Volumen de sangre necesario para que la coagulación funcione Het minimale bloedvolume dat vereist is voor coagulatie om te werken Volume de sang minimal requis pour permettre à la coagulation de fonctionner + Volume minimo di sangue richiesto affinché la coagulazione funzioni Coagulation Factors @@ -3328,6 +3368,7 @@ Factores de Coagulación Stollingsfactoren Facteurs de coagulation + Fattori di coagulazione The amount of coagulation factors that get set on unit spawn & be kept as limit for factor regeneration @@ -3335,6 +3376,7 @@ La cantidad de factores de coagulación que se establecen al spawnear y se mantienen como límite para la regeneración de factores De hoeveelheid stollingsfactoren dat een eenheid krijgt op spawn en als limiet wordt gebruik voor hergeneratie La quantité de facteurs de coagulation définie lors de l’apparition de l'unité et conservée comme limite pour la régénération des facteurs. + La quantità di fattori di coagulazione che vengono impostati al momento della creazione dell'unità e mantenuti come limite per la rigenerazione dei fattori. Clotting Cycle Time @@ -3342,6 +3384,7 @@ Duración del ciclo de coagulación Stollingscyclustijd Temps de cycle de coagulation + Tempo del ciclo di coagulazione The time between each wound clotting cycle that start wound clotting. (low number may cause lag) @@ -3349,6 +3392,7 @@ El tiempo entre cada ciclo de coagulación de la herida que inicia la coagulación. (Un número bajo puede causar lag) De hoeveelheid tijd tussen elke wondstollingscyclus. (een laag nummer kan leiden tot lag) Le temps entre chaque cycle de coagulation des plaies qui déclenche la coagulation. (Un nombre bas peut entraîner du lag) + Il tempo tra ogni ciclo di coagulazione delle ferite che avvia la coagulazione. (un valore basso potrebbe causare lag Minor Wounds Clotting Time @@ -3356,6 +3400,7 @@ Tiempo de coagulación de Heridas Leves Kleine wonden stollingstijd Temps de coagulation des blessures mineures + Tempo di coagulazione per ferite minori Medium Wounds Clotting Time @@ -3363,6 +3408,7 @@ Tiempo de coagulación de Heridas Medias Middelgrote wonden stollingstijd Temps de coagulation des blessures moyennes + Tempo di coagulazione per ferite medie Large Wounds Clotting Time @@ -3370,6 +3416,7 @@ Tiempo de coagulación de Heridas Severas Grote wonden stollingstijd Temps de coagulation des blessures larges + Tempo di coagulazione per ferite gravi This time gets divided by 2, randomized & added with the same value devided by 2.\nFor example, if the value was set to 10s this would be one possible varriation: (random (10 / 2)) + (10 / 2) = 8s @@ -3377,6 +3424,7 @@ Este tiempo se divide entre 2, se aleatoriza y se suma con el mismo valor dividido por 2.\n Por ejemplo, si el valor se establece en 10 esto sería un posible resultado: ("al azar del 0 al" (10/2)) + (10/2) = 8s Deze tijd wordt door 2 gedeeld, gerandomiseerd en dan met dezelfde waarde gedeeld door 2 opgeteld. \nBijvoorbeeld: als deze waarde op 10 seconden ingesteld staat dan is één mogelijke variatie:(random(10/2))+(10/2) = 8s Ce temps est divisé par 2, randomisé et additionné à la même valeur divisée par 2. \nPar exemple, si une valeur est fixée à 10 secondes, une variation possible serait : (aléatoire (10 / 2)) + (10 / 2) = 8s + Questo tempo viene diviso per 2, randomizzato e aggiunto al stesso valore diviso per 2.\nAd esempio, se il valore fosse impostato su 10 secondi, una possibile variazione sarebbe: (random (10 / 2)) + (10 / 2) = 8 secondi. Coagulation Factor Regeneration Cycle @@ -3384,6 +3432,7 @@ Ciclo de Regeneración del Factor de Coagulación Stollingsfactor hergeneratiecyclus Cycle de régénération des facteurs de coagulation + Ciclo di rigenerazione dei fattori di coagulazione The time between coagulation factor regeneration checks. Will add +1 factor on successful check. Uses Setting: "Coagulation Factors" as limit.\n Note: If the limit is exceeded, this time will be used and then remove -1 factor until Setting: "Coagulation Factors" is reached. Tipp: TXA or EACA stop losing factors\nRequirements for regeneration to work:\n- No wound being clotted in the last cycle check from this setting\n- Setting: "Require Heart Rate"\n- Setting: "Required Blood Volume" @@ -3391,6 +3440,7 @@ Tiempo que transcurre entre cada revisión de la regeneración del factor de coagulación. Añade +1 factor si la revisión ha tenido éxito. Utiliza el ajuste "Factores de Coagulación" como límite.\n Nota: Si el limite es excedido, el tiempo será usado para retirar -1 factor hasta que el ajuste "Factor de Coagulación" se alcance. Consejo: ATX o EACA dejan de perder factores.\n Requisitos para que la regeneración funcione:\n- Ninguna herida coagulada en la última revisión del ciclo de este ajuste.\n- Ajuste: "Requiere Ritmo Cardíaco"\n- Ajuste: "Volumen de Sangre requerido" De tijd tussen stollingsfactor hergeneratie checks. Geeft +1 factor op een succesvolle check. Gebruikt instelling: "Stollingsfactoren" als limiet. \n Wees alert: als het limiet overschreden is, dan zal na deze check 1 factor verwijderd worden (-1 factoren) tot het limiet weer bereikt is. Tip: TXA en EACA stoppen het verlies van factoren.\nVereisten voor hergeneratie:\n- Geen wond gestold in de laaste cyclus van deze instelling,\n- Instelling: "Vereist hartslag"\n- "Benodigd bloedvolume" Le temps entre les vériofications de régénération des facteurs de coagulation. Ajoute +1 facteur en cas de vérification réussie. Utilise le paramètres : "Facteurs de coagulation" comme limite. \nRemarque : si la limite est dépassée, ce temps sera utilisé, puis -1 facteur sera retiré jusqu'à ce que le paramètre : "Facteurs de coagulation" soit atteint. Conseil :TXA ou EACA arrêtent la perte de facteurs.\nConditions nécessaires pour que la régénération fonctionne :\n- Aucune plaie en cours de coagulation au cours du dernier cycle de vérification de ce paramètres.\n- Paramètre : "Fréquence cardiaque requise"\n- Paramètre : "Volume sanguin requis" + Il tempo tra i controlli di rigenerazione dei fattori di coagulazione. Aggiunge +1 fattore in caso di controllo riuscito. Utilizza l'impostazione: "Fattori di coagulazione" come limite.\nNota: se il limite viene superato, questo tempo verrà utilizzato e poi verrà rimosso -1 fattore fino a quando non si raggiunge l'impostazione: "Fattori di coagulazione". Suggerimento: TXA o EACA fermano la perdita di fattori.\nRequisiti affinché la rigenerazione funzioni:\n- Nessuna ferita in corso di coagulazione nell'ultimo ciclo di verifica di questa impostazione.\n- Impostazione: "Frequenza cardiaca richiesta"\n- Impostazione: "Volume sanguigno richiesto" Affect AI @@ -3398,6 +3448,7 @@ Afecta a la IA Beïnvloed AI/KI Affecte l'IA + Influenza IA Allow coagulation to affect AI units.\nEvery other value will still be required if turned on. (May cause lag if many AI is present) @@ -3405,6 +3456,7 @@ Permitir que la coaguación afecte a las unidades de IA. Todos los demás valores seguirán siendo necesarios si se activan. (Puede causar lag si hay muchas IA presentes) Laat coagulatie AI/KI beïnvloeden.\nElke andere waarde wordt ook voor AI/KI gecheckt wanneer dit aanstaat. (Kan prestatieproblemen opleveren als er veel AI's/KI's aanwezig zijn.) Autoriser la coagulation à affecter les unités IA.\nTous les autres paramètres seront toujours nécessaires si cette option est activée. (Peut entraîner un lag si de nombreuses IA sont présentes.) + Permettere alla coagulazione di influenzare le unità IA.\nOgni altro valore sarà comunque richiesto se attivato. (Può causare lag se sono presenti molte IA) Tournique Blocks Blood Clotting @@ -3412,6 +3464,7 @@ Torniquete Bloquea la Coagulación de la Sangre Tourniquets blokkeren wondstolling Le garrot bloque la coagulation + Il tourniquet blocca la coagulazione del sangue If enabled a applied tourniquet will stop wounds from being closed from coagulation on that bodypart @@ -3419,6 +3472,7 @@ Si se activa, el torniquete aplicado impedirá que las heridas se cierren por coagulación en esa parte del cuerpo Tourniquets voorkomen dat wonden op hetzelfde ledemaat dichtgemaakt worden door coagulatie wanneer deze instelling actief is Si activé, un garrot appliqué empêchera les plaies de se fermer par coagulation sur cette partie du corps. + Se abilitato, un tourniquet applicato impedirà la chiusura delle ferite tramite coagulazione su quella parte del corpo. Affect Minor Wounds @@ -3426,6 +3480,7 @@ Afecta a Heridas Menores Beïnvloed kleine wonden Affecter les blessures mineures + Influenza le ferite minori Allow coagulation to affect minor wounds when clotting @@ -3433,6 +3488,7 @@ Permitir que la coagulación afecte a heridas leves al coagularse Staat toe dat coagulatie kleine wonden beïnvloed tijdens het stollen Permettre à la coagulation d'affecter les blessures mineures lors de la coagulation + Consenti alla coagulazione di influenzare le ferite minori durante la coagulazione Affect Medium Wounds @@ -3440,6 +3496,7 @@ Afecta a Heridas Medias Beïnvloed middelgrote wonden Affecter les blessures moyennes + Consenti alla coagulazione di influenzare le ferite medie Allow coagulation to affect medium wounds when clotting @@ -3447,6 +3504,7 @@ Permitir que la coagulación afecte a heridas medias al coagularse Staat toe dat coagulatie middelgrote wonden beïnvloed tijdens het stollen Permettre à la coagulation d'affecter les blessures moyennes lors de la coagulation + Consenti alla coagulazione di influenzare le ferite medie durante la coagulazione Affect Large Wounds @@ -3454,6 +3512,7 @@ Afecta a Heridas Severas Beïnvloed grote wonden Affecter les blessures larges + Influenzare le ferite gravi Allow coagulation to affect large wounds when clotting @@ -3461,6 +3520,7 @@ Permite que la coagulación afecte a heridas severas al coagularse Staat toe dat coagulatie grote wonden beïnvloed tijdens het stollen Permettre à la coagulation d'affecter les blessures larges lors de la coagulation + Permettere alla coagulazione di influenzare le ferite gravi durante la coagulazione Allow Additional TXA Bandaging @@ -3468,6 +3528,7 @@ Permitir el Vendaje ATX Adicional Sta additionele TXA dichtingen toe Permettre l'apport de bandages par le TXA + Consenti la medicazione aggiuntiva con TXA If enabled TXA will keep all functionality and start bandaging wounds itself @@ -3475,6 +3536,7 @@ Si el ATX esta permitido, mantendrá toda la funcionalidad y empezará a vendar las heridas por si mismo TXA houdt zijn functionaliteit en zal wonden dichten wanneer deze instelling actief is. Si activé, le TXA gardera toutes ses fonctionnalités et bandera les plaies par lui-même + Se abilitato, TXA manterrà tutte le funzionalità e inizierà a medicare le ferite da solo Allow Additional EACA Stiching @@ -3482,6 +3544,7 @@ Permitir la Sutura EACA Adicional Sta additionele EACA hechtingen toe Permettre la suture par l'EACA + Consenti la sutura aggiuntiva con EACA If enabled EACA will keep all functionality and start stitching bandaged wounds @@ -3489,6 +3552,7 @@ Si el EACA esta permitido, mantendrá la funcionalidad y empezará a suturar las heridas vendadas EACA houdt zijn functionaliteit en zal wonden hechten wanneer deze instelling actief is. Si activé, l'EACA gardera toutes ses fonctionnalités et suturera les plaies par lui-même + Se abilitato, EACA manterrà tutte le funzionalità e inizierà a suturare le ferite già medicati. Simultaneous Bodypart Coagulation @@ -3496,6 +3560,7 @@ Coagulación Simultanea de las Partes del Cuerpo Gelijktijdige coagulatie Coagulation simultanée de plusieurs membres + Coagulazione simultanea delle parti del corpo If enabled each bodypart will be treated simultaneously by coagulation.\nMeaning if you have a wound on the head and body they will both be treated in the same coagulation cycle. @@ -3503,6 +3568,7 @@ Si se permite, cada parte del cuerpo se tratará simultáneamente mediante coagulación. \nEs decir, si tiene una herida en la cabeza y otra en el torso, ambas se tratarán en el mismo ciclo de coagulación. Als dit ingeschakeld is, zal elk lichaamsdeel tegelijkertijd behandeld worden door coagulatie. \nWat betekent dat als je een wond aan je arm en been hebt, dat deze in dezelfde coagulatiecyclus behandeld worden Si activé, chaque membre sera affecté simultanément par la coagulation.\nCela signifie que si une plaie est présente sur la tête et le torse, elles seront toutes deux traitées lors du même cycle de coagulation. + Se abilitato, ogni parte del corpo sarà trattata simultaneamente dalla coagulazione.\nCiò significa che se hai una ferita sulla testa e sul corpo, entrambe verranno trattate nello stesso ciclo di coagulazione. Coagulation Factor Limit @@ -3510,6 +3576,7 @@ Limite del Factor de Coagulación Stollingsfactor limiet Limite de facteurs de coagulation + Limite dei fattori di coagulazione The limit for how many coagulation factors can be present inside a units body at once. Meaning if you administer plasma this is the maximum attainable value. @@ -3517,6 +3584,7 @@ Limite del número de factores de coagulación que pueden estar presentes a la vez en el organismo de una unidad. Es decir, si administras plasma, éste es el valor máximo alcanzable. Het limiet voor hoeveel stollingsfactoren er in een eenheids lichaam tegelijkertijd aanwezig kan zijn. Wat betekent dat dit de waarde is waar zelfs plasma geen extra factoren meer toevoegd La limite du nombre de facteurs de coagulation pouvant être présents dans le corps d'une unité. Cela signifie que si du plasma est administré, il s'agira de la valeur maximale atteignable. + Il limite di quanti fattori di coagulazione possono essere presenti nel corpo di un'unità contemporaneamente. Ciò significa che se somministri plasma, questo è il valore massimo raggiungibile. Allow Clots To Be Shown in Menu @@ -3524,6 +3592,7 @@ Permitir que los Coágulos se muestren en el Menú Sta toe dat stollingen worden weergeven in het menu Autoriser l'affichage des caillots dans le menu + Consenti la visualizzazione dei coaguli nel menu If enabled, when coagulation is bandaging a wound it will add a interaction log to the medical menu. @@ -3531,6 +3600,7 @@ Si se activa, cuando la coagulación esté vendando una herida añadirá un registro de interacción al menú médico. Wanneer dit is ingeschakeld is worden gestolde wonden toegevoegd aan de interactie log van het medisch menu. Si activé, lorsque la coagulation bandera une plaie, une ligne sera ajoutée dans le journal des interactions du menu médical. + Se abilitato, quando la coagulazione sta medicando una ferita, aggiungerà un registro di interazione nel menu medico. Blood clotting temporarily closed a wound on %1 @@ -3539,6 +3609,7 @@ Coagulação estancou temporariamente um ferimento em %1 Wondstolling heeft een wond op %1 tijdelijk gedicht La coagulation a temporairement fermé une plaie sur %1 + Il coagulo di sangue ha temporaneamente chiuso una ferita su %1 Blood clotting permanently closed a wound on %1 @@ -3547,6 +3618,7 @@ Coagulação estancou permanentemente um ferimento em %1 Wondstolling heeft een wond op %1 permanent gedicht La coagulation a définitivement fermé une plaie sur %1 + Il coagulo di sangue ha chiuso permanentemente una ferita su %1 Head @@ -3657,6 +3729,7 @@ Medidor de Coagulação Coag-Sense Coag-Sense + Coag-Sense The Coag-Sense is a PT/INR monitoring system that can measure the efficiency of your blood clotting @@ -3665,6 +3738,7 @@ O Medidor de Coagulação é um sistema de monitoramento PT/INR que pode mensurar a eficiência da sua coagulação sanguínea De Coag-Sense is een PT-INR monitoringssysteem dat de effectiviteit van jouw wondstolling kan bepalen Le Coag-Sense est un système de surveillance PT/INR qui permet de mesurer l'efficacité de la coagulation sanguine + Il Coag-Sense è un sistema di monitoraggio PT/INR che può misurare l'efficienza della coagulazione del sangue. Coag-Sense concludes: %1 @@ -3673,6 +3747,7 @@ Medidor de Coagulação conlui: %1 Coag-Sense concludeerd: %1 Le Coag-Sense a conclu : %1 + Coag-Sense conclude: %1 Measure PT/INR @@ -3681,14 +3756,16 @@ Medir PT/INR Meet PT-INR Mesurer le PT/INR + Misura PT/INR Taking Blood Sample, - 血液サンプルを取っています、 + 血液サンプルを取得、 Tomar muestra de sangre, Coletando amostra sanguínea, Bloedstaal wordt genomen Prélè¨vement de sang, + Prelievo campione di sangue, Slightly Below Normal INR @@ -3697,6 +3774,7 @@ INR ligeiramente abaixo do normal Lichtelijk onder normaal INR légèrement inférieur à l'INR normal + INR leggermente sotto la norma Sligtly Above normal INR @@ -3705,6 +3783,7 @@ INR ligeiramente acima do normal Lichtelijk boven normaal INR légèrement supérieur à l'INR normal + INR leggermente sopra la norma Very Low INR @@ -3713,6 +3792,7 @@ INR bem abaixo do normal Zeer laag INR INR très bas + INR molto basso Very high INR @@ -3721,6 +3801,7 @@ INR bem acima do normal Zeer hoog INR INR très élevé + INR molto alto Normal INR @@ -3729,6 +3810,7 @@ INR normal Normaal INR INR normal + INR normale Coag-Sense Settings @@ -3737,6 +3819,7 @@ Configuração do Medidor de Coagulação Coag-Sense instellingen Paramètres du Coag-Sense + Impostazioni Coag-Sense Medical level required for Coag-Sense @@ -3745,6 +3828,7 @@ Nível médico necessário para uso do Medidor de Coagulação Vereist medisch niveau voor gebruik Coag-Sense Niveau médical requis du Coag-Sense + Livello medico richiesto per Coag-Sense Locations Coag-Sense @@ -3753,6 +3837,7 @@ Localizações de uso do Medidor de Coagulação Locaties voor gebruik Coag-Sense Emplacements du Coag-Sense + Posizioni Coag-Sense Treatment time for measuring PT/INR @@ -3761,6 +3846,7 @@ Tempo para mensurar PT/INR Onderzoekstijd voor bepalen PT-INR Temps pour mesurer le PT/INR + Tempo di trattamento per misurare PT/INR Allow Stacking @@ -3769,14 +3855,16 @@ Permitir somatória de efeito Sta stapelen toe Autoriser l'empilage + Consenti la sovrapposizione If enabled EACA will be stackable and double its efficiency - 有効にすると、EACAの重複が可能になり、効率が2倍になります。 + 有効にすると、EACAの重複と効率の倍化が可能になります。 Si el EACA esta permitido, se podrá acumular y duplicará su eficiencia Se habilitado, o efeito do EACA será somável e sua eficiência será dobrada Staat het stapelen van EACA toe wanneer ingeschakeld, wat leidt tot een verdubbeling van de effectiviteit Si activé, l'EACA sera empilable et doublera son efficacité + Se abilitato, EACA sarà sovrapponibile e raddoppierà la sua efficienza. Keep Stiching Until Out Of System @@ -3785,6 +3873,7 @@ Sutura contínua enquanto presente no sistema Blijf hechten tot uit systeem Continuer de suturer jusqu'à ce que le produit soit éliminé du système + Continua a suturare fino all'eliminazione dal sistema If enabled EACA will keep stichinng until it's out of your system\nIf disabled EACA will stop working after stiching the last bandaged wound it can find @@ -3793,6 +3882,7 @@ Se habilitado, o EACA continuará suturando até que esteja fora do seu sistema\nSe desabilitado, o funcionamento do EACA será interrompido assim que suturar o último ferimento Als dit ingeschakeld is, EACA blijft hechten tot het uit je systeem is.\nEACA zal stoppen na de laatste hechtbare wond die hij kan vinden wanneer uitgeschakeld Si activé, l'EACA continuera de suturer jusqu'à ce qu'il soit éliminé du système.\nSi désactivé, l'EACA cessera de fonctionner après avoir suturé le dernier bandage qu'il peut trouver. + Se abilitato, EACA continuerà a suturare finché non verrà eliminato dal sistema.\nSe disabilitato, EACA smetterà di funzionare dopo aver suturato l'ultima ferita medicata che può trovare. EACA Cycle Time @@ -3801,6 +3891,7 @@ Tempo de Ciclo do EACA EACA cyclustimer Temps de cycle de l'EACA + Tempo di ciclo EACA The time it takes for EACA to close a stich a wound @@ -3809,6 +3900,7 @@ O intervalo entre suturas do EACA Hoe lang het duurt voor EACA om een wond te hechten Temps requis à l'EACA pour suturer une plaie + Il tempo che impiega EACA per suturare una ferita. IV Epinephrine Settings @@ -3816,6 +3908,7 @@ Ajustes de Epinefrina IV IV Adrenaline Instellingen Paramètres de l'épinéphrine IV + Impostazioni Epinefrina IV Medical level required for IV Epinephrine @@ -3823,6 +3916,7 @@ Nivel médico requerido para Epinefrina IV Vereist medisch niveau voor gebruik van IV Adrenaline Niveau médical requis pour l'épinéphrine IV + Livello medico richiesto per Epinefrina IV Treatment time for IV Epinephrine @@ -3830,6 +3924,7 @@ Tiempo de tratamiento para Epinefrina IV Toedieningstijd voor IV Adrenaline Temps de traitement pour l'épinéphrine IV + Tempo di trattamento per Epinefrina IV IV Epinephrine @@ -3837,6 +3932,7 @@ Epinefrina IV IV Adrenaline Epinéphrine IV + Epinefrina IV IV Epinephrine @@ -3844,6 +3940,7 @@ Epinefrina IV IV Adrenaline Epinéphrine IV + Epinefrina IV Push Epinephrine @@ -3851,6 +3948,7 @@ Administrar Epinefrina Injecteer IV Adrenaline Administrer l'épinéphrine + Somministra Epinefrina diff --git a/addons/stretcher/functions/fnc_attachStretcher.sqf b/addons/stretcher/functions/fnc_attachStretcher.sqf index 3924e372a..3fa8bb147 100644 --- a/addons/stretcher/functions/fnc_attachStretcher.sqf +++ b/addons/stretcher/functions/fnc_attachStretcher.sqf @@ -18,14 +18,14 @@ params [["_target", objNull, [objNull]]]; if !(isNull attachedTo _target) exitWith {}; -private _vehicles = nearestObjects [_target, ["Car", "Helicopter"], 20]; +private _vehicles = nearestObjects [_target, ["Car", "Helicopter", "Tank"], 20]; private _actions = []; { private _type = typeOf _x; private _name = getText (configFile >> "CfgVehicles" >> _type >> "displayName"); private _uniqueName = format ["kat_stretcher_%1", _type]; - if (isArray (configFile >> "CfgVehicles" >> _type >> "stretcherPos")) then { + if (isArray (configFile >> "CfgVehicles" >> _type >> "kat_stretcherPos")) then { _actions pushBack [ [ _uniqueName, @@ -33,8 +33,8 @@ private _actions = []; "", { params ["_target", "", "_parameter"]; - private _pos = getArray (configFile >> "CfgVehicles" >> typeOf (_parameter select 0) >> "stretcherPos"); - private _vector = getArray (configFile >> "CfgVehicles" >> typeOf (_parameter select 0) >> "stretcherVector"); + private _pos = getArray (configFile >> "CfgVehicles" >> typeOf (_parameter select 0) >> "kat_stretcherPos"); + private _vector = getArray (configFile >> "CfgVehicles" >> typeOf (_parameter select 0) >> "kat_stretcherVector"); _target attachTo [(_parameter select 0), _pos]; _target setVectorDirAndUp _vector; }, diff --git a/addons/stretcher/stringtable.xml b/addons/stretcher/stringtable.xml index d7e55e471..1db561773 100644 --- a/addons/stretcher/stringtable.xml +++ b/addons/stretcher/stringtable.xml @@ -97,6 +97,8 @@ Ontplooi brancard Desplegar Camilla 担架を展開する + Dispiegare la barella + Déployer le brancard Retract Stretcher @@ -104,6 +106,8 @@ Trek brancard terug Recoger Camilla 担架を収容する + Ritirare la barella + Rétracter le brancard Detach Stretcher @@ -111,6 +115,8 @@ Maak brancard los Desanclar Camilla 担架を取り外す + Staccare la barella + Détacher le brancard Attachable Helistretcher @@ -190,6 +196,8 @@ Verpak naar een tas Empaquetar en bolsa ランチャーとして畳む + Mettere nella borsa + Emballer dans un sac Pack into backpack @@ -197,6 +205,8 @@ Verpak naar een rugzak Empaquetar en mochila バックパックとして畳む + Mettere nello zaino + Emballer dans un sac à dos Deploy Stretcher @@ -204,6 +214,8 @@ Ontplooi brancard Desplegar Camilla 担架を展開する + Dispiegare la barella + Déployer le brancard Placing Stretcher... @@ -211,6 +223,8 @@ Brancard wordt geplaatst Colocando Camilla... 担架を設置しています・・・ + Posizionamento della barella... + Mise en place du brancard... Packing Stretcher... @@ -218,12 +232,16 @@ Brancard wordt verpakt Empaquetando Camilla... 担架を折り畳んでいます・・・ + Imballaggio della barella... + Le brancard est emballé KAT Helistretcher KAT helibrancard KAT Camilla de Helicóptero KAT ヘリコプター用担架 + KAT Barella per elicotteri + Brancard d'hélicoptère KAT diff --git a/addons/stretcher/vehicle_stretcher.hpp b/addons/stretcher/vehicle_stretcher.hpp index 2434507ad..d99242cab 100644 --- a/addons/stretcher/vehicle_stretcher.hpp +++ b/addons/stretcher/vehicle_stretcher.hpp @@ -1,33 +1,33 @@ class LSV_01_unarmed_base_F; class B_LSV_01_unarmed_F: LSV_01_unarmed_base_F { - stretcherPos[] = {0.08,-1.5,-0.69}; - stretcherVector[] = {{1, 0, 0}, {0, 0, 1}}; + kat_stretcherPos[] = {0.08,-1.5,-0.69}; + kat_stretcherVector[] = {{1, 0, 0}, {0, 0, 1}}; }; class Heli_Transport_01_base_F; class B_Heli_Transport_01_F: Heli_Transport_01_base_F { - stretcherPos[] = {0,1.6,-1.55}; - stretcherVector[] = {{1, 0, 0}, {0, 0, 1}}; + kat_stretcherPos[] = {0,1.6,-1.55}; + kat_stretcherVector[] = {{1, 0, 0}, {0, 0, 1}}; }; class B_Truck_01_transport_F; class B_Truck_01_medical_F: B_Truck_01_transport_F { - stretcherPos[] = {-0.15,-4.7,0}; - stretcherVector[] = {{1, 0, 0}, {0, 0, 1}}; + kat_stretcherPos[] = {-0.15,-4.7,0}; + kat_stretcherVector[] = {{1, 0, 0}, {0, 0, 1}}; }; class B_APC_Wheeled_01_base_F; class B_APC_Wheeled_01_cannon_F: B_APC_Wheeled_01_base_F { - stretcherPos[] = {0.85,1.7,-0.41}; - stretcherVector[] = {{0,0.78,-0.22},{0,0.22,0.78}}; + kat_stretcherPos[] = {0.85,1.7,-0.41}; + kat_stretcherVector[] = {{0,0.78,-0.22},{0,0.22,0.78}}; }; class Heli_Transport_03_base_F; class B_Heli_Transport_03_F: Heli_Transport_03_base_F { - stretcherPos[] = {0,-0.4,-2.08}; - stretcherVector[] = {{0, 0, 0}, {0, 0, 0}}; + kat_stretcherPos[] = {0,-0.4,-2.08}; + kat_stretcherVector[] = {{0, 0, 0}, {0, 0, 0}}; }; class LandVehicle; class Car: LandVehicle {}; class Car_F: Car {}; class Quadbike_01_base_F: Car_F { - stretcherPos[] = {0,0.8,-0.56}; - stretcherVector[] = {{1, 0, 0}, {0, 0, 1}}; + kat_stretcherPos[] = {0,0.8,-0.56}; + kat_stretcherVector[] = {{1, 0, 0}, {0, 0, 1}}; }; diff --git a/addons/surgery/XEH_preInit.sqf b/addons/surgery/XEH_preInit.sqf index 88fb5c537..8055419cf 100644 --- a/addons/surgery/XEH_preInit.sqf +++ b/addons/surgery/XEH_preInit.sqf @@ -62,15 +62,6 @@ PREP_RECOMPILE_END; true ] call CBA_Settings_fnc_init; -[ - QGVAR(etomidateTime), - "SLIDER", - [LLSTRING(ETOMIDATE_TIMER), LLSTRING(ETOMIDATE_TIMER_DESC)], - [CBA_SETTINGS_CAT, LSTRING(SubCategory_SurgicalActions)], - [0,100,45,0], - true -] call CBA_Settings_fnc_init; - [ QGVAR(closedTime), "SLIDER", diff --git a/addons/surgery/functions/fnc_incisionLocal.sqf b/addons/surgery/functions/fnc_incisionLocal.sqf index 9c78beb4c..e92d44dd2 100644 --- a/addons/surgery/functions/fnc_incisionLocal.sqf +++ b/addons/surgery/functions/fnc_incisionLocal.sqf @@ -43,22 +43,27 @@ _patient setVariable [QGVAR(fractures), _fractureArray, true]; private _fractureArray = _patient getVariable [QGVAR(fractures), [0,0,0,0,0,0]]; private _liveFracture = _fractureArray select _part; - private _count = [_patient, "Etomidate"] call ACEFUNC(medical_status,getMedicationCount); + private _count = [_patient, "Etomidate", true] call ACEFUNC(medical_status,getMedicationCount); private _alive = alive _patient; if ((!_alive) || (_liveFracture == 0)) exitWith { [_idPFH] call CBA_fnc_removePerFrameHandler; + _patient setVariable [QGVAR(etomidate_Pain), false] }; - if (((GVAR(Surgery_ConsciousnessRequirement) in [0,1]) && (!(IS_UNCONSCIOUS(_patient)) || _count == 0)) || (GVAR(Surgery_ConsciousnessRequirement) == 3 && _count == 0)) exitWith { - [_patient, "Pain", 10, 40, 200, 0, 40] call ACEFUNC(medical_status,addMedicationAdjustment); + if (((GVAR(Surgery_ConsciousnessRequirement) in [0,1]) && (!(IS_UNCONSCIOUS(_patient)) || _count >= 0.2)) || (GVAR(Surgery_ConsciousnessRequirement) == 3 && _count == 0)) exitWith { + if !(_patient getVariable [QGVAR(etomidate_Pain), false]) then { + [_patient, "Pain", 2, 10, 120, 0.6, 40] call ACEFUNC(medical_status,addMedicationAdjustment); + _patient setVariable [QGVAR(etomidate_Pain), true]}; [_patient, true] call ACEFUNC(medical,setUnconscious); }; - if (GVAR(Surgery_ConsciousnessRequirement) == 2 && _count == 0) then { - [_patient, 0.4] call ACEFUNC(medical_status,adjustPainLevel); - [_patient, "Pain", 10, 40, 30, 0, 40] call ACEFUNC(medical_status,addMedicationAdjustment); + if (GVAR(Surgery_ConsciousnessRequirement) == 2 && _count >= 0.2) then { + if !(_patient getVariable [QGVAR(etomidate_Pain), false]) then { + [_patient, "Pain", 2, 10, 120, 0.6, 40] call ACEFUNC(medical_status,addMedicationAdjustment); + _patient setVariable [QGVAR(etomidate_Pain), true] + }; }; +}, 5, [_patient, _part]] call CBA_fnc_addPerFrameHandler; -}, GVAR(etomidateTime), [_patient, _part]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/surgery/stringtable.xml b/addons/surgery/stringtable.xml index 313d879da..8d4db3ad5 100644 --- a/addons/surgery/stringtable.xml +++ b/addons/surgery/stringtable.xml @@ -528,6 +528,8 @@ Sluit incisie Cerrar Incisión 切開口を閉じる + Chiudere incisione + Fermer l'incision Bone Plate @@ -633,6 +635,7 @@ Échographie portable Ultrassom Portátil Mobiele echograaf + Ecografo portatile Used to assess internal injuries @@ -642,6 +645,7 @@ Utilisé pour contrôlé les blessures internes Utilizado para verificar lesões internas Wordt gebruikt om interne verwondingen te evalueren + Utilizzato per valutare le lesioni interne Conduct Ultrasound Assessment @@ -651,6 +655,7 @@ Effectuer une évaluation échographique Realizar verificação com ultrassom Voer echo evaluatie uit + Esegui valutazione ecografica Assessing @@ -660,6 +665,7 @@ Evaluation Verificando Aan het evalueren + In corso di valutazione Airway Status: %1 @@ -669,6 +675,7 @@ Statut des voies aériennes : %1 Estado das vias aéreas: %1 Luchtwegstatus: %1 + Stato delle vie aeree: %1 Lung Status: %1 @@ -678,6 +685,7 @@ Statut des poumons :%1 Estado do pulmão: %1 Longstatus: %1 + Stato dei polmoni: %1 Cardiac Status: %1 @@ -687,6 +695,7 @@ Statut cardiaque :%1 Estado cardíaco: %1 Cardiale status: %1 + Stato cardiaco: %1 Normal @@ -696,6 +705,7 @@ Normal Normal Normaal + Normale Pneumothorax @@ -705,6 +715,7 @@ Pneumothorax Pneumotórax Pneumothorax + Pneumotorace Hemopneumothorax @@ -714,6 +725,7 @@ Hémopneumothorax Hemotórax Hemopneumothorax + Emopneumotorace Tension Pneumothorax @@ -723,6 +735,7 @@ Pneumothorax sous tension Pneumotórax Hipertensivo Tensiepneumothorax + Pneumotorace Iperteso Arrest - Shockable @@ -732,6 +745,7 @@ Arrêt cardiaque - Choquable Parada - Chocável Hartstilstand - Schokbaar + Arresto - Defibrillabile Arrest - Not Shockable @@ -741,6 +755,7 @@ Arrêt cardiaque - Non choquable Parada - Não Chocável Hartstilstand - Niet schokbaar + Arresto - Non defibrillabile Tamponade @@ -750,6 +765,7 @@ Tamponnade cardiaque Tamponado Harttamponade + Tamponamento REBOA Unit @@ -759,6 +775,7 @@ Unité REBOA Unidade REBOA ROBOA eenheid + Unità REBOA Used to block the aorta and prevent bleeding below the heart @@ -768,6 +785,7 @@ Utilisé pour bloquer l'aorte et empêcher le saignement en dessous du coeur Utilizada para bloquear a aorta e prevenir sangramento abaixo do coração Wordt gebruikt om de aorta te blokkeren, en bloedingen onder het hart te stelpen + Utilizzato per bloccare l'aorta e prevenire il sanguinamento sotto il cuore Place REBOA Unit @@ -777,6 +795,7 @@ Placé l'unité REBOA Colocar Unidade REBOA Plaats REBOA eenheid + Posiziona l'unità REBOA Placing @@ -786,6 +805,7 @@ Placement Colocando Wordt geplaatst + Posizionamento in corso Advance REBOA Unit @@ -795,6 +815,7 @@ Avancer l'unité REBOA Avançar Unidade REBOA Voer REBOA eenheid op + Avanza l'unità REBOA Advancing @@ -804,6 +825,7 @@ Déplacement Avançando Wordt opgevoerd + Avanzamento in corso Remove REBOA Unit @@ -813,6 +835,7 @@ Retirer l'unité REBOA Remover Unidade REBOA Verwijder REBOA eenheid + Rimuovi l'unità REBOA Removing @@ -822,6 +845,7 @@ Retrait Removendo Wordt verwijderd + Rimozione in corso REBOA @@ -831,6 +855,7 @@ REBOA REBOA REBOA + REBOA Pericardial Tap @@ -840,6 +865,7 @@ Péricardiocentèse Pericardiocentese Pericard drainage + Puntura pericardica Performing @@ -849,6 +875,7 @@ Opération Realizando Wordt uitgevoerd + Esecuzione in corso %1 performed a pericardial tap @@ -858,6 +885,7 @@ %1 a effectué une péricardiocentèse %1 realizou uma pericardiocentese %1 heeft een pericard drainage uitgevoerd + %1 ha eseguito una puntura pericardica Kidney damage/failure @@ -1231,6 +1259,7 @@ Benodigde Training om een REBOA toe te dienen Niveau médical requis pour le REBOA Permitir REBOA + Consenti REBOA Locations for REBOA @@ -1238,6 +1267,7 @@ Locaties waar een REBOA toegediend kan worden Emplacements du REBOA Zonas para REBOA + Posizioni per REBOA Time to perform REBOA actions @@ -1245,6 +1275,7 @@ Benodigde tijd om REBOA acties uit te voeren Temps nécessaire pour effectuer les actions du REBOA Tiempo para realizar acciones de REBOA + Tempo per eseguire le azioni REBOA Sets how long it takes to perform REBOA actions (Placing, Advancing, Removing) @@ -1252,6 +1283,7 @@ Bepaald hoe lang het duurt om REBOA acties uit te voeren (Plaatsen, doorvoeren en verwijderen) Défini le temps nécessaire pour effectuer les actions du REBOA (placement, avancée, retrait) Establece cuanto tiempo lleva realizar las acciones de REBOA (Colocar, Avanzar, Quitar) + Imposta quanto tempo ci vuole per eseguire le azioni REBOA (Posizionamento, Avanzamento, Rimozione) Allow Ultrasound @@ -1259,6 +1291,7 @@ Benodigde training voor gebruik mobiele echograaf Niveau médical requis pour effectuer un ultrason Permitir Ultrasonido + Consenti Ecografia Locations for Ultrasound @@ -1266,6 +1299,7 @@ Locaties waar een mobiele echograaf gebruikt kan worden Emplacements de l'ultrason Zonas para Ultrasonido + Posizioni per Ecografia Time to perform Ultrasound actions @@ -1273,6 +1307,7 @@ Benodigde tijd voor het gebruik van een mobiele echograaf Temps nécessaire pour effectuer les actions de l'ultrason Tiempo para realizar acciones de Ultrasonidos + Tempo per eseguire le azioni Ecografia Sets how long it takes to perform an ultrasound exam @@ -1280,6 +1315,7 @@ Bepaald hoe lang het gebruik van een mobiele echograaf duurt Défini le temps nécessaire pour effectuer une examination à l'ultrason Establece cuánto tiempo lleva realizar un examen de Ultrasonidos + Imposta quanto tempo ci vuole per eseguire un esame ecografico Allow Pericardial Tap @@ -1287,6 +1323,7 @@ Benodigde training voor pericardiale drainage Niveau médical requis pour le prélèvement péricardique Permitir realizar Pericardiocentesis + Consenti Puntura Pericardica Locations for Pericardial Tap @@ -1294,6 +1331,7 @@ Locaties waar een pericardiale drainage uitgevoerd kan worden Emplacements du prélèvement péricardique Zonas para Pericardiocentesis + Posizioni per Puntura Pericardica Time to perform Pericardial Tap @@ -1301,6 +1339,7 @@ Benodigde tijd om een pericard drainage uit te voeren Temps nécessaire pour effectuer le prélèvement péricardique Tiempo para realizar Pericardiocentesis + Tempo per eseguire la Puntura Pericardica Sets how long it takes to perform a Pericardial Tap @@ -1308,6 +1347,7 @@ Bepaald hoe lang het uitvoeren van een pericard drainage duurt Défini le temps nécessaire pour effectuer le prélèvement péricardique Establece cuanto tiempo lleva realizar una Pericardiocentesis + Imposta quanto tempo ci vuole per eseguire una Puntura Pericardica Allow Breath Check @@ -1334,6 +1374,7 @@ Autoriser le NPWT Permitir curativo a vácuo Benodigde training voor het gebruik van een vacuümverband + Consenti NPWT Locations NPWT @@ -1344,6 +1385,7 @@ Lieux du NPWT Locais para curativo a vácuo Locaties waar een vacuümverband aangelegd kan worden + Posizioni NPWT Locations Closed Reduction @@ -1562,6 +1604,7 @@ Paramètres du pansement sous vide (NPWT) Configurações do curativo a vácuo Vacuümverband instellingen + Impostazioni del sistema di aspirazione per medicazioni (NPWT) [KAM] Surgery Box @@ -1589,6 +1632,7 @@ Kirurginen tajunta Контроль сознания во время операции Operatie bewustzijninstellingen + Controlli della coscienza durante la chirurgia Surgery Causes Unconsciousness: Surgery without anesthesia and sedation results in unconsciousness from CA. \nUnconsciousness Required for Surgery: Surgery requires patient to be unconscious. \nNo Unconsciousness from Surgery: Surgery doesn't induce unconsciousness, causes pain. \nSurgery Anesthesia: Patient stays awake during surgery if given Etomidate, if not they will go into CA. @@ -1601,6 +1645,7 @@ Leikkaus aiheuttaa tajuttomuuden: leikkaus ilman anestesiaa ja sedaatiota johtaa tajuttomuuteen sydämenpysähdyksestä. \nLeikkaukseen tarvitaan tajuttomuus: leikkaus ei aiheuta tajuttomuutta, aiheuttaa kipua. \nLeikkauksen anestesia: Potilas pysyy hereillä leikkauksen aikana, jos hänelle annetaan etomidaattia, jos ei, hän menettää sydämenpysähdyksen. Операция вызывает потерю сознания: операция без анестезии или седативного средства приводит к потере сознания из-за остановки сердца. \nбессознательное состояние, необходимое для операции: операция требует, чтобы пациент был без сознания. \nнет бессознательного состояния из-за операции: операция не вызывает бессознательного состояния, она вызывает боль. \nхирургическая анестезия: пациент не спит во время операции, если ему вводят этомидат. Operatie veroorzaakt bewustzijnsverlies: Operaties zonder anesthesie en sedatie lijdt tot bewustzijnsverlies door hartstilstand. \n Bewusteloosheid benodigd voor operatie: Operaties vereisen dat de patiënt bewusteloos is. \n Geen bewustzijnsverlies door operaties: Operaties lijden niet tot bewustzijnsverlies, maar veroorzaken pijn. \n Operatie met anesthesie: Patiënt blijft wakker tijdens de operatie als etomidaat gegeven is, anders lijdt de operatie tot een hartstilstand. + Una chirurgia causa incoscienza: Una chirurgia senza anestesia e sedazione porta all'incoscienza a causa di CA. \n Incoscienza richiesta per la chirurgia: Per la chirurgia, è necessario che il paziente sia incosciente. \n Nessuna incoscienza dalla chirurgia: La chirurgia non causa incoscienza, ma dolore. \n Anestesia chirurgica: Il paziente rimane sveglio durante l'intervento se gli viene somministrato Etomidato. Surgery Causes Unconsciousness @@ -1613,6 +1658,7 @@ Leikkaus aiheuttaa tajuttomuuden Хирургическое вмешательство приводит к потере сознания Operatie veroorzaakt bewustijnsverlies + Chirurgia causa incoscienza Unconsciousness Required for Surgery @@ -1625,6 +1671,7 @@ Leikkaukseen tarvitaan tajuttomuus Потеря сознания, необходимая для хирургического вмешательства Bewusteloosheid + Incoscienza richiesta per la chirurgia No Unconsciousness from Surgery @@ -1637,6 +1684,7 @@ Ei tajuttomuutta leikkauksesta После операции никто не теряет сознание Geen Bewustzijnsverlies door operaties + Nessuna incoscienza dalla chirurgia Surgery Anesthesia @@ -1650,6 +1698,7 @@ Leikkauksen anestesia Хирургическая анестезия Operatie met anesthesie + Anestesia chirurgica diff --git a/addons/vitals/XEH_PREP.hpp b/addons/vitals/XEH_PREP.hpp index 9295e7f53..f05f9c7b0 100644 --- a/addons/vitals/XEH_PREP.hpp +++ b/addons/vitals/XEH_PREP.hpp @@ -6,7 +6,8 @@ PREP(handleCardiacFunction); PREP(handleTemperatureFunction); PREP(handleRespawn); PREP(handleOxygenFunction); +PREP(handlePoisoning); PREP(hasStableVitals); PREP(init); PREP(updateOpioidEffect); -PREP(updateOpioidRelief); \ No newline at end of file +PREP(updateOpioidRelief); diff --git a/addons/vitals/functions/fnc_handleOxygenFunction.sqf b/addons/vitals/functions/fnc_handleOxygenFunction.sqf index 417f913b4..05b3ac6f4 100644 --- a/addons/vitals/functions/fnc_handleOxygenFunction.sqf +++ b/addons/vitals/functions/fnc_handleOxygenFunction.sqf @@ -43,8 +43,8 @@ private _previousCyclePao2 = (_bloodGas select 1); if (IN_CRDC_ARRST(_unit)) then { // When in arrest, there should be no effecive breaths but still a minimum O2 demand. Zero O2 demand would mean a dead patient. Actual ventilation is 1 to prevent issues in the gas tension functions _demandVentilation = MINIMUM_VENTILATION; - _respiratoryRate = 0; _respiratoryDepression = 1; + _respiratoryRate = [0, 20] select (_unit getVariable [QEGVAR(breathing,BVMInUse), false]); _actualVentilation = 1; } else { // Ventilatory Demand comes from Heart Rate with increase demand from PaCO2 levels @@ -90,7 +90,9 @@ private _fio2 = switch (true) do { case ((_unit getVariable [QEGVAR(airway,occluded), false]) || (_unit getVariable [QEGVAR(airway,obstruction), false])): { [0, DEFAULT_FIO2] select ((_unit getVariable [QEGVAR(airway,recovery), false]) || (_unit getVariable [QEGVAR(airway,overstretch), false])) }; + case ((_respiratoryRate == 0) && (EGVAR(breathing,SpO2_perfusion))): { 0 }; case ((_unit getVariable [QEGVAR(chemical,airPoisoning), false]) || (_unit getVariable [QEGVAR(breathing,tensionpneumothorax), false]) || (_unit getVariable [QEGVAR(breathing,hemopneumothorax), false])): { 0 }; + case (_unit getVariable [QEGVAR(breathing,oxygenMaskActive), false]): { 0.95 }; case (_unit getVariable [QEGVAR(breathing,oxygenTankConnected), false]): { 1 }; default { DEFAULT_FIO2 }; }; @@ -101,8 +103,9 @@ private _pALVo2 = ((_fio2 * (_baroPressure - 47)) - (_paco2 / _anerobicPressure) // PaO2 cannot be higher than PALVO2 and comes from ventilation shortage multipled by RBC volume private _pao2 = (DEFAULT_PAO2 - ((DEFAULT_ECB / ((GET_BODY_FLUID(_unit) select 0) max 500)) * ((_demandVentilation - _actualVentilation) / 120))) min _pALVo2; +private _arrestPerfusion = [1, (1 * EGVAR(breathing,SpO2_PerfusionMultiplier))] select ((IN_CRDC_ARRST(_unit)) && (EGVAR(breathing,SpO2_perfusion))); // PaO2 moves in controlled steps to prevent hard movements when Ventilation Demand spikes -_pao2 = if (_previousCyclePao2 != _pao2) then { ([ (_previousCyclePao2 - ((PAO2_MAX_CHANGE * EGVAR(breathing,SpO2_MultiplyNegative)) * _deltaT)) , (_previousCyclePao2 + ((PAO2_MAX_CHANGE * EGVAR(breathing,SpO2_MultiplyPositive)) * _deltaT))] select ((_previousCyclePao2 - _pao2) < 0)) } else { _pao2 }; +_pao2 = if (_previousCyclePao2 != _pao2) then { ([ (_previousCyclePao2 - ((PAO2_MAX_CHANGE * EGVAR(breathing,SpO2_MultiplyNegative) * _arrestPerfusion) * _deltaT)) , (_previousCyclePao2 + ((PAO2_MAX_CHANGE * EGVAR(breathing,SpO2_MultiplyPositive)) * _deltaT))] select ((_previousCyclePao2 - _pao2) < 0)) } else { _pao2 }; // Oxy-Hemo Dissociation Curve, driven by PaO2 with shaping done by pH private _o2Sat = ((_pao2 max 1)^2.7 / ((25 - (((_pH / DEFAULT_PH) - 1) * 150))^2.7 + _pao2^2.7)) min 0.999; diff --git a/addons/vitals/functions/fnc_handlePoisoning.sqf b/addons/vitals/functions/fnc_handlePoisoning.sqf new file mode 100644 index 000000000..868722913 --- /dev/null +++ b/addons/vitals/functions/fnc_handlePoisoning.sqf @@ -0,0 +1,66 @@ +#include "..\script_component.hpp" +/* + * Author: MiszczuZPolski + * Update poisoning + + * Arguments: + * 0: The Unit + * 1: Poison Adjustments + * 2: Time since last update + * 3: Sync value? + * + * ReturnValue: + * None + * + * Example: + * [player, 1, 1, false] call kat_vitals_handlePoisoning; + * + * Public: No + */ + +params ["_unit", "_poisonAdjustment", "_deltaT", "_syncValue"]; + +private _currentCS = _unit getVariable [QEGVAR(chemical,CSGas), 0]; + +_unit setVariable [QEGVAR(chemical,CSGas), (_currentCS - (_poisonAdjustment * _deltaT)) max 0, _syncValue]; + +private _inZone = false; +private _distance = 0; + +{ + _y params ["_gasLogic", "_radius", "_gasLevel", "_condition", "_conditionArgs", "_isSealable"]; + TRACE_2("gasVitalsPFH loop",_x,_y); + + _distance = _unit distance _gasLogic; + + if (_distance < _radius) then { + _inZone = true; + }; +} forEach GVAR(gasSources); + +if !(_inZone) then { + _unit setVariable [QGVAR(areaIntensity), 0, true]; +}; + +private _infectionArray = _unit getVariable [QEGVAR(chemical,infectionArray), []]; + +if (count _infectionArray == 0) then { + private _currentInfection = _unit getVariable [QEGVAR(chemical,infectionTime), missionNamespace getVariable [QEGVAR(chemical,infectionTime), 60]]; + private _updateTime = _currentInfection + (1 * _deltaT); + _updateTime = _updateTime min (missionNamespace getVariable [QEGVAR(chemical,infectionTime), 60]); + + _unit setVariable [QEGVAR(chemical,infectionTime), _updateTime, true]; +} else { + { + _x params ["_gasLogic", "_radius", "_gasLevel", "_condition", "_conditionArgs", "_isSealable"]; + + // Get the distance of the unit from the center of the sphere (_gasLogic) + private _distance = _unit distance _gasLogic; + + if (_distance > _radius) then { + _infectionArray deleteAt _forEachIndex; + }; + } forEach _infectionArray; + + _unit setVariable [QEGVAR(chemical,infectionArray), _infectionArray, true]; +}; diff --git a/addons/vitals/functions/fnc_handleSimpleVitals.sqf b/addons/vitals/functions/fnc_handleSimpleVitals.sqf index ca3c9d8c4..4645f4ff4 100644 --- a/addons/vitals/functions/fnc_handleSimpleVitals.sqf +++ b/addons/vitals/functions/fnc_handleSimpleVitals.sqf @@ -71,6 +71,7 @@ if !(_adjustments isEqualTo []) then { private _heartRate = [_unit, _hrTargetAdjustment, _deltaT, _syncValues] call ACEFUNC(medical_vitals,updateHeartRate); //Rename [_unit, _painSupressAdjustment, _deltaT, _syncValues] call ACEFUNC(medical_vitals,updatePainSuppress); //Leave alone +[_unit, POISON_DECREASE, _deltaT, _syncValues] call FUNC(handlePoisoning); private _bloodPressure = [80,120]; _unit setVariable [VAR_BLOOD_PRESS, _bloodPressure, _syncValues]; diff --git a/addons/vitals/functions/fnc_handleUnitVitals.sqf b/addons/vitals/functions/fnc_handleUnitVitals.sqf index fe3295591..133a24314 100644 --- a/addons/vitals/functions/fnc_handleUnitVitals.sqf +++ b/addons/vitals/functions/fnc_handleUnitVitals.sqf @@ -122,6 +122,7 @@ if !(_adjustments isEqualTo []) then { [_unit, _peripheralResistanceAdjustment, _deltaT, _syncValues] call ACEFUNC(medical_vitals,updatePeripheralResistance); [_unit, _opioidAdjustment, _deltaT, _syncValues] call FUNC(updateOpioidRelief); [_unit, _opioidEffectAdjustment, _deltaT, _syncValues] call FUNC(updateOpioidEffect); +[_unit, POISON_DECREASE, _deltaT, _syncValues] call FUNC(handlePoisoning); private _heartRate = [_unit, _hrTargetAdjustment, 0, _bloodVolume, _deltaT, _syncValues] call FUNC(handleCardiacFunction); diff --git a/addons/vitals/script_component.hpp b/addons/vitals/script_component.hpp index 2fbccf669..162080431 100644 --- a/addons/vitals/script_component.hpp +++ b/addons/vitals/script_component.hpp @@ -15,3 +15,5 @@ #endif #include "\x\kat\addons\main\script_macros.hpp" + +#define POISON_DECREASE 1 diff --git a/addons/vitals/stringtable.xml b/addons/vitals/stringtable.xml index b224466c5..edee7e1ce 100644 --- a/addons/vitals/stringtable.xml +++ b/addons/vitals/stringtable.xml @@ -6,14 +6,20 @@ Activeer AI/KI versimpeld medisch Activar Médico Simple para IA AI用単純化医療を有効化 + Attiva AI Simple Medical + Simplifier la médecine pour l'IA. Apply simplified vital calculations to the AI unit. Which can be useful for saving FPS. 単純化されたバイタル計算をAIユニットに適用します。 これは負荷の軽減に役立つ可能性があります。 + Applica calcoli vitali semplificati all'unità AI. Che può essere utile per salvare FPS. + Appliquer des calculs vitaux simplifiés à l'unité AI. Ce qui peut être utile pour économiser des FPS. Enable Patient Fluid Shift 患者の体液移動を有効化 + Abilita lo spostamento del fluido del paziente + Permettre le transfert de fluide du patient diff --git a/addons/watch/CfgSounds.hpp b/addons/watch/CfgSounds.hpp new file mode 100644 index 000000000..7c40585af --- /dev/null +++ b/addons/watch/CfgSounds.hpp @@ -0,0 +1,24 @@ +class CfgSounds { + class GVAR(watchAlarm) { + name = QGVAR(watchAlarm); + sound[] = + { + QPATHTOF(audio\watchAlarm.ogg), + 5, + 1, + 10 + }; + titles[] = {}; + }; + class GVAR(watchVibrate) { + name = QGVAR(watchVibrate); + sound[] = + { + QPATHTOF(audio\watchVibrate.ogg), + 5, + 1, + 10 + }; + titles[] = {}; + }; +}; diff --git a/addons/watch/CfgWeapons.hpp b/addons/watch/CfgWeapons.hpp index 88d16c14b..bd888acde 100644 --- a/addons/watch/CfgWeapons.hpp +++ b/addons/watch/CfgWeapons.hpp @@ -21,4 +21,11 @@ class CfgWeapons { displayName = CSTRING(STSDisplayName); picture = QPATHTOF(UI\watch_sts.paa); }; + class KAT_Ranger: ItemWatch { + ACE_hideItemType = "Watch"; + author = "Mazinski"; + descriptionShort = CSTRING(RangerDescription); + displayName = CSTRING(RangerDisplayName); + picture = QPATHTOF(UI\RangerWatchFace.paa); + }; }; diff --git a/addons/watch/RscTitles.hpp b/addons/watch/RscTitles.hpp index 45979fbf9..7a31f4fc5 100644 --- a/addons/watch/RscTitles.hpp +++ b/addons/watch/RscTitles.hpp @@ -418,4 +418,141 @@ class RscTitles }; }; }; + class KAT_Ranger + { + idd = 22935; + enableSimulation = 1; + movingEnable = 0; + fadeIn=0; + fadeOut=1; + duration = 10e10; + onLoad = "uiNamespace setVariable ['KAT_Ranger', _this select 0];"; + class controls + { + class RangerImage: RscPicture + { + idc = 22800; + text = "\x\kat\addons\watch\UI\RangerWatchFace.paa"; + x = QUOTE(SAFEZONE_X_RIGHTEDGE - FRAME_W(25) - FRAME_W(15.07)); + y = QUOTE(SAFEZONE_Y_LOWEDGE - FRAME_H(20)); + w = QUOTE(FRAME_W(28)); + h = QUOTE(FRAME_H(28)); + }; + class RangerTime: RscText + { + idc = 22806; + style = ST_RIGHT; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "22:22:22"; //--- ToDo: Localize; + x = QUOTE(SAFEZONE_X_RIGHTEDGE - FRAME_W(25) - FRAME_W(4.7)); + y = QUOTE(SAFEZONE_Y_LOWEDGE - FRAME_H(5.9)); + w = QUOTE(FRAME_W(7.5)); + h = QUOTE(FRAME_H(4)); + colorBackground[] = {0,0,0,0}; + colorText[] = {0.8,0.8,0.8,0.9}; + sizeEx = QUOTE(FRAME_H(1.9)); + }; + class RangerTimer: RscText + { + idc = 22807; + style = ST_RIGHT; + valign = "middle"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = ""; //--- ToDo: Localize; + x = QUOTE(SAFEZONE_X_RIGHTEDGE - FRAME_W(24.6)); + y = QUOTE(SAFEZONE_Y_LOWEDGE - FRAME_H(7.5)); + w = QUOTE(FRAME_W(3)); + h = QUOTE(FRAME_H(1.5)); + colorBackground[] = {0,0,0,0}; + colorText[] = {0.8,0.8,0.8,0.9}; + sizeEx = QUOTE(FRAME_H(1.8)); + }; + class RangerAltitude: RscText + { + idc = 22808; + style = ST_RIGHT; + valign = "middle"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "1000"; + x = QUOTE(SAFEZONE_X_RIGHTEDGE - FRAME_W(25) - FRAME_W(5.5)); + y = QUOTE(SAFEZONE_Y_LOWEDGE - FRAME_H(7.5)); + w = QUOTE(FRAME_W(4)); + h = QUOTE(FRAME_H(1.5)); + colorBackground[] = {0,0,0,0}; + colorText[] = {0.8,0.8,0.8,0.9}; + sizeEx = QUOTE(FRAME_H(1.8)); + }; + class RangerHR: RscText + { + idc = 22809; + style = ST_CENTER; + valign = "middle"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "111"; + x = QUOTE(SAFEZONE_X_RIGHTEDGE - FRAME_W(25) - FRAME_W(4.3)); + y = QUOTE(SAFEZONE_Y_LOWEDGE - FRAME_H(10.1)); + w = QUOTE(FRAME_W(4)); + h = QUOTE(FRAME_H(1.5)); + colorBackground[] = {0,0,0,0}; + colorText[] = {0.8,0.8,0.8,0.9}; + sizeEx = QUOTE(FRAME_H(1.4)); + }; + class RangerO2: RscText + { + idc = 22810; + style = ST_CENTER; + valign = "middle"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "97"; + x = QUOTE(SAFEZONE_X_RIGHTEDGE - FRAME_W(25) - FRAME_W(1.2)); + y = QUOTE(SAFEZONE_Y_LOWEDGE - FRAME_H(10.1)); + w = QUOTE(FRAME_W(3)); + h = QUOTE(FRAME_H(1.5)); + colorBackground[] = {0,0,0,0}; + colorText[] = {0.8,0.8,0.8,0.9}; + sizeEx = QUOTE(FRAME_H(1.4)); + }; + class RangerWatchMinute: RscPicture + { + idc = 22802; + text = "\x\kat\addons\watch\UI\RangerWatchMinute.paa"; + x = QUOTE(SAFEZONE_X_RIGHTEDGE - FRAME_W(25) - FRAME_W(15)); + y = QUOTE(SAFEZONE_Y_LOWEDGE - FRAME_H(20)); + w = QUOTE(FRAME_W(28)); + h = QUOTE(FRAME_H(28)); + }; + class RangerWatchHour: RangerWatchMinute + { + idc = 22803; + text = "\x\kat\addons\watch\UI\RangerWatchHour.paa"; + x = QUOTE(SAFEZONE_X_RIGHTEDGE - FRAME_W(25) - FRAME_W(15)); + y = QUOTE(SAFEZONE_Y_LOWEDGE - FRAME_H(20)); + w = QUOTE(FRAME_W(28)); + h = QUOTE(FRAME_H(28)); + }; + class RangerWatchSecond: RangerWatchMinute + { + idc = 22804; + text = "\x\kat\addons\watch\UI\RangerWatchSecond.paa"; + x = QUOTE(SAFEZONE_X_RIGHTEDGE - FRAME_W(25) - FRAME_W(15)); + y = QUOTE(SAFEZONE_Y_LOWEDGE - FRAME_H(20)); + w = QUOTE(FRAME_W(28)); + h = QUOTE(FRAME_H(28)); + }; + class RangerWatchCaps: RangerImage + { + idc = 22805; + text = "\x\kat\addons\watch\UI\RangerWatchCaps.paa"; + x = QUOTE(SAFEZONE_X_RIGHTEDGE - FRAME_W(25) - FRAME_W(15.07)); + y = QUOTE(SAFEZONE_Y_LOWEDGE - FRAME_H(20)); + w = QUOTE(FRAME_W(28)); + h = QUOTE(FRAME_H(28)); + }; + }; + }; }; \ No newline at end of file diff --git a/addons/watch/UI/RangerWatchCaps.paa b/addons/watch/UI/RangerWatchCaps.paa new file mode 100644 index 000000000..d196807f4 Binary files /dev/null and b/addons/watch/UI/RangerWatchCaps.paa differ diff --git a/addons/watch/UI/RangerWatchCompass.paa b/addons/watch/UI/RangerWatchCompass.paa new file mode 100644 index 000000000..a5a1e1107 Binary files /dev/null and b/addons/watch/UI/RangerWatchCompass.paa differ diff --git a/addons/watch/UI/RangerWatchDarkSheet.paa b/addons/watch/UI/RangerWatchDarkSheet.paa new file mode 100644 index 000000000..19cfa283a Binary files /dev/null and b/addons/watch/UI/RangerWatchDarkSheet.paa differ diff --git a/addons/watch/UI/RangerWatchFace.paa b/addons/watch/UI/RangerWatchFace.paa new file mode 100644 index 000000000..312964228 Binary files /dev/null and b/addons/watch/UI/RangerWatchFace.paa differ diff --git a/addons/watch/UI/RangerWatchHour.paa b/addons/watch/UI/RangerWatchHour.paa new file mode 100644 index 000000000..6450892e6 Binary files /dev/null and b/addons/watch/UI/RangerWatchHour.paa differ diff --git a/addons/watch/UI/RangerWatchMinute.paa b/addons/watch/UI/RangerWatchMinute.paa new file mode 100644 index 000000000..32f46f970 Binary files /dev/null and b/addons/watch/UI/RangerWatchMinute.paa differ diff --git a/addons/watch/UI/RangerWatchNVGSheet.paa b/addons/watch/UI/RangerWatchNVGSheet.paa new file mode 100644 index 000000000..e6950afd8 Binary files /dev/null and b/addons/watch/UI/RangerWatchNVGSheet.paa differ diff --git a/addons/watch/UI/RangerWatchSecond.paa b/addons/watch/UI/RangerWatchSecond.paa new file mode 100644 index 000000000..de9b08c63 Binary files /dev/null and b/addons/watch/UI/RangerWatchSecond.paa differ diff --git a/addons/watch/XEH_PREP.hpp b/addons/watch/XEH_PREP.hpp index 7335c72c5..eeb625ae7 100644 --- a/addons/watch/XEH_PREP.hpp +++ b/addons/watch/XEH_PREP.hpp @@ -1,6 +1,11 @@ +PREP(handleRespawn); PREP(hideKWatch); PREP(hideCWatch); PREP(hideSWatch); +PREP(hideRWatch); +PREP(init); PREP(showKWatch); PREP(showCWatch); -PREP(showSWatch); \ No newline at end of file +PREP(showSWatch); +PREP(showRWatch); +PREP(startWatchTimer); \ No newline at end of file diff --git a/addons/watch/XEH_postInit.sqf b/addons/watch/XEH_postInit.sqf index e065b019c..2d8de495e 100644 --- a/addons/watch/XEH_postInit.sqf +++ b/addons/watch/XEH_postInit.sqf @@ -2,41 +2,104 @@ if (!hasInterface) exitWith {}; -["KAT Watch", QGVAR(showKatmin), "Show Katmin", { +[QGVAR(startWatchTimer), LINKFUNC(startWatchTimer)] call CBA_fnc_addEventHandler; +[QEGVAR(misc,handleRespawn), LINKFUNC(handleRespawn)] call CBA_fnc_addEventHandler; + +[QGVAR(playWatchTone), { + params ["_unit", "_tone"]; + _unit say3D [_tone, 5]; +}] call CBA_fnc_addEventHandler; + +["KAT Watch", QGVAR(showKatmin), CSTRING(ShowKATWatch_Setting), { // Conditions: canInteract - if (!([ACE_player, objNull, ["isNotEscorting", "isNotInside"]] call ACEFUNC(common,canInteractWith)) || {!('KAT_Katmin' in assignedItems ACE_player)}) exitWith { false }; + if (!([ACE_player, objNull, ["isNotEscorting", "isNotInside"]] call ACEFUNC(common,canInteractWith))) exitWith { false }; + + private _return = false; + + switch true do{ + case (('KAT_Katmin' in assignedItems ACE_player)): { + _return = true; + + if !(GETMVAR(GVAR(KatminActive),false)) then { + [ACE_player] call FUNC(showKWatch); + } else { + call FUNC(hideKWatch); + }; + }; + case (('KAT_Cavmin' in assignedItems ACE_player)): { + _return = true; + + if !(GETMVAR(GVAR(CavminActive),false)) then { + [ACE_player] call FUNC(showCWatch); + } else { + call FUNC(hideCWatch); + }; + }; + case (('KAT_STS' in assignedItems ACE_player)): { + _return = true; - if !(GETMVAR(GVAR(KatminActive),false)) then { - [ACE_player] call FUNC(showKWatch); - } else { - call FUNC(hideKWatch); + if !(GETMVAR(GVAR(STSActive),false)) then { + [ACE_player] call FUNC(showSWatch); + } else { + call FUNC(hideSWatch); + }; + }; + case (('KAT_Ranger' in assignedItems ACE_player)): { + _return = true; + + if !(GETMVAR(GVAR(RangerActive),false)) then { + [ACE_player] call FUNC(showRWatch); + } else { + call FUNC(hideRWatch); + }; + }; }; - true + _return }, { false }, [24, [false, false, false]], false] call CBA_fnc_addKeybind; -["KAT Cav Watch", QGVAR(showCavmin), "Show Cavmin", { - // Conditions: canInteract - if (!([ACE_player, objNull, ["isNotEscorting", "isNotInside"]] call ACEFUNC(common,canInteractWith)) || {!('KAT_Cavmin' in assignedItems ACE_player)}) exitWith { false }; +["KAT Watch", QGVAR(increaseTimer), CSTRING(AddTimer_Setting), { + if (!([ACE_player, objNull, ["isNotEscorting", "isNotInside"]] call ACEFUNC(common,canInteractWith)) || {!('KAT_Ranger' in assignedItems ACE_player)}) exitWith { false }; + + if !(GETMVAR(GVAR(RangerActive),false)) exitWith { false }; + + private _timerLength = ACE_player getVariable [QGVAR(rangerTimer), 0]; - if !(GETMVAR(GVAR(CavminActive),false)) then { - [ACE_player] call FUNC(showCWatch); - } else { - call FUNC(hideCWatch); + if (_timerLength < 999) then { + ACE_player setVariable [QGVAR(rangerTimer), ((_timerLength + 15) min 999), false]; }; true -}, { false }, [24, [false, false, false]], false] call CBA_fnc_addKeybind; +}, { false }, [38, [false, false, true]], false] call CBA_fnc_addKeybind; -["KAT STS Watch", QGVAR(showSTS), "Show STS", { - // Conditions: canInteract - if (!([ACE_player, objNull, ["isNotEscorting", "isNotInside"]] call ACEFUNC(common,canInteractWith)) || {!('KAT_STS' in assignedItems ACE_player)}) exitWith { false }; +["KAT Watch", QGVAR(decreaseTimer), CSTRING(SubtractTimer_Setting), { + if (!([ACE_player, objNull, ["isNotEscorting", "isNotInside"]] call ACEFUNC(common,canInteractWith)) || {!('KAT_Ranger' in assignedItems ACE_player)}) exitWith { false }; + + if !(GETMVAR(GVAR(RangerActive),false)) exitWith { false }; - if !(GETMVAR(GVAR(STSActive),false)) then { - [ACE_player] call FUNC(showSWatch); - } else { - call FUNC(hideSWatch); + private _timerLength = ACE_player getVariable [QGVAR(rangerTimer), 0]; + + if (_timerLength > 0) then { + ACE_player setVariable [QGVAR(rangerTimer), ((_timerLength - 15) max 0), false]; }; true -}, { false }, [24, [false, false, false]], false] call CBA_fnc_addKeybind; +}, { false }, [36, [false, false, true]], false] call CBA_fnc_addKeybind; + +["KAT Watch", QGVAR(startTimer), CSTRING(StartStopTimer_Setting), { + if (!([ACE_player, objNull, ["isNotEscorting", "isNotInside"]] call ACEFUNC(common,canInteractWith)) || {!('KAT_Ranger' in assignedItems ACE_player)}) exitWith { false }; + + private _timerLength = ACE_player getVariable [QGVAR(rangerTimer), 0]; + private _timerActive = ACE_player getVariable [QGVAR(rangerStart), false]; + + if (_timerLength > 0) then { + if (_timerActive) then { + ACE_player setVariable [QGVAR(rangerStart), false, false]; + } else { + ACE_player setVariable [QGVAR(rangerStart), true, false]; + [QGVAR(startWatchTimer), [ACE_player], ACE_player] call CBA_fnc_targetEvent; + }; + }; + + true +}, { false }, [37, [false, false, true]], false] call CBA_fnc_addKeybind; \ No newline at end of file diff --git a/addons/watch/audio/watchAlarm.ogg b/addons/watch/audio/watchAlarm.ogg new file mode 100644 index 000000000..84ce0fc1d Binary files /dev/null and b/addons/watch/audio/watchAlarm.ogg differ diff --git a/addons/watch/audio/watchAlarm.xmp b/addons/watch/audio/watchAlarm.xmp new file mode 100644 index 000000000..f63c73244 --- /dev/null +++ b/addons/watch/audio/watchAlarm.xmp @@ -0,0 +1,83 @@ + + + + + + + + CuePoint Markers + Cue + f44100 + + + CD Track Markers + Track + f44100 + + + Subclip Markers + InOut + f44100 + + + + 2024-12-15T22:21:16-08:00 + 2024-12-15T22:21:16-08:00 + xmp.iid:30e9deb5-bfc0-2b4d-abc4-d09b0f084d7f + xmp.did:30e9deb5-bfc0-2b4d-abc4-d09b0f084d7f + xmp.did:2c460e27-80bc-444a-9ec5-e861f49bb36a + + + + saved + xmp.iid:2c460e27-80bc-444a-9ec5-e861f49bb36a + 2024-12-15T22:21:16-08:00 + Adobe Audition 25.0 (Windows) + /metadata + + + saved + xmp.iid:30e9deb5-bfc0-2b4d-abc4-d09b0f084d7f + 2024-12-15T22:21:16-08:00 + Adobe Audition 25.0 (Windows) + / + + + + + xmp.iid:2c460e27-80bc-444a-9ec5-e861f49bb36a + xmp.did:2c460e27-80bc-444a-9ec5-e861f49bb36a + xmp.did:2c460e27-80bc-444a-9ec5-e861f49bb36a + + audio/ogg; codec="vorbis" + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/addons/watch/audio/watchVibrate.ogg b/addons/watch/audio/watchVibrate.ogg new file mode 100644 index 000000000..c85f5d063 Binary files /dev/null and b/addons/watch/audio/watchVibrate.ogg differ diff --git a/addons/watch/audio/watchVibrate.xmp b/addons/watch/audio/watchVibrate.xmp new file mode 100644 index 000000000..4d1d46b92 --- /dev/null +++ b/addons/watch/audio/watchVibrate.xmp @@ -0,0 +1,83 @@ + + + + + + + + CuePoint Markers + Cue + f44100 + + + CD Track Markers + Track + f44100 + + + Subclip Markers + InOut + f44100 + + + + 2024-12-15T22:22:22-08:00 + 2024-12-15T22:22:22-08:00 + xmp.iid:80a61fff-aa5c-fe4d-bbdc-0664eb47dd8c + xmp.did:80a61fff-aa5c-fe4d-bbdc-0664eb47dd8c + xmp.did:c29c979e-f990-0849-a1e0-1012ebd43b5d + + + + saved + xmp.iid:c29c979e-f990-0849-a1e0-1012ebd43b5d + 2024-12-15T22:22:22-08:00 + Adobe Audition 25.0 (Windows) + /metadata + + + saved + xmp.iid:80a61fff-aa5c-fe4d-bbdc-0664eb47dd8c + 2024-12-15T22:22:22-08:00 + Adobe Audition 25.0 (Windows) + / + + + + + xmp.iid:c29c979e-f990-0849-a1e0-1012ebd43b5d + xmp.did:c29c979e-f990-0849-a1e0-1012ebd43b5d + xmp.did:c29c979e-f990-0849-a1e0-1012ebd43b5d + + audio/ogg; codec="vorbis" + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/addons/watch/config.cpp b/addons/watch/config.cpp index 8d171b1e6..b8cdf2b4e 100644 --- a/addons/watch/config.cpp +++ b/addons/watch/config.cpp @@ -8,7 +8,8 @@ class CfgPatches { weapons[] = { "KAT_Katmin", "KAT_Cavmin", - "KAT_STS" + "KAT_STS", + "KAT_Ranger" }; magazines[] = { }; requiredAddons[] = { @@ -36,4 +37,5 @@ class CfgPatches { #include "CfgEventHandlers.hpp" #include "CfgWeapons.hpp" +#include "CfgSounds.hpp" #include "RscTitles.hpp" \ No newline at end of file diff --git a/addons/watch/functions/fnc_handleRespawn.sqf b/addons/watch/functions/fnc_handleRespawn.sqf new file mode 100644 index 000000000..eb6257b23 --- /dev/null +++ b/addons/watch/functions/fnc_handleRespawn.sqf @@ -0,0 +1,24 @@ +#include "..\script_component.hpp" +/* + * Author: YetheSamartaka + * Edited: Mazinski + * Ensures proper initial values reset on respawn + * + * Arguments: + * 0: Unit + * 1: Corpse + * + * Return Value: + * None + * + * Example: + * [alive, body] call kat_watch_fnc_handleRespawn; + * + * Public: No + */ + +params ["_unit","_dead"]; +TRACE_2("handleRespawn",_unit,_dead); + +_unit setVariable [QGVAR(rangerStart), false, true]; +_unit setVariable [QGVAR(rangerTimer), 0, true]; \ No newline at end of file diff --git a/addons/watch/functions/fnc_hideRWatch.sqf b/addons/watch/functions/fnc_hideRWatch.sqf new file mode 100644 index 000000000..aedc2a813 --- /dev/null +++ b/addons/watch/functions/fnc_hideRWatch.sqf @@ -0,0 +1,19 @@ +#include "..\script_component.hpp" +/* + * Author: Garth 'L-H' de Wet + * Modified: Mazinski + * Removes the KWatch from the screen. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * call kat_watch_fnc_hideKWatch + * + * Public: No + */ +GVAR(RangerActive) = false; +"KAT_Ranger" cutText ["","PLAIN",0,true]; \ No newline at end of file diff --git a/addons/watch/functions/fnc_init.sqf b/addons/watch/functions/fnc_init.sqf new file mode 100644 index 000000000..ea9a81735 --- /dev/null +++ b/addons/watch/functions/fnc_init.sqf @@ -0,0 +1,23 @@ +#include "..\script_component.hpp" +/* + * Author: Katalam + * Initializes unit variables. + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * [player] call kat_watch_fnc_init; + * + * Public: No + */ + +params ["_unit", ["_isRespawn", true]]; + +if (!local _unit) exitWith {}; + +_unit setVariable [QGVAR(rangerStart), false, true]; +_unit setVariable [QGVAR(rangerTimer), 0, true]; \ No newline at end of file diff --git a/addons/watch/functions/fnc_showRWatch.sqf b/addons/watch/functions/fnc_showRWatch.sqf new file mode 100644 index 000000000..cb74c897f --- /dev/null +++ b/addons/watch/functions/fnc_showRWatch.sqf @@ -0,0 +1,97 @@ +#include "..\script_component.hpp" +/* + * Author: Garth 'L-H' de Wet + * Modified: Mazinski + * Displays the KWatch on screen. + * + * Arguments: + * 0: unit + * + * Return Value: + * None + * + * Example: + * [player] call kat_watch_fnc_showKWatch + * + * Public: Yes + */ + +params ["_unit"]; + +"KAT_Ranger" cutRsc ["KAT_Ranger", "PLAIN", 0, true]; + +if (isNull (uiNamespace getVariable ["KAT_Ranger", displayNull])) exitWith {}; + +GVAR(RangerActive) = true; + +private _display = uiNamespace getVariable ["KAT_Ranger", displayNull]; +private _background = _display displayCtrl 22800; +private _minute = _display displayCtrl 22802; +private _hour = _display displayCtrl 22803; +private _second = _display displayCtrl 22804; +private _time = _display displayCtrl 22806; +private _timer = _display displayCtrl 22807; +private _altitude = _display displayCtrl 22808; +private _hr = _display displayCtrl 22809; +private _o2 = _display displayCtrl 22810; + +[{ + _this params ["_args", "_pfhID"]; + _args params ["_unit", "_hour", "_minute", "_second", "_time", "_timer", "_altitude", "_hr", "_o2"]; + + if !(GVAR(RangerActive)) exitWith { + [QGVAR(closeWatchTimer), [_unit], _unit] call CBA_fnc_targetEvent; + _pfhID call CBA_fnc_removePerFrameHandler; + }; + + if !(alive _unit) exitWith { + call FUNC(hideRWatch); + _pfhID call CBA_fnc_removePerFrameHandler; + }; + + if !("KAT_Ranger" in assignedItems _unit) exitWith { + call FUNC(hideRWatch); + _pfhID call CBA_fnc_removePerFrameHandler; + }; + + private _altitudeValue = round((getPosASL _unit) select 2); + + if (GVAR(altitudeUnit) == 1) then { + _altitude ctrlSetText ([(_altitudeValue * 3.281), 1, 0] call CBA_fnc_formatNumber); + } else { + _altitude ctrlSetText ([_altitudeValue, 1, 0] call CBA_fnc_formatNumber); + }; + + _hr ctrlSetText ([GET_HEART_RATE(_unit), 1, 0] call CBA_fnc_formatNumber); + _o2 ctrlSetText ([GET_KAT_SPO2(_unit), 1, 0] call CBA_fnc_formatNumber); + + private _hours = floor dayTime; + private _minutes = floor ((dayTime - _hours) * 60); + private _seconds = floor ((((dayTime - _hours) * 60) - _minutes) * 60); + + _time ctrlSetText (format ["%1:%2:%3", [_hours, 2] call CBA_fnc_formatNumber, [_minutes, 2] call CBA_fnc_formatNumber, [_seconds, 2] call CBA_fnc_formatNumber]); + + _hours = dayTime; + + if (_hours > 12) then { + _hours = _hours - 12; + }; + + _hour ctrlSetAngle [(linearConversion [0, 12, _hours, 0, 360]), 0.5, 0.5, true]; + _minute ctrlSetAngle [(linearConversion [0, 60, _minutes, 0, 360]), 0.5, 0.5, true]; + _second ctrlSetAngle [(linearConversion [0, 60, _seconds, 0, 360]), 0.5, 0.5, true]; + + private _timeValue = _unit getVariable [QGVAR(rangerTimer), 0]; + + _timer ctrlSetText ([_timeValue, 2, 0] call CBA_fnc_formatNumber); +}, 1, [ + _unit, + _hour, + _minute, + _second, + _time, + _timer, + _altitude, + _hr, + _o2 +]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/watch/functions/fnc_startWatchTimer.sqf b/addons/watch/functions/fnc_startWatchTimer.sqf new file mode 100644 index 000000000..e8dc43a67 --- /dev/null +++ b/addons/watch/functions/fnc_startWatchTimer.sqf @@ -0,0 +1,49 @@ +#include "..\script_component.hpp" +/* + * Author: Katalam + * Initializes unit variables. + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * [player] call kat_watch_fnc_init; + * + * Public: No + */ + +params ["_unit"]; + +[{ + _this params ["_args", "_pfhID"]; + _args params ["_unit"]; + + if !(alive _unit) exitWith { + _pfhID call CBA_fnc_removePerFrameHandler; + }; + + if !("KAT_Ranger" in assignedItems _unit) exitWith { + _unit setVariable [QGVAR(rangerTimer), 0, false]; + _pfhID call CBA_fnc_removePerFrameHandler; + }; + + private _timeValue = _unit getVariable [QGVAR(rangerTimer), 0]; + private _active = _unit getVariable [QGVAR(rangerStart), false]; + + if (_active) then { + _timeValue = (_timeValue - 1) max 0; + _unit setVariable [QGVAR(rangerTimer), _timeValue, false]; + + if (_timeValue == 0) then { + _unit setVariable [QGVAR(rangerStart), false, false]; + [QGVAR(playWatchTone), [_unit, QGVAR(watchAlarm)], _unit] call CBA_fnc_targetEvent; + + _pfhID call CBA_fnc_removePerFrameHandler; + }; + } else { + _pfhID call CBA_fnc_removePerFrameHandler; + }; +}, 1, [_unit]] call CBA_fnc_addPerFrameHandler; \ No newline at end of file diff --git a/addons/watch/stringtable.xml b/addons/watch/stringtable.xml index 74745a4f4..523c5b983 100644 --- a/addons/watch/stringtable.xml +++ b/addons/watch/stringtable.xml @@ -6,108 +6,166 @@ Selecteer temperatuur vorm Seleccionar temperatura de 温度単位を選択 + Seleziona formato temperatura + Sélectionner l'unité de température Selects which temperature unit is used for the KATMIN watch display Selecteert welke temperatuur eenheid gebruikt wordt voor de KATMIN horloge Seleccionar qué unidad de temperatura es usada para la pantalla del reloj KATMIN Katmin腕時計で表示される温度の単位を選択します + Seleziona quale unità di temperatura viene utilizzata per il display del KATMIN + Sélectionne l'unité de température utilisée pour l'affichage de la montre KATMIN Celcius Celcius Celsius 摂氏 (C) + Celcius + Celcius Fahrenheit Fahrenheit Fahrenheit 華氏 (F) + Fahrenheit + Fahrenheit Select pressure form Selecteer drukvorm Seleccionar presión de 圧力単位を選択 + Seleziona formato pressione + Sélectionner la forme de pression Selects which pressure unit is used for the KATMIN watch display Selecteerd welke drukeenheden gebruikt worden voor de KATMIN horloge Selecciona qué unidad de presión es usada para la pantalla del reloj KATMIN Katmin腕時計で表示される圧力の単位を選択します + Seleziona quale unità di pressione viene utilizzata per il display del KATMIN + Sélectionne l'unité de pression utilisée pour l'affichage de la montre KATMIN mmHg mmHg mmHg mmHg + mmHg + mmHg hPa hPa hPa hPa + hPa + hPa Select altitude form Selecteer hoogte vorm Seleccionar altitud de 高度単位を選択 + Seleziona formato altitudine + Sélectionner l'unité d'altitude Selects which altitude unit is used for the KATMIN watch display Selecteerd welk hoogte eenheid gebruikt wordt voor de KATMIN horloge Selecciona qué unidad de altitud es usada para la pantalla del reloj KATMIN Katmin腕時計で表示される高度の単位を選択します + Seleziona quale unità di altitudine viene utilizzata per il display del KATMIN + Sélectionne l'unité d'altitude utilisée pour la montre KATMIN Meters Meters Metros メートル + Metri + Mètres Feet Voet Pies フィート + Piedi + Pieds Watch with Vital Monitoring Capabilities Horloge met ingebouwde vitale waarden monitor Reloj con Capacidad de Monitorización de Constantes Vitales カーミン K500。 バイタル監視機能を持った腕時計 + Orologio con capacità di monitoraggio vitale + Montre avec moniteur de signes vitaux intégré Katmin K500 Katmin k500 Katmin K500 Katmin K500 + Katmin K500 + Katmin K500 Watch with Vital Monitoring Capabilities. Garry Owen! カーミン キャバルリー・リミテッド。 バイタル監視機能を持った腕時計。 ギャリー・オーウェン!(Garry Owen!) + Orologio con capacità di monitoraggio vitale. Garry Owen! + Montre avec fonctions de surveillance vitale. Garry Owen ! Katmin Cavalry Limited Katmin Cavalry Limited + Katmin Cavalry Limited + Katmin Cavalry Limited Watch with Vital Monitoring Capabilities. So Others May Live. カーミン ジャンプ・スタンダード。 バイタル監視機能を持った腕時計。 他人の命の為に。(So Others May Live) + Orologio con capacità di monitoraggio vitale. Perché altri possano vivere. + Montre avec fonctions de surveillance vitale. Pour que d'autres puissent vivre. Katmin Jump Standard Katmin Jump Standard + Katmin Jump Standard + Katmin Jump Standard + + + Watch with Vital Monitoring Capabilities. Sua Sponte. + + + Katmin K12 Model R + + + Show KATMIN Watch + + + Add 15 Seconds to Watch Timer + + + Subtract 15 Seconds from Watch Timer + + + Start and Stop Watch Timer %1ft/s %1ft/s + %1ft/s + %1ft/s %1m/s %1m/s + %1m/s + %1m/s diff --git a/addons/zeus/CfgVehicles.hpp b/addons/zeus/CfgVehicles.hpp index 30fb14e5b..a6806a334 100644 --- a/addons/zeus/CfgVehicles.hpp +++ b/addons/zeus/CfgVehicles.hpp @@ -34,13 +34,6 @@ class CfgVehicles { icon = QACEPATHTOF(medical_gui,data\categories\advanced_treatment.paa); }; - class GVAR(checkmedical_module): GVAR(baseModule) { - curatorCanAttach = 1; - displayName = CSTRING(checkmedical_Module_displayname); - function = QFUNC(openMedicalMenu); - icon = QACEPATHTOF(medical_gui,data\categories\triage_card.paa); - }; - class GVAR(toggleAIDeath_module): GVAR(baseModule) { author = "Blue"; curatorCanAttach = 1; diff --git a/addons/zeus/XEH_PREP.hpp b/addons/zeus/XEH_PREP.hpp index 5ea337ef2..7184676f9 100644 --- a/addons/zeus/XEH_PREP.hpp +++ b/addons/zeus/XEH_PREP.hpp @@ -1,5 +1,4 @@ PREP(emptyFunction); -PREP(openMedicalMenu); PREP(showMessage); PREP(toggleAIDeathModule); PREP(ui_changeBloodType); diff --git a/addons/zeus/config.cpp b/addons/zeus/config.cpp index 5d49258db..ee24a8099 100644 --- a/addons/zeus/config.cpp +++ b/addons/zeus/config.cpp @@ -8,7 +8,6 @@ class CfgPatches { QGVAR(manageAirway_module), QGVAR(bloodType_module), QGVAR(cardiacState_module), - QGVAR(checkmedical_module), QGVAR(toggleAIDeath_module) }; weapons[] = {}; diff --git a/addons/zeus/functions/fnc_openMedicalMenu.sqf b/addons/zeus/functions/fnc_openMedicalMenu.sqf deleted file mode 100644 index 9aa005c37..000000000 --- a/addons/zeus/functions/fnc_openMedicalMenu.sqf +++ /dev/null @@ -1,36 +0,0 @@ -#include "..\script_component.hpp" -/* - * Author: DiGi - * Initalizes the "Open Unit medical menu" Zeus module. - * - * Arguments: - * 0: GVAR(checkmedical_module) zeus module - * - * Return Value: - * None - * - * Example: - * [logic] call kat_zeus_fnc_openMedicalMenu - * - * Public: No - */ - -params ["_logic"]; - -if !(local _logic) exitWith {}; - -private _mouseOver = GETMVAR(bis_fnc_curatorObjectPlaced_mouseOver,[""]); - -if ((_mouseOver select 0) != "OBJECT") then { - [ACELSTRING(zeus,NothingSelected)] call FUNC(showMessage); -} else { - private _unit = effectiveCommander (_mouseOver select 1); - - if !(_unit isKindOf "CAManBase") then { - [ACELSTRING(zeus,OnlyInfantry)] call FUNC(showMessage); - } else { - [_unit] call ACEFUNC(medical_gui,openMenu); - }; -}; - -deleteVehicle _logic; diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml index 79a9a49c0..4e066ded3 100644 --- a/addons/zeus/stringtable.xml +++ b/addons/zeus/stringtable.xml @@ -65,6 +65,7 @@ Détérioration du pneumothorax : Deterioração do pneumotórax Verslechterende pneumothorax: + Il pneumotorace peggiora: Hemopneumothorax: @@ -204,24 +205,7 @@ Muuta sydämen tilaa Изменить состояние сердца Verander cardiale staat - - - Open unit medical menu - Medic Menü der Einheit öffnen - Otevřít zdravotnickou nabídku jednotky - Ouvrir menu médical - Otwórz menu medyczne - Abrir el menú médico de la unidad - 打开单位医疗菜单 - 유닛 의료 메뉴 열기 - Ünite tıbbi menüsünü aç - 医療メニューを開く - Медицинское меню открытого блока - Apri il menu medico - 打开单位医疗菜单 - Abra o menu médico da unidade - Avaa laitteen lääketieteellinen valikko - Open eenheids medisch menu + Cambia stato cardiaco State: @@ -253,6 +237,7 @@ Ventrikulaarinen takykardia: Желудочковая тахикардия Ventriculaire tachycardie + Tachicardia ventricolare Ventricular Fibrillation @@ -266,6 +251,7 @@ Kammiovärinä: Фибрилляция желудочков Ventriculaire fibrillatie + Fibrillazione ventricolare Pulseless Electrical Activity @@ -279,6 +265,7 @@ Pulssiton sähköinen toiminta: Безимпульсная электрическая активность Polsloze electrische activiteit (PEA) + Attività elettrica senza polso Asystole @@ -310,6 +297,7 @@ Yksikön on oltava AI Юнит должен быть ИИ Eenheid moet een KI / AI zijn + L'unità deve essere un'IA %1%3 (was %2%3) @@ -341,6 +329,7 @@ Valitse välitön AI-kuolema Переключить мгновенную смерть ИИ Schakel onmiddelijke KI / AI dood om + Attiva/disattiva la morte istantanea dell'IA Instant AI Death %1 for unit @@ -354,6 +343,7 @@ Välitön AI-kuolema %1 yksikölle Мгновенная смерть ИИ %1 для юнита Onmiddelijke dood voor KI / AI %1 voor eenheid + Morte istantanea dell'IA %1 per l'unità diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 000000000..3a0c117c6 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,3 @@ +.obsidian +/\!templates +/\!hidden diff --git a/docs/Cardiac/Cardiac-Arrest.md b/docs/Cardiac/Cardiac-Arrest.md new file mode 100644 index 000000000..cc379a7cf --- /dev/null +++ b/docs/Cardiac/Cardiac-Arrest.md @@ -0,0 +1,34 @@ +# Cardiac Arrest + +Cardiac arrest occurs when someone reaches one of the below critical values in either their HR or their BP. This will cause the player to fall unconscious, stopping their breathing and heart rate. + +**Critical Values:** +- < 20 or > 220 BPM +- > 285 / 190 mmHg +- < 50 / 40 mmHg (If HR is < 40 BPM) +- Between 20 - 30 BPM (random chance) + +## Heart Rhythms + +![four-rhythms](https://private-user-images.githubusercontent.com/15182031/253309068-b8e88392-2b1e-4a9d-a454-45f1a09c9940.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTY1OTQ4ODcsIm5iZiI6MTcxNjU5NDU4NywicGF0aCI6Ii8xNTE4MjAzMS8yNTMzMDkwNjgtYjhlODgzOTItMmIxZS00YTlkLWE0NTQtNDVmMWEwOWM5OTQwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA1MjQlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNTI0VDIzNDk0N1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTIxZGY2YzUwNmU5ZGFhOGYyMjQ1MmMwMjYyZjE5MDYwMWU4MDZiOWNlMzYwYWYyOTVhMmMyMDVkOTc4MTQ5NjgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.-loI59Zwjzs0SgPPD1QNU-ty9aKQ5cvu3KNZpvYKNNg) +*Graph showing the five different heart rhythms and how the game switches between them* + +There are five types of heart rhythms, four of which cause cardiac arrest. They typically fall into two categories: [Shockable Rhythms](/Cardiac/Shockable-Rhythms.md) & [Non-Shockable Rhythms](/Cardiac/Non-Shockable-Rhythms.md). + +### Diagnosing Heart Rhythm + +The most important step to maximize the probability of patient recovery is properly diagnosing the type of cardiac arrest in order to begin the proper course of treatment. The best way to do that is to use the EKG feature on the [AED-X](/Equipment/AED-X.md). Once you do that, you will see one of the below EKG values: + +| Description | Value | +| ------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [Ventricular Tachycardia (VT)](/Cardiac/Shockable-Rhythms.md#ventricular-tachycardia) | ![vTac](https://lh7-us.googleusercontent.com/Q8XcJzafKjUx1Xii46O3gNAiVlYcQcPXiG4L9FIzjUNyTD7KlM87XlDWGEHhRHmcvdxNjwDTpF9smKbt0V--8tv6E_hsgy16UkqUpfnEtTcv7VQfxtz4O-Y5M-WmBmu7UN4x1i2SR8tk_VoAT4jvVfc) | +| [Ventricular Fibrillation (VF)](/Cardiac/Shockable-Rhythms.md#ventricular-fibrillation) | ![vFib](https://lh7-us.googleusercontent.com/X2VSjZjR-3utt8pGzhumf3XJ-lLb0EShSjcMYiUV6asDBM2pMVNN868N_Xd3ryfXsZY54eh83f9sv9BuSVv14LlYRqSS6z-vrSQaFwiaUI-Th4PJgqSQVoClCpx5oTPUrMN1e3WCaA2skfFbJeybL8U) | +| [Pulseless Electrical Activity (PEA)](/Cardiac/Non-Shockable-Rhythms.md#pulseless-electrical-activity) | ![pea](https://lh7-us.googleusercontent.com/aQcmPZ5sLqjiZElM-a9_VbQavun5chOkCAHu0sVTMOT2kH0gbkis-Ivh6NEH1vKUB3BFAHkbju_R4lJyaI9peDP5E5PjAbNxmeaXQ9b02ZzwFWpMvy4TGcKa00g2pJtn9Ur6NJxt8cpE63HzzIRTDzo) | +| [Asystole](/Cardiac/Non-Shockable-Rhythms.md#asystole) | ![asystole](https://lh7-us.googleusercontent.com/LnB3GRgUu3x15snlClUudRRHaNf-gSfED1UFvY8TssQPWaUgTHhImLYItigdm_abnyPdbDQMuJDGl928O_BS48RD23tCtHdya9yQLshdYkjqU3ox9z14-x5FyRSk8h4d6M8rZ1wMHJvT3QqtjRZ_oYM) | +| CPR | ![cpr](https://lh7-us.googleusercontent.com/JQh-n7mVpPP2MogpcwXowrKtA0fdqPofUt4JPoaeLIZMH4AN-amWkGjiA1Wj8wd8AzxMMeX9H8iTxWKwjrWW4Gm5tR5VPvBg53zLT1ASwimN3M12PeILYNeamJ8hvIgzPpbe1UKrzfik5s-CgVcA8K0) | +| AED pads not connected | ![aed-error](https://lh7-us.googleusercontent.com/LxdkmO9nirIp8xo3LxBYdxrNCHG4HjO7LzPI5veoEM7sI_6LIrpSLegUJ074rhgoeIQTrDiebR6QFi86DYaxfQwuBOLz7tYbIODkqNNY1mqr6MAbR0vMv49UCzX4xam72e48C2dvvw815XvOqi8gGTE) | +>[!NOTE] +>PEA has the same EKG readout as a normal sinus rhythm. + +If you don't have an AED-X, you can also use the "Analyze Rhythm" feature on the [AED](/Equipment/AED). That will tell you if it is a shockable or non-shockable rhythm. + diff --git a/docs/Cardiac/Non-Shockable-Rhythms.md b/docs/Cardiac/Non-Shockable-Rhythms.md new file mode 100644 index 000000000..e6b859329 --- /dev/null +++ b/docs/Cardiac/Non-Shockable-Rhythms.md @@ -0,0 +1,23 @@ +>[!WARNING] +>Hey! This page is under construction! Come back later! + +# Non-Shockable Rhythms + +A non-shockable sinus rhythms is when the cause of cardiac arrest isn't related to the electrical activity of the heart, but as a result of another cause (in KAM, it is typically blood loss). This is the most dangerous type of cardiac arrest as the treatment is potentially more time-consuming, meaning there is a greater chance of patient death. The biggest difference between non-shockable rhythms and [shockable rhythms](/Cardiac/Shockable-Rhythms.md) is that the treatment for non-shockable rhythms is the same for both types. + +## Pulseless Electrical Activity + +Pulseless Electrical Activity (PEA) is defined as the absence of a pulse in a patient with an otherwise normal cardiac rhythm. This means that an EKG will show them as having a pulse, but there will be no actual heartrate. + +## Asystole + +Asystole is defined as the total or near total absence of electrical activity within the heart. This is the worst possible form of cardiac arrest. You can diagnose an asystole rhythm by seeing a flat or nearly flat line on an EKG reading. + +## Treating Non-Shockable Rhythms + +>[!NOTE] +> These instructions only cover treating the cardiac arrest, they assume you have stopped any major bleeding, have secured the airways, and have an IV and are administering fluid. They also assume you have attached either the AED or AED-X and have confirmed which type of cardiac arrest you are dealing with. + +1. Administer CPR for 45 seconds +2. Check for pulse & analyze rhythm + - \ No newline at end of file diff --git a/docs/Cardiac/Shockable-Rhythms.md b/docs/Cardiac/Shockable-Rhythms.md new file mode 100644 index 000000000..2eb3196db --- /dev/null +++ b/docs/Cardiac/Shockable-Rhythms.md @@ -0,0 +1,52 @@ +# Shockable Rhythms + +Shockable Rhythms are rhythms that can be treated using the defrbilation features on the [AED](/Equipment/AED-X.md) or [AED-X](/Equipment/AED-X.md). You can diagnose a shockable rhythmn through either the "Analyze Rhythm" feature on the AED, or by using the EKG feature on the AED-X. Within the mod, there are two types of shockable rhythms. + +## Ventricular Tachycardia + +Ventricular Tachycardia (VT or V-Tac) is caused when the heart beats too fast to effectively pump blood. This can deteriorate rapidly into either VF or [PEA](/Cardiac/Non-Shockable-Rhythms.md#pulseless-electrical-activity) if left untreated, depending on settings. You can diagnose it by a rapid and uneven pattern on an EKG. + +![vTac](https://lh7-us.googleusercontent.com/Q8XcJzafKjUx1Xii46O3gNAiVlYcQcPXiG4L9FIzjUNyTD7KlM87XlDWGEHhRHmcvdxNjwDTpF9smKbt0V--8tv6E_hsgy16UkqUpfnEtTcv7VQfxtz4O-Y5M-WmBmu7UN4x1i2SR8tk_VoAT4jvVfc) + +## Ventricular Fibrillation + +Ventricular Fibrillation (VF or V-Fib) is caused when the heart starts to beat erractically due to chaotic electrical activity. It will eventually progress to PEA if left untreated. You can diagnose it by its chaotic pattern on an EKG. + +![vFib](https://lh7-us.googleusercontent.com/X2VSjZjR-3utt8pGzhumf3XJ-lLb0EShSjcMYiUV6asDBM2pMVNN868N_Xd3ryfXsZY54eh83f9sv9BuSVv14LlYRqSS6z-vrSQaFwiaUI-Th4PJgqSQVoClCpx5oTPUrMN1e3WCaA2skfFbJeybL8U) + +## Treating Shockable Rhythms + +The way to treat a shockable rhythm depends on the type of cardiac arrest. It's why equipment like the AED-X is so important, as the EKG feature allows you to rapidly diagnose the type of cardiac arrest and administer the proper treatment. If you only have an AED, treat all shockable rhythms as V-Tac. + +>[!NOTE] +> These instructions only cover treating the cardiac arrest, they assume you have stopped any major bleeding, have secured the airways, and have an IV and are administering fluid. They also assume you have attached either the AED or AED-X and have confirmed which type of cardiac arrest you are dealing with. + +### Treating V-Tac + +1. Administer a shock using either the AED or AED-X +1. Analyze rhythm & check for pulse + - "Shock Advised": Continue to next step + - "No Shock Advised" & No pulse: Begin treatment for [non shockable rhythms](/Cardiac/Non-Shockable-Rhythms.md#treating-non-shockable-rhythms) + - "No Shock Advised" & Pulse: Cease treatment for Cardiac Arrest + - If using an AED-X, instead check the EKG to make sure it is still V-Tac +1. Inject [epinephrine](/Pharmacy/IM-Medication.md#epinephrine) and administer another shock +1. Analyze rhythm & check for pulse +1. Inject [amiodarone](/Pharmacy/IV-Medication.md#amiodarone) and administer another shock +1. Analyze rhythm & check for pulse +1. Inject [lidocaine](/Pharmacy/IV-Medication.md#lidocaine) and administer another shock +1. Analyze rhythm & check for pulse +1. If still in V-Tac, administer epinephrine every 2 minutes and continue shocking until change in status or ROSC + +### Treating V-Fib + +1. Administer a shock using either the AED or AED-X +2. Analyze rhythm & check for pulse + - "Shock Advised": Continue to next step + - "No Shock Advised" & No pulse: Begin treatment for [non shockable rhythms](/Cardiac/Non-Shockable-Rhythms.md#treating-non-shockable-rhythms) + - "No Shock Advised" & Pulse: Cease treatment for Cardiac Arrest + - If using an AED-X, instead check the EKG to make sure it is still V-Fib +3. Inject [epinephrine](/Pharmacy/IM-Medication.md#epinephrine) and administer another shock +4. Analyze rhythm & check for pulse +5. Inject [amiodarone](/Pharmacy/IV-Medication.md#amiodarone) and administer another shock +6. Analyze rhythm & check for pulse +7. If still in V-Fib, administer epinephrine every 2 minutes and continue shocking until change in status or ROSC. \ No newline at end of file diff --git a/docs/Equipment/16g IV.md b/docs/Equipment/16g IV.md new file mode 100644 index 000000000..7352529f5 --- /dev/null +++ b/docs/Equipment/16g IV.md @@ -0,0 +1,22 @@ +# 16g IV + ![16g-iv](https://user-images.githubusercontent.com/55753928/174278114-26827cd1-6502-4e86-8c39-cb89cd78e02a.png) +Item Name: `kat_IV_16` +Mass: 0.5 +Item Description: "Intravenous Needle" + +--- + +## Description + +An IV needle used to push fluids and IV medications into a patient. Can only be used on limbs that don't have tourniquets or severe damage. If there are no usable limbs, then you will have to use a [FAST IO](/Equipment/FAST%20IO.md). + +## How to use + +Any Limb > Advanced Treatment > "Establish 16g IV" + +--- + +## References +- [IV Fluids](/Hemorrhaging/IV-Fluids.md) +- [IV Medication](/Pharmacy/IV-Medication.md) +- [FAST IO](/Equipment/FAST%20IO.md) \ No newline at end of file diff --git a/docs/Equipment/AED-X.md b/docs/Equipment/AED-X.md new file mode 100644 index 000000000..9cb353b00 --- /dev/null +++ b/docs/Equipment/AED-X.md @@ -0,0 +1,29 @@ +>[!WARNING] +>Hey! This page is under construction! Come back later! +# AED-X + +![AED-X](https://user-images.githubusercontent.com/55753928/170477256-dfc9a3ee-751a-4267-91ed-742110abc430.png) +Item Name: `kat_X_AED` +Mass: 40 +Item Description: "Used to monitor vitals and resuscitate patients" + +--- + +## Description + +A better version of the AED. It can be used to monitor HR, SpO2, and BP. It will also play an auditory beeping sound (which is togglable through ace interaction) that tells HR. + +## How to Use + +### Attaching to patient + +Lorem Ipsum + +### Administering Shock + +Lorem Ipsum + +--- + +## References +- \ No newline at end of file diff --git a/docs/Equipment/AED.md b/docs/Equipment/AED.md new file mode 100644 index 000000000..cf4292143 --- /dev/null +++ b/docs/Equipment/AED.md @@ -0,0 +1,29 @@ +>[!WARNING] +>Hey! This page is under construction! Come back later! + +# AED + +![AED](https://user-images.githubusercontent.com/55753928/170477092-a766bd72-b5c2-495c-856c-586cec030cad.png) +Item Name: `kat_AED` +Mass: 30 +Item Description: "Used to resuscitate patients" + +--- + +## Description + +The AED is used to treat shockable cardiac arrests. In certain situations, it is much more effective to treat cardiac arrest that CPR, especially when combined with drugs such as adenosine and lidocaine. +## How to Use + +- Ensure nobody touches the patient (no CPR/ BVM is performed) +- Click on chest +- Attach AED pads in the Advanced Treatment section +- Analyze rhythm in the Examine Patient section: + - “Shock Advised”: The AED will charge automatically and give a sound notification when ready. It is then possible to perform a shock (Using Epinephrine/Amiodarone/Lidocaine beforehand is advised. One medication per shock). The AED will disarm itself after some time automatically if no shock is administered. + - “No Shock Advised”:  perform CPR, administer epinephrine (not essential) and check pulse every 2 minutes +- Analyze rhythm after the shock/2 minutes of CPR + +--- + +## References +- [Cardiac Arrest](/Cardiac/Cardiac-Arrest.md) \ No newline at end of file diff --git a/docs/Equipment/Accuvac.md b/docs/Equipment/Accuvac.md new file mode 100644 index 000000000..29861ac00 --- /dev/null +++ b/docs/Equipment/Accuvac.md @@ -0,0 +1,23 @@ +# Accuvac + +![accuvac](https://user-images.githubusercontent.com/55753928/170451476-a9a10597-f29d-410a-872a-6b2139ec4e52.PNG) +Item Name: `kat_accuvac` +Mass: 7 +Item Description: "ACCUVAC is a medical suction device for airway suction with battery drive for mobile use in emergency medicine." + +--- + +## Description + +Multi-use item that clears patient airway occlusions. When used, it will clear occlusions with a 100% chance. + +## How to Use + +The patient must be unconscious in order to use this. + +Head > Airway Management > "Use Accuvac" + +--- + +## References +- \ No newline at end of file diff --git a/docs/Equipment/Chest Seal.md b/docs/Equipment/Chest Seal.md new file mode 100644 index 000000000..c9dbff2a1 --- /dev/null +++ b/docs/Equipment/Chest Seal.md @@ -0,0 +1,23 @@ +>[!WARNING] +>Hey! This page is under construction! Come back later! + +# Chest Seal + +Item Name: `kat_chestseal` +Mass: 0.2 +Item Description: "Chest Seal is engineered to treat, seal, and reseal open chest wounds under most circumstances." + +--- + +## Description + +One-time use item used to treat pneumothorax, tension pneumothorax, and hemopneumothorax in patients + +## How to Use + +Torso > Airway Management > "Use Chest Seal" + +--- + +## References +- \ No newline at end of file diff --git a/docs/Equipment/FAST IO.md b/docs/Equipment/FAST IO.md new file mode 100644 index 000000000..08801dac2 --- /dev/null +++ b/docs/Equipment/FAST IO.md @@ -0,0 +1,22 @@ +# FAST IO + +![fast-io](https://user-images.githubusercontent.com/55753928/174277769-c716c8a6-4cca-4956-85a2-134a8ca30622.png) +Item Name: `kat_IO_FAST` +Mass: 0.5 +Item Description: "Intraosseous Needle" + +--- + +## Description + +Intraosseous needle. Able to be used on the torso in any condition, but causes severe pain upon use. + +## How to Use + +Torso > Advanced Treatment > "Establish FAST IO" + +--- + +## References +- [IV Fluids](/Hemorrhaging/IV-Fluids.md) +- [IV Medication](/Pharmacy/IV-Medication.md) \ No newline at end of file diff --git a/docs/Equipment/Guedel Tube.md b/docs/Equipment/Guedel Tube.md new file mode 100644 index 000000000..3467080fd --- /dev/null +++ b/docs/Equipment/Guedel Tube.md @@ -0,0 +1,23 @@ +# Guedel Tube + +![guedel-tube](https://user-images.githubusercontent.com/55753928/170451341-d5e5a7b9-4ff1-450f-89d2-e3d2c3dcf668.png) +Item Name: `kat_guedel` +Mass: 0.5 +Item Description: "The Guedel Tube is used to maintain the airway" + +--- + +## Description + +A thin tube used to support a patient's airways. It clears airway obstructions but not occlusions. It is one time use, and will automatically be removed if the patient wakes up. + +## How to Use + +The patient must be unconscious and their airway must not have any occlusion. + +Head > Airway Management > "Use Guedel Tube" + +--- + +## References +- \ No newline at end of file diff --git a/docs/Equipment/King LT.md b/docs/Equipment/King LT.md new file mode 100644 index 000000000..9a8f4a460 --- /dev/null +++ b/docs/Equipment/King LT.md @@ -0,0 +1,23 @@ +# King LT + +![kingLT](https://user-images.githubusercontent.com/55753928/170451433-369bb626-ba0d-40bf-b768-72139f4201e9.PNG) +Item Name: `kat_larynx` +Mass: 0.5 +Item Description: "The King LT is used to maintain the airway" + +--- + +## Description + +A one-time use item that clears airway obstructions and prevents occlusions. + +## How to Use + +In order to be used, the patient must be unconscious and their airway can't be occluded. + +Head > Airway Management > "Use King LT" + +--- + +## References +- \ No newline at end of file diff --git a/docs/Hemorrhaging/Blood-Loss.md b/docs/Hemorrhaging/Blood-Loss.md new file mode 100644 index 000000000..e8c704352 --- /dev/null +++ b/docs/Hemorrhaging/Blood-Loss.md @@ -0,0 +1,19 @@ +# Blood Loss + +All wounds bleed. The rate at which a particular wound bleeds is dependent on the players heartrate and perfusion rate. Characters start with 6 liters of blood in their body. As it decreases, you can see different status effects. + +| Blood Level (L) | Status Effect | +| --------------- | ---------------------------- | +| 5.9 - 5.1 | Lost Some Blood | +| 5.1 - 4.2 | Lost a Lot of Blood | +| 4.2 - 3.6 | Lost a Large Amount of Blood | +| 3.6 - 3.0 | Lost a Fatal Amount of Blood | + +>[!NOTE] +>By default, if the player has less than 3L of blood in their body, they will die. + +If a player loses a fatal amount of blood, they will go into [Cardiac Arrest](/Cardiac/Cardiac-Arrest.md). + +## Coagulation + +In KAM, wounds can close on their own if coagulation is enabled. Every 8 seconds, KAM checks the players HR and # of wounds. If a player has a HR of 20 or more at least one wound, and at least one clotting factor, a random wound will receive the "Unstable Clot" bandage and use up one clotting factor. A player starts with 10 clotting factors, though that number can be increased by administering certain [IV Fluids](/Hemorrhaging/IV-Fluids.md). You can fortify clots from "Unstable Clot" to "Packing Bandage" using [TXA](/Pharmacy/IV-Medication.md#txa). \ No newline at end of file diff --git a/docs/Hemorrhaging/IV-Fluids.md b/docs/Hemorrhaging/IV-Fluids.md new file mode 100644 index 000000000..a29ab66b9 --- /dev/null +++ b/docs/Hemorrhaging/IV-Fluids.md @@ -0,0 +1,227 @@ +# IV Fluids + +## IV/IO + +In order to administer IV fluids, you need to first establish an Intravenous (IV) or Intraosseous (IO) needle (if it is enabled in settings). KAM comes with two needle types: + +- **[16g IV](/Equipment/16g%20IV.md)**: Only works on limbs with minor damage and no tourniquets +- **[FAST IO](/Equipment/FAST%20IO.md)**: Only works on the torso, but causes pain + +### IV Obstruction + +If you push [TXA](/Pharmacy/IV-Medication.md#txa) or [EACA](/Pharmacy/IV-Medication.md#eaca), there is a chance that the IV/IO line can become obstructed. If you notice that drugs aren't kicking in or fluid isn't flowing, perform the "Inspect Catheter" action to check for obstructions. If there is one, you will need to flush the line with saline by using the "Saline Flush". This requires that you have at least 30 ml of Saline attached to the IV/IO. + +## Fluid Types + +There are three types of fluids: Saline, Blood, & Plasma. While all fluids increase the amount of blood you have in your body, each affects [coagulation](/Hemorrhaging/Blood-Loss.md#coagulation) & your [kidney pH](/Nephrology/Kidney-Function.md#kidney-ph) in different ways. + +>[!NOTE] +>All fluids in this mod don't expire (yet...) + + ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Volume (ml)pH ChangeCoagulation Factor
Saline1000-750
0
500-3500
250-1500
Plasma1000+50015
500+25010
250+1005
Blood1000+80012
500+4008
250+2004
+ +>[!HINT] +>Want to save some fluids? Removing an IV with fluid still attached will put the remaining fluid in your inventory. + + +### Blood Type + +When administering blood, make sure you administer the proper type. If you administer an incompatible blood type, the patient will suffer from a decreased HR. This can only be treated by [painkillers](/Pharmacy/Oral-Medication.md#pain-killers). + +#### Blood Type Chart + +Compatible blood types are marked with an "x" + + ++++++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Donor
RecipientO-O+B-B+A-A+AB-AB+
AB+xxxxxxxx
AB-xxxx
A+xxxx
A-xx
B+xxxx
B-xx
O+xx
O-x
+ +### Transfusing Blood + +>[!WARNING] +>This section is still under construction! Come back later! + diff --git a/docs/Nephrology/Kidney-Function.md b/docs/Nephrology/Kidney-Function.md new file mode 100644 index 000000000..b58121630 --- /dev/null +++ b/docs/Nephrology/Kidney-Function.md @@ -0,0 +1,10 @@ +>[!WARNING] +>This page is still under construction! Come back later! + +# Kidney Function + +Lorem Ipsum + +## Kidney pH + +Lorem Ipsum diff --git a/docs/Pharmacy/IM-Medication.md b/docs/Pharmacy/IM-Medication.md new file mode 100644 index 000000000..b0c449dee --- /dev/null +++ b/docs/Pharmacy/IM-Medication.md @@ -0,0 +1,10 @@ +>[!WARNING] +>Hey! This page is under construction! Come back later! + +# Intramuscular (IM) Medication + +Lorem Ipsum + +## Epinephrine + +Lorem Ipsum \ No newline at end of file diff --git a/docs/Pharmacy/IV-Medication.md b/docs/Pharmacy/IV-Medication.md new file mode 100644 index 000000000..ba3427a6b --- /dev/null +++ b/docs/Pharmacy/IV-Medication.md @@ -0,0 +1,17 @@ +>[!WARNING] +>This page is still under construction! Come back later! + +# IV Medication + +## Cardiac + +### Amiodarone + +### Lidocaine + +## Clotting + +### TXA + +### EACA + diff --git a/docs/Pharmacy/Oral-Medication.md b/docs/Pharmacy/Oral-Medication.md new file mode 100644 index 000000000..1a37b26da --- /dev/null +++ b/docs/Pharmacy/Oral-Medication.md @@ -0,0 +1,10 @@ +>[!WARNING] +>This page is still under construction! Come back later! + +# Oral Medication + +Lorem Ipsum + +## Pain Killers + +Lorem Ipsum \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index c70de23b4..dffabeb15 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,101 +1,42 @@ -

- -

- -

- - KAM Version - - - KAM Issues - - - KAM Downloads - - - KAM Build Status - -

- -

- Requires the latest version of CBA A3.
- Visit me on Discord
-

- - -**The ACE Advanced Medical System is nice, but we can do it better, even on a more realistic way and bring it on another level with these addons.**
-*Created by Katalam* - -Big thanks to ---------- -+ [Kellerkompanie](http://kellerkompanie.com/) - -## Core features - -- Airway - - [x] Airwaymanagement for unconscious patients - - [x] Head overstretching - - [x] Intubation - - [x] Aspiration -- Breathing - - [x] Oxygen saturation -- Circulation - - [x] Blood Groups - - [x] Painkillers - - [x] Bigger AED with monitoring -- Disability - - [x] Cut of clothes - - [x] Allergical reactions -- Exposure - - [ ] Heat-preserving -- Misc - - [ ] Big Backpack? - - [x] Workable IV stand - -Known Issues ------------- -+ [Issues](https://github.com/Katalam/kat_aceAdvMedical/issues) - -Required --------- -+ [CBA_A3 1.20 or later](http://www.armaholic.com/page.php?id=18767) -+ [ACE3 1.80 or later](https://ace3mod.com/) - -Youtube --------- -+ [Airway](https://youtu.be/V0csFQ1PLIw) -+ [Breathing](abc) -+ [Circulation](abc) -+ [Disability](abc) -+ [Exposure](abc) -+ [Misc](abc) - -Class Names --------- -+ [click here](https://github.com/Katalam/kat_aceAdvMedical/wiki/Class-Names) - -## Contributing - -You can help out with the ongoing development by looking for potential bugs in my code base, or by contributing new features. I am always welcome to new pull requests containing bug fixes, refactors and new features. - -### Building -The build process is base on the [ACE3 build process](https://ace3mod.com/wiki/development/setting-up-the-development-environment.html), so you can follow the steps there. Basically the following is needed: -+ correctly setup project drive (P: drive) -+ download/clone kat_aceAdvMedical GitHub repo -+ switch to the tools/ folder and execute ```python setup.py``` -+ you can build by executing ```python build.py``` from the tools folder -+ for testing include your mod by adding ```-mod=x\kat``` as start parameter - -For building release builds see [ACE3 reference](https://ace3mod.com/wiki/development/setting-up-the-development-environment.html). - -### Submitting issues and requesting features - -Please, use my [Issue Tracker](https://github.com/Katalam/kat_aceAdvMedical/issues) to report a bug, propose a feature, or suggest changes to the existing ones. - -## License - - - -
- This work is licensed under a Arma Public License Share Alike -
+# KAT Advanced Medical Wiki + +This is the Wiki for the KAT Advanced Medical mod. As this wiki is still a MASSIVE work in progress, this readme will remain a hot mess (much like it's author). + +This Wiki will (for now) only cover information contained within the production version of the KAM mod. This won't cover anything regarding ACE medical, or features in the dev version of KAM. + +### Contributors +yesthatRiVin + +--- + +TODO (Not in any particular order): +- [ ] Glow-up the README +- [ ] Hemorrhaging + - [x] Coagulation + - [x] IV IO + - [x] Blood Loss + - [x] Blood Types/Fluids + - [ ] Blood Transfusion +- [ ] Airways / Respiration + - [ ] Thoracic Injuries + - [ ] Airways Management + - [ ] Recovery Position + - [ ] BVM +- [ ] Cardiac + - [ ] Cardiac Arrest + - [x] Shockable Rhythms (VT, VF) + - [ ] Non-shockable Rhythms (PEA, Asystole) +- [ ] Pharmacy + - [ ] Oral + - [ ] Auto-Injectors + - [ ] IV Medication +- [ ] Surgery +- [ ] Nephrology + - [ ] Kidney Function + - [ ] Dialysis +- [ ] Equipment List +- [ ] List of all addon settings +- [ ] APPENDICIES + - [ ] Aid procedure + - [ ] M.A.R.C.H. Graphic + - [ ] Cardiac Flowcharts \ No newline at end of file diff --git a/optionals/usaf/$PBOPREFIX$ b/optionals/usaf/$PBOPREFIX$ deleted file mode 100644 index 150d9eacb..000000000 --- a/optionals/usaf/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -x\kat\addons\usaf diff --git a/optionals/usaf/CfgVehicles.hpp b/optionals/usaf/CfgVehicles.hpp deleted file mode 100644 index e71cbe56d..000000000 --- a/optionals/usaf/CfgVehicles.hpp +++ /dev/null @@ -1,42 +0,0 @@ -class CfgVehicles { - class rhsusf_M1078A1P2_fmtv_usarmy; - class rhsusf_M1078A1P2_D_fmtv_usarmy: rhsusf_M1078A1P2_fmtv_usarmy { - stretcherPos[] = {0,-1,-0.4}; - stretcherVector[] = {{0, 0, 0}, {0, 0, 0}}; - }; - class Heli_Transport_01_base_F; - class RHS_UH60_Base: Heli_Transport_01_base_F { - stretcherPos[] = {0,1.25,-1.86}; - stretcherVector[] = {{1, 0, 0}, {0, 0, 1}}; - }; - class Heli_Transport_02_base_F; - class RHS_CH_47F_base: Heli_Transport_02_base_F { - stretcherPos[] = {0,-0.43,-2.63}; - stretcherVector[] = {{0, 0, 0}, {0, 0, 0}}; - }; - class MRAP_01_base_F; - class rhsusf_hmmwe_base: MRAP_01_base_F { - stretcherPos[] = {0,-0.5,-0.85}; - stretcherVector[] = {{0, 0, 0}, {0, 0, 0}}; - }; - class Truck_01_base_F; - class rhsusf_M1220_usarmy_d: Truck_01_base_F { - stretcherPos[] = {-0.05,-2.1,-1.5}; - stretcherVector[] = {{0,0,0},{0,0,0}}; - }; - class APC_Tracked_03_base_F; - class RHS_M2A2_Base: APC_Tracked_03_base_F { - stretcherPos[] = {-1.19,-0.6,-0.45}; - stretcherVector[] = {{0,0,0},{0,0,0}}; - }; - class APC_Tracked_02_base_F; - class rhsusf_m113tank_base: APC_Tracked_02_base_F { - stretcherPos[] = {0,-0.5,-2.05}; - stretcherVector[] = {{0,0,0},{0,0,0}}; - }; - class rhsusf_M1083A1P2_B_fmtv_usarmy; - class rhsusf_M1085A1P2_B_Medical_fmtv_usarmy: rhsusf_M1083A1P2_B_fmtv_usarmy { - stretcherPos[] = {-0.9,3,0.67}; - stretcherVector[] = {{0,0,0},{0,0,0}}; - }; -}; diff --git a/optionals/usaf/script_component.hpp b/optionals/usaf/script_component.hpp deleted file mode 100644 index 21bd5dce7..000000000 --- a/optionals/usaf/script_component.hpp +++ /dev/null @@ -1,17 +0,0 @@ -#define COMPONENT usaf -#define COMPONENT_BEAUTIFIED KAT USAF -#include "\x\kat\addons\main\script_mod.hpp" - -// #define DEBUG_MODE_FULL -// #define DISABLE_COMPILE_CACHE -// #define ENABLE_PERFORMANCE_COUNTERS - -#ifdef DEBUG_ENABLED_USAF - #define DEBUG_MODE_FULL -#endif - -#ifdef DEBUG_SETTINGS_USAF - #define DEBUG_SETTINGS DEBUG_SETTINGS_USAF -#endif - -#include "\x\kat\addons\main\script_macros.hpp"