From 8cd8504b3f434186121b12bd5435e6d860971a45 Mon Sep 17 00:00:00 2001 From: Joko Date: Fri, 10 Jul 2015 22:30:07 +0200 Subject: [PATCH 001/170] Add Posibility to Change Backblast Values in Magazine Config --- addons/overpressure/CfgEventHandlers.hpp | 14 +++++++------- .../functions/fnc_fireLauncherBackblast.sqf | 12 +++++++++--- .../functions/fnc_fireOverpressureZone.sqf | 13 ++++++++++--- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/addons/overpressure/CfgEventHandlers.hpp b/addons/overpressure/CfgEventHandlers.hpp index 439270861b..a008c845f1 100644 --- a/addons/overpressure/CfgEventHandlers.hpp +++ b/addons/overpressure/CfgEventHandlers.hpp @@ -14,38 +14,38 @@ class Extended_PostInit_EventHandlers { class Extended_FiredBIS_EventHandlers { class CAManBase { class ADDON { - firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0}) then {_this call DFUNC(fireLauncherBackblast)}); + firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgMagazines' >> _this select 5 >> QUOTE(QGVAR(Damage))) > 0} || {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0}) then {_this call DFUNC(fireLauncherBackblast)}); }; }; class Tank { class ADDON { - firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0}) then {_this call DFUNC(fireOverpressureZone)}); + firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgMagazines' >> _this select 5 >> QUOTE(QGVAR(Damage))) > 0} || {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0}) then {_this call DFUNC(fireOverpressureZone)}); }; }; class Car { class ADDON { - firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0}) then {_this call DFUNC(fireOverpressureZone)}); + firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgMagazines' >> _this select 5 >> QUOTE(QGVAR(Damage))) > 0} || {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0}) then {_this call DFUNC(fireOverpressureZone)}); }; }; class Helicopter { class ADDON { - firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0}) then {_this call DFUNC(fireOverpressureZone)}); + firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgMagazines' >> _this select 5 >> QUOTE(QGVAR(Damage))) > 0} || {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0}) then {_this call DFUNC(fireOverpressureZone)}); }; }; class Plane { class ADDON { - firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0}) then {_this call DFUNC(fireOverpressureZone)}); + firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgMagazines' >> _this select 5 >> QUOTE(QGVAR(Damage))) > 0} || {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0}) then {_this call DFUNC(fireOverpressureZone)}); }; }; class Ship_F { class ADDON { - firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0}) then {_this call DFUNC(fireOverpressureZone)}); + firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgMagazines' >> _this select 5 >> QUOTE(QGVAR(Damage))) > 0} || {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0}) then {_this call DFUNC(fireOverpressureZone)}); }; }; class StaticWeapon { class ADDON { - firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0}) then {_this call DFUNC(fireOverpressureZone)}); + firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgMagazines' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0} || {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0}) then {_this call DFUNC(fireOverpressureZone)}); }; }; }; diff --git a/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf b/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf index d5c28cca44..c3b19db29a 100644 --- a/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf +++ b/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf @@ -29,10 +29,16 @@ _position = getPosASL _projectile; _direction = [0, 0, 0] vectorDiff (vectorDir _projectile); private ["_backblastAngle", "_backblastRange", "_backblastDamage"]; +_backblastDamage = getNumber (configFile >> "CfgMagazines" >> _magazine >> QGVAR(damage)); -_backblastAngle = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(angle)) / 2; -_backblastRange = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(range)); -_backblastDamage = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(damage)); +if (_backblastDamage == 0) then { + _backblastAngle = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(angle)) / 2; + _backblastRange = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(range)); + _backblastDamage = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(damage)); +} else { + _backblastAngle = getNumber (configFile >> "CfgMagazines" >> _magazine >> QGVAR(angle)) / 2; + _backblastRange = getNumber (configFile >> "CfgMagazines" >> _magazine >> QGVAR(range)); +}; // Damage to others private "_affected"; diff --git a/addons/overpressure/functions/fnc_fireOverpressureZone.sqf b/addons/overpressure/functions/fnc_fireOverpressureZone.sqf index 4438e4a859..c51baf3e64 100644 --- a/addons/overpressure/functions/fnc_fireOverpressureZone.sqf +++ b/addons/overpressure/functions/fnc_fireOverpressureZone.sqf @@ -30,9 +30,16 @@ _direction = vectorDir _projectile; private ["_dangerZoneAngle", "_dangerZoneRange", "_dangerZoneDamage"]; -_dangerZoneAngle = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(angle)) / 2; -_dangerZoneRange = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(range)); -_dangerZoneDamage = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(damage)); +_dangerZoneDamage = getNumber (configFile >> "CfgMagazines" >> _magazine >> QGVAR(damage)); + +if (_dangerZoneDamage == 0) then { + _dangerZoneAngle = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(angle)) / 2; + _dangerZoneRange = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(range)); + _dangerZoneDamage = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(damage)); +} else { + _dangerZoneAngle = getNumber (configFile >> "CfgMagazines" >> _magazine >> QGVAR(angle)) / 2; + _dangerZoneRange = getNumber (configFile >> "CfgMagazines" >> _magazine >> QGVAR(range)); +}; // Damage to others private "_affected"; From 9bb9df59eca3f5456e1e4e12aa289faa9c2dc2b5 Mon Sep 17 00:00:00 2001 From: Joko Date: Sat, 11 Jul 2015 00:09:20 +0200 Subject: [PATCH 002/170] Add caching for Backblast --- addons/overpressure/CfgEventHandlers.hpp | 14 ++++---- addons/overpressure/XEH_preInit.sqf | 4 ++- .../functions/fnc_cacheOverPressureValues.sqf | 36 +++++++++++++++++++ .../functions/fnc_fireLauncherBackblast.sqf | 15 +++----- .../functions/fnc_fireOverpressureZone.sqf | 16 +++------ .../overpressure/functions/fnc_firedEHBB.sqf | 21 +++++++++++ .../overpressure/functions/fnc_firedEHOP.sqf | 21 +++++++++++ .../functions/fnc_overpressureDamage.sqf | 9 +++-- 8 files changed, 100 insertions(+), 36 deletions(-) create mode 100644 addons/overpressure/functions/fnc_cacheOverPressureValues.sqf create mode 100644 addons/overpressure/functions/fnc_firedEHBB.sqf create mode 100644 addons/overpressure/functions/fnc_firedEHOP.sqf diff --git a/addons/overpressure/CfgEventHandlers.hpp b/addons/overpressure/CfgEventHandlers.hpp index a008c845f1..1c191b5a0d 100644 --- a/addons/overpressure/CfgEventHandlers.hpp +++ b/addons/overpressure/CfgEventHandlers.hpp @@ -14,38 +14,38 @@ class Extended_PostInit_EventHandlers { class Extended_FiredBIS_EventHandlers { class CAManBase { class ADDON { - firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgMagazines' >> _this select 5 >> QUOTE(QGVAR(Damage))) > 0} || {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0}) then {_this call DFUNC(fireLauncherBackblast)}); + firedBIS = QUOTE(if (local (_this select 0)) then {_this call DFUNC(firedEHBB);};); }; }; class Tank { class ADDON { - firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgMagazines' >> _this select 5 >> QUOTE(QGVAR(Damage))) > 0} || {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0}) then {_this call DFUNC(fireOverpressureZone)}); + firedBIS = QUOTE(if (local (_this select 0)) then {_this call DFUNC(firedEHOP);};); }; }; class Car { class ADDON { - firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgMagazines' >> _this select 5 >> QUOTE(QGVAR(Damage))) > 0} || {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0}) then {_this call DFUNC(fireOverpressureZone)}); + firedBIS = QUOTE(if (local (_this select 0)) then {_this call DFUNC(firedEHOP);};); }; }; class Helicopter { class ADDON { - firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgMagazines' >> _this select 5 >> QUOTE(QGVAR(Damage))) > 0} || {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0}) then {_this call DFUNC(fireOverpressureZone)}); + firedBIS = QUOTE(if (local (_this select 0)) then {_this call DFUNC(firedEHOP);};); }; }; class Plane { class ADDON { - firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgMagazines' >> _this select 5 >> QUOTE(QGVAR(Damage))) > 0} || {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0}) then {_this call DFUNC(fireOverpressureZone)}); + firedBIS = QUOTE(if (local (_this select 0)) then {_this call DFUNC(firedEHOP);};); }; }; class Ship_F { class ADDON { - firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgMagazines' >> _this select 5 >> QUOTE(QGVAR(Damage))) > 0} || {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0}) then {_this call DFUNC(fireOverpressureZone)}); + firedBIS = QUOTE(if (local (_this select 0)) then {_this call DFUNC(firedEHOP);};); }; }; class StaticWeapon { class ADDON { - firedBIS = QUOTE(if (local (_this select 0) && {getNumber (configfile >> 'CfgMagazines' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0} || {getNumber (configfile >> 'CfgWeapons' >> _this select 1 >> QUOTE(QGVAR(Damage))) > 0}) then {_this call DFUNC(fireOverpressureZone)}); + firedBIS = QUOTE(if (local (_this select 0)) then {_this call DFUNC(firedEHOP);};); }; }; }; diff --git a/addons/overpressure/XEH_preInit.sqf b/addons/overpressure/XEH_preInit.sqf index 5eefc5eae4..d0ce7cbcf1 100644 --- a/addons/overpressure/XEH_preInit.sqf +++ b/addons/overpressure/XEH_preInit.sqf @@ -6,5 +6,7 @@ PREP(fireLauncherBackblast); PREP(fireOverpressureZone); PREP(getDistance); PREP(overpressureDamage); - +PREP(cacheOverPressureValues); +PREP(firedEHOP); +PREP(firedEHBB); ADDON = true; diff --git a/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf b/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf new file mode 100644 index 0000000000..69a38b4c18 --- /dev/null +++ b/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf @@ -0,0 +1,36 @@ +/* + * Author: joko // Jonas + * + * Handle fire of local launchers + * + * Argument: + * 0: Magazine (String) + * 1: + * + * Return value: + * Array: + * 0: + * 1: + * 2: + * + */ + #include "script_component.hpp" + +EXPLODE_2_PVT(_this,_weapon,_magazine); + +private ["_damage","_angle","_range"]; +_damage = getNumber (configFile >> "CfgMagazines" >> _magazine >> QGVAR(damage)); +if (_damage == 0) then { + _angle = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(angle)) / 2; + _range = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(range)); + _damage = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(damage)); +} else { + _angle = getNumber (configFile >> "CfgMagazines" >> _magazine >> QGVAR(angle)) / 2; + _range = getNumber (configFile >> "CfgMagazines" >> _magazine >> QGVAR(range)); +}; + +missionNameSpace setVariable [(QGVAR(Angle) + _magazine),_angle]; +missionNameSpace setVariable [(QGVAR(Range) + _magazine),_range]; +missionNameSpace setVariable [(QGVAR(Damage) + _magazine),_damage]; + +[_angle,_range,_damage] diff --git a/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf b/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf index c3b19db29a..5167423bd2 100644 --- a/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf +++ b/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf @@ -15,7 +15,7 @@ * Return value: * None */ -//#define DEBUG_MODE_FULL + #include "script_component.hpp" EXPLODE_7_PVT(_this,_firer,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); @@ -29,16 +29,9 @@ _position = getPosASL _projectile; _direction = [0, 0, 0] vectorDiff (vectorDir _projectile); private ["_backblastAngle", "_backblastRange", "_backblastDamage"]; -_backblastDamage = getNumber (configFile >> "CfgMagazines" >> _magazine >> QGVAR(damage)); - -if (_backblastDamage == 0) then { - _backblastAngle = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(angle)) / 2; - _backblastRange = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(range)); - _backblastDamage = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(damage)); -} else { - _backblastAngle = getNumber (configFile >> "CfgMagazines" >> _magazine >> QGVAR(angle)) / 2; - _backblastRange = getNumber (configFile >> "CfgMagazines" >> _magazine >> QGVAR(range)); -}; +_backblastAngle = missionNameSpace getVariable [(QGVAR(Angle) + _magazine),([_weapon,_magazine] call FUNC(cacheOverPressureVales)) select 0]; +_backblastRange = missionNameSpace getVariable [(QGVAR(Range) + _magazine),([_weapon,_magazine] call FUNC(cacheOverPressureVales)) select 1]; +_backblastDamage = missionNameSpace getVariable [(QGVAR(Damage) + _magazine),([_weapon,_magazine] call FUNC(cacheOverPressureVales)) select 2]; // Damage to others private "_affected"; diff --git a/addons/overpressure/functions/fnc_fireOverpressureZone.sqf b/addons/overpressure/functions/fnc_fireOverpressureZone.sqf index c51baf3e64..9731fdfa69 100644 --- a/addons/overpressure/functions/fnc_fireOverpressureZone.sqf +++ b/addons/overpressure/functions/fnc_fireOverpressureZone.sqf @@ -29,24 +29,16 @@ _position = getPosASL _projectile; _direction = vectorDir _projectile; private ["_dangerZoneAngle", "_dangerZoneRange", "_dangerZoneDamage"]; - -_dangerZoneDamage = getNumber (configFile >> "CfgMagazines" >> _magazine >> QGVAR(damage)); - -if (_dangerZoneDamage == 0) then { - _dangerZoneAngle = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(angle)) / 2; - _dangerZoneRange = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(range)); - _dangerZoneDamage = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(damage)); -} else { - _dangerZoneAngle = getNumber (configFile >> "CfgMagazines" >> _magazine >> QGVAR(angle)) / 2; - _dangerZoneRange = getNumber (configFile >> "CfgMagazines" >> _magazine >> QGVAR(range)); -}; +_dangerZoneDamage = missionNameSpace getVariable [(QGVAR(Damage) + _magazine),([_weapon,_magazine] call FUNC(cacheOverPressureVales)) select 2]; +_dangerZoneAngle = missionNameSpace getVariable [(QGVAR(Angle) + _magazine),([_weapon,_magazine] call FUNC(cacheOverPressureVales)) select 0]; +_dangerZoneRange = missionNameSpace getVariable [(QGVAR(Damage) + _magazine),([_weapon,_magazine] call FUNC(cacheOverPressureVales)) select 2]; // Damage to others private "_affected"; _affected = getPos _projectile nearEntities ["CAManBase", _dangerZoneRange]; // Let each client handle their own affected units -["overpressure", _affected, [_firer, _position, _direction, _weapon]] call EFUNC(common,targetEvent); +["overpressure", _affected, [_firer, _position, _direction, _weapon,_magazine]] call EFUNC(common,targetEvent); // Draw debug lines #ifdef DEBUG_MODE_FULL diff --git a/addons/overpressure/functions/fnc_firedEHBB.sqf b/addons/overpressure/functions/fnc_firedEHBB.sqf new file mode 100644 index 0000000000..1d88486c37 --- /dev/null +++ b/addons/overpressure/functions/fnc_firedEHBB.sqf @@ -0,0 +1,21 @@ +/* + * Author: joko // Jonas + * + * Handle fire of local launchers + * + * Argument: + * 0: Unit that fired (Object) + * 1: Weapon fired (String) + * 2: Muzzle (String) + * 3: Mode (String) + * 4: Ammo (String) + * 5: Magazine (String) + * 6: Projectile (Object) + * + * Return value: + * None + */ + + if (missionNameSpace getVariable [(QGVAR(Damage) + _this select 1),(([_this select 1,_this select 5] call DFUNC(cacheOverPressureVales)) select 2)]) then { + _this call DFUNC(fireLauncherBackblast) + }; diff --git a/addons/overpressure/functions/fnc_firedEHOP.sqf b/addons/overpressure/functions/fnc_firedEHOP.sqf new file mode 100644 index 0000000000..6503731c2c --- /dev/null +++ b/addons/overpressure/functions/fnc_firedEHOP.sqf @@ -0,0 +1,21 @@ +/* + * Author: joko // Jonas + * + * Handle fire of Other Weapons + * + * Argument: + * 0: Unit that fired (Object) + * 1: Weapon fired (String) + * 2: Muzzle (String) + * 3: Mode (String) + * 4: Ammo (String) + * 5: Magazine (String) + * 6: Projectile (Object) + * + * Return value: + * None + */ + + if (missionNameSpace getVariable [(QGVAR(Damage) + _this select 1),(([_this select 1,_this select 5] call DFUNC(cacheOverPressureVales)) select 2)]) then { + _this call DFUNC(fireOverpressureZone) + }; diff --git a/addons/overpressure/functions/fnc_overpressureDamage.sqf b/addons/overpressure/functions/fnc_overpressureDamage.sqf index d1280b682f..669c9e8cc4 100644 --- a/addons/overpressure/functions/fnc_overpressureDamage.sqf +++ b/addons/overpressure/functions/fnc_overpressureDamage.sqf @@ -14,13 +14,12 @@ */ #include "script_component.hpp" -EXPLODE_4_PVT(_this,_firer,_posASL,_direction,_weapon); +EXPLODE_4_PVT(_this,_firer,_posASL,_direction,_weapon,_magazine); private ["_overpressureAngle", "_overpressureRange", "_overpressureDamage"]; - -_overpressureAngle = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(angle)) / 2; -_overpressureRange = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(range)); -_overpressureDamage = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(damage)); +_overpressureAngle = missionNameSpace getVariable [(QGVAR(Damage) + _magazine),([_weapon,_magazine] call FUNC(cacheOverPressureVales)) select 2]; +_overpressureRange = missionNameSpace getVariable [(QGVAR(Angle) + _magazine),([_weapon,_magazine] call FUNC(cacheOverPressureVales)) select 0]; +_overpressureDamage = missionNameSpace getVariable [(QGVAR(Damage) + _magazine),([_weapon,_magazine] call FUNC(cacheOverPressureVales)) select 2]; TRACE_4("Parameters:",_overpressureAngle,_overpressureRange,_overpressureDamage,_weapon); From 83e74d848df711f61b553c2debf81f5528af6e80 Mon Sep 17 00:00:00 2001 From: Joko Date: Sat, 11 Jul 2015 00:50:12 +0200 Subject: [PATCH 003/170] fix that cachedOverPressureValue is called Multible per Weapon --- addons/overpressure/functions/fnc_cacheOverPressureValues.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf b/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf index 69a38b4c18..b371bc0cf2 100644 --- a/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf +++ b/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf @@ -17,7 +17,7 @@ #include "script_component.hpp" EXPLODE_2_PVT(_this,_weapon,_magazine); - +if !(isNil (QGVAR(Damage) + _magazine)) exitWith {}; private ["_damage","_angle","_range"]; _damage = getNumber (configFile >> "CfgMagazines" >> _magazine >> QGVAR(damage)); if (_damage == 0) then { From 41edf3dd38dcd47d00eb6963152978ffe6a77155 Mon Sep 17 00:00:00 2001 From: Joko Date: Fri, 17 Jul 2015 21:26:18 +0200 Subject: [PATCH 004/170] Rework after Comments form esteldunedain --- .../functions/fnc_cacheOverPressureValues.sqf | 5 +---- .../functions/fnc_fireLauncherBackblast.sqf | 13 +++++++++---- .../functions/fnc_fireOverpressureZone.sqf | 12 ++++++++---- addons/overpressure/functions/fnc_firedEHBB.sqf | 10 ++++++++-- addons/overpressure/functions/fnc_firedEHOP.sqf | 9 ++++++++- .../functions/fnc_overpressureDamage.sqf | 12 ++++++++---- 6 files changed, 42 insertions(+), 19 deletions(-) diff --git a/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf b/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf index b371bc0cf2..0453b2437b 100644 --- a/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf +++ b/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf @@ -29,8 +29,5 @@ if (_damage == 0) then { _range = getNumber (configFile >> "CfgMagazines" >> _magazine >> QGVAR(range)); }; -missionNameSpace setVariable [(QGVAR(Angle) + _magazine),_angle]; -missionNameSpace setVariable [(QGVAR(Range) + _magazine),_range]; -missionNameSpace setVariable [(QGVAR(Damage) + _magazine),_damage]; - +missionNameSpace setVariable [(QGVAR(values) + _magazine),[_angle, _range,_damage]]; [_angle,_range,_damage] diff --git a/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf b/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf index 5167423bd2..5bc9d1c1e1 100644 --- a/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf +++ b/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf @@ -28,10 +28,15 @@ private ["_position", "_direction"]; _position = getPosASL _projectile; _direction = [0, 0, 0] vectorDiff (vectorDir _projectile); -private ["_backblastAngle", "_backblastRange", "_backblastDamage"]; -_backblastAngle = missionNameSpace getVariable [(QGVAR(Angle) + _magazine),([_weapon,_magazine] call FUNC(cacheOverPressureVales)) select 0]; -_backblastRange = missionNameSpace getVariable [(QGVAR(Range) + _magazine),([_weapon,_magazine] call FUNC(cacheOverPressureVales)) select 1]; -_backblastDamage = missionNameSpace getVariable [(QGVAR(Damage) + _magazine),([_weapon,_magazine] call FUNC(cacheOverPressureVales)) select 2]; +private ["_var","_varName","_backblastAngle", "_backblastRange", "_backblastDamage"]; +_varName = (QGVAR(values) + _magazine); +_var = if (isNil _varName) then { + [_weapon,_magazine] call FUNC(cacheOverPressureVales); +} else { + missionNameSpace getVariable _varName; +}; +_var params["_backblastAngle","_backblastRange","_backblastDamage"]; + // Damage to others private "_affected"; diff --git a/addons/overpressure/functions/fnc_fireOverpressureZone.sqf b/addons/overpressure/functions/fnc_fireOverpressureZone.sqf index 9731fdfa69..5e17036a13 100644 --- a/addons/overpressure/functions/fnc_fireOverpressureZone.sqf +++ b/addons/overpressure/functions/fnc_fireOverpressureZone.sqf @@ -28,10 +28,14 @@ private ["_position", "_direction"]; _position = getPosASL _projectile; _direction = vectorDir _projectile; -private ["_dangerZoneAngle", "_dangerZoneRange", "_dangerZoneDamage"]; -_dangerZoneDamage = missionNameSpace getVariable [(QGVAR(Damage) + _magazine),([_weapon,_magazine] call FUNC(cacheOverPressureVales)) select 2]; -_dangerZoneAngle = missionNameSpace getVariable [(QGVAR(Angle) + _magazine),([_weapon,_magazine] call FUNC(cacheOverPressureVales)) select 0]; -_dangerZoneRange = missionNameSpace getVariable [(QGVAR(Damage) + _magazine),([_weapon,_magazine] call FUNC(cacheOverPressureVales)) select 2]; +private ["_var","_dangerZoneAngle", "_dangerZoneRange", "_dangerZoneDamage"]; +_varName = (QGVAR(values) + _magazine); +_var = if (isNil _varName) then { + [_weapon,_magazine] call FUNC(cacheOverPressureVales); +} else { + missionNameSpace getVariable _varName; +}; +_var params["_dangerZoneAngle","_dangerZoneRange","_dangerZoneDamage"]; // Damage to others private "_affected"; diff --git a/addons/overpressure/functions/fnc_firedEHBB.sqf b/addons/overpressure/functions/fnc_firedEHBB.sqf index 1d88486c37..5408ecda29 100644 --- a/addons/overpressure/functions/fnc_firedEHBB.sqf +++ b/addons/overpressure/functions/fnc_firedEHBB.sqf @@ -15,7 +15,13 @@ * Return value: * None */ - - if (missionNameSpace getVariable [(QGVAR(Damage) + _this select 1),(([_this select 1,_this select 5] call DFUNC(cacheOverPressureVales)) select 2)]) then { + private ["_var","_varName"]; + _varName = (QGVAR(values) + _this select 1); + _var = if (isNil _varName) then { + ([_this select 1,_this select 5] call FUNC(cacheOverPressureVales)) select 2; + } else { + (missionNameSpace getVariable _varName) select 2; + }; + if (_var > 0) then { _this call DFUNC(fireLauncherBackblast) }; diff --git a/addons/overpressure/functions/fnc_firedEHOP.sqf b/addons/overpressure/functions/fnc_firedEHOP.sqf index 6503731c2c..f2ca912690 100644 --- a/addons/overpressure/functions/fnc_firedEHOP.sqf +++ b/addons/overpressure/functions/fnc_firedEHOP.sqf @@ -16,6 +16,13 @@ * None */ - if (missionNameSpace getVariable [(QGVAR(Damage) + _this select 1),(([_this select 1,_this select 5] call DFUNC(cacheOverPressureVales)) select 2)]) then { +private ["_var","_varName"]; +_varName = (QGVAR(values) + _this select 1); +_var = if (isNil _varName) then { + ([_this select 1,_this select 5] call FUNC(cacheOverPressureVales)) select 2; +} else { + (missionNameSpace getVariable _varName) select 2; +}; + if (_var > 0) then { _this call DFUNC(fireOverpressureZone) }; diff --git a/addons/overpressure/functions/fnc_overpressureDamage.sqf b/addons/overpressure/functions/fnc_overpressureDamage.sqf index 669c9e8cc4..282cc1e5db 100644 --- a/addons/overpressure/functions/fnc_overpressureDamage.sqf +++ b/addons/overpressure/functions/fnc_overpressureDamage.sqf @@ -16,10 +16,14 @@ EXPLODE_4_PVT(_this,_firer,_posASL,_direction,_weapon,_magazine); -private ["_overpressureAngle", "_overpressureRange", "_overpressureDamage"]; -_overpressureAngle = missionNameSpace getVariable [(QGVAR(Damage) + _magazine),([_weapon,_magazine] call FUNC(cacheOverPressureVales)) select 2]; -_overpressureRange = missionNameSpace getVariable [(QGVAR(Angle) + _magazine),([_weapon,_magazine] call FUNC(cacheOverPressureVales)) select 0]; -_overpressureDamage = missionNameSpace getVariable [(QGVAR(Damage) + _magazine),([_weapon,_magazine] call FUNC(cacheOverPressureVales)) select 2]; +private ["_var","_overpressureAngle", "_overpressureRange", "_overpressureDamage"]; +_varName = (QGVAR(values) + _magazine); +_var = if (isNil _varName) then { + [_weapon,_magazine] call FUNC(cacheOverPressureVales); +} else { + missionNameSpace getVariable _varName; +}; +_var params["_overpressureAngle","_overpressureRange","_overpressureDamage"]; TRACE_4("Parameters:",_overpressureAngle,_overpressureRange,_overpressureDamage,_weapon); From 17115b88466f31c76dd37d99bcbd9e70d2bda4c3 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 11 Aug 2015 20:58:00 +0200 Subject: [PATCH 005/170] test switch to adv medical handleDamage --- addons/medical/XEH_preInit.sqf | 2 + addons/medical/functions/fnc_handleDamage.sqf | 29 ++- .../functions/fnc_handleDamage_basic.sqf | 4 +- .../functions/fnc_handleDamage_basic2.sqf | 168 ++++++++++++++++++ 4 files changed, 201 insertions(+), 2 deletions(-) create mode 100644 addons/medical/functions/fnc_handleDamage_basic2.sqf diff --git a/addons/medical/XEH_preInit.sqf b/addons/medical/XEH_preInit.sqf index b479383468..6ae9dbb866 100644 --- a/addons/medical/XEH_preInit.sqf +++ b/addons/medical/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP(handleDamage_basic2); + PREP(actionCheckBloodPressure); PREP(actionCheckBloodPressureLocal); PREP(actionCheckPulse); diff --git a/addons/medical/functions/fnc_handleDamage.sqf b/addons/medical/functions/fnc_handleDamage.sqf index a4e5525276..47234d09fd 100644 --- a/addons/medical/functions/fnc_handleDamage.sqf +++ b/addons/medical/functions/fnc_handleDamage.sqf @@ -44,7 +44,34 @@ if !(_unit getVariable [QGVAR(allowDamage), true]) exitWith {_damageOld}; // Get return damage _damageReturn = _damage; if (GVAR(level) < 2) then { - _damageReturn = _this call FUNC(handleDamage_basic); + _newDamage = _this call FUNC(handleDamage_basic2); + _projectile = _this select 4; + _typeOfDamage = [_projectile] call FUNC(getTypeOfDamage); + + _typeIndex = (GVAR(allAvailableDamageTypes) find _typeOfDamage); + _minLethalDamage = 0.01; + if (_typeIndex >= 0) then { + _minLethalDamage = GVAR(minLethalDamages) select _typeIndex; + }; + + if (vehicle _unit != _unit && {!(vehicle _unit isKindOf "StaticWeapon")} && {isNull _shooter} && {_projectile == ""} && {_selection == ""}) then { + if (GVAR(enableVehicleCrashes)) then { + _selection = GVAR(SELECTIONS) select (floor(random(count GVAR(SELECTIONS)))); + }; + }; + + if ((_minLethalDamage <= _newDamage) && {[_unit, [_selection] call FUNC(selectionNameToNumber), _newDamage] call FUNC(determineIfFatal)}) then { + 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 { + _damageReturn = _damageReturn min 0.89; + }; } else { if !([_unit] call FUNC(hasMedicalEnabled)) exitwith { // Because of the config changes, we cannot properly disable the medical system for a unit. diff --git a/addons/medical/functions/fnc_handleDamage_basic.sqf b/addons/medical/functions/fnc_handleDamage_basic.sqf index 04049cfa7c..9b48a5d5c7 100644 --- a/addons/medical/functions/fnc_handleDamage_basic.sqf +++ b/addons/medical/functions/fnc_handleDamage_basic.sqf @@ -37,6 +37,8 @@ _threshold = [ _unit getVariable [QGVAR(damageThreshold), GVAR(AIDamageThreshold)], _unit getVariable [QGVAR(damageThreshold), GVAR(playerDamageThreshold)] ] select ([_unit] call EFUNC(common,isPlayer)); +if (_selectionName in ["leg_l", "leg_r", "hand_l", "hand_r"]) then {_threshold = _threshold * 1.7}; + _damage = _damage * (1 / _threshold); // This is a new hit, reset variables. @@ -63,7 +65,7 @@ if (diag_frameno > (_unit getVariable [QGVAR(basic_frameNo), -3]) + 2) then { (_unit getHitPointDamage "HitLeftLeg") + (_unit getHitPointDamage "HitRightLeg"); if (_damagesum < 0.06 and damage _unit > 0.06 and alive _unit) then { - _unit setHitPointDamage ["HitBody", damage _unit]; + // _unit setHitPointDamage ["HitBody", damage _unit]; }; [(_this select 1)] call cba_fnc_removePerFrameHandler; }; diff --git a/addons/medical/functions/fnc_handleDamage_basic2.sqf b/addons/medical/functions/fnc_handleDamage_basic2.sqf new file mode 100644 index 0000000000..9da6fd405d --- /dev/null +++ b/addons/medical/functions/fnc_handleDamage_basic2.sqf @@ -0,0 +1,168 @@ +/* + * Author: KoffeinFlummi, Glowbal + * Cache a handleDamage call to execute it 3 frames later + * + * Arguments: + * 0: Unit That Was Hit + * 1: Name Of Hit Selection + * 2: Amount Of Damage + * 3: Shooter + * 4: Projectile + * 5: Current damage to be returned + * + * Return Value: + * + * + * Public: No + */ + +#include "script_component.hpp" + +private ["_unit", "_selectionName", "_damage", "_source", "_projectile", "_hitSelections", "_hitPoints", "_impactVelocity", "_newDamage", "_cache_hitpoints", "_cache_projectiles", "_cache_params", "_cache_damages"]; +_unit = _this select 0; +_selectionName = _this select 1; +_damage = _this select 2; +_source = _this select 3; +_projectile = _this select 4; + +_hitSelections = GVAR(SELECTIONS); +_hitPoints = GVAR(HITPOINTS); + +// Calculate change in damage. +_newDamage = _damage - (damage _unit); +if (_selectionName in _hitSelections) then { + _newDamage = _damage - (_unit getHitPointDamage (_hitPoints select (_hitSelections find _selectionName))); +}; + +//_damage = _damage + _newDamage; + +// Check for vehicle crash +if (vehicle _unit != _unit && {!(vehicle _unit isKindOf "StaticWeapon")} && {isNull _source} && {_projectile == ""} && {_selectionName == ""}) then { + if (GVAR(enableVehicleCrashes)) then { + _selectionName = _hitSelections select (floor(random(count _hitSelections))); + _projectile = "vehiclecrash"; + _this set [1, _selectionName]; + _this set [4, _projectile]; + }; +}; + +// Handle falling damage +_impactVelocity = (velocity _unit) select 2; +if (_impactVelocity < -5 && {vehicle _unit == _unit}) then { + _unit setVariable [QGVAR(isFalling), true]; + _unit setVariable [QGVAR(impactVelocity), _impactVelocity]; +}; +if (_unit getVariable [QGVAR(isFalling), false]) then { + if !(_selectionName in ["", "leg_l", "leg_r"]) then { + if (_selectionName == "body") then { + _newDamage = _newDamage * abs(_unit getVariable [QGVAR(impactVelocity), _impactVelocity]) / 50; + } else { + _newDamage = _newDamage * 0.5; + }; + } else { + if (_selectionName == "") then { + _selectionName = ["leg_l", "leg_r"] select (floor(random 2)); + _this set [1, _selectionName]; + }; + _newDamage = _newDamage * 0.7; + }; + _projectile = "falling"; + _this set [4, "falling"]; +}; + +// Finished with the current frame, reset variables +// Note: sometimes handleDamage spans over 2 or even 3 frames. +if (diag_frameno > (_unit getVariable [QGVAR(frameNo_damageCaching), -3]) + 2) then { + _unit setVariable [QGVAR(frameNo_damageCaching), diag_frameno]; + + // handle the cached damages 3 frames later + [{ + params ["_args", "_id"]; + _args params ["_target", "_frameNo"]; + + if (diag_frameno > _frameNo + 2) then { + _target setDamage 0; + + _cache_params = _target getVariable [QGVAR(cachedHandleDamageParams), []]; + _cache_damages = _target getVariable QGVAR(cachedDamages); + _damageBodyParts = _target getvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]; + { + _x params ["_unit","_selectionName","_amountOfDamage","_sourceOfDamage","_typeOfProjectile","_typeOfDamage"]; + if !(isNull _sourceOfDamage && {_typeOfProjectile == ""} && {vehicle _unit == _unit} && {(_selectionName == "head" || isBurning _unit)}) then { + _part = [_selectionName] call FUNC(selectionNameToNumber); + if (_part < 0) exitwith {}; + _damageBodyParts set [_part, (_damageBodyParts select _part) + (_cache_damages select _foreachIndex)]; + }; + }foreach _cache_params; + _unit setvariable [QGVAR(bodyPartStatus), _damageBodyParts, true]; + + EXPLODE_6_PVT(_damageBodyParts,_headDamage,_torsoDamage,_handsDamageR,_handsDamageL,_legsDamageR,_legsDamageL); + _target setHitPointDamage ["hitHead", _headDamage min 0.95]; + _target setHitPointDamage ["hitBody", _torsoDamage min 0.95]; + _target setHitPointDamage ["hitHands", (_handsDamageR + _handsDamageL) min 0.95]; + _target setHitPointDamage ["hitLegs", (_legsDamageR + _legsDamageL) min 0.95]; + + { + _target setHitPointDamage [_x, (_damageBodyParts select _foreachIndex) min 0.95]; + }foreach GVAR(HITPOINTS); + [_id] call cba_fnc_removePerFrameHandler; + }; + }, 0, [_unit, diag_frameno] ] call CBA_fnc_addPerFrameHandler; + + _unit setVariable [QGVAR(cachedProjectiles), []]; + _unit setVariable [QGVAR(cachedHitPoints), []]; + _unit setVariable [QGVAR(cachedDamages), []]; + _unit setVariable [QGVAR(cachedHandleDamageParams), []]; +}; + +// Caching of the damage events +if (_selectionName != "") then { + _cache_projectiles = _unit getVariable QGVAR(cachedProjectiles); + private ["_index","_otherDamage"]; + _index = _cache_projectiles find _projectile; + // Check if the current projectile has already been handled once + if (_index >= 0 && {_projectile != "falling"}) exitwith { + _cache_damages = _unit getVariable QGVAR(cachedDamages); + // Find the previous damage this projectile has done + _otherDamage = (_cache_damages select _index); + + // Take the highest damage of the two + if (_newDamage > _otherDamage) then { + _cache_params = _unit getVariable QGVAR(cachedHandleDamageParams); + _cache_hitpoints = _unit getVariable QGVAR(cachedHitPoints); + + private ["_hitPoint", "_restore"]; + // Restore the damage before the previous damage was processed + _hitPoint = _cache_hitpoints select _index; + _restore = ((_unit getHitPointDamage _hitPoint) - _otherDamage) max 0; + _unit setHitPointDamage [_hitPoint, _restore]; + + _cache_hitpoints set [_index, (_hitPoints select (_hitSelections find _selectionName))]; + _cache_damages set [_index, _newDamage]; + _cache_params set[_index, _this]; + + _unit setVariable [QGVAR(cachedProjectiles), _cache_projectiles]; + _unit setVariable [QGVAR(cachedHitPoints), _cache_hitpoints]; + _unit setVariable [QGVAR(cachedDamages), _cache_damages]; + _unit setVariable [QGVAR(cachedHandleDamageParams), _cache_params]; + }; + }; + + _cache_hitpoints = _unit getVariable QGVAR(cachedHitPoints); + _cache_damages = _unit getVariable QGVAR(cachedDamages); + _cache_params = _unit getVariable QGVAR(cachedHandleDamageParams); + + // This is an unhandled projectile + _cache_projectiles pushBack _projectile; + _cache_hitpoints pushBack (_hitPoints select (_hitSelections find _selectionName)); + _cache_damages pushBack _newDamage; + _cache_params pushBack _this; + + // Store the new cached values + _unit setVariable [QGVAR(cachedProjectiles), _cache_projectiles]; + _unit setVariable [QGVAR(cachedHitPoints), _cache_hitpoints]; + _unit setVariable [QGVAR(cachedDamages), _cache_damages]; + _unit setVariable [QGVAR(cachedHandleDamageParams), _cache_params]; +}; + +_newDamage; From a420bccb0290dd4d5ce326a894fce0de7c21dd6b Mon Sep 17 00:00:00 2001 From: alganthe Date: Sun, 16 Aug 2015 13:19:20 +0200 Subject: [PATCH 006/170] documentation pass 11 - Updated information center - Update mortar doc - Updated medical doc - Updated maptools doc - Updated huntIR doc - Added framework doc - disposables - explosives --- documentation/feature/huntIR.md | 2 +- documentation/feature/maptools.md | 2 +- documentation/feature/medical-system.md | 87 +++++++++++- documentation/feature/mk6mortar.md | 60 +++------ .../framework/disposables-framework.md | 40 ++++++ .../framework/explosives-framework.md | 127 ++++++++++++++++++ documentation/user/information-center.md | 8 +- 7 files changed, 277 insertions(+), 49 deletions(-) create mode 100644 documentation/framework/disposables-framework.md create mode 100644 documentation/framework/explosives-framework.md diff --git a/documentation/feature/huntIR.md b/documentation/feature/huntIR.md index bd4841c184..af587e8fed 100644 --- a/documentation/feature/huntIR.md +++ b/documentation/feature/huntIR.md @@ -29,7 +29,7 @@ Shortcut | Action ------------ | ------------- A | Lower zoom level D | Increase zoom level -N | Toggle NV and TI modes +N | Toggle NV S | Next camera W | Previous camera | Rotate camera anticlockwise diff --git a/documentation/feature/maptools.md b/documentation/feature/maptools.md index 0e99b9feef..0bf41682c3 100644 --- a/documentation/feature/maptools.md +++ b/documentation/feature/maptools.md @@ -29,7 +29,7 @@ If you are equipped with a vanilla GPS it will be shown on the map. (You don't n - Note that you can drag the Roamer (map tool) around with LMB and rotate it with Ctrl + LMB. ### 2.2 Drawing lines -- To draw lines `Map Tools` are not required. +- To draw lines `Map Tools` are required. - Press ALT + LMB to start the line, left click again to end it. - To delete a line press Del around the center of the line. - Note that you can change the color of the lines by clicking on one of the coloured column on top of the screen (While the map is opened) diff --git a/documentation/feature/medical-system.md b/documentation/feature/medical-system.md index 4bc0ae1557..efd5d6db7c 100644 --- a/documentation/feature/medical-system.md +++ b/documentation/feature/medical-system.md @@ -5,9 +5,9 @@ description: ACE provide users with a more realistic medical system and comes in group: feature order: 4 category: realism -parent: wiki +parent: wiki --- -**Disclaimer:** The documentation for the medical system being extremely long it's highly advised to use the table of contents at the top right corner of the page. +**Disclaimer:**The documentation for the medical system being extremely long it's highly advised to use the table of contents at the top right corner of the page. ## 1. Overview ACE3 provides users with a more realistic medical system and comes in both a basic and an advanced version. This page will detail the differences between both systems and what they do as well as how to use them efficiently. @@ -109,6 +109,14 @@ Atropine | Serves no use in basic - If the revive system is in place your character will not die until the revive timer is at 0. Even if a tank shoots your ass off an epinephrine shot will bring you back up after your wounds are treated. (The timer is invisible and may vary from mission to mission, it also depends on the amount of lives remaining you have.) - You can't do an overdose in basic. +#### 2.1.4 Revive (Basic medical) +For the following procedure to work revive need to be enabled. + +- A unit in the revive state will be unconscious and will stay unconscious until he is either woken up or the revive timer runs out. +- A unit in the revive state can't die from any source of damage, only the timer ending can kill it. +- To wake up a patient treat all of his wounds, make sure he isn't in pain then use epinephrine. +- Each successful revive removes a life from the unit, once the lives runs out the next time the unit will take fatal damage he will not enter the revive state and will die. + ### 2.2 Advanced Same as with basic, when hit an injury is sustained. Different though is that the type of injury and the severity of it are based upon how the damage was done and what caused it. This affects both blood loss and immediate consequences, such as being knocked out or being killed right away. When a player has sustained an injury, this will be indicated by flashing red on the screen; this means the player is bleeding. @@ -140,7 +148,7 @@ Same as with basic, when hit an injury is sustained. Different though is that th - Sources: falling, vehicle crashes, punches. - Effects: pain - light, bleeding - extremely slowly. -##### 2.2.1.5 Cut wounds** +##### 2.2.1.5 Cut wounds - Slicing wounds made with a sharp instrument, leaving even edges. They may be as minimal as a paper cut or as significant as a surgical incision. - Sources: vehicle crashes, grenades, explosions, artillery shells, backblast, stabs. @@ -288,5 +296,76 @@ Note that keeping the patient's vitals stable is very important while treating h - You don't have to take epinephrine after you take morphine, just wait until your pulse stabilizes by itself (Provided that you are in a stable condition). - Giving too much morphine to a patient (more than one every 10 minutes) will put him in cardiac arrest because of a blood pressure / heart rate too low. -## 3. Dependencies +#### 2.2.5 Revive (Advanced medical) +For the following procedure to work revive need to be enabled. + +- A unit in the revive state will be unconscious and will stay unconscious until he is either woken up or the revive timer runs out. +- A unit in the revive state can't die from any source of damage, only the timer ending can kill it. +- To wake up a patient the use of a PAK is required. +- Each successful revive removes a life from the unit, once the lives runs out the next time the unit will take fatal damage he will not enter the revive state and will die. +- Each successful round of CPR (filled up completion bar) increase the time left in the revive state. + +## 3. Guides +### 3.1 Loadouts + +#### 3.1.1 Basic +- Soldier: + - 10 x Bandage (basic) + - 3 x Morphine Autoinjector + - 1 epinephrine Autoinjector + +- Medic: + - 15-25 x Bandage (basic) + - 6 x Blood IV (500ml) + - 10 x Morphine Autoinjector + - 10 x Epinephrine Autoinjector + +#### 3.1.2 Advanced + +- Soldier : + - 3-6 x Bandage (basic) + - 3-6 x Bandage (elastic) + - 3-6 x Bandage (packing) + - 3-6 x QuikClot + - 1 x Morphine Autoinjector + - 1 x Epinephrine Autoinjector + - 1 x Tourniquet + - **Optional**: 1 x Saline IV (500ml) - used only by qualified medic + + +- Combat First Responder (CFR): + - 10-15 x Bandage (basic) + - 10-15 x Bandage (elastic) + - 10-15 x Bandage (packing) + - 10-15 x QuikClot + - 3 x Tourniquet + - 4 x Saline IV (500ml) + - 5 x Morphine Autoinjector + - 5 x Epinephrine Autoinjector + - 8 x Atropine Autoinjector + + +- Medic: + - 10-15 x Bandage (basic) + - 15-20 x Bandage (elastic) + - 15-20 x Bandage (packing) + - 10-15 x QuikClot + - 5 x Tourniquet + - 6 x Saline IV (500ml) + - 8 x Morphine Autoinjector + - 8 x Epinephrine Autoinjector + - 12 x Atropine Autoinjector + - 1-3 x *Surgical kit* + - 1-3 x *Personal Aid Kit* + + +- Paramedic: + - 10-15 x Bandage (basic) + - 15-20 x Bandage (elastic) + - 15-20 x Bandage (packing) + - 10-15 x QuikClot + - 5 x Tourniquet + - 2 x Saline IV (500ml) + +## 4. Dependencies `ace_interaction`, `ace_modules`, `ace_apl` \ No newline at end of file diff --git a/documentation/feature/mk6mortar.md b/documentation/feature/mk6mortar.md index 691a6bc8ef..670acd293a 100644 --- a/documentation/feature/mk6mortar.md +++ b/documentation/feature/mk6mortar.md @@ -17,50 +17,28 @@ ACE3 adds wind deflection for shells as well as a rangetable to accurately take ### 2.1 Switching charge - Press F (Arma 3 default key bind `Fire Mode Switch`) to switch between charges -### 2.2 Working with the rangetable -- To open the table: - - Self interact Ctrl + ⊞ Win - - Select `equipment`. - - Select `Open 82mm Rangetable`. +### 2.2 Opening the table +- Self interact Ctrl + ⊞ Win +- Select `equipment`. +- Select `Open 82mm Rangetable`. -- Using the table: - - Get the distance and elevation difference between you and the target for this you can use map tools. For this example we'll say we're 2 000m away and 50m below (we're at 20m they are at 70m, 70-20=50). - - - Select the charge you want to use (0 = close / 1 = medium / 2 = far). For this case we're using charge 2. - - - Check the range column on the table, we're at 2 000 then look at the corresponding entry in the column on the right (ELEV = elevation) For this example it's 1339. - - - After that's done move by one column on the right that's the elevation for 100m heigh so in our case we're subtracting 2 (4:2 = 2) if our target was 300m above us we would have to subtract 12 from our elevation (3x4 = 12). - - - Once you finished your maths, it's time to aim, get the cross of the mortar on target, if you don't see it use a waypoint if possible. In our case ELEV is 1339-2 = 1337. - - - On the right side of the screen, while looking through the mk6 scope you should see ELV, we need to match this number with the one we found. - - To adjust the ELV use Page Up and page Down. - - Once the number you found and ELV are the same FIRE ! - - On top of that you can calculate the time the shell will take to land by using the third row from the left, in our case the shell need to travel 2000m that's 20xthe number indicated. so 20x0,5 = 10s. +### 2.2 Getting your shells to land where you want. +For this you need a `82mm Rangetable`, `Map Tools` and a `Vector 21` are also recommended. -### 2.3 Working with the rangetable (Crosswinds enabled) -- Same as above there's just an extra step, I'll provide an other example in case you forgot. - - - Get the distance and elevation difference between you and the target for this you can use map tools. For this example we'll say we're 2 400m away and 223m below (we're at 2m they are at 225, 225-2=223) - - Select the charge you want to use (0 = close / 1 = medium / 2 = far). For this case we're using charge 2. - - - Check the range column on the table, we're 2 400m a then look at the corresponding entry in the column on the right (ELEV = elevation) For this example it's 1145. - - After that's done move by one column on the right that's the elevation for 100m heigh so in our case we're subtracting 22 (2,2 x 10 (2,2 because we're around 220m below)). - - Extra step needed here, a kestrel 4500 IS NEEDED. - - Pick the crosswind on your kestrel (for this refer to the kestrel documentation). - - - For this example the crosswind is of 2 MPS on my table I can see under Azimuth correction that for each 1MPS I need to correct by 2.5 mill. - - So in this case i'm subtracting 5 mill from the ELV. - - - It's MATH TIME the ELV given by the table is 1 145, we subtract 22 because of the heigh, we also subtract 5 for the crosswind ( 1 145-22-5 = 1 118 ). - - After you finished your maths, it's time to aim, get the cross of the mortar on target, if you don't see it use a waypoint if possible. In our case ELEV is 1 118. - - - On the right side of the screen, while looking through the mk6 scope you should see ELV, we need to match this number with the one we found. - - - FIREEEE !!!! - - Little advantage of having crosswind enabled is that you don't have to calculate the flight time, it's marked on the table in this case it's 33,8s. +- Get the distance and elevation difference between you and the target for this you can use map tools. +- Select the charge you want to use (0 = close / 1 = medium / 2 = far). +- Open the `82mm Rangetable` +- Calculate the correct ELEV (elevation): + - Open the `Rangetable` and click on the charge you're using. + - Find your range under the `RANGE` collumn + - Under the `ELEV` collumn find the number that match your range, that's the base elevation you're going to work with. + - Under the `D ELEV for 100m DR` find the number that match your ELEV and compensate: + - Example, if you're 200m above your target multiply the number by 2 and add it to your ELEV. + - If you're 200m below the target multiply the number by 2 and substract it to your ELEV. + - The lower the elev the closer to you it will land. + - Once you finished calculating the ELEV align the barrel of the mortar with your target (directly looking at it) and set your ELEV to what you calculated by using Page Up and Page Down. + - Once the ELEV is correctly set and the barrel is facing the right direction, shoot and enjoy your bananas while watching hell rain on your enemies. ## 3. Dependencies `ace_interaction` diff --git a/documentation/framework/disposables-framework.md b/documentation/framework/disposables-framework.md new file mode 100644 index 0000000000..858eaf3122 --- /dev/null +++ b/documentation/framework/disposables-framework.md @@ -0,0 +1,40 @@ +--- +layout: wiki +title: Disposable framework +description: +group: framework +order: 5 +parent: wiki +--- + +## 1. Making a launcher disposable + + +### 1.1 CfgWeapons +``` +class CfgWeapons { + + class Launcher_Base_F; + + class launch_banana: Launcher_Base_F { + ACE_UsedTube = "launch_banana_Used_F"; // The class name of the used tube. + magazines[] = {"ACE_PreloadedMissileDummy"}; // The dummy magazine + }; + + class launch_banana_Used_F: launch_banana { // the used tube should be a sub class of the disposable launcher + scope = 1; + ACE_isUsedLauncher = 1; + author = "someone"; + displayName = "Used banana launcher"; + descriptionShort = "A used banana launcher"; + magazines[] = {"ACE_FiredMissileDummy"}; // This will disable the used launcher class from being fired again. + //picture = ""; + //model = ""; + weaponPoolAvailable = 0; + }; +}; +``` + +### 1.2 Notes + +- This is just the necessary to make a launcher disposable, this is not a guide to make your own launcher. diff --git a/documentation/framework/explosives-framework.md b/documentation/framework/explosives-framework.md new file mode 100644 index 0000000000..e28f5dc722 --- /dev/null +++ b/documentation/framework/explosives-framework.md @@ -0,0 +1,127 @@ +--- +layout: wiki +title: Explosives framework +description: +group: framework +order: 5 +parent: wiki +--- + +## 1. Explosives + +### 1.1 Setting the magazine + +``` +class CfgMagazines { + class CA_Magazine; + + class banana_satchel_remote_mag: CA_Magazine { + ACE_Placeable = 1; // Can be placed + useAction = 0; // Disable the vanilla interaction + ACE_SetupObject = "banana_satchel_place"; // The object placed before te explosive is armed. + class ACE_Triggers { // Trigger configurations + SupportedTriggers[] = {"Timer","Command", "MK16_Transmitter", "DeadmanSwitch"}; // Triggers that can be used. + class Timer { + FuseTime = 0.5; // Time for the fuse to burn. + }; + class Command { + FuseTime = 0.5; + }; + class MK16_Transmitter: Command {}; + class DeadmanSwitch: Command {}; + }; + }; +}; +``` + +### 1.2 Setting the ammo + +``` +class CfgAmmo { + + class PipeBombBase; + class SatchelCharge_Remote_Ammo: PipeBombBase { + soundActivation[] = {"", 0, 0, 0}; // No sound on activation. + soundDeactivation[] = {"", 0, 0, 0}; // No sound on deactivation. + }; +}; +``` + +Some optionnal parameters: +- triggerWhenDestroyed = 1; // Explode when the object is shot and destroyed (after being placed) (0= disabled, 1= enabled). +- ACE_explodeOnDefuse = 0.02; // Add a chance for the explosive to detonate after being disarmed. (in percent) + +### 1.3 Adding the place item + +``` +class CfgVehicles { + + class ACE_Explosives_Place; + class banana_satchel_place: ACE_Explosives_Place { + displayName = "Banana satchel"; // Name of the item + model = ""; // Path to your model + ACE_offset[] = {0,0,0}; // Offset of the interaction point from the model in meters on the X,Y,Z axis. + }; +}; +``` + + +## 2. Mines + +### 2.1 Setting the magazine + +_Pretty much the same as Explosives except that we inherit from_ `ATMine_Range_Mag` _instead of_ `CA_Magazine` + +``` +class CfgMagazines { + + class ATMine_Range_Mag; + + class BananaMine_Range_Mag: ATMine_Range_Mag { + ACE_SetupObject = "BananaMine_Place"; // The object placed before the mine is armed. + class ACE_Triggers { // Triggers + SupportedTriggers[] = {"PressurePlate"}; // This mine only support pressure plate activation. + class PressurePlate { + digDistance = 0.05; + }; + }; + }; +}; +``` + +### 2.2 Setting up the Ammo + +The class you inherit from depends of what type of trigger you are using, for `PressurePlate` and `Tripwire` you can skip this step, for timers and clackers refer to the Explosives entry. + +Directional mines inherit from `DirectionalBombBase`. + +## 3. Adding your own detonators + +``` +class CfgWeapons { + + class ACE_ItemCore; // ACE3 base item class. + class ACE_Clacker; // Clacker base class. + + class banana_clacker: ACE_Clacker { + displayName = "banana clacker"; // Name of the item. + picture = ""; // Path to the item's picture. + ACE_Range = 9000; // Explosives activation range in meters. + }; +}; +``` +## 4. Trigger list + +Name | Use +---- | ----- +Command | Explode when activated via clacker. +MK16_Transmitter | Explode when activated via M26 clacker. +DeadManSwitch | Explode after activated via the switch or the person dies. +Cellphone | Explode when the number is called. +PressurePlate | Explode upon being stepped upon. +IRSensor | Explode after movement is detected in front of the mine. +Timer | Explode after timer drop to 0. +Tripwire | Explode when something touch the tripwire. + + +## 5. Events diff --git a/documentation/user/information-center.md b/documentation/user/information-center.md index b1a1e8e9f0..3df59822d7 100644 --- a/documentation/user/information-center.md +++ b/documentation/user/information-center.md @@ -39,10 +39,14 @@ Downloaded ACE3 and have no idea where to start? This page serves as a starting **A:** Fun fact, it isn't, you need to come from the direction of the laser, (laser is pointing to the east, you come from the west) and you drop the GBU, it will then guide itself to the target. The reasoning behind that is that the vehicle or building laser designated would obstruct the laser and the GBU would then be unable to lock on it.
**Q:** I take vanilla damage with ACE 3.1.1
-**A:** This has been fixed on ACE3 master and will be fixed in the next release, in the meantime Basic medical doesn't have that issue.
+**A:** This has been fixed in 3.2.0
**Q:** I'm having dll errors.
-**A:** Remove ACE3 from your Arma 3 folder and repeat the installation process (don't forget to re-download).
+**A:** Start the game once with the arma3 launcher, close it then open it with your usual launcher (arma3sync or PW6).
+The simple explanation to that is that battleye break itself and only starting it with the arma3 launcher fixes it.
+ +**Q:** ACE fonts is outdated.
+**A:** This happens because you're using the mod (stable) with the dev version on your P drive, remove simlinks in ARMA3 root and the P drive. ### 1.3 Compatibility From 96bd47bfbfdb0c9e99c63c77835852cc872c4e4b Mon Sep 17 00:00:00 2001 From: alganthe Date: Sun, 16 Aug 2015 15:28:33 +0200 Subject: [PATCH 007/170] doc pass 11 update - Updated - fonts (added description) - huntIR - maptools - medical system - mk6mortar - disposable framework - explosives framework - settings framework - information center by @jonpas --- documentation/feature/fonts.md | 1 + documentation/feature/huntIR.md | 11 +- documentation/feature/maptools.md | 10 +- documentation/feature/medical-system.md | 124 +++++++++--------- documentation/feature/mk6mortar.md | 21 +-- .../framework/disposables-framework.md | 34 +++-- .../framework/explosives-framework.md | 82 ++++++------ .../{settings.md => settings-framework.md} | 71 +++++----- documentation/user/information-center.md | 18 +-- 9 files changed, 181 insertions(+), 191 deletions(-) rename documentation/framework/{settings.md => settings-framework.md} (58%) diff --git a/documentation/feature/fonts.md b/documentation/feature/fonts.md index 198e3f8bd0..7661feeaaf 100644 --- a/documentation/feature/fonts.md +++ b/documentation/feature/fonts.md @@ -1,6 +1,7 @@ --- layout: wiki title: Fonts +description: Custom fonts including fixed-width font. group: feature category: general parent: wiki diff --git a/documentation/feature/huntIR.md b/documentation/feature/huntIR.md index af587e8fed..be84c8b02b 100644 --- a/documentation/feature/huntIR.md +++ b/documentation/feature/huntIR.md @@ -1,6 +1,7 @@ --- layout: wiki title: HuntIR +description: High-altitude Unit Navigated Tactical Imaging Round group: feature category: equipment parent: wiki @@ -9,25 +10,25 @@ parent: wiki ## 1. Overview ### 1.1 The HuntIR -The **H**igh altitude **U**nit **N**avigated **T**actical **I**maging **R**ound (HuntIR) is designed to be fired from a grenade launcher. After being fired in the air the in built parachute will be deployed and the IR CMOS camera will activate, providing a video stream until it touches the ground or get shot down. +The **H**igh-altitude **U**nit **N**avigated **T**actical **I**maging **R**ound (HuntIR) is designed to be fired from a grenade launcher. After being fired in the air the in-built parachute will be deployed and the IR CMOS camera will activate, providing a video stream until it touches the ground or get shot down. ## 2. Usage -NOTE: the HuntIR round doesn't work with modded weapons without a compatibility fix made either by the ACE3 team or the mod team. +NOTE: The HuntIR round does not work with modded weapons without a compatibility fix made either by the ACE3 team or the mod team. ### 2.1 Using the HuntIR -- To be able to connect to the IR CMOS camera you'll need a `HuntIR monitor`. +- To be able to connect to the IR CMOS camera you will need a `HuntIR monitor`. - Fire the HuntIR round as high as possible over the area you want to observe. - Open the `HuntIR monitor`. - To open the `HuntIR monitor` self interact Ctrl + ⊞ Win (ACE3 default) - Select `Equipment`. - Select `Activate HuntIR monitor`. -- You now have control of the IR CMOS camera to close the monitor press ESC or ⊞ Win +- You now have control of the IR CMOS camera, to close the monitor press ESC or ⊞ Win ### 2.2 IR CMOS camera controls Shortcut | Action ------------ | ------------- -A | Lower zoom level +A | Decrease zoom level D | Increase zoom level N | Toggle NV S | Next camera diff --git a/documentation/feature/maptools.md b/documentation/feature/maptools.md index 0bf41682c3..260c3409d3 100644 --- a/documentation/feature/maptools.md +++ b/documentation/feature/maptools.md @@ -16,23 +16,23 @@ This adds the possibility to draw accurate lines on the map screen. This adds map tools that can be used to measure distances between two points or bearings on the map. ### 1.3 GPS on map -If you are equipped with a vanilla GPS it will be shown on the map. (You don't need the map tools in your inventory for this.) +If you are equipped with a vanilla GPS it will be shown on the map. (You don't need the `Map Tools` item in your inventory for this.) ## 2. Usage ### 2.1 Using map tools -- For this you need to have `Map Tools`. +- To use map tools `Map Tools` in your inventory are required. - Open the map M (Arma 3 default key bind `Map`). - Press the self interaction key Ctrl + ⊞ Win (ACE3 default key bind `Self Interaction Key`). - Select `Map tools`. - Select the type of tools you want to use. -- Note that you can drag the Roamer (map tool) around with LMB and rotate it with Ctrl + LMB. +- Note that you can drag the Roamer (map tool) around with LMB and rotate it with Ctrl + LMB. ### 2.2 Drawing lines -- To draw lines `Map Tools` are required. +- To draw lines `Map Tools` in your inventory are required. - Press ALT + LMB to start the line, left click again to end it. - To delete a line press Del around the center of the line. -- Note that you can change the color of the lines by clicking on one of the coloured column on top of the screen (While the map is opened) +- Note that you can change the color of the lines by clicking on one of the coloured column on top of the screen (While the map is opened). ## 3. Dependencies diff --git a/documentation/feature/medical-system.md b/documentation/feature/medical-system.md index efd5d6db7c..cb4bf8fb24 100644 --- a/documentation/feature/medical-system.md +++ b/documentation/feature/medical-system.md @@ -1,13 +1,13 @@ --- layout: wiki title: Medical System -description: ACE provide users with a more realistic medical system and comes in both a basic and advanced version. Both versions have overlap but each have their own unique characteristics. +description: ACE3 provide users with a more realistic medical system and comes in both a basic and advanced version. Both versions have overlap but each have their own unique characteristics. group: feature order: 4 category: realism -parent: wiki +parent: wiki --- -**Disclaimer:**The documentation for the medical system being extremely long it's highly advised to use the table of contents at the top right corner of the page. +**Disclaimer:** As the documentation for the medical system being extremely long it's highly advised to use the table of contents at the top right corner of the page. ## 1. Overview ACE3 provides users with a more realistic medical system and comes in both a basic and an advanced version. This page will detail the differences between both systems and what they do as well as how to use them efficiently. @@ -34,7 +34,7 @@ Besides the 4 elements introduced by basic medical, advanced introduces the foll - Cardiac Arrest. - Various treatment methods such as CPR, different kinds of IVs and a working tourniquet. - A basic medication simulation. - + ## 2. Usage ### 2.1 Basic @@ -84,17 +84,17 @@ Atropine | Serves no use in basic - **Yes:** Ask him if he has wounds / he is in pain. - **No:** Go to step 2. - + - **Step 2:** Is the patient wounded? - **Yes:** Treat the wounds and go to step 3. - **No:** Skip this step. - + - **Step 3:** Is the patient in pain? - **Yes:** Give him morphine. - **No:** Skip this step. - + - **Step 4:** Did the patient lose blood? - **Yes:** Give blood via IV. - **No:** Go to step 5. @@ -109,13 +109,13 @@ Atropine | Serves no use in basic - If the revive system is in place your character will not die until the revive timer is at 0. Even if a tank shoots your ass off an epinephrine shot will bring you back up after your wounds are treated. (The timer is invisible and may vary from mission to mission, it also depends on the amount of lives remaining you have.) - You can't do an overdose in basic. -#### 2.1.4 Revive (Basic medical) +#### 2.1.4 Revive (Basic Medical) For the following procedure to work revive need to be enabled. - A unit in the revive state will be unconscious and will stay unconscious until he is either woken up or the revive timer runs out. - A unit in the revive state can't die from any source of damage, only the timer ending can kill it. -- To wake up a patient treat all of his wounds, make sure he isn't in pain then use epinephrine. -- Each successful revive removes a life from the unit, once the lives runs out the next time the unit will take fatal damage he will not enter the revive state and will die. +- To wake up a patient treat all of his wounds, make sure he isn't in pain and then use epinephrine. +- Each successful revive removes a life from the unit, once the lives run out the next time unit will take fatal damage he will not enter the revive state and will die. ### 2.2 Advanced @@ -224,7 +224,7 @@ Atropine | lower the heart rate of the patient #### 2.2.2 Vitals -##### 2.2.2.1 Blood pressure +##### 2.2.2.1 Blood pressure NOTE:the `systolic` blood pressure is the number on the left, the `diastolic` blood pressure is the number on the right. @@ -240,7 +240,7 @@ Atropine | lower the heart rate of the patient - **Low:** 45 and below - **Normal:** between 46 and 119 - **High:** 120 and above - + ##### 2.2.2.3 Cardiac arrest @@ -264,12 +264,12 @@ This is a step by step guide, follow the steps from 1 to 6 in order unless state - **Step 2:** Does the patient have a pulse? - **Yes:** Go to step 3. - **No:** If you are alone provide CPR, if you have someone else get him to do CPR while you treat the patient's wounds. skip to step 3 or 4 depending on the situation. - + - **Step 3:** Is the patient wounded? - **Yes**: Treat the wounds. - **No:** Skip this step. - + - **Step 4:** Did the patient lose blood? - **Yes:** Use IVs to restore the volume of liquid in the blood stream of the patient. @@ -296,13 +296,13 @@ Note that keeping the patient's vitals stable is very important while treating h - You don't have to take epinephrine after you take morphine, just wait until your pulse stabilizes by itself (Provided that you are in a stable condition). - Giving too much morphine to a patient (more than one every 10 minutes) will put him in cardiac arrest because of a blood pressure / heart rate too low. -#### 2.2.5 Revive (Advanced medical) +#### 2.2.5 Revive (Advanced Medical) For the following procedure to work revive need to be enabled. - A unit in the revive state will be unconscious and will stay unconscious until he is either woken up or the revive timer runs out. - A unit in the revive state can't die from any source of damage, only the timer ending can kill it. - To wake up a patient the use of a PAK is required. -- Each successful revive removes a life from the unit, once the lives runs out the next time the unit will take fatal damage he will not enter the revive state and will die. +- Each successful revive removes a life from the unit, once the lives run out the next time unit will take fatal damage he will not enter the revive state and will die. - Each successful round of CPR (filled up completion bar) increase the time left in the revive state. ## 3. Guides @@ -310,62 +310,62 @@ For the following procedure to work revive need to be enabled. #### 3.1.1 Basic - Soldier: - - 10 x Bandage (basic) - - 3 x Morphine Autoinjector - - 1 epinephrine Autoinjector + - 10 × Bandage (Basic) + - 3 × Morphine autoinjector + - 1 × Epinephrine autoinjector - Medic: - - 15-25 x Bandage (basic) - - 6 x Blood IV (500ml) - - 10 x Morphine Autoinjector - - 10 x Epinephrine Autoinjector - + - 15-25 × Bandage (Basic) + - 10 × Morphine autoinjector + - 10 × Epinephrine autoinjector + - 6 × Blood IV (500ml) + #### 3.1.2 Advanced - Soldier : - - 3-6 x Bandage (basic) - - 3-6 x Bandage (elastic) - - 3-6 x Bandage (packing) - - 3-6 x QuikClot - - 1 x Morphine Autoinjector - - 1 x Epinephrine Autoinjector - - 1 x Tourniquet - - **Optional**: 1 x Saline IV (500ml) - used only by qualified medic - + - 3-6 × Bandage (Basic) + - 3-6 × Bandage (Elastic) + - 3-6 × Packing Bandage + - 3-6 × Basic Field Dressing (QuikClot) + - 1 × Morphine autoinjector + - 1 × Epinephrine autoinjector + - 1 × Tourniquet (CAT) + - **Optional**: 1 × Saline IV (500ml) - used only by qualified medic + - Combat First Responder (CFR): - - 10-15 x Bandage (basic) - - 10-15 x Bandage (elastic) - - 10-15 x Bandage (packing) - - 10-15 x QuikClot - - 3 x Tourniquet - - 4 x Saline IV (500ml) - - 5 x Morphine Autoinjector - - 5 x Epinephrine Autoinjector - - 8 x Atropine Autoinjector - + - 10-15 × Bandage (Basic) + - 10-15 × Bandage (Elastic) + - 10-15 × Packing Bandage + - 10-15 × Basic Field Dressing (QuikClot) + - 8 × Atropine autoinjector + - 5 × Morphine autoinjector + - 5 × Epinephrine autoinjector + - 3 × Tourniquet (CAT) + - 4 × Saline IV (500ml) + - Medic: - - 10-15 x Bandage (basic) - - 15-20 x Bandage (elastic) - - 15-20 x Bandage (packing) - - 10-15 x QuikClot - - 5 x Tourniquet - - 6 x Saline IV (500ml) - - 8 x Morphine Autoinjector - - 8 x Epinephrine Autoinjector - - 12 x Atropine Autoinjector - - 1-3 x *Surgical kit* - - 1-3 x *Personal Aid Kit* - + - 10-15 × Bandage (Basic) + - 15-20 × Bandage (Elastic) + - 15-20 × Packing Bandage + - 10-15 × Basic Field Dressing (QuikClot) + - 12 × Atropine Autoinjector + - 8 × Morphine Autoinjector + - 8 × Epinephrine Autoinjector + - 5 × Tourniquet (CAT) + - 6 × Saline IV (500ml) + - 1-3 × *Surgical Kit* + - 1-3 × *Personal Aid Kit* + - Paramedic: - - 10-15 x Bandage (basic) - - 15-20 x Bandage (elastic) - - 15-20 x Bandage (packing) - - 10-15 x QuikClot - - 5 x Tourniquet - - 2 x Saline IV (500ml) + - 10-15 × Bandage (Basic) + - 15-20 × Bandage (Elastic) + - 15-20 × Packing Bandage + - 10-15 × Basic Field Dressing (QuikClot) + - 5 × Tourniquet (CAT) + - 2 × Saline IV (500ml) ## 4. Dependencies -`ace_interaction`, `ace_modules`, `ace_apl` \ No newline at end of file +`ace_interaction`, `ace_modules`, `ace_apl` diff --git a/documentation/feature/mk6mortar.md b/documentation/feature/mk6mortar.md index 670acd293a..c4afd42c53 100644 --- a/documentation/feature/mk6mortar.md +++ b/documentation/feature/mk6mortar.md @@ -1,7 +1,7 @@ --- layout: wiki title: Mk6 Mortar -description: Improve the existing mk6 mortar. +description: Improve the existing Mk6 Mortar. group: feature category: equipment parent: wiki @@ -9,9 +9,10 @@ parent: wiki ## 1. Overview -### 1.1 mk6 mortar overhaul +### 1.1 Mk6 Mortar overhaul ACE3 adds wind deflection for shells as well as a rangetable to accurately take out your target without the artillery computer. + ## 2. Usage ### 2.1 Switching charge @@ -19,26 +20,28 @@ ACE3 adds wind deflection for shells as well as a rangetable to accurately take ### 2.2 Opening the table - Self interact Ctrl + ⊞ Win -- Select `equipment`. +- Select `Equipment`. - Select `Open 82mm Rangetable`. ### 2.2 Getting your shells to land where you want. For this you need a `82mm Rangetable`, `Map Tools` and a `Vector 21` are also recommended. -- Get the distance and elevation difference between you and the target for this you can use map tools. +- Get the distance and elevation difference between you and the target (you can use map tools). - Select the charge you want to use (0 = close / 1 = medium / 2 = far). - Open the `82mm Rangetable` - Calculate the correct ELEV (elevation): - - Open the `Rangetable` and click on the charge you're using. - - Find your range under the `RANGE` collumn - - Under the `ELEV` collumn find the number that match your range, that's the base elevation you're going to work with. + - Open the `Rangetable` and click on the charge you are using. + - Find your range under the `RANGE` column + - Under the `ELEV` column find the number that match your range, that's the base elevation you are going to work with. - Under the `D ELEV for 100m DR` find the number that match your ELEV and compensate: - Example, if you're 200m above your target multiply the number by 2 and add it to your ELEV. - If you're 200m below the target multiply the number by 2 and substract it to your ELEV. - - The lower the elev the closer to you it will land. + - The lower the elevation the closer to you it will land. - Once you finished calculating the ELEV align the barrel of the mortar with your target (directly looking at it) and set your ELEV to what you calculated by using Page Up and Page Down. - - Once the ELEV is correctly set and the barrel is facing the right direction, shoot and enjoy your bananas while watching hell rain on your enemies. + - Once the ELEV is correctly set and the barrel is facing the right direction, shoot and enjoy your bananas while watching hell rain on your enemies. + + ## 3. Dependencies `ace_interaction` diff --git a/documentation/framework/disposables-framework.md b/documentation/framework/disposables-framework.md index 858eaf3122..22887ea2b0 100644 --- a/documentation/framework/disposables-framework.md +++ b/documentation/framework/disposables-framework.md @@ -1,40 +1,38 @@ --- layout: wiki -title: Disposable framework -description: +title: Disposables Framework +description: Explains how to set-up custom disposable launchers with the ACE3 disposables system. group: framework order: 5 parent: wiki --- +
+
Note:
+

This is just the necessary to make a launcher disposable, this is not a guide to make your own launcher.

+
+ ## 1. Making a launcher disposable - ### 1.1 CfgWeapons -``` -class CfgWeapons { - - class Launcher_Base_F; +```c++ +class CfgWeapons { + class Launcher_Base_F; class launch_banana: Launcher_Base_F { - ACE_UsedTube = "launch_banana_Used_F"; // The class name of the used tube. + ACE_UsedTube = "launch_banana_Used_F"; // The class name of the used tube magazines[] = {"ACE_PreloadedMissileDummy"}; // The dummy magazine }; - - class launch_banana_Used_F: launch_banana { // the used tube should be a sub class of the disposable launcher + class launch_banana_Used_F: launch_banana { // The used tube should be a sub class of the disposable launcher scope = 1; ACE_isUsedLauncher = 1; - author = "someone"; + author = "grandBanana"; displayName = "Used banana launcher"; descriptionShort = "A used banana launcher"; - magazines[] = {"ACE_FiredMissileDummy"}; // This will disable the used launcher class from being fired again. - //picture = ""; - //model = ""; + magazines[] = {"ACE_FiredMissileDummy"}; // This will disable the used launcher class from being fired again + //picture = ""; // Not supported yet + //model = ""; // Not supported yet weaponPoolAvailable = 0; }; }; ``` - -### 1.2 Notes - -- This is just the necessary to make a launcher disposable, this is not a guide to make your own launcher. diff --git a/documentation/framework/explosives-framework.md b/documentation/framework/explosives-framework.md index e28f5dc722..abe6e016af 100644 --- a/documentation/framework/explosives-framework.md +++ b/documentation/framework/explosives-framework.md @@ -1,28 +1,32 @@ --- layout: wiki -title: Explosives framework -description: +title: Explosives Framework +description: Explains how to set-up custom explosives with the ACE3 explosives system. group: framework order: 5 parent: wiki --- +
+
Note:
+

This is just the necessary to make explosives using the framework, this is not a guide to make your own explosives.

+
+ ## 1. Explosives ### 1.1 Setting the magazine -``` +```c++ class CfgMagazines { class CA_Magazine; - class banana_satchel_remote_mag: CA_Magazine { ACE_Placeable = 1; // Can be placed useAction = 0; // Disable the vanilla interaction - ACE_SetupObject = "banana_satchel_place"; // The object placed before te explosive is armed. + ACE_SetupObject = "banana_satchel_place"; // The object placed before the explosive is armed class ACE_Triggers { // Trigger configurations - SupportedTriggers[] = {"Timer","Command", "MK16_Transmitter", "DeadmanSwitch"}; // Triggers that can be used. + SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch"}; // Triggers that can be used class Timer { - FuseTime = 0.5; // Time for the fuse to burn. + FuseTime = 0.5; // Time for the fuse to burn }; class Command { FuseTime = 0.5; @@ -36,31 +40,27 @@ class CfgMagazines { ### 1.2 Setting the ammo -``` +```c++ class CfgAmmo { - class PipeBombBase; class SatchelCharge_Remote_Ammo: PipeBombBase { - soundActivation[] = {"", 0, 0, 0}; // No sound on activation. - soundDeactivation[] = {"", 0, 0, 0}; // No sound on deactivation. + soundActivation[] = {"", 0, 0, 0}; // No sound on activation + soundDeactivation[] = {"", 0, 0, 0}; // No sound on deactivation + triggerWhenDestroyed = 1; // (Optional) Explode when the object is shot and destroyed (after being placed) (0-disabled, 1-enabled). + ACE_explodeOnDefuse = 0.02; // (Optional) Add a chance for the explosive to detonate after being disarmed (in percent) }; }; ``` -Some optionnal parameters: -- triggerWhenDestroyed = 1; // Explode when the object is shot and destroyed (after being placed) (0= disabled, 1= enabled). -- ACE_explodeOnDefuse = 0.02; // Add a chance for the explosive to detonate after being disarmed. (in percent) - ### 1.3 Adding the place item -``` +```c++ class CfgVehicles { - class ACE_Explosives_Place; class banana_satchel_place: ACE_Explosives_Place { displayName = "Banana satchel"; // Name of the item model = ""; // Path to your model - ACE_offset[] = {0,0,0}; // Offset of the interaction point from the model in meters on the X,Y,Z axis. + ACE_offset[] = {0, 0, 0}; // Offset of the interaction point from the model in meters on the X,Y,Z axis. }; }; ``` @@ -70,17 +70,15 @@ class CfgVehicles { ### 2.1 Setting the magazine -_Pretty much the same as Explosives except that we inherit from_ `ATMine_Range_Mag` _instead of_ `CA_Magazine` +_Pretty much the same as Explosives except that we inherit from_ `ATMine_Range_Mag` _instead of_ `CA_Magazine`. -``` +```c++ class CfgMagazines { - class ATMine_Range_Mag; - class BananaMine_Range_Mag: ATMine_Range_Mag { - ACE_SetupObject = "BananaMine_Place"; // The object placed before the mine is armed. + ACE_SetupObject = "BananaMine_Place"; // The object placed before the mine is armed class ACE_Triggers { // Triggers - SupportedTriggers[] = {"PressurePlate"}; // This mine only support pressure plate activation. + SupportedTriggers[] = {"PressurePlate"}; // This mine only support pressure plate activation class PressurePlate { digDistance = 0.05; }; @@ -95,33 +93,31 @@ The class you inherit from depends of what type of trigger you are using, for `P Directional mines inherit from `DirectionalBombBase`. + ## 3. Adding your own detonators -``` +```c++ class CfgWeapons { - - class ACE_ItemCore; // ACE3 base item class. - class ACE_Clacker; // Clacker base class. - + class ACE_ItemCore; // ACE3 base item class + class ACE_Clacker; // Clacker base class class banana_clacker: ACE_Clacker { - displayName = "banana clacker"; // Name of the item. - picture = ""; // Path to the item's picture. - ACE_Range = 9000; // Explosives activation range in meters. + displayName = "banana clacker"; // Name of the item + picture = ""; // Path to the item's picture + ACE_Range = 9000; // Explosives activation range in meters }; }; ``` + + ## 4. Trigger list Name | Use ---- | ----- -Command | Explode when activated via clacker. -MK16_Transmitter | Explode when activated via M26 clacker. -DeadManSwitch | Explode after activated via the switch or the person dies. -Cellphone | Explode when the number is called. -PressurePlate | Explode upon being stepped upon. -IRSensor | Explode after movement is detected in front of the mine. -Timer | Explode after timer drop to 0. -Tripwire | Explode when something touch the tripwire. - - -## 5. Events +`Command` | Explode when activated via clacker. +`MK16_Transmitter` | Explode when activated via M26 clacker. +`DeadManSwitch` | Explode after activated via the switch or the person dies. +`Cellphone` | Explode when the number is called. +`PressurePlate` | Explode upon being stepped upon. +`IRSensor` | Explode after movement is detected in front of the mine. +`Timer` | Explode after timer drop to 0. +`Tripwire` | Explode when something touch the tripwire. diff --git a/documentation/framework/settings.md b/documentation/framework/settings-framework.md similarity index 58% rename from documentation/framework/settings.md rename to documentation/framework/settings-framework.md index 58208a873d..456a294c04 100644 --- a/documentation/framework/settings.md +++ b/documentation/framework/settings-framework.md @@ -1,78 +1,71 @@ --- layout: wiki title: Settings Framework -description: ACE3 contains an extensive settings framework that allows you to tweak the modification without having to mess around with deleting pbos. +description: ACE3 contains an extensive settings framework that allows you to tweak the modification without having to mess around with deleting PBOs. group: framework order: 5 parent: wiki --- -ACE3 contains an extensive settings framework that allows you to tweak the modification without having to mess around with deleting pbos. These settings are all handled server side and broadcasted to the clients connecting to that server. This ensures that everyone playing on the server will have a uniform experience. +ACE3 contains an extensive settings framework that allows you to tweak the modification without having to mess around with deleting PBOs. These settings are all handled server side and broadcasted to the clients connecting to that server. This ensures that everyone playing on the server will have a uniform experience. Part of this settings framework are global settings and client settings. Both use the same underlaying framework, with the difference that client settings can be adjusted by clients, where global settings can not. ## 1. How do they work -Settings are entries in the config that get translated to `missionnamespace` global variables. An example settings entry looks like this: +Settings are entries in the config that get translated to `missionNamespace` global variables. An example settings entry looks like this: ```c++ class ACE_module_sampleSetting { - // Value - value = 1; + // Following 2 entries are redundant if isClientSettable = 0 + displayName = "$STR_ACE_Common_SettingName"; // Stringtable entry with the setting name + description = "$STR_ACE_Common_SettingDescription"; // Stringtable entry with the setting description - // Type (SCALAR, BOOL, STRING, ARRAY, COLOR) - typeName = "SCALAR"; + isClientSettable = 1; // Show in client options menu (0-no, 1-yes) + typeName = "SCALAR"; // Type (BOOL/SCALAR/STRING/ARRAY/COLOR) + value = 1; // Value - // Force the setting? - force = 0; + // Following entry is redundant if typeName is NOT "SCALAR" + values[] = {"Disabled", "Enabled", "Only Cursor", "Only On Keypress", "Only Cursor and KeyPress"}; // (Optional) Stringtable entries that describe the options - // Does it appear on the options menu? - isClientSettable = 1; - - // The following settings only apply when isClientSettable == 1 - // Stringtable entry with the setting name - displayName = "$STR_ACE_Common_SettingName"; - - // Stringtable entry with the setting description - description = "$STR_ACE_Common_SettingDescription"; - - // Stringtable entries that describe the options - // Only applies if typeName == "SCALAR"; and is optional - values[] = {"Disabled", "Enabled", "Only Cursor", "Only On Keypress", "Only Cursor and KeyPress"}; + // Following entry is present only in export + force = 0; // Force the setting (0-no, 1-yes), exported settings are forced by default }; ``` -Settings are defined from the mods config but can be adjusted through the following methods: +Settings are defined from the mod's config but can be adjusted through the following methods: * Optional config entries -* Mission side modules +* Mission modules + ## 2. Load order The load order for the settings are: -* 1. Mod config -* 2. Server config -* 3. Mission config -* 4. Placed down mission modules +1. Mod Config +2. Server Config +3. Mission Config +4. Placed Mission Modules + +What this means is that at any the 3 points after the Mod Config it is possible to insert your adjusted settings and force those (optionally). This is a powerful tool for server admins, whom can ensure that everyone is using uniform settings across the board on their server. And it provides mission makers the ability to easily set settings for their mission, without creating a large dependency on ACE3; you do not have to place down mission modules. -What this means is that at any the 3 points after the mod config it is possible to insert your adjusted settings and force those (optionally). This is a powerful tool for server admins, whom can ensure that everyone is using uniform settings across the board on their server. And it provides mission makers the ability to easily set settings for their mission, without creating a large dependency on ACE3; you do not have to place down mission modules. ## 3. How do I use them? -In the 'how do they work' chapter an example of settings was shown. This is the same for any settings config. The only difference is the location. For ACE3 modules, the settings are placed in the class `ACE_settings`. The same goes for the mission config. +In the 'how do they work' chapter an example of settings was shown. This is the same for any settings config. The only difference is the location. For ACE3 modules, the settings are placed in the class `ACE_Settings`. The same goes for the mission config. -The server config setting entries are done through our optional ACE_server.pbo, which can be found in the optionals folder of @ace. It also contains a `userconfig` folder, which inside contains the file `ace\serverconfig.hpp`. This is the location ACE3 settings are placed. There is no need for a sub class. +The server config setting entries are done through our optional `ace_server.pbo`, which can be found in the optionals folder of `@ace`. It also contains a `userconfig` folder, which inside contains the file `ace\serverconfig.hpp`. This is the location where ACE3 settings are placed. There is no need for a sub-class. ### 3.1 Getting all the settings! -ACE3 contains a lot of settings; for that reason tweaking everything to your liking manually can be quite a task. We have provided the option to export all settings in the editor (single-player). For this, follow these simple steps: +ACE3 contains a lot of settings, for that reason tweaking everything to your liking manually can be quite a task. We have provided the option to export all settings in the editor (single-player). For this, follow these simple steps: * Open the editor (single-player). -* Under modules (F7), find ACE, `Config Export [ACE]`. -* Place down the module, ensure that the allow parameter is set to yes. -* Press preview, once in game, press Esc and open the ACE3 Options dialog (top left) +* Under modules (F7), find ACE, `Allow Config Export [ACE]`. +* Place down the module, ensure that the `Allow` parameter is set to `Yes`. +* Press preview, once in the game, press Esc and open the ACE3 Options dialog (top left) * This is the dialog where you can modify client side settings. On the bottom left of it, you will now see a button called `Config Export`. Press it and a new dialog opens. * You are now in the dialog that allows you to adjust all settings from ACE3. Tweak this to your liking. * Once you are done tweaking, press the `Export` button and all settings will be copied to your clipboard. @@ -82,14 +75,12 @@ Note that the format copied to your clipboard by this can also be used in the mi ```c++ class ACE_Settings { - // add exported settings here + // Add exported settings here }; ``` - ### 3.2 Loading up the server config -As stated before, the server config gets loaded through the optional `ACE_server.pbo`. This PBO is only required (and should only be used) on the server - clients do not need to have this! It is for this reason we have not signed this PBO. - -Load the `ACE_server.pbo` like any other addon on your server. It is advised to create an `@aceServer` mod folder with an `addons` sub folder where you would paste the `ACE_server.pbo` and load that through `-serverMod=@aceServer`. +As stated before, the server config gets loaded through the optional `ace_server.pbo`. This PBO is only required (and should only be used) on the server - clients do not need to have this! It is for this reason we have not signed this PBO. +Load the `ace_server.pbo` like any other addon on your server. It is advised to create an `@aceServer` mod folder with an `addons` sub folder where you would paste the `ace_server.pbo` and load that through `-serverMod=@aceServer`. diff --git a/documentation/user/information-center.md b/documentation/user/information-center.md index 3df59822d7..4cea2e3b83 100644 --- a/documentation/user/information-center.md +++ b/documentation/user/information-center.md @@ -20,7 +20,7 @@ Downloaded ACE3 and have no idea where to start? This page serves as a starting ## 1. FAQ -### 1.1 Features +### 1.1 Features **Q:** Where is X feature?
**A:** When it's done.
@@ -41,17 +41,17 @@ Downloaded ACE3 and have no idea where to start? This page serves as a starting **Q:** I take vanilla damage with ACE 3.1.1
**A:** This has been fixed in 3.2.0
-**Q:** I'm having dll errors.
-**A:** Start the game once with the arma3 launcher, close it then open it with your usual launcher (arma3sync or PW6).
-The simple explanation to that is that battleye break itself and only starting it with the arma3 launcher fixes it.
+**Q:** I am having dll errors.
+**A:** Start the game once with the Arma 3 Launcher, close it, then start the game with your usual launcher (ArmA3Sync or Play withSIx).
+The simple explanation is that BattlEye breaks itself and only starting it with the Arma 3 Launcher fixes it.
-**Q:** ACE fonts is outdated.
-**A:** This happens because you're using the mod (stable) with the dev version on your P drive, remove simlinks in ARMA3 root and the P drive. +**Q:** ACE3 fonts is outdated.
+**A:** This happens because you have ACE3 development environment set-up, which means file patching is enabled. Use `-noFilePatching` startup parameter (in the upcoming Arma 3 update this will not be needed as file patching will be disabled by default). ### 1.3 Compatibility -**Q:**(mod) doesn't have some ACE3 features.
-**A:**ACE3 isn't and can't be responsible for compatibility with every (mod), due it's size other (mod) authors are strongly encouraged to provide that from their side. Compatibility PBOs currently in ACE3 are there to kick-start and provide examples for (mod) authors.
+**Q:** (mod) doesn't have some ACE3 features.
+**A:** ACE3 isn't and can't be responsible for compatibility with every (mod), due it's size other (mod) authors are strongly encouraged to provide that from their side. Compatibility PBOs currently in ACE3 are there to kick-start and provide examples for (mod) authors.
**Q:** ACE3 causes issues in (mod).
-**A:**If you've found an issue with ACE3 please make sure that ACE3 is really the cause of the problem. To do this try to reproduce the issue with using only @cba_a3 and @ACE3 on a newly created mission. ACE3 isn't and can't be responsible for all mod conflicts, due it's size other mod authors are strongly encouraged to provide that from their side.
\ No newline at end of file +**A:** If you've found an issue with ACE3 please make sure that ACE3 is really the cause of the problem. To do this try to reproduce the issue with using only `@CBA_A3` and `@ace` on a newly created mission. ACE3 isn't and can't be responsible for all mod conflicts, due it's size other mod authors are strongly encouraged to provide that from their side.
From 3bcebf9033492874f4118fa2172c72281a350fa8 Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 18 Aug 2015 23:41:25 +0200 Subject: [PATCH 008/170] Moved spare parts adding to init, Added module option to add spare parts or not, Added module to add specific spare part and amount of it to specific vehicle(s) --- addons/repair/ACE_Settings.hpp | 7 +++ addons/repair/CfgEventHandlers.hpp | 10 +-- addons/repair/CfgVehicles.hpp | 60 +++++++++++++++--- addons/repair/XEH_postInit.sqf | 14 +++++ addons/repair/XEH_preInit.sqf | 4 ++ addons/repair/functions/fnc_addSpareParts.sqf | 46 ++++++++++++++ .../functions/fnc_moduleAddSpareParts.sqf | 61 +++++++++++++++++++ .../functions/fnc_moduleRepairSettings.sqf | 2 + addons/repair/stringtable.xml | 32 ++++++++++ 9 files changed, 223 insertions(+), 13 deletions(-) create mode 100644 addons/repair/functions/fnc_addSpareParts.sqf create mode 100644 addons/repair/functions/fnc_moduleAddSpareParts.sqf diff --git a/addons/repair/ACE_Settings.hpp b/addons/repair/ACE_Settings.hpp index e956e853de..b4be91d1c3 100644 --- a/addons/repair/ACE_Settings.hpp +++ b/addons/repair/ACE_Settings.hpp @@ -61,4 +61,11 @@ class ACE_Settings { values[] = {CSTRING(engineerSetting_anyone), CSTRING(engineerSetting_EngineerOnly), CSTRING(engineerSetting_RepairSpecialistOnly)}; category = CSTRING(categoryName); }; + class GVAR(addSpareParts) { + displayName = CSTRING(addSpareParts_name); + description = CSTRING(addSpareParts_description); + typeName = "BOOL"; + value = 1; + category = CSTRING(categoryName); + }; }; diff --git a/addons/repair/CfgEventHandlers.hpp b/addons/repair/CfgEventHandlers.hpp index 27e14937cf..8a2d3e728c 100644 --- a/addons/repair/CfgEventHandlers.hpp +++ b/addons/repair/CfgEventHandlers.hpp @@ -13,31 +13,31 @@ class Extended_PostInit_EventHandlers { class Extended_Init_EventHandlers { class Car { class ADDON { - init = QUOTE(_this call DFUNC(addRepairActions)); + init = QUOTE(_this call DFUNC(addRepairActions); _this call DFUNC(addSpareParts)); }; }; class Tank { class ADDON { - init = QUOTE(_this call DFUNC(addRepairActions)); + init = QUOTE(_this call DFUNC(addRepairActions); _this call DFUNC(addSpareParts)); }; }; class Helicopter { class ADDON { - init = QUOTE(_this call DFUNC(addRepairActions)); + init = QUOTE(_this call DFUNC(addRepairActions); _this call DFUNC(addSpareParts)); }; }; class Plane { class ADDON { - init = QUOTE(_this call DFUNC(addRepairActions)); + init = QUOTE(_this call DFUNC(addRepairActions); _this call DFUNC(addSpareParts)); }; }; class Ship_F { class ADDON { - init = QUOTE(_this call DFUNC(addRepairActions)); + init = QUOTE(_this call DFUNC(addRepairActions); _this call DFUNC(addSpareParts)); }; }; class ACE_RepairItem_Base { diff --git a/addons/repair/CfgVehicles.hpp b/addons/repair/CfgVehicles.hpp index f24cd9bc9a..47cca3387b 100644 --- a/addons/repair/CfgVehicles.hpp +++ b/addons/repair/CfgVehicles.hpp @@ -91,6 +91,12 @@ class CfgVehicles { class Special { name = CSTRING(engineerSetting_RepairSpecialistOnly); value = 2; default = 1;}; }; }; + class addSpareParts { + displayName = CSTRING(addSpareParts_name); + description = CSTRING(addSpareParts_description); + typeName = "BOOL"; + defaultValue = 1; + }; }; class ModuleDescription { description = CSTRING(moduleDescription); @@ -215,19 +221,57 @@ class CfgVehicles { sync[] = {}; }; }; + class ACE_moduleAddSpareParts: Module_F { + scope = 2; + displayName = CSTRING(AddSpareParts_Module_DisplayName); + icon = QUOTE(PATHTOF(ui\Icon_Module_Repair_ca.paa)); + category = "ACE"; + function = QFUNC(moduleAddSpareParts); + functionPriority = 10; + isGlobal = 0; + isTriggerActivated = 0; + isDisposable = 0; + author = ECSTRING(common,ACETeam); + class Arguments { + class List { + displayName = CSTRING(AddSpareParts_List_DisplayName); + description = CSTRING(AddSpareParts_List_Description); + defaultValue = ""; + typeName = "STRING"; + }; + class Part { + displayName = CSTRING(AddSpareParts_Part_DisplayName); + description = CSTRING(AddSpareParts_Part_Description); + typeName = "STRING"; + class values { + class Wheel { + name = CSTRING(SpareWheel); + value = "ACE_Wheel"; + default = 1; + }; + class Track { + name = CSTRING(SpareTrack); + value = "ACE_Track"; + }; + }; + }; + class Amount { + displayName = CSTRING(AddSpareParts_Amount_DisplayName); + description = CSTRING(AddSpareParts_Amount_Description); + typeName = "NUMBER"; + defaultValue = 1; + }; + }; + class ModuleDescription { + description = CSTRING(AddSpareParts_Module_Description); + sync[] = {}; + }; + }; class LandVehicle; class Car: LandVehicle { MACRO_REPAIRVEHICLE - class ACE_Cargo { - class Cargo { - class ACE_Wheel { - type = "ACE_Wheel"; - amount = 1; - }; - }; - }; }; class Tank: LandVehicle { diff --git a/addons/repair/XEH_postInit.sqf b/addons/repair/XEH_postInit.sqf index 44ca157b0c..d61f20a31e 100644 --- a/addons/repair/XEH_postInit.sqf +++ b/addons/repair/XEH_postInit.sqf @@ -5,3 +5,17 @@ // wheels ["setWheelHitPointDamage", {(_this select 0) setHitPointDamage [_this select 1, _this select 2]}] call EFUNC(common,addEventHandler); + +if (isServer) then { + ["SettingsInitialized", { + GVAR(settingInitted) = true; // Stop collecting in FUNC(addSpareParts) + + // Exit if adding spare parts disabled + if (!GVAR(addSpareParts)) exitWith {GVAR(addSparePartsCollection) = nil}; + + // Add spare parts to vehicles in collection + { + [_x] call FUNC(addSpareParts); + } forEach GVAR(addSparePartsCollection); + }] call EFUNC(common,addEventHandler); +}; diff --git a/addons/repair/XEH_preInit.sqf b/addons/repair/XEH_preInit.sqf index ebf4c87537..28078d1b9c 100644 --- a/addons/repair/XEH_preInit.sqf +++ b/addons/repair/XEH_preInit.sqf @@ -3,6 +3,7 @@ ADDON = false; PREP(addRepairActions); +PREP(addSpareParts); PREP(canRemove); PREP(canRepair); PREP(canRepairTrack); @@ -22,6 +23,7 @@ PREP(isEngineer); PREP(isInRepairFacility); PREP(isNearRepairVehicle); PREP(isRepairVehicle); +PREP(moduleAddSpareParts); PREP(moduleAssignEngineer); PREP(moduleAssignRepairVehicle); PREP(moduleAssignRepairFacility); @@ -36,4 +38,6 @@ PREP(spawnObject); PREP(useItem); PREP(useItems); +GVAR(addSparePartsCollection) = []; + ADDON = true; diff --git a/addons/repair/functions/fnc_addSpareParts.sqf b/addons/repair/functions/fnc_addSpareParts.sqf new file mode 100644 index 0000000000..dd6588b485 --- /dev/null +++ b/addons/repair/functions/fnc_addSpareParts.sqf @@ -0,0 +1,46 @@ +/* + * Author: Jonpas + * Adds spare parts to the vehicle. Before SettingsInitialized only collect for later execution. + * + * Arguments: + * 0: Vehicle + * 1: Amount (default: 1) + * 2: Spare Part Classname (default: "") + * 3: Force (add even if setting is disabled) (default: false) + * + * Return Value: + * None + * + * Example: + * _added = [vehicle] call ace_repair_fnc_addSpareParts + * + * Public: No + */ +#include "script_component.hpp" + +private ["_part"]; +params ["_vehicle", ["_amount", 1], ["_part", ""], ["_force", false]]; +TRACE_2("params",_vehicle,_amount); + +// Exit if ace_cargo is not loaded +if !(["ace_cargo"] call EFUNC(common,isModLoaded)) exitWith {}; + +// Collect until SettingsInitialized +if (isNil QGVAR(settingInitted)) exitWith { + GVAR(addSparePartsCollection) pushBack _vehicle; +}; + +// Exit if not forced and add spare parts is disabled (after settings initted to make sure it really is) +if (!_force && !GVAR(addSpareParts)) exitWith {}; + +// Select appropriate part +if (_part == "") then { + if (_vehicle isKindOf "Car") then { _part = "ACE_Wheel" }; + if (_vehicle isKindOf "Tank") then { _part = "ACE_Track" }; +}; +// Exit if no appropriate part +if (_part == "") exitWith {}; + +// Load +//["LoadItem", [_part, _vehicle]] call EFUNC(cargo,loadItem); +[_part, _vehicle, _amount] call EFUNC(cargo,addItem); // Change to above event diff --git a/addons/repair/functions/fnc_moduleAddSpareParts.sqf b/addons/repair/functions/fnc_moduleAddSpareParts.sqf new file mode 100644 index 0000000000..46689951a7 --- /dev/null +++ b/addons/repair/functions/fnc_moduleAddSpareParts.sqf @@ -0,0 +1,61 @@ +/* + * Author: Jonpas + * Adds spare parts to a vehicle. + * + * Arguments: + * 0: The module logic + * 1: Synchronized units + * 2: Activated + * + * Return Value: + * None + * + * Example: + * function = "ace_repair_fnc_moduleAssignRepairVehicle" + * + * Public: No + */ +#define DEBUG_MODE_FULL +#include "script_component.hpp" + +params ["_logic"]; + +if (!isNull _logic) then { + private ["_list", "_part", "_amount", "_nilCheckPassedList"]; + // Module settings + _list = _logic getVariable ["List", ""]; + _part = _logic getVariable ["Part", 0]; + _amount = _logic getVariable ["Amount", 1]; + + // Parse list + _nilCheckPassedList = ""; + { + _x = [_x] call EFUNC(common,stringRemoveWhiteSpace); + if !(isnil _x) then { + if (_nilCheckPassedList == "") then { + _nilCheckPassedList = _x; + } else { + _nilCheckPassedList = _nilCheckPassedList + "," + _x; + }; + }; + } forEach ([_list, ","] call BIS_fnc_splitString); + _list = "[" + _nilCheckPassedList + "]"; + _list = [] call compile _list; + + // Add synchronized objects to list + { + _list pushBack _x; + } forEach (synchronizedObjects _logic); + + if (_list isEqualTo []) exitWith {}; + + TRACE_3("module info parsed",_list,_part,_amount); + // Add spare parts + { + if (!isNil "_x" && {typeName _x == typeName objNull}) then { + [_x, _amount, _part, true] call FUNC(addSpareParts); + }; + } forEach _list; +}; + +true diff --git a/addons/repair/functions/fnc_moduleRepairSettings.sqf b/addons/repair/functions/fnc_moduleRepairSettings.sqf index 3b97d2f168..2c7e406490 100644 --- a/addons/repair/functions/fnc_moduleRepairSettings.sqf +++ b/addons/repair/functions/fnc_moduleRepairSettings.sqf @@ -31,4 +31,6 @@ if (!isServer) exitWith {}; [_logic, QGVAR(fullRepairLocation), "fullRepairLocation"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(engineerSetting_fullRepair), "engineerSetting_fullRepair"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(addSpareParts), "addSpareParts"] call EFUNC(common,readSettingFromModule); + diag_log text "[ACE]: Repair Module Initialized."; diff --git a/addons/repair/stringtable.xml b/addons/repair/stringtable.xml index ffafc56683..ce53e79c6d 100644 --- a/addons/repair/stringtable.xml +++ b/addons/repair/stringtable.xml @@ -104,6 +104,12 @@ Who can perform a full repair on a vehicle? + + Add Spare Parts + + + Add spare parts to vehicles (requires Cargo component)? + Repair %1 Reparieren %1 @@ -635,6 +641,32 @@ Assign one or multiple objects as a repair Facility + + + Add Spare Parts + + + Add spare parts to one or multiple objects + + + List + + + List of objects that will get spare parts added, separated by commas. + + + Part + + + Spare part. + + + Amount + + + Number of selected spare parts. + + Vehicle Repair From ffb765bf7a7adaf311c8ced43328c4683af539ba Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 18 Aug 2015 23:43:34 +0200 Subject: [PATCH 009/170] Changed to AddCargoItem event --- addons/repair/functions/fnc_addSpareParts.sqf | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/addons/repair/functions/fnc_addSpareParts.sqf b/addons/repair/functions/fnc_addSpareParts.sqf index dd6588b485..4ec01a6cc1 100644 --- a/addons/repair/functions/fnc_addSpareParts.sqf +++ b/addons/repair/functions/fnc_addSpareParts.sqf @@ -12,7 +12,7 @@ * None * * Example: - * _added = [vehicle] call ace_repair_fnc_addSpareParts + * [vehicle] call ace_repair_fnc_addSpareParts * * Public: No */ @@ -42,5 +42,4 @@ if (_part == "") then { if (_part == "") exitWith {}; // Load -//["LoadItem", [_part, _vehicle]] call EFUNC(cargo,loadItem); -[_part, _vehicle, _amount] call EFUNC(cargo,addItem); // Change to above event +["AddCargoItem", [_part, _vehicle, _amount]] call EFUNC(common,localEvent); From d09ca9ec8be5ce1102f740ae524b90fb8d16c2fa Mon Sep 17 00:00:00 2001 From: jokoho48 Date: Sat, 22 Aug 2015 16:25:10 +0200 Subject: [PATCH 010/170] Code Cleanup Medical Module (Part 1). --- .../fnc_actionCheckBloodPressure.sqf | 7 +- .../fnc_actionCheckBloodPressureLocal.sqf | 11 ++- .../functions/fnc_actionCheckPulse.sqf | 7 +- .../functions/fnc_actionCheckPulseLocal.sqf | 7 +- .../functions/fnc_actionCheckResponse.sqf | 14 ++-- .../medical/functions/fnc_actionDiagnose.sqf | 7 +- .../medical/functions/fnc_actionLoadUnit.sqf | 13 ++-- .../functions/fnc_actionPlaceInBodyBag.sqf | 3 +- .../functions/fnc_actionRemoveTourniquet.sqf | 8 +-- .../functions/fnc_actionUnloadUnit.sqf | 11 ++- .../functions/fnc_addHeartRateAdjustment.sqf | 9 +-- .../functions/fnc_addToInjuredCollection.sqf | 16 ++--- addons/medical/functions/fnc_addToLog.sqf | 23 +++--- .../medical/functions/fnc_addToTriageCard.sqf | 11 ++- .../functions/fnc_addUnconsciousCondition.sqf | 7 +- .../functions/fnc_addUnloadPatientActions.sqf | 5 +- .../medical/functions/fnc_adjustPainLevel.sqf | 2 +- .../fnc_canAccessMedicalEquipment.sqf | 7 +- addons/medical/functions/fnc_canTreat.sqf | 31 ++++---- .../medical/functions/fnc_canTreatCached.sqf | 3 +- addons/medical/functions/fnc_copyDeadBody.sqf | 7 +- addons/medical/functions/fnc_createLitter.sqf | 50 +++++++------ .../functions/fnc_determineIfFatal.sqf | 26 +++---- .../fnc_displayPatientInformation.sqf | 71 +++++++++---------- .../functions/fnc_displayTriageCard.sqf | 29 ++++---- .../functions/fnc_dropDownTriageCard.sqf | 8 +-- addons/medical/functions/fnc_getBloodLoss.sqf | 9 ++- .../functions/fnc_getBloodPressure.sqf | 19 +++-- .../functions/fnc_getBloodVolumeChange.sqf | 10 ++- .../functions/fnc_getCardiacOutput.sqf | 3 +- .../functions/fnc_getHeartRateChange.sqf | 11 ++- .../medical/functions/fnc_getTriageStatus.sqf | 8 ++- .../medical/functions/fnc_getTypeOfDamage.sqf | 32 ++++----- .../functions/fnc_getUnconsciousCondition.sqf | 6 +- .../functions/fnc_handleBandageOpening.sqf | 30 +++----- .../functions/fnc_handleCreateLitter.sqf | 32 ++++++--- addons/medical/functions/fnc_handleDamage.sqf | 11 +-- .../functions/fnc_handleDamage_advanced.sqf | 11 +-- .../fnc_handleDamage_advancedSetDamage.sqf | 6 +- .../functions/fnc_handleDamage_airway.sqf | 10 +-- .../functions/fnc_handleDamage_basic.sqf | 17 ++--- .../functions/fnc_handleDamage_caching.sqf | 28 ++++---- .../functions/fnc_handleDamage_fractures.sqf | 8 +-- .../fnc_handleDamage_internalInjuries.sqf | 10 +-- .../functions/fnc_handleDamage_wounds.sqf | 17 ++--- .../functions/fnc_handleDamage_woundsOld.sqf | 14 ++-- addons/medical/functions/fnc_handleKilled.sqf | 4 +- addons/medical/functions/fnc_handleLocal.sqf | 4 +- .../functions/fnc_handleUnitVitals.sqf | 10 ++- addons/medical/functions/fnc_hasItem.sqf | 12 ++-- addons/medical/functions/fnc_hasItems.sqf | 6 +- .../functions/fnc_hasMedicalEnabled.sqf | 32 +++++---- .../functions/fnc_hasTourniquetAppliedTo.sqf | 4 +- addons/medical/functions/fnc_init.sqf | 5 +- .../medical/functions/fnc_isBeingCarried.sqf | 2 +- .../medical/functions/fnc_isBeingDragged.sqf | 2 +- .../functions/fnc_isInMedicalFacility.sqf | 8 +-- .../functions/fnc_isInMedicalVehicle.sqf | 5 +- .../functions/fnc_isInStableCondition.sqf | 6 +- addons/medical/functions/fnc_isMedic.sqf | 5 +- .../functions/fnc_isMedicalVehicle.sqf | 3 +- addons/medical/functions/fnc_itemCheck.sqf | 5 +- .../functions/fnc_modifyMedicalAction.sqf | 9 +-- .../fnc_moduleAdvancedMedicalSettings.sqf | 7 +- .../functions/fnc_moduleAssignMedicRoles.sqf | 14 ++-- .../fnc_moduleAssignMedicalFacility.sqf | 8 +-- .../fnc_moduleAssignMedicalVehicle.sqf | 14 ++-- .../functions/fnc_moduleMedicalSettings.sqf | 7 +- .../functions/fnc_moduleReviveSettings.sqf | 7 +- .../functions/fnc_onMedicationUsage.sqf | 40 ++++------- .../functions/fnc_onPropagateWound.sqf | 7 +- .../functions/fnc_onWoundUpdateRequest.sqf | 7 +- .../functions/fnc_parseConfigForInjuries.sqf | 29 ++++---- .../functions/fnc_playInjuredSound.sqf | 6 +- .../functions/fnc_setCardiacArrest.sqf | 4 +- addons/medical/functions/fnc_setDead.sqf | 4 +- .../fnc_treatmentTourniquetLocal.sqf | 4 +- .../medical/functions/fnc_unconsciousPFH.sqf | 6 +- 78 files changed, 428 insertions(+), 543 deletions(-) diff --git a/addons/medical/functions/fnc_actionCheckBloodPressure.sqf b/addons/medical/functions/fnc_actionCheckBloodPressure.sqf index e8e03bb4c0..96c9740b5d 100644 --- a/addons/medical/functions/fnc_actionCheckBloodPressure.sqf +++ b/addons/medical/functions/fnc_actionCheckBloodPressure.sqf @@ -7,14 +7,11 @@ * 1: The patient * * Return Value: -* NONE +* None * * Public: No */ #include "script_component.hpp" -private ["_caller","_target"]; -_caller = _this select 0; -_target = _this select 1; -[[_caller, _target], QUOTE(DFUNC(actionCheckBloodPressureLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ +[_this, QUOTE(DFUNC(actionCheckBloodPressureLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ diff --git a/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf b/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf index 82edd1749f..c7b444de73 100644 --- a/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf +++ b/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf @@ -7,24 +7,21 @@ * 1: The patient * * Return Value: - * NONE + * None * * Public: No */ #include "script_component.hpp" -private ["_caller","_target","_bloodPressure","_bloodPressureHigh","_bloodPressureLow", "_logOutPut", "_output"]; -_caller = _this select 0; -_target = _this select 1; +private ["_bloodPressure", "_logOutPut", "_output"]; +params ["_caller", "_target"]; _bloodPressure = [_target] call FUNC(getBloodPressure); if (!alive _target) then { _bloodPressure = [0,0]; }; - -_bloodPressureHigh = _bloodPressure select 1; -_bloodPressureLow = _bloodPressure select 0; +_bloodPressure params ["_bloodPressureLow", "_bloodPressureLow"]; _output = ""; _logOutPut = ""; if ([_caller] call FUNC(isMedic)) then { diff --git a/addons/medical/functions/fnc_actionCheckPulse.sqf b/addons/medical/functions/fnc_actionCheckPulse.sqf index fd96321e8f..1861195a04 100644 --- a/addons/medical/functions/fnc_actionCheckPulse.sqf +++ b/addons/medical/functions/fnc_actionCheckPulse.sqf @@ -7,14 +7,11 @@ * 1: The patient * * Return Value: -* NONE +* None * * Public: No */ #include "script_component.hpp" -private ["_caller","_target"]; -_caller = _this select 0; -_target = _this select 1; -[[_caller, _target], QUOTE(DFUNC(actionCheckPulseLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ +[_this, QUOTE(DFUNC(actionCheckPulseLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ diff --git a/addons/medical/functions/fnc_actionCheckPulseLocal.sqf b/addons/medical/functions/fnc_actionCheckPulseLocal.sqf index d759bf1bc8..74f9fc5eb5 100644 --- a/addons/medical/functions/fnc_actionCheckPulseLocal.sqf +++ b/addons/medical/functions/fnc_actionCheckPulseLocal.sqf @@ -7,16 +7,15 @@ * 1: The patient * * Return Value: - * NONE + * None * * Public: No */ #include "script_component.hpp" -private ["_caller", "_unit", "_heartRateOutput", "_heartRate", "_logOutPut"]; -_caller = _this select 0; -_unit = _this select 1; +private ["_heartRateOutput", "_heartRate", "_logOutPut"]; +params ["_caller", "_unit"]; _heartRate = _unit getvariable [QGVAR(heartRate), 80]; diff --git a/addons/medical/functions/fnc_actionCheckResponse.sqf b/addons/medical/functions/fnc_actionCheckResponse.sqf index b5df63047e..7db4fe0a5d 100644 --- a/addons/medical/functions/fnc_actionCheckResponse.sqf +++ b/addons/medical/functions/fnc_actionCheckResponse.sqf @@ -7,22 +7,20 @@ * 1: The patient * * Return Value: - * NONE + * None * * Public: No */ #include "script_component.hpp" -private ["_caller","_target", "_output"]; -_caller = _this select 0; -_target = _this select 1; +private ["_output"]; +params ["_caller", "_target"]; -_output = ""; -if ([_target] call EFUNC(common,isAwake)) then { - _output = LSTRING(Check_Response_Responsive); +_output = if ([_target] call EFUNC(common,isAwake)) then { + LSTRING(Check_Response_Responsive) } else { - _output = LSTRING(Check_Response_Unresponsive); + LSTRING(Check_Response_Unresponsive) }; ["displayTextStructured", [_caller], [[_output, [_target] call EFUNC(common,getName)], 2, _caller]] call EFUNC(common,targetEvent); diff --git a/addons/medical/functions/fnc_actionDiagnose.sqf b/addons/medical/functions/fnc_actionDiagnose.sqf index 243edbdef8..5cc0d307da 100644 --- a/addons/medical/functions/fnc_actionDiagnose.sqf +++ b/addons/medical/functions/fnc_actionDiagnose.sqf @@ -7,16 +7,15 @@ * 1: The patient * * Return Value: -* NONE +* None * * Public: No */ #include "script_component.hpp" -private ["_caller", "_target", "_genericMessages"]; -_caller = _this select 0; -_target = _this select 1; +private "_genericMessages"; +params ["_caller", "_target"]; _genericMessages = [LSTRING(diagnoseMessage)]; diff --git a/addons/medical/functions/fnc_actionLoadUnit.sqf b/addons/medical/functions/fnc_actionLoadUnit.sqf index 03d9a3ef54..f4b941383f 100644 --- a/addons/medical/functions/fnc_actionLoadUnit.sqf +++ b/addons/medical/functions/fnc_actionLoadUnit.sqf @@ -7,26 +7,25 @@ * 1: The patient * * Return Value: - * NONE + * None * * Public: No */ #include "script_component.hpp" -private ["_caller", "_target","_vehicle"]; -_caller = _this select 0; -_target = _this select 1; +private "_vehicle"; +params ["_caller", "_target"]; if ([_target] call EFUNC(common,isAwake)) exitwith { // TODO localization ["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 { - [_caller, _target] call EFUNC(dragging,dropObject_carry); + _this call EFUNC(dragging,dropObject_carry); }; if ([_target] call FUNC(isBeingDragged)) then { - [_caller, _target] call EFUNC(dragging,dropObject); + _this call EFUNC(dragging,dropObject); }; -_vehicle = [_caller, _target] call EFUNC(common,loadPerson); +_vehicle = _this call EFUNC(common,loadPerson); diff --git a/addons/medical/functions/fnc_actionPlaceInBodyBag.sqf b/addons/medical/functions/fnc_actionPlaceInBodyBag.sqf index 73f9eeca4d..f416535701 100644 --- a/addons/medical/functions/fnc_actionPlaceInBodyBag.sqf +++ b/addons/medical/functions/fnc_actionPlaceInBodyBag.sqf @@ -14,9 +14,8 @@ #include "script_component.hpp" -PARAMS_2(_caller,_target); - private ["_position", "_headPos", "_spinePos", "_dirVect", "_direction", "_bodyBag"]; +params ["_caller", "_target"]; if (alive _target) then { [_target, true] call FUNC(setDead); diff --git a/addons/medical/functions/fnc_actionRemoveTourniquet.sqf b/addons/medical/functions/fnc_actionRemoveTourniquet.sqf index a14dbc3bcd..778042e9a6 100644 --- a/addons/medical/functions/fnc_actionRemoveTourniquet.sqf +++ b/addons/medical/functions/fnc_actionRemoveTourniquet.sqf @@ -8,17 +8,15 @@ * 2: SelectionName * * Return Value: - * NONE + * None * * Public: Yes */ #include "script_component.hpp" -private ["_caller", "_target", "_part", "_selectionName", "_tourniquets", "_output"]; -_caller = _this select 0; -_target = _this select 1; -_selectionName = _this select 2; +private ["_part", "_tourniquets", "_output"]; +params ["_caller", "_target", "_selectionName"]; // grab the required data _part = [_selectionName] call FUNC(selectionNameToNumber); diff --git a/addons/medical/functions/fnc_actionUnloadUnit.sqf b/addons/medical/functions/fnc_actionUnloadUnit.sqf index a73f32265a..6bb4f5beed 100644 --- a/addons/medical/functions/fnc_actionUnloadUnit.sqf +++ b/addons/medical/functions/fnc_actionUnloadUnit.sqf @@ -5,23 +5,20 @@ * Arguments: * 0: The medic * 1: The patient - * 2: Drag after unload + * 2: Drag after unload (default: false) * * Return Value: - * NONE + * None * * Public: No */ #include "script_component.hpp" -private ["_caller", "_target", "_drag"]; -_caller = _this select 0; -_target = _this select 1; -_drag = if (count _this > 2) then {_this select 2} else {false}; +params ["_caller", "_target", ["_drag", false]]; // cannot unload a unit not in a vehicle. if (vehicle _target == _target) exitwith {}; if (([_target] call EFUNC(common,isAwake))) exitwith {}; -["unloadPersonEvent", _target, [_target, vehicle _target]] call EFUNC(common,targetEvent) \ No newline at end of file +["unloadPersonEvent", _target, [_target, vehicle _target]] call EFUNC(common,targetEvent) diff --git a/addons/medical/functions/fnc_addHeartRateAdjustment.sqf b/addons/medical/functions/fnc_addHeartRateAdjustment.sqf index f4516a100c..7171eee275 100644 --- a/addons/medical/functions/fnc_addHeartRateAdjustment.sqf +++ b/addons/medical/functions/fnc_addHeartRateAdjustment.sqf @@ -9,18 +9,15 @@ * 3: callback * * Return Value: - * nil + * None * * Public: Yes */ #include "script_component.hpp" -private ["_unit", "_value", "_time", "_adjustment", "_callBack"]; -_unit = [_this, 0, objNull, [objNull]] call BIS_fnc_Param; -_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; + +params [["_unit", objNull, [objNull]], ["_value", 0, [0]], ["_time", 1, [0]], ["_callBack", {}, [{}]]]; _adjustment = _unit getvariable [QGVAR(heartRateAdjustments), []]; _adjustment pushback [_value, _time, _callBack]; diff --git a/addons/medical/functions/fnc_addToInjuredCollection.sqf b/addons/medical/functions/fnc_addToInjuredCollection.sqf index 083f949d9d..66433a5ed0 100644 --- a/addons/medical/functions/fnc_addToInjuredCollection.sqf +++ b/addons/medical/functions/fnc_addToInjuredCollection.sqf @@ -6,16 +6,14 @@ * 0: The Unit * * ReturnValue: - * + * None * * Public: Yes */ #include "script_component.hpp" -private ["_unit", "_force"]; -_unit = _this select 0; -_force = if (count _this > 1) then {_this select 1} else {false}; +params ["_unit", ["_force", false]]; if ([_unit] call FUNC(hasMedicalEnabled) || _force) then { @@ -27,13 +25,13 @@ if ([_unit] call FUNC(hasMedicalEnabled) || _force) then { _unit setvariable [QGVAR(addedToUnitLoop), true, true]; [{ - private ["_unit", "_interval"]; - _unit = (_this select 0) select 0; - _interval = ACE_time - ((_this select 0) select 1); + params ["_args", "_idPFH"]; + _args params ["_unit", "_interval"]; + _interval = ACE_time - _interval; (_this select 0) set [1, ACE_time]; - + if (!alive _unit || !local _unit) then { - [_this select 1] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; if (!local _unit) then { if (GVAR(level) >= 2) then { _unit setvariable [QGVAR(heartRate), _unit getvariable [QGVAR(heartRate), 80], true]; diff --git a/addons/medical/functions/fnc_addToLog.sqf b/addons/medical/functions/fnc_addToLog.sqf index af7d9f3170..54a685611a 100644 --- a/addons/medical/functions/fnc_addToLog.sqf +++ b/addons/medical/functions/fnc_addToLog.sqf @@ -9,27 +9,26 @@ * 3: The arguments for localization * * Return Value: - * nil + * None * * Public: Yes */ #include "script_component.hpp" -private ["_unit", "_type", "_message", "_arguments", "_lastNumber", "_moment", "_logVarName", "_log","_newLog", "_logs"]; -_unit = _this select 0; -_type = _this select 1; -_message = _this select 2; -_arguments = _this select 3; +private ["_moment", "_logVarName", "_log","_newLog", "_logs"]; +params ["_unit", "_type", "_allMapMarkers", "_arguments"]; if (!local _unit) exitwith { [_this, QUOTE(DFUNC(addToLog)), _unit] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ }; -_lastNumber = date select 4; -_moment = format["%1:%2",date select 3, _lastNumber]; -if (_lastNumber < 10) then { - _moment = format["%1:0%2",date select 3, _lastNumber]; +date params ["_minute", "_hour"]; + +_moment = if (_minute < 10) then { + format["%1:0%2", _hour, _minute] +} else { + format["%1:%2", _hour, _minute] }; _logVarName = format[QGVAR(logFile_%1), _type]; @@ -41,10 +40,10 @@ if (count _log >= 8) then { if (_foreachIndex > 0) then { _newLog pushback _x; }; - }foreach _log; + } foreach _log; _log = _newLog; }; -_log pushback [_message,_moment,_type, _arguments]; +_log pushback [_message, _moment, _type, _arguments]; _unit setvariable [_logVarName, _log, true]; ["medical_onLogEntryAdded", [_unit, _type, _message, _arguments]] call EFUNC(common,localEvent); diff --git a/addons/medical/functions/fnc_addToTriageCard.sqf b/addons/medical/functions/fnc_addToTriageCard.sqf index 7495c04a8a..1869340ad8 100644 --- a/addons/medical/functions/fnc_addToTriageCard.sqf +++ b/addons/medical/functions/fnc_addToTriageCard.sqf @@ -7,16 +7,15 @@ * 1: The new item classname * * Return Value: - * nil + * None * * Public: Yes */ #include "script_component.hpp" - -private ["_unit", "_newItem", "_log", "_inList", "_amount"]; -_unit = _this select 0; -_newItem = _this select 1; +d +private ["_log", "_inList", "_amount"]; +params ["_unit", "_newItem"]; if (!local _unit) exitwith { [_this, QUOTE(DFUNC(addToTriageList)), _unit] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ @@ -36,7 +35,7 @@ _amount = 1; _amount = (_info select 1); _inList = true; }; -}foreach _log; +} foreach _log; if (!_inList) then { _log pushback [_newItem, 1, ACE_time]; diff --git a/addons/medical/functions/fnc_addUnconsciousCondition.sqf b/addons/medical/functions/fnc_addUnconsciousCondition.sqf index 579a55ca1f..6a867088da 100644 --- a/addons/medical/functions/fnc_addUnconsciousCondition.sqf +++ b/addons/medical/functions/fnc_addUnconsciousCondition.sqf @@ -3,14 +3,13 @@ * Adds new condition for the unconscious state. Conditions are not actively checked for units unless unit is in unconscious state. * * Arguments: - * 0: Code, should return a boolean + * 0-N: Code, should return a boolean * * ReturnValue: - * + * None * * Public: Yes */ - #include "script_component.hpp" if (isnil QGVAR(unconsciousConditions)) then { @@ -21,5 +20,5 @@ if (typeName _this == typeName []) then { if (typeName _x == typeName {}) then { GVAR(unconsciousConditions) pushback _x; }; - }foreach _this; + } foreach _this; }; diff --git a/addons/medical/functions/fnc_addUnloadPatientActions.sqf b/addons/medical/functions/fnc_addUnloadPatientActions.sqf index 13a4177859..11e0463328 100644 --- a/addons/medical/functions/fnc_addUnloadPatientActions.sqf +++ b/addons/medical/functions/fnc_addUnloadPatientActions.sqf @@ -13,8 +13,7 @@ * Public: No */ #include "script_component.hpp" - -EXPLODE_3_PVT(_this,_vehicle,_player,_parameters); +params ["_vehicle", "_player", "_parameters"]; private ["_actions", "_unit"]; _actions = []; @@ -28,7 +27,7 @@ _actions = []; str(_unit), [_unit, true] call EFUNC(common,getName), "", - {[_player, (_this select 2) select 0] call FUNC(actionUnloadUnit);}, + {[_player, _parameters select 0] call FUNC(actionUnloadUnit);}, {true}, {}, [_unit] diff --git a/addons/medical/functions/fnc_adjustPainLevel.sqf b/addons/medical/functions/fnc_adjustPainLevel.sqf index 7e6ce2d5f1..c4aab9e48d 100644 --- a/addons/medical/functions/fnc_adjustPainLevel.sqf +++ b/addons/medical/functions/fnc_adjustPainLevel.sqf @@ -18,7 +18,7 @@ private ["_pain"]; -PARAMS_2(_unit,_addedPain); +params ["_unit", "_addedPain"]; //Only run on local units: if (!local _unit) exitWith {ERROR("unit is not local");}; diff --git a/addons/medical/functions/fnc_canAccessMedicalEquipment.sqf b/addons/medical/functions/fnc_canAccessMedicalEquipment.sqf index 4b1940b7e3..0be01ac492 100644 --- a/addons/medical/functions/fnc_canAccessMedicalEquipment.sqf +++ b/addons/medical/functions/fnc_canAccessMedicalEquipment.sqf @@ -14,9 +14,8 @@ #include "script_component.hpp" -private ["_target", "_caller", "_accessLevel", "_return"]; -_caller = _this select 0; -_target = _this select 1; +private ["_accessLevel", "_return"]; +params ["_caller", "_targ"]; _accessLevel = _target getvariable [QGVAR(allowSharedEquipmentAccess), -1]; @@ -28,4 +27,4 @@ if (_accessLevel >= 0) then { if (_accessLevel == 2) exitwith { _return = (group _target == group _caller); }; }; -_return; \ No newline at end of file +_return; diff --git a/addons/medical/functions/fnc_canTreat.sqf b/addons/medical/functions/fnc_canTreat.sqf index e0cab95420..e1817d21fe 100644 --- a/addons/medical/functions/fnc_canTreat.sqf +++ b/addons/medical/functions/fnc_canTreat.sqf @@ -16,17 +16,16 @@ #include "script_component.hpp" -private ["_caller", "_target", "_selectionName", "_className", "_config", "_medicRequired", "_items", "_locations", "_return", "_condition", "_patientStateCondition", "_allowedSelections"]; -_caller = _this select 0; -_target = _this select 1; -_selectionName = _this select 2; -_className = _this select 3; +private ["_config", "_medicRequired", "_items", "_locations", "_return", "_condition", "_patientStateCondition", "_allowedSelections"]; +params ["_caller", "_target", "_selectionName", "_className"]; -if !(_target isKindOf "CAManBase") exitWith {false}; +if !(_target isKindOf "CAManBase") exitWith { false }; -_config = (ConfigFile >> "ACE_Medical_Actions" >> "Basic" >> _className); -if (GVAR(level)>=2) then { - _config = (ConfigFile >> "ACE_Medical_Actions" >> "Advanced" >> _className); + +_config = if (GVAR(level)>=2) then { + (ConfigFile >> "ACE_Medical_Actions" >> "Advanced" >> _className) +} else { + (ConfigFile >> "ACE_Medical_Actions" >> "Basic" >> _className) }; if !(isClass _config) exitwith {false}; @@ -35,17 +34,17 @@ _medicRequired = if (isNumber (_config >> "requiredMedic")) then { } else { // Check for required class if (isText (_config >> "requiredMedic")) exitwith { - missionNamespace getvariable [(getText (_config >> "requiredMedic")), 0]; + missionNamespace getvariable [(getText (_config >> "requiredMedic")), 0] }; 0; }; -if !([_caller, _medicRequired] call FUNC(isMedic)) exitwith {false}; +if !([_caller, _medicRequired] call FUNC(isMedic)) exitwith { false }; _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"); -if !("All" in _allowedSelections || {(_selectionName in _allowedSelections)}) exitwith {false}; +if !("All" in _allowedSelections || {(_selectionName in _allowedSelections)}) exitwith { false }; _return = true; if (getText (_config >> "condition") != "") then { @@ -61,7 +60,7 @@ if (getText (_config >> "condition") != "") then { _return = [_caller, _target, _selectionName, _className] call _condition; }; }; -if (!_return) exitwith {false}; +if (!_return) exitwith { false }; _patientStateCondition = if (isText(_config >> "patientStateCondition")) then { 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}; _locations = getArray (_config >> "treatmentLocations"); -if ("All" in _locations) exitwith {true}; +if ("All" in _locations) exitwith { true }; private [ "_medFacility", "_medVeh"]; _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; diff --git a/addons/medical/functions/fnc_canTreatCached.sqf b/addons/medical/functions/fnc_canTreatCached.sqf index b1dfaf7d12..273da7dc4b 100644 --- a/addons/medical/functions/fnc_canTreatCached.sqf +++ b/addons/medical/functions/fnc_canTreatCached.sqf @@ -17,6 +17,7 @@ #include "script_component.hpp" #define MAX_DURATION_CACHE 2 +params ["", "_target", "_selection", "_classname"]; // 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); diff --git a/addons/medical/functions/fnc_copyDeadBody.sqf b/addons/medical/functions/fnc_copyDeadBody.sqf index 36bcd91487..9a3936f009 100644 --- a/addons/medical/functions/fnc_copyDeadBody.sqf +++ b/addons/medical/functions/fnc_copyDeadBody.sqf @@ -7,16 +7,15 @@ * 1: The caller * * 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 * * Public: No */ #include "script_component.hpp" -private ["_oldBody","_newUnit","_class","_group","_position","_side", "_caller", "_name"]; -_oldBody = _this select 0; -_caller = _this select 1; +private ["_newUnit", "_class", "_group", "_position", "_side", "_name"]; +params ["_oldBody", "_caller"]; if (alive _oldBody) exitwith {_oldBody}; // we only want to do this for dead bodies diff --git a/addons/medical/functions/fnc_createLitter.sqf b/addons/medical/functions/fnc_createLitter.sqf index a3b71b7f9c..b25a3bbf94 100644 --- a/addons/medical/functions/fnc_createLitter.sqf +++ b/addons/medical/functions/fnc_createLitter.sqf @@ -3,11 +3,16 @@ * Spawns litter for the treatment action on the ground around the target * * Arguments: - * 0: The target - * 1: The treatment classname + * 0: The Caller + * 1: The target + * 2: The treatment Selection Name + * 3: The treatment classname + * 4: ? + * 5: Users of Items + * 6: Previous Damage * * Return Value: - * + * None * * Public: No */ @@ -16,13 +21,8 @@ #define MIN_ENTRIES_LITTER_CONFIG 3 -private ["_target", "_className", "_config", "_litter", "_createLitter", "_position", "_createdLitter", "_caller", "_selectionName", "_usersOfItems", "_previousDamage"]; -_caller = _this select 0; -_target = _this select 1; -_selectionName = _this select 2; -_className = _this select 3; -_usersOfItems = _this select 5; -_previousDamage = _this select 6; +private ["_config", "_litter", "_createLitter", "_position", "_createdLitter"]; +params ["_caller", "_target", "_selectionName", "_className", "", "_usersOfItems", "_previousDamage"]; if !(GVAR(allowLitterCreation)) exitwith {}; if (vehicle _caller != _caller || vehicle _target != _target) exitwith {}; @@ -38,19 +38,18 @@ if !(isArray (_config >> "litter")) exitwith {}; _litter = getArray (_config >> "litter"); _createLitter = { - private["_position", "_litterClass", "_direction"]; - + private["_position", "_direction"]; + params ["_unit", "_litter"]; // @TODO: handle carriers over water // For now, don't spawn litter if we are over water to avoid floating litter - if(surfaceIsWater (getPos (_this select 0))) exitWith { false }; - - _position = getPosATL (_this select 0); - _position = [_position select 0, _position select 1, 0]; - _litterClass = _this select 1; - if (random(1) >= 0.5) then { - _position = [(_position select 0) + random 1, (_position select 1) + random 1, _position select 2]; + if(surfaceIsWater (getPos _unit)) exitWith { false }; + + _position = getPosATL _unit; + _position params ["_posX", "_posY"]; + _position = if (random(1) >= 0.5) then { + [_posX + random 1, _posY + random 1, 0] } 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); @@ -65,11 +64,10 @@ _createdLitter = []; { if (typeName _x == "ARRAY") then { if (count _x < MIN_ENTRIES_LITTER_CONFIG) exitwith {}; - private ["_selection", "_litterCondition", "_litterOptions"]; - _selection = _x select 0; + + 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. - _litterCondition = _x select 1; - _litterOptions = _x select 2; if (isnil _litterCondition) then { _litterCondition = if (_litterCondition != "") then {compile _litterCondition} else {{true}}; @@ -88,8 +86,8 @@ _createdLitter = []; if (typeName _x == "STRING") then { [_target, _x] call _createLitter; }; - }foreach _litterOptions; + } foreach _litterOptions; }; }; }; -}foreach _litter; \ No newline at end of file +} foreach _litter; diff --git a/addons/medical/functions/fnc_determineIfFatal.sqf b/addons/medical/functions/fnc_determineIfFatal.sqf index bad15dbcad..939bf8c9b7 100644 --- a/addons/medical/functions/fnc_determineIfFatal.sqf +++ b/addons/medical/functions/fnc_determineIfFatal.sqf @@ -1,19 +1,21 @@ -/** - * fn_determineIfFatal.sqf - * @Descr: N/A - * @Author: Glowbal +/* + * Author: Glowbal + * Determine If Fatal * - * @Arguments: [] - * @Return: - * @PublicAPI: false + * Arguments: + * 0: Unit + * 1: Part + * 2: with Damage (default: 0) + * + * Return Value: + * None + * + * Public: No */ - #include "script_component.hpp" -private ["_unit","_part","_damageThreshold", "_withDamage", "_damageBodyPart"]; -_unit = _this select 0; -_part = _this select 1; -_withDamage = if (count _this > 2) then { _this select 2} else {0}; +private ["_damageThreshold", "_damageBodyPart"]; +params ["_unit", "_part", ["_withDamage", 0]]; if (!alive _unit) exitwith {true}; if (_part < 0 || _part > 5) exitwith {false}; diff --git a/addons/medical/functions/fnc_displayPatientInformation.sqf b/addons/medical/functions/fnc_displayPatientInformation.sqf index e181328318..82622bdca6 100644 --- a/addons/medical/functions/fnc_displayPatientInformation.sqf +++ b/addons/medical/functions/fnc_displayPatientInformation.sqf @@ -4,10 +4,11 @@ * * Arguments: * 0: The Unit - * 1: Show + * 1: Show (default: true) + * 2: Selection (default: 0) * * ReturnValue: - * nil + * None * * Public: No */ @@ -18,9 +19,7 @@ // Exit for basic medical if (GVAR(level) < 2) exitWith {}; private ["_target", "_show", "_selectionN", "_amountOfGeneric", "_bandagedwounds", "_logCtrl", "_part", "_partText", "_pointDamage", "_severity", "_total", "_totalIvVolume", "_triageStatus", "_type"]; -_target = _this select 0; -_show = if (count _this > 1) then {_this select 1} else {true}; -_selectionN = if (count _this > 2) then {_this select 2} else {0}; +params ["_target", ["_target", true], ["_selectionN", 0]]; GVAR(currentSelectedSelectionN) = if (typeName _selectionN == "SCALAR") then {_selectionN} else {0}; GVAR(displayPatientInformationTarget) = if (_show) then {_target} else {ObjNull}; @@ -34,22 +33,22 @@ if (_show) then { [{ private ["_target", "_display", "_alphaLevel", "_damaged", "_availableSelections", "_openWounds", "_selectionBloodLoss", "_red", "_green", "_blue", "_alphaLevel", "_allInjuryTexts", "_lbCtrl", "_genericMessages"]; - _target = (_this select 0) select 0; - _selectionN = (_this select 0) select 1; + params ["_args", "_idPFH"]; + _args params ["_target", "_selectionN"]; 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 { ("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); }; disableSerialization; _display = uiNamespace getvariable QGVAR(DisplayInformation); if (isnil "_display") exitwith { - [_this select 1] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; }; _allInjuryTexts = []; @@ -81,7 +80,7 @@ if (_show) then { if !(isnil "_value") then { _totalIvVolume = _totalIvVolume + (_target getvariable [_x, 0]); }; - }foreach GVAR(IVBags); + } foreach GVAR(IVBags); if (_totalIvVolume >= 1) then { _genericMessages pushback [format[localize LSTRING(receivingIvVolume), floor _totalIvVolume], [1, 1, 1, 1]]; }; @@ -92,33 +91,33 @@ if (_show) then { _openWounds = _target getvariable [QGVAR(openWounds), []]; private "_amountOf"; { - _amountOf = _x select 3; + _x params ["", "_x1", "_selectionX", "_amountOf", "_x4"]; // Find how much this bodypart is bleeding if (_amountOf > 0) then { - _damaged set[_x select 2, true]; - _selectionBloodLoss set [(_x select 2), (_selectionBloodLoss select (_x select 2)) + (20 * ((_x select 4) * _amountOf))]; + _damaged set[_selectionX, true]; + _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] if (_amountOf >= 1) then { // 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 { // 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), []]; { - _amountOf = _x select 3; + _x params ["", "", "_selectionX", "_amountOf", "_x4"]; // Find how much this bodypart is bleeding - if !(_damaged select (_x select 2)) then { - _selectionBloodLoss set [(_x select 2), (_selectionBloodLoss select (_x select 2)) + (20 * ((_x select 4) * _amountOf))]; + if !(_damaged select _selectionX) then { + _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] if (_amountOf > 0) then { if (_amountOf >= 1) then { @@ -130,7 +129,7 @@ if (_show) then { }; }; }; - }foreach _bandagedwounds; + } foreach _bandagedwounds; } else { _damaged = [true, true, true, true, true, true]; { @@ -160,7 +159,7 @@ if (_show) then { _availableSelections = [50,51,52,53,54,55]; { - private ["_red", "_green", "_blue"]; + private ["_red", "_green", "_blue", "_total"]; _total = _x; _red = 1; @@ -177,20 +176,22 @@ if (_show) then { }; }; (_display displayCtrl (_availableSelections select _foreachIndex)) ctrlSetTextColor [_red, _green, _blue, 1.0]; - }foreach _selectionBloodLoss; + } foreach _selectionBloodLoss; _lbCtrl = (_display displayCtrl 200); lbClear _lbCtrl; { - _lbCtrl lbAdd (_x select 0); - _lbCtrl lbSetColor [_foreachIndex, _x select 1]; - }foreach _genericMessages; + _x params ["_add", "_color"]; + _lbCtrl lbAdd _add; + _lbCtrl lbSetColor [_foreachIndex, _color]; + } foreach _genericMessages; _amountOfGeneric = count _genericMessages; { - _lbCtrl lbAdd (_x select 0); - _lbCtrl lbSetColor [_foreachIndex + _amountOfGeneric, _x select 1]; - }foreach _allInjuryTexts; + _x params ["_add", "_color"]; + _lbCtrl lbAdd _add; + _lbCtrl lbSetColor [_foreachIndex + _amountOfGeneric, _color]; + } foreach _allInjuryTexts; if (count _allInjuryTexts == 0) then { _lbCtrl lbAdd (localize LSTRING(NoInjuriesBodypart)); }; @@ -202,9 +203,7 @@ if (_show) then { _logs = _target getvariable [QGVAR(logFile_Activity), []]; { // [_message,_moment,_type, _arguments] - _message = _x select 0; - _moment = _x select 1; - _arguments = _x select 3; + _x params ["_message", "_moment", "_arguments"]; if (isLocalized _message) then { _message = localize _message; }; @@ -213,10 +212,10 @@ if (_show) then { if (typeName _x == "STRING" && {isLocalized _x}) then { _arguments set [_foreachIndex, localize _x]; }; - }foreach _arguments; + } foreach _arguments; _message = format([_message] + _arguments); _logCtrl lbAdd format["%1 %2", _moment, _message]; - }foreach _logs; + } foreach _logs; _triageStatus = [_target] call FUNC(getTriageStatus); (_display displayCtrl 303) ctrlSetText (_triageStatus select 0); diff --git a/addons/medical/functions/fnc_displayTriageCard.sqf b/addons/medical/functions/fnc_displayTriageCard.sqf index c4ed4ad829..051efbfc70 100644 --- a/addons/medical/functions/fnc_displayTriageCard.sqf +++ b/addons/medical/functions/fnc_displayTriageCard.sqf @@ -4,18 +4,18 @@ * * Arguments: * 0: The unit + * 1: Show (default: true) * * Return Value: - * nil + * None * * Public: Yes */ #include "script_component.hpp" -private ["_target", "_show", "_amount", "_item", "_log", "_message", "_triageCardTexts", "_triageStatus"]; -_target = _this select 0; -_show = if (count _this > 1) then {_this select 1} else {true}; +private ["_amount", "_item", "_log", "_message", "_triageCardTexts", "_triageStatus"]; +params ["_target", ["_show", true]]; GVAR(TriageCardTarget) = if (_show) then {_target} else {ObjNull}; @@ -25,15 +25,16 @@ if (_show) then { [{ private ["_target", "_display", "_alphaLevel", "_alphaLevel", "_lbCtrl"]; - _target = (_this select 0) select 0; + params ["_args", "_idPFH"]; + _args params ["_target"]; if (GVAR(TriageCardTarget) != _target) exitwith { - [_this select 1] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; }; disableSerialization; _display = uiNamespace getvariable QGVAR(triageCard); if (isnil "_display") exitwith { - [_this select 1] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; }; _triageCardTexts = []; @@ -44,8 +45,7 @@ if (_show) then { _log = _target getvariable [QGVAR(triageCard), []]; { - _item = _x select 0; - _amount = _x select 1; + _x params ["_item", "_amount"]; _message = _item; if (isClass(configFile >> "CfgWeapons" >> _item)) then { _message = getText(configFile >> "CfgWeapons" >> _item >> "DisplayName"); @@ -55,18 +55,21 @@ if (_show) then { }; }; _triageCardTexts pushback format["%1x - %2", _amount, _message]; - }foreach _log; + } foreach _log; if (count _triageCardTexts == 0) then { _lbCtrl lbAdd (localize LSTRING(TriageCard_NoEntry)); }; { _lbCtrl lbAdd _x; - }foreach _triageCardTexts; + } foreach _triageCardTexts; _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; diff --git a/addons/medical/functions/fnc_dropDownTriageCard.sqf b/addons/medical/functions/fnc_dropDownTriageCard.sqf index 6f30152c5f..d207c7f9a4 100644 --- a/addons/medical/functions/fnc_dropDownTriageCard.sqf +++ b/addons/medical/functions/fnc_dropDownTriageCard.sqf @@ -3,18 +3,18 @@ * Display triage card for a unit * * Arguments: - * 0: The unit + * 0: Show * * Return Value: - * nil + * None * * Public: Yes */ #include "script_component.hpp" -private ["_show", "_ctrl", "_display", "_idc", "_pos"]; -_show = _this select 0; +private ["_ctrl", "_display", "_idc", "_pos"]; +params ["_show"]; disableSerialization; _display = uiNamespace getvariable QGVAR(triageCard); diff --git a/addons/medical/functions/fnc_getBloodLoss.sqf b/addons/medical/functions/fnc_getBloodLoss.sqf index 1881643d97..9ac1083f03 100644 --- a/addons/medical/functions/fnc_getBloodLoss.sqf +++ b/addons/medical/functions/fnc_getBloodLoss.sqf @@ -15,10 +15,9 @@ #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). - -_unit = _this select 0; +params ["_unit"]; _totalBloodLoss = 0; // Advanced medical bloodloss handling @@ -34,12 +33,12 @@ 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)); }; - }foreach _openWounds; + } foreach _openWounds; _internalWounds = _unit getvariable [QGVAR(internalWounds), []]; { _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 //(_totalBloodLoss min _cardiacOutput); diff --git a/addons/medical/functions/fnc_getBloodPressure.sqf b/addons/medical/functions/fnc_getBloodPressure.sqf index f5012c8735..2ba0b7366d 100644 --- a/addons/medical/functions/fnc_getBloodPressure.sqf +++ b/addons/medical/functions/fnc_getBloodPressure.sqf @@ -6,29 +6,28 @@ * 0: The Unit * * ReturnValue: - * Blood Pressuret ,> + * 0: BloodPressure Low + * 1: BloodPressure High * * Public: No */ #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 -/* - 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 -private ["_unit", "_bloodPressureLow", "_bloodPressureHigh", "_cardiacOutput", "_resistance"]; -_unit = _this select 0; +private ["_bloodPressureLow", "_bloodPressureHigh", "_cardiacOutput", "_resistance"]; + +params ["_unit"]; + _cardiacOutput = [_unit] call FUNC(getCardiacOutput); _resistance = _unit getvariable [QGVAR(peripheralResistance), 100]; _bloodPressureHigh = (_cardiacOutput * MODIFIER_BP_HIGH) * _resistance; _bloodPressureLow = (_cardiacOutput * MODIFIER_BP_LOW) * _resistance; -[_bloodPressureLow, _bloodPressureHigh]; +[_bloodPressureLow, _bloodPressureHigh] diff --git a/addons/medical/functions/fnc_getBloodVolumeChange.sqf b/addons/medical/functions/fnc_getBloodVolumeChange.sqf index 23eba4a0c7..3524e15cb5 100644 --- a/addons/medical/functions/fnc_getBloodVolumeChange.sqf +++ b/addons/medical/functions/fnc_getBloodVolumeChange.sqf @@ -28,10 +28,8 @@ */ #define BLOOD_CHANGE_PER_SECOND 0.0595 - - -private ["_unit","_bloodVolume","_bloodVolumeChange", "_ivVolume"]; -_unit = _this select 0; +private ["_bloodVolume", "_bloodVolumeChange", "_ivVolume"]; +params ["_unit"]; _bloodVolume = _unit getvariable [QGVAR(bloodVolume), 100]; _bloodVolumeChange = -([_unit] call FUNC(getBloodLoss)); @@ -43,13 +41,13 @@ if (_bloodVolume < 100.0) then { _ivVolume = (_unit getvariable [_x, 0]) + IV_CHANGE_PER_SECOND; _unit setvariable [_x,_ivVolume]; }; - }foreach GVAR(IVBags); + } foreach GVAR(IVBags); } else { { if ((_unit getvariable [_x, 0]) > 0) then { _unit setvariable [_x, 0]; // lets get rid of exessive IV volume }; - }foreach GVAR(IVBags); + } foreach GVAR(IVBags); }; _bloodVolumeChange; diff --git a/addons/medical/functions/fnc_getCardiacOutput.sqf b/addons/medical/functions/fnc_getCardiacOutput.sqf index 34d7be33af..f24aa438ca 100644 --- a/addons/medical/functions/fnc_getCardiacOutput.sqf +++ b/addons/medical/functions/fnc_getCardiacOutput.sqf @@ -22,7 +22,6 @@ // to limit the amount of complex calculations necessary, we take a set modifier to calculate Stroke Volume. #define MODIFIER_CARDIAC_OUTPUT 19.04761 -private "_unit"; -_unit = _this select 0; +params ["_unit"]; ((_unit getvariable [QGVAR(bloodVolume), 100])/MODIFIER_CARDIAC_OUTPUT) + ((_unit getvariable [QGVAR(heartRate), 80])/80-1); diff --git a/addons/medical/functions/fnc_getHeartRateChange.sqf b/addons/medical/functions/fnc_getHeartRateChange.sqf index 92a2053737..d46733452a 100644 --- a/addons/medical/functions/fnc_getHeartRateChange.sqf +++ b/addons/medical/functions/fnc_getHeartRateChange.sqf @@ -15,8 +15,9 @@ #define HEART_RATE_MODIFIER 0.02 -private ["_unit", "_heartRate", "_hrIncrease", "_bloodLoss", "_time", "_values", "_adjustment", "_change", "_callBack", "_bloodVolume"]; -_unit = _this select 0; +private ["_heartRate", "_hrIncrease", "_bloodLoss", "_time", "_values", "_adjustment", "_change", "_callBack", "_bloodVolume"]; +params ["_unit"]; + _hrIncrease = 0; if (!(_unit getvariable [QGVAR(inCardiacArrest),false])) then { _heartRate = _unit getvariable [QGVAR(heartRate), 80]; @@ -24,10 +25,8 @@ if (!(_unit getvariable [QGVAR(inCardiacArrest),false])) then { _adjustment = _unit getvariable [QGVAR(heartRateAdjustments), []]; { - _values = (_x select 0); + _x params ["_values", "_time", "_callBack"]; if (abs _values > 0) then { - _time = (_x select 1); - _callBack = _x select 2; if (_time <= 0) then { _time = 1; }; @@ -47,7 +46,7 @@ if (!(_unit getvariable [QGVAR(inCardiacArrest),false])) then { [_unit] call _callBack; }; - }foreach _adjustment; + } foreach _adjustment; _adjustment = _adjustment - [ObjNull]; _unit setvariable [QGVAR(heartRateAdjustments), _adjustment]; diff --git a/addons/medical/functions/fnc_getTriageStatus.sqf b/addons/medical/functions/fnc_getTriageStatus.sqf index 812c20ed2a..4dcef530a3 100644 --- a/addons/medical/functions/fnc_getTriageStatus.sqf +++ b/addons/medical/functions/fnc_getTriageStatus.sqf @@ -6,7 +6,9 @@ * 0: The unit * * Return Value: - * Triage status from the unit. Name, statusID, color > + * 0: Name + * 1: Status ID + * 2: Color > * * Public: Yes */ @@ -14,7 +16,7 @@ #include "script_component.hpp" private ["_unit","_return","_status"]; -_unit = _this select 0; +params ["_unit"]; _status = _unit getvariable [QGVAR(triageLevel), -1]; _return = switch (_status) do { 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]]}; default {[localize LSTRING(Triage_Status_None), 0, [0, 0, 0, 0.9]]}; }; -_return; +_return diff --git a/addons/medical/functions/fnc_getTypeOfDamage.sqf b/addons/medical/functions/fnc_getTypeOfDamage.sqf index d51131ce0c..b8646e485f 100644 --- a/addons/medical/functions/fnc_getTypeOfDamage.sqf +++ b/addons/medical/functions/fnc_getTypeOfDamage.sqf @@ -13,23 +13,19 @@ #include "script_component.hpp" -PARAMS_1(_typeOfProjectile); +params ["_typeOfProjectile"]; -private ["_typeOfDamage"]; - -_typeOfDamage = switch (true) do { - case (_typeOfProjectile isKindOf "BulletBase"): {"bullet"}; - case (_typeOfProjectile isKindOf "GrenadeCore"): {"grenade"}; - case (_typeOfProjectile isKindOf "TimeBombCore"): {"explosive"}; - case (_typeOfProjectile isKindOf "MineCore"): {"explosive"}; - case (_typeOfProjectile isKindOf "FuelExplosion"): {"explosive"}; - case (_typeOfProjectile isKindOf "ShellBase"): {"shell"}; - case (_typeOfProjectile isKindOf "RocketBase"): {"explosive"}; - case (_typeOfProjectile isKindOf "MissileBase"): {"explosive"}; - case (_typeOfProjectile isKindOf "LaserBombCore"): {"explosive"}; - case (_typeOfProjectile isKindOf "BombCore"): {"explosive"}; - case (_typeOfProjectile isKindOf "Grenade"): {"grenade"}; - default {toLower _typeOfProjectile}; +call { + if (_typeOfProjectile isKindOf "BulletBase") exitWith {"bullet"}; + if (_typeOfProjectile isKindOf "GrenadeCore") exitWith {"grenade"}; + if (_typeOfProjectile isKindOf "TimeBombCore") exitWith {"explosive"}; + if (_typeOfProjectile isKindOf "MineCore") exitWith {"explosive"}; + if (_typeOfProjectile isKindOf "FuelExplosion") exitWith {"explosive"}; + if (_typeOfProjectile isKindOf "ShellBase") exitWith {"shell"}; + if (_typeOfProjectile isKindOf "RocketBase") exitWith {"explosive"}; + if (_typeOfProjectile isKindOf "MissileBase") exitWith {"explosive"}; + if (_typeOfProjectile isKindOf "LaserBombCore") exitWith {"explosive"}; + if (_typeOfProjectile isKindOf "BombCore") exitWith {"explosive"}; + if (_typeOfProjectile isKindOf "Grenade") exitWith {"grenade"}; + toLower _typeOfProjectile }; - -_typeOfDamage diff --git a/addons/medical/functions/fnc_getUnconsciousCondition.sqf b/addons/medical/functions/fnc_getUnconsciousCondition.sqf index 19d3bdec1d..c354dd6ebd 100644 --- a/addons/medical/functions/fnc_getUnconsciousCondition.sqf +++ b/addons/medical/functions/fnc_getUnconsciousCondition.sqf @@ -14,7 +14,7 @@ #include "script_component.hpp" private ["_unit","_return"]; -_unit = _this select 0; +params ["_unit"]; if (isnil QGVAR(unconsciousConditions)) then { GVAR(unconsciousConditions) = []; @@ -25,6 +25,6 @@ _return = false; if (typeName _x == typeName {} && {([_unit] call _x)}) exitwith { _return = true; }; -}foreach GVAR(unconsciousConditions); +} foreach GVAR(unconsciousConditions); -_return; +_return diff --git a/addons/medical/functions/fnc_handleBandageOpening.sqf b/addons/medical/functions/fnc_handleBandageOpening.sqf index a86077cb3b..b617d1e64a 100644 --- a/addons/medical/functions/fnc_handleBandageOpening.sqf +++ b/addons/medical/functions/fnc_handleBandageOpening.sqf @@ -18,15 +18,10 @@ #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"]; -_target = _this select 0; -_impact = _this select 1; -_part = _this select 2; -_injuryIndex = _this select 3; -_injury = _this select 4; -_bandage = _this select 5; +private ["_className", "_reopeningChance", "_reopeningMinDelay", "_reopeningMaxDelay", "_config", "_woundTreatmentConfig", "_bandagedWounds", "_exist", "_injuryId", "_existingInjury", "_delay", "_openWounds", "_selectedInjury", "_bandagedInjury"]; +params ["_target", "_impact", "_part", "_injuryIndex", "_injury", "_bandage"]; -_classID = _injury select 1; +_injury parmas ["_classID", "_injuryType"]; _className = GVAR(woundClassNames) select _classID; // default, just in case.. @@ -58,10 +53,10 @@ if (isClass (_config >> _className)) then { _bandagedWounds = _target getvariable [QGVAR(bandagedWounds), []]; _exist = false; -_injuryType = _injury select 1; _bandagedInjury = []; { - if ((_x select 1) == _injuryType && (_x select 2) == (_injury select 2)) exitwith { + _x params ["", "_injuryTypeX", "_injuryX"]; + if (_injuryTypeX == _injuryType && _injuryTypeX == (_injury select 2)) exitwith { _exist = true; _existingInjury = _x; _existingInjury set [3, (_existingInjury select 3) + _impact]; @@ -69,7 +64,7 @@ _bandagedInjury = []; _bandagedInjury = _existingInjury; }; -}foreach _bandagedWounds; +} foreach _bandagedWounds; if !(_exist) then { // [ID, classID, bodypart, percentage treated, bloodloss rate] @@ -83,12 +78,8 @@ _target setvariable [QGVAR(bandagedWounds), _bandagedWounds, true]; if (random(1) <= _reopeningChance) then { _delay = _reopeningMinDelay + random(_reopeningMaxDelay - _reopeningMinDelay); [{ - private ["_target", "_impact", "_part", "_injuryIndex", "_bandage", "_injury", "_openWounds", "_selectedInjury","_bandagedWounds","_exist"]; - _target = _this select 0; - _impact = _this select 1; - _part = _this select 2; - _injuryIndex = _this select 3; - _injury = _this select 4; + private ["_bandage", "_openWounds", "_selectedInjury","_bandagedWounds","_exist"]; + params ["_target", "_impact", "_part", "_injuryIndex", "_injury"]; //if (alive _target) then { _openWounds = _target getvariable [QGVAR(openWounds), []]; @@ -102,13 +93,14 @@ if (random(1) <= _reopeningChance) then { _exist = false; _injuryId = _injury select 1; { - if ((_x select 1) == _injuryId && (_x select 2) == (_injury select 2)) exitwith { + _x params ["_injuryIdX", "_injuryX"]; + if (_injuryIdX == _injuryId && _injuryX == (_injury select 2)) exitwith { _exist = true; _existingInjury = _x; _existingInjury set [3, ((_existingInjury select 3) - _impact) max 0]; _bandagedWounds set [_foreachIndex, _existingInjury]; }; - }foreach _bandagedWounds; + } foreach _bandagedWounds; if (_exist) then { _target setvariable [QGVAR(bandagedWounds), _bandagedWounds, true]; diff --git a/addons/medical/functions/fnc_handleCreateLitter.sqf b/addons/medical/functions/fnc_handleCreateLitter.sqf index d7595ec439..31e65218c2 100644 --- a/addons/medical/functions/fnc_handleCreateLitter.sqf +++ b/addons/medical/functions/fnc_handleCreateLitter.sqf @@ -1,9 +1,22 @@ -//#define DEBUG_MODE_FULL +/* + * Author: Glowbal + * handle Litter Create + * + * Arguments: + * 0: Litter Class + * 1: Position + * 2: Unit + * + * Return Value: + * None + * + * Public: No + */ #include "script_component.hpp" if(!hasInterface) exitWith { false }; -PARAMS_3(_litterClass,_position,_direction); +params ["_litterClass", "_position", "_unit"]; private["_litterObject", "_maxLitterCount"]; //IGNORE_PRIVATE_WARNING(_values); @@ -16,9 +29,9 @@ _litterObject = _litterClass createVehicleLocal _position; _litterObject setDir _direction; _litterObject setPosATL _position; // 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); - -_maxLitterCount = getArray (configFile >> "ACE_Settings" >> QGVAR(litterSimulationDetail) >> "_values") select GVAR(litterSimulationDetail); +[{ params ["_object", "_pos"]; _object setPosATL _pos; }, [_litterObject, _position]] call EFUNC(common,execNextFrame); + +_maxLitterCount = getArray (configFile >> "ACE_Settings" >> QGVAR(litterSimulationDetail) >> "_values") select GVAR(litterSimulationDetail); if((count GVAR(allCreatedLitter)) > _maxLitterCount ) then { // gank the first litter object, and spawn ours. private["_oldLitter"]; @@ -34,10 +47,11 @@ if(!GVAR(litterPFHRunning) && {GVAR(litterCleanUpDelay) > 0}) then { 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; - } forEach (_x select 1); + } forEach _objects; GVAR(allCreatedLitter) set[_foreachIndex, objNull]; }; } forEach GVAR(allCreatedLitter); @@ -46,8 +60,6 @@ if(!GVAR(litterPFHRunning) && {GVAR(litterCleanUpDelay) > 0}) then { if ( (count GVAR(allCreatedLitter)) == 0) exitwith { [(_this select 1)] call CBA_fnc_removePerFrameHandler; GVAR(litterPFHRunning) = false; - }; + }; }, 30, []] call CBA_fnc_addPerFrameHandler; }; - -true \ No newline at end of file diff --git a/addons/medical/functions/fnc_handleDamage.sqf b/addons/medical/functions/fnc_handleDamage.sqf index a4e5525276..a3dea00235 100644 --- a/addons/medical/functions/fnc_handleDamage.sqf +++ b/addons/medical/functions/fnc_handleDamage.sqf @@ -17,12 +17,8 @@ #include "script_component.hpp" -private ["_unit", "_selection", "_damage", "_shooter", "_projectile", "_damageReturn", "_typeOfDamage", "_minLethalDamage", "_newDamage", "_typeIndex", "_preventDeath"]; -_unit = _this select 0; -_selection = _this select 1; -_damage = _this select 2; -_shooter = _this select 3; -_projectile = _this select 4; +private ["_damageReturn", "_typeOfDamage", "_minLethalDamage", "_newDamage", "_typeIndex", "_preventDeath"]; +params ["_unit", "_selection", "_damage", "_shooter", "_projectile"]; if !(local _unit) exitWith {nil}; @@ -53,7 +49,6 @@ if (GVAR(level) < 2) then { }; _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); @@ -123,4 +118,4 @@ if (((_unit getVariable [QGVAR(enableRevive), GVAR(enableRevive)]) > 0) && {_dam 0.89; }; -_damageReturn; +_damageReturn diff --git a/addons/medical/functions/fnc_handleDamage_advanced.sqf b/addons/medical/functions/fnc_handleDamage_advanced.sqf index e617738a90..f1ba5cc6f0 100644 --- a/addons/medical/functions/fnc_handleDamage_advanced.sqf +++ b/addons/medical/functions/fnc_handleDamage_advanced.sqf @@ -12,20 +12,15 @@ * 6: Type of Damage * * Return Value: - * Nothing + * None * * Public: No */ #include "script_component.hpp" -private ["_unit","_selectionName","_amountOfDamage","_sourceOfDamage","_typeOfProjectile","_typeOfDamage", "_part", "_damageBodyParts", "_newDamage", "_hitPoints"]; -_unit = _this select 0; -_selectionName = _this select 1; -_amountOfDamage = _this select 2; -_sourceOfDamage = _this select 3; -_typeOfProjectile = _this select 4; -_newDamage = _this select 5; +private ["_typeOfProjectile", "_part", "_damageBodyParts", "_hitPoints"]; +params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage", "_newDamage"]; // Most likely taking exessive fire damage. Lets exit. if (isNull _sourceOfDamage && {_typeOfProjectile == ""} && {vehicle _unit == _unit} && {(_selectionName == "head" || isBurning _unit)}) exitwith {}; diff --git a/addons/medical/functions/fnc_handleDamage_advancedSetDamage.sqf b/addons/medical/functions/fnc_handleDamage_advancedSetDamage.sqf index 3df8a5ce0c..dc1e1a6fea 100644 --- a/addons/medical/functions/fnc_handleDamage_advancedSetDamage.sqf +++ b/addons/medical/functions/fnc_handleDamage_advancedSetDamage.sqf @@ -6,14 +6,14 @@ * 0: Unit for which the hitpoint damage will be sorted out * * Return Value: - * nil + * None * * Public: No */ #include "script_component.hpp" -PARAMS_1(_unit); +params ["_unit"]; if (!local _unit) exitwith {}; @@ -22,7 +22,7 @@ private ["_bodyStatus", "_headDamage", "_torsoDamage", "_handsDamage", "_legsDam // ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"] _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 ["hitBody", _torsoDamage min 0.95]; diff --git a/addons/medical/functions/fnc_handleDamage_airway.sqf b/addons/medical/functions/fnc_handleDamage_airway.sqf index bc220eaad9..8b627faae1 100644 --- a/addons/medical/functions/fnc_handleDamage_airway.sqf +++ b/addons/medical/functions/fnc_handleDamage_airway.sqf @@ -10,19 +10,15 @@ * 4: Type of the damage done * * Return Value: - * None + * None * * Public: No */ #include "script_component.hpp" -private ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage", "_bodyPartn"]; -_unit = _this select 0; -_selectionName = _this select 1; -_amountOfDamage = _this select 2; -_sourceOfDamage = _this select 3; -_typeOfDamage = _this select 4; +private "_bodyPartn"; +params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage"]; _bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); if (_bodyPartn > 1) exitwith {}; diff --git a/addons/medical/functions/fnc_handleDamage_basic.sqf b/addons/medical/functions/fnc_handleDamage_basic.sqf index 04049cfa7c..83563ad92a 100644 --- a/addons/medical/functions/fnc_handleDamage_basic.sqf +++ b/addons/medical/functions/fnc_handleDamage_basic.sqf @@ -24,13 +24,8 @@ #define ARMDAMAGETRESHOLD2 1.7 #define UNCONSCIOUSNESSTRESHOLD 0.7 -private ["_unit", "_selectionName", "_damage", "_shooter", "_projectile", "_damage", "_armdamage", "_hitPoint", "_index", "_legdamage", "_newDamage", "_otherDamage", "_pain", "_restore"]; - -_unit = _this select 0; -_selectionName = _this select 1; -_damage = _this select 2; -_shooter = _this select 3; -_projectile = _this select 4; +private ["_damage", "_armdamage", "_hitPoint", "_index", "_legdamage", "_newDamage", "_otherDamage", "_pain", "_restore"]; +params ["_unit", "_selectionName", "_damage", "_shooter", "_projectile"]; // Apply damage treshold / coefficient _threshold = [ @@ -52,8 +47,10 @@ if (diag_frameno > (_unit getVariable [QGVAR(basic_frameNo), -3]) + 2) then { if (isnil {_unit getvariable QGVAR(structDamagePFH)}) then { // Assign orphan structural damage to torso [{ - private ["_unit", "_damagesum"]; - _unit = (_this select 0) select 0; + private "_damagesum"; + params ["_args", "_idPFH"]; + _args params ["_unit"]; + if (ACE_diagTime - (_unit getvariable [QGVAR(structDamagePFH),-2]) >= 2) then { _unit setVariable [QGVAR(structDamagePFH), nil]; _damagesum = (_unit getHitPointDamage "HitHead") + @@ -65,7 +62,7 @@ if (diag_frameno > (_unit getVariable [QGVAR(basic_frameNo), -3]) + 2) then { 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; + [_idPFH] call CBA_fnc_removePerFrameHandler; }; }, 0, [_unit]] call CBA_fnc_addPerFrameHandler; }; diff --git a/addons/medical/functions/fnc_handleDamage_caching.sqf b/addons/medical/functions/fnc_handleDamage_caching.sqf index 99816ee274..9d31e53b1e 100644 --- a/addons/medical/functions/fnc_handleDamage_caching.sqf +++ b/addons/medical/functions/fnc_handleDamage_caching.sqf @@ -18,12 +18,8 @@ #include "script_component.hpp" -private ["_unit", "_selectionName", "_damage", "_source", "_projectile", "_hitSelections", "_hitPoints", "_impactVelocity", "_newDamage", "_cache_hitpoints", "_cache_projectiles", "_cache_params", "_cache_damages"]; -_unit = _this select 0; -_selectionName = _this select 1; -_damage = _this select 2; -_source = _this select 3; -_projectile = _this select 4; +private ["_hitSelections", "_hitPoints", "_impactVelocity", "_newDamage", "_cache_hitpoints", "_cache_projectiles", "_cache_params", "_cache_damages"]; +params ["_unit", "_selectionName", "_damage", "_source", "_projectile"]; _hitSelections = GVAR(SELECTIONS); _hitPoints = GVAR(HITPOINTS); @@ -78,21 +74,21 @@ if (diag_frameno > (_unit getVariable [QGVAR(frameNo_damageCaching), -3]) + 2) t // handle the cached damages 3 frames later [{ private ["_args", "_params"]; - _args = _this select 0; + params ["_args", "_idPFH"]; + params ["_unit", "_frameno"]; + if (diag_frameno > _frameno + 2) then { + _unit setDamage 0; - if (diag_frameno > (_args select 1) + 2) then { - (_args select 0) setDamage 0; - - _cache_params = (_args select 0) getVariable [QGVAR(cachedHandleDamageParams), []]; - _cache_damages = (_args select 0) getVariable QGVAR(cachedDamages); + _cache_params = _unit getVariable [QGVAR(cachedHandleDamageParams), []]; + _cache_damages = _unit getVariable QGVAR(cachedDamages); { _params = _x + [_cache_damages select _foreachIndex]; _params call FUNC(handleDamage_advanced); - }foreach _cache_params; + } foreach _cache_params; - [(_args select 0)] call FUNC(handleDamage_advancedSetDamage); + [_unit] call FUNC(handleDamage_advancedSetDamage); - [(_this select 1)] call cba_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; }; }, 0, [_unit, diag_frameno] ] call CBA_fnc_addPerFrameHandler; @@ -152,4 +148,4 @@ if (_selectionName != "") then { _unit setVariable [QGVAR(cachedHandleDamageParams), _cache_params]; }; -_newDamage; +_newDamage diff --git a/addons/medical/functions/fnc_handleDamage_fractures.sqf b/addons/medical/functions/fnc_handleDamage_fractures.sqf index 31fa1c8873..46000dbbdf 100644 --- a/addons/medical/functions/fnc_handleDamage_fractures.sqf +++ b/addons/medical/functions/fnc_handleDamage_fractures.sqf @@ -17,12 +17,8 @@ #include "script_component.hpp" -private ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage", "_bodyPartn", "_fractures", "_fractureType"]; -_unit = _this select 0; -_selectionName = _this select 1; -_amountOfDamage = _this select 2; -_sourceOfDamage = _this select 3; -_typeOfDamage = _this select 4; +private ["_bodyPartn", "_fractures", "_fractureType"]; +params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage"]; _bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); _fractureType = 1; diff --git a/addons/medical/functions/fnc_handleDamage_internalInjuries.sqf b/addons/medical/functions/fnc_handleDamage_internalInjuries.sqf index 6ee256a977..d8d9be1506 100644 --- a/addons/medical/functions/fnc_handleDamage_internalInjuries.sqf +++ b/addons/medical/functions/fnc_handleDamage_internalInjuries.sqf @@ -10,19 +10,15 @@ * 4: Type of the damage done * * Return Value: - * None + * None * * Public: No */ #include "script_component.hpp" -private ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage", "_bodyPartn"]; -_unit = _this select 0; -_selectionName = _this select 1; -_amountOfDamage = _this select 2; -_sourceOfDamage = _this select 3; -_typeOfDamage = _this select 4; +private "_bodyPartn"; +params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage"]; _bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); // TODO implement internal injuries diff --git a/addons/medical/functions/fnc_handleDamage_wounds.sqf b/addons/medical/functions/fnc_handleDamage_wounds.sqf index 70eeb74f9d..5711d903de 100644 --- a/addons/medical/functions/fnc_handleDamage_wounds.sqf +++ b/addons/medical/functions/fnc_handleDamage_wounds.sqf @@ -10,19 +10,15 @@ * 4: Type of the damage done * * Return Value: - * None + * None * * Public: No */ #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"]; -_unit = _this select 0; -_selectionName = _this select 1; -_damage = _this select 2; -_typeOfProjectile = _this select 3; -_typeOfDamage = _this select 4; +private ["_bodyPartn", "_injuryTypeInfo", "_allInjuriesForDamageType", "_allPossibleInjuries", "_highestPossibleDamage", "_highestPossibleSpot", "_minDamage", "_openWounds", "_woundID", "_toAddInjury", "_painToAdd", "_bloodLoss", "_bodyPartNToAdd", "_classType", "_damageLevels", "_foundIndex", "_i", "_injury", "_maxDamage", "_pain", "_painLevel", "_selections", "_toAddClassID", "_woundsCreated"]; +params ["_unit", "_selectionName", "_damage", "_typeOfProjectile", "_typeOfDamage"]; // Administration for open wounds and ids _openWounds = _unit getvariable[QGVAR(openWounds), []]; @@ -36,14 +32,13 @@ _woundsCreated = []; call compile _extensionOutput; _foundIndex = -1; { - _toAddClassID = _x select 1; - _bodyPartNToAdd = _x select 2; + _x params ["_toAddClassID", "_bodyPartNToAdd"]; { // Check if we have an id of the given class on the given bodypart already if (_x select 1 == _toAddClassID && {_x select 2 == _bodyPartNToAdd}) exitwith { _foundIndex = _foreachIndex; }; - }foreach _openWounds; + } foreach _openWounds; if (_foundIndex < 0) then { // Since it is a new injury, we will have to add it to the open wounds array to store it @@ -53,7 +48,7 @@ _foundIndex = -1; _injury = _openWounds select _foundIndex; _injury set [3, (_injury select 3) + 1]; }; -}foreach _woundsCreated; +} foreach _woundsCreated; _unit setvariable [QGVAR(openWounds), _openWounds, true]; diff --git a/addons/medical/functions/fnc_handleDamage_woundsOld.sqf b/addons/medical/functions/fnc_handleDamage_woundsOld.sqf index 1034ba9cae..0c08d1e884 100644 --- a/addons/medical/functions/fnc_handleDamage_woundsOld.sqf +++ b/addons/medical/functions/fnc_handleDamage_woundsOld.sqf @@ -17,12 +17,8 @@ #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"]; -_unit = _this select 0; -_selectionName = _this select 1; -_damage = _this select 2; -_typeOfProjectile = _this select 3; -_typeOfDamage = _this select 4; +private ["_bodyPartn", "_injuryTypeInfo", "_allInjuriesForDamageType", "_allPossibleInjuries", "_highestPossibleDamage", "_highestPossibleSpot", "_minDamage", "_openWounds", "_woundID", "_toAddInjury", "_painToAdd", "_bloodLoss", "_bodyPartNToAdd", "_classType", "_damageLevels", "_foundIndex", "_i", "_injury", "_maxDamage", "_pain", "_painLevel", "_selections", "_toAddClassID", "_woundsCreated"]; +params ["_unit", "_selectionName", "_damage", "_typeOfProjectile", "_typeOfDamage"]; // Convert the selectionName to a number and ensure it is a valid selection. _bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); @@ -70,7 +66,7 @@ _allPossibleInjuries = []; _allPossibleInjuries pushback _x; }; }; -}foreach _allInjuriesForDamageType; +} foreach _allInjuriesForDamageType; // No possible wounds available for this damage type or damage amount. if (_highestPossibleSpot < 0) exitwith {}; @@ -98,7 +94,7 @@ _woundsCreated = []; if (_x select 1 == _toAddClassID && {_x select 2 == _bodyPartNToAdd}) exitwith { _foundIndex = _foreachIndex; }; - }foreach _openWounds; + } foreach _openWounds; }; _injury = []; @@ -123,7 +119,7 @@ _woundsCreated = []; _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]; diff --git a/addons/medical/functions/fnc_handleKilled.sqf b/addons/medical/functions/fnc_handleKilled.sqf index 5003ec189c..d4fbfee30a 100644 --- a/addons/medical/functions/fnc_handleKilled.sqf +++ b/addons/medical/functions/fnc_handleKilled.sqf @@ -13,8 +13,8 @@ #include "script_component.hpp" -private["_unit", "_openWounds"]; -_unit = _this select 0; +private "_openWounds"; +params ["_unit"]; if (!local _unit) exitwith {}; _unit setvariable [QGVAR(pain), 0]; diff --git a/addons/medical/functions/fnc_handleLocal.sqf b/addons/medical/functions/fnc_handleLocal.sqf index c0f9c15292..50a30e90e8 100644 --- a/addons/medical/functions/fnc_handleLocal.sqf +++ b/addons/medical/functions/fnc_handleLocal.sqf @@ -15,9 +15,7 @@ #include "script_component.hpp" -private["_unit", "_local"]; -_unit = _this select 0; -_local = _this select 1; +params ["_unit", "_local"]; if (_local) then { if (_unit getvariable[QGVAR(addedToUnitLoop),false]) then { [_unit, true] call FUNC(addToInjuredCollection); diff --git a/addons/medical/functions/fnc_handleUnitVitals.sqf b/addons/medical/functions/fnc_handleUnitVitals.sqf index 0c7113f69a..cbb8f6fdcc 100644 --- a/addons/medical/functions/fnc_handleUnitVitals.sqf +++ b/addons/medical/functions/fnc_handleUnitVitals.sqf @@ -13,9 +13,8 @@ #include "script_component.hpp" -private ["_unit", "_heartRate","_bloodPressure","_bloodVolume","_painStatus", "_lastTimeValuesSynced", "_syncValues", "_airwayStatus", "_blood", "_bloodPressureH", "_bloodPressureL", "_interval"]; -_unit = _this select 0; -_interval = _this select 1; +private ["_heartRate","_bloodPressure","_bloodVolume","_painStatus", "_lastTimeValuesSynced", "_syncValues", "_airwayStatus", "_blood"]; +params ["_unit", "_interval"]; if (_interval == 0) exitWith {}; @@ -140,8 +139,7 @@ if (GVAR(level) >= 2) then { // Check vitals for medical status // TODO check for in revive state instead of variable - _bloodPressureL = _bloodPressure select 0; - _bloodPressureH = _bloodPressure select 1; + _bloodPressure params ["_bloodPressureL", "_bloodPressureH"]; if (!(_unit getvariable [QGVAR(inCardiacArrest),false])) then { if (_heartRate < 10 || _bloodPressureH < 30 || _bloodVolume < 20) then { @@ -180,6 +178,6 @@ if (GVAR(level) >= 2) then { if !(isnil "_value") then { _unit setvariable [_x,(_unit getvariable [_x, 0]), true]; }; - }foreach GVAR(IVBags); + } foreach GVAR(IVBags); }; }; diff --git a/addons/medical/functions/fnc_hasItem.sqf b/addons/medical/functions/fnc_hasItem.sqf index cfec633b55..df1a3828f5 100644 --- a/addons/medical/functions/fnc_hasItem.sqf +++ b/addons/medical/functions/fnc_hasItem.sqf @@ -16,19 +16,17 @@ #include "script_component.hpp" private ["_medic", "_patient", "_item", "_return", "_crew"]; -_medic = _this select 0; -_patient = _this select 1; -_item = _this select 2; +params ["_medic", "_patient", "_item"]; if (isnil QGVAR(setting_allowSharedEquipment)) then { GVAR(setting_allowSharedEquipment) = true; }; if (GVAR(setting_allowSharedEquipment) && {[_patient, _item] call EFUNC(common,hasItem)}) exitwith { - true; + true }; if ([_medic, _item] call EFUNC(common,hasItem)) exitwith { - true; + true }; _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 { _return = true; }; - }foreach _crew; + } foreach _crew; }; -_return; +_return diff --git a/addons/medical/functions/fnc_hasItems.sqf b/addons/medical/functions/fnc_hasItems.sqf index ea16edebc4..dd53cb3337 100644 --- a/addons/medical/functions/fnc_hasItems.sqf +++ b/addons/medical/functions/fnc_hasItems.sqf @@ -16,9 +16,7 @@ #include "script_component.hpp" private ["_medic", "_patient", "_items", "_return"]; -_medic = _this select 0; -_patient = _this select 1; -_items = _this select 2; +params ["_medic", "_patient", "_items"]; _return = true; { @@ -31,4 +29,4 @@ _return = true; }; }foreach _items; -_return; +_return diff --git a/addons/medical/functions/fnc_hasMedicalEnabled.sqf b/addons/medical/functions/fnc_hasMedicalEnabled.sqf index 63fddd16b4..cbf40078fd 100644 --- a/addons/medical/functions/fnc_hasMedicalEnabled.sqf +++ b/addons/medical/functions/fnc_hasMedicalEnabled.sqf @@ -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 + * + * Return Value: + * enabled + * + * Example: + * [Unit] call ace_medical_fnc_hasMedicalEnabled + * + * Public: No + */ #include "script_component.hpp" -private ["_unit", "_medicalEnabled"]; -_unit = _this select 0; +private "_medicalEnabled"; +params ["_unit"]; _medicalEnabled = _unit getvariable QGVAR(enableMedical); 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 diff --git a/addons/medical/functions/fnc_hasTourniquetAppliedTo.sqf b/addons/medical/functions/fnc_hasTourniquetAppliedTo.sqf index 6183854e45..955665233a 100644 --- a/addons/medical/functions/fnc_hasTourniquetAppliedTo.sqf +++ b/addons/medical/functions/fnc_hasTourniquetAppliedTo.sqf @@ -14,8 +14,6 @@ #include "script_component.hpp" -private ["_target", "_selectionName"]; -_target = _this select 0; -_selectionName = _this select 1; +params ["_target", "_selectionName"]; (((_target getvariable [QGVAR(tourniquets), [0,0,0,0,0,0]]) select ([_selectionName] call FUNC(selectionNameToNumber))) > 0); diff --git a/addons/medical/functions/fnc_init.sqf b/addons/medical/functions/fnc_init.sqf index 27d80163a5..fe8715c352 100644 --- a/addons/medical/functions/fnc_init.sqf +++ b/addons/medical/functions/fnc_init.sqf @@ -13,9 +13,8 @@ #include "script_component.hpp" -private ["_unit", "_allUsedMedication", "_logs"]; - -_unit = _this select 0; +private ["_allUsedMedication", "_logs"]; +params ["_unit"]; _unit setVariable [QGVAR(pain), 0, true]; _unit setVariable [QGVAR(morphine), 0, true]; diff --git a/addons/medical/functions/fnc_isBeingCarried.sqf b/addons/medical/functions/fnc_isBeingCarried.sqf index 6505f8b51a..b47c5e475f 100644 --- a/addons/medical/functions/fnc_isBeingCarried.sqf +++ b/addons/medical/functions/fnc_isBeingCarried.sqf @@ -15,7 +15,7 @@ */ #include "script_component.hpp" -PARAMS_1(_target); +params ["_target"]; private "_owner"; diff --git a/addons/medical/functions/fnc_isBeingDragged.sqf b/addons/medical/functions/fnc_isBeingDragged.sqf index 4d09ed9e29..929b48ccb7 100644 --- a/addons/medical/functions/fnc_isBeingDragged.sqf +++ b/addons/medical/functions/fnc_isBeingDragged.sqf @@ -15,7 +15,7 @@ */ #include "script_component.hpp" -PARAMS_1(_target); +params ["_target"]; private "_owner"; diff --git a/addons/medical/functions/fnc_isInMedicalFacility.sqf b/addons/medical/functions/fnc_isInMedicalFacility.sqf index bed660a46a..34f1cf4244 100644 --- a/addons/medical/functions/fnc_isInMedicalFacility.sqf +++ b/addons/medical/functions/fnc_isInMedicalFacility.sqf @@ -13,8 +13,8 @@ #include "script_component.hpp" -private ["_unit","_eyePos","_objects","_isInBuilding","_medicalFacility"]; -_unit = _this select 0; +private ["_eyePos", "_objects", "_isInBuilding", "_medicalFacility"]; +params ["_unit"]; _eyePos = eyePos _unit; _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 { _isInBuilding = true; }; -}foreach _objects; +} foreach _objects; if (!_isInBuilding) then { _objects = position _unit nearObjects 7.5; { if (((typeOf _x) in _medicalFacility) || (_x getVariable [QGVAR(isMedicalFacility),false])) exitwith { _isInBuilding = true; }; - }foreach _objects; + } foreach _objects; }; _isInBuilding; diff --git a/addons/medical/functions/fnc_isInMedicalVehicle.sqf b/addons/medical/functions/fnc_isInMedicalVehicle.sqf index d376ce3824..1f1ff193fd 100644 --- a/addons/medical/functions/fnc_isInMedicalVehicle.sqf +++ b/addons/medical/functions/fnc_isInMedicalVehicle.sqf @@ -13,9 +13,8 @@ #include "script_component.hpp" -private ["_unit", "_vehicle"]; - -_unit = _this select 0; +private ["_vehicle"]; +params ["_unit"]; _vehicle = vehicle _unit; if (_unit == _vehicle) exitWith {false}; diff --git a/addons/medical/functions/fnc_isInStableCondition.sqf b/addons/medical/functions/fnc_isInStableCondition.sqf index f7c22ed085..763185640c 100644 --- a/addons/medical/functions/fnc_isInStableCondition.sqf +++ b/addons/medical/functions/fnc_isInStableCondition.sqf @@ -13,8 +13,8 @@ #include "script_component.hpp" -private ["_unit"]; -_unit = _this select 0; +private ["_openWounds", "_openWounds"]; +params ["_unit"]; if (GVAR(level) <= 1) exitwith { ([_unit] call FUNC(getBloodloss)) == 0; @@ -25,6 +25,6 @@ _openWounds = _unit getvariable [QGVAR(openWounds), []]; { // total bleeding ratio * percentage of injury left _totalBloodLoss = _totalBloodLoss + ((_x select 4) * (_x select 3)); -}foreach _openWounds; +} foreach _openWounds; (_totalBloodLoss == 0); diff --git a/addons/medical/functions/fnc_isMedic.sqf b/addons/medical/functions/fnc_isMedic.sqf index 122d261238..ca974fb751 100644 --- a/addons/medical/functions/fnc_isMedic.sqf +++ b/addons/medical/functions/fnc_isMedic.sqf @@ -4,7 +4,7 @@ * * Arguments: * 0: The Unit - * 1: Class + * 1: Class (default: 1) * * ReturnValue: * Is in of medic class @@ -15,8 +15,7 @@ #include "script_component.hpp" private ["_unit", "_class", "_medicN"]; -_unit = _this select 0; -_medicN = if (count _this > 1) then {_this select 1} else {1}; +params ["_unit", ["_medicN", 1]]; _class = _unit getVariable [QGVAR(medicClass), getNumber (configFile >> "CfgVehicles" >> typeOf _unit >> "attendant")]; diff --git a/addons/medical/functions/fnc_isMedicalVehicle.sqf b/addons/medical/functions/fnc_isMedicalVehicle.sqf index 5e9283852f..14499cb241 100644 --- a/addons/medical/functions/fnc_isMedicalVehicle.sqf +++ b/addons/medical/functions/fnc_isMedicalVehicle.sqf @@ -12,7 +12,6 @@ */ #include "script_component.hpp" -private ["_vehicle"]; -_vehicle = _this select 0; +params ["_vehicle"]; (_vehicle getVariable [QGVAR(medicClass), getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "attendant")]) > 0 diff --git a/addons/medical/functions/fnc_itemCheck.sqf b/addons/medical/functions/fnc_itemCheck.sqf index c903417dfc..d49e04e774 100644 --- a/addons/medical/functions/fnc_itemCheck.sqf +++ b/addons/medical/functions/fnc_itemCheck.sqf @@ -6,15 +6,14 @@ * 0: The unit * * ReturnValue: - * nil + * None * * Public: Yes */ #include "script_component.hpp" -private ["_unit"]; -_unit = _this select 0; +params ["_unit"]; while {({_x == "FirstAidKit"} count items _unit) > 0} do { _unit removeItem "FirstAidKit"; diff --git a/addons/medical/functions/fnc_modifyMedicalAction.sqf b/addons/medical/functions/fnc_modifyMedicalAction.sqf index 268ba8e253..1ac709059f 100644 --- a/addons/medical/functions/fnc_modifyMedicalAction.sqf +++ b/addons/medical/functions/fnc_modifyMedicalAction.sqf @@ -10,14 +10,15 @@ * 3: The action to modify * * ReturnValue: - * nil + * None * * Public: No */ #include "script_component.hpp" -EXPLODE_4_PVT(_this,_target,_player,_selectionN,_actionData); +params ["_target", "_player", "_selectionN", "_actionData"]; + if (GVAR(level) < 2) exitwith { private ["_pointDamage"]; _pointDamage = _target getHitPointDamage (["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"] select _selectionN); @@ -33,8 +34,8 @@ if (GVAR(level) < 2) exitwith { private ["_openWounds", "_amountOf"]; _openWounds = _target getvariable [QGVAR(openWounds), []]; { - _amountOf = _x select 3; - if (_amountOf > 0 && {(_selectionN == (_x select 2))} && {(_x select 4) > 0}) exitwith { + _x params ["", "", "_selectionX", "_amountOf", "_x4"]; + if (_amountOf > 0 && {(_selectionN == _selectionX)} && {_x4 > 0}) exitwith { _actionData set [2, QUOTE(PATHTOF(UI\icons\medical_crossRed.paa))]; }; } foreach _openWounds; diff --git a/addons/medical/functions/fnc_moduleAdvancedMedicalSettings.sqf b/addons/medical/functions/fnc_moduleAdvancedMedicalSettings.sqf index 2960c65b9d..b54196d75f 100644 --- a/addons/medical/functions/fnc_moduleAdvancedMedicalSettings.sqf +++ b/addons/medical/functions/fnc_moduleAdvancedMedicalSettings.sqf @@ -8,17 +8,14 @@ * 2: activated * * Return Value: - * None + * None * * Public: No */ #include "script_component.hpp" -private ["_logic", "_units", "_activated"]; -_logic = _this select 0; -_units = _this select 1; -_activated = _this select 2; +params ["_logic", "_units", "_activated"]; if !(_activated) exitWith {}; diff --git a/addons/medical/functions/fnc_moduleAssignMedicRoles.sqf b/addons/medical/functions/fnc_moduleAssignMedicRoles.sqf index 1c26eb53d4..e295c55a2e 100644 --- a/addons/medical/functions/fnc_moduleAssignMedicRoles.sqf +++ b/addons/medical/functions/fnc_moduleAssignMedicRoles.sqf @@ -8,15 +8,15 @@ * 2: activated * * Return Value: - * None + * None * * Public: No */ #include "script_component.hpp" -private ["_logic","_setting","_objects", "_list", "_splittedList", "_nilCheckPassedList", "_parsedList"]; -_logic = [_this,0,objNull,[objNull]] call BIS_fnc_param; +private ["_setting", "_objects", "_list", "_splittedList", "_nilCheckPassedList", "_parsedList"]; +params [["_logic", objNull, [objNull]]]; if (!isNull _logic) then { _list = _logic getvariable ["EnableList",""]; @@ -32,7 +32,7 @@ if (!isNull _logic) then { _nilCheckPassedList = _nilCheckPassedList + ","+ _x; }; }; - }foreach _splittedList; + } foreach _splittedList; _list = "[" + _nilCheckPassedList + "]"; _parsedList = [] call compile _list; @@ -47,7 +47,7 @@ if (!isNull _logic) then { }; }; }; - }foreach _objects; + } foreach _objects; }; { if (!isnil "_x") then { @@ -57,7 +57,5 @@ if (!isNull _logic) then { }; }; }; - }foreach _parsedList; + } foreach _parsedList; }; - -true \ No newline at end of file diff --git a/addons/medical/functions/fnc_moduleAssignMedicalFacility.sqf b/addons/medical/functions/fnc_moduleAssignMedicalFacility.sqf index c08d737f4b..7a219f2559 100644 --- a/addons/medical/functions/fnc_moduleAssignMedicalFacility.sqf +++ b/addons/medical/functions/fnc_moduleAssignMedicalFacility.sqf @@ -8,15 +8,15 @@ * 2: activated * * Return Value: - * None + * None * * Public: No */ #include "script_component.hpp" -private ["_logic","_setting","_objects"]; -_logic = [_this,0,objNull,[objNull]] call BIS_fnc_param; +private ["_setting", "_objects"]; +params [["_logic", objNull, [objNull]]]; if (!isNull _logic) then { _setting = _logic getvariable ["class",0]; _objects = synchronizedObjects _logic; @@ -24,7 +24,7 @@ if (!isNull _logic) then { if (local _x) then { _x setvariable[QGVAR(isMedicalFacility), true, true]; }; - }foreach _objects; + } foreach _objects; }; true; diff --git a/addons/medical/functions/fnc_moduleAssignMedicalVehicle.sqf b/addons/medical/functions/fnc_moduleAssignMedicalVehicle.sqf index af6de73ce1..9744ce5f7b 100644 --- a/addons/medical/functions/fnc_moduleAssignMedicalVehicle.sqf +++ b/addons/medical/functions/fnc_moduleAssignMedicalVehicle.sqf @@ -8,7 +8,7 @@ * 2: activated * * Return Value: - * None + * None * * Public: No */ @@ -16,8 +16,8 @@ #include "script_component.hpp" -private ["_logic","_setting","_objects", "_list", "_splittedList", "_nilCheckPassedList", "_parsedList"]; -_logic = [_this,0,objNull,[objNull]] call BIS_fnc_param; +private ["_setting", "_objects", "_list", "_splittedList", "_nilCheckPassedList", "_parsedList"]; +params [["_logic", objNull, [objNull]]]; if (!isNull _logic) then { _list = _logic getvariable ["EnableList",""]; @@ -33,7 +33,7 @@ if (!isNull _logic) then { _nilCheckPassedList = _nilCheckPassedList + ","+ _x; }; }; - }foreach _splittedList; + } foreach _splittedList; _list = "[" + _nilCheckPassedList + "]"; _parsedList = [] call compile _list; @@ -48,7 +48,7 @@ if (!isNull _logic) then { }; }; }; - }foreach _objects; + } foreach _objects; }; { if (!isnil "_x") then { @@ -58,7 +58,5 @@ if (!isNull _logic) then { }; }; }; - }foreach _parsedList; + } foreach _parsedList; }; - -true; diff --git a/addons/medical/functions/fnc_moduleMedicalSettings.sqf b/addons/medical/functions/fnc_moduleMedicalSettings.sqf index 00b7a15fcf..4e1af0e86c 100644 --- a/addons/medical/functions/fnc_moduleMedicalSettings.sqf +++ b/addons/medical/functions/fnc_moduleMedicalSettings.sqf @@ -8,17 +8,14 @@ * 2: activated * * Return Value: - * None + * None * * Public: No */ #include "script_component.hpp" -private ["_logic", "_units", "_activated"]; -_logic = _this select 0; -_units = _this select 1; -_activated = _this select 2; +params ["_logic", "_units", "_activated"]; if !(_activated) exitWith {}; diff --git a/addons/medical/functions/fnc_moduleReviveSettings.sqf b/addons/medical/functions/fnc_moduleReviveSettings.sqf index c96b1eb67c..19aa9579dd 100644 --- a/addons/medical/functions/fnc_moduleReviveSettings.sqf +++ b/addons/medical/functions/fnc_moduleReviveSettings.sqf @@ -8,17 +8,14 @@ * 2: activated * * Return Value: - * None + * None * * Public: No */ #include "script_component.hpp" -private ["_logic", "_units", "_activated"]; -_logic = _this select 0; -_units = _this select 1; -_activated = _this select 2; +params ["_logic", "_units", "_activated"]; if !(_activated) exitWith {}; diff --git a/addons/medical/functions/fnc_onMedicationUsage.sqf b/addons/medical/functions/fnc_onMedicationUsage.sqf index 904ad3ef88..d71896b6f0 100644 --- a/addons/medical/functions/fnc_onMedicationUsage.sqf +++ b/addons/medical/functions/fnc_onMedicationUsage.sqf @@ -11,28 +11,21 @@ * 5: Incompatable medication > * * Return Value: - * NONE + * None * * Public: No */ #include "script_component.hpp" -private ["_target", "_className", "_variable", "_maxDosage", "_timeInSystem", "_incompatabileMeds", "_foundEntry", "_allUsedMedication","_allMedsFromClassname", "_usedMeds", "_hasOverDosed", "_med", "_limit", "_classNamesUsed", "_decreaseAmount", "_viscosityChange", "_viscosityAdjustment", "_medicationConfig", "_onOverDose", "_painReduce"]; -_target = _this select 0; -_className = _this select 1; -_variable = _this select 2; -_maxDosage = _this select 3; -_timeInSystem = _this select 4; -_incompatabileMeds = _this select 5; -_viscosityChange = _this select 6; -_painReduce = _this select 7; +private ["_foundEntry", "_allUsedMedication","_allMedsFromClassname", "_usedMeds", "_hasOverDosed", "_med", "_limit", "_decreaseAmount", "_viscosityAdjustment", "_medicationConfig", "_onOverDose"]; +params ["_target", "_className", "_variable", "_maxDosage", "_timeInSystem", "_incompatabileMeds", "_viscosityChange", "_painReduce"]; _foundEntry = false; _allUsedMedication = _target getvariable [QGVAR(allUsedMedication), []]; { - if (_x select 0 == _variable) exitwith { - _allMedsFromClassname = _x select 1; + _x params ["_variableX", "_allMedsFromClassname"]; + if (_variableX== _variable) exitwith { if !(_className in _allMedsFromClassname) then { _allMedsFromClassname pushback _className; _x set [1, _allMedsFromClassname]; @@ -56,15 +49,14 @@ if (_usedMeds >= floor (_maxDosage + round(random(2))) && _maxDosage >= 1 && GVA _hasOverDosed = 0; { - _med = _x select 0; - _limit = _x select 1; + _x params ["_med", "_limit"]; { - _classNamesUsed = _x select 1; + _x params ["", "_classNamesUsed"]; if ({_x == _med} count _classNamesUsed > _limit) then { _hasOverDosed = _hasOverDosed + 1; }; - }foreach _allUsedMedication; -}foreach _incompatabileMeds; + } foreach _allUsedMedication; +} foreach _incompatabileMeds; if (_hasOverDosed > 0 && GVAR(enableOverdosing)) then { _medicationConfig = (configFile >> "ACE_Medical_Advanced" >> "Treatment" >> "Medication"); @@ -85,16 +77,8 @@ _decreaseAmount = 1 / _timeInSystem; _viscosityAdjustment = _viscosityChange / _timeInSystem; [{ - private ["_args", "_target", "_timeInSystem", "_variable", "_amountDecreased","_decreaseAmount", "_usedMeds", "_viscosityAdjustment", "_painReduce"]; - _args = _this select 0; - _target = _args select 0; - _timeInSystem = _args select 1; - _variable = _args select 2; - _amountDecreased = _args select 3; - _decreaseAmount = _args select 4; - _viscosityAdjustment = _args select 5; - _painReduce = _args select 6; - + params ["_args", "_idPFH"]; + _args params ["_target", "_timeInSystem", "_variable", "_amountDecreased","_decreaseAmount", "_usedMeds", "_viscosityAdjustment", "_painReduce"]; _usedMeds = _target getvariable [_variable, 0]; _usedMeds = _usedMeds - _decreaseAmount; _target setvariable [_variable, _usedMeds]; @@ -106,7 +90,7 @@ _viscosityAdjustment = _viscosityChange / _timeInSystem; _target setvariable [QGVAR(painSuppress), ((_target getvariable [QGVAR(painSuppress), 0]) - _painReduce) max 0]; if (_amountDecreased >= 1 || (_usedMeds <= 0) || !alive _target) then { - [(_this select 1)] call cba_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; }; _args set [3, _amountDecreased]; }, 1, [_target, _timeInSystem, _variable, 0, _decreaseAmount, _viscosityAdjustment, _painReduce / _timeInSystem] ] call CBA_fnc_addPerFrameHandler; diff --git a/addons/medical/functions/fnc_onPropagateWound.sqf b/addons/medical/functions/fnc_onPropagateWound.sqf index 934899eac4..f8b361ad17 100644 --- a/addons/medical/functions/fnc_onPropagateWound.sqf +++ b/addons/medical/functions/fnc_onPropagateWound.sqf @@ -7,7 +7,7 @@ * 1: injury * * Return Value: - * None + * None * * Public: No */ @@ -15,8 +15,7 @@ #include "script_component.hpp" private ["_unit", "_injury", "_openWounds", "_injuryID", "_exists"]; -_unit = _this select 0; -_injury = _this select 1; +params ["_unit", "_injury"]; if (!local _unit) then { _openWounds = _unit getvariable[QGVAR(openWounds), []]; @@ -28,7 +27,7 @@ if (!local _unit) then { _exists = true; _openWounds set [_foreachIndex, _injury]; }; - }foreach _openWounds; + } foreach _openWounds; if (!_exists) then { _openWounds pushback _injury; diff --git a/addons/medical/functions/fnc_onWoundUpdateRequest.sqf b/addons/medical/functions/fnc_onWoundUpdateRequest.sqf index 3c99496d7b..091bea7ef8 100644 --- a/addons/medical/functions/fnc_onWoundUpdateRequest.sqf +++ b/addons/medical/functions/fnc_onWoundUpdateRequest.sqf @@ -7,19 +7,18 @@ * 1: Origin object * * ReturnValue: - * + * None * * Public: Yes */ #include "script_component.hpp" private ["_unit", "_openWounds", "_originOfrequest"]; -_unit = _this select 0; -_originOfrequest = _this select 1; +params ["_unit", "_originOfrequest"]; if (local _unit && !(local _originOfrequest)) then { _openWounds = _unit getvariable [QGVAR(openWounds), []]; { ["medical_propagateWound", [_originOfrequest], [_unit, _x]] call EFUNC(common,targetEvent); - }foreach _openWounds; + } foreach _openWounds; }; diff --git a/addons/medical/functions/fnc_parseConfigForInjuries.sqf b/addons/medical/functions/fnc_parseConfigForInjuries.sqf index 1b2db7c278..e72ec63969 100644 --- a/addons/medical/functions/fnc_parseConfigForInjuries.sqf +++ b/addons/medical/functions/fnc_parseConfigForInjuries.sqf @@ -3,9 +3,9 @@ * Parse the ACE_Medical_Advanced config for all injury types. * * Arguments: - * + * None * ReturnValue: - * + * None * * Public: No */ @@ -110,7 +110,7 @@ _selectionSpecific = getNumber(_damageTypesConfig >> "selectionSpecific"); if (_type in (_x select 5)) then { _woundTypes pushback _x; }; - }foreach _allWoundClasses; + } foreach _allWoundClasses; _typeThresholds = _thresholds; _selectionSpecificType = _selectionSpecific; if (isClass(_damageTypesConfig >> _x)) then { @@ -130,46 +130,41 @@ _selectionSpecific = getNumber(_damageTypesConfig >> "selectionSpecific"); _minDamageThresholds = _minDamageThresholds + ":"; _amountThresholds = _amountThresholds + ":"; }; - }foreach _typeThresholds; + } foreach _typeThresholds; "ace_medical" callExtension format ["addDamageType,%1,%2,%3,%4,%5", _type, GVAR(minLethalDamages) select _foreachIndex, _minDamageThresholds, _amountThresholds, _selectionSpecificType]; -}foreach _allFoundDamageTypes; +} foreach _allFoundDamageTypes; // Extension loading { - private ["_classID", "_className", "_allowedSelections", "_bloodLoss", "_pain", "_minDamage", "_maxDamage", "_causes", "_classDisplayName", "_extensionInput", "_selections", "_causesArray"]; + private ["_className", "_allowedSelections", "_causes"]; // add shit to addInjuryType - _classID = _x select 0; + params ["_classID", "_selections", "_bloodLoss", "_pain", "_damage", "_causesArray", "_classDisplayName"]; + _damage params ["_minDamage", "_maxDamage"]; _className = GVAR(woundClassNames) select _forEachIndex; _allowedSelections = ""; - _selections = _x select 1; { _allowedSelections = _allowedSelections + _x; if (_forEachIndex < (count _selections) - 1) then { _allowedSelections = _allowedSelections + ":"; }; - }foreach _selections; + } foreach _selections; - _bloodLoss = _x select 2; - _pain = _x select 3; - _minDamage = (_x select 4) select 0; - _maxDamage = (_x select 4) select 1; _causes = ""; - _causesArray = (_x select 5); + { _causes = _causes + _x; if (_forEachIndex < (count _causesArray) - 1) then { _causes = _causes + ":"; }; - }foreach _causesArray; - _classDisplayName = _x select 6; + } foreach _causesArray; "ace_medical" callExtension format["addInjuryType,%1,%2,%3,%4,%5,%6,%7,%8,%9", _classID, _className, _allowedSelections, _bloodLoss, _pain, _minDamage, _maxDamage, _causes, _classDisplayName]; -}foreach _allWoundClasses; +} foreach _allWoundClasses; "ace_medical" callExtension "ConfigComplete"; diff --git a/addons/medical/functions/fnc_playInjuredSound.sqf b/addons/medical/functions/fnc_playInjuredSound.sqf index 3d41ec70db..ddf107c840 100644 --- a/addons/medical/functions/fnc_playInjuredSound.sqf +++ b/addons/medical/functions/fnc_playInjuredSound.sqf @@ -6,9 +6,10 @@ * * Arguments: * 0: The Unit + * 1: Amount of Pain * * ReturnValue: - * + * None * * Public: No */ @@ -16,8 +17,7 @@ #include "script_component.hpp" private ["_unit","_availableSounds_A","_availableSounds_B","_availableSounds_C","_sound", "_pain"]; -_unit = _this select 0; -_pain = _this select 1; +params ["_unit", "_pain"]; if (!local _unit || !GVAR(enableScreams)) exitwith{}; // Lock if the unit is already playing a sound. diff --git a/addons/medical/functions/fnc_setCardiacArrest.sqf b/addons/medical/functions/fnc_setCardiacArrest.sqf index c33d83bb40..b28e1cd679 100644 --- a/addons/medical/functions/fnc_setCardiacArrest.sqf +++ b/addons/medical/functions/fnc_setCardiacArrest.sqf @@ -35,11 +35,11 @@ _timeInCardiacArrest = 120 + round(random(600)); _heartRate = _unit getvariable [QGVAR(heartRate), 80]; if (_heartRate > 0 || !alive _unit) exitwith { - [(_this select 1)] call cba_fnc_removePerFrameHandler; + [(_this select 1)] call CBA_fnc_removePerFrameHandler; _unit setvariable [QGVAR(inCardiacArrest), nil,true]; }; if (ACE_time - _startTime >= _timeInCardiacArrest) exitwith { - [(_this select 1)] call cba_fnc_removePerFrameHandler; + [(_this select 1)] call CBA_fnc_removePerFrameHandler; _unit setvariable [QGVAR(inCardiacArrest), nil,true]; [_unit] call FUNC(setDead); }; diff --git a/addons/medical/functions/fnc_setDead.sqf b/addons/medical/functions/fnc_setDead.sqf index c29edcd5e3..e2884da391 100644 --- a/addons/medical/functions/fnc_setDead.sqf +++ b/addons/medical/functions/fnc_setDead.sqf @@ -50,7 +50,7 @@ if (((_reviveVal == 1 && {[_unit] call EFUNC(common,isPlayer)} || _reviveVal == _startTime = _unit getvariable [QGVAR(reviveStartTime), 0]; if (GVAR(maxReviveTime) > 0 && {ACE_time - _startTime > GVAR(maxReviveTime)}) exitwith { - [(_this select 1)] call cba_fnc_removePerFrameHandler; + [(_this select 1)] call CBA_fnc_removePerFrameHandler; _unit setvariable [QGVAR(inReviveState), nil, true]; _unit setvariable [QGVAR(reviveStartTime), nil]; [_unit, true] call FUNC(setDead); @@ -64,7 +64,7 @@ if (((_reviveVal == 1 && {[_unit] call EFUNC(common,isPlayer)} || _reviveVal == }; _unit setvariable [QGVAR(reviveStartTime), nil]; - [(_this select 1)] call cba_fnc_removePerFrameHandler; + [(_this select 1)] call CBA_fnc_removePerFrameHandler; }; if (GVAR(level) >= 2) then { if (_unit getvariable [QGVAR(heartRate), 60] > 0) then { diff --git a/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf b/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf index 5108bf8433..ceabb80587 100644 --- a/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf +++ b/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf @@ -36,13 +36,13 @@ _target setvariable [QGVAR(tourniquets), _tourniquets, true]; _part = _args select 2; _time = _args select 3; if (!alive _target) exitwith { - [(_this select 1)] call cba_fnc_removePerFrameHandler; + [(_this select 1)] call CBA_fnc_removePerFrameHandler; }; _tourniquets = _target getvariable [QGVAR(tourniquets), [0,0,0,0,0,0]]; if !((_tourniquets select _part) == _applyingTo) exitwith { // Tourniquet has been removed - [(_this select 1)] call cba_fnc_removePerFrameHandler; + [(_this select 1)] call CBA_fnc_removePerFrameHandler; }; if (ACE_time - _time > 120) then { _target setvariable [QGVAR(pain), (_target getvariable [QGVAR(pain), 0]) + 0.005]; diff --git a/addons/medical/functions/fnc_unconsciousPFH.sqf b/addons/medical/functions/fnc_unconsciousPFH.sqf index 5b1ca04d2d..c66f6863c8 100644 --- a/addons/medical/functions/fnc_unconsciousPFH.sqf +++ b/addons/medical/functions/fnc_unconsciousPFH.sqf @@ -45,7 +45,7 @@ if (!alive _unit) exitwith { [_unit, "isUnconscious"] call EFUNC(common,unmuteUnit); ["medical_onUnconscious", [_unit, false]] call EFUNC(common,globalEvent); - [(_this select 1)] call cba_fnc_removePerFrameHandler; + [(_this select 1)] call CBA_fnc_removePerFrameHandler; }; // In case the unit is no longer in an unconscious state, we are going to check if we can already reset the animation @@ -99,7 +99,7 @@ if !(_unit getvariable ["ACE_isUnconscious",false]) exitwith { ["medical_onUnconscious", [_unit, false]] call EFUNC(common,globalEvent); // EXIT PFH - [(_this select 1)] call cba_fnc_removePerFrameHandler; + [(_this select 1)] call CBA_fnc_removePerFrameHandler; }; if (!_hasMovedOut) then { // Reset the unit back to the previous captive state. @@ -132,7 +132,7 @@ if (_parachuteCheck) then { if (!local _unit) exitwith { _args set [3, _minWaitingTime - (ACE_time - _startingTime)]; _unit setvariable [QGVAR(unconsciousArguments), _args, true]; - [(_this select 1)] call cba_fnc_removePerFrameHandler; + [(_this select 1)] call CBA_fnc_removePerFrameHandler; }; // Ensure we are waiting at least a minimum period before checking if we can wake up the unit again, allows for temp knock outs From c2d94239a2dc4ecd6b0897f1a763ef82c7a995d2 Mon Sep 17 00:00:00 2001 From: jokoho48 Date: Sat, 22 Aug 2015 16:26:53 +0200 Subject: [PATCH 011/170] Code Cleanup Medical Module (Part 2). --- addons/medical/XEH_init.sqf | 3 +-- addons/medical/XEH_postInit.sqf | 13 +++++-------- addons/medical/XEH_respawn.sqf | 4 +--- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/addons/medical/XEH_init.sqf b/addons/medical/XEH_init.sqf index 0ded7d471f..0b86a927b2 100644 --- a/addons/medical/XEH_init.sqf +++ b/addons/medical/XEH_init.sqf @@ -1,7 +1,6 @@ #include "script_component.hpp" -private ["_unit"]; -_unit = _this select 0; +params ["_unit"]; _unit addEventHandler ["HandleDamage", {_this call FUNC(handleDamage)}]; diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index f9f821eeb3..6ce81d396d 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -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); ["medical_onUnconscious", { - if (local (_this select 0)) then { - private ["_unit"]; - _unit = _this select 0; - if (_this select 1) then { + params ["_unit", "_status"]; + if (local _unit) then { + if (_status) then { _unit setVariable ["tf_globalVolume", 0.4]; _unit setVariable ["tf_voiceVolume", 0, 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 _fnc_createEffect = { - private ["_type", "_layer", "_default", "_effect"]; - _type = _this select 0; - _layer = _this select 1; - _default = _this select 2; + private "_effect"; + params ["_type", "_layer", "_default"]; _effect = ppEffectCreate [_type, _layer]; _effect ppEffectForceInNVG true; diff --git a/addons/medical/XEH_respawn.sqf b/addons/medical/XEH_respawn.sqf index 44060fa15c..bd8a7a105b 100644 --- a/addons/medical/XEH_respawn.sqf +++ b/addons/medical/XEH_respawn.sqf @@ -1,8 +1,6 @@ #include "script_component.hpp" -private ["_unit"]; - -_unit = _this select 0; +params ["_unit"]; if !(local _unit) exitWith {}; From 10127ed9573239ad4230fd4d2daff96687d7bd6e Mon Sep 17 00:00:00 2001 From: jokoho48 Date: Sat, 22 Aug 2015 17:10:19 +0200 Subject: [PATCH 012/170] Fix Typo --- addons/medical/functions/fnc_addToTriageCard.sqf | 2 +- addons/medical/functions/fnc_handleBandageOpening.sqf | 9 ++++----- .../functions/fnc_handleDamage_advancedSetDamage.sqf | 4 ++-- addons/medical/functions/fnc_handleDamage_wounds.sqf | 3 ++- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/addons/medical/functions/fnc_addToTriageCard.sqf b/addons/medical/functions/fnc_addToTriageCard.sqf index 1869340ad8..56b2042bc9 100644 --- a/addons/medical/functions/fnc_addToTriageCard.sqf +++ b/addons/medical/functions/fnc_addToTriageCard.sqf @@ -13,7 +13,7 @@ */ #include "script_component.hpp" -d + private ["_log", "_inList", "_amount"]; params ["_unit", "_newItem"]; diff --git a/addons/medical/functions/fnc_handleBandageOpening.sqf b/addons/medical/functions/fnc_handleBandageOpening.sqf index b617d1e64a..4a32adb9e5 100644 --- a/addons/medical/functions/fnc_handleBandageOpening.sqf +++ b/addons/medical/functions/fnc_handleBandageOpening.sqf @@ -21,7 +21,7 @@ private ["_className", "_reopeningChance", "_reopeningMinDelay", "_reopeningMaxDelay", "_config", "_woundTreatmentConfig", "_bandagedWounds", "_exist", "_injuryId", "_existingInjury", "_delay", "_openWounds", "_selectedInjury", "_bandagedInjury"]; params ["_target", "_impact", "_part", "_injuryIndex", "_injury", "_bandage"]; -_injury parmas ["_classID", "_injuryType"]; +_classID = _injury select 1; _className = GVAR(woundClassNames) select _classID; // default, just in case.. @@ -52,11 +52,11 @@ if (isClass (_config >> _className)) then { }; _bandagedWounds = _target getvariable [QGVAR(bandagedWounds), []]; +_injuryType = _injury select 1; _exist = false; _bandagedInjury = []; { - _x params ["", "_injuryTypeX", "_injuryX"]; - if (_injuryTypeX == _injuryType && _injuryTypeX == (_injury select 2)) exitwith { + if ((_x select 1) == _injuryType && (_x select 2) == (_injury select 2)) exitwith { _exist = true; _existingInjury = _x; _existingInjury set [3, (_existingInjury select 3) + _impact]; @@ -93,8 +93,7 @@ if (random(1) <= _reopeningChance) then { _exist = false; _injuryId = _injury select 1; { - _x params ["_injuryIdX", "_injuryX"]; - if (_injuryIdX == _injuryId && _injuryX == (_injury select 2)) exitwith { + if ((_x select 1) == _injuryId && (_x select 2) == (_injury select 2)) exitwith { _exist = true; _existingInjury = _x; _existingInjury set [3, ((_existingInjury select 3) - _impact) max 0]; diff --git a/addons/medical/functions/fnc_handleDamage_advancedSetDamage.sqf b/addons/medical/functions/fnc_handleDamage_advancedSetDamage.sqf index dc1e1a6fea..bac5a32976 100644 --- a/addons/medical/functions/fnc_handleDamage_advancedSetDamage.sqf +++ b/addons/medical/functions/fnc_handleDamage_advancedSetDamage.sqf @@ -17,12 +17,12 @@ params ["_unit"]; if (!local _unit) exitwith {}; -private ["_bodyStatus", "_headDamage", "_torsoDamage", "_handsDamage", "_legsDamage"]; +private "_bodyStatus"; // ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"] _bodyStatus = _unit getVariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]; -_bodyStatus params ["_headDamage", "_torsoDamage", "_handsDamageR", "_handsDamageL", "_legsDamageR", "_legsDamageL"] +_bodyStatus params ["_headDamage", "_torsoDamage", "_handsDamageR", "_handsDamageL", "_legsDamageR", "_legsDamageL"]; _unit setHitPointDamage ["hitHead", _headDamage min 0.95]; _unit setHitPointDamage ["hitBody", _torsoDamage min 0.95]; diff --git a/addons/medical/functions/fnc_handleDamage_wounds.sqf b/addons/medical/functions/fnc_handleDamage_wounds.sqf index 5711d903de..4438e9bb90 100644 --- a/addons/medical/functions/fnc_handleDamage_wounds.sqf +++ b/addons/medical/functions/fnc_handleDamage_wounds.sqf @@ -32,7 +32,8 @@ _woundsCreated = []; call compile _extensionOutput; _foundIndex = -1; { - _x params ["_toAddClassID", "_bodyPartNToAdd"]; + _toAddClassID = _x select 1; + _bodyPartNToAdd = _x select 2; { // Check if we have an id of the given class on the given bodypart already if (_x select 1 == _toAddClassID && {_x select 2 == _bodyPartNToAdd}) exitwith { From ff6c8a31bec90b34f0d78fb32fceead2c487b394 Mon Sep 17 00:00:00 2001 From: jokoho48 Date: Sat, 22 Aug 2015 18:33:06 +0200 Subject: [PATCH 013/170] Code Cleanup Medical Module (Part 3). --- .../medical/functions/fnc_actionCheckBloodPressure.sqf | 4 ++-- .../functions/fnc_actionCheckBloodPressureLocal.sqf | 7 ++++--- addons/medical/functions/fnc_actionCheckPulse.sqf | 4 ++-- addons/medical/functions/fnc_actionLoadUnit.sqf | 9 ++++----- addons/medical/functions/fnc_actionRemoveTourniquet.sqf | 2 +- addons/medical/functions/fnc_addToLog.sqf | 6 +++--- addons/medical/functions/fnc_addUnloadPatientActions.sqf | 2 +- addons/medical/functions/fnc_getTypeOfDamage.sqf | 2 +- addons/medical/functions/fnc_handleDamage_caching.sqf | 2 +- addons/medical/stringtable.xml | 7 ++++++- 10 files changed, 25 insertions(+), 20 deletions(-) diff --git a/addons/medical/functions/fnc_actionCheckBloodPressure.sqf b/addons/medical/functions/fnc_actionCheckBloodPressure.sqf index 96c9740b5d..ceab369a4e 100644 --- a/addons/medical/functions/fnc_actionCheckBloodPressure.sqf +++ b/addons/medical/functions/fnc_actionCheckBloodPressure.sqf @@ -13,5 +13,5 @@ */ #include "script_component.hpp" - -[_this, QUOTE(DFUNC(actionCheckBloodPressureLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ +params ["_caller", "_target"]; +[[_caller, _target], QUOTE(DFUNC(actionCheckBloodPressureLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ diff --git a/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf b/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf index c7b444de73..c4c90845fd 100644 --- a/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf +++ b/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf @@ -17,9 +17,10 @@ private ["_bloodPressure", "_logOutPut", "_output"]; params ["_caller", "_target"]; -_bloodPressure = [_target] call FUNC(getBloodPressure); -if (!alive _target) then { - _bloodPressure = [0,0]; +_bloodPressure = if (!alive _target) then { + [0,0] +} else { + [_target] call FUNC(getBloodPressure) }; _bloodPressure params ["_bloodPressureLow", "_bloodPressureLow"]; _output = ""; diff --git a/addons/medical/functions/fnc_actionCheckPulse.sqf b/addons/medical/functions/fnc_actionCheckPulse.sqf index 1861195a04..58bac2e0ab 100644 --- a/addons/medical/functions/fnc_actionCheckPulse.sqf +++ b/addons/medical/functions/fnc_actionCheckPulse.sqf @@ -13,5 +13,5 @@ */ #include "script_component.hpp" - -[_this, QUOTE(DFUNC(actionCheckPulseLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ +params ["_caller","_target"]; +[[_caller, _target], QUOTE(DFUNC(actionCheckPulseLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ diff --git a/addons/medical/functions/fnc_actionLoadUnit.sqf b/addons/medical/functions/fnc_actionLoadUnit.sqf index f4b941383f..0340da2e20 100644 --- a/addons/medical/functions/fnc_actionLoadUnit.sqf +++ b/addons/medical/functions/fnc_actionLoadUnit.sqf @@ -18,14 +18,13 @@ private "_vehicle"; params ["_caller", "_target"]; if ([_target] call EFUNC(common,isAwake)) exitwith { - // TODO localization - ["displayTextStructured", [_caller], [["This person (%1) is awake and cannot be loaded", [_target] call EFUNC(common,getName)], 1.5, _caller]] call EFUNC(common,targetEvent); + ["displayTextStructured", [_caller], [[localize LSTRING(CanNotLoaded), [_target] call EFUNC(common,getName)], 1.5, _caller]] call EFUNC(common,targetEvent); }; if ([_target] call FUNC(isBeingCarried)) then { - _this call EFUNC(dragging,dropObject_carry); + ["_caller", "_target"] call EFUNC(dragging,dropObject_carry); }; if ([_target] call FUNC(isBeingDragged)) then { - _this call EFUNC(dragging,dropObject); + ["_caller", "_target"] call EFUNC(dragging,dropObject); }; -_vehicle = _this call EFUNC(common,loadPerson); +_vehicle = ["_caller", "_target"] call EFUNC(common,loadPerson); diff --git a/addons/medical/functions/fnc_actionRemoveTourniquet.sqf b/addons/medical/functions/fnc_actionRemoveTourniquet.sqf index 778042e9a6..2a39b63095 100644 --- a/addons/medical/functions/fnc_actionRemoveTourniquet.sqf +++ b/addons/medical/functions/fnc_actionRemoveTourniquet.sqf @@ -24,7 +24,7 @@ _tourniquets = _target getvariable [QGVAR(tourniquets), [0,0,0,0,0,0]]; // Check if there is a tourniquet on this bodypart if ((_tourniquets select _part) == 0) exitwith { - _output = "There is no tourniquet on this body part!"; + _output = localize LSTRING(noTourniquetOnBodyPart); ["displayTextStructured", [_caller], [_output, 1.5, _caller]] call EFUNC(common,targetEvent); }; diff --git a/addons/medical/functions/fnc_addToLog.sqf b/addons/medical/functions/fnc_addToLog.sqf index 54a685611a..fff615a5b3 100644 --- a/addons/medical/functions/fnc_addToLog.sqf +++ b/addons/medical/functions/fnc_addToLog.sqf @@ -17,13 +17,13 @@ #include "script_component.hpp" private ["_moment", "_logVarName", "_log","_newLog", "_logs"]; -params ["_unit", "_type", "_allMapMarkers", "_arguments"]; +params ["_unit", "_type", "_message", "_arguments"]; 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 */ }; -date params ["_minute", "_hour"]; +date params ["", "", "", "_minute", "_hour"]; _moment = if (_minute < 10) then { format["%1:0%2", _hour, _minute] diff --git a/addons/medical/functions/fnc_addUnloadPatientActions.sqf b/addons/medical/functions/fnc_addUnloadPatientActions.sqf index 11e0463328..f29b3923f1 100644 --- a/addons/medical/functions/fnc_addUnloadPatientActions.sqf +++ b/addons/medical/functions/fnc_addUnloadPatientActions.sqf @@ -27,7 +27,7 @@ _actions = []; str(_unit), [_unit, true] call EFUNC(common,getName), "", - {[_player, _parameters select 0] call FUNC(actionUnloadUnit);}, + {[_player, (_this select 2) select 0] call FUNC(actionUnloadUnit);}, {true}, {}, [_unit] diff --git a/addons/medical/functions/fnc_getTypeOfDamage.sqf b/addons/medical/functions/fnc_getTypeOfDamage.sqf index b8646e485f..d0aff19cc4 100644 --- a/addons/medical/functions/fnc_getTypeOfDamage.sqf +++ b/addons/medical/functions/fnc_getTypeOfDamage.sqf @@ -28,4 +28,4 @@ call { if (_typeOfProjectile isKindOf "BombCore") exitWith {"explosive"}; if (_typeOfProjectile isKindOf "Grenade") exitWith {"grenade"}; toLower _typeOfProjectile -}; +} diff --git a/addons/medical/functions/fnc_handleDamage_caching.sqf b/addons/medical/functions/fnc_handleDamage_caching.sqf index 9d31e53b1e..a9825a5c88 100644 --- a/addons/medical/functions/fnc_handleDamage_caching.sqf +++ b/addons/medical/functions/fnc_handleDamage_caching.sqf @@ -75,7 +75,7 @@ if (diag_frameno > (_unit getVariable [QGVAR(frameNo_damageCaching), -3]) + 2) t [{ private ["_args", "_params"]; params ["_args", "_idPFH"]; - params ["_unit", "_frameno"]; + _args params ["_unit", "_frameno"]; if (diag_frameno > _frameno + 2) then { _unit setDamage 0; diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index a81f43848d..be30382226 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -3617,5 +3617,10 @@ Distance to %1 has become to far for treatment %1 odszedł zbyt daleko, nie można kontynuować leczenia + + This person (%1) is awake and cannot be loaded + + + There is no tourniquet on this body part! - \ No newline at end of file + From 2d4ef164296f8b37b607a72da133be9ab2eb0818 Mon Sep 17 00:00:00 2001 From: jokoho48 Date: Sat, 22 Aug 2015 18:54:51 +0200 Subject: [PATCH 014/170] fix CTD --- addons/medical/functions/fnc_parseConfigForInjuries.sqf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/medical/functions/fnc_parseConfigForInjuries.sqf b/addons/medical/functions/fnc_parseConfigForInjuries.sqf index e72ec63969..764d0bf591 100644 --- a/addons/medical/functions/fnc_parseConfigForInjuries.sqf +++ b/addons/medical/functions/fnc_parseConfigForInjuries.sqf @@ -9,7 +9,6 @@ * * Public: No */ - #include "script_component.hpp" private ["_injuriesRootConfig", "_woundsConfig", "_allWoundClasses", "_amountOf", "_entry","_classType", "_selections", "_bloodLoss", "_pain","_minDamage","_causes", "_damageTypesConfig", "_thresholds", "_typeThresholds", "_selectionSpecific", "_selectionSpecificType", "_classDisplayName", "_subClassDisplayName", "_maxDamage", "_subClassmaxDamage", "_defaultMinLethalDamage", "_minLethalDamage", "_allFoundDamageTypes", "_classID", "_configDamageTypes", "_i", "_parseForSubClassWounds", "_subClass", "_subClassConfig", "_subClassbloodLoss", "_subClasscauses", "_subClassminDamage", "_subClasspain", "_subClassselections", "_subClasstype", "_type", "_varName", "_woundTypes"]; @@ -140,9 +139,9 @@ _selectionSpecific = getNumber(_damageTypesConfig >> "selectionSpecific"); // Extension loading { - private ["_className", "_allowedSelections", "_causes"]; + private ["_classID", "_className", "_allowedSelections", "_bloodLoss", "_pain", "_minDamage", "_maxDamage", "_causes", "_classDisplayName", "_extensionInput", "_selections", "_causesArray"]; // add shit to addInjuryType - params ["_classID", "_selections", "_bloodLoss", "_pain", "_damage", "_causesArray", "_classDisplayName"]; + _x params ["_classID", "_selections", "_bloodLoss", "_pain", "_damage", "_causesArray", "_classDisplayName"]; _damage params ["_minDamage", "_maxDamage"]; _className = GVAR(woundClassNames) select _forEachIndex; _allowedSelections = ""; @@ -162,6 +161,7 @@ _selectionSpecific = getNumber(_damageTypesConfig >> "selectionSpecific"); _causes = _causes + ":"; }; } foreach _causesArray; + _classDisplayName = _x select 6; "ace_medical" callExtension format["addInjuryType,%1,%2,%3,%4,%5,%6,%7,%8,%9", _classID, _className, _allowedSelections, _bloodLoss, _pain, _minDamage, _maxDamage, _causes, _classDisplayName]; From 19dd55147ae813dc6e0de515bc9290147236dce5 Mon Sep 17 00:00:00 2001 From: jokoho48 Date: Sat, 22 Aug 2015 19:47:23 +0200 Subject: [PATCH 015/170] Code Cleanup Medical Module (Part 4). --- .../functions/fnc_requestWoundSync.sqf | 6 +-- .../functions/fnc_setCardiacArrest.sqf | 17 ++++----- addons/medical/functions/fnc_setDead.sqf | 18 ++++----- .../functions/fnc_setHitPointDamage.sqf | 11 ++---- .../medical/functions/fnc_setUnconscious.sqf | 18 ++++----- addons/medical/functions/fnc_treatment.sqf | 11 ++---- .../functions/fnc_treatmentAdvanced_CPR.sqf | 7 +--- .../fnc_treatmentAdvanced_CPRLocal.sqf | 5 +-- .../fnc_treatmentAdvanced_bandage.sqf | 13 ++----- .../fnc_treatmentAdvanced_bandageLocal.sqf | 17 ++++----- .../fnc_treatmentAdvanced_fullHeal.sqf | 7 +--- .../fnc_treatmentAdvanced_fullHealLocal.sqf | 7 ++-- ...reatmentAdvanced_fullHealTreatmentTime.sqf | 6 +-- .../fnc_treatmentAdvanced_medication.sqf | 9 +---- .../fnc_treatmentAdvanced_medicationLocal.sqf | 5 +-- ...eatmentAdvanced_surgicalKit_onProgress.sqf | 27 +++++++++----- .../functions/fnc_treatmentBasic_bandage.sqf | 9 ++--- .../functions/fnc_treatmentBasic_bloodbag.sqf | 7 +--- .../fnc_treatmentBasic_bloodbagLocal.sqf | 2 +- .../functions/fnc_treatmentBasic_epipen.sqf | 8 +--- .../functions/fnc_treatmentBasic_morphine.sqf | 6 +-- .../fnc_treatmentBasic_morphineLocal.sqf | 6 +-- addons/medical/functions/fnc_treatmentIV.sqf | 15 +++----- .../functions/fnc_treatmentIVLocal.sqf | 7 ++-- .../functions/fnc_treatmentTourniquet.sqf | 6 +-- .../fnc_treatmentTourniquetLocal.sqf | 23 +++++------- .../functions/fnc_treatment_failure.sqf | 37 +++++++++---------- .../functions/fnc_treatment_success.sqf | 23 +++++------- .../medical/functions/fnc_unconsciousPFH.sqf | 20 ++++------ addons/medical/functions/fnc_useItem.sqf | 13 +++---- addons/medical/functions/fnc_useItems.sqf | 10 ++--- 31 files changed, 150 insertions(+), 226 deletions(-) diff --git a/addons/medical/functions/fnc_requestWoundSync.sqf b/addons/medical/functions/fnc_requestWoundSync.sqf index 74fd3e230d..31cf726214 100644 --- a/addons/medical/functions/fnc_requestWoundSync.sqf +++ b/addons/medical/functions/fnc_requestWoundSync.sqf @@ -7,16 +7,14 @@ * 1: object belonging to the caller * * ReturnValue: - * + * None * * Public: Yes */ #include "script_component.hpp" -private [ "_target", "_caller"]; -_target = _this select 0; -_caller = _this select 1; +params [ "_target", "_caller"]; if (local _target || GVAR(level) < 2) exitwith {}; // if the target is local, we already got the most update to date information if (_target getvariable [QGVAR(isWoundSynced), false]) exitwith {}; diff --git a/addons/medical/functions/fnc_setCardiacArrest.sqf b/addons/medical/functions/fnc_setCardiacArrest.sqf index b28e1cd679..017befcaad 100644 --- a/addons/medical/functions/fnc_setCardiacArrest.sqf +++ b/addons/medical/functions/fnc_setCardiacArrest.sqf @@ -7,15 +7,15 @@ * 0: The unit that will be put in cardiac arrest state * * ReturnValue: - * + * None * * Public: yes */ #include "script_component.hpp" -private ["_unit", "_timeInCardiacArrest"]; -_unit = _this select 0; +private "_timeInCardiacArrest"; +params ["_unit"]; if (_unit getvariable [QGVAR(inCardiacArrest),false]) exitwith {}; _unit setvariable [QGVAR(inCardiacArrest), true,true]; @@ -28,20 +28,17 @@ _timeInCardiacArrest = 120 + round(random(600)); [{ private ["_args","_unit","_startTime","_timeInCardiacArrest","_heartRate"]; - _args = _this select 0; - _unit = _args select 0; - _startTime = _args select 1; - _timeInCardiacArrest = _args select 2; + params ["_args", "_idPFH"]; + _args params ["_unit", "_startTime", "_timeInCardiacArrest"]; _heartRate = _unit getvariable [QGVAR(heartRate), 80]; if (_heartRate > 0 || !alive _unit) exitwith { - [(_this select 1)] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; _unit setvariable [QGVAR(inCardiacArrest), nil,true]; }; if (ACE_time - _startTime >= _timeInCardiacArrest) exitwith { - [(_this select 1)] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; _unit setvariable [QGVAR(inCardiacArrest), nil,true]; [_unit] call FUNC(setDead); }; }, 1, [_unit, ACE_time, _timeInCardiacArrest] ] call CBA_fnc_addPerFrameHandler; - diff --git a/addons/medical/functions/fnc_setDead.sqf b/addons/medical/functions/fnc_setDead.sqf index e2884da391..db84ff72c5 100644 --- a/addons/medical/functions/fnc_setDead.sqf +++ b/addons/medical/functions/fnc_setDead.sqf @@ -6,7 +6,7 @@ * 0: The unit that will be killed * * ReturnValue: - * + * None * * Public: yes */ @@ -14,11 +14,7 @@ #include "script_component.hpp" private ["_unit", "_force", "_reviveVal", "_lifesLeft"]; -_unit = _this select 0; -_force = false; -if (count _this >= 2) then { - _force = _this select 1; -}; +params ["_unit", ["_force", false]]; if (!alive _unit) exitwith{true}; if (!local _unit) exitwith { @@ -44,13 +40,13 @@ if (((_reviveVal == 1 && {[_unit] call EFUNC(common,isPlayer)} || _reviveVal == [_unit, true] call FUNC(setUnconscious); [{ - private ["_args","_unit","_startTime"]; - _args = _this select 0; - _unit = _args select 0; + private "_startTime"; + params ["_args", "_idPFH"]; + _args params ["_unit"]; _startTime = _unit getvariable [QGVAR(reviveStartTime), 0]; if (GVAR(maxReviveTime) > 0 && {ACE_time - _startTime > GVAR(maxReviveTime)}) exitwith { - [(_this select 1)] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; _unit setvariable [QGVAR(inReviveState), nil, true]; _unit setvariable [QGVAR(reviveStartTime), nil]; [_unit, true] call FUNC(setDead); @@ -64,7 +60,7 @@ if (((_reviveVal == 1 && {[_unit] call EFUNC(common,isPlayer)} || _reviveVal == }; _unit setvariable [QGVAR(reviveStartTime), nil]; - [(_this select 1)] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; }; if (GVAR(level) >= 2) then { if (_unit getvariable [QGVAR(heartRate), 60] > 0) then { diff --git a/addons/medical/functions/fnc_setHitPointDamage.sqf b/addons/medical/functions/fnc_setHitPointDamage.sqf index 18d4fc616e..1713c02243 100644 --- a/addons/medical/functions/fnc_setHitPointDamage.sqf +++ b/addons/medical/functions/fnc_setHitPointDamage.sqf @@ -7,10 +7,10 @@ * 0: Unit * 1: HitPoint * 2: Damage - * 3: Disable overall damage adjustment (optional) + * 3: Disable overall damage adjustment (default: false) * * Return Value: - * nil + * None * * Public: Yes */ @@ -22,10 +22,7 @@ #define ARMDAMAGETRESHOLD2 1.7 private ["_unit", "_selection", "_damage", "_selections", "_damages", "_damageOld", "_damageSumOld", "_damageNew", "_damageSumNew", "_damageFinal", "_armdamage", "_legdamage"]; - -_unit = _this select 0; -_selection = _this select 1; -_damage = _this select 2; +params ["_unit", "_selection", "_damage", ["_disalbed", false]]; // Unit isn't local, give function to machine where it is. if !(local _unit) exitWith { @@ -33,7 +30,7 @@ if !(local _unit) exitWith { }; // Check if overall damage adjustment is disabled -if (count _this > 3 && {_this select 3}) exitWith { +if (_disalbed) exitWith { _unit setHitPointDamage [_selection, _damage]; }; diff --git a/addons/medical/functions/fnc_setUnconscious.sqf b/addons/medical/functions/fnc_setUnconscious.sqf index 7e5cd8c1b7..3de62db974 100644 --- a/addons/medical/functions/fnc_setUnconscious.sqf +++ b/addons/medical/functions/fnc_setUnconscious.sqf @@ -4,9 +4,9 @@ * * Arguments: * 0: The unit that will be put in an unconscious state - * 1: Set unconsciouns - * 2: Minimum unconscious ACE_time - * 3: Force AI Unconscious (skip random death chance) + * 1: Set unconsciouns (default: true) + * 2: Minimum unconscious ACE_time (default: (round(random(10)+5))) + * 3: Force AI Unconscious (skip random death chance) (default: false) * * ReturnValue: * nil @@ -19,13 +19,10 @@ #include "script_component.hpp" -#define DEFAULT_DELAY (round(random(10)+5)) +#define DEFAULT_DELAY (round(random(10)+5)) -private ["_unit", "_set", "_animState", "_originalPos", "_startingTime","_minWaitingTime", "_force", "_isDead"]; -_unit = _this select 0; -_set = if (count _this > 1) then {_this select 1} else {true}; -_minWaitingTime = if (count _this > 2) then {_this select 2} else {DEFAULT_DELAY}; -_force = if (count _this > 3) then {_this select 3} else {false}; +private ["_animState", "_originalPos", "_startingTime", "_isDead"]; +params ["_unit", ["_set", true], ["_minWaitingTime", DEFAULT_DELAY], ["_force", false]]; // No change, fuck off. (why is there no xor?) if (_set isEqualTo (_unit getVariable ["ACE_isUnconscious", false])) exitWith {}; @@ -97,8 +94,7 @@ if (GVAR(moveUnitsFromGroupOnUnconscious)) then { _anim = [_unit] call EFUNC(common,getDeathAnim); [_unit, _anim, 1, true] call EFUNC(common,doAnimation); [{ - _unit = _this select 0; - _anim = _this select 1; + params ["_unit", "_anim"]; if ((_unit getVariable "ACE_isUnconscious") and (animationState _unit != _anim)) then { [_unit, _anim, 2, true] call EFUNC(common,doAnimation); }; diff --git a/addons/medical/functions/fnc_treatment.sqf b/addons/medical/functions/fnc_treatment.sqf index a319d50440..a39375a05e 100644 --- a/addons/medical/functions/fnc_treatment.sqf +++ b/addons/medical/functions/fnc_treatment.sqf @@ -16,11 +16,8 @@ #include "script_component.hpp" -private ["_caller", "_target", "_selectionName", "_className", "_config", "_medicRequired", "_items", "_locations", "_return", "_callbackProgress", "_treatmentTime", "_callerAnim", "_patientAnim", "_iconDisplayed", "_return", "_usersOfItems", "_consumeItems", "_condition", "_displayText", "_wpn", "_treatmentTimeConfig", "_patientStateCondition", "_allowedSelections"]; -_caller = _this select 0; -_target = _this select 1; -_selectionName = _this select 2; -_className = _this select 3; +private ["_config", "_medicRequired", "_items", "_locations", "_return", "_callbackProgress", "_treatmentTime", "_callerAnim", "_patientAnim", "_iconDisplayed", "_return", "_usersOfItems", "_consumeItems", "_condition", "_displayText", "_wpn", "_treatmentTimeConfig", "_patientStateCondition", "_allowedSelections"]; +params ["_caller", "_target", "_selectionName", "_className"]; // If the cursorMenu is open, the loading bar will fail. If we execute the function one frame later, it will work fine if (uiNamespace getVariable [QEGVAR(interact_menu,cursorMenuOpened),false]) exitwith { @@ -107,7 +104,7 @@ if ("All" in _locations) then { }; }; }; - }foreach _locations; + } foreach _locations; }; if !(_return) exitwith {false}; @@ -180,7 +177,7 @@ if (vehicle _caller == _caller && {_callerAnim != ""}) then { TRACE_1("Weapon Deployed, breaking out first",(stance _caller)); [_caller, "", 0] call EFUNC(common,doAnimation); }; - + if ((stance _caller) == "STAND") then { switch (_wpn) do {//If standing, end in a crouched animation based on their current weapon case ("rfl"): {_caller setvariable [QGVAR(treatmentPrevAnimCaller), "AmovPknlMstpSrasWrflDnon"];}; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf b/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf index ade74a6ccb..f09de600ae 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf @@ -16,12 +16,7 @@ #include "script_component.hpp" -private ["_caller", "_target", "_selectionName", "_className", "_items"]; -_caller = _this select 0; -_target = _this select 1; -_selectionName = _this select 2; -_className = _this select 3; -_items = _this select 4; +params ["_caller", "_target", "_selectionName", "_className", "_items"]; if (alive _target && {(_target getvariable [QGVAR(inCardiacArrest), false] || _target getvariable [QGVAR(inReviveState), false])}) then { [[_caller, _target], QUOTE(DFUNC(treatmentAdvanced_CPRLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ diff --git a/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf index a7c8ea6744..cd943fc8d0 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf @@ -14,9 +14,8 @@ #include "script_component.hpp" -private ["_caller","_target", "_reviveStartTime"]; -_caller = _this select 0; -_target = _this select 1; +private "_reviveStartTime"; +param ["_caller","_target"]; if (_target getvariable [QGVAR(inReviveState), false]) then { _reviveStartTime = _target getvariable [QGVAR(reviveStartTime),0]; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf b/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf index 1278994a11..f2159c37ef 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf @@ -7,7 +7,8 @@ * 1: The patient * 2: SelectionName * 3: Treatment classname - * + * 4: Item + * 5: specific Spot (default: -1) * * Return Value: * Succesful treatment started @@ -16,15 +17,7 @@ */ #include "script_component.hpp" - -private ["_caller", "_target", "_selectionName", "_className", "_items", "_specificSpot"]; -_caller = _this select 0; -_target = _this select 1; -_selectionName = _this select 2; -_className = _this select 3; -_items = _this select 4; - -_specificSpot = if (count _this > 6) then {_this select 6} else {-1}; +params ["_caller", "_target", "_selectionName", "_className", "_items", ["_specificSpot", -1]]; if !([_target] call FUNC(hasMedicalEnabled)) exitwith { _this call FUNC(treatmentBasic_bandage); diff --git a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf index d6c490d3c6..b36a551458 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf @@ -15,19 +15,16 @@ #include "script_component.hpp" -private ["_target", "_bandage", "_part", "_selectionName", "_openWounds", "_config", "_effectiveness","_mostEffectiveInjury", "_mostEffectiveSpot", "_woundEffectivenss", "_mostEffectiveInjury", "_impact", "_exit", "_specificClass", "_classID", "_effectivenessFound", "_className", "_hitPoints", "_hitSelections", "_point", "_woundTreatmentConfig"]; -_target = _this select 0; -_bandage = _this select 1; -_selectionName = _this select 2; -_specificClass = if (count _this > 3) then {_this select 3} else { -1 }; +private ["_openWounds", "_config", "_effectiveness","_mostEffectiveInjury", "_mostEffectiveSpot", "_woundEffectivenss", "_mostEffectiveInjury", "_impact", "_exit", "_classID", "_effectivenessFound", "_className", "_hitPoints", "_hitSelections", "_point", "_woundTreatmentConfig"]; +params ["_target", "_bandage", "_selectionName", ["_specificClass", -1]]; // Ensure it is a valid bodypart _part = [_selectionName] call FUNC(selectionNameToNumber); -if (_part < 0) exitwith {}; +if (_part < 0) exitwith {false}; // Get the open wounds for this unit _openWounds = _target getvariable [QGVAR(openWounds), []]; -if (count _openWounds == 0) exitwith {}; // nothing to do here! +if (count _openWounds == 0) exitwith {false}; // nothing to do here! // Get the default effectiveness for the used bandage _config = (ConfigFile >> "ACE_Medical_Advanced" >> "Treatment" >> "Bandaging"); @@ -43,10 +40,10 @@ _effectivenessFound = -1; _mostEffectiveInjury = _openWounds select 0; _exit = false; { + params ["", "_classID", "_partX"]; // Only parse injuries that are for the selected bodypart. - if (_x select 2 == _part) then { + if (_partX == _part) then { _woundEffectivenss = _effectiveness; - _classID = (_x select 1); // Select the classname from the wound classname storage _className = GVAR(woundClassNames) select _classID; @@ -74,7 +71,7 @@ _exit = false; }; }; if (_exit) exitwith {}; -}foreach _openWounds; +} foreach _openWounds; if (_effectivenessFound == -1) exitwith {}; // Seems everything is patched up on this body part already.. diff --git a/addons/medical/functions/fnc_treatmentAdvanced_fullHeal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_fullHeal.sqf index 37627a8c5d..64ce319341 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_fullHeal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_fullHeal.sqf @@ -10,12 +10,7 @@ #include "script_component.hpp" -private ["_target", "_caller", "_selectionName", "_className", "_items"]; -_caller = _this select 0; -_target = _this select 1; -_selectionName = _this select 2; -_className = _this select 3; -_items = _this select 4; +params ["_target", "_caller", "_selectionName", "_className", "_items"]; // TODO replace by event system [[_caller, _target], QUOTE(DFUNC(treatmentAdvanced_fullHealLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ diff --git a/addons/medical/functions/fnc_treatmentAdvanced_fullHealLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_fullHealLocal.sqf index df7594921d..ed5eb0858d 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_fullHealLocal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_fullHealLocal.sqf @@ -10,9 +10,8 @@ #include "script_component.hpp" -private ["_target", "_caller", "_allUsedMedication"]; -_caller = _this select 0; -_target = _this select 1; +private "_allUsedMedication"; +params ["_caller", "_target"]; if (alive _target) exitwith { @@ -64,7 +63,7 @@ if (alive _target) exitwith { _allUsedMedication = _target getVariable [QGVAR(allUsedMedication), []]; { _target setvariable [_x select 0, nil]; - }foreach _allUsedMedication; + } foreach _allUsedMedication; // Resetting damage _target setDamage 0; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_fullHealTreatmentTime.sqf b/addons/medical/functions/fnc_treatmentAdvanced_fullHealTreatmentTime.sqf index 108bdd4a5d..a0539948ea 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_fullHealTreatmentTime.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_fullHealTreatmentTime.sqf @@ -15,12 +15,12 @@ */ #include "script_component.hpp" -private ["_target", "_totalDamage"]; -_target = _this; +private "_totalDamage"; + _totalDamage = 0; { _totalDamage = _totalDamage + _x; -} forEach (_target getVariable [QGVAR(bodyPartStatus), []]); +} forEach (_this getVariable [QGVAR(bodyPartStatus), []]); (10 max (_totalDamage * 10) min 120) diff --git a/addons/medical/functions/fnc_treatmentAdvanced_medication.sqf b/addons/medical/functions/fnc_treatmentAdvanced_medication.sqf index 0b401a73cc..b5b0af1401 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_medication.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_medication.sqf @@ -17,12 +17,7 @@ #include "script_component.hpp" -private ["_caller", "_target", "_selectionName", "_className", "_items"]; -_caller = _this select 0; -_target = _this select 1; -_selectionName = _this select 2; -_className = _this select 3; -_items = _this select 4; +params ["_caller", "_target", "_selectionName", "_className", "_items"]; [[_target, _className], QUOTE(DFUNC(treatmentAdvanced_medicationLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ @@ -32,7 +27,7 @@ _items = _this select 4; [_target, "activity", LSTRING(Activity_usedItem), [[_caller] call EFUNC(common,getName), getText (configFile >> "CfgWeapons" >> _x >> "displayName")]] call FUNC(addToLog); [_target, "activity_view", LSTRING(Activity_usedItem), [[_caller] call EFUNC(common,getName), getText (configFile >> "CfgWeapons" >> _x >> "displayName")]] call FUNC(addToLog); }; -}foreach _items; +} foreach _items; true; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_medicationLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_medicationLocal.sqf index c4ba840398..00a4fae8d9 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_medicationLocal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_medicationLocal.sqf @@ -15,9 +15,8 @@ #include "script_component.hpp" -private ["_target", "_className", "_currentInSystem", "_medicationConfig", "_painReduce", "_hrIncreaseLow", "_hrIncreaseNorm", "_hrIncreaseHigh", "_maxDose", "_inCompatableMedication", "_timeInSystem", "_heartRate", "_pain", "_resistance", "_hrCallback", "_varName", "_viscosityChange"]; -_target = _this select 0; -_className = _this select 1; +private ["_currentInSystem", "_medicationConfig", "_painReduce", "_hrIncreaseLow", "_hrIncreaseNorm", "_hrIncreaseHigh", "_maxDose", "_inCompatableMedication", "_timeInSystem", "_heartRate", "_pain", "_resistance", "_hrCallback", "_varName", "_viscosityChange"]; +params ["_target", "_className"]; // We have added a new dose of this medication to our system, so let's increase it _varName = format[QGVAR(%1_inSystem), _className]; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_surgicalKit_onProgress.sqf b/addons/medical/functions/fnc_treatmentAdvanced_surgicalKit_onProgress.sqf index c0e1037027..aadcb40d45 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_surgicalKit_onProgress.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_surgicalKit_onProgress.sqf @@ -1,23 +1,30 @@ /* * Author: BaerMitUmlaut - * Handles treatment via surgical kit per frame. + * Handles treatment via surgical kit per frame + * + * Arguments: + * 0: Arguments + * 0: Caller + * 1: Target + * 1: Elapsed Time + * 2: Total Time + * + * Return Value: + * Succesful treatment started * * Public: No */ - #include "script_component.hpp" -private ["_args", "_target", "_caller", "_elapsedTime", "_totalTime", "_bandagedWounds"]; -_args = _this select 0; -_caller = _args select 0; -_target = _args select 1; -_elapsedTime = _this select 1; -_totalTime = _this select 2; + +private "_bandagedWounds"; +params ["_args", "_elapsedTime", "_totalTime"]; +_args params ["_caller", "_target"]; _bandagedWounds = _target getVariable [QGVAR(bandagedWounds), []]; //In case two people stitch up one patient and the last wound has already been closed we can stop already -if (count _bandagedWounds == 0) exitWith {false}; +if (count _bandagedWounds == 0) exitWith { false }; //Has enough time elapsed that we can close another wound? if ((_totalTime - _elapsedTime) <= (((count _bandagedWounds) - 1) * 5)) then { @@ -25,4 +32,4 @@ if ((_totalTime - _elapsedTime) <= (((count _bandagedWounds) - 1) * 5)) then { _target setVariable [QGVAR(bandagedWounds), _bandagedWounds, true]; }; -true \ No newline at end of file +true diff --git a/addons/medical/functions/fnc_treatmentBasic_bandage.sqf b/addons/medical/functions/fnc_treatmentBasic_bandage.sqf index 75b0b6bfdd..c0ebc35472 100644 --- a/addons/medical/functions/fnc_treatmentBasic_bandage.sqf +++ b/addons/medical/functions/fnc_treatmentBasic_bandage.sqf @@ -9,7 +9,7 @@ * 3: Treatment classname * * Return Value: - * nil + * None * * Public: No */ @@ -17,11 +17,8 @@ #include "script_component.hpp" #define BANDAGEHEAL 0.8 -private ["_caller", "_target","_selection","_className","_target","_hitSelections","_hitPoints","_point", "_damage"]; -_caller = _this select 0; -_target = _this select 1; -_selection = _this select 2; -_className = _this select 3; +private ["_hitSelections", "_hitPoints", "_point", "_damage"]; +params ["_caller", "_target", "_selection", "_className"]; if (_selection == "all") then { _target setDamage ((damage _target - BANDAGEHEAL) max 0); diff --git a/addons/medical/functions/fnc_treatmentBasic_bloodbag.sqf b/addons/medical/functions/fnc_treatmentBasic_bloodbag.sqf index 7cfb65a909..5700d351cb 100644 --- a/addons/medical/functions/fnc_treatmentBasic_bloodbag.sqf +++ b/addons/medical/functions/fnc_treatmentBasic_bloodbag.sqf @@ -9,16 +9,13 @@ * 3: Treatment classname * * Return Value: - * nil + * None * * Public: No */ #include "script_component.hpp" -private ["_caller", "_target", "_treatmentClassname"]; -_caller = _this select 0; -_target = _this select 1; -_treatmentClassname = _this select 3; +params ["_caller", "_target", "_treatmentClassname"]; [[_target, _treatmentClassname], QUOTE(DFUNC(treatmentBasic_bloodbagLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ diff --git a/addons/medical/functions/fnc_treatmentBasic_bloodbagLocal.sqf b/addons/medical/functions/fnc_treatmentBasic_bloodbagLocal.sqf index 08057c9492..64ba6e031b 100644 --- a/addons/medical/functions/fnc_treatmentBasic_bloodbagLocal.sqf +++ b/addons/medical/functions/fnc_treatmentBasic_bloodbagLocal.sqf @@ -15,7 +15,7 @@ #include "script_component.hpp" #define BLOODBAGHEAL 70 -PARAMS_2(_target,_treatmentClassname); +params ["_target", "_treatmentClassname"]; private ["_blood", "_bloodAdded"]; diff --git a/addons/medical/functions/fnc_treatmentBasic_epipen.sqf b/addons/medical/functions/fnc_treatmentBasic_epipen.sqf index bdfb95fb2a..d387e91f89 100644 --- a/addons/medical/functions/fnc_treatmentBasic_epipen.sqf +++ b/addons/medical/functions/fnc_treatmentBasic_epipen.sqf @@ -9,17 +9,13 @@ * 3: Treatment classname * * Return Value: - * nil + * None * * Public: No */ - #include "script_component.hpp" -private ["_caller", "_target","_className"]; -_caller = _this select 0; -_target = _this select 1; -_className = _this select 3; +params ["_caller", "_target","_className"]; [_target, false] call FUNC(setUnconscious); diff --git a/addons/medical/functions/fnc_treatmentBasic_morphine.sqf b/addons/medical/functions/fnc_treatmentBasic_morphine.sqf index 048b314781..87559d0dd2 100644 --- a/addons/medical/functions/fnc_treatmentBasic_morphine.sqf +++ b/addons/medical/functions/fnc_treatmentBasic_morphine.sqf @@ -9,7 +9,7 @@ * 3: Treatment classname * * Return Value: - * nil + * None * * Public: No */ @@ -17,8 +17,6 @@ #include "script_component.hpp" #define MORPHINEHEAL 0.4 -private ["_caller", "_target"]; -_caller = _this select 0; -_target = _this select 1; +params ["_caller", "_target"]; [[_target], QUOTE(DFUNC(treatmentBasic_morphineLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ diff --git a/addons/medical/functions/fnc_treatmentBasic_morphineLocal.sqf b/addons/medical/functions/fnc_treatmentBasic_morphineLocal.sqf index 9dddf743e2..780196819b 100644 --- a/addons/medical/functions/fnc_treatmentBasic_morphineLocal.sqf +++ b/addons/medical/functions/fnc_treatmentBasic_morphineLocal.sqf @@ -7,7 +7,7 @@ * 1: The patient * * Return Value: - * nil + * None * * Public: No */ @@ -15,8 +15,8 @@ #include "script_component.hpp" #define MORPHINEHEAL 0.4 -private ["_target", "_morphine", "_pain"]; -_target = _this select 0; +private ["_morphine", "_pain"]; +params ["_target"]; // reduce pain, pain sensitivity _morphine = ((_target getVariable [QGVAR(morphine), 0]) + MORPHINEHEAL) min 1; diff --git a/addons/medical/functions/fnc_treatmentIV.sqf b/addons/medical/functions/fnc_treatmentIV.sqf index e0c4d20ed6..2a7bbc6adf 100644 --- a/addons/medical/functions/fnc_treatmentIV.sqf +++ b/addons/medical/functions/fnc_treatmentIV.sqf @@ -8,26 +8,23 @@ * 2: SelectionName * 3: Treatment classname * - * * Return Value: - * + * Succesful treatment started * * Public: Yes */ #include "script_component.hpp" -private ["_caller", "_target", "_selectionName", "_className", "_items", "_removeItem"]; -_caller = _this select 0; -_target = _this select 1; -_selectionName = _this select 2; -_className = _this select 3; -_items = _this select 4; +private "_removeItem"; +params ["_caller", "_target", "_selectionName", "_className", "_items"]; -if (count _items == 0) exitwith {}; +if (count _items == 0) exitwith {false}; _removeItem = _items select 0; [[_target, _className], QUOTE(DFUNC(treatmentIVLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ [_target, _removeItem] call FUNC(addToTriageCard); [_target, "activity", LSTRING(Activity_gaveIV), [[_caller] call EFUNC(common,getName)]] call FUNC(addToLog); [_target, "activity_view", LSTRING(Activity_gaveIV), [[_caller] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message + +true diff --git a/addons/medical/functions/fnc_treatmentIVLocal.sqf b/addons/medical/functions/fnc_treatmentIVLocal.sqf index 9abb5fda2f..37cba2ad1b 100644 --- a/addons/medical/functions/fnc_treatmentIVLocal.sqf +++ b/addons/medical/functions/fnc_treatmentIVLocal.sqf @@ -8,16 +8,15 @@ * * * Return Value: - * nil + * None * * Public: Yes */ #include "script_component.hpp" -private ["_target", "_treatmentClassname", "_config", "_volumeAdded", "_typeOf", "_varName", "_bloodVolume"]; -_target = _this select 0; -_treatmentClassname = _this select 1; +private ["_config", "_volumeAdded", "_typeOf", "_varName", "_bloodVolume"]; +params ["_target", "_treatmentClassname"]; _bloodVolume = _target getvariable [QGVAR(bloodVolume), 100]; if (_bloodVolume >= 100) exitwith {}; diff --git a/addons/medical/functions/fnc_treatmentTourniquet.sqf b/addons/medical/functions/fnc_treatmentTourniquet.sqf index 148ed06252..2a169a50d0 100644 --- a/addons/medical/functions/fnc_treatmentTourniquet.sqf +++ b/addons/medical/functions/fnc_treatmentTourniquet.sqf @@ -10,7 +10,7 @@ * * * Return Value: - * + * Succesful treatment started * * Public: No */ @@ -24,7 +24,7 @@ _selectionName = _this select 2; _className = _this select 3; _items = _this select 4; -if (count _items == 0) exitwith {}; +if (count _items == 0) exitwith {false}; _part = [_selectionName] call FUNC(selectionNameToNumber); if (_part == 0 || _part == 1) exitwith { @@ -47,4 +47,4 @@ _removeItem = _items select 0; [_target, "activity_view", LSTRING(Activity_appliedTourniquet), [[_caller] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message -true; +true diff --git a/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf b/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf index ceabb80587..fb7394866e 100644 --- a/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf +++ b/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf @@ -7,16 +7,14 @@ * 1: Item used classname * * Return Value: - * nil + * None * * Public: No */ #include "script_component.hpp" -private ["_target", "_tourniquetItem", "_part", "_tourniquets", "_applyingTo", "_selectionName"]; -_target = _this select 0; -_tourniquetItem = _this select 1; -_selectionName = _this select 2; +private ["_tourniquetItem", "_part", "_applyingTo"]; +params ["_target", "_tourniquets", "_selectionName"]; [_target] call FUNC(addToInjuredCollection); @@ -29,24 +27,21 @@ _tourniquets set[_part, _applyingTo]; _target setvariable [QGVAR(tourniquets), _tourniquets, true]; [{ - private ["_args","_target","_applyingTo","_part", "_tourniquets", "_time"]; - _args = _this select 0; - _target = _args select 0; - _applyingTo = _args select 1; - _part = _args select 2; - _time = _args select 3; + params ["_args", "_idPFH"]; + _args params ["_target", "_applyingTo", "_part", "_time"]; + if (!alive _target) exitwith { - [(_this select 1)] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; }; _tourniquets = _target getvariable [QGVAR(tourniquets), [0,0,0,0,0,0]]; if !((_tourniquets select _part) == _applyingTo) exitwith { // Tourniquet has been removed - [(_this select 1)] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; }; if (ACE_time - _time > 120) then { _target setvariable [QGVAR(pain), (_target getvariable [QGVAR(pain), 0]) + 0.005]; }; }, 5, [_target, _applyingTo, _part, ACE_time] ] call CBA_fnc_addPerFrameHandler; -true; +true diff --git a/addons/medical/functions/fnc_treatment_failure.sqf b/addons/medical/functions/fnc_treatment_failure.sqf index 8a5d784301..483a8923eb 100644 --- a/addons/medical/functions/fnc_treatment_failure.sqf +++ b/addons/medical/functions/fnc_treatment_failure.sqf @@ -10,21 +10,16 @@ * 4: Items available > * * Return Value: - * nil + * None * * Public: No */ #include "script_component.hpp" -private ["_args", "_caller", "_target","_selectionName","_className","_config","_callback", "_usersOfItems", "_weaponSelect", "_lastAnim"]; - -_args = _this select 0; -_caller = _args select 0; -_target = _args select 1; -_selectionName = _args select 2; -_className = _args select 3; -_usersOfItems = _args select 5; +private ["_config", "_callback", "_weaponSelect", "_lastAnim"]; +params ["_args"]; +_args params ["_caller", "_target", "_selectionName", "_className", "_usersOfItems"]; if (primaryWeapon _caller == "ACE_FakePrimaryWeapon") then { _caller removeWeapon "ACE_FakePrimaryWeapon"; @@ -33,14 +28,15 @@ if (vehicle _caller == _caller) then { _lastAnim = _caller getvariable [QGVAR(treatmentPrevAnimCaller), ""]; //Don't play another medic animation (when player is rapidily treating) TRACE_2("Reseting to old animation", animationState player, _lastAnim); - switch (true) do { - case (_lastAnim == "AinvPknlMstpSlayWrflDnon_medic"): {_lastAnim = "AmovPknlMstpSrasWrflDnon"}; - case (_lastAnim == "AinvPpneMstpSlayWrflDnon_medic"): {_lastAnim = "AmovPpneMstpSrasWrflDnon"}; - case (_lastAnim == "AinvPknlMstpSlayWnonDnon_medic"): {_lastAnim = "AmovPknlMstpSnonWnonDnon"}; - case (_lastAnim == "AinvPpneMstpSlayWpstDnon_medic"): {_lastAnim = "AinvPpneMstpSlayWpstDnon"}; - case (_lastAnim == "AinvPknlMstpSlayWpstDnon_medic"): {_lastAnim = "AmovPknlMstpSrasWpstDnon"}; + switch _lastAnim do { + case "AinvPknlMstpSlayWrflDnon_medic": {_lastAnim = "AmovPknlMstpSrasWrflDnon"}; + case "AinvPpneMstpSlayWrflDnon_medic": {_lastAnim = "AmovPpneMstpSrasWrflDnon"}; + case "AinvPknlMstpSlayWnonDnon_medic": {_lastAnim = "AmovPknlMstpSnonWnonDnon"}; + case "AinvPpneMstpSlayWpstDnon_medic": {_lastAnim = "AinvPpneMstpSlayWpstDnon"}; + case "AinvPknlMstpSlayWpstDnon_medic": {_lastAnim = "AmovPknlMstpSrasWpstDnon"}; }; [_caller, _lastAnim, 1] call EFUNC(common,doAnimation); + [_caller, _lastAnim, 1] call EFUNC(common,doAnimation); }; _caller setvariable [QGVAR(treatmentPrevAnimCaller), nil]; @@ -57,8 +53,9 @@ if ((_weaponSelect params [["_previousWeapon", ""]]) && {(_previousWeapon != "") }; { - (_x select 0) addItem (_x select 1); -}foreach _usersOfItems; + _x params ["_unit", "_item"]; + _unit addItem _item; +} foreach _usersOfItems; // Record specific callback _config = (configFile >> "ACE_Medical_Actions" >> "Basic" >> _className); @@ -67,10 +64,10 @@ if (GVAR(level) >= 2) then { }; _callback = getText (_config >> "callbackFailure"); -if (isNil _callback) then { - _callback = compile _callback; +_callback = if (isNil _callback) then { + compile _callback } else { - _callback = missionNamespace getvariable _callback; + missionNamespace getvariable _callback }; _args call _callback; diff --git a/addons/medical/functions/fnc_treatment_success.sqf b/addons/medical/functions/fnc_treatment_success.sqf index f5cb9baf71..0ba34d5a85 100644 --- a/addons/medical/functions/fnc_treatment_success.sqf +++ b/addons/medical/functions/fnc_treatment_success.sqf @@ -10,19 +10,16 @@ * 4: Items available > * * Return Value: - * nil + * None * * Public: No */ #include "script_component.hpp" -private ["_args", "_caller", "_target","_selectionName","_className","_config","_callback", "_weaponSelect", "_lastAnim"]; -_args = _this select 0; -_caller = _args select 0; -_target = _args select 1; -_selectionName = _args select 2; -_className = _args select 3; +private ["_config", "_callback", "_weaponSelect", "_lastAnim"]; +params ["_args"]; +_args params ["_caller", "_target","_selectionName","_className"]; if (primaryWeapon _caller == "ACE_FakePrimaryWeapon") then { _caller removeWeapon "ACE_FakePrimaryWeapon"; @@ -31,12 +28,12 @@ if (vehicle _caller == _caller) then { _lastAnim = _caller getvariable [QGVAR(treatmentPrevAnimCaller), ""]; //Don't play another medic animation (when player is rapidily treating) TRACE_2("Reseting to old animation", animationState player, _lastAnim); - switch (true) do { - case (_lastAnim == "AinvPknlMstpSlayWrflDnon_medic"): {_lastAnim = "AmovPknlMstpSrasWrflDnon"}; - case (_lastAnim == "AinvPpneMstpSlayWrflDnon_medic"): {_lastAnim = "AmovPpneMstpSrasWrflDnon"}; - case (_lastAnim == "AinvPknlMstpSlayWnonDnon_medic"): {_lastAnim = "AmovPknlMstpSnonWnonDnon"}; - case (_lastAnim == "AinvPpneMstpSlayWpstDnon_medic"): {_lastAnim = "AinvPpneMstpSlayWpstDnon"}; - case (_lastAnim == "AinvPknlMstpSlayWpstDnon_medic"): {_lastAnim = "AmovPknlMstpSrasWpstDnon"}; + switch _lastAnim do { + case "AinvPknlMstpSlayWrflDnon_medic": {_lastAnim = "AmovPknlMstpSrasWrflDnon"}; + case "AinvPpneMstpSlayWrflDnon_medic": {_lastAnim = "AmovPpneMstpSrasWrflDnon"}; + case "AinvPknlMstpSlayWnonDnon_medic": {_lastAnim = "AmovPknlMstpSnonWnonDnon"}; + case "AinvPpneMstpSlayWpstDnon_medic": {_lastAnim = "AinvPpneMstpSlayWpstDnon"}; + case "AinvPknlMstpSlayWpstDnon_medic": {_lastAnim = "AmovPknlMstpSrasWpstDnon"}; }; [_caller, _lastAnim, 1] call EFUNC(common,doAnimation); }; diff --git a/addons/medical/functions/fnc_unconsciousPFH.sqf b/addons/medical/functions/fnc_unconsciousPFH.sqf index c66f6863c8..f230b9dbf8 100644 --- a/addons/medical/functions/fnc_unconsciousPFH.sqf +++ b/addons/medical/functions/fnc_unconsciousPFH.sqf @@ -13,21 +13,15 @@ * 1: PFEH ID * * ReturnValue: - * nil + * None * * Public: yes */ - #include "script_component.hpp" private ["_unit", "_minWaitingTime", "_slotInfo", "_hasMovedOut", "_parachuteCheck", "_args", "_originalPos", "_startingTime", "_awakeInVehicleAnimation", "_oldVehicleAnimation", "_vehicle"]; -_args = _this select 0; -_unit = _args select 0; -_originalPos = _args select 1; -_startingTime = _args select 2; -_minWaitingTime = _args select 3; -_hasMovedOut = _args select 4; -_parachuteCheck = _args select 5; +params ["_args", "_idPFH"]; +_args params ["_unit", "_originalPos", "_startingTime", "_minWaitingTime", "_hasMovedOut", "_parachuteCheck"]; if (!alive _unit) exitwith { if ("ACE_FakePrimaryWeapon" in (weapons _unit)) then { @@ -45,7 +39,7 @@ if (!alive _unit) exitwith { [_unit, "isUnconscious"] call EFUNC(common,unmuteUnit); ["medical_onUnconscious", [_unit, false]] call EFUNC(common,globalEvent); - [(_this select 1)] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; }; // In case the unit is no longer in an unconscious state, we are going to check if we can already reset the animation @@ -57,7 +51,7 @@ if !(_unit getvariable ["ACE_isUnconscious",false]) exitwith { TRACE_1("Removing fake weapon [on wakeup]",_unit); _unit removeWeapon "ACE_FakePrimaryWeapon"; }; - + if (vehicle _unit == _unit) then { if (animationState _unit == "AinjPpneMstpSnonWrflDnon") then { [_unit,"AinjPpneMstpSnonWrflDnon_rolltofront", 2] call EFUNC(common,doAnimation); @@ -99,7 +93,7 @@ if !(_unit getvariable ["ACE_isUnconscious",false]) exitwith { ["medical_onUnconscious", [_unit, false]] call EFUNC(common,globalEvent); // EXIT PFH - [(_this select 1)] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; }; if (!_hasMovedOut) then { // Reset the unit back to the previous captive state. @@ -132,7 +126,7 @@ if (_parachuteCheck) then { if (!local _unit) exitwith { _args set [3, _minWaitingTime - (ACE_time - _startingTime)]; _unit setvariable [QGVAR(unconsciousArguments), _args, true]; - [(_this select 1)] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; }; // Ensure we are waiting at least a minimum period before checking if we can wake up the unit again, allows for temp knock outs diff --git a/addons/medical/functions/fnc_useItem.sqf b/addons/medical/functions/fnc_useItem.sqf index 750ea0452f..770d8b6ea7 100644 --- a/addons/medical/functions/fnc_useItem.sqf +++ b/addons/medical/functions/fnc_useItem.sqf @@ -8,17 +8,16 @@ * 2: Item * * ReturnValue: - * + * 0: success + * 1: Unit * * Public: Yes */ #include "script_component.hpp" -private ["_medic", "_patient", "_item", "_return","_crew"]; -_medic = _this select 0; -_patient = _this select 1; -_item = _this select 2; +private ["_return","_crew"]; +params ["_medic", "_patient", "_item"]; if (isnil QGVAR(setting_allowSharedEquipment)) then { GVAR(setting_allowSharedEquipment) = true; @@ -42,7 +41,7 @@ if ([vehicle _medic] call FUNC(isMedicalVehicle) && {vehicle _medic != _medic}) _return = [true, _x]; [[_x, _item], QUOTE(EFUNC(common,useItem)), _x] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ }; - }foreach _crew; + } foreach _crew; }; -_return; +_return diff --git a/addons/medical/functions/fnc_useItems.sqf b/addons/medical/functions/fnc_useItems.sqf index fbaa324022..0d937c0938 100644 --- a/addons/medical/functions/fnc_useItems.sqf +++ b/addons/medical/functions/fnc_useItems.sqf @@ -8,7 +8,7 @@ * 2: Items > * * ReturnValue: - * + * None * * Public: Yes */ @@ -16,9 +16,7 @@ #include "script_component.hpp" private ["_medic", "_patient", "_items", "_itemUsedInfo", "_itemsUsedBy"]; -_medic = _this select 0; -_patient = _this select 1; -_items = _this select 2; +params ["_medic", "_patient", "_items"]; _itemsUsedBy = []; { @@ -27,7 +25,7 @@ _itemsUsedBy = []; { _itemUsedInfo = [_medic, _patient, _x] call FUNC(useItem); if (_itemUsedInfo select 0) exitwith { _itemsUsedBy pushback [(_itemUsedInfo select 1), _x]}; - }foreach _x; + } foreach _x; }; // handle required item @@ -35,6 +33,6 @@ _itemsUsedBy = []; _itemUsedInfo = [_medic, _patient, _x] call FUNC(useItem); if (_itemUsedInfo select 0) exitwith { _itemsUsedBy pushback [(_itemUsedInfo select 1), _x]}; }; -}foreach _items; +} foreach _items; [count _items == count _itemsUsedBy, _itemsUsedBy]; From fab4c6a67f8a462684e77e45cfbde79750e52f0e Mon Sep 17 00:00:00 2001 From: jokoho48 Date: Sat, 22 Aug 2015 21:32:36 +0200 Subject: [PATCH 016/170] fix Spelling Issues --- addons/medical/functions/fnc_actionLoadUnit.sqf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/medical/functions/fnc_actionLoadUnit.sqf b/addons/medical/functions/fnc_actionLoadUnit.sqf index 0340da2e20..9dc711a5a7 100644 --- a/addons/medical/functions/fnc_actionLoadUnit.sqf +++ b/addons/medical/functions/fnc_actionLoadUnit.sqf @@ -21,10 +21,10 @@ if ([_target] call EFUNC(common,isAwake)) exitwith { ["displayTextStructured", [_caller], [[localize LSTRING(CanNotLoaded), [_target] call EFUNC(common,getName)], 1.5, _caller]] call EFUNC(common,targetEvent); }; if ([_target] call FUNC(isBeingCarried)) then { - ["_caller", "_target"] call EFUNC(dragging,dropObject_carry); + [_caller, _target] call EFUNC(dragging,dropObject_carry); }; if ([_target] call FUNC(isBeingDragged)) then { - ["_caller", "_target"] call EFUNC(dragging,dropObject); + [_caller, _target] call EFUNC(dragging,dropObject); }; -_vehicle = ["_caller", "_target"] call EFUNC(common,loadPerson); +_vehicle = [_caller, _target] call EFUNC(common,loadPerson); From 260b048da4e179923b537a9445e0b9ac36753a90 Mon Sep 17 00:00:00 2001 From: jokoho48 Date: Sun, 23 Aug 2015 14:13:55 +0200 Subject: [PATCH 017/170] some more Improvements --- addons/medical/functions/fnc_actionCheckResponse.sqf | 6 +----- addons/medical/functions/fnc_setHitPointDamage.sqf | 4 ++-- addons/medical/functions/fnc_treatment_failure.sqf | 12 ++++++------ addons/medical/functions/fnc_treatment_success.sqf | 12 ++++++------ 4 files changed, 15 insertions(+), 19 deletions(-) diff --git a/addons/medical/functions/fnc_actionCheckResponse.sqf b/addons/medical/functions/fnc_actionCheckResponse.sqf index 7db4fe0a5d..6910545a9d 100644 --- a/addons/medical/functions/fnc_actionCheckResponse.sqf +++ b/addons/medical/functions/fnc_actionCheckResponse.sqf @@ -17,11 +17,7 @@ private ["_output"]; params ["_caller", "_target"]; -_output = if ([_target] call EFUNC(common,isAwake)) then { - LSTRING(Check_Response_Responsive) -} else { - LSTRING(Check_Response_Unresponsive) -}; +_output = [LSTRING(Check_Response_Unresponsive), LSTRING(Check_Response_Responsive)] select ([_target] call EFUNC(common,isAwake)); ["displayTextStructured", [_caller], [[_output, [_target] call EFUNC(common,getName)], 2, _caller]] call EFUNC(common,targetEvent); diff --git a/addons/medical/functions/fnc_setHitPointDamage.sqf b/addons/medical/functions/fnc_setHitPointDamage.sqf index 1713c02243..f8698a7fe0 100644 --- a/addons/medical/functions/fnc_setHitPointDamage.sqf +++ b/addons/medical/functions/fnc_setHitPointDamage.sqf @@ -22,7 +22,7 @@ #define ARMDAMAGETRESHOLD2 1.7 private ["_unit", "_selection", "_damage", "_selections", "_damages", "_damageOld", "_damageSumOld", "_damageNew", "_damageSumNew", "_damageFinal", "_armdamage", "_legdamage"]; -params ["_unit", "_selection", "_damage", ["_disalbed", false]]; +params ["_unit", "_selection", "_damage", ["_disabled", false]]; // Unit isn't local, give function to machine where it is. if !(local _unit) exitWith { @@ -30,7 +30,7 @@ if !(local _unit) exitWith { }; // Check if overall damage adjustment is disabled -if (_disalbed) exitWith { +if (_disabled) exitWith { _unit setHitPointDamage [_selection, _damage]; }; diff --git a/addons/medical/functions/fnc_treatment_failure.sqf b/addons/medical/functions/fnc_treatment_failure.sqf index 483a8923eb..84526daa88 100644 --- a/addons/medical/functions/fnc_treatment_failure.sqf +++ b/addons/medical/functions/fnc_treatment_failure.sqf @@ -28,12 +28,12 @@ if (vehicle _caller == _caller) then { _lastAnim = _caller getvariable [QGVAR(treatmentPrevAnimCaller), ""]; //Don't play another medic animation (when player is rapidily treating) TRACE_2("Reseting to old animation", animationState player, _lastAnim); - switch _lastAnim do { - case "AinvPknlMstpSlayWrflDnon_medic": {_lastAnim = "AmovPknlMstpSrasWrflDnon"}; - case "AinvPpneMstpSlayWrflDnon_medic": {_lastAnim = "AmovPpneMstpSrasWrflDnon"}; - case "AinvPknlMstpSlayWnonDnon_medic": {_lastAnim = "AmovPknlMstpSnonWnonDnon"}; - case "AinvPpneMstpSlayWpstDnon_medic": {_lastAnim = "AinvPpneMstpSlayWpstDnon"}; - case "AinvPknlMstpSlayWpstDnon_medic": {_lastAnim = "AmovPknlMstpSrasWpstDnon"}; + switch (toLower _lastAnim) do { + case "ainvpknlmstpslaywrfldnon_medic": {_lastAnim = "AmovPknlMstpSrasWrflDnon"}; + case "ainvppnemstpslaywrfldnon_medic": {_lastAnim = "AmovPpneMstpSrasWrflDnon"}; + case "ainvpknlmstpslaywnondnon_medic": {_lastAnim = "AmovPknlMstpSnonWnonDnon"}; + case "ainvppnemstpslaywpstdnon_medic": {_lastAnim = "AinvPpneMstpSlayWpstDnon"}; + case "ainvpknlmstpslaywpstdnon_medic": {_lastAnim = "AmovPknlMstpSrasWpstDnon"}; }; [_caller, _lastAnim, 1] call EFUNC(common,doAnimation); [_caller, _lastAnim, 1] call EFUNC(common,doAnimation); diff --git a/addons/medical/functions/fnc_treatment_success.sqf b/addons/medical/functions/fnc_treatment_success.sqf index 0ba34d5a85..f21f027ee7 100644 --- a/addons/medical/functions/fnc_treatment_success.sqf +++ b/addons/medical/functions/fnc_treatment_success.sqf @@ -28,12 +28,12 @@ if (vehicle _caller == _caller) then { _lastAnim = _caller getvariable [QGVAR(treatmentPrevAnimCaller), ""]; //Don't play another medic animation (when player is rapidily treating) TRACE_2("Reseting to old animation", animationState player, _lastAnim); - switch _lastAnim do { - case "AinvPknlMstpSlayWrflDnon_medic": {_lastAnim = "AmovPknlMstpSrasWrflDnon"}; - case "AinvPpneMstpSlayWrflDnon_medic": {_lastAnim = "AmovPpneMstpSrasWrflDnon"}; - case "AinvPknlMstpSlayWnonDnon_medic": {_lastAnim = "AmovPknlMstpSnonWnonDnon"}; - case "AinvPpneMstpSlayWpstDnon_medic": {_lastAnim = "AinvPpneMstpSlayWpstDnon"}; - case "AinvPknlMstpSlayWpstDnon_medic": {_lastAnim = "AmovPknlMstpSrasWpstDnon"}; + switch (tolower _lastAnim) do { + case "ainvpknlmstpslaywrfldnon_medic": {_lastAnim = "AmovPknlMstpSrasWrflDnon"}; + case "ainvppnemstpslaywrfldnon_medic": {_lastAnim = "AmovPpneMstpSrasWrflDnon"}; + case "ainvpknlmstpslaywnondnon_medic": {_lastAnim = "AmovPknlMstpSnonWnonDnon"}; + case "ainvppnemstpslaywpstdnon_medic": {_lastAnim = "AinvPpneMstpSlayWpstDnon"}; + case "ainvpknlmstpslaywpstdnon_medic": {_lastAnim = "AmovPknlMstpSrasWpstDnon"}; }; [_caller, _lastAnim, 1] call EFUNC(common,doAnimation); }; From ca1b47beb5e52b3c35e0073d0ae2227c977d8a24 Mon Sep 17 00:00:00 2001 From: jonpas Date: Sun, 23 Aug 2015 19:54:55 +0200 Subject: [PATCH 018/170] Use correct module group --- addons/repair/CfgVehicles.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/repair/CfgVehicles.hpp b/addons/repair/CfgVehicles.hpp index 53f1aa7a46..d0f3645678 100644 --- a/addons/repair/CfgVehicles.hpp +++ b/addons/repair/CfgVehicles.hpp @@ -224,7 +224,7 @@ class CfgVehicles { scope = 2; displayName = CSTRING(AddSpareParts_Module_DisplayName); icon = QUOTE(PATHTOF(ui\Icon_Module_Repair_ca.paa)); - category = "ACE"; + category = "ACE_Logistics"; function = QFUNC(moduleAddSpareParts); functionPriority = 10; isGlobal = 0; From 7f2c91308c59e7ad989d79aca0358aa4f7598c5c Mon Sep 17 00:00:00 2001 From: alganthe Date: Sun, 23 Aug 2015 21:02:37 +0200 Subject: [PATCH 019/170] renamed already existing framework doc renamed already existing framework doc to fit with the rest --- .../{carry-drag.md => dragging-framework.md} | 19 +++++----- ...ion-configuration.md => frag-framework.md} | 2 +- ...dance.md => missile-guidance-framework.md} | 36 +++++++++---------- 3 files changed, 28 insertions(+), 29 deletions(-) rename documentation/framework/{carry-drag.md => dragging-framework.md} (91%) rename documentation/framework/{fragmentation-configuration.md => frag-framework.md} (99%) rename documentation/framework/{advanced-missile-guidance.md => missile-guidance-framework.md} (94%) diff --git a/documentation/framework/carry-drag.md b/documentation/framework/dragging-framework.md similarity index 91% rename from documentation/framework/carry-drag.md rename to documentation/framework/dragging-framework.md index cfa4eb13af..6a15f6f4fe 100644 --- a/documentation/framework/carry-drag.md +++ b/documentation/framework/dragging-framework.md @@ -1,6 +1,6 @@ --- layout: wiki -title: Carry and Drag System +title: Carry and Drag framework description: group: framework order: 5 @@ -9,10 +9,10 @@ parent: wiki ## 1. Config Values -``` +```c++ class CfgVehicles { class MyVehicle { - + ace_dragging_canDrag = 1; // can this object be dragged?; 1 yes, 0 no (0 default) ace_dragging_dragPosition[] = {0,1.2,0} // Offset of the model from the body while dragging, comparable to the offset in attachTo (It's the same actually) @@ -32,7 +32,7 @@ class CfgVehicles { Also note that if the item is too heavy you won't be able to carry / drag it, the mass is also affected by what's inside it.
-To bypass this empty the object and / or use setMass.
+To bypass this empty the object and / or use setMass.
### 2.1 Enabling / disabling dragging @@ -40,7 +40,7 @@ To bypass this empty the object and / or use setMass.
Enable the object to be dragged.
| Arguments | | ---------------| -------- | +--------------| -------- | 0 | Any object (Object) 1: | true to enable dragging, false to disable (Bool) 2:| Position offset for attachTo command (Array, optional; default: [0,0,0]) @@ -52,7 +52,7 @@ Return value: NONE
[foo,true,[0,2,0],45] call ace_dragging_fnc_setDraggable ``` | Arguments | | ---------------| -------- | +--------------| -------- | 0:| foo (my object) 1:| true (dragging is enabled) 2:| `[0,2,0]` (0 meters sideways, 2 meters forward, 0 meters upwards) @@ -64,7 +64,7 @@ Return value: NONE
``` | Arguments | | ---------------| -------- | +--------------| -------- | 0:| bar (object) 1:| false (dragging is disabled) 2:| 3 meters sideways, -2 meters backwards, 2 meters upwards @@ -75,7 +75,7 @@ Return value: NONE
Enable the object to be carried.
| Arguments | | ---------------| -------- | +--------------| -------- | 0 | Any object (Object) 1:| true to enable carrying, false to disable (Bool) 2:| Position offset for attachTo command (Array, optional; default: [0,1,1]) @@ -88,9 +88,8 @@ Return value: NONE
[foo,true,[0,3,1],10] call ace_dragging_fnc_setCarryable ``` | Arguments | | ---------------| -------- | +--------------| -------- | 0:| foo (my object) 1:| true (carrying is enabled) 2:| `[0,2,0]` (0 meters sideways, 3 meters forward, 1 meters upwards) 3:| 10 (the object is rotated by 10°) - diff --git a/documentation/framework/fragmentation-configuration.md b/documentation/framework/frag-framework.md similarity index 99% rename from documentation/framework/fragmentation-configuration.md rename to documentation/framework/frag-framework.md index 876074e6f4..14e55ecac8 100644 --- a/documentation/framework/fragmentation-configuration.md +++ b/documentation/framework/frag-framework.md @@ -1,6 +1,6 @@ --- layout: wiki -title: Fragmentation Configuration +title: Fragmentation framework description: The fragmentation system (ace_frag) in ACE3 is a significant improvement over the fragmentation system in ACE2. group: framework parent: wiki diff --git a/documentation/framework/advanced-missile-guidance.md b/documentation/framework/missile-guidance-framework.md similarity index 94% rename from documentation/framework/advanced-missile-guidance.md rename to documentation/framework/missile-guidance-framework.md index 14f1d1feae..32c4fa7888 100644 --- a/documentation/framework/advanced-missile-guidance.md +++ b/documentation/framework/missile-guidance-framework.md @@ -1,6 +1,6 @@ --- layout: wiki -title: Advanced Missile Guidance +title: Advanced Missile Guidance framework description: The ACE3 Advanced Missile Guidance Framework provides a setup of configuration settings, functions and a execution framework for addon makers to integrate with the missile guidance and targeting mechanisms of ACE3. group: framework order: 5 @@ -11,7 +11,7 @@ parent: wiki The ACE3 Advanced Missile Guidance Framework provides a setup of configuration settings, functions and a execution framework for addon makers to integrate with the missile guidance and targeting mechanisms of ACE3. It also provides for mod makers to create their own custom guidance methods within the framework. -The framework provides all the functionality needed for guidance; from laser locking, target specification and selection, to handling the fired events and tracking and steering the vehicle based on provided parameters. This way, all that needs to be defined in addons is the appropriate CfgAmmo entries for the missile. +The framework provides all the functionality needed for guidance; from laser locking, target specification and selection, to handling the fired events and tracking and steering the vehicle based on provided parameters. This way, all that needs to be defined in addons is the appropriate CfgAmmo entries for the missile. The framework also provides addon makers and scripters with the ability to configure custom seeker types and attack profiles, which are defined below. This allows for complete control of the guidance, locking and flight of a missile at the discretion of the addon maker. @@ -26,18 +26,18 @@ The framework is broken up into 3 major components: Locking Types, Seeker Types ### 2.1 Components #### 2.1.1 Locking Types -Locking types provide the basic functionality of targeting which will be based to a seeker type, providing target aquisition for seekers. This provides the basic functionality for providing pre-determined targets for a seeker, or allowing the seeker to perform its own target aquisition and locking. Additionally, the seeker may reference back into the locking type in order to re-perform target aquisition. +Locking types provide the basic functionality of targeting which will be based to a seeker type, providing target aquisition for seekers. This provides the basic functionality for providing pre-determined targets for a seeker, or allowing the seeker to perform its own target aquisition and locking. Additionally, the seeker may reference back into the locking type in order to re-perform target aquisition. #### 2.1.2 Seeker Types Each seeker is generally assumed to be the logic for the seeker head unit within any given munition. Seekers within this framework provide the basic targeting functionality for the entire framework. The locking type will provide a generic target to the seeker, or the seeker may aquire a target on its own. The seeker then provides a target, either an object or a ASL position, which is then passed further into the framework. This target (or position) should be the actual current target position for the missiles flight. Seekers are required to perform all limitations and checks within their systems, although various limitations have been provided in this framework such as LOS FOV, laser guidance, etc. #### 2.1.3 Attack Profiles -An attack profile adjusts the current target flight location to create the actual flight path of the missile. The attack profile is provided with all parameters of the system, including the returned target of the seeker. Using this information, the attack profile then will adjust the *direct flight target position* to specifically direct where and how the missile shall flight. +An attack profile adjusts the current target flight location to create the actual flight path of the missile. The attack profile is provided with all parameters of the system, including the returned target of the seeker. Using this information, the attack profile then will adjust the *direct flight target position* to specifically direct where and how the missile shall flight. ## 3. How it all ties together -The system is executed in a linear series of calls to each step of the process, and feeding back the return from that step to the next step. Execution is conducted using Locking->Seeker->Profile, iteratively every frame of execution. Flight times are adjusted to accTime values and FPS lag, giving consistent flight. +The system is executed in a linear series of calls to each step of the process, and feeding back the return from that step to the next step. Execution is conducted using Locking->Seeker->Profile, iteratively every frame of execution. Flight times are adjusted to accTime values and FPS lag, giving consistent flight. On each step of execution, a target specification array [targetObj, targetPos] is passed to the locking type, which then will return a possible modified target array. Next, this modified data is passed to the seeker type - which then, in turn, returns a position vector to the current "seeked" target position (ASL). Last, this target position is passed to the attack profile, who then returns an "adjusted attack position (ASL)", which is the location the missile should *currently* be homing on for flight. @@ -46,36 +46,36 @@ In the simplest sense, the entire system provides the flight trajectory of the m ## 4. Adding AMG to a missile ### 4.1 Enabling guidance on Ammo Types -``` +```c++ class CfgAmmo { class MissileBase; class MyMissileType : MissileBase { // Turn off arma crosshair-guidance manualControl = 0; - + // Begin ACE guidance Configs class ace_missileguidance { enabled = 1; - + minDeflection = 0.00025; // Minium flap deflection for guidance maxDeflection = 0.001; // Maximum flap deflection for guidance incDeflection = 0.0005; // The incrmeent in which deflection adjusts. - + canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet modes. All 'recruit' games use vanilla locking - + // Seeker type and settings for munitions defaultSeekerType = "SALH"; seekerTypes[] = { "SALH", "LIDAR", "SARH", "Optic", "Thermal", "GPS", "SACLOS", "MCLOS" }; - + defaultSeekerLockMode = "LOAL"; - seekerLockModes[] = { "LOAL", "LOBL" }; - + seekerLockModes[] = { "LOAL", "LOBL" }; + seekerAngle = 90; // Angle in front of the missile which can be searched seekerAccuracy = 1; // seeker accuracy multiplier - + seekerMinRange = 1; seekerMaxRange = 2500; // Range from the missile which the seeker can visually search - + // Attack profile type selection defaultAttackProfile = "LIN"; attackProfiles[] = { "LIN", "DIR", "MID", "HI" }; @@ -86,13 +86,13 @@ class CfgAmmo { ### 5.1 Adding seeker types and attack profiles -``` +```c++ class ace_missileguidance_attackProfiles{ class MyAttackProfile { name = ""; visualName = ""; description = ""; - + functionName = "my_fnc_doAttackProfile"; }; }; @@ -101,7 +101,7 @@ class ace_missileguidance_seekerTypes { name = ""; visualName = ""; description = ""; - + functionName = "my_fnc_doSeekerType"; }; }; From 4e0fb5020437dcdc4a8a2f6dd27b72955e0235a3 Mon Sep 17 00:00:00 2001 From: alganthe Date: Sun, 23 Aug 2015 21:03:00 +0200 Subject: [PATCH 020/170] goggles framework --- documentation/framework/goggles-framework.md | 22 ++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 documentation/framework/goggles-framework.md diff --git a/documentation/framework/goggles-framework.md b/documentation/framework/goggles-framework.md new file mode 100644 index 0000000000..f716532399 --- /dev/null +++ b/documentation/framework/goggles-framework.md @@ -0,0 +1,22 @@ +--- +layout: wiki +title: Goggles framework +description: +group: framework +order: 5 +parent: wiki +--- + +## 1. + +```c++ +class CfgGlasses { + class None; + + class G_bananas:None{ + ACE_TintAmount=COLOUR*2; // Amount of tint, the color is picked from ACE_Color + ACE_Color[] = {0,0,-1}; // If anyone knows please do tell + ACE_Resistance = 1; // Resistance to breaking. + }; +}; +``` From 46eee0d368c00b8b71f7914f29d74ce7d7ffb2e9 Mon Sep 17 00:00:00 2001 From: alganthe Date: Sun, 23 Aug 2015 21:03:08 +0200 Subject: [PATCH 021/170] hearing framework --- documentation/framework/hearing-framework.md | 25 ++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 documentation/framework/hearing-framework.md diff --git a/documentation/framework/hearing-framework.md b/documentation/framework/hearing-framework.md new file mode 100644 index 0000000000..7b10a515bd --- /dev/null +++ b/documentation/framework/hearing-framework.md @@ -0,0 +1,25 @@ +--- +layout: wiki +title: Hearing framework +description: +group: framework +order: 5 +parent: wiki +--- + + +## 1. Adding ace_hearing support for helmets +```c++ +class CfgWeapons { + class H_HelmetB; + + class H_superHelmet: H_HelmetB { + GVAR(protection) = 0.80; // Protection against deafening (0 = less, 1 = more) + GVAR(lowerVolume) = 0.60; // Muffling of the sound (0 = less, 1 = more) + }; +}; +``` + +### 1.1 Notes +- The protection is a multiplier and not an absolute value, you can still be deafened with a value of 1. +- Same as above for the sound muffling. From 2e291c39cf49570a98406d9f7f63875d0cca7090 Mon Sep 17 00:00:00 2001 From: alganthe Date: Sun, 23 Aug 2015 21:03:17 +0200 Subject: [PATCH 022/170] huntir framework --- documentation/framework/huntIR-framework.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 documentation/framework/huntIR-framework.md diff --git a/documentation/framework/huntIR-framework.md b/documentation/framework/huntIR-framework.md new file mode 100644 index 0000000000..5004331037 --- /dev/null +++ b/documentation/framework/huntIR-framework.md @@ -0,0 +1,21 @@ +--- +layout: wiki +title: huntIR framework +description: Explains how to add huntIR support to your weapons +group: framework +order: 5 +parent: wiki +--- + +## 1. Adding huntIR support for your weapons + +```c++ +class CfgWeapons { + class Rifle_Base_F; + class your_rifle_base_class: Rifle_Base_F { + class your_gl_class: UGL_F { + magazines[] = {,"ACE_HuntIR_M203"}; + }; + }; +}; +``` From 0c4539b8589af2413e84546eeaeb1c8c3204c32f Mon Sep 17 00:00:00 2001 From: alganthe Date: Sun, 23 Aug 2015 21:03:31 +0200 Subject: [PATCH 023/170] javelin framework --- documentation/framework/javelin-framework.md | 24 ++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 documentation/framework/javelin-framework.md diff --git a/documentation/framework/javelin-framework.md b/documentation/framework/javelin-framework.md new file mode 100644 index 0000000000..1d36895fde --- /dev/null +++ b/documentation/framework/javelin-framework.md @@ -0,0 +1,24 @@ +--- +layout: wiki +title: javelin framework +description: +group: framework +order: 5 +parent: wiki +--- + +## 1. Adding javelin style locking to your Launcher + +```c++ +class CfgWeapons { + class your_launcher : launch_O_Titan_F { + ace_javelin_enabled = 1; // enable javelin style locking + weaponInfoType = "ACE_RscOptics_javelin"; + modelOptics = "\z\ace\addons\javelin\data\reticle_titan.p3d"; + + canLock = 0; // disable vanilla locking + lockingTargetSound[] = {"",0,1}; // locking sound + lockedTargetSound[] = {"",0,1}; // target acquired sound + }; +}; +``` From e71362462ac3218f9b43b20d8e8e65334b05ad75 Mon Sep 17 00:00:00 2001 From: alganthe Date: Sun, 23 Aug 2015 21:03:53 +0200 Subject: [PATCH 024/170] nightvision framework --- .../framework/nightvision-framework.md | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 documentation/framework/nightvision-framework.md diff --git a/documentation/framework/nightvision-framework.md b/documentation/framework/nightvision-framework.md new file mode 100644 index 0000000000..b0861edb7e --- /dev/null +++ b/documentation/framework/nightvision-framework.md @@ -0,0 +1,24 @@ +--- +layout: wiki +title: nightvision framework +description: +group: framework +order: 5 +parent: wiki +--- +## 1. Configuring your NVGs + +```c++ +class CfgWeapons { + class Binocular; + class your_nvgs: Binocular { + displayName = "your nvg"; // name displayed in the inventory + ACE_NightVision_grain = 0.75; // amount of grain (dots) on the screen (0= less) + ACE_NightVision_blur = 0.055; // blur amount, (0= less) keep low + ACE_NightVision_radBlur = 0.001; // radial blur amount (0=less) keep low + }; +}; +``` + +- There's no escape here, you'll have to fiddle with the values to find the value that please you. +- `ACE_NightVision_grain` can be higher than 1, it's on 2.25 for gen1 goggles for example. From 0a012f94f85fd3df55305a4bccd606b8513a9c32 Mon Sep 17 00:00:00 2001 From: alganthe Date: Sun, 23 Aug 2015 21:09:43 +0200 Subject: [PATCH 025/170] overheating framework --- .../framework/overheating-framework.md | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 documentation/framework/overheating-framework.md diff --git a/documentation/framework/overheating-framework.md b/documentation/framework/overheating-framework.md new file mode 100644 index 0000000000..c5a6ad5385 --- /dev/null +++ b/documentation/framework/overheating-framework.md @@ -0,0 +1,48 @@ +--- +layout: wiki +title: overheating framework +description: +group: framework +order: 5 +parent: wiki +--- + +## 1. Adding barrel switching + +```c++ +class CfgWeapons { + + class Rifle_Long_Base_F; + class your_MMG: Rifle_Long_Base_F { + + // Dispersion, SlowdownFactor and JamChance arrays have 4 values for different temperatures, which are interpolated between. + // These values correspond to temperatures Converted to real life values: 0: 0°C, 1: 333°C, 2: 666°C, 3: 1000°C. + + ACE_Overheating_allowSwapBarrel = 1; // 1 to enable barrel swap. 0 to disable. Meant for machine guns where you can easily swap the barrel without dismantling the whole weapon. + + // Dispersion in radians. First value is for temp. 0, second for temp. 1 and so on. Values inbetween get interpolated. Negative values get ignored and can be used to move the starting point to hotter temperatures. + ACE_Overheating_Dispersion[] = {0, -0.001, 0.001, 0.004}; + + // How much the projectile gets slowed down before leaving the barrel. 0.9 means the bullet will lose 10% velocity. Values inbetween get interpolated. Numbers greater 1 increase the velocity, smaller 1 decrease it. + ACE_Overheating_SlowdownFactor[] = {1, 1, 1, 0.9}; + + // Chance to jam the weapon. 0.0003 means 3 malfunctions on 10,000 rounds fired at this temperature. Values inbetween get interpolated. Negative values get ignored and can be used to move the starting point to hotter temperatures. + // When no reliable data exists for temperature vs. jam chance except MRBS, the following uniform criteria was adopted: [0, 1/MRBS, 5/MRBS, 25/MRBS]. + ACE_Overheating_JamChance[] = {0, 0.0003, 0.0015, 0.0075}; + }; +}; +``` + +## 2. Adding custom animations + +```c++ +class CfgWeapons { + + class Rifle_Long_Base_F; + class your_MMG: Rifle_Long_Base_F { + ACE_clearJamAction = "GestureReload"; // Custom jam clearing action. Default uses reload animation. + ACE_checkTemperatureAction = "Gear"; // Custom check temperature action. Default uses gear animation. + ACE_clearJamAction = ""; // Custom jam clearing action. Use empty string to undefine. + }; +}; +``` From 36f9ffd5dc00d013a128a3c90d9867b81c53bb09 Mon Sep 17 00:00:00 2001 From: alganthe Date: Sun, 23 Aug 2015 23:17:42 +0200 Subject: [PATCH 026/170] overheating framework - update forgot a lil' bit, fixed --- documentation/framework/overheating-framework.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/framework/overheating-framework.md b/documentation/framework/overheating-framework.md index c5a6ad5385..3d466c9449 100644 --- a/documentation/framework/overheating-framework.md +++ b/documentation/framework/overheating-framework.md @@ -12,7 +12,7 @@ parent: wiki ```c++ class CfgWeapons { - class Rifle_Long_Base_F; + class Rifle_Long_Base_F; // base class for LMGs and MMGs class your_MMG: Rifle_Long_Base_F { // Dispersion, SlowdownFactor and JamChance arrays have 4 values for different temperatures, which are interpolated between. From cde5f2812815538919015b363e818e4e78980eaf Mon Sep 17 00:00:00 2001 From: alganthe Date: Sun, 23 Aug 2015 23:56:48 +0200 Subject: [PATCH 027/170] parachute framework --- .../framework/parachute-framework.md | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 documentation/framework/parachute-framework.md diff --git a/documentation/framework/parachute-framework.md b/documentation/framework/parachute-framework.md new file mode 100644 index 0000000000..d05c330925 --- /dev/null +++ b/documentation/framework/parachute-framework.md @@ -0,0 +1,22 @@ +--- +layout: wiki +title: Parachute framework +description: +group: framework +order: 5 +parent: wiki +--- + +## 1. Adding a reserve parachute to an existing parachute + +```c++ +class CfgVehicles { + + class banana_parachute; // your parachute base class + + class banana_parachute_02: banana_parachute { // your parachute class + ace_hasReserveParachute = 1; // 1 = enabled, 0 = disabled + ace_reserveParachute = "ACE_ReserveParachute"; // classname of the reserve parachute + }; +}; +``` From 62f20f5756895c36e43a16190868a75d880bb4af Mon Sep 17 00:00:00 2001 From: alganthe Date: Mon, 24 Aug 2015 00:06:43 +0200 Subject: [PATCH 028/170] reloadlaunchers framework --- .../framework/reloadlaunchers-framework.md | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 documentation/framework/reloadlaunchers-framework.md diff --git a/documentation/framework/reloadlaunchers-framework.md b/documentation/framework/reloadlaunchers-framework.md new file mode 100644 index 0000000000..7d836ca8fd --- /dev/null +++ b/documentation/framework/reloadlaunchers-framework.md @@ -0,0 +1,21 @@ +--- +layout: wiki +title: reloadlaunchers framework +description: +group: framework +order: 5 +parent: wiki +--- + +## 1. Adding third party reload + +```c++ +class CfgWeapons { + + class Launcher_Base_F; // launcher base class + + class yourlauncher: Launcher_Base_F { // launcher class + ACE_reloadlaunchers_enabled = 1; // enable third party reload (your buddies reloading for you) + }; +}; +``` From e55c80429fee03fe4f436944b3647e6a92c0ea5e Mon Sep 17 00:00:00 2001 From: alganthe Date: Mon, 24 Aug 2015 00:43:31 +0200 Subject: [PATCH 029/170] scopes framework --- documentation/framework/scopes-framework.md | 32 +++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 documentation/framework/scopes-framework.md diff --git a/documentation/framework/scopes-framework.md b/documentation/framework/scopes-framework.md new file mode 100644 index 0000000000..b13d8d5e9f --- /dev/null +++ b/documentation/framework/scopes-framework.md @@ -0,0 +1,32 @@ +--- +layout: wiki +title: Scopes framework +description: +group: framework +order: 5 +parent: wiki +--- + +## 1. Adding scope adjustement support + +```c++ +class CfgWeapons { + class ItemCore; + class InventoryOpticsItem_Base_F; + + class yourHighPoweredScope : ItemCore { + ACE_ScopeAdjust_Vertical[] = { -4, 30 }; // max vertical adjustement limits + ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; // max horizontal adjustement limits + ACE_ScopeAdjust_VerticalIncrement = 0.1; // vertical incrementation + ACE_ScopeAdjust_HorizontalIncrement = 0.1; // horizontal incrementation + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class Snip { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; +}; +``` From 69c6d0a373202f77ae2ab84bef9ce63104180b41 Mon Sep 17 00:00:00 2001 From: alganthe Date: Mon, 24 Aug 2015 12:13:24 +0200 Subject: [PATCH 030/170] sitting framework --- documentation/framework/sitting-framework.md | 47 ++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 documentation/framework/sitting-framework.md diff --git a/documentation/framework/sitting-framework.md b/documentation/framework/sitting-framework.md new file mode 100644 index 0000000000..c707671c84 --- /dev/null +++ b/documentation/framework/sitting-framework.md @@ -0,0 +1,47 @@ +--- +layout: wiki +title: Sitting framework +description: +group: framework +order: 5 +parent: wiki +--- + +## 1. adding sitting support to a chair + +```c++ +class CfgVehicles { + + #define MACRO_SEAT_ACTION \ // better use a macro, nobody wants to type this two times or more, right ? + class ACE_Actions { \ + class ACE_MainActions { \ + displayName = "$STR_ACE_Interaction_MainAction"; \ + selection = ""; \ + distance = 1.5; \ + condition = "true"; \ + class ACE_sitting_Sit { \ + displayName = "$STR_ACE_Sitting_Sit"; \ + condition = "_this call ace_sitting_fnc_canSit"; \ + statement = "_this call ace_sitting_fnc_sit"; \ + showDisabled = 0; \ + priority = 0; \ + icon = "z\ace\sitting\UI\sit_ca.paa"; \ + }; \ + }; \ + }; + + class ThingX; // base class for objects + + class yourChair: ThingX { // your chair class + XEH_ENABLED; // enable XEH on that object class + MACRO_SEAT_ACTION // add the interaction + ACE_sitting_canSit = 1; // enable sitting + ACE_sitting_sitDirection = 180; // sitting direction in degrees + ACE_sitting_sitPosition[] = {0, -0.1, -0.45}; // sitting position in a X Y Z plane + ACE_sitting_sitRotation = 10; // maximum rotation possible in degrees, left and right. + }; +}; +``` + +- No escape possible here, you'll have to fiddle with the position direction and rotation to have a normal pose. +- For the sitRotation 10 is use for chairs with arms, 45 for the ones without. From e152af7f453e7f43f166b642932319f0186f34ab Mon Sep 17 00:00:00 2001 From: alganthe Date: Mon, 24 Aug 2015 14:59:13 +0200 Subject: [PATCH 031/170] updated settings framework --- documentation/framework/settings-framework.md | 37 +++++++++++++------ 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/documentation/framework/settings-framework.md b/documentation/framework/settings-framework.md index 456a294c04..107e9378bf 100644 --- a/documentation/framework/settings-framework.md +++ b/documentation/framework/settings-framework.md @@ -36,8 +36,8 @@ class ACE_module_sampleSetting { Settings are defined from the mod's config but can be adjusted through the following methods: -* Optional config entries -* Mission modules +- Optional config entries +- Mission modules ## 2. Load order @@ -58,18 +58,18 @@ In the 'how do they work' chapter an example of settings was shown. This is the The server config setting entries are done through our optional `ace_server.pbo`, which can be found in the optionals folder of `@ace`. It also contains a `userconfig` folder, which inside contains the file `ace\serverconfig.hpp`. This is the location where ACE3 settings are placed. There is no need for a sub-class. -### 3.1 Getting all the settings! +### 3.1 Exporting the settings ACE3 contains a lot of settings, for that reason tweaking everything to your liking manually can be quite a task. We have provided the option to export all settings in the editor (single-player). For this, follow these simple steps: -* Open the editor (single-player). -* Under modules (F7), find ACE, `Allow Config Export [ACE]`. -* Place down the module, ensure that the `Allow` parameter is set to `Yes`. -* Press preview, once in the game, press Esc and open the ACE3 Options dialog (top left) -* This is the dialog where you can modify client side settings. On the bottom left of it, you will now see a button called `Config Export`. Press it and a new dialog opens. -* You are now in the dialog that allows you to adjust all settings from ACE3. Tweak this to your liking. -* Once you are done tweaking, press the `Export` button and all settings will be copied to your clipboard. -* Paste the settings in your `serverconfig.hpp` file and you're done. +- Open the editor (single-player). +- Under modules (F7), find ACE, `Allow Config Export [ACE]`. +- Place down the module, ensure that the `Allow` parameter is set to `Yes`. +- Press preview, once in the game, press Esc and open the ACE3 Options dialog (top left) +- This is the dialog where you can modify client side settings. On the bottom left of it, you will now see a button called `Config Export`. Press it and a new dialog opens. +- You are now in the dialog that allows you to adjust all settings from ACE3. Tweak this to your liking. +- Once you are done tweaking, press the `Export` button and all settings will be copied to your clipboard. +- Paste the settings in your `serverconfig.hpp` file and you're done. Note that the format copied to your clipboard by this can also be used in the mission config (`description.ext`), as long as they are in the class `ACE_Settings`. @@ -79,6 +79,21 @@ class ACE_Settings { }; ``` +#### 3.1.1 Notes + +- If a setting is forced it cannot be changed further down the line, see `2. Load order` for the hierarchy. +- Client settings can be forced, include them while exporting (the button is right next to export on the UI) +- You can use `ACE_common_forceAllSettings` to force settings in a mission, it will lock **all** the settings (which are not already forced) to the values they are set in either modules or server config + - example of `ACE_common_forceAllSettings` + ```c++ + //^^ rest of your description.ext + //------------------------- ACE settings + class ACE_common_forceAllSettings { + value = 1; + typeName = "BOOL"; + }; + ``` + ### 3.2 Loading up the server config As stated before, the server config gets loaded through the optional `ace_server.pbo`. This PBO is only required (and should only be used) on the server - clients do not need to have this! It is for this reason we have not signed this PBO. From 8553396b1d6b5e10af5d108f0fbffc4808ec3698 Mon Sep 17 00:00:00 2001 From: alganthe Date: Mon, 24 Aug 2015 15:06:24 +0200 Subject: [PATCH 032/170] issue reporting guide update --- documentation/user/how-to-report-an-issue.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/documentation/user/how-to-report-an-issue.md b/documentation/user/how-to-report-an-issue.md index 96f2dd76c3..4960baa3af 100644 --- a/documentation/user/how-to-report-an-issue.md +++ b/documentation/user/how-to-report-an-issue.md @@ -1,7 +1,7 @@ --- layout: wiki title: How to report an issue -description: If you've found an issue with ACE3 please read this entry before reporting it. +description: If you've found an issue with ACE3 please read this entry before reporting it. group: user order: 10 parent: wiki @@ -24,6 +24,8 @@ Indicate if the issue appears on stable or development version. In case it is th Head over to the ACE3 GitHub issue tracker and press the "New issue" button in the top right corner. Add a descriptive title and copy the following issue template in to the text area: ``` +*PRO-TIP :The english language allows individuals to correct each other's mistakes in a respectful manner.* + ACE3 Version: 3.x.x (indicate if stable or dev, if dev indicate the commit the version is based on) From 126ae37a9a7edfb70de59d05639dee0a6f402ae9 Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 25 Aug 2015 02:33:34 +0200 Subject: [PATCH 033/170] Cleaned up dragging-framework --- documentation/framework/dragging-framework.md | 125 +++++++++--------- 1 file changed, 62 insertions(+), 63 deletions(-) diff --git a/documentation/framework/dragging-framework.md b/documentation/framework/dragging-framework.md index 6a15f6f4fe..1038815cdc 100644 --- a/documentation/framework/dragging-framework.md +++ b/documentation/framework/dragging-framework.md @@ -1,7 +1,7 @@ --- layout: wiki -title: Carry and Drag framework -description: +title: Dragging/Carrying Framework +description: Explains how to set-up dragging and carrying of objects with the ACE3 dragging and carrying system. group: framework order: 5 parent: wiki @@ -12,84 +12,83 @@ parent: wiki ```c++ class CfgVehicles { class MyVehicle { + // Dragging + ace_dragging_canDrag = 1; // Can be dragged (0-no, 1-yes) + ace_dragging_dragPosition[] = {0, 1.2, 0}; // Offset of the model from the body while dragging (same as attachTo) + ace_dragging_dragDirection = 0; // Model direction while dragging (same as setDir after attachTo) - - ace_dragging_canDrag = 1; // can this object be dragged?; 1 yes, 0 no (0 default) - ace_dragging_dragPosition[] = {0,1.2,0} // Offset of the model from the body while dragging, comparable to the offset in attachTo (It's the same actually) - ace_dragging_dragDirection = 0; // how much degrees is the model rotatated after dragging it (a global setDir after attachTo) - - ace_dragging_canCarry = 1; // can this object be carried?; 1 yes, 0 no (0 default) - ace_dragging_carryPosition[] = {0,1.2,0}; // Same as drag, but for carrying objects - ace_dragging_carryDirection = 0; // Same as drag, but for carrying objects - + // Carrying + ace_dragging_canCarry = 1; // Can be carried (0-no, 1-yes) + ace_dragging_carryPosition[] = {0, 1.2, 0}; // Offset of the model from the body while dragging (same as attachTo) + ace_dragging_carryDirection = 0; // Model direction while dragging (same as setDir after attachTo) }; }; ``` + ## 2. Functions -**NOTE THAT THE FOLLOWING FUNCTIONS ARE NOT PUBLIC AND THUS MAY CHANGE IN THE FUTURE.**
+
+
Note:
+

The following functions are NOT public and are likely to change in the future!

+
- -Also note that if the item is too heavy you won't be able to carry / drag it, the mass is also affected by what's inside it.
-To bypass this empty the object and / or use setMass.
+You will **not** be able to carry / drag objects that are too heavy, the mass is also affected by what is inside the object. To bypass this empty the object and/or use `setMass`. ### 2.1 Enabling / disabling dragging -`ace_dragging_fnc_setDraggable.`
-Enable the object to be dragged.
+`ace_dragging_fnc_setDraggable` -| Arguments | | ---------------| -------- | -0 | Any object (Object) -1: | true to enable dragging, false to disable (Bool) -2:| Position offset for attachTo command (Array, optional; default: [0,0,0]) -3: | Direction in degree to rotate the object after attachTo (Number, optional; default: 0) -Return value: NONE
+ | Arguments | Type | Optional (default value) | +- | --------- | ---- | ------------------------ | +0 | Any object | Object | Required +1 | Enable dragging, true to enable, false to disable | Boolean | Required +2 | Position to offset the object from player | Array | Optional (default: `[0, 0, 0]`) +3 | Direction in degree to rotate the object | Number | Optional (default: `0`) +**R** | None | None | Return value -#### 2.1.1 example 1: -``` -[foo,true,[0,2,0],45] call ace_dragging_fnc_setDraggable -``` -| Arguments | | ---------------| -------- | -0:| foo (my object) -1:| true (dragging is enabled) -2:| `[0,2,0]` (0 meters sideways, 2 meters forward, 0 meters upwards) -3:| 45 (the object is rotated by 45°) +#### 2.1.1 Example 1 -#### 2.1.2 example 2 -``` -[bar,false,[3,-2,2],20] call ace_dragging_fnc_setDraggable -``` +`[foo, true, [0, 2, 0], 45] call ace_dragging_fnc_setDraggable;` + + | Arguments | Explanation | +- | --------- | ----------- | +0 | `foo` | My object +1 | `true` | Dragging is enabled +2 | `[0,2,0]` | 0 meters sideways, 2 meters forward, 0 meters upwards +3 | `45` | Rotated by 45° + +#### 2.1.2 Example 2 + +`[bar, false, [3, -2, 2], 20] call ace_dragging_fnc_setDraggable;` + + | Arguments | Explanation | +- | --------- | ----------- | +0 | `bar` | My object +1 | `false` | Dragging is disabled +2 | `[3, -2, 2]` | 3 meters sideways, 2 meters backwards, 2 meters upwards +3 | `20` | Rotated by 20° -| Arguments | | ---------------| -------- | -0:| bar (object) -1:| false (dragging is disabled) -2:| 3 meters sideways, -2 meters backwards, 2 meters upwards -3:| the object is rotated by 20° ### 2.2 Enabling / disabling carrying -`ace_dragging_fnc_setCarryable.`
-Enable the object to be carried.
-| Arguments | | ---------------| -------- | -0 | Any object (Object) -1:| true to enable carrying, false to disable (Bool) -2:| Position offset for attachTo command (Array, optional; default: [0,1,1]) -3:| Direction in degree to rotate the object after attachTo (Number, optional; default: 0) -Return value: NONE
+`ace_dragging_fnc_setCarryable` + | Arguments | Type | Optional (default value) +- | --------- | ---- | ------------------------ | +0 | Any object | Object | Required +1 | Enable carrying, true to enable, false to disable | Boolean | Required +2 | Position to offset the object from player | Array | Optional (default: `[0, 1, 1]`) +3 | Direction in degree to rotate the object | Number | Optional (default: `0`) +**R** | None | None | Return value -#### 2.1.1 example 1: -``` -[foo,true,[0,3,1],10] call ace_dragging_fnc_setCarryable -``` -| Arguments | | ---------------| -------- | -0:| foo (my object) -1:| true (carrying is enabled) -2:| `[0,2,0]` (0 meters sideways, 3 meters forward, 1 meters upwards) -3:| 10 (the object is rotated by 10°) +#### 2.2.1 Example + +`[foo, true, [0, 3, 1], 10] call ace_dragging_fnc_setCarryable;` + + | Arguments | Explanation | +- | --------- | ----------- | +0 | `foo` | My object +1 | `true`| Carrying is enabled +2 | `[0,2,0]` | 0 meters sideways, 3 meters forward, 1 meter upwards +3 | `10` | Rotated by 10° From ba53ce88a8d8d067633f55291892afcc9c4ad7a4 Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 25 Aug 2015 02:56:11 +0200 Subject: [PATCH 034/170] Updated frag-framework, fixed typo in dragging-framework --- documentation/framework/dragging-framework.md | 18 +-- documentation/framework/frag-framework.md | 139 ++++++++++++------ 2 files changed, 99 insertions(+), 58 deletions(-) diff --git a/documentation/framework/dragging-framework.md b/documentation/framework/dragging-framework.md index 1038815cdc..661dd2d9c7 100644 --- a/documentation/framework/dragging-framework.md +++ b/documentation/framework/dragging-framework.md @@ -39,8 +39,8 @@ You will **not** be able to carry / drag objects that are too heavy, the mass is `ace_dragging_fnc_setDraggable` - | Arguments | Type | Optional (default value) | -- | --------- | ---- | ------------------------ | + | Arguments | Type | Optional (default value) +- | --------- | ---- | ------------------------ 0 | Any object | Object | Required 1 | Enable dragging, true to enable, false to disable | Boolean | Required 2 | Position to offset the object from player | Array | Optional (default: `[0, 0, 0]`) @@ -51,8 +51,8 @@ You will **not** be able to carry / drag objects that are too heavy, the mass is `[foo, true, [0, 2, 0], 45] call ace_dragging_fnc_setDraggable;` - | Arguments | Explanation | -- | --------- | ----------- | + | Arguments | Explanation +- | --------- | ----------- 0 | `foo` | My object 1 | `true` | Dragging is enabled 2 | `[0,2,0]` | 0 meters sideways, 2 meters forward, 0 meters upwards @@ -62,8 +62,8 @@ You will **not** be able to carry / drag objects that are too heavy, the mass is `[bar, false, [3, -2, 2], 20] call ace_dragging_fnc_setDraggable;` - | Arguments | Explanation | -- | --------- | ----------- | + | Arguments | Explanation +- | --------- | ----------- 0 | `bar` | My object 1 | `false` | Dragging is disabled 2 | `[3, -2, 2]` | 3 meters sideways, 2 meters backwards, 2 meters upwards @@ -75,7 +75,7 @@ You will **not** be able to carry / drag objects that are too heavy, the mass is `ace_dragging_fnc_setCarryable` | Arguments | Type | Optional (default value) -- | --------- | ---- | ------------------------ | +- | --------- | ---- | ------------------------ 0 | Any object | Object | Required 1 | Enable carrying, true to enable, false to disable | Boolean | Required 2 | Position to offset the object from player | Array | Optional (default: `[0, 1, 1]`) @@ -86,8 +86,8 @@ You will **not** be able to carry / drag objects that are too heavy, the mass is `[foo, true, [0, 3, 1], 10] call ace_dragging_fnc_setCarryable;` - | Arguments | Explanation | -- | --------- | ----------- | + | Arguments | Explanation +- | --------- | ----------- 0 | `foo` | My object 1 | `true`| Carrying is enabled 2 | `[0,2,0]` | 0 meters sideways, 3 meters forward, 1 meter upwards diff --git a/documentation/framework/frag-framework.md b/documentation/framework/frag-framework.md index 14e55ecac8..5de0b3f6cc 100644 --- a/documentation/framework/frag-framework.md +++ b/documentation/framework/frag-framework.md @@ -1,77 +1,118 @@ --- layout: wiki -title: Fragmentation framework -description: The fragmentation system (ace_frag) in ACE3 is a significant improvement over the fragmentation system in ACE2. +title: Fragmentation Framework +description: The fragmentation system in ACE3 is a significant improvement over the fragmentation system in ACE2. group: framework parent: wiki order: 7 --- -The fragmentation system (ace_frag) in ACE3 is a significant improvement over the fragmentation system in ACE2. Previously the system relied on fuzzy math from the values of `indirectHit` and `indirectHitRange` in CfgAmmo to calculate roughly the velocity and range of fragmentation. This had some serious drawbacks, especially in the case of smaller explosives such as hand grenades and 40mm grenades where casualty production was lower than desired. +The fragmentation system in ACE3 is a significant improvement over the fragmentation system in ACE2. Previously the system relied on fuzzy math from the values of `indirectHit` and `indirectHitRange` in `CfgAmmo` to calculate roughly the velocity and range of fragmentation. This had some serious drawbacks, especially in the case of smaller explosives such as hand grenades and 40mm grenades where casualty production was lower than desired. In ACE3 the system has moved away from what "feels" right to actual explosive engineering equations, primarily the [Gurney equations](http://en.wikipedia.org/wiki/Gurney_equations). This allows us to get close to the actual fragmentation velocities that would be produced by an explosive configuration similar to type of ammo we are simulating. -The system for the end-developer is easy to use, and only requires minimal research into the type of ammo being represented. I will describe how to do this in this ticket. +The system for the end-developer is easy to use, and only requires minimal research into the type of ammo being represented. -Below is an example set of explosives configuration properties for sys_frag (in this case an M67 hand grenade): +Below is an example set of explosives configuration properties (in this case an M67 hand grenade): + +## 1. Config Values ```c++ -ace_frag_metal = 210; // metal in grams -ace_frag_charge = 185; // explosive in grams -ace_frag_gurney_c = 2843; // Gurney velocity constant for explosive type. See: http://en.wikipedia.org/wiki/Gurney_equations -ace_frag_gurney_k = 3/5; // Gurney shape factor, in this case a sphere. See: http://en.wikipedia.org/wiki/Gurney_equations +class CfgAmmo { + class MyGrenade { + ace_frag_enabled = 1; // Enable fragmentation (0-disabled, 1-enabled) + ace_frag_metal = 210; // Amount of metal being fragmented (grams) - information below + ace_frag_charge = 185; // Amount of explosive filler (grams) - information below + ace_frag_gurney_c = 2843; // Gurney velocity constant for explosive type - information below + ace_frag_gurney_k = 3/5; // Gurney shape factor - information below + ace_frag_classes[] = {"ACE_frag_large"}; // Type of fragments - information below + ace_frag_skip = 0; // (Optional) Skip fragmentation for this ammo type (0-disabled, 1-enabled) - information below + ace_frag_force = 1; // (Optional) Force fragmentation system (0-disabled, 1-enabled) - information below + }; +}; ``` -`ace_frag_metal` is the amount of metal being fragmented (generally taken as the entire weight of the warhead, though in some cases you might want to only include the fragmentation jacket or body. `ace_frag_charge` is the amount of explosive filler in the warhead. `ace_frag_metal` and `ace_frag_charge` are dimensionless values, as long as they are both in the same unit (for example kg/kg g/g lbs/lbs). +### 1.1 Metal amount -`ace_frag_gurney_c` is the Gurney constant for explosive force. You can find a list of common explosive types below. If you can not find it here, or want more accurate numbers, just google the type of explosive and Gurney constant and you can find substantial information. This is *NOT* the detonation velocity of the explosive, do not confuse them! +`ace_frag_metal` -| Type | Speed | -|------------------|----------| -|Composition B | 2700 m/s | -|Composition C-3 | 2680 m/s | -|Cyclotol 75/25 | 2790 m/s | -|HMX | 2800 m/s | -|LX-14 | 2970 m/s | -|Octol 75/25 | 2800 m/s | -|PBX 9404 | 2900 m/s | -|PBX 9502 | 2377 m/s | -|PETN | 2930 m/s | -|RDX | 2830 m/s | -|Tetryl | 2500 m/s | -|TNT | 2440 m/s | -|Tritonal | 2320 m/s | +Amount of metal being fragmented (generally taken as the entire weight of the warhead, though in some cases you might want to only include the fragmentation jacket or body. +Dimensionless value, as long as same unit as `ace_frag_charge` (for example `kg/kg` or `g/g` or `lbs/lbs`). -`ace_frag_gurney_k` is the shape factor for the explosive configuration. You should choose it based on the general configuration of explosives/metal in the warhead. Most grenades for example are a sphere. Artillery and aircraft bombs are a cylinder. Mines generally a flat plate. Below is a list of the three common shapes and their factors. +### 1.2 Explosives filler amount -``` -Sphere = 3/5 -Cylinder = 1/2 -Plate = 3/5 -``` +`ace_frag_charge` -There are other configurations but these are the most common. If you are interested in others check out the wikipedia link given above. Most of these will not correctly function in sys_frag though due to additional variables for the equation. +Amount of explosive filler in the warhead. `ace_frag_metal` and `ace_frag_charge` are dimensionless values, as long as they are both in the same unit (for example kg/kg g/g lbs/lbs). -In addition to these variables there are different types of fragmentation fragments to choose from, and they can be defined in the config value `ace_frag_classes[]`. Below are a list of the types. +Dimensionless value, as long as same unit as `ace_frag_metal` (for example `kg/kg` or `g/g` or `lbs/lbs`). -``` -ACE_frag_tiny -ACE_frag_tiny_HD -ACE_frag_small -ACE_frag_small_HD -ACE_frag_medium -ACE_frag_medium_HD -ACE_frag_large -ACE_frag_large_HD -ACE_frag_huge -ACE_frag_huge_HD -``` +### 1.3 Gurney velocity constant + +`ace_frag_gurney_c` + +Gurney constant for explosive force. You can find a list of common explosive types below. If you can not find it here, or want more accurate numbers, just google the type of explosive and Gurney constant and you can find substantial information. This is **not** the detonation velocity of the explosive, do not confuse them! + +Type | Speed +--------------- | -------- +Composition B | 2700 m/s +Composition C-3 | 2680 m/s +Cyclotol 75/25 | 2790 m/s +HMX | 2800 m/s +LX-14 | 2970 m/s +Octol 75/25 | 2800 m/s +PBX 9404 | 2900 m/s +PBX 9502 | 2377 m/s +PETN | 2930 m/s +RDX | 2830 m/s +Tetryl | 2500 m/s +TNT | 2440 m/s +Tritonal | 2320 m/s + +### 1.4 Gurney shape factor + +`ace_frag_gurney_k` + +Shape factor for the explosive configuration. You should choose it based on the general configuration of explosives/metal in the warhead. Most grenades for example are a sphere. Artillery and aircraft bombs are a cylinder. Mines generally a flat plate. Below is a list of the three common shapes and their factors. + +Shape | Factor +-------- | ------ +Sphere | 3/5 +Cylinder | 1/2 +Plate | 3/5 + +There are other configurations but these are the most common. If you are interested in others check out the wikipedia link given above. Most of these will not correctly function in ACE3 though due to additional variables for the equation. + +### 1.5 Fragments type + +`ace_frag_classes[]` + +There are different types of fragmentation fragments to choose from, and they can be defined in this config value. + +| Type +| ---- +| ACE_frag_tiny +| ACE_frag_tiny_HD +| ACE_frag_small +| ACE_frag_small_HD +| ACE_frag_medium +| ACE_frag_medium_HD +| ACE_frag_large +| ACE_frag_large_HD +| ACE_frag_huge +| ACE_frag_huge_HD The tinier the piece of fragmentation the shorter the distance of travel. The `_HD` variants are all even higher drag versions. Grenades generally should use the `_HD` variants. Experimentation here is important. -The final information needed is a couple of entries for forcing or ignoring fragmentation for this ammo. +### 1.6 Ignore fragmentation -If you set `ace_frag_skip` to 1 then you will skip fragmentation for ammo of this type. This is useful for things that might cause high network load, such as FFAR rockets, or possibly even 40mm grenades from AGLs. Experimentation under network conditions is required. +`ace_frag_skip` -If you set `ace_frag_force` to 1 it will force the fragmentation system to use frag on this ammo, ignoring sys_frags internal qualifications based on hit values. +Setting this to `1` will skip fragmentation for ammo of this type. This is useful for things that might cause high network load, such as FFAR rockets, or possibly even 40mm grenades from AGLs. Experimentation under network conditions is required. + +### 1.7 Force fragmentation + +`ace_frag_force` + +Settings this to `1` will force the fragmentation system to use frag on this ammo, ignoring internal qualifications based on hit values. From fa84effb9b27d3589fab7bd4e9aae6f71adca6a7 Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 25 Aug 2015 02:57:28 +0200 Subject: [PATCH 035/170] Small update in frag-framework --- documentation/framework/frag-framework.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/documentation/framework/frag-framework.md b/documentation/framework/frag-framework.md index 5de0b3f6cc..2800d78f52 100644 --- a/documentation/framework/frag-framework.md +++ b/documentation/framework/frag-framework.md @@ -1,21 +1,22 @@ --- layout: wiki title: Fragmentation Framework -description: The fragmentation system in ACE3 is a significant improvement over the fragmentation system in ACE2. +description: Explains how to set-up fragmentation system for explosives using ACE3 fragmentation system. group: framework parent: wiki order: 7 --- +## 1. Overview + The fragmentation system in ACE3 is a significant improvement over the fragmentation system in ACE2. Previously the system relied on fuzzy math from the values of `indirectHit` and `indirectHitRange` in `CfgAmmo` to calculate roughly the velocity and range of fragmentation. This had some serious drawbacks, especially in the case of smaller explosives such as hand grenades and 40mm grenades where casualty production was lower than desired. In ACE3 the system has moved away from what "feels" right to actual explosive engineering equations, primarily the [Gurney equations](http://en.wikipedia.org/wiki/Gurney_equations). This allows us to get close to the actual fragmentation velocities that would be produced by an explosive configuration similar to type of ammo we are simulating. The system for the end-developer is easy to use, and only requires minimal research into the type of ammo being represented. -Below is an example set of explosives configuration properties (in this case an M67 hand grenade): -## 1. Config Values +## 2. Config Values ```c++ class CfgAmmo { From ae1e7afdc84f1e4c2d72429d71b469f0839d1f58 Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 25 Aug 2015 03:13:59 +0200 Subject: [PATCH 036/170] Updated missile-guidance-framework --- .../framework/missile-guidance-framework.md | 111 +++++++++--------- 1 file changed, 56 insertions(+), 55 deletions(-) diff --git a/documentation/framework/missile-guidance-framework.md b/documentation/framework/missile-guidance-framework.md index 32c4fa7888..2072026d5c 100644 --- a/documentation/framework/missile-guidance-framework.md +++ b/documentation/framework/missile-guidance-framework.md @@ -1,7 +1,7 @@ --- layout: wiki title: Advanced Missile Guidance framework -description: The ACE3 Advanced Missile Guidance Framework provides a setup of configuration settings, functions and a execution framework for addon makers to integrate with the missile guidance and targeting mechanisms of ACE3. +description: The ACE3 Advanced Missile Guidance Framework provides a setup of configuration settings, functions and a execution framework for mod makers to integrate with the missile guidance and targeting mechanisms of ACE3. group: framework order: 5 parent: wiki @@ -9,100 +9,101 @@ parent: wiki ## 1. Overview -The ACE3 Advanced Missile Guidance Framework provides a setup of configuration settings, functions and a execution framework for addon makers to integrate with the missile guidance and targeting mechanisms of ACE3. It also provides for mod makers to create their own custom guidance methods within the framework. +The ACE3 Advanced Missile Guidance Framework provides a setup of configuration settings, functions and an execution framework for mod makers to integrate with the missile guidance and targeting mechanisms of ACE3. It also provides the mod makers to create their own custom guidance methods within the framework. -The framework provides all the functionality needed for guidance; from laser locking, target specification and selection, to handling the fired events and tracking and steering the vehicle based on provided parameters. This way, all that needs to be defined in addons is the appropriate CfgAmmo entries for the missile. +The framework provides all the functionality needed for guidance; from laser locking, target specification and selection, to handling the fired events and tracking and steering the vehicle based on provided parameters. This way, all that needs to be defined in mods is the appropriate `CfgAmmo` entries for the missile. -The framework also provides addon makers and scripters with the ability to configure custom seeker types and attack profiles, which are defined below. This allows for complete control of the guidance, locking and flight of a missile at the discretion of the addon maker. +The framework also provides mod makers and scripters with the ability to configure custom seeker types and attack profiles, which are defined below. This allows for complete control of the guidance, locking and flight of a missile at the discretion of the mod maker. -ACE3 provides a full suite of base concepts and guidance for the majority of modern missile weaponry avialable today; these includes all basic types of seekers (SALH/SACLOS/Optic/Thermal/etc) - as well as the different common attack profiles utilized with guided munitions (such as top-down attacks). +ACE3 provides a full suite of base concepts and guidance for the majority of modern missile weaponry avialable today; these includes all basic types of seekers (SALH, SACLOS, Optic, Thermal ...) as well as the different common attack profiles utilized with guided munitions (such as top-down attack). -Finally, flight profiles and mechanics for realistic missile simulations are also implemented; allowing for lock-steering bump guidance flight such as with the M47 Dragon or GBU steering fins, or finely tuned direct flight guidance which is currently avialable with other missile types. +Finally, flight profiles and mechanics for realistic missile simulations are also implemented; allowing for lock-steering bump guidance flight such as with the M47 Dragon or GBU steering fins, or finely tuned direct flight guidance which is currently available with other missile types. -## 2. Details + +## 2. Components The framework is broken up into 3 major components: Locking Types, Seeker Types and Attack Profiles. In combination, these components build out the entire process of launching, locking and going terminal flight against targets. -### 2.1 Components +#### 2.1 Locking Types +Locking types provide the basic functionality of targeting which will be based to a seeker type, providing target acquisition for seekers. This provides the basic functionality for providing pre-determined targets for a seeker, or allowing the seeker to perform its own target acquisition and locking. Additionally, the seeker may reference back into the locking type in order to re-perform target acquisition. -#### 2.1.1 Locking Types -Locking types provide the basic functionality of targeting which will be based to a seeker type, providing target aquisition for seekers. This provides the basic functionality for providing pre-determined targets for a seeker, or allowing the seeker to perform its own target aquisition and locking. Additionally, the seeker may reference back into the locking type in order to re-perform target aquisition. - -#### 2.1.2 Seeker Types +#### 2.2 Seeker Types Each seeker is generally assumed to be the logic for the seeker head unit within any given munition. Seekers within this framework provide the basic targeting functionality for the entire framework. The locking type will provide a generic target to the seeker, or the seeker may aquire a target on its own. The seeker then provides a target, either an object or a ASL position, which is then passed further into the framework. This target (or position) should be the actual current target position for the missiles flight. Seekers are required to perform all limitations and checks within their systems, although various limitations have been provided in this framework such as LOS FOV, laser guidance, etc. -#### 2.1.3 Attack Profiles +#### 2.3 Attack Profiles An attack profile adjusts the current target flight location to create the actual flight path of the missile. The attack profile is provided with all parameters of the system, including the returned target of the seeker. Using this information, the attack profile then will adjust the *direct flight target position* to specifically direct where and how the missile shall flight. + ## 3. How it all ties together -The system is executed in a linear series of calls to each step of the process, and feeding back the return from that step to the next step. Execution is conducted using Locking->Seeker->Profile, iteratively every frame of execution. Flight times are adjusted to accTime values and FPS lag, giving consistent flight. +The system is executed in a linear series of calls to each step of the process, and feeding back the return from that step to the next step. Execution is conducted using Locking -> Seeker -> Profile, iteratively every frame of execution. Flight times are adjusted to `accTime` values and FPS lag, giving consistent flight. -On each step of execution, a target specification array [targetObj, targetPos] is passed to the locking type, which then will return a possible modified target array. Next, this modified data is passed to the seeker type - which then, in turn, returns a position vector to the current "seeked" target position (ASL). Last, this target position is passed to the attack profile, who then returns an "adjusted attack position (ASL)", which is the location the missile should *currently* be homing on for flight. +On each step of execution, a target specification array `[targetObj, targetPos]` is passed to the locking type, which then will return a possible modified target array. Next, this modified data is passed to the seeker type - which then, in turn, returns a position vector to the current "seeked" target position (ASL). Last, this target position is passed to the attack profile, which then returns an "adjusted attack position" (ASL), which is the location the missile should *currently* be homing on for flight. -In the simplest sense, the entire system provides the flight trajectory of the missile homing directly on the "adjusted attack position"; thus, an attack profile would ajust this position to direct the missile. For example, Top down attacks return the adjusted attack position high above the target, until entering their terminal stages, which then changes the position to be directly ontop of the target - thus "walking the missile" along its flight path and to the kill. +In the simplest sense, the entire system provides the flight trajectory of the missile homing directly on the "adjusted attack position"; thus, an attack profile would ajust this position to direct the missile. For example, top down attacks return the adjusted attack position high above the target, until entering their terminal stages, which then changes the position to be directly on top of the target - thus "walking the missile" along its flight path and to the impact. -## 4. Adding AMG to a missile + +## 4. Config Values ### 4.1 Enabling guidance on Ammo Types + ```c++ class CfgAmmo { - class MissileBase; - class MyMissileType : MissileBase { - // Turn off arma crosshair-guidance - manualControl = 0; + class MyMissile { + manualControl = 0; // Turn off vanilla crosshair guidance // Begin ACE guidance Configs class ace_missileguidance { - enabled = 1; + enabled = 1; // Enable missile guidance (0-disabled, 1-enabled) - minDeflection = 0.00025; // Minium flap deflection for guidance - maxDeflection = 0.001; // Maximum flap deflection for guidance - incDeflection = 0.0005; // The incrmeent in which deflection adjusts. + minDeflection = 0.00025; // Minimum flap deflection for guidance + maxDeflection = 0.001; // Maximum flap deflection for guidance + incDeflection = 0.0005; // The increment in which deflection adjusts - canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet modes. All 'recruit' games use vanilla locking + canVanillaLock = 0; // Enable vanilla lock, only applicable to non-cadet modes, 'recruit' always uses vanilla locking (0-disabled, 1-enabled) - // Seeker type and settings for munitions - defaultSeekerType = "SALH"; - seekerTypes[] = { "SALH", "LIDAR", "SARH", "Optic", "Thermal", "GPS", "SACLOS", "MCLOS" }; + defaultSeekerType = "SALH"; // Default seeker type + seekerTypes[] = {"SALH", "LIDAR", "SARH", "Optic", "Thermal", "GPS", "SACLOS", "MCLOS"}; // Seeker types available - defaultSeekerLockMode = "LOAL"; - seekerLockModes[] = { "LOAL", "LOBL" }; + defaultSeekerLockMode = "LOAL"; // Default seeker lock mode + seekerLockModes[] = {"LOAL", "LOBL"}; // Seeker lock modes available - seekerAngle = 90; // Angle in front of the missile which can be searched - seekerAccuracy = 1; // seeker accuracy multiplier + seekerAngle = 90; // Angle in front of the missile which can be searched + seekerAccuracy = 1; // Seeker accuracy multiplier - seekerMinRange = 1; - seekerMaxRange = 2500; // Range from the missile which the seeker can visually search + seekerMinRange = 1; // Minimum range from the missile which the seeker can visually search + seekerMaxRange = 2500; // Maximum from the missile which the seeker can visually search - // Attack profile type selection - defaultAttackProfile = "LIN"; - attackProfiles[] = { "LIN", "DIR", "MID", "HI" }; + defaultAttackProfile = "LIN"; // Default attack profile + attackProfiles[] = {"LIN", "DIR", "MID", "HI"}; // Attack profiles available }; ``` -## 5. Creating your own custom seekers and attack profiles - -### 5.1 Adding seeker types and attack profiles +### 4.2 Custom Seeker Types ```c++ -class ace_missileguidance_attackProfiles{ +class ace_missileguidance_attackProfiles { class MyAttackProfile { - name = ""; - visualName = ""; - description = ""; + name = ""; // Name + visualName = ""; // Visual name + description = ""; // Description - functionName = "my_fnc_doAttackProfile"; - }; -}; -class ace_missileguidance_seekerTypes { - class MySeekerType { - name = ""; - visualName = ""; - description = ""; - - functionName = "my_fnc_doSeekerType"; + functionName = "my_fnc_doSeekerType"; // Function that handles the seeker type + }; +}; +``` + +### 4.3 Custom Attack Profiles + +```c++ +class ace_missileguidance_seekerTypes { + class MySeekerType { + name = ""; // Name + visualName = ""; // Visual name + description = ""; // Description + + functionName = "my_fnc_doAttackProfile"; // Function that handles the attack profile }; }; ``` From 93baa3b6fa4f60868001a6f0337ee47fa53c60f2 Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 25 Aug 2015 03:23:37 +0200 Subject: [PATCH 037/170] Updated goggles-framework --- documentation/framework/goggles-framework.md | 21 +++++++++++-------- .../framework/missile-guidance-framework.md | 2 +- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/documentation/framework/goggles-framework.md b/documentation/framework/goggles-framework.md index f716532399..471f66cbac 100644 --- a/documentation/framework/goggles-framework.md +++ b/documentation/framework/goggles-framework.md @@ -1,22 +1,25 @@ --- layout: wiki -title: Goggles framework -description: +title: Goggles Framework +description: Explains how to set-up goggles with ACE3 goggles system. group: framework order: 5 parent: wiki --- -## 1. +## 1. Config Values ```c++ class CfgGlasses { - class None; - - class G_bananas:None{ - ACE_TintAmount=COLOUR*2; // Amount of tint, the color is picked from ACE_Color - ACE_Color[] = {0,0,-1}; // If anyone knows please do tell - ACE_Resistance = 1; // Resistance to breaking. + class MyGoggles { + ace_color[] = {0, 0, -1}; // Post-proccess color + ace_tintAmount = 8; // Amount of tint applied to the color + ace_resistance = 1; // Resistance to breaking (0 or 1 or 2) + ace_protection = 0; // Provides protection (0-no, 1-yes) + ace_overlay = ""; // (Optional) Default overlay image path ("" for none) + ace_overlayDirt = "A3\Ui_f\data\igui\rsctitles\HealthTextures\dust_upper_ca.paa"; // (Optional) Dirt overlay image path + ace_overlayCracked = "mod\textures\HUD\Cracked.paa"; // (Optional) Cracked overlay image path + ace_dustPath = "mod\textures\fx\dust\dust1.paa"; // (Optional) Dust overlay image path }; }; ``` diff --git a/documentation/framework/missile-guidance-framework.md b/documentation/framework/missile-guidance-framework.md index 2072026d5c..c1bae60a93 100644 --- a/documentation/framework/missile-guidance-framework.md +++ b/documentation/framework/missile-guidance-framework.md @@ -1,6 +1,6 @@ --- layout: wiki -title: Advanced Missile Guidance framework +title: Advanced Missile Guidance Framework description: The ACE3 Advanced Missile Guidance Framework provides a setup of configuration settings, functions and a execution framework for mod makers to integrate with the missile guidance and targeting mechanisms of ACE3. group: framework order: 5 From d51ad8280ac76a3661fad7b0de4600214847695a Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 25 Aug 2015 03:26:06 +0200 Subject: [PATCH 038/170] Updated hearing-framework --- documentation/framework/hearing-framework.md | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/documentation/framework/hearing-framework.md b/documentation/framework/hearing-framework.md index 7b10a515bd..6d83665916 100644 --- a/documentation/framework/hearing-framework.md +++ b/documentation/framework/hearing-framework.md @@ -1,25 +1,21 @@ --- layout: wiki -title: Hearing framework -description: +title: Hearing Framework +description: Explains how to set-up headgear with ACE3 hearing system. group: framework order: 5 parent: wiki --- +## 1. Config Values -## 1. Adding ace_hearing support for helmets ```c++ class CfgWeapons { - class H_HelmetB; - - class H_superHelmet: H_HelmetB { - GVAR(protection) = 0.80; // Protection against deafening (0 = less, 1 = more) - GVAR(lowerVolume) = 0.60; // Muffling of the sound (0 = less, 1 = more) + class MyHelmet { + ace_hearing_protection = 0.80; // Protection against deafening (0 to 1, higher means more protection) + ace_hearing_lowerVolume = 0.60; // Muffling of the sound (0 to 1, higher means more muffling) }; }; ``` -### 1.1 Notes -- The protection is a multiplier and not an absolute value, you can still be deafened with a value of 1. -- Same as above for the sound muffling. +The protection/muffling is a multiplier and not an absolute value, you can still be deafened/muffled with a value of 1. From 6d84977fd83f2774b9094f70e0488334551a73c2 Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 25 Aug 2015 03:28:26 +0200 Subject: [PATCH 039/170] Updated huntIR-framework --- documentation/framework/huntIR-framework.md | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/documentation/framework/huntIR-framework.md b/documentation/framework/huntIR-framework.md index 5004331037..6ed24ad158 100644 --- a/documentation/framework/huntIR-framework.md +++ b/documentation/framework/huntIR-framework.md @@ -1,20 +1,26 @@ --- layout: wiki -title: huntIR framework -description: Explains how to add huntIR support to your weapons +title: HuntIR Framework +description: Explains how to add HuntIR support to your weapons. group: framework order: 5 parent: wiki --- -## 1. Adding huntIR support for your weapons +## 1. Config Values ```c++ class CfgWeapons { - class Rifle_Base_F; - class your_rifle_base_class: Rifle_Base_F { - class your_gl_class: UGL_F { - magazines[] = {,"ACE_HuntIR_M203"}; + class MyRifle { + class MyGL: UGL_F { + magazines[] = { + // All default UGL magazines + "MyFirstMag", + "MySecondMag", + "MyLastMag", + // HUntIR magazine + "ACE_HuntIR_M203" + }; }; }; }; From bf1c77fcb4bcbf7cf00a31bae5c5111ba1b4ffb7 Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 25 Aug 2015 03:30:36 +0200 Subject: [PATCH 040/170] Updated javelin-framework --- documentation/framework/huntIR-framework.md | 2 +- documentation/framework/javelin-framework.md | 21 ++++++++++---------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/documentation/framework/huntIR-framework.md b/documentation/framework/huntIR-framework.md index 6ed24ad158..8f4968f548 100644 --- a/documentation/framework/huntIR-framework.md +++ b/documentation/framework/huntIR-framework.md @@ -1,7 +1,7 @@ --- layout: wiki title: HuntIR Framework -description: Explains how to add HuntIR support to your weapons. +description: Explains how to add HuntIR support to a weapon. group: framework order: 5 parent: wiki diff --git a/documentation/framework/javelin-framework.md b/documentation/framework/javelin-framework.md index 1d36895fde..dd384fd282 100644 --- a/documentation/framework/javelin-framework.md +++ b/documentation/framework/javelin-framework.md @@ -1,24 +1,23 @@ --- layout: wiki -title: javelin framework -description: +title: Javelin Framework +description: Explains how to set-up Javelin-style locking system to a launcher. group: framework order: 5 parent: wiki --- -## 1. Adding javelin style locking to your Launcher +## 1. Config Values ```c++ class CfgWeapons { - class your_launcher : launch_O_Titan_F { - ace_javelin_enabled = 1; // enable javelin style locking - weaponInfoType = "ACE_RscOptics_javelin"; - modelOptics = "\z\ace\addons\javelin\data\reticle_titan.p3d"; - - canLock = 0; // disable vanilla locking - lockingTargetSound[] = {"",0,1}; // locking sound - lockedTargetSound[] = {"",0,1}; // target acquired sound + class MyLauncher { + ace_javelin_enabled = 1; // Enable Javelin-style locking (0-disabled, 1-enabled) + weaponInfoType = "ACE_RscOptics_javelin"; // Inteface + modelOptics = "\z\ace\addons\javelin\data\reticle_titan.p3d"; // Optics model + canLock = 0; // Disable vanilla locking (0-disabled, 1-enabled) + lockingTargetSound[] = {"", 0, 1}; // Locking sound + lockedTargetSound[] = {"", 0, 1}; // Target acquired sound }; }; ``` From a7ba540b97e48f84b627fd4ebfb1f9d012b335a3 Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 25 Aug 2015 03:35:58 +0200 Subject: [PATCH 041/170] Updated NVG-framework --- .../framework/nightvision-framework.md | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/documentation/framework/nightvision-framework.md b/documentation/framework/nightvision-framework.md index b0861edb7e..73d78a222a 100644 --- a/documentation/framework/nightvision-framework.md +++ b/documentation/framework/nightvision-framework.md @@ -1,24 +1,21 @@ --- layout: wiki -title: nightvision framework -description: +title: Night Vision Framework +description: Explains how to set-up night vision goggles with ACE3 night vision system. group: framework order: 5 parent: wiki --- -## 1. Configuring your NVGs + +## 1. Config Values ```c++ class CfgWeapons { - class Binocular; - class your_nvgs: Binocular { - displayName = "your nvg"; // name displayed in the inventory - ACE_NightVision_grain = 0.75; // amount of grain (dots) on the screen (0= less) - ACE_NightVision_blur = 0.055; // blur amount, (0= less) keep low - ACE_NightVision_radBlur = 0.001; // radial blur amount (0=less) keep low + class MyNightVision { + displayName = "Banana NVGs"; // Name displayed in the inventory + ace_nightVision_grain = 0.75; // Amount of grain (dots) on the screen (more means more grain) - can be higher than 1 + ace_nightVision_blur = 0.055; // Blur amount (more means more blur) - keep low values! + ace_nightVision_radBlur = 0.001; // Radial blur amount (more means more blur) - keep low values! }; }; ``` - -- There's no escape here, you'll have to fiddle with the values to find the value that please you. -- `ACE_NightVision_grain` can be higher than 1, it's on 2.25 for gen1 goggles for example. From e02d28eddfed375829521eb9ea8a0fbfd469032a Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 25 Aug 2015 03:46:55 +0200 Subject: [PATCH 042/170] Updated overheating-framework --- .../framework/overheating-framework.md | 86 +++++++++++++------ 1 file changed, 58 insertions(+), 28 deletions(-) diff --git a/documentation/framework/overheating-framework.md b/documentation/framework/overheating-framework.md index 3d466c9449..21cca53516 100644 --- a/documentation/framework/overheating-framework.md +++ b/documentation/framework/overheating-framework.md @@ -1,48 +1,78 @@ --- layout: wiki -title: overheating framework -description: +title: Overheating Framework +description: Explains how to set-up weapon overheating with ACE3 overheating system. group: framework order: 5 parent: wiki --- -## 1. Adding barrel switching +## 1. Config Values + +### 1.1 Barrel Switching ```c++ class CfgWeapons { - - class Rifle_Long_Base_F; // base class for LMGs and MMGs - class your_MMG: Rifle_Long_Base_F { - - // Dispersion, SlowdownFactor and JamChance arrays have 4 values for different temperatures, which are interpolated between. - // These values correspond to temperatures Converted to real life values: 0: 0°C, 1: 333°C, 2: 666°C, 3: 1000°C. - - ACE_Overheating_allowSwapBarrel = 1; // 1 to enable barrel swap. 0 to disable. Meant for machine guns where you can easily swap the barrel without dismantling the whole weapon. - - // Dispersion in radians. First value is for temp. 0, second for temp. 1 and so on. Values inbetween get interpolated. Negative values get ignored and can be used to move the starting point to hotter temperatures. - ACE_Overheating_Dispersion[] = {0, -0.001, 0.001, 0.004}; - - // How much the projectile gets slowed down before leaving the barrel. 0.9 means the bullet will lose 10% velocity. Values inbetween get interpolated. Numbers greater 1 increase the velocity, smaller 1 decrease it. - ACE_Overheating_SlowdownFactor[] = {1, 1, 1, 0.9}; - - // Chance to jam the weapon. 0.0003 means 3 malfunctions on 10,000 rounds fired at this temperature. Values inbetween get interpolated. Negative values get ignored and can be used to move the starting point to hotter temperatures. - // When no reliable data exists for temperature vs. jam chance except MRBS, the following uniform criteria was adopted: [0, 1/MRBS, 5/MRBS, 25/MRBS]. - ACE_Overheating_JamChance[] = {0, 0.0003, 0.0015, 0.0075}; + class MyMG { + ace_overheating_allowSwapBarrel = 1; // Enable barrel swap (0-disabled, 1-enabled) - information below + ace_overheating_dispersion[] = {0, -0.001, 0.001, 0.004}; // Bullet dispersion (in radians) - information below + ace_overheating_slowdownFactor[] = {1, 1, 1, 0.9}; // Slowdown factor inside the barrel - information below + ace_overheating_jamChance[] = {0, 0.0003, 0.0015, 0.0075}; // Jam chance - information below }; }; ``` -## 2. Adding custom animations +#### 1.1.1 Temperatures + +`ace_overheating_dispersion[]` +`ace_overheating_slowdownFactor[]` +`ace_overheating_jamChance[]` + +Above arrays have 4 values for different temperatures, which are interpolated between. These values correspond to temperatures converted to real life values from. + +Config | Real Life +------ | --------- +0 | 0°C +1 | 333°C +2 | 666°C +3 | 1000°C + +### 1.1.2 Barrel Swapping + +`ace_overheating_allowSwapBarrel` + +Meant for machine guns where you can easily swap the barrel without dismantling the whole weapon. + +### 1.1.3 Dispersion + +`ace_overheating_dispersion[]` + +Dispersion in radians. First value is for temperature 0, second for temperature 1 and so on. Values in-between get interpolated. Negative values are ignored and can be used to move the starting point to hotter temperatures. + +### 1.1.4 Slowdown Factor + +`ace_overheating_slowdownFactor[]` + +How much the projectile gets slowed down before leaving the barrel. `0.9` means the bullet will lose 10% velocity. Values in-between get interpolated. Numbers greater than `1` increase the velocity, smaller decrease it. + +### 1.1.5 Jam Chance + +`ace_overheating_jamChance[]` + +Chance to jam the weapon. `0.0003` means 3 malfunctions on 10,000 rounds fired at this temperature. Values in-between get interpolated. Negative values are ignored and can be used to move the starting point to hotter temperatures. + +When no reliable data exists for temperature versus jam chance except MRBS, the following uniform criteria was adopted. +`[0, 1/MRBS, 5/MRBS, 25/MRBS]` + + +### 1.2 Custom Animations ```c++ class CfgWeapons { - - class Rifle_Long_Base_F; - class your_MMG: Rifle_Long_Base_F { - ACE_clearJamAction = "GestureReload"; // Custom jam clearing action. Default uses reload animation. - ACE_checkTemperatureAction = "Gear"; // Custom check temperature action. Default uses gear animation. - ACE_clearJamAction = ""; // Custom jam clearing action. Use empty string to undefine. + class MyMG { + ace_clearJamAction = "GestureReload"; // Custom jam clearing action, default uses reload animation + ace_checkTemperatureAction = "Gear"; // Custom check temperature action, default uses gear animation + ace_clearJamAction = ""; // Custom jam clearing action, use empty string to undefine }; }; ``` From 3b74cc4f47b6a8670ab92820f8274b1f82edcb6c Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 25 Aug 2015 03:50:06 +0200 Subject: [PATCH 043/170] Updated parachute-framework and reloadlaunchers-framework --- documentation/framework/parachute-framework.md | 15 ++++++--------- .../framework/reloadlaunchers-framework.md | 11 ++++------- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/documentation/framework/parachute-framework.md b/documentation/framework/parachute-framework.md index d05c330925..2548a3ab4d 100644 --- a/documentation/framework/parachute-framework.md +++ b/documentation/framework/parachute-framework.md @@ -1,22 +1,19 @@ --- layout: wiki -title: Parachute framework -description: +title: Parachute Framework +description: Explains how to set-up a parachute with ACE3 parachute system. group: framework order: 5 parent: wiki --- -## 1. Adding a reserve parachute to an existing parachute +## 1. Adding reserve parachute to existing parachute ```c++ class CfgVehicles { - - class banana_parachute; // your parachute base class - - class banana_parachute_02: banana_parachute { // your parachute class - ace_hasReserveParachute = 1; // 1 = enabled, 0 = disabled - ace_reserveParachute = "ACE_ReserveParachute"; // classname of the reserve parachute + class BananaParachute { + ace_hasReserveParachute = 1; // Add reserve parachute (1-enabled, 0-disabled) + ace_reserveParachute = "ACE_ReserveParachute"; // Classname of the reserve parachute }; }; ``` diff --git a/documentation/framework/reloadlaunchers-framework.md b/documentation/framework/reloadlaunchers-framework.md index 7d836ca8fd..0c36a6f1a7 100644 --- a/documentation/framework/reloadlaunchers-framework.md +++ b/documentation/framework/reloadlaunchers-framework.md @@ -1,7 +1,7 @@ --- layout: wiki -title: reloadlaunchers framework -description: +title: Reload Launchers Framework +description: Explains how to set-up launchers with ACE3 reload launchers system. group: framework order: 5 parent: wiki @@ -11,11 +11,8 @@ parent: wiki ```c++ class CfgWeapons { - - class Launcher_Base_F; // launcher base class - - class yourlauncher: Launcher_Base_F { // launcher class - ACE_reloadlaunchers_enabled = 1; // enable third party reload (your buddies reloading for you) + class MyLauncher { + ace_reloadlaunchers_enabled = 1; // Allow your buddies reloading for you (0-disabled, 1-enabled) }; }; ``` From 1019450c3014742366ffc1ba7da543dc27f210cb Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 25 Aug 2015 03:59:56 +0200 Subject: [PATCH 044/170] Updated sitting-framework, added unfinished note --- documentation/framework/scopes-framework.md | 23 +++++----- documentation/framework/sitting-framework.md | 47 ++++++-------------- 2 files changed, 24 insertions(+), 46 deletions(-) diff --git a/documentation/framework/scopes-framework.md b/documentation/framework/scopes-framework.md index b13d8d5e9f..fc318a13f6 100644 --- a/documentation/framework/scopes-framework.md +++ b/documentation/framework/scopes-framework.md @@ -1,28 +1,27 @@ --- layout: wiki -title: Scopes framework -description: +title: Scopes Framework +description: Explains how to set-up scopes with ACE3 scope adjustment system. group: framework order: 5 parent: wiki --- -## 1. Adding scope adjustement support +## 1. Adding scope adjustment support ```c++ class CfgWeapons { - class ItemCore; - class InventoryOpticsItem_Base_F; + class InventoryOpticsItem_Base_F; // ItemInfo base class - class yourHighPoweredScope : ItemCore { - ACE_ScopeAdjust_Vertical[] = { -4, 30 }; // max vertical adjustement limits - ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; // max horizontal adjustement limits - ACE_ScopeAdjust_VerticalIncrement = 0.1; // vertical incrementation - ACE_ScopeAdjust_HorizontalIncrement = 0.1; // horizontal incrementation - class ItemInfo : InventoryOpticsItem_Base_F { + class YourScope { + ace_scopeAdjust_vertical[] = {-4, 30}; // Maxmimum vertical adjustment limits + ace_scopeAdjust_horizontal[] = {-6, 6}; // Maximum horizontal adjustment limits + ace_scopeAdjust_verticalIncrement = 0.1; // Vertical increment + ace_scopeAdjust_horizontalIncrement = 0.1; // Horizontal increment + class ItemInfo: InventoryOpticsItem_Base_F { class OpticsModes { class Snip { - discreteDistance[] = { 100 }; + discreteDistance[] = {100}; discreteDistanceInitIndex = 0; }; }; diff --git a/documentation/framework/sitting-framework.md b/documentation/framework/sitting-framework.md index c707671c84..cc39ccdfaa 100644 --- a/documentation/framework/sitting-framework.md +++ b/documentation/framework/sitting-framework.md @@ -1,47 +1,26 @@ --- layout: wiki -title: Sitting framework -description: +title: Sitting Framework +description: Explains how to set-up sitting furniture with ACE3 sitting system. group: framework order: 5 parent: wiki --- -## 1. adding sitting support to a chair +## 1. Adding sitting support to a chair + +
+
Note:
+

Unfinished! What you see below will not work in ACE 3.2.1

+
```c++ class CfgVehicles { - - #define MACRO_SEAT_ACTION \ // better use a macro, nobody wants to type this two times or more, right ? - class ACE_Actions { \ - class ACE_MainActions { \ - displayName = "$STR_ACE_Interaction_MainAction"; \ - selection = ""; \ - distance = 1.5; \ - condition = "true"; \ - class ACE_sitting_Sit { \ - displayName = "$STR_ACE_Sitting_Sit"; \ - condition = "_this call ace_sitting_fnc_canSit"; \ - statement = "_this call ace_sitting_fnc_sit"; \ - showDisabled = 0; \ - priority = 0; \ - icon = "z\ace\sitting\UI\sit_ca.paa"; \ - }; \ - }; \ - }; - - class ThingX; // base class for objects - - class yourChair: ThingX { // your chair class - XEH_ENABLED; // enable XEH on that object class - MACRO_SEAT_ACTION // add the interaction - ACE_sitting_canSit = 1; // enable sitting - ACE_sitting_sitDirection = 180; // sitting direction in degrees - ACE_sitting_sitPosition[] = {0, -0.1, -0.45}; // sitting position in a X Y Z plane - ACE_sitting_sitRotation = 10; // maximum rotation possible in degrees, left and right. + class MyChair { + ace_sitting_canSit = 1; // Enable sitting (0-disabled, 1-enabled) + ace_sitting_sitDirection = 180; // Initial sitting direction (in degrees) + ace_sitting_sitPosition[] = {0, -0.1, -0.45}; // Sitting position in model space + ace_sitting_sitRotation = 10; // Maximum rotation possible in degrees, left and right. }; }; ``` - -- No escape possible here, you'll have to fiddle with the position direction and rotation to have a normal pose. -- For the sitRotation 10 is use for chairs with arms, 45 for the ones without. From 1048562a42e51cc2f4bcab8340ae734024734f23 Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 25 Aug 2015 04:05:43 +0200 Subject: [PATCH 045/170] Updated settings-fraemwork and how-to-report-an-issue --- documentation/framework/settings-framework.md | 38 ++++++++++--------- documentation/user/how-to-report-an-issue.md | 18 ++++----- 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/documentation/framework/settings-framework.md b/documentation/framework/settings-framework.md index 107e9378bf..b809e19a61 100644 --- a/documentation/framework/settings-framework.md +++ b/documentation/framework/settings-framework.md @@ -17,20 +17,22 @@ Part of this settings framework are global settings and client settings. Both us Settings are entries in the config that get translated to `missionNamespace` global variables. An example settings entry looks like this: ```c++ -class ACE_module_sampleSetting { - // Following 2 entries are redundant if isClientSettable = 0 - displayName = "$STR_ACE_Common_SettingName"; // Stringtable entry with the setting name - description = "$STR_ACE_Common_SettingDescription"; // Stringtable entry with the setting description +class ACE_Settings { + class ACE_module_sampleSetting { + // Following 2 entries are redundant if isClientSettable = 0 + displayName = "$STR_ACE_Common_SettingName"; // Stringtable entry with the setting name + description = "$STR_ACE_Common_SettingDescription"; // Stringtable entry with the setting description - isClientSettable = 1; // Show in client options menu (0-no, 1-yes) - typeName = "SCALAR"; // Type (BOOL/SCALAR/STRING/ARRAY/COLOR) - value = 1; // Value + isClientSettable = 1; // Show in client options menu (0-no, 1-yes) + typeName = "SCALAR"; // Type (BOOL/SCALAR/STRING/ARRAY/COLOR) + value = 1; // Value - // Following entry is redundant if typeName is NOT "SCALAR" - values[] = {"Disabled", "Enabled", "Only Cursor", "Only On Keypress", "Only Cursor and KeyPress"}; // (Optional) Stringtable entries that describe the options + // Following entry is redundant if typeName is NOT "SCALAR" + values[] = {"Disabled", "Enabled", "Only Cursor", "Only On Keypress", "Only Cursor and KeyPress"}; // (Optional) Stringtable entries that describe the options - // Following entry is present only in export - force = 0; // Force the setting (0-no, 1-yes), exported settings are forced by default + // Following entry is present only in export + force = 0; // Force the setting (0-no, 1-yes), exported settings are forced by default + }; }; ``` @@ -82,17 +84,19 @@ class ACE_Settings { #### 3.1.1 Notes - If a setting is forced it cannot be changed further down the line, see `2. Load order` for the hierarchy. -- Client settings can be forced, include them while exporting (the button is right next to export on the UI) +- Client settings can be forced, include while exporting (the button is next to export on the UI) - You can use `ACE_common_forceAllSettings` to force settings in a mission, it will lock **all** the settings (which are not already forced) to the values they are set in either modules or server config - - example of `ACE_common_forceAllSettings` - ```c++ - //^^ rest of your description.ext - //------------------------- ACE settings + +Example of `ACE_common_forceAllSettings`: +```c++ +class ACE_Settings { class ACE_common_forceAllSettings { value = 1; typeName = "BOOL"; }; - ``` +}; +``` + ### 3.2 Loading up the server config diff --git a/documentation/user/how-to-report-an-issue.md b/documentation/user/how-to-report-an-issue.md index 4960baa3af..5c6ed78997 100644 --- a/documentation/user/how-to-report-an-issue.md +++ b/documentation/user/how-to-report-an-issue.md @@ -1,7 +1,7 @@ --- layout: wiki title: How to report an issue -description: If you've found an issue with ACE3 please read this entry before reporting it. +description: If you have found an issue with ACE3 please read this entry before reporting it. group: user order: 10 parent: wiki @@ -9,13 +9,13 @@ parent: wiki ### Before reporting -If you've found an issue with ACE3 please make sure that ACE3 is really the cause of the problem. To do this try to reproduce the issue with using only `@cba_a3` and `@ACE3` on a newly created mission. +If you have found an issue with ACE3 please make sure that ACE3 is really the cause of the problem. To do this try to reproduce the issue with using only `@CBA_A3` and `@ace` on a newly created mission. Indicate if the issue appears on stable or development version. In case it is the development version, please also include the commit SHA-1 hash.
Please note:
-

It's not a valid to simply remove @ACE3 from the mod list to confirm that ACE3 is the culprit.

+

It's not a valid to simply remove @ace from the mod list to confirm that ACE3 is the culprit.

If the error happens when using a third-party mod contact the author of the appropriate mod and report the issue there.

@@ -24,29 +24,29 @@ Indicate if the issue appears on stable or development version. In case it is th Head over to the ACE3 GitHub issue tracker and press the "New issue" button in the top right corner. Add a descriptive title and copy the following issue template in to the text area: ``` -*PRO-TIP :The english language allows individuals to correct each other's mistakes in a respectful manner.* +*PRO-TIP: The english language allows individuals to correct each other's mistakes in a respectful manner.* ACE3 Version: 3.x.x (indicate if stable or dev, if dev indicate the commit the version is based on) **Mods:** -* @cba_a3 -* @ace3 +* `@CBA_A3` +* `@ace` **Placed ACE3 Modules:** * *Add the list of modules you have placed on the map. Use 'None' if the error occurs without using any modules.* **Description:** -*Add a detailed description of the error. This makes it easier for us to fix the issue.* +* Add a detailed description of the error. This makes it easier for us to fix the issue.* **Steps to reproduce:** * *Add the steps needed to reproduce the issue.* **Where did the issue occur?** -*A possible answer might be "Multiplayer", "Singleplayer"* +* A possible answer might be "Multiplayer" or "Singleplayer" or "Editor"* **RPT log file:** -*Add a link (pastebin.com) to the client or server RPT file.* +* Add a link (pastebin.com) to the client or server RPT file.* ``` A video of the issue might be helpful in resolving it faster. From d159043ce5e2a2f8eeb512cd66f7041a66adfa77 Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 25 Aug 2015 04:18:13 +0200 Subject: [PATCH 046/170] Added goggled events --- documentation/framework/goggles-framework.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/documentation/framework/goggles-framework.md b/documentation/framework/goggles-framework.md index 471f66cbac..27f762685a 100644 --- a/documentation/framework/goggles-framework.md +++ b/documentation/framework/goggles-framework.md @@ -23,3 +23,13 @@ class CfgGlasses { }; }; ``` + + +## 5. Events + +### 5.1 Listenable + +Event Name | Description | Passed Parameter(s) | Locality +---------- | ----------- | ------------------- | -------- +`"GlassesChanged"` | Glasses Changed | `[_glassesClass]` | Local +`"GlassesCracked"` | Glasses Cracked | `[_player]` | Local From 258ec6b3f2d6226ac1cdba0df2f36344830b530f Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 25 Aug 2015 04:32:04 +0200 Subject: [PATCH 047/170] Added missile-guidance and reloadlaunchers events --- documentation/framework/goggles-framework.md | 6 +++--- documentation/framework/missile-guidance-framework.md | 8 ++++++++ documentation/framework/reloadlaunchers-framework.md | 8 ++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/documentation/framework/goggles-framework.md b/documentation/framework/goggles-framework.md index 27f762685a..3dea205af9 100644 --- a/documentation/framework/goggles-framework.md +++ b/documentation/framework/goggles-framework.md @@ -25,11 +25,11 @@ class CfgGlasses { ``` -## 5. Events +## 2. Events -### 5.1 Listenable +### 2.1 Listenable Event Name | Description | Passed Parameter(s) | Locality ---------- | ----------- | ------------------- | -------- `"GlassesChanged"` | Glasses Changed | `[_glassesClass]` | Local -`"GlassesCracked"` | Glasses Cracked | `[_player]` | Local +`"GlassesCracked"` | Glasses Cracked | `[_unit]` | Local diff --git a/documentation/framework/missile-guidance-framework.md b/documentation/framework/missile-guidance-framework.md index c1bae60a93..f09a5c0bc3 100644 --- a/documentation/framework/missile-guidance-framework.md +++ b/documentation/framework/missile-guidance-framework.md @@ -107,3 +107,11 @@ class ace_missileguidance_seekerTypes { }; }; ``` + +## 5. Events + +### 5.1 Listenable + +Event Name | Description | Passed Parameter(s) | Locality +---------- | ----------- | ------------------- | -------- +`"ace_missileguidance_handoff"` | Missile handed off | `[_target, _args]` | Global diff --git a/documentation/framework/reloadlaunchers-framework.md b/documentation/framework/reloadlaunchers-framework.md index 0c36a6f1a7..612bdf67c5 100644 --- a/documentation/framework/reloadlaunchers-framework.md +++ b/documentation/framework/reloadlaunchers-framework.md @@ -16,3 +16,11 @@ class CfgWeapons { }; }; ``` + +## 2. Events + +### 2.1 Listenable + +Event Name | Description | Passed Parameter(s) | Locality +---------- | ----------- | ------------------- | -------- +`"reloadLauncher"` | Launcher reloaded | `[_unit, _target, _weapon, _magazine]` | Target From 6fc24cde83321333f7ab42ead9a117b21554d3b0 Mon Sep 17 00:00:00 2001 From: alganthe Date: Tue, 25 Aug 2015 08:51:04 +0200 Subject: [PATCH 048/170] dragging framework table fix --- documentation/framework/dragging-framework.md | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/documentation/framework/dragging-framework.md b/documentation/framework/dragging-framework.md index 661dd2d9c7..230df5d181 100644 --- a/documentation/framework/dragging-framework.md +++ b/documentation/framework/dragging-framework.md @@ -39,56 +39,56 @@ You will **not** be able to carry / drag objects that are too heavy, the mass is `ace_dragging_fnc_setDraggable` - | Arguments | Type | Optional (default value) -- | --------- | ---- | ------------------------ -0 | Any object | Object | Required -1 | Enable dragging, true to enable, false to disable | Boolean | Required -2 | Position to offset the object from player | Array | Optional (default: `[0, 0, 0]`) -3 | Direction in degree to rotate the object | Number | Optional (default: `0`) + Arguments | | Type | Optional (default value) +--- | --------- | ---- | ------------------------ +0 | Any object | Object | Required +1 | Enable dragging, true to enable, false to disable | Boolean | Required +2 | Position to offset the object from player | Array | Optional (default: `[0, 0, 0]`) +3 | Direction in degree to rotate the object | Number | Optional (default: `0`) **R** | None | None | Return value #### 2.1.1 Example 1 `[foo, true, [0, 2, 0], 45] call ace_dragging_fnc_setDraggable;` - | Arguments | Explanation -- | --------- | ----------- -0 | `foo` | My object -1 | `true` | Dragging is enabled -2 | `[0,2,0]` | 0 meters sideways, 2 meters forward, 0 meters upwards -3 | `45` | Rotated by 45° +Arguments | | Explanation +--- | --------- | ----------- +0 | `foo` | My object +1 | `true` | Dragging is enabled +2 | `[0,2,0]` | 0 meters sideways, 2 meters forward, 0 meters upwards +3 | `45` | Rotated by 45° #### 2.1.2 Example 2 `[bar, false, [3, -2, 2], 20] call ace_dragging_fnc_setDraggable;` - | Arguments | Explanation -- | --------- | ----------- -0 | `bar` | My object -1 | `false` | Dragging is disabled -2 | `[3, -2, 2]` | 3 meters sideways, 2 meters backwards, 2 meters upwards -3 | `20` | Rotated by 20° +Arguments | | Explanation +--- | --------- | ----------- +0 | `bar` | My object +1 | `false` | Dragging is disabled +2 | `[3, -2, 2]` | 3 meters sideways, 2 meters backwards, 2 meters upwards +3 | `20` | Rotated by 20° ### 2.2 Enabling / disabling carrying `ace_dragging_fnc_setCarryable` - | Arguments | Type | Optional (default value) -- | --------- | ---- | ------------------------ -0 | Any object | Object | Required -1 | Enable carrying, true to enable, false to disable | Boolean | Required -2 | Position to offset the object from player | Array | Optional (default: `[0, 1, 1]`) -3 | Direction in degree to rotate the object | Number | Optional (default: `0`) +Arguments | | Type | Optional (default value) +--- | --------- | ---- | ------------------------ +0 | Any object | Object | Required +1 | Enable carrying, true to enable, false to disable | Boolean | Required +2 | Position to offset the object from player | Array | Optional (default: `[0, 1, 1]`) +3 | Direction in degree to rotate the object | Number | Optional (default: `0`) **R** | None | None | Return value #### 2.2.1 Example `[foo, true, [0, 3, 1], 10] call ace_dragging_fnc_setCarryable;` - | Arguments | Explanation -- | --------- | ----------- -0 | `foo` | My object -1 | `true`| Carrying is enabled -2 | `[0,2,0]` | 0 meters sideways, 3 meters forward, 1 meter upwards -3 | `10` | Rotated by 10° +Arguments | | Explanation +--- | --------- | ----------- +0 | `foo` | My object +1 | `true`| Carrying is enabled +2 | `[0,2,0]` | 0 meters sideways, 3 meters forward, 1 meter upwards +3 | `10` | Rotated by 10° From e5cf6bc74c33a662200135f074568ff4f3d72efb Mon Sep 17 00:00:00 2001 From: alganthe Date: Tue, 25 Aug 2015 14:37:54 +0200 Subject: [PATCH 049/170] overpressure framework --- .../framework/overpressure-framework.md | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 documentation/framework/overpressure-framework.md diff --git a/documentation/framework/overpressure-framework.md b/documentation/framework/overpressure-framework.md new file mode 100644 index 0000000000..e3a50bfabf --- /dev/null +++ b/documentation/framework/overpressure-framework.md @@ -0,0 +1,38 @@ +--- +layout: wiki +title: Overpressure Framework +description: Explains how to set-up launchers and cannon backblasts with ACE3 overpressure system. +group: framework +order: 5 +parent: wiki +--- + +## 1. Config Values + +### 1.1 Launchers + +```c++ +class CfgWeapons { + + class MyLauncher { + ACE_overpressure_angle = 60; // cone in which the damage is applied (in degrees from the back end of the launcher) + ACE_overpressure_range = 15; // range in meters in which the damage is applied + ACE_overpressure_damage = 0.7; // damage multiplier + }; +}; +``` + +### 1.2 Cannons + +```c++ +class CfgWeapons { + + class MyBananaCannon { + ACE_overpressure_angle = 90; // cone in which the damage is applied (in degrees from the muzzle of the cannon) + ACE_overpressure_range = 50; // range in meters in which the damage is applied + ACE_overpressure_damage = 0.85; // damage multiplier + }; +}; +``` + +- You can note that the angle range and damage are higher, that's because this is a cannon and the backblast is higher. From d0f5a73dab5d8ce5eecb33ab16b03a4fde5a4538 Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 25 Aug 2015 18:31:58 +0200 Subject: [PATCH 050/170] Fixed dragging-framework tables even more --- documentation/framework/dragging-framework.md | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/documentation/framework/dragging-framework.md b/documentation/framework/dragging-framework.md index 230df5d181..ffe86a2b83 100644 --- a/documentation/framework/dragging-framework.md +++ b/documentation/framework/dragging-framework.md @@ -39,56 +39,56 @@ You will **not** be able to carry / drag objects that are too heavy, the mass is `ace_dragging_fnc_setDraggable` - Arguments | | Type | Optional (default value) ---- | --------- | ---- | ------------------------ -0 | Any object | Object | Required -1 | Enable dragging, true to enable, false to disable | Boolean | Required -2 | Position to offset the object from player | Array | Optional (default: `[0, 0, 0]`) -3 | Direction in degree to rotate the object | Number | Optional (default: `0`) -**R** | None | None | Return value +| | Arguments | Type | Optional (default value) +| - | --------- | ---- | ------------------------ +| 0 | Any object | Object | Required +| 1 | Enable dragging, true to enable, false to disable | Boolean | Required +| 2 | Position to offset the object from player | Array | Optional (default: `[0, 0, 0]`) +| 3 | Direction in degree to rotate the object | Number | Optional (default: `0`) +| **R** | None | None | Return value #### 2.1.1 Example 1 `[foo, true, [0, 2, 0], 45] call ace_dragging_fnc_setDraggable;` -Arguments | | Explanation ---- | --------- | ----------- -0 | `foo` | My object -1 | `true` | Dragging is enabled -2 | `[0,2,0]` | 0 meters sideways, 2 meters forward, 0 meters upwards -3 | `45` | Rotated by 45° +| | Arguments | Explanation +| - | --------- | ----------- +| 0 | `foo` | My object +| 1 | `true` | Dragging is enabled +| 2 | `[0,2,0]` | 0 meters sideways, 2 meters forward, 0 meters upwards +| 3 | `45` | Rotated by 45° #### 2.1.2 Example 2 `[bar, false, [3, -2, 2], 20] call ace_dragging_fnc_setDraggable;` -Arguments | | Explanation ---- | --------- | ----------- -0 | `bar` | My object -1 | `false` | Dragging is disabled -2 | `[3, -2, 2]` | 3 meters sideways, 2 meters backwards, 2 meters upwards -3 | `20` | Rotated by 20° +| | Arguments | Explanation +| - | --------- | ----------- +| 0 | `bar` | My object +| 1 | `false` | Dragging is disabled +| 2 | `[3, -2, 2]` | 3 meters sideways, 2 meters backwards, 2 meters upwards +| 3 | `20` | Rotated by 20° ### 2.2 Enabling / disabling carrying `ace_dragging_fnc_setCarryable` -Arguments | | Type | Optional (default value) ---- | --------- | ---- | ------------------------ -0 | Any object | Object | Required -1 | Enable carrying, true to enable, false to disable | Boolean | Required -2 | Position to offset the object from player | Array | Optional (default: `[0, 1, 1]`) -3 | Direction in degree to rotate the object | Number | Optional (default: `0`) -**R** | None | None | Return value +| | Arguments | Type | Optional (default value) +| - | --------- | ---- | ------------------------ +| 0 | Any object | Object | Required +| 1 | Enable carrying, true to enable, false to disable | Boolean | Required +| 2 | Position to offset the object from player | Array | Optional (default: `[0, 1, 1]`) +| 3 | Direction in degree to rotate the object | Number | Optional (default: `0`) +| **R** | None | None | Return value #### 2.2.1 Example `[foo, true, [0, 3, 1], 10] call ace_dragging_fnc_setCarryable;` -Arguments | | Explanation ---- | --------- | ----------- -0 | `foo` | My object -1 | `true`| Carrying is enabled -2 | `[0,2,0]` | 0 meters sideways, 3 meters forward, 1 meter upwards -3 | `10` | Rotated by 10° +| | Arguments | Explanation +| - | --------- | ----------- +| 0 | `foo` | My object +| 1 | `true`| Carrying is enabled +| 2 | `[0,2,0]` | 0 meters sideways, 3 meters forward, 1 meter upwards +| 3 | `10` | Rotated by 10° From 3470346d301ccafad0d5789438501871c447a4bc Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 25 Aug 2015 18:39:58 +0200 Subject: [PATCH 051/170] Fixed tables even more --- documentation/framework/dragging-framework.md | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/documentation/framework/dragging-framework.md b/documentation/framework/dragging-framework.md index ffe86a2b83..14352182b7 100644 --- a/documentation/framework/dragging-framework.md +++ b/documentation/framework/dragging-framework.md @@ -39,56 +39,56 @@ You will **not** be able to carry / drag objects that are too heavy, the mass is `ace_dragging_fnc_setDraggable` -| | Arguments | Type | Optional (default value) -| - | --------- | ---- | ------------------------ -| 0 | Any object | Object | Required -| 1 | Enable dragging, true to enable, false to disable | Boolean | Required -| 2 | Position to offset the object from player | Array | Optional (default: `[0, 0, 0]`) -| 3 | Direction in degree to rotate the object | Number | Optional (default: `0`) -| **R** | None | None | Return value + | Arguments | Type | Optional (default value) +---| --------- | ---- | ------------------------ +0 | Any object | Object | Required +1 | Enable dragging, true to enable, false to disable | Boolean | Required +2 | Position to offset the object from player | Array | Optional (default: `[0, 0, 0]`) +3 | Direction in degree to rotate the object | Number | Optional (default: `0`) +**R** | None | None | Return value #### 2.1.1 Example 1 `[foo, true, [0, 2, 0], 45] call ace_dragging_fnc_setDraggable;` -| | Arguments | Explanation -| - | --------- | ----------- -| 0 | `foo` | My object -| 1 | `true` | Dragging is enabled -| 2 | `[0,2,0]` | 0 meters sideways, 2 meters forward, 0 meters upwards -| 3 | `45` | Rotated by 45° + | Arguments | Explanation +---| --------- | ----------- +0 | `foo` | My object +1 | `true` | Dragging is enabled +2 | `[0,2,0]` | 0 meters sideways, 2 meters forward, 0 meters upwards +3 | `45` | Rotated by 45° #### 2.1.2 Example 2 `[bar, false, [3, -2, 2], 20] call ace_dragging_fnc_setDraggable;` -| | Arguments | Explanation -| - | --------- | ----------- -| 0 | `bar` | My object -| 1 | `false` | Dragging is disabled -| 2 | `[3, -2, 2]` | 3 meters sideways, 2 meters backwards, 2 meters upwards -| 3 | `20` | Rotated by 20° + | Arguments | Explanation +---| --------- | ----------- +0 | `bar` | My object +1 | `false` | Dragging is disabled +2 | `[3, -2, 2]` | 3 meters sideways, 2 meters backwards, 2 meters upwards +3 | `20` | Rotated by 20° ### 2.2 Enabling / disabling carrying `ace_dragging_fnc_setCarryable` -| | Arguments | Type | Optional (default value) -| - | --------- | ---- | ------------------------ -| 0 | Any object | Object | Required -| 1 | Enable carrying, true to enable, false to disable | Boolean | Required -| 2 | Position to offset the object from player | Array | Optional (default: `[0, 1, 1]`) -| 3 | Direction in degree to rotate the object | Number | Optional (default: `0`) -| **R** | None | None | Return value + | Arguments | Type | Optional (default value) +---| --------- | ---- | ------------------------ +0 | Any object | Object | Required +1 | Enable carrying, true to enable, false to disable | Boolean | Required +2 | Position to offset the object from player | Array | Optional (default: `[0, 1, 1]`) +3 | Direction in degree to rotate the object | Number | Optional (default: `0`) +**R** | None | None | Return value #### 2.2.1 Example `[foo, true, [0, 3, 1], 10] call ace_dragging_fnc_setCarryable;` -| | Arguments | Explanation -| - | --------- | ----------- -| 0 | `foo` | My object -| 1 | `true`| Carrying is enabled -| 2 | `[0,2,0]` | 0 meters sideways, 3 meters forward, 1 meter upwards -| 3 | `10` | Rotated by 10° + | Arguments | Explanation +---| --------- | ----------- +0 | `foo` | My object +1 | `true`| Carrying is enabled +2 | `[0,2,0]` | 0 meters sideways, 3 meters forward, 1 meter upwards +3 | `10` | Rotated by 10° From 9ffa7701477a56d2b1b8dc34a46e383b70d287b1 Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 25 Aug 2015 18:46:03 +0200 Subject: [PATCH 052/170] Small fix in overpressure-framework --- .../framework/overpressure-framework.md | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/documentation/framework/overpressure-framework.md b/documentation/framework/overpressure-framework.md index e3a50bfabf..62e077a3ff 100644 --- a/documentation/framework/overpressure-framework.md +++ b/documentation/framework/overpressure-framework.md @@ -1,7 +1,7 @@ --- layout: wiki title: Overpressure Framework -description: Explains how to set-up launchers and cannon backblasts with ACE3 overpressure system. +description: Explains how to set-up launchers and cannons with backblast and overpressure areas with the ACE3 overpressure system. group: framework order: 5 parent: wiki @@ -13,11 +13,10 @@ parent: wiki ```c++ class CfgWeapons { - class MyLauncher { - ACE_overpressure_angle = 60; // cone in which the damage is applied (in degrees from the back end of the launcher) - ACE_overpressure_range = 15; // range in meters in which the damage is applied - ACE_overpressure_damage = 0.7; // damage multiplier + ace_overpressure_angle = 60; // Cone in which the damage is applied (in degrees from the back end of the launcher) + ace_overpressure_range = 15; // Range in meters in which the damage is applied + ace_overpressure_damage = 0.7; // Damage multiplier }; }; ``` @@ -26,13 +25,12 @@ class CfgWeapons { ```c++ class CfgWeapons { - class MyBananaCannon { - ACE_overpressure_angle = 90; // cone in which the damage is applied (in degrees from the muzzle of the cannon) - ACE_overpressure_range = 50; // range in meters in which the damage is applied - ACE_overpressure_damage = 0.85; // damage multiplier + ace_overpressure_angle = 90; // Cone in which the damage is applied (in degrees from the muzzle of the cannon) + ace_overpressure_range = 50; // Range in meters in which the damage is applied + ace_overpressure_damage = 0.85; // Damage multiplier }; }; ``` -- You can note that the angle range and damage are higher, that's because this is a cannon and the backblast is higher. +- You can note that the angle range and damage values are higher, that's because this is a cannon and the backblast area is bigger. From ac645ef186493db00b11f99991a9cf65266e99e5 Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 25 Aug 2015 18:52:41 +0200 Subject: [PATCH 053/170] Added events to overpressure-framework --- documentation/framework/overpressure-framework.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/documentation/framework/overpressure-framework.md b/documentation/framework/overpressure-framework.md index 62e077a3ff..229200cb46 100644 --- a/documentation/framework/overpressure-framework.md +++ b/documentation/framework/overpressure-framework.md @@ -34,3 +34,12 @@ class CfgWeapons { ``` - You can note that the angle range and damage values are higher, that's because this is a cannon and the backblast area is bigger. + + +## 2. Events + +### 2.1 Listenable + +Event Name | Description | Passed Parameter(s) | Locality +---------- | ----------- | ------------------- | -------- +`"overpressure"` | Overpressure damage inflicted | `[_firer, _position, _direction, _weapon]` | Target From 0cfb492916ba7d58865bbaf617432e9c82681147 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Wed, 26 Aug 2015 10:04:51 +0200 Subject: [PATCH 054/170] Fixes and removal of duplicate code --- .../fnc_actionCheckBloodPressureLocal.sqf | 2 +- addons/medical/functions/fnc_createLitter.sqf | 6 +- .../fnc_displayPatientInformation.sqf | 6 +- addons/medical/functions/fnc_handleDamage.sqf | 87 +++------ .../functions/fnc_handleDamage_advanced.sqf | 8 +- .../functions/fnc_handleDamage_basic2.sqf | 170 +++--------------- .../functions/fnc_handleDamage_caching.sqf | 20 ++- .../functions/fnc_handleDamage_wounds.sqf | 4 + .../fnc_treatmentAdvanced_bandage.sqf | 2 +- .../fnc_treatmentAdvanced_bandageLocal.sqf | 4 +- 10 files changed, 80 insertions(+), 229 deletions(-) diff --git a/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf b/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf index c4c90845fd..6f58683d61 100644 --- a/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf +++ b/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf @@ -22,7 +22,7 @@ _bloodPressure = if (!alive _target) then { } else { [_target] call FUNC(getBloodPressure) }; -_bloodPressure params ["_bloodPressureLow", "_bloodPressureLow"]; +_bloodPressure params ["_bloodPressureHigh", "_bloodPressureLow"]; _output = ""; _logOutPut = ""; if ([_caller] call FUNC(isMedic)) then { diff --git a/addons/medical/functions/fnc_createLitter.sqf b/addons/medical/functions/fnc_createLitter.sqf index b25a3bbf94..c234574abc 100644 --- a/addons/medical/functions/fnc_createLitter.sqf +++ b/addons/medical/functions/fnc_createLitter.sqf @@ -39,7 +39,7 @@ _litter = getArray (_config >> "litter"); _createLitter = { private["_position", "_direction"]; - params ["_unit", "_litter"]; + params ["_unit", "_litterClass"]; // @TODO: handle carriers over water // For now, don't spawn litter if we are over water to avoid floating litter if(surfaceIsWater (getPos _unit)) exitWith { false }; @@ -55,7 +55,7 @@ _createLitter = { // 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 - [QGVAR(createLitter), [_litterClass,_position,_direction], 0] call EFUNC(common,syncedEvent); + [QGVAR(createLitter), [_litterClass, _position, _direction], 0] call EFUNC(common,syncedEvent); true }; @@ -65,7 +65,7 @@ _createdLitter = []; if (typeName _x == "ARRAY") then { if (count _x < MIN_ENTRIES_LITTER_CONFIG) exitwith {}; - params ["_selection", "_litterCondition", "_litterOptions"]; + _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. diff --git a/addons/medical/functions/fnc_displayPatientInformation.sqf b/addons/medical/functions/fnc_displayPatientInformation.sqf index 82622bdca6..934bcc72dc 100644 --- a/addons/medical/functions/fnc_displayPatientInformation.sqf +++ b/addons/medical/functions/fnc_displayPatientInformation.sqf @@ -18,8 +18,8 @@ // Exit for basic medical if (GVAR(level) < 2) exitWith {}; -private ["_target", "_show", "_selectionN", "_amountOfGeneric", "_bandagedwounds", "_logCtrl", "_part", "_partText", "_pointDamage", "_severity", "_total", "_totalIvVolume", "_triageStatus", "_type"]; -params ["_target", ["_target", true], ["_selectionN", 0]]; +private ["_amountOfGeneric", "_bandagedwounds", "_logCtrl", "_part", "_partText", "_pointDamage", "_severity", "_total", "_totalIvVolume", "_triageStatus", "_type"]; +params ["_target", ["_show", true], ["_selectionN", 0]]; GVAR(currentSelectedSelectionN) = if (typeName _selectionN == "SCALAR") then {_selectionN} else {0}; GVAR(displayPatientInformationTarget) = if (_show) then {_target} else {ObjNull}; @@ -203,7 +203,7 @@ if (_show) then { _logs = _target getvariable [QGVAR(logFile_Activity), []]; { // [_message,_moment,_type, _arguments] - _x params ["_message", "_moment", "_arguments"]; + _x params ["_message", "_moment", "_type", "_arguments"]; if (isLocalized _message) then { _message = localize _message; }; diff --git a/addons/medical/functions/fnc_handleDamage.sqf b/addons/medical/functions/fnc_handleDamage.sqf index eb6c2aa9b2..444643c806 100644 --- a/addons/medical/functions/fnc_handleDamage.sqf +++ b/addons/medical/functions/fnc_handleDamage.sqf @@ -31,79 +31,46 @@ if (typeName _projectile == "OBJECT") then { if !(_selection in (GVAR(SELECTIONS) + [""])) exitWith {0}; // Exit if we disable damage temporarily -_damageOld = damage _unit; -if (_selection in GVAR(SELECTIONS)) then { - _damageOld = _unit getHit _selection; +if !(_unit getVariable [QGVAR(allowDamage), true]) exitWith { + _damageOld = damage _unit; + if (_selection in GVAR(SELECTIONS)) then { + _damageOld = _unit getHit _selection; + }; + _damageOld; }; -if !(_unit getVariable [QGVAR(allowDamage), true]) exitWith {_damageOld}; // Get return damage _damageReturn = _damage; -if (GVAR(level) < 2) then { - _newDamage = _this call FUNC(handleDamage_basic2); - _projectile = _this select 4; - _typeOfDamage = [_projectile] call FUNC(getTypeOfDamage); - _typeIndex = (GVAR(allAvailableDamageTypes) find _typeOfDamage); - _minLethalDamage = 0.01; - if (_typeIndex >= 0) then { - _minLethalDamage = GVAR(minLethalDamages) select _typeIndex; +_newDamage = _this call FUNC(handleDamage_caching); +// handleDamage_caching may have modified the projectile string +_typeOfDamage = [_projectile] call FUNC(getTypeOfDamage); + +_typeIndex = (GVAR(allAvailableDamageTypes) find _typeOfDamage); +_minLethalDamage = 0.01; +if (_typeIndex >= 0) then { + _minLethalDamage = GVAR(minLethalDamages) select _typeIndex; +}; + +if (vehicle _unit != _unit && {!(vehicle _unit isKindOf "StaticWeapon")} && {isNull _shooter} && {_projectile == ""} && {_selection == ""}) then { + if (GVAR(enableVehicleCrashes)) then { + _selection = GVAR(SELECTIONS) select (floor(random(count GVAR(SELECTIONS)))); }; +}; - if (vehicle _unit != _unit && {!(vehicle _unit isKindOf "StaticWeapon")} && {isNull _shooter} && {_projectile == ""} && {_selection == ""}) then { - if (GVAR(enableVehicleCrashes)) then { - _selection = GVAR(SELECTIONS) select (floor(random(count GVAR(SELECTIONS)))); - }; +if ((_minLethalDamage <= _newDamage) && {[_unit, [_selection] call FUNC(selectionNameToNumber), _newDamage] call FUNC(determineIfFatal)}) then { + if ((_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)])) exitwith { + _damageReturn = 0.9; }; - - if ((_minLethalDamage <= _newDamage) && {[_unit, [_selection] call FUNC(selectionNameToNumber), _newDamage] call FUNC(determineIfFatal)}) then { - 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; - }; + if ([_unit] call FUNC(setDead)) then { + _damageReturn = 1; } else { _damageReturn = _damageReturn min 0.89; }; } else { - if !([_unit] call FUNC(hasMedicalEnabled)) exitwith { - // 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 - _typeOfDamage = [_projectile] call FUNC(getTypeOfDamage); - - _typeIndex = (GVAR(allAvailableDamageTypes) find _typeOfDamage); - _minLethalDamage = 0.01; - if (_typeIndex >= 0) then { - _minLethalDamage = GVAR(minLethalDamages) select _typeIndex; - }; - - if (vehicle _unit != _unit && {!(vehicle _unit isKindOf "StaticWeapon")} && {isNull _shooter} && {_projectile == ""} && {_selection == ""}) then { - if (GVAR(enableVehicleCrashes)) then { - _selection = GVAR(SELECTIONS) select (floor(random(count GVAR(SELECTIONS)))); - }; - }; - - if ((_minLethalDamage <= _newDamage) && {[_unit, [_selection] call FUNC(selectionNameToNumber), _newDamage] call FUNC(determineIfFatal)}) then { - 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 { - _damageReturn = _damageReturn min 0.89; - }; - + _damageReturn = _damageReturn min 0.89; }; + [_unit] call FUNC(addToInjuredCollection); if (_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)]) exitWith { diff --git a/addons/medical/functions/fnc_handleDamage_advanced.sqf b/addons/medical/functions/fnc_handleDamage_advanced.sqf index f1ba5cc6f0..09ea6cd3db 100644 --- a/addons/medical/functions/fnc_handleDamage_advanced.sqf +++ b/addons/medical/functions/fnc_handleDamage_advanced.sqf @@ -20,7 +20,7 @@ #include "script_component.hpp" private ["_typeOfProjectile", "_part", "_damageBodyParts", "_hitPoints"]; -params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfDamage", "_newDamage"]; +params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfProjectile", "_newDamage"]; // Most likely taking exessive fire damage. Lets exit. if (isNull _sourceOfDamage && {_typeOfProjectile == ""} && {vehicle _unit == _unit} && {(_selectionName == "head" || isBurning _unit)}) exitwith {}; @@ -35,7 +35,11 @@ _damageBodyParts set [_part, (_damageBodyParts select _part) + _newDamage]; _unit setvariable [QGVAR(bodyPartStatus), _damageBodyParts, true]; _typeOfDamage = [_typeOfProjectile] call FUNC(getTypeOfDamage); -[_unit, _selectionName, _newDamage, _typeOfProjectile, _typeOfDamage] call FUNC(handleDamage_assignWounds); + + +systemChat format["ASSIGNING INJURIES: %1", _unit]; + +[_unit, _selectionName, _newDamage, _typeOfProjectile, _typeOfDamage] call FUNC(handleDamage_wounds); //FUNC(handleDamage_assignWounds); // TODO Disabled until implemented fully //if (GVAR(enableAirway)) then { diff --git a/addons/medical/functions/fnc_handleDamage_basic2.sqf b/addons/medical/functions/fnc_handleDamage_basic2.sqf index 9da6fd405d..3a79b1525f 100644 --- a/addons/medical/functions/fnc_handleDamage_basic2.sqf +++ b/addons/medical/functions/fnc_handleDamage_basic2.sqf @@ -3,12 +3,6 @@ * Cache a handleDamage call to execute it 3 frames later * * Arguments: - * 0: Unit That Was Hit - * 1: Name Of Hit Selection - * 2: Amount Of Damage - * 3: Shooter - * 4: Projectile - * 5: Current damage to be returned * * Return Value: * @@ -18,151 +12,29 @@ #include "script_component.hpp" -private ["_unit", "_selectionName", "_damage", "_source", "_projectile", "_hitSelections", "_hitPoints", "_impactVelocity", "_newDamage", "_cache_hitpoints", "_cache_projectiles", "_cache_params", "_cache_damages"]; -_unit = _this select 0; -_selectionName = _this select 1; -_damage = _this select 2; -_source = _this select 3; -_projectile = _this select 4; +private ["_damageBodyParts", "_cache_params", "_cache_damages"]; +params ["_target"]; -_hitSelections = GVAR(SELECTIONS); -_hitPoints = GVAR(HITPOINTS); +_damageBodyParts = _target getvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]; +_cache_params = _target getVariable [QGVAR(cachedHandleDamageParams), []]; +_cache_damages = _target getVariable QGVAR(cachedDamages); -// Calculate change in damage. -_newDamage = _damage - (damage _unit); -if (_selectionName in _hitSelections) then { - _newDamage = _damage - (_unit getHitPointDamage (_hitPoints select (_hitSelections find _selectionName))); -}; - -//_damage = _damage + _newDamage; - -// Check for vehicle crash -if (vehicle _unit != _unit && {!(vehicle _unit isKindOf "StaticWeapon")} && {isNull _source} && {_projectile == ""} && {_selectionName == ""}) then { - if (GVAR(enableVehicleCrashes)) then { - _selectionName = _hitSelections select (floor(random(count _hitSelections))); - _projectile = "vehiclecrash"; - _this set [1, _selectionName]; - _this set [4, _projectile]; +{ + _x params ["_unit","_selectionName","_amountOfDamage","_sourceOfDamage","_typeOfProjectile","_typeOfDamage"]; + if !(isNull _sourceOfDamage && {_typeOfProjectile == ""} && {vehicle _unit == _unit} && {(_selectionName == "head" || isBurning _unit)}) then { + _part = [_selectionName] call FUNC(selectionNameToNumber); + if (_part < 0) exitwith {}; + _damageBodyParts set [_part, (_damageBodyParts select _part) + (_cache_damages select _foreachIndex)]; }; -}; +}foreach _cache_params; +_target setvariable [QGVAR(bodyPartStatus), _damageBodyParts, true]; -// Handle falling damage -_impactVelocity = (velocity _unit) select 2; -if (_impactVelocity < -5 && {vehicle _unit == _unit}) then { - _unit setVariable [QGVAR(isFalling), true]; - _unit setVariable [QGVAR(impactVelocity), _impactVelocity]; -}; -if (_unit getVariable [QGVAR(isFalling), false]) then { - if !(_selectionName in ["", "leg_l", "leg_r"]) then { - if (_selectionName == "body") then { - _newDamage = _newDamage * abs(_unit getVariable [QGVAR(impactVelocity), _impactVelocity]) / 50; - } else { - _newDamage = _newDamage * 0.5; - }; - } else { - if (_selectionName == "") then { - _selectionName = ["leg_l", "leg_r"] select (floor(random 2)); - _this set [1, _selectionName]; - }; - _newDamage = _newDamage * 0.7; - }; - _projectile = "falling"; - _this set [4, "falling"]; -}; +EXPLODE_6_PVT(_damageBodyParts,_headDamage,_torsoDamage,_handsDamageR,_handsDamageL,_legsDamageR,_legsDamageL); +_target setHitPointDamage ["hitHead", _headDamage min 0.95]; +_target setHitPointDamage ["hitBody", _torsoDamage min 0.95]; +_target setHitPointDamage ["hitHands", (_handsDamageR + _handsDamageL) min 0.95]; +_target setHitPointDamage ["hitLegs", (_legsDamageR + _legsDamageL) min 0.95]; -// Finished with the current frame, reset variables -// Note: sometimes handleDamage spans over 2 or even 3 frames. -if (diag_frameno > (_unit getVariable [QGVAR(frameNo_damageCaching), -3]) + 2) then { - _unit setVariable [QGVAR(frameNo_damageCaching), diag_frameno]; - - // handle the cached damages 3 frames later - [{ - params ["_args", "_id"]; - _args params ["_target", "_frameNo"]; - - if (diag_frameno > _frameNo + 2) then { - _target setDamage 0; - - _cache_params = _target getVariable [QGVAR(cachedHandleDamageParams), []]; - _cache_damages = _target getVariable QGVAR(cachedDamages); - _damageBodyParts = _target getvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]; - { - _x params ["_unit","_selectionName","_amountOfDamage","_sourceOfDamage","_typeOfProjectile","_typeOfDamage"]; - if !(isNull _sourceOfDamage && {_typeOfProjectile == ""} && {vehicle _unit == _unit} && {(_selectionName == "head" || isBurning _unit)}) then { - _part = [_selectionName] call FUNC(selectionNameToNumber); - if (_part < 0) exitwith {}; - _damageBodyParts set [_part, (_damageBodyParts select _part) + (_cache_damages select _foreachIndex)]; - }; - }foreach _cache_params; - _unit setvariable [QGVAR(bodyPartStatus), _damageBodyParts, true]; - - EXPLODE_6_PVT(_damageBodyParts,_headDamage,_torsoDamage,_handsDamageR,_handsDamageL,_legsDamageR,_legsDamageL); - _target setHitPointDamage ["hitHead", _headDamage min 0.95]; - _target setHitPointDamage ["hitBody", _torsoDamage min 0.95]; - _target setHitPointDamage ["hitHands", (_handsDamageR + _handsDamageL) min 0.95]; - _target setHitPointDamage ["hitLegs", (_legsDamageR + _legsDamageL) min 0.95]; - - { - _target setHitPointDamage [_x, (_damageBodyParts select _foreachIndex) min 0.95]; - }foreach GVAR(HITPOINTS); - [_id] call cba_fnc_removePerFrameHandler; - }; - }, 0, [_unit, diag_frameno] ] call CBA_fnc_addPerFrameHandler; - - _unit setVariable [QGVAR(cachedProjectiles), []]; - _unit setVariable [QGVAR(cachedHitPoints), []]; - _unit setVariable [QGVAR(cachedDamages), []]; - _unit setVariable [QGVAR(cachedHandleDamageParams), []]; -}; - -// Caching of the damage events -if (_selectionName != "") then { - _cache_projectiles = _unit getVariable QGVAR(cachedProjectiles); - private ["_index","_otherDamage"]; - _index = _cache_projectiles find _projectile; - // Check if the current projectile has already been handled once - if (_index >= 0 && {_projectile != "falling"}) exitwith { - _cache_damages = _unit getVariable QGVAR(cachedDamages); - // Find the previous damage this projectile has done - _otherDamage = (_cache_damages select _index); - - // Take the highest damage of the two - if (_newDamage > _otherDamage) then { - _cache_params = _unit getVariable QGVAR(cachedHandleDamageParams); - _cache_hitpoints = _unit getVariable QGVAR(cachedHitPoints); - - private ["_hitPoint", "_restore"]; - // Restore the damage before the previous damage was processed - _hitPoint = _cache_hitpoints select _index; - _restore = ((_unit getHitPointDamage _hitPoint) - _otherDamage) max 0; - _unit setHitPointDamage [_hitPoint, _restore]; - - _cache_hitpoints set [_index, (_hitPoints select (_hitSelections find _selectionName))]; - _cache_damages set [_index, _newDamage]; - _cache_params set[_index, _this]; - - _unit setVariable [QGVAR(cachedProjectiles), _cache_projectiles]; - _unit setVariable [QGVAR(cachedHitPoints), _cache_hitpoints]; - _unit setVariable [QGVAR(cachedDamages), _cache_damages]; - _unit setVariable [QGVAR(cachedHandleDamageParams), _cache_params]; - }; - }; - - _cache_hitpoints = _unit getVariable QGVAR(cachedHitPoints); - _cache_damages = _unit getVariable QGVAR(cachedDamages); - _cache_params = _unit getVariable QGVAR(cachedHandleDamageParams); - - // This is an unhandled projectile - _cache_projectiles pushBack _projectile; - _cache_hitpoints pushBack (_hitPoints select (_hitSelections find _selectionName)); - _cache_damages pushBack _newDamage; - _cache_params pushBack _this; - - // Store the new cached values - _unit setVariable [QGVAR(cachedProjectiles), _cache_projectiles]; - _unit setVariable [QGVAR(cachedHitPoints), _cache_hitpoints]; - _unit setVariable [QGVAR(cachedDamages), _cache_damages]; - _unit setVariable [QGVAR(cachedHandleDamageParams), _cache_params]; -}; - -_newDamage; +{ + _target setHitPointDamage [_x, (_damageBodyParts select _foreachIndex) min 0.95]; +}foreach GVAR(HITPOINTS); diff --git a/addons/medical/functions/fnc_handleDamage_caching.sqf b/addons/medical/functions/fnc_handleDamage_caching.sqf index a9825a5c88..2422dcd9e3 100644 --- a/addons/medical/functions/fnc_handleDamage_caching.sqf +++ b/addons/medical/functions/fnc_handleDamage_caching.sqf @@ -79,15 +79,17 @@ if (diag_frameno > (_unit getVariable [QGVAR(frameNo_damageCaching), -3]) + 2) t if (diag_frameno > _frameno + 2) then { _unit setDamage 0; - _cache_params = _unit getVariable [QGVAR(cachedHandleDamageParams), []]; - _cache_damages = _unit getVariable QGVAR(cachedDamages); - { - _params = _x + [_cache_damages select _foreachIndex]; - _params call FUNC(handleDamage_advanced); - } foreach _cache_params; - - [_unit] call FUNC(handleDamage_advancedSetDamage); - + if (GVAR(level) < 2 || {!([_unit] call FUNC(hasMedicalEnabled))}) then { + [_unit] call FUNC(handleDamage_basic2); + } else { + _cache_params = _unit getVariable [QGVAR(cachedHandleDamageParams), []]; + _cache_damages = _unit getVariable QGVAR(cachedDamages); + { + _params = _x + [_cache_damages select _foreachIndex]; + _params call FUNC(handleDamage_advanced); + } foreach _cache_params; + [_unit] call FUNC(handleDamage_advancedSetDamage); + }; [_idPFH] call CBA_fnc_removePerFrameHandler; }; }, 0, [_unit, diag_frameno] ] call CBA_fnc_addPerFrameHandler; diff --git a/addons/medical/functions/fnc_handleDamage_wounds.sqf b/addons/medical/functions/fnc_handleDamage_wounds.sqf index 4438e9bb90..10aec5c459 100644 --- a/addons/medical/functions/fnc_handleDamage_wounds.sqf +++ b/addons/medical/functions/fnc_handleDamage_wounds.sqf @@ -20,11 +20,15 @@ private ["_bodyPartn", "_injuryTypeInfo", "_allInjuriesForDamageType", "_allPossibleInjuries", "_highestPossibleDamage", "_highestPossibleSpot", "_minDamage", "_openWounds", "_woundID", "_toAddInjury", "_painToAdd", "_bloodLoss", "_bodyPartNToAdd", "_classType", "_damageLevels", "_foundIndex", "_i", "_injury", "_maxDamage", "_pain", "_painLevel", "_selections", "_toAddClassID", "_woundsCreated"]; params ["_unit", "_selectionName", "_damage", "_typeOfProjectile", "_typeOfDamage"]; +systemChat format["input: %1", _this]; +diag_log format["input: %1", _this]; + // Administration for open wounds and ids _openWounds = _unit getvariable[QGVAR(openWounds), []]; _woundID = _unit getvariable[QGVAR(lastUniqueWoundID), 1]; _extensionOutput = "ace_medical" callExtension format ["HandleDamageWounds,%1,%2,%3,%4", _selectionName, _damage, _typeOfDamage, _woundID]; +systemChat format["EXTENSION OUTPUT: %1", _extensionOutput]; _painToAdd = 0; _woundsCreated = []; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf b/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf index f2159c37ef..aa3669c227 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf @@ -17,7 +17,7 @@ */ #include "script_component.hpp" -params ["_caller", "_target", "_selectionName", "_className", "_items", ["_specificSpot", -1]]; +params ["_caller", "_target", "_selectionName", "_className", "_items", "", ["_specificSpot", -1]]; if !([_target] call FUNC(hasMedicalEnabled)) exitwith { _this call FUNC(treatmentBasic_bandage); diff --git a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf index b36a551458..effa1e74a7 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf @@ -40,7 +40,8 @@ _effectivenessFound = -1; _mostEffectiveInjury = _openWounds select 0; _exit = false; { - params ["", "_classID", "_partX"]; + _x params ["", "_classID", "_partX"]; + diag_log format["OPENWOUND: %1", _x]; // Only parse injuries that are for the selected bodypart. if (_partX == _part) then { _woundEffectivenss = _effectiveness; @@ -56,6 +57,7 @@ _exit = false; }; }; + diag_log format["_specificClass: %1 vs classId %2", _specificClass, _classID]; if (_specificClass == _classID) exitwith { _effectivenessFound = _woundEffectivenss; _mostEffectiveSpot = _foreachIndex; From c0379c78097cc233baf72da9df063f9bc645aef5 Mon Sep 17 00:00:00 2001 From: jonpas Date: Wed, 26 Aug 2015 17:02:29 +0200 Subject: [PATCH 055/170] Updated with correct cargo events and settings category --- addons/repair/ACE_Settings.hpp | 2 +- addons/repair/functions/fnc_addSpareParts.sqf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/repair/ACE_Settings.hpp b/addons/repair/ACE_Settings.hpp index 9116ff61ef..9dbcd21731 100644 --- a/addons/repair/ACE_Settings.hpp +++ b/addons/repair/ACE_Settings.hpp @@ -66,6 +66,6 @@ class ACE_Settings { description = CSTRING(addSpareParts_description); typeName = "BOOL"; value = 1; - category = CSTRING(categoryName); + category = ECSTRING(OptionsMenu,CategoryLogistics); }; }; diff --git a/addons/repair/functions/fnc_addSpareParts.sqf b/addons/repair/functions/fnc_addSpareParts.sqf index 4ec01a6cc1..c7366b27ba 100644 --- a/addons/repair/functions/fnc_addSpareParts.sqf +++ b/addons/repair/functions/fnc_addSpareParts.sqf @@ -42,4 +42,4 @@ if (_part == "") then { if (_part == "") exitWith {}; // Load -["AddCargoItem", [_part, _vehicle, _amount]] call EFUNC(common,localEvent); +["AddCargoByClass", [_part, _vehicle, _amount]] call EFUNC(common,localEvent); From 6d27299883141e48f60b23c66bbaa2a5881e6f94 Mon Sep 17 00:00:00 2001 From: jonpas Date: Wed, 26 Aug 2015 23:43:06 +0200 Subject: [PATCH 056/170] Cleaned up spare parts collection after SettingsInitialized, Check if vehicle already in collection --- addons/repair/XEH_postInit.sqf | 5 ++++- addons/repair/functions/fnc_addSpareParts.sqf | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/addons/repair/XEH_postInit.sqf b/addons/repair/XEH_postInit.sqf index d61f20a31e..7095b0bfd0 100644 --- a/addons/repair/XEH_postInit.sqf +++ b/addons/repair/XEH_postInit.sqf @@ -10,12 +10,15 @@ if (isServer) then { ["SettingsInitialized", { GVAR(settingInitted) = true; // Stop collecting in FUNC(addSpareParts) - // Exit if adding spare parts disabled + // Exit if adding spare parts disabled and clean collection if (!GVAR(addSpareParts)) exitWith {GVAR(addSparePartsCollection) = nil}; // Add spare parts to vehicles in collection { [_x] call FUNC(addSpareParts); } forEach GVAR(addSparePartsCollection); + + // Clean collection + GVAR(addSparePartsCollection) = nil; }] call EFUNC(common,addEventHandler); }; diff --git a/addons/repair/functions/fnc_addSpareParts.sqf b/addons/repair/functions/fnc_addSpareParts.sqf index c7366b27ba..6dfbb49bc0 100644 --- a/addons/repair/functions/fnc_addSpareParts.sqf +++ b/addons/repair/functions/fnc_addSpareParts.sqf @@ -27,7 +27,9 @@ if !(["ace_cargo"] call EFUNC(common,isModLoaded)) exitWith {}; // Collect until SettingsInitialized if (isNil QGVAR(settingInitted)) exitWith { - GVAR(addSparePartsCollection) pushBack _vehicle; + if !(_vehicle in GVAR(addSparePartsCollection)) then { + GVAR(addSparePartsCollection) pushBack _vehicle; + }; }; // Exit if not forced and add spare parts is disabled (after settings initted to make sure it really is) From d56f3cea813733c2ce68ea807804995477d55f7f Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 29 Aug 2015 11:58:03 +0200 Subject: [PATCH 057/170] Added pain and unconsciousness handling for new basic medical code --- .../functions/fnc_handleDamage_basic2.sqf | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_handleDamage_basic2.sqf b/addons/medical/functions/fnc_handleDamage_basic2.sqf index 3a79b1525f..a4358b42d9 100644 --- a/addons/medical/functions/fnc_handleDamage_basic2.sqf +++ b/addons/medical/functions/fnc_handleDamage_basic2.sqf @@ -24,9 +24,25 @@ _cache_damages = _target getVariable QGVAR(cachedDamages); if !(isNull _sourceOfDamage && {_typeOfProjectile == ""} && {vehicle _unit == _unit} && {(_selectionName == "head" || isBurning _unit)}) then { _part = [_selectionName] call FUNC(selectionNameToNumber); if (_part < 0) exitwith {}; - _damageBodyParts set [_part, (_damageBodyParts select _part) + (_cache_damages select _foreachIndex)]; + + private ["_newDamage", "_pain"]; + _newDamage = (_cache_damages select _foreachIndex); + _damageBodyParts set [_part, (_damageBodyParts select _part) + _newDamage]; + _unit setvariable [QGVAR(bodyPartStatus), _damageBodyParts]; + + if (alive _unit && {!(_unit getvariable ["ACE_isUnconscious", false])}) then { + // 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 { + [_unit] call FUNC(setUnconscious); + }; + }; + _pain = _unit getVariable [QGVAR(pain), 0]; + _pain = _pain + _newDamage * (1 - (_unit getVariable [QGVAR(morphine), 0])); + _unit setVariable [QGVAR(pain), _pain min 1, true]; }; }foreach _cache_params; + +// We broadcast the value across the net here, in order to avoid broadcasting it multiple times earlier in the above code block _target setvariable [QGVAR(bodyPartStatus), _damageBodyParts, true]; EXPLODE_6_PVT(_damageBodyParts,_headDamage,_torsoDamage,_handsDamageR,_handsDamageL,_legsDamageR,_legsDamageL); From 1c9e88f21326aab869fafbc65f907bbee816dd06 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 29 Aug 2015 11:58:28 +0200 Subject: [PATCH 058/170] fixes #1964 --- addons/medical/XEH_postInit.sqf | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index 6ce81d396d..6760cc201a 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -257,15 +257,29 @@ if (USE_WOUND_EVENT_SYNC) then { }; }; -[ - {(((_this select 0) getvariable [QGVAR(bloodVolume), 100]) < 65)}, - {(((_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(inReviveState), false])}, - {((_this select 0) getvariable [QGVAR(inCardiacArrest), false])}, - {((_this select 0) getvariable ["ACE_isDead", false])}, - {(((_this select 0) getvariable [QGVAR(airwayStatus), 100]) < 80)} -] call FUNC(addUnconsciousCondition); + + +["SettingsInitialized", { + if (GVAR(level) == 2) exitwith { + [ + {(((_this select 0) getvariable [QGVAR(bloodVolume), 100]) < 65)}, + {(((_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(inReviveState), false])}, + {((_this select 0) getvariable [QGVAR(inCardiacArrest), false])}, + {((_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 FUNC(addEventHandler); // Prevent all types of interaction while unconscious // @todo: probably remove this when CBA keybind hold key works properly From 1a4736e6630150e505d0d174f810c4bc6c7b34cc Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 29 Aug 2015 12:01:00 +0200 Subject: [PATCH 059/170] Clean up --- addons/medical/XEH_postInit.sqf | 2 - addons/medical/XEH_preInit.sqf | 2 - .../functions/fnc_handleDamage_basic.sqf | 205 +++--------------- .../functions/fnc_handleDamage_basic2.sqf | 56 ----- .../functions/fnc_handleDamage_caching.sqf | 2 +- 5 files changed, 36 insertions(+), 231 deletions(-) delete mode 100644 addons/medical/functions/fnc_handleDamage_basic2.sqf diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index 6760cc201a..d55a66d2b1 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -257,8 +257,6 @@ if (USE_WOUND_EVENT_SYNC) then { }; }; - - ["SettingsInitialized", { if (GVAR(level) == 2) exitwith { [ diff --git a/addons/medical/XEH_preInit.sqf b/addons/medical/XEH_preInit.sqf index 6ae9dbb866..b479383468 100644 --- a/addons/medical/XEH_preInit.sqf +++ b/addons/medical/XEH_preInit.sqf @@ -2,8 +2,6 @@ ADDON = false; -PREP(handleDamage_basic2); - PREP(actionCheckBloodPressure); PREP(actionCheckBloodPressureLocal); PREP(actionCheckPulse); diff --git a/addons/medical/functions/fnc_handleDamage_basic.sqf b/addons/medical/functions/fnc_handleDamage_basic.sqf index a7a2db8bec..cf53ac100f 100644 --- a/addons/medical/functions/fnc_handleDamage_basic.sqf +++ b/addons/medical/functions/fnc_handleDamage_basic.sqf @@ -1,191 +1,56 @@ /* - * Author: KoffeinFlummi - * Basic HandleDamage EH function. + * Author: KoffeinFlummi, Glowbal + * Handle damage basic medical * * Arguments: - * 0: Unit That Was Hit - * 1: Name Of Hit Selection - * 2: Amount Of Damage - * 3: Shooter - * 4: Projectile - * 5: Current damage to be returned * * Return Value: - * Damage To Be Inflicted + * * * Public: No */ #include "script_component.hpp" -#define LEGDAMAGETRESHOLD1 1 -#define LEGDAMAGETRESHOLD2 1.7 -#define ARMDAMAGETRESHOLD1 1 -#define ARMDAMAGETRESHOLD2 1.7 -#define UNCONSCIOUSNESSTRESHOLD 0.7 +private ["_damageBodyParts", "_cache_params", "_cache_damages"]; +params ["_target"]; -private ["_damage", "_armdamage", "_hitPoint", "_index", "_legdamage", "_newDamage", "_otherDamage", "_pain", "_restore"]; -params ["_unit", "_selectionName", "_damage", "_shooter", "_projectile"]; +_damageBodyParts = _target getvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]; +_cache_params = _target getVariable [QGVAR(cachedHandleDamageParams), []]; +_cache_damages = _target getVariable QGVAR(cachedDamages); -// Apply damage treshold / coefficient -_threshold = [ - _unit getVariable [QGVAR(damageThreshold), GVAR(AIDamageThreshold)], - _unit getVariable [QGVAR(damageThreshold), GVAR(playerDamageThreshold)] -] select ([_unit] call EFUNC(common,isPlayer)); -if (_selectionName in ["leg_l", "leg_r", "hand_l", "hand_r"]) then {_threshold = _threshold * 1.7}; +{ + _x params ["_unit","_selectionName","_amountOfDamage","_sourceOfDamage","_typeOfProjectile","_typeOfDamage"]; + if !(isNull _sourceOfDamage && {_typeOfProjectile == ""} && {vehicle _unit == _unit} && {(_selectionName == "head" || isBurning _unit)}) then { + _part = [_selectionName] call FUNC(selectionNameToNumber); + if (_part < 0) exitwith {}; -_damage = _damage * (1 / _threshold); + private ["_newDamage", "_pain"]; + _newDamage = (_cache_damages select _foreachIndex); + _damageBodyParts set [_part, (_damageBodyParts select _part) + _newDamage]; + _unit setvariable [QGVAR(bodyPartStatus), _damageBodyParts]; -// This is a new hit, reset variables. -// Note: sometimes handleDamage spans over 2 or even 3 frames. -if (diag_frameno > (_unit getVariable [QGVAR(basic_frameNo), -3]) + 2) then { - _unit setVariable [QGVAR(basic_frameNo), diag_frameno]; - _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 { - // Assign orphan structural damage to torso - [{ - private "_damagesum"; - params ["_args", "_idPFH"]; - _args params ["_unit"]; - - 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]; - }; - [_idPFH] call CBA_fnc_removePerFrameHandler; + if (alive _unit && {!(_unit getvariable ["ACE_isUnconscious", false])}) then { + // 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 { + [_unit] call FUNC(setUnconscious); }; - }, 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 { - _cache_projectiles pushBack _projectile; - _cache_hitpoints pushBack (GVAR(HITPOINTS) select (GVAR(SELECTIONS) find _selectionName)); - _cache_damages pushBack _newDamage; + _pain = _unit getVariable [QGVAR(pain), 0]; + _pain = _pain + _newDamage * (1 - (_unit getVariable [QGVAR(morphine), 0])); + _unit setVariable [QGVAR(pain), _pain min 1, true]; }; - _unit setVariable [QGVAR(projectiles), _cache_projectiles]; - _unit setVariable [QGVAR(hitPoints), _cache_hitpoints]; - _unit setVariable [QGVAR(damages), _cache_damages]; -}; +}foreach _cache_params; -// Get rid of double structural damage (seriously arma, what the fuck?) -if (_selectionName == "") then { - _cache_structDamage = _unit getVariable QGVAR(structDamage); - if (_newDamage > _cache_structDamage) then { - _unit setVariable [QGVAR(structDamage), _newDamage]; - _newDamage = _newDamage - _cache_structDamage; - } else { - _newDamage = 0; - }; -}; +// We broadcast the value across the net here, in order to avoid broadcasting it multiple times earlier in the above code block +_target setvariable [QGVAR(bodyPartStatus), _damageBodyParts, true]; -if (_selectionName == "") then { - _damage = _damage + (_unit getVariable QGVAR(structDamage)); -} else { - _damage = _damage + _newDamage; -}; +EXPLODE_6_PVT(_damageBodyParts,_headDamage,_torsoDamage,_handsDamageR,_handsDamageL,_legsDamageR,_legsDamageL); +_target setHitPointDamage ["hitHead", _headDamage min 0.95]; +_target setHitPointDamage ["hitBody", _torsoDamage min 0.95]; +_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"); -if (_selectionName == "leg_l") then { - _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 +{ + _target setHitPointDamage [_x, (_damageBodyParts select _foreachIndex) min 0.95]; +}foreach GVAR(HITPOINTS); diff --git a/addons/medical/functions/fnc_handleDamage_basic2.sqf b/addons/medical/functions/fnc_handleDamage_basic2.sqf deleted file mode 100644 index a4358b42d9..0000000000 --- a/addons/medical/functions/fnc_handleDamage_basic2.sqf +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Author: KoffeinFlummi, Glowbal - * Cache a handleDamage call to execute it 3 frames later - * - * Arguments: - * - * Return Value: - * - * - * Public: No - */ - -#include "script_component.hpp" - -private ["_damageBodyParts", "_cache_params", "_cache_damages"]; -params ["_target"]; - -_damageBodyParts = _target getvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]; -_cache_params = _target getVariable [QGVAR(cachedHandleDamageParams), []]; -_cache_damages = _target getVariable QGVAR(cachedDamages); - -{ - _x params ["_unit","_selectionName","_amountOfDamage","_sourceOfDamage","_typeOfProjectile","_typeOfDamage"]; - if !(isNull _sourceOfDamage && {_typeOfProjectile == ""} && {vehicle _unit == _unit} && {(_selectionName == "head" || isBurning _unit)}) then { - _part = [_selectionName] call FUNC(selectionNameToNumber); - if (_part < 0) exitwith {}; - - private ["_newDamage", "_pain"]; - _newDamage = (_cache_damages select _foreachIndex); - _damageBodyParts set [_part, (_damageBodyParts select _part) + _newDamage]; - _unit setvariable [QGVAR(bodyPartStatus), _damageBodyParts]; - - if (alive _unit && {!(_unit getvariable ["ACE_isUnconscious", false])}) then { - // 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 { - [_unit] call FUNC(setUnconscious); - }; - }; - _pain = _unit getVariable [QGVAR(pain), 0]; - _pain = _pain + _newDamage * (1 - (_unit getVariable [QGVAR(morphine), 0])); - _unit setVariable [QGVAR(pain), _pain min 1, true]; - }; -}foreach _cache_params; - -// We broadcast the value across the net here, in order to avoid broadcasting it multiple times earlier in the above code block -_target setvariable [QGVAR(bodyPartStatus), _damageBodyParts, true]; - -EXPLODE_6_PVT(_damageBodyParts,_headDamage,_torsoDamage,_handsDamageR,_handsDamageL,_legsDamageR,_legsDamageL); -_target setHitPointDamage ["hitHead", _headDamage min 0.95]; -_target setHitPointDamage ["hitBody", _torsoDamage min 0.95]; -_target setHitPointDamage ["hitHands", (_handsDamageR + _handsDamageL) min 0.95]; -_target setHitPointDamage ["hitLegs", (_legsDamageR + _legsDamageL) min 0.95]; - -{ - _target setHitPointDamage [_x, (_damageBodyParts select _foreachIndex) min 0.95]; -}foreach GVAR(HITPOINTS); diff --git a/addons/medical/functions/fnc_handleDamage_caching.sqf b/addons/medical/functions/fnc_handleDamage_caching.sqf index 2422dcd9e3..553c300631 100644 --- a/addons/medical/functions/fnc_handleDamage_caching.sqf +++ b/addons/medical/functions/fnc_handleDamage_caching.sqf @@ -80,7 +80,7 @@ if (diag_frameno > (_unit getVariable [QGVAR(frameNo_damageCaching), -3]) + 2) t _unit setDamage 0; if (GVAR(level) < 2 || {!([_unit] call FUNC(hasMedicalEnabled))}) then { - [_unit] call FUNC(handleDamage_basic2); + [_unit] call FUNC(handleDamage_basic); } else { _cache_params = _unit getVariable [QGVAR(cachedHandleDamageParams), []]; _cache_damages = _unit getVariable QGVAR(cachedDamages); From 1e08244f21a340447b7a4398a1fd21c32ba57700 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 29 Aug 2015 12:59:11 +0200 Subject: [PATCH 060/170] Removed debug output --- addons/medical/functions/fnc_handleDamage_advanced.sqf | 5 +---- addons/medical/functions/fnc_handleDamage_wounds.sqf | 4 ---- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/addons/medical/functions/fnc_handleDamage_advanced.sqf b/addons/medical/functions/fnc_handleDamage_advanced.sqf index 09ea6cd3db..f928732bba 100644 --- a/addons/medical/functions/fnc_handleDamage_advanced.sqf +++ b/addons/medical/functions/fnc_handleDamage_advanced.sqf @@ -36,10 +36,7 @@ _unit setvariable [QGVAR(bodyPartStatus), _damageBodyParts, true]; _typeOfDamage = [_typeOfProjectile] call FUNC(getTypeOfDamage); - -systemChat format["ASSIGNING INJURIES: %1", _unit]; - -[_unit, _selectionName, _newDamage, _typeOfProjectile, _typeOfDamage] call FUNC(handleDamage_wounds); //FUNC(handleDamage_assignWounds); +[_unit, _selectionName, _newDamage, _typeOfProjectile, _typeOfDamage] call FUNC(handleDamage_assignWounds); // TODO Disabled until implemented fully //if (GVAR(enableAirway)) then { diff --git a/addons/medical/functions/fnc_handleDamage_wounds.sqf b/addons/medical/functions/fnc_handleDamage_wounds.sqf index 10aec5c459..4438e9bb90 100644 --- a/addons/medical/functions/fnc_handleDamage_wounds.sqf +++ b/addons/medical/functions/fnc_handleDamage_wounds.sqf @@ -20,15 +20,11 @@ private ["_bodyPartn", "_injuryTypeInfo", "_allInjuriesForDamageType", "_allPossibleInjuries", "_highestPossibleDamage", "_highestPossibleSpot", "_minDamage", "_openWounds", "_woundID", "_toAddInjury", "_painToAdd", "_bloodLoss", "_bodyPartNToAdd", "_classType", "_damageLevels", "_foundIndex", "_i", "_injury", "_maxDamage", "_pain", "_painLevel", "_selections", "_toAddClassID", "_woundsCreated"]; params ["_unit", "_selectionName", "_damage", "_typeOfProjectile", "_typeOfDamage"]; -systemChat format["input: %1", _this]; -diag_log format["input: %1", _this]; - // Administration for open wounds and ids _openWounds = _unit getvariable[QGVAR(openWounds), []]; _woundID = _unit getvariable[QGVAR(lastUniqueWoundID), 1]; _extensionOutput = "ace_medical" callExtension format ["HandleDamageWounds,%1,%2,%3,%4", _selectionName, _damage, _typeOfDamage, _woundID]; -systemChat format["EXTENSION OUTPUT: %1", _extensionOutput]; _painToAdd = 0; _woundsCreated = []; From 6796b3126dcc107f37ceee09445bebcdac8823a9 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 29 Aug 2015 12:59:28 +0200 Subject: [PATCH 061/170] Staged work on fixing updating base classes for hitpoints --- addons/medical/CfgVehicles.hpp | 460 ++++++++++++++++++++++++++++++--- 1 file changed, 431 insertions(+), 29 deletions(-) diff --git a/addons/medical/CfgVehicles.hpp b/addons/medical/CfgVehicles.hpp index 350f83b3f7..278d3523e0 100644 --- a/addons/medical/CfgVehicles.hpp +++ b/addons/medical/CfgVehicles.hpp @@ -417,12 +417,29 @@ class CfgVehicles { #define ARM_LEG_ARMOR_BETTER 3 #define ARM_LEG_ARMOR_CSAT 4 - class Man; - class CAManBase: Man { + class Land; + class Man: Land { class HitPoints { - class HitHead; - class HitBody; - // "DEACTIVE" DEFAULT HITPOINTS + class HitHead { + visual = ""; + armor = 1; + material = -1; + name = "head"; + passThrough = 1; + radius = 0.1; + explosionShielding = 0.5; + minimalHit = 0; + }; + class HitBody { + armor = 1; + material = -1; + name = "body"; + passThrough = 1; + radius = 0.15; + explosionShielding = 10; + visual = "injury_body"; + minimalHit = 0; + }; class HitHands { armor = 999; //armor = 2; explosionShielding = 0; //explosionShielding = 1; @@ -443,6 +460,118 @@ class CfgVehicles { radius = 0; //radius = 0.08; visual = "injury_legs"; }; + }; + }; + class CAManBase: Man { + class HitPoints: HitPoints { + + class HitFace: HitHead { + armor = 999; + material = -1; + name = "face_hub"; + passThrough = 1; + radius = 0.08; + explosionShielding = 0.1; + minimalHit = 0.01; + }; + class HitNeck: HitFace { + armor = 999; + material = -1; + name = "neck"; + passThrough = 1; + radius = 0.08; + explosionShielding = 0.5; + minimalHit = 0.01; + }; + class HitHead: HitNeck { + armor = 1; + material = -1; + name = "head"; + passThrough = 1; + radius = 0.1; + explosionShielding = 0.5; + minimalHit = 0.01; + }; + class HitPelvis: HitBody { + armor = 999; + material = -1; + name = "pelvis"; + passThrough = 1; + radius = 0.15; + explosionShielding = 0.5; + visual = "injury_body"; + minimalHit = 0.01; + }; + class HitAbdomen: HitPelvis { + armor = 999; + material = -1; + name = "spine1"; + passThrough = 1; + radius = 0.15; + explosionShielding = 1; + visual = "injury_body"; + minimalHit = 0.01; + }; + class HitDiaphragm: HitAbdomen { + armor = 999; + material = -1; + name = "spine2"; + passThrough = 1; + radius = 0.15; + explosionShielding = 6; + visual = "injury_body"; + minimalHit = 0.01; + }; + class HitChest: HitDiaphragm { + armor = 999; + material = -1; + name = "spine3"; + passThrough = 1; + radius = 0.15; + explosionShielding = 6; + visual = "injury_body"; + minimalHit = 0.01; + }; + class HitBody: HitChest { + armor = 1; + material = -1; + name = "body"; + passThrough = 1; + radius = 0.15; + explosionShielding = 10; + visual = "injury_body"; + minimalHit = 0.01; + }; + class HitArms: HitHands { + armor = 999; + material = -1; + name = "arms"; + passThrough = 1; + radius = 0.08; + explosionShielding = 1; + visual = "injury_hands"; + minimalHit = 0.01; + }; + class HitHands: HitArms { + armor = 999; + material = -1; + name = "hands"; + passThrough = 1; + radius = 0.08; + explosionShielding = 1; + visual = "injury_hands"; + minimalHit = 0.01; + }; + class HitLegs: HitLegs { + armor = 999; + material = -1; + name = "legs"; + passThrough = 1; + radius = 0.1; + explosionShielding = 1; + visual = "injury_legs"; + minimalHit = 0.01; + }; class HitLeftArm { armor = ARM_LEG_ARMOR_DEFAULT; //2; @@ -529,10 +658,55 @@ class CfgVehicles { class B_Soldier_04_f: B_Soldier_base_F { class HitPoints: HitPoints { - class HitHead: HitHead {}; - class HitBody: HitBody {}; - class HitHands: HitHands {}; - class HitLegs: HitLegs {}; + class HitFace: HitHead { + armor = 999; + }; + class HitNeck: HitFace { + armor = 999; + }; + class HitHead: HitNeck { + armor = 1; + }; + class HitPelvis: HitBody { + armor = 999; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitAbdomen: HitPelvis { + armor = 999; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitDiaphragm: HitAbdomen { + armor = 999; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitChest: HitDiaphragm { + armor = 999; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitBody: HitChest { + armor = 2; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitArms: HitHands { + armor = 999; + passThrough = 0.5; + explosionShielding = 1.2; + }; + class HitHands: HitArms { + armor = 999; + passThrough = 0.5; + explosionShielding = 1.2; + }; + class HitLegs: HitLegs { + armor = 999; + passThrough = 0.5; + explosionShielding = 1.2; + }; class HitLeftArm: HitLeftArm { armor = ARM_LEG_ARMOR_BETTER; @@ -554,10 +728,56 @@ class CfgVehicles { class B_Soldier_05_f: B_Soldier_base_F { class HitPoints: HitPoints { - class HitHead: HitHead {}; - class HitBody: HitBody {}; - class HitHands: HitHands {}; - class HitLegs: HitLegs {}; + class HitFace: HitHead { + armor = 999; + }; + class HitNeck: HitFace { + armor = 999; + }; + class HitHead: HitNeck { + armor = 1; + }; + class HitPelvis: HitBody { + armor = 999; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitAbdomen: HitPelvis { + armor = 999; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitDiaphragm: HitAbdomen { + armor = 999; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitChest: HitDiaphragm { + armor = 999; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitBody: HitChest { + armor = 3; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitArms: HitHands { + armor = 999; + passThrough = 0.5; + explosionShielding = 1.2; + }; + class HitHands: HitArms { + armor = 999; + passThrough = 0.5; + explosionShielding = 1.2; + }; + class HitLegs: HitLegs { + armor = 999; + passThrough = 0.5; + explosionShielding = 1.2; + }; + class HitLeftArm: HitLeftArm { armor = ARM_LEG_ARMOR_BETTER; @@ -581,10 +801,55 @@ class CfgVehicles { class I_Soldier_03_F: I_Soldier_base_F { class HitPoints: HitPoints { - class HitHead: HitHead {}; - class HitBody: HitBody {}; - class HitHands: HitHands {}; - class HitLegs: HitLegs {}; + class HitFace: HitHead { + armor = 999; + }; + class HitNeck: HitFace { + armor = 999; + }; + class HitHead: HitNeck { + armor = 1; + }; + class HitPelvis: HitBody { + armor = 999; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitAbdomen: HitPelvis { + armor = 999; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitDiaphragm: HitAbdomen { + armor = 999; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitChest: HitDiaphragm { + armor = 999; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitBody: HitChest { + armor = 2; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitArms: HitHands { + armor = 999; + passThrough = 0.5; + explosionShielding = 1.2; + }; + class HitHands: HitArms { + armor = 999; + passThrough = 0.5; + explosionShielding = 1.2; + }; + class HitLegs: HitLegs { + armor = 999; + passThrough = 0.5; + explosionShielding = 1.2; + }; class HitLeftArm: HitLeftArm { armor = ARM_LEG_ARMOR_BETTER; @@ -606,10 +871,56 @@ class CfgVehicles { class I_Soldier_04_F: I_Soldier_base_F { class HitPoints: HitPoints { - class HitHead: HitHead {}; - class HitBody: HitBody {}; - class HitHands: HitHands {}; - class HitLegs: HitLegs {}; + class HitFace: HitHead { + armor = 999; + }; + class HitNeck: HitFace { + armor = 999; + }; + class HitHead: HitNeck { + armor = 1; + }; + class HitPelvis: HitBody { + armor = 999; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitAbdomen: HitPelvis { + armor = 999; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitDiaphragm: HitAbdomen { + armor = 999; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitChest: HitDiaphragm { + armor = 999; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitBody: HitChest { + armor = 3; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitArms: HitHands { + armor = 999; + passThrough = 0.5; + explosionShielding = 1.2; + }; + class HitHands: HitArms { + armor = 999; + passThrough = 0.5; + explosionShielding = 1.2; + }; + class HitLegs: HitLegs { + armor = 999; + passThrough = 0.5; + explosionShielding = 1.2; + }; + class HitLeftArm: HitLeftArm { armor = ARM_LEG_ARMOR_BETTER; @@ -631,10 +942,56 @@ class CfgVehicles { class O_Soldier_base_F: SoldierEB { class HitPoints: HitPoints { - class HitHead: HitHead {}; - class HitBody: HitBody {}; - class HitHands: HitHands {}; - class HitLegs: HitLegs {}; + class HitFace: HitHead { + armor = 999; + }; + class HitNeck: HitFace { + armor = 999; + }; + class HitHead: HitNeck { + armor = 1; + }; + class HitPelvis: HitBody { + armor = 999; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitAbdomen: HitPelvis { + armor = 999; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitDiaphragm: HitAbdomen { + armor = 999; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitChest: HitDiaphragm { + armor = 999; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitBody: HitChest { + armor = 4; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitArms: HitHands { + armor = 999; + passThrough = 0.5; + explosionShielding = 1.2; + }; + class HitHands: HitArms { + armor = 999; + passThrough = 0.5; + explosionShielding = 1.2; + }; + class HitLegs: HitLegs { + armor = 999; + passThrough = 0.5; + explosionShielding = 1.2; + }; + class HitLeftArm: HitLeftArm { armor = ARM_LEG_ARMOR_CSAT; @@ -660,10 +1017,55 @@ class CfgVehicles { class O_Soldier_02_F: O_Soldier_base_F { class HitPoints: HitPoints { - class HitHead: HitHead {}; - class HitBody: HitBody {}; - class HitHands: HitHands {}; - class HitLegs: HitLegs {}; + class HitFace: HitHead { + armor = 999; + }; + class HitNeck: HitFace { + armor = 999; + }; + class HitHead: HitNeck { + armor = 1; + }; + class HitPelvis: HitBody { + armor = 999; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitAbdomen: HitPelvis { + armor = 999; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitDiaphragm: HitAbdomen { + armor = 999; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitChest: HitDiaphragm { + armor = 999; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitBody: HitChest { + armor = 4; + passThrough = 0.5; + explosionShielding = 2.4; + }; + class HitArms: HitHands { + armor = 999; + passThrough = 0.5; + explosionShielding = 1.2; + }; + class HitHands: HitArms { + armor = 999; + passThrough = 0.5; + explosionShielding = 1.2; + }; + class HitLegs: HitLegs { + armor = 999; + passThrough = 0.5; + explosionShielding = 1.2; + }; class HitLeftArm: HitLeftArm { armor = ARM_LEG_ARMOR_CSAT; From 8916b70fe11775307f44bfd8dd4157d4da664e04 Mon Sep 17 00:00:00 2001 From: jokoho48 Date: Sat, 29 Aug 2015 15:29:02 +0200 Subject: [PATCH 062/170] Improve some Code --- .../medical/functions/fnc_actionLoadUnit.sqf | 2 +- .../functions/fnc_actionRemoveTourniquet.sqf | 2 +- addons/medical/functions/fnc_addToLog.sqf | 7 ++--- addons/medical/functions/fnc_canTreat.sqf | 7 ++--- .../fnc_displayPatientInformation.sqf | 4 +-- .../medical/functions/fnc_getTypeOfDamage.sqf | 27 +++++++++---------- addons/medical/functions/fnc_handleDamage.sqf | 13 ++++----- 7 files changed, 28 insertions(+), 34 deletions(-) diff --git a/addons/medical/functions/fnc_actionLoadUnit.sqf b/addons/medical/functions/fnc_actionLoadUnit.sqf index 9dc711a5a7..42a94997d8 100644 --- a/addons/medical/functions/fnc_actionLoadUnit.sqf +++ b/addons/medical/functions/fnc_actionLoadUnit.sqf @@ -18,7 +18,7 @@ private "_vehicle"; params ["_caller", "_target"]; if ([_target] call EFUNC(common,isAwake)) exitwith { - ["displayTextStructured", [_caller], [[localize LSTRING(CanNotLoaded), [_target] call EFUNC(common,getName)], 1.5, _caller]] call EFUNC(common,targetEvent); + ["displayTextStructured", [_caller], [[LSTRING(CanNotLoaded), [_target] call EFUNC(common,getName)], 1.5, _caller]] call EFUNC(common,targetEvent); }; if ([_target] call FUNC(isBeingCarried)) then { [_caller, _target] call EFUNC(dragging,dropObject_carry); diff --git a/addons/medical/functions/fnc_actionRemoveTourniquet.sqf b/addons/medical/functions/fnc_actionRemoveTourniquet.sqf index 2a39b63095..b920f276f0 100644 --- a/addons/medical/functions/fnc_actionRemoveTourniquet.sqf +++ b/addons/medical/functions/fnc_actionRemoveTourniquet.sqf @@ -24,7 +24,7 @@ _tourniquets = _target getvariable [QGVAR(tourniquets), [0,0,0,0,0,0]]; // Check if there is a tourniquet on this bodypart if ((_tourniquets select _part) == 0) exitwith { - _output = localize LSTRING(noTourniquetOnBodyPart); + _output = LSTRING(noTourniquetOnBodyPart); ["displayTextStructured", [_caller], [_output, 1.5, _caller]] call EFUNC(common,targetEvent); }; diff --git a/addons/medical/functions/fnc_addToLog.sqf b/addons/medical/functions/fnc_addToLog.sqf index fff615a5b3..9cac3af5f2 100644 --- a/addons/medical/functions/fnc_addToLog.sqf +++ b/addons/medical/functions/fnc_addToLog.sqf @@ -25,11 +25,8 @@ if (!local _unit) exitwith { date params ["", "", "", "_minute", "_hour"]; -_moment = if (_minute < 10) then { - format["%1:0%2", _hour, _minute] -} else { - format["%1:%2", _hour, _minute] -}; +_moment = format [ (["%1:%2", "%1:0%2"] select (_minute < 10)), _hour, _minute] + _logVarName = format[QGVAR(logFile_%1), _type]; _log = _unit getvariable [_logVarName, []]; diff --git a/addons/medical/functions/fnc_canTreat.sqf b/addons/medical/functions/fnc_canTreat.sqf index e1817d21fe..ff191ea7ca 100644 --- a/addons/medical/functions/fnc_canTreat.sqf +++ b/addons/medical/functions/fnc_canTreat.sqf @@ -22,11 +22,8 @@ params ["_caller", "_target", "_selectionName", "_className"]; if !(_target isKindOf "CAManBase") exitWith { false }; -_config = if (GVAR(level)>=2) then { - (ConfigFile >> "ACE_Medical_Actions" >> "Advanced" >> _className) -} else { - (ConfigFile >> "ACE_Medical_Actions" >> "Basic" >> _className) -}; +_config = (ConfigFile >> "ACE_Medical_Actions" >> (["Basic", "Advanced"] select (GVAR(level)>=2)) >> _className); + if !(isClass _config) exitwith {false}; _medicRequired = if (isNumber (_config >> "requiredMedic")) then { diff --git a/addons/medical/functions/fnc_displayPatientInformation.sqf b/addons/medical/functions/fnc_displayPatientInformation.sqf index 934bcc72dc..f73376cb29 100644 --- a/addons/medical/functions/fnc_displayPatientInformation.sqf +++ b/addons/medical/functions/fnc_displayPatientInformation.sqf @@ -21,8 +21,8 @@ if (GVAR(level) < 2) exitWith {}; private ["_amountOfGeneric", "_bandagedwounds", "_logCtrl", "_part", "_partText", "_pointDamage", "_severity", "_total", "_totalIvVolume", "_triageStatus", "_type"]; params ["_target", ["_show", true], ["_selectionN", 0]]; -GVAR(currentSelectedSelectionN) = if (typeName _selectionN == "SCALAR") then {_selectionN} else {0}; -GVAR(displayPatientInformationTarget) = if (_show) then {_target} else {ObjNull}; +GVAR(currentSelectedSelectionN) = [0, _selectionN] select (IS_SCALAR(_selectionN)); +GVAR(displayPatientInformationTarget) = [ObjNull, _target] select _show; if (USE_WOUND_EVENT_SYNC) then { [_target, ACE_player] call FUNC(requestWoundSync); diff --git a/addons/medical/functions/fnc_getTypeOfDamage.sqf b/addons/medical/functions/fnc_getTypeOfDamage.sqf index d0aff19cc4..afa687f137 100644 --- a/addons/medical/functions/fnc_getTypeOfDamage.sqf +++ b/addons/medical/functions/fnc_getTypeOfDamage.sqf @@ -15,17 +15,16 @@ params ["_typeOfProjectile"]; -call { - if (_typeOfProjectile isKindOf "BulletBase") exitWith {"bullet"}; - if (_typeOfProjectile isKindOf "GrenadeCore") exitWith {"grenade"}; - if (_typeOfProjectile isKindOf "TimeBombCore") exitWith {"explosive"}; - if (_typeOfProjectile isKindOf "MineCore") exitWith {"explosive"}; - if (_typeOfProjectile isKindOf "FuelExplosion") exitWith {"explosive"}; - if (_typeOfProjectile isKindOf "ShellBase") exitWith {"shell"}; - if (_typeOfProjectile isKindOf "RocketBase") exitWith {"explosive"}; - if (_typeOfProjectile isKindOf "MissileBase") exitWith {"explosive"}; - if (_typeOfProjectile isKindOf "LaserBombCore") exitWith {"explosive"}; - if (_typeOfProjectile isKindOf "BombCore") exitWith {"explosive"}; - if (_typeOfProjectile isKindOf "Grenade") exitWith {"grenade"}; - toLower _typeOfProjectile -} + +if (_typeOfProjectile isKindOf "BulletBase") exitWith {"bullet"}; +if (_typeOfProjectile isKindOf "GrenadeCore") exitWith {"grenade"}; +if (_typeOfProjectile isKindOf "TimeBombCore") exitWith {"explosive"}; +if (_typeOfProjectile isKindOf "MineCore") exitWith {"explosive"}; +if (_typeOfProjectile isKindOf "FuelExplosion") exitWith {"explosive"}; +if (_typeOfProjectile isKindOf "ShellBase") exitWith {"shell"}; +if (_typeOfProjectile isKindOf "RocketBase") exitWith {"explosive"}; +if (_typeOfProjectile isKindOf "MissileBase") exitWith {"explosive"}; +if (_typeOfProjectile isKindOf "LaserBombCore") exitWith {"explosive"}; +if (_typeOfProjectile isKindOf "BombCore") exitWith {"explosive"}; +if (_typeOfProjectile isKindOf "Grenade") exitWith {"grenade"}; +toLower _typeOfProjectile diff --git a/addons/medical/functions/fnc_handleDamage.sqf b/addons/medical/functions/fnc_handleDamage.sqf index 444643c806..1f484ab056 100644 --- a/addons/medical/functions/fnc_handleDamage.sqf +++ b/addons/medical/functions/fnc_handleDamage.sqf @@ -32,11 +32,11 @@ if !(_selection in (GVAR(SELECTIONS) + [""])) exitWith {0}; // Exit if we disable damage temporarily if !(_unit getVariable [QGVAR(allowDamage), true]) exitWith { - _damageOld = damage _unit; if (_selection in GVAR(SELECTIONS)) then { - _damageOld = _unit getHit _selection; + _unit getHit _selection + } else { + damage _unit }; - _damageOld; }; // Get return damage @@ -47,9 +47,10 @@ _newDamage = _this call FUNC(handleDamage_caching); _typeOfDamage = [_projectile] call FUNC(getTypeOfDamage); _typeIndex = (GVAR(allAvailableDamageTypes) find _typeOfDamage); -_minLethalDamage = 0.01; -if (_typeIndex >= 0) then { - _minLethalDamage = GVAR(minLethalDamages) select _typeIndex; +_minLethalDamage = if (_typeIndex >= 0) then { + GVAR(minLethalDamages) select _typeIndex +} else { + 0.01 }; if (vehicle _unit != _unit && {!(vehicle _unit isKindOf "StaticWeapon")} && {isNull _shooter} && {_projectile == ""} && {_selection == ""}) then { From 321ca815a2cac7fc45844211258c09afb7a7917b Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 29 Aug 2015 09:52:28 -0500 Subject: [PATCH 063/170] semi-colon --- addons/medical/functions/fnc_addToLog.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_addToLog.sqf b/addons/medical/functions/fnc_addToLog.sqf index 9cac3af5f2..3b071948f3 100644 --- a/addons/medical/functions/fnc_addToLog.sqf +++ b/addons/medical/functions/fnc_addToLog.sqf @@ -25,7 +25,7 @@ if (!local _unit) exitwith { date params ["", "", "", "_minute", "_hour"]; -_moment = format [ (["%1:%2", "%1:0%2"] select (_minute < 10)), _hour, _minute] +_moment = format [ (["%1:%2", "%1:0%2"] select (_minute < 10)), _hour, _minute]; _logVarName = format[QGVAR(logFile_%1), _type]; From 183e872f1ff879eafa9a82f852f0a5b92b5d01de Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 29 Aug 2015 22:44:52 +0200 Subject: [PATCH 064/170] Possible fix for #2298 --- .../medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf index effa1e74a7..0b5a0a9973 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf @@ -99,8 +99,7 @@ if (GVAR(healHitPointAfterAdvBandage) && {{(_x select 2) == _part && {_x select _hitSelections = ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"]; _hitPoints = ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"]; _point = _hitPoints select (_hitSelections find _selectionName); - [_target, _point, 0] call FUNC(setHitPointDamage); - // _target setvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0], true]; + _target setHitPointDamage [_point, 0]; }; true; From b291141d11a73035fe8a024d98869fee531f8c9b Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 29 Aug 2015 22:51:42 +0200 Subject: [PATCH 065/170] Should Be a better fix for #2298 --- addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf index 0b5a0a9973..0b19c05b03 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf @@ -95,7 +95,7 @@ if (_impact > 0 && {GVAR(enableAdvancedWounds)}) then { }; // If all wounds have been bandaged, we will reset all damage to 0, so the unit is not showing any blood on the model anymore. -if (GVAR(healHitPointAfterAdvBandage) && {{(_x select 2) == _part && {_x select 3 > 0}}count _openWounds == 0}) then { +if (GVAR(healHitPointAfterAdvBandage) && {{(_x select 2) == _part && {((_x select 4) * (_x select 3)) > 0}}count _openWounds == 0}) then { _hitSelections = ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"]; _hitPoints = ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"]; _point = _hitPoints select (_hitSelections find _selectionName); From ce42f5864fbcd51f718d82935efe19f11b6ec905 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 29 Aug 2015 22:53:08 +0200 Subject: [PATCH 066/170] fix #2155 --- addons/medical/functions/fnc_getBloodPressure.sqf | 2 +- addons/medical/functions/fnc_handleUnitVitals.sqf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/medical/functions/fnc_getBloodPressure.sqf b/addons/medical/functions/fnc_getBloodPressure.sqf index 2ba0b7366d..659949d716 100644 --- a/addons/medical/functions/fnc_getBloodPressure.sqf +++ b/addons/medical/functions/fnc_getBloodPressure.sqf @@ -30,4 +30,4 @@ _resistance = _unit getvariable [QGVAR(peripheralResistance), 100]; _bloodPressureHigh = (_cardiacOutput * MODIFIER_BP_HIGH) * _resistance; _bloodPressureLow = (_cardiacOutput * MODIFIER_BP_LOW) * _resistance; -[_bloodPressureLow, _bloodPressureHigh] +[_bloodPressureLow max 0, _bloodPressureHigh max 0] diff --git a/addons/medical/functions/fnc_handleUnitVitals.sqf b/addons/medical/functions/fnc_handleUnitVitals.sqf index cbb8f6fdcc..db312eea34 100644 --- a/addons/medical/functions/fnc_handleUnitVitals.sqf +++ b/addons/medical/functions/fnc_handleUnitVitals.sqf @@ -104,7 +104,7 @@ if (GVAR(level) >= 2) then { // Set the vitals _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); _unit setvariable [QGVAR(bloodPressure), _bloodPressure, _syncValues]; From 602ef690fcf59f8eb19f983827add5548fba5970 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 29 Aug 2015 22:54:51 +0200 Subject: [PATCH 067/170] Allow diagnose on torso #1879 --- addons/medical/ACE_Medical_Treatments.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/ACE_Medical_Treatments.hpp b/addons/medical/ACE_Medical_Treatments.hpp index b96dcaf21b..18fd875bf6 100644 --- a/addons/medical/ACE_Medical_Treatments.hpp +++ b/addons/medical/ACE_Medical_Treatments.hpp @@ -93,7 +93,7 @@ class ACE_Medical_Actions { displayNameProgress = CSTRING(Actions_Diagnosing); category = "examine"; treatmentLocations[] = {"All"}; - allowedSelections[] = {"head"}; + allowedSelections[] = {"head", "body"}; requiredMedic = 0; treatmentTime = 1; items[] = {}; From 2fd30ba20c134d1b208089265739cf3787d02c65 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 29 Aug 2015 22:57:52 +0200 Subject: [PATCH 068/170] fixes #2274 --- addons/medical/functions/fnc_getTypeOfDamage.sqf | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/medical/functions/fnc_getTypeOfDamage.sqf b/addons/medical/functions/fnc_getTypeOfDamage.sqf index afa687f137..7a351e0b77 100644 --- a/addons/medical/functions/fnc_getTypeOfDamage.sqf +++ b/addons/medical/functions/fnc_getTypeOfDamage.sqf @@ -17,6 +17,7 @@ params ["_typeOfProjectile"]; if (_typeOfProjectile isKindOf "BulletBase") exitWith {"bullet"}; +if (_typeOfProjectile isKindOf "ShotgunBase") exitwith {"bullet"}; if (_typeOfProjectile isKindOf "GrenadeCore") exitWith {"grenade"}; if (_typeOfProjectile isKindOf "TimeBombCore") exitWith {"explosive"}; if (_typeOfProjectile isKindOf "MineCore") exitWith {"explosive"}; From 17f647f34125743cf2a2a204e68b7d01a7ad1aad Mon Sep 17 00:00:00 2001 From: gienkov Date: Sun, 30 Aug 2015 01:42:42 +0200 Subject: [PATCH 069/170] PL translation --- addons/explosives/stringtable.xml | 1 + addons/hearing/stringtable.xml | 4 +++- addons/map/stringtable.xml | 5 ++++- addons/repair/stringtable.xml | 15 +++++++++++++-- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/addons/explosives/stringtable.xml b/addons/explosives/stringtable.xml index b115ca0752..4a3caf0b44 100644 --- a/addons/explosives/stringtable.xml +++ b/addons/explosives/stringtable.xml @@ -76,6 +76,7 @@ Blocked Obstruido + Zablokowany Cancel diff --git a/addons/hearing/stringtable.xml b/addons/hearing/stringtable.xml index 2e58162b15..3a1b2fdddc 100644 --- a/addons/hearing/stringtable.xml +++ b/addons/hearing/stringtable.xml @@ -145,9 +145,11 @@ Effect Zeus RC + Wpływ na Zeus RC Allow zeus remote controlled units to be able to take hearing damage. + Aktywuj efekty utraty słuchu dla jednostek kontrolowanych zdalnie przez Zeusa. - + \ No newline at end of file diff --git a/addons/map/stringtable.xml b/addons/map/stringtable.xml index f996800346..8e2bd588b5 100644 --- a/addons/map/stringtable.xml +++ b/addons/map/stringtable.xml @@ -21,12 +21,15 @@ Simulate map lighting based on ambient lighting and player's items? + Symuluj oświetlenie mapy bazujące na oświetleniu otoczenia oraz przedmiotach gracza? Map flashlight glow? + Poświata latarki Add external glow to players who use flashlight on map? + Pokaż poświatę światła latarki na graczu, który używa latarki na widoku mapy? Map shake? @@ -184,4 +187,4 @@ Zmniejsz czułość - + \ No newline at end of file diff --git a/addons/repair/stringtable.xml b/addons/repair/stringtable.xml index 09759344f8..7287360f11 100644 --- a/addons/repair/stringtable.xml +++ b/addons/repair/stringtable.xml @@ -1,4 +1,4 @@ - + @@ -232,12 +232,15 @@ Left Horizontal Stabilizer + Stabilizator horyzontalny lewy Right Horizontal Stabilizer + Stabilizator horyzontalny prawy Vertical Stabilizer + Stabilizator wertykalny Fuel Tank @@ -253,24 +256,31 @@ Transmission + Skrzynia biegów Gear + Podwozie Starter + Zapłon Tail + Ogon Pilot Tube + Rurka Pitota Static Port + Port statyczny Ammo + Amunicja Turret @@ -298,6 +308,7 @@ Missiles + Rakiety Left Track @@ -657,4 +668,4 @@ Przydziel klasę budynku naprawczego do jednego lub kilku budynków. - + \ No newline at end of file From 9187b31b92d2e96afcce195116d2bebe127f176c Mon Sep 17 00:00:00 2001 From: gienkov Date: Sun, 30 Aug 2015 01:47:20 +0200 Subject: [PATCH 070/170] pitot tube --- addons/repair/stringtable.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/repair/stringtable.xml b/addons/repair/stringtable.xml index 7287360f11..0122d27c74 100644 --- a/addons/repair/stringtable.xml +++ b/addons/repair/stringtable.xml @@ -270,8 +270,8 @@ Tail Ogon - - Pilot Tube + + Pitot Tube Rurka Pitota From 5662e9eb628b74a3d4f7339d74f7ceb47901eace Mon Sep 17 00:00:00 2001 From: Grzegorz Date: Sun, 30 Aug 2015 01:54:43 +0200 Subject: [PATCH 071/170] proper name for stabilizer --- addons/repair/stringtable.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/repair/stringtable.xml b/addons/repair/stringtable.xml index 0122d27c74..17c3edc4fd 100644 --- a/addons/repair/stringtable.xml +++ b/addons/repair/stringtable.xml @@ -232,15 +232,15 @@ Left Horizontal Stabilizer - Stabilizator horyzontalny lewy + Lewy statecznik poziomy Right Horizontal Stabilizer - Stabilizator horyzontalny prawy + Prawy statecznik poziomy Vertical Stabilizer - Stabilizator wertykalny + Statecznik pionowy Fuel Tank @@ -668,4 +668,4 @@ Przydziel klasę budynku naprawczego do jednego lub kilku budynków. - \ No newline at end of file + From 35b6e04345028e8a89200e4ac06f10c6e5e2400b Mon Sep 17 00:00:00 2001 From: jokoho48 Date: Sun, 30 Aug 2015 07:35:58 +0200 Subject: [PATCH 072/170] rewrite Caching in overpressure update code to params command update Comments --- addons/overpressure/CfgWeapons.hpp | 7 ++ .../functions/fnc_cacheOverPressureValues.sqf | 65 +++++++++++++------ .../functions/fnc_fireLauncherBackblast.sqf | 20 +++--- .../functions/fnc_fireOverpressureZone.sqf | 29 +++++---- .../overpressure/functions/fnc_firedEHBB.sqf | 38 ++++++----- .../overpressure/functions/fnc_firedEHOP.sqf | 25 +++---- .../functions/fnc_getDistance.sqf | 10 +-- .../functions/fnc_overpressureDamage.sqf | 17 +++-- 8 files changed, 128 insertions(+), 83 deletions(-) diff --git a/addons/overpressure/CfgWeapons.hpp b/addons/overpressure/CfgWeapons.hpp index e9170a4b2e..a88fa90894 100644 --- a/addons/overpressure/CfgWeapons.hpp +++ b/addons/overpressure/CfgWeapons.hpp @@ -3,6 +3,7 @@ class CfgWeapons { class LauncherCore; class Launcher: LauncherCore { + GVAR(priority) = 1; GVAR(angle) = 60; GVAR(range) = 10; GVAR(damage) = 0.7; @@ -11,6 +12,7 @@ class CfgWeapons { class Launcher_Base_F: Launcher {}; class launch_Titan_base: Launcher_Base_F { + GVAR(priority) = 1; GVAR(angle) = 40; GVAR(range) = 8; GVAR(damage) = 0.5; @@ -18,6 +20,7 @@ class CfgWeapons { class launch_Titan_short_base: launch_Titan_base { // Titan is a soft-launch launcher + GVAR(priority) = 1; GVAR(angle) = 30; GVAR(range) = 2; GVAR(damage) = 0.5; @@ -25,12 +28,14 @@ class CfgWeapons { class launch_NLAW_F: Launcher_Base_F { // NLAW is a soft-launch launcher + GVAR(priority) = 1; GVAR(angle) = 30; GVAR(range) = 2; GVAR(damage) = 0.6; }; class launch_RPG32_F: Launcher_Base_F { + GVAR(priority) = 1; GVAR(angle) = 60; GVAR(range) = 15; GVAR(damage) = 0.7; @@ -38,12 +43,14 @@ class CfgWeapons { class CannonCore; class cannon_120mm: CannonCore { + GVAR(priority) = 1; GVAR(angle) = 90; GVAR(range) = 50; GVAR(damage) = 0.85; }; class mortar_155mm_AMOS: CannonCore { + GVAR(priority) = 1; GVAR(angle) = 90; GVAR(range) = 60; GVAR(damage) = 1; diff --git a/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf b/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf index 0453b2437b..c26796b5a5 100644 --- a/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf +++ b/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf @@ -4,30 +4,57 @@ * Handle fire of local launchers * * Argument: - * 0: Magazine (String) - * 1: + * 0: Weapon + * 1: Magazine + * 2: Ammo * * Return value: * Array: - * 0: - * 1: - * 2: + * 0: Angle + * 1: Range + * 2: Damage * */ #include "script_component.hpp" -EXPLODE_2_PVT(_this,_weapon,_magazine); -if !(isNil (QGVAR(Damage) + _magazine)) exitWith {}; -private ["_damage","_angle","_range"]; -_damage = getNumber (configFile >> "CfgMagazines" >> _magazine >> QGVAR(damage)); -if (_damage == 0) then { - _angle = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(angle)) / 2; - _range = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(range)); - _damage = getNumber (configFile >> "CfgWeapons" >> _weapon >> QGVAR(damage)); -} else { - _angle = getNumber (configFile >> "CfgMagazines" >> _magazine >> QGVAR(angle)) / 2; - _range = getNumber (configFile >> "CfgMagazines" >> _magazine >> QGVAR(range)); -}; +params ["_weapon", "_magazine", "_ammo"]; -missionNameSpace setVariable [(QGVAR(values) + _magazine),[_angle, _range,_damage]]; -[_angle,_range,_damage] +private ["_array", "_type", "_return", "_config"]; + +// get Priority Array from Config +_array = [ + getNumber (configFile >> "CfgWeapons" >> QGVAR(priority)), + getNumber (configFile >> "CfgMagazines" >> QGVAR(priority)), + getNumber (configFile >> "CfgAmmo" >> QGVAR(priority)) +]; + +// define Fist Values for Types +_type = 0; +_array params ["_max"]; + +// get Highest Entry out the the Priority Array +{ + if (_max < _x) then { + _max = _x; + _type = _forEachIndex; + }; +} forEach _array; + +// create the Config entry Point +[ + (configFile >> "CfgWeapons" >> _weapon), + (configFile >> "CfgMagazines" >> _magazine), + (configFile >> "CfgMagazines" >> _ammo) +] select _type; + +// get the Variables out of the Configes and create a array with then +_return = [ + (getNumber (_config >> QGVAR(angle))), + (getNumber (_config >> QGVAR(range))), + (getNumber (_config >> QGVAR(damage))) +]; + + +missionNameSpace setVariable [format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine], _return]; + +_return diff --git a/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf b/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf index 5bc9d1c1e1..24068bf9b5 100644 --- a/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf +++ b/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf @@ -3,14 +3,14 @@ * * Handle fire of local launchers * - * Argument: - * 0: Unit that fired (Object) - * 1: Weapon fired (String) - * 2: Muzzle (String) - * 3: Mode (String) - * 4: Ammo (String) - * 5: Magazine (String) - * 6: Projectile (Object) + * Arguments: + * 0: Unit that fired + * 1: Weapon fired + * 2: Muzzle + * 3: Mode + * 4: Ammo + * 5: Magazine + * 6: Projectile * * Return value: * None @@ -18,7 +18,7 @@ #include "script_component.hpp" -EXPLODE_7_PVT(_this,_firer,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); +params ["_firer", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile"]; // Prevent AI from causing backblast damage if !([_firer] call EFUNC(common,isPlayer)) exitWith {}; @@ -29,7 +29,7 @@ _position = getPosASL _projectile; _direction = [0, 0, 0] vectorDiff (vectorDir _projectile); private ["_var","_varName","_backblastAngle", "_backblastRange", "_backblastDamage"]; -_varName = (QGVAR(values) + _magazine); +_varName = format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine]; _var = if (isNil _varName) then { [_weapon,_magazine] call FUNC(cacheOverPressureVales); } else { diff --git a/addons/overpressure/functions/fnc_fireOverpressureZone.sqf b/addons/overpressure/functions/fnc_fireOverpressureZone.sqf index 5e17036a13..57b4ea4bd5 100644 --- a/addons/overpressure/functions/fnc_fireOverpressureZone.sqf +++ b/addons/overpressure/functions/fnc_fireOverpressureZone.sqf @@ -3,14 +3,14 @@ * * Handle fire of local vehicle weapons creating overpressure zones * - * Argument: - * 0: Unit that fired (Object) - * 1: Weapon fired (String) - * 2: Muzzle (String) - * 3: Mode (String) - * 4: Ammo (String) - * 5: Magazine (String) - * 6: Projectile (Object) + * Arguments: + * 0: Unit that fired + * 1: Weapon fired + * 2: Muzzle + * 3: Mode + * 4: Ammo + * 5: Magazine + * 6: Projectile * * Return value: * None @@ -18,8 +18,7 @@ //#define DEBUG_MODE_FULL #include "script_component.hpp" -EXPLODE_7_PVT(_this,_firer,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); - +params ["_firer", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile"]; // Prevent AI from causing overpressure damage if !([gunner _firer] call EFUNC(common,isPlayer)) exitWith {}; //@todo non-maingun turrets? @@ -28,10 +27,12 @@ private ["_position", "_direction"]; _position = getPosASL _projectile; _direction = vectorDir _projectile; -private ["_var","_dangerZoneAngle", "_dangerZoneRange", "_dangerZoneDamage"]; -_varName = (QGVAR(values) + _magazine); +private ["_var", "_varName", "_dangerZoneAngle", "_dangerZoneRange", "_dangerZoneDamage"]; + +// Bake Variablen Name and Check if the Variable Exist else call the Cache Function +_varName = format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine]; _var = if (isNil _varName) then { - [_weapon,_magazine] call FUNC(cacheOverPressureVales); + [_weapon, _ammo, _magazine] call FUNC(cacheOverPressureVales); } else { missionNameSpace getVariable _varName; }; @@ -42,7 +43,7 @@ private "_affected"; _affected = getPos _projectile nearEntities ["CAManBase", _dangerZoneRange]; // Let each client handle their own affected units -["overpressure", _affected, [_firer, _position, _direction, _weapon,_magazine]] call EFUNC(common,targetEvent); +["overpressure", _affected, [_firer, _position, _direction, _weapon, _magazine, _ammo]] call EFUNC(common,targetEvent); // Draw debug lines #ifdef DEBUG_MODE_FULL diff --git a/addons/overpressure/functions/fnc_firedEHBB.sqf b/addons/overpressure/functions/fnc_firedEHBB.sqf index 5408ecda29..d8f97100c4 100644 --- a/addons/overpressure/functions/fnc_firedEHBB.sqf +++ b/addons/overpressure/functions/fnc_firedEHBB.sqf @@ -3,25 +3,29 @@ * * Handle fire of local launchers * - * Argument: - * 0: Unit that fired (Object) - * 1: Weapon fired (String) - * 2: Muzzle (String) - * 3: Mode (String) - * 4: Ammo (String) - * 5: Magazine (String) - * 6: Projectile (Object) + * Arguments: + * 0: Unit that fired + * 1: Weapon fired + * 2: Muzzle + * 3: Mode + * 4: Ammo + * 5: Magazine + * 6: Projectile * * Return value: * None */ - private ["_var","_varName"]; - _varName = (QGVAR(values) + _this select 1); - _var = if (isNil _varName) then { - ([_this select 1,_this select 5] call FUNC(cacheOverPressureVales)) select 2; - } else { - (missionNameSpace getVariable _varName) select 2; - }; - if (_var > 0) then { +private ["_var","_varName"]; +params ["", "_weapon", "", "", "_ammo", "_magazine", ""]; + +// Bake Variable Name and Check if the Variable Exist else call the Cache Function +_varName = format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine]; +_var = if (isNil _varName) then { + ([_weapon, _ammo, _magazine] call FUNC(cacheOverPressureVales)) select 2; +} else { + (missionNameSpace getVariable _varName) select 2; +}; + +if (_var > 0) then { _this call DFUNC(fireLauncherBackblast) - }; +}; diff --git a/addons/overpressure/functions/fnc_firedEHOP.sqf b/addons/overpressure/functions/fnc_firedEHOP.sqf index f2ca912690..e226e40fc3 100644 --- a/addons/overpressure/functions/fnc_firedEHOP.sqf +++ b/addons/overpressure/functions/fnc_firedEHOP.sqf @@ -3,26 +3,29 @@ * * Handle fire of Other Weapons * - * Argument: - * 0: Unit that fired (Object) - * 1: Weapon fired (String) - * 2: Muzzle (String) - * 3: Mode (String) - * 4: Ammo (String) - * 5: Magazine (String) - * 6: Projectile (Object) + * Arguments: + * 0: Unit that fired + * 1: Weapon fired + * 2: Muzzle + * 3: Mode + * 4: Ammo + * 5: Magazine + * 6: Projectile * * Return value: * None */ - private ["_var","_varName"]; -_varName = (QGVAR(values) + _this select 1); +params ["", "_weapon", "", "", "_ammo", "_magazine", ""]; + +// Bake Variable Name and Check if the Variable Exist else call the Cache Function +_varName = format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine]; _var = if (isNil _varName) then { - ([_this select 1,_this select 5] call FUNC(cacheOverPressureVales)) select 2; + ([_weapon, _ammo, _magazine] call FUNC(cacheOverPressureVales)) select 2; } else { (missionNameSpace getVariable _varName) select 2; }; + if (_var > 0) then { _this call DFUNC(fireOverpressureZone) }; diff --git a/addons/overpressure/functions/fnc_getDistance.sqf b/addons/overpressure/functions/fnc_getDistance.sqf index 905ecbd180..3b3103d951 100644 --- a/addons/overpressure/functions/fnc_getDistance.sqf +++ b/addons/overpressure/functions/fnc_getDistance.sqf @@ -3,13 +3,13 @@ * * Calculate the distance to the first intersection of a line * - * Argument: - * 0: Pos ASL of origin (Array) - * 1: Direction (Array) - * 2: Max distance to search (Number) + * Arguments: + * 0: Pos ASL of origin (ARRAY> + * 1: Direction + * 2: Max distance to search * * Return value: - * Distance to intersection (+- 0.1 m) + * Distance to intersection (+- 0.1 m) */ #include "script_component.hpp" diff --git a/addons/overpressure/functions/fnc_overpressureDamage.sqf b/addons/overpressure/functions/fnc_overpressureDamage.sqf index 282cc1e5db..1dac20adb9 100644 --- a/addons/overpressure/functions/fnc_overpressureDamage.sqf +++ b/addons/overpressure/functions/fnc_overpressureDamage.sqf @@ -4,20 +4,23 @@ * Calculate and apply backblast damage to potentially affected local units * * Argument: - * 0: Unit that fired (Object) - * 1: Pos ASL of the projectile (Array) - * 2: Direction of the projectile (Array) - * 3: Weapon fired (String) + * 0: Unit that fired + * 1: Pos ASL of the projectile + * 2: Direction of the projectile + * 3: Weapon fired + * 4: Magazine + * 5: Ammo * * Return value: * None */ #include "script_component.hpp" -EXPLODE_4_PVT(_this,_firer,_posASL,_direction,_weapon,_magazine); - private ["_var","_overpressureAngle", "_overpressureRange", "_overpressureDamage"]; -_varName = (QGVAR(values) + _magazine); +params ["_firer", "_posASL", "_direction", "_weapon", "_magazine", "_ammo"]; + +// Bake Variablen Name and Check if the Variable Exist else call the Cache Function +_varName = format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine]; _var = if (isNil _varName) then { [_weapon,_magazine] call FUNC(cacheOverPressureVales); } else { From 6d2e25d40b012d8a96b51abd8f2b1fbf413bcbdc Mon Sep 17 00:00:00 2001 From: jokoho48 Date: Sun, 30 Aug 2015 07:38:17 +0200 Subject: [PATCH 073/170] change some DFUNC to FUNC --- addons/overpressure/CfgEventHandlers.hpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/overpressure/CfgEventHandlers.hpp b/addons/overpressure/CfgEventHandlers.hpp index 1c191b5a0d..6f8dba89bd 100644 --- a/addons/overpressure/CfgEventHandlers.hpp +++ b/addons/overpressure/CfgEventHandlers.hpp @@ -14,38 +14,38 @@ class Extended_PostInit_EventHandlers { class Extended_FiredBIS_EventHandlers { class CAManBase { class ADDON { - firedBIS = QUOTE(if (local (_this select 0)) then {_this call DFUNC(firedEHBB);};); + firedBIS = QUOTE(if (local (_this select 0)) then {_this call FUNC(firedEHBB);};); }; }; class Tank { class ADDON { - firedBIS = QUOTE(if (local (_this select 0)) then {_this call DFUNC(firedEHOP);};); + firedBIS = QUOTE(if (local (_this select 0)) then {_this call FUNC(firedEHOP);};); }; }; class Car { class ADDON { - firedBIS = QUOTE(if (local (_this select 0)) then {_this call DFUNC(firedEHOP);};); + firedBIS = QUOTE(if (local (_this select 0)) then {_this call FUNC(firedEHOP);};); }; }; class Helicopter { class ADDON { - firedBIS = QUOTE(if (local (_this select 0)) then {_this call DFUNC(firedEHOP);};); + firedBIS = QUOTE(if (local (_this select 0)) then {_this call FUNC(firedEHOP);};); }; }; class Plane { class ADDON { - firedBIS = QUOTE(if (local (_this select 0)) then {_this call DFUNC(firedEHOP);};); + firedBIS = QUOTE(if (local (_this select 0)) then {_this call FUNC(firedEHOP);};); }; }; class Ship_F { class ADDON { - firedBIS = QUOTE(if (local (_this select 0)) then {_this call DFUNC(firedEHOP);};); + firedBIS = QUOTE(if (local (_this select 0)) then {_this call FUNC(firedEHOP);};); }; }; class StaticWeapon { class ADDON { - firedBIS = QUOTE(if (local (_this select 0)) then {_this call DFUNC(firedEHOP);};); + firedBIS = QUOTE(if (local (_this select 0)) then {_this call FUNC(firedEHOP);};); }; }; }; From d97cb8e78f227e5c0b56b185c5126477cfe74a1a Mon Sep 17 00:00:00 2001 From: jokoho48 Date: Sun, 30 Aug 2015 07:49:12 +0200 Subject: [PATCH 074/170] add Missing Include --- addons/overpressure/functions/fnc_firedEHBB.sqf | 1 + addons/overpressure/functions/fnc_firedEHOP.sqf | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/overpressure/functions/fnc_firedEHBB.sqf b/addons/overpressure/functions/fnc_firedEHBB.sqf index d8f97100c4..5065bb106e 100644 --- a/addons/overpressure/functions/fnc_firedEHBB.sqf +++ b/addons/overpressure/functions/fnc_firedEHBB.sqf @@ -15,6 +15,7 @@ * Return value: * None */ +#include "script_component.hpp" private ["_var","_varName"]; params ["", "_weapon", "", "", "_ammo", "_magazine", ""]; diff --git a/addons/overpressure/functions/fnc_firedEHOP.sqf b/addons/overpressure/functions/fnc_firedEHOP.sqf index e226e40fc3..4c6e224d0f 100644 --- a/addons/overpressure/functions/fnc_firedEHOP.sqf +++ b/addons/overpressure/functions/fnc_firedEHOP.sqf @@ -15,6 +15,7 @@ * Return value: * None */ +#include "script_component.hpp" private ["_var","_varName"]; params ["", "_weapon", "", "", "_ammo", "_magazine", ""]; @@ -26,6 +27,6 @@ _var = if (isNil _varName) then { (missionNameSpace getVariable _varName) select 2; }; - if (_var > 0) then { +if (_var > 0) then { _this call DFUNC(fireOverpressureZone) - }; +}; From bda274efff0c023f3e5b7e8a9db1ed32cec53778 Mon Sep 17 00:00:00 2001 From: jokoho48 Date: Sun, 30 Aug 2015 22:59:27 +0200 Subject: [PATCH 075/170] fix wrong config access point --- addons/overpressure/functions/fnc_cacheOverPressureValues.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf b/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf index c26796b5a5..914ead8b92 100644 --- a/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf +++ b/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf @@ -41,10 +41,10 @@ _array params ["_max"]; } forEach _array; // create the Config entry Point -[ +_return = [ (configFile >> "CfgWeapons" >> _weapon), (configFile >> "CfgMagazines" >> _magazine), - (configFile >> "CfgMagazines" >> _ammo) + (configFile >> "CfgAmmo" >> _ammo) ] select _type; // get the Variables out of the Configes and create a array with then From 317706cf465dd66b7d726df0e60d95dd3e308b11 Mon Sep 17 00:00:00 2001 From: jokoho48 Date: Sun, 30 Aug 2015 23:10:03 +0200 Subject: [PATCH 076/170] add Trace --- .../functions/fnc_cacheOverPressureValues.sqf | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf b/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf index 914ead8b92..e875d60b33 100644 --- a/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf +++ b/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf @@ -18,6 +18,7 @@ #include "script_component.hpp" params ["_weapon", "_magazine", "_ammo"]; +TRACE_3("Parameter",_weapon,_magazine,_ammo); private ["_array", "_type", "_return", "_config"]; @@ -28,6 +29,7 @@ _array = [ getNumber (configFile >> "CfgAmmo" >> QGVAR(priority)) ]; +TRACE_1("Proiroity Array",_array); // define Fist Values for Types _type = 0; _array params ["_max"]; @@ -40,12 +42,14 @@ _array params ["_max"]; }; } forEach _array; +TRACE_2("Highest Value",_max,_type); // create the Config entry Point -_return = [ +_config = [ (configFile >> "CfgWeapons" >> _weapon), (configFile >> "CfgMagazines" >> _magazine), (configFile >> "CfgAmmo" >> _ammo) ] select _type; +TRACE_1("ConfigPath",_config); // get the Variables out of the Configes and create a array with then _return = [ @@ -53,7 +57,7 @@ _return = [ (getNumber (_config >> QGVAR(range))), (getNumber (_config >> QGVAR(damage))) ]; - +TRACE_1("Return",_return); missionNameSpace setVariable [format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine], _return]; From 4e6f289493f906a258f9cae9c48dddf493b8b381 Mon Sep 17 00:00:00 2001 From: jokoho48 Date: Sun, 30 Aug 2015 23:40:53 +0200 Subject: [PATCH 077/170] fix Function Names fix Input --- .../functions/fnc_cacheOverPressureValues.sqf | 4 ++-- .../overpressure/functions/fnc_fireLauncherBackblast.sqf | 2 +- .../overpressure/functions/fnc_fireOverpressureZone.sqf | 2 +- addons/overpressure/functions/fnc_firedEHBB.sqf | 8 ++++---- addons/overpressure/functions/fnc_firedEHOP.sqf | 8 ++++---- addons/overpressure/functions/fnc_overpressureDamage.sqf | 2 +- addons/overpressure/script_component.hpp | 2 +- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf b/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf index e875d60b33..09f40612ef 100644 --- a/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf +++ b/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf @@ -17,7 +17,7 @@ */ #include "script_component.hpp" -params ["_weapon", "_magazine", "_ammo"]; +params ["_weapon", "_ammo", "_magazine"]; TRACE_3("Parameter",_weapon,_magazine,_ammo); private ["_array", "_type", "_return", "_config"]; @@ -58,7 +58,7 @@ _return = [ (getNumber (_config >> QGVAR(damage))) ]; TRACE_1("Return",_return); - +_varName = format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine]; missionNameSpace setVariable [format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine], _return]; _return diff --git a/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf b/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf index 24068bf9b5..991b84e0d0 100644 --- a/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf +++ b/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf @@ -31,7 +31,7 @@ _direction = [0, 0, 0] vectorDiff (vectorDir _projectile); private ["_var","_varName","_backblastAngle", "_backblastRange", "_backblastDamage"]; _varName = format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine]; _var = if (isNil _varName) then { - [_weapon,_magazine] call FUNC(cacheOverPressureVales); + [_weapon, _ammo, _magazine] call FUNC(cacheOverPressureValues); } else { missionNameSpace getVariable _varName; }; diff --git a/addons/overpressure/functions/fnc_fireOverpressureZone.sqf b/addons/overpressure/functions/fnc_fireOverpressureZone.sqf index 57b4ea4bd5..57fea021d0 100644 --- a/addons/overpressure/functions/fnc_fireOverpressureZone.sqf +++ b/addons/overpressure/functions/fnc_fireOverpressureZone.sqf @@ -32,7 +32,7 @@ private ["_var", "_varName", "_dangerZoneAngle", "_dangerZoneRange", "_dangerZon // Bake Variablen Name and Check if the Variable Exist else call the Cache Function _varName = format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine]; _var = if (isNil _varName) then { - [_weapon, _ammo, _magazine] call FUNC(cacheOverPressureVales); + [_weapon, _ammo, _magazine] call FUNC(cacheOverPressureValues); } else { missionNameSpace getVariable _varName; }; diff --git a/addons/overpressure/functions/fnc_firedEHBB.sqf b/addons/overpressure/functions/fnc_firedEHBB.sqf index 5065bb106e..b19de3b3de 100644 --- a/addons/overpressure/functions/fnc_firedEHBB.sqf +++ b/addons/overpressure/functions/fnc_firedEHBB.sqf @@ -16,17 +16,17 @@ * None */ #include "script_component.hpp" -private ["_var","_varName"]; +private ["_damage","_varName"]; params ["", "_weapon", "", "", "_ammo", "_magazine", ""]; // Bake Variable Name and Check if the Variable Exist else call the Cache Function _varName = format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine]; -_var = if (isNil _varName) then { - ([_weapon, _ammo, _magazine] call FUNC(cacheOverPressureVales)) select 2; +_damage = if (isNil _varName) then { + ([_weapon, _ammo, _magazine] call FUNC(cacheOverPressureValues)) select 2; } else { (missionNameSpace getVariable _varName) select 2; }; -if (_var > 0) then { +if (_damage > 0) then { _this call DFUNC(fireLauncherBackblast) }; diff --git a/addons/overpressure/functions/fnc_firedEHOP.sqf b/addons/overpressure/functions/fnc_firedEHOP.sqf index 4c6e224d0f..d6c377c8fb 100644 --- a/addons/overpressure/functions/fnc_firedEHOP.sqf +++ b/addons/overpressure/functions/fnc_firedEHOP.sqf @@ -16,17 +16,17 @@ * None */ #include "script_component.hpp" -private ["_var","_varName"]; +private ["_damage","_varName"]; params ["", "_weapon", "", "", "_ammo", "_magazine", ""]; // Bake Variable Name and Check if the Variable Exist else call the Cache Function _varName = format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine]; -_var = if (isNil _varName) then { - ([_weapon, _ammo, _magazine] call FUNC(cacheOverPressureVales)) select 2; +_damage = if (isNil _varName) then { + ([_weapon, _ammo, _magazine] call FUNC(cacheOverPressureValues)) select 2; } else { (missionNameSpace getVariable _varName) select 2; }; -if (_var > 0) then { +if (_damage > 0) then { _this call DFUNC(fireOverpressureZone) }; diff --git a/addons/overpressure/functions/fnc_overpressureDamage.sqf b/addons/overpressure/functions/fnc_overpressureDamage.sqf index 1dac20adb9..e39058504e 100644 --- a/addons/overpressure/functions/fnc_overpressureDamage.sqf +++ b/addons/overpressure/functions/fnc_overpressureDamage.sqf @@ -22,7 +22,7 @@ params ["_firer", "_posASL", "_direction", "_weapon", "_magazine", "_ammo"]; // Bake Variablen Name and Check if the Variable Exist else call the Cache Function _varName = format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine]; _var = if (isNil _varName) then { - [_weapon,_magazine] call FUNC(cacheOverPressureVales); + [_weapon, _ammo, _magazine] call FUNC(cacheOverPressureValues); } else { missionNameSpace getVariable _varName; }; diff --git a/addons/overpressure/script_component.hpp b/addons/overpressure/script_component.hpp index 3a44df1f9b..fbe7cd1238 100644 --- a/addons/overpressure/script_component.hpp +++ b/addons/overpressure/script_component.hpp @@ -9,4 +9,4 @@ #define DEBUG_SETTINGS DEBUG_ENABLED_OVERPRESSURE #endif -#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file +#include "\z\ace\addons\main\script_macros.hpp" From 228eeab1a822f47baa015d05e31f71b822aff4b3 Mon Sep 17 00:00:00 2001 From: jokoho48 Date: Mon, 31 Aug 2015 00:05:55 +0200 Subject: [PATCH 078/170] fix comments --- addons/overpressure/functions/fnc_fireLauncherBackblast.sqf | 1 + addons/overpressure/functions/fnc_fireOverpressureZone.sqf | 2 +- addons/overpressure/functions/fnc_firedEHBB.sqf | 2 +- addons/overpressure/functions/fnc_firedEHOP.sqf | 2 +- addons/overpressure/functions/fnc_overpressureDamage.sqf | 2 +- 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf b/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf index 991b84e0d0..14ffdd2db7 100644 --- a/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf +++ b/addons/overpressure/functions/fnc_fireLauncherBackblast.sqf @@ -29,6 +29,7 @@ _position = getPosASL _projectile; _direction = [0, 0, 0] vectorDiff (vectorDir _projectile); private ["_var","_varName","_backblastAngle", "_backblastRange", "_backblastDamage"]; +// Bake variable name and check if the variable exists, call the caching function otherwise _varName = format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine]; _var = if (isNil _varName) then { [_weapon, _ammo, _magazine] call FUNC(cacheOverPressureValues); diff --git a/addons/overpressure/functions/fnc_fireOverpressureZone.sqf b/addons/overpressure/functions/fnc_fireOverpressureZone.sqf index 57fea021d0..3068928ba4 100644 --- a/addons/overpressure/functions/fnc_fireOverpressureZone.sqf +++ b/addons/overpressure/functions/fnc_fireOverpressureZone.sqf @@ -29,7 +29,7 @@ _direction = vectorDir _projectile; private ["_var", "_varName", "_dangerZoneAngle", "_dangerZoneRange", "_dangerZoneDamage"]; -// Bake Variablen Name and Check if the Variable Exist else call the Cache Function +// Bake variable name and check if the variable exists, call the caching function otherwise _varName = format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine]; _var = if (isNil _varName) then { [_weapon, _ammo, _magazine] call FUNC(cacheOverPressureValues); diff --git a/addons/overpressure/functions/fnc_firedEHBB.sqf b/addons/overpressure/functions/fnc_firedEHBB.sqf index b19de3b3de..cf2ac31561 100644 --- a/addons/overpressure/functions/fnc_firedEHBB.sqf +++ b/addons/overpressure/functions/fnc_firedEHBB.sqf @@ -19,7 +19,7 @@ private ["_damage","_varName"]; params ["", "_weapon", "", "", "_ammo", "_magazine", ""]; -// Bake Variable Name and Check if the Variable Exist else call the Cache Function +// Bake variable name and check if the variable exists, call the caching function otherwise _varName = format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine]; _damage = if (isNil _varName) then { ([_weapon, _ammo, _magazine] call FUNC(cacheOverPressureValues)) select 2; diff --git a/addons/overpressure/functions/fnc_firedEHOP.sqf b/addons/overpressure/functions/fnc_firedEHOP.sqf index d6c377c8fb..6cec770deb 100644 --- a/addons/overpressure/functions/fnc_firedEHOP.sqf +++ b/addons/overpressure/functions/fnc_firedEHOP.sqf @@ -19,7 +19,7 @@ private ["_damage","_varName"]; params ["", "_weapon", "", "", "_ammo", "_magazine", ""]; -// Bake Variable Name and Check if the Variable Exist else call the Cache Function +// Bake variable name and check if the variable exists, call the caching function otherwise _varName = format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine]; _damage = if (isNil _varName) then { ([_weapon, _ammo, _magazine] call FUNC(cacheOverPressureValues)) select 2; diff --git a/addons/overpressure/functions/fnc_overpressureDamage.sqf b/addons/overpressure/functions/fnc_overpressureDamage.sqf index e39058504e..a24367937b 100644 --- a/addons/overpressure/functions/fnc_overpressureDamage.sqf +++ b/addons/overpressure/functions/fnc_overpressureDamage.sqf @@ -19,7 +19,7 @@ private ["_var","_overpressureAngle", "_overpressureRange", "_overpressureDamage"]; params ["_firer", "_posASL", "_direction", "_weapon", "_magazine", "_ammo"]; -// Bake Variablen Name and Check if the Variable Exist else call the Cache Function +// Bake variable name and check if the variable exists, call the caching function otherwise _varName = format [QGVAR(values%1%2%3), _weapon, _ammo, _magazine]; _var = if (isNil _varName) then { [_weapon, _ammo, _magazine] call FUNC(cacheOverPressureValues); From 8c6f896164889b3661db545ada433f6e778c48ec Mon Sep 17 00:00:00 2001 From: Glowbal Date: Mon, 31 Aug 2015 13:00:17 +0200 Subject: [PATCH 079/170] fixed script error when canceling treatment actions --- addons/medical/functions/fnc_treatment_failure.sqf | 2 +- addons/medical/functions/fnc_treatment_success.sqf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/medical/functions/fnc_treatment_failure.sqf b/addons/medical/functions/fnc_treatment_failure.sqf index 84526daa88..b31a9fd0de 100644 --- a/addons/medical/functions/fnc_treatment_failure.sqf +++ b/addons/medical/functions/fnc_treatment_failure.sqf @@ -19,7 +19,7 @@ private ["_config", "_callback", "_weaponSelect", "_lastAnim"]; params ["_args"]; -_args params ["_caller", "_target", "_selectionName", "_className", "_usersOfItems"]; +_args params ["_caller", "_target", "_selectionName", "_className", "_items", "_usersOfItems"]; if (primaryWeapon _caller == "ACE_FakePrimaryWeapon") then { _caller removeWeapon "ACE_FakePrimaryWeapon"; diff --git a/addons/medical/functions/fnc_treatment_success.sqf b/addons/medical/functions/fnc_treatment_success.sqf index f21f027ee7..d32f63468e 100644 --- a/addons/medical/functions/fnc_treatment_success.sqf +++ b/addons/medical/functions/fnc_treatment_success.sqf @@ -19,7 +19,7 @@ private ["_config", "_callback", "_weaponSelect", "_lastAnim"]; params ["_args"]; -_args params ["_caller", "_target","_selectionName","_className"]; +_args params ["_caller", "_target","_selectionName","_className", "_items", "_usersOfItems"]; if (primaryWeapon _caller == "ACE_FakePrimaryWeapon") then { _caller removeWeapon "ACE_FakePrimaryWeapon"; From 543e829278bdb76f76592dc384e122f609708120 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Mon, 31 Aug 2015 14:56:51 +0100 Subject: [PATCH 080/170] Fix goggles overlay for FFV seats When aiming down sights, view is considered to be "gunner" and so the overlay would be disabled. Introduces addition canUseWeapon check if view is "gunner" to differentiate FFV seats from regular gunner seats --- addons/goggles/functions/fnc_checkGoggles.sqf | 2 +- addons/goggles/functions/fnc_isGogglesVisible.sqf | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/addons/goggles/functions/fnc_checkGoggles.sqf b/addons/goggles/functions/fnc_checkGoggles.sqf index f222ea9881..84b86c3da4 100644 --- a/addons/goggles/functions/fnc_checkGoggles.sqf +++ b/addons/goggles/functions/fnc_checkGoggles.sqf @@ -18,7 +18,7 @@ if (!alive ace_player) exitWith {}; if (true) then { // Detect if curator interface is open and disable effects - if (!isNull(findDisplay 312)) exitWith { + if !(isNull curatorCamera) exitWith { if (GVAR(EffectsActive)) then { call FUNC(removeGlassesEffect); }; diff --git a/addons/goggles/functions/fnc_isGogglesVisible.sqf b/addons/goggles/functions/fnc_isGogglesVisible.sqf index 253a82f0a3..9f586a9cbf 100644 --- a/addons/goggles/functions/fnc_isGogglesVisible.sqf +++ b/addons/goggles/functions/fnc_isGogglesVisible.sqf @@ -15,14 +15,16 @@ */ #include "script_component.hpp" -PARAMS_1(_unit); - +params ["_unit"]; private ["_currentGlasses", "_result", "_position", "_visible"]; _currentGlasses = goggles _unit; _result = false; -if ((vehicle _unit) != _unit) exitWith {(cameraView != "GUNNER")}; +if ((vehicle _unit) != _unit) exitWith { + (cameraView != "GUNNER") || + {[_unit] call EFUNC(common,canUseWeapon)} +}; if (_currentGlasses != "") then { _position =(getPosASLW _unit); From 397d77e5b553db45cf635d5643fe71f192d2713c Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Mon, 31 Aug 2015 15:25:40 +0100 Subject: [PATCH 081/170] Remove special goggles treatment of vehicle units The condition to disable the overlay for gunners introduces more problems (and inconsistencies for that matter) than it was worth. Vehicle gunners using camera based weapons should probably consider not wearing a pair of glasses/goggles before doing so. --- addons/goggles/functions/fnc_isGogglesVisible.sqf | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/addons/goggles/functions/fnc_isGogglesVisible.sqf b/addons/goggles/functions/fnc_isGogglesVisible.sqf index 9f586a9cbf..80f9de4830 100644 --- a/addons/goggles/functions/fnc_isGogglesVisible.sqf +++ b/addons/goggles/functions/fnc_isGogglesVisible.sqf @@ -21,13 +21,8 @@ private ["_currentGlasses", "_result", "_position", "_visible"]; _currentGlasses = goggles _unit; _result = false; -if ((vehicle _unit) != _unit) exitWith { - (cameraView != "GUNNER") || - {[_unit] call EFUNC(common,canUseWeapon)} -}; - if (_currentGlasses != "") then { - _position =(getPosASLW _unit); + _position = getPosASLW _unit; if (surfaceIsWater _position && {((_position select 2) < 0.25)}) exitWith { _result = ([_currentGlasses] call FUNC(isDivingGoggles)); }; From f15805d1f388293171a4daa1c2f0dca690645290 Mon Sep 17 00:00:00 2001 From: commy2 Date: Mon, 31 Aug 2015 20:05:38 +0200 Subject: [PATCH 082/170] setStructuralDamage function --- addons/medical/XEH_preInit.sqf | 1 + addons/medical/functions/fnc_copyDeadBody.sqf | 2 +- addons/medical/functions/fnc_setDead.sqf | 2 +- .../functions/fnc_setStructuralDamage.sqf | 25 +++++++++++++++++++ 4 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 addons/medical/functions/fnc_setStructuralDamage.sqf diff --git a/addons/medical/XEH_preInit.sqf b/addons/medical/XEH_preInit.sqf index b479383468..838dce7404 100644 --- a/addons/medical/XEH_preInit.sqf +++ b/addons/medical/XEH_preInit.sqf @@ -68,6 +68,7 @@ PREP(selectionNameToNumber); PREP(setCardiacArrest); PREP(setDead); PREP(setHitPointDamage); +PREP(setStructuralDamage); PREP(setUnconscious); PREP(treatment); PREP(treatment_failure); diff --git a/addons/medical/functions/fnc_copyDeadBody.sqf b/addons/medical/functions/fnc_copyDeadBody.sqf index 36bcd91487..85fea5eafc 100644 --- a/addons/medical/functions/fnc_copyDeadBody.sqf +++ b/addons/medical/functions/fnc_copyDeadBody.sqf @@ -79,5 +79,5 @@ _newUnit setvariable ["ACE_isUnconscious", true, true]; _newUnit setvariable [QGVAR(disableInteraction), true, true]; _oldBody setvariable [QGVAR(disableInteraction), true, true]; -_newUnit setDamage 0.89; +[_newUnit, 0.89] call FUNC(setStructuralDamage); _newUnit; diff --git a/addons/medical/functions/fnc_setDead.sqf b/addons/medical/functions/fnc_setDead.sqf index c29edcd5e3..1423d594ad 100644 --- a/addons/medical/functions/fnc_setDead.sqf +++ b/addons/medical/functions/fnc_setDead.sqf @@ -82,5 +82,5 @@ if (isPLayer _unit) then { ["medical_onSetDead", [_unit]] call EFUNC(common,localEvent); -_unit setdamage 1; +[_unit, 1] call FUNC(setStructuralDamage); true; diff --git a/addons/medical/functions/fnc_setStructuralDamage.sqf b/addons/medical/functions/fnc_setStructuralDamage.sqf new file mode 100644 index 0000000000..b4dc74eac1 --- /dev/null +++ b/addons/medical/functions/fnc_setStructuralDamage.sqf @@ -0,0 +1,25 @@ +/* + * Author: commy2 + * Set the structural damage of a soldier without changing the individual hitpoints. Unit has to be local. Not safe to use with vehicles! + * + * Arguments: + * 0: The unit + * + * ReturnValue: + * + * + * Public: no? + */ + +params ["_unit", "_damage"]; + +if (!local _unit) exitWith {}; + +private "_allHitPoints"; +_allHitPoints = getAllHitPointsDamage _unit select 2; + +_unit setDamage _damage; + +{ + _unit setHitIndex [_forEachIndex, _x]; +} forEach _allHitPoints; From 5a164c5cdcd0cdb606b91510696029ad13a74963 Mon Sep 17 00:00:00 2001 From: commy2 Date: Mon, 31 Aug 2015 23:36:59 +0200 Subject: [PATCH 083/170] fix UBC issues, simplify uniform hitpoint config --- addons/medical/CfgVehicles.hpp | 746 +++++++++------------------------ 1 file changed, 209 insertions(+), 537 deletions(-) diff --git a/addons/medical/CfgVehicles.hpp b/addons/medical/CfgVehicles.hpp index 278d3523e0..0764d2f1ea 100644 --- a/addons/medical/CfgVehicles.hpp +++ b/addons/medical/CfgVehicles.hpp @@ -2,12 +2,12 @@ #define MEDICAL_ACTION_DISTANCE 1.75 class CfgVehicles { - class Logic; class Module_F: Logic { class ArgumentsBaseUnits { }; }; + class ACE_Module; class ACE_moduleMedicalSettings: ACE_Module { scope = 2; @@ -19,6 +19,7 @@ class CfgVehicles { isGlobal = 1; isTriggerActivated = 0; author = ECSTRING(common,ACETeam); + class Arguments { class level { displayName = CSTRING(MedicalSettings_level_DisplayName); @@ -137,6 +138,7 @@ class CfgVehicles { defaultValue = 1; }; }; + class ModuleDescription { description = CSTRING(MedicalSettings_Module_Description); sync[] = {}; @@ -154,6 +156,7 @@ class CfgVehicles { isTriggerActivated = 0; isDisposable = 0; author = ECSTRING(common,ACETeam); + class Arguments { class enableFor { displayName = CSTRING(AdvancedMedicalSettings_enableFor_DisplayName); @@ -256,13 +259,13 @@ class CfgVehicles { defaultValue = 1; }; }; + class ModuleDescription { description = CSTRING(AdvancedMedicalSettings_Module_Description); sync[] = {}; }; }; - class ACE_moduleReviveSettings: ACE_Module { scope = 2; displayName = CSTRING(ReviveSettings_Module_DisplayName); @@ -273,6 +276,7 @@ class CfgVehicles { isGlobal = 1; isTriggerActivated = 0; author = ECSTRING(common,ACETeam); + class Arguments { class enableRevive { displayName = CSTRING(ReviveSettings_enableRevive_DisplayName); @@ -298,11 +302,13 @@ class CfgVehicles { defaultValue = -1; }; }; + class ModuleDescription { description = CSTRING(ReviveSettings_Module_Description); sync[] = {}; }; }; + class ACE_moduleAssignMedicRoles: Module_F { scope = 2; displayName = CSTRING(AssignMedicRoles_Module_DisplayName); @@ -314,6 +320,7 @@ class CfgVehicles { isTriggerActivated = 0; isDisposable = 0; author = ECSTRING(common,ACETeam); + class Arguments { class EnableList { displayName = CSTRING(AssignMedicRoles_EnableList_DisplayName); @@ -342,6 +349,7 @@ class CfgVehicles { }; }; }; + class ModuleDescription { description = CSTRING(AssignMedicRoles_Module_Description); sync[] = {}; @@ -359,6 +367,7 @@ class CfgVehicles { isTriggerActivated = 0; isDisposable = 0; author = ECSTRING(common,ACETeam); + class Arguments { class EnableList { displayName = CSTRING(AssignMedicVehicle_EnableList_DisplayName); @@ -384,11 +393,13 @@ class CfgVehicles { }; }; }; + class ModuleDescription { description = CSTRING(AssignMedicVehicle_Module_Description); sync[] = {}; }; }; + class ACE_moduleAssignMedicalFacility: Module_F { scope = 2; displayName = CSTRING(AssignMedicalFacility_Module_DisplayName); @@ -400,6 +411,7 @@ class CfgVehicles { isTriggerActivated = 0; isDisposable = 0; author = ECSTRING(common,ACETeam); + class Arguments { class enabled { displayName = CSTRING(AssignMedicalFacility_enabled_DisplayName); @@ -407,199 +419,56 @@ class CfgVehicles { typeName = "BOOL"; }; }; + class ModuleDescription { description = CSTRING(AssignMedicalFacility_Module_Description); sync[] = {}; }; }; - #define ARM_LEG_ARMOR_DEFAULT 2 - #define ARM_LEG_ARMOR_BETTER 3 - #define ARM_LEG_ARMOR_CSAT 4 + #define ARM_LEG_ARMOR_DEFAULT 1 + #define ARM_LEG_ARMOR_BETTER 8 + #define ARM_LEG_ARMOR_CSAT 6 class Land; class Man: Land { class HitPoints { - class HitHead { - visual = ""; - armor = 1; - material = -1; - name = "head"; - passThrough = 1; - radius = 0.1; - explosionShielding = 0.5; - minimalHit = 0; - }; - class HitBody { - armor = 1; - material = -1; - name = "body"; - passThrough = 1; - radius = 0.15; - explosionShielding = 10; - visual = "injury_body"; - minimalHit = 0; - }; - 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 HitHead; + class HitBody; + class HitHands; + class HitLegs; }; }; + class CAManBase: Man { class HitPoints: HitPoints { - - class HitFace: HitHead { - armor = 999; - material = -1; - name = "face_hub"; - passThrough = 1; - radius = 0.08; - explosionShielding = 0.1; - minimalHit = 0.01; - }; - class HitNeck: HitFace { - armor = 999; - material = -1; - name = "neck"; - passThrough = 1; - radius = 0.08; - explosionShielding = 0.5; - minimalHit = 0.01; - }; - class HitHead: HitNeck { - armor = 1; - material = -1; - name = "head"; - passThrough = 1; - radius = 0.1; - explosionShielding = 0.5; - minimalHit = 0.01; - }; - class HitPelvis: HitBody { - armor = 999; - material = -1; - name = "pelvis"; - passThrough = 1; - radius = 0.15; - explosionShielding = 0.5; - visual = "injury_body"; - minimalHit = 0.01; - }; - class HitAbdomen: HitPelvis { - armor = 999; - material = -1; - name = "spine1"; - passThrough = 1; - radius = 0.15; - explosionShielding = 1; - visual = "injury_body"; - minimalHit = 0.01; - }; - class HitDiaphragm: HitAbdomen { - armor = 999; - material = -1; - name = "spine2"; - passThrough = 1; - radius = 0.15; - explosionShielding = 6; - visual = "injury_body"; - minimalHit = 0.01; - }; - class HitChest: HitDiaphragm { - armor = 999; - material = -1; - name = "spine3"; - passThrough = 1; - radius = 0.15; - explosionShielding = 6; - visual = "injury_body"; - minimalHit = 0.01; - }; - class HitBody: HitChest { - armor = 1; - material = -1; - name = "body"; - passThrough = 1; - radius = 0.15; - explosionShielding = 10; - visual = "injury_body"; - minimalHit = 0.01; - }; - class HitArms: HitHands { - armor = 999; - material = -1; - name = "arms"; - passThrough = 1; - radius = 0.08; - explosionShielding = 1; - visual = "injury_hands"; - minimalHit = 0.01; - }; - class HitHands: HitArms { - armor = 999; - material = -1; - name = "hands"; - passThrough = 1; - radius = 0.08; - explosionShielding = 1; - visual = "injury_hands"; - minimalHit = 0.01; - }; - class HitLegs: HitLegs { - armor = 999; - material = -1; - name = "legs"; - passThrough = 1; - radius = 0.1; - explosionShielding = 1; - visual = "injury_legs"; - minimalHit = 0.01; - }; - - class HitLeftArm { - armor = ARM_LEG_ARMOR_DEFAULT; //2; - explosionShielding = 1; - material = -1; - minimalHit = 0; - name = "hand_l"; - passThrough = 1; - radius = 0.06; - visual = "injury_hands"; + class HitFace; + class HitNeck; + class HitHead; + class HitPelvis; + class HitAbdomen; + class HitDiaphragm; + class HitChest; + class HitBody; + class HitArms; + class HitHands; + class HitLegs; + class HitLeftArm: HitHands { + armor = ARM_LEG_ARMOR_DEFAULT; + name = "hand_l"; // @todo hopefully these still include the whole arm + hands }; class HitRightArm: HitLeftArm { - name = "hand_r"; + name = "hand_r"; // @todo hopefully these still include the whole arm + hands }; - class HitLeftLeg { - armor = ARM_LEG_ARMOR_DEFAULT; //2; - explosionShielding = 1; - material = -1; - minimalHit = 0; + class HitLeftLeg: HitLegs { + armor = ARM_LEG_ARMOR_DEFAULT; name = "leg_l"; - passThrough = 1; - radius = 0.08; - visual = "injury_legs"; }; class HitRightLeg: HitLeftLeg { name = "leg_r"; }; }; + class ACE_SelfActions { #include "ACE_Medical_SelfActions.hpp" }; @@ -658,141 +527,60 @@ class CfgVehicles { class B_Soldier_04_f: B_Soldier_base_F { class HitPoints: HitPoints { - class HitFace: HitHead { - armor = 999; - }; - class HitNeck: HitFace { - armor = 999; - }; - class HitHead: HitNeck { - armor = 1; - }; - class HitPelvis: HitBody { - armor = 999; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitAbdomen: HitPelvis { - armor = 999; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitDiaphragm: HitAbdomen { - armor = 999; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitChest: HitDiaphragm { - armor = 999; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitBody: HitChest { - armor = 2; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitArms: HitHands { - armor = 999; - passThrough = 0.5; - explosionShielding = 1.2; - }; - class HitHands: HitArms { - armor = 999; - passThrough = 0.5; - explosionShielding = 1.2; - }; - class HitLegs: HitLegs { - armor = 999; - passThrough = 0.5; - explosionShielding = 1.2; - }; - - class HitLeftArm: HitLeftArm { + class HitFace; + class HitNeck; + class HitHead; + class HitPelvis; + class HitAbdomen; + class HitDiaphragm; + class HitChest; + class HitBody; + class HitArms; + class HitHands; + class HitLegs; + class HitLeftArm: HitHands { armor = ARM_LEG_ARMOR_BETTER; + name = "hand_l"; // @todo hopefully these still include the whole arm + hands }; - - class HitRightArm: HitRightArm { - armor = ARM_LEG_ARMOR_BETTER; + class HitRightArm: HitLeftArm { + name = "hand_r"; // @todo hopefully these still include the whole arm + hands }; - - class HitLeftLeg: HitLeftLeg { + class HitLeftLeg: HitLegs { armor = ARM_LEG_ARMOR_BETTER; + name = "leg_l"; }; - - class HitRightLeg: HitRightLeg { - armor = ARM_LEG_ARMOR_BETTER; + class HitRightLeg: HitLeftLeg { + name = "leg_r"; }; }; }; class B_Soldier_05_f: B_Soldier_base_F { class HitPoints: HitPoints { - class HitFace: HitHead { - armor = 999; - }; - class HitNeck: HitFace { - armor = 999; - }; - class HitHead: HitNeck { - armor = 1; - }; - class HitPelvis: HitBody { - armor = 999; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitAbdomen: HitPelvis { - armor = 999; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitDiaphragm: HitAbdomen { - armor = 999; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitChest: HitDiaphragm { - armor = 999; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitBody: HitChest { - armor = 3; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitArms: HitHands { - armor = 999; - passThrough = 0.5; - explosionShielding = 1.2; - }; - class HitHands: HitArms { - armor = 999; - passThrough = 0.5; - explosionShielding = 1.2; - }; - class HitLegs: HitLegs { - armor = 999; - passThrough = 0.5; - explosionShielding = 1.2; - }; - - - class HitLeftArm: HitLeftArm { + class HitFace; + class HitNeck; + class HitHead; + class HitPelvis; + class HitAbdomen; + class HitDiaphragm; + class HitChest; + class HitBody; + class HitArms; + class HitHands; + class HitLegs; + class HitLeftArm: HitHands { armor = ARM_LEG_ARMOR_BETTER; + name = "hand_l"; }; - - class HitRightArm: HitRightArm { - armor = ARM_LEG_ARMOR_BETTER; + class HitRightArm: HitLeftArm { + name = "hand_r"; }; - - class HitLeftLeg: HitLeftLeg { + class HitLeftLeg: HitLegs { armor = ARM_LEG_ARMOR_BETTER; + name = "leg_l"; }; - - class HitRightLeg: HitRightLeg { - armor = ARM_LEG_ARMOR_BETTER; + class HitRightLeg: HitLeftLeg { + name = "leg_r"; }; }; }; @@ -801,293 +589,177 @@ class CfgVehicles { class I_Soldier_03_F: I_Soldier_base_F { class HitPoints: HitPoints { - class HitFace: HitHead { - armor = 999; - }; - class HitNeck: HitFace { - armor = 999; - }; - class HitHead: HitNeck { - armor = 1; - }; - class HitPelvis: HitBody { - armor = 999; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitAbdomen: HitPelvis { - armor = 999; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitDiaphragm: HitAbdomen { - armor = 999; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitChest: HitDiaphragm { - armor = 999; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitBody: HitChest { - armor = 2; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitArms: HitHands { - armor = 999; - passThrough = 0.5; - explosionShielding = 1.2; - }; - class HitHands: HitArms { - armor = 999; - passThrough = 0.5; - explosionShielding = 1.2; - }; - class HitLegs: HitLegs { - armor = 999; - passThrough = 0.5; - explosionShielding = 1.2; - }; - - class HitLeftArm: HitLeftArm { + class HitFace; + class HitNeck; + class HitHead; + class HitPelvis; + class HitAbdomen; + class HitDiaphragm; + class HitChest; + class HitBody; + class HitArms; + class HitHands; + class HitLegs; + class HitLeftArm: HitHands { armor = ARM_LEG_ARMOR_BETTER; + name = "hand_l"; // @todo hopefully these still include the whole arm + hands }; - - class HitRightArm: HitRightArm { - armor = ARM_LEG_ARMOR_BETTER; + class HitRightArm: HitLeftArm { + name = "hand_r"; // @todo hopefully these still include the whole arm + hands }; - - class HitLeftLeg: HitLeftLeg { + class HitLeftLeg: HitLegs { armor = ARM_LEG_ARMOR_BETTER; + name = "leg_l"; }; - - class HitRightLeg: HitRightLeg { - armor = ARM_LEG_ARMOR_BETTER; + class HitRightLeg: HitLeftLeg { + name = "leg_r"; }; }; }; class I_Soldier_04_F: I_Soldier_base_F { class HitPoints: HitPoints { - class HitFace: HitHead { - armor = 999; - }; - class HitNeck: HitFace { - armor = 999; - }; - class HitHead: HitNeck { - armor = 1; - }; - class HitPelvis: HitBody { - armor = 999; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitAbdomen: HitPelvis { - armor = 999; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitDiaphragm: HitAbdomen { - armor = 999; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitChest: HitDiaphragm { - armor = 999; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitBody: HitChest { - armor = 3; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitArms: HitHands { - armor = 999; - passThrough = 0.5; - explosionShielding = 1.2; - }; - class HitHands: HitArms { - armor = 999; - passThrough = 0.5; - explosionShielding = 1.2; - }; - class HitLegs: HitLegs { - armor = 999; - passThrough = 0.5; - explosionShielding = 1.2; - }; - - - class HitLeftArm: HitLeftArm { + class HitFace; + class HitNeck; + class HitHead; + class HitPelvis; + class HitAbdomen; + class HitDiaphragm; + class HitChest; + class HitBody; + class HitArms; + class HitHands; + class HitLegs; + class HitLeftArm: HitHands { armor = ARM_LEG_ARMOR_BETTER; + name = "hand_l"; // @todo hopefully these still include the whole arm + hands }; - - class HitRightArm: HitRightArm { - armor = ARM_LEG_ARMOR_BETTER; + class HitRightArm: HitLeftArm { + name = "hand_r"; // @todo hopefully these still include the whole arm + hands }; - - class HitLeftLeg: HitLeftLeg { + class HitLeftLeg: HitLegs { armor = ARM_LEG_ARMOR_BETTER; + name = "leg_l"; }; - - class HitRightLeg: HitRightLeg { - armor = ARM_LEG_ARMOR_BETTER; + class HitRightLeg: HitLeftLeg { + name = "leg_r"; }; }; }; class O_Soldier_base_F: SoldierEB { class HitPoints: HitPoints { - class HitFace: HitHead { - armor = 999; - }; - class HitNeck: HitFace { - armor = 999; - }; - class HitHead: HitNeck { - armor = 1; - }; - class HitPelvis: HitBody { - armor = 999; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitAbdomen: HitPelvis { - armor = 999; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitDiaphragm: HitAbdomen { - armor = 999; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitChest: HitDiaphragm { - armor = 999; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitBody: HitChest { - armor = 4; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitArms: HitHands { - armor = 999; - passThrough = 0.5; - explosionShielding = 1.2; - }; - class HitHands: HitArms { - armor = 999; - passThrough = 0.5; - explosionShielding = 1.2; - }; - class HitLegs: HitLegs { - armor = 999; - passThrough = 0.5; - explosionShielding = 1.2; - }; - - - class HitLeftArm: HitLeftArm { + class HitFace; + class HitNeck; + class HitHead; + class HitPelvis; + class HitAbdomen; + class HitDiaphragm; + class HitChest; + class HitBody; + class HitArms; + class HitHands; + class HitLegs; + class HitLeftArm: HitHands { armor = ARM_LEG_ARMOR_CSAT; - passThrough = 0.85; + name = "hand_l"; // @todo hopefully these still include the whole arm + hands }; - - class HitRightArm: HitRightArm { - armor = ARM_LEG_ARMOR_CSAT; - passThrough = 0.85; + class HitRightArm: HitLeftArm { + name = "hand_r"; // @todo hopefully these still include the whole arm + hands }; - - class HitLeftLeg: HitLeftLeg { + class HitLeftLeg: HitLegs { armor = ARM_LEG_ARMOR_CSAT; - passThrough = 0.85; + name = "leg_l"; }; - - class HitRightLeg: HitRightLeg { - armor = ARM_LEG_ARMOR_CSAT; - passThrough = 0.85; + class HitRightLeg: HitLeftLeg { + name = "leg_r"; }; }; }; class O_Soldier_02_F: O_Soldier_base_F { class HitPoints: HitPoints { - class HitFace: HitHead { - armor = 999; - }; - class HitNeck: HitFace { - armor = 999; - }; - class HitHead: HitNeck { - armor = 1; - }; - class HitPelvis: HitBody { - armor = 999; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitAbdomen: HitPelvis { - armor = 999; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitDiaphragm: HitAbdomen { - armor = 999; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitChest: HitDiaphragm { - armor = 999; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitBody: HitChest { - armor = 4; - passThrough = 0.5; - explosionShielding = 2.4; - }; - class HitArms: HitHands { - armor = 999; - passThrough = 0.5; - explosionShielding = 1.2; - }; - class HitHands: HitArms { - armor = 999; - passThrough = 0.5; - explosionShielding = 1.2; - }; - class HitLegs: HitLegs { - armor = 999; - passThrough = 0.5; - explosionShielding = 1.2; - }; - - class HitLeftArm: HitLeftArm { + class HitFace; + class HitNeck; + class HitHead; + class HitPelvis; + class HitAbdomen; + class HitDiaphragm; + class HitChest; + class HitBody; + class HitArms; + class HitHands; + class HitLegs; + class HitLeftArm: HitHands { armor = ARM_LEG_ARMOR_CSAT; - passThrough = 0.85; + name = "hand_l"; // @todo hopefully these still include the whole arm + hands }; - - class HitRightArm: HitRightArm { - armor = ARM_LEG_ARMOR_CSAT; - passThrough = 0.85; + class HitRightArm: HitLeftArm { + name = "hand_r"; // @todo hopefully these still include the whole arm + hands }; - - class HitLeftLeg: HitLeftLeg { + class HitLeftLeg: HitLegs { armor = ARM_LEG_ARMOR_CSAT; - passThrough = 0.85; + name = "leg_l"; }; - - class HitRightLeg: HitRightLeg { - armor = ARM_LEG_ARMOR_CSAT; - passThrough = 0.85; + class HitRightLeg: HitLeftLeg { + name = "leg_r"; }; }; }; + + class O_officer_F: O_Soldier_base_F { + class HitPoints: HitPoints { + class HitFace; + class HitNeck; + class HitHead; + class HitPelvis; + class HitAbdomen; + class HitDiaphragm; + class HitChest; + class HitBody; + class HitArms; + class HitHands; + class HitLegs; + class HitLeftArm: HitHands { + armor = ARM_LEG_ARMOR_CSAT; // @todo is that suppossed to be the case? + name = "hand_l"; // @todo hopefully these still include the whole arm + hands + }; + class HitRightArm: HitLeftArm { + name = "hand_r"; // @todo hopefully these still include the whole arm + hands + }; + class HitLeftLeg: HitLegs { + armor = ARM_LEG_ARMOR_CSAT; // @todo is that suppossed to be the case? + name = "leg_l"; + }; + class HitRightLeg: HitLeftLeg { + name = "leg_r"; + }; + }; + }; + + class O_Protagonist_VR_F: O_Soldier_base_F { + class HitPoints: HitPoints { + class HitHead; + class HitBody; + class HitHands; + class HitLegs; + class HitLeftArm: HitHands { + armor = 2; + name = "hand_l"; // @todo hopefully these still include the whole arm + hands + }; + class HitRightArm: HitLeftArm { + name = "hand_r"; // @todo hopefully these still include the whole arm + hands + }; + class HitLeftLeg: HitLegs { + armor = 2; + name = "leg_l"; + }; + class HitRightLeg: HitLeftLeg { + name = "leg_r"; + }; + }; + }; + class MapBoard_altis_F; class ACE_bodyBagObject: MapBoard_altis_F { XEH_ENABLED; From c97e0eb500825394dc63894ea11922bfc4d9dcd5 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 31 Aug 2015 22:50:01 -0500 Subject: [PATCH 084/170] MapTools - Handle Bad Aspect Ratio --- addons/maptools/functions/fnc_updateMapToolMarkers.sqf | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf index 5c88d907b8..5d11c6a6e9 100644 --- a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf +++ b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf @@ -18,7 +18,7 @@ params ["_theMap"]; -private ["_rotatingTexture", "_textureWidth", "_scale", "_xPos", "_yPos"]; +private ["_rotatingTexture", "_textureWidth", "_scaleX", "_scaleY", "_xPos", "_yPos"]; // Show/Hide draw buttons if ([] call FUNC(canDraw)) then { @@ -43,16 +43,18 @@ if (GVAR(mapTool_Shown) == 1) then { }; // 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 _xPos = GVAR(mapTool_pos) select 0; _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 _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; -_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]; From 405d85eaaa0369a65b0523e7dd7f806f264cf629 Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 1 Sep 2015 19:06:20 +0200 Subject: [PATCH 085/170] fix leaning back through chair while sitting, fix #1795 --- addons/sitting/CfgMoves.hpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/addons/sitting/CfgMoves.hpp b/addons/sitting/CfgMoves.hpp index fc902032e2..5cef0fbc6d 100644 --- a/addons/sitting/CfgMoves.hpp +++ b/addons/sitting/CfgMoves.hpp @@ -1,6 +1,9 @@ // Enable visual head movement while free-looking #define MACRO_ANIMATION \ - head = "headDefault"; + head = "headDefault"; \ + aimingBody = "aimingNo"; \ + forceAim = 1; \ + static = 1; class CfgMovesBasic; class CfgMovesMaleSdr: CfgMovesBasic { From acfc48efc22591784905b56b7f4804b821e74c34 Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 1 Sep 2015 20:00:28 +0200 Subject: [PATCH 086/170] animate head when surrendered and handcuffed --- addons/captives/CfgMoves.hpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/addons/captives/CfgMoves.hpp b/addons/captives/CfgMoves.hpp index 161fcce9a4..8fa3440706 100644 --- a/addons/captives/CfgMoves.hpp +++ b/addons/captives/CfgMoves.hpp @@ -35,6 +35,12 @@ class CfgMovesMaleSdr: CfgMovesBasic { class CutSceneAnimationBase; + #define MACRO_ANIMATION \ + head = "headDefault"; \ + aimingBody = "aimingNo"; \ + forceAim = 1; \ + static = 1; + //Handcuffed Anims: class ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon: CutSceneAnimationBase { actions = "ACE_CivilStandHandcuffedActions"; @@ -45,6 +51,7 @@ class CfgMovesMaleSdr: CfgMovesBasic { ConnectTo[] = {"ACE_AmovPercMstpScapWnonDnon",0.1}; InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; canReload = 0; + MACRO_ANIMATION }; class ACE_AmovPercMstpScapWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon { 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}; InterpolateTo[] = {"Unconscious",0.01}; looped = 1; + MACRO_ANIMATION }; class ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon { actions = "CivilStandActions"; file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\non\non\amovpercmstpsnonwnondnon_easeout"; ConnectTo[] = {"AmovPercMstpSnonWnonDnon",0.1}; InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon",0.1}; + MACRO_ANIMATION }; //Handcuffed-FFV: @@ -65,6 +74,7 @@ class CfgMovesMaleSdr: CfgMovesBasic { file = "\A3\cargoposes_F_heli\anim\passenger_flatground_3idleunarmed.rtm"; actions = "ACE_CivilHandCuffedFFVActions"; ConnectTo[] = {}; + MACRO_ANIMATION }; @@ -78,6 +88,7 @@ class CfgMovesMaleSdr: CfgMovesBasic { ConnectTo[] = {"ACE_AmovPercMstpSsurWnonDnon",0.1}; InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; canReload = 0; + MACRO_ANIMATION }; class ACE_AmovPercMstpSsurWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon { file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\sur\non\AmovPercMstpSsurWnonDnon"; @@ -85,6 +96,7 @@ class CfgMovesMaleSdr: CfgMovesBasic { looped = 1; ConnectTo[] = {"ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; InterpolateTo[] = {"Unconscious",0.01}; + MACRO_ANIMATION }; class ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon { 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"; ConnectTo[] = {"AmovPercMstpSnonWnonDnon",0.1}; InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon",0.1}; + MACRO_ANIMATION }; }; }; From 237d5b6536f8e79f8f2cff2127196e8be10fd448 Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 1 Sep 2015 21:03:28 +0200 Subject: [PATCH 087/170] stand up action (uses get out shortcut) and less awkward standing animaton --- addons/sitting/functions/fnc_sit.sqf | 22 +++++++++++++++++++++- addons/sitting/functions/fnc_stand.sqf | 13 ++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/addons/sitting/functions/fnc_sit.sqf b/addons/sitting/functions/fnc_sit.sqf index 0c6825ed58..e0692af951 100644 --- a/addons/sitting/functions/fnc_sit.sqf +++ b/addons/sitting/functions/fnc_sit.sqf @@ -16,7 +16,7 @@ */ #include "script_component.hpp" -private ["_configFile", "_sitDirection", "_sitPosition", "_sitRotation", "_sitDirectionVisual"]; +private ["_actionID", "_configFile", "_sitDirection", "_sitPosition", "_sitRotation", "_sitDirectionVisual"]; params ["_seat", "_player"]; @@ -26,6 +26,26 @@ GVAR(seat) = _seat; // Overwrite weird position, because Arma decides to set it differently based on current animation/stance... _player switchMove "amovpknlmstpsraswrfldnon"; +// add scrollwheel action to release object +_actionID = _player getVariable [QGVAR(StandUpActionID), -1]; + +if (_actionID != -1) then { + _player removeAction _actionID; +}; + +_actionID = _player addAction [ + format ["%1", localize LSTRING(Stand)], + QUOTE((_this select 0) call FUNC(stand)), + nil, + 20, + false, + true, + "GetOut", + QUOTE(_this call FUNC(canStand)) +]; + +_player setVariable [QGVAR(StandUpActionID), _actionID]; + // Read config _configFile = configFile >> "CfgVehicles" >> typeOf _seat; _sitDirection = (getDir _seat) + getNumber (_configFile >> QGVAR(sitDirection)); diff --git a/addons/sitting/functions/fnc_stand.sqf b/addons/sitting/functions/fnc_stand.sqf index 978bcaf279..ef19d5f586 100644 --- a/addons/sitting/functions/fnc_stand.sqf +++ b/addons/sitting/functions/fnc_stand.sqf @@ -17,8 +17,19 @@ params ["_player"]; +// remove scroll wheel action +_player removeAction (_player getVariable [QGVAR(StandUpActionID), -1]); + // Restore animation -[_player, "", 2] call EFUNC(common,doAnimation); +private "_animation"; +_animation = switch (currentWeapon _player) do { + case "": {"amovpercmstpsnonwnondnon"}; + case (primaryWeapon _player): {"amovpercmstpslowwrfldnon"}; + case (handgunWeapon _player): {"amovpercmstpslowwpstdnon"}; + default {"amovpercmstpsnonwnondnon"}; +}; + +[_player, _animation, 2] call EFUNC(common,doAnimation); // Set variables to nil _player setVariable [QGVAR(isSitting), nil]; From 471d54f6748905e57303800305322808d59dd0ac Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 1 Sep 2015 21:48:40 +0200 Subject: [PATCH 088/170] better saling for tracer sizes, fix #1008 --- addons/ballistics/CfgAmmo.hpp | 68 ++++++++++++++++++++++++++++------- 1 file changed, 55 insertions(+), 13 deletions(-) diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 5ffe94ac45..eeb64fec47 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -6,23 +6,11 @@ class CfgAmmo { 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 { airFriction=-0.00126466; hit=8; typicalSpeed=750; + tracerScale = 1; tracerStartTime=0.073; // M856 tracer burns out to 800m tracerEndTime=1.57123; // Time in seconds calculated with ballistics calculator ACE_caliber=5.69; @@ -128,9 +116,13 @@ class CfgAmmo { ACE_muzzleVelocities[]={785, 883, 925}; ACE_barrelLengths[]={254.0, 414.02, 508.0}; }; + class B_56x15_dual: BulletBase { + tracerScale = 0.5; + }; class B_65x39_Caseless : BulletBase { airFriction=-0.00075308; typicalSpeed=800; + tracerScale = 1.1; //1.0; ACE_caliber=6.706; ACE_bulletLength=32.893; ACE_bulletMass=7.9704; @@ -180,10 +172,15 @@ class CfgAmmo { ACE_muzzleVelocities[]={750, 820, 840, 852, 860}; 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 { airFriction=-0.00100957; typicalSpeed=833; hit=9; + tracerScale = 1.2; //0.6; tracerStartTime=0.073; // Based on the British L5A1 which burns out to 1000m tracerEndTime=2.15957; // Time in seconds calculated with ballistics calculator ACE_caliber=7.823; @@ -479,6 +476,7 @@ class CfgAmmo { class B_9x21_Ball : BulletBase { airFriction=-0.00226847; typicalSpeed=390; + tracerScale = 0.5; hit=6; ACE_caliber=9.042; ACE_bulletLength=15.494; @@ -491,6 +489,9 @@ class CfgAmmo { ACE_muzzleVelocities[]={440, 460, 480}; 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 { hit=5; airFriction=-0.00190333; @@ -584,6 +585,7 @@ class CfgAmmo { timeToLive=10; airFriction=-0.00038944; typicalSpeed=910; + tracerScale = 1.3; //1.2; ACE_caliber=10.363; ACE_bulletLength=54.0; ACE_bulletMass=26.568; @@ -670,9 +672,13 @@ class CfgAmmo { ACE_muzzleVelocities[]={880, 915, 925}; ACE_barrelLengths[]={508.0, 660.4, 711.2}; }; + class B_127x33_Ball: BulletBase { + tracerScale = 1.3; //1.2; + }; class B_127x54_Ball : BulletBase { airFriction=-0.00019268; typicalSpeed=300; + tracerScale = 1.3;// ACE_caliber=12.954; ACE_bulletLength=64.516; ACE_bulletMass=48.6; @@ -688,6 +694,7 @@ class CfgAmmo { timeToLive=10; airFriction=-0.00057503; typicalSpeed=900; + tracerScale = 1.3; //1.2; ACE_caliber=12.954; ACE_bulletLength=58.674; ACE_bulletMass=41.9256; @@ -703,6 +710,7 @@ class CfgAmmo { timeToLive=10; airFriction=-0.00057503; typicalSpeed=900; + tracerScale = 1.3;// hit=25; caliber=4.0; ACE_caliber=12.954; @@ -736,6 +744,7 @@ class CfgAmmo { timeToLive=10; airFriction=-0.00063800; typicalSpeed=820; + tracerScale = 1.3; //1.5; ACE_caliber=12.979; ACE_bulletLength=64.008; ACE_bulletMass=48.276; @@ -750,6 +759,7 @@ class CfgAmmo { class B_45ACP_Ball : BulletBase { airFriction=-0.00081221; typicalSpeed=250; + tracerScale = 0.6; ACE_caliber=11.481; ACE_bulletLength=17.272; ACE_bulletMass=14.904; @@ -761,4 +771,36 @@ class CfgAmmo { ACE_muzzleVelocities[]={230, 250, 285}; 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; + }; }; From be56fd7d466a85a04e35bdac2d4a3922944597d6 Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 1 Sep 2015 23:19:49 +0200 Subject: [PATCH 089/170] scripted approach to hand flares, fix #1079 --- addons/grenades/CfgAmmo.hpp | 66 +++++++++---------- addons/grenades/CfgMagazines.hpp | 19 ++++-- addons/grenades/Effects.hpp | 4 ++ addons/grenades/XEH_preInit.sqf | 1 + addons/grenades/functions/fnc_flare.sqf | 23 +++++++ .../grenades/functions/fnc_throwGrenade.sqf | 45 +++++++++---- 6 files changed, 105 insertions(+), 53 deletions(-) create mode 100644 addons/grenades/functions/fnc_flare.sqf diff --git a/addons/grenades/CfgAmmo.hpp b/addons/grenades/CfgAmmo.hpp index 120d3ab5ea..b14a806b4c 100644 --- a/addons/grenades/CfgAmmo.hpp +++ b/addons/grenades/CfgAmmo.hpp @@ -28,66 +28,66 @@ class CfgAmmo { }; 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 F_20mm_Red; 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 F_20mm_Green; 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 F_20mm_Yellow; 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; }; 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); dangerRadiusHit = -1; suppressionRadiusHit = 20; typicalSpeed = 22; cost = 40; deflecting = 15; + explosionTime = 2.3; timeToLive = 6; - fuseDistance = 2.3; grenadeFireSound[] = {}; grenadeBurningSound[] = {}; aiAmmoUsageFlags = "0"; diff --git a/addons/grenades/CfgMagazines.hpp b/addons/grenades/CfgMagazines.hpp index 31e80dc545..16dd9929ff 100644 --- a/addons/grenades/CfgMagazines.hpp +++ b/addons/grenades/CfgMagazines.hpp @@ -1,3 +1,4 @@ + class CfgMagazines { class HandGrenade; class ACE_HandFlare_Base: HandGrenade { @@ -8,55 +9,60 @@ class CfgMagazines { mass = 4; initSpeed = 22; }; + class ACE_HandFlare_White: ACE_HandFlare_Base { author = ECSTRING(common,ACETeam); scope = 2; - ammo = "ACE_F_Hand_White"; displayname = CSTRING(M127A1_White_Name); descriptionshort = CSTRING(M127A1_White_Description); displayNameShort = CSTRING(M127A1_White_NameShort); model = "\A3\weapons_f\ammo\flare_white"; picture = "\A3\Weapons_F\Data\UI\gear_flare_white_ca.paa"; + ammo = "ACE_G_Handflare_White"; }; + class ACE_HandFlare_Red: ACE_HandFlare_Base { author = ECSTRING(common,ACETeam); scope = 2; - ammo = "ACE_F_Hand_Red"; displayname = CSTRING(M127A1_Red_Name); descriptionshort = CSTRING(M127A1_Red_Description); displayNameShort = CSTRING(M127A1_Red_NameShort); model = "\A3\weapons_f\ammo\flare_red"; picture = "\A3\Weapons_F\Data\UI\gear_flare_red_ca.paa"; + ammo = "ACE_G_Handflare_Red"; }; + class ACE_HandFlare_Green: ACE_HandFlare_Base { author = ECSTRING(common,ACETeam); scope = 2; - ammo = "ACE_F_Hand_Green"; displayname = CSTRING(M127A1_Green_Name); descriptionshort = CSTRING(M127A1_Green_Description); displayNameShort = CSTRING(M127A1_Green_NameShort); model = "\A3\weapons_f\ammo\flare_green"; picture = "\A3\Weapons_F\Data\UI\gear_flare_green_ca.paa"; + ammo = "ACE_G_Handflare_Green"; }; + class ACE_HandFlare_Yellow: ACE_HandFlare_Base { author = ECSTRING(common,ACETeam); scope = 2; - ammo = "ACE_F_Hand_Yellow"; displayname = CSTRING(M127A1_Yellow_Name); descriptionshort = CSTRING(M127A1_Yellow_Description); displayNameShort = CSTRING(M127A1_Yellow_NameShort); model = "\A3\weapons_f\ammo\flare_yellow"; picture = "\A3\Weapons_F\Data\UI\gear_flare_yellow_ca.paa"; + ammo = "ACE_G_Handflare_Yellow"; }; + class ACE_M84: HandGrenade { author = ECSTRING(common,ACETeam); - ammo = "ACE_G_M84"; displayname = CSTRING(M84_Name); descriptionshort = CSTRING(M84_Description); displayNameShort = "M84"; - mass = 4; model = PATHTOF(models\ACE_m84.p3d); picture = PATHTOF(UI\ACE_m84_x_ca.paa); + ammo = "ACE_G_M84"; + mass = 4; }; class 3Rnd_UGL_FlareGreen_F; @@ -65,6 +71,7 @@ class CfgMagazines { ammo = "F_40mm_Green"; initSpeed = 120; }; + class 6Rnd_RedSignal_F: 6Rnd_GreenSignal_F { author = ECSTRING(common,ACETeam); ammo = "F_40mm_Red"; diff --git a/addons/grenades/Effects.hpp b/addons/grenades/Effects.hpp index c9e214de5c..3cbcef9a38 100644 --- a/addons/grenades/Effects.hpp +++ b/addons/grenades/Effects.hpp @@ -2,3 +2,7 @@ class ACE_M84FlashbangEffect { // empty }; + +class ACE_HandFlareEffect { + // empty +}; diff --git a/addons/grenades/XEH_preInit.sqf b/addons/grenades/XEH_preInit.sqf index 0df2e235fd..631cecca85 100644 --- a/addons/grenades/XEH_preInit.sqf +++ b/addons/grenades/XEH_preInit.sqf @@ -2,6 +2,7 @@ ADDON = false; +PREP(flare); PREP(flashbangExplosionEH); PREP(flashbangThrownFuze); PREP(nextMode); diff --git a/addons/grenades/functions/fnc_flare.sqf b/addons/grenades/functions/fnc_flare.sqf new file mode 100644 index 0000000000..d7a8b54f51 --- /dev/null +++ b/addons/grenades/functions/fnc_flare.sqf @@ -0,0 +1,23 @@ +// by commy2 +#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); diff --git a/addons/grenades/functions/fnc_throwGrenade.sqf b/addons/grenades/functions/fnc_throwGrenade.sqf index 03e67a152a..5f8f31994a 100644 --- a/addons/grenades/functions/fnc_throwGrenade.sqf +++ b/addons/grenades/functions/fnc_throwGrenade.sqf @@ -21,22 +21,45 @@ */ #include "script_component.hpp" -private ["_mode", "_fuzeTime"]; -params ["_unit", "_weapon", "", "", "", "", "_projectile"]; +params ["_unit", "_weapon", "", "", "_ammo", "", "_projectile"]; -if (_unit != ACE_player) exitWith {}; if (_weapon != "Throw") exitWith {}; +// handle speial 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]; if (_mode != 0) then { private "_velocity"; - _velocity = velocity _projectile; switch (_mode) do { //high throw - case 1 : { + case 1 : { _velocity = [ 0.5 * (_velocity select 0), 0.5 * (_velocity select 1), @@ -44,24 +67,18 @@ if (_mode != 0) then { ]; }; //precise throw - case 2 : { + case 2 : { _velocity = (_unit weaponDirection _weapon) vectorMultiply (vectorMagnitude _velocity); }; //roll grande - case 3 : { + case 3 : { //@todo }; //drop grenade - case 4 : { + case 4 : { _velocity = [0, 0, 0]; }; }; _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); -}; From 7ce606740ca83c259d0f1c7a5ef331316dd6c075 Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 1 Sep 2015 23:56:25 +0200 Subject: [PATCH 090/170] make flares work in mp --- .../grenades/functions/fnc_throwGrenade.sqf | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/addons/grenades/functions/fnc_throwGrenade.sqf b/addons/grenades/functions/fnc_throwGrenade.sqf index 5f8f31994a..17c0fb78cc 100644 --- a/addons/grenades/functions/fnc_throwGrenade.sqf +++ b/addons/grenades/functions/fnc_throwGrenade.sqf @@ -25,6 +25,11 @@ params ["_unit", "_weapon", "", "", "_ammo", "", "_projectile"]; if (_weapon != "Throw") exitWith {}; +// http://feedback.arma3.com/view.php?id=12340 +if (isNull _projectile) then { + _projectile = nearestObject [_unit, _ammo]; +}; + // handle speial grenades if (local _unit) then { if (getNumber (configFile >> "CfgAmmo" >> _ammo >> QGVAR(flashbang)) == 1) then { @@ -33,18 +38,18 @@ if (local _unit) then { [FUNC(flashbangThrownFuze), [_projectile], _fuzeTime, 0] call EFUNC(common,waitAndExecute); }; +}; - if (getNumber (configFile >> "CfgAmmo" >> _ammo >> QGVAR(flare)) == 1) then { - private ["_fuzeTime", "_timeToLive", "_color", "_intensity"]; +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; + _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); - }; + [FUNC(flare), [_projectile, _color, _intensity, _timeToLive], _fuzeTime, 0] call EFUNC(common,waitAndExecute); }; // handle throw modes From 83424cdcab91b999ea263f855211f30cf18d1b92 Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 2 Sep 2015 00:03:16 +0200 Subject: [PATCH 091/170] header for fnc_flare --- addons/grenades/functions/fnc_flare.sqf | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/addons/grenades/functions/fnc_flare.sqf b/addons/grenades/functions/fnc_flare.sqf index d7a8b54f51..bf1d571640 100644 --- a/addons/grenades/functions/fnc_flare.sqf +++ b/addons/grenades/functions/fnc_flare.sqf @@ -1,4 +1,21 @@ -// by commy2 +/* + * Author: commy2 + * Makes flare shine. + * + * Arguments: + * 0: The flare + * 1: Color of flare + * 2: Intensity of flare + * 3: Flare lifetime + * + * 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"]; From 43c54d51e810d78d0eb1902dfcf243e9a0a2c873 Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 2 Sep 2015 01:40:38 +0200 Subject: [PATCH 092/170] hide clock on map if no watch in inventory, #414 --- addons/map/functions/fnc_onDrawMap.sqf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addons/map/functions/fnc_onDrawMap.sqf b/addons/map/functions/fnc_onDrawMap.sqf index bc147884e4..0c95e903e6 100644 --- a/addons/map/functions/fnc_onDrawMap.sqf +++ b/addons/map/functions/fnc_onDrawMap.sqf @@ -2,3 +2,8 @@ #include "script_component.hpp" ((_this select 0) displayCtrl 1016) ctrlShow GVAR(mapShowCursorCoordinates); + +// hide time when no map in inventory +if (!isNull ACE_player) then { + ((_this select 0) displayCtrl 101) ctrlShow ("ItemWatch" in assignedItems ACE_player); +}; From 29efc13556657ba74e00357c09ef789f7c3dd7f2 Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 2 Sep 2015 01:59:07 +0200 Subject: [PATCH 093/170] hide clock, use eventhandler --- addons/map/XEH_postInitClient.sqf | 13 ++++++++++++- addons/map/functions/fnc_onDrawMap.sqf | 4 +--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/addons/map/XEH_postInitClient.sqf b/addons/map/XEH_postInitClient.sqf index ef528d5233..b85d91bf16 100644 --- a/addons/map/XEH_postInitClient.sqf +++ b/addons/map/XEH_postInitClient.sqf @@ -98,4 +98,15 @@ call FUNC(determineZoom); }] call EFUNC(common,addEventHandler); }; }; -}] call EFUNC(common,addEventHandler); \ No newline at end of file +}] 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 ace_common_fnc_addEventhandler diff --git a/addons/map/functions/fnc_onDrawMap.sqf b/addons/map/functions/fnc_onDrawMap.sqf index 0c95e903e6..cc0824919a 100644 --- a/addons/map/functions/fnc_onDrawMap.sqf +++ b/addons/map/functions/fnc_onDrawMap.sqf @@ -4,6 +4,4 @@ ((_this select 0) displayCtrl 1016) ctrlShow GVAR(mapShowCursorCoordinates); // hide time when no map in inventory -if (!isNull ACE_player) then { - ((_this select 0) displayCtrl 101) ctrlShow ("ItemWatch" in assignedItems ACE_player); -}; +((_this select 0) displayCtrl 101) ctrlShow GVAR(hasWatch); From 07ab7d1c35fc9d263a152c7b1816115c408b4dcf Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 2 Sep 2015 02:00:53 +0200 Subject: [PATCH 094/170] correct comment --- addons/map/functions/fnc_onDrawMap.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/map/functions/fnc_onDrawMap.sqf b/addons/map/functions/fnc_onDrawMap.sqf index cc0824919a..37ec5a7000 100644 --- a/addons/map/functions/fnc_onDrawMap.sqf +++ b/addons/map/functions/fnc_onDrawMap.sqf @@ -3,5 +3,5 @@ ((_this select 0) displayCtrl 1016) ctrlShow GVAR(mapShowCursorCoordinates); -// hide time when no map in inventory +// hide clock when no watch in inventory, or whatever never ever ((_this select 0) displayCtrl 101) ctrlShow GVAR(hasWatch); From 7d2f1f52a4cc0de2e8eff4ba922e90ed6d456514 Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 2 Sep 2015 20:13:51 +0200 Subject: [PATCH 095/170] remove protection, hitpoint config (fix ubc), some debug stuff --- addons/medical/CfgVehicles.hpp | 213 +++++------- addons/medical/XEH_respawn.sqf | 3 +- addons/medical/functions/fnc_handleDamage.sqf | 37 ++- addons/medical/functions/fnc_init.sqf | 120 +++---- addons/medical/script_component.hpp | 2 + addons/protection/$PBOPREFIX$ | 1 - addons/protection/CfgVehicles.hpp | 5 - addons/protection/CfgWeapons.hpp | 4 - addons/protection/FixHelmets.hpp | 230 ------------- addons/protection/FixUniforms.hpp | 0 addons/protection/FixVests.hpp | 303 ------------------ addons/protection/README.md | 12 - addons/protection/config.cpp | 16 - addons/protection/script_component.hpp | 12 - 14 files changed, 161 insertions(+), 797 deletions(-) delete mode 100644 addons/protection/$PBOPREFIX$ delete mode 100644 addons/protection/CfgVehicles.hpp delete mode 100644 addons/protection/CfgWeapons.hpp delete mode 100644 addons/protection/FixHelmets.hpp delete mode 100644 addons/protection/FixUniforms.hpp delete mode 100644 addons/protection/FixVests.hpp delete mode 100644 addons/protection/README.md delete mode 100644 addons/protection/config.cpp delete mode 100644 addons/protection/script_component.hpp diff --git a/addons/medical/CfgVehicles.hpp b/addons/medical/CfgVehicles.hpp index 0764d2f1ea..61168ca541 100644 --- a/addons/medical/CfgVehicles.hpp +++ b/addons/medical/CfgVehicles.hpp @@ -432,37 +432,33 @@ class CfgVehicles { class Land; class Man: Land { - class HitPoints { - class HitHead; - class HitBody; - class HitHands; - class HitLegs; - }; + class HitPoints; }; class CAManBase: Man { - class HitPoints: HitPoints { - class HitFace; - class HitNeck; - class HitHead; - class HitPelvis; - class HitAbdomen; - class HitDiaphragm; - class HitChest; - class HitBody; - class HitArms; - class HitHands; - class HitLegs; - class HitLeftArm: HitHands { + class HitPoints: HitPoints { // custom hitpoints. addons might want to adjust these accordingly + class HitLeftArm { armor = ARM_LEG_ARMOR_DEFAULT; + material = -1; name = "hand_l"; // @todo hopefully these still include the whole arm + hands + passThrough = 1; + 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: HitLegs { + class HitLeftLeg { armor = ARM_LEG_ARMOR_DEFAULT; + material = -1; name = "leg_l"; + passThrough = 1; + radius = 0.1; + explosionShielding = 1; + visual = "injury_legs"; + minimalHit = 0.01; }; class HitRightLeg: HitLeftLeg { name = "leg_r"; @@ -527,60 +523,42 @@ class CfgVehicles { class B_Soldier_04_f: B_Soldier_base_F { class HitPoints: HitPoints { - class HitFace; - class HitNeck; class HitHead; - class HitPelvis; - class HitAbdomen; - class HitDiaphragm; - class HitChest; class HitBody; - class HitArms; class HitHands; class HitLegs; - class HitLeftArm: HitHands { + class HitLeftArm: HitLeftArm { armor = ARM_LEG_ARMOR_BETTER; - name = "hand_l"; // @todo hopefully these still include the whole arm + hands }; - class HitRightArm: HitLeftArm { - name = "hand_r"; // @todo hopefully these still include the whole arm + hands - }; - class HitLeftLeg: HitLegs { + class HitRightArm: HitRightArm { armor = ARM_LEG_ARMOR_BETTER; - name = "leg_l"; }; - class HitRightLeg: HitLeftLeg { - name = "leg_r"; + class HitLeftLeg: HitLeftLeg { + armor = ARM_LEG_ARMOR_BETTER; + }; + class HitRightLeg: HitRightLeg { + armor = ARM_LEG_ARMOR_BETTER; }; }; }; class B_Soldier_05_f: B_Soldier_base_F { class HitPoints: HitPoints { - class HitFace; - class HitNeck; class HitHead; - class HitPelvis; - class HitAbdomen; - class HitDiaphragm; - class HitChest; class HitBody; - class HitArms; class HitHands; class HitLegs; - class HitLeftArm: HitHands { + class HitLeftArm: HitLeftArm { armor = ARM_LEG_ARMOR_BETTER; - name = "hand_l"; }; - class HitRightArm: HitLeftArm { - name = "hand_r"; - }; - class HitLeftLeg: HitLegs { + class HitRightArm: HitRightArm { armor = ARM_LEG_ARMOR_BETTER; - name = "leg_l"; }; - class HitRightLeg: HitLeftLeg { - name = "leg_r"; + class HitLeftLeg: HitLeftLeg { + armor = ARM_LEG_ARMOR_BETTER; + }; + class HitRightLeg: HitRightLeg { + armor = ARM_LEG_ARMOR_BETTER; }; }; }; @@ -589,150 +567,105 @@ class CfgVehicles { class I_Soldier_03_F: I_Soldier_base_F { class HitPoints: HitPoints { - class HitFace; - class HitNeck; class HitHead; - class HitPelvis; - class HitAbdomen; - class HitDiaphragm; - class HitChest; class HitBody; - class HitArms; class HitHands; class HitLegs; - class HitLeftArm: HitHands { + class HitLeftArm: HitLeftArm { armor = ARM_LEG_ARMOR_BETTER; - name = "hand_l"; // @todo hopefully these still include the whole arm + hands }; - class HitRightArm: HitLeftArm { - name = "hand_r"; // @todo hopefully these still include the whole arm + hands - }; - class HitLeftLeg: HitLegs { + class HitRightArm: HitRightArm { armor = ARM_LEG_ARMOR_BETTER; - name = "leg_l"; }; - class HitRightLeg: HitLeftLeg { - name = "leg_r"; + class HitLeftLeg: HitLeftLeg { + armor = ARM_LEG_ARMOR_BETTER; + }; + class HitRightLeg: HitRightLeg { + armor = ARM_LEG_ARMOR_BETTER; }; }; }; class I_Soldier_04_F: I_Soldier_base_F { class HitPoints: HitPoints { - class HitFace; - class HitNeck; class HitHead; - class HitPelvis; - class HitAbdomen; - class HitDiaphragm; - class HitChest; class HitBody; - class HitArms; class HitHands; class HitLegs; - class HitLeftArm: HitHands { + class HitLeftArm: HitLeftArm { armor = ARM_LEG_ARMOR_BETTER; - name = "hand_l"; // @todo hopefully these still include the whole arm + hands }; - class HitRightArm: HitLeftArm { - name = "hand_r"; // @todo hopefully these still include the whole arm + hands - }; - class HitLeftLeg: HitLegs { + class HitRightArm: HitRightArm { armor = ARM_LEG_ARMOR_BETTER; - name = "leg_l"; }; - class HitRightLeg: HitLeftLeg { - name = "leg_r"; + class HitLeftLeg: HitLeftLeg { + armor = ARM_LEG_ARMOR_BETTER; + }; + class HitRightLeg: HitRightLeg { + armor = ARM_LEG_ARMOR_BETTER; }; }; }; class O_Soldier_base_F: SoldierEB { class HitPoints: HitPoints { - class HitFace; - class HitNeck; class HitHead; - class HitPelvis; - class HitAbdomen; - class HitDiaphragm; - class HitChest; class HitBody; - class HitArms; class HitHands; class HitLegs; - class HitLeftArm: HitHands { + class HitLeftArm: HitLeftArm { armor = ARM_LEG_ARMOR_CSAT; - name = "hand_l"; // @todo hopefully these still include the whole arm + hands }; - class HitRightArm: HitLeftArm { - name = "hand_r"; // @todo hopefully these still include the whole arm + hands - }; - class HitLeftLeg: HitLegs { + class HitRightArm: HitRightArm { armor = ARM_LEG_ARMOR_CSAT; - name = "leg_l"; }; - class HitRightLeg: HitLeftLeg { - name = "leg_r"; + class HitLeftLeg: HitLeftLeg { + armor = ARM_LEG_ARMOR_CSAT; + }; + class HitRightLeg: HitRightLeg { + armor = ARM_LEG_ARMOR_CSAT; }; }; }; class O_Soldier_02_F: O_Soldier_base_F { class HitPoints: HitPoints { - class HitFace; - class HitNeck; class HitHead; - class HitPelvis; - class HitAbdomen; - class HitDiaphragm; - class HitChest; class HitBody; - class HitArms; class HitHands; class HitLegs; - class HitLeftArm: HitHands { + class HitLeftArm: HitLeftArm { armor = ARM_LEG_ARMOR_CSAT; - name = "hand_l"; // @todo hopefully these still include the whole arm + hands }; - class HitRightArm: HitLeftArm { - name = "hand_r"; // @todo hopefully these still include the whole arm + hands - }; - class HitLeftLeg: HitLegs { + class HitRightArm: HitRightArm { armor = ARM_LEG_ARMOR_CSAT; - name = "leg_l"; }; - class HitRightLeg: HitLeftLeg { - name = "leg_r"; + class HitLeftLeg: HitLeftLeg { + armor = ARM_LEG_ARMOR_CSAT; + }; + class HitRightLeg: HitRightLeg { + armor = ARM_LEG_ARMOR_CSAT; }; }; }; class O_officer_F: O_Soldier_base_F { class HitPoints: HitPoints { - class HitFace; - class HitNeck; class HitHead; - class HitPelvis; - class HitAbdomen; - class HitDiaphragm; - class HitChest; class HitBody; - class HitArms; class HitHands; class HitLegs; - class HitLeftArm: HitHands { + class HitLeftArm: HitLeftArm { armor = ARM_LEG_ARMOR_CSAT; // @todo is that suppossed to be the case? - name = "hand_l"; // @todo hopefully these still include the whole arm + hands }; - class HitRightArm: HitLeftArm { - name = "hand_r"; // @todo hopefully these still include the whole arm + hands + class HitRightArm: HitRightArm { + armor = ARM_LEG_ARMOR_CSAT; }; - class HitLeftLeg: HitLegs { - armor = ARM_LEG_ARMOR_CSAT; // @todo is that suppossed to be the case? - name = "leg_l"; + class HitLeftLeg: HitLeftLeg { + armor = ARM_LEG_ARMOR_CSAT; }; - class HitRightLeg: HitLeftLeg { - name = "leg_r"; + class HitRightLeg: HitRightLeg { + armor = ARM_LEG_ARMOR_CSAT; }; }; }; @@ -743,19 +676,17 @@ class CfgVehicles { class HitBody; class HitHands; class HitLegs; - class HitLeftArm: HitHands { + class HitLeftArm: HitLeftArm { armor = 2; - name = "hand_l"; // @todo hopefully these still include the whole arm + hands }; - class HitRightArm: HitLeftArm { - name = "hand_r"; // @todo hopefully these still include the whole arm + hands - }; - class HitLeftLeg: HitLegs { + class HitRightArm: HitRightArm { armor = 2; - name = "leg_l"; }; - class HitRightLeg: HitLeftLeg { - name = "leg_r"; + class HitLeftLeg: HitLeftLeg { + armor = 2; + }; + class HitRightLeg: HitRightLeg { + armor = 2; }; }; }; diff --git a/addons/medical/XEH_respawn.sqf b/addons/medical/XEH_respawn.sqf index bd8a7a105b..b5b07bf141 100644 --- a/addons/medical/XEH_respawn.sqf +++ b/addons/medical/XEH_respawn.sqf @@ -2,8 +2,7 @@ params ["_unit"]; -if !(local _unit) exitWith {}; - +// reset all variables. @todo GROUP respawn? [_unit] call FUNC(init); // Reset captive status for respawning unit diff --git a/addons/medical/functions/fnc_handleDamage.sqf b/addons/medical/functions/fnc_handleDamage.sqf index 1f484ab056..df53996e94 100644 --- a/addons/medical/functions/fnc_handleDamage.sqf +++ b/addons/medical/functions/fnc_handleDamage.sqf @@ -1,5 +1,5 @@ /* - * Author: KoffeinFlummi, Glowbal + * Author: KoffeinFlummi, Glowbal, commy2 * Main HandleDamage EH function. * * Arguments: @@ -14,28 +14,39 @@ * * Public: No */ - #include "script_component.hpp" -private ["_damageReturn", "_typeOfDamage", "_minLethalDamage", "_newDamage", "_typeIndex", "_preventDeath"]; params ["_unit", "_selection", "_damage", "_shooter", "_projectile"]; -if !(local _unit) exitWith {nil}; - -if (typeName _projectile == "OBJECT") then { - _projectile = typeOf _projectile; - _this set [4, _projectile]; +// bug, apparently can fire for remote units in special cases +if !(local _unit) exitWith { + #ifdef DEBUG_ENABLED_MEDICAL + ACE_LOGDEBUG_3("HandleDamage on remote unit! - %1 - %2 - %3",diag_frameno,_unit,isServer); + #endif + nil }; -// If the damage is being weird, we just tell it to fuck off. -if !(_selection in (GVAR(SELECTIONS) + [""])) exitWith {0}; +private ["_damageReturn", "_typeOfDamage", "_minLethalDamage", "_newDamage", "_typeIndex", "_preventDeath"]; + +// bug, assumed fixed, @todo excessive testing, if nothing happens remove +/*if (typeName _projectile == "OBJECT") then { + _projectile = typeOf _projectile; + _this set [4, _projectile]; +};*/ + +#ifdef DEBUG_ENABLED_MEDICAL + ACE_LOGDEBUG_3("HandleDamage - %1 - %2 - %3",diag_frameno,_selection,_damage); +#endif + +// 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 if !(_unit getVariable [QGVAR(allowDamage), true]) exitWith { - if (_selection in GVAR(SELECTIONS)) then { - _unit getHit _selection - } else { + if (_selection == "") then { damage _unit + } else { + _unit getHit _selection }; }; diff --git a/addons/medical/functions/fnc_init.sqf b/addons/medical/functions/fnc_init.sqf index fe8715c352..7d3ebd21d5 100644 --- a/addons/medical/functions/fnc_init.sqf +++ b/addons/medical/functions/fnc_init.sqf @@ -1,5 +1,5 @@ /* - * Author: KoffeinFlummi + * Author: KoffeinFlummi, commy2 * Initializes unit variables. * * Arguments: @@ -10,73 +10,77 @@ * * Public: No */ - #include "script_component.hpp" -private ["_allUsedMedication", "_logs"]; params ["_unit"]; +// basic _unit setVariable [QGVAR(pain), 0, true]; _unit setVariable [QGVAR(morphine), 0, true]; _unit setVariable [QGVAR(bloodVolume), 100, true]; - -// tourniquets -_unit setvariable [QGVAR(tourniquets), [0,0,0,0,0,0], true]; - -// wounds and injuries -_unit setvariable [QGVAR(openWounds), [], true]; -_unit setvariable [QGVAR(bandagedWounds), [], true]; -_unit setVariable [QGVAR(internalWounds), [], true]; -_unit setvariable [QGVAR(lastUniqueWoundID), 1, true]; - -// vitals -_unit setVariable [QGVAR(heartRate), 80]; -_unit setvariable [QGVAR(heartRateAdjustments), []]; -_unit setvariable [QGVAR(bloodPressure), [80, 120]]; -_unit setVariable [QGVAR(peripheralResistance), 100]; - -// fractures -_unit setVariable [QGVAR(fractures), [], true]; - -// triage card and logs -_unit setvariable [QGVAR(triageLevel), 0, true]; -_unit setvariable [QGVAR(triageCard), [], true]; - -// IVs -_unit setVariable [QGVAR(salineIVVolume), 0, true]; -_unit setVariable [QGVAR(plasmaIVVolume), 0, true]; -_unit setVariable [QGVAR(bloodIVVolume), 0, true]; - -// damage storage -_unit setvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0], true]; - -// airway -_unit setvariable [QGVAR(airwayStatus), 100]; -_unit setVariable [QGVAR(airwayOccluded), false]; -_unit setvariable [QGVAR(airwayCollapsed), false]; - -// generic medical admin -_unit setvariable [QGVAR(addedToUnitLoop), false, true]; -_unit setvariable [QGVAR(inCardiacArrest), false, true]; _unit setVariable ["ACE_isUnconscious", false, true]; -_unit setvariable [QGVAR(hasLostBlood), 0, true]; -_unit setvariable [QGVAR(isBleeding), false, true]; -_unit setvariable [QGVAR(hasPain), false, true]; -_unit setvariable [QGVAR(amountOfReviveLives), GVAR(amountOfReviveLives), true]; -_unit setvariable [QGVAR(painSuppress), 0, true]; -// medication -_allUsedMedication = _unit getVariable [QGVAR(allUsedMedication), []]; -{ - _unit setvariable [_x select 0, nil]; -} foreach _allUsedMedication; -_unit setVariable [QGVAR(allUsedMedication), [], true]; +// advanced +if (GVAR(level) > 1) then { + // tourniquets + _unit setvariable [QGVAR(tourniquets), [0,0,0,0,0,0], true]; -_logs = _unit getvariable [QGVAR(allLogs), []]; -{ - _unit setvariable [_x, nil]; -} foreach _logs; -_unit setvariable [QGVAR(allLogs), [], true]; + // wounds and injuries + _unit setvariable [QGVAR(openWounds), [], true]; + _unit setvariable [QGVAR(bandagedWounds), [], true]; + _unit setVariable [QGVAR(internalWounds), [], true]; + _unit setvariable [QGVAR(lastUniqueWoundID), 1, true]; + + // vitals + _unit setVariable [QGVAR(heartRate), 80]; + _unit setvariable [QGVAR(heartRateAdjustments), []]; + _unit setvariable [QGVAR(bloodPressure), [80, 120]]; + _unit setVariable [QGVAR(peripheralResistance), 100]; + + // fractures + _unit setVariable [QGVAR(fractures), [], true]; + + // triage card and logs + _unit setvariable [QGVAR(triageLevel), 0, true]; + _unit setvariable [QGVAR(triageCard), [], true]; + + // IVs + _unit setVariable [QGVAR(salineIVVolume), 0, true]; + _unit setVariable [QGVAR(plasmaIVVolume), 0, true]; + _unit setVariable [QGVAR(bloodIVVolume), 0, true]; + + // damage storage + _unit setvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0], true]; + + // airway + _unit setvariable [QGVAR(airwayStatus), 100]; + _unit setVariable [QGVAR(airwayOccluded), false]; + _unit setvariable [QGVAR(airwayCollapsed), false]; + + // generic medical admin + _unit setvariable [QGVAR(addedToUnitLoop), false, true]; + _unit setvariable [QGVAR(inCardiacArrest), false, true]; + _unit setvariable [QGVAR(hasLostBlood), 0, true]; + _unit setvariable [QGVAR(isBleeding), false, true]; + _unit setvariable [QGVAR(hasPain), false, true]; + _unit setvariable [QGVAR(amountOfReviveLives), GVAR(amountOfReviveLives), true]; + _unit setvariable [QGVAR(painSuppress), 0, true]; + + private ["_allUsedMedication", "_logs"]; + + // medication + _allUsedMedication = _unit getVariable [QGVAR(allUsedMedication), []]; + { + _unit setvariable [_x select 0, nil]; + } foreach _allUsedMedication; + _unit setVariable [QGVAR(allUsedMedication), [], true]; + + _logs = _unit getvariable [QGVAR(allLogs), []]; + { + _unit setvariable [_x, nil]; + } foreach _logs; + _unit setvariable [QGVAR(allLogs), [], true]; +}; // items [{ diff --git a/addons/medical/script_component.hpp b/addons/medical/script_component.hpp index 939a811a41..910728c12b 100644 --- a/addons/medical/script_component.hpp +++ b/addons/medical/script_component.hpp @@ -1,6 +1,8 @@ #define COMPONENT medical #include "\z\ace\addons\main\script_mod.hpp" +#define DEBUG_ENABLED_MEDICAL true + #ifdef DEBUG_ENABLED_MEDICAL #define DEBUG_MODE_FULL #endif diff --git a/addons/protection/$PBOPREFIX$ b/addons/protection/$PBOPREFIX$ deleted file mode 100644 index 7ba9736ebe..0000000000 --- a/addons/protection/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -z\ace\addons\protection \ No newline at end of file diff --git a/addons/protection/CfgVehicles.hpp b/addons/protection/CfgVehicles.hpp deleted file mode 100644 index bce583e2ec..0000000000 --- a/addons/protection/CfgVehicles.hpp +++ /dev/null @@ -1,5 +0,0 @@ - -class CfgVehicles { - #include - #include -}; diff --git a/addons/protection/CfgWeapons.hpp b/addons/protection/CfgWeapons.hpp deleted file mode 100644 index 3f706fed41..0000000000 --- a/addons/protection/CfgWeapons.hpp +++ /dev/null @@ -1,4 +0,0 @@ - -class CfgWeapons { - #include -}; diff --git a/addons/protection/FixHelmets.hpp b/addons/protection/FixHelmets.hpp deleted file mode 100644 index eb2c515e50..0000000000 --- a/addons/protection/FixHelmets.hpp +++ /dev/null @@ -1,230 +0,0 @@ - -// INTEGER -#define HELMET_ARMOR_NO_PROTECTION 0 - -// FLOAT, 0-1 -#define HELMET_PASSTHROUGH_NO_PROTECTION 1 - -/*class InventoryItem_Base_F; -class HeadgearItem: InventoryItem_Base_F { - armor = 0; - passThrough = 1; -}; - -class H_HelmetB: ItemCore { - class ItemInfo: HeadgearItem { - //mass = 40; - armor = 4; - passThrough = 0.5; - }; -}; - -class H_HelmetB_camo: H_HelmetB { - class ItemInfo: HeadgearItem { - //mass = 40; - armor = 4; - passThrough = 0.5; - }; -}; - -class H_HelmetB_light: H_HelmetB { - class ItemInfo: ItemInfo { - //mass = 30; - armor = 3; - passThrough = 0.5; - }; -}; - -class H_Booniehat_khk: H_HelmetB { - class ItemInfo: ItemInfo { - //mass = 10; - armor = 0; - passThrough = 1; - }; -}; - -class H_HelmetB_plain_mcamo: H_HelmetB {}; - -class H_HelmetSpecB: H_HelmetB_plain_mcamo { - class ItemInfo: ItemInfo { - //mass = 50; - armor = 5; - passThrough = 0.5; - }; -}; - -class H_HelmetIA: H_HelmetB { - class ItemInfo: ItemInfo { - //mass = 40; - armor = 4; - passThrough = 0.5; - }; -}; - -class H_Cap_red: H_HelmetB { - class ItemInfo: ItemInfo { - //mass = 4; - armor = 0; - passThrough = 1; - }; -}; - -class H_Cap_headphones: H_HelmetB { - class ItemInfo: ItemInfo { - //mass = 8; - armor = 0; - passThrough = 1; - }; -}; - -class H_HelmetCrew_B: H_HelmetB { - class ItemInfo: ItemInfo { - //mass = 40; - armor = 4; - passThrough = 0.5; - }; -}; - -class H_PilotHelmetFighter_B: H_HelmetB { - class ItemInfo: ItemInfo { - //mass = 50; - armor = 5; - passThrough = 0.5; - }; -}; - -class H_PilotHelmetHeli_B: H_HelmetB { - class ItemInfo: ItemInfo { - //mass = 30; - armor = 3; - passThrough = 0.5; - }; -}; - -class H_CrewHelmetHeli_B: H_HelmetB { - class ItemInfo: ItemInfo { - //mass = 30; - armor = 3; - passThrough = 0.5; - }; -}; - -class H_HelmetO_ocamo: H_HelmetB { - class ItemInfo: ItemInfo { - //mass = 50; - armor = 5; - passThrough = 0.5; - }; -}; - -class H_HelmetLeaderO_ocamo: H_HelmetO_ocamo { - class ItemInfo: ItemInfo { - //mass = 60; - armor = 6; - passThrough = 0.5; - }; -}; - -class H_MilCap_ocamo: H_HelmetB { - class ItemInfo: ItemInfo { - //mass = 6; - armor = 0; - passThrough = 1; - }; -}; - -class H_BandMask_blk: H_HelmetB { - class ItemInfo: ItemInfo { - //mass = 8; - armor = 0; - passThrough = 1; - }; -}; - -class H_HelmetSpecO_ocamo: H_HelmetO_ocamo { - class ItemInfo: ItemInfo { - //mass = 40; - armor = 4; - passThrough = 0.5; - }; -}; - -class H_Bandanna_surfer: H_HelmetB { - class ItemInfo: ItemInfo { - //mass = 8; - armor = 0; - passThrough = 1; - }; -}; - -class H_Shemag_khk: H_HelmetB { - class ItemInfo: ItemInfo { - //mass = 6; - armor = 0; - passThrough = 1; - }; -}; - -class H_ShemagOpen_khk: H_HelmetB { - class ItemInfo: ItemInfo { - //mass = 6; - armor = 0; - passThrough = 1; - }; -}; - -class H_Beret_blk: H_HelmetB { - class ItemInfo: ItemInfo { - //mass = 6; - armor = 0; - passThrough = 1; - }; -}; - -class H_Beret_02: H_Beret_blk { - class ItemInfo: ItemInfo { - //mass = 6; - armor = 0; - passThrough = 1; - }; -}; - -class H_Watchcap_blk: H_HelmetB { - class ItemInfo: ItemInfo { - //mass = 6; - armor = 0; - passThrough = 1; - }; -}; - -class H_TurbanO_blk: H_HelmetB { - class ItemInfo: ItemInfo { - //mass = 8; - armor = 0; - passThrough = 1; - }; -}; - -class H_StrawHat: H_HelmetB { - class ItemInfo: ItemInfo { - //mass = 6; - armor = 0; - passThrough = 1; - }; -}; - -class H_Hat_blue: H_HelmetB { - class ItemInfo: ItemInfo { - //mass = 6; - armor = 0; - passThrough = 1; - }; -}; - -class H_RacingHelmet_1_F: H_HelmetB_camo { - class ItemInfo: ItemInfo { - //mass = 50; - armor = 5; - passThrough = 0.5; - }; -};*/ diff --git a/addons/protection/FixUniforms.hpp b/addons/protection/FixUniforms.hpp deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/addons/protection/FixVests.hpp b/addons/protection/FixVests.hpp deleted file mode 100644 index f3d1ad2b3d..0000000000 --- a/addons/protection/FixVests.hpp +++ /dev/null @@ -1,303 +0,0 @@ - -class ItemCore; -class VestItem; - -class Vest_Camo_Base: ItemCore { - class ItemInfo: VestItem { - /*containerClass = "Supply0"; - mass = 0; - armor = 0; - passThrough = 1;*/ - }; -}; -class Vest_NoCamo_Base: ItemCore { - class ItemInfo: VestItem { - /*containerClass = "Supply0"; - mass = 0; - armor = 0; - passThrough = 1;*/ - }; -}; - -// belts -class V_Rangemaster_belt: Vest_NoCamo_Base { - class ItemInfo: ItemInfo { - /*containerClass = "Supply40"; - mass = 10; - armor = 0; - passThrough = 1;*/ - }; -}; - -// bandolliers -class V_BandollierB_khk: Vest_Camo_Base { - class ItemInfo: ItemInfo { - /*containerClass = "Supply80"; - mass = 15; - armor = 0;*/ - passThrough = 0.85; //1; - }; -}; -/*class V_BandollierB_cbr: V_BandollierB_khk { - class ItemInfo: ItemInfo {}; -}; -class V_BandollierB_rgr: V_BandollierB_khk { - class ItemInfo: ItemInfo {}; -}; -class V_BandollierB_blk: V_BandollierB_khk { - class ItemInfo: ItemInfo {}; -}; -class V_BandollierB_oli: V_BandollierB_khk { - class ItemInfo: ItemInfo {}; -};*/ - -// plate carriers -class V_PlateCarrier1_rgr: Vest_NoCamo_Base { // lite - class ItemInfo: ItemInfo { - /*containerClass = "Supply140"; - mass = 80;*/ - armor = 8; //20; - passThrough = 0.75; //0.5; - }; -}; -class V_PlateCarrier2_rgr: V_PlateCarrier1_rgr { // heavy - class ItemInfo: ItemInfo { - /*containerClass = "Supply140"; - mass = 100;*/ - armor = 12; //30; - passThrough = 0.75; //0.5; - }; -}; -class V_PlateCarrier3_rgr: Vest_NoCamo_Base { // heavy (us) - class ItemInfo: ItemInfo { - /*containerClass = "Supply140"; - mass = 100;*/ - armor = 12; //30; - passThrough = 0.75; //0.5; - }; -}; -class V_PlateCarrierGL_rgr: Vest_NoCamo_Base { // lite (gl) - class ItemInfo: ItemInfo { - containerClass = "Supply160"; //"Supply140"; - /*mass = 100;*/ - armor = 8; //100; - passThrough = 0.75; //0.7; - }; -}; -class V_PlateCarrier1_blk: Vest_Camo_Base { // heavy (black) - class ItemInfo: ItemInfo { - /*containerClass = "Supply140";*/ - mass = 100; //80; - armor = 12; //20; - passThrough = 0.75; //0.5; - }; -}; -class V_PlateCarrierSpec_rgr: Vest_NoCamo_Base { // lite (special) - class ItemInfo: ItemInfo { - /*containerClass = "Supply100"; - mass = 120;*/ - armor = 16; //40; - passThrough = 0.75; //0.1; - }; -}; - -// chestrigs -/*class V_Chestrig_khk: Vest_Camo_Base { - class ItemInfo: ItemInfo { - containerClass = "Supply140"; - mass = 20; - armor = 0; - passThrough = 1; - }; -}; -class V_Chestrig_rgr: V_Chestrig_khk {}; -class V_Chestrig_blk: V_Chestrig_khk {}; -class V_Chestrig_oli: Vest_Camo_Base { - class ItemInfo: ItemInfo { - containerClass = "Supply140"; - mass = 20; - armor = 0; - passThrough = 1; - }; -};*/ - -// tactical vests -class V_TacVest_khk: Vest_Camo_Base { - class ItemInfo: ItemInfo { - /*containerClass = "Supply100"; - mass = 40;*/ - armor = 8; //20; - /*passThrough = 1;*/ - }; -}; -class V_TacVest_brn: V_TacVest_khk {}; -class V_TacVest_oli: V_TacVest_khk {}; -class V_TacVest_blk: V_TacVest_khk {}; -class V_TacVest_camo: Vest_Camo_Base { - class ItemInfo: ItemInfo { - /*containerClass = "Supply100"; - mass = 40;*/ - armor = 8; //20; - /*passThrough = 1;*/ - }; -}; -class V_TacVest_blk_POLICE: Vest_Camo_Base { - class ItemInfo: ItemInfo { - /*containerClass = "Supply100";*/ - mass = 40; //60; - armor = 8; //100; - passThrough = 1; //0.7; - }; -}; -class V_TacVestIR_blk: Vest_NoCamo_Base { // raven vest - class ItemInfo: VestItem { - /*containerClass = "Supply100"; - mass = 50;*/ - armor = 8; //20; - passThrough = 0.85; //0.5; - }; -}; -class V_TacVestCamo_khk: Vest_Camo_Base { - class ItemInfo: VestItem { - /*containerClass = "Supply100"; - mass = 40;*/ - armor = 8; //20; - /*passThrough = 1;*/ - }; -}; - -// harnesses -class V_HarnessO_brn: Vest_NoCamo_Base { - class ItemInfo: ItemInfo { - /*containerClass = "Supply160"; - mass = 30; - armor = 0;*/ - passThrough = 0.85; //0.5; - }; -}; -class V_HarnessOGL_brn: Vest_NoCamo_Base { // gl - class ItemInfo: ItemInfo { - /*containerClass = "Supply120"; - mass = 20; - armor = 0;*/ - passThrough = 0.85; //0.5; - }; -}; -class V_HarnessO_gry: V_HarnessO_brn { - class ItemInfo: ItemInfo { - /*containerClass = "Supply160"; - mass = 30; - armor = 0;*/ - passThrough = 0.85; //0.5; - }; -}; -class V_HarnessOGL_gry: V_HarnessO_gry { // gl - class ItemInfo: ItemInfo { - /*containerClass = "Supply120"; - mass = 20; - armor = 0;*/ - passThrough = 0.85; //0.5; - }; -}; -class V_HarnessOSpec_brn: V_HarnessO_brn { - class ItemInfo: VestItem { - /*containerClass = "Supply160"; - mass = 30; - armor = 0;*/ - passThrough = 0.85; //0.5; - }; -}; -class V_HarnessOSpec_gry: V_HarnessO_gry { - class ItemInfo: ItemInfo { - /*containerClass = "Supply160"; - mass = 30; - armor = 0;*/ - passThrough = 0.85; //0.5; - }; -}; - -// indep plate carriers -class V_PlateCarrierIA1_dgtl: Vest_NoCamo_Base { // lite - class ItemInfo: VestItem { - /*containerClass = "Supply120"; - mass = 60;*/ - armor = 8; //20; - passThrough = 0.75; //0.5; - }; -}; -class V_PlateCarrierIA2_dgtl: V_PlateCarrierIA1_dgtl { // heavy - class ItemInfo: VestItem { - /*containerClass = "Supply120"; - mass = 80;*/ - armor = 12; //30; - passThrough = 0.75; //0.5; - }; -}; -class V_PlateCarrierIAGL_dgtl: V_PlateCarrierIA2_dgtl { // heavy (gl) - class ItemInfo: VestItem { - containerClass = "Supply140"; //"Supply120"; - mass = 100; //80; - armor = 12; //100; - passThrough = 0.75; //0.7; - }; -}; - -// rebreather -/*class V_RebreatherB: Vest_Camo_Base { - class ItemInfo: ItemInfo { - containerClass = "Supply0"; - mass = 80; - armor = 20; - passThrough = 1; - }; -}; -class V_RebreatherIR: V_RebreatherB {}; -class V_RebreatherIA: V_RebreatherB {};*/ - -// more plate carriers -class V_PlateCarrier_Kerry: V_PlateCarrier1_rgr { // lighter - class ItemInfo: ItemInfo { - /*containerClass = "Supply140"; - mass = 80;*/ - armor = 8; //30; - passThrough = 0.75; //0.5; - }; -}; -class V_PlateCarrierL_CTRG: V_PlateCarrier1_rgr { // lite - class ItemInfo: ItemInfo { - /*containerClass = "Supply140"; - mass = 80;*/ - armor = 8; //20; - passThrough = 0.75; //0.5; - }; -}; -class V_PlateCarrierH_CTRG: V_PlateCarrier2_rgr { // heavy - class ItemInfo: ItemInfo { - /*containerClass = "Supply140"; - mass = 100;*/ - armor = 12; //30; - passThrough = 0.75; //0.5; - }; -}; - -// another tactical vest -class V_I_G_resistanceLeader_F: V_TacVest_camo { - class ItemInfo: ItemInfo {}; -}; - -// press vest -class V_Press_F: Vest_Camo_Base { - class ItemInfo: ItemInfo { - /*containerClass = "Supply40"; - mass = 20;*/ - armor = 8; //0; ? - /*passThrough = 1;*/ - }; -}; - -// marksman dlc -/*class V_PlateCarrierGL_blk: V_PlateCarrierGL_rgr {}; -class V_PlateCarrierGL_mtp: V_PlateCarrierGL_rgr {}; -class V_PlateCarrierSpec_blk: V_PlateCarrierSpec_rgr {}; -class V_PlateCarrierSpec_mtp: V_PlateCarrierSpec_rgr {}; -class V_PlateCarrierIAGL_oli: V_PlateCarrierIAGL_dgtl {};*/ diff --git a/addons/protection/README.md b/addons/protection/README.md deleted file mode 100644 index a6def1a1bc..0000000000 --- a/addons/protection/README.md +++ /dev/null @@ -1,12 +0,0 @@ -ace_protection -============== - -Fixes and tweaks the protection values of body armour. - - -## Maintainers - -The people responsible for merging changes to this component or answering potential questions. - -- [KoffeinFlummi](https://github.com/KoffeinFlummi) -- [commy2](https://github.com/commy2) diff --git a/addons/protection/config.cpp b/addons/protection/config.cpp deleted file mode 100644 index bb4ef3f739..0000000000 --- a/addons/protection/config.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "script_component.hpp" - -class CfgPatches { - class ADDON { - units[] = {}; - weapons[] = {}; - requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_common"}; - author[] = {"commy2"}; - authorUrl = "https://github.com/commy2"; - VERSION_CONFIG; - }; -}; - -#include "CfgVehicles.hpp" -#include "CfgWeapons.hpp" diff --git a/addons/protection/script_component.hpp b/addons/protection/script_component.hpp deleted file mode 100644 index 1b2774a8ef..0000000000 --- a/addons/protection/script_component.hpp +++ /dev/null @@ -1,12 +0,0 @@ -#define COMPONENT protection -#include "\z\ace\addons\main\script_mod.hpp" - -#ifdef DEBUG_ENABLED_PROTECTION - #define DEBUG_MODE_FULL -#endif - -#ifdef DEBUG_ENABLED_PROTECTION - #define DEBUG_SETTINGS DEBUG_ENABLED_PROTECTION -#endif - -#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file From f939f9215e4388af4a63e88a0ff8fed53ceafdb5 Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 2 Sep 2015 20:49:17 +0200 Subject: [PATCH 096/170] stop flickering of wounds, fix #346 --- addons/medical/functions/fnc_handleDamage.sqf | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/addons/medical/functions/fnc_handleDamage.sqf b/addons/medical/functions/fnc_handleDamage.sqf index df53996e94..9b612757b4 100644 --- a/addons/medical/functions/fnc_handleDamage.sqf +++ b/addons/medical/functions/fnc_handleDamage.sqf @@ -21,7 +21,7 @@ params ["_unit", "_selection", "_damage", "_shooter", "_projectile"]; // bug, apparently can fire for remote units in special cases if !(local _unit) exitWith { #ifdef DEBUG_ENABLED_MEDICAL - ACE_LOGDEBUG_3("HandleDamage on remote unit! - %1 - %2 - %3",diag_frameno,_unit,isServer); + ACE_LOGDEBUG_3("HandleDamage on remote unit! - %1 - %2 - %3", diag_frameno, _unit, isServer); #endif nil }; @@ -35,9 +35,13 @@ private ["_damageReturn", "_typeOfDamage", "_minLethalDamage", "_newDamage", "_ };*/ #ifdef DEBUG_ENABLED_MEDICAL - ACE_LOGDEBUG_3("HandleDamage - %1 - %2 - %3",diag_frameno,_selection,_damage); + ACE_LOGDEBUG_3("HandleDamage - %1 - %2 - %3", diag_frameno, _selection, _damage); #endif +// 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" @@ -48,8 +52,13 @@ if !(_unit getVariable [QGVAR(allowDamage), true]) exitWith { } else { _unit getHit _selection }; + #ifdef DEBUG_ENABLED_MEDICAL + ACE_LOGDEBUG_3("HandleDamage damage disabled. - %1 - %2 - %3", diag_frameno, _unit, _selection); + #endif }; +//if (true) exitWith {nil};// + // Get return damage _damageReturn = _damage; From f38d245771c198ed4285b88ddbf4aef096693af2 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Wed, 2 Sep 2015 21:56:00 +0200 Subject: [PATCH 097/170] fixed bloodloss for basic medical --- addons/medical/functions/fnc_getBloodLoss.sqf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_getBloodLoss.sqf b/addons/medical/functions/fnc_getBloodLoss.sqf index 9ac1083f03..a3fdbd5b94 100644 --- a/addons/medical/functions/fnc_getBloodLoss.sqf +++ b/addons/medical/functions/fnc_getBloodLoss.sqf @@ -43,6 +43,7 @@ if (GVAR(level) >= 2) then { // cap the blood loss to be no greater as the current cardiac output //(_totalBloodLoss min _cardiacOutput); } 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); From 0bbf4d41287eff523ba8e09bd260d9d97873b155 Mon Sep 17 00:00:00 2001 From: jonpas Date: Wed, 2 Sep 2015 22:24:46 +0200 Subject: [PATCH 098/170] Prevent Cargo opening if vehicle is locked --- addons/cargo/functions/fnc_initVehicle.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/cargo/functions/fnc_initVehicle.sqf b/addons/cargo/functions/fnc_initVehicle.sqf index b817688336..efb3b9a5cf 100644 --- a/addons/cargo/functions/fnc_initVehicle.sqf +++ b/addons/cargo/functions/fnc_initVehicle.sqf @@ -41,7 +41,7 @@ if (getNumber (configFile >> "CfgVehicles" >> _type >> QGVAR(hasCargo)) != 1) ex private ["_text", "_condition", "_statement", "_icon", "_action"]; _condition = { 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); _statement = {GVAR(interactionVehicle) = _target; createDialog QGVAR(menu);}; From def2d295012fbc08dbf360f1897428406acaffbc Mon Sep 17 00:00:00 2001 From: jonpas Date: Wed, 2 Sep 2015 22:51:31 +0200 Subject: [PATCH 099/170] Cleaned up slideshow privates --- addons/slideshow/functions/fnc_addSlideActions.sqf | 1 - addons/slideshow/functions/fnc_autoTransition.sqf | 1 - addons/slideshow/functions/fnc_createSlideshow.sqf | 3 +-- addons/slideshow/functions/fnc_makeList.sqf | 3 +-- addons/slideshow/functions/fnc_moduleInit.sqf | 1 - 5 files changed, 2 insertions(+), 7 deletions(-) diff --git a/addons/slideshow/functions/fnc_addSlideActions.sqf b/addons/slideshow/functions/fnc_addSlideActions.sqf index 1ebba306b4..a18249a4f8 100644 --- a/addons/slideshow/functions/fnc_addSlideActions.sqf +++ b/addons/slideshow/functions/fnc_addSlideActions.sqf @@ -20,7 +20,6 @@ #include "script_component.hpp" private "_actions"; - params ["_objects", "_images", "_names", "_controller", "_currentSlideshow"]; _actions = []; diff --git a/addons/slideshow/functions/fnc_autoTransition.sqf b/addons/slideshow/functions/fnc_autoTransition.sqf index c8b03a707a..4c31c4ff6a 100644 --- a/addons/slideshow/functions/fnc_autoTransition.sqf +++ b/addons/slideshow/functions/fnc_autoTransition.sqf @@ -19,7 +19,6 @@ #include "script_component.hpp" private "_currentSlide"; - params ["_objects", "_images", "_varString", "_duration"]; // Get current slide number of this slideshow diff --git a/addons/slideshow/functions/fnc_createSlideshow.sqf b/addons/slideshow/functions/fnc_createSlideshow.sqf index 665b954496..369593dd16 100644 --- a/addons/slideshow/functions/fnc_createSlideshow.sqf +++ b/addons/slideshow/functions/fnc_createSlideshow.sqf @@ -19,8 +19,7 @@ */ #include "script_component.hpp" -private ["_currentSlideshow", "_actionsObject", "_actionsClass", "_mainAction", "_slidesAction", "_varString"]; - +private ["_currentSlideshow", "_slidesAction", "_varString"]; params ["_objects", "_controllers", "_images", "_names", "_duration"]; // Verify data diff --git a/addons/slideshow/functions/fnc_makeList.sqf b/addons/slideshow/functions/fnc_makeList.sqf index 6736fabbdb..e550e462a7 100644 --- a/addons/slideshow/functions/fnc_makeList.sqf +++ b/addons/slideshow/functions/fnc_makeList.sqf @@ -17,9 +17,8 @@ */ #include "script_component.hpp" -params ["_list", "_trimWhitespace", "_checkNil"]; - private ["_splittedList", "_listTrimmedWhitespace", "_nilCheckPassedList"]; +params ["_list", "_trimWhitespace", "_checkNil"]; // Split using comma delimiter _splittedList = [_list, ","] call BIS_fnc_splitString; diff --git a/addons/slideshow/functions/fnc_moduleInit.sqf b/addons/slideshow/functions/fnc_moduleInit.sqf index da1724dfcc..a0b5386f97 100644 --- a/addons/slideshow/functions/fnc_moduleInit.sqf +++ b/addons/slideshow/functions/fnc_moduleInit.sqf @@ -18,7 +18,6 @@ if (!hasInterface && !isDedicated) exitWith {}; private ["_objects", "_controllers", "_images", "_names", "_duration"]; - params [["_logic", objNull, [objNull]], "_units", "_activated"]; if !(_activated) exitWith {}; From 44fa520bdd3a017a2f6db72219adccb7e5929c0c Mon Sep 17 00:00:00 2001 From: ProfessorCZ Date: Thu, 3 Sep 2015 01:20:24 +0200 Subject: [PATCH 100/170] Czech Translations - Update --- addons/cargo/stringtable.xml | 6 ++++ addons/common/stringtable.xml | 5 +++ addons/explosives/stringtable.xml | 1 + addons/flashlights/stringtable.xml | 6 ++++ addons/interact_menu/stringtable.xml | 7 ++-- addons/main/stringtable.xml | 1 + addons/map/stringtable.xml | 8 ++++- addons/medical_menu/stringtable.xml | 29 ++++++++++++++-- addons/optionsmenu/stringtable.xml | 10 ++++-- addons/parachute/stringtable.xml | 8 +++-- addons/repair/stringtable.xml | 49 +++++++++++++++++++++++--- addons/sitting/stringtable.xml | 2 +- addons/slideshow/stringtable.xml | 6 +++- addons/spectator/stringtable.xml | 51 +++++++++++++++++++++++++++- addons/zeus/stringtable.xml | 3 ++ 15 files changed, 171 insertions(+), 21 deletions(-) diff --git a/addons/cargo/stringtable.xml b/addons/cargo/stringtable.xml index a39fb16f6f..496fa60a0c 100644 --- a/addons/cargo/stringtable.xml +++ b/addons/cargo/stringtable.xml @@ -4,26 +4,32 @@ Load Załaduj + Naložit Unload Wyładuj + Vyložit Cargo Ładunek + Náklad Cargo Menu Menu ładunku + Menu nákladu Cargo space left: %1 Pozostałe miejsce: %1 + Volný prostor: %1 Enable Cargo Aktywuj cargo + Povolit náklad Enable the load in cargo module diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index e542e28ae8..280c95aa4d 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -661,6 +661,7 @@ Vehicles only Tylko pojazdy + Pouze vozidla Do Not Force @@ -673,6 +674,7 @@ ACE3 Equipment ACE3 Wyposażenie + ACE3 Vybavení ACE3 Common @@ -681,6 +683,7 @@ ACE3 Weapons ACE3 Broń + ACE3 Zbraně ACE3 Movement @@ -689,10 +692,12 @@ ACE3 Scope Adjustment ACE3 Regulacja optyki + ACE3 Nastavení optiky ACE3 Vehicles ACE3 Pojazdy + ACE3 Vozidla \ No newline at end of file diff --git a/addons/explosives/stringtable.xml b/addons/explosives/stringtable.xml index b115ca0752..7de2d36ca7 100644 --- a/addons/explosives/stringtable.xml +++ b/addons/explosives/stringtable.xml @@ -76,6 +76,7 @@ Blocked Obstruido + Blokováno Cancel diff --git a/addons/flashlights/stringtable.xml b/addons/flashlights/stringtable.xml index e871360bf3..9038272655 100644 --- a/addons/flashlights/stringtable.xml +++ b/addons/flashlights/stringtable.xml @@ -4,26 +4,32 @@ Fulton MX-991 Fulton MX-991 + Fulton MX-991 Flashlight with red filter. For use on map. Latarka z czerwonym filtrem. Używana do podświetlania mapy. + Svítilna s červeným filtrem. Pro nahlédnutí do mapy. Maglite XL50 Maglite XL50 + Maglite XL50 White mini flashlight. For use on map. Mini latarka. Światło białe. Używana do podświetlania mapy. + Bílá mini svítilna. Pro nahlédnutí do mapy. KSF-1 KSF-1 + KSF-1 Flashlight with red filter. For use on map. Latarka z czerwonym filtrem. Używana do podświetlania mapy. + Svítilna s červeným filtrem. Pro nahlédnutí do mapy. \ No newline at end of file diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index 990d7f90bf..755b89e1ac 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -238,7 +238,7 @@ Blur the background while the interaction menu is open. Rozmywa lub przyciemnia tło na czas otwarcia menu interakcji Desenfocar el fondo mientras el menú de interacción está abierto. - Rozmazat obraz pokud je interakční menu otevřené. + Rozmazat obraz při otevřeném interakčním menu. Den Hintergrund verschwimmen lassen, während das Interaktionsmenü geöffnet ist. Desfocar o fundo enquanto o menu de interação está aberto. A háttér elmosása a cselekvő menü használata alatt. @@ -256,7 +256,7 @@ Black Przyciemnienie ekranu Negro - Černý obraz + Tmavý Preto Schwarz Fekete @@ -280,6 +280,7 @@ Interaction Menu Menu interakcji + Menu interakce - + \ No newline at end of file diff --git a/addons/main/stringtable.xml b/addons/main/stringtable.xml index 266e21bf40..0bc68c663a 100644 --- a/addons/main/stringtable.xml +++ b/addons/main/stringtable.xml @@ -4,6 +4,7 @@ ACE Logistics ACE Logistyka + ACE Logistika \ No newline at end of file diff --git a/addons/map/stringtable.xml b/addons/map/stringtable.xml index f996800346..e0bb8dc68a 100644 --- a/addons/map/stringtable.xml +++ b/addons/map/stringtable.xml @@ -162,26 +162,32 @@ Flashlights Latarki + Svítilny NVG Noktowizja + NVG On Włącz + Zapnout Off Wyłącz + Vypnout Increase Brightness Zwiększ czułość + Zvýšit jas Decrease Brightness Zmniejsz czułość + Snížit jas - + \ No newline at end of file diff --git a/addons/medical_menu/stringtable.xml b/addons/medical_menu/stringtable.xml index 0a4f1a5388..6329d1aa56 100644 --- a/addons/medical_menu/stringtable.xml +++ b/addons/medical_menu/stringtable.xml @@ -1,4 +1,4 @@ - + @@ -47,6 +47,7 @@ EXAMINAR & TRATAMIENTO EXAMINER & TRAITEMENTS BADANIE & LECZENIE + VYŠETŘENÍ & LÉČBA STATUS @@ -54,6 +55,7 @@ ESTADO ÉTATS STATUS + STAV OVERVIEW @@ -61,6 +63,7 @@ DESCRIPCIÓN DESCRIPTION OPIS + PŘEHLED ACTIVITY LOG @@ -68,6 +71,7 @@ REGISTRO DE ACTIVIDAD REGISTRE DES SOINS LOGI AKTYWNOŚCI + PROTOKOL QUICK VIEW @@ -75,6 +79,7 @@ VISTA RÁPIDA VUE RAPIDE SZYBKI PODGLĄD + RYCHLÝ NÁHLED View triage Card @@ -124,6 +129,7 @@ Arrastrar/Cargar Glisser/Porter Ciągnij/Nieś + Táhnout/Nést Toggle (Self) @@ -138,7 +144,6 @@ Seleccionar estado de Triage Selectioner l'état de Triage Wybierz priorytet - Select Head @@ -146,6 +151,7 @@ Seleccionar Cabeza Selectioner Tête Wybierz głowę + Vybrat Hlavu Select Torso @@ -153,6 +159,7 @@ Seleccionar Torso Selectioner Torse Wybierz tors + Vybrat Trup Select Left Arm @@ -160,6 +167,7 @@ Seleccionar Brazo Izquierdo Selectioner Bras Gauche Wybierz lewą rękę + Vybrat Levou Ruku Select Right Arm @@ -167,6 +175,7 @@ Seleccionar Brazo Derecho Selectioner Bras Droit Wybierz prawą rękę + Vybrat Pravou Ruku Select Left Leg @@ -174,6 +183,7 @@ Seleccionar Pierna Izquierda Selectioner Jambe Gauche Wybierz lewą nogę + Vybrat Levou Nohu Select Right Leg @@ -181,6 +191,7 @@ Seleccionar Pierna Derecha Selectioner Jambe Droite Wybierz prawą nogę + Vybrat Pravou Nohu Head @@ -188,12 +199,14 @@ Cabeza Tête Głowa + Hlava Torso Торс Torse Tors + Trup Left Arm @@ -201,6 +214,7 @@ Brazo Izquierdo Bras Gauche Lewa ręka + Levá Ruka Right Arm @@ -208,6 +222,7 @@ Brazo Derecho Bras Droit Prawa ręka + Pravá Ruka Left Leg @@ -215,6 +230,7 @@ Pierna Izquierda Jambe Gauche Lewa noga + Levá Noha Right Leg @@ -222,6 +238,7 @@ Pierna Derecha Jambe Droite Prawa noga + Pravá Noha Body Part: %1 @@ -306,6 +323,7 @@ No respira Apnée Brak oddechu + Nedýchá Difficult breathing @@ -313,6 +331,7 @@ Dificultad para respirar Difficultée Respiratoire Trudności z oddychaniem + Potíže s dýcháním Almost no breathing @@ -320,6 +339,7 @@ Casi sin respirar Respiration Faible Prawie brak oddechu + Téměř nedýchá Bleeding @@ -327,6 +347,7 @@ Sangrando Seignement Krwawienie zewnętrzne + Krvácí in Pain @@ -334,6 +355,7 @@ Con Dolor A De La Douleur W bólu + v Bolestech Lost a lot of Blood @@ -341,6 +363,7 @@ Mucha Sangre perdida A Perdu Bcp de Sang Stracił dużo krwi + Ztratil hodně Krve Tourniquet [CAT] @@ -357,4 +380,4 @@ Rurka nosowo-gardłowa [NPA] - + \ No newline at end of file diff --git a/addons/optionsmenu/stringtable.xml b/addons/optionsmenu/stringtable.xml index 07975fcb0a..188e9373c0 100644 --- a/addons/optionsmenu/stringtable.xml +++ b/addons/optionsmenu/stringtable.xml @@ -338,11 +338,13 @@ Headbug Fix Fix Headbug "Fejhiba" fix + Fix Headbug Resets your animation state. Resetuje aktualną animację. Visszaállítja az animációs állapotodat. + Resetovat aktuální animaci. ACE News @@ -350,7 +352,7 @@ ACE-Neuigkeiten Notícias do ACE Wiadomości ACE - ACE Novinky + ACE Zprávy ACE hírek @@ -359,16 +361,18 @@ Zeige Neuigkeiten im Hauptmenü Mostrar notícias no menu principal Pokazuj wiadomości ACE w menu głównym - Zobrazit novinky v hlavním menu + Zobrazit Zprávy v Hlavním Menu Hírek mutatása a főmenüben All Categories Wszystkie kategorie + Všechny Kategorie Logistics Logistyka + Logistika - + \ No newline at end of file diff --git a/addons/parachute/stringtable.xml b/addons/parachute/stringtable.xml index c21c55ba9e..d70e2802f5 100644 --- a/addons/parachute/stringtable.xml +++ b/addons/parachute/stringtable.xml @@ -17,7 +17,7 @@ Altimeter Watch Montre altimètre Höhenmesser - Hodinky s výškoměrem + Hodinky s Výškoměrem Zegarek z wysokościomierzem Reloj altímetro Magasságmérős karóra @@ -43,7 +43,7 @@ Paracaídas no dirigible Parachute non manœuvrable Niesterowalny spadochron - Neříditelný padák + Neříditelný Padák Irányíthatatlan ejtőernyő Неуправляемый парашют Paracadute non manovrabile @@ -54,12 +54,14 @@ Fallschirm abschneiden Odetnij spadochron Ejtőernyő elvágása + Odžíznout Padák Reserve Parachute Reserve Fallschirm Spadochron awaryjny Tartalék ejtőernyő + Záložní Padák - + \ No newline at end of file diff --git a/addons/repair/stringtable.xml b/addons/repair/stringtable.xml index 09759344f8..dd8302b845 100644 --- a/addons/repair/stringtable.xml +++ b/addons/repair/stringtable.xml @@ -1,4 +1,4 @@ - + @@ -8,7 +8,7 @@ Cadena de repuesto Chenille de réserve Zapasowa gąsienica - Náhradní pásy + Náhradní Pásy Lagarta Reserva Cingolo di scorta Pót lánctalp @@ -32,7 +32,7 @@ Cambiar rueda Changer Roue Wymień koło - Vyměňit kolo + Vyměňit Kolo Trocar Roda Sostituisci la ruota Kerék cseréje @@ -42,11 +42,13 @@ Replacing Wheel ... Ersetze Reifen ... Wymienianie koła ... + Měním Kolo ... Wheel replaced Reifen ersetzt Koło zostało wymienione + Kolo vyměněno Remove Wheel @@ -64,47 +66,58 @@ Removing Wheel ... Entferne Reifen ... Zdejmowanie koła ... + Odstraňuji Kolo ... Wheel removed Reifen entfernt Koło zostało zdjęte + Kolo odstraněno Change Track Wymień gąsienicę + Vyměnit Pás Replacing Track ... Wymienianie gąsienicy ... + Měním Pás ... Track replaced Gąsienica została wymieniona + Pás vyměněn Remove Track Zdejmij gąsienicę + Odstranit Pás Removing Track ... Zdejmowanie gąsienicy ... + Odstraňuji Pás ... Track removed Gąsienica została zdjęta + Pás odstraněn Full Repair Pełna naprawa + Kompletní Oprava Repairing Vehicle ... Naprawianie pojazdu ... + Opravuji Vozidlo ... Full Repair Locations Lokaliz. pełnej naprawy + Lokace pro Kompletní Opravu At what locations can a vehicle be fully repaired? @@ -113,6 +126,7 @@ Allow Full Repair Zezwól na pełną naprawę + Povolit Kompletní Opravu Who can perform a full repair on a vehicle? @@ -133,6 +147,7 @@ Display text on repair Wyświetl tekst przy naprawie + Zobrazit text při opravě Display a notification whenever you repair a vehicle @@ -178,6 +193,7 @@ Fully repaired part Bauteil vollständig repariert W pełni naprawiono część + Kompletně opravená část Partially repaired %1 @@ -188,6 +204,7 @@ Fully repaired %1 %1 vollständig repariert W pełni naprawiono: %1 + Kompletně opraveno %1 Partially repaired %1 @@ -238,6 +255,7 @@ Vertical Stabilizer + Vertikální Stabilizátor Fuel Tank @@ -253,24 +271,29 @@ Transmission + Převodovka Gear Starter + Startér Tail + Ocas Pilot Tube + Pilotova Trubice Static Port Ammo + Munice Turret @@ -298,6 +321,7 @@ Missiles + Rakety Left Track @@ -449,7 +473,7 @@ Rotor de cola Rotor anticouple Tylni rotor - Zadní Rotor + Ocasní Rotor Rotor de Cauda Rotore di coda Farokrotor @@ -507,30 +531,37 @@ Anyone Ktokolwiek + Kdokoliv Engineer only Tylko mechanicy + Pouze inženýr Repair Specialist only Tylko inżynierowie + Pouze specialista na opravování Allow Wheel Wymiana kół + Možnost Výměny Kol Who can remove and replace wheels? Kto może zdejmować i zmieniać koła? + Kdo může odstranit a vyměnit kola? Allow Repair Możliwość naprawy + Možnost Opravování Who can perform repair actions? Kto może wykonywać czynności związane z naprawą pojazdów? + Kdo může provádět opravy? Repair Threshold @@ -559,6 +590,7 @@ Anywhere Wszędzie + Kdekoliv Repair Vehicle only @@ -575,10 +607,12 @@ Assign Engineer Przydziel inżyniera + Přiřadit Inženýra List Lista + Seznam List of unit names that will be classified as engineer, separated by commas. @@ -595,14 +629,17 @@ None Żadny + Nikdo Engineer Mechanik + Inženýr Specialist Inżynier + Specialista Assign one or multiple units as an engineer @@ -615,6 +652,7 @@ List Lista + Seznam List of vehicles that will be classified as repair vehicle, separated by commas. @@ -639,6 +677,7 @@ List Lista + Seznam List of objects that will be classified as repair Facility, separated by commas. @@ -657,4 +696,4 @@ Przydziel klasę budynku naprawczego do jednego lub kilku budynków. - + \ No newline at end of file diff --git a/addons/sitting/stringtable.xml b/addons/sitting/stringtable.xml index e26c2b36f0..829eafd4a0 100644 --- a/addons/sitting/stringtable.xml +++ b/addons/sitting/stringtable.xml @@ -29,7 +29,7 @@ Sitting Sentado Siadanie - Sedící + Sezení Sentarse Ülés diff --git a/addons/slideshow/stringtable.xml b/addons/slideshow/stringtable.xml index 843554061d..bf9b0cef33 100644 --- a/addons/slideshow/stringtable.xml +++ b/addons/slideshow/stringtable.xml @@ -6,6 +6,7 @@ Pokaz slajdów Vetítés Apresentação de Slides + Prezentace This module allows you to set up slide-shows on different objects. One module per image list. Only objects with hiddenSelection 0 are supported. @@ -18,6 +19,7 @@ Obiekty Objektumok Objetos + Objekty Object names (can also be synchronized objects) slide-show will be displayed on, separated by commas if multiple. Reference INFO for object support. @@ -42,6 +44,7 @@ Obrazy Képek Imagens + Obrázky List of images that will be used for the slide-show, separated by commas, with full path correctly formatted (eg. images\image.paa). @@ -54,6 +57,7 @@ Nazwy interakcji Interakciós nevek Nomes de Interação + Názvy Interakcí List of names that will be used for interaction entries, separated by commas, in order of images. @@ -80,4 +84,4 @@ Slides - + \ No newline at end of file diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml index 5c24224b72..6ae5d7d882 100644 --- a/addons/spectator/stringtable.xml +++ b/addons/spectator/stringtable.xml @@ -4,6 +4,7 @@ Spectator Settings Ustawienia obserwatora + Nastavení Pozorovatele Configure how the spectator system will operate by default. @@ -12,6 +13,7 @@ Unit filter Filtr jednostek + Filtr jednotek Method of filtering spectatable units. @@ -20,22 +22,27 @@ No units Brak jednostek + Žádné jednotky Only players Tylko gracze + Pouze hráči Playable Units Grywalne jednostki + Hratelné Jednotky All units Wszystkie jednostki + Všechny jednotky Side filter Filtr stron + Filtr stran Method of filtering spectatable sides. @@ -44,22 +51,27 @@ Player side Strona gracza + Strana hráče Friendly sides Strony sojusznicze + Strana spojenců Hostile sides Strony wrogie + Strana nepřítele All sides Wszystkie strony + Všechny strany Camera modes Tryby kamery + Módy kamery Camera modes that can be used. @@ -68,22 +80,27 @@ All Wszystkie + Všechny Free only Tylko wolna + Pouze volná Internal only Tylko wewnętrzna + Pouze vnitřní External only Tylko zewnętrzna + Pouze vnější Internal and external Wewnętrzna i zewnętrzna + Vnitřní a vnější Vision modes @@ -96,10 +113,12 @@ Night vision Noktowizja + Noktovize Thermal imaging Termowizja + Termovize @@ -113,55 +132,68 @@ Free Wolna + Volná Internal Wewnętrzna + Vnitřní External Zewnętrzna + Vnější Normal Normalna + Normální Night Noc + Noc Thermal Termo + Termál Free Camera Kamera swobodna + Volná Kamera Camera Forward Kamera naprzód + Kamera Vpřed Camera Backward Kamera w tył + Kamera Zpět Camera Left Kamera w lewo + Kamera Doleva Camera Right Kamera w prawo + Kamera Doprava Camera Up Kamera w górę + Kamera Nahoru Camera Down Kamera w dół + Kamera Dolů Pan Camera @@ -174,6 +206,7 @@ Lock Camera to Target Zablokuj kamerę na celu + Zamknout Kameru na Cíl Speed Boost @@ -182,22 +215,27 @@ Focus on Unit Skup na jednostce + Zaměřit se na Jednotku Interface Interfejs + Rozhraní Toggle Interface Przełącz interfejs + Přepnout Rozhraní Toggle Unit Icons Przełącz ikony jednostek + Přepnout Ikony Jednotek Toggle Unit List Przełącz listę jednostek + Přepnout Seznam Jednotek Toggle Toolbar @@ -206,14 +244,17 @@ Toggle Compass Przełącz kompas + Přepnout Kompas Toggle Map Przełącz mapę + Přepnout Mapu Toggle Help Przełącz pomoc + Přepnout Nápovědu Camera Attributes @@ -222,18 +263,22 @@ Next Camera Następna kamera + Následující Kamera Previous Camera Poprzednia kamera + Předchozí Kamera Next Unit Następna jednostka + Následující Jednotka Previous Unit Poprzednia jednostka + Předchozí Jednotka Next Vision Mode @@ -246,10 +291,12 @@ Adjust Zoom Reguluj zoom + Regulovat Přiblížení Adjust Speed Reguluj prędkość + Regulovat Rychlost Increment Zoom @@ -262,10 +309,12 @@ Reset Zoom Resetuj zoom + Obnovit Přiblížení Reset Speed Resetuj prędkość + Obnovit Rychlost - + \ No newline at end of file diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml index 97bf5f40c7..170ac52cd4 100644 --- a/addons/zeus/stringtable.xml +++ b/addons/zeus/stringtable.xml @@ -157,14 +157,17 @@ Assign Medic Przydziel medyka + Přiřadit Zdravotníka Assign Medical Vehicle Przydziel pojazd medyczny + Přiřadit Zdravotnické Vozidlo Assign Medical Facility Przydziel budynek medyczny + Přiřadit Zdravotnické Zařízení Unit must be alive From fbf00b9aa5e1065ee26c0f99bc7558382d7a7701 Mon Sep 17 00:00:00 2001 From: commy2 Date: Thu, 3 Sep 2015 02:55:40 +0200 Subject: [PATCH 101/170] correct comment --- addons/grenades/functions/fnc_throwGrenade.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/grenades/functions/fnc_throwGrenade.sqf b/addons/grenades/functions/fnc_throwGrenade.sqf index 17c0fb78cc..9439aef4bd 100644 --- a/addons/grenades/functions/fnc_throwGrenade.sqf +++ b/addons/grenades/functions/fnc_throwGrenade.sqf @@ -30,7 +30,7 @@ if (isNull _projectile) then { _projectile = nearestObject [_unit, _ammo]; }; -// handle speial grenades +// handle special grenades if (local _unit) then { if (getNumber (configFile >> "CfgAmmo" >> _ammo >> QGVAR(flashbang)) == 1) then { private "_fuzeTime"; From cbccd898ea312b5fe2f748097b648fdb21d86349 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 2 Sep 2015 23:58:24 -0500 Subject: [PATCH 102/170] Run functions after setting init --- addons/common/XEH_postInit.sqf | 10 +++++++++- addons/common/XEH_preInit.sqf | 3 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index ba014ff182..9fbe84362a 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -150,6 +150,14 @@ call FUNC(checkFiles); //Event that settings are safe to use: ["SettingsInitialized", []] call FUNC(localEvent); + //Set init finished and run all delayed functions: + GVAR(settingsInitFinished) = true; + diag_log text format ["%1 delayed functions", (count GVAR(runAtSettingsInitialized))]; + { + _x params ["_args", "_code"]; + _args call _code; + } forEach GVAR(runAtSettingsInitialized); + }, 0, [false]] call CBA_fnc_addPerFrameHandler; @@ -326,7 +334,7 @@ GVAR(OldIsCamera) = false; if (didJip) then { // 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); [(_this select 1)] call cba_fnc_removePerFrameHandler; }; diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 6fdf99113c..12fdc5629d 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -303,6 +303,9 @@ GVAR(nextFrameNo) = diag_frameno; GVAR(nextFrameBufferA) = []; GVAR(nextFrameBufferB) = []; +GVAR(settingsInitFinished) = false; +GVAR(runAtSettingsInitialized) = []; + // @TODO: Generic local-managed global-synced objects (createVehicleLocal) //Debug From 789de9d111e7ca1deb5b548364cc879bc9776524 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 3 Sep 2015 00:11:49 -0500 Subject: [PATCH 103/170] runAfterSettingsInit helper func --- addons/common/XEH_postInit.sqf | 6 ++--- addons/common/XEH_preInit.sqf | 1 + .../functions/fnc_runAfterSettingsInit.sqf | 27 +++++++++++++++++++ 3 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 addons/common/functions/fnc_runAfterSettingsInit.sqf diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 9fbe84362a..24a9e4ab6e 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -152,10 +152,10 @@ call FUNC(checkFiles); //Set init finished and run all delayed functions: GVAR(settingsInitFinished) = true; - diag_log text format ["%1 delayed functions", (count GVAR(runAtSettingsInitialized))]; + diag_log text format ["[ACE] %1 delayed functions running", (count GVAR(runAtSettingsInitialized))]; { - _x params ["_args", "_code"]; - _args call _code; + _x params ["_func", "_params"]; + _params call _func; } forEach GVAR(runAtSettingsInitialized); }, 0, [false]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 12fdc5629d..56e3062cd2 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -157,6 +157,7 @@ PREP(requestCallback); PREP(resetAllDefaults); PREP(restoreVariablesJIP); PREP(revertKeyCodeLocalized); +PREP(runAfterSettingsInit); PREP(sanitizeString); PREP(sendRequest); PREP(serverLog); diff --git a/addons/common/functions/fnc_runAfterSettingsInit.sqf b/addons/common/functions/fnc_runAfterSettingsInit.sqf new file mode 100644 index 0000000000..cf3faa1d7e --- /dev/null +++ b/addons/common/functions/fnc_runAfterSettingsInit.sqf @@ -0,0 +1,27 @@ +/* + * Author: PabstMirror + * Executes code after setting are initilized. + * + * Argument: + * 0: Code to execute + * 1: Parameters to run the code with + * + * 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]; +}; From 024dc3effef60e91532ea832f7b35c16a17a9fe3 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 3 Sep 2015 00:16:48 -0500 Subject: [PATCH 104/170] Cleanup --- addons/common/XEH_postInit.sqf | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 24a9e4ab6e..4a194e0fe9 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -157,6 +157,7 @@ call FUNC(checkFiles); _x params ["_func", "_params"]; _params call _func; } forEach GVAR(runAtSettingsInitialized); + GVAR(runAtSettingsInitialized) = nil; //cleanup }, 0, [false]] call CBA_fnc_addPerFrameHandler; From a187be725540efdfbd03fd2fb7d76b5791442976 Mon Sep 17 00:00:00 2001 From: commy2 Date: Thu, 3 Sep 2015 13:23:15 +0200 Subject: [PATCH 105/170] sort flashbang under explosive grenades --- addons/grenades/CfgAmmo.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/grenades/CfgAmmo.hpp b/addons/grenades/CfgAmmo.hpp index 120d3ab5ea..7a3dd0476a 100644 --- a/addons/grenades/CfgAmmo.hpp +++ b/addons/grenades/CfgAmmo.hpp @@ -85,6 +85,7 @@ class CfgAmmo { suppressionRadiusHit = 20; typicalSpeed = 22; cost = 40; + explosive = 1E-7; deflecting = 15; timeToLive = 6; fuseDistance = 2.3; From 76bb2bd2b8e2942847bfcffcee08964d03c7b213 Mon Sep 17 00:00:00 2001 From: commy2 Date: Thu, 3 Sep 2015 13:37:36 +0200 Subject: [PATCH 106/170] replace function with FUNC macro --- addons/map/XEH_postInitClient.sqf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/map/XEH_postInitClient.sqf b/addons/map/XEH_postInitClient.sqf index b85d91bf16..f832c89c7b 100644 --- a/addons/map/XEH_postInitClient.sqf +++ b/addons/map/XEH_postInitClient.sqf @@ -107,6 +107,5 @@ GVAR(hasWatch) = true; if (isNull (_this select 0)) exitWith { GVAR(hasWatch) = true; }; - GVAR(hasWatch) = "ItemWatch" in (_this select 1 select 17); -}] call ace_common_fnc_addEventhandler +}] call EFUNC(common,addEventHandler) From 6b7f84b297d9f6af0f1629b74ca5cc2c873efa50 Mon Sep 17 00:00:00 2001 From: commy2 Date: Thu, 3 Sep 2015 13:39:17 +0200 Subject: [PATCH 107/170] add missing ; --- addons/map/XEH_postInitClient.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/map/XEH_postInitClient.sqf b/addons/map/XEH_postInitClient.sqf index f832c89c7b..02800c2540 100644 --- a/addons/map/XEH_postInitClient.sqf +++ b/addons/map/XEH_postInitClient.sqf @@ -108,4 +108,4 @@ GVAR(hasWatch) = true; GVAR(hasWatch) = true; }; GVAR(hasWatch) = "ItemWatch" in (_this select 1 select 17); -}] call EFUNC(common,addEventHandler) +}] call EFUNC(common,addEventHandler); From a84be46ed4c34e8010b33972672d7c1ca6b41296 Mon Sep 17 00:00:00 2001 From: commy2 Date: Thu, 3 Sep 2015 15:49:49 +0200 Subject: [PATCH 108/170] fix errors from cleanup --- addons/medical/functions/fnc_canAccessMedicalEquipment.sqf | 2 +- addons/medical/functions/fnc_onMedicationUsage.sqf | 3 ++- addons/medical/functions/fnc_treatmentAdvanced_fullHeal.sqf | 2 +- addons/medical/functions/fnc_treatmentTourniquetLocal.sqf | 4 ++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/addons/medical/functions/fnc_canAccessMedicalEquipment.sqf b/addons/medical/functions/fnc_canAccessMedicalEquipment.sqf index 0be01ac492..2aecfb9a12 100644 --- a/addons/medical/functions/fnc_canAccessMedicalEquipment.sqf +++ b/addons/medical/functions/fnc_canAccessMedicalEquipment.sqf @@ -15,7 +15,7 @@ #include "script_component.hpp" private ["_accessLevel", "_return"]; -params ["_caller", "_targ"]; +params ["_caller", "_target"]; _accessLevel = _target getvariable [QGVAR(allowSharedEquipmentAccess), -1]; diff --git a/addons/medical/functions/fnc_onMedicationUsage.sqf b/addons/medical/functions/fnc_onMedicationUsage.sqf index d71896b6f0..db4ba737ea 100644 --- a/addons/medical/functions/fnc_onMedicationUsage.sqf +++ b/addons/medical/functions/fnc_onMedicationUsage.sqf @@ -78,7 +78,8 @@ _viscosityAdjustment = _viscosityChange / _timeInSystem; [{ params ["_args", "_idPFH"]; - _args params ["_target", "_timeInSystem", "_variable", "_amountDecreased","_decreaseAmount", "_usedMeds", "_viscosityAdjustment", "_painReduce"]; + _args params ["_target", "_timeInSystem", "_variable", "_amountDecreased","_decreaseAmount", "_viscosityAdjustment", "_painReduce"]; + private "_usedMeds"; _usedMeds = _target getvariable [_variable, 0]; _usedMeds = _usedMeds - _decreaseAmount; _target setvariable [_variable, _usedMeds]; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_fullHeal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_fullHeal.sqf index 64ce319341..a26876568d 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_fullHeal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_fullHeal.sqf @@ -10,7 +10,7 @@ #include "script_component.hpp" -params ["_target", "_caller", "_selectionName", "_className", "_items"]; +params ["_caller", "_target", "_selectionName", "_className", "_items"]; // TODO replace by event system [[_caller, _target], QUOTE(DFUNC(treatmentAdvanced_fullHealLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ diff --git a/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf b/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf index fb7394866e..d1ffd34e4b 100644 --- a/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf +++ b/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf @@ -13,8 +13,8 @@ */ #include "script_component.hpp" -private ["_tourniquetItem", "_part", "_applyingTo"]; -params ["_target", "_tourniquets", "_selectionName"]; +private ["_tourniquets", "_part", "_applyingTo"]; +params ["_target", "_tourniquetItem", "_selectionName"]; [_target] call FUNC(addToInjuredCollection); From e753131f2d4c0a48792448ab2b281a99447828ac Mon Sep 17 00:00:00 2001 From: commy2 Date: Thu, 3 Sep 2015 16:17:48 +0200 Subject: [PATCH 109/170] arms and legs to vulnerable, better scaling for pilots and csat --- addons/medical/CfgVehicles.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/medical/CfgVehicles.hpp b/addons/medical/CfgVehicles.hpp index 61168ca541..74f9d1a4e2 100644 --- a/addons/medical/CfgVehicles.hpp +++ b/addons/medical/CfgVehicles.hpp @@ -426,9 +426,9 @@ class CfgVehicles { }; }; - #define ARM_LEG_ARMOR_DEFAULT 1 - #define ARM_LEG_ARMOR_BETTER 8 - #define ARM_LEG_ARMOR_CSAT 6 + #define ARM_LEG_ARMOR_DEFAULT 2 + #define ARM_LEG_ARMOR_BETTER 4 + #define ARM_LEG_ARMOR_CSAT 3 class Land; class Man: Land { From 0bd92af072321d68fa512d82a7a6a1e559d75eb3 Mon Sep 17 00:00:00 2001 From: commy2 Date: Thu, 3 Sep 2015 17:17:54 +0200 Subject: [PATCH 110/170] fix variables not inited, csat armor scaleing --- addons/medical/CfgVehicles.hpp | 2 +- addons/medical/functions/fnc_init.sqf | 96 +++++++++++++-------------- 2 files changed, 48 insertions(+), 50 deletions(-) diff --git a/addons/medical/CfgVehicles.hpp b/addons/medical/CfgVehicles.hpp index 74f9d1a4e2..7112c82fc5 100644 --- a/addons/medical/CfgVehicles.hpp +++ b/addons/medical/CfgVehicles.hpp @@ -428,7 +428,7 @@ class CfgVehicles { #define ARM_LEG_ARMOR_DEFAULT 2 #define ARM_LEG_ARMOR_BETTER 4 - #define ARM_LEG_ARMOR_CSAT 3 + #define ARM_LEG_ARMOR_CSAT 4 class Land; class Man: Land { diff --git a/addons/medical/functions/fnc_init.sqf b/addons/medical/functions/fnc_init.sqf index 7d3ebd21d5..bd97203f33 100644 --- a/addons/medical/functions/fnc_init.sqf +++ b/addons/medical/functions/fnc_init.sqf @@ -21,66 +21,64 @@ _unit setVariable [QGVAR(bloodVolume), 100, true]; _unit setVariable ["ACE_isUnconscious", false, true]; // advanced -if (GVAR(level) > 1) then { - // tourniquets - _unit setvariable [QGVAR(tourniquets), [0,0,0,0,0,0], true]; +// tourniquets +_unit setvariable [QGVAR(tourniquets), [0,0,0,0,0,0], true]; - // wounds and injuries - _unit setvariable [QGVAR(openWounds), [], true]; - _unit setvariable [QGVAR(bandagedWounds), [], true]; - _unit setVariable [QGVAR(internalWounds), [], true]; - _unit setvariable [QGVAR(lastUniqueWoundID), 1, true]; +// wounds and injuries +_unit setvariable [QGVAR(openWounds), [], true]; +_unit setvariable [QGVAR(bandagedWounds), [], true]; +_unit setVariable [QGVAR(internalWounds), [], true]; +_unit setvariable [QGVAR(lastUniqueWoundID), 1, true]; - // vitals - _unit setVariable [QGVAR(heartRate), 80]; - _unit setvariable [QGVAR(heartRateAdjustments), []]; - _unit setvariable [QGVAR(bloodPressure), [80, 120]]; - _unit setVariable [QGVAR(peripheralResistance), 100]; +// vitals +_unit setVariable [QGVAR(heartRate), 80]; +_unit setvariable [QGVAR(heartRateAdjustments), []]; +_unit setvariable [QGVAR(bloodPressure), [80, 120]]; +_unit setVariable [QGVAR(peripheralResistance), 100]; - // fractures - _unit setVariable [QGVAR(fractures), [], true]; +// fractures +_unit setVariable [QGVAR(fractures), [], true]; - // triage card and logs - _unit setvariable [QGVAR(triageLevel), 0, true]; - _unit setvariable [QGVAR(triageCard), [], true]; +// triage card and logs +_unit setvariable [QGVAR(triageLevel), 0, true]; +_unit setvariable [QGVAR(triageCard), [], true]; - // IVs - _unit setVariable [QGVAR(salineIVVolume), 0, true]; - _unit setVariable [QGVAR(plasmaIVVolume), 0, true]; - _unit setVariable [QGVAR(bloodIVVolume), 0, true]; +// IVs +_unit setVariable [QGVAR(salineIVVolume), 0, true]; +_unit setVariable [QGVAR(plasmaIVVolume), 0, true]; +_unit setVariable [QGVAR(bloodIVVolume), 0, true]; - // damage storage - _unit setvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0], true]; +// damage storage +_unit setvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0], true]; - // airway - _unit setvariable [QGVAR(airwayStatus), 100]; - _unit setVariable [QGVAR(airwayOccluded), false]; - _unit setvariable [QGVAR(airwayCollapsed), false]; +// airway +_unit setvariable [QGVAR(airwayStatus), 100]; +_unit setVariable [QGVAR(airwayOccluded), false]; +_unit setvariable [QGVAR(airwayCollapsed), false]; - // generic medical admin - _unit setvariable [QGVAR(addedToUnitLoop), false, true]; - _unit setvariable [QGVAR(inCardiacArrest), false, true]; - _unit setvariable [QGVAR(hasLostBlood), 0, true]; - _unit setvariable [QGVAR(isBleeding), false, true]; - _unit setvariable [QGVAR(hasPain), false, true]; - _unit setvariable [QGVAR(amountOfReviveLives), GVAR(amountOfReviveLives), true]; - _unit setvariable [QGVAR(painSuppress), 0, true]; +// generic medical admin +_unit setvariable [QGVAR(addedToUnitLoop), false, true]; +_unit setvariable [QGVAR(inCardiacArrest), false, true]; +_unit setvariable [QGVAR(hasLostBlood), 0, true]; +_unit setvariable [QGVAR(isBleeding), false, true]; +_unit setvariable [QGVAR(hasPain), false, true]; +_unit setvariable [QGVAR(amountOfReviveLives), GVAR(amountOfReviveLives), true]; +_unit setvariable [QGVAR(painSuppress), 0, true]; - private ["_allUsedMedication", "_logs"]; +private ["_allUsedMedication", "_logs"]; - // medication - _allUsedMedication = _unit getVariable [QGVAR(allUsedMedication), []]; - { - _unit setvariable [_x select 0, nil]; - } foreach _allUsedMedication; - _unit setVariable [QGVAR(allUsedMedication), [], true]; +// medication +_allUsedMedication = _unit getVariable [QGVAR(allUsedMedication), []]; +{ + _unit setvariable [_x select 0, nil]; +} foreach _allUsedMedication; +_unit setVariable [QGVAR(allUsedMedication), [], true]; - _logs = _unit getvariable [QGVAR(allLogs), []]; - { - _unit setvariable [_x, nil]; - } foreach _logs; - _unit setvariable [QGVAR(allLogs), [], true]; -}; +_logs = _unit getvariable [QGVAR(allLogs), []]; +{ + _unit setvariable [_x, nil]; +} foreach _logs; +_unit setvariable [QGVAR(allLogs), [], true]; // items [{ From 6d28214287c290875255d7ee56dda116d2aeccb1 Mon Sep 17 00:00:00 2001 From: ViperMaul Date: Thu, 3 Sep 2015 08:18:37 -0700 Subject: [PATCH 111/170] Add some debug values. --- addons/medical/functions/fnc_handleUnitVitals.sqf | 13 +++++++++++-- addons/medical/script_component.hpp | 1 + 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/addons/medical/functions/fnc_handleUnitVitals.sqf b/addons/medical/functions/fnc_handleUnitVitals.sqf index db312eea34..ca5775cbe8 100644 --- a/addons/medical/functions/fnc_handleUnitVitals.sqf +++ b/addons/medical/functions/fnc_handleUnitVitals.sqf @@ -15,7 +15,7 @@ private ["_heartRate","_bloodPressure","_bloodVolume","_painStatus", "_lastTimeValuesSynced", "_syncValues", "_airwayStatus", "_blood"]; params ["_unit", "_interval"]; - +TRACE_3("ACE_DEBUG",_unit,_interval,_unit); if (_interval == 0) exitWith {}; _lastTimeValuesSynced = _unit getvariable [QGVAR(lastMomentValuesSynced), 0]; @@ -29,23 +29,28 @@ _bloodVolume = _bloodVolume max 0; _unit setvariable [QGVAR(bloodVolume), _bloodVolume, _syncValues]; +TRACE_3("ACE_DEBUG",_bloodVolume,_syncValues,_unit); // Set variables for synchronizing information across the net if (_bloodVolume < 100) 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 { _unit setvariable [QGVAR(hasLostBlood), 2, true]; }; } else { + TRACE_4("ACE_DEBUG", _bloodVolume,_unit getVariable QGVAR(hasLostBlood),_syncValues,_unit); if (_unit getvariable [QGVAR(hasLostBlood), 0] != 1) then { _unit setvariable [QGVAR(hasLostBlood), 1, true]; }; } } else { + TRACE_4("ACE_DEBUG",_bloodVolume,QGVAR(hasLostBlood),_syncValues,_unit); if (_unit getvariable [QGVAR(hasLostBlood), 0] != 0) then { _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 getvariable [QGVAR(isBleeding), false]) then { _unit setvariable [QGVAR(isBleeding), true, true]; @@ -57,6 +62,7 @@ if (([_unit] call FUNC(getBloodLoss)) > 0) then { }; _painStatus = _unit getvariable [QGVAR(pain), 0]; +TRACE_4("ACE_DEBUG",_painStatus,[_unit] call FUNC(hasPain),_unit getVariable QGVAR(painSuppress),_unit); if (_painStatus > (_unit getvariable [QGVAR(painSuppress), 0])) then { if !(_unit getvariable [QGVAR(hasPain), false]) then { _unit setvariable [QGVAR(hasPain), true, true]; @@ -68,6 +74,7 @@ if (_painStatus > (_unit getvariable [QGVAR(painSuppress), 0])) then { }; if (GVAR(level) == 1) then { + TRACE_5("ACE_DEBUG_BASIC",_painStatus,[_unit] call FUNC(hasPain),_unit getVariable QGVAR(morphine),_syncValues,_unit); // reduce pain if (_painStatus > 0) then { _unit setVariable [QGVAR(pain), (_painStatus - 0.001 * _interval) max 0, _syncValues]; @@ -90,6 +97,7 @@ if (GVAR(level) == 1) then { // handle advanced medical, with vitals if (GVAR(level) >= 2) then { + TRACE_6("ACE_DEBUG_ADVANCED_VITALS",_painStatus,_bloodVolume, [_unit] call FUNC(hasPain),_unit getVariable QGVAR(morphine),_syncValues,_unit); if (_bloodVolume < 30) exitwith { [_unit] call FUNC(setDead); }; @@ -113,7 +121,7 @@ if (GVAR(level) >= 2) then { _painReduce = if (_painStatus > 5) then {0.002} else {0.001}; _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 // Handle airway /*if (GVAR(setting_allowAirwayInjuries)) then { @@ -172,6 +180,7 @@ if (GVAR(level) >= 2) then { // syncing any remaining values if (_syncValues) then { + TRACE_3("ACE_DEBUG_IVBAGS_SYNC",GVAR(IVBags),_syncValues,_unit); { private "_value"; _value = _unit getvariable _x; diff --git a/addons/medical/script_component.hpp b/addons/medical/script_component.hpp index 910728c12b..54aea5beb9 100644 --- a/addons/medical/script_component.hpp +++ b/addons/medical/script_component.hpp @@ -2,6 +2,7 @@ #include "\z\ace\addons\main\script_mod.hpp" #define DEBUG_ENABLED_MEDICAL true +#define DEBUG_SETTINGS_MEDICAL true #ifdef DEBUG_ENABLED_MEDICAL #define DEBUG_MODE_FULL From 9e1ae58f4f8351a8fd6f945dd7ff749adc7c4ba0 Mon Sep 17 00:00:00 2001 From: bux578 Date: Thu, 3 Sep 2015 18:17:53 +0200 Subject: [PATCH 112/170] fix restore gear --- addons/respawn/functions/fnc_restoreGear.sqf | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/addons/respawn/functions/fnc_restoreGear.sqf b/addons/respawn/functions/fnc_restoreGear.sqf index 7e55c1d8e2..fd3f03d7aa 100644 --- a/addons/respawn/functions/fnc_restoreGear.sqf +++ b/addons/respawn/functions/fnc_restoreGear.sqf @@ -182,15 +182,18 @@ _activeWeapon = _activeWeaponAndMuzzle select 0; _activeMuzzle = _activeWeaponAndMuzzle select 1; _activeWeaponMode = _activeWeaponAndMuzzle select 2; -if (_activeMuzzle != "" and _activeMuzzle != _activeWeapon) then { +if (!(_activeMuzzle isEqualTo "") and + !(_activeMuzzle isEqualTo _activeWeapon) and + (_activeMuzzle in getArray (configfile >> "CfgWeapons" >> _activeWeapon >> "muzzles"))) then { + _unit selectWeapon _activeMuzzle; } else { - if (_activeWeapon != "") then { + if (!(_activeWeapon isEqualTo "")) then { _unit selectWeapon _activeWeapon; }; }; -if (currentWeapon _unit != "") then { +if (!(currentWeapon _unit isEqualTo "")) then { private ["_index"]; _index = 0; while { From b737f42777467a8fc8e1f5eadfd1de3924d6938a Mon Sep 17 00:00:00 2001 From: commy2 Date: Thu, 3 Sep 2015 18:30:29 +0200 Subject: [PATCH 113/170] fix error when opening triage card --- addons/medical/functions/fnc_displayTriageCard.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_displayTriageCard.sqf b/addons/medical/functions/fnc_displayTriageCard.sqf index 051efbfc70..9849242de1 100644 --- a/addons/medical/functions/fnc_displayTriageCard.sqf +++ b/addons/medical/functions/fnc_displayTriageCard.sqf @@ -66,7 +66,7 @@ if (_show) then { _triageStatus = [_target] call FUNC(getTriageStatus); - _triageStatus params ["_text", "_color"]; + _triageStatus params ["_text", "", "_color"]; (_display displayCtrl 2000) ctrlSetText _text; (_display displayCtrl 2000) ctrlSetBackgroundColor _color; From 89b0c05929ff0387ae74e3b92dcbef421c095297 Mon Sep 17 00:00:00 2001 From: ViperMaul Date: Thu, 3 Sep 2015 13:17:59 -0700 Subject: [PATCH 114/170] Fixed a debug statement. --- addons/medical/functions/fnc_handleUnitVitals.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_handleUnitVitals.sqf b/addons/medical/functions/fnc_handleUnitVitals.sqf index ca5775cbe8..43a2b1903b 100644 --- a/addons/medical/functions/fnc_handleUnitVitals.sqf +++ b/addons/medical/functions/fnc_handleUnitVitals.sqf @@ -44,7 +44,7 @@ if (_bloodVolume < 100) then { }; } } else { - TRACE_4("ACE_DEBUG",_bloodVolume,QGVAR(hasLostBlood),_syncValues,_unit); + TRACE_4("ACE_DEBUG",_bloodVolume,_unit getVariable QGVAR(hasLostBlood),_syncValues,_unit); if (_unit getvariable [QGVAR(hasLostBlood), 0] != 0) then { _unit setvariable [QGVAR(hasLostBlood), 0, true]; }; From 813e54a66825edcbd637603fb939a9836ee5e4ba Mon Sep 17 00:00:00 2001 From: ViperMaul Date: Fri, 4 Sep 2015 07:37:20 -0700 Subject: [PATCH 115/170] Fixing Debug for object variable hasPain --- addons/medical/functions/fnc_handleUnitVitals.sqf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/medical/functions/fnc_handleUnitVitals.sqf b/addons/medical/functions/fnc_handleUnitVitals.sqf index 43a2b1903b..5227bf20d1 100644 --- a/addons/medical/functions/fnc_handleUnitVitals.sqf +++ b/addons/medical/functions/fnc_handleUnitVitals.sqf @@ -62,7 +62,7 @@ if (([_unit] call FUNC(getBloodLoss)) > 0) then { }; _painStatus = _unit getvariable [QGVAR(pain), 0]; -TRACE_4("ACE_DEBUG",_painStatus,[_unit] call FUNC(hasPain),_unit getVariable QGVAR(painSuppress),_unit); +TRACE_4("ACE_DEBUG",_painStatus,_unit getVariable QGVAR(hasPain),_unit getVariable QGVAR(painSuppress),_unit); if (_painStatus > (_unit getvariable [QGVAR(painSuppress), 0])) then { if !(_unit getvariable [QGVAR(hasPain), false]) then { _unit setvariable [QGVAR(hasPain), true, true]; @@ -74,7 +74,7 @@ if (_painStatus > (_unit getvariable [QGVAR(painSuppress), 0])) then { }; if (GVAR(level) == 1) then { - TRACE_5("ACE_DEBUG_BASIC",_painStatus,[_unit] call FUNC(hasPain),_unit getVariable QGVAR(morphine),_syncValues,_unit); + TRACE_5("ACE_DEBUG_BASIC",_painStatus,_unit getVariable QGVAR(hasPain),_unit getVariable QGVAR(morphine),_syncValues,_unit); // reduce pain if (_painStatus > 0) then { _unit setVariable [QGVAR(pain), (_painStatus - 0.001 * _interval) max 0, _syncValues]; @@ -97,7 +97,7 @@ if (GVAR(level) == 1) then { // handle advanced medical, with vitals if (GVAR(level) >= 2) then { - TRACE_6("ACE_DEBUG_ADVANCED_VITALS",_painStatus,_bloodVolume, [_unit] call FUNC(hasPain),_unit getVariable QGVAR(morphine),_syncValues,_unit); + TRACE_6("ACE_DEBUG_ADVANCED_VITALS",_painStatus,_bloodVolume, _unit getVariable QGVAR(hasPain),_unit getVariable QGVAR(morphine),_syncValues,_unit); if (_bloodVolume < 30) exitwith { [_unit] call FUNC(setDead); }; From 2bc20501bc5ada7fca85c2979bef3f21682719e1 Mon Sep 17 00:00:00 2001 From: ViperMaul Date: Fri, 4 Sep 2015 07:46:35 -0700 Subject: [PATCH 116/170] Adding more debug --- addons/medical/XEH_postInit.sqf | 3 +++ addons/medical/functions/fnc_handleDamage.sqf | 13 ++++--------- addons/medical/functions/fnc_handleDamage_basic.sqf | 4 ++++ addons/medical/functions/fnc_unconsciousPFH.sqf | 7 +++++++ 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index d55a66d2b1..e6e2ca5ceb 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -259,6 +259,7 @@ if (USE_WOUND_EVENT_SYNC) then { ["SettingsInitialized", { if (GVAR(level) == 2) exitwith { + TRACE_6("ACE_DEBUG: SettingsInitialized_EH_ADVANCED",(_this select 0), GVAR(level),(_this select 0) getvariable QGVAR(bloodVolume),(_this select 0) getvariable QGVAR(pain), (_this select 0) getvariable QGVAR(painSuppress), [_this select 0] call FUNC(getBloodLoss)); [ {(((_this select 0) getvariable [QGVAR(bloodVolume), 100]) < 65)}, {(((_this select 0) getvariable [QGVAR(pain), 0]) - ((_this select 0) getvariable [QGVAR(painSuppress), 0])) > 0.9}, @@ -270,6 +271,8 @@ if (USE_WOUND_EVENT_SYNC) then { ] call FUNC(addUnconsciousCondition); }; + TRACE_6("ACE_DEBUG: SettingsInitialized_EH_BASIC",(_this select 0), GVAR(level),(_this select 0) getvariable QGVAR(bloodVolume),(_this select 0) getvariable QGVAR(pain), (_this select 0) getvariable QGVAR(painSuppress), [_this select 0] call FUNC(getBloodLoss)); + [ {(((_this select 0) getvariable [QGVAR(bloodVolume), 100]) < 40)}, {(((_this select 0) getvariable [QGVAR(pain), 0]) - ((_this select 0) getvariable [QGVAR(painSuppress), 0])) > 0.6}, diff --git a/addons/medical/functions/fnc_handleDamage.sqf b/addons/medical/functions/fnc_handleDamage.sqf index 9b612757b4..7226926700 100644 --- a/addons/medical/functions/fnc_handleDamage.sqf +++ b/addons/medical/functions/fnc_handleDamage.sqf @@ -17,12 +17,11 @@ #include "script_component.hpp" params ["_unit", "_selection", "_damage", "_shooter", "_projectile"]; +TRACE_5("ACE_DEBUG: HandleDamage Called",_unit, _selection, _damage, _shooter, _projectile); // bug, apparently can fire for remote units in special cases if !(local _unit) exitWith { - #ifdef DEBUG_ENABLED_MEDICAL - ACE_LOGDEBUG_3("HandleDamage on remote unit! - %1 - %2 - %3", diag_frameno, _unit, isServer); - #endif + TRACE_2("ACE_DEBUG: HandleDamage on remote unit!",_unit, isServer); nil }; @@ -34,9 +33,7 @@ private ["_damageReturn", "_typeOfDamage", "_minLethalDamage", "_newDamage", "_ _this set [4, _projectile]; };*/ -#ifdef DEBUG_ENABLED_MEDICAL - ACE_LOGDEBUG_3("HandleDamage - %1 - %2 - %3", diag_frameno, _selection, _damage); -#endif +TRACE_3("ACE_DEBUG: HandleDamage",_selection,_damage, _unit); // If damage is in dummy hitpoints, "hands" and "legs", don't change anything if (_selection == "hands") exitWith {_unit getHit "hands"}; @@ -52,9 +49,7 @@ if !(_unit getVariable [QGVAR(allowDamage), true]) exitWith { } else { _unit getHit _selection }; - #ifdef DEBUG_ENABLED_MEDICAL - ACE_LOGDEBUG_3("HandleDamage damage disabled. - %1 - %2 - %3", diag_frameno, _unit, _selection); - #endif + TRACE_3("ACE_DEBUG: HandleDamage damage disabled.",_selection,damage _unit, _unit); }; //if (true) exitWith {nil};// diff --git a/addons/medical/functions/fnc_handleDamage_basic.sqf b/addons/medical/functions/fnc_handleDamage_basic.sqf index cf53ac100f..a37ccea2b3 100644 --- a/addons/medical/functions/fnc_handleDamage_basic.sqf +++ b/addons/medical/functions/fnc_handleDamage_basic.sqf @@ -14,11 +14,14 @@ private ["_damageBodyParts", "_cache_params", "_cache_damages"]; params ["_target"]; +TRACE_1("ACE_DEBUG: HandleDamage_BASIC Called",_target); _damageBodyParts = _target getvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]; _cache_params = _target getVariable [QGVAR(cachedHandleDamageParams), []]; _cache_damages = _target getVariable QGVAR(cachedDamages); +TRACE_4("ACE_DEBUG: HandleDamage BASIC",_unit, _damageBodyParts,_cache_params,_cache_damages); + { _x params ["_unit","_selectionName","_amountOfDamage","_sourceOfDamage","_typeOfProjectile","_typeOfDamage"]; if !(isNull _sourceOfDamage && {_typeOfProjectile == ""} && {vehicle _unit == _unit} && {(_selectionName == "head" || isBurning _unit)}) then { @@ -44,6 +47,7 @@ _cache_damages = _target getVariable QGVAR(cachedDamages); // We broadcast the value across the net here, in order to avoid broadcasting it multiple times earlier in the above code block _target setvariable [QGVAR(bodyPartStatus), _damageBodyParts, true]; +TRACE_2("ACE_DEBUG: HandleDamage BASIC Broadcast value here",_unit, _target getvariable QGVAR(bodyPartStatus)); EXPLODE_6_PVT(_damageBodyParts,_headDamage,_torsoDamage,_handsDamageR,_handsDamageL,_legsDamageR,_legsDamageL); _target setHitPointDamage ["hitHead", _headDamage min 0.95]; diff --git a/addons/medical/functions/fnc_unconsciousPFH.sqf b/addons/medical/functions/fnc_unconsciousPFH.sqf index f230b9dbf8..0e8c424ca3 100644 --- a/addons/medical/functions/fnc_unconsciousPFH.sqf +++ b/addons/medical/functions/fnc_unconsciousPFH.sqf @@ -23,6 +23,8 @@ private ["_unit", "_minWaitingTime", "_slotInfo", "_hasMovedOut", "_parachuteChe params ["_args", "_idPFH"]; _args params ["_unit", "_originalPos", "_startingTime", "_minWaitingTime", "_hasMovedOut", "_parachuteCheck"]; +TRACE_6("ACE_DEBUG_Unconscious_PFH",_unit, _originalPos, _startingTime, _minWaitingTime, _hasMovedOut, _parachuteCheck); + if (!alive _unit) exitwith { if ("ACE_FakePrimaryWeapon" in (weapons _unit)) then { TRACE_1("Removing fake weapon [on death]",_unit); @@ -39,11 +41,14 @@ if (!alive _unit) exitwith { [_unit, "isUnconscious"] call EFUNC(common,unmuteUnit); ["medical_onUnconscious", [_unit, false]] call EFUNC(common,globalEvent); + TRACE_3("ACE_DEBUG_Unconscious_Exit",_unit, (!alive _unit) , QGVAR(unconscious)); + [_idPFH] call CBA_fnc_removePerFrameHandler; }; // In case the unit is no longer in an unconscious state, we are going to check if we can already reset the animation if !(_unit getvariable ["ACE_isUnconscious",false]) exitwith { + TRACE_7("ACE_DEBUG_Unconscious_PFH",_unit, _args, [_unit] call FUNC(isBeingCarried), [_unit] call FUNC(isBeingDragged), _idPFH, _unit getvariable QGVAR(unconsciousArguments),animationState _unit); // TODO, handle this with carry instead, so we can remove the PFH here. // Wait until the unit isn't being carried anymore, so we won't end up with wierd animations if !(([_unit] call FUNC(isBeingCarried)) || ([_unit] call FUNC(isBeingDragged))) then { @@ -124,6 +129,7 @@ if (_parachuteCheck) then { }; if (!local _unit) exitwith { + TRACE_6("ACE_DEBUG_Unconscious_PFH",_unit, _args, _startingTime, _minWaitingTime, _idPFH, _unit getvariable QGVAR(unconsciousArguments)); _args set [3, _minWaitingTime - (ACE_time - _startingTime)]; _unit setvariable [QGVAR(unconsciousArguments), _args, true]; [_idPFH] call CBA_fnc_removePerFrameHandler; @@ -131,6 +137,7 @@ if (!local _unit) exitwith { // Ensure we are waiting at least a minimum period before checking if we can wake up the unit again, allows for temp knock outs if ((ACE_time - _startingTime) >= _minWaitingTime) exitwith { + TRACE_2("ACE_DEBUG_Unconscious_Temp knock outs",_unit, [_unit] call FUNC(getUnconsciousCondition)); if (!([_unit] call FUNC(getUnconsciousCondition))) then { _unit setvariable ["ACE_isUnconscious", false, true]; }; From bf267246bf50697943af3b95d0b05d0e4ce14cf9 Mon Sep 17 00:00:00 2001 From: ViperMaul Date: Fri, 4 Sep 2015 07:48:16 -0700 Subject: [PATCH 117/170] Adding same ADV special case to BASIC handle damage. --- addons/medical/functions/fnc_handleDamage_basic.sqf | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/addons/medical/functions/fnc_handleDamage_basic.sqf b/addons/medical/functions/fnc_handleDamage_basic.sqf index a37ccea2b3..48786b4686 100644 --- a/addons/medical/functions/fnc_handleDamage_basic.sqf +++ b/addons/medical/functions/fnc_handleDamage_basic.sqf @@ -16,6 +16,12 @@ private ["_damageBodyParts", "_cache_params", "_cache_damages"]; params ["_target"]; TRACE_1("ACE_DEBUG: HandleDamage_BASIC Called",_target); +// bug, apparently can fire for remote units in special cases +if !(local _unit) exitWith { + TRACE_2("HandleDamage BASIC on remote unit!",_unit, isServer); + nil +}; + _damageBodyParts = _target getvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]; _cache_params = _target getVariable [QGVAR(cachedHandleDamageParams), []]; _cache_damages = _target getVariable QGVAR(cachedDamages); From 7f58d5a94d5fa335be89017b34cbdb0c7d656872 Mon Sep 17 00:00:00 2001 From: ViperMaul Date: Fri, 4 Sep 2015 10:20:34 -0700 Subject: [PATCH 118/170] Revert "Adding same ADV special case to BASIC handle damage." -Not Needed This reverts commit bf267246bf50697943af3b95d0b05d0e4ce14cf9. --- addons/medical/functions/fnc_handleDamage_basic.sqf | 6 ------ 1 file changed, 6 deletions(-) diff --git a/addons/medical/functions/fnc_handleDamage_basic.sqf b/addons/medical/functions/fnc_handleDamage_basic.sqf index 48786b4686..a37ccea2b3 100644 --- a/addons/medical/functions/fnc_handleDamage_basic.sqf +++ b/addons/medical/functions/fnc_handleDamage_basic.sqf @@ -16,12 +16,6 @@ private ["_damageBodyParts", "_cache_params", "_cache_damages"]; params ["_target"]; TRACE_1("ACE_DEBUG: HandleDamage_BASIC Called",_target); -// bug, apparently can fire for remote units in special cases -if !(local _unit) exitWith { - TRACE_2("HandleDamage BASIC on remote unit!",_unit, isServer); - nil -}; - _damageBodyParts = _target getvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]; _cache_params = _target getVariable [QGVAR(cachedHandleDamageParams), []]; _cache_damages = _target getVariable QGVAR(cachedDamages); From 4c0c7bc290faaada790b11d6932222bc9f3958b9 Mon Sep 17 00:00:00 2001 From: ViperMaul Date: Fri, 4 Sep 2015 10:21:10 -0700 Subject: [PATCH 119/170] debug change --- addons/medical/functions/fnc_handleUnitVitals.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_handleUnitVitals.sqf b/addons/medical/functions/fnc_handleUnitVitals.sqf index 5227bf20d1..fddf5489da 100644 --- a/addons/medical/functions/fnc_handleUnitVitals.sqf +++ b/addons/medical/functions/fnc_handleUnitVitals.sqf @@ -74,7 +74,7 @@ if (_painStatus > (_unit getvariable [QGVAR(painSuppress), 0])) then { }; if (GVAR(level) == 1) then { - TRACE_5("ACE_DEBUG_BASIC",_painStatus,_unit getVariable QGVAR(hasPain),_unit getVariable QGVAR(morphine),_syncValues,_unit); + TRACE_5("ACE_DEBUG_BASIC_VITALS",_painStatus,_unit getVariable QGVAR(hasPain),_unit getVariable QGVAR(morphine),_syncValues,_unit); // reduce pain if (_painStatus > 0) then { _unit setVariable [QGVAR(pain), (_painStatus - 0.001 * _interval) max 0, _syncValues]; From 3d342ece206108f3557aae0e51441002cf8620f0 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 5 Sep 2015 11:04:11 +0200 Subject: [PATCH 120/170] Fixes #2156 Animation is still played even if you cancel any treatment --- addons/medical/functions/fnc_treatment_failure.sqf | 3 +-- addons/medical/functions/fnc_treatment_success.sqf | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/addons/medical/functions/fnc_treatment_failure.sqf b/addons/medical/functions/fnc_treatment_failure.sqf index b31a9fd0de..e943485e0e 100644 --- a/addons/medical/functions/fnc_treatment_failure.sqf +++ b/addons/medical/functions/fnc_treatment_failure.sqf @@ -35,8 +35,7 @@ if (vehicle _caller == _caller) then { case "ainvppnemstpslaywpstdnon_medic": {_lastAnim = "AinvPpneMstpSlayWpstDnon"}; case "ainvpknlmstpslaywpstdnon_medic": {_lastAnim = "AmovPknlMstpSrasWpstDnon"}; }; - [_caller, _lastAnim, 1] call EFUNC(common,doAnimation); - [_caller, _lastAnim, 1] call EFUNC(common,doAnimation); + [_caller, _lastAnim, 2] call EFUNC(common,doAnimation); }; _caller setvariable [QGVAR(treatmentPrevAnimCaller), nil]; diff --git a/addons/medical/functions/fnc_treatment_success.sqf b/addons/medical/functions/fnc_treatment_success.sqf index d32f63468e..bf183e24db 100644 --- a/addons/medical/functions/fnc_treatment_success.sqf +++ b/addons/medical/functions/fnc_treatment_success.sqf @@ -35,7 +35,7 @@ if (vehicle _caller == _caller) then { case "ainvppnemstpslaywpstdnon_medic": {_lastAnim = "AinvPpneMstpSlayWpstDnon"}; case "ainvpknlmstpslaywpstdnon_medic": {_lastAnim = "AmovPknlMstpSrasWpstDnon"}; }; - [_caller, _lastAnim, 1] call EFUNC(common,doAnimation); + [_caller, _lastAnim, 2] call EFUNC(common,doAnimation); }; _caller setvariable [QGVAR(treatmentPrevAnimCaller), nil]; From a25f640614b552d5c84f527f002ffe01dcea4625 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 5 Sep 2015 11:07:10 +0200 Subject: [PATCH 121/170] fixes #2114 No CPR available in basic medical when revive is enabled --- addons/medical/ACE_Medical_Treatments.hpp | 22 +++++++++++++++++++ .../fnc_treatmentAdvanced_CPRLocal.sqf | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/addons/medical/ACE_Medical_Treatments.hpp b/addons/medical/ACE_Medical_Treatments.hpp index 3dedd39b81..a97b149917 100644 --- a/addons/medical/ACE_Medical_Treatments.hpp +++ b/addons/medical/ACE_Medical_Treatments.hpp @@ -105,6 +105,28 @@ class ACE_Medical_Actions { itemConsumed = 0; litter[] = {}; }; + class CPR: Bandage { + displayName = CSTRING(Actions_CPR); + displayNameProgress = CSTRING(Actions_PerformingCPR); + category = "advanced"; + treatmentLocations[] = {"All"}; + allowedSelections[] = {"body"}; + requiredMedic = 0; + treatmentTime = 15; + items[] = {}; + condition = QUOTE(!([(_this select 1)] call ace_common_fnc_isAwake) && GVAR(enableRevive)); + 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 { diff --git a/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf index cd943fc8d0..818640ca07 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf @@ -24,7 +24,7 @@ if (_target getvariable [QGVAR(inReviveState), false]) then { }; }; -if ((random 1) >= 0.6) then { +if (GVAR(level) > 1 && {(random 1) >= 0.6}) then { _target setvariable [QGVAR(inCardiacArrest), nil,true]; _target setvariable [QGVAR(heartRate), 40]; _target setvariable [QGVAR(bloodPressure), [50,70]]; From df3dbc9772af6980e6ac03e95a732e47c6e2788b Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 5 Sep 2015 11:25:31 +0200 Subject: [PATCH 122/170] Removed deprecated fire handling --- addons/medical/functions/fnc_handleDamage_advanced.sqf | 2 -- 1 file changed, 2 deletions(-) diff --git a/addons/medical/functions/fnc_handleDamage_advanced.sqf b/addons/medical/functions/fnc_handleDamage_advanced.sqf index f928732bba..214d291e86 100644 --- a/addons/medical/functions/fnc_handleDamage_advanced.sqf +++ b/addons/medical/functions/fnc_handleDamage_advanced.sqf @@ -22,8 +22,6 @@ private ["_typeOfProjectile", "_part", "_damageBodyParts", "_hitPoints"]; params ["_unit", "_selectionName", "_amountOfDamage", "_sourceOfDamage", "_typeOfProjectile", "_newDamage"]; -// 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); if (_part < 0) exitwith {}; From cd9e5df7825161fe0cb97f1dd80d06d0e548d304 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 5 Sep 2015 11:25:56 +0200 Subject: [PATCH 123/170] Clean up of handleDamage. Fixes some debug code --- addons/medical/functions/fnc_handleDamage.sqf | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/addons/medical/functions/fnc_handleDamage.sqf b/addons/medical/functions/fnc_handleDamage.sqf index 7226926700..fe06a47e9a 100644 --- a/addons/medical/functions/fnc_handleDamage.sqf +++ b/addons/medical/functions/fnc_handleDamage.sqf @@ -28,10 +28,10 @@ if !(local _unit) exitWith { 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; _this set [4, _projectile]; -};*/ +}; TRACE_3("ACE_DEBUG: HandleDamage",_selection,_damage, _unit); @@ -44,16 +44,14 @@ if (_selection != "" && {!(_selection in GVAR(SELECTIONS))}) exitWith {0}; //@to // Exit if we disable damage temporarily if !(_unit getVariable [QGVAR(allowDamage), true]) exitWith { + TRACE_3("ACE_DEBUG: HandleDamage damage disabled.",_selection,damage _unit, _unit); if (_selection == "") then { damage _unit } else { _unit getHit _selection }; - TRACE_3("ACE_DEBUG: HandleDamage damage disabled.",_selection,damage _unit, _unit); }; -//if (true) exitWith {nil};// - // Get return damage _damageReturn = _damage; From 4514812523b21b212715c70969bd635f26a34f1d Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 5 Sep 2015 11:51:46 +0200 Subject: [PATCH 124/170] Basic bandaging now works with new damage system --- addons/medical/XEH_preInit.sqf | 1 + .../functions/fnc_treatmentBasic_bandage.sqf | 11 +---- .../fnc_treatmentBasic_bandageLocal.sqf | 44 +++++++++++++++++++ 3 files changed, 46 insertions(+), 10 deletions(-) create mode 100644 addons/medical/functions/fnc_treatmentBasic_bandageLocal.sqf diff --git a/addons/medical/XEH_preInit.sqf b/addons/medical/XEH_preInit.sqf index 838dce7404..2625bf4b8a 100644 --- a/addons/medical/XEH_preInit.sqf +++ b/addons/medical/XEH_preInit.sqf @@ -84,6 +84,7 @@ PREP(treatmentAdvanced_medication); PREP(treatmentAdvanced_medicationLocal); PREP(treatmentAdvanced_surgicalKit_onProgress); PREP(treatmentBasic_bandage); +PREP(treatmentBasic_bandageLocal); PREP(treatmentBasic_bloodbag); PREP(treatmentBasic_bloodbagLocal); PREP(treatmentBasic_epipen); diff --git a/addons/medical/functions/fnc_treatmentBasic_bandage.sqf b/addons/medical/functions/fnc_treatmentBasic_bandage.sqf index c0ebc35472..04cace08af 100644 --- a/addons/medical/functions/fnc_treatmentBasic_bandage.sqf +++ b/addons/medical/functions/fnc_treatmentBasic_bandage.sqf @@ -20,13 +20,4 @@ private ["_hitSelections", "_hitPoints", "_point", "_damage"]; params ["_caller", "_target", "_selection", "_className"]; -if (_selection == "all") then { - _target setDamage ((damage _target - BANDAGEHEAL) max 0); -} else { - _hitSelections = ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"]; - _hitPoints = ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"]; - _point = _hitPoints select (_hitSelections find _selection); - - _damage = ((_target getHitPointDamage _point) - BANDAGEHEAL) max 0; - [_target, _point, _damage] call FUNC(setHitPointDamage); -}; +[[_target, _selection], QUOTE(DFUNC(treatmentBasic_bandageLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ diff --git a/addons/medical/functions/fnc_treatmentBasic_bandageLocal.sqf b/addons/medical/functions/fnc_treatmentBasic_bandageLocal.sqf new file mode 100644 index 0000000000..4f94622947 --- /dev/null +++ b/addons/medical/functions/fnc_treatmentBasic_bandageLocal.sqf @@ -0,0 +1,44 @@ +/* + * Author: Glowbal + * Handles the bandage of a patient. + * + * Arguments: + * 0: The patient + * 1: Treatment classname + * + * + * Return Value: + * Succesful treatment started + * + * Public: No + */ + +#include "script_component.hpp" +#define BANDAGEHEAL 0.8 + +params ["_target", "_selectionName"]; + +_damageBodyParts = _target getvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]; + +// Ensure it is a valid bodypart +_part = [_selectionName] call FUNC(selectionNameToNumber); +if (_part < 0) exitwith {false}; + +if ((_damageBodyParts select _part) > 0) then { + _damageBodyParts set [_part, ((_damageBodyParts select _part) - BANDAGEHEAL) max 0]; + _target setvariable [QGVAR(bodyPartStatus), _damageBodyParts, true]; + TRACE_2("ACE_DEBUG: Treatment BASIC Bandage Broadcast value here",_unit, _target getvariable QGVAR(bodyPartStatus)); +}; +systemChat format["BANDAGE LOCAL RAN: %1", _this]; + +EXPLODE_6_PVT(_damageBodyParts,_headDamage,_torsoDamage,_handsDamageR,_handsDamageL,_legsDamageR,_legsDamageL); +_target setHitPointDamage ["hitHead", _headDamage min 0.95]; +_target setHitPointDamage ["hitBody", _torsoDamage min 0.95]; +_target setHitPointDamage ["hitHands", (_handsDamageR + _handsDamageL) min 0.95]; +_target setHitPointDamage ["hitLegs", (_legsDamageR + _legsDamageL) min 0.95]; + +{ + _target setHitPointDamage [_x, (_damageBodyParts select _foreachIndex) min 0.95]; +}foreach GVAR(HITPOINTS); + +true; From 39ff82e76454eece7b57d351fb74073f95b7ca4d Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 5 Sep 2015 11:52:12 +0200 Subject: [PATCH 125/170] fixes for CPR condition in basic medical and improvements to lethalDamage --- addons/medical/ACE_Medical_Treatments.hpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/addons/medical/ACE_Medical_Treatments.hpp b/addons/medical/ACE_Medical_Treatments.hpp index a97b149917..9f796bcb06 100644 --- a/addons/medical/ACE_Medical_Treatments.hpp +++ b/addons/medical/ACE_Medical_Treatments.hpp @@ -114,7 +114,7 @@ class ACE_Medical_Actions { requiredMedic = 0; treatmentTime = 15; items[] = {}; - condition = QUOTE(!([(_this select 1)] call ace_common_fnc_isAwake) && GVAR(enableRevive)); + 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)"; @@ -627,6 +627,7 @@ class ACE_Medical_Advanced { class vehiclecrash { thresholds[] = {{0.25, 5}}; selectionSpecific = 0; + lethalDamage = 0.2; }; class backblast { thresholds[] = {{0, 2},{0.55, 5}, {1, 6}}; @@ -644,6 +645,7 @@ class ACE_Medical_Advanced { class falling { thresholds[] = {{0.1, 1}}; selectionSpecific = 1; + lethalDamage = 0.4; }; class ropeburn { thresholds[] = {{0.1, 1}}; From 130569c485491a56d28ce359cebde5bdef3b1597 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 5 Sep 2015 11:57:17 +0200 Subject: [PATCH 126/170] Made basic medical bleeding information work with new damage system --- addons/medical/functions/fnc_modifyMedicalAction.sqf | 2 +- addons/medical_menu/functions/fnc_updateUIInfo.sqf | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/addons/medical/functions/fnc_modifyMedicalAction.sqf b/addons/medical/functions/fnc_modifyMedicalAction.sqf index 1ac709059f..8feaa7bfca 100644 --- a/addons/medical/functions/fnc_modifyMedicalAction.sqf +++ b/addons/medical/functions/fnc_modifyMedicalAction.sqf @@ -21,7 +21,7 @@ params ["_target", "_player", "_selectionN", "_actionData"]; if (GVAR(level) < 2) exitwith { 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 { _actionData set [2, QUOTE(PATHTOF(UI\icons\medical_crossRed.paa))]; diff --git a/addons/medical_menu/functions/fnc_updateUIInfo.sqf b/addons/medical_menu/functions/fnc_updateUIInfo.sqf index 7dee2d5123..3a41412cbb 100644 --- a/addons/medical_menu/functions/fnc_updateUIInfo.sqf +++ b/addons/medical_menu/functions/fnc_updateUIInfo.sqf @@ -105,11 +105,12 @@ if (EGVAR(medical,level) >= 2) then { } forEach _bandagedwounds; } else { _damaged = [true, true, true, true, true, true]; - { - _selectionBloodLoss set [_forEachIndex, _target getHitPointDamage _x]; - if (_target getHitPointDamage _x > 0 && _forEachIndex == _selectionN) then { - _pointDamage = _target getHitPointDamage _x; + { + _selectionBloodLoss set [_forEachIndex, _x]; + + if (_x > 0 && _forEachIndex == _selectionN) then { + _pointDamage = _x; _severity = switch (true) do { case (_pointDamage > 0.5): {localize ELSTRING(medical,HeavilyWounded)}; case (_pointDamage > 0.1): {localize ELSTRING(medical,LightlyWounded)}; @@ -125,7 +126,7 @@ if (EGVAR(medical,level) >= 2) then { ] select _forEachIndex); _allInjuryTexts pushBack [format ["%1 %2", _severity, toLower _part], [1,1,1,1]]; }; - } forEach ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"]; + } forEach (_target getvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]); }; [_selectionBloodLoss, _display] call FUNC(updateBodyImage); From 85dc59d66cc9a4852abf9ac7cb55e012f62861a4 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 5 Sep 2015 11:57:41 +0200 Subject: [PATCH 127/170] Fixed: should only display "no injuries" when there are no injuries. Not the other way around --- addons/medical_menu/functions/fnc_updateInformationLists.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical_menu/functions/fnc_updateInformationLists.sqf b/addons/medical_menu/functions/fnc_updateInformationLists.sqf index 70903347b5..ecd700e43a 100644 --- a/addons/medical_menu/functions/fnc_updateInformationLists.sqf +++ b/addons/medical_menu/functions/fnc_updateInformationLists.sqf @@ -33,6 +33,6 @@ _amountOfGeneric = count _genericMessages; _lbCtrl lbSetColor [_forEachIndex + _amountOfGeneric, _color]; } forEach _allInjuryTexts; -if !(_allInjuryTexts isEqualTo []) then { +if (_allInjuryTexts isEqualTo []) then { _lbCtrl lbAdd localize ELSTRING(medical,NoInjuriesBodypart); }; From 883b9ab5457d9cdc750cf171a015a88b666fbddb Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 5 Sep 2015 11:58:34 +0200 Subject: [PATCH 128/170] Removed blur screen for medical menu #2069 --- addons/medical_menu/ui/menu.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/medical_menu/ui/menu.hpp b/addons/medical_menu/ui/menu.hpp index ab078d4c72..4a07778bd1 100644 --- a/addons/medical_menu/ui/menu.hpp +++ b/addons/medical_menu/ui/menu.hpp @@ -3,8 +3,8 @@ class GVAR(medicalMenu) { idd = 314412; movingEnable = true; - onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(medicalMenu)), _this select 0)]; [ARR_2(QUOTE(QGVAR(id)), true)] call EFUNC(common,blurScreen); [_this select 0] call FUNC(onMenuOpen);); - onUnload = QUOTE([ARR_2(QUOTE(QGVAR(id)), false)] call EFUNC(common,blurScreen); [GVAR(MenuPFHID)] call CBA_fnc_removePerFrameHandler;); + onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(medicalMenu)), _this select 0)]; [_this select 0] call FUNC(onMenuOpen);); + onUnload = QUOTE([GVAR(MenuPFHID)] call CBA_fnc_removePerFrameHandler;); class controlsBackground { class HeaderBackground: ACE_gui_backgroundBase{ idc = -1; From e0db571e13eae6f669baa6c4b1fc27a296799b55 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 5 Sep 2015 12:00:45 +0200 Subject: [PATCH 129/170] Minor adjustment to fatality change on torso damage --- addons/medical/functions/fnc_determineIfFatal.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_determineIfFatal.sqf b/addons/medical/functions/fnc_determineIfFatal.sqf index 939bf8c9b7..10a64d79a6 100644 --- a/addons/medical/functions/fnc_determineIfFatal.sqf +++ b/addons/medical/functions/fnc_determineIfFatal.sqf @@ -38,7 +38,7 @@ if (_part == 0) exitwith { // Check if damage to body part is higher as damage torso 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 (_damageBodyPart >= (_damageThreshold select 2) && {(random(1) > 0.95)}); From 4122b32dba03b8585bfb0f4b5e3f1a1769898714 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 5 Sep 2015 12:02:09 +0200 Subject: [PATCH 130/170] Removed deprecated wound sync code --- addons/medical/functions/fnc_handleKilled.sqf | 7 ------- 1 file changed, 7 deletions(-) diff --git a/addons/medical/functions/fnc_handleKilled.sqf b/addons/medical/functions/fnc_handleKilled.sqf index d4fbfee30a..d6a4440d76 100644 --- a/addons/medical/functions/fnc_handleKilled.sqf +++ b/addons/medical/functions/fnc_handleKilled.sqf @@ -22,11 +22,4 @@ if (GVAR(level) >= 2) then { _unit setvariable [QGVAR(heartRate), 0]; _unit setvariable [QGVAR(bloodPressure), [0, 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; - }; }; From 268220bbaeaa30c1c050fd052d4b42421b4579d8 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 5 Sep 2015 12:20:40 +0200 Subject: [PATCH 131/170] Possible fix for weird unconscious behavior in basic medical --- addons/medical/functions/fnc_addToInjuredCollection.sqf | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/addons/medical/functions/fnc_addToInjuredCollection.sqf b/addons/medical/functions/fnc_addToInjuredCollection.sqf index 66433a5ed0..0ed9b9747f 100644 --- a/addons/medical/functions/fnc_addToInjuredCollection.sqf +++ b/addons/medical/functions/fnc_addToInjuredCollection.sqf @@ -45,9 +45,12 @@ if ([_unit] call FUNC(hasMedicalEnabled) || _force) then { private "_pain"; _pain = _unit getvariable [QGVAR(pain), 0]; 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, _pain] call FUNC(playInjuredSound); }; From 6b73eafcce52acd23659d570993ff3f0d30dbc6a Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 5 Sep 2015 12:31:52 +0200 Subject: [PATCH 132/170] Allow users to disable medical 3d interaction. --- addons/medical/ACE_Settings.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/medical/ACE_Settings.hpp b/addons/medical/ACE_Settings.hpp index 910f152292..b17610b0e3 100644 --- a/addons/medical/ACE_Settings.hpp +++ b/addons/medical/ACE_Settings.hpp @@ -220,7 +220,7 @@ class ACE_Settings { description = CSTRING(menuTypeDescription); typeName = "SCALAR"; value = 0; - values[] = {CSTRING(useSelection)/*, CSTRING(useRadial)*/}; - // isClientSettable = 1; + values[] = {CSTRING(useSelection), CSTRING(useRadial), "Disabled"}; + isClientSettable = 1; }; }; From 25a75b9f690e4855669e7adb0beee7a20ef2971f Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 5 Sep 2015 12:35:48 +0200 Subject: [PATCH 133/170] fixed incorrect macro usage --- addons/medical_menu/functions/fnc_updateUIInfo.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical_menu/functions/fnc_updateUIInfo.sqf b/addons/medical_menu/functions/fnc_updateUIInfo.sqf index 3a41412cbb..b493b5026e 100644 --- a/addons/medical_menu/functions/fnc_updateUIInfo.sqf +++ b/addons/medical_menu/functions/fnc_updateUIInfo.sqf @@ -126,7 +126,7 @@ if (EGVAR(medical,level) >= 2) then { ] select _forEachIndex); _allInjuryTexts pushBack [format ["%1 %2", _severity, toLower _part], [1,1,1,1]]; }; - } forEach (_target getvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]); + } forEach (_target getvariable [QEGVAR(medical,bodyPartStatus), [0,0,0,0,0,0]]); }; [_selectionBloodLoss, _display] call FUNC(updateBodyImage); From 17648739ddcf77dc4e7eb3164fc0545b5ad3f40e Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 5 Sep 2015 12:37:01 +0200 Subject: [PATCH 134/170] Removed more deprecated wound sync code --- .../functions/fnc_handleDamage_woundsOld.sqf | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/addons/medical/functions/fnc_handleDamage_woundsOld.sqf b/addons/medical/functions/fnc_handleDamage_woundsOld.sqf index 0c08d1e884..0a37952d12 100644 --- a/addons/medical/functions/fnc_handleDamage_woundsOld.sqf +++ b/addons/medical/functions/fnc_handleDamage_woundsOld.sqf @@ -121,19 +121,7 @@ _woundsCreated = []; }; } foreach (_injuryTypeInfo select 0); // foreach damage thresholds -_unit setvariable [QGVAR(openWounds), _openWounds, !USE_WOUND_EVENT_SYNC]; - -// Only update if new wounds have been created -if (count _woundsCreated > 0) then { -// _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; -}; +_unit setvariable [QGVAR(openWounds), _openWounds, true]; _painLevel = _unit getvariable [QGVAR(pain), 0]; _unit setvariable [QGVAR(pain), _painLevel + _painToAdd]; From c673ea2cbbb10e495e7073f21fb93630eb250023 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 5 Sep 2015 12:38:12 +0200 Subject: [PATCH 135/170] Restored uniqueIds --- addons/medical/functions/fnc_handleDamage_woundsOld.sqf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addons/medical/functions/fnc_handleDamage_woundsOld.sqf b/addons/medical/functions/fnc_handleDamage_woundsOld.sqf index 0a37952d12..cbc28dcca9 100644 --- a/addons/medical/functions/fnc_handleDamage_woundsOld.sqf +++ b/addons/medical/functions/fnc_handleDamage_woundsOld.sqf @@ -123,5 +123,10 @@ _woundsCreated = []; _unit setvariable [QGVAR(openWounds), _openWounds, true]; +// Only update if new wounds have been created +if (count _woundsCreated > 0) then { + _unit setvariable [QGVAR(lastUniqueWoundID), _woundID, true]; +}; + _painLevel = _unit getvariable [QGVAR(pain), 0]; _unit setvariable [QGVAR(pain), _painLevel + _painToAdd]; From c70c9cdee6b8c53c5da7fafc350e86eac8e3d8b2 Mon Sep 17 00:00:00 2001 From: jokoho48 Date: Sat, 5 Sep 2015 12:49:23 +0200 Subject: [PATCH 136/170] Add Screen Blur and Blackout for Medical Menu by Interact_menu setting --- addons/medical_menu/XEH_preInit.sqf | 1 + .../functions/fnc_onMenuClose.sqf | 21 +++++++++++++++++++ .../medical_menu/functions/fnc_onMenuOpen.sqf | 3 +++ addons/medical_menu/ui/menu.hpp | 4 ++-- 4 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 addons/medical_menu/functions/fnc_onMenuClose.sqf diff --git a/addons/medical_menu/XEH_preInit.sqf b/addons/medical_menu/XEH_preInit.sqf index c231c7df6e..65ac88e245 100644 --- a/addons/medical_menu/XEH_preInit.sqf +++ b/addons/medical_menu/XEH_preInit.sqf @@ -3,6 +3,7 @@ ADDON = false; PREP(onMenuOpen); +PREP(onMenuClose); PREP(openMenu); PREP(canOpenMenu); diff --git a/addons/medical_menu/functions/fnc_onMenuClose.sqf b/addons/medical_menu/functions/fnc_onMenuClose.sqf new file mode 100644 index 0000000000..4300089a4a --- /dev/null +++ b/addons/medical_menu/functions/fnc_onMenuClose.sqf @@ -0,0 +1,21 @@ +/* + * Author: joko // Jonas + * Handle medical menu closed + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * call ace_medical_menu_onMenuClosed + * + * Public: No + */ +#include "script_component.hpp" + +if (EGVAR(interact_menu,menuBackground)==1) then {[QGVAR(id), false] call EFUNC(common,blurScreen);}; +if (EGVAR(interact_menu,menuBackground)==2) then {(uiNamespace getVariable [QEGVAR(interact_menu,menuBackground), displayNull]) closeDisplay 0;}; + +[GVAR(MenuPFHID)] call CBA_fnc_removePerFrameHandler; diff --git a/addons/medical_menu/functions/fnc_onMenuOpen.sqf b/addons/medical_menu/functions/fnc_onMenuOpen.sqf index 164353fe73..9f0acfbeb6 100644 --- a/addons/medical_menu/functions/fnc_onMenuOpen.sqf +++ b/addons/medical_menu/functions/fnc_onMenuOpen.sqf @@ -22,6 +22,9 @@ params ["_display"]; if (isNil "_display") exitwith {}; +if (EGVAR(interact_menu,menuBackground)==1) then {[QGVAR(id), true] call EFUNC(common,blurScreen);}; +if (EGVAR(interact_menu,menuBackground)==2) then {0 cutRsc[QEGVAR(interact_menu,menuBackground), "PLAIN", 1, false];}; + if (isNil QGVAR(LatestDisplayOptionMenu)) then { GVAR(LatestDisplayOptionMenu) = "triage"; } else { diff --git a/addons/medical_menu/ui/menu.hpp b/addons/medical_menu/ui/menu.hpp index 4a07778bd1..342f0230a2 100644 --- a/addons/medical_menu/ui/menu.hpp +++ b/addons/medical_menu/ui/menu.hpp @@ -4,9 +4,9 @@ class GVAR(medicalMenu) { idd = 314412; movingEnable = true; onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(medicalMenu)), _this select 0)]; [_this select 0] call FUNC(onMenuOpen);); - onUnload = QUOTE([GVAR(MenuPFHID)] call CBA_fnc_removePerFrameHandler;); + onUnload = QUOTE([] call FUNC(onMenuClose)); class controlsBackground { - class HeaderBackground: ACE_gui_backgroundBase{ + class HeaderBackground: ACE_gui_backgroundBase { idc = -1; SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; x = "1 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; From c828544d0208e330a92f00f061a39047979dc396 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 5 Sep 2015 12:50:32 +0200 Subject: [PATCH 137/170] Added init stacking --- addons/medical/XEH_init.sqf | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/addons/medical/XEH_init.sqf b/addons/medical/XEH_init.sqf index 0b86a927b2..acdd50ce82 100644 --- a/addons/medical/XEH_init.sqf +++ b/addons/medical/XEH_init.sqf @@ -5,5 +5,8 @@ params ["_unit"]; _unit addEventHandler ["HandleDamage", {_this call FUNC(handleDamage)}]; if (local _unit) then { - [_unit] call FUNC(init); + if (!EGVAR(common,settingsInitFinished)) exitWith { + EGVAR(common,runAtSettingsInitialized) pushBack [FUNC(init), [_unit]]; + }; + [_unit] call FUNC(init); }; From 9c0288cd3f40246bf7eb84026b626156ca1ad669 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 5 Sep 2015 12:55:49 +0200 Subject: [PATCH 138/170] Removed debug message --- addons/medical/functions/fnc_treatmentBasic_bandageLocal.sqf | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/medical/functions/fnc_treatmentBasic_bandageLocal.sqf b/addons/medical/functions/fnc_treatmentBasic_bandageLocal.sqf index 4f94622947..37c9f3ef15 100644 --- a/addons/medical/functions/fnc_treatmentBasic_bandageLocal.sqf +++ b/addons/medical/functions/fnc_treatmentBasic_bandageLocal.sqf @@ -29,7 +29,6 @@ if ((_damageBodyParts select _part) > 0) then { _target setvariable [QGVAR(bodyPartStatus), _damageBodyParts, true]; TRACE_2("ACE_DEBUG: Treatment BASIC Bandage Broadcast value here",_unit, _target getvariable QGVAR(bodyPartStatus)); }; -systemChat format["BANDAGE LOCAL RAN: %1", _this]; EXPLODE_6_PVT(_damageBodyParts,_headDamage,_torsoDamage,_handsDamageR,_handsDamageL,_legsDamageR,_legsDamageL); _target setHitPointDamage ["hitHead", _headDamage min 0.95]; From 17ad7ecb8cc93dde5a003267ac1efb1190b5e872 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 5 Sep 2015 12:59:09 +0200 Subject: [PATCH 139/170] replaced diag_logs by trace --- .../medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf index 0b19c05b03..abf09385b2 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf @@ -41,7 +41,7 @@ _mostEffectiveInjury = _openWounds select 0; _exit = false; { _x params ["", "_classID", "_partX"]; - diag_log format["OPENWOUND: %1", _x]; + TRACE_2("OPENWOUND: ", _target, _x); // Only parse injuries that are for the selected bodypart. if (_partX == _part) then { _woundEffectivenss = _effectiveness; @@ -57,7 +57,7 @@ _exit = false; }; }; - diag_log format["_specificClass: %1 vs classId %2", _specificClass, _classID]; + TRACE_2("Wound classes: ", _specificClass, _classID); if (_specificClass == _classID) exitwith { _effectivenessFound = _woundEffectivenss; _mostEffectiveSpot = _foreachIndex; From a4e406658f06edc2eda623cf8bae736982cb03c5 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 5 Sep 2015 13:02:19 +0200 Subject: [PATCH 140/170] Reduced initial knockdown time for basic medical --- addons/medical/functions/fnc_handleDamage_basic.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_handleDamage_basic.sqf b/addons/medical/functions/fnc_handleDamage_basic.sqf index a37ccea2b3..24ad2638a1 100644 --- a/addons/medical/functions/fnc_handleDamage_basic.sqf +++ b/addons/medical/functions/fnc_handleDamage_basic.sqf @@ -36,7 +36,7 @@ TRACE_4("ACE_DEBUG: HandleDamage BASIC",_unit, _damageBodyParts,_cache_params,_c if (alive _unit && {!(_unit getvariable ["ACE_isUnconscious", false])}) then { // 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 { - [_unit] call FUNC(setUnconscious); + [_unit, true, 0.5+random(3)] call FUNC(setUnconscious); }; }; _pain = _unit getVariable [QGVAR(pain), 0]; From f15a1c033d93061f4b8cc596046742867e9058dd Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 5 Sep 2015 13:20:19 +0200 Subject: [PATCH 141/170] Added allowSelfTreatment attribute to treatment actions --- addons/medical/ACE_Medical_Treatments.hpp | 12 ++++++++++++ addons/medical/functions/fnc_canTreat.sqf | 3 +++ addons/medical/functions/fnc_treatment.sqf | 3 +++ 3 files changed, 18 insertions(+) diff --git a/addons/medical/ACE_Medical_Treatments.hpp b/addons/medical/ACE_Medical_Treatments.hpp index 9f796bcb06..ea9e03974a 100644 --- a/addons/medical/ACE_Medical_Treatments.hpp +++ b/addons/medical/ACE_Medical_Treatments.hpp @@ -7,6 +7,7 @@ class ACE_Medical_Actions { category = "bandage"; treatmentLocations[] = {"All"}; allowedSelections[] = {"All"}; + allowSelfTreatment = 1; requiredMedic = 0; treatmentTime = 5; treatmentTimeSelfCoef = 1; @@ -32,6 +33,7 @@ class ACE_Medical_Actions { displayName = CSTRING(Inject_Morphine); displayNameProgress = CSTRING(Injecting_Morphine); allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"}; + allowSelfTreatment = 1; category = "medication"; treatmentTime = 2; items[] = {"ACE_morphine"}; @@ -43,6 +45,7 @@ class ACE_Medical_Actions { displayName = CSTRING(Inject_Epinephrine); displayNameProgress = CSTRING(Injecting_Epinephrine); allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"}; + allowSelfTreatment = 1; category = "medication"; requiredMedic = 1; treatmentTime = 3; @@ -55,6 +58,7 @@ class ACE_Medical_Actions { displayName = CSTRING(Transfuse_Blood); displayNameProgress = CSTRING(Transfusing_Blood); allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"}; + allowSelfTreatment = 0; category = "advanced"; requiredMedic = 1; treatmentTime = 20; @@ -111,6 +115,7 @@ class ACE_Medical_Actions { category = "advanced"; treatmentLocations[] = {"All"}; allowedSelections[] = {"body"}; + allowSelfTreatment = 0; requiredMedic = 0; treatmentTime = 15; items[] = {}; @@ -137,6 +142,7 @@ class ACE_Medical_Actions { // Which locations can this treatment action be used? Available: Field, MedicalFacility, MedicalVehicle, All. treatmentLocations[] = {"All"}; allowedSelections[] = {"All"}; + allowSelfTreatment = 1; // What is the level of medical skill required for this treatment action? 0 = all soldiers, 1 = medic, 2 = doctor requiredMedic = 0; // The time it takes for a treatment action to complete. Time is in seconds. @@ -210,6 +216,7 @@ class ACE_Medical_Actions { displayName = CSTRING(Actions_Blood4_1000); displayNameProgress = CSTRING(Transfusing_Blood); allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"}; + allowSelfTreatment = 0; category = "advanced"; items[] = {"ACE_bloodIV"}; requiredMedic = 1; @@ -260,6 +267,7 @@ class ACE_Medical_Actions { category = "advanced"; items[] = {"ACE_surgicalKit"}; treatmentLocations[] = {QGVAR(useLocation_SurgicalKit)}; + allowSelfTreatment = 0; requiredMedic = QGVAR(medicSetting_SurgicalKit); patientStateCondition = QGVAR(useCondition_SurgicalKit); treatmentTime = "(count ((_this select 1) getVariable ['ACE_Medical_bandagedWounds', []]) * 5)"; @@ -275,6 +283,7 @@ class ACE_Medical_Actions { category = "advanced"; items[] = {"ACE_personalAidKit"}; treatmentLocations[] = {QGVAR(useLocation_PAK)}; + allowSelfTreatment = 0; requiredMedic = QGVAR(medicSetting_PAK); patientStateCondition = QGVAR(useCondition_PAK); treatmentTime = QUOTE((_this select 1) call FUNC(treatmentAdvanced_fullHealTreatmentTime)); @@ -319,6 +328,7 @@ class ACE_Medical_Actions { displayName = CSTRING(Check_Response); callbackSuccess = QUOTE(DFUNC(actionCheckResponse)); displayNameProgress = CSTRING(Check_Response_Content); + allowSelfTreatment = 0; }; class RemoveTourniquet: Tourniquet { displayName = CSTRING(Actions_RemoveTourniquet); @@ -335,6 +345,7 @@ class ACE_Medical_Actions { category = "advanced"; treatmentLocations[] = {"All"}; allowedSelections[] = {"body"}; + allowSelfTreatment = 0; requiredMedic = 0; treatmentTime = 15; items[] = {}; @@ -356,6 +367,7 @@ class ACE_Medical_Actions { displayNameProgress = CSTRING(PlacingInBodyBag); category = "advanced"; treatmentLocations[] = {"All"}; + allowSelfTreatment = 0; requiredMedic = 0; treatmentTime = 15; items[] = {"ACE_bodyBag"}; diff --git a/addons/medical/functions/fnc_canTreat.sqf b/addons/medical/functions/fnc_canTreat.sqf index ff191ea7ca..ba6ced0486 100644 --- a/addons/medical/functions/fnc_canTreat.sqf +++ b/addons/medical/functions/fnc_canTreat.sqf @@ -26,6 +26,9 @@ _config = (ConfigFile >> "ACE_Medical_Actions" >> (["Basic", "Advanced"] select if !(isClass _config) exitwith {false}; +// Allow self treatment check +if (_caller == _target && {getNumber (_config >> "allowSelfTreatment") == 0}) exitwith {false}; + _medicRequired = if (isNumber (_config >> "requiredMedic")) then { getNumber (_config >> "requiredMedic"); } else { diff --git a/addons/medical/functions/fnc_treatment.sqf b/addons/medical/functions/fnc_treatment.sqf index a39375a05e..5e97e31501 100644 --- a/addons/medical/functions/fnc_treatment.sqf +++ b/addons/medical/functions/fnc_treatment.sqf @@ -34,6 +34,9 @@ if (GVAR(level) >= 2) then { }; if !(isClass _config) exitwith {false}; +// Allow self treatment check +if (_caller == _target && {getNumber (_config >> "allowSelfTreatment") == 0}) exitwith {false}; + _medicRequired = if (isNumber (_config >> "requiredMedic")) then { getNumber (_config >> "requiredMedic"); } else { From dad96822bef05151366764fd6b23b85d341be8f2 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 5 Sep 2015 13:27:02 +0200 Subject: [PATCH 142/170] Only add 1/4 of the new damage to pain instead of everything. --- addons/medical/functions/fnc_handleDamage_basic.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_handleDamage_basic.sqf b/addons/medical/functions/fnc_handleDamage_basic.sqf index 24ad2638a1..43b0852e1b 100644 --- a/addons/medical/functions/fnc_handleDamage_basic.sqf +++ b/addons/medical/functions/fnc_handleDamage_basic.sqf @@ -40,7 +40,7 @@ TRACE_4("ACE_DEBUG: HandleDamage BASIC",_unit, _damageBodyParts,_cache_params,_c }; }; _pain = _unit getVariable [QGVAR(pain), 0]; - _pain = _pain + _newDamage * (1 - (_unit getVariable [QGVAR(morphine), 0])); + _pain = _pain + (_newDamage / 4) * (1 - (_unit getVariable [QGVAR(morphine), 0])); _unit setVariable [QGVAR(pain), _pain min 1, true]; }; }foreach _cache_params; From d9af19df28849e9372e1253175be6d2c5ee55876 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 5 Sep 2015 14:08:46 +0200 Subject: [PATCH 143/170] properly fixes unconscious weird behavior. Because it never registered any unconscious conditions. --- addons/medical/XEH_postInit.sqf | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index e6e2ca5ceb..97f5e64c44 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -271,8 +271,6 @@ if (USE_WOUND_EVENT_SYNC) then { ] call FUNC(addUnconsciousCondition); }; - TRACE_6("ACE_DEBUG: SettingsInitialized_EH_BASIC",(_this select 0), GVAR(level),(_this select 0) getvariable QGVAR(bloodVolume),(_this select 0) getvariable QGVAR(pain), (_this select 0) getvariable QGVAR(painSuppress), [_this select 0] call FUNC(getBloodLoss)); - [ {(((_this select 0) getvariable [QGVAR(bloodVolume), 100]) < 40)}, {(((_this select 0) getvariable [QGVAR(pain), 0]) - ((_this select 0) getvariable [QGVAR(painSuppress), 0])) > 0.6}, @@ -280,7 +278,7 @@ if (USE_WOUND_EVENT_SYNC) then { {((_this select 0) getvariable [QGVAR(inReviveState), false])}, {((_this select 0) getvariable ["ACE_isDead", false])} ] call FUNC(addUnconsciousCondition); -}] call FUNC(addEventHandler); +}] call EFUNC(common,addEventHandler); // Prevent all types of interaction while unconscious // @todo: probably remove this when CBA keybind hold key works properly From e4c246984f559f2cfde3ed2ebb2e08822c440928 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 5 Sep 2015 14:10:04 +0200 Subject: [PATCH 144/170] Removed another debug trace that should not be there --- addons/medical/XEH_postInit.sqf | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index 97f5e64c44..7aae2bb231 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -259,7 +259,6 @@ if (USE_WOUND_EVENT_SYNC) then { ["SettingsInitialized", { if (GVAR(level) == 2) exitwith { - TRACE_6("ACE_DEBUG: SettingsInitialized_EH_ADVANCED",(_this select 0), GVAR(level),(_this select 0) getvariable QGVAR(bloodVolume),(_this select 0) getvariable QGVAR(pain), (_this select 0) getvariable QGVAR(painSuppress), [_this select 0] call FUNC(getBloodLoss)); [ {(((_this select 0) getvariable [QGVAR(bloodVolume), 100]) < 65)}, {(((_this select 0) getvariable [QGVAR(pain), 0]) - ((_this select 0) getvariable [QGVAR(painSuppress), 0])) > 0.9}, From 0a6b77b90232f3e35b85b61af76f45b13a5699ab Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 5 Sep 2015 14:10:28 +0200 Subject: [PATCH 145/170] Removed more deprecated wound sync code --- addons/medical/XEH_postInit.sqf | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index 7aae2bb231..e6f7837e24 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -242,20 +242,6 @@ GVAR(lastHeartBeatSound) = ACE_time; }, 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", { if (GVAR(level) == 2) exitwith { From 27a0e8f63950b9c7fc92e253be2533542bb4588c Mon Sep 17 00:00:00 2001 From: TheMagnetar Date: Sat, 5 Sep 2015 16:30:00 +0200 Subject: [PATCH 146/170] Repair: Fix possible out of bounds setting Setting "engineerSetting_fullRepair" had an out of bounds default value. --- addons/repair/ACE_Settings.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/repair/ACE_Settings.hpp b/addons/repair/ACE_Settings.hpp index 9dbcd21731..fc3f063fb1 100644 --- a/addons/repair/ACE_Settings.hpp +++ b/addons/repair/ACE_Settings.hpp @@ -57,7 +57,7 @@ class ACE_Settings { displayName = CSTRING(engineerSetting_fullRepair_name); description = CSTRING(engineerSetting_fullRepair_description); typeName = "SCALAR"; - value = 3; + value = 2; values[] = {CSTRING(engineerSetting_anyone), CSTRING(engineerSetting_EngineerOnly), CSTRING(engineerSetting_RepairSpecialistOnly)}; category = ECSTRING(OptionsMenu,CategoryLogistics); }; From a8412361bdbde3a48bd929d0edae93d5f99a8855 Mon Sep 17 00:00:00 2001 From: jonpas Date: Sat, 5 Sep 2015 19:33:25 +0200 Subject: [PATCH 147/170] Use setting init delay function for addSpareParts --- addons/repair/XEH_postInit.sqf | 17 ----------------- addons/repair/XEH_preInit.sqf | 2 -- addons/repair/functions/fnc_addSpareParts.sqf | 6 ++---- 3 files changed, 2 insertions(+), 23 deletions(-) diff --git a/addons/repair/XEH_postInit.sqf b/addons/repair/XEH_postInit.sqf index 7095b0bfd0..44ca157b0c 100644 --- a/addons/repair/XEH_postInit.sqf +++ b/addons/repair/XEH_postInit.sqf @@ -5,20 +5,3 @@ // wheels ["setWheelHitPointDamage", {(_this select 0) setHitPointDamage [_this select 1, _this select 2]}] call EFUNC(common,addEventHandler); - -if (isServer) then { - ["SettingsInitialized", { - GVAR(settingInitted) = true; // Stop collecting in FUNC(addSpareParts) - - // Exit if adding spare parts disabled and clean collection - if (!GVAR(addSpareParts)) exitWith {GVAR(addSparePartsCollection) = nil}; - - // Add spare parts to vehicles in collection - { - [_x] call FUNC(addSpareParts); - } forEach GVAR(addSparePartsCollection); - - // Clean collection - GVAR(addSparePartsCollection) = nil; - }] call EFUNC(common,addEventHandler); -}; diff --git a/addons/repair/XEH_preInit.sqf b/addons/repair/XEH_preInit.sqf index c47b0b8011..f94c230f29 100644 --- a/addons/repair/XEH_preInit.sqf +++ b/addons/repair/XEH_preInit.sqf @@ -40,6 +40,4 @@ PREP(spawnObject); PREP(useItem); PREP(useItems); -GVAR(addSparePartsCollection) = []; - ADDON = true; diff --git a/addons/repair/functions/fnc_addSpareParts.sqf b/addons/repair/functions/fnc_addSpareParts.sqf index 6dfbb49bc0..4d3197c8e8 100644 --- a/addons/repair/functions/fnc_addSpareParts.sqf +++ b/addons/repair/functions/fnc_addSpareParts.sqf @@ -26,10 +26,8 @@ TRACE_2("params",_vehicle,_amount); if !(["ace_cargo"] call EFUNC(common,isModLoaded)) exitWith {}; // Collect until SettingsInitialized -if (isNil QGVAR(settingInitted)) exitWith { - if !(_vehicle in GVAR(addSparePartsCollection)) then { - GVAR(addSparePartsCollection) pushBack _vehicle; - }; +if (!EGVAR(common,settingsInitFinished)) exitWith { + EGVAR(common,runAtSettingsInitialized) pushBack [FUNC(addSpareParts), _this]; }; // Exit if not forced and add spare parts is disabled (after settings initted to make sure it really is) From 98202f4f381c27c81db278ef74b7dbd47fd297cd Mon Sep 17 00:00:00 2001 From: ViperMaul Date: Sat, 5 Sep 2015 15:31:14 -0700 Subject: [PATCH 148/170] Additional debug statements for caching and wounds. --- addons/medical/functions/fnc_adjustPainLevel.sqf | 2 +- addons/medical/functions/fnc_handleDamage_caching.sqf | 4 +++- addons/medical/functions/fnc_handleDamage_wounds.sqf | 2 ++ addons/medical/functions/fnc_handleDamage_woundsOld.sqf | 2 ++ 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/addons/medical/functions/fnc_adjustPainLevel.sqf b/addons/medical/functions/fnc_adjustPainLevel.sqf index c4aab9e48d..df82e06823 100644 --- a/addons/medical/functions/fnc_adjustPainLevel.sqf +++ b/addons/medical/functions/fnc_adjustPainLevel.sqf @@ -19,9 +19,9 @@ private ["_pain"]; params ["_unit", "_addedPain"]; - //Only run on local units: if (!local _unit) exitWith {ERROR("unit is not local");}; +TRACE_3("ACE_DEBUG: adjustPainLevel Called",_unit, _pain, _addedPain); //Ignore if medical system disabled: if (GVAR(level) == 0) exitWith {}; diff --git a/addons/medical/functions/fnc_handleDamage_caching.sqf b/addons/medical/functions/fnc_handleDamage_caching.sqf index 553c300631..41f93b954b 100644 --- a/addons/medical/functions/fnc_handleDamage_caching.sqf +++ b/addons/medical/functions/fnc_handleDamage_caching.sqf @@ -20,7 +20,7 @@ private ["_hitSelections", "_hitPoints", "_impactVelocity", "_newDamage", "_cache_hitpoints", "_cache_projectiles", "_cache_params", "_cache_damages"]; params ["_unit", "_selectionName", "_damage", "_source", "_projectile"]; - +TRACE_8("ACE_DEBUG: HandleDamage_Caching Called",_unit, _selectionName, _damage, _source, _projectile,GVAR(SELECTIONS),GVAR(HITPOINTS),damage _unit); _hitSelections = GVAR(SELECTIONS); _hitPoints = GVAR(HITPOINTS); @@ -150,4 +150,6 @@ if (_selectionName != "") then { _unit setVariable [QGVAR(cachedHandleDamageParams), _cache_params]; }; +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 diff --git a/addons/medical/functions/fnc_handleDamage_wounds.sqf b/addons/medical/functions/fnc_handleDamage_wounds.sqf index 4438e9bb90..ae032e6d64 100644 --- a/addons/medical/functions/fnc_handleDamage_wounds.sqf +++ b/addons/medical/functions/fnc_handleDamage_wounds.sqf @@ -19,6 +19,7 @@ private ["_bodyPartn", "_injuryTypeInfo", "_allInjuriesForDamageType", "_allPossibleInjuries", "_highestPossibleDamage", "_highestPossibleSpot", "_minDamage", "_openWounds", "_woundID", "_toAddInjury", "_painToAdd", "_bloodLoss", "_bodyPartNToAdd", "_classType", "_damageLevels", "_foundIndex", "_i", "_injury", "_maxDamage", "_pain", "_painLevel", "_selections", "_toAddClassID", "_woundsCreated"]; params ["_unit", "_selectionName", "_damage", "_typeOfProjectile", "_typeOfDamage"]; +TRACE_6("ACE_DEBUG: HandleDamage Called",_unit, _selectionName, _damage, _shooter, _typeOfProjectile,_typeOfDamage); // Administration for open wounds and ids _openWounds = _unit getvariable[QGVAR(openWounds), []]; @@ -60,3 +61,4 @@ if (count _woundsCreated > 0) then { _painLevel = _unit getvariable [QGVAR(pain), 0]; _unit setvariable [QGVAR(pain), _painLevel + _painToAdd]; +TRACE_6("ACE_DEBUG: HandleDamage_WoundsOLD",_unit, _painLevel, _painToAdd, _unit getvariable QGVAR(pain), _unit getvariable QGVAR(openWounds),_woundsCreated); diff --git a/addons/medical/functions/fnc_handleDamage_woundsOld.sqf b/addons/medical/functions/fnc_handleDamage_woundsOld.sqf index cbc28dcca9..dc21012dd6 100644 --- a/addons/medical/functions/fnc_handleDamage_woundsOld.sqf +++ b/addons/medical/functions/fnc_handleDamage_woundsOld.sqf @@ -19,6 +19,7 @@ private ["_bodyPartn", "_injuryTypeInfo", "_allInjuriesForDamageType", "_allPossibleInjuries", "_highestPossibleDamage", "_highestPossibleSpot", "_minDamage", "_openWounds", "_woundID", "_toAddInjury", "_painToAdd", "_bloodLoss", "_bodyPartNToAdd", "_classType", "_damageLevels", "_foundIndex", "_i", "_injury", "_maxDamage", "_pain", "_painLevel", "_selections", "_toAddClassID", "_woundsCreated"]; params ["_unit", "_selectionName", "_damage", "_typeOfProjectile", "_typeOfDamage"]; +TRACE_6("ACE_DEBUG: HandleDamage_WoundsOLD Called",_unit, _selectionName, _damage, _shooter, _typeOfProjectile,_typeOfDamage); // Convert the selectionName to a number and ensure it is a valid selection. _bodyPartn = [_selectionName] call FUNC(selectionNameToNumber); @@ -130,3 +131,4 @@ if (count _woundsCreated > 0) then { _painLevel = _unit getvariable [QGVAR(pain), 0]; _unit setvariable [QGVAR(pain), _painLevel + _painToAdd]; +TRACE_6("ACE_DEBUG: HandleDamage_WoundsOLD",_unit, _painLevel, _painToAdd, _unit getvariable QGVAR(pain), _unit getvariable QGVAR(openWounds),_woundsCreated); From adb1a1121111583683bb177e4a83fc6d7b4b739c Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 6 Sep 2015 11:49:08 +0200 Subject: [PATCH 149/170] increase leg and arm armor value, more TRACE debug --- addons/medical/CfgVehicles.hpp | 4 ++-- addons/medical/functions/fnc_handleDamage.sqf | 10 +++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/addons/medical/CfgVehicles.hpp b/addons/medical/CfgVehicles.hpp index 7112c82fc5..4e73e77ee1 100644 --- a/addons/medical/CfgVehicles.hpp +++ b/addons/medical/CfgVehicles.hpp @@ -426,8 +426,8 @@ class CfgVehicles { }; }; - #define ARM_LEG_ARMOR_DEFAULT 2 - #define ARM_LEG_ARMOR_BETTER 4 + #define ARM_LEG_ARMOR_DEFAULT 3 + #define ARM_LEG_ARMOR_BETTER 5 #define ARM_LEG_ARMOR_CSAT 4 class Land; diff --git a/addons/medical/functions/fnc_handleDamage.sqf b/addons/medical/functions/fnc_handleDamage.sqf index fe06a47e9a..1a58e2ed01 100644 --- a/addons/medical/functions/fnc_handleDamage.sqf +++ b/addons/medical/functions/fnc_handleDamage.sqf @@ -1,4 +1,4 @@ -/* + /* * Author: KoffeinFlummi, Glowbal, commy2 * Main HandleDamage EH function. * @@ -33,7 +33,7 @@ if (typeName _projectile == "OBJECT") then { _this set [4, _projectile]; }; -TRACE_3("ACE_DEBUG: HandleDamage",_selection,_damage, _unit); +TRACE_3("ACE_DEBUG: HandleDamage",_selection,_damage,_unit); // If damage is in dummy hitpoints, "hands" and "legs", don't change anything if (_selection == "hands") exitWith {_unit getHit "hands"}; @@ -44,7 +44,7 @@ if (_selection != "" && {!(_selection in GVAR(SELECTIONS))}) exitWith {0}; //@to // Exit if we disable damage temporarily if !(_unit getVariable [QGVAR(allowDamage), true]) exitWith { - TRACE_3("ACE_DEBUG: HandleDamage damage disabled.",_selection,damage _unit, _unit); + TRACE_3("ACE_DEBUG: HandleDamage damage disabled.",_selection,damage _unit,_unit); if (_selection == "") then { damage _unit } else { @@ -59,6 +59,8 @@ _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 @@ -126,4 +128,6 @@ if (((_unit getVariable [QGVAR(enableRevive), GVAR(enableRevive)]) > 0) && {_dam 0.89; }; +TRACE_3("ACE_DEBUG: HandleDamage damage return",_selection,_damageReturn,_unit); + _damageReturn From 45eb8c4822baa54a3a27240b9db94d6a644e5038 Mon Sep 17 00:00:00 2001 From: jokoho48 Date: Sun, 6 Sep 2015 19:34:46 +0200 Subject: [PATCH 150/170] Add Code for CBA update 2.1 --- .../functions/fnc_cacheOverPressureValues.sqf | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf b/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf index 09f40612ef..a9c65cc62a 100644 --- a/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf +++ b/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf @@ -20,7 +20,7 @@ params ["_weapon", "_ammo", "_magazine"]; TRACE_3("Parameter",_weapon,_magazine,_ammo); -private ["_array", "_type", "_return", "_config"]; +private ["_array", "_type", "_return", "_config" /*, "_priority"*/]; // get Priority Array from Config _array = [ @@ -30,8 +30,17 @@ _array = [ ]; TRACE_1("Proiroity Array",_array); -// define Fist Values for Types -_type = 0; + +/* for CBA Upadte 2.1 +_priority = _array call CBA_fnc_findMax; +_type = if (isNil "_priority") then { + 0 +} else { + _priority select 1 +}; +*/ + +// obsolete as CBA Update 2.1 start _array params ["_max"]; // get Highest Entry out the the Priority Array @@ -41,6 +50,7 @@ _array params ["_max"]; _type = _forEachIndex; }; } forEach _array; +// obsolete end TRACE_2("Highest Value",_max,_type); // create the Config entry Point From ad8660c989136521340c82fdbaab068af1540d77 Mon Sep 17 00:00:00 2001 From: Felix Wiegand Date: Mon, 7 Sep 2015 00:44:15 +0200 Subject: [PATCH 151/170] Add slack badge to README --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 755eaceb30..5141e05796 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,9 @@ ACE3 License + + ACE3 License +

Requires the latest version of CBA A3. Visit us on Facebook | YouTube | Twitter | Reddit

From fe99cf83b3e65f7e23f2dc5871edf6a66baf9738 Mon Sep 17 00:00:00 2001 From: Felix Wiegand Date: Mon, 7 Sep 2015 00:50:22 +0200 Subject: [PATCH 152/170] Change alt text on slack badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5141e05796..5630ea8819 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ ACE3 License - ACE3 License + ACE3 Slack

Requires the latest version of CBA A3. Visit us on Facebook | YouTube | Twitter | Reddit

From 2fc35338d5e80a14eed077e360717a4669eabaa1 Mon Sep 17 00:00:00 2001 From: ViperMaul Date: Sun, 6 Sep 2015 21:37:20 -0700 Subject: [PATCH 153/170] Build number for Release Candidate --- addons/main/script_mod.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp index e38e71ac4b..9f5de69921 100644 --- a/addons/main/script_mod.hpp +++ b/addons/main/script_mod.hpp @@ -5,7 +5,7 @@ #define MAJOR 3 #define MINOR 2 -#define PATCHLVL 2 +#define PATCHLVL 3 #define BUILD 0 #define VERSION MAJOR.MINOR.PATCHLVL.BUILD From eee5664ec5078a69ff5be1e6ad915d520b3babf9 Mon Sep 17 00:00:00 2001 From: nsgundy Date: Mon, 7 Sep 2015 11:05:18 +0200 Subject: [PATCH 154/170] Move MicroDAGR 3D model from BFT branch to microdagr module --- addons/microdagr/CfgWeapons.hpp | 1 + addons/microdagr/data/MicroDAGR.p3d | Bin 0 -> 175454 bytes addons/microdagr/data/MicroDAGR.rvmat | 92 +++++++++++++++++++++++ addons/microdagr/data/MicroDAGR_co.paa | Bin 0 -> 229450 bytes addons/microdagr/data/MicroDAGR_nohq.paa | Bin 0 -> 403893 bytes addons/microdagr/data/MicroDAGR_smdi.paa | Bin 0 -> 152742 bytes 6 files changed, 93 insertions(+) create mode 100644 addons/microdagr/data/MicroDAGR.p3d create mode 100644 addons/microdagr/data/MicroDAGR.rvmat create mode 100644 addons/microdagr/data/MicroDAGR_co.paa create mode 100644 addons/microdagr/data/MicroDAGR_nohq.paa create mode 100644 addons/microdagr/data/MicroDAGR_smdi.paa diff --git a/addons/microdagr/CfgWeapons.hpp b/addons/microdagr/CfgWeapons.hpp index 9776f1c615..6fa84b6e7b 100644 --- a/addons/microdagr/CfgWeapons.hpp +++ b/addons/microdagr/CfgWeapons.hpp @@ -7,6 +7,7 @@ class CfgWeapons { scope = 2; displayName = CSTRING(itemName); descriptionShort = CSTRING(itemDescription); + model = QUOTE(PATHTOF(data\MicroDAGR.p3d)); picture = QUOTE(PATHTOF(images\microDAGR_item.paa)); class ItemInfo: InventoryItem_Base_F { mass = 2; diff --git a/addons/microdagr/data/MicroDAGR.p3d b/addons/microdagr/data/MicroDAGR.p3d new file mode 100644 index 0000000000000000000000000000000000000000..6a2a8987e21d10dadaa48b09e93339d679fda231 GIT binary patch literal 175454 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 fiU)Dxh`= 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ΜG4A==m6 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%0AeCH)g6IlZ^1^iU+ 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

;-wg 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 z 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⩔}an*ne0_tcAWs3 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