Medical - Cleanup settings (#7057)

* Cleanup medical settings

* Fix extra [

* Allow giving IV/blood to self by default

* Medical Blood - Settings improvements and cleanup (#7069)

* Add more blood settings and cleanup

* Fix include before header

* Update addons/medical_blood/functions/fnc_init.sqf

Co-Authored-By: PabstMirror <pabstmirror@gmail.com>

* Disable debug

* Cleanup moved settings

* Fix remaining setting descriptions
This commit is contained in:
mharis001 2019-06-28 12:50:11 -04:00 committed by PabstMirror
parent de13ab0f47
commit b2f4b8ea20
37 changed files with 552 additions and 775 deletions

View File

@ -21,6 +21,9 @@ LOG("Adding ACE_Settings to CBA_settings");
GVAR(cbaSettings_forcedSettings) = []; GVAR(cbaSettings_forcedSettings) = [];
GVAR(cbaSettings_missionSettings) = []; GVAR(cbaSettings_missionSettings) = [];
GVAR(settings) = []; // will stay empty - for BWC? GVAR(settings) = []; // will stay empty - for BWC?
#ifdef DEBUG_MODE_FULL
GVAR(settingsMovedToSQF) = [];
#endif
// Add Event Handlers: // Add Event Handlers:
[QGVAR(setSetting), { [QGVAR(setSetting), {
@ -66,6 +69,13 @@ GVAR(settings) = []; // will stay empty - for BWC?
false false
} count GVAR(runAtSettingsInitialized); } count GVAR(runAtSettingsInitialized);
GVAR(runAtSettingsInitialized) = nil; //cleanup GVAR(runAtSettingsInitialized) = nil; //cleanup
#ifdef DEBUG_MODE_FULL
INFO_1("checking settingsMovedToSQF [%1]",count GVAR(settingsMovedToSQF));
{
if (isNil _x) then { WARNING_1("setting [%1] NOT moved to sqf",_x); };
} forEach GVAR(settingsMovedToSQF);
#endif
}] call CBA_fnc_addEventHandler; }] call CBA_fnc_addEventHandler;
private _start = diag_tickTime; private _start = diag_tickTime;
@ -81,6 +91,10 @@ for "_index" from 0 to (_countOptions - 1) do {
} else { } else {
WARNING_1("Setting [%1] - Already defined from somewhere else??",_varName); WARNING_1("Setting [%1] - Already defined from somewhere else??",_varName);
}; };
#ifdef DEBUG_MODE_FULL
} else {
GVAR(settingsMovedToSQF) pushBack configName _optionEntry;
#endif
}; };
}; };

View File

@ -1,34 +1,30 @@
// CBA Settings [ADDON: ace_medical]:
private _categoryArray = [LELSTRING(medical,Category), "?"];
// todo: Check the description is still accurate
[ [
QGVAR(spontaneousWakeUpChance), "SLIDER", QGVAR(limping),
[LSTRING(MedicalSettings_spontaneousWakeUpChance_DisplayName), LSTRING(MedicalSettings_spontaneousWakeUpChance_Description)], "LIST",
_categoryArray, [LSTRING(Limping_DisplayName), LSTRING(Limping_Description)],
[0,1,0.05,2], // [min, max, default value, trailing decimals (-1 for whole numbers only)] LSTRING(Category),
true, // isGlobal [[0, 1, 2], [ELSTRING(common,Disabled), LSTRING(Limping_LimpOnOpenWounds), LSTRING(Limping_LimpRequiresStitching)], 1],
{[QGVAR(spontaneousWakeUpChance), _this] call EFUNC(common,cbaSettings_settingChanged)}, true,
true // Needs mission restart {[QGVAR(limping), _this] call EFUNC(common,cbaSettings_settingChanged)},
true
] call CBA_settings_fnc_init; ] call CBA_settings_fnc_init;
[ [
QEGVAR(medical,limping), "LIST", QGVAR(fractures),
[LSTRING(setting_limping_DisplayName), LSTRING(setting_limping_Description)], "LIST",
_categoryArray, [LSTRING(Fractures_DisplayName), LSTRING(Fractures_Description)],
[[0,1,2],[LELSTRING(common,disabled), LLSTRING(setting_limping_limpOnOpenWounds), LLSTRING(setting_limping_limpRequiresStitching)], 1], // [values, titles, defaultIndex] LSTRING(Category),
true, // isGlobal [[0, 1, 2], [ELSTRING(common,Disabled), LSTRING(Fractures_SplintHealsFully), LSTRING(Fractures_SplintHasEffects)], 1],
{[QEGVAR(medical,limping), _this] call EFUNC(common,cbaSettings_settingChanged)}, true,
true // Needs mission restart {[QGVAR(fractures), _this] call EFUNC(common,cbaSettings_settingChanged)},
true
] call CBA_settings_fnc_init; ] call CBA_settings_fnc_init;
[ [
QEGVAR(medical,fractures), "LIST", QGVAR(spontaneousWakeUpChance),
[LSTRING(setting_fractures_DisplayName), LSTRING(setting_fractures_Description)], "SLIDER",
_categoryArray, [LSTRING(SpontaneousWakeUpChance_DisplayName), LSTRING(SpontaneousWakeUpChance_Description)],
[[0,1,2],[LELSTRING(common,disabled), LLSTRING(setting_fractures_splintHealsFully), LLSTRING(setting_fractures_splintHasEffects)], 1], // [values, titles, defaultIndex] LSTRING(Category),
true, // isGlobal [0, 1, 0.05, 2],
{[QEGVAR(medical,fractures), _this] call EFUNC(common,cbaSettings_settingChanged)}, true
true // Needs mission restart
] call CBA_settings_fnc_init; ] call CBA_settings_fnc_init;

View File

