Merge branch 'master' of https://github.com/acemod/ACE3 into feature/switchToLogMacros

Conflicts:
	addons/repair/functions/fnc_moduleRepairSettings.sqf
This commit is contained in:
Michael Braun 2015-09-09 02:55:12 +02:00
commit a5fb09a7e1
209 changed files with 2761 additions and 2360 deletions

View File

@ -17,6 +17,9 @@
<a href="https://github.com/acemod/ACE3/blob/master/LICENSE"> <a href="https://github.com/acemod/ACE3/blob/master/LICENSE">
<img src="http://img.shields.io/badge/License-GPLv2-red.svg" alt="ACE3 License"> <img src="http://img.shields.io/badge/License-GPLv2-red.svg" alt="ACE3 License">
</a> </a>
<a href="http://slackin.koffeinflummi.de">
<img src="http://slackin.koffeinflummi.de/badge.svg" alt="ACE3 Slack">
</a>
</p> </p>
<p align="center"><sup><strong>Requires the latest version of <a href="https://github.com/CBATeam/CBA_A3/releases">CBA A3</a>. Visit us on <a href="https://www.facebook.com/ACE3Mod">Facebook</a> | <a href="https://www.youtube.com/c/ACE3Mod">YouTube</a> | <a href="https://twitter.com/ACE3Mod">Twitter</a> | <a href="http://www.reddit.com/r/arma/search?q=ACE&restrict_sr=on&sort=new&t=all">Reddit</a></strong></sup></p> <p align="center"><sup><strong>Requires the latest version of <a href="https://github.com/CBATeam/CBA_A3/releases">CBA A3</a>. Visit us on <a href="https://www.facebook.com/ACE3Mod">Facebook</a> | <a href="https://www.youtube.com/c/ACE3Mod">YouTube</a> | <a href="https://twitter.com/ACE3Mod">Twitter</a> | <a href="http://www.reddit.com/r/arma/search?q=ACE&restrict_sr=on&sort=new&t=all">Reddit</a></strong></sup></p>

View File

