'modernize' primary treatment functions, fix animation issues, add anim speed scaling

This commit is contained in:
commy2 2016-09-29 16:00:19 +02:00
parent 410c5f1d5f
commit 36d244a868
10 changed files with 249 additions and 302 deletions

View File

@ -0,0 +1,11 @@
class CfgMovesBasic;
class CfgMovesMaleSdr: CfgMovesBasic {
class States {
// fixes hand being stuck at rifle which is on the back
class AmovPknlMstpSrasWrflDnon_AinvPknlMstpSlayWrflDnon;
class AinvPknlMstpSlayWnonDnon_medicOther: AmovPknlMstpSrasWrflDnon_AinvPknlMstpSlayWrflDnon {
weaponIK = 0;
};
};
};

View File

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

View File

@ -1,5 +1,5 @@
class ACE_Medical_Treatment_Actions {
class GVAR(Actions) {
class Basic {
class Bandage {
displayName = ECSTRING(medical,Bandage);
@ -22,7 +22,7 @@ class ACE_Medical_Treatment_Actions {
animationPatient = "";
animationPatientUnconscious = "AinjPpneMstpSnonWrflDnon_rolltoback";
animationPatientUnconsciousExcludeOn[] = {"ainjppnemstpsnonwrfldnon"};
animationCaller = "AinvPknlMstpSlayWrflDnon_medicOther";
animationCaller = "AinvPknlMstpSlayW[wpn]Dnon_medicOther";
animationCallerProne = "AinvPpneMstpSlayW[wpn]Dnon_medicOther";
animationCallerSelf = "AinvPknlMstpSlayW[wpn]Dnon_medic";
animationCallerSelfProne = "AinvPpneMstpSlayW[wpn]Dnon_medic";
@ -37,7 +37,7 @@ class ACE_Medical_Treatment_Actions {
allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"};
allowSelfTreatment = 1;
category = "medication";
treatmentTime = 2;
treatmentTime = 8;
items[] = {"ACE_morphine"};
callbackSuccess = QUOTE(DFUNC(treatmentBasic_morphine));
animationCaller = "AinvPknlMstpSnonWnonDnon_medic1";
@ -50,7 +50,7 @@ class ACE_Medical_Treatment_Actions {
allowSelfTreatment = 1;
category = "medication";
requiredMedic = QEGVAR(medical,medicSetting_basicEpi);
treatmentTime = 3;
treatmentTime = 8;
items[] = {"ACE_epinephrine"};
callbackSuccess = QUOTE(DFUNC(treatmentBasic_epipen));
animationCaller = "AinvPknlMstpSnonWnonDnon_medic1";
@ -64,7 +64,7 @@ class ACE_Medical_Treatment_Actions {
allowSelfTreatment = 0;
category = "advanced";
requiredMedic = 1;
treatmentTime = 20;
treatmentTime = 12;
items[] = {"ACE_bloodIV"};
// callbackSuccess = QUOTE(DFUNC(treatmentBasic_bloodbag));
callbackSuccess = QUOTE(DFUNC(treatmentIV));
@ -85,9 +85,9 @@ class ACE_Medical_Treatment_Actions {
category = "advanced";
treatmentLocations[] = {"All"};
requiredMedic = 0;
treatmentTime = 4;
treatmentTime = 20;
items[] = {"ACE_bodyBag"};
condition = "!alive (_this select 1);";
condition = "!alive _target";
callbackSuccess = QUOTE(DFUNC(actionPlaceInBodyBag));
callbackFailure = "";
callbackProgress = "";
@ -123,13 +123,13 @@ class ACE_Medical_Treatment_Actions {
requiredMedic = 0;
treatmentTime = 15;
items[] = {};
condition = QUOTE(!([(_this select 1)] call ace_common_fnc_isAwake) && EGVAR(medical,enableRevive)>0);
condition = QUOTE(!(_target call EFUNC(common,isAwake)) && EGVAR(medical,enableRevive) > 0);
callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_CPR));
callbackFailure = "";
callbackProgress = "!([((_this select 0) select 1)] call ace_common_fnc_isAwake)";
callbackProgress = QUOTE((_this select 0 select 1) call EFUNC(common,isAwake));
animationPatient = "";
animationPatientUnconscious = "AinjPpneMstpSnonWrflDnon_rolltoback";
animationCaller = "AinvPknlMstpSlayWnonDnon_medic";
animationCaller = "AinvPknlMstpSlayW[wpn]Dnon_medic";
animationCallerProne = "AinvPpneMstpSlayW[wpn]Dnon_medic";
animationCallerSelf = "";
animationCallerSelfProne = "";
@ -201,7 +201,7 @@ class ACE_Medical_Treatment_Actions {
items[] = {"ACE_tourniquet"};
treatmentTime = 4;
callbackSuccess = QUOTE(DFUNC(treatmentTourniquet));
condition = QUOTE(!([ARR_2(_this select 1, _this select 2)] call EFUNC(medical,hasTourniquetAppliedTo)));
condition = QUOTE(!([ARR_2(_target,_selectionName)] call EFUNC(medical,hasTourniquetAppliedTo)));
litter[] = {};
};
class Morphine: fieldDressing {
@ -291,7 +291,7 @@ class ACE_Medical_Treatment_Actions {
allowSelfTreatment = 0;
requiredMedic = QEGVAR(medical,medicSetting_SurgicalKit);
patientStateCondition = QEGVAR(medical,useCondition_SurgicalKit);
treatmentTime = "(count ((_this select 1) getVariable ['ACE_Medical_bandagedWounds', []]) * 5)";
treatmentTime = QUOTE(count (_target getVariable [ARR_2('EGVAR(medical,bandagedWounds)',[])]) * 5);
callbackSuccess = "";
callbackProgress = QUOTE(DFUNC(treatmentAdvanced_surgicalKit_onProgress));
itemConsumed = QEGVAR(medical,consumeItem_SurgicalKit);
@ -307,12 +307,12 @@ class ACE_Medical_Treatment_Actions {
allowSelfTreatment = 0;
requiredMedic = QEGVAR(medical,medicSetting_PAK);
patientStateCondition = QEGVAR(medical,useCondition_PAK);
treatmentTime = QUOTE((_this select 1) call FUNC(treatmentAdvanced_fullHealTreatmentTime));
treatmentTime = QUOTE(_target call FUNC(treatmentAdvanced_fullHealTreatmentTime));
callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_fullHeal));
itemConsumed = QEGVAR(medical,consumeItem_PAK);
animationPatient = "";
animationPatientUnconscious = "AinjPpneMstpSnonWrflDnon_rolltoback";
animationCaller = "AinvPknlMstpSlayWnonDnon_medicOther";
animationCaller = "AinvPknlMstpSlayW[wpn]Dnon_medicOther";
animationCallerProne = "AinvPpneMstpSlayW[wpn]Dnon_medicOther";
animationCallerSelf = "";
animationCallerSelfProne = "";
@ -356,7 +356,7 @@ class ACE_Medical_Treatment_Actions {
items[] = {};
treatmentTime = 2.5;
callbackSuccess = QUOTE(DFUNC(actionRemoveTourniquet));
condition = QUOTE([ARR_2(_this select 1, _this select 2)] call EFUNC(medical,hasTourniquetAppliedTo));
condition = QUOTE([ARR_2(_target,_selectionName)] call EFUNC(medical,hasTourniquetAppliedTo));
displayNameProgress = ECSTRING(medical,RemovingTourniquet);
litter[] = {};
};
@ -370,13 +370,13 @@ class ACE_Medical_Treatment_Actions {
requiredMedic = 0;
treatmentTime = 15;
items[] = {};
condition = "!([(_this select 1)] call ace_common_fnc_isAwake)";
condition = QUOTE(!(_target call EFUNC(common,isAwake)));
callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_CPR));
callbackFailure = "";
callbackProgress = "!([((_this select 0) select 1)] call ace_common_fnc_isAwake)";
callbackProgress = QUOTE((_this select 0 select 1) call EFUNC(common,isAwake));
animationPatient = "";
animationPatientUnconscious = "AinjPpneMstpSnonWrflDnon_rolltoback";
animationCaller = "AinvPknlMstpSlayWnonDnon_medic";
animationCaller = "AinvPknlMstpSlayW[wpn]Dnon_medic";
animationCallerProne = "AinvPpneMstpSlayW[wpn]Dnon_medic";
animationCallerSelf = "";
animationCallerSelfProne = "";
@ -392,7 +392,7 @@ class ACE_Medical_Treatment_Actions {
requiredMedic = 0;
treatmentTime = 15;
items[] = {"ACE_bodyBag"};
condition = "!alive (_this select 1);";
condition = "!alive _target";
callbackSuccess = QUOTE(DFUNC(actionPlaceInBodyBag));
callbackFailure = "";
callbackProgress = "";

View File

@ -4,4 +4,28 @@ ADDON = false;
#include "XEH_PREP.hpp"
// config to determine animation acceleration coefficient
// adjusting these is trail and error
// if the animation is cut of ingame, increase these values
// if the unit idles too much, decrease them
GVAR(animDurations) = [] call CBA_fnc_createNamespace;
{
GVAR(animDurations) setVariable _x;
} forEach [
["AinvPknlMstpSlayWnonDnon_medic", 9],
["AinvPknlMstpSlayWnonDnon_medicOther", 8.5],
["AinvPpneMstpSlayWnonDnon_medic", 7.5],
["AinvPpneMstpSlayWnonDnon_medicOther", 8.5],
["AinvPknlMstpSlayWrflDnon_medic", 7],
["AinvPknlMstpSlayWrflDnon_medicOther", 7],
["AinvPpneMstpSlayWrflDnon_medic", 9.5],
["AinvPpneMstpSlayWrflDnon_medicOther", 9],
["AinvPknlMstpSlayWlnrDnon_medic", 14],
["AinvPknlMstpSlayWpstDnon_medic", 10],
["AinvPknlMstpSlayWpstDnon_medicOther", 10],
["AinvPpneMstpSlayWpstDnon_medic", 10],
["AinvPpneMstpSlayWpstDnon_medicOther", 8.5]
];
ADDON = true;

View File

@ -16,85 +16,103 @@
*
* Public: Yes
*/
#define DEBUG_MODE_FULL
#include "script_component.hpp"
params ["_caller", "_target", "_selectionName", "_className"];
if !(_target isKindOf "CAManBase") exitWith { false };
if !(_target isKindOf "CAManBase") exitWith {false};
private _config = (configFile >> "ACE_Medical_Treatment_Actions" >> (["Basic", "Advanced"] select (EGVAR(medical,level)>=2)) >> _className);
private _config = configFile >> QGVAR(Actions) >> CUR_LEVEL >> _className;
if !(isClass _config) exitwith {false};
// Allow self treatment check
if (_caller == _target && {getNumber (_config >> "allowSelfTreatment") == 0}) exitwith {false};
// allow self treatment check
private _isSelf = _caller isEqualTo _target;
private _medicRequired = if (isNumber (_config >> "requiredMedic")) then {
getNumber (_config >> "requiredMedic");
if (_isSelf && {getNumber (_config >> "allowSelfTreatment") == 0}) exitwith {false};
private _medicRequired = 0;
if (isNumber (_config >> "requiredMedic")) then {
_medicRequired = getNumber (_config >> "requiredMedic");
} else {
// Check for required class
if (isText (_config >> "requiredMedic")) exitwith {
missionNamespace getVariable [getText (_config >> "requiredMedic"), 0];
if (isText (_config >> "requiredMedic")) then {
_medicRequired = missionNamespace getVariable [getText (_config >> "requiredMedic"), 0];
};
0;
};
if !([_caller, _medicRequired] call EFUNC(medical,isMedic)) exitwith { false };
private _items = getArray (_config >> "items");
if (count _items > 0 && {!([_caller, _target, _items] call FUNC(hasItems))}) exitwith { false };
if !([_caller, _medicRequired] call EFUNC(medical,isMedic)) exitWith {false};
// check selection
private _allowedSelections = getArray (_config >> "allowedSelections");
if !("All" in _allowedSelections || {(_selectionName in _allowedSelections)}) exitwith { false };
private _return = true;
if (getText (_config >> "condition") != "") then {
private _condition = getText (_config >> "condition");
if (isnil _condition) then {
if !("All" in _allowedSelections || {(_selectionName in _allowedSelections)}) exitWith {false};
// check item
private _items = getArray (_config >> "items");
if (count _items > 0 && {!([_caller, _target, _items] call FUNC(hasItems))}) exitWith {false};
private _condition = true;
if (isText (_config >> "condition")) then {
_condition = getText (_config >> "condition");
if (_condition isEqualTo "") exitWith {
_condition = true;
};
if (isNil _condition) then {
_condition = compile _condition;
} else {
_condition = missionNamespace getVariable _condition;
};
if (_condition isEqualType false) then {
_return = _condition;
} else {
_return = [_caller, _target, _selectionName, _className] call _condition;
if !(_condition isEqualType false) then {
_condition = call _condition;
};
};
if (!_return) exitwith {
false;
};
private _patientStateCondition = if (isText(_config >> "patientStateCondition")) then {
missionNamespace getVariable [getText(_config >> "patientStateCondition"), 0]
if !(_condition) exitWith {false};
private _patientStateCondition = 0;
if (isNumber (_config >> "patientStateCondition")) then {
_patientStateCondition = getNumber (_config >> "patientStateCondition");
} else {
getNumber(_config >> "patientStateCondition")
if (isText (_config >> "patientStateCondition")) then {
_patientStateCondition = missionNamespace getVariable [getText (_config >> "patientStateCondition"), 0];
};
};
if (_patientStateCondition == 1 && {!([_target] call EFUNC(medical,isInStableCondition))}) exitwith {false};
if (_patientStateCondition == 1 && {!([_target] call EFUNC(medical,isInStableCondition))}) exitWith {false};
// check allowed locations
private _locations = getArray (_config >> "treatmentLocations");
if ("All" in _locations) exitwith { true };
private _medFacility = {([_caller] call EFUNC(medical,isInMedicalFacility)) || ([_target] call EFUNC(medical,isInMedicalFacility))};
private _medVeh = {([_caller] call EFUNC(medical,isInMedicalVehicle)) || ([_target] call EFUNC(medical,isInMedicalVehicle))};
if ("All" in _locations) then {
_locations = true;
} else {
private _medFacility = {([_caller] call EFUNC(medical,isInMedicalFacility)) || ([_target] call EFUNC(medical,isInMedicalFacility))};
private _medVeh = {([_caller] call EFUNC(medical,isInMedicalVehicle)) || ([_target] call EFUNC(medical,isInMedicalVehicle))};
{
if (_x == "field") exitwith {_return = true;};
if (_x == "MedicalFacility" && _medFacility) exitwith {_return = true;};
if (_x == "MedicalVehicle" && _medVeh) exitwith {_return = true;};
if !(isnil _x) exitwith {
private _val = missionNamespace getVariable _x;
if (_val isEqualType 0) then {
_return = switch (_val) do {
case 0: {true}; //AdvancedMedicalSettings_anywhere
case 1: {call _medVeh}; //AdvancedMedicalSettings_vehicle
case 2: {call _medFacility}; //AdvancedMedicalSettings_facility
case 3: {(call _medFacility) || {call _medVeh}}; //AdvancedMedicalSettings_vehicleAndFacility
default {false}; //Disabled
{
if (_x == "field") exitWith { _locations = true; };
if (_x == "MedicalFacility" && _medFacility) exitWith { _locations = true; };
if (_x == "MedicalVehicle" && _medVeh) exitWith { _locations = true; };
if !(isNil _x) exitWith {
_locations = missionNamespace getVariable _x;
if !(_locations isEqualType false) then {
if (_locations isEqualTo 0) exitWith { _locations = true; }; //AdvancedMedicalSettings_anywhere
if (_locations isEqualTo 1) exitWith { _locations = call _medVeh; }; //AdvancedMedicalSettings_vehicle
if (_locations isEqualTo 2) exitWith { _locations = call _medFacility; }; //AdvancedMedicalSettings_facility
if (_locations isEqualTo 3) exitWith { _locations = call _medFacility || {call _medVeh}; }; //AdvancedMedicalSettings_vehicleAndFacility
_locations = false; //Disabled
};
};
};
} foreach _locations;
} forEach _locations;
};
_return;
_locations

View File

@ -32,7 +32,7 @@ if !(EGVAR(medical,allowLitterCreation)) exitWith {};
// Don't create litter if medic or patient are inside a vehicle
if (vehicle _caller != _caller || {vehicle _target != _target}) exitWith {};
private _config = configFile >> "ACE_Medical_Treatment_Actions" >> ["Basic", "Advanced"] select (EGVAR(medical,level) >= 2) >> _className;
private _config = configFile >> "ACE_Medical_Treatment_Actions" >> CUR_LEVEL >> _className;
if !(isClass _config) exitWith {TRACE_1("No action config",_className);};
if !(isArray (_config >> "litter")) exitWith {TRACE_1("No litter config",_className);};

View File

@ -18,131 +18,56 @@
params ["_caller", "_target", "_selectionName", "_className"];
// If the cursorMenu is open, the loading bar will fail. If we execute the function one frame later, it will work fine
if (uiNamespace getVariable [QEGVAR(interact_menu,cursorMenuOpened),false]) exitwith {
// if the cursorMenu is open, the loading bar will fail. If we execute the function one frame later, it will work fine
if (uiNamespace getVariable [QEGVAR(interact_menu,cursorMenuOpened), false]) exitWith {
[DFUNC(treatment), _this] call CBA_fnc_execNextFrame;
};
if !(_target isKindOf "CAManBase") exitWith {false};
if !([_caller, _target, _selectionName, _className] call FUNC(canTreat)) exitWith {false};
private _config = (configFile >> "ACE_Medical_Treatment_Actions" >> "Basic" >> _className);
if (EGVAR(medical,level) >= 2) then {
_config = (configFile >> "ACE_Medical_Treatment_Actions" >> "Advanced" >> _className);
};
private _config = configFile >> QGVAR(Actions) >> CUR_LEVEL >> _className;
if !(isClass _config) exitwith {false};
private _consumeItems = 0;
// Allow self treatment check
if (_caller == _target && {getNumber (_config >> "allowSelfTreatment") == 0}) exitwith {false};
private _medicRequired = if (isNumber (_config >> "requiredMedic")) then {
getNumber (_config >> "requiredMedic");
if (isNumber (_config >> "itemConsumed")) then {
_consumeItems = getNumber (_config >> "itemConsumed");
} else {
// Check for required class
if (isText (_config >> "requiredMedic")) exitwith {
missionNamespace getVariable [(getText (_config >> "requiredMedic")), 0];
};
0;
};
if !([_caller, _medicRequired] call EFUNC(medical,isMedic)) exitwith {false};
private _allowedSelections = getArray (_config >> "allowedSelections");
if !("All" in _allowedSelections || {(_selectionName in _allowedSelections)}) exitwith {false};
// Check item
private _items = getArray (_config >> "items");
if (count _items > 0 && {!([_caller, _target, _items] call FUNC(hasItems))}) exitwith {false};
private _return = true;
if (isText (_config >> "Condition")) then {
private _condition = getText(_config >> "condition");
if (_condition != "") then {
if (isnil _condition) then {
_condition = compile _condition;
} else {
_condition = missionNamespace getVariable _condition;
};
if (_condition isEqualType false) then {
_return = _condition;
} else {
_return = [_caller, _target, _selectionName, _className] call _condition;
};
if (isText (_config >> "itemConsumed")) then {
_consumeItems = missionNamespace getVariable [getText (_config >> "itemConsumed"), 0];
};
};
if (!_return) exitwith {false};
private _patientStateCondition = if (isText(_config >> "patientStateCondition")) then {
missionNamespace getVariable [getText(_config >> "patientStateCondition"), 0]
} else {
getNumber(_config >> "patientStateCondition")
};
if (_patientStateCondition == 1 && {!([_target] call EFUNC(medical,isInStableCondition))}) exitwith {false};
// Check allowed locations
private _locations = getArray (_config >> "treatmentLocations");
if ("All" in _locations) then {
_return = true;
} else {
private _medFacility = {([_caller] call EFUNC(medical,isInMedicalFacility)) || ([_target] call EFUNC(medical,isInMedicalFacility))};
private _medVeh = {([_caller] call EFUNC(medical,isInMedicalVehicle)) || ([_target] call EFUNC(medical,isInMedicalVehicle))};
{
if (_x == "field") exitwith {_return = true;};
if (_x == "MedicalFacility" && _medFacility) exitwith {_return = true;};
if (_x == "MedicalVehicle" && _medVeh) exitwith {_return = true;};
if !(isnil _x) exitwith {
private _val = missionNamespace getVariable _x;
if (_val isEqualType 0) then {
_return = switch (_val) do {
case 0: {true}; //AdvancedMedicalSettings_anywhere
case 1: {call _medVeh}; //AdvancedMedicalSettings_vehicle
case 2: {call _medFacility}; //AdvancedMedicalSettings_facility
case 3: {(call _medFacility) || {call _medVeh}}; //AdvancedMedicalSettings_vehicleAndFacility
default {false}; //Disabled
};
};
};
} foreach _locations;
};
if !(_return) exitwith {false};
private _usersOfItems = [];
private _consumeItems = if (isNumber (_config >> "itemConsumed")) then {
getNumber (_config >> "itemConsumed");
} else {
// Check for required class
if (isText (_config >> "itemConsumed")) exitwith {
missionNamespace getVariable [(getText (_config >> "itemConsumed")), 0];
};
0;
};
if (_consumeItems > 0) then {
_usersOfItems = ([_caller, _target, _items] call FUNC(useItems)) select 1;
};
// Parse the config for the progress callback
// parse the config for the progress callback
private _callbackProgress = getText (_config >> "callbackProgress");
if (_callbackProgress == "") then {
if (_callbackProgress isEqualTo "") then {
_callbackProgress = "true";
};
if (isNil _callbackProgress) then {
_callbackProgress = compile _callbackProgress;
} else {
_callbackProgress = missionNamespace getVariable _callbackProgress;
};
// Patient Animation
// play patient animation
private _patientAnim = getText (_config >> "animationPatient");
if (_target getVariable ["ACE_isUnconscious", false] && EGVAR(medical,allowUnconsciousAnimationOnTreatment)) then {
if !(animationState _target in (getArray (_config >> "animationPatientUnconsciousExcludeOn"))) then {
_patientAnim = getText (_config >> "animationPatientUnconscious");
};
};
if (_caller != _target && {vehicle _target == _target} && {_patientAnim != ""}) then {
private _isSelf = _caller isEqualTo _target;
if (!_isSelf && {vehicle _target == _target} && {_patientAnim != ""}) then {
if (_target getVariable ["ACE_isUnconscious", false]) then {
[_target, _patientAnim, 2, true] call EFUNC(common,doAnimation);
} else {
@ -150,71 +75,65 @@ if (_caller != _target && {vehicle _target == _target} && {_patientAnim != ""})
};
};
// Player Animation
private _callerAnim = [getText (_config >> "animationCaller"), getText (_config >> "animationCallerProne")] select (stance _caller == "PRONE");
if (_caller == _target) then {
_callerAnim = [getText (_config >> "animationCallerSelf"), getText (_config >> "animationCallerSelfProne")] select (stance _caller == "PRONE");
};
// play animation
private "_callerAnim";
_caller setVariable [QGVAR(selectedWeaponOnTreatment), (weaponState _caller)];
// Cannot use secondairy weapon for animation
if (currentWeapon _caller == secondaryWeapon _caller) then {
_caller selectWeapon (primaryWeapon _caller);
};
private _wpn = switch (true) do {
case ((currentWeapon _caller) == ""): {"non"};
case ((currentWeapon _caller) == (primaryWeapon _caller)): {"rfl"};
case ((currentWeapon _caller) == (handgunWeapon _caller)): {"pst"};
default {"non"};
};
private _callerAnim = [_callerAnim, "[wpn]", _wpn] call CBA_fnc_replace;
if (vehicle _caller == _caller && {_callerAnim != ""}) then {
if (primaryWeapon _caller == "") then {
_caller addWeapon "ACE_FakePrimaryWeapon";
};
if (currentWeapon _caller == "") then {
_caller selectWeapon (primaryWeapon _caller); // unit always has a primary weapon here
};
if (isWeaponDeployed _caller) then {
TRACE_1("Weapon Deployed, breaking out first",(stance _caller));
[_caller, "", 0] call EFUNC(common,doAnimation);
};
if ((stance _caller) == "STAND") then {
switch (_wpn) do {//If standing, end in a crouched animation based on their current weapon
case ("rfl"): {_caller setVariable [QGVAR(treatmentPrevAnimCaller), "AmovPknlMstpSrasWrflDnon"];};
case ("pst"): {_caller setVariable [QGVAR(treatmentPrevAnimCaller), "AmovPknlMstpSrasWpstDnon"];};
case ("non"): {_caller setVariable [QGVAR(treatmentPrevAnimCaller), "AmovPknlMstpSnonWnonDnon"];};
};
} else {
_caller setVariable [QGVAR(treatmentPrevAnimCaller), animationState _caller];
};
[_caller, _callerAnim] call EFUNC(common,doAnimation);
};
//Get treatment time
private _treatmentTime = if (isNumber (_config >> "treatmentTime")) then {
getNumber (_config >> "treatmentTime");
if (_isSelf) then {
_callerAnim = getText (_config >> ["animationCallerSelf", "animationCallerSelfProne"] select (stance _caller == "PRONE"));
} else {
if (isText (_config >> "treatmentTime")) exitwith {
private _treatmentTimeConfig = getText(_config >> "treatmentTime");
if (isnil _treatmentTimeConfig) then {
_treatmentTimeConfig = compile _treatmentTimeConfig;
} else {
_treatmentTimeConfig = missionNamespace getVariable _treatmentTimeConfig;
};
if (_treatmentTimeConfig isEqualType 0) exitwith {
_treatmentTimeConfig;
};
[_caller, _target, _selectionName, _className] call _treatmentTimeConfig;
};
0;
_callerAnim = getText (_config >> ["animationCaller", "animationCallerProne"] select (stance _caller == "PRONE"));
};
// Start treatment
_caller setVariable [QGVAR(selectedWeaponOnTreatment), weaponState _caller];
private _wpn = ["non", "rfl", "lnr", "pst"] param [["", primaryWeapon _caller, secondaryWeapon _caller, handgunWeapon _caller] find currentWeapon _caller, "non"];
_callerAnim = [_callerAnim, "[wpn]", _wpn] call CBA_fnc_replace;
if (vehicle _caller == _caller && {_callerAnim != ""}) then {
private _endInAnim = "AmovP[pos]MstpS[stn]W[wpn]Dnon";
private _pos = ["knl", "pne"] select (stance _caller == "PRONE");
private _stn = "non";
if (_wpn != "non") then {
_stn = ["ras", "low"] select (weaponLowered _caller);
};
_endInAnim = [_endInAnim, "[pos]", _pos] call CBA_fnc_replace;
_endInAnim = [_endInAnim, "[stn]", _stn] call CBA_fnc_replace;
_endInAnim = [_endInAnim, "[wpn]", _wpn] call CBA_fnc_replace;
TRACE_1("",_endInAnim);
[_caller, _callerAnim] call EFUNC(common,doAnimation);
[_caller, _endInAnim] call EFUNC(common,doAnimation);
_caller setVariable [QGVAR(endInAnim), _endInAnim];
};
// get treatment time
private _treatmentTime = 0;
// reads number from config. supports variables and code expressions
if (isNumber (_config >> "treatmentTime")) then {
_treatmentTime = getNumber (_config >> "treatmentTime");
} else {
if (isText (_config >> "treatmentTime")) then {
_treatmentTime = getText (_config >> "treatmentTime");
if (isNil _treatmentTime) then {
_treatmentTime = compile _treatmentTime;
} else {
_treatmentTime = missionNamespace getVariable _treatmentTime;
};
if !(_treatmentTime isEqualType 0) then {
_treatmentTime = call _treatmentTime;
};
};
};
TRACE_1("",_treatmentTime);
// start treatment
[
_treatmentTime,
[_caller, _target, _selectionName, _className, _items, _usersOfItems],
@ -225,22 +144,26 @@ private _treatmentTime = if (isNumber (_config >> "treatmentTime")) then {
["isnotinside"]
] call EFUNC(common,progressBar);
// Display Icon
// speed up animation depending on treatment time
private _animDuration = GVAR(animDurations) getVariable _callerAnim;
if (!isNil "_animDuration") then {
_caller setAnimSpeedCoef (_animDuration / _treatmentTime);
TRACE_2("",_animDuration,_treatmentTime);
};
// display icon
private _iconDisplayed = getText (_config >> "actionIconPath");
if (_iconDisplayed != "") then {
[QGVAR(treatmentActionIcon), true, _iconDisplayed, [1,1,1,1], getNumber(_config >> "actionIconDisplayTime")] call EFUNC(common,displayIcon);
[QGVAR(treatmentActionIcon), true, _iconDisplayed, [1,1,1,1], getNumber (_config >> "actionIconDisplayTime")] call EFUNC(common,displayIcon);
};
// handle display of text/hints
private _displayText = "";
if (_target != _caller) then {
_displayText = getText(_config >> "displayTextOther");
} else {
_displayText = getText(_config >> "displayTextSelf");
};
private _displayText = getText (_config >> ["displayTextOther", "displayTextSelf"] select _isSelf);
if (_displayText != "") then {
[QEGVAR(common,displayTextStructured), [[_displayText, [_caller] call EFUNC(common,getName), [_target] call EFUNC(common,getName)], 1.5, _caller], [_caller]] call CBA_fnc_targetEvent;
[QEGVAR(common,displayTextStructured), [[_displayText, _caller call EFUNC(common,getName), _target call EFUNC(common,getName)], 1.5, _caller], _caller] call CBA_fnc_targetEvent;
};
true;
true

View File

@ -20,54 +20,38 @@
params ["_args"];
_args params ["_caller", "_target", "_selectionName", "_className", "_items", "_usersOfItems"];
if (primaryWeapon _caller == "ACE_FakePrimaryWeapon") then {
_caller removeWeapon "ACE_FakePrimaryWeapon";
};
if (vehicle _caller == _caller) then {
private _lastAnim = _caller getVariable [QGVAR(treatmentPrevAnimCaller), ""];
//Don't play another medic animation (when player is rapidily treating)
TRACE_2("Reseting to old animation", animationState player, _lastAnim);
switch (toLower _lastAnim) do {
case "ainvpknlmstpslaywrfldnon_medic": {_lastAnim = "AmovPknlMstpSrasWrflDnon"};
case "ainvppnemstpslaywrfldnon_medic": {_lastAnim = "AmovPpneMstpSrasWrflDnon"};
case "ainvpknlmstpslaywnondnon_medic": {_lastAnim = "AmovPknlMstpSnonWnonDnon"};
case "ainvppnemstpslaywpstdnon_medic": {_lastAnim = "AinvPpneMstpSlayWpstDnon"};
case "ainvpknlmstpslaywpstdnon_medic": {_lastAnim = "AmovPknlMstpSrasWpstDnon"};
};
// switch to end anim immediately
private _endInAnim = _caller getVariable QGVAR(endInAnim);
[_caller, _lastAnim, 2] call EFUNC(common,doAnimation);
};
_caller setVariable [QGVAR(treatmentPrevAnimCaller), nil];
private _weaponSelect = (_caller getVariable [QGVAR(selectedWeaponOnTreatment), []]);
if ((_weaponSelect params [["_previousWeapon", ""]]) && {(_previousWeapon != "") && {_previousWeapon in (weapons _caller)}}) then {
for "_index" from 0 to 99 do {
_caller action ["SwitchWeapon", _caller, _caller, _index];
//Just check weapon, muzzle and mode (ignore ammo in case they were reloading)
if (((weaponState _caller) select [0,3]) isEqualTo (_weaponSelect select [0,3])) exitWith {TRACE_1("Restoring", (weaponState _caller));};
if ((weaponState _caller) isEqualTo ["","","","",0]) exitWith {ERROR("weaponState not found");};
if (!isNil "_endInAnim") then {
if (animationState _caller != _endInAnim) then {
[_caller, _endInAnim, 2] call EFUNC(common,doAnimation);
};
} else {
_caller action ["SwitchWeapon", _caller, _caller, 99];
_caller setVariable [QGVAR(endInAnim), nil];
TRACE_1("abort",_endInAnim);
};
// reset sped up animations
_caller setAnimSpeedCoef 1;
{
_x params ["_unit", "_item"];
_unit addItem _item;
} forEach _usersOfItems;
// Record specific callback
private _config = (configFile >> "ACE_Medical_Treatment_Actions" >> "Basic" >> _className);
if (EGVAR(medical,level) >= 2) then {
_config = (configFile >> "ACE_Medical_Treatment_Actions" >> "Advanced" >> _className);
};
private _config = configFile >> QGVAR(Actions) >> CUR_LEVEL >> _className;
private _callback = getText (_config >> "callbackFailure");
_callback = if (isNil _callback) then {
compile _callback
if (isNil _callback) then {
_callback = compile _callback;
} else {
missionNamespace getVariable _callback
_callback = missionNamespace getVariable _callback;
};
if !(_callback isEqualType {}) then {
_callback = {TRACE_1("callback was NOT code",_callback)};
};
if (!(_callback isEqualType {})) then {_callback = {TRACE_1("callback was NOT code",_callback)};};
_args call _callback;

View File

@ -20,50 +20,34 @@
params ["_args"];
_args params ["_caller", "_target", "_selectionName", "_className", "_items", "_usersOfItems"];
if (primaryWeapon _caller == "ACE_FakePrimaryWeapon") then {
_caller removeWeapon "ACE_FakePrimaryWeapon";
};
if (vehicle _caller == _caller) then {
private _lastAnim = _caller getVariable [QGVAR(treatmentPrevAnimCaller), ""];
//Don't play another medic animation (when player is rapidily treating)
TRACE_2("Reseting to old animation", animationState player, _lastAnim);
switch (toLower _lastAnim) do {
case "ainvpknlmstpslaywrfldnon_medic": {_lastAnim = "AmovPknlMstpSrasWrflDnon"};
case "ainvppnemstpslaywrfldnon_medic": {_lastAnim = "AmovPpneMstpSrasWrflDnon"};
case "ainvpknlmstpslaywnondnon_medic": {_lastAnim = "AmovPknlMstpSnonWnonDnon"};
case "ainvppnemstpslaywpstdnon_medic": {_lastAnim = "AinvPpneMstpSlayWpstDnon"};
case "ainvpknlmstpslaywpstdnon_medic": {_lastAnim = "AmovPknlMstpSrasWpstDnon"};
};
// switch to end anim immediately
private _endInAnim = _caller getVariable QGVAR(endInAnim);
[_caller, _lastAnim, 2] call EFUNC(common,doAnimation);
};
_caller setVariable [QGVAR(treatmentPrevAnimCaller), nil];
private _weaponSelect = (_caller getVariable [QGVAR(selectedWeaponOnTreatment), []]);
if ((_weaponSelect params [["_previousWeapon", ""]]) && {(_previousWeapon != "") && {_previousWeapon in (weapons _caller)}}) then {
for "_index" from 0 to 99 do {
_caller action ["SwitchWeapon", _caller, _caller, _index];
//Just check weapon, muzzle and mode (ignore ammo in case they were reloading)
if (((weaponState _caller) select [0,3]) isEqualTo (_weaponSelect select [0,3])) exitWith {TRACE_1("Restoring", (weaponState _caller));};
if ((weaponState _caller) isEqualTo ["","","","",0]) exitWith {ERROR("weaponState not found");};
if (!isNil "_endInAnim") then {
if (animationState _caller != _endInAnim) then {
[_caller, _endInAnim, 2] call EFUNC(common,doAnimation);
};
} else {
_caller action ["SwitchWeapon", _caller, _caller, 99];
_caller setVariable [QGVAR(endInAnim), nil];
TRACE_1("abort",_endInAnim);
};
// reset sped up animations
_caller setAnimSpeedCoef 1;
// Record specific callback
private _config = (configFile >> "ACE_Medical_Treatment_Actions" >> "Basic" >> _className);
if (EGVAR(medical,level) >= 2) then {
_config = (configFile >> "ACE_Medical_Treatment_Actions" >> "Advanced" >> _className);
};
private _config = configFile >> QGVAR(Actions) >> CUR_LEVEL >> _className;
private _callback = getText (_config >> "callbackSuccess");
if (isNil _callback) then {
_callback = compile _callback;
} else {
_callback = missionNamespace getVariable _callback;
};
if (!(_callback isEqualType {})) then {_callback = {TRACE_1("callback was NOT code",_callback)};};
if !(_callback isEqualType {}) then {
_callback = {TRACE_1("callback was NOT code",_callback)};
};
//Get current blood loose on limb (for "bloody" litter)
private _bloodLossOnSelection = 0;

View File

@ -16,3 +16,5 @@
#endif
#include "\z\ace\addons\main\script_macros.hpp"
#define CUR_LEVEL (["Basic", "Advanced"] select (EGVAR(medical,level) >= 2))