@ -17,117 +17,49 @@
<Chinesesimp>ACE 医疗系统</Chinesesimp> <Chinesesimp>ACE 医疗系统</Chinesesimp>
<Chinese>ACE 醫療系統</Chinese> <Chinese>ACE 醫療系統</Chinese>
</Key> </Key>
<Key ID="STR_ACE_Medical_MedicalSettings_level_DisplayName"> <Key ID="STR_ACE_Medical_SpontaneousWakeUpChance_DisplayName">
<English>Medical Level</English> <English>Unconscious Wake Up Chance</English>
<Russian>Сложность медицины</Russian> <German>Wahrscheinlichkeit aufzuwachen</German>
<Polish>Poziom medyczny</Polish> <Japanese>気絶から覚醒する可能性</Japanese>
<Spanish>Nivel médico</Spanish> <Russian>Шанс очнуться при потере сознания</Russian>
<German>Stufe des Sanitätssystem</German>
<Czech>Úroveň medického</Czech>
<Portuguese>Nível médico</Portuguese>
<French>Niveau de simulation médicale</French>
<Hungarian>Orvosi szint</Hungarian>
<Italian>Livello Medico</Italian>
<Japanese>医療レベル</Japanese>
<Korean>의료 수준</Korean>
<Chinesesimp>医疗等级</Chinesesimp>
<Chinese>醫療等級</Chinese>
</Key> </Key>
<Key ID="STR_ACE_Medical_MedicalSettings_level_Description"> <Key ID="STR_ACE_Medical_SpontaneousWakeUpChance_Description">
<English>What is the medical simulation level?</English> <English>The probablity that a unit with stable vitals will wake up from unconsciousness (checked every 15 seconds).</English>
<Russian>Каков уровень сложности медицинской системы?</Russian> <German>Wahrscheinlichkeit, dass eine bewusstlose Person mit stabilen Vitalwerten wieder aufwacht ()Überprüfung alle 15 Sekunden)</German>
<Polish>Jaki jest poziom symulacji medycznej?</Polish> <Japanese>安定状態にある人が覚醒する確率です。(15 秒毎に確認)</Japanese>
<Spanish>¿Cuál es el nivel de simulación médica?</Spanish> <Russian>Вероятность, что стабилизированный юнит очнется от потери сознания (Проверяется каждые 15 сек)</Russian>
<German>Wie hoch soll das medizinische Simulationslevel sein?</German>
<Czech>Jaká je úroveň lékařské simulace?</Czech>
<Portuguese>Qual o nível de simulação médica?</Portuguese>
<French>Quel niveau de simulation médicale choisissez-vous?</French>
<Hungarian>Milyen komplex legyen az orvosi szimuláció?</Hungarian>
<Italian>Qual'è il livello di simulazione medica?</Italian>
<Japanese>治療の再現度は?</Japanese>
<Korean>의료 시뮬레이션의 수준</Korean>
<Chinesesimp>选择需要的医疗模拟等级</Chinesesimp>
<Chinese>選擇需要的醫療模擬等級</Chinese>
</Key> </Key>
<Key ID="STR_ACE_Medical_MedicalSettings_medicSetting_disable"> <Key ID="STR_ACE_Medical_Limping_DisplayName">
<English>Disable medics</English> <English>Limping</English>
<Russian>Отключить медиков</Russian> <Russian>Хромота</Russian>
<Polish>Wyłącz medyków</Polish>
<Spanish>Desactivar médicos</Spanish>
<German>Sanitäter deaktivieren</German>
<Czech>Zakázat zdravotníky</Czech>
<Portuguese>Desativar médicos</Portuguese>
<French>Désactiver les infirmiers</French>
<Hungarian>Orvosok letiltása</Hungarian>
<Italian>Disabilita medici</Italian>
<Japanese>衛生兵を無効化</Japanese>
<Korean>의무병 비활성화</Korean>
<Chinesesimp>关闭医护兵</Chinesesimp>
<Chinese>關閉醫護兵</Chinese>
</Key> </Key>
<Key ID="STR_ACE_Medical_MedicalSettings_allowLitterCreation_DisplayName"> <Key ID="STR_ACE_Medical_Limping_Description">
<English>Enable Litter</English> <English>Limp when unit has leg wounds...(todo)</English>
<Russian>Включить мусор</Russian> <Russian>Хромота, когда юнит имеет ранения ног...</Russian>
<Polish>Aktywuj odpadki</Polish>
<Spanish>Activar restos médicos</Spanish>
<German>Abfälle aktivieren</German>
<Czech>Povolit odpadky</Czech>
<Portuguese>Ativar lixo médico</Portuguese>
<French>Activer les détritus</French>
<Hungarian>Szemét engedélyezése</Hungarian>
<Italian>Abilita Barella</Italian>
<Japanese>医療廃棄物の表示を有効化</Japanese>
<Korean>의료폐기물 활성화</Korean>
<Chinesesimp>启用医疗废弃物</Chinesesimp>
<Chinese>啟用醫療廢棄物</Chinese>
</Key> </Key>
<Key ID="STR_ACE_Medical_MedicalSettings_allowLitterCreation_Description"> <Key ID="STR_ACE_Medical_Limping_LimpOnOpenWounds">
<English>Enable litter being created upon treatment</English> <English>Limp on open wounds</English>
<Russian>Включить появление мусора после лечения</Russian> <Russian>Хромота при открытых ранах</Russian>
<Polish>Twórz odpadki medyczne podczas leczenia</Polish>
<Spanish>Activar los restos médicos que se crean en el tratamiento</Spanish>
<German>Aktiviere Abfälle, wenn eine Behandlung durchgeführt wurde</German>
<Czech>Vytváří odpad zdravotnického materiálu pří léčení</Czech>
<Portuguese>Ativar lixo ser criado após tratamento</Portuguese>
<French>Activer la création de détrimus au début des traitements</French>
<Hungarian>Engedélyezi a szemét keletkezését ellátáskor</Hungarian>
<Italian>Abilita la creazione della barella dopo trattamento</Italian>
<Japanese>治療を始めると、医療廃棄物の作成を有効化する</Japanese>
<Korean>의료폐기물이 치료중 주변에 생성되는것을 활성화 합니다</Korean>
<Chinesesimp>本功能启用后,当每次医疗动作结束时,地上会产生相应的医疗废弃物</Chinesesimp>
<Chinese>本功能啟用後,當每次醫療動作結束時,地上會產生相應的醫療廢棄物</Chinese>
</Key> </Key>
<Key ID="STR_ACE_Medical_MedicalSettings_litterCleanUpDelay_DisplayName"> <Key ID="STR_ACE_Medical_Limping_LimpRequiresStitching">
<English>Life time of litter objects</English> <English>Limp on open or bandaged wounds</English>
<Russian>Время удаления мусора</Russian> <Russian>Хромота при открытых или забинтованых ранах</Russian>
<Polish>Długość życia odpadków</Polish>
<Spanish>Tiempo de vida de los restos médicos</Spanish>
<German>Dauer des angezeigten Abfalls</German>
<Czech>Životnost pro odpadky</Czech>
<Portuguese>Tempo de vida dos objetos do lixo</Portuguese>
<French>Durée d'affichage des détritus</French>
<Hungarian>Szemétobjektumok élettartama</Hungarian>
<Italian>Tempo di vita delle barelle</Italian>
<Japanese>医療廃棄物の作成限界数を設定</Japanese>
<Korean>의료폐기물 시간제한</Korean>
<Chinesesimp>医疗废弃物存在时间</Chinesesimp>
<Chinese>醫療廢棄物存在時間</Chinese>
</Key> </Key>
<Key ID="STR_ACE_Medical_MedicalSettings_litterCleanUpDelay_Description"> <Key ID="STR_ACE_Medical_Fractures_DisplayName">
<English>How long should litter objects stay? In seconds. -1 is forever.</English> <English>Fractures</English>
<Russian>Как долго мусор будет оставаться на земле? В секундах. -1 означает бесконечное время.</Russian> <Russian>Переломы</Russian>
<Polish>Ile czasu musi upłynąć, aby odpadki zaczęły znikać? W sekundach. -1 dla nieskończoności.</Polish> </Key>
<Spanish>¿Por cuánto tiempo deben permanecer los restos médicos? En segundos. -1 es para siempre.</Spanish> <Key ID="STR_ACE_Medical_Fractures_Description">
<German>Wie lange sollen Abfälle am Boden liegen (in Sekunden)? -1 ist für immer.</German> <English>Limp fractures... (todo)</English>
<Czech>Za jak dlouho začnou odpadky mizet? V sekundách. -1 navždy.</Czech> <Russian>Хромота при переломах...</Russian>
<Portuguese>Quanto tempo os objetos do lixo devem ficar? Em segundos. -1 é para sempre.</Portuguese> </Key>
<French>Combien de temps doivent rester affiché les détritus? En secondes. -1 pour tout le temps</French> <Key ID="STR_ACE_Medical_Fractures_SplintHealsFully">
<Hungarian>Milyen sokáig legyenek jelen a szemétobjektumok (másodpercben)? A -1 végtelen időt jelent.</Hungarian> <English>Splints fully heal fractures</English>
<Italian>Per quanto devono restare le barelle? In secondi. -1 è permanente</Italian> <Russian>Шины полностью лечат перелом</Russian>
<Japanese>医療廃棄物オブジェクトが表示されつづける時間を設定しますか? -1 は永遠です。</Japanese> </Key>
<Korean>얼마동안 폐기물이 존재합니까? 초 단위. -1 은 영구적.</Korean> <Key ID="STR_ACE_Medical_Fractures_SplintHasEffects">
<Chinesesimp>定义医疗废弃物存在时间,以秒为单位,-1为永远存在。</Chinesesimp> <English>Splints heal (but cannot sprint)</English>
<Chinese>定義醫療廢棄物存在時間,以秒為單位,-1為永遠存在。</Chinese> <Russian>Шины вылечивают, но не дают бегать</Russian>
</Key> </Key>
<Key ID="STR_ACE_Medical_MedicalSettings_remoteControlledAI_DisplayName"> <Key ID="STR_ACE_Medical_MedicalSettings_remoteControlledAI_DisplayName">
<English>Remote Controlled AI</English> <English>Remote Controlled AI</English>
@ -209,21 +141,6 @@
<Chinesesimp>医疗系统将同时对玩家与AI发生作用</Chinesesimp> <Chinesesimp>医疗系统将同时对玩家与AI发生作用</Chinesesimp>
<Chinese>醫療系統將同時對玩家與AI發生作用</Chinese> <Chinese>醫療系統將同時對玩家與AI發生作用</Chinese>
</Key> </Key>
<Key ID="STR_ACE_Medical_BasicMedicalSettings_Module_DisplayName">
<English>Basic Medical Settings [ACE]</English>
<German>Standard Sanitätseinstellungen [ACE]</German>
<Polish>Podstawowe ustawienia medyczne</Polish>
<Spanish>Ajustes médicos básicos [ACE]</Spanish>
<French>Paramètres des soins basiques [ACE]</French>
<Italian>Impostazioni Mediche Di Base [ACE]</Italian>
<Czech>Základní zdravotnické nastavení [ACE]</Czech>
<Portuguese>Ajustes médicos básicos [ACE]</Portuguese>
<Russian>Настройки базовой медицины [ACE]</Russian>
<Japanese>ベーシック医療設定 [ACE]</Japanese>
<Korean>기본 의료 설정 [ACE]</Korean>
<Chinesesimp>基本医疗设定 [ACE]</Chinesesimp>
<Chinese>基本醫療設定 [ACE]</Chinese>
</Key>
<Key ID="STR_ACE_Medical_MedicalSettings_enableFor_DisplayName"> <Key ID="STR_ACE_Medical_MedicalSettings_enableFor_DisplayName">
<English>Enabled for</English> <English>Enabled for</English>
<Russian>Включено для</Russian> <Russian>Включено для</Russian>
@ -320,21 +237,6 @@
<Chinesesimp>设定人员是否会因为载具冲撞别的物件而产生伤害?</Chinesesimp> <Chinesesimp>设定人员是否会因为载具冲撞别的物件而产生伤害?</Chinesesimp>
<Chinese>設定人員是否會因為載具衝撞別的物件而產生傷害?</Chinese> <Chinese>設定人員是否會因為載具衝撞別的物件而產生傷害?</Chinese>
</Key> </Key>
<Key ID="STR_ACE_Medical_BasicMedicalSettings_useLocation_basicEpi_Description">
<English>Where can the Epinephrine be used? (Basic Medical)</English>
<German>Wo kann Epiniphrin verwendet werden? (Standard Sanitätseinstellungen)</German>
<Spanish>Configura donde puede usarse Epinefrina (Solo sistema médico básico)</Spanish>
<Polish>Gdzie można korzystać z adrenaliny? (Podstawowy system medyczny)</Polish>
<French>Où peut être utilisé l'épinéphrine ? (Médical basique)</French>
<Italian>Dove si può usare l'epinefrina? (Sistema medico di base)</Italian>
<Czech>Kde může být použit adrenalin? (Pouze základní zdravotní systém)</Czech>
<Portuguese>Onde pode-se usar a Epinefrina? (Somente sistema médico básico)</Portuguese>
<Russian>Где может использоваться адреналин? (Базовая медицина)</Russian>
<Japanese>どこでもアドレナリンを使えるようにしますか? (ベーシック医療のみ)</Japanese>
<Korean>어디에서 에피네프린을 사용할 수 있습니까? (기본 의료)</Korean>
<Chinesesimp>在哪里可以使用肾上腺素? (基本医疗)</Chinesesimp>
<Chinese>在哪裡可以使用腎上腺素? (基本醫療)</Chinese>
</Key>
<Key ID="STR_ACE_Medical_MedicalSettings_healHitPointAfterAdvBandage_DisplayName"> <Key ID="STR_ACE_Medical_MedicalSettings_healHitPointAfterAdvBandage_DisplayName">
<English>Heal hitpoints</English> <English>Heal hitpoints</English>
<German>Heile Trefferpunkte</German> <German>Heile Trefferpunkte</German>
@ -440,18 +342,6 @@
<Chinesesimp>设定当距离超过%1将不能使用治疗动作</Chinesesimp> <Chinesesimp>设定当距离超过%1将不能使用治疗动作</Chinesesimp>
<Chinese>設定當距離超過%1將不能使用治療動作</Chinese> <Chinese>設定當距離超過%1將不能使用治療動作</Chinese>
</Key> </Key>
<Key ID="STR_ACE_Medical_MedicalSettings_spontaneousWakeUpChance_DisplayName">
<English>Unconscious Wake Up Chance</English>
<German>Wahrscheinlichkeit aufzuwachen</German>
<Japanese>気絶から覚醒する可能性</Japanese>
<Russian>Шанс очнуться при потере сознания</Russian>
</Key>
<Key ID="STR_ACE_Medical_MedicalSettings_spontaneousWakeUpChance_Description">
<English>Probablity that a unit with stable vitals will wake up from unconscious [Checked every 15 sec]</English>
<German>Wahrscheinlichkeit, dass eine bewusstlose Person mit stabilen Vitalwerten wieder aufwacht [Überprüfung alle 15 Sekunden]</German>
<Japanese>安定状態にある人が覚醒する確率です。(15 秒毎に確認)</Japanese>
<Russian>Вероятность, что стабилизированный юнит очнется от потери сознания [Проверяется каждые 15 сек]</Russian>
</Key>
<Key ID="STR_ACE_Medical_openLid"> <Key ID="STR_ACE_Medical_openLid">
<English>Open lid</English> <English>Open lid</English>
<German>Deckel aufklappen</German> <German>Deckel aufklappen</German>
@ -474,37 +364,5 @@
<Polish>Zamknij pokrywę</Polish> <Polish>Zamknij pokrywę</Polish>
<Russian>Закрыть крышку</Russian> <Russian>Закрыть крышку</Russian>
</Key> </Key>
<Key ID="STR_ACE_Medical_setting_limping_DisplayName">
<English>Limping</English>
<Russian>Хромота</Russian>
</Key>
<Key ID="STR_ACE_Medical_setting_limping_Description">
<English>Limp when unit has leg wounds...(todo)</English>
<Russian>Хромота, когда юнит имеет ранения ног...</Russian>
</Key>
<Key ID="STR_ACE_Medical_setting_limping_limpOnOpenWounds">
<English>Limp on open wounds</English>
<Russian>Хромота при открытых ранах</Russian>
</Key>
<Key ID="STR_ACE_Medical_setting_limping_limpRequiresStitching">
<English>Limp on open or bandaged wounds</English>
<Russian>Хромота при открытых или забинтованых ранах</Russian>
</Key>
<Key ID="STR_ACE_Medical_setting_fractures_DisplayName">
<English>Fractures</English>
<Russian>Переломы</Russian>
</Key>
<Key ID="STR_ACE_Medical_setting_fractures_Description">
<English>Limp fractures... (todo)</English>
<Russian>Хромота при переломах...</Russian>
</Key>
<Key ID="STR_ACE_Medical_setting_fractures_splintHealsFully">
<English>Splints fully heal fractures</English>
<Russian>Шины полностью лечат перелом</Russian>
</Key>
<Key ID="STR_ACE_Medical_setting_fractures_splintHasEffects">
<English>Splints heal (but cannot sprint)</English>
<Russian>Шины вылечивают, но не дают бегать</Russian>
</Key>
</Package> </Package>
</Project> </Project>

