mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
woundHandler(SQF), fixes, improvements, more consistent variable naming
This commit is contained in:
parent
72e2bc72c0
commit
5e35204811
@ -23,3 +23,7 @@ class CfgPatches {
|
|||||||
#include "CfgFactionClasses.hpp"
|
#include "CfgFactionClasses.hpp"
|
||||||
#include "CfgVehicles.hpp"
|
#include "CfgVehicles.hpp"
|
||||||
#include "CfgWeapons.hpp"
|
#include "CfgWeapons.hpp"
|
||||||
|
|
||||||
|
class ACE_Extensions {
|
||||||
|
extensions[] += {"ace_medical"};
|
||||||
|
};
|
||||||
|
@ -5,4 +5,4 @@ PREP(internalInjuriesHandler);
|
|||||||
|
|
||||||
PREP(parseConfigForInjuries);
|
PREP(parseConfigForInjuries);
|
||||||
PREP(woundsHandler);
|
PREP(woundsHandler);
|
||||||
PREP(woundsHandlerSqf);
|
PREP(woundsHandlerSQF);
|
||||||
|
@ -6,14 +6,20 @@ ADDON = false;
|
|||||||
|
|
||||||
call FUNC(parseConfigForInjuries);
|
call FUNC(parseConfigForInjuries);
|
||||||
|
|
||||||
|
// decide which woundsHandler to use by whether the extension is present or not
|
||||||
|
if ("ace_medical" callExtension "version" != "") then {
|
||||||
|
DFUNC(woundsHandlerActive) = FUNC(woundsHandler);
|
||||||
|
} else {
|
||||||
|
DFUNC(woundsHandlerActive) = FUNC(woundsHandlerSQF);
|
||||||
|
};
|
||||||
|
|
||||||
[QEGVAR(medical_engine,woundReceived), {
|
[QEGVAR(medical_engine,woundReceived), {
|
||||||
params ["_unit", "_woundedHitPoint", "_receivedDamage", "", "_ammo"];
|
params ["_unit", "_woundedHitPoint", "_receivedDamage", "", "_ammo"];
|
||||||
|
|
||||||
// private _selectionName = EGVAR(medical,SELECTIONS) select (EGVAR(medical,HITPOINTS) find _woundedHitPoint); // @todo
|
|
||||||
private _typeOfDamage = _ammo call FUNC(getTypeOfDamage);
|
private _typeOfDamage = _ammo call FUNC(getTypeOfDamage);
|
||||||
[_unit, _woundedHitPoint, _receivedDamage, _ammo, _typeOfDamage] call FUNC(woundsHandler); // TODO also support the sqf variant
|
[_unit, _woundedHitPoint, _receivedDamage, _ammo, _typeOfDamage] call FUNC(woundsHandlerActive); // TODO also support the sqf variant
|
||||||
|
|
||||||
[_unit, EGVAR(medical,STATE_MACHINE)] call EFUNC(medical,addStateHandler);
|
///[_unit, EGVAR(medical,STATE_MACHINE)] call EFUNC(medical,addStateHandler); // @todo disable for now
|
||||||
}] call CBA_fnc_addEventHandler;
|
}] call CBA_fnc_addEventHandler;
|
||||||
|
|
||||||
ADDON = true;
|
ADDON = true;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Author: Glowbal
|
* Author: Glowbal, commy2
|
||||||
* Handling of the open wounds & injuries upon the handleDamage eventhandler.
|
* Handling of the open wounds & injuries upon the handleDamage eventhandler.
|
||||||
*
|
*
|
||||||
* Arguments:
|
* Arguments:
|
||||||
@ -16,31 +16,37 @@
|
|||||||
*/
|
*/
|
||||||
#include "script_component.hpp"
|
#include "script_component.hpp"
|
||||||
|
|
||||||
params ["_unit", "_selectionName", "_damage", "_typeOfProjectile", "_typeOfDamage"];
|
params ["_unit", "_bodyPart", "_damage", "_typeOfProjectile", "_typeOfDamage"];
|
||||||
TRACE_6("ACE_DEBUG: woundshandler",_unit, _selectionName, _damage, _shooter, _typeOfProjectile,_typeOfDamage);
|
TRACE_5("start",_unit,_bodyPart,_damage,_typeOfProjectile,_typeOfDamage);
|
||||||
|
|
||||||
systemChat format["input: %1", _this];
|
///// DELETE THIS AFTER EXTENSION HAS BEEN UPDATED
|
||||||
|
_bodyPart = EGVAR(medical,SELECTIONS) select (ALL_BODY_PARTS find _bodyPart);
|
||||||
|
/////
|
||||||
|
|
||||||
if (_typeOfDamage == "") then {_typeOfDamage = "unknown";};
|
if (_typeOfDamage isEqualTo "") then {
|
||||||
|
_typeOfDamage = "unknown";
|
||||||
|
};
|
||||||
|
|
||||||
// Administration for open wounds and ids
|
// Administration for open wounds and ids
|
||||||
private _openWounds = _unit getVariable[QEGVAR(medical,openWounds), []];
|
private _openWounds = _unit getVariable [QEGVAR(medical,openWounds), []];
|
||||||
private _woundID = _unit getVariable[QEGVAR(medical,lastUniqueWoundID), 1];
|
private _woundID = _unit getVariable [QEGVAR(medical,lastUniqueWoundID), 1];
|
||||||
|
|
||||||
private _extensionOutput = "ace_medical" callExtension format ["HandleDamageWounds,%1,%2,%3,%4", _selectionName, _damage, _typeOfDamage, _woundID];
|
private _extensionOutput = "ace_medical" callExtension format ["HandleDamageWounds,%1,%2,%3,%4", _bodyPart, _damage, _typeOfDamage, _woundID];
|
||||||
diag_log format["Extension _extensionOutput: %1", _extensionOutput];
|
TRACE_1("",_extensionOutput);
|
||||||
|
|
||||||
|
// these are default values and modified by _extensionOutput
|
||||||
private _painToAdd = 0;
|
private _painToAdd = 0;
|
||||||
private _woundsCreated = [];
|
private _woundsCreated = [];
|
||||||
|
|
||||||
call compile _extensionOutput;
|
call compile _extensionOutput;
|
||||||
|
|
||||||
{
|
{
|
||||||
_x params ["", "_toAddClassID", "_bodyPartNToAdd"];
|
_x params ["", "_woundClassIDToAdd", "_bodyPartNToAdd"];
|
||||||
|
|
||||||
_foundIndex = -1;
|
_foundIndex = -1;
|
||||||
{
|
{
|
||||||
_x params ["", "_compareId", "_comparyBodyPartN"];
|
|
||||||
// Check if we have an id of the given class on the given bodypart already
|
// Check if we have an id of the given class on the given bodypart already
|
||||||
if (_compareId == _toAddClassID && {_comparyBodyPartN2 == _bodyPartNToAdd}) exitWith {
|
if ((_woundClassIDToAdd isEqualTo (_x select 1)) && {_bodyPartNToAdd isEqualTo (_x select 2)}) exitWith {
|
||||||
_foundIndex = _forEachIndex;
|
_foundIndex = _forEachIndex;
|
||||||
};
|
};
|
||||||
} forEach _openWounds;
|
} forEach _openWounds;
|
||||||
@ -66,4 +72,4 @@ if (count _woundsCreated > 0) then {
|
|||||||
private _painLevel = _unit getVariable [QEGVAR(medical,pain), 0];
|
private _painLevel = _unit getVariable [QEGVAR(medical,pain), 0];
|
||||||
_unit setVariable [QEGVAR(medical,pain), _painLevel + _painToAdd];
|
_unit setVariable [QEGVAR(medical,pain), _painLevel + _painToAdd];
|
||||||
|
|
||||||
TRACE_6("ACE_DEBUG: woundsHandler",_unit, _painLevel, _painToAdd, _unit getVariable QEGVAR(medical,pain), _unit getVariable QEGVAR(medical,openWounds),_woundsCreated);
|
TRACE_6("exit",_unit, _painLevel, _painToAdd, _unit getVariable QEGVAR(medical,pain), _unit getVariable QEGVAR(medical,openWounds),_woundsCreated);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Author: Glowbal
|
* Author: Glowbal, commy2
|
||||||
* Handling of the open wounds & injuries upon the handleDamage eventhandler.
|
* Handling of the open wounds & injuries upon the handleDamage eventhandler.
|
||||||
*
|
*
|
||||||
* Arguments:
|
* Arguments:
|
||||||
@ -10,55 +10,48 @@
|
|||||||
* 4: Type of the damage done <STRING>
|
* 4: Type of the damage done <STRING>
|
||||||
*
|
*
|
||||||
* Return Value:
|
* Return Value:
|
||||||
* None <NIL>
|
* None
|
||||||
*
|
*
|
||||||
* Public: No
|
* Public: No
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "script_component.hpp"
|
#include "script_component.hpp"
|
||||||
|
|
||||||
private ["_bodyPartn", "_injuryTypeInfo", "_allInjuriesForDamageType", "_allPossibleInjuries", "_highestPossibleDamage", "_highestPossibleSpot", "_minDamage", "_openWounds", "_woundID", "_toAddInjury", "_painToAdd", "_bloodLoss", "_bodyPartNToAdd", "_classType", "_damageLevels", "_foundIndex", "_i", "_injury", "_maxDamage", "_pain", "_painLevel", "_selections", "_toAddClassID", "_woundsCreated"];
|
params ["_unit", "_bodyPart", "_damage", "_typeOfProjectile", "_typeOfDamage"];
|
||||||
params ["_unit", "_selectionName", "_damage", "_typeOfProjectile", "_typeOfDamage"];
|
TRACE_5("start",_unit,_bodyPart,_damage,_typeOfProjectile,_typeOfDamage);
|
||||||
TRACE_6("ACE_DEBUG: HandleDamage_WoundsOLD Called",_unit, _selectionName, _damage, _shooter, _typeOfProjectile,_typeOfDamage);
|
|
||||||
|
|
||||||
systemChat format["input: %1", _this];
|
|
||||||
// Convert the selectionName to a number and ensure it is a valid selection.
|
// Convert the selectionName to a number and ensure it is a valid selection.
|
||||||
_bodyPartn = EGVAR(medical,HITPOINTS) find _selectionName; //[_selectionName] call EFUNC(medical,selectionNameToNumber);
|
private _bodyPartN = ALL_BODY_PARTS find _bodyPart;
|
||||||
if (_bodyPartn < 0) exitWith {};
|
if (_bodyPartN < 0) exitWith {};
|
||||||
|
|
||||||
if (_typeOfDamage == "") then {_typeOfDamage = "unknown";};
|
if (_typeOfDamage isEqualTo "") then {
|
||||||
|
_typeOfDamage = "unknown";
|
||||||
|
};
|
||||||
|
|
||||||
// Get the injury type information. Format: [typeDamage thresholds, selectionSpecific, woundTypes]
|
// Get the damage type information. Format: [typeDamage thresholds, selectionSpecific, woundTypes]
|
||||||
_injuryTypeInfo = [GVAR(allDamageTypesData) getVariable _typeOfDamage] param [0, [[], false, []]];
|
// WoundTypes are the available wounds for this damage type. Format [[classID, selections, bleedingRate, pain], ..]
|
||||||
|
private _damageTypeInfo = [GVAR(allDamageTypesData) getVariable _typeOfDamage] param [0, [[], false, []]];
|
||||||
|
_damageTypeInfo params ["_thresholds", "_isSelectionSpecific", "_woundTypes"];
|
||||||
|
|
||||||
// This are the available injuries for this damage type. Format [[classtype, selections, bloodloss, minimalDamage, pain], ..]
|
|
||||||
_allInjuriesForDamageType = _injuryTypeInfo select 2;
|
|
||||||
// It appears we are dealing with an unknown type of damage.
|
// It appears we are dealing with an unknown type of damage.
|
||||||
|
if (count _woundTypes == 0) then {
|
||||||
if (count _allInjuriesForDamageType == 0) then {
|
|
||||||
// grabbing the configuration for unknown damage type
|
// grabbing the configuration for unknown damage type
|
||||||
_injuryTypeInfo = missionNamespace getVariable [QGVAR(woundInjuryType_unknown),[[], false, []]];
|
_damageTypeInfo = [GVAR(allDamageTypesData) getVariable "unknown"] param [0, [[], false, []]];
|
||||||
_allInjuriesForDamageType = _injuryTypeInfo select 2;
|
_woundTypes = _damageTypeInfo select 2;
|
||||||
};
|
};
|
||||||
|
|
||||||
// find the available injuries for this damage type and damage amount
|
// find the available injuries for this damage type and damage amount
|
||||||
_highestPossibleSpot = -1;
|
private _highestPossibleSpot = -1;
|
||||||
_highestPossibleDamage = -1;
|
private _highestPossibleDamage = -1;
|
||||||
_allPossibleInjuries = [];
|
private _allPossibleInjuries = [];
|
||||||
|
|
||||||
{
|
{
|
||||||
_damageLevels = _x select 4;
|
_x params ["", "_selections", "", "", "_damageExtrema"];
|
||||||
_minDamage = _damageLevels select 0;
|
_damageExtrema params ["_minDamage", "_maxDamage"];
|
||||||
_maxDamage = _damageLevels select 1;
|
|
||||||
|
|
||||||
// Check if the damage is higher as the min damage for the specific injury
|
// Check if the damage is higher as the min damage for the specific injury
|
||||||
if (_damage >= _minDamage && {_damage <= _maxDamage || _maxDamage < 0}) then {
|
if (_damage >= _minDamage && {_damage <= _maxDamage || _maxDamage < 0}) then {
|
||||||
//_classType = _x select 0;
|
|
||||||
_selections = _x select 1;
|
|
||||||
//_bloodLoss = _x select 2;
|
|
||||||
//_pain = _x select 3;
|
|
||||||
|
|
||||||
// Check if the injury can be applied to the given selection name
|
// Check if the injury can be applied to the given selection name
|
||||||
if ("All" in _selections || _selectionName in _selections) then {
|
if ("All" in _selections || _bodyPart in _selections) then { // @todo, this is case sensitive!
|
||||||
|
|
||||||
// Find the wound which has the highest minimal damage, so we can use this later on for adding the correct injuries
|
// Find the wound which has the highest minimal damage, so we can use this later on for adding the correct injuries
|
||||||
if (_minDamage > _highestPossibleDamage) then {
|
if (_minDamage > _highestPossibleDamage) then {
|
||||||
@ -70,41 +63,48 @@ _allPossibleInjuries = [];
|
|||||||
_allPossibleInjuries pushBack _x;
|
_allPossibleInjuries pushBack _x;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
} forEach _allInjuriesForDamageType;
|
} forEach _woundTypes;
|
||||||
|
|
||||||
// No possible wounds available for this damage type or damage amount.
|
// No possible wounds available for this damage type or damage amount.
|
||||||
if (_highestPossibleSpot < 0) exitWith {};
|
if (_highestPossibleSpot < 0) exitWith {};
|
||||||
|
|
||||||
// Administration for open wounds and ids
|
// Administration for open wounds and ids
|
||||||
_openWounds = _unit getVariable[QGVAR(openWounds), []];
|
private _openWounds = _unit getVariable [QGVAR(openWounds), []];
|
||||||
_woundID = _unit getVariable[QGVAR(lastUniqueWoundID), 1];
|
private _woundID = _unit getVariable [QGVAR(lastUniqueWoundID), 1];
|
||||||
|
|
||||||
|
private _painToAdd = 0;
|
||||||
|
private _woundsCreated = [];
|
||||||
|
|
||||||
_painToAdd = 0;
|
|
||||||
_woundsCreated = [];
|
|
||||||
{
|
{
|
||||||
if (_x select 0 <= _damage) exitWith {
|
if (_x select 0 <= _damage) exitWith {
|
||||||
for "_i" from 0 to ((_x select 1)-1) do {
|
for "_i" from 0 to ((_x select 1)-1) do {
|
||||||
|
|
||||||
// Find the injury we are going to add. Format [ classID, allowdSelections, bloodloss, painOfInjury, minimalDamage]
|
// Find the injury we are going to add. Format [ classID, allowdSelections, bleedingRate, injuryPain]
|
||||||
_toAddInjury = if (random(1) >= 0.85) then {_allInjuriesForDamageType select _highestPossibleSpot} else {selectRandom _allPossibleInjuries};
|
private _oldInjury = if (random 1 >= 0.85) then {
|
||||||
_toAddClassID = _toAddInjury select 0;
|
_woundTypes select _highestPossibleSpot
|
||||||
_foundIndex = -1;
|
} else {
|
||||||
|
selectRandom _allPossibleInjuries
|
||||||
|
};
|
||||||
|
|
||||||
|
_oldInjury params ["_woundClassIDToAdd", "", "_injuryBleedingRate", "_injuryPain"];
|
||||||
|
|
||||||
|
private _bodyPartNToAdd = [floor random 6, _bodyPartN] select _isSelectionSpecific; // 6 == count ALL_BODY_PARTS
|
||||||
|
|
||||||
_bodyPartNToAdd = if (_injuryTypeInfo select 1) then {_bodyPartn} else {floor(random(6))};
|
|
||||||
// If the injury type is selection part specific, we will check if one of those injury types already exists and find the spot for it..
|
// If the injury type is selection part specific, we will check if one of those injury types already exists and find the spot for it..
|
||||||
if ((_injuryTypeInfo select 1)) then {
|
private _foundIndex = -1;
|
||||||
|
if (_isSelectionSpecific) then {
|
||||||
{
|
{
|
||||||
// Check if we have an id of the given class on the given bodypart already
|
// Check if we have an id of the given class on the given bodypart already
|
||||||
if (_x select 1 == _toAddClassID && {_x select 2 == _bodyPartNToAdd}) exitWith {
|
if ((_woundClassIDToAdd isEqualTo (_x select 1)) && {_bodyPartNToAdd isEqualTo (_x select 2)}) exitWith {
|
||||||
_foundIndex = _forEachIndex;
|
_foundIndex = _forEachIndex;
|
||||||
};
|
};
|
||||||
} forEach _openWounds;
|
} forEach _openWounds;
|
||||||
};
|
};
|
||||||
|
|
||||||
_injury = [];
|
private _injury = [];
|
||||||
if (_foundIndex < 0) then {
|
if (_foundIndex < 0) then {
|
||||||
// Create a new injury. Format [ID, classID, bodypart, percentage treated, bloodloss rate]
|
// Create a new injury. Format [ID, classID, bodypart, percentage treated, bleeding rate]
|
||||||
_injury = [_woundID, _toAddInjury select 0, _bodyPartNToAdd, 1, _toAddInjury select 2];
|
_injury = [_woundID, _woundClassIDToAdd, _bodyPartNToAdd, 1, _injuryBleedingRate];
|
||||||
|
|
||||||
// Since it is a new injury, we will have to add it to the open wounds array to store it
|
// Since it is a new injury, we will have to add it to the open wounds array to store it
|
||||||
_openWounds pushBack _injury;
|
_openWounds pushBack _injury;
|
||||||
@ -116,14 +116,15 @@ _woundsCreated = [];
|
|||||||
_injury = _openWounds select _foundIndex;
|
_injury = _openWounds select _foundIndex;
|
||||||
_injury set [3, (_injury select 3) + 1];
|
_injury set [3, (_injury select 3) + 1];
|
||||||
};
|
};
|
||||||
|
|
||||||
// Store the injury so we can process it later correctly.
|
// Store the injury so we can process it later correctly.
|
||||||
_woundsCreated pushBack _injury;
|
_woundsCreated pushBack _injury;
|
||||||
|
|
||||||
// Collect the pain that is caused by this injury
|
// Collect the pain that is caused by this injury
|
||||||
_painToAdd = _painToAdd + (_toAddInjury select 3);
|
_painToAdd = _injuryPain + _painToAdd;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
} forEach (_injuryTypeInfo select 0); // forEach damage thresholds
|
} forEach _thresholds;
|
||||||
|
|
||||||
_unit setVariable [QGVAR(openWounds), _openWounds, true];
|
_unit setVariable [QGVAR(openWounds), _openWounds, true];
|
||||||
|
|
||||||
@ -132,6 +133,7 @@ if (count _woundsCreated > 0) then {
|
|||||||
_unit setVariable [QGVAR(lastUniqueWoundID), _woundID, true];
|
_unit setVariable [QGVAR(lastUniqueWoundID), _woundID, true];
|
||||||
};
|
};
|
||||||
|
|
||||||
_painLevel = _unit getVariable [QGVAR(pain), 0];
|
private _painLevel = _unit getVariable [QGVAR(pain), 0];
|
||||||
_unit setVariable [QGVAR(pain), _painLevel + _painToAdd];
|
_unit setVariable [QGVAR(pain), _painLevel + _painToAdd];
|
||||||
TRACE_6("ACE_DEBUG: HandleDamage_WoundsOLD",_unit, _painLevel, _painToAdd, _unit getVariable QGVAR(pain), _unit getVariable QGVAR(openWounds),_woundsCreated);
|
|
||||||
|
TRACE_6("exit",_unit, _painLevel, _painToAdd, _unit getVariable QGVAR(pain), _unit getVariable QGVAR(openWounds),_woundsCreated);
|
@ -20,3 +20,5 @@
|
|||||||
#define GET_NUMBER(config,default) (if (isNumber (config)) then {getNumber (config)} else {default})
|
#define GET_NUMBER(config,default) (if (isNumber (config)) then {getNumber (config)} else {default})
|
||||||
#define GET_STRING(config,default) (if (isText (config)) then {getText (config)} else {default})
|
#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 GET_ARRAY(config,default) (if (isArray (config)) then {getArray (config)} else {default})
|
||||||
|
|
||||||
|
#define ALL_BODY_PARTS ["Head", "Body", "LeftArm", "RightArm", "LeftLeg", "RightLeg"]
|
||||||
|
@ -55,7 +55,7 @@
|
|||||||
armor = 1;\
|
armor = 1;\
|
||||||
material = -1;\
|
material = -1;\
|
||||||
name = "head";\
|
name = "head";\
|
||||||
passThrough = 1;\
|
passThrough = 0;\
|
||||||
radius = 1;\
|
radius = 1;\
|
||||||
explosionShielding = 1;\
|
explosionShielding = 1;\
|
||||||
visual = "";\
|
visual = "";\
|
||||||
|
Loading…
Reference in New Issue
Block a user