treatment functions and unconsciousness rework

This commit is contained in:
commy2 2016-10-06 00:54:57 +02:00 committed by GitHub
parent bad01c3126
commit 5613ec5d5a
64 changed files with 495 additions and 424 deletions

View File

@ -45,6 +45,7 @@ PREP(fixFloating);
PREP(fixLoweredRifleAnimation);
PREP(fixPosition);
PREP(getAllDefinedSetVariables);
PREP(getAwakeAnim);
PREP(getDeathAnim);
PREP(getDefaultAnim);
PREP(getDefinedVariable);

View File

@ -9,7 +9,6 @@
* 0 = PlayMove
* 1 = PlayMoveNow
* 2 = SwitchMove (no transitional animation, doesn't overwrite priority 1)
* 3: Force overwritting unconscious (default: false) <BOOL>
*
* Return Value:
* None
@ -21,14 +20,8 @@
*/
#include "script_component.hpp"
params ["_unit", "_animation", ["_priority", 0], ["_force", false]];
TRACE_4("params",_unit,_animation,_priority,_force);
// don't overwrite more important animations
if (_unit getVariable ["ACE_isUnconscious", false] && {(_animation != "Unconscious")} && {!_force}) exitWith {};
// don't go unconscious if the unit isn't unconscious
if (_animation == "Unconscious" && {!((_unit getVariable ["ACE_isUnconscious", false]) || (_unit getVariable ["ACE_isDead", false]))}) exitWith {};
params ["_unit", "_animation", ["_priority", 0]];
TRACE_4("params",_unit,_animation,_priority);
// switchMove "" no longer works in dev 1.37
if (_animation == "") then {
@ -43,7 +36,7 @@ switch (_priority) do {
if (_unit == vehicle _unit) then {
[QGVAR(playMove), [_unit, _animation], _unit] call CBA_fnc_targetEvent;
} else {
// Execute on all machines. PlayMove and PlayMoveNow are bugged: They have no global effects when executed on remote machines inside vehicles.
// Execute on all machines. PlayMove and PlayMoveNow are bugged: They have local effects when executed on remote machines inside vehicles.
[QGVAR(playMove), [_unit, _animation]] call CBA_fnc_globalEvent;
};
};
@ -51,7 +44,7 @@ switch (_priority) do {
if (_unit == vehicle _unit) then {
[QGVAR(playMoveNow), [_unit, _animation], _unit] call CBA_fnc_targetEvent;
} else {
// Execute on all machines. PlayMove and PlayMoveNow are bugged: They have no global effects when executed on remote machines inside vehicles.
// Execute on all machines. PlayMove and PlayMoveNow are bugged: They have local effects when executed on remote machines inside vehicles.
[QGVAR(playMoveNow), [_unit, _animation]] call CBA_fnc_globalEvent;
};
};
@ -60,7 +53,7 @@ switch (_priority) do {
if (_unit == vehicle _unit) then {
[QGVAR(playMoveNow), [_unit, _animation], _unit] call CBA_fnc_targetEvent;
} else {
// Execute on all machines. PlayMove and PlayMoveNow are bugged: They have no global effects when executed on remote machines inside vehicles.
// Execute on all machines. PlayMove and PlayMoveNow are bugged: They have local effects when executed on remote machines inside vehicles.
[QGVAR(playMoveNow), [_unit, _animation]] call CBA_fnc_globalEvent;
};

View File

@ -0,0 +1,49 @@
/*
* Author: commy2
* Report awake animation of unit inside vehicle.
*
* Arguments:
* 0: The unit <OBJECT>
*
* ReturnValue:
* The animtaion <STRING>
*
* Example:
* player call ace_common_fnc_getAwakeAnim
*
* Public: no
*/
#include "script_component.hpp"
params ["_unit"];
private _vehicle = vehicle _unit;
// --- on foot
if (_vehicle isEqualTo _unit) exitWith {""};
// --- driver
private _config = configFile >> "CfgVehicles" >> typeOf _vehicle;
if (_unit == driver _vehicle) exitWith {
getText (configFile >> "CfgMovesBasic" >> "ManActions" >> getText (_config >> "driverAction")) // return
};
// --- turret
private _turret = _unit call CBA_fnc_turretPath;
if !(_turret isEqualTo []) exitWith {
private _turretConfig = [_vehicle, _turret] call CBA_fnc_getTurret;
getText (configFile >> "CfgMovesBasic" >> "ManActions" >> getText (_turretConfig >> "gunnerAction")) // return
};
// --- cargo
private _cargoIndex = _vehicle getCargoIndex _unit;
if (_cargoIndex != -1) exitWith {
getText (configFile >> "CfgMovesBasic" >> "ManActions" >> getArray (_config >> "cargoAction") select _cargoIndex) // return
};
// --- default
""

View File

@ -30,8 +30,7 @@ if (isNil "ACE_maxWeightCarry") then {
//@todo Captivity?
//Add Keybind:
["ACE3 Common", QGVAR(drag), (localize LSTRING(DragKeybind)),
{
["ACE3 Common", QGVAR(drag), (localize LSTRING(DragKeybind)), {
if (!alive ACE_player) exitWith {false};
if !([ACE_player, objNull, ["isNotDragging", "isNotCarrying"]] call EFUNC(common,canInteractWith)) exitWith {false};
@ -51,7 +50,6 @@ if (isNil "ACE_maxWeightCarry") then {
[ACE_player, _cursor] call FUNC(startDrag);
false
},
{false},
[-1, [false, false, false]]] call CBA_fnc_addKeybind; // UNBOUND
}, {
false
}, [-1, [false, false, false]]] call CBA_fnc_addKeybind; // UNBOUND

View File

@ -29,10 +29,9 @@ if (_player getVariable [QGVAR(isDragging), false]) then {
};
// handle waking up dragged unit
//if (_unit == _draggedObject) then {
// [_player, _draggedObject] call FUNC(dropObject);
//};
if (_unit == _draggedObject) then {
[_player, _draggedObject] call FUNC(dropObject);
};
};
if (_player getVariable [QGVAR(isCarrying), false]) then {
@ -45,8 +44,7 @@ if (_player getVariable [QGVAR(isCarrying), false]) then {
};
// handle waking up dragged unit
//if (_unit == _carriedObject) then {
// [_player, _carriedObject] call FUNC(dropObject_carry);
//};
if (_unit == _carriedObject) then {
[_player, _carriedObject] call FUNC(dropObject_carry);
};
};

View File

@ -271,11 +271,4 @@ class ACE_Settings {
values[] = {CSTRING(useSelection), CSTRING(useRadial), "Disabled"};
isClientSettable = 1;
};
class GVAR(delayUnconCaptive) {
category = CSTRING(Category_Medical);
displayName = CSTRING(MedicalSettings_delayUnconCaptive_DisplayName);
description = CSTRING(MedicalSettings_delayUnconCaptive_Description);
typeName = "SCALAR";
value = 3;
};
};

View File

@ -15,7 +15,6 @@ PREP(isInMedicalVehicle);
PREP(isInStableCondition);
PREP(isMedic);
PREP(isMedicalVehicle);
PREP(selectionNameToNumber);
PREP(setHitPointDamage);
PREP(setStructuralDamage);
PREP(stateEvent);
@ -29,3 +28,5 @@ PREP(handleStateUnconscious);
PREP(handleUnitVitals);
PREP(handleMedications);
// PREP(handleStateRevive);
PREP(setUnconscious);

View File

@ -14,6 +14,7 @@ if (isServer) then {
["ace_unconscious", {
params ["_unit", "_status"];
if (local _unit) then {
if (_status) then {
_unit setVariable ["tf_voiceVolume", 0, true];

View File

@ -6,14 +6,14 @@
* Arguments:
* 0: The Unit <OBJECT>
* 1: Damage to Add <NUMBER>
* 2: Selection ("head", "body", "hand_l", "hand_r", "leg_l", "leg_r") <STRING>
* 2: Body part ("Head", "Body", "LeftArm", "RightArm", "LeftLeg", "RightLeg") <STRING>
* 3: Projectile Type <STRING>
*
* Return Value:
* HandleDamage's return <NUMBER>
*
* Example:
* [player, 0.8, "leg_r", "bullet"] call ace_medical_fnc_addDamageToUnit
* [player, 0.8, "rightleg", "bullet"] call ace_medical_fnc_addDamageToUnit
* [cursorTarget, 1, "body", "stab"] call ace_medical_fnc_addDamageToUnit
*
* Public: Yes
@ -22,16 +22,16 @@
// #define DEBUG_TESTRESULTS
#include "script_component.hpp"
params [["_unit", objNull, [objNull]], ["_damageToAdd", -1, [0]], ["_selection", "", [""]], ["_typeOfDamage", "", [""]]];
TRACE_4("params",_unit,_damageToAdd,_selection,_typeOfDamage);
params [["_unit", objNull, [objNull]], ["_damageToAdd", -1, [0]], ["_bodyPart", "", [""]], ["_typeOfDamage", "", [""]]];
TRACE_4("params",_unit,_damageToAdd,_bodyPart,_typeOfDamage);
_selection = toLower _selection;
if ((isNull _unit) || {!local _unit} || {!alive _unit}) exitWith {ERROR_1("addDamageToUnit - badUnit %1", _this); -1};
_bodyPart = toLower _bodyPart;
if (isNull _unit || {!local _unit} || {!alive _unit}) exitWith {ERROR_1("addDamageToUnit - badUnit %1", _this); -1};
if (_damageToAdd < 0) exitWith {ERROR_1("addDamageToUnit - bad damage %1", _this); -1};
if (!(_selection in GVAR(SELECTIONS))) exitWith {ERROR_1("addDamageToUnit - bad selection %1", _this); -1};
if !(_bodyPart in ALL_BODY_PARTS) exitWith {ERROR_1("addDamageToUnit - bad selection %1", _this); -1};
//Get the hitpoint and the index
private _hitpoint = [_unit, _selection, true] call ace_medical_fnc_translateSelections;
private _hitpoint = [_unit, _bodyPart, true] call ace_medical_fnc_translateSelections;
(getAllHitPointsDamage _unit) params [["_allHitPoints", []]];
private _hitpointIndex = -1;
{ //case insensitive find
@ -43,7 +43,7 @@ private _currentDamage = _unit getHitIndex _hitpointIndex;
#ifdef DEBUG_TESTRESULTS
private _checkAtFrame = diag_frameno + 5;
private _partNumber = [_selection] call FUNC(selectionNameToNumber);
private _partNumber = ALL_BODY_PARTS find _bodyPart;
private _startDmg = (_unit getVariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]) select _partNumber;
private _debugCode = {
params ["", "_unit", "_startDmg", "_damageToAdd", "_partNumber"];
@ -57,7 +57,7 @@ private _debugCode = {
[{diag_frameno > (_this select 0)}, _debugCode, [_checkAtFrame, _unit, _startDmg, _damageToAdd, _partNumber]] call CBA_fnc_waitUntilAndExecute;
#endif
private _return = [_unit, _selection, (_currentDamage + _damageToAdd), _unit, _typeOfDamage, _hitpointIndex, objNull] call FUNC(handleDamage);
private _return = [_unit, _bodyPart, (_currentDamage + _damageToAdd), _unit, _typeOfDamage, _hitpointIndex, objNull] call FUNC(handleDamage);
TRACE_1("handleDamage called",_return);
_return

View File

@ -26,7 +26,7 @@ if (_local) then {
private _arguments = (_unit getVariable [QGVAR(unconsciousArguments), []]);
_arguments set [2, CBA_missionTime];
[DFUNC(unconsciousPFH), 0.1, _arguments ] call CBA_fnc_addPerFrameHandler;
//[DFUNC(unconsciousPFH), 0.1, _arguments ] call CBA_fnc_addPerFrameHandler;
_unit setVariable [QGVAR(unconsciousArguments), nil, true];
};

View File

@ -4,16 +4,15 @@
*
* Arguments:
* 0: The Unit <OBJECT>
* 1: SelectionName <STRING>
* 1: Body Part <STRING>
*
* ReturnValue:
* Has tourniquet applied <BOOL>
*
* Public: Yes
*/
#include "script_component.hpp"
params ["_target", "_selectionName"];
params ["_target", "_bodyPart"];
(((_target getVariable [QGVAR(tourniquets), [0,0,0,0,0,0]]) select ([_selectionName] call FUNC(selectionNameToNumber))) > 0);
((_target getVariable [QGVAR(tourniquets), [0,0,0,0,0,0]]) select (ALL_BODY_PARTS find toLower _bodyPart)) > 0

View File

@ -1,16 +0,0 @@
/*
* Author: Glowbal
* Get the number representation of a selection name.
*
* Arguments:
* 0: The selection name of a unit <STRING>
*
* ReturnValue:
* Number representation. -1 if invalid. <NUMBER>
*
* Public: yes
*/
#include "script_component.hpp"
(["head","body","hand_l","hand_r","leg_l","leg_r"] find (_this select 0));

View File

@ -26,104 +26,82 @@ if !(EGVAR(common,settingsInitFinished)) exitWith {
EGVAR(common,runAtSettingsInitialized) pushBack [FUNC(setUnconscious), _this];
};
private ["_animState", "_originalPos", "_startingTime", "_isDead"];
params ["_unit", ["_set", true], ["_minWaitingTime", DEFAULT_DELAY], ["_force", false]];
params ["_unit", ["_set", true], ["_minUnconsciousTime", DEFAULT_DELAY], ["_force", false]];
// No change, fuck off. (why is there no xor?)
if (_set isEqualTo (_unit getVariable ["ACE_isUnconscious", false])) exitWith {};
if !(_set) exitWith {
_unit setVariable ["ACE_isUnconscious", false, true];
if (_unit getVariable [QGVAR(inReviveState), false]) then {
_unit setVariable [QGVAR(inReviveState), nil, true];
};
[_unit, false] call EFUNC(medical_engine,setUnconsciousAnim);
["ace_unconscious", [_unit, false]] call CBA_fnc_globalEvent;
};
if !(!(isNull _unit) && {(_unit isKindOf "CAManBase") && ([_unit] call EFUNC(common,isAwake))}) exitWith{};
if (isNull _unit || {!(_unit isKindOf "CAManBase")}) exitWith {};
if (!local _unit) exitWith {
[QGVAR(setUnconscious), [_unit, _set, _minWaitingTime, _force], _unit] call CBA_fnc_targetEvent;
[QGVAR(setUnconscious), [_unit, _set, _minUnconsciousTime, _force], _unit] call CBA_fnc_targetEvent;
};
_unit setVariable ["ACE_isUnconscious", true, true];
if (_unit == ACE_player) then {
if (visibleMap) then {openMap false};
while {dialog} do {
closeDialog 0;
};
};
// if we have unconsciousness for AI disabled, we will kill the unit instead
_isDead = false;
private _isDead = false;
if (!([_unit, GVAR(remoteControlledAI)] call EFUNC(common,isPlayer)) && !_force) then {
_enableUncon = _unit getVariable [QGVAR(enableUnconsciousnessAI), GVAR(enableUnconsciousnessAI)];
if (_enableUncon == 0 or {_enableUncon == 1 and (random 1) < 0.5}) then {
[_unit, true] call FUNC(setDead);
_isDead = true;
};
};
if (_isDead) exitWith {};
// If a unit has the launcher out, it will sometimes start selecting the primairy weapon while unconscious,
// therefor we force it to select the primairy weapon before going unconscious
if ((vehicle _unit) isKindOf "StaticWeapon") then {
[_unit] call EFUNC(common,unloadPerson);
};
if (animationState _unit in ["ladderriflestatic","laddercivilstatic"]) then {
_unit action ["ladderOff", (nearestBuilding _unit)];
};
if (vehicle _unit == _unit) then {
if (primaryWeapon _unit == "") then {
_unit addWeapon "ACE_FakePrimaryWeapon";
};
_unit selectWeapon (primaryWeapon _unit);
};
// We are storing the current animation, so we can use it later on when waking the unit up inside a vehicle
if (vehicle _unit != _unit) then {
_unit setVariable [QGVAR(vehicleAwakeAnim), [(vehicle _unit), (animationState _unit)]];
};
//Save current stance:
_originalPos = unitPos _unit;
_unit setUnitPos "DOWN";
[_unit, true] call EFUNC(common,disableAI);
// So the AI does not get stuck, we are moving the unit to a temp group on its own.
//Unconscious units shouldn't be put in another group #527:
// Unconscious units shouldn't be put in another group #527:
if (GVAR(moveUnitsFromGroupOnUnconscious)) then {
[_unit, true, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide);
};
// Delay Unconscious so the AI dont instant stop shooting on the unit #3121
if (GVAR(delayUnconCaptive) == 0) then {
[_unit, "setCaptive", "ace_unconscious", true] call EFUNC(common,statusEffect_set);
} else {
[{
[{
params ["_unit"];
if (_unit getVariable ["ACE_isUnconscious", false]) then {
[_unit, "setCaptive", "ace_unconscious", true] call EFUNC(common,statusEffect_set);
};
},[_unit], GVAR(delayUnconCaptive)] call CBA_fnc_waitAndExecute;
};
}, _unit, 3] call CBA_fnc_waitAndExecute;
_anim = [_unit] call EFUNC(common,getDeathAnim);
[_unit, _anim, 1, true] call EFUNC(common,doAnimation);
[{
params ["_unit", "_anim"];
if ((_unit getVariable "ACE_isUnconscious") and (animationState _unit != _anim)) then {
[_unit, _anim, 2, true] call EFUNC(common,doAnimation);
};
}, [_unit, _anim], 0.5, 0] call CBA_fnc_waitAndExecute;
_startingTime = CBA_missionTime;
[_unit, true] call EFUNC(medical_engine,setUnconsciousAnim);
[_unit, "Unconscious", []] call FUNC(stateEvent);
[DFUNC(unconsciousPFH), 0.1, [_unit, _originalPos, _startingTime, _minWaitingTime, false, vehicle _unit isKindOf "ParachuteBase"] ] call CBA_fnc_addPerFrameHandler;
// unconscious can't talk
[_unit, "isUnconscious"] call EFUNC(common,muteUnit);
["ace_unconscious", [_unit, true]] call CBA_fnc_globalEvent;
// auto wake up, testing @todo
[{
params ["_unit", "_time"];
!(_unit getVariable ["ACE_isUnconscious", false]) || {CBA_missionTime > _time}
}, {
params ["_unit"];
if (_unit getVariable ["ACE_isUnconscious", false]) then {
[_unit, false] call FUNC(setUnconscious);
};
}, [_unit, CBA_missionTime + _minUnconsciousTime]] call CBA_fnc_waitUntilAndExecute;

View File

@ -16,6 +16,8 @@
#include "\z\ace\addons\main\script_macros.hpp"
#define ALL_BODY_PARTS ["head", "body", "leftarm", "rightarm", "leftleg", "rightleg"]
// scale received pain to 0-2 level to select type of scream
// below 0.33: 0, from 0.34 to 0.66: 1, more than 0.67: 2
#define PAIN_TO_MOAN(pain) (floor (3 * pain) min 2)

View File

@ -4019,28 +4019,5 @@
<Russian>Будет ли объект считаться медицинским транспортом.</Russian>
<Japanese>どれでも、またはオブジェクトを医療車両として割り当てます。</Japanese>
</Key>
<Key ID="STR_ACE_Medical_MedicalSettings_delayUnconCaptive_Description">
<English>Delay cease fire of AI while player is unconscious for medical reasons.</English>
<German>Verzögert das Ende des KI-Beschusses auf einen Spieler, wenn dieser aus medizinischen Gründen bewustlos wird.</German>
<Italian>Ritarda il cessate il fuoco dell'IA quando il giocatore è svenuto per motivi medici.</Italian>
<Czech>Prodleva zastavení palby pro AI, pokud je hráč v bezvědomí ze zdravotních důvodů.</Czech>
<Portuguese>Atraso durante cessar fogo da AI durante inconsciência médica</Portuguese>
<French>Délai de cessez le feu pour l'IA pendant que le joueur est inconscient pour des raisons médicales</French>
<Russian>Задержка прекращения огня ботами, когда игрок теряет сознание по медицинским причинам.</Russian>
<Japanese>AI はプレイヤーが医療的な理由で気絶している場合にかぎり、撃つのをためらいます。</Japanese>
<Polish>Opóźnij stan wstrzymania ognia u AI kiedy gracz jest nieprzytomny z powodów medycznych.</Polish>
</Key>
<Key ID="STR_ACE_Medical_MedicalSettings_delayUnconCaptive_DisplayName">
<English>Delay cease fire of AI for unconsciousness</English>
<German>Verzögert Ende des KI-Beschusses bei medizinischer Bewustlosigkeit</German>
<Spanish>Demora antes de volverse neutral al caer inconsciente</Spanish>
<Polish>Opóźnij wstrzymanie ognia AI dla nieprzytomnych osób</Polish>
<Italian>Ritarda il cessate il fuoco dell'IA quando si è svenuti</Italian>
<Czech>Prodleva zastavení palby AI na bezvědomé</Czech>
<Portuguese>Atraso durante cessar fogo da AI durante inconsciência</Portuguese>
<French>Délai de cessez le feu de l'IA pour la perte de conscience</French>
<Russian>Задержка прекращения огня ботами при потере сознания</Russian>
<Japanese>AI は気絶している人へ、ためらってから射撃します</Japanese>
</Key>
</Package>
</Project>

View File

@ -1,6 +1,6 @@
#include "script_component.hpp"
["ace_settingsInitialized", {
/*["ace_settingsInitialized", {
TRACE_1("settingsInitialized", GVAR(enabledFor));
if (GVAR(enabledFor) == 0) exitWith {}; // 0: disabled
if ((GVAR(enabledFor) == 1) && {!isServer} && {hasInterface}) exitWith {}; // 1: Don't Run on non-hc Clients
@ -32,4 +32,4 @@
};
GVAR(statemachine) = [configFile >> "ACE_Medical_AI_StateMachine"] call CBA_statemachine_fnc_createFromConfig;
}] call CBA_fnc_addEventHandler;
}] call CBA_fnc_addEventHandler;*/

View File

@ -32,8 +32,8 @@ switch (true) do {
_index
};
} forEach _openWounds;
private _selection = ["head","body","hand_l","hand_r","leg_l","leg_r"] select _partIndex;
[_this, "Bandage", _selection] call EFUNC(medical_treatment,treatmentAdvanced_bandageLocal);
private _selection = ALL_BODY_PARTS select _partIndex;
[_this, "Bandage", _selection] call EFUNC(medical_treatment,treatmentBandageLocal);
#ifdef DEBUG_MODE_FULL
systemChat format ["%1 is bandaging selection %2", _this, _selection];

View File

@ -61,8 +61,8 @@ switch (true) do {
_index
};
} forEach _openWounds;
private _selection = ["head","body","hand_l","hand_r","leg_l","leg_r"] select _partIndex;
[_target, "Bandage", _selection] call EFUNC(medical_treatment,treatmentAdvanced_bandageLocal);
private _selection = ALL_BODY_PARTS select _partIndex;
[_target, "Bandage", _selection] call EFUNC(medical_treatment,treatmentBandageLocal);
#ifdef DEBUG_MODE_FULL
systemChat format ["%1 is bandaging selection %2 on %3", _this, _selection, _target];

View File

@ -15,3 +15,5 @@
#endif
#include "\z\ace\addons\main\script_macros.hpp"
#define ALL_BODY_PARTS ["head", "body", "leftarm", "rightarm", "leftleg", "rightleg"]

View File

@ -2,7 +2,7 @@
#define COMPONENT_BEAUTIFIED Medical Blood
#include "\z\ace\addons\main\script_mod.hpp"
#define DEBUG_ENABLED_MEDICAL_BLOOD
// #define DEBUG_ENABLED_MEDICAL_BLOOD
#define DISABLE_COMPILE_CACHE
// #define ENABLE_PERFORMANCE_COUNTERS

View File

@ -4,7 +4,7 @@
*
* Arguments:
* 0: Unit That Was Hit <OBJECT>
* 1: Name Of Hit Selection <STRING>
* 1: Name Of Body Part <STRING>
* 2: Amount Of Damage <NUMBER>
* 3: Shooter or source of the damage <OBJECT>
* 4: Type of the damage done <STRING>
@ -14,14 +14,13 @@
*
* Public: No
*/
#include "script_component.hpp"
private "_bodyPartn";
params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage"];
_bodyPartn = [_selectionName] call EFUNC(medical,selectionNameToNumber);
params ["_unit", "_bodyPart", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage"];
if (_bodyPartn > 1) exitWith {};
private _partIndex = ALL_BODY_PARTS find toLower _bodyPart;
if (_partIndex > 1) exitWith {};
if (_amountOfDamage > 0.5) then {
if (random(1) >= 0.8) then {

View File

@ -4,7 +4,7 @@
*
* Arguments:
* 0: Unit That Was Hit <OBJECT>
* 1: Name Of Hit Selection <STRING>
* 1: Name Of Body Part <STRING>
* 2: Amount Of Damage <NUMBER>
* 3: Shooter or source of the damage <OBJECT>
* 4: Type of the damage done <STRING>
@ -14,16 +14,15 @@
*
* Public: No
*/
#include "script_component.hpp"
private ["_bodyPartn", "_fractures", "_fractureType"];
params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage"];
_bodyPartn = [_selectionName] call EFUNC(medical,selectionNameToNumber);
params ["_unit", "_bodyPart", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage"];
private _partIndex = ALL_BODY_PARTS find toLower _bodyPart;
private _fractureType = 1;
_fractureType = 1;
if (_amountOfDamage > 0.05) then {
// TODO specify fractures based off typeOfInjury details better.
switch (_typeOfDamage) do {
case "Bullet": {
@ -58,13 +57,14 @@ if (_amountOfDamage > 0.05) then {
};
};
private ["_fractures", "_fractureID", "_amountOf"];
_fractures = _unit getVariable[QGVAR(fractures), []];
_fractureID = 1;
_amountOf = count _fractures;
private _fractures = _unit getVariable[QGVAR(fractures), []];
private _fractureID = 1;
private _amountOf = count _fractures;
if (_amountOf > 0) then {
_fractureID = (_fractures select (_amountOf - 1) select 0) + 1;
};
_fractures pushBack [_fractureID, _fractureType, _bodyPartn, 1 /* percentage treated */];
_fractures pushBack [_fractureID, _fractureType, _partIndex, 1 /* percentage treated */];
_unit setVariable [QGVAR(fractures), _fractures, true];
};

View File

@ -4,7 +4,7 @@
*
* Arguments:
* 0: Unit That Was Hit <OBJECT>
* 1: Name Of Hit Selection <STRING>
* 1: Name Of Body Part <STRING>
* 2: Amount Of Damage <NUMBER>
* 3: Shooter or source of the damage <OBJECT>
* 4: Type of the damage done <STRING>
@ -17,7 +17,7 @@
#include "script_component.hpp"
private "_bodyPartn";
params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage"];
// _bodyPartn = [_selectionName] call EFUNC(medical,selectionNameToNumber);
params ["_unit", "_bodyPart", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage"];
// private _partIndex = ALL_BODY_PARTS find toLower _bodyPart;
// TODO implement internal injuries

View File

@ -19,10 +19,6 @@
params ["_unit", "_bodyPart", "_damage", "_typeOfProjectile", "_typeOfDamage"];
TRACE_5("start",_unit,_bodyPart,_damage,_typeOfProjectile,_typeOfDamage);
///// DELETE THIS AFTER EXTENSION HAS BEEN UPDATED
_bodyPart = EGVAR(medical,SELECTIONS) select (ALL_BODY_PARTS find _bodyPart);
/////
if (_typeOfDamage isEqualTo "") then {
_typeOfDamage = "unknown";
};

View File

@ -20,7 +20,7 @@ params ["_unit", "_bodyPart", "_damage", "_typeOfProjectile", "_typeOfDamage"];
TRACE_5("start",_unit,_bodyPart,_damage,_typeOfProjectile,_typeOfDamage);
// Convert the selectionName to a number and ensure it is a valid selection.
private _bodyPartN = ALL_BODY_PARTS find _bodyPart;
private _bodyPartN = ALL_BODY_PARTS find toLower _bodyPart;
if (_bodyPartN < 0) exitWith {};
if (_typeOfDamage isEqualTo "") then {
@ -69,7 +69,7 @@ private _allPossibleInjuries = [];
if (_highestPossibleSpot < 0) exitWith {};
// Administration for open wounds and ids
private _openWounds = _unit getVariable [QGVAR(openWounds), []];
private _openWounds = _unit getVariable [QEGVAR(medical,openWounds), []];
private _woundID = _unit getVariable [QGVAR(lastUniqueWoundID), 1];
private _painToAdd = 0;
@ -126,16 +126,17 @@ private _woundsCreated = [];
};
} forEach _thresholds;
_unit setVariable [QGVAR(openWounds), _openWounds, true];
_unit setVariable [QEGVAR(medical,openWounds), _openWounds, true];
// Only update if new wounds have been created
if (count _woundsCreated > 0) then {
_unit setVariable [QGVAR(lastUniqueWoundID), _woundID, true];
};
private _painLevel = _unit getVariable [QGVAR(pain), 0];
_unit setVariable [QGVAR(pain), _painLevel + _painToAdd];
// TODO use medical add pain function instead
private _painLevel = _unit getVariable [QEGVAR(medical,pain), 0];
_unit setVariable [QEGVAR(medical,pain), _painLevel + _painToAdd];
[_unit, "hit", PAIN_TO_SCREAM(_painToAdd)] call EFUNC(medical_engine,playInjuredSound);
TRACE_6("exit",_unit, _painLevel, _painToAdd, _unit getVariable QGVAR(pain), _unit getVariable QGVAR(openWounds),_woundsCreated);
TRACE_6("exit",_unit, _painLevel, _painToAdd, _unit getVariable QEGVAR(medical,pain), _unit getVariable QEGVAR(medical,openWounds),_woundsCreated);

View File

@ -21,7 +21,7 @@
#define GET_STRING(config,default) (if (isText (config)) then {getText (config)} else {default})
#define GET_ARRAY(config,default) (if (isArray (config)) then {getArray (config)} else {default})
#define ALL_BODY_PARTS ["Head", "Body", "LeftArm", "RightArm", "LeftLeg", "RightLeg"]
#define ALL_BODY_PARTS ["head", "body", "leftarm", "rightarm", "leftleg", "rightleg"]
// scale received pain to 0-2 level to select type of scream
// below 0.25: 0, from 0.25 to 0.5: 1, more than 0.5: 2

View File

@ -0,0 +1,10 @@
// we want the face down animation every time
class CfgExtendedAnimation {
class Revive {
left = "Unconscious";
right = "Unconscious";
front = "Unconscious";
back = "Unconscious";
};
};

View File

@ -1,5 +1,8 @@
class CfgMovesBasic;
class CfgMovesBasic {
class Default;
};
class CfgMovesMaleSdr: CfgMovesBasic {
class States {
// fixes hand being stuck at rifle which is on the back
@ -7,5 +10,10 @@ class CfgMovesMaleSdr: CfgMovesBasic {
class AinvPknlMstpSlayWnonDnon_medicOther: AmovPknlMstpSrasWrflDnon_AinvPknlMstpSlayWrflDnon {
weaponIK = 0;
};
// wake me up inside
class Unconscious: Default {
InterpolateTo[] = {"DeadState",0.1,"AmovPpneMstpSnonWnonDnon",0.2};
};
};
};

View File

@ -5,3 +5,4 @@ PREP(damageBodyPart);
PREP(setLimping);
PREP(setPainSway);
PREP(setStructuralDamage);
PREP(setUnconsciousAnim);

View File

@ -41,3 +41,13 @@
];
}] call CBA_fnc_waitUntilAndExecute;
#endif
// this handles moving units into vehicles via load functions or zeus
// needed, because the vanilla INCAPACITATED state does not handle vehicles
["CAManBase", "GetInMan", {
params ["_unit"];
if (lifeState _unit == "INCAPACITATED") then {
[_unit, true] call FUNC(setUnconsciousAnim);
};
}] call CBA_fnc_addClassEventHandler;

View File

@ -18,6 +18,7 @@ class CfgPatches {
#include "CfgActions.hpp"
#include "CfgMoves.hpp"
#include "CfgExtendedAnimation.hpp"
#include "CfgVehicles.hpp"
#include "CfgWeapons.hpp"
#include "CfgInGameUI.hpp"

View File

@ -0,0 +1,55 @@
/*
* Author: commy2
* Force local unit into ragdoll / unconsciousness animation.
*
* Arguments:
* 0: Unit <OBJECT>
* 1: Is unconscious (optional, default: true) <BOOLEAN>
*
* Return Value:
* None
*
* Example:
* player call ace_medical_engine_fnc_setUnconsciousAnim
*
* Public: No
*/
#include "script_component.hpp"
params [["_unit", objNull, [objNull]], ["_isUnconscious", true, [false]]];
if (!local _unit) exitWith {
ERROR("Unit not local or null");
};
_unit setUnconscious _isUnconscious;
if (_isUnconscious) then {
// eject from static weapon
if (vehicle _unit isKindOf "StaticWeapon") then {
[_unit] call EFUNC(common,unloadPerson);
};
// set animation inside vehicles
if (vehicle _unit != _unit) then {
private _unconAnim = _unit call EFUNC(common,getDeathAnim);
[_unit, _unconAnim] call EFUNC(common,doAnimation);
};
} else {
// reset animation inside vehicles
if (vehicle _unit != _unit) then {
private _awakeAnim = _unit call EFUNC(common,getAwakeAnim);
[_unit, _awakeAnim, 2] call EFUNC(common,doAnimation);
} else {
// and on foot
[_unit, "AmovPpneMstpSnonWnonDnon"] call EFUNC(common,doAnimation);
[{
params ["_unit"];
if (animationState _unit == "unconscious" && {lifeState _unit != "INCAPACITATED"}) then {
[_unit, "AmovPpneMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation);
};
}, _unit] call CBA_fnc_execNextFrame;
};
};

View File

@ -15,8 +15,8 @@
*/
#include "script_component.hpp"
private _configBasic = (configFile >> "ACE_Medical_Treatment_Actions" >> "Basic");
private _configAdvanced = (configFile >> "ACE_Medical_Treatment_Actions" >> "Advanced");
private _configBasic = (configFile >> QEGVAR(medical_treatment,actions) >> "Basic");
private _configAdvanced = (configFile >> QEGVAR(medical_treatment,actions) >> "Advanced");
private _fnc_compileActionsLevel = {
params ["_config"];
@ -26,8 +26,8 @@ private _fnc_compileActionsLevel = {
if (isClass _x) then {
private _displayName = getText (_x >> "displayName");
private _category = getText (_x >> "category");
private _condition = format[QUOTE([ARR_4(ACE_player, GVAR(INTERACTION_TARGET), EGVAR(medical,SELECTIONS) select GVAR(selectedBodyPart), '%1')] call DEFUNC(medical_treatment,canTreatCached)), configName _x];
private _statement = format[QUOTE([ARR_4(ACE_player, GVAR(INTERACTION_TARGET), EGVAR(medical,SELECTIONS) select GVAR(selectedBodyPart), '%1')] call DEFUNC(medical_treatment,treatment)), configName _x];
private _condition = format [QUOTE([ARR_4(ACE_player, GVAR(INTERACTION_TARGET), %2 select GVAR(selectedBodyPart), '%1')] call DEFUNC(medical_treatment,canTreatCached)), configName _x, ALL_BODY_PARTS];
private _statement = format [QUOTE([ARR_4(ACE_player, GVAR(INTERACTION_TARGET), %2 select GVAR(selectedBodyPart), '%1')] call DEFUNC(medical_treatment,treatment)), configName _x, ALL_BODY_PARTS];
_actions pushBack [_displayName, _category, compile _condition, compile _statement];
diag_log format["ACTION: %1", [_displayName, _category, compile _condition, compile _statement]];
};

View File

@ -15,8 +15,7 @@
*/
#include "script_component.hpp"
private _actionsConfig = [nil, configFile >> "ACE_Medical_Treatment_Actions" >> "Basic", configFile >> "ACE_Medical_Treatment_Actions" >> "Advanced"] select EGVAR(medical,level);
private _allAllowedSelections = ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"];
private _actionsConfig = [nil, configFile >> QEGVAR(medical_treatment,actions) >> "Basic", configFile >> QEGVAR(medical_treatment,actions) >> "Advanced"] select EGVAR(medical,level);
private _actionPaths = ["ACE_Head", "ACE_Torso", "ACE_ArmLeft", "ACE_ArmRight", "ACE_LegLeft", "ACE_LegRight"];
private _actionPathTexts = [
localize ELSTRING(interaction,Head), localize ELSTRING(interaction,Torso),
@ -38,25 +37,24 @@ private _actionPathPositions = ["spine3", "pilot", "LeftForeArm", "RightForeArm"
default {""};
};
private _allowedSelections = getArray (_config >> "allowedSelections");
_allowedSelections = _allowedSelections apply {toLower _x};
private _allowedBodyParts = getArray (_config >> "allowedSelections") apply {toLower _x};
if (_allowedSelections isEqualTo ["all"]) then {
_allowedSelections = _allAllowedSelections;
if (_allowedBodyParts isEqualTo ["all"]) then {
_allowedBodyParts = ALL_BODY_PARTS apply {toLower _x};
};
{
private _selection = _x;
private _actionPath = _actionPaths select (_allAllowedSelections find _selection);
private _bodyPart = _x;
private _actionPath = _actionPaths select (ALL_BODY_PARTS find toLower _bodyPart);
private _statement = {[_player, _target, _selection, _this select 2] call EFUNC(medical_treatment,treatment)};
private _condition = {[_player, _target, _selection, _this select 2] call EFUNC(medical_treatment,canTreatCached)};
private _statement = {[_player, _target, _this select 2 select 0, _this select 2 select 1] call EFUNC(medical_treatment,treatment)};
private _condition = {[_player, _target, _this select 2 select 0, _this select 2 select 1] call EFUNC(medical_treatment,canTreatCached)};
private _action = [
_actionName, _displayName, _icon, _statement, _condition, {}, configName _config, [0, 0, 0], 2, [false, true, false, false, false]
_actionName, _displayName, _icon, _statement, _condition, {}, [_bodyPart, configName _config], [0, 0, 0], 2, [false, true, false, false, false]
] call EFUNC(interact_menu,createAction);
diag_log formatText ["ACTIONS LOL: %1", [_actionName, _displayName, _icon, _statement, _condition]];
["CAManBase", 0, [_actionPath], _action, true] call EFUNC(interact_menu,addActionToClass);
["CAManBase", 1, ["ACE_SelfActions", "Medical", _actionPath], _action, true] call EFUNC(interact_menu,addActionToClass);
} forEach _allowedSelections;
} forEach _allowedBodyParts;
} forEach configProperties [_actionsConfig, "isClass _x"];

View File

@ -15,3 +15,5 @@
#endif
#include "\z\ace\addons\main\script_macros.hpp"
#define ALL_BODY_PARTS ["head", "body", "leftarm", "rightarm", "leftleg", "rightleg"]

View File

@ -15,7 +15,7 @@ class GVAR(Actions) {
condition = "";
patientStateCondition = 0;
itemConsumed = 1;
callbackSuccess = QFUNC(treatmentAdvanced_bandage);
callbackSuccess = QFUNC(treatmentBandage);
callbackFailure = "";
callbackProgress = "";
@ -34,12 +34,12 @@ class GVAR(Actions) {
class Morphine: Bandage {
displayName = ECSTRING(medical,Inject_Morphine);
displayNameProgress = ECSTRING(medical,Injecting_Morphine);
allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"};
allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"};
allowSelfTreatment = 1;
category = "medication";
treatmentTime = 8;
items[] = {"ACE_morphine"};
callbackSuccess = QFUNC(treatmentBasic_morphine);
callbackSuccess = QFUNC(treatmentMorphine);
animationCaller = "AinvPknlMstpSnonWnonDnon_medic1";
litter[] = { {"All", "", {"ACE_MedicalLitter_morphine"}} };
sounds[] = {{QPATHTO_R(sounds\Inject.ogg),1,1,50}};
@ -49,21 +49,21 @@ class GVAR(Actions) {
displayNameProgress = ECSTRING(medical,Injecting_Epinephrine);
requiredMedic = QEGVAR(medical,medicSetting_basicEpi);
items[] = {"ACE_epinephrine"};
callbackSuccess = QFUNC(treatmentBasic_epipen);
callbackSuccess = QFUNC(treatmentEpipen);
litter[] = { {"All", "", {"ACE_MedicalLitter_epinephrine"}} };
treatmentLocations[] = {QGVAR(useLocation_basicEpi)};
};
class BloodIV: Bandage {
displayName = ECSTRING(medical,Transfuse_Blood);
displayNameProgress = ECSTRING(medical,Transfusing_Blood);
allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"};
allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"};
allowSelfTreatment = 0;
category = "advanced";
requiredMedic = 1;
treatmentTime = 12;
items[] = {"ACE_bloodIV"};
// callbackSuccess = QFUNC(treatmentBasic_bloodbag);
callbackSuccess = QFUNC(treatmentIV);
callbackSuccess = QFUNC(treatmentBloodbag);
// callbackSuccess = QFUNC(treatmentIV);
animationCaller = "AinvPknlMstpSnonWnonDnon_medic1";
litter[] = {};
};
@ -82,7 +82,7 @@ class GVAR(Actions) {
treatmentLocations[] = {"All"};
requiredMedic = 0;
treatmentTime = 15;
items[] = {"ACE_bodyBag"};
items[] = {"ACE_BodyBag"};
condition = "!alive _target";
callbackSuccess = QFUNC(actionPlaceInBodyBag);
callbackFailure = "";
@ -97,7 +97,7 @@ class GVAR(Actions) {
displayNameProgress = ECSTRING(medical,Actions_Diagnosing);
category = "examine";
treatmentLocations[] = {"All"};
allowedSelections[] = {"head", "body"};
allowedSelections[] = {"Head", "Body"};
requiredMedic = 0;
treatmentTime = 1;
items[] = {};
@ -114,13 +114,13 @@ class GVAR(Actions) {
displayNameProgress = ECSTRING(medical,Actions_PerformingCPR);
category = "advanced";
treatmentLocations[] = {"All"};
allowedSelections[] = {"body"};
allowedSelections[] = {"Body"};
allowSelfTreatment = 0;
requiredMedic = 0;
treatmentTime = 15;
items[] = {};
condition = QUOTE(!(_target call EFUNC(common,isAwake)) && EGVAR(medical,enableRevive) > 0);
callbackSuccess = QFUNC(treatmentAdvanced_CPR);
callbackSuccess = QFUNC(treatmentCPR);
callbackFailure = "";
callbackProgress = QUOTE((_this select 0 select 1) call EFUNC(common,isAwake));
animationPatient = "";
@ -152,7 +152,7 @@ class GVAR(Actions) {
condition = "";
patientStateCondition = 0;
// Callbacks
callbackSuccess = QFUNC(treatmentAdvanced_bandage);
callbackSuccess = QFUNC(treatmentBandage);
callbackFailure = "";
callbackProgress = "";
itemConsumed = 1;
@ -193,7 +193,7 @@ class GVAR(Actions) {
class Tourniquet: fieldDressing {
displayName = ECSTRING(medical,Apply_Tourniquet);
displayNameProgress = ECSTRING(medical,Applying_Tourniquet);
allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"};
allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"};
items[] = {"ACE_tourniquet"};
treatmentTime = 4;
callbackSuccess = QFUNC(treatmentTourniquet);
@ -203,11 +203,11 @@ class GVAR(Actions) {
class Morphine: fieldDressing {
displayName = ECSTRING(medical,Inject_Morphine);
displayNameProgress = ECSTRING(medical,Injecting_Morphine);
allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"};
allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"};
category = "medication";
items[] = {"ACE_morphine"};
treatmentTime = 3;
callbackSuccess = QFUNC(treatmentAdvanced_medication);
callbackSuccess = QFUNC(treatmentMedication);
animationCaller = "AinvPknlMstpSnonWnonDnon_medic1";
litter[] = { {"All", "", {"ACE_MedicalLitter_morphine"}} };
sounds[] = {{QPATHTO_R(sounds\Inject.ogg),1,1,50}};
@ -233,7 +233,7 @@ class GVAR(Actions) {
class BloodIV: fieldDressing {
displayName = ECSTRING(medical,Actions_Blood4_1000);
displayNameProgress = ECSTRING(medical,Transfusing_Blood);
allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"};
allowedSelections[] = {"LeftArm", "RightArm", "LeftLeg", "RightLeg"};
allowSelfTreatment = 0;
category = "advanced";
items[] = {"ACE_bloodIV"};
@ -290,7 +290,7 @@ class GVAR(Actions) {
patientStateCondition = QEGVAR(medical,useCondition_SurgicalKit);
treatmentTime = QUOTE(count (_target getVariable [ARR_2('EGVAR(medical,bandagedWounds)',[])]) * 5);
callbackSuccess = "";
callbackProgress = QFUNC(treatmentAdvanced_surgicalKit_onProgress);
callbackProgress = QFUNC(treatmentSurgicalKit_onProgress);
itemConsumed = QEGVAR(medical,consumeItem_SurgicalKit);
animationCaller = "AinvPknlMstpSnonWnonDnon_medic1";
litter[] = { {"All", "", {"ACE_MedicalLitter_gloves"} }};
@ -304,8 +304,8 @@ class GVAR(Actions) {
allowSelfTreatment = 0;
requiredMedic = QEGVAR(medical,medicSetting_PAK);
patientStateCondition = QEGVAR(medical,useCondition_PAK);
treatmentTime = QUOTE(_target call FUNC(treatmentAdvanced_fullHealTreatmentTime));
callbackSuccess = QFUNC(treatmentAdvanced_fullHeal);
treatmentTime = QUOTE(_target call FUNC(treatmentFullHealTreatmentTime));
callbackSuccess = QFUNC(treatmentFullHeal);
itemConsumed = QEGVAR(medical,consumeItem_PAK);
animationPatient = "";
animationPatientUnconscious = "AinjPpneMstpSnonWrflDnon_rolltoback";
@ -362,13 +362,13 @@ class GVAR(Actions) {
displayNameProgress = ECSTRING(medical,Actions_PerformingCPR);
category = "advanced";
treatmentLocations[] = {"All"};
allowedSelections[] = {"body"};
allowedSelections[] = {"Body"};
allowSelfTreatment = 0;
requiredMedic = 0;
treatmentTime = 15;
items[] = {};
condition = QUOTE(!(_target call EFUNC(common,isAwake)));
callbackSuccess = QFUNC(treatmentAdvanced_CPR);
callbackSuccess = QFUNC(treatmentCPR);
callbackFailure = "";
callbackProgress = QUOTE((_this select 0 select 1) call EFUNC(common,isAwake));
animationPatient = "";
@ -388,7 +388,7 @@ class GVAR(Actions) {
allowSelfTreatment = 0;
requiredMedic = 0;
treatmentTime = 15;
items[] = {"ACE_bodyBag"};
items[] = {"ACE_BodyBag"};
condition = "!alive _target";
callbackSuccess = QFUNC(actionPlaceInBodyBag);
callbackFailure = "";

View File

@ -13,47 +13,52 @@ PREP(addToLog);
PREP(addToTriageCard);
PREP(addUnloadPatientActions);
PREP(canAccessMedicalEquipment);
PREP(canTreat);
PREP(canTreatCached);
PREP(displayPatientInformation);
PREP(displayTriageCard);
PREP(dropDownTriageCard);
PREP(getTriageStatus);
PREP(handleBandageOpening);
PREP(hasItem);
PREP(hasItems);
PREP(isBeingCarried);
PREP(isBeingDragged);
PREP(medicationEffectLoop);
PREP(modifyMedicalAction);
PREP(onMedicationUsage);
// treaments
PREP(canTreat);
PREP(canTreatCached);
PREP(treatment);
PREP(treatmentAdvanced_CPR);
PREP(treatmentAdvanced_CPRLocal);
PREP(treatmentAdvanced_bandage);
PREP(treatmentAdvanced_bandageLocal);
PREP(treatmentAdvanced_fullHeal);
PREP(treatmentAdvanced_fullHealLocal);
PREP(treatmentAdvanced_fullHealTreatmentTime);
PREP(treatmentAdvanced_medication);
PREP(treatmentAdvanced_medicationLocal);
PREP(treatmentAdvanced_surgicalKit_onProgress);
PREP(treatmentBasic_bloodbag);
PREP(treatmentBasic_bloodbagLocal);
PREP(treatmentBasic_epipen);
PREP(treatmentBasic_morphine);
PREP(treatmentBasic_morphineLocal);
PREP(treatmentIV);
PREP(treatmentIVLocal);
PREP(treatment_success);
PREP(treatment_failure);
PREP(treatmentBandage);
PREP(treatmentBandageLocal);
PREP(treatmentTourniquet);
PREP(treatmentTourniquetLocal);
PREP(treatment_failure);
PREP(treatment_success);
PREP(treatmentMorphine);
PREP(treatmentMorphineLocal);
PREP(treatmentEpipen);
//PREP(treatmentEpipenLocal);
PREP(treatmentMedication);
PREP(treatmentMedicationLocal);
PREP(treatmentBloodbag);
PREP(treatmentBloodbagLocal);
PREP(treatmentIV);
PREP(treatmentIVLocal);
PREP(treatmentCPR);
PREP(treatmentCPRLocal);
PREP(treatmentFullHeal);
PREP(treatmentFullHealLocal);
PREP(treatmentFullHealTreatmentTime);
PREP(treatmentSurgicalKit_onProgress);
// items
PREP(checkItems);
PREP(hasItem);
PREP(hasItems);
PREP(useItem);
PREP(useItems);
PREP(checkItems);
// litter
PREP(litterCreate);
PREP(litterHandleCreate);

View File

@ -1,11 +1,18 @@
#include "script_component.hpp"
[QEGVAR(medical,initialized), {
params ["_unit"];
_unit call FUNC(checkItems);
}] call CBA_fnc_addEventHandler;
[QEGVAR(medical,initialized), FUNC(checkItems)] call CBA_fnc_addEventHandler;
if (isServer) then {
[QGVAR(createLitterServer), FUNC(litterHandleCreate)] call CBA_fnc_addEventHandler;
};
// treatment events
[QGVAR(treatmentBandageLocal), FUNC(treatmentBandageLocal)] call CBA_fnc_addEventHandler;
[QGVAR(treatmentMorphineLocal), FUNC(treatmentMorphineLocal)] call CBA_fnc_addEventHandler;
//[QGVAR(treatmentEpipenLocal), FUNC(treatmentEpipenLocal)] call CBA_fnc_addEventHandler;
[QGVAR(treatmentMedicationLocal), FUNC(treatmentMedicationLocal)] call CBA_fnc_addEventHandler;
[QGVAR(treatmentBloodbagLocal), FUNC(treatmentBloodbagLocal)] call CBA_fnc_addEventHandler;
[QGVAR(treatmentIVLocal), FUNC(treatmentIVLocal)] call CBA_fnc_addEventHandler;
[QGVAR(treatmentCPRLocal), FUNC(treatmentCPRLocal)] call CBA_fnc_addEventHandler;
[QGVAR(treatmentFullHealLocal), FUNC(treatmentFullHealLocal)] call CBA_fnc_addEventHandler;

View File

@ -5,7 +5,7 @@
* Arguments:
* 0: The medic <OBJECT>
* 1: The patient <OBJECT>
* 2: SelectionName <STRING>
* 2: Body part <STRING>
*
* Return Value:
* None
@ -15,20 +15,20 @@
#include "script_component.hpp"
params ["_caller", "_target", "_selectionName"];
TRACE_3("params",_caller,_target,_selectionName);
params ["_caller", "_target", "_bodyPart"];
TRACE_3("params",_caller,_target,_bodyPart);
// grab the required data
private _part = [_selectionName] call EFUNC(medical,selectionNameToNumber);
private _partIndex = ALL_BODY_PARTS find toLower _bodyPart;
private _tourniquets = _target getVariable [QEGVAR(medical,tourniquets), [0,0,0,0,0,0]];
// Check if there is a tourniquet on this bodypart
if ((_tourniquets select _part) == 0) exitWith {
if ((_tourniquets select _partIndex) == 0) exitWith {
[QEGVAR(common,displayTextStructured), [ELSTRING(medical,noTourniquetOnBodyPart), 1.5, _caller], [_caller]] call CBA_fnc_targetEvent;
};
// Removing the tourniquet
_tourniquets set [_part, 0];
_tourniquets set [_partIndex, 0];
_target setVariable [QEGVAR(medical,tourniquets), _tourniquets, true];
// Adding the tourniquet item to the caller
@ -37,10 +37,10 @@ _caller addItem "ACE_tourniquet";
//Handle all injected medications now that blood is flowing:
private _delayedMedications = _target getVariable [QGVAR(occludedMedications), []];
private _updatedArray = false;
TRACE_2("meds",_part,_delayedMedications);
TRACE_2("meds",_partIndex,_delayedMedications);
{
_x params ["", "", "_medPartNum"];
if (_part == _medPartNum) then {
if (_partIndex == _medPartNum) then {
TRACE_1("delayed medication call after tourniquet removeal",_x);
[QGVAR(treatmentAdvanced_medicationLocal), _x, [_target]] call CBA_fnc_targetEvent;
_delayedMedications set [_forEachIndex, -1];

View File

@ -44,9 +44,9 @@ if (isNumber (_config >> "requiredMedic")) then {
if !([_caller, _medicRequired] call EFUNC(medical,isMedic)) exitWith {false};
// check selection
private _allowedSelections = getArray (_config >> "allowedSelections");
private _allowedSelections = getArray (_config >> "allowedSelections") apply {toLower _x};
if !("All" in _allowedSelections || {(_selectionName in _allowedSelections)}) exitWith {false};
if !("all" in _allowedSelections || {(_selectionName in _allowedSelections)}) exitWith {false};
// check item
private _items = getArray (_config >> "items");
@ -88,9 +88,9 @@ if (isNumber (_config >> "patientStateCondition")) then {
if (_patientStateCondition == 1 && {!([_target] call EFUNC(medical,isInStableCondition))}) exitWith {false};
// check allowed locations
private _locations = getArray (_config >> "treatmentLocations");
private _locations = getArray (_config >> "treatmentLocations") apply {toLower _x};
if ("All" in _locations) then {
if ("all" in _locations) then {
_locations = true;
} else {
private _medFacility = {([_caller] call EFUNC(medical,isInMedicalFacility)) || ([_target] call EFUNC(medical,isInMedicalFacility))};

View File

@ -21,8 +21,10 @@ params ["_caller", "_target", "_selectionName", "_className"];
if (uiNamespace getVariable [QEGVAR(interact_menu,cursorMenuOpened), false]) exitWith {
[DFUNC(treatment), _this] call CBA_fnc_execNextFrame;
};
TRACE_1("banana",_this);
if !([_caller, _target, _selectionName, _className] call FUNC(canTreat)) exitWith {false};
TRACE_1("can treat",_this);
private _config = configFile >> QGVAR(Actions) >> CUR_LEVEL >> _className;

View File

@ -1,21 +0,0 @@
/**
* fn_heal.sqf
* @Descr: N/A
* @Author: Glowbal
*
* @Arguments: []
* @Return:
* @PublicAPI: false
*/
#include "script_component.hpp"
params ["_caller", "_target", "_selectionName", "_className", "_items"];
if (local _target) then {
[QGVAR(treatmentAdvanced_fullHealLocal), [_caller, _target]] call CBA_fnc_localEvent;
} else {
[QGVAR(treatmentAdvanced_fullHealLocal), [_caller, _target], _target] call CBA_fnc_targetEvent;
};
true;

View File

@ -5,8 +5,8 @@
* Arguments:
* 0: The medic <OBJECT>
* 1: The patient <OBJECT>
* 2: SelectionName <STRING>
* 3: Treatment classname <STRING>
* 2: Body part <STRING>
* 3: Treatment class name <STRING>
* 4: Item <STRING>
* 5: specific Spot <NUMBER> (default: -1)
*
@ -15,24 +15,19 @@
*
* Public: Yes
*/
#include "script_component.hpp"
params ["_caller", "_target", "_selectionName", "_className", "_items", "", ["_specificSpot", -1]];
params ["_caller", "_target", "_bodyPart", "_className", "_items", "", ["_specificSpot", -1]];
[_target, "activity", ELSTRING(medical,Activity_bandagedPatient), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog);
[_target, "activity_view", ELSTRING(medical,Activity_bandagedPatient), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message
if (local _target) then {
[QGVAR(treatmentAdvanced_bandageLocal), [_target, _className, _selectionName, _specificSpot]] call CBA_fnc_localEvent;
} else {
[QGVAR(treatmentAdvanced_bandageLocal), [_target, _className, _selectionName, _specificSpot], _target] call CBA_fnc_targetEvent;
};
[QGVAR(treatmentBandageLocal), [_target, _className, _bodyPart, _specificSpot], _target] call CBA_fnc_targetEvent;
/* {
/*{
if (_x != "") then {
[_target, _x] call FUNC(addToTriageCard);
};
}forEach _items;*/
} forEach _items;*/
true;
true

View File

@ -5,35 +5,38 @@
* Arguments:
* 0: The patient <OBJECT>
* 1: Treatment classname <STRING>
*
* 2: Body part <STRING>
*
* Return Value:
* Succesful treatment started <BOOL>
*
* Public: No
*/
#include "script_component.hpp"
params ["_target", "_bandage", "_selectionName", ["_specificClass", -1]];
params ["_target", "_bandage", "_bodyPart", ["_specificClass", -1]];
// Ensure it is a valid bodypart
private _part = [_selectionName] call EFUNC(medical,selectionNameToNumber);
if (_part < 0) exitWith {false};
private _partIndex = ALL_BODY_PARTS find toLower _bodyPart;
if (_partIndex < 0) exitWith {false};
// Get the open wounds for this unit
private _openWounds = _target getVariable [QEGVAR(medical,openWounds), []];
if (count _openWounds == 0) exitWith {false}; // nothing to do here!
// Get the default effectiveness for the used bandage
private _config = (configFile >> "ace_medical_treatment" >> "Bandaging");
private _config = configFile >> "ace_medical_treatment" >> "Bandaging";
private _effectiveness = getNumber (_config >> "effectiveness");
if (isClass (_config >> _bandage)) then {
systemchat "using class: " + _bandage;
systemchat ("using class: " + _bandage);
_config = (_config >> _bandage);
if (isNumber (_config >> "effectiveness")) then { _effectiveness = getNumber (_config >> "effectiveness");};
if (isNumber (_config >> "effectiveness")) then {
_effectiveness = getNumber (_config >> "effectiveness");
};
} else {
systemChat format["No bandage avialable"];
systemChat "No bandage avialable";
};
// Figure out which injury for this bodypart is the best choice to bandage
@ -42,11 +45,13 @@ private _mostEffectiveSpot = 0;
private _effectivenessFound = -1;
private _mostEffectiveInjury = _openWounds select 0;
private _exit = false;
{
_x params ["", "_classID", "_partX"];
_x params ["", "_classID", "_partIndexN"];
TRACE_2("OPENWOUND: ", _target, _x);
// Only parse injuries that are for the selected bodypart.
if (_partX == _part) then {
if (_partIndexN == _partIndex) then {
private _woundEffectiveness = _effectiveness;
// Select the classname from the wound classname storage
@ -55,7 +60,8 @@ private _exit = false;
// Check if this wound type has attributes specified for the used bandage
if (isClass (_config >> _className)) then {
// Collect the effectiveness from the used bandage for this wound type
private _woundTreatmentConfig = (_config >> _className);
private _woundTreatmentConfig = _config >> _className;
if (isNumber (_woundTreatmentConfig >> "effectiveness")) then {
_woundEffectiveness = getNumber (_woundTreatmentConfig >> "effectiveness");
};
@ -81,6 +87,7 @@ private _exit = false;
_mostEffectiveInjury = _x;
};
};
if (_exit) exitWith {};
} forEach _openWounds;
@ -89,15 +96,15 @@ if (_effectivenessFound == -1) exitWith {}; // Seems everything is patched up on
// TODO refactor this part
// Find the impact this bandage has and reduce the amount this injury is present
private _impact = if ((_mostEffectiveInjury select 3) >= _effectivenessFound) then {_effectivenessFound} else { (_mostEffectiveInjury select 3) };
_mostEffectiveInjury set [ 3, ((_mostEffectiveInjury select 3) - _impact) max 0];
private _impact = if (_mostEffectiveInjury select 3 >= _effectivenessFound) then {_effectivenessFound} else { _mostEffectiveInjury select 3 };
_mostEffectiveInjury set [3, ((_mostEffectiveInjury select 3) - _impact) max 0];
_openWounds set [_mostEffectiveSpot, _mostEffectiveInjury];
_target setVariable [QEGVAR(medical,openWounds), _openWounds, true];
// Handle the reopening of bandaged wounds
if (_impact > 0 && {EGVAR(medical,level) >= 2} && {EGVAR(medical,enableAdvancedWounds)}) then {
[_target, _impact, _part, _mostEffectiveSpot, _mostEffectiveInjury, _bandage] call FUNC(handleBandageOpening);
[_target, _impact, _partIndex, _mostEffectiveSpot, _mostEffectiveInjury, _bandage] call FUNC(handleBandageOpening);
};
// If all wounds to a body part have been bandaged, reset damage to that body part to zero
@ -118,13 +125,13 @@ if (EGVAR(medical,healHitPointAfterAdvBandage) || {EGVAR(medical,level) < 2}) th
// Loop through all current wounds and add up the number of unbandaged wounds on each body part.
{
_x params ["", "", "_bodyPart", "_numOpenWounds", "_bloodLoss"];
_x params ["", "", "_partIndex", "_numOpenWounds", "_bloodLoss"];
// Use switch/case for early termination if wounded limb is found before all six are checked.
// Number of wounds multiplied by blood loss will return zero for a fully
// bandaged body part, not incrementing the wound counter; or it will return
// some other number which will increment the wound counter.
switch (_bodyPart) do {
switch (_partIndex) do {
// Head
case 0: {
_headWounds = _headWounds + (_numOpenWounds * _bloodLoss);
@ -157,7 +164,7 @@ if (EGVAR(medical,healHitPointAfterAdvBandage) || {EGVAR(medical,level) < 2}) th
};
} forEach _currentWounds;
// ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"]
// ["Head", "Body", "LeftArm", "RightArm", "LeftLeg", "RightLeg"]
private _bodyStatus = _target getVariable [QEGVAR(medical,bodyPartStatus), [0,0,0,0,0,0]];
// Any body part that has no wounds is healed to full health
@ -185,4 +192,4 @@ if (EGVAR(medical,healHitPointAfterAdvBandage) || {EGVAR(medical,level) < 2}) th
[_target] call EFUNC(medical_damage,setDamage);
};
true;
true

View File

@ -1,25 +0,0 @@
/*
* Author: KoffeinFlummi
* Callback when the bloodbag treatment is complete
*
* Arguments:
* 0: The medic <OBJECT>
* 1: The patient <OBJECT>
* 2: Selection Name <STRING>
* 3: Treatment classname <STRING>
*
* Return Value:
* None
*
* Public: No
*/
#include "script_component.hpp"
params ["_caller", "_target", "_treatmentClassname"];
if (local _target) then {
[QGVAR(treatmentBasic_bloodbagLocal), [_target, _treatmentClassname]] call CBA_fnc_localEvent;
} else {
[QGVAR(treatmentBasic_bloodbagLocal), [_target, _treatmentClassname], _target] call CBA_fnc_targetEvent;
};

View File

@ -0,0 +1,21 @@
/*
* Author: KoffeinFlummi
* Callback when the bloodbag treatment is complete
*
* Arguments:
* 0: The medic <OBJECT>
* 1: The patient <OBJECT>
* 2: Body part <STRING>
* 3: Treatment class name <STRING>
*
* Return Value:
* None
*
* Public: No
*/
#include "script_component.hpp"
params ["_caller", "_target", "_treatmentClassname"];
[QGVAR(treatmentBloodbagLocal), [_target, _treatmentClassname], _target] call CBA_fnc_targetEvent;

View File

@ -5,8 +5,8 @@
* Arguments:
* 0: The medic <OBJECT>
* 1: The patient <OBJECT>
* 2: SelectionName <STRING>
* 3: Treatment classname <STRING>
* 2: Body part <STRING>
* 3: Treatment class name <STRING>
*
* Return Value:
* Succesful treatment started <BOOL>
@ -21,10 +21,7 @@ params ["_caller", "_target", "_selectionName", "_className", "_items"];
if (alive _target && {(_target getVariable [QEGVAR(medical,inCardiacArrest), false] || _target getVariable [QEGVAR(medical,inReviveState), false])}) then {
[_target, "activity_view", ELSTRING(medical,Activity_cpr), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog);
if (local _target) then {
[QGVAR(treatmentAdvanced_CPRLocal), [_caller, _target]] call CBA_fnc_localEvent;
} else {
[QGVAR(treatmentAdvanced_CPRLocal), [_caller, _target], _target] call CBA_fnc_targetEvent;
};
[QGVAR(treatmentCPRLocal), [_caller, _target], _target] call CBA_fnc_targetEvent;
};
true;
true

View File

@ -14,10 +14,11 @@
#include "script_component.hpp"
params ["_caller","_target"];
params ["_caller", "_target"];
if (_target getVariable [QEGVAR(medical,inReviveState), false]) then {
private _reviveStartTime = _target getVariable [QEGVAR(medical,reviveStartTime),0];
if (_reviveStartTime > 0) then {
_target setVariable [QEGVAR(medical,reviveStartTime), (_reviveStartTime + random(20)) min CBA_missionTime];
};
@ -32,4 +33,4 @@ if (EGVAR(medical,level) > 1 && {(random 1) >= 0.6}) then {
[_target, "activity", ELSTRING(medical,Activity_CPR), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog);
[_target, "activity_view", ELSTRING(medical,Activity_CPR), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message
true;
true

View File

@ -5,8 +5,8 @@
* Arguments:
* 0: The medic <OBJECT>
* 1: The patient <OBJECT>
* 2: Selection Name <STRING>
* 3: Treatment classname <STRING>
* 2: Body part <STRING>
* 3: Treatment class name <STRING>
*
* Return Value:
* None
@ -15,6 +15,6 @@
*/
#include "script_component.hpp"
params ["_caller", "_target","_className"];
params ["_caller", "_target"];
[_target, false] call EFUNC(medical,setUnconscious);

View File

@ -0,0 +1,23 @@
/*
* Author: Glowbal
* Full heal treatment
*
* Arguments:
* 0: The medic <OBJECT>
* 1: The patient <OBJECT>
* 2: Body part <STRING>
* 3: Treatment class name <STRING>
* 4: Item <STRING>
*
* Return Value:
* Succesful treatment started <BOOL>
*
* Public: Yes
*/
#include "script_component.hpp"
params ["_caller", "_target"];
[QGVAR(treatmentFullHealLocal), [_caller, _target], _target] call CBA_fnc_targetEvent;
true

View File

@ -1,19 +1,21 @@
/**
* fn_healLocal.sqf
* @Descr: N/A
* @Author: Glowbal
/*
* Author: Glowbal
* Handles full heal of a patient.
*
* @Arguments: []
* @Return:
* @PublicAPI: false
* Arguments:
* 0: The medic <OBJECT>
* 1: The patient <OBJECT>
*
* Return Value:
* Succesful treatment started <BOOL>
*
* Public: No
*/
#include "script_component.hpp"
params ["_caller", "_target"];
if (alive _target) exitWith {
_target setVariable [QEGVAR(medical,pain), 0, true];
_target setVariable [QEGVAR(medical,morphine), 0, true];
_target setVariable [QEGVAR(medical,bloodVolume), 100, true];
@ -58,6 +60,7 @@ if (alive _target) exitWith {
// medication
private _allUsedMedication = _target getVariable [QEGVAR(medical,allUsedMedication), []];
{
_target setVariable [_x select 0, nil];
} forEach _allUsedMedication;

View File

@ -9,16 +9,18 @@
* treatment time <NUMBER>
*
* Example:
* [_target] call ace_medical_fnc_treatmentAdvanced_fullHealTreatmentTime
* [_target] call ace_medical_treatment_fnc_treatmentFullHealTreatmentTime
*
* Public: No
*/
#include "script_component.hpp"
params ["_unit"];
private _totalDamage = 0;
{
_totalDamage = _totalDamage + _x;
} forEach (_this getVariable [QEGVAR(medical,bodyPartStatus), []]);
} forEach (_unit getVariable [QEGVAR(medical,bodyPartStatus), []]);
(10 max (_totalDamage * 10) min 120)
10 max (_totalDamage * 10) min 120

View File

@ -21,11 +21,8 @@ params ["_caller", "_target", "_selectionName", "_className", "_items"];
if (_items isEqualTo []) exitWith {false};
_items params ["_removeItem"];
if (local _target) then {
[QGVAR(treatmentIVLocal), [_target, _className]] call CBA_fnc_localEvent;
} else {
[QGVAR(treatmentIVLocal), [_target, _className], _target] call CBA_fnc_targetEvent;
};
[QGVAR(treatmentIVLocal), [_target, _className], _target] call CBA_fnc_targetEvent;
[_target, _removeItem] call FUNC(addToTriageCard);
[_target, "activity", ELSTRING(medical,Activity_gaveIV), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog);

View File

@ -18,6 +18,7 @@
params ["_target", "_treatmentClassname"];
private _bloodVolume = _target getVariable [QEGVAR(medical,bloodVolume), 100];
if (_bloodVolume >= 100) exitWith {};
// Find the proper attributes for the used IV

View File

@ -5,8 +5,8 @@
* Arguments:
* 0: The medic <OBJECT>
* 1: The patient <OBJECT>
* 2: SelectionName <STRING>
* 3: Treatment classname <STRING>
* 2: Body part <STRING>
* 3: Treatment class name <STRING>
* 4: Items Used <ARRAY>
*
* Return Value:
@ -14,15 +14,14 @@
*
* Public: Yes
*/
#include "script_component.hpp"
params ["_caller", "_target", "_selectionName", "_className", "_items"];
TRACE_5("params",_caller,_target,_selectionName,_className,_items);
params ["_caller", "_target", "_bodyPart", "_className", "_items"];
TRACE_5("params",_caller,_target,_bodyPart,_className,_items);
private _part = [_selectionName] call EFUNC(medical,selectionNameToNumber);
private _partIndex = ALL_BODY_PARTS find toLower _bodyPart;
[QGVAR(treatmentAdvanced_medicationLocal), [_target, _className, _part], [_target]] call CBA_fnc_targetEvent;
[QGVAR(treatmentMedicationLocal), [_target, _className, _partIndex], [_target]] call CBA_fnc_targetEvent;
{
if (_x != "") then {
@ -32,5 +31,4 @@ private _part = [_selectionName] call EFUNC(medical,selectionNameToNumber);
};
} forEach _items;
true;
true

View File

@ -12,23 +12,25 @@
*
* Public: Yes
*/
#include "script_component.hpp"
params ["_target", "_className", "_partNumber"];
TRACE_3("params",_target,_className,_partNumber);
private _tourniquets = _target getVariable [QEGVAR(medical,tourniquets), [0,0,0,0,0,0]];
if ((_tourniquets select _partNumber) > 0) exitWith {
if (_tourniquets select _partNumber > 0) exitWith {
TRACE_1("unit has tourniquets blocking blood flow on injection site",_tourniquets);
private _delayedMedications = _target getVariable [QGVAR(occludedMedications), []];
_delayedMedications pushBack _this;
_target setVariable [QGVAR(occludedMedications), _delayedMedications, true];
true
};
// We have added a new dose of this medication to our system, so let's increase it
private _varName = format[QGVAR(%1_inSystem), _className];
private _varName = format [QGVAR(%1_inSystem), _className];
private _currentInSystem = _target getVariable [_varName, 0];
_target setVariable [_varName, _currentInSystem + 1];
@ -44,6 +46,7 @@ private _viscosityChange = getNumber (_medicationConfig >> "viscosityChange");
private _hrCallback = getText (_medicationConfig >> "hrCallback");
private _inCompatableMedication = [];
if (isClass (_medicationConfig >> _className)) then {
_medicationConfig = (_medicationConfig >> _className);
if (isNumber (_medicationConfig >> "painReduce")) then { _painReduce = getNumber (_medicationConfig >> "painReduce");};
@ -56,15 +59,20 @@ if (isClass (_medicationConfig >> _className)) then {
if (isNumber (_medicationConfig >> "viscosityChange")) then { _viscosityChange = getNumber (_medicationConfig >> "viscosityChange"); };
if (isText (_medicationConfig >> "hrCallback")) then { _hrCallback = getText (_medicationConfig >> "hrCallback"); };
};
if (isNil _hrCallback) then {
_hrCallback = compile _hrCallback;
} else {
_hrCallback = missionNamespace getVariable _hrCallback;
};
if (!(_hrCallback isEqualType {})) then {_hrCallback = {TRACE_1("callback was NOT code",_hrCallback)};};
if !(_hrCallback isEqualType {}) then {
_hrCallback = {TRACE_1("callback was NOT code",_hrCallback)};
};
// Adjust the heart rate based upon config entry
private _heartRate = _target getVariable [QEGVAR(medical,heartRate), 70];
if (alive _target) then {
if (_heartRate > 0) then {
if (_heartRate <= 45) then {

View File

@ -5,22 +5,18 @@
* Arguments:
* 0: The medic <OBJECT>
* 1: The patient <OBJECT>
* 2: Selection Name <STRING>
* 3: Treatment classname <STRING>
* 2: Body part <STRING>
* 3: Treatment class name <STRING>
*
* Return Value:
* None
*
* Public: No
*/
#include "script_component.hpp"
#define MORPHINEHEAL 0.4
params ["_caller", "_target"];
if (local _target) then {
[QGVAR(treatmentBasic_morphineLocal), [_target]] call CBA_fnc_localEvent;
} else {
[QGVAR(treatmentBasic_morphineLocal), [_target], _target] call CBA_fnc_targetEvent;
};
[QGVAR(treatmentMorphineLocal), [_target], _target] call CBA_fnc_targetEvent;

View File

@ -3,16 +3,15 @@
* Local callback when the morphine treatment is complete
*
* Arguments:
* 0: The medic <OBJECT>
* 1: The patient <OBJECT>
* 0: The patient <OBJECT>
*
* Return Value:
* None
*
* Public: No
*/
#include "script_component.hpp"
#define MORPHINEHEAL 0.4
params ["_target"];

View File

@ -25,7 +25,7 @@ private _bandagedWounds = _target getVariable [QEGVAR(medical,bandagedWounds), [
if (count _bandagedWounds == 0) exitWith { false };
//Has enough time elapsed that we can close another wound?
if ((_totalTime - _elapsedTime) <= (((count _bandagedWounds) - 1) * 5)) then {
if (_totalTime - _elapsedTime <= (count _bandagedWounds - 1) * 5) then {
_bandagedWounds deleteAt 0;
_target setVariable [QEGVAR(medical,bandagedWounds), _bandagedWounds, true];
};

View File

@ -5,41 +5,35 @@
* Arguments:
* 0: The medic <OBJECT>
* 1: The patient <OBJECT>
* 2: SelectionName <STRING>
* 3: Treatment classname <STRING>
*
* 2: Body part <STRING>
* 3: Treatment class name <STRING>
*
* Return Value:
* Succesful treatment started <BOOL>
*
* Public: No
*/
#include "script_component.hpp"
params ["_caller", "_target", "_selectionName", "_className", "_items"];
params ["_caller", "_target", "_bodyPart", "_className", "_items"];
if (count _items == 0) exitWith {false};
private _part = [_selectionName] call EFUNC(medical,selectionNameToNumber);
if (_part == 0 || _part == 1) exitWith {
// [QEGVAR(common,displayTextStructured), ["You cannot apply a CAT on this body part!"], [_caller]] call CBA_fnc_targetEvent;
false;
};
private _partIndex = ALL_BODY_PARTS find toLower _bodyPart;
if (_partIndex == 0 || _partIndex == 1) exitWith {false};
private _tourniquets = _target getVariable [QEGVAR(medical,tourniquets), [0,0,0,0,0,0]];
if ((_tourniquets select _part) > 0) exitWith {
if (_tourniquets select _partIndex > 0) exitWith {
_output = "There is already a tourniquet on this body part!"; // TODO localization
[QEGVAR(common,displayTextStructured), [_output, 1.5, _caller], [_caller]] call CBA_fnc_targetEvent;
false;
false
};
private _removeItem = _items select 0;
if (local _target) then {
[QGVAR(treatmentTourniquetLocal), [_target, _removeItem, _selectionName]] call CBA_fnc_localEvent;
} else {
[QGVAR(treatmentTourniquetLocal), [_target, _removeItem, _selectionName], _target] call CBA_fnc_targetEvent;
};
[QGVAR(treatmentTourniquetLocal), [_target, _removeItem, _selectionName], _target] call CBA_fnc_targetEvent;
[_target, _removeItem] call FUNC(addToTriageCard);
[_target, "activity", ELSTRING(medical,Activity_appliedTourniquet), [[_caller, false, true] call EFUNC(common,getName)]] call FUNC(addToLog);

View File

@ -5,6 +5,7 @@
* Arguments:
* 0: The patient <OBJECT>
* 1: Item used classname <STRING>
* 2: Body part <STRING>
*
* Return Value:
* None
@ -13,14 +14,16 @@
*/
#include "script_component.hpp"
params ["_target", "_tourniquetItem", "_selectionName"];
params ["_target", "_tourniquetItem", "_bodyPart"];
//If we're not already tracking vitals, start:
[_target] call EFUNC(medical,addVitalLoop);
private _part = [_selectionName] call EFUNC(medical,selectionNameToNumber);
private _partIndex = ALL_BODY_PARTS find toLower _bodyPart;
// Place a tourniquet on the bodypart
private _tourniquets = _target getVariable [QEGVAR(medical,tourniquets), [0,0,0,0,0,0]];
_tourniquets set [_part, CBA_missionTime];
_tourniquets set [_partIndex, CBA_missionTime];
_target setVariable [QEGVAR(medical,tourniquets), _tourniquets, true];

View File

@ -5,7 +5,7 @@
* Arguments:
* 0: The medic <OBJECT>
* 1: The patient <OBJECT>
* 2: SelectionName <STRING>
* 2: Body part <STRING>
* 3: Treatment classname <STRING>
* 4: Items available <ARRAY<STRING>>
*
@ -17,7 +17,7 @@
#include "script_component.hpp"
params ["_args"];
_args params ["_caller", "_target", "_selectionName", "_className", "_items", "_usersOfItems"];
_args params ["_caller", "_target", "_bodyPart", "_className", "_items", "_usersOfItems"];
// switch to end anim immediately
private _endInAnim = _caller getVariable QGVAR(endInAnim);
@ -50,10 +50,10 @@ if !(_callback isEqualType {}) then {
//Get current blood loose on limb (for "bloody" litter)
private _bloodLossOnSelection = 0;
private _partNumber = ([_selectionName] call EFUNC(medical,selectionNameToNumber)) max 0;
private _partNumber = (ALL_BODY_PARTS find toLower _bodyPart) max 0;
// Add all bleeding from wounds on selection
private _openWounds = _target getvariable [QGVAR(openWounds), []];
private _openWounds = _target getvariable [QEGVAR(medical,openWounds), []];
{
_x params ["", "", "_selectionX", "_amountOf", "_percentageOpen"];
if (_selectionX == _partNumber) then {
@ -71,4 +71,4 @@ if (!(_target getVariable [QGVAR(addedToUnitLoop),false])) then {
[_target] call FUNC(addVitalLoop);
};
["ace_treatmentSucceded", [_caller, _target, _selectionName, _className]] call CBA_fnc_localEvent;
["ace_treatmentSucceded", [_caller, _target, _bodyPart, _className]] call CBA_fnc_localEvent;

View File

@ -2,9 +2,8 @@
#define COMPONENT_BEAUTIFIED Medical Treatment
#include "\z\ace\addons\main\script_mod.hpp"
// #define DEBUG_MODE_FULL
#define DEBUG_MODE_FULL
#define DISABLE_COMPILE_CACHE
// #define CBA_DEBUG_SYNCHRONOUS
// #define ENABLE_PERFORMANCE_COUNTERS
#ifdef DEBUG_ENABLED_MEDICAL_TREATMENT
@ -17,4 +16,6 @@
#include "\z\ace\addons\main\script_macros.hpp"
#define ALL_BODY_PARTS ["head", "body", "leftarm", "rightarm", "leftleg", "rightleg"]
#define CUR_LEVEL (["Basic", "Advanced"] select (EGVAR(medical,level) >= 2))