View File

@ -1,4 +1,3 @@
class Extended_PreStart_EventHandlers { class Extended_PreStart_EventHandlers {
class ADDON { class ADDON {
init = QUOTE(call COMPILE_FILE(XEH_preStart)); init = QUOTE(call COMPILE_FILE(XEH_preStart));

View File

@ -1,7 +1,7 @@
ace_medical_blood ace_medical_blood
=============== =================
Adds blood visual effect on the ground near a bleeding player. Creates blood drops on the ground near bleeding units.
## Maintainers ## Maintainers

View File

@ -1,7 +1,7 @@
PREP(cleanupLoop);
PREP(createBlood);
PREP(handleWoundReceived); PREP(handleWoundReceived);
PREP(init);
PREP(isBleeding); PREP(isBleeding);
PREP(onBleeding); PREP(onBleeding);
PREP(createBlood);
PREP(serverCleanupBlood);
PREP(spurt); PREP(spurt);

View File

@ -10,33 +10,18 @@ if (isServer) then {
[QGVAR(bloodDropCreated), { [QGVAR(bloodDropCreated), {
params ["_bloodDrop"]; params ["_bloodDrop"];
// Add to created queue with format [expireTime, object]
private _index = GVAR(bloodDrops) pushBack [(CBA_missionTime + BLOOD_OBJECT_LIFETIME), _bloodDrop];
if (count GVAR(bloodDrops) >= MAX_BLOOD_OBJECTS) then { // Add to created queue with format: [expire time, blood object]
private _index = GVAR(bloodDrops) pushBack [CBA_missionTime + GVAR(bloodLifetime), _bloodDrop];
if (count GVAR(bloodDrops) >= GVAR(maxBloodObjects)) then {
(GVAR(bloodDrops) deleteAt 0) params ["", "_deletedBloodDrop"]; (GVAR(bloodDrops) deleteAt 0) params ["", "_deletedBloodDrop"];
deleteVehicle _deletedBloodDrop; deleteVehicle _deletedBloodDrop;
}; };
if (_index == 1) then { // Start the waitAndExecute loop // Start the cleanup loop
[FUNC(serverCleanupBlood), [], BLOOD_OBJECT_LIFETIME] call CBA_fnc_waitAndExecute; if (_index == 0) then {
[FUNC(cleanupLoop), [], GVAR(bloodLifetime)] call CBA_fnc_waitAndExecute;
}; };
}] call CBA_fnc_addEventHandler; }] call CBA_fnc_addEventHandler;
}; };
["ace_settingsInitialized", {
TRACE_1("settingsInitialized", GVAR(enabledFor));
if (GVAR(enabledFor) == 0) exitWith {}; // 0: disabled
if ((GVAR(enabledFor) == 1) && {!hasInterface}) exitWith {}; // 1: enabledFor_OnlyPlayers
private _listcode = if (GVAR(enabledFor) == 1) then {
{if (alive ACE_player) then {[ACE_player]} else {[]}} // ace_player is only possible local player
} else {
EFUNC(common,getLocalUnits) // filter all local units
};
private _stateMachine = [_listcode, true] call CBA_statemachine_fnc_create;
[_stateMachine, LINKFUNC(onBleeding), {}, {}, "Bleeding"] call CBA_statemachine_fnc_addState;
[QEGVAR(medical,woundReceived), FUNC(handleWoundReceived)] call CBA_fnc_addEventHandler;
}] call CBA_fnc_addEventHandler;

View File

@ -14,5 +14,5 @@ class CfgPatches {
}; };
}; };
#include "ACE_Settings.hpp"
#include "CfgEventHandlers.hpp" #include "CfgEventHandlers.hpp"
#include "ACE_Settings.hpp"

View File

@ -1,23 +1,26 @@
#include "script_component.hpp" #include "script_component.hpp"
/* /*
* Author: PabstMirror * Author: PabstMirror
* Loop that cleans up blood * Handles cleaning up blood objects that have reached the end of their lifetime.
* *
* Arguments: * Arguments:
* None * None
* *
* ReturnValue: * Return Value:
* None * None
* *
* Example:
* [] call ace_medical_blood_fnc_cleanupLoop
*
* Public: No * Public: No
*/ */
(GVAR(bloodDrops) deleteAt 0) params ["", "_deletedBloodDrop"]; (GVAR(bloodDrops) deleteAt 0) params ["", "_deletedBloodDrop"];
deleteVehicle _deletedBloodDrop; deleteVehicle _deletedBloodDrop;
// If we cleaned out the array, exit loop // Exit the loop if we have cleaned out the array
if (GVAR(bloodDrops) isEqualTo []) exitWith {}; if (GVAR(bloodDrops) isEqualTo []) exitWith {};
// Wait until the next blood drop in the queue will expire // Wait until the next blood drop in the queue will expire
(GVAR(bloodDrops) select 0) params ["_expireTime"]; (GVAR(bloodDrops) select 0) params ["_expireTime"];
[FUNC(serverCleanupBlood), [], (_expireTime - CBA_missionTime)] call CBA_fnc_waitAndExecute; [FUNC(cleanupLoop), [], _expireTime - CBA_missionTime] call CBA_fnc_waitAndExecute;

View File

@ -1,15 +1,15 @@
#include "script_component.hpp" #include "script_component.hpp"
/* /*
* Author: Glowbal * Author: Glowbal
* Spawn a blood drop. * Creates a blood object and handles its cleanup.
* Available blood drop classes are blooddrop_1 through blooddrop_4. * Available blood drop classes are blooddrop_1 through blooddrop_4.
* *
* Arguments: * Arguments:
* 0: classname of blood drop <OBJECT> * 0: Blood Drop Type <STRING>
* 1: Position <ARRAY> * 1: Position <ARRAY>
* *
* Return Value: * Return Value:
* Created blood drop <OBJECT> * Blood Drop <OBJECT>
* *
* Example: * Example:
* ["blooddrop_2", getPos player] call ace_medical_blood_fnc_createBlood * ["blooddrop_2", getPos player] call ace_medical_blood_fnc_createBlood
@ -17,15 +17,15 @@
* Public: No * Public: No
*/ */
params ["_type", "_pos"]; params ["_type", "_position"];
TRACE_2("creating blood",_type,_pos); TRACE_2("Creating blood",_type,_position);
private _model = GVAR(models) getVariable _type; private _model = GVAR(models) getVariable _type;
private _object = createSimpleObject [_model, [0,0,0]]; private _bloodDrop = createSimpleObject [_model, [0, 0, 0]];
_object setDir random 360; _bloodDrop setDir random 360;
_object setPos _pos; _bloodDrop setPos _position;
[QGVAR(bloodDropCreated), [_object]] call CBA_fnc_serverEvent; [QGVAR(bloodDropCreated), _bloodDrop] call CBA_fnc_serverEvent;
_object _bloodDrop

View File

@ -1,13 +1,13 @@
#include "script_component.hpp" #include "script_component.hpp"
/* /*
* Author: Glowbal, commy2 * Author: Glowbal, commy2
* Handle wounds received event. * Handles the wounds received event by triggering any needed blood creation.
* *
* Arguments: * Arguments:
* 0: unit <OBJECT> * 0: Unit <OBJECT>
* 1: bodyPart <String> * 1: Body Part (not used) <STRING>
* 2: damage <NUMBER> * 2: Damage <NUMBER>
* 3: shooter <OBJECT> * 3: Shooter <OBJECT>
* *
* Return Value: * Return Value:
* None * None
@ -20,16 +20,16 @@
params ["_unit", "", "_damage", "_shooter"]; params ["_unit", "", "_damage", "_shooter"];
if (GVAR(enabledFor) == 1 && {!isPlayer _unit && {_unit != ACE_player}}) exitWith {}; // Don't bleed when players only and a non-player unit is wounded
if (vehicle _unit != _unit && {!((vehicle _unit) isKindOf "StaticWeapon")}) exitWith {}; // Don't bleed on ground if mounted if (GVAR(enabledFor) == BLOOD_ONLY_PLAYERS && {!isPlayer _unit && {_unit != ACE_player}}) exitWith {};
_damage = _damage min 1; // Don't bleed on the ground if in a vehicle
if (vehicle _unit != _unit && {!(vehicle _unit isKindOf "StaticWeapon")}) exitWith {};
if (isNull _shooter) exitWith { // won't be able to calculate the direction properly, so instead we pick something at random private _bulletDir = if (isNull _shooter) then {
[QGVAR(spurt), [_unit, random 360, _damage]] call CBA_fnc_serverEvent; random 360 // Cannot calculate the direction properly, pick a random direction
} else {
_shooter getDir _unit // Calculate the bullet direction
}; };
// Calculate bulletDirection [QGVAR(spurt), [_unit, _bulletDir, _damage min 1]] call CBA_fnc_serverEvent;
private _bulletDir = _shooter getDir _unit;
[QGVAR(spurt), [_unit, _bulletDir, _damage]] call CBA_fnc_serverEvent;

View File

@ -0,0 +1,65 @@
#include "script_component.hpp"
/*
* Author: mharis001
* Initializes the medical blood system based on the given mode.
* Should only be called from the CBA setting changed script.
*
* Arguments:
* 0: Mode <NUMBER>
*
* Return Value:
* None
*
* Example:
* [2] call ace_medical_blood_fnc_init
*
* Public: No
*/
params ["_mode"];
// Exit if setting is refreshed to the same value
if (!isNil QGVAR(currentSetup) && {_mode == GVAR(currentSetup)}) exitWith {
TRACE_2("Setting refreshed to current setup",GVAR(currentSetup),_mode);
};
// Track this new configuration that will be set up
GVAR(currentSetup) = _mode;
// Delete current state machine if it exists
if (!isNil QGVAR(stateMachine)) then {
GVAR(stateMachine) call CBA_statemachine_fnc_delete;
GVAR(stateMachine) = nil;
};
// Remove wound received if it was previously added
if (!isNil QGVAR(woundReceivedEH)) then {
[QEGVAR(medical,woundReceived), GVAR(woundReceivedEH)] call CBA_fnc_removeEventHandler;
GVAR(woundReceivedEH) = nil;
};
// Don't need to set up anything if blood is disabled or players only on a non-player machine
if (_mode == BLOOD_DISABLED || {_mode == BLOOD_ONLY_PLAYERS && {!hasInterface}}) exitWith {
TRACE_1("Mode does not require any setup",_mode);
};
private _listCode = if (_mode == BLOOD_ONLY_PLAYERS) then {
// ACE_player is the only possible local player
{
if (alive ACE_player) then {
[ACE_player]
} else {
[]
};
}
} else {
// Filter all local units
EFUNC(common,getLocalUnits)
};
GVAR(stateMachine) = [_listCode, true] call CBA_statemachine_fnc_create;
[GVAR(stateMachine), LINKFUNC(onBleeding), {}, {}, "Bleeding"] call CBA_statemachine_fnc_addState;
GVAR(woundReceivedEH) = [QEGVAR(medical,woundReceived), FUNC(handleWoundReceived)] call CBA_fnc_addEventHandler;
TRACE_3("Set up state machine and wounds event",_mode,GVAR(stateMachine),GVAR(woundReceivedEH));

