Merge branch 'master' into artilleryTables

This commit is contained in:
PabstMirror 2019-10-15 10:46:26 -05:00
commit 2d6414a761
126 changed files with 3998 additions and 1218 deletions

45
.github/workflows/arma.yml vendored Normal file
View File

@ -0,0 +1,45 @@
name: Arma
on:
push:
branches:
- master
pull_request:
jobs:
validate:
runs-on: ubuntu-latest
steps:
- name: Checkout the source code
uses: actions/checkout@master
- name: Validate SQF
run: python3 tools/sqf_validator.py
- name: Validate Config
run: python3 tools/config_style_checker.py
- name: Validate String Tables
run: python3 tools/check_strings.py
- name: Check for BOM
uses: arma-actions/bom-check@master
lint:
runs-on: ubuntu-latest
steps:
- name: Checkout the source code
uses: actions/checkout@master
- name: Lint (sqflint)
uses: arma-actions/sqflint@master
continue-on-error: true # No failure due to many false-positives
build:
runs-on: ubuntu-latest
container: acemod/armake:master
steps:
- name: Checkout the source code
uses: actions/checkout@master
- name: Build (armake)
run: armake --version && make -j4
- name: Upload Artifact
uses: actions/upload-artifact@master
with:
name: ace3-${{ github.sha }}-nobin
path: '@ace'

24
.github/workflows/documentation.yml vendored Normal file
View File

@ -0,0 +1,24 @@
name: Documentation
on:
push:
branches:
- master
jobs:
update:
runs-on: ubuntu-latest
steps:
- name: Checkout the source code
uses: actions/checkout@master
- name: Install Python packages
run: |
pip3 install wheel
pip3 install setuptools
pip3 install pygithub
pip3 install pygithub3
- name: Deploy
if: github.repository == 'acemod/ACE3' && ! contains(github.event.head_commit.message, '[ci skip]')
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: python3 tools/deploy.py

30
.github/workflows/extensions.yml vendored Normal file
View File

@ -0,0 +1,30 @@
name: Extensions
on:
pull_request:
paths:
- 'extensions/*'
- 'extensions/*/*'
- 'extensions/*/*/*'
- 'extensions/*/*/*/*'
- 'extensions/*/*/*/*/*'
jobs:
build:
runs-on: ${{ matrix. os }}
strategy:
matrix:
os: [windows-latest]
steps:
- name: Checkout the source code
uses: actions/checkout@master
- name: Build
run: |
cd extensions/build
cmake .. && cmake --build .
- name: Upload Artifact
uses: actions/upload-artifact@master
with:
name: ace3_extensions-${{ matrix.os }}-debug
path: extensions/build

View File

@ -18,8 +18,6 @@ GVAR(currentLoadoutsTab) = nil;
private _arsenalDisplay = findDisplay IDD_ace_arsenal; private _arsenalDisplay = findDisplay IDD_ace_arsenal;
private _mouseBlockCtrl = _arsenalDisplay displayCtrl IDC_mouseBlock; private _mouseBlockCtrl = _arsenalDisplay displayCtrl IDC_mouseBlock;
GVAR(cameraPosition) = GVAR(previousCameraPos);
GVAR(previousCameraPos) = nil;
GVAR(loadoutsSearchbarFocus) = nil; GVAR(loadoutsSearchbarFocus) = nil;
GVAR(loadoutsPanelFocus) = nil; GVAR(loadoutsPanelFocus) = nil;

View File

@ -30,9 +30,6 @@ GVAR(currentLoadoutsTab) = -1;
GVAR(loadoutsSearchbarFocus) = false; GVAR(loadoutsSearchbarFocus) = false;
GVAR(loadoutsPanelFocus) = false; GVAR(loadoutsPanelFocus) = false;
GVAR(previousCameraPos) = GVAR(cameraPosition);
GVAR(cameraPosition) = [5,0,20,[-0.85,0,0.85]];
private _panelContentCtrl = _display displayCtrl IDC_contentPanel; private _panelContentCtrl = _display displayCtrl IDC_contentPanel;
_panelContentCtrl ctrlSetFontHeight (4.5 * GRID_H); _panelContentCtrl ctrlSetFontHeight (4.5 * GRID_H);
_panelContentCtrl ctrlCommit 0; _panelContentCtrl ctrlCommit 0;

View File

@ -10,7 +10,7 @@
* Child actions <ARRAY> * Child actions <ARRAY>
* *
* Example: * Example:
* [kevin] call ace_medical_fnc_addLoadCaptiveActions * [kevin] call ace_captives_fnc_addLoadCaptiveActions
* *
* Public: No * Public: No
*/ */

View File

@ -269,6 +269,7 @@
<French>Cyalume (Hi Bleu)</French> <French>Cyalume (Hi Bleu)</French>
<Japanese>ケミライト (高輝度 青)</Japanese> <Japanese>ケミライト (高輝度 青)</Japanese>
<Polish>Świetlik (jaskrawy niebieski)</Polish> <Polish>Świetlik (jaskrawy niebieski)</Polish>
<German>Knicklicht (Blau, Hell)</German>
<Italian>Luce chimica (Hi Blu)</Italian> <Italian>Luce chimica (Hi Blu)</Italian>
<Russian>Химсвет (Ярко-Синий)</Russian> <Russian>Химсвет (Ярко-Синий)</Russian>
<Portuguese>Bastão de Luz (Azul Forte)</Portuguese> <Portuguese>Bastão de Luz (Azul Forte)</Portuguese>
@ -276,6 +277,7 @@
<Key ID="STR_ACE_Chemlights_HiBlue_DisplayNameShort"> <Key ID="STR_ACE_Chemlights_HiBlue_DisplayNameShort">
<English>Blue Hi Light</English> <English>Blue Hi Light</English>
<French>Lum. bleue haute intensité</French> <French>Lum. bleue haute intensité</French>
<German>Helles, blaues Knicklicht</German>
<Japanese>高輝度の青色</Japanese> <Japanese>高輝度の青色</Japanese>
<Polish>Jaskrawe niebieskie światło</Polish> <Polish>Jaskrawe niebieskie światło</Polish>
<Italian>Luce Hi Blu</Italian> <Italian>Luce Hi Blu</Italian>
@ -285,6 +287,7 @@
<Key ID="STR_ACE_Chemlights_HiBlue_DescriptionShort"> <Key ID="STR_ACE_Chemlights_HiBlue_DescriptionShort">
<English>Type: Light - Blue Hi (30 minute)&lt;br /&gt;Rounds: 1&lt;br /&gt;Used in: Hand</English> <English>Type: Light - Blue Hi (30 minute)&lt;br /&gt;Rounds: 1&lt;br /&gt;Used in: Hand</English>
<French>Type: Lumière - bleue Hi (30 minutes)&lt;br /&gt;Nbre: 1&lt;br /&gt; À main</French> <French>Type: Lumière - bleue Hi (30 minutes)&lt;br /&gt;Nbre: 1&lt;br /&gt; À main</French>
<German>Typ: Licht - blau, hell (30 Minuten)&lt;br /&gt;Anzahl: 1&lt;br /&gt;Benutzt in: Hand</German>
<Japanese>種類: 照明 - 高輝度 青 (30分間)&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯</Japanese> <Japanese>種類: 照明 - 高輝度 青 (30分間)&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯</Japanese>
<Polish>Typ: Światło - jaskrawe niebieskie (30 minut)&lt;br/&gt;Pociski: 1&lt;br/&gt;Używany w: ręce</Polish> <Polish>Typ: Światło - jaskrawe niebieskie (30 minut)&lt;br/&gt;Pociski: 1&lt;br/&gt;Używany w: ręce</Polish>
<Italian>Tipo: Luce - Hi blu (30 minuti)&lt;br/&gt;Rimanenti:1 &lt;br/&gt;Usata in: Mano</Italian> <Italian>Tipo: Luce - Hi blu (30 minuti)&lt;br/&gt;Rimanenti:1 &lt;br/&gt;Usata in: Mano</Italian>
@ -294,6 +297,7 @@
<Key ID="STR_ACE_Chemlights_HiGreen_DisplayName"> <Key ID="STR_ACE_Chemlights_HiGreen_DisplayName">
<English>Chemlight (Hi Green)</English> <English>Chemlight (Hi Green)</English>
<French>Cyalume (Hi Vert)</French> <French>Cyalume (Hi Vert)</French>
<German>Knicklicht (Grün, Hell)</German>
<Japanese>ケミライト (高輝度 緑)</Japanese> <Japanese>ケミライト (高輝度 緑)</Japanese>
<Polish>Świetlik (jaskrawy zielony)</Polish> <Polish>Świetlik (jaskrawy zielony)</Polish>
<Italian>Luce chimica (Hi Verde)</Italian> <Italian>Luce chimica (Hi Verde)</Italian>
@ -303,6 +307,7 @@
<Key ID="STR_ACE_Chemlights_HiGreen_DisplayNameShort"> <Key ID="STR_ACE_Chemlights_HiGreen_DisplayNameShort">
<English>Green Hi Light</English> <English>Green Hi Light</English>
<French>Lum. verte haute intensité</French> <French>Lum. verte haute intensité</French>
<German>Helles, grünes Knicklicht</German>
<Japanese>高輝度の青色</Japanese> <Japanese>高輝度の青色</Japanese>
<Polish>Jaskrawe zielone światło</Polish> <Polish>Jaskrawe zielone światło</Polish>
<Italian>Luce Hi Verde</Italian> <Italian>Luce Hi Verde</Italian>
@ -312,6 +317,7 @@
<Key ID="STR_ACE_Chemlights_HiGreen_DescriptionShort"> <Key ID="STR_ACE_Chemlights_HiGreen_DescriptionShort">
<English>Type: Light - Green Hi (30 minute)&lt;br /&gt;Rounds: 1&lt;br /&gt;Used in: Hand</English> <English>Type: Light - Green Hi (30 minute)&lt;br /&gt;Rounds: 1&lt;br /&gt;Used in: Hand</English>
<French>Type: Lumière - verte Hi (30 minutes)&lt;br /&gt;Nbre: 1&lt;br /&gt; À main</French> <French>Type: Lumière - verte Hi (30 minutes)&lt;br /&gt;Nbre: 1&lt;br /&gt; À main</French>
<German>Typ: Licht - grün, hell (30 Minuten)&lt;br /&gt;Anzahl: 1&lt;br /&gt;Benutzt in: Hand</German>
<Japanese>種類: 照明 - 高輝度 緑 (30分間)&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯</Japanese> <Japanese>種類: 照明 - 高輝度 緑 (30分間)&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯</Japanese>
<Polish>Typ: Światło - jaskrawe zielone (30 minut)&lt;br/&gt;Pociski: 1&lt;br/&gt;Używany w: ręce</Polish> <Polish>Typ: Światło - jaskrawe zielone (30 minut)&lt;br/&gt;Pociski: 1&lt;br/&gt;Używany w: ręce</Polish>
<Italian>Tipo: Luce - Hi verde (30 minuti)&lt;br/&gt;Rimanenti: 1&lt;br/&gt;Usata in: Mano</Italian> <Italian>Tipo: Luce - Hi verde (30 minuti)&lt;br/&gt;Rimanenti: 1&lt;br/&gt;Usata in: Mano</Italian>
@ -321,6 +327,7 @@
<Key ID="STR_ACE_Chemlights_UltraHiOrange_DisplayName"> <Key ID="STR_ACE_Chemlights_UltraHiOrange_DisplayName">
<English>Chemlight (Ultra-Hi Orange)</English> <English>Chemlight (Ultra-Hi Orange)</English>
<French>Cyalume (Ultra-Hi orange)</French> <French>Cyalume (Ultra-Hi orange)</French>
<German>Knicklicht (Orange, Hell)</German>
<Japanese>ケミライト (高輝度 オレンジ)</Japanese> <Japanese>ケミライト (高輝度 オレンジ)</Japanese>
<Polish>Świetlik (ultra-jaskrawy pomarańczowy)</Polish> <Polish>Świetlik (ultra-jaskrawy pomarańczowy)</Polish>
<Italian>Luce chimica (Ultra-Hi Arancione)</Italian> <Italian>Luce chimica (Ultra-Hi Arancione)</Italian>
@ -330,6 +337,7 @@
<Key ID="STR_ACE_Chemlights_UltraHiOrange_DisplayNameShort"> <Key ID="STR_ACE_Chemlights_UltraHiOrange_DisplayNameShort">
<English>Orange Ultra-Hi Light</English> <English>Orange Ultra-Hi Light</English>
<French>Lum. orange ultra haute intensité</French> <French>Lum. orange ultra haute intensité</French>
<German>Helles, orangenes Knicklicht</German>
<Japanese>ウルトラ高輝度のオレンジ色</Japanese> <Japanese>ウルトラ高輝度のオレンジ色</Japanese>
<Polish>Ultra-jaskrawe pomarańczowe światło</Polish> <Polish>Ultra-jaskrawe pomarańczowe światło</Polish>
<Italian>Luce Ultra-Hi Arancione</Italian> <Italian>Luce Ultra-Hi Arancione</Italian>
@ -339,6 +347,7 @@
<Key ID="STR_ACE_Chemlights_UltraHiOrange_DescriptionShort"> <Key ID="STR_ACE_Chemlights_UltraHiOrange_DescriptionShort">
<English>Type: Light - Orange Ultra-Hi (5 minute)&lt;br /&gt;Rounds: 1&lt;br /&gt;Used in: Hand</English> <English>Type: Light - Orange Ultra-Hi (5 minute)&lt;br /&gt;Rounds: 1&lt;br /&gt;Used in: Hand</English>
<French>Type: Lumière - Orange Ultra-Hi (5 minutes)&lt;br /&gt;Nbre: 1&lt;br /&gt; À main</French> <French>Type: Lumière - Orange Ultra-Hi (5 minutes)&lt;br /&gt;Nbre: 1&lt;br /&gt; À main</French>
<German>Typ: Licht - orange, hell (30 Minuten)&lt;br /&gt;Anzahl: 1&lt;br /&gt;Benutzt in: Hand</German>
<Japanese>種類: 照明 - ウルトラ高輝度 オレンジ (5分間)&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯</Japanese> <Japanese>種類: 照明 - ウルトラ高輝度 オレンジ (5分間)&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯</Japanese>
<Polish>Typ: Światło - ultra-jaskrawe pomarańczowe (30 minut)&lt;br/&gt;Pociski: 1&lt;br/&gt;Używany w: ręce</Polish> <Polish>Typ: Światło - ultra-jaskrawe pomarańczowe (30 minut)&lt;br/&gt;Pociski: 1&lt;br/&gt;Używany w: ręce</Polish>
<Italian>Tipo: Luce - Ultra-Hi (5 minuti)&lt;br/&gt;Rimanenti: 1&lt;br/&gt;Usata in: Mano</Italian> <Italian>Tipo: Luce - Ultra-Hi (5 minuti)&lt;br/&gt;Rimanenti: 1&lt;br/&gt;Usata in: Mano</Italian>

View File

@ -138,6 +138,7 @@ PREP(positionToASL);
PREP(progressBar); PREP(progressBar);
PREP(readSettingFromModule); PREP(readSettingFromModule);
PREP(receiveRequest); PREP(receiveRequest);
PREP(registerItemReplacement);
PREP(removeCanInteractWithCondition); PREP(removeCanInteractWithCondition);
PREP(removeSpecificMagazine); PREP(removeSpecificMagazine);
PREP(requestCallback); PREP(requestCallback);

View File

@ -1,12 +1,12 @@
#include "script_component.hpp" #include "script_component.hpp"
/* /*
* Author: PabstMirror * Author: PabstMirror
* Gets arithmetic result from a set. * Returns the arithmetic result of performing the given operation on a set.
* *
* Arguments: * Arguments:
* 0: Namespace <OBJECT><LOCATION><MISSIONNAMESPACE> * 0: Namespace <OBJECT|LOCATION|NAMESPACE>
* 1: Number Set ID <STRING> * 1: Number Set ID <STRING>
* 2: Operation (sum, product, min, max, avg) (Case Sensitive) <STRING> * 2: Operation (max, min, sum, product, avg) (Case Sensitive) <STRING>
* *
* Return Value: * Return Value:
* Value <NUMBER> * Value <NUMBER>
@ -18,51 +18,44 @@
* Public: Yes * Public: Yes
*/ */
params ["_namespace", "_setID", "_op"]; params ["_namespace", "_setID", "_operation"];
TRACE_3("arithmeticGetResult",_namespace,_setID,_op); TRACE_3("arithmeticGetResult",_namespace,_setID,_operation);
private _data = (_namespace getVariable _setID) param [2, []]; private _data = (_namespace getVariable _setID) param [2, [{0}]];
switch (_op) do { switch (_operation) do {
case ("max"): { case "max": {
private _result = -1e99; selectMax (_data apply {call _x})
{
_result = _result max (call _x);
nil
} count _data;
_result // return
}; };
case ("sum"): { case "min": {
selectMin (_data apply {call _x})
};
case "sum": {
private _result = 0; private _result = 0;
{ {
_result = _result + (call _x); _result = _result + call _x;
nil } forEach _data;
} count _data;
_result // return _result
}; };
case ("product"): { case "product": {
private _result = 1; private _result = 1;
{ {
_result = _result * (call _x); _result = _result * call _x;
nil } forEach _data;
} count _data;
_result // return _result
}; };
case ("min"): { case "avg": {
private _result = 1e99;
{
_result = _result min (call _x);
nil
} count _data;
_result // return
};
case ("avg"): {
private _result = 0; private _result = 0;
{ {
_result = _result + (call _x); _result = _result + call _x;
nil } forEach _data;
} count _data;
_result / (count _data); // return _result / count _data
}; };
default {3735928559}; default {3735928559};
}; };

View File

