From af2b47de1599870b47c4dc4ec7c296ef8faae1ae Mon Sep 17 00:00:00 2001
From: mazinskihenry <33608576+mazinskihenry@users.noreply.github.com>
Date: Mon, 16 Dec 2024 13:40:42 -0800
Subject: [PATCH 1/6] Airway/Breathing/Chemical - Add option for intoxication
status visibility (#657)
**When merged this pull request will:**
- Adds CBA setting for making intoxication status visible
- Poisoning now shows up in Check Airway function
- Check Breathing function updated to reflect intoxication
### IMPORTANT
- [Development Guidelines](https://ace3.acemod.org/wiki/development/)
are read, understood and applied.
- Title of this PR uses our standard template `Component -
Add|Fix|Improve|Change|Make|Remove {changes}`.
---------
Co-authored-by: MiszczuZPolski <71414303+MiszczuZPolski@users.noreply.github.com>
---
addons/airway/ACE_Medical_Treatment_Actions.hpp | 2 +-
addons/airway/functions/fnc_checkAirway.sqf | 9 +++++++++
addons/airway/stringtable.xml | 6 ++++++
addons/breathing/functions/fnc_checkBreathing.sqf | 3 ++-
addons/chemical/XEH_preInit.sqf | 10 ++++++++++
addons/chemical/functions/fnc_gui_updateBodyImage.sqf | 2 +-
.../functions/fnc_gui_updateInjuryListGeneral.sqf | 3 ++-
addons/chemical/stringtable.xml | 8 +++++++-
8 files changed, 38 insertions(+), 5 deletions(-)
diff --git a/addons/airway/ACE_Medical_Treatment_Actions.hpp b/addons/airway/ACE_Medical_Treatment_Actions.hpp
index a5750776a..922185fa2 100644
--- a/addons/airway/ACE_Medical_Treatment_Actions.hpp
+++ b/addons/airway/ACE_Medical_Treatment_Actions.hpp
@@ -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)]) && !([_patient] call FUNC(checkMask)));
+ 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/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/stringtable.xml b/addons/airway/stringtable.xml
index a79ef1fdb..ffd5f3724 100644
--- a/addons/airway/stringtable.xml
+++ b/addons/airway/stringtable.xml
@@ -195,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
@@ -399,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
diff --git a/addons/breathing/functions/fnc_checkBreathing.sqf b/addons/breathing/functions/fnc_checkBreathing.sqf
index 8cc5e4de0..7f5042271 100644
--- a/addons/breathing/functions/fnc_checkBreathing.sqf
+++ b/addons/breathing/functions/fnc_checkBreathing.sqf
@@ -28,7 +28,7 @@ private _breathing = LLSTRING(breathing_isNormal);
private _breathing_log = localize ACELSTRING(medical_treatment,Check_Pulse_Normal);
private _breath = "";
-if (_patient getVariable [QGVAR(pneumothorax), 0] > 0) then {
+if ((_patient getVariable [QGVAR(pneumothorax), 0] > 0) || (_patient getVariable [QEGVAR(chemical,airPoisoning), false])) then {
_breathing = LLSTRING(breathing_isShallow);
_breathing_log = LLSTRING(breathing_shallow);
};
@@ -44,6 +44,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/chemical/XEH_preInit.sqf b/addons/chemical/XEH_preInit.sqf
index 24ffb6cdb..fbcb62f72 100644
--- a/addons/chemical/XEH_preInit.sqf
+++ b/addons/chemical/XEH_preInit.sqf
@@ -64,4 +64,14 @@ PREP_RECOMPILE_END;
[0, 3600, 60],
true
] call CBA_Settings_fnc_init;
+
+// Shows poisioning image
+[
+ QGVAR(showPoisoning),
+ "CHECKBOX",
+ [LLSTRING(SETTING_showPoisoning), LLSTRING(SETTING_showPoisoning_DESC)],
+ CBA_SETTINGS_CHEM,
+ [true],
+ true
+] call CBA_Settings_fnc_init;
ADDON = true;
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/stringtable.xml b/addons/chemical/stringtable.xml
index 2acab5c11..190b13387 100644
--- a/addons/chemical/stringtable.xml
+++ b/addons/chemical/stringtable.xml
@@ -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
@@ -819,4 +825,4 @@
Determines chance for dropping weapon while in tear gas
-
+
\ No newline at end of file
From 2294fa2d807898ab1eb1995d33fd820d8ee2d11e Mon Sep 17 00:00:00 2001
From: mazinskihenry <33608576+mazinskihenry@users.noreply.github.com>
Date: Mon, 16 Dec 2024 14:01:33 -0800
Subject: [PATCH 2/6] Breathing/Chemical - Adds Low O2 Warning Tone and
Chemical Compatibility (#660)
**When merged this pull request will:**
- Adds Low O2 Warning Tone for Personal Oxygen Tanks
- Adds Resistance against Level 1 Contaminants when wearing an active O2
system
- Changes Personal Tank weight and duration
### IMPORTANT
- [Development Guidelines](https://ace3.acemod.org/wiki/development/)
are read, understood and applied.
- Title of this PR uses our standard template `Component -
Add|Fix|Improve|Change|Make|Remove {changes}`.
---------
Co-authored-by: MiszczuZPolski <71414303+MiszczuZPolski@users.noreply.github.com>
---
addons/breathing/CfgMagazines.hpp | 4 ++--
addons/breathing/CfgSounds.hpp | 7 +++++++
addons/breathing/XEH_postInit.sqf | 6 ++++++
addons/breathing/audio/respiratorTone.ogg | Bin 0 -> 21298 bytes
.../functions/fnc_attachPersonalOxygen.sqf | 8 +++++++-
.../functions/fnc_attachVehicleOxygen.sqf | 2 ++
addons/chemical/functions/fnc_poison.sqf | 5 +++++
7 files changed, 29 insertions(+), 3 deletions(-)
create mode 100644 addons/breathing/audio/respiratorTone.ogg
diff --git a/addons/breathing/CfgMagazines.hpp b/addons/breathing/CfgMagazines.hpp
index c3342089a..78f4f8312 100644
--- a/addons/breathing/CfgMagazines.hpp
+++ b/addons/breathing/CfgMagazines.hpp
@@ -47,11 +47,11 @@ class CfgMagazines {
picture = QPATHTOF(ui\oxygenTank.paa);
ammo = "";
- count = 60;
+ count = 30;
initSpeed = 0;
tracersEvery = 0;
lastRoundsTracer = 0;
- mass = 3;
+ 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/XEH_postInit.sqf b/addons/breathing/XEH_postInit.sqf
index 5c45042d4..62efb8271 100644
--- a/addons/breathing/XEH_postInit.sqf
+++ b/addons/breathing/XEH_postInit.sqf
@@ -14,6 +14,12 @@
_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;
diff --git a/addons/breathing/audio/respiratorTone.ogg b/addons/breathing/audio/respiratorTone.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..6a0b70b7d56ba64d51e53471f0bfe0f9663893a0
GIT binary patch
literal 21298
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
Date: Mon, 16 Dec 2024 23:02:04 +0100
Subject: [PATCH 3/6] French Translation (#656)
**When merged this pull request will:**
- _Describe what this pull request will do_
- _Each change in a separate line_
### IMPORTANT
- [Development Guidelines](https://ace3.acemod.org/wiki/development/)
are read, understood and applied.
- Title of this PR uses our standard template `Component -
Add|Fix|Improve|Change|Make|Remove {changes}`.
---------
Co-authored-by: Fanrod-Bones <106916948+Fanrod-Bones@users.noreply.github.com>
---
addons/breathing/stringtable.xml | 12 ++++++++++++
addons/chemical/stringtable.xml | 4 +++-
addons/circulation/stringtable.xml | 1 +
3 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/addons/breathing/stringtable.xml b/addons/breathing/stringtable.xml
index b95ed8d96..4db0415a9 100644
--- a/addons/breathing/stringtable.xml
+++ b/addons/breathing/stringtable.xml
@@ -2748,50 +2748,62 @@
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/stringtable.xml b/addons/chemical/stringtable.xml
index 190b13387..b2243d322 100644
--- a/addons/chemical/stringtable.xml
+++ b/addons/chemical/stringtable.xml
@@ -799,7 +799,7 @@
Put on gas mask
ガスマスクを装着
- Mettre le masque à gaz
+ Mettre le masque à gaz
Take off gas mask
@@ -820,9 +820,11 @@
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/circulation/stringtable.xml b/addons/circulation/stringtable.xml
index 91860e75e..c8e8f400d 100644
--- a/addons/circulation/stringtable.xml
+++ b/addons/circulation/stringtable.xml
@@ -2593,6 +2593,7 @@
Change Monitoring Device
モニタリングする装置を変更
+ Changer le dispositif de surveillance
CPR Started
From 9eb3a2e0a3ad147519901f9eeb2ac8d2d6da8869 Mon Sep 17 00:00:00 2001
From: mazinskihenry <33608576+mazinskihenry@users.noreply.github.com>
Date: Mon, 16 Dec 2024 20:01:51 -0800
Subject: [PATCH 4/6] Chemical/Circulation/Watch - Fix Testing Errors (#665)
**When merged this pull request will:**
- Fixes Poison variable error
- Fixes Watch timer duplicating
- Fixes ApplyABG issue
### IMPORTANT
- [Development Guidelines](https://ace3.acemod.org/wiki/development/)
are read, understood and applied.
- Title of this PR uses our standard template `Component -
Add|Fix|Improve|Change|Make|Remove {changes}`.
---
addons/chemical/functions/fnc_poison.sqf | 2 +-
addons/circulation/CfgVehicles.hpp | 84 +++++++++++++++++--
.../functions/fnc_addArterialApplyActions.sqf | 10 +--
.../functions/fnc_addArterialTestActions.sqf | 2 +-
.../functions/fnc_attachBloodGas.sqf | 3 +-
.../functions/fnc_showBloodGas.sqf | 2 +-
addons/watch/XEH_PREP.hpp | 4 +-
addons/watch/XEH_postInit.sqf | 9 +-
addons/watch/functions/fnc_handleRespawn.sqf | 4 +-
addons/watch/functions/fnc_showRWatch.sqf | 17 +---
...WatchTimer.sqf => fnc_startWatchTimer.sqf} | 6 +-
11 files changed, 97 insertions(+), 46 deletions(-)
rename addons/watch/functions/{fnc_closeWatchTimer.sqf => fnc_startWatchTimer.sqf} (96%)
diff --git a/addons/chemical/functions/fnc_poison.sqf b/addons/chemical/functions/fnc_poison.sqf
index 84e117e8f..1d9b58459 100644
--- a/addons/chemical/functions/fnc_poison.sqf
+++ b/addons/chemical/functions/fnc_poison.sqf
@@ -45,7 +45,7 @@ if (_gasLevel == 0) exitWith {
};
// We assume that oxygen masks only cover the mouth and nose, leaving the eyes exposed to CS gas
-if ((_unit getVariable [QEGVAR(breathing,oxygenMaskActive)])) exitWith {
+if ((_unit getVariable [QEGVAR(breathing,oxygenMaskActive), false])) exitWith {
TRACE_1("unit has oxygen mask",_unit);
};
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/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_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/watch/XEH_PREP.hpp b/addons/watch/XEH_PREP.hpp
index d97090421..eeb625ae7 100644
--- a/addons/watch/XEH_PREP.hpp
+++ b/addons/watch/XEH_PREP.hpp
@@ -1,4 +1,3 @@
-PREP(closeWatchTimer);
PREP(handleRespawn);
PREP(hideKWatch);
PREP(hideCWatch);
@@ -8,4 +7,5 @@ PREP(init);
PREP(showKWatch);
PREP(showCWatch);
PREP(showSWatch);
-PREP(showRWatch);
\ No newline at end of file
+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 fc4683fb8..2d8de495e 100644
--- a/addons/watch/XEH_postInit.sqf
+++ b/addons/watch/XEH_postInit.sqf
@@ -2,7 +2,7 @@
if (!hasInterface) exitWith {};
-[QGVAR(closeWatchTimer), LINKFUNC(closeWatchTimer)] call CBA_fnc_addEventHandler;
+[QGVAR(startWatchTimer), LINKFUNC(startWatchTimer)] call CBA_fnc_addEventHandler;
[QEGVAR(misc,handleRespawn), LINKFUNC(handleRespawn)] call CBA_fnc_addEventHandler;
[QGVAR(playWatchTone), {
@@ -51,7 +51,7 @@ if (!hasInterface) exitWith {};
[ACE_player] call FUNC(showRWatch);
} else {
call FUNC(hideRWatch);
- };
+ };
};
};
@@ -96,11 +96,8 @@ if (!hasInterface) exitWith {};
if (_timerActive) then {
ACE_player setVariable [QGVAR(rangerStart), false, false];
} else {
- if !(GETMVAR(GVAR(RangerActive),false)) then {
- [QGVAR(closeWatchTimer), [ACE_player], ACE_player] call CBA_fnc_targetEvent;
- };
-
ACE_player setVariable [QGVAR(rangerStart), true, false];
+ [QGVAR(startWatchTimer), [ACE_player], ACE_player] call CBA_fnc_targetEvent;
};
};
diff --git a/addons/watch/functions/fnc_handleRespawn.sqf b/addons/watch/functions/fnc_handleRespawn.sqf
index ed450e087..eb6257b23 100644
--- a/addons/watch/functions/fnc_handleRespawn.sqf
+++ b/addons/watch/functions/fnc_handleRespawn.sqf
@@ -20,5 +20,5 @@
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
+_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
index d2cb346e7..cb74c897f 100644
--- a/addons/watch/functions/fnc_showRWatch.sqf
+++ b/addons/watch/functions/fnc_showRWatch.sqf
@@ -82,23 +82,8 @@ private _o2 = _display displayCtrl 22810;
_second ctrlSetAngle [(linearConversion [0, 60, _seconds, 0, 360]), 0.5, 0.5, true];
private _timeValue = _unit getVariable [QGVAR(rangerTimer), 0];
- private _active = _unit getVariable [QGVAR(rangerStart), false];
_timer ctrlSetText ([_timeValue, 2, 0] call CBA_fnc_formatNumber);
-
- if (_active) then {
- _timeValue = (_timeValue - 1) max 0;
-
- _timer ctrlSetText ([_timeValue, 2, 0] call CBA_fnc_formatNumber);
- _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;
- };
- } else {
- _timer ctrlSetText ([_timeValue, 2, 0] call CBA_fnc_formatNumber);
- };
}, 1, [
_unit,
_hour,
@@ -109,4 +94,4 @@ private _o2 = _display displayCtrl 22810;
_altitude,
_hr,
_o2
-]] call CBA_fnc_addPerFrameHandler;
\ No newline at end of file
+]] call CBA_fnc_addPerFrameHandler;
diff --git a/addons/watch/functions/fnc_closeWatchTimer.sqf b/addons/watch/functions/fnc_startWatchTimer.sqf
similarity index 96%
rename from addons/watch/functions/fnc_closeWatchTimer.sqf
rename to addons/watch/functions/fnc_startWatchTimer.sqf
index 657ec0cbb..e8dc43a67 100644
--- a/addons/watch/functions/fnc_closeWatchTimer.sqf
+++ b/addons/watch/functions/fnc_startWatchTimer.sqf
@@ -21,10 +21,6 @@ params ["_unit"];
_this params ["_args", "_pfhID"];
_args params ["_unit"];
- if (GVAR(RangerActive)) exitWith {
- _pfhID call CBA_fnc_removePerFrameHandler;
- };
-
if !(alive _unit) exitWith {
_pfhID call CBA_fnc_removePerFrameHandler;
};
@@ -47,5 +43,7 @@ params ["_unit"];
_pfhID call CBA_fnc_removePerFrameHandler;
};
+ } else {
+ _pfhID call CBA_fnc_removePerFrameHandler;
};
}, 1, [_unit]] call CBA_fnc_addPerFrameHandler;
\ No newline at end of file
From fb837f8cd8a5892f0e9c2bc781d3073e784bdf1c Mon Sep 17 00:00:00 2001
From: MiszczuZPolski <71414303+MiszczuZPolski@users.noreply.github.com>
Date: Tue, 17 Dec 2024 07:20:47 +0100
Subject: [PATCH 5/6] Compat RHS USF - Add compatibility for stretcher (#663)
**When merged this pull request will:**
- Allows attaching stretcher to few selected vehicles
### IMPORTANT
- [Development Guidelines](https://ace3.acemod.org/wiki/development/)
are read, understood and applied.
- Title of this PR uses our standard template `Component -
Add|Fix|Improve|Change|Make|Remove {changes}`.
---
.hemtt/launch.toml | 6 +++
addons/compat_rhs_usf3/$PBOPREFIX$ | 1 +
addons/compat_rhs_usf3/CfgVehicles.hpp | 46 +++++++++++++++++++
.../compat_rhs_usf3}/config.cpp | 12 ++---
addons/compat_rhs_usf3/script_component.hpp | 5 ++
.../functions/fnc_attachStretcher.sqf | 8 ++--
addons/stretcher/vehicle_stretcher.hpp | 24 +++++-----
optionals/usaf/$PBOPREFIX$ | 1 -
optionals/usaf/CfgVehicles.hpp | 42 -----------------
optionals/usaf/script_component.hpp | 17 -------
10 files changed, 79 insertions(+), 83 deletions(-)
create mode 100644 addons/compat_rhs_usf3/$PBOPREFIX$
create mode 100644 addons/compat_rhs_usf3/CfgVehicles.hpp
rename {optionals/usaf => addons/compat_rhs_usf3}/config.cpp (66%)
create mode 100644 addons/compat_rhs_usf3/script_component.hpp
delete mode 100644 optionals/usaf/$PBOPREFIX$
delete mode 100644 optionals/usaf/CfgVehicles.hpp
delete mode 100644 optionals/usaf/script_component.hpp
diff --git a/.hemtt/launch.toml b/.hemtt/launch.toml
index 6e2348da9..599ddc3f4 100644
--- a/.hemtt/launch.toml
+++ b/.hemtt/launch.toml
@@ -4,3 +4,9 @@ workshop = [
"463939057", # ACE3's Workshop ID
"2369477168" # Advanced Developer Tools's Workshop ID
]
+
+[rhs]
+extends = "default"
+workshop = [
+ "843577117", # RHS USAF Workshop ID
+]
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/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/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/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"
From a36f536be6a9ba6f0ec0cc15d6f1c0ae927132a1 Mon Sep 17 00:00:00 2001
From: MiszczuZPolski <71414303+MiszczuZPolski@users.noreply.github.com>
Date: Tue, 17 Dec 2024 07:54:34 +0100
Subject: [PATCH 6/6] Prepare stable update v3.0.4
---
addons/main/script_version.hpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp
index da0e91aa9..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 4
-#define BUILD 59
+#define BUILD 60