View File

@ -1,13 +1,13 @@
#include "script_component.hpp" #include "script_component.hpp"
/* /*
* Author: Glowbal * Author: Glowbal
* Check if is bleeding * Checks if the given unit is bleeding. Handles both ACE Medical and Vanilla.
* *
* Arguments: * Arguments:
* 0: unit <TYPE> * 0: Unit <OBJECT>
* *
* Return Value: * Return Value:
* is Bleeding <BOOL> * Is Bleeding <BOOL>
* *
* Example: * Example:
* [player] call ace_medical_blood_fnc_isBleeding * [player] call ace_medical_blood_fnc_isBleeding

View File

@ -1,13 +1,14 @@
#include "script_component.hpp" #include "script_component.hpp"
/* /*
* Author: Glowbal * Author: Glowbal
* handle bleeding state (state machine) * Handles periodically creating blood for a bleeding unit.
* Called from the medical_blood state machine.
* *
* Arguments: * Arguments:
* 0: unit <TYPE> * 0: Unit <OBJECT>
* *
* Return Value: * Return Value:
* is Bleeding <BOOL> * None
* *
* Example: * Example:
* [player] call ace_medical_blood_fnc_onBleeding * [player] call ace_medical_blood_fnc_onBleeding
@ -17,20 +18,20 @@
params ["_unit"]; params ["_unit"];
if (!([_unit] call FUNC(isBleeding))) exitWith {}; // Nothing to do if unit is not bleeding
if (((vehicle _unit) != _unit) && {!((vehicle _unit) isKindOf "StaticWeapon")}) exitWith {}; // Don't bleed on ground if mounted if !(_unit call FUNC(isBleeding)) exitWith {};
// Don't bleed on the ground if in a vehicle
if (vehicle _unit != _unit && {!(vehicle _unit isKindOf "StaticWeapon")}) exitWith {};
if (CBA_missionTime > (_unit getVariable [QGVAR(nextTime), -10])) then { if (CBA_missionTime > (_unit getVariable [QGVAR(nextTime), -10])) then {
private _bloodLoss = (if (GVAR(useAceMedical)) then {GET_BLOOD_LOSS(_unit) * 2.5} else {getDammage _unit * 2}) min 6; private _bloodLoss = (if (GVAR(useAceMedical)) then {GET_BLOOD_LOSS(_unit) * 2.5} else {getDammage _unit * 2}) min 6;
TRACE_2("",_unit,_bloodLoss);
_unit setVariable [QGVAR(nextTime), CBA_missionTime + 8 + random 2 - _bloodLoss]; _unit setVariable [QGVAR(nextTime), CBA_missionTime + 8 + random 2 - _bloodLoss];
TRACE_2("Creating blood drop for bleeding unit",_unit,_bloodLoss);
private _position = getPosASL _unit; private _position = getPosASL _unit;
_position = _position vectorAdd [ _position = _position vectorAdd [random 0.4 - 0.2, random 0.4 - 0.2, 0];
random 0.4 - 0.2,
random 0.4 - 0.2,
0
];
_position set [2, 0]; _position set [2, 0];
private _bloodDrop = ["blooddrop_1", "blooddrop_2", "blooddrop_3", "blooddrop_4"] select floor (_bloodLoss min 3); private _bloodDrop = ["blooddrop_1", "blooddrop_2", "blooddrop_3", "blooddrop_4"] select floor (_bloodLoss min 3);

View File

@ -1,18 +1,18 @@
#include "script_component.hpp" #include "script_component.hpp"
/* /*
* Author: Sickboy * Author: Sickboy
* Spurt blood on the ground * Spurts blood on the ground based on the direction and damage.
* *
* Arguments: * Arguments:
* 0: unit <OBJECT> * 0: Unit <OBJECT>
* 1: direction <NUMBER> * 1: Direction <NUMBER>
* 2: damage <NUMBER> * 2: Damage <NUMBER>
* *
* Return Value: * Return Value:
* None * None
* *
* Example: * Example:
* [UNIT, random 360, 1] call ace_medical_blood_fnc_spurt * [player, random 360, 1] call ace_medical_blood_fnc_spurt
* *
* Public: No * Public: No
*/ */
@ -21,20 +21,20 @@
#define DISTANCE_BETWEEN_DROPS 0.20 #define DISTANCE_BETWEEN_DROPS 0.20
#define OFFSET 0.25 #define OFFSET 0.25
params ["_unit", "_dir", "_damage"]; params ["_unit", "_direction", "_damage"];
private _distanceBetweenDrops = DISTANCE_BETWEEN_DROPS * _damage; private _distanceBetweenDrops = DISTANCE_BETWEEN_DROPS * _damage;
private _offset = OFFSET + _distanceBetweenDrops; private _offset = OFFSET + _distanceBetweenDrops;
private _pos = _unit getPos [_offset, _dir]; private _position = _unit getPos [_offset, _direction];
["blooddrop_2", _pos, _dir] call FUNC(createBlood); ["blooddrop_2", _position, _direction] call FUNC(createBlood);
private _dropAmount = ceil (MAXIMUM_DROPS * _damage); private _dropAmount = ceil (MAXIMUM_DROPS * _damage);
TRACE_2("spurt blood",_dropAmount,_damage); TRACE_2("Spurting blood",_dropAmount,_damage);
if (_dropAmount > 1) then { if (_dropAmount > 1) then {
for "_i" from 2 to _dropAmount do { for "_i" from 2 to _dropAmount do {
_pos = _pos getPos [_distanceBetweenDrops, _dir]; _position = _position getPos [_distanceBetweenDrops, _direction];
["blooddrop_1", _pos, _dir] call FUNC(createBlood); ["blooddrop_1", _position, _direction] call FUNC(createBlood);
}; };
}; };

View File