@ -4,7 +4,7 @@
* Adds or removes a source to an arithmetic set. * Adds or removes a source to an arithmetic set.
* *
* Arguments: * Arguments:
* 0: Namespace <OBJECT><LOCATION><MISSIONNAMESPACE> * 0: Namespace <OBJECT|LOCATION|NAMESPACE>
* 1: Number Set ID <STRING> * 1: Number Set ID <STRING>
* 2: Source <STRING> * 2: Source <STRING>
* 3: Code that returns a number (can access var _namespace) [use {} to remove] <CODE> * 3: Code that returns a number (can access var _namespace) [use {} to remove] <CODE>
@ -20,13 +20,15 @@
*/ */
params ["_namespace", "_setID", "_source", "_variable"]; params ["_namespace", "_setID", "_source", "_variable"];
TRACE_4("params",_namespace,_setID,_source,_variable); TRACE_4("arithmeticSetSource",_namespace,_setID,_source,_variable);
private _hash = _namespace getVariable _setID; private _hash = _namespace getVariable _setID;
if (isNil "_hash") then { if (isNil "_hash") then {
_hash = [] call CBA_fnc_hashCreate; _hash = [] call CBA_fnc_hashCreate;
_namespace setVariable [_setID, _hash]; _namespace setVariable [_setID, _hash];
}; };
if (_variable isEqualTo {}) then { if (_variable isEqualTo {}) then {
TRACE_1("removing",_source); TRACE_1("removing",_source);
[_hash, _source] call CBA_fnc_hashRem; [_hash, _source] call CBA_fnc_hashRem;

View File

@ -82,7 +82,7 @@ if (_state) then {
openMap true; openMap true;
}; };
if (isServer || {serverCommandAvailable "#kick"} || {player getVariable ["ACE_isUnconscious", false] && {(call FUNC(player)) getVariable [QEGVAR(medical,AllowChatWhileUnconscious), missionNamespace getVariable [QEGVAR(medical,AllowChatWhileUnconscious), false]]}}) then { if (isServer || {serverCommandAvailable "#kick"}) then {
if (!(_key in (actionKeys "DefaultAction" + actionKeys "Throw")) && {_key in (actionKeys "Chat" + actionKeys "PrevChannel" + actionKeys "NextChannel")}) then { if (!(_key in (actionKeys "DefaultAction" + actionKeys "Throw")) && {_key in (actionKeys "Chat" + actionKeys "PrevChannel" + actionKeys "NextChannel")}) then {
_key = 0; _key = 0;
}; };

View File

@ -0,0 +1,112 @@
#include "script_component.hpp"
/*
* Author: BaerMitUmlaut
* Registers an event handler that replaces an item or item type with one or
* more other items.
*
* Arguments:
* 0: Item or item type ID to replace <STRING or NUMBER>
* 1: Item or list of items <STRING or ARRAY>
* 2: Replace items that inherit from original item (only if 0 is STRING) (Optional)<BOOL>
*
* Return Value:
* None
*
* Example:
* ["FirstAidKit", "ACE_fieldDressing"] call ace_common_fnc_registerItemReplacement
*
* Public: Yes
*/
params [["_oldItem", "", [0,""]], ["_newItems", "", ["", []]], ["_replaceInherited", false, [false]]];
TRACE_3("registerItemReplacement",_oldItem,_newItems,_replaceInherited);
// CBA player event handler function
private _fnc_replaceItems = {
params ["_unit"];
private _items = items _unit;
if (_items isEqualTo GVAR(oldItems)) exitWith {};
private _newItems = _items - GVAR(oldItems);
if (_newItems isEqualTo []) exitWith {
GVAR(oldItems) = _items;
};
_newItems sort true; // Sort so all items of current class can be replaced at once
private _cfgWeapons = configFile >> "CfgWeapons"; // Microoptimization
for "_i" from 0 to count _newItems - 1 do {
private _item = _newItems#_i;
// Determine replacement items: direct replacements, ...
private _replacements = GVAR(itemReplacements) getVariable [_item, []];
// ... item type replacements ...
private _type = getNumber (_cfgWeapons >> _item >> "ItemInfo" >> "type");
private _typeReplacements = GVAR(itemReplacements) getVariable ["$" + str _type, []];
_replacements append _typeReplacements;
// ... and inherited replacements
{
if (_item isKindOf [_x, _cfgWeapons]) then {
private _inheritedReplacements = GVAR(itemReplacements) getVariable [_x, []];
_replacements append _inheritedReplacements;
};
} forEach GVAR(inheritedReplacements);
// Skip lookup for all following items of this class
private _count = 1;
while {_newItems#(_i + 1) == _item} do { // (i+1) can be out of bounds, but should fail safely
_count = _count + 1;
_i = _i + 1;
};
// Replace all items of current class in list
if !(_replacements isEqualTo []) then {
TRACE_3("replace",_item,_count,_replacements);
_unit removeItems _item;
for "_j" from 1 to _count do {
{ [_unit, _x] call FUNC(addToInventory) } forEach _replacements;
};
};
};
GVAR(oldItems) = items _unit;
};
// Setup on first run
if (isNil QGVAR(itemReplacements)) then {
GVAR(itemReplacements) = [] call CBA_fnc_createNamespace;
GVAR(inheritedReplacements) = [];
GVAR(oldItems) = [];
["loadout", _fnc_replaceItems] call CBA_fnc_addPlayerEventHandler;
};
// Save item replacement
// $ prefix is used for types (numbers) and replacements with inheritance
if (_replaceInherited) then {
_oldItem = "$" + _oldItem;
GVAR(inheritedReplacements) pushBack _oldItem;
};
if (_oldItem isEqualType 0) then {
_oldItem = "$" + str _oldItem;
};
if (_newItems isEqualType "") then {
_newItems = [_newItems];
};
private _oldReplacements = GVAR(itemReplacements) getVariable [_oldItem, []];
_oldReplacements append _newItems;
GVAR(itemReplacements) setVariable [_oldItem, _newItems];
// Force item scan when new replacement was registered in PostInit
if (!isNull ACE_player) then {
GVAR(oldItems) = [];
// Exec next frame to ensure full scan only runs once per frame
// For example, if item replacements are registred in PostInit (due to CBA
// settings) by different addons, the inventory is only scanned once in the
// next frame, not once per addon.
[_fnc_replaceItems, [ACE_player]] call CBA_fnc_execNextFrame;
};

View File

@ -20,7 +20,7 @@
* Example: * Example:
* ["CBA_missionTime"] call ace_common_fnc_watchVariable // Uses title as code * ["CBA_missionTime"] call ace_common_fnc_watchVariable // Uses title as code
* ["diag_frameNo", {diag_frameNo}, [false]] call ace_common_fnc_watchVariable // Won't show delta * ["diag_frameNo", {diag_frameNo}, [false]] call ace_common_fnc_watchVariable // Won't show delta
* ["blood", {player getVariable "ace_medical_bloodVolume"}, [true, 0, 100]] call ace_common_fnc_watchVariable // Shows slider * ["blood", {player getVariable "ace_medical_bloodVolume"}, [true, 0, 6]] call ace_common_fnc_watchVariable // Shows slider
* ["multiLine text", {"Line 1 <br/>Line 2"}, [2]] call ace_common_fnc_watchVariable * ["multiLine text", {"Line 1 <br/>Line 2"}, [2]] call ace_common_fnc_watchVariable
* ["player names", {allPlayers apply {name _x}}, [5]] call ace_common_fnc_watchVariable // handles any data types * ["player names", {allPlayers apply {name _x}}, [5]] call ace_common_fnc_watchVariable // handles any data types
* *

View File

@ -99,6 +99,7 @@ if (!isServer) then {
diag_log text _error; diag_log text _error;
[QGVAR(systemChatGlobal), _error] call CBA_fnc_globalEvent; [QGVAR(systemChatGlobal), _error] call CBA_fnc_globalEvent;
[QGVAR(serverLog), _error] call CBA_fnc_serverEvent;
}; };
private _missingAddonServer = false; private _missingAddonServer = false;
@ -116,6 +117,7 @@ if (!isServer) then {
diag_log text _error; diag_log text _error;
[QGVAR(systemChatGlobal), _error] call CBA_fnc_globalEvent; [QGVAR(systemChatGlobal), _error] call CBA_fnc_globalEvent;
[QGVAR(serverLog), _error] call CBA_fnc_serverEvent;
}; };
private _oldVersionClient = false; private _oldVersionClient = false;
@ -133,6 +135,7 @@ if (!isServer) then {
diag_log text _error; diag_log text _error;
[QGVAR(systemChatGlobal), _error] call CBA_fnc_globalEvent; [QGVAR(systemChatGlobal), _error] call CBA_fnc_globalEvent;
[QGVAR(serverLog), _error] call CBA_fnc_serverEvent;
}; };
private _oldVersionServer = false; private _oldVersionServer = false;
@ -150,6 +153,7 @@ if (!isServer) then {
diag_log text _error; diag_log text _error;
[QGVAR(systemChatGlobal), _error] call CBA_fnc_globalEvent; [QGVAR(systemChatGlobal), _error] call CBA_fnc_globalEvent;
[QGVAR(serverLog), _error] call CBA_fnc_serverEvent;
}; };
ACE_Version_ClientErrors = [_missingAddon, _missingAddonServer, _oldVersionClient, _oldVersionServer]; ACE_Version_ClientErrors = [_missingAddon, _missingAddonServer, _oldVersionClient, _oldVersionServer];

View File

@ -0,0 +1,13 @@
class CfgMovesMaleSdr: CfgMovesBasic {
class InjuredMovedBase;
class AgonyBaseRfl;
class States {
class AcinPknlMstpSnonWnonDnon_AcinPercMrunSnonWnonDnon: InjuredMovedBase {
speed = -10; // 1/10
};
class AinjPfalMstpSnonWrflDnon_carried_Up: AgonyBaseRfl {
speed = -10; // 1/10
};
};
};

View File

@ -17,3 +17,4 @@ class CfgPatches {
#include "CfgEventHandlers.hpp" #include "CfgEventHandlers.hpp"
#include "CfgVehicles.hpp" #include "CfgVehicles.hpp"
#include "CfgMovesBasic.hpp" #include "CfgMovesBasic.hpp"
#include "CfgMovesMaleSdr.hpp"

View File

@ -48,7 +48,7 @@ if (_target isKindOf "CAManBase") then {
[_unit, "AcinPknlMstpSnonWnonDnon_AcinPercMrunSnonWnonDnon", 2, true] call EFUNC(common,doAnimation); [_unit, "AcinPknlMstpSnonWnonDnon_AcinPercMrunSnonWnonDnon", 2, true] call EFUNC(common,doAnimation);
[_target, "AinjPfalMstpSnonWrflDnon_carried_Up", 2, true] call EFUNC(common,doAnimation); [_target, "AinjPfalMstpSnonWrflDnon_carried_Up", 2, true] call EFUNC(common,doAnimation);
_timer = CBA_missionTime + 15; _timer = CBA_missionTime + 10;
} else { } else {

View File

@ -0,0 +1,22 @@
#define DEFAULT_IS_EOD (_this getUnitTrait 'explosiveSpecialist')
class Cfg3DEN {
class Object {
class AttributeCategories {
class ace_attributes {
class Attributes {
class ace_isEOD {
displayName = CSTRING(IsEOD_DisplayName);
tooltip = CSTRING(IsEOD_Description);
property = QUOTE(ace_isEOD);
control = "Checkbox";
expression = QUOTE(_this setVariable [ARR_3('ACE_isEOD',_value,true)]);
defaultValue = QUOTE(DEFAULT_IS_EOD);
condition = "objectBrain";
typeName = "BOOL";
};
};
};
};
};
};

View File

@ -16,6 +16,7 @@ class CfgPatches {
#include "ACE_Settings.hpp" #include "ACE_Settings.hpp"
#include "CfgEventHandlers.hpp" #include "CfgEventHandlers.hpp"
#include "Cfg3DEN.hpp"
#include "CfgAmmo.hpp" #include "CfgAmmo.hpp"
#include "CfgMagazines.hpp" #include "CfgMagazines.hpp"
#include "CfgWeapons.hpp" #include "CfgWeapons.hpp"

View File

@ -1042,5 +1042,13 @@
<Russian>Таймер взрывчатки</Russian> <Russian>Таймер взрывчатки</Russian>
<Portuguese>Timer de explosão</Portuguese> <Portuguese>Timer de explosão</Portuguese>
</Key> </Key>
<Key ID="STR_ACE_Explosives_IsEOD_DisplayName">
<English>Is EOD</English>
<German>Kampfmittelbeseitigung</German>
</Key>
<Key ID="STR_ACE_Explosives_IsEOD_Description">
<English>Controls whether the unit is an explosive specialist.</English>
<German>Steuert, ob die Einheit ein Sprengstoffspezialist ist.</German>
</Key>
</Package> </Package>
</Project> </Project>

View File

@ -36,14 +36,10 @@ _grenades_ItemList = _grenades_ItemList arrayIntersect _grenades_ItemList;
uiNamespace setVariable [QGVAR(Grenades_ItemList), _grenades_ItemList]; uiNamespace setVariable [QGVAR(Grenades_ItemList), _grenades_ItemList];
// generate list of medical items // generate list of medical items
private _medical_ItemList = []; private _medical_ItemList = ["FirstAidKit", "Medikit"];
{ {
_medical_ItemList append getArray (_x >> "items"); _medical_ItemList append getArray (_x >> "items");
} forEach ( } forEach ("true" configClasses (configFile >> QEGVAR(medical_treatment,Actions)));
("true" configClasses (configFile >> QEGVAR(Medical,Actions) >> "Basic")) +
("true" configClasses (configFile >> QEGVAR(Medical,Actions) >> "Advanced"))
);
// remove all numbers from list // remove all numbers from list
_medical_ItemList = _medical_ItemList select {_x isEqualType ""}; _medical_ItemList = _medical_ItemList select {_x isEqualType ""};

View File

@ -6,3 +6,11 @@ class asdg_FrontSideRail: asdg_SlotInfo {
ACE_acc_pointer_green_IR = 1; ACE_acc_pointer_green_IR = 1;
}; };
}; };
class PointerSlot_Rail: PointerSlot {
class compatibleItems {
ACE_acc_pointer_red = 1;
ACE_acc_pointer_green = 1;
ACE_acc_pointer_green_IR = 1;
};
};

View File

@ -3,6 +3,9 @@
[QEGVAR(medical,setUnconscious), LINKFUNC(setUnconscious)] call CBA_fnc_addEventHandler; [QEGVAR(medical,setUnconscious), LINKFUNC(setUnconscious)] call CBA_fnc_addEventHandler;
// For BETA/RC - debug non-default settings to rpt:
call compile preprocessFileLineNumbers QPATHTOF(dev\reportSettings.sqf);
if (!hasInterface) exitWith {}; if (!hasInterface) exitWith {};
[missionNamespace, "ACE_setCustomAimCoef", QUOTE(ADDON), { [missionNamespace, "ACE_setCustomAimCoef", QUOTE(ADDON), {

View File

@ -0,0 +1,14 @@
#include "\z\ace\addons\medical\script_component.hpp"
// Dumps info on all non-default medical settings
[{
private _medicalSettings = cba_settings_allSettings select {(_x select [0,11]) == "ace_medical"};
INFO_1("-- Checking %1 medical Settings --",count _medicalSettings);
{
private _currentValue = missionNamespace getVariable [_x, "$"];
private _defaultValue = (cba_settings_default getVariable [_x, []]) param [0, "#"];
if !(_currentValue isEqualTo _defaultValue) then {
diag_log text format ["%1: [Current %2] [Default: %3]", _x, _currentValue, _defaultValue];
};
} forEach _medicalSettings;
}, nil, 2] call CBA_fnc_waitAndExecute;

View File

@ -61,7 +61,7 @@ GVAR(dev_watchVariableRunning) = true;
// Damage: // Damage:
private _damage = _unit getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]]; private _damage = _unit getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]];
private _limping = if (_unit getVariable [QEGVAR(medical,isLimping), false]) then {"[<t color ='#FFCC22'> Limping </t>]"} else {""}; private _limping = if (_unit getVariable [QEGVAR(medical,isLimping), false]) then {"[<t color ='#FFCC22'> Limping </t>]"} else {""};
_return pushBack format ["Damage: [H: %1] [B: %2] %3", (_damage select 0) toFixed 2, (_damage select 1) toFixed 2]; _return pushBack format ["BodyPartDamage: [H: %1] [B: %2]", (_damage select 0) toFixed 2, (_damage select 1) toFixed 2];
_return pushBack format ["[LA:%1] [RA: %2] [LL:%3] [RL: %4]", (_damage select 2) toFixed 2, (_damage select 3) toFixed 2, (_damage select 4) toFixed 2, (_damage select 5) toFixed 2]; _return pushBack format ["[LA:%1] [RA: %2] [LL:%3] [RL: %4]", (_damage select 2) toFixed 2, (_damage select 3) toFixed 2, (_damage select 4) toFixed 2, (_damage select 5) toFixed 2];
_return pushBack format ["Hitpoints: [HHed:%1] [HBod: %2]", (_unit getHitPointDamage "HitHead") toFixed 2, (_unit getHitPointDamage "HitBody") toFixed 2]; _return pushBack format ["Hitpoints: [HHed:%1] [HBod: %2]", (_unit getHitPointDamage "HitHead") toFixed 2, (_unit getHitPointDamage "HitBody") toFixed 2];

View File