@ -6,23 +6,11 @@ class CfgAmmo {
timeToLive=6; timeToLive=6;
}; };
class B_20mm : BulletBase {
timeToLive=30;
};
class B_25mm : BulletBase {
timeToLive=30;
};
class B_35mm_AA : BulletBase {
timeToLive=30;
};
class B_30mm_AP : BulletBase {
timeToLive=30;
};
class B_556x45_Ball : BulletBase { class B_556x45_Ball : BulletBase {
airFriction=-0.00126466; airFriction=-0.00126466;
hit=8; hit=8;
typicalSpeed=750; typicalSpeed=750;
tracerScale = 1;
tracerStartTime=0.073; // M856 tracer burns out to 800m tracerStartTime=0.073; // M856 tracer burns out to 800m
tracerEndTime=1.57123; // Time in seconds calculated with ballistics calculator tracerEndTime=1.57123; // Time in seconds calculated with ballistics calculator
ACE_caliber=5.69; ACE_caliber=5.69;
@ -128,9 +116,13 @@ class CfgAmmo {
ACE_muzzleVelocities[]={785, 883, 925}; ACE_muzzleVelocities[]={785, 883, 925};
ACE_barrelLengths[]={254.0, 414.02, 508.0}; ACE_barrelLengths[]={254.0, 414.02, 508.0};
}; };
class B_56x15_dual: BulletBase {
tracerScale = 0.5;
};
class B_65x39_Caseless : BulletBase { class B_65x39_Caseless : BulletBase {
airFriction=-0.00075308; airFriction=-0.00075308;
typicalSpeed=800; typicalSpeed=800;
tracerScale = 1.1; //1.0;
ACE_caliber=6.706; ACE_caliber=6.706;
ACE_bulletLength=32.893; ACE_bulletLength=32.893;
ACE_bulletMass=7.9704; ACE_bulletMass=7.9704;
@ -180,10 +172,15 @@ class CfgAmmo {
ACE_muzzleVelocities[]={750, 820, 840, 852, 860}; ACE_muzzleVelocities[]={750, 820, 840, 852, 860};
ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4};
}; };
class SubmunitionBullet;
class B_65x39_Minigun_Caseless: SubmunitionBullet {
tracerScale = 1.1; //1.0;
};
class B_762x51_Ball : BulletBase { class B_762x51_Ball : BulletBase {
airFriction=-0.00100957; airFriction=-0.00100957;
typicalSpeed=833; typicalSpeed=833;
hit=9; hit=9;
tracerScale = 1.2; //0.6;
tracerStartTime=0.073; // Based on the British L5A1 which burns out to 1000m tracerStartTime=0.073; // Based on the British L5A1 which burns out to 1000m
tracerEndTime=2.15957; // Time in seconds calculated with ballistics calculator tracerEndTime=2.15957; // Time in seconds calculated with ballistics calculator
ACE_caliber=7.823; ACE_caliber=7.823;
@ -479,6 +476,7 @@ class CfgAmmo {
class B_9x21_Ball : BulletBase { class B_9x21_Ball : BulletBase {
airFriction=-0.00226847; airFriction=-0.00226847;
typicalSpeed=390; typicalSpeed=390;
tracerScale = 0.5;
hit=6; hit=6;
ACE_caliber=9.042; ACE_caliber=9.042;
ACE_bulletLength=15.494; ACE_bulletLength=15.494;
@ -491,6 +489,9 @@ class CfgAmmo {
ACE_muzzleVelocities[]={440, 460, 480}; ACE_muzzleVelocities[]={440, 460, 480};
ACE_barrelLengths[]={101.6, 127.0, 228.6}; ACE_barrelLengths[]={101.6, 127.0, 228.6};
}; };
class B_9x21_Ball_Tracer_Green: B_9x21_Ball {
tracerScale = 0.5;
};
class ACE_9x18_Ball_57N181S : B_9x21_Ball { class ACE_9x18_Ball_57N181S : B_9x21_Ball {
hit=5; hit=5;
airFriction=-0.00190333; airFriction=-0.00190333;
@ -584,6 +585,7 @@ class CfgAmmo {
timeToLive=10; timeToLive=10;
airFriction=-0.00038944; airFriction=-0.00038944;
typicalSpeed=910; typicalSpeed=910;
tracerScale = 1.3; //1.2;
ACE_caliber=10.363; ACE_caliber=10.363;
ACE_bulletLength=54.0; ACE_bulletLength=54.0;
ACE_bulletMass=26.568; ACE_bulletMass=26.568;
@ -670,9 +672,13 @@ class CfgAmmo {
ACE_muzzleVelocities[]={880, 915, 925}; ACE_muzzleVelocities[]={880, 915, 925};
ACE_barrelLengths[]={508.0, 660.4, 711.2}; ACE_barrelLengths[]={508.0, 660.4, 711.2};
}; };
class B_127x33_Ball: BulletBase {
tracerScale = 1.3; //1.2;
};
class B_127x54_Ball : BulletBase { class B_127x54_Ball : BulletBase {
airFriction=-0.00019268; airFriction=-0.00019268;
typicalSpeed=300; typicalSpeed=300;
tracerScale = 1.3;//
ACE_caliber=12.954; ACE_caliber=12.954;
ACE_bulletLength=64.516; ACE_bulletLength=64.516;
ACE_bulletMass=48.6; ACE_bulletMass=48.6;
@ -688,6 +694,7 @@ class CfgAmmo {
timeToLive=10; timeToLive=10;
airFriction=-0.00057503; airFriction=-0.00057503;
typicalSpeed=900; typicalSpeed=900;
tracerScale = 1.3; //1.2;
ACE_caliber=12.954; ACE_caliber=12.954;
ACE_bulletLength=58.674; ACE_bulletLength=58.674;
ACE_bulletMass=41.9256; ACE_bulletMass=41.9256;
@ -703,6 +710,7 @@ class CfgAmmo {
timeToLive=10; timeToLive=10;
airFriction=-0.00057503; airFriction=-0.00057503;
typicalSpeed=900; typicalSpeed=900;
tracerScale = 1.3;//
hit=25; hit=25;
caliber=4.0; caliber=4.0;
ACE_caliber=12.954; ACE_caliber=12.954;
@ -736,6 +744,7 @@ class CfgAmmo {
timeToLive=10; timeToLive=10;
airFriction=-0.00063800; airFriction=-0.00063800;
typicalSpeed=820; typicalSpeed=820;
tracerScale = 1.3; //1.5;
ACE_caliber=12.979; ACE_caliber=12.979;
ACE_bulletLength=64.008; ACE_bulletLength=64.008;
ACE_bulletMass=48.276; ACE_bulletMass=48.276;
@ -750,6 +759,7 @@ class CfgAmmo {
class B_45ACP_Ball : BulletBase { class B_45ACP_Ball : BulletBase {
airFriction=-0.00081221; airFriction=-0.00081221;
typicalSpeed=250; typicalSpeed=250;
tracerScale = 0.6;
ACE_caliber=11.481; ACE_caliber=11.481;
ACE_bulletLength=17.272; ACE_bulletLength=17.272;
ACE_bulletMass=14.904; ACE_bulletMass=14.904;
@ -761,4 +771,36 @@ class CfgAmmo {
ACE_muzzleVelocities[]={230, 250, 285}; ACE_muzzleVelocities[]={230, 250, 285};
ACE_barrelLengths[]={101.6, 127.0, 228.6}; ACE_barrelLengths[]={101.6, 127.0, 228.6};
}; };
class B_19mm_HE: BulletBase {
tracerScale = 1;
};
class B_30mm_HE: B_19mm_HE {
tracerScale = 2.5;
};
class B_20mm: BulletBase {
timeToLive=30;
tracerScale = 1.5; //1;
};
class B_25mm: BulletBase {
timeToLive=30;
tracerScale = 2.0; //1;
};
class B_30mm_AP: BulletBase {
timeToLive=30;
tracerScale = 2.5;
};
class B_35mm_AA: BulletBase {
timeToLive=30;
tracerScale = 2.75; //1.85;
};
class ShellBase;
class Sh_120mm_HE: ShellBase {
tracerScale = 3;
};
class Sh_120mm_APFSDS: ShellBase {
tracerScale = 3;
};
class Gatling_30mm_HE_Plane_CAS_01_F: BulletBase {
tracerScale = 2.5;
};
}; };

View File

@ -35,6 +35,12 @@ class CfgMovesMaleSdr: CfgMovesBasic {
class CutSceneAnimationBase; class CutSceneAnimationBase;
#define MACRO_ANIMATION \
head = "headDefault"; \
aimingBody = "aimingNo"; \
forceAim = 1; \
static = 1;
//Handcuffed Anims: //Handcuffed Anims:
class ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon: CutSceneAnimationBase { class ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon: CutSceneAnimationBase {
actions = "ACE_CivilStandHandcuffedActions"; actions = "ACE_CivilStandHandcuffedActions";
@ -45,6 +51,7 @@ class CfgMovesMaleSdr: CfgMovesBasic {
ConnectTo[] = {"ACE_AmovPercMstpScapWnonDnon",0.1}; ConnectTo[] = {"ACE_AmovPercMstpScapWnonDnon",0.1};
InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon",0.1};
canReload = 0; canReload = 0;
MACRO_ANIMATION
}; };
class ACE_AmovPercMstpScapWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon { class ACE_AmovPercMstpScapWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon {
file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\non\non\AmovPercMstpSnonWnonDnon_Ease"; file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\non\non\AmovPercMstpSnonWnonDnon_Ease";
@ -52,12 +59,14 @@ class CfgMovesMaleSdr: CfgMovesBasic {
ConnectTo[] = {"ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; ConnectTo[] = {"ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon",0.1};
InterpolateTo[] = {"Unconscious",0.01}; InterpolateTo[] = {"Unconscious",0.01};
looped = 1; looped = 1;
MACRO_ANIMATION
}; };
class ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon { class ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon {
actions = "CivilStandActions"; actions = "CivilStandActions";
file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\non\non\amovpercmstpsnonwnondnon_easeout"; file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\non\non\amovpercmstpsnonwnondnon_easeout";
ConnectTo[] = {"AmovPercMstpSnonWnonDnon",0.1}; ConnectTo[] = {"AmovPercMstpSnonWnonDnon",0.1};
InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon",0.1}; InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon",0.1};
MACRO_ANIMATION
}; };
//Handcuffed-FFV: //Handcuffed-FFV:
@ -65,6 +74,7 @@ class CfgMovesMaleSdr: CfgMovesBasic {
file = "\A3\cargoposes_F_heli\anim\passenger_flatground_3idleunarmed.rtm"; file = "\A3\cargoposes_F_heli\anim\passenger_flatground_3idleunarmed.rtm";
actions = "ACE_CivilHandCuffedFFVActions"; actions = "ACE_CivilHandCuffedFFVActions";
ConnectTo[] = {}; ConnectTo[] = {};
MACRO_ANIMATION
}; };
@ -78,6 +88,7 @@ class CfgMovesMaleSdr: CfgMovesBasic {
ConnectTo[] = {"ACE_AmovPercMstpSsurWnonDnon",0.1}; ConnectTo[] = {"ACE_AmovPercMstpSsurWnonDnon",0.1};
InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon",0.1};
canReload = 0; canReload = 0;
MACRO_ANIMATION
}; };
class ACE_AmovPercMstpSsurWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon { class ACE_AmovPercMstpSsurWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon {
file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\sur\non\AmovPercMstpSsurWnonDnon"; file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\sur\non\AmovPercMstpSsurWnonDnon";
@ -85,6 +96,7 @@ class CfgMovesMaleSdr: CfgMovesBasic {
looped = 1; looped = 1;
ConnectTo[] = {"ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; ConnectTo[] = {"ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon",0.1};
InterpolateTo[] = {"Unconscious",0.01}; InterpolateTo[] = {"Unconscious",0.01};
MACRO_ANIMATION
}; };
class ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon { class ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon {
speed = 0.5; //for gameplay reasons, slow this down speed = 0.5; //for gameplay reasons, slow this down
@ -92,6 +104,7 @@ class CfgMovesMaleSdr: CfgMovesBasic {
file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\sur\non\AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon"; file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\sur\non\AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon";
ConnectTo[] = {"AmovPercMstpSnonWnonDnon",0.1}; ConnectTo[] = {"AmovPercMstpSnonWnonDnon",0.1};
InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon",0.1}; InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon",0.1};
MACRO_ANIMATION
}; };
}; };
}; };

View File

@ -41,7 +41,7 @@ if (getNumber (configFile >> "CfgVehicles" >> _type >> QGVAR(hasCargo)) != 1) ex
private ["_text", "_condition", "_statement", "_icon", "_action"]; private ["_text", "_condition", "_statement", "_icon", "_action"];
_condition = { _condition = {
params ["_target", "_player"]; params ["_target", "_player"];
GVAR(enable) && {[_player, _target, []] call EFUNC(common,canInteractWith)} GVAR(enable) && {locked _target < 2} && {[_player, _target, []] call EFUNC(common,canInteractWith)}
}; };
_text = localize LSTRING(openMenu); _text = localize LSTRING(openMenu);
_statement = {GVAR(interactionVehicle) = _target; createDialog QGVAR(menu);}; _statement = {GVAR(interactionVehicle) = _target; createDialog QGVAR(menu);};

View File

@ -150,6 +150,15 @@ call FUNC(checkFiles);
//Event that settings are safe to use: //Event that settings are safe to use:
["SettingsInitialized", []] call FUNC(localEvent); ["SettingsInitialized", []] call FUNC(localEvent);
//Set init finished and run all delayed functions:
GVAR(settingsInitFinished) = true;
diag_log text format ["[ACE] %1 delayed functions running", (count GVAR(runAtSettingsInitialized))];
{
_x params ["_func", "_params"];
_params call _func;
} forEach GVAR(runAtSettingsInitialized);
GVAR(runAtSettingsInitialized) = nil; //cleanup
}, 0, [false]] call CBA_fnc_addPerFrameHandler; }, 0, [false]] call CBA_fnc_addPerFrameHandler;
@ -326,7 +335,7 @@ GVAR(OldIsCamera) = false;
if (didJip) then { if (didJip) then {
// We are jipping! Get ready and wait, and throw the event // We are jipping! Get ready and wait, and throw the event
[{ [{
if(!(isNull player)) then { if((!(isNull player)) && GVAR(settingsInitFinished)) then {
["PlayerJip", [player] ] call FUNC(localEvent); ["PlayerJip", [player] ] call FUNC(localEvent);
[(_this select 1)] call cba_fnc_removePerFrameHandler; [(_this select 1)] call cba_fnc_removePerFrameHandler;
}; };

View File

@ -157,6 +157,7 @@ PREP(requestCallback);
PREP(resetAllDefaults); PREP(resetAllDefaults);
PREP(restoreVariablesJIP); PREP(restoreVariablesJIP);
PREP(revertKeyCodeLocalized); PREP(revertKeyCodeLocalized);
PREP(runAfterSettingsInit);
PREP(sanitizeString); PREP(sanitizeString);
PREP(sendRequest); PREP(sendRequest);
PREP(serverLog); PREP(serverLog);
@ -303,6 +304,9 @@ GVAR(nextFrameNo) = diag_frameno;
GVAR(nextFrameBufferA) = []; GVAR(nextFrameBufferA) = [];
GVAR(nextFrameBufferB) = []; GVAR(nextFrameBufferB) = [];
GVAR(settingsInitFinished) = false;
GVAR(runAtSettingsInitialized) = [];
// @TODO: Generic local-managed global-synced objects (createVehicleLocal) // @TODO: Generic local-managed global-synced objects (createVehicleLocal)
//Debug //Debug

View File

@ -20,7 +20,9 @@ _version = getText (configFile >> "CfgPatches" >> "ace_main" >> "versionStr");
ACE_LOGINFO_1("ACE is version %1.",_version); ACE_LOGINFO_1("ACE is version %1.",_version);
private "_addons"; private "_addons";
_addons = activatedAddons; //_addons = activatedAddons; // broken with High-Command module, see #2134
_addons = "true" configClasses (configFile >> "CfgPatches");//
_addons = [_addons, {toLower configName _this}] call FUNC(map);//
_addons = [_addons, {_this find "ace_" == 0}] call FUNC(filter); _addons = [_addons, {_this find "ace_" == 0}] call FUNC(filter);
{ {

View File

@ -0,0 +1,27 @@
/*
* Author: PabstMirror
* Executes code after setting are initilized.
*
* Argument:
* 0: Code to execute <CODE>
* 1: Parameters to run the code with <ANY>
*
* Return value:
* None
*
* Example:
* [{if (GVAR(setting) then {x} else {y};}, []] call ace_common_fnc_runAfterSettingsInit
*
* Public: No
*/
#include "script_component.hpp"
params ["_func", "_params"];
if (GVAR(settingsInitFinished)) then {
//Setting Already Finished, Direct Run the code
_params call _func;
} else {
//Waiting on settings, throw it on the delayed run array
GVAR(runAtSettingsInitialized) pushBack [_func, _params];
};

View File

@ -76,6 +76,7 @@
<Key ID="STR_ACE_Explosives_BlockedAction"> <Key ID="STR_ACE_Explosives_BlockedAction">
<English>Blocked</English> <English>Blocked</English>
<Spanish>Obstruido</Spanish> <Spanish>Obstruido</Spanish>
<Polish>Zablokowany</Polish>
</Key> </Key>
<Key ID="STR_ACE_Explosives_CancelAction"> <Key ID="STR_ACE_Explosives_CancelAction">
<English>Cancel</English> <English>Cancel</English>

View File

@ -41,7 +41,7 @@ _iconSize = BASE_SIZE * _fovCorrection;
_drawColor set [3, ((_drawColor select 3) * (_timeLeftToShow / 0.5))]; _drawColor set [3, ((_drawColor select 3) * (_timeLeftToShow / 0.5))];
}; };
drawIcon3D [QUOTE(PATHTOF(UI\fp_icon.paa)), _drawColor, _pos, _iconSize, _iconSize, 0, _name, 1, 0.03, "PuristaMedium"]; drawIcon3D [QUOTE(PATHTOF(UI\fp_icon2.paa)), _drawColor, _pos, _iconSize, _iconSize, 0, _name, 1, 0.03, "PuristaMedium"];
}; };
} count (GVAR(fingersHash) select 0); } count (GVAR(fingersHash) select 0);

Binary file not shown.

View File

@ -18,7 +18,7 @@
if (!alive ace_player) exitWith {}; if (!alive ace_player) exitWith {};
if (true) then { if (true) then {
// Detect if curator interface is open and disable effects // Detect if curator interface is open and disable effects
if (!isNull(findDisplay 312)) exitWith { if !(isNull curatorCamera) exitWith {
if (GVAR(EffectsActive)) then { if (GVAR(EffectsActive)) then {
call FUNC(removeGlassesEffect); call FUNC(removeGlassesEffect);
}; };

View File

@ -15,17 +15,14 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_1(_unit); params ["_unit"];
private ["_currentGlasses", "_result", "_position", "_visible"]; private ["_currentGlasses", "_result", "_position", "_visible"];
_currentGlasses = goggles _unit; _currentGlasses = goggles _unit;
_result = false; _result = false;
if ((vehicle _unit) != _unit) exitWith {(cameraView != "GUNNER")};
if (_currentGlasses != "") then { if (_currentGlasses != "") then {
_position =(getPosASLW _unit); _position = getPosASLW _unit;
if (surfaceIsWater _position && {((_position select 2) < 0.25)}) exitWith { if (surfaceIsWater _position && {((_position select 2) < 0.25)}) exitWith {
_result = ([_currentGlasses] call FUNC(isDivingGoggles)); _result = ([_currentGlasses] call FUNC(isDivingGoggles));
}; };

View File

@ -5,87 +5,95 @@ class CfgAmmo {
flareSize = 12; flareSize = 12;
timeToLive = 60; timeToLive = 60;
}; };
class F_40mm_White: FlareBase { class F_40mm_White: FlareBase {
intensity = 40000; intensity = 40000;
flareSize = 12; flareSize = 12;
}; };
class F_20mm_White: FlareBase { class F_20mm_White: FlareBase {
intensity = 20000; intensity = 20000;
flareSize = 6; flareSize = 6;
}; };
class F_Signal_Green: FlareBase { class F_Signal_Green: FlareBase {
intensity = 20000; intensity = 20000;
flareSize = 12; flareSize = 12;
}; };
class Flare_82mm_AMOS_White: FlareCore { class Flare_82mm_AMOS_White: FlareCore {
intensity = 80000; intensity = 80000;
flareSize = 12; flareSize = 12;
timeToLive = 60; timeToLive = 60;
}; };
class F_20mm_Red: F_20mm_White {};
class F_20mm_Green: F_20mm_White {};
class F_20mm_Yellow: F_20mm_White {};
class ACE_F_Hand_White: F_20mm_White { class ACE_F_Hand_White: F_20mm_White {
grenadeBurningSound[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5};
grenadeFireSound[] = {"SmokeShellSoundHit1",0.25,"SmokeShellSoundHit2",0.25,"SmokeShellSoundHit3",0.5};
soundTrigger[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5};
SmokeShellSoundHit1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_1",1.25893,1,100};
SmokeShellSoundHit2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_2",1.25893,1,100};
SmokeShellSoundHit3[] = {"A3\Sounds_F\weapons\smokeshell\smoke_3",1.25893,1,100};
SmokeShellSoundLoop1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop1",0.125893,1,70};
SmokeShellSoundLoop2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop2",0.125893,1,70};
timeToLive = 60;
};
class ACE_F_Hand_Red: F_20mm_Red {
grenadeBurningSound[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5};
grenadeFireSound[] = {"SmokeShellSoundHit1",0.25,"SmokeShellSoundHit2",0.25,"SmokeShellSoundHit3",0.5};
soundTrigger[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5};
SmokeShellSoundHit1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_1",1.25893,1,100};
SmokeShellSoundHit2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_2",1.25893,1,100};
SmokeShellSoundHit3[] = {"A3\Sounds_F\weapons\smokeshell\smoke_3",1.25893,1,100};
SmokeShellSoundLoop1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop1",0.125893,1,70};
SmokeShellSoundLoop2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop2",0.125893,1,70};
timeToLive = 60;
};
class ACE_F_Hand_Green: F_20mm_Green {
grenadeBurningSound[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5};
grenadeFireSound[] = {"SmokeShellSoundHit1",0.25,"SmokeShellSoundHit2",0.25,"SmokeShellSoundHit3",0.5};
soundTrigger[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5};
SmokeShellSoundHit1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_1",1.25893,1,100};
SmokeShellSoundHit2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_2",1.25893,1,100};
SmokeShellSoundHit3[] = {"A3\Sounds_F\weapons\smokeshell\smoke_3",1.25893,1,100};
SmokeShellSoundLoop1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop1",0.125893,1,70};
SmokeShellSoundLoop2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop2",0.125893,1,70};
timeToLive = 60;
};
class ACE_F_Hand_Yellow: F_20mm_Yellow {
grenadeBurningSound[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5};
grenadeFireSound[] = {"SmokeShellSoundHit1",0.25,"SmokeShellSoundHit2",0.25,"SmokeShellSoundHit3",0.5};
soundTrigger[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5};
SmokeShellSoundHit1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_1",1.25893,1,100};
SmokeShellSoundHit2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_2",1.25893,1,100};
SmokeShellSoundHit3[] = {"A3\Sounds_F\weapons\smokeshell\smoke_3",1.25893,1,100};
SmokeShellSoundLoop1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop1",0.125893,1,70};
SmokeShellSoundLoop2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop2",0.125893,1,70};
timeToLive = 60; timeToLive = 60;
}; };
class ACE_G_M84: F_20mm_Yellow { class F_20mm_Red;
useFlare = 0; class ACE_F_Hand_Red: F_20mm_Red {
flareSize = 0; timeToLive = 60;
intensity = 0; };
grenadeBurningSound[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5};
grenadeFireSound[] = {"SmokeShellSoundHit1",0.25,"SmokeShellSoundHit2",0.25,"SmokeShellSoundHit3",0.5}; class F_20mm_Green;
soundTrigger[] = {"SmokeShellSoundLoop1",0.5,"SmokeShellSoundLoop2",0.5}; class ACE_F_Hand_Green: F_20mm_Green {
SmokeShellSoundHit1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_1",1.25893,1,100}; timeToLive = 60;
SmokeShellSoundHit2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_2",1.25893,1,100}; };
SmokeShellSoundHit3[] = {"A3\Sounds_F\weapons\smokeshell\smoke_3",1.25893,1,100};
SmokeShellSoundLoop1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop1",0.125893,1,70}; class F_20mm_Yellow;
SmokeShellSoundLoop2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop2",0.125893,1,70}; class ACE_F_Hand_Yellow: F_20mm_Yellow {
timeToLive = 6; timeToLive = 60;
fuseDistance = 2.3; };
class SmokeShell;
class ACE_G_Handflare_White: SmokeShell {
GVAR(flare) = 1;
GVAR(color)[] = {0.5,0.5,0.5,0.5};
model = "\A3\weapons_f\ammo\flare_white";
dangerRadiusHit = -1;
suppressionRadiusHit = -1;
typicalSpeed = 22;
cost = 100;
deflecting = 30;
explosionTime = 3;
timeToLive = 60;
grenadeFireSound[] = {};
grenadeBurningSound[] = {};
aiAmmoUsageFlags = "4 + 2";
smokeColor[] = {0,0,0,0};
effectsSmoke = "ACE_HandFlareEffect";
whistleDist = 0;
};
class ACE_G_Handflare_Red: ACE_G_Handflare_White {
GVAR(color)[] = {0.5,0.25,0.25,0.5};
model = "\A3\weapons_f\ammo\flare_red";
};
class ACE_G_Handflare_Green: ACE_G_Handflare_White {
GVAR(color)[] = {0.25,0.5,0.25,0.5};
model = "\A3\weapons_f\ammo\flare_green";
};
class ACE_G_Handflare_Yellow: ACE_G_Handflare_White {
GVAR(color)[] = {0.5,0.5,0.25,0.5};
model = "\A3\weapons_f\ammo\flare_yellow";
};
class ACE_G_M84: SmokeShell {
GVAR(flashbang) = 1;
model = PATHTOF(models\ACE_m84_thrown.p3d); model = PATHTOF(models\ACE_m84_thrown.p3d);
dangerRadiusHit = -1;
suppressionRadiusHit = 20;
typicalSpeed = 22;
cost = 40;
explosive = 1E-7;
deflecting = 15;
explosionTime = 2.3;
timeToLive = 6;
grenadeFireSound[] = {};
grenadeBurningSound[] = {};
aiAmmoUsageFlags = "0";
smokeColor[] = {0,0,0,0};
effectsSmoke = "ACE_M84FlashbangEffect";
whistleDist = 0;
}; };
}; };

View File

@ -1,3 +1,4 @@
class CfgMagazines { class CfgMagazines {
class HandGrenade; class HandGrenade;
class ACE_HandFlare_Base: HandGrenade { class ACE_HandFlare_Base: HandGrenade {
@ -8,55 +9,60 @@ class CfgMagazines {
mass = 4; mass = 4;
initSpeed = 22; initSpeed = 22;
}; };
class ACE_HandFlare_White: ACE_HandFlare_Base { class ACE_HandFlare_White: ACE_HandFlare_Base {
author = ECSTRING(common,ACETeam); author = ECSTRING(common,ACETeam);
scope = 2; scope = 2;
ammo = "ACE_F_Hand_White";
displayname = CSTRING(M127A1_White_Name); displayname = CSTRING(M127A1_White_Name);
descriptionshort = CSTRING(M127A1_White_Description); descriptionshort = CSTRING(M127A1_White_Description);
displayNameShort = CSTRING(M127A1_White_NameShort); displayNameShort = CSTRING(M127A1_White_NameShort);
model = "\A3\weapons_f\ammo\flare_white"; model = "\A3\weapons_f\ammo\flare_white";
picture = "\A3\Weapons_F\Data\UI\gear_flare_white_ca.paa"; picture = "\A3\Weapons_F\Data\UI\gear_flare_white_ca.paa";
ammo = "ACE_G_Handflare_White";
}; };
class ACE_HandFlare_Red: ACE_HandFlare_Base { class ACE_HandFlare_Red: ACE_HandFlare_Base {
author = ECSTRING(common,ACETeam); author = ECSTRING(common,ACETeam);
scope = 2; scope = 2;
ammo = "ACE_F_Hand_Red";
displayname = CSTRING(M127A1_Red_Name); displayname = CSTRING(M127A1_Red_Name);
descriptionshort = CSTRING(M127A1_Red_Description); descriptionshort = CSTRING(M127A1_Red_Description);
displayNameShort = CSTRING(M127A1_Red_NameShort); displayNameShort = CSTRING(M127A1_Red_NameShort);
model = "\A3\weapons_f\ammo\flare_red"; model = "\A3\weapons_f\ammo\flare_red";
picture = "\A3\Weapons_F\Data\UI\gear_flare_red_ca.paa"; picture = "\A3\Weapons_F\Data\UI\gear_flare_red_ca.paa";
ammo = "ACE_G_Handflare_Red";
}; };
class ACE_HandFlare_Green: ACE_HandFlare_Base { class ACE_HandFlare_Green: ACE_HandFlare_Base {
author = ECSTRING(common,ACETeam); author = ECSTRING(common,ACETeam);
scope = 2; scope = 2;
ammo = "ACE_F_Hand_Green";
displayname = CSTRING(M127A1_Green_Name); displayname = CSTRING(M127A1_Green_Name);
descriptionshort = CSTRING(M127A1_Green_Description); descriptionshort = CSTRING(M127A1_Green_Description);
displayNameShort = CSTRING(M127A1_Green_NameShort); displayNameShort = CSTRING(M127A1_Green_NameShort);
model = "\A3\weapons_f\ammo\flare_green"; model = "\A3\weapons_f\ammo\flare_green";
picture = "\A3\Weapons_F\Data\UI\gear_flare_green_ca.paa"; picture = "\A3\Weapons_F\Data\UI\gear_flare_green_ca.paa";
ammo = "ACE_G_Handflare_Green";
}; };
class ACE_HandFlare_Yellow: ACE_HandFlare_Base { class ACE_HandFlare_Yellow: ACE_HandFlare_Base {
author = ECSTRING(common,ACETeam); author = ECSTRING(common,ACETeam);
scope = 2; scope = 2;
ammo = "ACE_F_Hand_Yellow";
displayname = CSTRING(M127A1_Yellow_Name); displayname = CSTRING(M127A1_Yellow_Name);
descriptionshort = CSTRING(M127A1_Yellow_Description); descriptionshort = CSTRING(M127A1_Yellow_Description);
displayNameShort = CSTRING(M127A1_Yellow_NameShort); displayNameShort = CSTRING(M127A1_Yellow_NameShort);
model = "\A3\weapons_f\ammo\flare_yellow"; model = "\A3\weapons_f\ammo\flare_yellow";
picture = "\A3\Weapons_F\Data\UI\gear_flare_yellow_ca.paa"; picture = "\A3\Weapons_F\Data\UI\gear_flare_yellow_ca.paa";
ammo = "ACE_G_Handflare_Yellow";
}; };
class ACE_M84: HandGrenade { class ACE_M84: HandGrenade {
author = ECSTRING(common,ACETeam); author = ECSTRING(common,ACETeam);
ammo = "ACE_G_M84";
displayname = CSTRING(M84_Name); displayname = CSTRING(M84_Name);
descriptionshort = CSTRING(M84_Description); descriptionshort = CSTRING(M84_Description);
displayNameShort = "M84"; displayNameShort = "M84";
mass = 4;
model = PATHTOF(models\ACE_m84.p3d); model = PATHTOF(models\ACE_m84.p3d);
picture = PATHTOF(UI\ACE_m84_x_ca.paa); picture = PATHTOF(UI\ACE_m84_x_ca.paa);
ammo = "ACE_G_M84";
mass = 4;
}; };
class 3Rnd_UGL_FlareGreen_F; class 3Rnd_UGL_FlareGreen_F;
@ -65,6 +71,7 @@ class CfgMagazines {
ammo = "F_40mm_Green"; ammo = "F_40mm_Green";
initSpeed = 120; initSpeed = 120;
}; };
class 6Rnd_RedSignal_F: 6Rnd_GreenSignal_F { class 6Rnd_RedSignal_F: 6Rnd_GreenSignal_F {
author = ECSTRING(common,ACETeam); author = ECSTRING(common,ACETeam);
ammo = "F_40mm_Red"; ammo = "F_40mm_Red";

View File

@ -0,0 +1,8 @@
class ACE_M84FlashbangEffect {
// empty
};
class ACE_HandFlareEffect {
// empty
};

View File

@ -2,6 +2,7 @@
ADDON = false; ADDON = false;
PREP(flare);
PREP(flashbangExplosionEH); PREP(flashbangExplosionEH);
PREP(flashbangThrownFuze); PREP(flashbangThrownFuze);
PREP(nextMode); PREP(nextMode);

View File

@ -17,3 +17,5 @@ class CfgPatches {
#include "CfgWeapons.hpp" #include "CfgWeapons.hpp"
#include "CfgMagazines.hpp" #include "CfgMagazines.hpp"
#include "CfgVehicles.hpp" #include "CfgVehicles.hpp"
#include "Effects.hpp"

View File

@ -0,0 +1,40 @@
/*
* Author: commy2
* Makes flare shine.
*
* Arguments:
* 0: The flare <OBJECT>
* 1: Color of flare <ARRAY>
* 2: Intensity of flare <NUMBER>
* 3: Flare lifetime <OBJECT>
*
* Return Value:
* None
*
* Example:
* [_nade, [0.5,0.5,0.5], 0.5, 60] call ace_grenades_fnc_flare
*
* Public: No
*/
#include "script_component.hpp"
params ["_projectile", "_color", "_intensity", "_timeToLive"];
private "_light";
_light = "#lightpoint" createVehicleLocal position _projectile;
_light setLightColor _color;
_light setLightAmbient _color;
_light setLightIntensity _intensity;
_light setLightBrightness 0.8;
_light setLightUseFlare true;
_light setLightFlareSize 3.0;
_light setLightFlareMaxDistance 1000;
_light setLightDayLight true;
_light lightAttachObject [_projectile, [0,0,0]];
//_light attachTo [_projectile, [0,0,0]];
[{deleteVehicle _this}, _light, _timeToLive, 1] call EFUNC(common,waitAndExecute);

View File

@ -21,22 +21,50 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_mode", "_fuzeTime"]; params ["_unit", "_weapon", "", "", "_ammo", "", "_projectile"];
params ["_unit", "_weapon", "", "", "", "", "_projectile"];
if (_unit != ACE_player) exitWith {};
if (_weapon != "Throw") exitWith {}; if (_weapon != "Throw") exitWith {};
// http://feedback.arma3.com/view.php?id=12340
if (isNull _projectile) then {
_projectile = nearestObject [_unit, _ammo];
};
// handle special grenades
if (local _unit) then {
if (getNumber (configFile >> "CfgAmmo" >> _ammo >> QGVAR(flashbang)) == 1) then {
private "_fuzeTime";
_fuzeTime = getNumber (configFile >> "CfgAmmo" >> _ammo >> "explosionTime");
[FUNC(flashbangThrownFuze), [_projectile], _fuzeTime, 0] call EFUNC(common,waitAndExecute);
};
};
if (getNumber (configFile >> "CfgAmmo" >> _ammo >> QGVAR(flare)) == 1) then {
private ["_fuzeTime", "_timeToLive", "_color", "_intensity"];
_fuzeTime = getNumber (configFile >> "CfgAmmo" >> _ammo >> "explosionTime");
_timeToLive = getNumber (configFile >> "CfgAmmo" >> _ammo >> "timeToLive");
_color = getArray (configFile >> "CfgAmmo" >> _ammo >> QGVAR(color));
_intensity = _color select 3;
_color resize 3;
[FUNC(flare), [_projectile, _color, _intensity, _timeToLive], _fuzeTime, 0] call EFUNC(common,waitAndExecute);
};
// handle throw modes
if (_unit != ACE_player) exitWith {};
private "_mode";
_mode = missionNamespace getVariable [QGVAR(currentThrowMode), 0]; _mode = missionNamespace getVariable [QGVAR(currentThrowMode), 0];
if (_mode != 0) then { if (_mode != 0) then {
private "_velocity"; private "_velocity";
_velocity = velocity _projectile; _velocity = velocity _projectile;
switch (_mode) do { switch (_mode) do {
//high throw //high throw
case 1 : { case 1 : {
_velocity = [ _velocity = [
0.5 * (_velocity select 0), 0.5 * (_velocity select 0),
0.5 * (_velocity select 1), 0.5 * (_velocity select 1),
@ -44,24 +72,18 @@ if (_mode != 0) then {
]; ];
}; };
//precise throw //precise throw
case 2 : { case 2 : {
_velocity = (_unit weaponDirection _weapon) vectorMultiply (vectorMagnitude _velocity); _velocity = (_unit weaponDirection _weapon) vectorMultiply (vectorMagnitude _velocity);
}; };
//roll grande //roll grande
case 3 : { case 3 : {
//@todo //@todo
}; };
//drop grenade //drop grenade
case 4 : { case 4 : {
_velocity = [0, 0, 0]; _velocity = [0, 0, 0];
}; };
}; };
_projectile setVelocity _velocity; _projectile setVelocity _velocity;
}; };
if (typeOf _projectile == "ACE_G_M84") then {
_fuzeTime = getNumber (configFile >> "CfgAmmo" >> typeOf _projectile >> "fuseDistance");
// _fuzeTime = getNumber (configFile >> "CfgAmmo" >> typeOf _projectile >> "explosionTime"); //@toDo pretty sure this should be explosionTime not fuseDistance
[FUNC(flashbangThrownFuze), [_projectile], _fuzeTime, 0] call EFUNC(common,waitAndExecute);
};

View File

@ -145,9 +145,11 @@
</Key> </Key>
<Key ID="STR_ACE_Hearing_enabledForZeusUnits_DisplayName"> <Key ID="STR_ACE_Hearing_enabledForZeusUnits_DisplayName">
<English>Effect Zeus RC</English> <English>Effect Zeus RC</English>
<Polish>Wpływ na Zeus RC</Polish>
</Key> </Key>
<Key ID="STR_ACE_Hearing_enabledForZeusUnits_Description"> <Key ID="STR_ACE_Hearing_enabledForZeusUnits_Description">
<English>Allow zeus remote controlled units to be able to take hearing damage.</English> <English>Allow zeus remote controlled units to be able to take hearing damage.</English>
<Polish>Aktywuj efekty utraty słuchu dla jednostek kontrolowanych zdalnie przez Zeusa.</Polish>
</Key> </Key>
</Package> </Package>
</Project> </Project>

View File

@ -545,7 +545,6 @@ class CfgPatches {
}; };
author[] = {ECSTRING(common,ACETeam)}; author[] = {ECSTRING(common,ACETeam)};
authorUrl = "http://ace3mod.com/"; authorUrl = "http://ace3mod.com/";
versionDesc = "ACE3";
VERSION_CONFIG; VERSION_CONFIG;
}; };
}; };

View File

@ -5,7 +5,7 @@
#define MAJOR 3 #define MAJOR 3
#define MINOR 2 #define MINOR 2
#define PATCHLVL 2 #define PATCHLVL 3
#define BUILD 0 #define BUILD 0
#define VERSION MAJOR.MINOR.PATCHLVL.BUILD #define VERSION MAJOR.MINOR.PATCHLVL.BUILD

View File

@ -98,4 +98,14 @@ call FUNC(determineZoom);
}] call EFUNC(common,addEventHandler); }] call EFUNC(common,addEventHandler);
}; };
}; };
}] call EFUNC(common,addEventHandler); }] call EFUNC(common,addEventHandler);
// hide clock on map if player has no watch
GVAR(hasWatch) = true;
["playerInventoryChanged", {
if (isNull (_this select 0)) exitWith {
GVAR(hasWatch) = true;
};
GVAR(hasWatch) = "ItemWatch" in (_this select 1 select 17);
}] call EFUNC(common,addEventHandler);

View File

@ -2,3 +2,6 @@
#include "script_component.hpp" #include "script_component.hpp"
((_this select 0) displayCtrl 1016) ctrlShow GVAR(mapShowCursorCoordinates); ((_this select 0) displayCtrl 1016) ctrlShow GVAR(mapShowCursorCoordinates);
// hide clock when no watch in inventory, or whatever never ever
((_this select 0) displayCtrl 101) ctrlShow GVAR(hasWatch);

View File

@ -21,12 +21,15 @@
</Key> </Key>
<Key ID="STR_ACE_Map_MapIllumination_Description"> <Key ID="STR_ACE_Map_MapIllumination_Description">
<English>Simulate map lighting based on ambient lighting and player's items?</English> <English>Simulate map lighting based on ambient lighting and player's items?</English>
<Polish>Symuluj oświetlenie mapy bazujące na oświetleniu otoczenia oraz przedmiotach gracza?</Polish>
</Key> </Key>
<Key ID="STR_ACE_Map_MapGlow_DisplayName"> <Key ID="STR_ACE_Map_MapGlow_DisplayName">
<English>Map flashlight glow?</English> <English>Map flashlight glow?</English>
<Polish>Poświata latarki</Polish>
</Key> </Key>
<Key ID="STR_ACE_Map_MapGlow_Description"> <Key ID="STR_ACE_Map_MapGlow_Description">
<English>Add external glow to players who use flashlight on map?</English> <English>Add external glow to players who use flashlight on map?</English>
<Polish>Pokaż poświatę światła latarki na graczu, który używa latarki na widoku mapy?</Polish>
</Key> </Key>
<Key ID="STR_ACE_Map_MapShake_DisplayName"> <Key ID="STR_ACE_Map_MapShake_DisplayName">
<English>Map shake?</English> <English>Map shake?</English>
@ -184,4 +187,4 @@
<Polish>Zmniejsz czułość</Polish> <Polish>Zmniejsz czułość</Polish>
</Key> </Key>
</Package> </Package>
</Project> </Project>

View File

@ -18,7 +18,7 @@
params ["_theMap"]; params ["_theMap"];
private ["_rotatingTexture", "_textureWidth", "_scale", "_xPos", "_yPos"]; private ["_rotatingTexture", "_textureWidth", "_scaleX", "_scaleY", "_xPos", "_yPos"];
// Show/Hide draw buttons // Show/Hide draw buttons
if ([] call FUNC(canDraw)) then { if ([] call FUNC(canDraw)) then {
@ -43,16 +43,18 @@ if (GVAR(mapTool_Shown) == 1) then {
}; };
// Update scale of both parts // Update scale of both parts
_scale = _textureWidth * CONSTANT_SCALE * (call FUNC(calculateMapScale)); getResolution params ["_resWidth", "_resHeight", "", "", "_aspectRatio"];
_scaleX = 32 * _textureWidth * CONSTANT_SCALE * (call FUNC(calculateMapScale));
_scaleY = _scaleX * ((_resWidth / _resHeight) / _aspectRatio); //handle bad aspect ratios
// Position of the fixed part // Position of the fixed part
_xPos = GVAR(mapTool_pos) select 0; _xPos = GVAR(mapTool_pos) select 0;
_yPos = (GVAR(mapTool_pos) select 1) + _textureWidth * CENTER_OFFSET_Y_PERC; _yPos = (GVAR(mapTool_pos) select 1) + _textureWidth * CENTER_OFFSET_Y_PERC;
_theMap drawIcon [QUOTE(PATHTOF(data\mapToolFixed.paa)), [1,1,1,1], [_xPos,_yPos], (32 * _scale), (32 * _scale), 0, "", 0]; _theMap drawIcon [QUOTE(PATHTOF(data\mapToolFixed.paa)), [1,1,1,1], [_xPos,_yPos], _scaleX, _scaleY, 0, "", 0];
// Position and rotation of the rotating part // Position and rotation of the rotating part
_xPos = (GVAR(mapTool_pos) select 0) + sin(GVAR(mapTool_angle)) * _textureWidth * CENTER_OFFSET_Y_PERC; _xPos = (GVAR(mapTool_pos) select 0) + sin(GVAR(mapTool_angle)) * _textureWidth * CENTER_OFFSET_Y_PERC;
_yPos = (GVAR(mapTool_pos) select 1) + cos(GVAR(mapTool_angle)) * _textureWidth * CENTER_OFFSET_Y_PERC; _yPos = (GVAR(mapTool_pos) select 1) + cos(GVAR(mapTool_angle)) * _textureWidth * CENTER_OFFSET_Y_PERC;
_theMap drawIcon [_rotatingTexture, [1,1,1,1], [_xPos,_yPos], (32 * _scale), (32 * _scale), GVAR(mapTool_angle), "", 0]; _theMap drawIcon [_rotatingTexture, [1,1,1,1], [_xPos,_yPos], _scaleX, _scaleY, GVAR(mapTool_angle), "", 0];

View File

@ -7,6 +7,7 @@ class ACE_Medical_Actions {
category = "bandage"; category = "bandage";
treatmentLocations[] = {"All"}; treatmentLocations[] = {"All"};
allowedSelections[] = {"All"}; allowedSelections[] = {"All"};
allowSelfTreatment = 1;
requiredMedic = 0; requiredMedic = 0;
treatmentTime = 5; treatmentTime = 5;
treatmentTimeSelfCoef = 1; treatmentTimeSelfCoef = 1;
@ -32,6 +33,7 @@ class ACE_Medical_Actions {
displayName = CSTRING(Inject_Morphine); displayName = CSTRING(Inject_Morphine);
displayNameProgress = CSTRING(Injecting_Morphine); displayNameProgress = CSTRING(Injecting_Morphine);
allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"}; allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"};
allowSelfTreatment = 1;
category = "medication"; category = "medication";
treatmentTime = 2; treatmentTime = 2;
items[] = {"ACE_morphine"}; items[] = {"ACE_morphine"};
@ -43,6 +45,7 @@ class ACE_Medical_Actions {
displayName = CSTRING(Inject_Epinephrine); displayName = CSTRING(Inject_Epinephrine);
displayNameProgress = CSTRING(Injecting_Epinephrine); displayNameProgress = CSTRING(Injecting_Epinephrine);
allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"}; allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"};
allowSelfTreatment = 1;
category = "medication"; category = "medication";
requiredMedic = 1; requiredMedic = 1;
treatmentTime = 3; treatmentTime = 3;
@ -55,6 +58,7 @@ class ACE_Medical_Actions {
displayName = CSTRING(Transfuse_Blood); displayName = CSTRING(Transfuse_Blood);
displayNameProgress = CSTRING(Transfusing_Blood); displayNameProgress = CSTRING(Transfusing_Blood);
allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"}; allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"};
allowSelfTreatment = 0;
category = "advanced"; category = "advanced";
requiredMedic = 1; requiredMedic = 1;
treatmentTime = 20; treatmentTime = 20;
@ -93,7 +97,7 @@ class ACE_Medical_Actions {
displayNameProgress = CSTRING(Actions_Diagnosing); displayNameProgress = CSTRING(Actions_Diagnosing);
category = "examine"; category = "examine";
treatmentLocations[] = {"All"}; treatmentLocations[] = {"All"};
allowedSelections[] = {"head"}; allowedSelections[] = {"head", "body"};
requiredMedic = 0; requiredMedic = 0;
treatmentTime = 1; treatmentTime = 1;
items[] = {}; items[] = {};
@ -105,6 +109,29 @@ class ACE_Medical_Actions {
itemConsumed = 0; itemConsumed = 0;
litter[] = {}; litter[] = {};
}; };
class CPR: Bandage {
displayName = CSTRING(Actions_CPR);
displayNameProgress = CSTRING(Actions_PerformingCPR);
category = "advanced";
treatmentLocations[] = {"All"};
allowedSelections[] = {"body"};
allowSelfTreatment = 0;
requiredMedic = 0;
treatmentTime = 15;
items[] = {};
condition = QUOTE(!([(_this select 1)] call ace_common_fnc_isAwake) && GVAR(enableRevive)>0);
callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_CPR));
callbackFailure = "";
callbackProgress = "!([((_this select 0) select 1)] call ace_common_fnc_isAwake)";
animationPatient = "";
animationPatientUnconscious = "AinjPpneMstpSnonWrflDnon_rolltoback";
animationCaller = "AinvPknlMstpSlayWnonDnon_medic";
animationCallerProne = "AinvPpneMstpSlayW[wpn]Dnon_medic";
animationCallerSelf = "";
animationCallerSelfProne = "";
itemConsumed = 0;
litter[] = {};
};
}; };
class Advanced { class Advanced {
@ -115,6 +142,7 @@ class ACE_Medical_Actions {
// Which locations can this treatment action be used? Available: Field, MedicalFacility, MedicalVehicle, All. // Which locations can this treatment action be used? Available: Field, MedicalFacility, MedicalVehicle, All.
treatmentLocations[] = {"All"}; treatmentLocations[] = {"All"};
allowedSelections[] = {"All"}; allowedSelections[] = {"All"};
allowSelfTreatment = 1;
// What is the level of medical skill required for this treatment action? 0 = all soldiers, 1 = medic, 2 = doctor // What is the level of medical skill required for this treatment action? 0 = all soldiers, 1 = medic, 2 = doctor
requiredMedic = 0; requiredMedic = 0;
// The time it takes for a treatment action to complete. Time is in seconds. // The time it takes for a treatment action to complete. Time is in seconds.
@ -188,6 +216,7 @@ class ACE_Medical_Actions {
displayName = CSTRING(Actions_Blood4_1000); displayName = CSTRING(Actions_Blood4_1000);
displayNameProgress = CSTRING(Transfusing_Blood); displayNameProgress = CSTRING(Transfusing_Blood);
allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"}; allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"};
allowSelfTreatment = 0;
category = "advanced"; category = "advanced";
items[] = {"ACE_bloodIV"}; items[] = {"ACE_bloodIV"};
requiredMedic = 1; requiredMedic = 1;
@ -238,6 +267,7 @@ class ACE_Medical_Actions {
category = "advanced"; category = "advanced";
items[] = {"ACE_surgicalKit"}; items[] = {"ACE_surgicalKit"};
treatmentLocations[] = {QGVAR(useLocation_SurgicalKit)}; treatmentLocations[] = {QGVAR(useLocation_SurgicalKit)};
allowSelfTreatment = 0;
requiredMedic = QGVAR(medicSetting_SurgicalKit); requiredMedic = QGVAR(medicSetting_SurgicalKit);
patientStateCondition = QGVAR(useCondition_SurgicalKit); patientStateCondition = QGVAR(useCondition_SurgicalKit);
treatmentTime = "(count ((_this select 1) getVariable ['ACE_Medical_bandagedWounds', []]) * 5)"; treatmentTime = "(count ((_this select 1) getVariable ['ACE_Medical_bandagedWounds', []]) * 5)";
@ -253,6 +283,7 @@ class ACE_Medical_Actions {
category = "advanced"; category = "advanced";
items[] = {"ACE_personalAidKit"}; items[] = {"ACE_personalAidKit"};
treatmentLocations[] = {QGVAR(useLocation_PAK)}; treatmentLocations[] = {QGVAR(useLocation_PAK)};
allowSelfTreatment = 0;
requiredMedic = QGVAR(medicSetting_PAK); requiredMedic = QGVAR(medicSetting_PAK);
patientStateCondition = QGVAR(useCondition_PAK); patientStateCondition = QGVAR(useCondition_PAK);
treatmentTime = QUOTE((_this select 1) call FUNC(treatmentAdvanced_fullHealTreatmentTime)); treatmentTime = QUOTE((_this select 1) call FUNC(treatmentAdvanced_fullHealTreatmentTime));
@ -297,6 +328,7 @@ class ACE_Medical_Actions {
displayName = CSTRING(Check_Response); displayName = CSTRING(Check_Response);
callbackSuccess = QUOTE(DFUNC(actionCheckResponse)); callbackSuccess = QUOTE(DFUNC(actionCheckResponse));
displayNameProgress = CSTRING(Check_Response_Content); displayNameProgress = CSTRING(Check_Response_Content);
allowSelfTreatment = 0;
}; };
class RemoveTourniquet: Tourniquet { class RemoveTourniquet: Tourniquet {
displayName = CSTRING(Actions_RemoveTourniquet); displayName = CSTRING(Actions_RemoveTourniquet);
@ -313,6 +345,7 @@ class ACE_Medical_Actions {
category = "advanced"; category = "advanced";
treatmentLocations[] = {"All"}; treatmentLocations[] = {"All"};
allowedSelections[] = {"body"}; allowedSelections[] = {"body"};
allowSelfTreatment = 0;
requiredMedic = 0; requiredMedic = 0;
treatmentTime = 15; treatmentTime = 15;
items[] = {}; items[] = {};
@ -334,6 +367,7 @@ class ACE_Medical_Actions {
displayNameProgress = CSTRING(PlacingInBodyBag); displayNameProgress = CSTRING(PlacingInBodyBag);
category = "advanced"; category = "advanced";
treatmentLocations[] = {"All"}; treatmentLocations[] = {"All"};
allowSelfTreatment = 0;
requiredMedic = 0; requiredMedic = 0;
treatmentTime = 15; treatmentTime = 15;
items[] = {"ACE_bodyBag"}; items[] = {"ACE_bodyBag"};
@ -605,6 +639,7 @@ class ACE_Medical_Advanced {
class vehiclecrash { class vehiclecrash {
thresholds[] = {{0.25, 5}}; thresholds[] = {{0.25, 5}};
selectionSpecific = 0; selectionSpecific = 0;
lethalDamage = 0.2;
}; };
class backblast { class backblast {
thresholds[] = {{0, 2},{0.55, 5}, {1, 6}}; thresholds[] = {{0, 2},{0.55, 5}, {1, 6}};
@ -622,6 +657,7 @@ class ACE_Medical_Advanced {
class falling { class falling {
thresholds[] = {{0.1, 1}}; thresholds[] = {{0.1, 1}};
selectionSpecific = 1; selectionSpecific = 1;
lethalDamage = 0.4;
}; };
class ropeburn { class ropeburn {
thresholds[] = {{0.1, 1}}; thresholds[] = {{0.1, 1}};

View File

@ -220,7 +220,7 @@ class ACE_Settings {
description = CSTRING(menuTypeDescription); description = CSTRING(menuTypeDescription);
typeName = "SCALAR"; typeName = "SCALAR";
value = 0; value = 0;
values[] = {CSTRING(useSelection)/*, CSTRING(useRadial)*/}; values[] = {CSTRING(useSelection), CSTRING(useRadial), "Disabled"};
// isClientSettable = 1; isClientSettable = 1;
}; };
}; };

View File

@ -2,12 +2,12 @@
#define MEDICAL_ACTION_DISTANCE 1.75 #define MEDICAL_ACTION_DISTANCE 1.75
class CfgVehicles { class CfgVehicles {
class Logic; class Logic;
class Module_F: Logic { class Module_F: Logic {
class ArgumentsBaseUnits { class ArgumentsBaseUnits {
}; };
}; };
class ACE_Module; class ACE_Module;
class ACE_moduleMedicalSettings: ACE_Module { class ACE_moduleMedicalSettings: ACE_Module {
scope = 2; scope = 2;
@ -19,6 +19,7 @@ class CfgVehicles {
isGlobal = 1; isGlobal = 1;
isTriggerActivated = 0; isTriggerActivated = 0;
author = ECSTRING(common,ACETeam); author = ECSTRING(common,ACETeam);
class Arguments { class Arguments {
class level { class level {
displayName = CSTRING(MedicalSettings_level_DisplayName); displayName = CSTRING(MedicalSettings_level_DisplayName);
@ -137,6 +138,7 @@ class CfgVehicles {
defaultValue = 1; defaultValue = 1;
}; };
}; };
class ModuleDescription { class ModuleDescription {
description = CSTRING(MedicalSettings_Module_Description); description = CSTRING(MedicalSettings_Module_Description);
sync[] = {}; sync[] = {};
@ -154,6 +156,7 @@ class CfgVehicles {
isTriggerActivated = 0; isTriggerActivated = 0;
isDisposable = 0; isDisposable = 0;
author = ECSTRING(common,ACETeam); author = ECSTRING(common,ACETeam);
class Arguments { class Arguments {
class enableFor { class enableFor {
displayName = CSTRING(AdvancedMedicalSettings_enableFor_DisplayName); displayName = CSTRING(AdvancedMedicalSettings_enableFor_DisplayName);
@ -256,13 +259,13 @@ class CfgVehicles {
defaultValue = 1; defaultValue = 1;
}; };
}; };
class ModuleDescription { class ModuleDescription {
description = CSTRING(AdvancedMedicalSettings_Module_Description); description = CSTRING(AdvancedMedicalSettings_Module_Description);
sync[] = {}; sync[] = {};
}; };
}; };
class ACE_moduleReviveSettings: ACE_Module { class ACE_moduleReviveSettings: ACE_Module {
scope = 2; scope = 2;
displayName = CSTRING(ReviveSettings_Module_DisplayName); displayName = CSTRING(ReviveSettings_Module_DisplayName);
@ -273,6 +276,7 @@ class CfgVehicles {
isGlobal = 1; isGlobal = 1;
isTriggerActivated = 0; isTriggerActivated = 0;
author = ECSTRING(common,ACETeam); author = ECSTRING(common,ACETeam);
class Arguments { class Arguments {
class enableRevive { class enableRevive {
displayName = CSTRING(ReviveSettings_enableRevive_DisplayName); displayName = CSTRING(ReviveSettings_enableRevive_DisplayName);
@ -298,11 +302,13 @@ class CfgVehicles {
defaultValue = -1; defaultValue = -1;
}; };
}; };
class ModuleDescription { class ModuleDescription {
description = CSTRING(ReviveSettings_Module_Description); description = CSTRING(ReviveSettings_Module_Description);
sync[] = {}; sync[] = {};
}; };
}; };
class ACE_moduleAssignMedicRoles: Module_F { class ACE_moduleAssignMedicRoles: Module_F {
scope = 2; scope = 2;
displayName = CSTRING(AssignMedicRoles_Module_DisplayName); displayName = CSTRING(AssignMedicRoles_Module_DisplayName);
@ -314,6 +320,7 @@ class CfgVehicles {
isTriggerActivated = 0; isTriggerActivated = 0;
isDisposable = 0; isDisposable = 0;
author = ECSTRING(common,ACETeam); author = ECSTRING(common,ACETeam);
class Arguments { class Arguments {
class EnableList { class EnableList {
displayName = CSTRING(AssignMedicRoles_EnableList_DisplayName); displayName = CSTRING(AssignMedicRoles_EnableList_DisplayName);
@ -342,6 +349,7 @@ class CfgVehicles {
}; };
}; };
}; };
class ModuleDescription { class ModuleDescription {
description = CSTRING(AssignMedicRoles_Module_Description); description = CSTRING(AssignMedicRoles_Module_Description);
sync[] = {}; sync[] = {};
@ -359,6 +367,7 @@ class CfgVehicles {
isTriggerActivated = 0; isTriggerActivated = 0;
isDisposable = 0; isDisposable = 0;
author = ECSTRING(common,ACETeam); author = ECSTRING(common,ACETeam);
class Arguments { class Arguments {
class EnableList { class EnableList {
displayName = CSTRING(AssignMedicVehicle_EnableList_DisplayName); displayName = CSTRING(AssignMedicVehicle_EnableList_DisplayName);
@ -384,11 +393,13 @@ class CfgVehicles {
}; };
}; };
}; };
class ModuleDescription { class ModuleDescription {
description = CSTRING(AssignMedicVehicle_Module_Description); description = CSTRING(AssignMedicVehicle_Module_Description);
sync[] = {}; sync[] = {};
}; };
}; };
class ACE_moduleAssignMedicalFacility: Module_F { class ACE_moduleAssignMedicalFacility: Module_F {
scope = 2; scope = 2;
displayName = CSTRING(AssignMedicalFacility_Module_DisplayName); displayName = CSTRING(AssignMedicalFacility_Module_DisplayName);
@ -400,6 +411,7 @@ class CfgVehicles {
isTriggerActivated = 0; isTriggerActivated = 0;
isDisposable = 0; isDisposable = 0;
author = ECSTRING(common,ACETeam); author = ECSTRING(common,ACETeam);
class Arguments { class Arguments {
class enabled { class enabled {
displayName = CSTRING(AssignMedicalFacility_enabled_DisplayName); displayName = CSTRING(AssignMedicalFacility_enabled_DisplayName);
@ -407,70 +419,52 @@ class CfgVehicles {
typeName = "BOOL"; typeName = "BOOL";
}; };
}; };
class ModuleDescription { class ModuleDescription {
description = CSTRING(AssignMedicalFacility_Module_Description); description = CSTRING(AssignMedicalFacility_Module_Description);
sync[] = {}; sync[] = {};
}; };
}; };
#define ARM_LEG_ARMOR_DEFAULT 2 #define ARM_LEG_ARMOR_DEFAULT 3
#define ARM_LEG_ARMOR_BETTER 3 #define ARM_LEG_ARMOR_BETTER 5
#define ARM_LEG_ARMOR_CSAT 4 #define ARM_LEG_ARMOR_CSAT 4
class Man; class Land;
class CAManBase: Man { class Man: Land {
class HitPoints { class HitPoints;
class HitHead; };
class HitBody;
// "DEACTIVE" DEFAULT HITPOINTS
class HitHands {
armor = 999; //armor = 2;
explosionShielding = 0; //explosionShielding = 1;
material = -1;
minimalHit = 0;
name = "";
passThrough = 1;
radius = 0; //radius = 0.06;
visual = "injury_hands";
};
class HitLegs {
armor = 999; //armor = 2;
explosionShielding = 0; //explosionShielding = 1;
material = -1;
minimalHit = 0;
name = "";
passThrough = 1;
radius = 0; //radius = 0.08;
visual = "injury_legs";
};
class CAManBase: Man {
class HitPoints: HitPoints { // custom hitpoints. addons might want to adjust these accordingly
class HitLeftArm { class HitLeftArm {
armor = ARM_LEG_ARMOR_DEFAULT; //2; armor = ARM_LEG_ARMOR_DEFAULT;
explosionShielding = 1;
material = -1; material = -1;
minimalHit = 0; name = "hand_l"; // @todo hopefully these still include the whole arm + hands
name = "hand_l";
passThrough = 1;
radius = 0.06;
visual = "injury_hands";
};
class HitRightArm: HitLeftArm {
name = "hand_r";
};
class HitLeftLeg {
armor = ARM_LEG_ARMOR_DEFAULT; //2;
explosionShielding = 1;
material = -1;
minimalHit = 0;
name = "leg_l";
passThrough = 1; passThrough = 1;
radius = 0.08; radius = 0.08;
explosionShielding = 1;
visual = "injury_hands";
minimalHit = 0.01;
};
class HitRightArm: HitLeftArm {
name = "hand_r"; // @todo hopefully these still include the whole arm + hands
};
class HitLeftLeg {
armor = ARM_LEG_ARMOR_DEFAULT;
material = -1;
name = "leg_l";
passThrough = 1;
radius = 0.1;
explosionShielding = 1;
visual = "injury_legs"; visual = "injury_legs";
minimalHit = 0.01;
}; };
class HitRightLeg: HitLeftLeg { class HitRightLeg: HitLeftLeg {
name = "leg_r"; name = "leg_r";
}; };
}; };
class ACE_SelfActions { class ACE_SelfActions {
#include "ACE_Medical_SelfActions.hpp" #include "ACE_Medical_SelfActions.hpp"
}; };
@ -529,23 +523,19 @@ class CfgVehicles {
class B_Soldier_04_f: B_Soldier_base_F { class B_Soldier_04_f: B_Soldier_base_F {
class HitPoints: HitPoints { class HitPoints: HitPoints {
class HitHead: HitHead {}; class HitHead;
class HitBody: HitBody {}; class HitBody;
class HitHands: HitHands {}; class HitHands;
class HitLegs: HitLegs {}; class HitLegs;
class HitLeftArm: HitLeftArm { class HitLeftArm: HitLeftArm {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
class HitRightArm: HitRightArm { class HitRightArm: HitRightArm {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
class HitLeftLeg: HitLeftLeg { class HitLeftLeg: HitLeftLeg {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
class HitRightLeg: HitRightLeg { class HitRightLeg: HitRightLeg {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
@ -554,23 +544,19 @@ class CfgVehicles {
class B_Soldier_05_f: B_Soldier_base_F { class B_Soldier_05_f: B_Soldier_base_F {
class HitPoints: HitPoints { class HitPoints: HitPoints {
class HitHead: HitHead {}; class HitHead;
class HitBody: HitBody {}; class HitBody;
class HitHands: HitHands {}; class HitHands;
class HitLegs: HitLegs {}; class HitLegs;
class HitLeftArm: HitLeftArm { class HitLeftArm: HitLeftArm {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
class HitRightArm: HitRightArm { class HitRightArm: HitRightArm {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
class HitLeftLeg: HitLeftLeg { class HitLeftLeg: HitLeftLeg {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
class HitRightLeg: HitRightLeg { class HitRightLeg: HitRightLeg {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
@ -581,23 +567,19 @@ class CfgVehicles {
class I_Soldier_03_F: I_Soldier_base_F { class I_Soldier_03_F: I_Soldier_base_F {
class HitPoints: HitPoints { class HitPoints: HitPoints {
class HitHead: HitHead {}; class HitHead;
class HitBody: HitBody {}; class HitBody;
class HitHands: HitHands {}; class HitHands;
class HitLegs: HitLegs {}; class HitLegs;
class HitLeftArm: HitLeftArm { class HitLeftArm: HitLeftArm {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
class HitRightArm: HitRightArm { class HitRightArm: HitRightArm {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
class HitLeftLeg: HitLeftLeg { class HitLeftLeg: HitLeftLeg {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
class HitRightLeg: HitRightLeg { class HitRightLeg: HitRightLeg {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
@ -606,23 +588,19 @@ class CfgVehicles {
class I_Soldier_04_F: I_Soldier_base_F { class I_Soldier_04_F: I_Soldier_base_F {
class HitPoints: HitPoints { class HitPoints: HitPoints {
class HitHead: HitHead {}; class HitHead;
class HitBody: HitBody {}; class HitBody;
class HitHands: HitHands {}; class HitHands;
class HitLegs: HitLegs {}; class HitLegs;
class HitLeftArm: HitLeftArm { class HitLeftArm: HitLeftArm {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
class HitRightArm: HitRightArm { class HitRightArm: HitRightArm {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
class HitLeftLeg: HitLeftLeg { class HitLeftLeg: HitLeftLeg {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
class HitRightLeg: HitRightLeg { class HitRightLeg: HitRightLeg {
armor = ARM_LEG_ARMOR_BETTER; armor = ARM_LEG_ARMOR_BETTER;
}; };
@ -631,61 +609,88 @@ class CfgVehicles {
class O_Soldier_base_F: SoldierEB { class O_Soldier_base_F: SoldierEB {
class HitPoints: HitPoints { class HitPoints: HitPoints {
class HitHead: HitHead {}; class HitHead;
class HitBody: HitBody {}; class HitBody;
class HitHands: HitHands {}; class HitHands;
class HitLegs: HitLegs {}; class HitLegs;
class HitLeftArm: HitLeftArm { class HitLeftArm: HitLeftArm {
armor = ARM_LEG_ARMOR_CSAT; armor = ARM_LEG_ARMOR_CSAT;
passThrough = 0.85;
}; };
class HitRightArm: HitRightArm { class HitRightArm: HitRightArm {
armor = ARM_LEG_ARMOR_CSAT; armor = ARM_LEG_ARMOR_CSAT;
passThrough = 0.85;
}; };
class HitLeftLeg: HitLeftLeg { class HitLeftLeg: HitLeftLeg {
armor = ARM_LEG_ARMOR_CSAT; armor = ARM_LEG_ARMOR_CSAT;
passThrough = 0.85;
}; };
class HitRightLeg: HitRightLeg { class HitRightLeg: HitRightLeg {
armor = ARM_LEG_ARMOR_CSAT; armor = ARM_LEG_ARMOR_CSAT;
passThrough = 0.85;
}; };
}; };
}; };
class O_Soldier_02_F: O_Soldier_base_F { class O_Soldier_02_F: O_Soldier_base_F {
class HitPoints: HitPoints { class HitPoints: HitPoints {
class HitHead: HitHead {}; class HitHead;
class HitBody: HitBody {}; class HitBody;
class HitHands: HitHands {}; class HitHands;
class HitLegs: HitLegs {}; class HitLegs;
class HitLeftArm: HitLeftArm { class HitLeftArm: HitLeftArm {
armor = ARM_LEG_ARMOR_CSAT; armor = ARM_LEG_ARMOR_CSAT;
passThrough = 0.85;
}; };
class HitRightArm: HitRightArm { class HitRightArm: HitRightArm {
armor = ARM_LEG_ARMOR_CSAT; armor = ARM_LEG_ARMOR_CSAT;
passThrough = 0.85;
}; };
class HitLeftLeg: HitLeftLeg { class HitLeftLeg: HitLeftLeg {
armor = ARM_LEG_ARMOR_CSAT; armor = ARM_LEG_ARMOR_CSAT;
passThrough = 0.85;
}; };
class HitRightLeg: HitRightLeg { class HitRightLeg: HitRightLeg {
armor = ARM_LEG_ARMOR_CSAT; armor = ARM_LEG_ARMOR_CSAT;
passThrough = 0.85;
}; };
}; };
}; };
class O_officer_F: O_Soldier_base_F {
class HitPoints: HitPoints {
class HitHead;
class HitBody;
class HitHands;
class HitLegs;
class HitLeftArm: HitLeftArm {
armor = ARM_LEG_ARMOR_CSAT; // @todo is that suppossed to be the case?
};
class HitRightArm: HitRightArm {
armor = ARM_LEG_ARMOR_CSAT;
};
class HitLeftLeg: HitLeftLeg {
armor = ARM_LEG_ARMOR_CSAT;
};
class HitRightLeg: HitRightLeg {
armor = ARM_LEG_ARMOR_CSAT;
};
};
};
class O_Protagonist_VR_F: O_Soldier_base_F {
class HitPoints: HitPoints {
class HitHead;
class HitBody;
class HitHands;
class HitLegs;
class HitLeftArm: HitLeftArm {
armor = 2;
};
class HitRightArm: HitRightArm {
armor = 2;
};
class HitLeftLeg: HitLeftLeg {
armor = 2;
};
class HitRightLeg: HitRightLeg {
armor = 2;
};
};
};
class MapBoard_altis_F; class MapBoard_altis_F;
class ACE_bodyBagObject: MapBoard_altis_F { class ACE_bodyBagObject: MapBoard_altis_F {
XEH_ENABLED; XEH_ENABLED;

View File

@ -1,10 +1,12 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit"]; params ["_unit"];
_unit = _this select 0;
_unit addEventHandler ["HandleDamage", {_this call FUNC(handleDamage)}]; _unit addEventHandler ["HandleDamage", {_this call FUNC(handleDamage)}];
if (local _unit) then { if (local _unit) then {
[_unit] call FUNC(init); if (!EGVAR(common,settingsInitFinished)) exitWith {
EGVAR(common,runAtSettingsInitialized) pushBack [FUNC(init), [_unit]];
};
[_unit] call FUNC(init);
}; };

View File

@ -11,10 +11,9 @@ GVAR(heartBeatSounds_Slow) = ["ACE_heartbeat_slow_1", "ACE_heartbeat_slow_2"];
["interactMenuClosed", {[objNull, false] call FUNC(displayPatientInformation); }] call EFUNC(common,addEventHandler); ["interactMenuClosed", {[objNull, false] call FUNC(displayPatientInformation); }] call EFUNC(common,addEventHandler);
["medical_onUnconscious", { ["medical_onUnconscious", {
if (local (_this select 0)) then { params ["_unit", "_status"];
private ["_unit"]; if (local _unit) then {
_unit = _this select 0; if (_status) then {
if (_this select 1) then {
_unit setVariable ["tf_globalVolume", 0.4]; _unit setVariable ["tf_globalVolume", 0.4];
_unit setVariable ["tf_voiceVolume", 0, true]; _unit setVariable ["tf_voiceVolume", 0, true];
_unit setVariable ["tf_unable_to_use_radio", true, true]; _unit setVariable ["tf_unable_to_use_radio", true, true];
@ -35,10 +34,8 @@ GVAR(heartBeatSounds_Slow) = ["ACE_heartbeat_slow_1", "ACE_heartbeat_slow_2"];
// Initialize all effects // Initialize all effects
_fnc_createEffect = { _fnc_createEffect = {
private ["_type", "_layer", "_default", "_effect"]; private "_effect";
_type = _this select 0; params ["_type", "_layer", "_default"];
_layer = _this select 1;
_default = _this select 2;
_effect = ppEffectCreate [_type, _layer]; _effect = ppEffectCreate [_type, _layer];
_effect ppEffectForceInNVG true; _effect ppEffectForceInNVG true;
@ -245,30 +242,28 @@ GVAR(lastHeartBeatSound) = ACE_time;
}, 0, []] call CBA_fnc_addPerFrameHandler; }, 0, []] call CBA_fnc_addPerFrameHandler;
if (USE_WOUND_EVENT_SYNC) then {
// broadcast injuries to JIP clients in a MP session
if (isMultiplayer && hasInterface) then {
["playerChanged", {
EXPLODE_2_PVT(_this,_newPlayer,_oldPlayer);
if (alive _newPlayer) then {
// We are only pulling the wounds for the units in the player group. Anything else will come when the unit interacts with them.
{
[_x, _newPlayer] call FUNC(requestWoundSync);
}foreach units group _newPlayer;
};
}] call EFUNC(common,addEventhandler);
};
};
[ ["SettingsInitialized", {
{(((_this select 0) getvariable [QGVAR(bloodVolume), 100]) < 65)}, if (GVAR(level) == 2) exitwith {
{(((_this select 0) getvariable [QGVAR(pain), 0]) - ((_this select 0) getvariable [QGVAR(painSuppress), 0])) > 0.9}, [
{(([_this select 0] call FUNC(getBloodLoss)) > 0.25)}, {(((_this select 0) getvariable [QGVAR(bloodVolume), 100]) < 65)},
{((_this select 0) getvariable [QGVAR(inReviveState), false])}, {(((_this select 0) getvariable [QGVAR(pain), 0]) - ((_this select 0) getvariable [QGVAR(painSuppress), 0])) > 0.9},
{((_this select 0) getvariable [QGVAR(inCardiacArrest), false])}, {(([_this select 0] call FUNC(getBloodLoss)) > 0.25)},
{((_this select 0) getvariable ["ACE_isDead", false])}, {((_this select 0) getvariable [QGVAR(inReviveState), false])},
{(((_this select 0) getvariable [QGVAR(airwayStatus), 100]) < 80)} {((_this select 0) getvariable [QGVAR(inCardiacArrest), false])},
] call FUNC(addUnconsciousCondition); {((_this select 0) getvariable ["ACE_isDead", false])},
{(((_this select 0) getvariable [QGVAR(airwayStatus), 100]) < 80)}
] call FUNC(addUnconsciousCondition);
};
[
{(((_this select 0) getvariable [QGVAR(bloodVolume), 100]) < 40)},
{(((_this select 0) getvariable [QGVAR(pain), 0]) - ((_this select 0) getvariable [QGVAR(painSuppress), 0])) > 0.6},
{(([_this select 0] call FUNC(getBloodLoss)) > 0.1)},
{((_this select 0) getvariable [QGVAR(inReviveState), false])},
{((_this select 0) getvariable ["ACE_isDead", false])}
] call FUNC(addUnconsciousCondition);
}] call EFUNC(common,addEventHandler);
// Prevent all types of interaction while unconscious // Prevent all types of interaction while unconscious
// @todo: probably remove this when CBA keybind hold key works properly // @todo: probably remove this when CBA keybind hold key works properly

View File

@ -68,6 +68,7 @@ PREP(selectionNameToNumber);
PREP(setCardiacArrest); PREP(setCardiacArrest);
PREP(setDead); PREP(setDead);
PREP(setHitPointDamage); PREP(setHitPointDamage);
PREP(setStructuralDamage);
PREP(setUnconscious); PREP(setUnconscious);
PREP(treatment); PREP(treatment);
PREP(treatment_failure); PREP(treatment_failure);
@ -83,6 +84,7 @@ PREP(treatmentAdvanced_medication);
PREP(treatmentAdvanced_medicationLocal); PREP(treatmentAdvanced_medicationLocal);
PREP(treatmentAdvanced_surgicalKit_onProgress); PREP(treatmentAdvanced_surgicalKit_onProgress);
PREP(treatmentBasic_bandage); PREP(treatmentBasic_bandage);
PREP(treatmentBasic_bandageLocal);
PREP(treatmentBasic_bloodbag); PREP(treatmentBasic_bloodbag);
PREP(treatmentBasic_bloodbagLocal); PREP(treatmentBasic_bloodbagLocal);
PREP(treatmentBasic_epipen); PREP(treatmentBasic_epipen);

View File

@ -1,11 +1,8 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit"]; params ["_unit"];
_unit = _this select 0;
if !(local _unit) exitWith {};
// reset all variables. @todo GROUP respawn?
[_unit] call FUNC(init); [_unit] call FUNC(init);
// Reset captive status for respawning unit // Reset captive status for respawning unit

View File

@ -7,15 +7,12 @@
* 1: The patient <OBJECT> * 1: The patient <OBJECT>
* *
* Return Value: * Return Value:
* NONE * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_caller","_target","_selectionName"]; params ["_caller", "_target", "_selectionName"];
_caller = _this select 0;
_target = _this select 1;
_selectionName = _this select 2;
[[_caller, _target, _selectionName], QUOTE(DFUNC(actionCheckBloodPressureLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ [[_caller, _target, _selectionName], QUOTE(DFUNC(actionCheckBloodPressureLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */

View File

@ -7,25 +7,22 @@
* 1: The patient <OBJECT> * 1: The patient <OBJECT>
* *
* Return Value: * Return Value:
* NONE * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_caller","_target","_selectionName","_bloodPressure","_bloodPressureHigh","_bloodPressureLow", "_logOutPut", "_output"]; private ["_bloodPressure", "_logOutPut", "_output"];
_caller = _this select 0; params ["_caller", "_target", "_selectionName"];
_target = _this select 1;
_selectionName = _this select 2;
_bloodPressure = [_target] call FUNC(getBloodPressure); _bloodPressure = if (!alive _target) then {
if (!alive _target) then { [0,0]
_bloodPressure = [0,0]; } else {
[_target] call FUNC(getBloodPressure)
}; };
_bloodPressure params ["_bloodPressureHigh", "_bloodPressureLow"];
_bloodPressureHigh = _bloodPressure select 1;
_bloodPressureLow = _bloodPressure select 0;
_output = ""; _output = "";
_logOutPut = ""; _logOutPut = "";
if ([_caller] call FUNC(isMedic)) then { if ([_caller] call FUNC(isMedic)) then {

View File

@ -7,15 +7,13 @@
* 1: The patient <OBJECT> * 1: The patient <OBJECT>
* *
* Return Value: * Return Value:
* NONE * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_caller","_target","_selectionName"]; params ["_caller","_target", "_selectionName"];
_caller = _this select 0;
_target = _this select 1;
_selectionName = _this select 2;
[[_caller, _target, _selectionName], QUOTE(DFUNC(actionCheckPulseLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ [[_caller, _target, _selectionName], QUOTE(DFUNC(actionCheckPulseLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */

View File

@ -7,17 +7,15 @@
* 1: The patient <OBJECT> * 1: The patient <OBJECT>
* *
* Return Value: * Return Value:
* NONE * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_caller", "_unit", "_selectionName", "_heartRateOutput", "_heartRate", "_logOutPut"]; private ["_heartRateOutput", "_heartRate", "_logOutPut"];
_caller = _this select 0; params ["_caller", "_unit", "_selectionName"];
_unit = _this select 1;
_selectionName = _this select 2;
_heartRate = _unit getvariable [QGVAR(heartRate), 80]; _heartRate = _unit getvariable [QGVAR(heartRate), 80];
if (!alive _unit) then { if (!alive _unit) then {

View File

@ -7,23 +7,17 @@
* 1: The patient <OBJECT> * 1: The patient <OBJECT>
* *
* Return Value: * Return Value:
* NONE * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_caller","_target", "_output"]; private ["_output"];
_caller = _this select 0; params ["_caller", "_target"];
_target = _this select 1;
_output = ""; _output = [LSTRING(Check_Response_Unresponsive), LSTRING(Check_Response_Responsive)] select ([_target] call EFUNC(common,isAwake));
if ([_target] call EFUNC(common,isAwake)) then {
_output = LSTRING(Check_Response_Responsive);
} else {
_output = LSTRING(Check_Response_Unresponsive);
};
["displayTextStructured", [_caller], [[_output, [_target] call EFUNC(common,getName)], 2, _caller]] call EFUNC(common,targetEvent); ["displayTextStructured", [_caller], [[_output, [_target] call EFUNC(common,getName)], 2, _caller]] call EFUNC(common,targetEvent);

View File

@ -7,16 +7,15 @@
* 1: The patient <OBJECT> * 1: The patient <OBJECT>
* *
* Return Value: * Return Value:
* NONE * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_caller", "_target", "_genericMessages"]; private "_genericMessages";
_caller = _this select 0; params ["_caller", "_target"];
_target = _this select 1;
_genericMessages = [LSTRING(diagnoseMessage)]; _genericMessages = [LSTRING(diagnoseMessage)];

View File

@ -7,20 +7,18 @@
* 1: The patient <OBJECT> * 1: The patient <OBJECT>
* *
* Return Value: * Return Value:
* NONE * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_caller", "_target","_vehicle"]; private "_vehicle";
_caller = _this select 0; params ["_caller", "_target"];
_target = _this select 1;
if ([_target] call EFUNC(common,isAwake)) exitwith { if ([_target] call EFUNC(common,isAwake)) exitwith {
// TODO localization ["displayTextStructured", [_caller], [[LSTRING(CanNotLoaded), [_target] call EFUNC(common,getName)], 1.5, _caller]] call EFUNC(common,targetEvent);
["displayTextStructured", [_caller], [["This person (%1) is awake and cannot be loaded", [_target] call EFUNC(common,getName)], 1.5, _caller]] call EFUNC(common,targetEvent);
}; };
if ([_target] call FUNC(isBeingCarried)) then { if ([_target] call FUNC(isBeingCarried)) then {
[_caller, _target] call EFUNC(dragging,dropObject_carry); [_caller, _target] call EFUNC(dragging,dropObject_carry);

View File

@ -14,9 +14,8 @@
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_2(_caller,_target);
private ["_position", "_headPos", "_spinePos", "_dirVect", "_direction", "_bodyBag"]; private ["_position", "_headPos", "_spinePos", "_dirVect", "_direction", "_bodyBag"];
params ["_caller", "_target"];
if (alive _target) then { if (alive _target) then {
[_target, true] call FUNC(setDead); [_target, true] call FUNC(setDead);

View File

@ -8,17 +8,15 @@
* 2: SelectionName <STRING> * 2: SelectionName <STRING>
* *
* Return Value: * Return Value:
* NONE * None
* *
* Public: Yes * Public: Yes
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_caller", "_target", "_part", "_selectionName", "_tourniquets", "_output"]; private ["_part", "_tourniquets", "_output"];
_caller = _this select 0; params ["_caller", "_target", "_selectionName"];
_target = _this select 1;
_selectionName = _this select 2;
// grab the required data // grab the required data
_part = [_selectionName] call FUNC(selectionNameToNumber); _part = [_selectionName] call FUNC(selectionNameToNumber);
@ -26,7 +24,7 @@ _tourniquets = _target getvariable [QGVAR(tourniquets), [0,0,0,0,0,0]];
// Check if there is a tourniquet on this bodypart // Check if there is a tourniquet on this bodypart
if ((_tourniquets select _part) == 0) exitwith { if ((_tourniquets select _part) == 0) exitwith {
_output = "There is no tourniquet on this body part!"; _output = LSTRING(noTourniquetOnBodyPart);
["displayTextStructured", [_caller], [_output, 1.5, _caller]] call EFUNC(common,targetEvent); ["displayTextStructured", [_caller], [_output, 1.5, _caller]] call EFUNC(common,targetEvent);
}; };

View File

@ -5,23 +5,20 @@
* Arguments: * Arguments:
* 0: The medic <OBJECT> * 0: The medic <OBJECT>
* 1: The patient <OBJECT> * 1: The patient <OBJECT>
* 2: Drag after unload <BOOL> <OPTIONAL> * 2: Drag after unload <BOOL> (default: false)
* *
* Return Value: * Return Value:
* NONE * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_caller", "_target", "_drag"]; params ["_caller", "_target", ["_drag", false]];
_caller = _this select 0;
_target = _this select 1;
_drag = if (count _this > 2) then {_this select 2} else {false};
// cannot unload a unit not in a vehicle. // cannot unload a unit not in a vehicle.
if (vehicle _target == _target) exitwith {}; if (vehicle _target == _target) exitwith {};
if (([_target] call EFUNC(common,isAwake))) exitwith {}; if (([_target] call EFUNC(common,isAwake))) exitwith {};
["unloadPersonEvent", _target, [_target, vehicle _target]] call EFUNC(common,targetEvent) ["unloadPersonEvent", _target, [_target, vehicle _target]] call EFUNC(common,targetEvent)

View File

@ -9,18 +9,15 @@
* 3: callback <CODE> * 3: callback <CODE>
* *
* Return Value: * Return Value:
* nil * None
* *
* Public: Yes * Public: Yes
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_value", "_time", "_adjustment", "_callBack"];
_unit = [_this, 0, objNull, [objNull]] call BIS_fnc_Param; params [["_unit", objNull, [objNull]], ["_value", 0, [0]], ["_time", 1, [0]], ["_callBack", {}, [{}]]];
_value = [_this, 1, 0, [0]] call BIS_fnc_Param;
_time = [_this, 2, 1, [0]] call BIS_fnc_Param;
_callBack = [_this, 3, {}, [{}]] call BIS_fnc_Param;
_adjustment = _unit getvariable [QGVAR(heartRateAdjustments), []]; _adjustment = _unit getvariable [QGVAR(heartRateAdjustments), []];
_adjustment pushback [_value, _time, _callBack]; _adjustment pushback [_value, _time, _callBack];

View File

@ -6,16 +6,14 @@
* 0: The Unit <OBJECT> * 0: The Unit <OBJECT>
* *
* ReturnValue: * ReturnValue:
* <NIL> * None
* *
* Public: Yes * Public: Yes
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_force"]; params ["_unit", ["_force", false]];
_unit = _this select 0;
_force = if (count _this > 1) then {_this select 1} else {false};
if ([_unit] call FUNC(hasMedicalEnabled) || _force) then { if ([_unit] call FUNC(hasMedicalEnabled) || _force) then {
@ -27,13 +25,13 @@ if ([_unit] call FUNC(hasMedicalEnabled) || _force) then {
_unit setvariable [QGVAR(addedToUnitLoop), true, true]; _unit setvariable [QGVAR(addedToUnitLoop), true, true];
[{ [{
private ["_unit", "_interval"]; params ["_args", "_idPFH"];
_unit = (_this select 0) select 0; _args params ["_unit", "_interval"];
_interval = ACE_time - ((_this select 0) select 1); _interval = ACE_time - _interval;
(_this select 0) set [1, ACE_time]; (_this select 0) set [1, ACE_time];
if (!alive _unit || !local _unit) then { if (!alive _unit || !local _unit) then {
[_this select 1] call CBA_fnc_removePerFrameHandler; [_idPFH] call CBA_fnc_removePerFrameHandler;
if (!local _unit) then { if (!local _unit) then {
if (GVAR(level) >= 2) then { if (GVAR(level) >= 2) then {
_unit setvariable [QGVAR(heartRate), _unit getvariable [QGVAR(heartRate), 80], true]; _unit setvariable [QGVAR(heartRate), _unit getvariable [QGVAR(heartRate), 80], true];
@ -47,9 +45,12 @@ if ([_unit] call FUNC(hasMedicalEnabled) || _force) then {
private "_pain"; private "_pain";
_pain = _unit getvariable [QGVAR(pain), 0]; _pain = _unit getvariable [QGVAR(pain), 0];
if (_pain > (_unit getvariable [QGVAR(painSuppress), 0])) then { if (_pain > (_unit getvariable [QGVAR(painSuppress), 0])) then {
if (_pain > 0.7 && {random(1) > 0.6}) then { // This introduces wierd unconscious behaviour for basic medical and possibly also advanced.
// TODO This is disabled as it's considered non critical code.
// We will need to decide if we want unconscious triggered on high pain levels or if we can get rid of this entirely.
/*if (_pain > 0.7 && {random(1) > 0.6}) then {
[_unit] call FUNC(setUnconscious); [_unit] call FUNC(setUnconscious);
}; };*/
[_unit, _pain] call FUNC(playInjuredSound); [_unit, _pain] call FUNC(playInjuredSound);
}; };

View File

@ -9,28 +9,24 @@
* 3: The arguments for localization <ARRAY> * 3: The arguments for localization <ARRAY>
* *
* Return Value: * Return Value:
* nil * None
* *
* Public: Yes * Public: Yes
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_type", "_message", "_arguments", "_lastNumber", "_moment", "_logVarName", "_log","_newLog", "_logs"]; private ["_moment", "_logVarName", "_log","_newLog", "_logs"];
_unit = _this select 0; params ["_unit", "_type", "_message", "_arguments"];
_type = _this select 1;
_message = _this select 2;
_arguments = _this select 3;
if (!local _unit) exitwith { if (!local _unit) exitwith {
[_this, QUOTE(DFUNC(addToLog)), _unit] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ [_this, QFUNC(addToLog), _unit] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */
}; };
_lastNumber = date select 4; date params ["", "", "", "_minute", "_hour"];
_moment = format["%1:%2",date select 3, _lastNumber];
if (_lastNumber < 10) then { _moment = format [ (["%1:%2", "%1:0%2"] select (_minute < 10)), _hour, _minute];
_moment = format["%1:0%2",date select 3, _lastNumber];
};
_logVarName = format[QGVAR(logFile_%1), _type]; _logVarName = format[QGVAR(logFile_%1), _type];
_log = _unit getvariable [_logVarName, []]; _log = _unit getvariable [_logVarName, []];
@ -41,10 +37,10 @@ if (count _log >= 8) then {
if (_foreachIndex > 0) then { if (_foreachIndex > 0) then {
_newLog pushback _x; _newLog pushback _x;
}; };
}foreach _log; } foreach _log;
_log = _newLog; _log = _newLog;
}; };
_log pushback [_message,_moment,_type, _arguments]; _log pushback [_message, _moment, _type, _arguments];
_unit setvariable [_logVarName, _log, true]; _unit setvariable [_logVarName, _log, true];
["medical_onLogEntryAdded", [_unit, _type, _message, _arguments]] call EFUNC(common,localEvent); ["medical_onLogEntryAdded", [_unit, _type, _message, _arguments]] call EFUNC(common,localEvent);

View File

@ -7,16 +7,15 @@
* 1: The new item classname <STRING> * 1: The new item classname <STRING>
* *
* Return Value: * Return Value:
* nil * None
* *
* Public: Yes * Public: Yes
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_newItem", "_log", "_inList", "_amount"]; private ["_log", "_inList", "_amount"];
_unit = _this select 0; params ["_unit", "_newItem"];
_newItem = _this select 1;
if (!local _unit) exitwith { if (!local _unit) exitwith {
[_this, QUOTE(DFUNC(addToTriageList)), _unit] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ [_this, QUOTE(DFUNC(addToTriageList)), _unit] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */
@ -36,7 +35,7 @@ _amount = 1;
_amount = (_info select 1); _amount = (_info select 1);
_inList = true; _inList = true;
}; };
}foreach _log; } foreach _log;
if (!_inList) then { if (!_inList) then {
_log pushback [_newItem, 1, ACE_time]; _log pushback [_newItem, 1, ACE_time];

View File

@ -3,14 +3,13 @@
* Adds new condition for the unconscious state. Conditions are not actively checked for units unless unit is in unconscious state. * Adds new condition for the unconscious state. Conditions are not actively checked for units unless unit is in unconscious state.
* *
* Arguments: * Arguments:
* 0: Code, should return a boolean <CODE> * 0-N: Code, should return a boolean <CODE>
* *
* ReturnValue: * ReturnValue:
* <NIL> * None
* *
* Public: Yes * Public: Yes
*/ */
#include "script_component.hpp" #include "script_component.hpp"
if (isnil QGVAR(unconsciousConditions)) then { if (isnil QGVAR(unconsciousConditions)) then {
@ -21,5 +20,5 @@ if (typeName _this == typeName []) then {
if (typeName _x == typeName {}) then { if (typeName _x == typeName {}) then {
GVAR(unconsciousConditions) pushback _x; GVAR(unconsciousConditions) pushback _x;
}; };
}foreach _this; } foreach _this;
}; };

View File

@ -13,8 +13,7 @@
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
params ["_vehicle", "_player", "_parameters"];
EXPLODE_3_PVT(_this,_vehicle,_player,_parameters);
private ["_actions", "_unit"]; private ["_actions", "_unit"];
_actions = []; _actions = [];

View File

@ -18,10 +18,10 @@
private ["_pain"]; private ["_pain"];
PARAMS_2(_unit,_addedPain); params ["_unit", "_addedPain"];
//Only run on local units: //Only run on local units:
if (!local _unit) exitWith {ERROR("unit is not local");}; if (!local _unit) exitWith {ERROR("unit is not local");};
TRACE_3("ACE_DEBUG: adjustPainLevel Called",_unit, _pain, _addedPain);
//Ignore if medical system disabled: //Ignore if medical system disabled:
if (GVAR(level) == 0) exitWith {}; if (GVAR(level) == 0) exitWith {};

View File

@ -14,9 +14,8 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_target", "_caller", "_accessLevel", "_return"]; private ["_accessLevel", "_return"];
_caller = _this select 0; params ["_caller", "_target"];
_target = _this select 1;
_accessLevel = _target getvariable [QGVAR(allowSharedEquipmentAccess), -1]; _accessLevel = _target getvariable [QGVAR(allowSharedEquipmentAccess), -1];
@ -28,4 +27,4 @@ if (_accessLevel >= 0) then {
if (_accessLevel == 2) exitwith { _return = (group _target == group _caller); }; if (_accessLevel == 2) exitwith { _return = (group _target == group _caller); };
}; };
_return; _return;

View File

@ -16,36 +16,35 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_caller", "_target", "_selectionName", "_className", "_config", "_medicRequired", "_items", "_locations", "_return", "_condition", "_patientStateCondition", "_allowedSelections"]; private ["_config", "_medicRequired", "_items", "_locations", "_return", "_condition", "_patientStateCondition", "_allowedSelections"];
_caller = _this select 0; params ["_caller", "_target", "_selectionName", "_className"];
_target = _this select 1;
_selectionName = _this select 2;
_className = _this select 3;
if !(_target isKindOf "CAManBase") exitWith {false}; if !(_target isKindOf "CAManBase") exitWith { false };
_config = (ConfigFile >> "ACE_Medical_Actions" >> (["Basic", "Advanced"] select (GVAR(level)>=2)) >> _className);
_config = (ConfigFile >> "ACE_Medical_Actions" >> "Basic" >> _className);
if (GVAR(level)>=2) then {
_config = (ConfigFile >> "ACE_Medical_Actions" >> "Advanced" >> _className);
};
if !(isClass _config) exitwith {false}; if !(isClass _config) exitwith {false};
// Allow self treatment check
if (_caller == _target && {getNumber (_config >> "allowSelfTreatment") == 0}) exitwith {false};
_medicRequired = if (isNumber (_config >> "requiredMedic")) then { _medicRequired = if (isNumber (_config >> "requiredMedic")) then {
getNumber (_config >> "requiredMedic"); getNumber (_config >> "requiredMedic");
} else { } else {
// Check for required class // Check for required class
if (isText (_config >> "requiredMedic")) exitwith { if (isText (_config >> "requiredMedic")) exitwith {
missionNamespace getvariable [(getText (_config >> "requiredMedic")), 0]; missionNamespace getvariable [(getText (_config >> "requiredMedic")), 0]
}; };
0; 0;
}; };
if !([_caller, _medicRequired] call FUNC(isMedic)) exitwith {false}; if !([_caller, _medicRequired] call FUNC(isMedic)) exitwith { false };
_items = getArray (_config >> "items"); _items = getArray (_config >> "items");
if (count _items > 0 && {!([_caller, _target, _items] call FUNC(hasItems))}) exitwith {false}; if (count _items > 0 && {!([_caller, _target, _items] call FUNC(hasItems))}) exitwith { false };
_allowedSelections = getArray (_config >> "allowedSelections"); _allowedSelections = getArray (_config >> "allowedSelections");
if !("All" in _allowedSelections || {(_selectionName in _allowedSelections)}) exitwith {false}; if !("All" in _allowedSelections || {(_selectionName in _allowedSelections)}) exitwith { false };
_return = true; _return = true;
if (getText (_config >> "condition") != "") then { if (getText (_config >> "condition") != "") then {
@ -61,7 +60,7 @@ if (getText (_config >> "condition") != "") then {
_return = [_caller, _target, _selectionName, _className] call _condition; _return = [_caller, _target, _selectionName, _className] call _condition;
}; };
}; };
if (!_return) exitwith {false}; if (!_return) exitwith { false };
_patientStateCondition = if (isText(_config >> "patientStateCondition")) then { _patientStateCondition = if (isText(_config >> "patientStateCondition")) then {
missionNamespace getvariable [getText(_config >> "patientStateCondition"), 0] missionNamespace getvariable [getText(_config >> "patientStateCondition"), 0]
@ -71,7 +70,7 @@ _patientStateCondition = if (isText(_config >> "patientStateCondition")) then {
if (_patientStateCondition == 1 && {!([_target] call FUNC(isInStableCondition))}) exitwith {false}; if (_patientStateCondition == 1 && {!([_target] call FUNC(isInStableCondition))}) exitwith {false};
_locations = getArray (_config >> "treatmentLocations"); _locations = getArray (_config >> "treatmentLocations");
if ("All" in _locations) exitwith {true}; if ("All" in _locations) exitwith { true };
private [ "_medFacility", "_medVeh"]; private [ "_medFacility", "_medVeh"];
_medFacility = {([_caller] call FUNC(isInMedicalFacility)) || ([_target] call FUNC(isInMedicalFacility))}; _medFacility = {([_caller] call FUNC(isInMedicalFacility)) || ([_target] call FUNC(isInMedicalFacility))};
@ -93,6 +92,6 @@ _medVeh = {([_caller] call FUNC(isInMedicalVehicle)) || ([_target] call FUNC(isI
}; };
}; };
}; };
}foreach _locations; } foreach _locations;
_return; _return;

View File

@ -17,6 +17,7 @@
#include "script_component.hpp" #include "script_component.hpp"
#define MAX_DURATION_CACHE 2 #define MAX_DURATION_CACHE 2
params ["", "_target", "_selection", "_classname"];
// parameters, function, namespace, uid // parameters, function, namespace, uid
[_this, DFUNC(canTreat), _this select 1, format[QGVAR(canTreat_%1_%2), _this select 2, _this select 3], MAX_DURATION_CACHE, "clearConditionCaches"] call EFUNC(common,cachedCall); [_this, DFUNC(canTreat), _target, format [QGVAR(canTreat_%1_%2), _selection, _classname], MAX_DURATION_CACHE, "clearConditionCaches"] call EFUNC(common,cachedCall);

View File

@ -7,16 +7,15 @@
* 1: The caller <OBJECT> * 1: The caller <OBJECT>
* *
* Return Value: * Return Value:
* OBJECT Returns the copy of the unit. If no copy could be made, returns the oldBody * Returns the copy of the unit. If no copy could be made, returns the oldBody <OBJECT>
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_oldBody","_newUnit","_class","_group","_position","_side", "_caller", "_name"]; private ["_newUnit", "_class", "_group", "_position", "_side", "_name"];
_oldBody = _this select 0; params ["_oldBody", "_caller"];
_caller = _this select 1;
if (alive _oldBody) exitwith {_oldBody}; // we only want to do this for dead bodies if (alive _oldBody) exitwith {_oldBody}; // we only want to do this for dead bodies
@ -79,5 +78,5 @@ _newUnit setvariable ["ACE_isUnconscious", true, true];
_newUnit setvariable [QGVAR(disableInteraction), true, true]; _newUnit setvariable [QGVAR(disableInteraction), true, true];
_oldBody setvariable [QGVAR(disableInteraction), true, true]; _oldBody setvariable [QGVAR(disableInteraction), true, true];
_newUnit setDamage 0.89; [_newUnit, 0.89] call FUNC(setStructuralDamage);
_newUnit; _newUnit;

View File

@ -3,11 +3,16 @@
* Spawns litter for the treatment action on the ground around the target * Spawns litter for the treatment action on the ground around the target
* *
* Arguments: * Arguments:
* 0: The target <OBJECT> * 0: The Caller <OBJECT>
* 1: The treatment classname <STRING> * 1: The target <OBJECT>
* 2: The treatment Selection Name <STRING>
* 3: The treatment classname <STRING>
* 4: ?
* 5: Users of Items <?>
* 6: Previous Damage <NUMBER>
* *
* Return Value: * Return Value:
* * None
* *
* Public: No * Public: No
*/ */
@ -16,13 +21,8 @@
#define MIN_ENTRIES_LITTER_CONFIG 3 #define MIN_ENTRIES_LITTER_CONFIG 3
private ["_target", "_className", "_config", "_litter", "_createLitter", "_position", "_createdLitter", "_caller", "_selectionName", "_usersOfItems", "_previousDamage"]; private ["_config", "_litter", "_createLitter", "_position", "_createdLitter"];
_caller = _this select 0; params ["_caller", "_target", "_selectionName", "_className", "", "_usersOfItems", "_previousDamage"];
_target = _this select 1;
_selectionName = _this select 2;
_className = _this select 3;
_usersOfItems = _this select 5;
_previousDamage = _this select 6;
if !(GVAR(allowLitterCreation)) exitwith {}; if !(GVAR(allowLitterCreation)) exitwith {};
if (vehicle _caller != _caller || vehicle _target != _target) exitwith {}; if (vehicle _caller != _caller || vehicle _target != _target) exitwith {};
@ -38,25 +38,24 @@ if !(isArray (_config >> "litter")) exitwith {};
_litter = getArray (_config >> "litter"); _litter = getArray (_config >> "litter");
_createLitter = { _createLitter = {
private["_position", "_litterClass", "_direction"]; private["_position", "_direction"];
params ["_unit", "_litterClass"];
// @TODO: handle carriers over water // @TODO: handle carriers over water
// For now, don't spawn litter if we are over water to avoid floating litter // For now, don't spawn litter if we are over water to avoid floating litter
if(surfaceIsWater (getPos (_this select 0))) exitWith { false }; if(surfaceIsWater (getPos _unit)) exitWith { false };
_position = getPosATL (_this select 0); _position = getPosATL _unit;
_position = [_position select 0, _position select 1, 0]; _position params ["_posX", "_posY"];
_litterClass = _this select 1; _position = if (random(1) >= 0.5) then {
if (random(1) >= 0.5) then { [_posX + random 1, _posY + random 1, 0]
_position = [(_position select 0) + random 1, (_position select 1) + random 1, _position select 2];
} else { } else {
_position = [(_position select 0) - random 1, (_position select 1) - random 1, _position select 2]; [_posX - random 1, _posY - random 1, 0];
}; };
_direction = (random 360); _direction = (random 360);
// Create the litter, and timeout the event based on the cleanup delay // Create the litter, and timeout the event based on the cleanup delay
// The cleanup delay for events in MP is handled by the server side // The cleanup delay for events in MP is handled by the server side
[QGVAR(createLitter), [_litterClass,_position,_direction], 0] call EFUNC(common,syncedEvent); [QGVAR(createLitter), [_litterClass, _position, _direction], 0] call EFUNC(common,syncedEvent);
true true
}; };
@ -65,11 +64,10 @@ _createdLitter = [];
{ {
if (typeName _x == "ARRAY") then { if (typeName _x == "ARRAY") then {
if (count _x < MIN_ENTRIES_LITTER_CONFIG) exitwith {}; if (count _x < MIN_ENTRIES_LITTER_CONFIG) exitwith {};
private ["_selection", "_litterCondition", "_litterOptions"];
_selection = _x select 0; _x params ["_selection", "_litterCondition", "_litterOptions"];
if (toLower _selection in [toLower _selectionName, "all"]) then { // in is case sensitve. We can be forgiving here, so lets use toLower. if (toLower _selection in [toLower _selectionName, "all"]) then { // in is case sensitve. We can be forgiving here, so lets use toLower.
_litterCondition = _x select 1;
_litterOptions = _x select 2;
if (isnil _litterCondition) then { if (isnil _litterCondition) then {
_litterCondition = if (_litterCondition != "") then {compile _litterCondition} else {{true}}; _litterCondition = if (_litterCondition != "") then {compile _litterCondition} else {{true}};
@ -88,8 +86,8 @@ _createdLitter = [];
if (typeName _x == "STRING") then { if (typeName _x == "STRING") then {
[_target, _x] call _createLitter; [_target, _x] call _createLitter;
}; };
}foreach _litterOptions; } foreach _litterOptions;
}; };
}; };
}; };
}foreach _litter; } foreach _litter;

View File

@ -1,19 +1,21 @@
/** /*
* fn_determineIfFatal.sqf * Author: Glowbal
* @Descr: N/A * Determine If Fatal
* @Author: Glowbal
* *
* @Arguments: [] * Arguments:
* @Return: * 0: Unit <OBJECT>
* @PublicAPI: false * 1: Part <NUMBER>
* 2: with Damage <NUMBER> (default: 0)
*
* Return Value:
* None
*
* Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit","_part","_damageThreshold", "_withDamage", "_damageBodyPart"]; private ["_damageThreshold", "_damageBodyPart"];
_unit = _this select 0; params ["_unit", "_part", ["_withDamage", 0]];
_part = _this select 1;
_withDamage = if (count _this > 2) then { _this select 2} else {0};
if (!alive _unit) exitwith {true}; if (!alive _unit) exitwith {true};
if (_part < 0 || _part > 5) exitwith {false}; if (_part < 0 || _part > 5) exitwith {false};
@ -36,7 +38,7 @@ if (_part == 0) exitwith {
// Check if damage to body part is higher as damage torso // Check if damage to body part is higher as damage torso
if (_part == 1) exitwith { if (_part == 1) exitwith {
(_damageBodyPart >= (_damageThreshold select 1) && {(random(1) > 0.2)}); (_damageBodyPart >= (_damageThreshold select 1) && {(random(1) > 0.35)});
}; };
// Check if damage to body part is higher as damage limbs // Check if damage to body part is higher as damage limbs
(_damageBodyPart >= (_damageThreshold select 2) && {(random(1) > 0.95)}); (_damageBodyPart >= (_damageThreshold select 2) && {(random(1) > 0.95)});

View File

@ -4,10 +4,11 @@
* *
* Arguments: * Arguments:
* 0: The Unit <OBJECT> * 0: The Unit <OBJECT>
* 1: Show <BOOL> <OPTIONAL> * 1: Show <BOOL> (default: true)
* 2: Selection <NUMBER> (default: 0)
* *
* ReturnValue: * ReturnValue:
* nil * None
* *
* Public: No * Public: No
*/ */
@ -17,13 +18,11 @@
// Exit for basic medical // Exit for basic medical
if (GVAR(level) < 2) exitWith {}; if (GVAR(level) < 2) exitWith {};
private ["_target", "_show", "_selectionN", "_amountOfGeneric", "_bandagedwounds", "_logCtrl", "_part", "_partText", "_pointDamage", "_severity", "_total", "_totalIvVolume", "_triageStatus", "_type"]; private ["_amountOfGeneric", "_bandagedwounds", "_logCtrl", "_part", "_partText", "_pointDamage", "_severity", "_total", "_totalIvVolume", "_triageStatus", "_type"];
_target = _this select 0; params ["_target", ["_show", true], ["_selectionN", 0]];
_show = if (count _this > 1) then {_this select 1} else {true};
_selectionN = if (count _this > 2) then {_this select 2} else {0};
GVAR(currentSelectedSelectionN) = if (typeName _selectionN == "SCALAR") then {_selectionN} else {0}; GVAR(currentSelectedSelectionN) = [0, _selectionN] select (IS_SCALAR(_selectionN));
GVAR(displayPatientInformationTarget) = if (_show) then {_target} else {ObjNull}; GVAR(displayPatientInformationTarget) = [ObjNull, _target] select _show;
if (USE_WOUND_EVENT_SYNC) then { if (USE_WOUND_EVENT_SYNC) then {
[_target, ACE_player] call FUNC(requestWoundSync); [_target, ACE_player] call FUNC(requestWoundSync);
@ -34,22 +33,22 @@ if (_show) then {
[{ [{
private ["_target", "_display", "_alphaLevel", "_damaged", "_availableSelections", "_openWounds", "_selectionBloodLoss", "_red", "_green", "_blue", "_alphaLevel", "_allInjuryTexts", "_lbCtrl", "_genericMessages"]; private ["_target", "_display", "_alphaLevel", "_damaged", "_availableSelections", "_openWounds", "_selectionBloodLoss", "_red", "_green", "_blue", "_alphaLevel", "_allInjuryTexts", "_lbCtrl", "_genericMessages"];
_target = (_this select 0) select 0; params ["_args", "_idPFH"];
_selectionN = (_this select 0) select 1; _args params ["_target", "_selectionN"];
if (GVAR(displayPatientInformationTarget) != _target || GVAR(currentSelectedSelectionN) != _selectionN) exitwith { if (GVAR(displayPatientInformationTarget) != _target || GVAR(currentSelectedSelectionN) != _selectionN) exitwith {
[_this select 1] call CBA_fnc_removePerFrameHandler; [_idPFH] call CBA_fnc_removePerFrameHandler;
}; };
if (ACE_player distance _target > MAX_DISTANCE) exitwith { if (ACE_player distance _target > MAX_DISTANCE) exitwith {
("ACE_MedicalRscDisplayInformation" call BIS_fnc_rscLayer) cutText ["","PLAIN"]; ("ACE_MedicalRscDisplayInformation" call BIS_fnc_rscLayer) cutText ["","PLAIN"];
[_this select 1] call CBA_fnc_removePerFrameHandler; [_idPFH] call CBA_fnc_removePerFrameHandler;
["displayTextStructured", [ACE_player], [[LSTRING(DistanceToFar), [_target] call EFUNC(common,getName)], 1.75, ACE_player]] call EFUNC(common,targetEvent); ["displayTextStructured", [ACE_player], [[LSTRING(DistanceToFar), [_target] call EFUNC(common,getName)], 1.75, ACE_player]] call EFUNC(common,targetEvent);
}; };
disableSerialization; disableSerialization;
_display = uiNamespace getvariable QGVAR(DisplayInformation); _display = uiNamespace getvariable QGVAR(DisplayInformation);
if (isnil "_display") exitwith { if (isnil "_display") exitwith {
[_this select 1] call CBA_fnc_removePerFrameHandler; [_idPFH] call CBA_fnc_removePerFrameHandler;
}; };
_allInjuryTexts = []; _allInjuryTexts = [];
@ -81,7 +80,7 @@ if (_show) then {
if !(isnil "_value") then { if !(isnil "_value") then {
_totalIvVolume = _totalIvVolume + (_target getvariable [_x, 0]); _totalIvVolume = _totalIvVolume + (_target getvariable [_x, 0]);
}; };
}foreach GVAR(IVBags); } foreach GVAR(IVBags);
if (_totalIvVolume >= 1) then { if (_totalIvVolume >= 1) then {
_genericMessages pushback [format[localize LSTRING(receivingIvVolume), floor _totalIvVolume], [1, 1, 1, 1]]; _genericMessages pushback [format[localize LSTRING(receivingIvVolume), floor _totalIvVolume], [1, 1, 1, 1]];
}; };
@ -92,33 +91,33 @@ if (_show) then {
_openWounds = _target getvariable [QGVAR(openWounds), []]; _openWounds = _target getvariable [QGVAR(openWounds), []];
private "_amountOf"; private "_amountOf";
{ {
_amountOf = _x select 3; _x params ["", "_x1", "_selectionX", "_amountOf", "_x4"];
// Find how much this bodypart is bleeding // Find how much this bodypart is bleeding
if (_amountOf > 0) then { if (_amountOf > 0) then {
_damaged set[_x select 2, true]; _damaged set[_selectionX, true];
_selectionBloodLoss set [(_x select 2), (_selectionBloodLoss select (_x select 2)) + (20 * ((_x select 4) * _amountOf))]; _selectionBloodLoss set [_selectionX, (_selectionBloodLoss select _selectionX) + (20 * (_x4 * _amountOf))];
if (_selectionN == (_x select 2)) then { if (_selectionN == _selectionX) then {
// Collect the text to be displayed for this injury [ Select injury class type definition - select the classname DisplayName (6th), amount of injuries for this] // Collect the text to be displayed for this injury [ Select injury class type definition - select the classname DisplayName (6th), amount of injuries for this]
if (_amountOf >= 1) then { if (_amountOf >= 1) then {
// TODO localization // TODO localization
_allInjuryTexts pushback [format["%2x %1", (GVAR(AllWoundInjuryTypes) select (_x select 1)) select 6, _amountOf], [1,1,1,1]]; _allInjuryTexts pushback [format["%2x %1", (GVAR(AllWoundInjuryTypes) select _x1) select 6, _amountOf], [1,1,1,1]];
} else { } else {
// TODO localization // TODO localization
_allInjuryTexts pushback [format["Partial %1", (GVAR(AllWoundInjuryTypes) select (_x select 1)) select 6], [1,1,1,1]]; _allInjuryTexts pushback [format["Partial %1", (GVAR(AllWoundInjuryTypes) select _x1) select 6], [1,1,1,1]];
}; };
}; };
}; };
}foreach _openWounds; } foreach _openWounds;
_bandagedwounds = _target getvariable [QGVAR(bandagedWounds), []]; _bandagedwounds = _target getvariable [QGVAR(bandagedWounds), []];
{ {
_amountOf = _x select 3; _x params ["", "", "_selectionX", "_amountOf", "_x4"];
// Find how much this bodypart is bleeding // Find how much this bodypart is bleeding
if !(_damaged select (_x select 2)) then { if !(_damaged select _selectionX) then {
_selectionBloodLoss set [(_x select 2), (_selectionBloodLoss select (_x select 2)) + (20 * ((_x select 4) * _amountOf))]; _selectionBloodLoss set [_selectionX, (_selectionBloodLoss select _selectionX) + (20 * (_x4 * _amountOf))];
}; };
if (_selectionN == (_x select 2)) then { if (_selectionN == _selectionX) then {
// Collect the text to be displayed for this injury [ Select injury class type definition - select the classname DisplayName (6th), amount of injuries for this] // Collect the text to be displayed for this injury [ Select injury class type definition - select the classname DisplayName (6th), amount of injuries for this]
if (_amountOf > 0) then { if (_amountOf > 0) then {
if (_amountOf >= 1) then { if (_amountOf >= 1) then {
@ -130,7 +129,7 @@ if (_show) then {
}; };
}; };
}; };
}foreach _bandagedwounds; } foreach _bandagedwounds;
} else { } else {
_damaged = [true, true, true, true, true, true]; _damaged = [true, true, true, true, true, true];
{ {
@ -160,7 +159,7 @@ if (_show) then {
_availableSelections = [50,51,52,53,54,55]; _availableSelections = [50,51,52,53,54,55];
{ {
private ["_red", "_green", "_blue"]; private ["_red", "_green", "_blue", "_total"];
_total = _x; _total = _x;
_red = 1; _red = 1;
@ -177,20 +176,22 @@ if (_show) then {
}; };
}; };
(_display displayCtrl (_availableSelections select _foreachIndex)) ctrlSetTextColor [_red, _green, _blue, 1.0]; (_display displayCtrl (_availableSelections select _foreachIndex)) ctrlSetTextColor [_red, _green, _blue, 1.0];
}foreach _selectionBloodLoss; } foreach _selectionBloodLoss;
_lbCtrl = (_display displayCtrl 200); _lbCtrl = (_display displayCtrl 200);
lbClear _lbCtrl; lbClear _lbCtrl;
{ {
_lbCtrl lbAdd (_x select 0); _x params ["_add", "_color"];
_lbCtrl lbSetColor [_foreachIndex, _x select 1]; _lbCtrl lbAdd _add;
}foreach _genericMessages; _lbCtrl lbSetColor [_foreachIndex, _color];
} foreach _genericMessages;
_amountOfGeneric = count _genericMessages; _amountOfGeneric = count _genericMessages;
{ {
_lbCtrl lbAdd (_x select 0); _x params ["_add", "_color"];
_lbCtrl lbSetColor [_foreachIndex + _amountOfGeneric, _x select 1]; _lbCtrl lbAdd _add;
}foreach _allInjuryTexts; _lbCtrl lbSetColor [_foreachIndex + _amountOfGeneric, _color];
} foreach _allInjuryTexts;
if (count _allInjuryTexts == 0) then { if (count _allInjuryTexts == 0) then {
_lbCtrl lbAdd (localize LSTRING(NoInjuriesBodypart)); _lbCtrl lbAdd (localize LSTRING(NoInjuriesBodypart));
}; };
@ -202,9 +203,7 @@ if (_show) then {
_logs = _target getvariable [QGVAR(logFile_Activity), []]; _logs = _target getvariable [QGVAR(logFile_Activity), []];
{ {
// [_message,_moment,_type, _arguments] // [_message,_moment,_type, _arguments]
_message = _x select 0; _x params ["_message", "_moment", "_type", "_arguments"];
_moment = _x select 1;
_arguments = _x select 3;
if (isLocalized _message) then { if (isLocalized _message) then {
_message = localize _message; _message = localize _message;
}; };
@ -213,10 +212,10 @@ if (_show) then {
if (typeName _x == "STRING" && {isLocalized _x}) then { if (typeName _x == "STRING" && {isLocalized _x}) then {
_arguments set [_foreachIndex, localize _x]; _arguments set [_foreachIndex, localize _x];
}; };
}foreach _arguments; } foreach _arguments;
_message = format([_message] + _arguments); _message = format([_message] + _arguments);
_logCtrl lbAdd format["%1 %2", _moment, _message]; _logCtrl lbAdd format["%1 %2", _moment, _message];
}foreach _logs; } foreach _logs;
_triageStatus = [_target] call FUNC(getTriageStatus); _triageStatus = [_target] call FUNC(getTriageStatus);
(_display displayCtrl 303) ctrlSetText (_triageStatus select 0); (_display displayCtrl 303) ctrlSetText (_triageStatus select 0);

View File

@ -4,18 +4,18 @@
* *
* Arguments: * Arguments:
* 0: The unit <OBJECT> * 0: The unit <OBJECT>
* 1: Show <BOOL> (default: true)
* *
* Return Value: * Return Value:
* nil * None
* *
* Public: Yes * Public: Yes
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_target", "_show", "_amount", "_item", "_log", "_message", "_triageCardTexts", "_triageStatus"]; private ["_amount", "_item", "_log", "_message", "_triageCardTexts", "_triageStatus"];
_target = _this select 0; params ["_target", ["_show", true]];
_show = if (count _this > 1) then {_this select 1} else {true};
GVAR(TriageCardTarget) = if (_show) then {_target} else {ObjNull}; GVAR(TriageCardTarget) = if (_show) then {_target} else {ObjNull};
@ -25,15 +25,16 @@ if (_show) then {
[{ [{
private ["_target", "_display", "_alphaLevel", "_alphaLevel", "_lbCtrl"]; private ["_target", "_display", "_alphaLevel", "_alphaLevel", "_lbCtrl"];
_target = (_this select 0) select 0; params ["_args", "_idPFH"];
_args params ["_target"];
if (GVAR(TriageCardTarget) != _target) exitwith { if (GVAR(TriageCardTarget) != _target) exitwith {
[_this select 1] call CBA_fnc_removePerFrameHandler; [_idPFH] call CBA_fnc_removePerFrameHandler;
}; };
disableSerialization; disableSerialization;
_display = uiNamespace getvariable QGVAR(triageCard); _display = uiNamespace getvariable QGVAR(triageCard);
if (isnil "_display") exitwith { if (isnil "_display") exitwith {
[_this select 1] call CBA_fnc_removePerFrameHandler; [_idPFH] call CBA_fnc_removePerFrameHandler;
}; };
_triageCardTexts = []; _triageCardTexts = [];
@ -44,8 +45,7 @@ if (_show) then {
_log = _target getvariable [QGVAR(triageCard), []]; _log = _target getvariable [QGVAR(triageCard), []];
{ {
_item = _x select 0; _x params ["_item", "_amount"];
_amount = _x select 1;
_message = _item; _message = _item;
if (isClass(configFile >> "CfgWeapons" >> _item)) then { if (isClass(configFile >> "CfgWeapons" >> _item)) then {
_message = getText(configFile >> "CfgWeapons" >> _item >> "DisplayName"); _message = getText(configFile >> "CfgWeapons" >> _item >> "DisplayName");
@ -55,18 +55,21 @@ if (_show) then {
}; };
}; };
_triageCardTexts pushback format["%1x - %2", _amount, _message]; _triageCardTexts pushback format["%1x - %2", _amount, _message];
}foreach _log; } foreach _log;
if (count _triageCardTexts == 0) then { if (count _triageCardTexts == 0) then {
_lbCtrl lbAdd (localize LSTRING(TriageCard_NoEntry)); _lbCtrl lbAdd (localize LSTRING(TriageCard_NoEntry));
}; };
{ {
_lbCtrl lbAdd _x; _lbCtrl lbAdd _x;
}foreach _triageCardTexts; } foreach _triageCardTexts;
_triageStatus = [_target] call FUNC(getTriageStatus); _triageStatus = [_target] call FUNC(getTriageStatus);
(_display displayCtrl 2000) ctrlSetText (_triageStatus select 0);
(_display displayCtrl 2000) ctrlSetBackgroundColor (_triageStatus select 2); _triageStatus params ["_text", "", "_color"];
(_display displayCtrl 2000) ctrlSetText _text;
(_display displayCtrl 2000) ctrlSetBackgroundColor _color;
}, 0, [_target]] call CBA_fnc_addPerFrameHandler; }, 0, [_target]] call CBA_fnc_addPerFrameHandler;

View File

@ -3,18 +3,18 @@
* Display triage card for a unit * Display triage card for a unit
* *
* Arguments: * Arguments:
* 0: The unit <OBJECT> * 0: Show <BOOL>
* *
* Return Value: * Return Value:
* nil * None
* *
* Public: Yes * Public: Yes
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_show", "_ctrl", "_display", "_idc", "_pos"]; private ["_ctrl", "_display", "_idc", "_pos"];
_show = _this select 0; params ["_show"];
disableSerialization; disableSerialization;
_display = uiNamespace getvariable QGVAR(triageCard); _display = uiNamespace getvariable QGVAR(triageCard);

View File

@ -15,10 +15,9 @@
#define BLOODLOSSRATE_BASIC 0.2 #define BLOODLOSSRATE_BASIC 0.2
private ["_unit", "_totalBloodLoss","_tourniquets","_openWounds", "_cardiacOutput", "_internalWounds"]; private ["_totalBloodLoss","_tourniquets","_openWounds", "_cardiacOutput", "_internalWounds"];
// TODO Only use this calculation if medium or higher, otherwise use vanilla calculations (for basic medical). // TODO Only use this calculation if medium or higher, otherwise use vanilla calculations (for basic medical).
params ["_unit"];
_unit = _this select 0;
_totalBloodLoss = 0; _totalBloodLoss = 0;
// Advanced medical bloodloss handling // Advanced medical bloodloss handling
@ -34,16 +33,17 @@ if (GVAR(level) >= 2) then {
// (((BLOODLOSS_SMALL_WOUNDS * (_x select 0))) + ((BLOODLOSS_MEDIUM_WOUNDS * (_x select 1))) + ((BLOODLOSS_LARGE_WOUNDS * (_x select 2))) * (_cardiacOutput / DEFAULT_CARDIAC_OUTPUT)); // (((BLOODLOSS_SMALL_WOUNDS * (_x select 0))) + ((BLOODLOSS_MEDIUM_WOUNDS * (_x select 1))) + ((BLOODLOSS_LARGE_WOUNDS * (_x select 2))) * (_cardiacOutput / DEFAULT_CARDIAC_OUTPUT));
}; };
}foreach _openWounds; } foreach _openWounds;
_internalWounds = _unit getvariable [QGVAR(internalWounds), []]; _internalWounds = _unit getvariable [QGVAR(internalWounds), []];
{ {
_totalBloodLoss = _totalBloodLoss + ((_x select 4) * (_x select 3)); _totalBloodLoss = _totalBloodLoss + ((_x select 4) * (_x select 3));
}foreach _internalWounds; } foreach _internalWounds;
// cap the blood loss to be no greater as the current cardiac output // cap the blood loss to be no greater as the current cardiac output
//(_totalBloodLoss min _cardiacOutput); //(_totalBloodLoss min _cardiacOutput);
} else { } else {
_totalBloodLoss = BLOODLOSSRATE_BASIC * (damage _unit); { _totalBloodLoss = _totalBloodLoss + _x } forEach (_unit getvariable [QGVAR(bodyPartStatus), []]);
_totalBloodLoss = (_totalBloodLoss / 6) * BLOODLOSSRATE_BASIC;
}; };
_totalBloodLoss * ((_unit getVariable [QGVAR(bleedingCoefficient), GVAR(bleedingCoefficient)]) max 0); _totalBloodLoss * ((_unit getVariable [QGVAR(bleedingCoefficient), GVAR(bleedingCoefficient)]) max 0);

View File

@ -6,29 +6,28 @@
* 0: The Unit <OBJECT> * 0: The Unit <OBJECT>
* *
* ReturnValue: * ReturnValue:
* Blood Pressuret <ARRAY <NUMBER>,<NUMBER>> * 0: BloodPressure Low <NUMBER>
* 1: BloodPressure High <NUMBER>
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
/* // Value is taken because with cardic output and resistance at default values, it will put blood pressure High at 120.
Value is taken because with cardic output and resistance at default values, it will put blood pressure High at 120.
*/
#define MODIFIER_BP_HIGH 0.229 #define MODIFIER_BP_HIGH 0.229
/* // Value is taken because with cardic output and resistance at default values, it will put blood pressure Low at 80.
Value is taken because with cardic output and resistance at default values, it will put blood pressure Low at 80.
*/
#define MODIFIER_BP_LOW 0.1524 #define MODIFIER_BP_LOW 0.1524
private ["_unit", "_bloodPressureLow", "_bloodPressureHigh", "_cardiacOutput", "_resistance"]; private ["_bloodPressureLow", "_bloodPressureHigh", "_cardiacOutput", "_resistance"];
_unit = _this select 0;
params ["_unit"];
_cardiacOutput = [_unit] call FUNC(getCardiacOutput); _cardiacOutput = [_unit] call FUNC(getCardiacOutput);
_resistance = _unit getvariable [QGVAR(peripheralResistance), 100]; _resistance = _unit getvariable [QGVAR(peripheralResistance), 100];
_bloodPressureHigh = (_cardiacOutput * MODIFIER_BP_HIGH) * _resistance; _bloodPressureHigh = (_cardiacOutput * MODIFIER_BP_HIGH) * _resistance;
_bloodPressureLow = (_cardiacOutput * MODIFIER_BP_LOW) * _resistance; _bloodPressureLow = (_cardiacOutput * MODIFIER_BP_LOW) * _resistance;
[_bloodPressureLow, _bloodPressureHigh]; [_bloodPressureLow max 0, _bloodPressureHigh max 0]

View File

@ -28,10 +28,8 @@
*/ */
#define BLOOD_CHANGE_PER_SECOND 0.0595 #define BLOOD_CHANGE_PER_SECOND 0.0595
private ["_bloodVolume", "_bloodVolumeChange", "_ivVolume"];
params ["_unit"];
private ["_unit","_bloodVolume","_bloodVolumeChange", "_ivVolume"];
_unit = _this select 0;
_bloodVolume = _unit getvariable [QGVAR(bloodVolume), 100]; _bloodVolume = _unit getvariable [QGVAR(bloodVolume), 100];
_bloodVolumeChange = -([_unit] call FUNC(getBloodLoss)); _bloodVolumeChange = -([_unit] call FUNC(getBloodLoss));
@ -43,13 +41,13 @@ if (_bloodVolume < 100.0) then {
_ivVolume = (_unit getvariable [_x, 0]) + IV_CHANGE_PER_SECOND; _ivVolume = (_unit getvariable [_x, 0]) + IV_CHANGE_PER_SECOND;
_unit setvariable [_x,_ivVolume]; _unit setvariable [_x,_ivVolume];
}; };
}foreach GVAR(IVBags); } foreach GVAR(IVBags);
} else { } else {
{ {
if ((_unit getvariable [_x, 0]) > 0) then { if ((_unit getvariable [_x, 0]) > 0) then {
_unit setvariable [_x, 0]; // lets get rid of exessive IV volume _unit setvariable [_x, 0]; // lets get rid of exessive IV volume
}; };
}foreach GVAR(IVBags); } foreach GVAR(IVBags);
}; };
_bloodVolumeChange; _bloodVolumeChange;

View File

@ -22,7 +22,6 @@
// to limit the amount of complex calculations necessary, we take a set modifier to calculate Stroke Volume. // to limit the amount of complex calculations necessary, we take a set modifier to calculate Stroke Volume.
#define MODIFIER_CARDIAC_OUTPUT 19.04761 #define MODIFIER_CARDIAC_OUTPUT 19.04761
private "_unit"; params ["_unit"];
_unit = _this select 0;
((_unit getvariable [QGVAR(bloodVolume), 100])/MODIFIER_CARDIAC_OUTPUT) + ((_unit getvariable [QGVAR(heartRate), 80])/80-1); ((_unit getvariable [QGVAR(bloodVolume), 100])/MODIFIER_CARDIAC_OUTPUT) + ((_unit getvariable [QGVAR(heartRate), 80])/80-1);

View File

@ -15,8 +15,9 @@
#define HEART_RATE_MODIFIER 0.02 #define HEART_RATE_MODIFIER 0.02
private ["_unit", "_heartRate", "_hrIncrease", "_bloodLoss", "_time", "_values", "_adjustment", "_change", "_callBack", "_bloodVolume"]; private ["_heartRate", "_hrIncrease", "_bloodLoss", "_time", "_values", "_adjustment", "_change", "_callBack", "_bloodVolume"];
_unit = _this select 0; params ["_unit"];
_hrIncrease = 0; _hrIncrease = 0;
if (!(_unit getvariable [QGVAR(inCardiacArrest),false])) then { if (!(_unit getvariable [QGVAR(inCardiacArrest),false])) then {
_heartRate = _unit getvariable [QGVAR(heartRate), 80]; _heartRate = _unit getvariable [QGVAR(heartRate), 80];
@ -24,10 +25,8 @@ if (!(_unit getvariable [QGVAR(inCardiacArrest),false])) then {
_adjustment = _unit getvariable [QGVAR(heartRateAdjustments), []]; _adjustment = _unit getvariable [QGVAR(heartRateAdjustments), []];
{ {
_values = (_x select 0); _x params ["_values", "_time", "_callBack"];
if (abs _values > 0) then { if (abs _values > 0) then {
_time = (_x select 1);
_callBack = _x select 2;
if (_time <= 0) then { if (_time <= 0) then {
_time = 1; _time = 1;
}; };
@ -47,7 +46,7 @@ if (!(_unit getvariable [QGVAR(inCardiacArrest),false])) then {
[_unit] call _callBack; [_unit] call _callBack;
}; };
}foreach _adjustment; } foreach _adjustment;
_adjustment = _adjustment - [ObjNull]; _adjustment = _adjustment - [ObjNull];
_unit setvariable [QGVAR(heartRateAdjustments), _adjustment]; _unit setvariable [QGVAR(heartRateAdjustments), _adjustment];

View File

@ -6,7 +6,9 @@
* 0: The unit <OBJECT> * 0: The unit <OBJECT>
* *
* Return Value: * Return Value:
* Triage status from the unit. Name, statusID, color <ARRAY <STRING><NUMBER><ARRAY>> * 0: Name <STRING>
* 1: Status ID <NUMBER>
* 2: Color <ARRAY <NUMBER>>
* *
* Public: Yes * Public: Yes
*/ */
@ -14,7 +16,7 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit","_return","_status"]; private ["_unit","_return","_status"];
_unit = _this select 0; params ["_unit"];
_status = _unit getvariable [QGVAR(triageLevel), -1]; _status = _unit getvariable [QGVAR(triageLevel), -1];
_return = switch (_status) do { _return = switch (_status) do {
case 1: {[localize LSTRING(Triage_Status_Minor), 1, [0, 0.5, 0, 0.9]]}; case 1: {[localize LSTRING(Triage_Status_Minor), 1, [0, 0.5, 0, 0.9]]};
@ -23,4 +25,4 @@ _return = switch (_status) do {
case 4: {[localize LSTRING(Triage_Status_Deceased), 4, [0, 0, 0, 0.9]]}; case 4: {[localize LSTRING(Triage_Status_Deceased), 4, [0, 0, 0, 0.9]]};
default {[localize LSTRING(Triage_Status_None), 0, [0, 0, 0, 0.9]]}; default {[localize LSTRING(Triage_Status_None), 0, [0, 0, 0, 0.9]]};
}; };
_return; _return

View File

@ -13,23 +13,19 @@
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_1(_typeOfProjectile); params ["_typeOfProjectile"];
private ["_typeOfDamage"];
_typeOfDamage = switch (true) do { if (_typeOfProjectile isKindOf "BulletBase") exitWith {"bullet"};
case (_typeOfProjectile isKindOf "BulletBase"): {"bullet"}; if (_typeOfProjectile isKindOf "ShotgunBase") exitwith {"bullet"};
case (_typeOfProjectile isKindOf "GrenadeCore"): {"grenade"}; if (_typeOfProjectile isKindOf "GrenadeCore") exitWith {"grenade"};
case (_typeOfProjectile isKindOf "TimeBombCore"): {"explosive"}; if (_typeOfProjectile isKindOf "TimeBombCore") exitWith {"explosive"};
case (_typeOfProjectile isKindOf "MineCore"): {"explosive"}; if (_typeOfProjectile isKindOf "MineCore") exitWith {"explosive"};
case (_typeOfProjectile isKindOf "FuelExplosion"): {"explosive"}; if (_typeOfProjectile isKindOf "FuelExplosion") exitWith {"explosive"};
case (_typeOfProjectile isKindOf "ShellBase"): {"shell"}; if (_typeOfProjectile isKindOf "ShellBase") exitWith {"shell"};
case (_typeOfProjectile isKindOf "RocketBase"): {"explosive"}; if (_typeOfProjectile isKindOf "RocketBase") exitWith {"explosive"};
case (_typeOfProjectile isKindOf "MissileBase"): {"explosive"}; if (_typeOfProjectile isKindOf "MissileBase") exitWith {"explosive"};
case (_typeOfProjectile isKindOf "LaserBombCore"): {"explosive"}; if (_typeOfProjectile isKindOf "LaserBombCore") exitWith {"explosive"};
case (_typeOfProjectile isKindOf "BombCore"): {"explosive"}; if (_typeOfProjectile isKindOf "BombCore") exitWith {"explosive"};
case (_typeOfProjectile isKindOf "Grenade"): {"grenade"}; if (_typeOfProjectile isKindOf "Grenade") exitWith {"grenade"};
default {toLower _typeOfProjectile}; toLower _typeOfProjectile
};
_typeOfDamage

View File

@ -14,7 +14,7 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit","_return"]; private ["_unit","_return"];
_unit = _this select 0; params ["_unit"];
if (isnil QGVAR(unconsciousConditions)) then { if (isnil QGVAR(unconsciousConditions)) then {
GVAR(unconsciousConditions) = []; GVAR(unconsciousConditions) = [];
@ -25,6 +25,6 @@ _return = false;
if (typeName _x == typeName {} && {([_unit] call _x)}) exitwith { if (typeName _x == typeName {} && {([_unit] call _x)}) exitwith {
_return = true; _return = true;
}; };
}foreach GVAR(unconsciousConditions); } foreach GVAR(unconsciousConditions);
_return; _return

View File

@ -18,13 +18,8 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_target", "_impact", "_part", "_injuryIndex", "_injury", "_bandage", "_classID", "_className", "_reopeningChance", "_reopeningMinDelay", "_reopeningMaxDelay", "_config", "_woundTreatmentConfig", "_bandagedWounds", "_exist", "_injuryId", "_existingInjury", "_delay", "_openWounds", "_selectedInjury", "_bandagedInjury"]; private ["_className", "_reopeningChance", "_reopeningMinDelay", "_reopeningMaxDelay", "_config", "_woundTreatmentConfig", "_bandagedWounds", "_exist", "_injuryId", "_existingInjury", "_delay", "_openWounds", "_selectedInjury", "_bandagedInjury"];
_target = _this select 0; params ["_target", "_impact", "_part", "_injuryIndex", "_injury", "_bandage"];
_impact = _this select 1;
_part = _this select 2;
_injuryIndex = _this select 3;
_injury = _this select 4;
_bandage = _this select 5;
_classID = _injury select 1; _classID = _injury select 1;
_className = GVAR(woundClassNames) select _classID; _className = GVAR(woundClassNames) select _classID;
@ -57,8 +52,8 @@ if (isClass (_config >> _className)) then {
}; };
_bandagedWounds = _target getvariable [QGVAR(bandagedWounds), []]; _bandagedWounds = _target getvariable [QGVAR(bandagedWounds), []];
_exist = false;
_injuryType = _injury select 1; _injuryType = _injury select 1;
_exist = false;
_bandagedInjury = []; _bandagedInjury = [];
{ {
if ((_x select 1) == _injuryType && (_x select 2) == (_injury select 2)) exitwith { if ((_x select 1) == _injuryType && (_x select 2) == (_injury select 2)) exitwith {
@ -69,7 +64,7 @@ _bandagedInjury = [];
_bandagedInjury = _existingInjury; _bandagedInjury = _existingInjury;
}; };
}foreach _bandagedWounds; } foreach _bandagedWounds;
if !(_exist) then { if !(_exist) then {
// [ID, classID, bodypart, percentage treated, bloodloss rate] // [ID, classID, bodypart, percentage treated, bloodloss rate]
@ -83,12 +78,8 @@ _target setvariable [QGVAR(bandagedWounds), _bandagedWounds, true];
if (random(1) <= _reopeningChance) then { if (random(1) <= _reopeningChance) then {
_delay = _reopeningMinDelay + random(_reopeningMaxDelay - _reopeningMinDelay); _delay = _reopeningMinDelay + random(_reopeningMaxDelay - _reopeningMinDelay);
[{ [{
private ["_target", "_impact", "_part", "_injuryIndex", "_bandage", "_injury", "_openWounds", "_selectedInjury","_bandagedWounds","_exist"]; private ["_bandage", "_openWounds", "_selectedInjury","_bandagedWounds","_exist"];
_target = _this select 0; params ["_target", "_impact", "_part", "_injuryIndex", "_injury"];
_impact = _this select 1;
_part = _this select 2;
_injuryIndex = _this select 3;
_injury = _this select 4;
//if (alive _target) then { //if (alive _target) then {
_openWounds = _target getvariable [QGVAR(openWounds), []]; _openWounds = _target getvariable [QGVAR(openWounds), []];
@ -108,7 +99,7 @@ if (random(1) <= _reopeningChance) then {
_existingInjury set [3, ((_existingInjury select 3) - _impact) max 0]; _existingInjury set [3, ((_existingInjury select 3) - _impact) max 0];
_bandagedWounds set [_foreachIndex, _existingInjury]; _bandagedWounds set [_foreachIndex, _existingInjury];
}; };
}foreach _bandagedWounds; } foreach _bandagedWounds;
if (_exist) then { if (_exist) then {
_target setvariable [QGVAR(bandagedWounds), _bandagedWounds, true]; _target setvariable [QGVAR(bandagedWounds), _bandagedWounds, true];

View File

@ -1,9 +1,22 @@
//#define DEBUG_MODE_FULL /*
* Author: Glowbal
* handle Litter Create
*
* Arguments:
* 0: Litter Class <STRING>
* 1: Position <ARRAY>
* 2: Unit <OBJECT>
*
* Return Value:
* None
*
* Public: No
*/
#include "script_component.hpp" #include "script_component.hpp"
if(!hasInterface) exitWith { false }; if(!hasInterface) exitWith { false };
PARAMS_3(_litterClass,_position,_direction); params ["_litterClass", "_position", "_unit"];
private["_litterObject", "_maxLitterCount"]; private["_litterObject", "_maxLitterCount"];
//IGNORE_PRIVATE_WARNING(_values); //IGNORE_PRIVATE_WARNING(_values);
@ -16,9 +29,9 @@ _litterObject = _litterClass createVehicleLocal _position;
_litterObject setDir _direction; _litterObject setDir _direction;
_litterObject setPosATL _position; _litterObject setPosATL _position;
// Move the litter next frame to get rid of HORRIBLE spacing, fixes #1112 // Move the litter next frame to get rid of HORRIBLE spacing, fixes #1112
[{ (_this select 0) setPosATL (_this select 1); }, [_litterObject, _position]] call EFUNC(common,execNextFrame); [{ params ["_object", "_pos"]; _object setPosATL _pos; }, [_litterObject, _position]] call EFUNC(common,execNextFrame);
_maxLitterCount = getArray (configFile >> "ACE_Settings" >> QGVAR(litterSimulationDetail) >> "_values") select GVAR(litterSimulationDetail); _maxLitterCount = getArray (configFile >> "ACE_Settings" >> QGVAR(litterSimulationDetail) >> "_values") select GVAR(litterSimulationDetail);
if((count GVAR(allCreatedLitter)) > _maxLitterCount ) then { if((count GVAR(allCreatedLitter)) > _maxLitterCount ) then {
// gank the first litter object, and spawn ours. // gank the first litter object, and spawn ours.
private["_oldLitter"]; private["_oldLitter"];
@ -34,10 +47,11 @@ if(!GVAR(litterPFHRunning) && {GVAR(litterCleanUpDelay) > 0}) then {
GVAR(litterPFHRunning) = true; GVAR(litterPFHRunning) = true;
[{ [{
{ {
if (ACE_time - (_x select 0) >= GVAR(litterCleanUpDelay)) then { _x params ["_time", "_objects"];
if (ACE_time - _time >= GVAR(litterCleanUpDelay)) then {
{ {
deleteVehicle _x; deleteVehicle _x;
} forEach (_x select 1); } forEach _objects;
GVAR(allCreatedLitter) set[_foreachIndex, objNull]; GVAR(allCreatedLitter) set[_foreachIndex, objNull];
}; };
} forEach GVAR(allCreatedLitter); } forEach GVAR(allCreatedLitter);
@ -46,8 +60,6 @@ if(!GVAR(litterPFHRunning) && {GVAR(litterCleanUpDelay) > 0}) then {
if ( (count GVAR(allCreatedLitter)) == 0) exitwith { if ( (count GVAR(allCreatedLitter)) == 0) exitwith {
[(_this select 1)] call CBA_fnc_removePerFrameHandler; [(_this select 1)] call CBA_fnc_removePerFrameHandler;
GVAR(litterPFHRunning) = false; GVAR(litterPFHRunning) = false;
}; };
}, 30, []] call CBA_fnc_addPerFrameHandler; }, 30, []] call CBA_fnc_addPerFrameHandler;
}; };
true

View File

@ -1,5 +1,5 @@
/* /*
* Author: KoffeinFlummi, Glowbal * Author: KoffeinFlummi, Glowbal, commy2
* Main HandleDamage EH function. * Main HandleDamage EH function.
* *
* Arguments: * Arguments:
@ -14,74 +14,79 @@
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_selection", "_damage", "_shooter", "_projectile", "_damageReturn", "_typeOfDamage", "_minLethalDamage", "_newDamage", "_typeIndex", "_preventDeath"]; params ["_unit", "_selection", "_damage", "_shooter", "_projectile"];
_unit = _this select 0; TRACE_5("ACE_DEBUG: HandleDamage Called",_unit, _selection, _damage, _shooter, _projectile);
_selection = _this select 1;
_damage = _this select 2;
_shooter = _this select 3;
_projectile = _this select 4;
if !(local _unit) exitWith {nil}; // bug, apparently can fire for remote units in special cases
if !(local _unit) exitWith {
TRACE_2("ACE_DEBUG: HandleDamage on remote unit!",_unit, isServer);
nil
};
private ["_damageReturn", "_typeOfDamage", "_minLethalDamage", "_newDamage", "_typeIndex", "_preventDeath"];
// bug, assumed fixed, @todo excessive testing, if nothing happens remove
if (typeName _projectile == "OBJECT") then { if (typeName _projectile == "OBJECT") then {
_projectile = typeOf _projectile; _projectile = typeOf _projectile;
_this set [4, _projectile]; _this set [4, _projectile];
}; };
// If the damage is being weird, we just tell it to fuck off. TRACE_3("ACE_DEBUG: HandleDamage",_selection,_damage,_unit);
if !(_selection in (GVAR(SELECTIONS) + [""])) exitWith {0};
// If damage is in dummy hitpoints, "hands" and "legs", don't change anything
if (_selection == "hands") exitWith {_unit getHit "hands"};
if (_selection == "legs") exitWith {_unit getHit "legs"};
// If the damage is being weird, we just tell it to fuck off. Ignore: "hands", "legs", "?"
if (_selection != "" && {!(_selection in GVAR(SELECTIONS))}) exitWith {0}; //@todo "neck", "pelvis", "spine1", "spine2", "spine3"
// Exit if we disable damage temporarily // Exit if we disable damage temporarily
_damageOld = damage _unit; if !(_unit getVariable [QGVAR(allowDamage), true]) exitWith {
if (_selection in GVAR(SELECTIONS)) then { TRACE_3("ACE_DEBUG: HandleDamage damage disabled.",_selection,damage _unit,_unit);
_damageOld = _unit getHit _selection; if (_selection == "") then {
damage _unit
} else {
_unit getHit _selection
};
}; };
if !(_unit getVariable [QGVAR(allowDamage), true]) exitWith {_damageOld};
// Get return damage // Get return damage
_damageReturn = _damage; _damageReturn = _damage;
if (GVAR(level) < 2) then {
_damageReturn = _this call FUNC(handleDamage_basic); _newDamage = _this call FUNC(handleDamage_caching);
// handleDamage_caching may have modified the projectile string
_typeOfDamage = [_projectile] call FUNC(getTypeOfDamage);
TRACE_3("ACE_DEBUG: HandleDamage caching new damage",_selection,_newDamage,_unit);
_typeIndex = (GVAR(allAvailableDamageTypes) find _typeOfDamage);
_minLethalDamage = if (_typeIndex >= 0) then {
GVAR(minLethalDamages) select _typeIndex
} else { } else {
if !([_unit] call FUNC(hasMedicalEnabled)) exitwith { 0.01
// Because of the config changes, we cannot properly disable the medical system for a unit. };
// lets use basic for the ACE_time being..
_damageReturn = _this call FUNC(handleDamage_basic);
};
_newDamage = _this call FUNC(handleDamage_caching);
// handleDamage_caching may have modified the projectile string
_projectile = _this select 4;
_typeOfDamage = [_projectile] call FUNC(getTypeOfDamage);
_typeIndex = (GVAR(allAvailableDamageTypes) find _typeOfDamage); if (vehicle _unit != _unit && {!(vehicle _unit isKindOf "StaticWeapon")} && {isNull _shooter} && {_projectile == ""} && {_selection == ""}) then {
_minLethalDamage = 0.01; if (GVAR(enableVehicleCrashes)) then {
if (_typeIndex >= 0) then { _selection = GVAR(SELECTIONS) select (floor(random(count GVAR(SELECTIONS))));
_minLethalDamage = GVAR(minLethalDamages) select _typeIndex;
}; };
};
if (vehicle _unit != _unit && {!(vehicle _unit isKindOf "StaticWeapon")} && {isNull _shooter} && {_projectile == ""} && {_selection == ""}) then { if ((_minLethalDamage <= _newDamage) && {[_unit, [_selection] call FUNC(selectionNameToNumber), _newDamage] call FUNC(determineIfFatal)}) then {
if (GVAR(enableVehicleCrashes)) then { if ((_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)])) exitwith {
_selection = GVAR(SELECTIONS) select (floor(random(count GVAR(SELECTIONS)))); _damageReturn = 0.9;
};
}; };
if ([_unit] call FUNC(setDead)) then {
if ((_minLethalDamage <= _newDamage) && {[_unit, [_selection] call FUNC(selectionNameToNumber), _newDamage] call FUNC(determineIfFatal)}) then { _damageReturn = 1;
if ((_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)])) exitwith {
_damageReturn = 0.9;
};
if ([_unit] call FUNC(setDead)) then {
_damageReturn = 1;
} else {
_damageReturn = _damageReturn min 0.89;
};
} else { } else {
_damageReturn = _damageReturn min 0.89; _damageReturn = _damageReturn min 0.89;
}; };
} else {
_damageReturn = _damageReturn min 0.89;
}; };
[_unit] call FUNC(addToInjuredCollection); [_unit] call FUNC(addToInjuredCollection);
if (_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)]) exitWith { if (_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)]) exitWith {
@ -123,4 +128,6 @@ if (((_unit getVariable [QGVAR(enableRevive), GVAR(enableRevive)]) > 0) && {_dam
0.89; 0.89;
}; };
_damageReturn; TRACE_3("ACE_DEBUG: HandleDamage damage return",_selection,_damageReturn,_unit);
_damageReturn

View File

@ -12,23 +12,16 @@
* 6: Type of Damage <STRING> * 6: Type of Damage <STRING>
* *
* Return Value: * Return Value:
* Nothing * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit","_selectionName","_amountOfDamage","_sourceOfDamage","_typeOfProjectile","_typeOfDamage", "_part", "_damageBodyParts", "_newDamage", "_hitPoints"]; private ["_typeOfProjectile", "_part", "_damageBodyParts", "_hitPoints"];
_unit = _this select 0; params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfProjectile", "_newDamage"];
_selectionName = _this select 1;
_amountOfDamage = _this select 2;
_sourceOfDamage = _this select 3;
_typeOfProjectile = _this select 4;
_newDamage = _this select 5;
// Most likely taking exessive fire damage. Lets exit.
if (isNull _sourceOfDamage && {_typeOfProjectile == ""} && {vehicle _unit == _unit} && {(_selectionName == "head" || isBurning _unit)}) exitwith {};
_part = [_selectionName] call FUNC(selectionNameToNumber); _part = [_selectionName] call FUNC(selectionNameToNumber);
if (_part < 0) exitwith {}; if (_part < 0) exitwith {};
@ -40,6 +33,7 @@ _damageBodyParts set [_part, (_damageBodyParts select _part) + _newDamage];
_unit setvariable [QGVAR(bodyPartStatus), _damageBodyParts, true]; _unit setvariable [QGVAR(bodyPartStatus), _damageBodyParts, true];
_typeOfDamage = [_typeOfProjectile] call FUNC(getTypeOfDamage); _typeOfDamage = [_typeOfProjectile] call FUNC(getTypeOfDamage);
[_unit, _selectionName, _newDamage, _typeOfProjectile, _typeOfDamage] call FUNC(handleDamage_assignWounds); [_unit, _selectionName, _newDamage, _typeOfProjectile, _typeOfDamage] call FUNC(handleDamage_assignWounds);
// TODO Disabled until implemented fully // TODO Disabled until implemented fully

View File

@ -6,23 +6,23 @@
* 0: Unit for which the hitpoint damage will be sorted out <OBJECT> * 0: Unit for which the hitpoint damage will be sorted out <OBJECT>
* *
* Return Value: * Return Value:
* nil * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_1(_unit); params ["_unit"];
if (!local _unit) exitwith {}; if (!local _unit) exitwith {};
private ["_bodyStatus", "_headDamage", "_torsoDamage", "_handsDamage", "_legsDamage"]; private "_bodyStatus";
// ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"] // ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"]
_bodyStatus = _unit getVariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]; _bodyStatus = _unit getVariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]];
EXPLODE_6_PVT(_bodyStatus,_headDamage,_torsoDamage,_handsDamageR,_handsDamageL,_legsDamageR,_legsDamageL); _bodyStatus params ["_headDamage", "_torsoDamage", "_handsDamageR", "_handsDamageL", "_legsDamageR", "_legsDamageL"];
_unit setHitPointDamage ["hitHead", _headDamage min 0.95]; _unit setHitPointDamage ["hitHead", _headDamage min 0.95];
_unit setHitPointDamage ["hitBody", _torsoDamage min 0.95]; _unit setHitPointDamage ["hitBody", _torsoDamage min 0.95];

View File

@ -10,19 +10,15 @@
* 4: Type of the damage done <STRING> * 4: Type of the damage done <STRING>
* *
* Return Value: * Return Value:
* None <NIL> * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage", "_bodyPartn"]; private "_bodyPartn";
_unit = _this select 0; params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage"];
_selectionName = _this select 1;
_amountOfDamage = _this select 2;
_sourceOfDamage = _this select 3;
_typeOfDamage = _this select 4;
_bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); _bodyPartn = [_selectionName] call FUNC(selectionNameToNumber);
if (_bodyPartn > 1) exitwith {}; if (_bodyPartn > 1) exitwith {};

View File

@ -1,192 +1,60 @@
/* /*
* Author: KoffeinFlummi * Author: KoffeinFlummi, Glowbal
* Basic HandleDamage EH function. * Handle damage basic medical
* *
* Arguments: * Arguments:
* 0: Unit That Was Hit <OBJECT>
* 1: Name Of Hit Selection <STRING>
* 2: Amount Of Damage <NUMBER>
* 3: Shooter <OBJECT>
* 4: Projectile <STRING>
* 5: Current damage to be returned <NUMBER>
* *
* Return Value: * Return Value:
* Damage To Be Inflicted <NUMBER> * <nil>
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
#define LEGDAMAGETRESHOLD1 1 private ["_damageBodyParts", "_cache_params", "_cache_damages"];
#define LEGDAMAGETRESHOLD2 1.7 params ["_target"];
#define ARMDAMAGETRESHOLD1 1 TRACE_1("ACE_DEBUG: HandleDamage_BASIC Called",_target);
#define ARMDAMAGETRESHOLD2 1.7
#define UNCONSCIOUSNESSTRESHOLD 0.7
private ["_unit", "_selectionName", "_damage", "_shooter", "_projectile", "_damage", "_armdamage", "_hitPoint", "_index", "_legdamage", "_newDamage", "_otherDamage", "_pain", "_restore"]; _damageBodyParts = _target getvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]];
_cache_params = _target getVariable [QGVAR(cachedHandleDamageParams), []];
_cache_damages = _target getVariable QGVAR(cachedDamages);
_unit = _this select 0; TRACE_4("ACE_DEBUG: HandleDamage BASIC",_unit, _damageBodyParts,_cache_params,_cache_damages);
_selectionName = _this select 1;
_damage = _this select 2;
_shooter = _this select 3;
_projectile = _this select 4;
// Apply damage treshold / coefficient {
_threshold = [ _x params ["_unit","_selectionName","_amountOfDamage","_sourceOfDamage","_typeOfProjectile","_typeOfDamage"];
_unit getVariable [QGVAR(damageThreshold), GVAR(AIDamageThreshold)], if !(isNull _sourceOfDamage && {_typeOfProjectile == ""} && {vehicle _unit == _unit} && {(_selectionName == "head" || isBurning _unit)}) then {
_unit getVariable [QGVAR(damageThreshold), GVAR(playerDamageThreshold)] _part = [_selectionName] call FUNC(selectionNameToNumber);
] select ([_unit] call EFUNC(common,isPlayer)); if (_part < 0) exitwith {};
_damage = _damage * (1 / _threshold);
// This is a new hit, reset variables. private ["_newDamage", "_pain"];
// Note: sometimes handleDamage spans over 2 or even 3 frames. _newDamage = (_cache_damages select _foreachIndex);
if (diag_frameno > (_unit getVariable [QGVAR(basic_frameNo), -3]) + 2) then { _damageBodyParts set [_part, (_damageBodyParts select _part) + _newDamage];
_unit setVariable [QGVAR(basic_frameNo), diag_frameno]; _unit setvariable [QGVAR(bodyPartStatus), _damageBodyParts];
_unit setVariable [QGVAR(isFalling), false];
_unit setVariable [QGVAR(projectiles), []];
_unit setVariable [QGVAR(hitPoints), []];
_unit setVariable [QGVAR(damages), []];
_unit setVariable [QGVAR(structDamage), 0];
if (isnil {_unit getvariable QGVAR(structDamagePFH)}) then { if (alive _unit && {!(_unit getvariable ["ACE_isUnconscious", false])}) then {
// Assign orphan structural damage to torso // If it reaches this, we can assume that the hit did not kill this unit, as this function is called 3 frames after the damage has been passed.
[{ if ([_unit, _part, if (_part > 1) then {_newDamage * 1.3} else {_newDamage * 2}] call FUNC(determineIfFatal)) then {
private ["_unit", "_damagesum"]; [_unit, true, 0.5+random(3)] call FUNC(setUnconscious);
_unit = (_this select 0) select 0;
if (ACE_diagTime - (_unit getvariable [QGVAR(structDamagePFH),-2]) >= 2) then {
_unit setVariable [QGVAR(structDamagePFH), nil];
_damagesum = (_unit getHitPointDamage "HitHead") +
(_unit getHitPointDamage "HitBody") +
(_unit getHitPointDamage "HitLeftArm") +
(_unit getHitPointDamage "HitRightArm") +
(_unit getHitPointDamage "HitLeftLeg") +
(_unit getHitPointDamage "HitRightLeg");
if (_damagesum < 0.06 and damage _unit > 0.06 and alive _unit) then {
_unit setHitPointDamage ["HitBody", damage _unit];
};
[(_this select 1)] call cba_fnc_removePerFrameHandler;
}; };
}, 0, [_unit]] call CBA_fnc_addPerFrameHandler;
};
_unit setVariable [QGVAR(structDamagePFH), ACE_diagTime]; // Assign starting ACE_time or reset it
};
_newDamage = _damage - (damage _unit);
if (_selectionName in GVAR(SELECTIONS)) then {
_newDamage = _damage - (_unit getHitPointDamage (GVAR(HITPOINTS) select (GVAR(SELECTIONS) find _selectionName)));
};
_damage = _damage - _newDamage;
// Exclude falling damage to everything other than legs and reduce it overall.
if (((velocity _unit) select 2 < -5) and (vehicle _unit == _unit)) then {
_unit setVariable [QGVAR(isFalling), true];
};
if (_unit getVariable [QGVAR(isFalling), false] and !(_selectionName in ["", "leg_l", "leg_r"])) exitWith {
(_unit getHitPointDamage (GVAR(HITPOINTS) select (GVAR(SELECTIONS) find _selectionName))) max 0.01;
};
if (_unit getVariable [QGVAR(isFalling), false]) then {
_newDamage = _newDamage * 0.7;
};
// Make sure there's only one damaged selection per projectile per frame.
if (_selectionName != "" and !(_unit getVariable QGVAR(isFalling))) then {
_cache_projectiles = _unit getVariable QGVAR(projectiles);
_cache_hitpoints = _unit getVariable QGVAR(hitPoints);
_cache_damages = _unit getVariable QGVAR(damages);
if (_projectile in _cache_projectiles) then {
_index = _cache_projectiles find _projectile;
_otherDamage = (_cache_damages select _index);
if (_otherDamage > _newDamage) then {
_newDamage = 0;
} else {
_hitPoint = _cache_hitpoints select _index;
_restore = ((_unit getHitPointDamage _hitPoint) - _otherDamage) max 0;
_unit setHitPointDamage [_hitPoint, _restore];
// Make entry unfindable
_cache_projectiles set [_index, objNull];
_cache_projectiles pushBack _projectile;
_cache_hitpoints pushBack (GVAR(HITPOINTS) select (GVAR(SELECTIONS) find _selectionName));
_cache_damages pushBack _newDamage;
}; };
} else { _pain = _unit getVariable [QGVAR(pain), 0];
_cache_projectiles pushBack _projectile; _pain = _pain + (_newDamage / 4) * (1 - (_unit getVariable [QGVAR(morphine), 0]));
_cache_hitpoints pushBack (GVAR(HITPOINTS) select (GVAR(SELECTIONS) find _selectionName)); _unit setVariable [QGVAR(pain), _pain min 1, true];
_cache_damages pushBack _newDamage;
}; };
_unit setVariable [QGVAR(projectiles), _cache_projectiles]; }foreach _cache_params;
_unit setVariable [QGVAR(hitPoints), _cache_hitpoints];
_unit setVariable [QGVAR(damages), _cache_damages];
};
// Get rid of double structural damage (seriously arma, what the fuck?) // We broadcast the value across the net here, in order to avoid broadcasting it multiple times earlier in the above code block
if (_selectionName == "") then { _target setvariable [QGVAR(bodyPartStatus), _damageBodyParts, true];
_cache_structDamage = _unit getVariable QGVAR(structDamage); TRACE_2("ACE_DEBUG: HandleDamage BASIC Broadcast value here",_unit, _target getvariable QGVAR(bodyPartStatus));
if (_newDamage > _cache_structDamage) then {
_unit setVariable [QGVAR(structDamage), _newDamage];
_newDamage = _newDamage - _cache_structDamage;
} else {
_newDamage = 0;
};
};
if (_selectionName == "") then { EXPLODE_6_PVT(_damageBodyParts,_headDamage,_torsoDamage,_handsDamageR,_handsDamageL,_legsDamageR,_legsDamageL);
_damage = _damage + (_unit getVariable QGVAR(structDamage)); _target setHitPointDamage ["hitHead", _headDamage min 0.95];
} else { _target setHitPointDamage ["hitBody", _torsoDamage min 0.95];
_damage = _damage + _newDamage; _target setHitPointDamage ["hitHands", (_handsDamageR + _handsDamageL) min 0.95];
}; _target setHitPointDamage ["hitLegs", (_legsDamageR + _legsDamageL) min 0.95];
// Leg Damage {
_legdamage = (_unit getHitPointDamage "HitLeftLeg") + (_unit getHitPointDamage "HitRightLeg"); _target setHitPointDamage [_x, (_damageBodyParts select _foreachIndex) min 0.95];
if (_selectionName == "leg_l") then { }foreach GVAR(HITPOINTS);
_legdamage = _damage + (_unit getHitPointDamage "HitRightLeg");
};
if (_selectionName == "leg_r") then {
_legdamage = (_unit getHitPointDamage "HitLeftLeg") + _damage;
};
if (_legdamage >= LEGDAMAGETRESHOLD1) then {
_unit setHitPointDamage ["HitLegs", 1];
} else {
_unit setHitPointDamage ["HitLegs", 0];
};
// @todo: force prone for completely fucked up legs.
// Arm Damage
_armdamage = (_unit getHitPointDamage "HitLeftArm") + (_unit getHitPointDamage "HitRightArm");
if (_selectionName == "hand_l") then {
_armdamage = _damage + (_unit getHitPointDamage "HitRightArm");
};
if (_selectionName == "hand_r") then {
_armdamage = (_unit getHitPointDamage "HitLeftArm") + _damage;
};
if (_armdamage >= ARMDAMAGETRESHOLD1) then {
_unit setHitPointDamage ["HitHands", 1];
} else {
_unit setHitPointDamage ["HitHands", 0];
};
// @todo: Drop weapon for full damage.
// Set Pain
if (_selectionName == "") then {
_pain = _unit getVariable [QGVAR(pain), 0];
_pain = _pain + _newDamage * (1 - (_unit getVariable [QGVAR(morphine), 0]));
_unit setVariable [QGVAR(pain), _pain min 1, true];
};
// Unconsciousness
if (_selectionName == "" and
_damage >= UNCONSCIOUSNESSTRESHOLD and
_damage < 1 and
!(_unit getVariable ["ACE_isUnconscious", False]
)) then {
[_unit, true] call FUNC(setUnconscious);
};
_damage

View File

@ -18,13 +18,9 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_selectionName", "_damage", "_source", "_projectile", "_hitSelections", "_hitPoints", "_impactVelocity", "_newDamage", "_cache_hitpoints", "_cache_projectiles", "_cache_params", "_cache_damages"]; private ["_hitSelections", "_hitPoints", "_impactVelocity", "_newDamage", "_cache_hitpoints", "_cache_projectiles", "_cache_params", "_cache_damages"];
_unit = _this select 0; params ["_unit", "_selectionName", "_damage", "_source", "_projectile"];
_selectionName = _this select 1; TRACE_8("ACE_DEBUG: HandleDamage_Caching Called",_unit, _selectionName, _damage, _source, _projectile,GVAR(SELECTIONS),GVAR(HITPOINTS),damage _unit);
_damage = _this select 2;
_source = _this select 3;
_projectile = _this select 4;
_hitSelections = GVAR(SELECTIONS); _hitSelections = GVAR(SELECTIONS);
_hitPoints = GVAR(HITPOINTS); _hitPoints = GVAR(HITPOINTS);
@ -78,21 +74,23 @@ if (diag_frameno > (_unit getVariable [QGVAR(frameNo_damageCaching), -3]) + 2) t
// handle the cached damages 3 frames later // handle the cached damages 3 frames later
[{ [{
private ["_args", "_params"]; private ["_args", "_params"];
_args = _this select 0; params ["_args", "_idPFH"];
_args params ["_unit", "_frameno"];
if (diag_frameno > _frameno + 2) then {
_unit setDamage 0;
if (diag_frameno > (_args select 1) + 2) then { if (GVAR(level) < 2 || {!([_unit] call FUNC(hasMedicalEnabled))}) then {
(_args select 0) setDamage 0; [_unit] call FUNC(handleDamage_basic);
} else {
_cache_params = (_args select 0) getVariable [QGVAR(cachedHandleDamageParams), []]; _cache_params = _unit getVariable [QGVAR(cachedHandleDamageParams), []];
_cache_damages = (_args select 0) getVariable QGVAR(cachedDamages); _cache_damages = _unit getVariable QGVAR(cachedDamages);
{ {
_params = _x + [_cache_damages select _foreachIndex]; _params = _x + [_cache_damages select _foreachIndex];
_params call FUNC(handleDamage_advanced); _params call FUNC(handleDamage_advanced);
}foreach _cache_params; } foreach _cache_params;
[_unit] call FUNC(handleDamage_advancedSetDamage);
[(_args select 0)] call FUNC(handleDamage_advancedSetDamage); };
[_idPFH] call CBA_fnc_removePerFrameHandler;
[(_this select 1)] call cba_fnc_removePerFrameHandler;
}; };
}, 0, [_unit, diag_frameno] ] call CBA_fnc_addPerFrameHandler; }, 0, [_unit, diag_frameno] ] call CBA_fnc_addPerFrameHandler;
@ -152,4 +150,6 @@ if (_selectionName != "") then {
_unit setVariable [QGVAR(cachedHandleDamageParams), _cache_params]; _unit setVariable [QGVAR(cachedHandleDamageParams), _cache_params];
}; };
_newDamage; TRACE_8("ACE_DEBUG: HandleDamage_Caching",_unit, _newDamage, _cache_params, _cache_damages, _unit getVariable QGVAR(cachedProjectiles), _unit getVariable QGVAR(cachedHitPoints), _unit getVariable QGVAR(cachedDamages), _unit getVariable QGVAR(cachedHandleDamageParams));
_newDamage

View File

@ -17,12 +17,8 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage", "_bodyPartn", "_fractures", "_fractureType"]; private ["_bodyPartn", "_fractures", "_fractureType"];
_unit = _this select 0; params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage"];
_selectionName = _this select 1;
_amountOfDamage = _this select 2;
_sourceOfDamage = _this select 3;
_typeOfDamage = _this select 4;
_bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); _bodyPartn = [_selectionName] call FUNC(selectionNameToNumber);
_fractureType = 1; _fractureType = 1;

View File

@ -10,19 +10,15 @@
* 4: Type of the damage done <STRING> * 4: Type of the damage done <STRING>
* *
* Return Value: * Return Value:
* None <NIL> * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage", "_bodyPartn"]; private "_bodyPartn";
_unit = _this select 0; params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage"];
_selectionName = _this select 1;
_amountOfDamage = _this select 2;
_sourceOfDamage = _this select 3;
_typeOfDamage = _this select 4;
_bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); _bodyPartn = [_selectionName] call FUNC(selectionNameToNumber);
// TODO implement internal injuries // TODO implement internal injuries

View File

@ -10,19 +10,16 @@
* 4: Type of the damage done <STRING> * 4: Type of the damage done <STRING>
* *
* Return Value: * Return Value:
* None <NIL> * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_selectionName", "_damage", "_typeOfProjectile", "_typeOfDamage", "_bodyPartn", "_injuryTypeInfo", "_allInjuriesForDamageType", "_allPossibleInjuries", "_highestPossibleDamage", "_highestPossibleSpot", "_minDamage", "_openWounds", "_woundID", "_toAddInjury", "_painToAdd", "_bloodLoss", "_bodyPartNToAdd", "_classType", "_damageLevels", "_foundIndex", "_i", "_injury", "_maxDamage", "_pain", "_painLevel", "_selections", "_toAddClassID", "_woundsCreated"]; private ["_bodyPartn", "_injuryTypeInfo", "_allInjuriesForDamageType", "_allPossibleInjuries", "_highestPossibleDamage", "_highestPossibleSpot", "_minDamage", "_openWounds", "_woundID", "_toAddInjury", "_painToAdd", "_bloodLoss", "_bodyPartNToAdd", "_classType", "_damageLevels", "_foundIndex", "_i", "_injury", "_maxDamage", "_pain", "_painLevel", "_selections", "_toAddClassID", "_woundsCreated"];
_unit = _this select 0; params ["_unit", "_selectionName", "_damage", "_typeOfProjectile", "_typeOfDamage"];
_selectionName = _this select 1; TRACE_6("ACE_DEBUG: HandleDamage Called",_unit, _selectionName, _damage, _shooter, _typeOfProjectile,_typeOfDamage);
_damage = _this select 2;
_typeOfProjectile = _this select 3;
_typeOfDamage = _this select 4;
// Administration for open wounds and ids // Administration for open wounds and ids
_openWounds = _unit getvariable[QGVAR(openWounds), []]; _openWounds = _unit getvariable[QGVAR(openWounds), []];
@ -43,7 +40,7 @@ _foundIndex = -1;
if (_x select 1 == _toAddClassID && {_x select 2 == _bodyPartNToAdd}) exitwith { if (_x select 1 == _toAddClassID && {_x select 2 == _bodyPartNToAdd}) exitwith {
_foundIndex = _foreachIndex; _foundIndex = _foreachIndex;
}; };
}foreach _openWounds; } foreach _openWounds;
if (_foundIndex < 0) then { if (_foundIndex < 0) then {
// Since it is a new injury, we will have to add it to the open wounds array to store it // Since it is a new injury, we will have to add it to the open wounds array to store it
@ -53,7 +50,7 @@ _foundIndex = -1;
_injury = _openWounds select _foundIndex; _injury = _openWounds select _foundIndex;
_injury set [3, (_injury select 3) + 1]; _injury set [3, (_injury select 3) + 1];
}; };
}foreach _woundsCreated; } foreach _woundsCreated;
_unit setvariable [QGVAR(openWounds), _openWounds, true]; _unit setvariable [QGVAR(openWounds), _openWounds, true];
@ -64,3 +61,4 @@ if (count _woundsCreated > 0) then {
_painLevel = _unit getvariable [QGVAR(pain), 0]; _painLevel = _unit getvariable [QGVAR(pain), 0];
_unit setvariable [QGVAR(pain), _painLevel + _painToAdd]; _unit setvariable [QGVAR(pain), _painLevel + _painToAdd];
TRACE_6("ACE_DEBUG: HandleDamage_WoundsOLD",_unit, _painLevel, _painToAdd, _unit getvariable QGVAR(pain), _unit getvariable QGVAR(openWounds),_woundsCreated);

View File

@ -17,12 +17,9 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_selectionName", "_damage", "_typeOfProjectile", "_typeOfDamage", "_bodyPartn", "_injuryTypeInfo", "_allInjuriesForDamageType", "_allPossibleInjuries", "_highestPossibleDamage", "_highestPossibleSpot", "_minDamage", "_openWounds", "_woundID", "_toAddInjury", "_painToAdd", "_bloodLoss", "_bodyPartNToAdd", "_classType", "_damageLevels", "_foundIndex", "_i", "_injury", "_maxDamage", "_pain", "_painLevel", "_selections", "_toAddClassID", "_woundsCreated"]; private ["_bodyPartn", "_injuryTypeInfo", "_allInjuriesForDamageType", "_allPossibleInjuries", "_highestPossibleDamage", "_highestPossibleSpot", "_minDamage", "_openWounds", "_woundID", "_toAddInjury", "_painToAdd", "_bloodLoss", "_bodyPartNToAdd", "_classType", "_damageLevels", "_foundIndex", "_i", "_injury", "_maxDamage", "_pain", "_painLevel", "_selections", "_toAddClassID", "_woundsCreated"];
_unit = _this select 0; params ["_unit", "_selectionName", "_damage", "_typeOfProjectile", "_typeOfDamage"];
_selectionName = _this select 1; TRACE_6("ACE_DEBUG: HandleDamage_WoundsOLD Called",_unit, _selectionName, _damage, _shooter, _typeOfProjectile,_typeOfDamage);
_damage = _this select 2;
_typeOfProjectile = _this select 3;
_typeOfDamage = _this select 4;
// Convert the selectionName to a number and ensure it is a valid selection. // Convert the selectionName to a number and ensure it is a valid selection.
_bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); _bodyPartn = [_selectionName] call FUNC(selectionNameToNumber);
@ -70,7 +67,7 @@ _allPossibleInjuries = [];
_allPossibleInjuries pushback _x; _allPossibleInjuries pushback _x;
}; };
}; };
}foreach _allInjuriesForDamageType; } foreach _allInjuriesForDamageType;
// No possible wounds available for this damage type or damage amount. // No possible wounds available for this damage type or damage amount.
if (_highestPossibleSpot < 0) exitwith {}; if (_highestPossibleSpot < 0) exitwith {};
@ -98,7 +95,7 @@ _woundsCreated = [];
if (_x select 1 == _toAddClassID && {_x select 2 == _bodyPartNToAdd}) exitwith { if (_x select 1 == _toAddClassID && {_x select 2 == _bodyPartNToAdd}) exitwith {
_foundIndex = _foreachIndex; _foundIndex = _foreachIndex;
}; };
}foreach _openWounds; } foreach _openWounds;
}; };
_injury = []; _injury = [];
@ -123,21 +120,15 @@ _woundsCreated = [];
_painToAdd = _painToAdd + (_toAddInjury select 3); _painToAdd = _painToAdd + (_toAddInjury select 3);
}; };
}; };
}foreach (_injuryTypeInfo select 0); // foreach damage thresholds } foreach (_injuryTypeInfo select 0); // foreach damage thresholds
_unit setvariable [QGVAR(openWounds), _openWounds, !USE_WOUND_EVENT_SYNC]; _unit setvariable [QGVAR(openWounds), _openWounds, true];
// Only update if new wounds have been created // Only update if new wounds have been created
if (count _woundsCreated > 0) then { if (count _woundsCreated > 0) then {
// _unit setvariable [QGVAR(lastUniqueWoundID), _woundID, true]; _unit setvariable [QGVAR(lastUniqueWoundID), _woundID, true];
};
if (USE_WOUND_EVENT_SYNC) then {
// Broadcast the new injuries across the net in parts. One broadcast per injury. Prevents having to broadcast one massive array of injuries.
{
// ["medical_propagateWound", [_unit, _x]] call EFUNC(common,globalEvent);
}foreach _woundsCreated;
}; };
_painLevel = _unit getvariable [QGVAR(pain), 0]; _painLevel = _unit getvariable [QGVAR(pain), 0];
_unit setvariable [QGVAR(pain), _painLevel + _painToAdd]; _unit setvariable [QGVAR(pain), _painLevel + _painToAdd];
TRACE_6("ACE_DEBUG: HandleDamage_WoundsOLD",_unit, _painLevel, _painToAdd, _unit getvariable QGVAR(pain), _unit getvariable QGVAR(openWounds),_woundsCreated);

View File

@ -13,8 +13,8 @@
#include "script_component.hpp" #include "script_component.hpp"
private["_unit", "_openWounds"]; private "_openWounds";
_unit = _this select 0; params ["_unit"];
if (!local _unit) exitwith {}; if (!local _unit) exitwith {};
_unit setvariable [QGVAR(pain), 0]; _unit setvariable [QGVAR(pain), 0];
@ -22,11 +22,4 @@ if (GVAR(level) >= 2) then {
_unit setvariable [QGVAR(heartRate), 0]; _unit setvariable [QGVAR(heartRate), 0];
_unit setvariable [QGVAR(bloodPressure), [0, 0]]; _unit setvariable [QGVAR(bloodPressure), [0, 0]];
_unit setvariable [QGVAR(airwayStatus), 0]; _unit setvariable [QGVAR(airwayStatus), 0];
if (USE_WOUND_EVENT_SYNC) then {
_openWounds = _unit getvariable [QGVAR(openWounds), []];
{
["medical_propagateWound", [_unit, _x]] call EFUNC(common,globalEvent);
}foreach _openWounds;
};
}; };

View File

@ -15,9 +15,7 @@
#include "script_component.hpp" #include "script_component.hpp"
private["_unit", "_local"]; params ["_unit", "_local"];
_unit = _this select 0;
_local = _this select 1;
if (_local) then { if (_local) then {
if (_unit getvariable[QGVAR(addedToUnitLoop),false]) then { if (_unit getvariable[QGVAR(addedToUnitLoop),false]) then {
[_unit, true] call FUNC(addToInjuredCollection); [_unit, true] call FUNC(addToInjuredCollection);

View File

@ -13,10 +13,9 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_heartRate","_bloodPressure","_bloodVolume","_painStatus", "_lastTimeValuesSynced", "_syncValues", "_airwayStatus", "_blood", "_bloodPressureH", "_bloodPressureL", "_interval"]; private ["_heartRate","_bloodPressure","_bloodVolume","_painStatus", "_lastTimeValuesSynced", "_syncValues", "_airwayStatus", "_blood"];
_unit = _this select 0; params ["_unit", "_interval"];
_interval = _this select 1; TRACE_3("ACE_DEBUG",_unit,_interval,_unit);
if (_interval == 0) exitWith {}; if (_interval == 0) exitWith {};
_lastTimeValuesSynced = _unit getvariable [QGVAR(lastMomentValuesSynced), 0]; _lastTimeValuesSynced = _unit getvariable [QGVAR(lastMomentValuesSynced), 0];
@ -30,23 +29,28 @@ _bloodVolume = _bloodVolume max 0;
_unit setvariable [QGVAR(bloodVolume), _bloodVolume, _syncValues]; _unit setvariable [QGVAR(bloodVolume), _bloodVolume, _syncValues];
TRACE_3("ACE_DEBUG",_bloodVolume,_syncValues,_unit);
// Set variables for synchronizing information across the net // Set variables for synchronizing information across the net
if (_bloodVolume < 100) then { if (_bloodVolume < 100) then {
if ((_bloodVolume < 90 && (GVAR(level) == 2)) || _bloodVolume <= 45) then { if ((_bloodVolume < 90 && (GVAR(level) == 2)) || _bloodVolume <= 45) then {
TRACE_4("ACE_DEBUG_ADVANCED",_bloodVolume,_unit getVariable QGVAR(hasLostBlood),_syncValues,_unit);
if (_unit getvariable [QGVAR(hasLostBlood), 0] != 2) then { if (_unit getvariable [QGVAR(hasLostBlood), 0] != 2) then {
_unit setvariable [QGVAR(hasLostBlood), 2, true]; _unit setvariable [QGVAR(hasLostBlood), 2, true];
}; };
} else { } else {
TRACE_4("ACE_DEBUG", _bloodVolume,_unit getVariable QGVAR(hasLostBlood),_syncValues,_unit);
if (_unit getvariable [QGVAR(hasLostBlood), 0] != 1) then { if (_unit getvariable [QGVAR(hasLostBlood), 0] != 1) then {
_unit setvariable [QGVAR(hasLostBlood), 1, true]; _unit setvariable [QGVAR(hasLostBlood), 1, true];
}; };
} }
} else { } else {
TRACE_4("ACE_DEBUG",_bloodVolume,_unit getVariable QGVAR(hasLostBlood),_syncValues,_unit);
if (_unit getvariable [QGVAR(hasLostBlood), 0] != 0) then { if (_unit getvariable [QGVAR(hasLostBlood), 0] != 0) then {
_unit setvariable [QGVAR(hasLostBlood), 0, true]; _unit setvariable [QGVAR(hasLostBlood), 0, true];
}; };
}; };
TRACE_3("ACE_DEBUG",[_unit] call FUNC(getBloodLoss),_unit getVariable QGVAR(isBleeding),_unit);
if (([_unit] call FUNC(getBloodLoss)) > 0) then { if (([_unit] call FUNC(getBloodLoss)) > 0) then {
if !(_unit getvariable [QGVAR(isBleeding), false]) then { if !(_unit getvariable [QGVAR(isBleeding), false]) then {
_unit setvariable [QGVAR(isBleeding), true, true]; _unit setvariable [QGVAR(isBleeding), true, true];
@ -58,6 +62,7 @@ if (([_unit] call FUNC(getBloodLoss)) > 0) then {
}; };
_painStatus = _unit getvariable [QGVAR(pain), 0]; _painStatus = _unit getvariable [QGVAR(pain), 0];
TRACE_4("ACE_DEBUG",_painStatus,_unit getVariable QGVAR(hasPain),_unit getVariable QGVAR(painSuppress),_unit);
if (_painStatus > (_unit getvariable [QGVAR(painSuppress), 0])) then { if (_painStatus > (_unit getvariable [QGVAR(painSuppress), 0])) then {
if !(_unit getvariable [QGVAR(hasPain), false]) then { if !(_unit getvariable [QGVAR(hasPain), false]) then {
_unit setvariable [QGVAR(hasPain), true, true]; _unit setvariable [QGVAR(hasPain), true, true];
@ -69,6 +74,7 @@ if (_painStatus > (_unit getvariable [QGVAR(painSuppress), 0])) then {
}; };
if (GVAR(level) == 1) then { if (GVAR(level) == 1) then {
TRACE_5("ACE_DEBUG_BASIC_VITALS",_painStatus,_unit getVariable QGVAR(hasPain),_unit getVariable QGVAR(morphine),_syncValues,_unit);
// reduce pain // reduce pain
if (_painStatus > 0) then { if (_painStatus > 0) then {
_unit setVariable [QGVAR(pain), (_painStatus - 0.001 * _interval) max 0, _syncValues]; _unit setVariable [QGVAR(pain), (_painStatus - 0.001 * _interval) max 0, _syncValues];
@ -91,6 +97,7 @@ if (GVAR(level) == 1) then {
// handle advanced medical, with vitals // handle advanced medical, with vitals
if (GVAR(level) >= 2) then { if (GVAR(level) >= 2) then {
TRACE_6("ACE_DEBUG_ADVANCED_VITALS",_painStatus,_bloodVolume, _unit getVariable QGVAR(hasPain),_unit getVariable QGVAR(morphine),_syncValues,_unit);
if (_bloodVolume < 30) exitwith { if (_bloodVolume < 30) exitwith {
[_unit] call FUNC(setDead); [_unit] call FUNC(setDead);
}; };
@ -105,7 +112,7 @@ if (GVAR(level) >= 2) then {
// Set the vitals // Set the vitals
_heartRate = (_unit getvariable [QGVAR(heartRate), 80]) + (([_unit] call FUNC(getHeartRateChange)) * _interval); _heartRate = (_unit getvariable [QGVAR(heartRate), 80]) + (([_unit] call FUNC(getHeartRateChange)) * _interval);
_unit setvariable [QGVAR(heartRate), _heartRate, _syncValues]; _unit setvariable [QGVAR(heartRate), _heartRate max 0, _syncValues];
_bloodPressure = [_unit] call FUNC(getBloodPressure); _bloodPressure = [_unit] call FUNC(getBloodPressure);
_unit setvariable [QGVAR(bloodPressure), _bloodPressure, _syncValues]; _unit setvariable [QGVAR(bloodPressure), _bloodPressure, _syncValues];
@ -114,7 +121,7 @@ if (GVAR(level) >= 2) then {
_painReduce = if (_painStatus > 5) then {0.002} else {0.001}; _painReduce = if (_painStatus > 5) then {0.002} else {0.001};
_unit setVariable [QGVAR(pain), (_painStatus - _painReduce * _interval) max 0, _syncValues]; _unit setVariable [QGVAR(pain), (_painStatus - _painReduce * _interval) max 0, _syncValues];
}; };
TRACE_8("ACE_DEBUG_ADVANCED_VITALS",_painStatus,_painReduce,_heartRate,_bloodVolume,_bloodPressure,_interval,_syncValues,_unit);
// TODO Disabled until implemented fully // TODO Disabled until implemented fully
// Handle airway // Handle airway
/*if (GVAR(setting_allowAirwayInjuries)) then { /*if (GVAR(setting_allowAirwayInjuries)) then {
@ -140,8 +147,7 @@ if (GVAR(level) >= 2) then {
// Check vitals for medical status // Check vitals for medical status
// TODO check for in revive state instead of variable // TODO check for in revive state instead of variable
_bloodPressureL = _bloodPressure select 0; _bloodPressure params ["_bloodPressureL", "_bloodPressureH"];
_bloodPressureH = _bloodPressure select 1;
if (!(_unit getvariable [QGVAR(inCardiacArrest),false])) then { if (!(_unit getvariable [QGVAR(inCardiacArrest),false])) then {
if (_heartRate < 10 || _bloodPressureH < 30 || _bloodVolume < 20) then { if (_heartRate < 10 || _bloodPressureH < 30 || _bloodVolume < 20) then {
@ -174,12 +180,13 @@ if (GVAR(level) >= 2) then {
// syncing any remaining values // syncing any remaining values
if (_syncValues) then { if (_syncValues) then {
TRACE_3("ACE_DEBUG_IVBAGS_SYNC",GVAR(IVBags),_syncValues,_unit);
{ {
private "_value"; private "_value";
_value = _unit getvariable _x; _value = _unit getvariable _x;
if !(isnil "_value") then { if !(isnil "_value") then {
_unit setvariable [_x,(_unit getvariable [_x, 0]), true]; _unit setvariable [_x,(_unit getvariable [_x, 0]), true];
}; };
}foreach GVAR(IVBags); } foreach GVAR(IVBags);
}; };
}; };

View File

@ -16,19 +16,17 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_medic", "_patient", "_item", "_return", "_crew"]; private ["_medic", "_patient", "_item", "_return", "_crew"];
_medic = _this select 0; params ["_medic", "_patient", "_item"];
_patient = _this select 1;
_item = _this select 2;
if (isnil QGVAR(setting_allowSharedEquipment)) then { if (isnil QGVAR(setting_allowSharedEquipment)) then {
GVAR(setting_allowSharedEquipment) = true; GVAR(setting_allowSharedEquipment) = true;
}; };
if (GVAR(setting_allowSharedEquipment) && {[_patient, _item] call EFUNC(common,hasItem)}) exitwith { if (GVAR(setting_allowSharedEquipment) && {[_patient, _item] call EFUNC(common,hasItem)}) exitwith {
true; true
}; };
if ([_medic, _item] call EFUNC(common,hasItem)) exitwith { if ([_medic, _item] call EFUNC(common,hasItem)) exitwith {
true; true
}; };
_return = false; _return = false;
@ -38,7 +36,7 @@ if ((vehicle _medic != _medic) && {[vehicle _medic] call FUNC(isMedicalVehicle)}
if ([_medic, _x] call FUNC(canAccessMedicalEquipment) && {([_x, _item] call EFUNC(common,hasItem))}) exitwith { if ([_medic, _x] call FUNC(canAccessMedicalEquipment) && {([_x, _item] call EFUNC(common,hasItem))}) exitwith {
_return = true; _return = true;
}; };
}foreach _crew; } foreach _crew;
}; };
_return; _return

View File

@ -16,9 +16,7 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_medic", "_patient", "_items", "_return"]; private ["_medic", "_patient", "_items", "_return"];
_medic = _this select 0; params ["_medic", "_patient", "_items"];
_patient = _this select 1;
_items = _this select 2;
_return = true; _return = true;
{ {
@ -31,4 +29,4 @@ _return = true;
}; };
}foreach _items; }foreach _items;
_return; _return

View File

@ -1,21 +1,27 @@
/**
* fn_hasMedicalEnabled.sqf
* @Descr: Check if unit has CMS enabled.
* @Author: Glowbal
*
* @Arguments: [unit OBJECT]
* @Return: BOOL
* @PublicAPI: true
*/
/*
* Author: Glowbal
* Check if unit has CMS enabled
*
* Arguments:
* 0: unit <OBJECT>
*
* Return Value:
* enabled <BOOL>
*
* Example:
* [Unit] call ace_medical_fnc_hasMedicalEnabled
*
* Public: No
*/
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_medicalEnabled"]; private "_medicalEnabled";
_unit = _this select 0; params ["_unit"];
_medicalEnabled = _unit getvariable QGVAR(enableMedical); _medicalEnabled = _unit getvariable QGVAR(enableMedical);
if (isnil "_medicalEnabled") exitwith { if (isnil "_medicalEnabled") exitwith {
(((GVAR(enableFor) == 0 && (isPlayer _unit || (_unit getvariable [QEGVAR(common,isDeadPlayer), false])))) || (GVAR(enableFor) == 1) || GVAR(level) == 1); (((GVAR(enableFor) == 0 && (isPlayer _unit || (_unit getvariable [QEGVAR(common,isDeadPlayer), false])))) || (GVAR(enableFor) == 1) || GVAR(level) == 1)
}; };
_medicalEnabled; _medicalEnabled

View File

@ -14,8 +14,6 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_target", "_selectionName"]; params ["_target", "_selectionName"];
_target = _this select 0;
_selectionName = _this select 1;
(((_target getvariable [QGVAR(tourniquets), [0,0,0,0,0,0]]) select ([_selectionName] call FUNC(selectionNameToNumber))) > 0); (((_target getvariable [QGVAR(tourniquets), [0,0,0,0,0,0]]) select ([_selectionName] call FUNC(selectionNameToNumber))) > 0);

View File

@ -1,5 +1,5 @@
/* /*
* Author: KoffeinFlummi * Author: KoffeinFlummi, commy2
* Initializes unit variables. * Initializes unit variables.
* *
* Arguments: * Arguments:
@ -10,17 +10,17 @@
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_allUsedMedication", "_logs"]; params ["_unit"];
_unit = _this select 0;
// basic
_unit setVariable [QGVAR(pain), 0, true]; _unit setVariable [QGVAR(pain), 0, true];
_unit setVariable [QGVAR(morphine), 0, true]; _unit setVariable [QGVAR(morphine), 0, true];
_unit setVariable [QGVAR(bloodVolume), 100, true]; _unit setVariable [QGVAR(bloodVolume), 100, true];
_unit setVariable ["ACE_isUnconscious", false, true];
// advanced
// tourniquets // tourniquets
_unit setvariable [QGVAR(tourniquets), [0,0,0,0,0,0], true]; _unit setvariable [QGVAR(tourniquets), [0,0,0,0,0,0], true];
@ -59,13 +59,14 @@ _unit setvariable [QGVAR(airwayCollapsed), false];
// generic medical admin // generic medical admin
_unit setvariable [QGVAR(addedToUnitLoop), false, true]; _unit setvariable [QGVAR(addedToUnitLoop), false, true];
_unit setvariable [QGVAR(inCardiacArrest), false, true]; _unit setvariable [QGVAR(inCardiacArrest), false, true];
_unit setVariable ["ACE_isUnconscious", false, true];
_unit setvariable [QGVAR(hasLostBlood), 0, true]; _unit setvariable [QGVAR(hasLostBlood), 0, true];
_unit setvariable [QGVAR(isBleeding), false, true]; _unit setvariable [QGVAR(isBleeding), false, true];
_unit setvariable [QGVAR(hasPain), false, true]; _unit setvariable [QGVAR(hasPain), false, true];
_unit setvariable [QGVAR(amountOfReviveLives), GVAR(amountOfReviveLives), true]; _unit setvariable [QGVAR(amountOfReviveLives), GVAR(amountOfReviveLives), true];
_unit setvariable [QGVAR(painSuppress), 0, true]; _unit setvariable [QGVAR(painSuppress), 0, true];
private ["_allUsedMedication", "_logs"];
// medication // medication
_allUsedMedication = _unit getVariable [QGVAR(allUsedMedication), []]; _allUsedMedication = _unit getVariable [QGVAR(allUsedMedication), []];
{ {

View File

@ -15,7 +15,7 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_1(_target); params ["_target"];
private "_owner"; private "_owner";

View File

@ -15,7 +15,7 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_1(_target); params ["_target"];
private "_owner"; private "_owner";

View File

@ -13,8 +13,8 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit","_eyePos","_objects","_isInBuilding","_medicalFacility"]; private ["_eyePos", "_objects", "_isInBuilding", "_medicalFacility"];
_unit = _this select 0; params ["_unit"];
_eyePos = eyePos _unit; _eyePos = eyePos _unit;
_isInBuilding = false; _isInBuilding = false;
@ -42,13 +42,13 @@ _objects = (lineIntersectsWith [_unit modelToWorldVisual [0, 0, (_eyePos select
if (((typeOf _x) in _medicalFacility) || (_x getVariable [QGVAR(isMedicalFacility),false])) exitwith { if (((typeOf _x) in _medicalFacility) || (_x getVariable [QGVAR(isMedicalFacility),false])) exitwith {
_isInBuilding = true; _isInBuilding = true;
}; };
}foreach _objects; } foreach _objects;
if (!_isInBuilding) then { if (!_isInBuilding) then {
_objects = position _unit nearObjects 7.5; _objects = position _unit nearObjects 7.5;
{ {
if (((typeOf _x) in _medicalFacility) || (_x getVariable [QGVAR(isMedicalFacility),false])) exitwith { if (((typeOf _x) in _medicalFacility) || (_x getVariable [QGVAR(isMedicalFacility),false])) exitwith {
_isInBuilding = true; _isInBuilding = true;
}; };
}foreach _objects; } foreach _objects;
}; };
_isInBuilding; _isInBuilding;

View File

@ -13,9 +13,8 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_vehicle"]; private ["_vehicle"];
params ["_unit"];
_unit = _this select 0;
_vehicle = vehicle _unit; _vehicle = vehicle _unit;
if (_unit == _vehicle) exitWith {false}; if (_unit == _vehicle) exitWith {false};

View File

@ -13,8 +13,8 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit"]; private ["_openWounds", "_openWounds"];
_unit = _this select 0; params ["_unit"];
if (GVAR(level) <= 1) exitwith { if (GVAR(level) <= 1) exitwith {
([_unit] call FUNC(getBloodloss)) == 0; ([_unit] call FUNC(getBloodloss)) == 0;
@ -25,6 +25,6 @@ _openWounds = _unit getvariable [QGVAR(openWounds), []];
{ {
// total bleeding ratio * percentage of injury left // total bleeding ratio * percentage of injury left
_totalBloodLoss = _totalBloodLoss + ((_x select 4) * (_x select 3)); _totalBloodLoss = _totalBloodLoss + ((_x select 4) * (_x select 3));
}foreach _openWounds; } foreach _openWounds;
(_totalBloodLoss == 0); (_totalBloodLoss == 0);

View File

@ -4,7 +4,7 @@
* *
* Arguments: * Arguments:
* 0: The Unit <OBJECT> * 0: The Unit <OBJECT>
* 1: Class <NUMBER> <OPTIONAL> * 1: Class <NUMBER> (default: 1)
* *
* ReturnValue: * ReturnValue:
* Is in of medic class <BOOL> * Is in of medic class <BOOL>
@ -15,8 +15,7 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_class", "_medicN"]; private ["_unit", "_class", "_medicN"];
_unit = _this select 0; params ["_unit", ["_medicN", 1]];
_medicN = if (count _this > 1) then {_this select 1} else {1};
_class = _unit getVariable [QGVAR(medicClass), _class = _unit getVariable [QGVAR(medicClass),
getNumber (configFile >> "CfgVehicles" >> typeOf _unit >> "attendant")]; getNumber (configFile >> "CfgVehicles" >> typeOf _unit >> "attendant")];

View File

@ -12,7 +12,6 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_vehicle"]; params ["_vehicle"];
_vehicle = _this select 0;
(_vehicle getVariable [QGVAR(medicClass), getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "attendant")]) > 0 (_vehicle getVariable [QGVAR(medicClass), getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "attendant")]) > 0

View File

@ -6,15 +6,14 @@
* 0: The unit <OBJECT> * 0: The unit <OBJECT>
* *
* ReturnValue: * ReturnValue:
* nil * None
* *
* Public: Yes * Public: Yes
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit"]; params ["_unit"];
_unit = _this select 0;
while {({_x == "FirstAidKit"} count items _unit) > 0} do { while {({_x == "FirstAidKit"} count items _unit) > 0} do {
_unit removeItem "FirstAidKit"; _unit removeItem "FirstAidKit";

View File

@ -10,17 +10,18 @@
* 3: The action to modify <OBJECT> * 3: The action to modify <OBJECT>
* *
* ReturnValue: * ReturnValue:
* nil * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
EXPLODE_4_PVT(_this,_target,_player,_selectionN,_actionData); params ["_target", "_player", "_selectionN", "_actionData"];
if (GVAR(level) < 2) exitwith { if (GVAR(level) < 2) exitwith {
private ["_pointDamage"]; private ["_pointDamage"];
_pointDamage = _target getHitPointDamage (["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"] select _selectionN); _pointDamage = (_target getvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]) select _selectionN;
if (_pointDamage >= 0.8) exitWith { if (_pointDamage >= 0.8) exitWith {
_actionData set [2, QUOTE(PATHTOF(UI\icons\medical_crossRed.paa))]; _actionData set [2, QUOTE(PATHTOF(UI\icons\medical_crossRed.paa))];
@ -33,8 +34,8 @@ if (GVAR(level) < 2) exitwith {
private ["_openWounds", "_amountOf"]; private ["_openWounds", "_amountOf"];
_openWounds = _target getvariable [QGVAR(openWounds), []]; _openWounds = _target getvariable [QGVAR(openWounds), []];
{ {
_amountOf = _x select 3; _x params ["", "", "_selectionX", "_amountOf", "_x4"];
if (_amountOf > 0 && {(_selectionN == (_x select 2))} && {(_x select 4) > 0}) exitwith { if (_amountOf > 0 && {(_selectionN == _selectionX)} && {_x4 > 0}) exitwith {
_actionData set [2, QUOTE(PATHTOF(UI\icons\medical_crossRed.paa))]; _actionData set [2, QUOTE(PATHTOF(UI\icons\medical_crossRed.paa))];
}; };
} foreach _openWounds; } foreach _openWounds;

View File

@ -8,17 +8,14 @@
* 2: activated <BOOL> * 2: activated <BOOL>
* *
* Return Value: * Return Value:
* None <NIL> * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_logic", "_units", "_activated"]; params ["_logic", "_units", "_activated"];
_logic = _this select 0;
_units = _this select 1;
_activated = _this select 2;
if !(_activated) exitWith {}; if !(_activated) exitWith {};

View File

@ -8,15 +8,15 @@
* 2: activated <BOOL> * 2: activated <BOOL>
* *
* Return Value: * Return Value:
* None <NIL> * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_logic","_setting","_objects", "_list", "_splittedList", "_nilCheckPassedList", "_parsedList"]; private ["_setting", "_objects", "_list", "_splittedList", "_nilCheckPassedList", "_parsedList"];
_logic = [_this,0,objNull,[objNull]] call BIS_fnc_param; params [["_logic", objNull, [objNull]]];
if (!isNull _logic) then { if (!isNull _logic) then {
_list = _logic getvariable ["EnableList",""]; _list = _logic getvariable ["EnableList",""];
@ -32,7 +32,7 @@ if (!isNull _logic) then {
_nilCheckPassedList = _nilCheckPassedList + ","+ _x; _nilCheckPassedList = _nilCheckPassedList + ","+ _x;
}; };
}; };
}foreach _splittedList; } foreach _splittedList;
_list = "[" + _nilCheckPassedList + "]"; _list = "[" + _nilCheckPassedList + "]";
_parsedList = [] call compile _list; _parsedList = [] call compile _list;
@ -47,7 +47,7 @@ if (!isNull _logic) then {
}; };
}; };
}; };
}foreach _objects; } foreach _objects;
}; };
{ {
if (!isnil "_x") then { if (!isnil "_x") then {
@ -57,7 +57,5 @@ if (!isNull _logic) then {
}; };
}; };
}; };
}foreach _parsedList; } foreach _parsedList;
}; };
true

View File

@ -8,15 +8,15 @@
* 2: activated <BOOL> * 2: activated <BOOL>
* *
* Return Value: * Return Value:
* None <NIL> * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_logic","_setting","_objects"]; private ["_setting", "_objects"];
_logic = [_this,0,objNull,[objNull]] call BIS_fnc_param; params [["_logic", objNull, [objNull]]];
if (!isNull _logic) then { if (!isNull _logic) then {
_setting = _logic getvariable ["class",0]; _setting = _logic getvariable ["class",0];
_objects = synchronizedObjects _logic; _objects = synchronizedObjects _logic;
@ -24,7 +24,7 @@ if (!isNull _logic) then {
if (local _x) then { if (local _x) then {
_x setvariable[QGVAR(isMedicalFacility), true, true]; _x setvariable[QGVAR(isMedicalFacility), true, true];
}; };
}foreach _objects; } foreach _objects;
}; };
true; true;

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