@ -1,13 +1,27 @@
// CBA Settings [ADDON: ace_medical_blood]: [
QGVAR(enabledFor),
private _categoryArray = [LELSTRING(medical,Category), LLSTRING(subCategory)]; "LIST",
[LSTRING(EnabledFor_DisplayName), LSTRING(EnabledFor_Description)],
[ELSTRING(medical,Category), LSTRING(SubCategory)],
[[BLOOD_DISABLED, BLOOD_ONLY_PLAYERS, BLOOD_ENABLED], [ELSTRING(Common,Disabled), LSTRING(OnlyPlayers), ELSTRING(Common,Enabled)], 2],
true,
LINKFUNC(init)
] call CBA_settings_fnc_init;
[ [
QGVAR(enabledFor), "LIST", QGVAR(maxBloodObjects),
[LSTRING(MedicalBloodSettings_enabledFor_DisplayName), LSTRING(MedicalBloodSettings_enabledFor_Description)], "LIST",
_categoryArray, [LSTRING(MaxBloodObjects_DisplayName), LSTRING(MaxBloodObjects_Description)],
[[0,1,2],[LELSTRING(Common,Disabled),LLSTRING(enabledFor_OnlyPlayers),LELSTRING(Common,Enabled)],2], // [values, titles, defaultIndex] [ELSTRING(medical,Category), LSTRING(SubCategory)],
true, // isGlobal [[50, 100, 200, 300, 400, 500, 1000, 2000, 3000, 4000, 5000], [/* settings function will auto create names */], 5],
{[QGVAR(enabledFor), _this] call EFUNC(common,cbaSettings_settingChanged)}, true
true // Needs mission restart ] call CBA_settings_fnc_init;
[
QGVAR(bloodLifetime),
"TIME",
[LSTRING(BloodLifetime_DisplayName), LSTRING(BloodLifetime_Description)],
[ELSTRING(medical,Category), LSTRING(SubCategory)],
[1, 3600, 900],
true
] call CBA_settings_fnc_init; ] call CBA_settings_fnc_init;

View File

@ -2,7 +2,7 @@
#define COMPONENT_BEAUTIFIED Medical Blood #define COMPONENT_BEAUTIFIED Medical Blood
#include "\z\ace\addons\main\script_mod.hpp" #include "\z\ace\addons\main\script_mod.hpp"
// #define DEBUG_ENABLED_MEDICAL_BLOOD // #define DEBUG_MODE_FULL
// #define DISABLE_COMPILE_CACHE // #define DISABLE_COMPILE_CACHE
// #define ENABLE_PERFORMANCE_COUNTERS // #define ENABLE_PERFORMANCE_COUNTERS
@ -17,5 +17,6 @@
#include "\z\ace\addons\medical_engine\script_macros_medical.hpp" #include "\z\ace\addons\medical_engine\script_macros_medical.hpp"
#include "\z\ace\addons\main\script_macros.hpp" #include "\z\ace\addons\main\script_macros.hpp"
#define MAX_BLOOD_OBJECTS 500 #define BLOOD_DISABLED 0
#define BLOOD_OBJECT_LIFETIME 900 #define BLOOD_ONLY_PLAYERS 1
#define BLOOD_ENABLED 2

View File

@ -1,25 +1,20 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project name="ACE"> <Project name="ACE">
<Package name="medical_blood"> <Package name="Medical_Blood">
<Key ID="STR_ACE_medical_blood_subCategory"> <Key ID="STR_ACE_Medical_Blood_SubCategory">
<English>Bleeding Effect</English> <English>Blood</English>
<German>Blutungseffekt</German> <French>Sang</French>
<Japanese>出血中の効果</Japanese> <Spanish>Sangre</Spanish>
<Russian>Эффекты кровотечения</Russian> <Italian>Sangue</Italian>
<Polish>Krew</Polish>
<Russian>Кровь</Russian>
<German>Blut</German>
<Czech>Krev</Czech>
<Portuguese>Sangue</Portuguese>
<Korean>혈흔</Korean>
<Japanese></Japanese>
</Key> </Key>
<Key ID="STR_ACE_medical_blood_enabledFor_OnlyPlayers"> <Key ID="STR_ACE_Medical_Blood_EnabledFor_DisplayName">
<English>Only Players</English>
<Japanese>プレイヤーのみ</Japanese>
<German>Nur Spieler</German>
<Korean>오직 플레이어만</Korean>
<Polish>Tylko gracze</Polish>
<French>Joueurs seulement</French>
<Italian>Solo Giocatori</Italian>
<Chinesesimp>只有玩家</Chinesesimp>
<Chinese>只有玩家</Chinese>
<Russian>Только игроки</Russian>
</Key>
<Key ID="STR_ACE_medical_blood_MedicalBloodSettings_enabledFor_DisplayName">
<English>Enable Blood Drops</English> <English>Enable Blood Drops</English>
<Japanese>血痕を有効化</Japanese> <Japanese>血痕を有効化</Japanese>
<German>Aktiviere Blutspritzer</German> <German>Aktiviere Blutspritzer</German>
@ -31,17 +26,32 @@
<Chinese>開啟血液滴落效果</Chinese> <Chinese>開啟血液滴落效果</Chinese>
<Russian>Разрешить капли крови</Russian> <Russian>Разрешить капли крови</Russian>
</Key> </Key>
<Key ID="STR_ACE_medical_blood_MedicalBloodSettings_enabledFor_Description"> <Key ID="STR_ACE_Medical_Blood_EnabledFor_Description">
<English>Enable or disable Blood Drops created on bleeding and taking damage</English> <English>Enables the creation of blood drops when units are bleeding or take damage.</English>
<Japanese>ダメージを受けたり、出血していると出る血痕の有効か無効化</Japanese> </Key>
<German>Aktiviere oder deaktiviere Blutspritzer, die durch Blutungen oder bei Schadensnahme entstehen.</German> <Key ID="STR_ACE_Medical_Blood_MaxBloodObjects_DisplayName">
<Polish>Włącz lub wyłącz pozostawianie śladów krwi na ziemi kiedy postać odnosi obrażenia bądź krwawi</Polish> <English>Max Blood Objects</English>
<French>(Dés)active les gouttes de sang lors d'un saignement ou de blessure</French> </Key>
<Italian>Abilita o disabilita la Perdite di Sangue create sanguinando e prendendo danno</Italian> <Key ID="STR_ACE_Medical_Blood_MaxBloodObjects_Description">
<Chinesesimp>开启后, 会让受伤时伤口有血液滴落的效果</Chinesesimp> <English>Sets the maximum number of blood drop objects which can be spawned, excessive amounts can cause FPS lag.</English>
<Chinese>開啟後, 會讓受傷時傷口有血液滴落的效果</Chinese> </Key>
<Korean>출혈이나 부상을 입었을 때, 떨어지는 혈액을 활성화 하거나 비활성화 합니다.</Korean> <Key ID="STR_ACE_Medical_Blood_BloodLifetime_DisplayName">
<Russian>Включает или отключает капли крови при кровотечении и получении урона</Russian> <English>Blood Lifetime</English>
</Key>
<Key ID="STR_ACE_Medical_Blood_BloodLifetime_Description">
<English>Controls the lifetime of blood drop objects.</English>
</Key>
<Key ID="STR_ACE_Medical_Blood_OnlyPlayers">
<English>Only Players</English>
<Japanese>プレイヤーのみ</Japanese>
<German>Nur Spieler</German>
<Korean>오직 플레이어만</Korean>
<Polish>Tylko gracze</Polish>
<French>Joueurs seulement</French>
<Italian>Solo Giocatori</Italian>
<Chinesesimp>只有玩家</Chinesesimp>
<Chinese>只有玩家</Chinese>
<Russian>Только игроки</Russian>
</Key> </Key>
</Package> </Package>
</Project> </Project>

View File

@ -1,23 +1,17 @@
// CBA Settings [ADDON: ace_medical_damage]:
private _categoryArray = [LELSTRING(medical,Category), LLSTRING(subCategory)];
[ [
QEGVAR(medical,playerDamageThreshold), "SLIDER", QEGVAR(medical,playerDamageThreshold),
[LSTRING(playerDamageThreshold_DisplayName), LSTRING(playerDamageThreshold_Description)], "SLIDER",
_categoryArray, [LSTRING(PlayerDamageThreshold_DisplayName), LSTRING(PlayerDamageThreshold_Description)],
[0,25,1,2], // [min, max, default value, trailing decimals (-1 for whole numbers only)] ELSTRING(medical,Category),
true, // isGlobal [0, 25, 1, 2],
{[QEGVAR(medical,playerDamageThreshold), _this] call EFUNC(common,cbaSettings_settingChanged)}, true
true // Needs mission restart
] call CBA_settings_fnc_init; ] call CBA_settings_fnc_init;
[ [
QEGVAR(medical,AIDamageThreshold), "SLIDER", QEGVAR(medical,AIDamageThreshold),
"SLIDER",
[LSTRING(AIDamageThreshold_DisplayName), LSTRING(AIDamageThreshold_Description)], [LSTRING(AIDamageThreshold_DisplayName), LSTRING(AIDamageThreshold_Description)],
_categoryArray, ELSTRING(medical,Category),
[0,25,1,2], // [min, max, default value, trailing decimals (-1 for whole numbers only)] [0, 25, 1, 2],
true, // isGlobal true
{[QEGVAR(medical,AIDamageThreshold), _this] call EFUNC(common,cbaSettings_settingChanged)},
true // Needs mission restart
] call CBA_settings_fnc_init; ] call CBA_settings_fnc_init;

View File

@ -1,78 +1,18 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project name="ACE"> <Project name="ACE">
<Package name="Medical_Damage"> <Package name="Medical_Damage">
<Container name="Settings"> <Key ID="STR_ACE_Medical_Damage_PlayerDamageThreshold_DisplayName">
<Key ID="STR_ACE_Medical_damage_subCategory"> <English>Player Critical Damage Threshold</English>
<English>Damage Threshold</English>
<German>Schaden</German>
<Japanese>損傷のしきい値</Japanese>
<Russian>Порог повреждения</Russian>
</Key> </Key>
<Key ID="STR_ACE_Medical_damage_playerDamageThreshold_DisplayName"> <Key ID="STR_ACE_Medical_Damage_PlayerDamageThreshold_Description">
<English>Player Damage</English> <English>Sets the amount of damage a player can receive before going unconscious.</English>
<Russian>Урон игроку</Russian>
<Polish>Próg obrażeń graczy</Polish>
<Spanish>Daño de jugador</Spanish>
<German>Spielerschaden</German>
<Czech>Poškození hráče</Czech>
<Portuguese>Dano do jogador</Portuguese>
<French>Dégats du joueur</French>
<Hungarian>Játékos sérülés</Hungarian>
<Italian>Danno Giocatore</Italian>
<Japanese>プレイヤーへの損傷</Japanese>
<Korean>플레이어 부상</Korean>
<Chinesesimp>玩家伤害</Chinesesimp>
<Chinese>玩家傷害</Chinese>
</Key> </Key>
<Key ID="STR_ACE_Medical_damage_playerDamageThreshold_Description"> <Key ID="STR_ACE_Medical_Damage_AIDamageThreshold_DisplayName">
<English>What is the damage a player can take before being killed?</English> <English>AI Critical Damage Threshold</English>
<Russian>Какой уровень урона необходим, чтобы убить игрока?</Russian>
<Polish>Jaki jest próg obrażeń, jakie gracz może otrzymać zanim zostanie zabity?</Polish>
<Spanish>¿Cuál es el daño que un jugador puede sufrir antes de morir?</Spanish>
<German>Wie viel Schaden kann ein Spieler erleiden, bevor er getötet wird?</German>
<Czech>Jaké poškození může hráč dostat než bude zabit?</Czech>
<Portuguese>Qal é o dano que um jogador pode sofrer antes de morrer?</Portuguese>
<French>Quels dégâts peut subir un joueur avant d'être tué</French>
<Hungarian>Mennyi sérülést szenvedhet el egy játékos, mielőtt meghal?</Hungarian>
<Italian>Quanto è il danno che un giocatore può sostenere prima di essere ucciso?</Italian>
<Japanese>プレイヤーが死に始める前に損傷を受けるようにしますか?</Japanese>
<Korean>얼마정도의 부상을 플레이어가 죽기 전까지 버틸 수 있습니까?</Korean>
<Chinesesimp>玩家死亡前所能承受的伤害程度</Chinesesimp>
<Chinese>玩家死亡前所能承受的傷害程度</Chinese>
</Key> </Key>
<Key ID="STR_ACE_Medical_damage_AIDamageThreshold_DisplayName"> <Key ID="STR_ACE_Medical_Damage_AIDamageThreshold_Description">
<English>AI Damage</English> <English>Sets the amount of damage an AI unit can receive before going unconscious.</English>
<Russian>Урон ботам</Russian>
<Polish>Próg obrażeń AI</Polish>
<Spanish>Daño IA</Spanish>
<German>KI-Schaden</German>
<Czech>Poškození AI</Czech>
<Portuguese>Dano da IA</Portuguese>
<French>Dégâts des IA</French>
<Hungarian>AI sérülés</Hungarian>
<Italian>Danno AI</Italian>
<Japanese>AI への損傷</Japanese>
<Korean>인공지능 부상</Korean>
<Chinesesimp>AI伤害</Chinesesimp>
<Chinese>AI傷害</Chinese>
</Key> </Key>
<Key ID="STR_ACE_Medical_damage_AIDamageThreshold_Description">
<English>What is the damage an AI can take before being killed?</English>
<Russian>Какой уровень урона необходим, чтобы убить бота?</Russian>
<Polish>Jaki jest próg obrażeń, jakie AI może otrzymać zanim zostanie zabite?</Polish>
<Spanish>¿Cuál es el daño que la IA puede sufrir antes de morir?</Spanish>
<German>Wie viel Schaden kann eine KI erleiden, bis sie getötet wird?</German>
<Czech>Jaké poškození může AI dostat než bude zabito?</Czech>
<Portuguese>Qual é o dano que uma IA pode sofrer antes de morrer?</Portuguese>
<French>Quels dégâts peut subir une IA avant d'être tuée</French>
<Hungarian>Mennyi sérülést szenvedhet el egy AI, mielőtt meghal?</Hungarian>
<Italian>Quanto è il danno che un'IA può sostenere prima di essere uccisa?</Italian>
<Japanese>AI が死に始める前に損傷を受けるようにしますか?</Japanese>
<Korean>얼마정도의 부상을 인공지능이 죽기 전까지 버틸 수 있습니까?</Korean>
<Chinesesimp>AI 死亡前所能承受的伤害程度</Chinesesimp>
<Chinese>AI 死亡前所能承受的傷害程度</Chinese>
</Key>
</Container>
<Key ID="STR_ACE_Medical_Damage_Abrasion"> <Key ID="STR_ACE_Medical_Damage_Abrasion">
<English>Scrape</English> <English>Scrape</English>
<German>Kratzer</German> <German>Kratzer</German>

View File

@ -1,4 +1,5 @@
class ACE_Settings { class ACE_Settings {
/*
// Not currently used anywhere // Not currently used anywhere
class GVAR(enableScreams) { class GVAR(enableScreams) {
category = ECSTRING(medical,Category_Medical); category = ECSTRING(medical,Category_Medical);
@ -7,4 +8,5 @@ class ACE_Settings {
typeName = "BOOL"; typeName = "BOOL";
value = 1; value = 1;
}; };
*/
}; };

View File

@ -1,21 +1,16 @@
// CBA Settings [ADDON: ace_medical_feedback]:
private _categoryArray = [LELSTRING(medical,Category), LLSTRING(subCategory)];
[ [
QGVAR(painEffectType), QGVAR(painEffectType),
"LIST", "LIST",
[localize LSTRING(painEffectType), "Selects the used pain effect type"], //@todo [LSTRING(PainEffectType_DisplayName), LSTRING(PainEffectType_Description)],
_categoryArray, [ELSTRING(medical,Category), LSTRING(SubCategory)],
[ [[0, 1], [LSTRING(PainEffectType_WhiteFlashing), LSTRING(PainEffectType_PulsingBlur)], 0],
[0, 1],
[LLSTRING(painEffectType_whiteFlashing), LLSTRING(painEffectType_pulsingBlur)],
0
],
false, false,
{ {
if (isNil QGVAR(ppPain)) exitWith {TRACE_1("Before Post-Init",_this)}; if (isNil QGVAR(ppPain)) exitWith {
TRACE_1("reseting ppEffect type",_this); TRACE_1("painEffectType setting - before postInit",_this);
};
TRACE_1("painEffectType setting - resetting effect",_this);
[true] call FUNC(initEffects); [true] call FUNC(initEffects);
} }
] call CBA_Settings_fnc_init; ] call CBA_Settings_fnc_init;

View File

@ -1,13 +1,42 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project name="ACE"> <Project name="ACE">
<Package name="Medical_Feedback"> <Package name="Medical_Feedback">
<Container name="Settings"> <Key ID="STR_ACE_Medical_Feedback_SubCategory">
<Key ID="STR_ACE_Medical_feedback_subCategory">
<English>Feedback</English> <English>Feedback</English>
<German>Feedback</German> <German>Feedback</German>
<Japanese>フィードバック</Japanese> <Japanese>フィードバック</Japanese>
<Russian>Реакция на ранения</Russian> <Russian>Реакция на ранения</Russian>
</Key> </Key>
<Key ID="STR_ACE_Medical_Feedback_PainEffectType_DisplayName">
<English>Pain Effect Type</English>
<German>Schmerzeffekt-Typ</German>
<Polish>Rodzaj efektu bólu</Polish>
<Russian>Визуальный эффект боли</Russian>
<Italian>Pain Effect Type</Italian>
<Spanish>Tipo de efecto de dolor</Spanish>
<French>Type d'effet de douleur</French>
<Hungarian>Fájdalom-effekt típusa</Hungarian>
<Portuguese>Tipo do efeito de dor</Portuguese>
<Czech>Typ bolesti - efekt</Czech>
<Japanese>痛み効果の種類</Japanese>
<Korean>고통 효과 종류</Korean>
</Key>
<Key ID="STR_ACE_Medical_Feedback_PainEffectType_Description">
<English>Selects the used pain effect type.</English>
</Key>
<Key ID="STR_ACE_Medical_Feedback_PainEffectType_WhiteFlashing">
<English>White Flashing</English>
<German>Weißes blinken</German>
<Japanese>白く点滅</Japanese>
<Russian>Белые вспышки</Russian>
</Key>
<Key ID="STR_ACE_Medical_Feedback_PainEffectType_PulsingBlur">
<English>Pulsing Blur</English>
<German>Wiederkehrende Unschärfe</German>
<Japanese>ボケの強弱</Japanese>
<Russian>Пульсирующее размытие</Russian>
</Key>
<Container name="Settings">
<Key ID="STR_ACE_Medical_feedback_enableScreams_DisplayName"> <Key ID="STR_ACE_Medical_feedback_enableScreams_DisplayName">
<English>Enable Screams</English> <English>Enable Screams</English>
<Russian>Включить крики</Russian> <Russian>Включить крики</Russian>
@ -41,31 +70,5 @@
<Chinese>啟用傷者的尖叫聲</Chinese> <Chinese>啟用傷者的尖叫聲</Chinese>
</Key> </Key>
</Container> </Container>
<Key ID="STR_ACE_Medical_feedback_painEffectType">
<English>Pain Effect Type</English>
<German>Schmerzeffekt-Typ</German>
<Polish>Rodzaj efektu bólu</Polish>
<Russian>Визуальный эффект боли</Russian>
<Italian>Pain Effect Type</Italian>
<Spanish>Tipo de efecto de dolor</Spanish>
<French>Type d'effet de douleur</French>
<Hungarian>Fájdalom-effekt típusa</Hungarian>
<Portuguese>Tipo do efeito de dor</Portuguese>
<Czech>Typ bolesti - efekt</Czech>
<Japanese>痛み効果の種類</Japanese>
<Korean>고통 효과 종류</Korean>
</Key>
<Key ID="STR_ACE_Medical_feedback_painEffectType_whiteFlashing">
<English>White flashing</English>
<German>Weißes blinken</German>
<Japanese>白く点滅</Japanese>
<Russian>Белые вспышки</Russian>
</Key>
<Key ID="STR_ACE_Medical_feedback_painEffectType_pulsingBlur">
<English>Pulsing blur</English>
<German>Wiederkehrende Unschärfe</German>
<Japanese>ボケの強弱</Japanese>
<Russian>Пульсирующее размытие</Russian>
</Key>
</Package> </Package>
</Project> </Project>

View File

@ -1,11 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project name="ACE"> <Project name="ACE">
<Package name="Medical GUI"> <Package name="Medical GUI">
<Key ID="STR_ACE_Medical_GUI_Category"> <Key ID="STR_ACE_Medical_GUI_SubCategory">
<English>ACE Medical GUI</English> <English>GUI</English>
<German>Sanitätsmenü</German> <Japanese>GUI</Japanese>
<Japanese>ACE 医療 GUI</Japanese>
<Russian>ACE Медицина - Интерфейс</Russian>
</Key> </Key>
<Key ID="STR_ACE_Medical_GUI_EnableActions_DisplayName"> <Key ID="STR_ACE_Medical_GUI_EnableActions_DisplayName">
<English>Enable Medical Actions</English> <English>Enable Medical Actions</English>

View File

@ -1,14 +0,0 @@
class ACE_Settings {
class GVAR(fatalInjuryCondition) {
movedToSQF = 1;
};
class GVAR(fatalInjuryConditionAI) {
movedToSQF = 1;
};
class GVAR(unconsciousConditionAI) {
movedToSQF = 1;
};
class GVAR(cardiacArrestTime) {
movedToSQF = 1;
};
};

View File

@ -47,7 +47,7 @@ class ACE_Medical_StateMachine {
onStateEntered = QUOTE([ARR_2(_this,(true))] call EFUNC(medical_status,setUnconscious)); onStateEntered = QUOTE([ARR_2(_this,(true))] call EFUNC(medical_status,setUnconscious));
class DeathAI { class DeathAI {
targetState = "Dead"; targetState = "Dead";
condition = QUOTE(!isPlayer _this && {GVAR(unconsciousConditionAI)}); condition = QUOTE(!GVAR(AIUnconsciousness) && {!isPlayer _this});
}; };
class WakeUp { class WakeUp {
targetState = "Injured"; targetState = "Injured";

View File

@ -14,6 +14,5 @@ class CfgPatches {
}; };
}; };
#include "ACE_Settings.hpp"
#include "Statemachine.hpp" #include "Statemachine.hpp"
#include "CfgEventHandlers.hpp" #include "CfgEventHandlers.hpp"

View File

@ -18,8 +18,7 @@
params ["_unit"]; params ["_unit"];
// If the unit died the loop is finished // If the unit died the loop is finished
if (!alive _unit) exitWith {}; if (!alive _unit || {!local _unit}) exitWith {};
if (!local _unit) exitWith {};
[_unit] call EFUNC(medical_vitals,handleUnitVitals); [_unit] call EFUNC(medical_vitals,handleUnitVitals);
@ -28,14 +27,22 @@ if (_painLevel > 0) then {
[QEGVAR(medical,moan), [_unit, _painLevel]] call CBA_fnc_localEvent; [QEGVAR(medical,moan), [_unit, _painLevel]] call CBA_fnc_localEvent;
}; };
// Handle spontaneous wakeup from unconsciousness // Handle spontaneous wake up from unconsciousness
if (EGVAR(medical,spontaneousWakeUpChance) > 0) then { if (EGVAR(medical,spontaneousWakeUpChance) > 0) then {
if (_unit call EFUNC(medical_status,hasStableVitals)) then { if (_unit call EFUNC(medical_status,hasStableVitals)) then {
private _lastWakeUpCheck = _unit getVariable [QEGVAR(medical,lastWakeUpCheck), 0]; private _lastWakeUpCheck = _unit getVariable QEGVAR(medical,lastWakeUpCheck);
// Handle setting being changed mid-mission and still properly check
// already unconscious units, should handle locality changes as well
if (isNil "_lastWakeUpCheck") exitWith {
_unit setVariable [QGVAR(medical,lastWakeUpCheck), CBA_missionTime];
};
if (CBA_missionTime - _lastWakeUpCheck > SPONTANEOUS_WAKE_UP_INTERVAL) then { if (CBA_missionTime - _lastWakeUpCheck > SPONTANEOUS_WAKE_UP_INTERVAL) then {
TRACE_2("Checking for wake up",_unit,EGVAR(medical,spontaneousWakeUpChance)); TRACE_2("Checking for wake up",_unit,EGVAR(medical,spontaneousWakeUpChance));
_unit setVariable [QEGVAR(medical,lastWakeUpCheck), CBA_missionTime]; _unit setVariable [QEGVAR(medical,lastWakeUpCheck), CBA_missionTime];
if ((random 1) < EGVAR(medical,spontaneousWakeUpChance)) then {
if (random 1 <= EGVAR(medical,spontaneousWakeUpChance)) then {
TRACE_1("Spontaneous wake up!",_unit); TRACE_1("Spontaneous wake up!",_unit);
[QEGVAR(medical,WakeUp), _unit] call CBA_fnc_localEvent; [QEGVAR(medical,WakeUp), _unit] call CBA_fnc_localEvent;
}; };

View File

@ -1,43 +1,35 @@
// CBA Settings [ADDON: ace_medical_statemachine]:
private _categoryArray = [LELSTRING(medical,Category), LLSTRING(subCategory)];
[ [
QGVAR(fatalInjuryCondition), "LIST", QGVAR(fatalInjuryCondition),
[LSTRING(fatalInjuryCondition_DisplayName), LSTRING(fatalInjuryCondition_Description)], "LIST",
_categoryArray, [LSTRING(FatalInjuryCondition_DisplayName), LSTRING(FatalInjuryCondition_Description)],
[[0,1,2],["Always","In Cardiac Arrest","Never"],0], // [values, titles, defaultIndex] //ToDo: Localize [ELSTRING(medical,Category), LSTRING(SubCategory)],
true, // isGlobal [[0, 1, 2], [ELSTRING(common,Always), LSTRING(InCardiacArrest), ELSTRING(common,Never)], 0],
{[QGVAR(fatalInjuryCondition), _this] call EFUNC(common,cbaSettings_settingChanged)}, true
true // Needs mission restart
] call CBA_settings_fnc_init; ] call CBA_settings_fnc_init;
[ [
QGVAR(fatalInjuryConditionAI), "CHECKBOX", QGVAR(fatalInjuryConditionAI),
[LSTRING(fatalInjuryConditionAI_DisplayName), LSTRING(fatalInjuryConditionAI_Description)], "CHECKBOX",
_categoryArray, [LSTRING(FatalInjuryConditionAI_DisplayName), LSTRING(FatalInjuryConditionAI_Description)],
true, // default value [ELSTRING(medical,Category), LSTRING(SubCategory)],
true, // isGlobal true,
{[QGVAR(fatalInjuryConditionAI), _this] call EFUNC(common,cbaSettings_settingChanged)}, true
true // Needs mission restart
] call CBA_settings_fnc_init; ] call CBA_settings_fnc_init;
[ [
QGVAR(unconsciousConditionAI), "CHECKBOX", QGVAR(AIUnconsciousness),
[LSTRING(unconsciousConditionAI_DisplayName), LSTRING(unconsciousConditionAI_Description)], "CHECKBOX",
_categoryArray, [LSTRING(AIUnconsciousness_DisplayName), LSTRING(AIUnconsciousness_Description)],
true, // default value [ELSTRING(medical,Category), LSTRING(SubCategory)],
true, // isGlobal true,
{[QGVAR(unconsciousConditionAI), _this] call EFUNC(common,cbaSettings_settingChanged)}, true
true // Needs mission restart
] call CBA_settings_fnc_init; ] call CBA_settings_fnc_init;
[ [
QGVAR(cardiacArrestTime), "SLIDER", QGVAR(cardiacArrestTime),
[LSTRING(cardiacArrestTime_DisplayName), LSTRING(cardiacArrestTime_Description)], "TIME",
_categoryArray, [LSTRING(CardiacArrestTime_DisplayName), LSTRING(CardiacArrestTime_Description)],
[1,3600,30,0], // [min, max, default value, trailing decimals (-1 for whole numbers only)] [ELSTRING(medical,Category), LSTRING(SubCategory)],
true, // isGlobal [1, 3600, 30],
{[QGVAR(cardiacArrestTime), _this] call EFUNC(common,cbaSettings_settingChanged)}, true
true // Needs mission restart
] call CBA_settings_fnc_init; ] call CBA_settings_fnc_init;

View File

@ -1,68 +1,37 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project name="ACE"> <Project name="ACE">
<Package name="Medical_Statemachine"> <Package name="Medical_Statemachine">
<Container name="Settings"> <Key ID="STR_ACE_Medical_Statemachine_SubCategory">
<Key ID="STR_ACE_Medical_statemachine_subCategory">
<English>States</English> <English>States</English>
<German>Zustände</German> <German>Zustände</German>
<Japanese>状態</Japanese> <Japanese>状態</Japanese>
<Russian>Состояния</Russian> <Russian>Состояния</Russian>
</Key> </Key>
<Key ID="STR_ACE_Medical_statemachine_fatalInjuryCondition_DisplayName"> <Key ID="STR_ACE_Medical_Statemachine_FatalInjuryCondition_DisplayName">
<English>Fatal Injury Player</English> <English>Fatal Injury Player</English>
<German>Tödliche Spielerverletzungen</German> <German>Tödliche Spielerverletzungen</German>
<Japanese>致命傷プレイヤー</Japanese> <Japanese>致命傷プレイヤー</Japanese>
<Russian>Смертельные ранения игрока</Russian> <Russian>Смертельные ранения игрока</Russian>
</Key> </Key>
<Key ID="STR_ACE_Medical_statemachine_fatalInjuryCondition_Description"> <Key ID="STR_ACE_Medical_Statemachine_FatalInjuryCondition_Description">
<English>Defines when Player can receive a fatal injury</English> <English>Controls when a player can receive a fatal injury.</English>
<German>Definiert wann ein Spieler tödliche Verletzungen bekommen kann</German> <German>Definiert wann ein Spieler tödliche Verletzungen bekommen kann</German>
<Japanese>プレイヤーが致命傷から蘇生できるかどうか決定します</Japanese> <Japanese>プレイヤーが致命傷から蘇生できるかどうか決定します</Japanese>
<Russian>Определяет, когда игрок может получить смертельное ранение</Russian> <Russian>Определяет, когда игрок может получить смертельное ранение</Russian>
</Key> </Key>
<Key ID="STR_ACE_Medical_statemachine_fatalInjuryConditionAI_DisplayName"> <Key ID="STR_ACE_Medical_Statemachine_FatalInjuryConditionAI_DisplayName">
<English>Instant death AI</English> <English>AI Instant Death</English>
<German>Direkter Tod KI</German> <German>Direkter Tod KI</German>
<Japanese>AI の即死</Japanese> <Japanese>AI の即死</Japanese>
<Russian>Мгновенная смерть ИИ</Russian> <Russian>Мгновенная смерть ИИ</Russian>
</Key> </Key>
<Key ID="STR_ACE_Medical_statemachine_fatalInjuryConditionAI_Description"> <Key ID="STR_ACE_Medical_Statemachine_FatalInjuryConditionAI_Description">
<English>Defines if AI will be able to die instantly</English> <English>Controls if AI units are able to die instantly.</English>
<German>Legt fest, ob eine KI direkt sterben kann</German> <German>Legt fest, ob eine KI direkt sterben kann</German>
<Japanese>AI が即死できるかどうか決定します</Japanese> <Japanese>AI が即死できるかどうか決定します</Japanese>
<Russian>Определяет, сможет ли ИИ мгновенно умереть</Russian> <Russian>Определяет, сможет ли ИИ мгновенно умереть</Russian>
</Key> </Key>
<Key ID="STR_ACE_Medical_statemachine_unconsciousConditionAI_DisplayName"> <Key ID="STR_ACE_Medical_Statemachine_AIUnconsciousness_DisplayName">
<English>Forbid unconscious AI</English>
<German>Verhindere KI-Bewusstlosigkeit</German>
<Japanese>AI の気絶を禁止</Japanese>
<Russian>Запретить потерю сознания ИИ</Russian>
</Key>
<Key ID="STR_ACE_Medical_statemachine_unconsciousConditionAI_Description">
<English>Defines if AI will be denied to go unconscious and will die instead</English>
<German>Legt fest, ob eine KI bewusstlos wird oder stirbt</German>
<Japanese>AI が気絶すると、即時に死亡するかどうか決定します</Japanese>
<Russian>Определяет, потеряет ли ИИ сознание или вместо этого умрет</Russian>
</Key>
<Key ID="STR_ACE_Medical_statemachine_fatalInjuryCondition_InCardiacArrest">
<English>In Cardiac Arrest</English>
<German>Herzstillstand</German>
<Japanese>心停止中</Japanese>
<Russian>При остановке сердца</Russian>
</Key>
<Key ID="STR_ACE_Medical_statemachine_cardiacArrestTime_DisplayName">
<English>Cardiac Arrest time (seconds)</English>
<German>Zeit bis zum Herzstillstand (Sekunden)</German>
<Japanese>心停止時間 (秒)</Japanese>
<Russian>Длительность остановки сердца (сек)</Russian>
</Key>
<Key ID="STR_ACE_Medical_statemachine_cardiacArrestTime_Description">
<English>Defines how long it takes to die from cardiac arrest?</English>
<German>Legt fest, wie lang es dauert, bis man an einem Herzstillstand stirbt</German>
<Japanese>心停止がどのくらい続けば死亡するようにしますか?</Japanese>
<Russian>Определяет, сколько времени требуется, чтобы умереть от остановки сердца</Russian>
</Key>
<Key ID="STR_ACE_Medical_statemachine_enableUnconsciousnessAI_DisplayName">
<English>AI Unconsciousness</English> <English>AI Unconsciousness</English>
<Russian>Потеря сознания ботами</Russian> <Russian>Потеря сознания ботами</Russian>
<Polish>Nieprzytomność AI</Polish> <Polish>Nieprzytomność AI</Polish>
@ -78,22 +47,23 @@
<Chinesesimp>AI无意识</Chinesesimp> <Chinesesimp>AI无意识</Chinesesimp>
<Chinese>AI無意識</Chinese> <Chinese>AI無意識</Chinese>
</Key> </Key>
<Key ID="STR_ACE_Medical_statemachine_enableUnconsciousnessAI_Description"> <Key ID="STR_ACE_Medical_Statemachine_AIUnconsciousness_Description">
<English>Allow AI to go unconscious</English> <English>Allows AI to go unconscious instead of dying.</English>
<Russian>Позволить ботам терять сознание</Russian> </Key>
<Polish>Czy AI może być nieprzytomne od odniesionych obrażeń?</Polish> <Key ID="STR_ACE_Medical_Statemachine_CardiacArrestTime_DisplayName">
<Spanish>Permita a la IA caer inconsciente</Spanish> <English>Cardiac Arrest Time</English>
<German>KI kann bewusstlos werden</German> <German>Zeit bis zum Herzstillstand</German>
<Czech>Umožňuje AI upadnout do bezvědomí</Czech> <Japanese>心停止時間</Japanese>
<Portuguese>Permite IA ficar inconsciente</Portuguese> <Russian>Длительность остановки сердца</Russian>
<French>Autoriser les IA à tomber inconscients</French> </Key>
<Hungarian>Engedélyezi az AI eszméletének elvesztését</Hungarian> <Key ID="STR_ACE_Medical_Statemachine_CardiacArrestTime_Description">
<Italian>Permetti alle IA di diventare incoscienti</Italian> <English>Controls how long it takes to die from cardiac arrest.</English>
<Japanese>AI が気絶をするようになります</Japanese> </Key>
<Korean>인공지능도 기절에 빠지게 합니다</Korean> <Key ID="STR_ACE_Medical_Statemachine_InCardiacArrest">
<Chinesesimp>允许AI进入无意识状态</Chinesesimp> <English>In Cardiac Arrest</English>
<Chinese>允許AI進入無意識狀態</Chinese> <German>Herzstillstand</German>
<Japanese>心停止中</Japanese>
<Russian>При остановке сердца</Russian>
</Key> </Key>
</Container>
</Package> </Package>
</Project> </Project>

View File

@ -5,7 +5,7 @@ class ACE_Settings {
class EGVAR(medical,painCoefficient) { class EGVAR(medical,painCoefficient) {
movedToSQF = 1; movedToSQF = 1;
}; };
class GVAR(ivFlowRate) { class EGVAR(medical,ivFlowRate) {
movedToSQF = 1; movedToSQF = 1;
}; };
}; };

View File

@ -29,7 +29,7 @@ if (!isNil {_unit getVariable QEGVAR(medical,ivBags)}) then {
_x params ["_bagVolumeRemaining", "_type", "_bodyPart"]; _x params ["_bagVolumeRemaining", "_type", "_bodyPart"];
if (_tourniquets select _bodyPart == 0) then { if (_tourniquets select _bodyPart == 0) then {
private _bagChange = (_deltaT * GVAR(ivFlowRate) * IV_CHANGE_PER_SECOND) min _bagVolumeRemaining; // absolute value of the change in miliLiters private _bagChange = (_deltaT * EGVAR(medical,ivFlowRate) * IV_CHANGE_PER_SECOND) min _bagVolumeRemaining; // absolute value of the change in miliLiters
_bagVolumeRemaining = _bagVolumeRemaining - _bagChange; _bagVolumeRemaining = _bagVolumeRemaining - _bagChange;
_bloodVolumeChange = _bloodVolumeChange + (_bagChange / 1000); _bloodVolumeChange = _bloodVolumeChange + (_bagChange / 1000);
}; };

View File

@ -1,33 +1,26 @@
// CBA Settings [ADDON: ace_medical_status]:
private _categoryArray = [LELSTRING(medical,Category), LLSTRING(subCategory)];
[ [
QEGVAR(medical,bleedingCoefficient), "SLIDER", QEGVAR(medical,bleedingCoefficient),
[LSTRING(bleedingCoefficient_DisplayName), LSTRING(bleedingCoefficient_Description)], "SLIDER",
_categoryArray, [LSTRING(BleedingCoefficient_DisplayName), LSTRING(BleedingCoefficient_Description)],
[0,25,1,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] [ELSTRING(medical,Category), LSTRING(SubCategory)],
true, // isGlobal [0, 25, 1, 1],
{[QEGVAR(medical,bleedingCoefficient), _this] call EFUNC(common,cbaSettings_settingChanged)}, true
true // Needs mission restart
] call CBA_settings_fnc_init; ] call CBA_settings_fnc_init;
[ [
QEGVAR(medical,painCoefficient), "SLIDER", QEGVAR(medical,painCoefficient),
[LSTRING(painCoefficient_DisplayName), LSTRING(painCoefficient_Description)], "SLIDER",
_categoryArray, [LSTRING(PainCoefficient_DisplayName), LSTRING(PainCoefficient_Description)],
[0,25,1,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] [ELSTRING(medical,Category), LSTRING(SubCategory)],
true, // isGlobal [0, 25, 1, 1],
{[QEGVAR(medical,painCoefficient), _this] call EFUNC(common,cbaSettings_settingChanged)}, true
true // Needs mission restart
] call CBA_settings_fnc_init; ] call CBA_settings_fnc_init;
[ [
QGVAR(ivFlowRate), "SLIDER", QEGVAR(medical,ivFlowRate),
[LSTRING(ivFlowRate_DisplayName), LSTRING(ivFlowRate_Description)], "SLIDER",
_categoryArray, [LSTRING(IvFlowRate_DisplayName), LSTRING(IvFlowRate_Description)],
[0,25,1,1], // [min, max, default value, trailing decimals (-1 for whole numbers only)] [ELSTRING(medical,Category), LSTRING(SubCategory)],
true, // isGlobal [0, 25, 1, 1],
{[QGVAR(ivFlowRate), _this] call EFUNC(common,cbaSettings_settingChanged)}, true
true // Needs mission restart
] call CBA_settings_fnc_init; ] call CBA_settings_fnc_init;

View File

@ -1,15 +1,14 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project name="ACE"> <Project name="ACE">
<Package name="Medical_Status"> <Package name="Medical_Status">
<Container name="Settings"> <Key ID="STR_ACE_Medical_Status_SubCategory">
<Key ID="STR_ACE_Medical_Status_subCategory">
<English>Status</English> <English>Status</English>
<German>Zustand</German> <German>Zustand</German>
<Japanese>状態</Japanese> <Japanese>状態</Japanese>
<Russian>Статус</Russian> <Russian>Статус</Russian>
</Key> </Key>
<Key ID="STR_ACE_Medical_Status_bleedingCoefficient_DisplayName"> <Key ID="STR_ACE_Medical_Status_BleedingCoefficient_DisplayName">
<English>Bleeding coefficient</English> <English>Bleeding Coefficient</English>
<Russian>Коэффициент кровопотери</Russian> <Russian>Коэффициент кровопотери</Russian>
<Polish>Mnożnik krwawienia</Polish> <Polish>Mnożnik krwawienia</Polish>
<Spanish>Coeficiente de sangrado</Spanish> <Spanish>Coeficiente de sangrado</Spanish>
@ -24,8 +23,8 @@
<Chinesesimp>流血系数</Chinesesimp> <Chinesesimp>流血系数</Chinesesimp>
<Chinese>流血係數</Chinese> <Chinese>流血係數</Chinese>
</Key> </Key>
<Key ID="STR_ACE_Medical_Status_bleedingCoefficient_Description"> <Key ID="STR_ACE_Medical_Status_BleedingCoefficient_Description">
<English>Coefficient to modify the bleeding speed</English> <English>Coefficient for controlling the bleeding speed.</English>
<Russian>Коэффициент, изменяющий скорость потери крови</Russian> <Russian>Коэффициент, изменяющий скорость потери крови</Russian>
<Polish>Mnożnik modyfikujący prędkość wykrwawiania się</Polish> <Polish>Mnożnik modyfikujący prędkość wykrwawiania się</Polish>
<Spanish>Coeficiente para modificar la velocidad de sangrado</Spanish> <Spanish>Coeficiente para modificar la velocidad de sangrado</Spanish>
@ -40,8 +39,8 @@
<Chinesesimp>修改流血速度</Chinesesimp> <Chinesesimp>修改流血速度</Chinesesimp>
<Chinese>修改流血速度</Chinese> <Chinese>修改流血速度</Chinese>
</Key> </Key>
<Key ID="STR_ACE_Medical_Status_painCoefficient_DisplayName"> <Key ID="STR_ACE_Medical_Status_PainCoefficient_DisplayName">
<English>Pain coefficient</English> <English>Pain Coefficient</English>
<Russian>Коэффициент боли</Russian> <Russian>Коэффициент боли</Russian>
<Polish>Mnożnik bólu</Polish> <Polish>Mnożnik bólu</Polish>
<Spanish>Coeficiente de dolor</Spanish> <Spanish>Coeficiente de dolor</Spanish>
@ -56,8 +55,8 @@
<Chinesesimp>疼痛系数</Chinesesimp> <Chinesesimp>疼痛系数</Chinesesimp>
<Chinese>疼痛係數</Chinese> <Chinese>疼痛係數</Chinese>
</Key> </Key>
<Key ID="STR_ACE_Medical_Status_painCoefficient_Description"> <Key ID="STR_ACE_Medical_Status_PainCoefficient_Description">
<English>Coefficient to modify the pain intensity</English> <English>Coefficient for controlling the intensity of pain adjustments.</English>
<Russian>Коэффициент, изменяющий уровень боли</Russian> <Russian>Коэффициент, изменяющий уровень боли</Russian>
<Polish>Mnożnik modyfikujący intensywność bólu</Polish> <Polish>Mnożnik modyfikujący intensywność bólu</Polish>
<Spanish>Coeficiente para modificar la intensidad del dolor</Spanish> <Spanish>Coeficiente para modificar la intensidad del dolor</Spanish>
@ -72,18 +71,17 @@
<Chinesesimp>修改疼痛强度的系数</Chinesesimp> <Chinesesimp>修改疼痛强度的系数</Chinesesimp>
<Chinese>修改疼痛強度的係數</Chinese> <Chinese>修改疼痛強度的係數</Chinese>
</Key> </Key>
<Key ID="STR_ACE_Medical_Status_ivFlowRate_DisplayName"> <Key ID="STR_ACE_Medical_Status_IvFlowRate_DisplayName">
<English>IV Transfusion Flow Rate</English> <English>IV Transfusion Flow Rate</English>
<German>Transfusions Fließrate</German> <German>Transfusions Fließrate</German>
<Japanese>IV 輸血の流量</Japanese> <Japanese>IV 輸血の流量</Japanese>
<Russian>Скорость внутривенного переливания</Russian> <Russian>Скорость внутривенного переливания</Russian>
</Key> </Key>
<Key ID="STR_ACE_Medical_Status_ivFlowRate_Description"> <Key ID="STR_ACE_Medical_Status_IvFlowRate_Description">
<English>Effects how quickly IV Bags will have effect</English> <English>Controls how quickly fluid flows out of IV Bags. The IV Bag volume change is calculated as:\ntime interval (s) * iv change per second (4.1667 mL/s) * flow rate (this coefficient).</English>
<German>Wie schnell der Effekt der Transfusion eintritt</German> <German>Wie schnell der Effekt der Transfusion eintritt</German>
<Japanese>IV による輸血速度を変更できます</Japanese> <Japanese>IV による輸血速度を変更できます</Japanese>
<Russian>Определяет, насколько быстро подействуют эффекты внутривенного переливания</Russian> <Russian>Определяет, насколько быстро подействуют эффекты внутривенного переливания</Russian>
</Key> </Key>
</Container>
</Package> </Package>
</Project> </Project>

View File

@ -1,45 +0,0 @@
class ACE_Settings {
class EGVAR(medical,allowLitterCreation) {
movedToSqf = 1;
};
class EGVAR(medical,litterCleanUpDelay) {
movedToSqf = 1;
};
class EGVAR(medical,litterSimulationDetail) {
movedToSqf = 1;
_values[] = { 0, 50, 100, 1000, 5000 };
};
class EGVAR(medical,increaseTrainingInLocations) {
movedToSqf = 1;
};
class EGVAR(medical,PAKTime) {
movedToSqf = 1;
};
class EGVAR(medical,medicSetting_Epi) {
movedToSqf = 1;
};
class EGVAR(medical,medicSetting_PAK) {
movedToSqf = 1;
};
class EGVAR(medical,medicSetting_SurgicalKit) {
movedToSqf = 1;
};
class EGVAR(medical,consumeItem_PAK) {
movedToSqf = 1;
};
class EGVAR(medical,consumeItem_SurgicalKit) {
movedToSqf = 1;
};
class EGVAR(medical,useLocation_Epi) {
movedToSqf = 1;
};
class EGVAR(medical,useLocation_PAK) {
movedToSqf = 1;
};
class EGVAR(medical,useLocation_SurgicalKit) {
movedToSqf = 1;
};
class EGVAR(medical,convertItems) {
movedToSqf = 1;
};
};

View File

@ -17,7 +17,6 @@ class CfgPatches {
#include "ACE_Medical_Treatment.hpp" #include "ACE_Medical_Treatment.hpp"
#include "ACE_Medical_Treatment_Actions.hpp" #include "ACE_Medical_Treatment_Actions.hpp"
#include "ACE_Medical_Facilities.hpp" #include "ACE_Medical_Facilities.hpp"
#include "ACE_Settings.hpp"
#include "CfgEventHandlers.hpp" #include "CfgEventHandlers.hpp"
#include "CfgReplacementItems.hpp" #include "CfgReplacementItems.hpp"
#include "CfgVehicles.hpp" #include "CfgVehicles.hpp"

View File

@ -53,7 +53,7 @@
"LIST", "LIST",
[LSTRING(AllowSelfIV_DisplayName), LSTRING(AllowSelfIV_Description)], [LSTRING(AllowSelfIV_DisplayName), LSTRING(AllowSelfIV_Description)],
[ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)], [ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)],
[[0, 1], [ELSTRING(common,No), ELSTRING(common,Yes)], 0], [[0, 1], [ELSTRING(common,No), ELSTRING(common,Yes)], 1],
true true
] call CBA_settings_fnc_init; ] call CBA_settings_fnc_init;