@ -25,10 +25,12 @@
params [["_unit", objNull, [objNull]], ["_damageToAdd", -1, [0]], ["_bodyPart", "", [""]], ["_typeOfDamage", "", [""]], ["_instigator", objNull, [objNull]]]; params [["_unit", objNull, [objNull]], ["_damageToAdd", -1, [0]], ["_bodyPart", "", [""]], ["_typeOfDamage", "", [""]], ["_instigator", objNull, [objNull]]];
TRACE_5("addDamageToUnit",_unit,_damageToAdd,_bodyPart,_typeOfDamage,_instigator); TRACE_5("addDamageToUnit",_unit,_damageToAdd,_bodyPart,_typeOfDamage,_instigator);
private _bodyPartIndex = ALL_BODY_PARTS find (toLower _bodyPart); _bodyPart = toLower _bodyPart;
if (isNull _unit || {!local _unit} || {!alive _unit}) exitWith {ERROR_1("addDamageToUnit - badUnit %1", _this); false}; private _bodyPartIndex = ALL_BODY_PARTS find _bodyPart;
if (_damageToAdd < 0) exitWith {ERROR_1("addDamageToUnit - bad damage %1", _this); false}; if (_bodyPartIndex < 0) then { _bodyPartIndex = ALL_SELECTIONS find _bodyPart; }; // 2nd attempt with selection names ("hand_l", "hand_r", "leg_l", "leg_r")
if (_bodyPartIndex < 0) exitWith {ERROR_1("addDamageToUnit - bad selection %1", _this); false}; if (_bodyPartIndex < 0) exitWith {ERROR_1("addDamageToUnit - bad selection %1", _this); false};
if (isNull _unit || {!local _unit} || {!alive _unit}) exitWith {ERROR_2("addDamageToUnit - badUnit %1 [local %2]", _this, local _unit); false};
if (_damageToAdd < 0) exitWith {ERROR_1("addDamageToUnit - bad damage %1", _this); false};
// Extension is case sensitive and expects this format (different from ALL_BODY_PARTS) // Extension is case sensitive and expects this format (different from ALL_BODY_PARTS)
_bodyPart = ["Head", "Body", "LeftArm", "RightArm", "LeftLeg", "RightLeg"] select _bodyPartIndex; _bodyPart = ["Head", "Body", "LeftArm", "RightArm", "LeftLeg", "RightLeg"] select _bodyPartIndex;

View File

@ -47,21 +47,17 @@
<Portuguese>Mancando</Portuguese> <Portuguese>Mancando</Portuguese>
</Key> </Key>
<Key ID="STR_ACE_Medical_Limping_Description"> <Key ID="STR_ACE_Medical_Limping_Description">
<English>Limp when unit has leg wounds...(todo)</English> <English>Controls whether open or bandaged wounds cause a person to limp.</English>
<Russian>Хромота, когда юнит имеет ранения ног...</Russian>
<Japanese>足を負傷時に引きずって歩くようにします・・・(TODO)</Japanese>
<French>Une unité boite si elle est blessée à la jambe... (TODO)</French>
<Portuguese>Mancar quando a unidade possuir ferimentos nas pernas... (TODO)</Portuguese>
</Key> </Key>
<Key ID="STR_ACE_Medical_Limping_LimpOnOpenWounds"> <Key ID="STR_ACE_Medical_Limping_LimpOnOpenWounds">
<English>Limp on open wounds</English> <English>Limp on Open Wounds</English>
<Russian>Хромота при открытых ранах</Russian> <Russian>Хромота при открытых ранах</Russian>
<Japanese>創傷開放時に跛行</Japanese> <Japanese>創傷開放時に跛行</Japanese>
<French>Boiter si plaies ouvertes</French> <French>Boiter si plaies ouvertes</French>
<Portuguese>Mancar se possuir feridas abertas</Portuguese> <Portuguese>Mancar se possuir feridas abertas</Portuguese>
</Key> </Key>
<Key ID="STR_ACE_Medical_Limping_LimpRequiresStitching"> <Key ID="STR_ACE_Medical_Limping_LimpRequiresStitching">
<English>Limp on open or bandaged wounds</English> <English>Limp on Open or Bandaged Wounds</English>
<Russian>Хромота при открытых или забинтованых ранах</Russian> <Russian>Хромота при открытых или забинтованых ранах</Russian>
<Japanese>負傷時は引きずって歩くようにします</Japanese> <Japanese>負傷時は引きずって歩くようにします</Japanese>
<French>Boiter si plaies ouvertes ou pansées</French> <French>Boiter si plaies ouvertes ou pansées</French>
@ -75,21 +71,17 @@
<Portuguese>Fraturas</Portuguese> <Portuguese>Fraturas</Portuguese>
</Key> </Key>
<Key ID="STR_ACE_Medical_Fractures_Description"> <Key ID="STR_ACE_Medical_Fractures_Description">
<English>Limp fractures... (todo)</English> <English>Controls the effect of using splints to treat fractures.\nWhen disabled, injuries will not cause fractures.</English>
<Russian>Хромота при переломах...</Russian>
<Japanese>骨折時は引きずって歩くようにします・・・ (TODO)</Japanese>
<French>Une unité boite en cas de fracture... (TODO)</French>
<Portuguese>Mancar Fraturas (TODO)</Portuguese>
</Key> </Key>
<Key ID="STR_ACE_Medical_Fractures_SplintHealsFully"> <Key ID="STR_ACE_Medical_Fractures_SplintHealsFully">
<English>Splints fully heal fractures</English> <English>Splints Fully Heal Fractures</English>
<Russian>Шины полностью лечат перелом</Russian> <Russian>Шины полностью лечат перелом</Russian>
<Japanese>添え木で骨折完治</Japanese> <Japanese>添え木で骨折完治</Japanese>
<French>Les attelles guérissent complètement les fractures</French> <French>Les attelles guérissent complètement les fractures</French>
<Portuguese>Tala cura fraturas completamente</Portuguese> <Portuguese>Tala cura fraturas completamente</Portuguese>
</Key> </Key>
<Key ID="STR_ACE_Medical_Fractures_SplintHasEffects"> <Key ID="STR_ACE_Medical_Fractures_SplintHasEffects">
<English>Splints heal (but cannot sprint)</English> <English>Splints Heal, but Cannot Sprint</English>
<Russian>Шины вылечивают, но не дают бегать</Russian> <Russian>Шины вылечивают, но не дают бегать</Russian>
<Japanese>添え木で治療しますが、走れません</Japanese> <Japanese>添え木で治療しますが、走れません</Japanese>
<French>Les attelles guérissent les fractures, mais empêchent de courir</French> <French>Les attelles guérissent les fractures, mais empêchent de courir</French>

View File

@ -47,7 +47,6 @@ class ACE_Medical_Injuries {
}; };
// Also called tears, these are separating wounds that produce ragged edges. They are produced by a tremendous force against the body, either from an internal source as in childbirth, or from an external source like a punch. // Also called tears, these are separating wounds that produce ragged edges. They are produced by a tremendous force against the body, either from an internal source as in childbirth, or from an external source like a punch.
class Laceration { class Laceration {
selections[] = {"All"};
causes[] = {"vehiclecrash", "collision", "punch"}; causes[] = {"vehiclecrash", "collision", "punch"};
bleeding = 0.05; bleeding = 0.05;
pain = 0.2; pain = 0.2;
@ -94,11 +93,11 @@ class ACE_Medical_Injuries {
selectionSpecific = 0; selectionSpecific = 0;
}; };
class vehiclecrash { class vehiclecrash {
thresholds[] = {{0.5, 5}, {0.3, 2}, {0.05, 1}}; thresholds[] = {{1.5, 3}, {1, 2}, {0.05, 1}}; // prevent subdividing wounds past FRACTURE_DAMAGE_THRESHOLD to ensure limp/fractue is triggered
selectionSpecific = 0; selectionSpecific = 0;
}; };
class collision { class collision {
thresholds[] = {{0.5, 5}, {0.3, 2}, {0.05, 1}}; thresholds[] = {{1.5, 3}, {1, 2}, {0.05, 1}}; // prevent subdividing wounds past FRACTURE_DAMAGE_THRESHOLD to ensure limp/fractue is triggered
selectionSpecific = 0; selectionSpecific = 0;
}; };
class backblast { class backblast {
@ -114,8 +113,8 @@ class ACE_Medical_Injuries {
selectionSpecific = 1; selectionSpecific = 1;
}; };
class falling { class falling {
thresholds[] = {{0.6, 4}, {0.35, 2}, {0.1, 1}}; thresholds[] = {{1.5, 3}, {1, 2}, {0.05, 1}}; // prevent subdividing wounds past FRACTURE_DAMAGE_THRESHOLD to ensure limp/fractue is triggered
selectionSpecific = 1; selectionSpecific = 0;
}; };
class ropeburn { class ropeburn {
thresholds[] = {{0.1, 1}}; thresholds[] = {{0.1, 1}};

View File

@ -1,3 +1,4 @@
PREP(determineIfFatal);
PREP(getTypeOfDamage); PREP(getTypeOfDamage);
PREP(handleIncapacitation); PREP(handleIncapacitation);
PREP(parseConfigForInjuries); PREP(parseConfigForInjuries);

View File

@ -26,10 +26,10 @@ addMissionEventHandler ["Loaded",{
// }; // };
[QEGVAR(medical,woundReceived), { [QEGVAR(medical,woundReceived), {
params ["_unit", "_woundedHitPoint", "_receivedDamage", "", "_ammo"]; params ["_unit", "_woundedHitPoint", "_receivedDamage", "", "_ammo", "_damageSelectionArray"];
private _typeOfDamage = _ammo call FUNC(getTypeOfDamage); private _typeOfDamage = _ammo call FUNC(getTypeOfDamage);
[_unit, _woundedHitPoint, _receivedDamage, _typeOfDamage] call FUNC(woundsHandlerActive); [_unit, _woundedHitPoint, _receivedDamage, _typeOfDamage, _damageSelectionArray] call FUNC(woundsHandlerActive);
}] call CBA_fnc_addEventHandler; }] call CBA_fnc_addEventHandler;
ADDON = true; ADDON = true;

View File

@ -0,0 +1,62 @@
#include "script_component.hpp"
/*
* Author: PabstMirror, Glowbal
* Determines if damage is fatal
*
* Arguments:
* 0: The Unit <OBJECT>
* 1: Part No <NUMBER>
* 2: Damage Array - QGVAR(medical,bodyPartDamage) <ARRAY>
* 3: New Damage <NUMBER>
*
* ReturnValue:
* Was Fatal <BOOL>
*
* Example:
* [player, 0, 1.4, 0.7] call ace_medical_damage_fnc_determineIfFatal
*
* Public: No
*/
#define WEIBULL_K 6.5625
#define WEIBULL_L 0.704523
params ["_unit", "_part", "_bodyPartDamage", "_woundDamage"];
if (_part > 1) exitWith { false };
scopeName "main";
if (EGVAR(medical,fatalDamageSource) in [0, 2]) then {
// Emulate damage to vital organs - Original rewrite logic, only powerfull headshots or random torso shots
if (_part == 0 && {_woundDamage >= HEAD_DAMAGE_THRESHOLD}) exitWith {
// Fatal damage to the head is guaranteed death
TRACE_1("determineIfFatal: lethal headshot",_woundDamage);
true breakOut "main";
};
if (_part == 1 && {_woundDamage >= ORGAN_DAMAGE_THRESHOLD} && {random 1 < HEART_HIT_CHANCE}) exitWith {
// Fatal damage to torso has various results based on organ hit - Heart shot is lethal
TRACE_1("determineIfFatal: lethal heartshot",_woundDamage);
true breakOut "main";
};
};
if (EGVAR(medical,fatalDamageSource) in [1, 2]) then {
// Sum of trauma to critical areas can be fatal (e.g. many small hits)
private _damageThreshold = if (isPlayer _unit) then { EGVAR(medical,playerDamageThreshold) } else { EGVAR(medical,AIDamageThreshold) };
private _headThreshhold = 1.25 * _damageThreshold;
private _bodyThreshhold = 1.5 * _damageThreshold;
_bodyPartDamage params ["_headDamage", "_bodyDamage"];
private _vitalDamage = ((_headDamage - _headThreshhold) max 0) + ((_bodyDamage - _bodyThreshhold) max 0);
private _chanceFatal = 1 - exp -((_vitalDamage/WEIBULL_L)^WEIBULL_K);
TRACE_3("",_bodyPartDamage,_vitalDamage,_chanceFatal);
if (_chanceFatal > random 1) exitWith {
TRACE_1("determineIfFatal: lethal trauma",_woundDamage);
true breakOut "main";
};
};
false

View File

@ -76,6 +76,7 @@ private _selectionSpecificDefault = getNumber (_damageTypesConfig >> "selectionS
GVAR(allDamageTypesData) setVariable [_className, [_thresholds, _selectionSpecific > 0, _woundTypes]]; GVAR(allDamageTypesData) setVariable [_className, [_thresholds, _selectionSpecific > 0, _woundTypes]];
/*
// extension loading // extension loading
private _minDamageThresholds = (_thresholds apply {str (_x select 0)}) joinString ":"; private _minDamageThresholds = (_thresholds apply {str (_x select 0)}) joinString ":";
private _amountThresholds = (_thresholds apply {str (_x select 1)}) joinString ":"; private _amountThresholds = (_thresholds apply {str (_x select 1)}) joinString ":";
@ -93,8 +94,10 @@ private _selectionSpecificDefault = getNumber (_damageTypesConfig >> "selectionS
// private _extensionRes = "ace_medical" callExtension _extensionArgs; // private _extensionRes = "ace_medical" callExtension _extensionArgs;
// TRACE_1("",_extensionRes); // TRACE_1("",_extensionRes);
*/
} forEach configProperties [_damageTypesConfig, "isClass _x"]; } forEach configProperties [_damageTypesConfig, "isClass _x"];
/*
// extension loading // extension loading
{ {
_x params ["_classID", "_selections", "_bleedingRate", "_pain", "_damageExtrema", "_causes", "_displayName"]; _x params ["_classID", "_selections", "_bleedingRate", "_pain", "_damageExtrema", "_causes", "_displayName"];
@ -128,3 +131,4 @@ private _selectionSpecificDefault = getNumber (_damageTypesConfig >> "selectionS
} forEach GVAR(woundsData); } forEach GVAR(woundsData);
// "ace_medical" callExtension "ConfigComplete"; // "ace_medical" callExtension "ConfigComplete";
*/

View File

@ -8,18 +8,19 @@
* 1: Name Of Body Part <STRING> * 1: Name Of Body Part <STRING>
* 2: Amount Of Damage <NUMBER> * 2: Amount Of Damage <NUMBER>
* 3: Type of the damage done <STRING> * 3: Type of the damage done <STRING>
* 4: Weighted array of damaged selections <ARRAY>
* *
* Return Value: * Return Value:
* None * None
* *
* Example: * Example:
* [player, "Body", 0.5, "bullet"] call ace_medical_damage_fnc_woundsHandlerSQF * [player, "Body", 0.5, "bullet", [1, 1]] call ace_medical_damage_fnc_woundsHandlerSQF
* *
* Public: No * Public: No
*/ */
params ["_unit", "_bodyPart", "_damage", "_typeOfDamage"]; params ["_unit", "_bodyPart", "_damage", "_typeOfDamage", "_damageSelectionArray"];
TRACE_4("woundsHandlerSQF",_unit,_bodyPart,_damage,_typeOfDamage); TRACE_5("woundsHandlerSQF",_unit,_bodyPart,_damage,_typeOfDamage,_damageSelectionArray);
// 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.
private _bodyPartN = ALL_BODY_PARTS find toLower _bodyPart; private _bodyPartN = ALL_BODY_PARTS find toLower _bodyPart;
@ -47,7 +48,7 @@ private _allPossibleInjuries = [];
// 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 {
// 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 || {_bodyPart in _selections}) then { // @todo, this is case sensitive! // if ("All" in _selections || {_bodyPart in _selections}) then { // @todo, this is case sensitive! [we have no injuries that use this, disabled for now]
// 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 {
@ -57,7 +58,7 @@ private _allPossibleInjuries = [];
// Store the valid possible injury for the damage type, damage amount and selection // Store the valid possible injury for the damage type, damage amount and selection
_allPossibleInjuries pushBack _x; _allPossibleInjuries pushBack _x;
}; // };
}; };
} forEach _woundTypes; } forEach _woundTypes;
@ -87,7 +88,7 @@ private _bodyPartVisParams = [_unit, false, false, false, false]; // params arra
_oldInjury params ["_woundClassIDToAdd", "", "_injuryBleedingRate", "_injuryPain", "", "", "", "_causeLimping", "_causeFracture"]; _oldInjury params ["_woundClassIDToAdd", "", "_injuryBleedingRate", "_injuryPain", "", "", "", "_causeLimping", "_causeFracture"];
private _bodyPartNToAdd = [floor random 6, _bodyPartN] select _isSelectionSpecific; // 6 == count ALL_BODY_PARTS private _bodyPartNToAdd = if (_isSelectionSpecific) then {_bodyPartN} else {selectRandomWeighted _damageSelectionArray};
_bodyPartDamage set [_bodyPartNToAdd, (_bodyPartDamage select _bodyPartNToAdd) + _woundDamage]; _bodyPartDamage set [_bodyPartNToAdd, (_bodyPartDamage select _bodyPartNToAdd) + _woundDamage];
_bodyPartVisParams set [[1,2,3,3,4,4] select _bodyPartNToAdd, true]; // Mark the body part index needs updating _bodyPartVisParams set [[1,2,3,3,4,4] select _bodyPartNToAdd, true]; // Mark the body part index needs updating
@ -120,26 +121,16 @@ private _bodyPartVisParams = [_unit, false, false, false, false]; // params arra
if (_bodyPartNToAdd == 0 || {_bodyPartNToAdd == 1 && {_woundDamage > PENETRATION_THRESHOLD}}) then { if (_bodyPartNToAdd == 0 || {_bodyPartNToAdd == 1 && {_woundDamage > PENETRATION_THRESHOLD}}) then {
_critialDamage = true; _critialDamage = true;
}; };
if ([_unit, _bodyPartNToAdd, _bodyPartDamage, _woundDamage] call FUNC(determineIfFatal)) then {
TRACE_1("determineIfFatal returned true",_woundDamage);
[QEGVAR(medical,FatalInjury), _unit] call CBA_fnc_localEvent;
};
#ifdef DEBUG_MODE_FULL #ifdef DEBUG_MODE_FULL
systemChat format["%1, damage: %2, peneration: %3, bleeding: %4, pain: %5", _bodyPart, _woundDamage toFixed 2, _woundDamage > PENETRATION_THRESHOLD, _bleeding toFixed 3, _pain toFixed 3]; systemChat format["%1, damage: %2, peneration: %3, bleeding: %4, pain: %5", _bodyPart, _woundDamage toFixed 2, _woundDamage > PENETRATION_THRESHOLD, _bleeding toFixed 3, _pain toFixed 3];
#endif #endif
// Emulate damage to vital organs
switch (true) do { switch (true) do {
// Fatal damage to the head is guaranteed death
case (_bodyPartNToAdd == 0 && {_woundDamage >= HEAD_DAMAGE_THRESHOLD}): {
TRACE_1("lethal headshot",_woundDamage toFixed 2);
[QEGVAR(medical,FatalInjury), _unit] call CBA_fnc_localEvent;
};
// Fatal damage to torso has various results based on organ hit
case (_bodyPartNToAdd == 1 && {_woundDamage >= ORGAN_DAMAGE_THRESHOLD}): {
// Heart shot is lethal
if (random 1 < HEART_HIT_CHANCE) then {
TRACE_1("lethal heartshot",_woundDamage toFixed 2);
[QEGVAR(medical,FatalInjury), _unit] call CBA_fnc_localEvent;
};
};
case (_causeFracture && {EGVAR(medical,fractures) > 0} && {_bodyPartNToAdd > 1} && {_woundDamage > FRACTURE_DAMAGE_THRESHOLD}): { case (_causeFracture && {EGVAR(medical,fractures) > 0} && {_bodyPartNToAdd > 1} && {_woundDamage > FRACTURE_DAMAGE_THRESHOLD}): {
TRACE_1("limb fracture",_bodyPartNToAdd); TRACE_1("limb fracture",_bodyPartNToAdd);
private _fractures = GET_FRACTURES(_unit); private _fractures = GET_FRACTURES(_unit);

View File

@ -1,3 +1,12 @@
[
QEGVAR(medical,fatalDamageSource),
"LIST",
[LSTRING(fatalDamageSource_DisplayName), LSTRING(fatalDamageSource_Description)],
[ELSTRING(medical,Category)],
[[0, 1, 2], [LSTRING(fatalDamageSource_vitalShotsOnly), LSTRING(fatalDamageSource_trauma), LSTRING(fatalDamageSource_both)], 0],
true
] call CBA_settings_fnc_init;
[ [
QEGVAR(medical,playerDamageThreshold), QEGVAR(medical,playerDamageThreshold),
"SLIDER", "SLIDER",

View File

@ -4,7 +4,7 @@
// #define DEBUG_MODE_FULL // #define DEBUG_MODE_FULL
// #define DISABLE_COMPILE_CACHE // #define DISABLE_COMPILE_CACHE
//#define ENABLE_PERFORMANCE_COUNTERS // #define ENABLE_PERFORMANCE_COUNTERS
#ifdef DEBUG_ENABLED_MEDICAL_DAMAGE #ifdef DEBUG_ENABLED_MEDICAL_DAMAGE
#define DEBUG_MODE_FULL #define DEBUG_MODE_FULL

View File

@ -477,5 +477,20 @@
<Japanese>大きな刺し傷</Japanese> <Japanese>大きな刺し傷</Japanese>
<Korean>대형 관통상</Korean> <Korean>대형 관통상</Korean>
</Key> </Key>
<Key ID="STR_ACE_Medical_Damage_fatalDamageSource_DisplayName">
<English>Fatal Damage Source</English>
</Key>
<Key ID="STR_ACE_Medical_Damage_fatalDamageSource_Description">
<English>Determines what damage can be fatal</English>
</Key>
<Key ID="STR_ACE_Medical_Damage_fatalDamageSource_vitalShotsOnly">
<English>Only large hits to vital organs</English>
</Key>
<Key ID="STR_ACE_Medical_Damage_fatalDamageSource_trauma">
<English>Sum of trauma</English>
</Key>
<Key ID="STR_ACE_Medical_Damage_fatalDamageSource_both">
<English>Either</English>
</Key>
</Package> </Package>
</Project> </Project>

View File

@ -80,6 +80,12 @@ if (_hitPoint isEqualTo "ace_hdbracket") exitWith {
]; ];
TRACE_2("incoming",_allDamages,_damageStructural); TRACE_2("incoming",_allDamages,_damageStructural);
// represents all incoming damage for selecting a non-selectionSpecific wound location, (used for selectRandomWeighted [value1,weight1,value2....])
private _damageSelectionArray = [
HITPOINT_INDEX_HEAD, _damageHead, HITPOINT_INDEX_BODY, _damageBody, HITPOINT_INDEX_LARM, _damageLeftArm,
HITPOINT_INDEX_RARM, _damageRightArm, HITPOINT_INDEX_LLEG, _damageLeftLeg, HITPOINT_INDEX_RLEG, _damageRightLeg
];
_allDamages sort false; _allDamages sort false;
(_allDamages select 0) params ["_receivedDamage", "", "_woundedHitPoint"]; (_allDamages select 0) params ["_receivedDamage", "", "_woundedHitPoint"];
if (_damageHead >= HEAD_DAMAGE_THRESHOLD) then { if (_damageHead >= HEAD_DAMAGE_THRESHOLD) then {
@ -92,6 +98,7 @@ if (_hitPoint isEqualTo "ace_hdbracket") exitWith {
if (_receivedDamage == 0) then { if (_receivedDamage == 0) then {
_receivedDamage = _damageStructural; _receivedDamage = _damageStructural;
_woundedHitPoint = "Body"; _woundedHitPoint = "Body";
_damageSelectionArray = [1, 1]; // sum of weights would be 0
}; };
// Environmental damage sources all have empty ammo string // Environmental damage sources all have empty ammo string
@ -100,7 +107,7 @@ if (_hitPoint isEqualTo "ace_hdbracket") exitWith {
// Any collision with terrain/vehicle/object has a shooter // Any collision with terrain/vehicle/object has a shooter
// Check this first because burning can happen at any velocity // Check this first because burning can happen at any velocity
if !(isNull _shooter) then { if !(isNull _shooter) then {
_ammo = "#collision"; _ammo = "#collision"; // non-selectionSpecific so only _damageSelectionArray matters
/* /*
If shooter != unit then they hit unit, otherwise it could be: If shooter != unit then they hit unit, otherwise it could be:
@ -110,10 +117,11 @@ if (_hitPoint isEqualTo "ace_hdbracket") exitWith {
Assume fall damage for downward velocity because it's most common Assume fall damage for downward velocity because it's most common
*/ */
if (_shooter == _unit && {(velocity _unit select 2) < -2}) then { if (_shooter == _unit && {(velocity _unit select 2) < -2}) then {
_woundedHitPoint = selectRandom ["RightLeg", "LeftLeg"]; _ammo = "#falling"; // non-selectionSpecific so only _damageSelectionArray matters
_damageSelectionArray = [4, 1, 5, 1]; // selectRandom ["RightLeg", "LeftLeg"];
TRACE_5("Fall",_unit,_shooter,_instigator,_damage,_receivedDamage); TRACE_5("Fall",_unit,_shooter,_instigator,_damage,_receivedDamage);
} else { } else {
_woundedHitPoint = selectRandom ["RightArm", "LeftArm", "RightLeg", "LeftLeg"]; _damageSelectionArray = [2, 1, 3, 1, 4, 1, 5, 1]; // selectRandom ["RightArm", "LeftArm", "RightLeg", "LeftLeg"];
TRACE_5("Collision",_unit,_shooter,_instigator,_damage,_receivedDamage); TRACE_5("Collision",_unit,_shooter,_instigator,_damage,_receivedDamage);
}; };
@ -122,12 +130,16 @@ if (_hitPoint isEqualTo "ace_hdbracket") exitWith {
// Higher momentum results in higher chance for head to be hit for more lethality // Higher momentum results in higher chance for head to be hit for more lethality
if (_receivedDamage > 0.35) then { if (_receivedDamage > 0.35) then {
private _headHitWeight = (_receivedDamage / 2) min 1; private _headHitWeight = (_receivedDamage / 2) min 1;
_woundedHitPoint = selectRandomWeighted ["Body", (1 - _headHitWeight), "Head", _headHitWeight]; if (_recievedDamage < 0.6) then {
_damageSelectionArray append [0, (1 - _headHitWeight), 1, _headHitWeight];
} else {
_damageSelectionArray = [0, (1 - _headHitWeight), 1, _headHitWeight];
}
}; };
} else { } else {
// Anything else is almost guaranteed to be fire damage // Anything else is almost guaranteed to be fire damage
_woundedHitPoint = selectRandom ["LeftLeg", "RightLeg", "Body"]; _damageSelectionArray = [1, 1, 4, 1, 5, 1]; // selectRandom ["Body", "LeftLeg", "RightLeg"];
_ammo = "#unknown"; _ammo = "#unknown"; // non-selectionSpecific so only _damageSelectionArray matters
// Fire damage can occur as lots of minor damage events // Fire damage can occur as lots of minor damage events
// Combine these until significant enough to wound // Combine these until significant enough to wound
@ -145,8 +157,8 @@ if (_hitPoint isEqualTo "ace_hdbracket") exitWith {
// No wounds for minor damage // No wounds for minor damage
if (_receivedDamage > 1E-3) then { if (_receivedDamage > 1E-3) then {
[QEGVAR(medical,woundReceived), [_unit, _woundedHitPoint, _receivedDamage, _shooter, _ammo]] call CBA_fnc_localEvent; TRACE_3("received",_receivedDamage,_woundedHitPoint,_damageSelectionArray);
TRACE_2("received",_receivedDamage,_woundedHitPoint); [QEGVAR(medical,woundReceived), [_unit, _woundedHitPoint, _receivedDamage, _shooter, _ammo, _damageSelectionArray]] call CBA_fnc_localEvent;
}; };
// Clear stored damages otherwise they will influence future damage events // Clear stored damages otherwise they will influence future damage events
@ -169,7 +181,7 @@ if (
{getOxygenRemaining _unit <= 0.5} && {getOxygenRemaining _unit <= 0.5} &&
{_damage isEqualTo (_oldDamage + 0.005)} {_damage isEqualTo (_oldDamage + 0.005)}
) exitWith { ) exitWith {
[QEGVAR(medical,woundReceived), [_unit, "Body", _newDamage, _unit, "#drowning"]] call CBA_fnc_localEvent; [QEGVAR(medical,woundReceived), [_unit, "Body", _newDamage, _unit, "#drowning", [HITPOINT_INDEX_BODY, 1]]] call CBA_fnc_localEvent;
TRACE_5("Drowning",_unit,_shooter,_instigator,_damage,_newDamage); TRACE_5("Drowning",_unit,_shooter,_instigator,_damage,_newDamage);
0 0
@ -185,7 +197,11 @@ if (
{vectorMagnitude (velocity _vehicle) > 5} {vectorMagnitude (velocity _vehicle) > 5}
// todo: no way to detect if stationary and another vehicle hits you // todo: no way to detect if stationary and another vehicle hits you
) exitWith { ) exitWith {
[QEGVAR(medical,woundReceived), [_unit, "Body", _newDamage, _unit, "#vehiclecrash"]] call CBA_fnc_localEvent; private _damageSelectionArray = [
HITPOINT_INDEX_HEAD, 1, HITPOINT_INDEX_BODY, 1, HITPOINT_INDEX_LARM, 1,
HITPOINT_INDEX_RARM, 1, HITPOINT_INDEX_LLEG, 1, HITPOINT_INDEX_RLEG, 1
];
[QEGVAR(medical,woundReceived), [_unit, "Body", _newDamage, _unit, "#vehiclecrash", _damageSelectionArray]] call CBA_fnc_localEvent;
TRACE_5("Crash",_unit,_shooter,_instigator,_damage,_newDamage); TRACE_5("Crash",_unit,_shooter,_instigator,_damage,_newDamage);
0 0

View File

@ -6,6 +6,13 @@
#define ALL_SELECTIONS ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"] #define ALL_SELECTIONS ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"]
#define ALL_HITPOINTS ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"] #define ALL_HITPOINTS ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"]
#define HITPOINT_INDEX_HEAD 0
#define HITPOINT_INDEX_BODY 1
#define HITPOINT_INDEX_LARM 2
#define HITPOINT_INDEX_RARM 3
#define HITPOINT_INDEX_LLEG 4
#define HITPOINT_INDEX_RLEG 5
// Damage threshold above which fatal organ damage can occur // Damage threshold above which fatal organ damage can occur
#define HEAD_DAMAGE_THRESHOLD 1 #define HEAD_DAMAGE_THRESHOLD 1
#define ORGAN_DAMAGE_THRESHOLD 0.6 #define ORGAN_DAMAGE_THRESHOLD 0.6

File diff suppressed because it is too large Load Diff

View File

@ -3,6 +3,10 @@
[QEGVAR(medical,injured), { [QEGVAR(medical,injured), {
params ["_unit", "_painLevel"]; params ["_unit", "_painLevel"];
[_unit, "hit", PAIN_TO_SCREAM(_painLevel)] call FUNC(playInjuredSound); [_unit, "hit", PAIN_TO_SCREAM(_painLevel)] call FUNC(playInjuredSound);
if (hasInterface && {_unit == ace_player}) then {
[true] call FUNC(handleEffects);
};
}] call CBA_fnc_addEventHandler; }] call CBA_fnc_addEventHandler;
[QEGVAR(medical,moan), { [QEGVAR(medical,moan), {
@ -10,21 +14,23 @@
[_unit, "moan", PAIN_TO_MOAN(_painLevel)] call FUNC(playInjuredSound); [_unit, "moan", PAIN_TO_MOAN(_painLevel)] call FUNC(playInjuredSound);
}] call CBA_fnc_addEventHandler; }] call CBA_fnc_addEventHandler;
if (!hasInterface) exitWith {};
[QEGVAR(medical,fracture), { [QEGVAR(medical,fracture), {
params ["_unit"]; params ["_unit"];
if (_unit == ACE_player) then { if (_unit == ACE_player) then {
playSound SND_FRACTURE; playSound SND_FRACTURE;
}; };
}] call CBA_fnc_addEventHandler; }] call CBA_fnc_addEventHandler;
if (!hasInterface) exitWith {};
GVAR(nextFadeIn) = 0; GVAR(nextFadeIn) = 0;
GVAR(heartBeatEffectRunning) = false; GVAR(heartBeatEffectRunning) = false;
GVAR(lastHeartBeatSound) = 0;
GVAR(bloodTickCounter) = 0;
[false] call FUNC(initEffects); [false] call FUNC(initEffects);
[LINKFUNC(handleEffects), 1, []] call CBA_fnc_addPerFrameHandler; [true] call FUNC(handleEffects);
[FUNC(handleEffects), 1, false] call CBA_fnc_addPerFrameHandler;
["ace_unconscious", { ["ace_unconscious", {
params ["_unit", "_unconscious"]; params ["_unit", "_unconscious"];
@ -45,10 +51,11 @@ GVAR(heartBeatEffectRunning) = false;
if (["acre_main"] call EFUNC(common,isModLoaded)) then { if (["acre_main"] call EFUNC(common,isModLoaded)) then {
_unit setVariable ["acre_sys_core_isDisabled", _unconscious, true]; _unit setVariable ["acre_sys_core_isDisabled", _unconscious, true];
}; };
// Greatly reduce player's hearing ability while unconscious (affects radio addons) // Greatly reduce player's hearing ability while unconscious (affects radio addons)
[QUOTE(ADDON), VOL_UNCONSCIOUS, _unconscious] call EFUNC(common,setHearingCapability); [QUOTE(ADDON), VOL_UNCONSCIOUS, _unconscious] call EFUNC(common,setHearingCapability);
[_unconscious, 1] call FUNC(effectUnconscious); [true] call FUNC(handleEffects);
["unconscious", _unconscious] call EFUNC(common,setDisableUserInputStatus); ["unconscious", _unconscious] call EFUNC(common,setDisableUserInputStatus);
}] call CBA_fnc_addEventHandler; }] call CBA_fnc_addEventHandler;
@ -80,10 +87,31 @@ GVAR(heartBeatEffectRunning) = false;
_new setVariable ["acre_sys_core_isDisabled", _status, true]; _new setVariable ["acre_sys_core_isDisabled", _status, true];
}; };
[QUOTE(ADDON), VOL_UNCONSCIOUS, _status] call EFUNC(common,setHearingCapability); [QUOTE(ADDON), VOL_UNCONSCIOUS, _status] call EFUNC(common,setHearingCapability);
[_status, 0] call FUNC(effectUnconscious); [true] call FUNC(handleEffects);
["unconscious", _status] call EFUNC(common,setDisableUserInputStatus); ["unconscious", _status] call EFUNC(common,setDisableUserInputStatus);
}] call CBA_fnc_addPlayerEventHandler; }] call CBA_fnc_addPlayerEventHandler;
// Forced say3D
[QGVAR(forceSay3D), {
params ["_unit", "_sound", "_distance"];
if (ACE_player distance _unit > _distance) exitWith {};
if (vehicle _unit == _unit) then {
// say3D waits for the previous sound to finish, so use a dummy instead
private _dummy = "#dynamicsound" createVehicleLocal [0, 0, 0];
_dummy attachTo [_unit, [0, 0, 0], "camera"];
_dummy say3D [_sound, _distance, 1, false];
[{
detach _this;
deleteVehicle _this;
}, _dummy, 5] call CBA_fnc_waitAndExecute;
} else {
// Fallback: attachTo doesn't work within vehicles
_unit say3D [_sound, _distance, 1, false];
};
}] call CBA_fnc_addEventHandler;
// Kill vanilla bleeding feedback effects. // Kill vanilla bleeding feedback effects.
#ifdef DISABLE_VANILLA_DAMAGE_EFFECTS #ifdef DISABLE_VANILLA_DAMAGE_EFFECTS

View File

@ -8,743 +8,4 @@ PREP_RECOMPILE_END;
#include "initSettings.sqf" #include "initSettings.sqf"
GVAR(lastHeartBeatSound) = 0;
// HitScream
GVAR(HitScreamNamespace) = [] call CBA_fnc_createNamespace;
GVAR(HitScreamNamespace) setVariable ["#default", "Male08ENG"];
GVAR(HitScreamNamespace) setVariable ["Male08ENG", [[
["A3\sounds_f\characters\human-sfx\P01\Low_hit_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P01\Low_hit_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P01\Low_hit_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P01\Low_hit_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P01\Low_hit_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P01\Mid_hit_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P01\Mid_hit_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P01\Mid_hit_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P01\Mid_hit_4",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P01\Max_hit_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P01\Max_hit_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P01\Max_hit_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P01\Max_hit_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P01\Max_hit_5",3.1622777,1,80]
]]];
GVAR(HitScreamNamespace) setVariable ["Male06ENG", [[
["A3\sounds_f\characters\human-sfx\P02\Low_hit_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P02\Low_hit_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P02\Low_hit_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P02\Low_hit_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P02\Low_hit_5",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P02\Low_hit_6",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P02\Mid_hit_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P02\Mid_hit_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P02\Mid_hit_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P02\Mid_hit_4",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P02\Max_hit_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P02\Max_hit_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P02\Max_hit_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P02\Max_hit_4",3.1622777,1,80]
]]];
GVAR(HitScreamNamespace) setVariable ["Male09ENG", [[
["A3\sounds_f\characters\human-sfx\P03\Hit_Low_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P03\Hit_Low_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P03\Hit_Low_3",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P03\Hit_Mid_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P03\Hit_Mid_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P03\Hit_Mid_3",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P03\Hit_Max_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P03\Hit_Max_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P03\Hit_Max_3",3.1622777,1,80]
]]];
GVAR(HitScreamNamespace) setVariable ["Male07ENG", [[
["A3\sounds_f\characters\human-sfx\P04\Hit_Low_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P04\Hit_Low_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P04\Hit_Low_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P04\Hit_Low_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P04\Hit_Low_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P04\Hit_Mid_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P04\Hit_Mid_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P04\Hit_Mid_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P04\Hit_Mid_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P04\Hit_Mid_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P04\Hit_Max_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P04\Hit_Max_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P04\Hit_Max_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P04\Hit_Max_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P04\Hit_Max_5",3.1622777,1,80]
]]];
GVAR(HitScreamNamespace) setVariable ["Male03GRE", [[
["A3\sounds_f\characters\human-sfx\P05\Hit_Low_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P05\Hit_Low_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P05\Hit_Low_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P05\Hit_Low_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P05\Hit_Low_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P05\Hit_Mid_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P05\Hit_Mid_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P05\Hit_Mid_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P05\Hit_Mid_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P05\Hit_Mid_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P05\Hit_Max_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P05\Hit_Max_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P05\Hit_Max_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P05\Hit_Max_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P05\Hit_Max_5",3.1622777,1,80]
]]];
GVAR(HitScreamNamespace) setVariable ["Male02ENGB", [[
["A3\sounds_f\characters\human-sfx\P06\Hit_Low_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P06\Hit_Low_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P06\Hit_Low_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P06\Hit_Low_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P06\Hit_Low_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P06\Hit_Mid_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P06\Hit_Mid_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P06\Hit_Mid_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P06\Hit_Mid_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P06\Hit_Mid_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P06\Hit_Max_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P06\Hit_Max_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P06\Hit_Max_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P06\Hit_Max_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P06\Hit_Max_5",3.1622777,1,80]
]]];
GVAR(HitScreamNamespace) setVariable ["Male01ENGB", [[
["A3\sounds_f\characters\human-sfx\P07\Hit_Low_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P07\Hit_Low_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P07\Hit_Low_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P07\Hit_Low_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P07\Hit_Low_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P07\Hit_Mid_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P07\Hit_Mid_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P07\Hit_Mid_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P07\Hit_Mid_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P07\Hit_Mid_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P07\Hit_Max_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P07\Hit_Max_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P07\Hit_Max_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P07\Hit_Max_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P07\Hit_Max_5",3.1622777,1,80]
]]];
GVAR(HitScreamNamespace) setVariable ["Male01GRE", [[
["A3\sounds_f\characters\human-sfx\P08\Hit_Low_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P08\Hit_Low_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P08\Hit_Low_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P08\Hit_Low_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P08\Hit_Low_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P08\Hit_Mid_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P08\Hit_Mid_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P08\Hit_Mid_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P08\Hit_Mid_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P08\Hit_Mid_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P08\Hit_Max_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P08\Hit_Max_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P08\Hit_Max_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P08\Hit_Max_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P08\Hit_Max_5",3.1622777,1,80]
]]];
GVAR(HitScreamNamespace) setVariable ["Male02ENG", [[
["A3\sounds_f\characters\human-sfx\P09\Hit_Low_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P09\Hit_Low_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P09\Hit_Low_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P09\Hit_Low_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P09\Hit_Low_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P09\Hit_Mid_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P09\Hit_Mid_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P09\Hit_Mid_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P09\Hit_Mid_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P09\Hit_Mid_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P09\Hit_Max_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P09\Hit_Max_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P09\Hit_Max_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P09\Hit_Max_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P09\Hit_Max_5",3.1622777,1,80]
]]];
GVAR(HitScreamNamespace) setVariable ["Male02GRE", [[
["A3\sounds_f\characters\human-sfx\P10\Hit_Low_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P10\Hit_Low_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P10\Hit_Low_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P10\Hit_Low_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P10\Hit_Low_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P10\Hit_Mid_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P10\Hit_Mid_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P10\Hit_Mid_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P10\Hit_Mid_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P10\Hit_Mid_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P10\Hit_Max_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P10\Hit_Max_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P10\Hit_Max_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P10\Hit_Max_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P10\Hit_Max_5",3.1622777,1,80]
]]];
GVAR(HitScreamNamespace) setVariable ["Male03ENG", [[
["A3\sounds_f\characters\human-sfx\P11\Hit_Low_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P11\Hit_Low_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P11\Hit_Low_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P11\Hit_Low_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P11\Hit_Low_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P11\Hit_Mid_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P11\Hit_Mid_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P11\Hit_Mid_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P11\Hit_Mid_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P11\Hit_Mid_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P11\Hit_Max_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P11\Hit_Max_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P11\Hit_Max_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P11\Hit_Max_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P11\Hit_Max_5",3.1622777,1,80]
]]];
GVAR(HitScreamNamespace) setVariable ["Male03ENGB", [[
["A3\sounds_f\characters\human-sfx\P12\Hit_Low_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P12\Hit_Low_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P12\Hit_Low_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P12\Hit_Low_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P12\Hit_Low_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P12\Hit_Mid_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P12\Hit_Mid_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P12\Hit_Mid_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P12\Hit_Mid_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P12\Hit_Mid_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P12\Hit_Max_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P12\Hit_Max_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P12\Hit_Max_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P12\Hit_Max_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P12\Hit_Max_5",3.1622777,1,80]
]]];
GVAR(HitScreamNamespace) setVariable ["Male04ENG", [[
["A3\sounds_f\characters\human-sfx\P13\Hit_Low_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P13\Hit_Low_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P13\Hit_Low_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P13\Hit_Low_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P13\Hit_Low_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P13\Hit_Mid_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P13\Hit_Mid_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P13\Hit_Mid_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P13\Hit_Mid_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P13\Hit_Mid_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P13\Hit_Max_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P13\Hit_Max_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P13\Hit_Max_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P13\Hit_Max_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P13\Hit_Max_5",3.1622777,1,80]
]]];
GVAR(HitScreamNamespace) setVariable ["Male05GRE", [[
["A3\sounds_f\characters\human-sfx\P14\Hit_Low_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P14\Hit_Low_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P14\Hit_Low_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P14\Hit_Low_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P14\Hit_Low_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P14\Hit_Mid_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P14\Hit_Mid_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P14\Hit_Mid_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P14\Hit_Mid_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P14\Hit_Mid_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P14\Hit_Max_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P14\Hit_Max_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P14\Hit_Max_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P14\Hit_Max_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P14\Hit_Max_5",3.1622777,1,80]
]]];
GVAR(HitScreamNamespace) setVariable ["Male06GRE", [[
["A3\sounds_f\characters\human-sfx\P15\Hit_Low_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P15\Hit_Low_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P15\Hit_Low_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P15\Hit_Low_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P15\Hit_Low_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P15\Hit_Mid_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P15\Hit_Mid_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P15\Hit_Mid_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P15\Hit_Mid_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P15\Hit_Mid_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P15\Hit_Max_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P15\Hit_Max_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P15\Hit_Max_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P15\Hit_Max_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P15\Hit_Max_5",3.1622777,1,80]
]]];
GVAR(HitScreamNamespace) setVariable ["Male04GRE", [[
["A3\sounds_f\characters\human-sfx\P16\Hit_Low_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P16\Hit_Low_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P16\Hit_Low_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P16\Hit_Low_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P16\Hit_Low_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P16\Hit_Mid_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P16\Hit_Mid_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P16\Hit_Mid_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P16\Hit_Mid_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P16\Hit_Mid_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P16\Hit_Max_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P16\Hit_Max_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P16\Hit_Max_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P16\Hit_Max_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P16\Hit_Max_5",3.1622777,1,80]
]]];
GVAR(HitScreamNamespace) setVariable ["Male05ENGB", [[
["A3\sounds_f\characters\human-sfx\P17\Hit_Low_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P17\Hit_Low_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P17\Hit_Low_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P17\Hit_Low_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P17\Hit_Low_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P17\Hit_Mid_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P17\Hit_Mid_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P17\Hit_Mid_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P17\Hit_Mid_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P17\Hit_Mid_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P17\Hit_Max_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P17\Hit_Max_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P17\Hit_Max_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P17\Hit_Max_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P17\Hit_Max_5",3.1622777,1,80]
]]];
GVAR(HitScreamNamespace) setVariable ["Male05ENG", [[
["A3\sounds_f\characters\human-sfx\P18\Hit_Low_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P18\Hit_Low_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P18\Hit_Low_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P18\Hit_Low_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P18\Hit_Low_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P18\Hit_Mid_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P18\Hit_Mid_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P18\Hit_Mid_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P18\Hit_Mid_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P18\Hit_Mid_5",3.1622777,1,80]
], [
["A3\sounds_f\characters\human-sfx\P18\Hit_Max_1",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P18\Hit_Max_2",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P18\Hit_Max_3",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P18\Hit_Max_4",3.1622777,1,80],
["A3\sounds_f\characters\human-sfx\P18\Hit_Max_5",3.1622777,1,80]
]]];
// InjuredMoan
GVAR(InjuredMoanNamespace) = [] call CBA_fnc_createNamespace;
GVAR(InjuredMoanNamespace) setVariable ["#default", "Male08ENG"];
GVAR(InjuredMoanNamespace) setVariable ["Male08ENG", [[
["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Low_1",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Low_2",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Low_3",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Low_4",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Low_5",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Low_6",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Low_7",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Low_8",1.4125376,1,10]
], [
["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Mid_1",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Mid_2",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Mid_3",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Mid_4",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Mid_5",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Mid_6",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Mid_7",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Mid_8",1.5848932,1,15]
], [
["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Max_1",1.5848932,1,20],
["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Max_2",1.5848932,1,20],
["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Max_3",1.5848932,1,20],
["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Max_4",1.5848932,1,20],
["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Max_5",1.5848932,1,20],
["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Max_6",1.5848932,1,20],
["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Max_7",1.5848932,1,20],
["A3\Sounds_F\characters\human-sfx\P01\Soundinjured_Max_8",1.5848932,1,20]
]]];
GVAR(InjuredMoanNamespace) setVariable ["Male06ENG", [[
["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Low_1",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Low_2",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Low_3",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Low_4",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Low_5",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Low_6",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Low_7",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Low_8",1.4125376,1,10]
], [
["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Mid_1",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Mid_2",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Mid_3",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Mid_4",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Mid_5",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Mid_6",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Mid_7",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Mid_8",1.5848932,1,15]
], [
["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Max_1",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Max_2",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Max_3",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Max_4",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Max_5",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Max_6",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Max_7",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P02\Soundinjured_Max_8",1.7782794,1,20]
]]];
GVAR(InjuredMoanNamespace) setVariable ["Male09ENG", [[
["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Low_1",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Low_2",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Low_3",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Low_4",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Low_5",1.4125376,1,10]
], [
["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Mid_1",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Mid_2",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Mid_3",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Mid_4",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Mid_5",1.5848932,1,15]
], [
["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Max_1",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Max_2",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Max_3",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P03\Soundinjured_Max_4",1.7782794,1,20]
]]];
GVAR(InjuredMoanNamespace) setVariable ["Male07ENG", [[
["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Low_1",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Low_2",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Low_3",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Low_4",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Low_5",1.4125376,1,10]
], [
["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Mid_1",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Mid_2",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Mid_3",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Mid_4",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Mid_5",1.5848932,1,15]
], [
["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Max_1",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Max_2",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Max_3",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Max_4",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P04\Soundinjured_Max_5",1.7782794,1,20]
]]];
GVAR(InjuredMoanNamespace) setVariable ["Male03GRE", [[
["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Low_1",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Low_2",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Low_3",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Low_4",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Low_5",1.4125376,1,10]
], [
["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Mid_1",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Mid_2",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Mid_3",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Mid_4",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Mid_5",1.5848932,1,15]
], [
["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Max_1",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Max_2",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Max_3",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Max_4",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P05\Soundinjured_Max_5",1.7782794,1,20]
]]];
GVAR(InjuredMoanNamespace) setVariable ["Male02ENGB", [[
["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Low_1",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Low_2",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Low_3",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Low_4",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Low_5",1.4125376,1,10]
], [
["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Mid_1",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Mid_2",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Mid_3",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Mid_4",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Mid_5",1.5848932,1,15]
], [
["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Max_1",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Max_2",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Max_3",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Max_4",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P06\Soundinjured_Max_5",1.7782794,1,20]
]]];
GVAR(InjuredMoanNamespace) setVariable ["Male01ENGB", [[
["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Low_1",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Low_2",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Low_3",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Low_4",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Low_5",1.4125376,1,10]
], [
["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Mid_1",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Mid_2",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Mid_3",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Mid_4",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Mid_5",1.5848932,1,15]
], [
["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Max_1",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Max_2",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Max_3",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Max_4",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P07\Soundinjured_Max_5",1.7782794,1,20]
]]];
GVAR(InjuredMoanNamespace) setVariable ["Male01GRE", [[
["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Low_1",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Low_2",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Low_3",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Low_4",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Low_5",1.4125376,1,10]
], [
["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Mid_1",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Mid_2",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Mid_3",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Mid_4",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Mid_5",1.5848932,1,15]
], [
["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Max_1",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Max_2",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Max_3",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Max_4",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P08\Soundinjured_Max_5",1.7782794,1,20]
]]];
GVAR(InjuredMoanNamespace) setVariable ["Male02ENG", [[
["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Low_1",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Low_2",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Low_3",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Low_4",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Low_5",1.4125376,1,10]
], [
["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Mid_1",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Mid_2",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Mid_3",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Mid_4",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Mid_5",1.5848932,1,15]
], [
["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Max_1",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Max_2",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Max_3",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Max_4",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P09\Soundinjured_Max_5",1.7782794,1,20]
]]];
GVAR(InjuredMoanNamespace) setVariable ["Male02GRE", [[
["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Low_1",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Low_2",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Low_3",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Low_4",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Low_5",1.4125376,1,10]
], [
["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Mid_1",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Mid_2",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Mid_3",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Mid_4",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Mid_5",1.5848932,1,15]
], [
["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Max_1",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Max_2",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Max_3",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Max_4",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P10\Soundinjured_Max_5",1.7782794,1,20]
]]];
GVAR(InjuredMoanNamespace) setVariable ["Male03ENG", [[
["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Low_1",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Low_2",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Low_3",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Low_4",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Low_5",1.4125376,1,10]
], [
["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Mid_1",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Mid_2",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Mid_3",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Mid_4",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Mid_5",1.5848932,1,15]
], [
["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Max_1",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Max_2",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Max_3",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Max_4",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P11\Soundinjured_Max_5",1.7782794,1,20]
]]];
GVAR(InjuredMoanNamespace) setVariable ["Male03ENGB", [[
["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Low_1",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Low_2",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Low_3",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Low_4",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Low_5",1.4125376,1,10]
], [
["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Mid_1",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Mid_2",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Mid_3",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Mid_4",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Mid_5",1.5848932,1,15]
], [
["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Max_1",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Max_2",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Max_3",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Max_4",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P12\Soundinjured_Max_5",1.7782794,1,20]
]]];
GVAR(InjuredMoanNamespace) setVariable ["Male04ENG", [[
["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Low_1",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Low_2",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Low_3",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Low_4",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Low_5",1.4125376,1,10]
], [
["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Mid_1",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Mid_2",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Mid_3",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Mid_4",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Mid_5",1.5848932,1,15]
], [
["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Max_1",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Max_2",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Max_3",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Max_4",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P13\Soundinjured_Max_5",1.7782794,1,20]
]]];
GVAR(InjuredMoanNamespace) setVariable ["Male05GRE", [[
["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Low_1",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Low_2",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Low_3",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Low_4",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Low_5",1.4125376,1,10]
], [
["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Mid_1",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Mid_2",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Mid_3",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Mid_4",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Mid_5",1.5848932,1,15]
], [
["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Max_1",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Max_2",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Max_3",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Max_4",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P14\Soundinjured_Max_5",1.7782794,1,20]
]]];
GVAR(InjuredMoanNamespace) setVariable ["Male06GRE", [[
["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Low_1",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Low_2",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Low_3",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Low_4",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Low_5",1.4125376,1,10]
], [
["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Mid_1",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Mid_2",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Mid_3",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Mid_4",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Mid_5",1.5848932,1,15]
], [
["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Max_1",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Max_2",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Max_3",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Max_4",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P15\Soundinjured_Max_5",1.7782794,1,20]
]]];
GVAR(InjuredMoanNamespace) setVariable ["Male04GRE", [[
["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Low_1",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Low_2",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Low_3",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Low_4",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Low_5",1.4125376,1,10]
], [
["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Mid_1",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Mid_2",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Mid_3",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Mid_4",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Mid_5",1.5848932,1,15]
], [
["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Max_1",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Max_2",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Max_3",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Max_4",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P16\Soundinjured_Max_5",1.7782794,1,20]
]]];
GVAR(InjuredMoanNamespace) setVariable ["Male05ENGB", [[
["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Low_1",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Low_2",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Low_3",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Low_4",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Low_5",1.4125376,1,10]
], [
["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Mid_1",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Mid_2",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Mid_3",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Mid_4",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Mid_5",1.5848932,1,15]
], [
["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Max_1",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Max_2",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Max_3",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Max_4",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P17\Soundinjured_Max_5",1.7782794,1,20]
]]];
GVAR(InjuredMoanNamespace) setVariable ["Male05ENG", [[
["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Low_1",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Low_2",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Low_3",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Low_4",1.4125376,1,10],
["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Low_5",1.4125376,1,10]
], [
["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Mid_1",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Mid_2",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Mid_3",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Mid_4",1.5848932,1,15],
["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Mid_5",1.5848932,1,15]
], [
["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Max_1",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Max_2",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Max_3",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Max_4",1.7782794,1,20],
["A3\Sounds_F\characters\human-sfx\P18\Soundinjured_Max_5",1.7782794,1,20]
]]];
ADDON = true; ADDON = true;

View File

@ -6,6 +6,7 @@
* Arguments: * Arguments:
* 0: Enable effect <BOOL> * 0: Enable effect <BOOL>
* 1: Current bloodloss (in l/s) <NUMBER> * 1: Current bloodloss (in l/s) <NUMBER>
* 2: Instant change (optional, default false) <BOOL>
* *
* Return Value: * Return Value:
* None * None
@ -16,7 +17,7 @@
* Public: No * Public: No
*/ */
params ["_enable", "_bloodloss"]; params ["_enable", "_bloodloss", ["_instant", false]];
if (isNull findDisplay 46) exitWith {}; if (isNull findDisplay 46) exitWith {};
private _controls = uiNamespace getVariable [QGVAR(bloodControls), [controlNull, controlNull]]; private _controls = uiNamespace getVariable [QGVAR(bloodControls), [controlNull, controlNull]];
@ -54,10 +55,7 @@ if (isNull _blood1) then {
private _fade = linearConversion [0, 0.002, _bloodloss, 1, 0, true]; private _fade = linearConversion [0, 0.002, _bloodloss, 1, 0, true];
private _switchBloodFadeInfo = missionNamespace getVariable [QGVAR(switchBloodFadeInfo), [0, 0]]; if (GVAR(bloodTickCounter) == 2 || _instant) then {
_switchBloodFadeInfo params ["_tickCounter", "_lastBloodloss"];
if (_tickCounter == 2) then {
if (ctrlFade _blood1 > ctrlFade _blood2) then { if (ctrlFade _blood1 > ctrlFade _blood2) then {
_blood1 ctrlSetFade _fade; _blood1 ctrlSetFade _fade;
_blood2 ctrlSetFade 1; _blood2 ctrlSetFade 1;
@ -66,16 +64,15 @@ if (_tickCounter == 2) then {
_blood2 ctrlSetFade _fade; _blood2 ctrlSetFade _fade;
}; };
_blood1 ctrlCommit 3; if (_instant) then {
_blood2 ctrlCommit 3; _blood1 ctrlCommit 0.3;
_blood2 ctrlCommit 0.3;
} else {
_blood1 ctrlCommit 3;
_blood2 ctrlCommit 3;
};
GVAR(switchBloodFadeInfo) = [0, _bloodloss]; GVAR(bloodTickCounter) = 0;
} else { } else {
GVAR(switchBloodFadeInfo) = [_tickCounter + 1, _bloodloss]; GVAR(bloodTickCounter) = GVAR(bloodTickCounter) + 1;
};
// Speed up fade on sudden changes
if (abs (_lastBloodloss - _bloodloss) > 0.001) then {
_blood1 ctrlCommit 1;
_blood2 ctrlCommit 1;
}; };

View File

@ -34,7 +34,6 @@ switch (true) do {
case (_heartRate < 60): { case (_heartRate < 60): {
playSound SND_HEARBEAT_SLOW; playSound SND_HEARBEAT_SLOW;
[FUNC(effectHeartBeat), [], _waitTime] call CBA_fnc_waitAndExecute; [FUNC(effectHeartBeat), [], _waitTime] call CBA_fnc_waitAndExecute;
}; };
default { default {
TRACE_1("Ending heart beat effect - normal",_heartRate); TRACE_1("Ending heart beat effect - normal",_heartRate);

View File

@ -20,25 +20,41 @@ params ["_enable", "_intensity"];
if (!_enable || {_intensity == 0}) exitWith { if (!_enable || {_intensity == 0}) exitWith {
GVAR(ppPain) ppEffectEnable false; GVAR(ppPain) ppEffectEnable false;
GVAR(ppPainBlur) ppEffectEnable false;
}; };
GVAR(ppPain) ppEffectEnable true; GVAR(ppPain) ppEffectEnable true;
GVAR(ppPainBlur) ppEffectEnable true;
// Trigger effect every 2s // Trigger effect every 2s
private _showNextTick = missionNamespace getVariable [QGVAR(showPainNextTick), true]; private _showNextTick = missionNamespace getVariable [QGVAR(showPainNextTick), true];
GVAR(showPainNextTick) = !_showNextTick; GVAR(showPainNextTick) = !_showNextTick;
if (_showNextTick) exitWith {}; if (_showNextTick) exitWith {};
private _blurIntensity = linearConversion [0.8, 1, _intensity, 0, 1, true];
GVAR(ppPainBlur) ppEffectAdjust [_blurIntensity];
GVAR(ppPainBlur) ppEffectCommit 0.1;
if (GVAR(painEffectType) == FX_PAIN_ONLY_BASE) exitWith {};
private _initialAdjust = []; private _initialAdjust = [];
private _delayedAdjust = []; private _delayedAdjust = [];
if (GVAR(painEffectType) == 0) then { switch (GVAR(painEffectType)) do {
_intensity = linearConversion [0, 1, _intensity, 0, 0.6, true]; case FX_PAIN_WHITE_FLASH: {
_initialAdjust = [1, 1, 0, [1, 1, 1, _intensity], [1, 1, 1, 1], [0.33, 0.33, 0.33, 0], [0.59, 0.64, 0, 0, 0, 0, 4]]; _intensity = linearConversion [0, 1, _intensity, 0, 0.6, true];
_delayedAdjust = [1, 1, 0, [1, 1, 1, 0], [1, 1, 1, 1], [0.33, 0.33, 0.33, 0], [0.59, 0.64, 0, 0, 0, 0, 4]]; _initialAdjust = [1, 1, 0, [1, 1, 1, _intensity ], [1, 1, 1, 1], [0.33, 0.33, 0.33, 0], [0.55, 0.5, 0, 0, 0, 0, 4]];
} else { _delayedAdjust = [1, 1, 0, [1, 1, 1, _intensity * 0.3], [1, 1, 1, 1], [0.33, 0.33, 0.33, 0], [0.55, 0.5, 0, 0, 0, 0, 4]];
_intensity = linearConversion [0, 1, _intensity, 0, 0.008, true]; };
_initialAdjust = [_intensity, _intensity, 0.3, 0.39]; case FX_PAIN_PULSATING_BLUR: {
_delayedAdjust = [ 0, 0, 0.3, 0.39]; _intensity = linearConversion [0, 1, _intensity, 0, 0.008, true];
_initialAdjust = [_intensity , _intensity , 0.15, 0.15];
_delayedAdjust = [_intensity * 0.2, _intensity * 0.2, 0.25, 0.25];
};
case FX_PAIN_CHROMATIC_ABERRATION: {
_intensity = linearConversion [0, 1, _intensity, 0, 0.06, true];
_initialAdjust = [_intensity , _intensity , true];
_delayedAdjust = [_intensity * 0.15, _intensity * 0.15, true];
};
}; };
GVAR(ppPain) ppEffectAdjust _initialAdjust; GVAR(ppPain) ppEffectAdjust _initialAdjust;

View File

@ -5,7 +5,7 @@
* Note: Heart beat sounds run in a different PFH - see fnc_effectHeartBeat. * Note: Heart beat sounds run in a different PFH - see fnc_effectHeartBeat.
* *
* Arguments: * Arguments:
* None * 0: Manual, instant update (optional, default false) <BOOL>
* *
* Return Value: * Return Value:
* None * None
@ -15,6 +15,7 @@
* *
* Public: No * Public: No
*/ */
params [["_manualUpdate", false]];
if (EGVAR(common,OldIsCamera) || {!alive ACE_player}) exitWith { if (EGVAR(common,OldIsCamera) || {!alive ACE_player}) exitWith {
[false, 0] call FUNC(effectUnconscious); [false, 0] call FUNC(effectUnconscious);
@ -44,10 +45,7 @@ if ((!GVAR(heartBeatEffectRunning)) && {_heartRate != 0} && {(_heartRate > 160)
true, linearConversion [BLOOD_VOLUME_CLASS_2_HEMORRHAGE, BLOOD_VOLUME_CLASS_4_HEMORRHAGE, _bloodVolume, 0, 1, true] true, linearConversion [BLOOD_VOLUME_CLASS_2_HEMORRHAGE, BLOOD_VOLUME_CLASS_4_HEMORRHAGE, _bloodVolume, 0, 1, true]
] call FUNC(effectBloodVolume); ] call FUNC(effectBloodVolume);
if (!_unconscious) then { [!_unconscious, _pain] call FUNC(effectPain);
[true, _pain] call FUNC(effectPain); [!_unconscious, _bleedingStrength, _manualUpdate] call FUNC(effectBleeding);
};
[true, _bleedingStrength] call FUNC(effectBleeding);
END_COUNTER(handleEffects); END_COUNTER(handleEffects);

View File

@ -35,27 +35,45 @@ if (!isNil QGVAR(ppPain)) then {
TRACE_1("delete pain",GVAR(ppPain)); TRACE_1("delete pain",GVAR(ppPain));
ppEffectDestroy GVAR(ppPain) ppEffectDestroy GVAR(ppPain)
}; };
if (GVAR(painEffectType) == 0) then { switch (GVAR(painEffectType)) do {
GVAR(ppPain) = [ case FX_PAIN_WHITE_FLASH: {
"ColorCorrections", GVAR(ppPain) = [
13502, "ColorCorrections",
[1, 1, 0, [1, 1, 1, 0], [1, 1, 1, 1], [0.33, 0.33, 0.33, 0], [0.59, 0.64, 0, 0, 0, 0, 4]] 13502,
] call _fnc_createEffect; [1, 1, 0, [1, 1, 1, 0], [1, 1, 1, 1], [0.33, 0.33, 0.33, 0], [0.55, 0.5, 0, 0, 0, 0, 4]]
} else { ] call _fnc_createEffect;
GVAR(ppPain) = [ };
"RadialBlur", // "Will not do anything if RADIAL BLUR is disabled in Video Options." case FX_PAIN_PULSATING_BLUR: {
13502, GVAR(ppPain) = [
[0, 0, 0.3, 0.39] "RadialBlur", // "Will not do anything if RADIAL BLUR is disabled in Video Options."
13502,
[0, 0, 0.25, 0.25]
] call _fnc_createEffect;
};
case FX_PAIN_CHROMATIC_ABERRATION: {
GVAR(ppPain) = [
"ChromAberration",
13502,
[0, 0, false]
] call _fnc_createEffect;
};
};
// Base blur on high pain
if (isNil QGVAR(ppPainBlur)) then {
GVAR(ppPainBlur) = [
"DynamicBlur",
813, // 135xx does not work
[0]
] call _fnc_createEffect; ] call _fnc_createEffect;
}; };
TRACE_1("created pain",GVAR(ppPain));
TRACE_1("created pain",GVAR(ppPain));
if (_justPain) exitWith {}; if (_justPain) exitWith {};
// - Unconscious -------------------------------------------------------------- // - Unconscious --------------------------------------------------------------
GVAR(ppUnconsciousBlur) = [ GVAR(ppUnconsciousBlur) = [
"DynamicBlur", "DynamicBlur",
813, // 135xx does not work 814, // 135xx does not work
[0] [0]
] call _fnc_createEffect; ] call _fnc_createEffect;
@ -82,6 +100,6 @@ GVAR(ppIncapacitationGlare) = [
GVAR(ppIncapacitationBlur) = [ GVAR(ppIncapacitationBlur) = [
"DynamicBlur", "DynamicBlur",
814, // 135xx does not work 815, // 135xx does not work
[0] [0]
] call _fnc_createEffect; ] call _fnc_createEffect;

View File

@ -26,60 +26,43 @@ params [["_unit", objNull, [objNull]], ["_type", "hit", [""]], ["_severity", 0,
if (!local _unit) exitWith { if (!local _unit) exitWith {
ERROR("Unit not local or null"); ERROR("Unit not local or null");
}; };
if !(_unit call EFUNC(common,isAwake)) exitWith {}; if !(_unit call EFUNC(common,isAwake)) exitWith {};
private _timeOut = [TIME_OUT_HIT, TIME_OUT_MOAN] select (_type == "moan");
// Handle timeout // Handle timeout
private _timeOut = [TIME_OUT_HIT, TIME_OUT_MOAN] select (_type == "moan");
if (_unit getVariable [QGVAR(soundTimeout) + _type, -1] > CBA_missionTime) exitWith {}; if (_unit getVariable [QGVAR(soundTimeout) + _type, -1] > CBA_missionTime) exitWith {};
_unit setVariable [QGVAR(soundTimeout) + _type, CBA_missionTime + _timeOut]; _unit setVariable [QGVAR(soundTimeout) + _type, CBA_missionTime + _timeOut];
// Get sounds
private _soundsNamespace = NAMESPACE_NULL;
switch (toLower _type) do {
case ("hit"): {
_soundsNamespace = GVAR(HitScreamNamespace);
};
case ("moan"): {
_soundsNamespace = GVAR(InjuredMoanNamespace);
};
};
// Get units speaker // Get units speaker
private _speaker = speaker _unit; private _speaker = speaker _unit;
if (_speaker == "ACE_NoVoice") then { if (_speaker == "ACE_NoVoice") then {
_speaker = _unit getVariable "ace_originalSpeaker"; _speaker = _unit getVariable "ace_originalSpeaker";
}; };
private _sounds = _soundsNamespace getVariable _speaker; // Fallback if speaker has no associated scream/moan sound
if (isNull (configFile >> "CfgSounds" >> format ["ACE_moan_%1_low_1", _speaker])) then {
if (isNil "_sounds") then { _speaker = "Male08ENG";
_sounds = _soundsNamespace getVariable (_soundsNamespace getVariable "#default");
}; };
if (isNil "_sounds") exitWith { // Select actual sound
ERROR("No sounds for speaker and no default found"); private _variation = ["low", "mid", "high"] select _severity;
private _distance = if (_type == "hit") then {
[50, 60, 70] select _severity;
} else {
[10, 15, 20] select _severity;
}; };
// Get correct sound of the speaker private _cfgSounds = configFile >> "CfgSounds";
_sounds = _sounds param [_severity, []]; private _targetClass = format ["ACE_%1_%2_%3_", _type, _speaker, _variation];
(selectRandom _sounds) params ["_sound", ["_volume", 1], ["_frequency", 1], ["_distance", 80]]; private _index = 1;
private _sounds = [];
if (isNil "_sound") exitWith { while {isClass (_cfgSounds >> (_targetClass + str _index))} do {
ERROR("No sound for this speaker"); _sounds pushBack (_cfgSounds >> (_targetClass + str _index));
_index = _index + 1;
}; };
private _sound = configName selectRandom _sounds;
if (isNil "_sound") exitWith { WARNING_1("no sounds for target [%1]",_targetClass); };
// Delete leading slash. // Limit network traffic by only sending the event to players who can potentially hear it
if (_sound select [0, 1] == "\") then { private _targets = _unit nearEntities ["CAManBase", _distance];
_sound = _sound select [1]; [QGVAR(forceSay3D), [_unit, _sound, _distance], _targets] call CBA_fnc_targetEvent;
};
// Default file extension.
if (_sound find "." == -1) then {
_sound = _sound + ".wss";
};
playSound3D [_sound, objNull, false, position _unit, _volume, _frequency, _distance];

View File

@ -3,7 +3,11 @@
"LIST", "LIST",
[LSTRING(PainEffectType_DisplayName), LSTRING(PainEffectType_Description)], [LSTRING(PainEffectType_DisplayName), LSTRING(PainEffectType_Description)],
[ELSTRING(medical,Category), LSTRING(SubCategory)], [ELSTRING(medical,Category), LSTRING(SubCategory)],
[[0, 1], [LSTRING(PainEffectType_WhiteFlashing), LSTRING(PainEffectType_PulsingBlur)], 0], [
[FX_PAIN_WHITE_FLASH, FX_PAIN_PULSATING_BLUR, FX_PAIN_CHROMATIC_ABERRATION, FX_PAIN_ONLY_BASE],
[LSTRING(painEffectType_whiteFlashing), LSTRING(painEffectType_pulsingBlur), LSTRING(painEffectType_chromAberration), LSTRING(painEffectType_onlyBase)],
0
],
false, false,
{ {
if (isNil QGVAR(ppPain)) exitWith { if (isNil QGVAR(ppPain)) exitWith {

View File

@ -37,3 +37,8 @@
#define SND_FRACTURE (selectRandom ["ACE_fracture_1", "ACE_fracture_2", "ACE_fracture_3", "ACE_fracture_4"]) #define SND_FRACTURE (selectRandom ["ACE_fracture_1", "ACE_fracture_2", "ACE_fracture_3", "ACE_fracture_4"])
#define VOL_UNCONSCIOUS 0.25 #define VOL_UNCONSCIOUS 0.25
#define FX_PAIN_WHITE_FLASH 0
#define FX_PAIN_PULSATING_BLUR 1
#define FX_PAIN_CHROMATIC_ABERRATION 2
#define FX_PAIN_ONLY_BASE 3

View File

@ -46,6 +46,25 @@
<French>Pulsations floues</French> <French>Pulsations floues</French>
<Portuguese>Borrão Pulsante</Portuguese> <Portuguese>Borrão Pulsante</Portuguese>
</Key> </Key>
<Key ID="STR_ACE_Medical_Feedback_PainEffectType_ChromAberration">
<English>Chromatic Aberration</English>
<German>Chromatische Aberration</German>
<Polish>Aberracja chromatyczna</Polish>
<Russian>Хроматическая аберрация</Russian>
<Italian>Aberrazione cromatica</Italian>
<Spanish>Aberración cromática</Spanish>
<French>Aberration chromatique</French>
<Hungarian>Kromatikus aberráció</Hungarian>
<Czech>Chromatická aberace</Czech>
<Portuguese>Aberração cromática</Portuguese>
<Japanese>色の収差</Japanese>
<Korean>색수차</Korean>
<Chinesesimp>色差</Chinesesimp>
<Chinese>色差</Chinese>
</Key>
<Key ID="STR_ACE_Medical_Feedback_PainEffectType_OnlyBase">
<English>Only high pain effect</English>
</Key>
<Container name="Settings"> <Container name="Settings">
<Key ID="STR_ACE_Medical_feedback_enableScreams_DisplayName"> <Key ID="STR_ACE_Medical_feedback_enableScreams_DisplayName">
<English>Enable Screams</English> <English>Enable Screams</English>

View File

@ -43,7 +43,7 @@ class ACE_Medical_StateMachine {
}; };
class Unconscious { class Unconscious {
onState = QFUNC(handleStateUnconscious); onState = QFUNC(handleStateUnconscious);
onStateEntered = QUOTE([ARR_2(_this,true)] call EFUNC(medical_status,setUnconscious)); onStateEntered = QUOTE([ARR_2(_this,true)] call EFUNC(medical_status,setUnconsciousState));
class DeathAI { class DeathAI {
targetState = "Dead"; targetState = "Dead";
condition = QUOTE(!GVAR(AIUnconsciousness) && {!isPlayer _this}); condition = QUOTE(!GVAR(AIUnconsciousness) && {!isPlayer _this});
@ -52,7 +52,7 @@ class ACE_Medical_StateMachine {
targetState = "Injured"; targetState = "Injured";
condition = QEFUNC(medical_status,hasStableVitals); condition = QEFUNC(medical_status,hasStableVitals);
events[] = {QEGVAR(medical,WakeUp)}; events[] = {QEGVAR(medical,WakeUp)};
onTransition = QUOTE([ARR_2(_this,false)] call EFUNC(medical_status,setUnconscious)); onTransition = QUOTE([ARR_2(_this,false)] call EFUNC(medical_status,setUnconsciousState));
}; };
class FatalTransitions { class FatalTransitions {
targetState = "CardiacArrest"; targetState = "CardiacArrest";

View File

@ -28,4 +28,4 @@ _unit setVariable [QGVAR(cardiacArrestTimeLastUpdate), CBA_missionTime];
TRACE_3("enteredStateCardiacArrest",_unit,_time,CBA_missionTime); TRACE_3("enteredStateCardiacArrest",_unit,_time,CBA_missionTime);
// Update the unit status to reflect cardiac arrest // Update the unit status to reflect cardiac arrest
[_unit, true] call EFUNC(medical_status,setCardiacArrest); [_unit, true] call EFUNC(medical_status,setCardiacArrestState);

View File

@ -22,4 +22,4 @@ TRACE_1("leftStateCardiacArrest",_unit);
_unit setVariable [QGVAR(cardiacArrestTimeLeft), nil]; _unit setVariable [QGVAR(cardiacArrestTimeLeft), nil];
_unit setVariable [QGVAR(cardiacArrestTimeLastUpdate), nil]; _unit setVariable [QGVAR(cardiacArrestTimeLastUpdate), nil];
[_unit, false] call EFUNC(medical_status,setCardiacArrest); [_unit, false] call EFUNC(medical_status,setCardiacArrestState);

View File

@ -29,14 +29,14 @@ if (_isLocal) then {
switch (true) do { switch (true) do {
case (IN_CRDC_ARRST(_unit)): { case (IN_CRDC_ARRST(_unit)): {
if (_currentState == "CardiacArrest") exitWith {}; if (_currentState == "CardiacArrest") exitWith {};
_unit setVariable [VAR_CRDC_ARRST, false]; // force reset vars so setCardiacArrest can run (enteredStateCardiacArrest will also be called) _unit setVariable [VAR_CRDC_ARRST, false]; // force reset vars so setCardiacArrestState can run (enteredStateCardiacArrest will also be called)
_unit setVariable [VAR_UNCON, false]; _unit setVariable [VAR_UNCON, false];
TRACE_1("manually changing state to CardiacArrest",_currentState); TRACE_1("manually changing state to CardiacArrest",_currentState);
[_unit, EGVAR(medical,STATE_MACHINE), _currentState, "CardiacArrest", {}, "LocalityChange"] call CBA_statemachine_fnc_manualTransition; [_unit, EGVAR(medical,STATE_MACHINE), _currentState, "CardiacArrest", {}, "LocalityChange"] call CBA_statemachine_fnc_manualTransition;
}; };
case (IS_UNCONSCIOUS(_unit)): { case (IS_UNCONSCIOUS(_unit)): {
if (_currentState == "Unconscious") exitWith {}; if (_currentState == "Unconscious") exitWith {};
_unit setVariable [VAR_UNCON, false]; // force reset var so ace_medical_status_fnc_setUnconscious can run _unit setVariable [VAR_UNCON, false]; // force reset var so ace_medical_status_fnc_setUnconsciousState can run
TRACE_1("manually changing state to Unconscious",_currentState); TRACE_1("manually changing state to Unconscious",_currentState);
[_unit, EGVAR(medical,STATE_MACHINE), _currentState, "Unconscious", {}, "LocalityChange"] call CBA_statemachine_fnc_manualTransition; [_unit, EGVAR(medical,STATE_MACHINE), _currentState, "Unconscious", {}, "LocalityChange"] call CBA_statemachine_fnc_manualTransition;
}; };

View File

@ -11,7 +11,7 @@ PREP(initUnit);
PREP(isBeingCarried); PREP(isBeingCarried);
PREP(isBeingDragged); PREP(isBeingDragged);
PREP(isInStableCondition); PREP(isInStableCondition);
PREP(setCardiacArrest); PREP(setCardiacArrestState);
PREP(setDead); PREP(setDead);
PREP(setUnconscious); PREP(setUnconsciousState);
PREP(updateWoundBloodLoss); PREP(updateWoundBloodLoss);

View File

@ -13,13 +13,13 @@
* None * None
* *
* Example: * Example:
* [player, true] call ace_medical_status_fnc_setCardiacArrest * [player, true] call ace_medical_status_fnc_setCardiacArrestState
* *
* Public: No * Public: No
*/ */
params ["_unit", "_active"]; params ["_unit", "_active"];
TRACE_2("setCardiacArrest",_unit,_active); TRACE_2("setCardiacArrestState",_unit,_active);
// No change to make // No change to make
if (_active isEqualTo IN_CRDC_ARRST(_unit)) exitWith { TRACE_2("no change",_active,IN_CRDC_ARRST(_unit)); }; if (_active isEqualTo IN_CRDC_ARRST(_unit)) exitWith { TRACE_2("no change",_active,IN_CRDC_ARRST(_unit)); };
@ -29,6 +29,6 @@ _unit setVariable [VAR_CRDC_ARRST, _active, true];
_unit setVariable [VAR_HEART_RATE, [40, 0] select _active, true]; _unit setVariable [VAR_HEART_RATE, [40, 0] select _active, true];
// Cardiac arrest is an extension of unconsciousness // Cardiac arrest is an extension of unconsciousness
[_unit, _active] call FUNC(setUnconscious); [_unit, _active] call FUNC(setUnconsciousState);
["ace_cardiacArrest", [_unit, _active]] call CBA_fnc_localEvent; ["ace_cardiacArrest", [_unit, _active]] call CBA_fnc_localEvent;

View File

@ -12,13 +12,13 @@
* Success <BOOL> * Success <BOOL>
* *
* Example: * Example:
* [player, true] call ace_medical_status_fnc_setUnconscious * [player, true] call ace_medical_status_fnc_setUnconsciousState
* *
* Public: No * Public: No
*/ */
params ["_unit", "_active"]; params ["_unit", "_active"];
TRACE_2("setUnconscious",_unit,_active); TRACE_2("setUnconsciousState",_unit,_active);
// No change to make // No change to make
if (_active isEqualTo IS_UNCONSCIOUS(_unit)) exitWith { TRACE_2("no change",_active,IS_UNCONSCIOUS(_unit)); }; if (_active isEqualTo IS_UNCONSCIOUS(_unit)) exitWith { TRACE_2("no change",_active,IS_UNCONSCIOUS(_unit)); };

View File

@ -605,16 +605,6 @@ class ADDON {
maxDose = 6; maxDose = 6;
incompatibleMedication[] = {}; incompatibleMedication[] = {};
}; };
class Atropine {
painReduce = 0;
hrIncreaseLow[] = {-2, -5};
hrIncreaseNormal[] = {-10, -15};
hrIncreaseHigh[] = {-5, -20};
timeInSystem = 120;
timeTillMaxEffect = 15;
maxDose = 6;
incompatibleMedication[] = {};
};
class PainKillers { class PainKillers {
painReduce = 0.1; painReduce = 0.1;
timeInSystem = 600; timeInSystem = 600;

View File

@ -130,13 +130,6 @@ class GVAR(actions) {
items[] = {"ACE_adenosine"}; items[] = {"ACE_adenosine"};
litter[] = {{"ACE_MedicalLitter_adenosine"}}; litter[] = {{"ACE_MedicalLitter_adenosine"}};
}; };
class Atropine: Morphine {
displayName = CSTRING(Inject_Atropine);
displayNameProgress = CSTRING(Injecting_Atropine);
condition = QGVAR(advancedMedication);
items[] = {"ACE_atropine"};
litter[] = {{"ACE_MedicalLitter_atropine"}};
};
class Epinephrine: Morphine { class Epinephrine: Morphine {
displayName = CSTRING(Inject_Epinephrine); displayName = CSTRING(Inject_Epinephrine);
displayNameProgress = CSTRING(Injecting_Epinephrine); displayNameProgress = CSTRING(Injecting_Epinephrine);

View File

@ -1,11 +1,14 @@
// This config accepts both item type numbers and item class names
// Item type numbers need the prefix ItemType_, so for example ItemType_401
// Class names need no special prefix
class EGVAR(medical,replacementItems) { class EGVAR(medical,replacementItems) {
FirstAidKit[] = { DOUBLES(ItemType,TYPE_FIRST_AID_KIT)[] = {
{"ACE_fieldDressing", 1}, {"ACE_fieldDressing", 1},
{"ACE_packingBandage", 1}, {"ACE_packingBandage", 1},
{"ACE_morphine", 1}, {"ACE_morphine", 1},
{"ACE_tourniquet", 1} {"ACE_tourniquet", 1}
}; };
Medikit[] = { DOUBLES(ItemType,TYPE_MEDIKIT)[] = {
{"ACE_fieldDressing", 1}, {"ACE_fieldDressing", 1},
{"ACE_packingBandage", 2}, {"ACE_packingBandage", 2},
{"ACE_epinephrine", 1}, {"ACE_epinephrine", 1},
@ -14,5 +17,7 @@ class EGVAR(medical,replacementItems) {
{"ACE_tourniquet", 1}, {"ACE_tourniquet", 1},
{"ACE_splint", 2} {"ACE_splint", 2}
}; };
// todo: add GM medical items ACE_atropine[] = {
{"ACE_adenosine", 1}
};
}; };

View File

@ -151,8 +151,8 @@ class CfgVehicles {
}; };
}; };
class ACE_atropineItem: Item_Base_F { class ACE_atropineItem: Item_Base_F {
scope = 2; scope = 1;
scopeCurator = 2; scopeCurator = 1;
displayName = CSTRING(Atropine_Display); displayName = CSTRING(Atropine_Display);
author = ECSTRING(common,ACETeam); author = ECSTRING(common,ACETeam);
vehicleClass = "Items"; vehicleClass = "Items";
@ -308,7 +308,6 @@ class CfgVehicles {
MACRO_ADDITEM(ACE_splint,15); MACRO_ADDITEM(ACE_splint,15);
MACRO_ADDITEM(ACE_morphine,15); MACRO_ADDITEM(ACE_morphine,15);
MACRO_ADDITEM(ACE_adenosine,15); MACRO_ADDITEM(ACE_adenosine,15);
MACRO_ADDITEM(ACE_atropine,15);
MACRO_ADDITEM(ACE_epinephrine,15); MACRO_ADDITEM(ACE_epinephrine,15);
MACRO_ADDITEM(ACE_plasmaIV,7); MACRO_ADDITEM(ACE_plasmaIV,7);
MACRO_ADDITEM(ACE_plasmaIV_500,7); MACRO_ADDITEM(ACE_plasmaIV_500,7);

View File

@ -28,7 +28,7 @@ class CfgWeapons {
descriptionShort = CSTRING(Bandage_Basic_Desc_Short); descriptionShort = CSTRING(Bandage_Basic_Desc_Short);
descriptionUse = CSTRING(Bandage_Basic_Desc_Use); descriptionUse = CSTRING(Bandage_Basic_Desc_Use);
class ItemInfo: CBA_MiscItem_ItemInfo { class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 2; mass = 1;
}; };
}; };
class ACE_packingBandage: ACE_ItemCore { class ACE_packingBandage: ACE_ItemCore {
@ -40,7 +40,7 @@ class CfgWeapons {
descriptionShort = CSTRING(Packing_Bandage_Desc_Short); descriptionShort = CSTRING(Packing_Bandage_Desc_Short);
descriptionUse = CSTRING(Packing_Bandage_Desc_Use); descriptionUse = CSTRING(Packing_Bandage_Desc_Use);
class ItemInfo: CBA_MiscItem_ItemInfo { class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 2; mass = 1;
}; };
}; };
class ACE_elasticBandage: ACE_ItemCore { class ACE_elasticBandage: ACE_ItemCore {
@ -52,7 +52,7 @@ class CfgWeapons {
descriptionShort = CSTRING(Bandage_Elastic_Desc_Short); descriptionShort = CSTRING(Bandage_Elastic_Desc_Short);
descriptionUse = CSTRING(Bandage_Elastic_Desc_Use); descriptionUse = CSTRING(Bandage_Elastic_Desc_Use);
class ItemInfo: CBA_MiscItem_ItemInfo { class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 2; mass = 1;
}; };
}; };
class ACE_tourniquet: ACE_ItemCore { class ACE_tourniquet: ACE_ItemCore {
@ -64,7 +64,7 @@ class CfgWeapons {
descriptionShort = CSTRING(Tourniquet_Desc_Short); descriptionShort = CSTRING(Tourniquet_Desc_Short);
descriptionUse = CSTRING(Tourniquet_Desc_Use); descriptionUse = CSTRING(Tourniquet_Desc_Use);
class ItemInfo: CBA_MiscItem_ItemInfo { class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 2; mass = 1;
}; };
}; };
class ACE_splint: ACE_ItemCore { class ACE_splint: ACE_ItemCore {
@ -87,7 +87,7 @@ class CfgWeapons {
descriptionShort = CSTRING(Morphine_Desc_Short); descriptionShort = CSTRING(Morphine_Desc_Short);
descriptionUse = CSTRING(Morphine_Desc_Use); descriptionUse = CSTRING(Morphine_Desc_Use);
class ItemInfo: CBA_MiscItem_ItemInfo { class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 2; mass = 1;
}; };
}; };
class ACE_adenosine: ACE_ItemCore { class ACE_adenosine: ACE_ItemCore {
@ -99,11 +99,11 @@ class CfgWeapons {
descriptionShort = CSTRING(adenosine_Desc_Short); descriptionShort = CSTRING(adenosine_Desc_Short);
descriptionUse = CSTRING(adenosine_Desc_Use); descriptionUse = CSTRING(adenosine_Desc_Use);
class ItemInfo: CBA_MiscItem_ItemInfo { class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 2; mass = 1;
}; };
}; };
class ACE_atropine: ACE_ItemCore { class ACE_atropine: ACE_ItemCore {
scope = 2; scope = 1;
author = ECSTRING(common,ACETeam); author = ECSTRING(common,ACETeam);
displayName = CSTRING(Atropine_Display); displayName = CSTRING(Atropine_Display);
picture = QPATHTOF(ui\atropine_ca.paa); picture = QPATHTOF(ui\atropine_ca.paa);
@ -111,7 +111,7 @@ class CfgWeapons {
descriptionShort = CSTRING(Atropine_Desc_Short); descriptionShort = CSTRING(Atropine_Desc_Short);
descriptionUse = CSTRING(Atropine_Desc_Use); descriptionUse = CSTRING(Atropine_Desc_Use);
class ItemInfo: CBA_MiscItem_ItemInfo { class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 2; mass = 1;
}; };
}; };
class ACE_epinephrine: ACE_ItemCore { class ACE_epinephrine: ACE_ItemCore {
@ -123,7 +123,7 @@ class CfgWeapons {
descriptionShort = CSTRING(Epinephrine_Desc_Short); descriptionShort = CSTRING(Epinephrine_Desc_Short);
descriptionUse = CSTRING(Epinephrine_Desc_Use); descriptionUse = CSTRING(Epinephrine_Desc_Use);
class ItemInfo: CBA_MiscItem_ItemInfo { class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 2; mass = 1;
}; };
}; };
@ -226,7 +226,7 @@ class CfgWeapons {
descriptionShort = CSTRING(QuikClot_Desc_Short); descriptionShort = CSTRING(QuikClot_Desc_Short);
descriptionUse = CSTRING(QuikClot_Desc_Use); descriptionUse = CSTRING(QuikClot_Desc_Use);
class ItemInfo: CBA_MiscItem_ItemInfo { class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 2; mass = 1;
}; };
}; };
class ACE_personalAidKit: ACE_ItemCore { class ACE_personalAidKit: ACE_ItemCore {

View File

@ -10,9 +10,9 @@ PREP(canSplint);
PREP(canStitch); PREP(canStitch);
PREP(canTreat); PREP(canTreat);
PREP(canTreatCached); PREP(canTreatCached);
PREP(canTreat_holsterCheck);
PREP(checkBloodPressure); PREP(checkBloodPressure);
PREP(checkBloodPressureLocal); PREP(checkBloodPressureLocal);
PREP(checkItems);
PREP(checkPulse); PREP(checkPulse);
PREP(checkPulseLocal); PREP(checkPulseLocal);
PREP(checkResponse); PREP(checkResponse);

View File

@ -9,12 +9,8 @@
} forEach (_unit getVariable [QEGVAR(medical,allLogs), []]); } forEach (_unit getVariable [QEGVAR(medical,allLogs), []]);
_unit setVariable [QEGVAR(medical,allLogs), [], true]; _unit setVariable [QEGVAR(medical,allLogs), [], true];
[_unit] call FUNC(checkItems);
}] call CBA_fnc_addEventHandler; }] call CBA_fnc_addEventHandler;
["loadout", LINKFUNC(checkItems)] call CBA_fnc_addPlayerEventHandler;
// Handle body removal and litter on server // Handle body removal and litter on server
if (isServer) then { if (isServer) then {
[QGVAR(createLitterServer), LINKFUNC(createLitterServer)] call CBA_fnc_addEventHandler; [QGVAR(createLitterServer), LINKFUNC(createLitterServer)] call CBA_fnc_addEventHandler;
@ -36,3 +32,32 @@ if (isServer) then {
// Logging events // Logging events
[QGVAR(addToLog), LINKFUNC(addToLog)] call CBA_fnc_addEventHandler; [QGVAR(addToLog), LINKFUNC(addToLog)] call CBA_fnc_addEventHandler;
[QGVAR(addToTriageCard), LINKFUNC(addToTriageCard)] call CBA_fnc_addEventHandler; [QGVAR(addToTriageCard), LINKFUNC(addToTriageCard)] call CBA_fnc_addEventHandler;
// replace medical items with their ACE equivalents
["ace_settingsInitialized", {
TRACE_1("ace_settingsInitialized EH",GVAR(convertItems)); // 0: Enabled 1: RemoveOnly 2:Disabled
if (GVAR(convertItems) == 2) exitWith {};
{
// turn [["stuff", 2], ...] into ["stuff", "stuff", ...]
private _replacements = [];
if (GVAR(convertItems) == 0) then {
{
_x params ["_item", "_count"];
for "_i" from 1 to _count do {
_replacements pushBack _item;
};
} forEach getArray _x;
};
// check if replacement is for item type or class name
private _configName = configName _x;
private _toReplace = if ((_configName select [0,9]) == "ItemType_") then {
parseNumber (_configName select [9])
} else {
_configName
};
// register replacement
[_toReplace, _replacements] call EFUNC(common,registerItemReplacement);
} forEach (configProperties [configFile >> QEGVAR(medical,replacementItems), "isArray _x"]);
}] call CBA_fnc_addEventHandler;

View File

@ -44,9 +44,4 @@ GVAR(facilityClasses) = [];
} forEach getArray _x; } forEach getArray _x;
} forEach configProperties [configFile >> QEGVAR(medical,facilities), "isArray _x"]; } forEach configProperties [configFile >> QEGVAR(medical,facilities), "isArray _x"];
// array of medical items to replace and their ACE equivalents
GVAR(replacementItems) = configProperties [configFile >> QEGVAR(medical,replacementItems), "isArray _x"] apply {
[configName _x, getArray _x]
};
ADDON = true; ADDON = true;

View File

@ -18,6 +18,7 @@
*/ */
params ["_patient", "_bodyPart", "_bandage"]; params ["_patient", "_bodyPart", "_bandage"];
TRACE_3("bandageLocal",_patient,_bodyPart,_bandage);
private _partIndex = ALL_BODY_PARTS find toLower _bodyPart; private _partIndex = ALL_BODY_PARTS find toLower _bodyPart;
if (_partIndex < 0) exitWith {false}; if (_partIndex < 0) exitWith {false};
@ -54,4 +55,26 @@ if ((EGVAR(medical,limping) == 1) && {_partIndex > 3} && {_amountOf <= 0} && {_p
[_patient] call EFUNC(medical_engine,updateDamageEffects); [_patient] call EFUNC(medical_engine,updateDamageEffects);
}; };
if (GVAR(clearTraumaAfterBandage)) then {
TRACE_2("clearTraumaAfterBandage - checking open wounds",_partIndex,_openWounds);
if ((_openWounds findIf {
_x params ["", "_xBodyPartN", "_xAmountOf"];
(_partIndex ==_xBodyPartN) && {_xAmountOf > 0}
}) == -1) then {
private _bodyPartDamage = _patient getVariable [QEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0]];
_bodyPartDamage set [_partIndex, 0];
_patient setVariable [QEGVAR(medical,bodyPartDamage), _bodyPartDamage, true];
TRACE_2("fully healed",_partIndex,_bodyPartDamage);
switch (_partIndex) do {
case 0: { [_patient, true, false, false, false] call EFUNC(medical_engine,updateBodyPartVisuals); };
case 1: { [_patient, false, true, false, false] call EFUNC(medical_engine,updateBodyPartVisuals); };
case 2;
case 3: { [_patient, false, false, true, false] call EFUNC(medical_engine,updateBodyPartVisuals); };
default { [_patient, false, false, false, true] call EFUNC(medical_engine,updateBodyPartVisuals); };
};
};
};
true true

View File

@ -26,6 +26,7 @@ isClass _config
&& {_patient isKindOf "CAManBase"} && {_patient isKindOf "CAManBase"}
&& {_medic != _patient || {GET_NUMBER_ENTRY(_config >> "allowSelfTreatment") == 1}} && {_medic != _patient || {GET_NUMBER_ENTRY(_config >> "allowSelfTreatment") == 1}}
&& {[_medic, GET_NUMBER_ENTRY(_config >> "medicRequired")] call FUNC(isMedic)} && {[_medic, GET_NUMBER_ENTRY(_config >> "medicRequired")] call FUNC(isMedic)}
&& {[_medic, _patient, _config] call FUNC(canTreat_holsterCheck)}
&& { && {
private _selections = getArray (_config >> "allowedSelections") apply {toLower _x}; private _selections = getArray (_config >> "allowedSelections") apply {toLower _x};
"all" in _selections || {_bodyPart in _selections} "all" in _selections || {_bodyPart in _selections}

View File

@ -0,0 +1,27 @@
#include "script_component.hpp"
/*
* Author: ddm999
* Handle holster settings [disabled, lowered, loweredExam, holster, holsterExam]
*
* Arguments:
* 0: Medic <OBJECT>
* 1: Patient <OBJECT>
* 2: Treatment Config <CONFIG>
*
* Return Value:
* Can Treat <BOOL>
*
* Example:
* [player, cursorObject, cfg] call ace_medical_treatment_fnc_canTreat_holsterCheck
*
* Public: No
*/
params ["_medic", "_patient", "_config"];
GVAR(holsterRequired) == 0
|| {vehicle _medic != _medic} // medic is in a vehicle, so weapon is considered holstered
|| {vehicle _patient != _patient} // patient is in a vehicle, ^
|| {(GVAR(holsterRequired) in [2,4]) && {getText (_config >> "category") == "examine"}} // if examine bypass is on
|| {currentWeapon _medic isEqualTo ""} // weapon is holstered
|| {(GVAR(holsterRequired) <= 2) && {weaponLowered _medic}} // if just lowered is allowed

View File

@ -1,47 +0,0 @@
#include "script_component.hpp"
/*
* Author: KoffeinFlummi, commy2, mharis001
* Handles converting vanilla medical items with ACE equivalents.
*
* Arguments:
* 0: Unit <OBJECT>
*
* Return Value:
* None
*
* Example:
* [player] call ace_medical_treatment_fnc_checkItems
*
* Public: No
*/
if (GVAR(convertItems) == 2) exitWith {};
params ["_unit"];
private _fnc_loop = if (GVAR(convertItems) == 0) then {
{
_x params ["_itemToRemove", "_replacementItems"];
private _count = [_unit, _itemToRemove] call EFUNC(common,getCountOfItem);
if (_count > 0) then {
_unit removeItems _itemToRemove;
{
_x params ["_item", "_amount"];
for "_i" from 1 to (_amount * _count) do {
_unit addItem _item;
};
} forEach _replacementItems;
};
}
} else {
{
_x params ["_itemToRemove"];
_unit removeItems _itemToRemove;
}
};
_fnc_loop forEach GVAR(replacementItems);

View File

@ -29,6 +29,15 @@
true true
] call CBA_settings_fnc_init; ] call CBA_settings_fnc_init;
[
QGVAR(clearTraumaAfterBandage),
"CHECKBOX",
[LSTRING(clearTraumaAfterBandage_DisplayName), LSTRING(clearTraumaAfterBandage_Description)],
[ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)],
false,
true
] call CBA_settings_fnc_init;
[ [
QGVAR(advancedMedication), QGVAR(advancedMedication),
"CHECKBOX", "CHECKBOX",
@ -200,3 +209,14 @@
[-1, 3600, 600, 0], [-1, 3600, 600, 0],
true true
] call CBA_settings_fnc_init; ] call CBA_settings_fnc_init;
[
QGVAR(holsterRequired),
"LIST",
[LSTRING(HolsterRequired_DisplayName), LSTRING(HolsterRequired_Description)],
[ELSTRING(medical,Category), LSTRING(SubCategory_Treatment)],
[[0, 1, 2, 3, 4], [ELSTRING(common,Disabled), LSTRING(HolsterRequired_Lowered), LSTRING(HolsterRequired_LoweredExam), LSTRING(HolsterRequired_Holstered), LSTRING(HolsterRequired_HolsteredExam)], 0],
true
] call CBA_settings_fnc_init;

View File

@ -426,6 +426,24 @@
<Russian>Техника и госпитали</Russian> <Russian>Техника и госпитали</Russian>
<Portuguese>Veículos e Instalações Médicas</Portuguese> <Portuguese>Veículos e Instalações Médicas</Portuguese>
</Key> </Key>
<Key ID="STR_ACE_Medical_Treatment_HolsterRequired_DisplayName">
<English>Holster Required</English>
</Key>
<Key ID="STR_ACE_Medical_Treatment_HolsterRequired_Description">
<English>Controls whether weapons must be holstered / lowered in order to perform medical actions.\nExcept Exam - Allows examination actions (checking pulse, blood pressure, response) at all times regardless of Holster Required setting.</English>
</Key>
<Key ID="STR_ACE_Medical_Treatment_HolsterRequired_Lowered">
<English>Lowered or Holstered</English>
</Key>
<Key ID="STR_ACE_Medical_Treatment_HolsterRequired_LoweredExam">
<English>Lowered or Holstered (Except Exam)</English>
</Key>
<Key ID="STR_ACE_Medical_Treatment_HolsterRequired_Holstered">
<English>Holstered only</English>
</Key>
<Key ID="STR_ACE_Medical_Treatment_HolsterRequired_HolsteredExam">
<English>Holstered only (Except Exam)</English>
</Key>
<Key ID="STR_ACE_Medical_Treatment_medicalSupplyCrate"> <Key ID="STR_ACE_Medical_Treatment_medicalSupplyCrate">
<English>[ACE] Medical Supply Crate (Basic)</English> <English>[ACE] Medical Supply Crate (Basic)</English>
<Russian>[ACE] Ящик с медикаментами (базовая медицина)</Russian> <Russian>[ACE] Ящик с медикаментами (базовая медицина)</Russian>
@ -3669,5 +3687,23 @@
<Chinesesimp>个人急救包使用条件</Chinesesimp> <Chinesesimp>个人急救包使用条件</Chinesesimp>
<Chinese>個人急救包使用條件</Chinese> <Chinese>個人急救包使用條件</Chinese>
</Key> </Key>
<Key ID="STR_ACE_Medical_Treatment_clearTraumaAfterBandage_DisplayName">
<English>Clear Trauma After Bandage</English>
</Key>
<Key ID="STR_ACE_Medical_Treatment_clearTraumaAfterBandage_Description">
<English>Heal fully bandaged hitpoints</English>
<Polish>Lecz w pełni zabandażowane hitpointy</Polish>
<Spanish>Curar miembros totalmente vendados</Spanish>
<Russian>Исцелять полностью перебинтованные части тела</Russian>
<Portuguese>Curar pontos de vida totalmente enfaixados</Portuguese>
<Czech>Heal fully bandaged hitpoints</Czech>
<Italian>Cura hitpoints completamente bendati</Italian>
<French>Soigner les plaies entièrement bandées</French>
<German>Heilt vollständig bandagierte Trefferpunkte</German>
<Japanese>包帯は体力を完全に回復する</Japanese>
<Korean>붕대를 감은후 체력을 회복함</Korean>
<Chinesesimp>完全医疗包扎的部位至痊愈</Chinesesimp>
<Chinese>完全醫療包紮的部位至痊癒</Chinese>
</Key>
</Package> </Package>
</Project> </Project>

View File

@ -0,0 +1,79 @@
class CfgFactionClasses {
class OPF_F {
GVAR(rankIcons)[] = {
QPATHTOF(UI\icons_russia\private_gs.paa),
QPATHTOF(UI\icons_russia\corporal_gs.paa),
QPATHTOF(UI\icons_russia\sergeant_gs.paa),
QPATHTOF(UI\icons_russia\lieutenant_gs.paa),
QPATHTOF(UI\icons_russia\captain_gs.paa),
QPATHTOF(UI\icons_russia\major_gs.paa),
QPATHTOF(UI\icons_russia\colonel_gs.paa)
};
};
class OPF_G_F {
GVAR(rankIcons)[] = {
QPATHTOF(UI\icons_spain\private_gs.paa),
QPATHTOF(UI\icons_spain\corporal_gs.paa),
QPATHTOF(UI\icons_spain\sergeant_gs.paa),
QPATHTOF(UI\icons_spain\lieutenant_gs.paa),
QPATHTOF(UI\icons_spain\captain_gs.paa),
QPATHTOF(UI\icons_spain\major_gs.paa),
QPATHTOF(UI\icons_spain\colonel_gs.paa)
};
};
class OPF_T_F {
GVAR(rankIcons)[] = {
QPATHTOF(UI\icons_russia\private_gs.paa),
QPATHTOF(UI\icons_russia\corporal_gs.paa),
QPATHTOF(UI\icons_russia\sergeant_gs.paa),
QPATHTOF(UI\icons_russia\lieutenant_gs.paa),
QPATHTOF(UI\icons_russia\captain_gs.paa),
QPATHTOF(UI\icons_russia\major_gs.paa),
QPATHTOF(UI\icons_russia\colonel_gs.paa)
};
};
class OPF_V_F {
GVAR(rankIcons)[] = {
QPATHTOF(UI\icons_russia\private_gs.paa),
QPATHTOF(UI\icons_russia\corporal_gs.paa),
QPATHTOF(UI\icons_russia\sergeant_gs.paa),
QPATHTOF(UI\icons_russia\lieutenant_gs.paa),
QPATHTOF(UI\icons_russia\captain_gs.paa),
QPATHTOF(UI\icons_russia\major_gs.paa),
QPATHTOF(UI\icons_russia\colonel_gs.paa)
};
};
class IND_C_F {
GVAR(rankIcons)[] = {
QPATHTOF(UI\icons_russia\private_gs.paa),
QPATHTOF(UI\icons_russia\corporal_gs.paa),
QPATHTOF(UI\icons_russia\sergeant_gs.paa),
QPATHTOF(UI\icons_russia\lieutenant_gs.paa),
QPATHTOF(UI\icons_russia\captain_gs.paa),
QPATHTOF(UI\icons_russia\major_gs.paa),
QPATHTOF(UI\icons_russia\colonel_gs.paa)
};
};
class IND_F {
GVAR(rankIcons)[] = {
QPATHTOF(UI\icons_germany\private_gs.paa),
QPATHTOF(UI\icons_germany\corporal_gs.paa),
QPATHTOF(UI\icons_germany\sergeant_gs.paa),
QPATHTOF(UI\icons_germany\lieutenant_gs.paa),
QPATHTOF(UI\icons_germany\captain_gs.paa),
QPATHTOF(UI\icons_germany\major_gs.paa),
QPATHTOF(UI\icons_germany\colonel_gs.paa)
};
};
class IND_G_F {
GVAR(rankIcons)[] = {
QPATHTOF(UI\icons_spain\private_gs.paa),
QPATHTOF(UI\icons_spain\corporal_gs.paa),
QPATHTOF(UI\icons_spain\sergeant_gs.paa),
QPATHTOF(UI\icons_spain\lieutenant_gs.paa),
QPATHTOF(UI\icons_spain\captain_gs.paa),
QPATHTOF(UI\icons_spain\major_gs.paa),
QPATHTOF(UI\icons_spain\colonel_gs.paa)
};
};
};

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More